main 1bea565c2180 cached
636 files
2.9 MB
801.5k tokens
2402 symbols
1 requests
Download .txt
Showing preview only (3,192K chars total). Download the full file or copy to clipboard to get everything.
Repository: lollipopkit/flutter_server_box
Branch: main
Commit: 1bea565c2180
Files: 636
Total size: 2.9 MB

Directory structure:
gitextract_qpo112k4/

├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── bug_report_cn.md
│   └── workflows/
│       ├── analysis.yml
│       └── release.yml
├── .gitignore
├── .gitmodules
├── .metadata
├── .vscode/
│   └── launch.json
├── CLAUDE.md
├── LICENSE
├── README.md
├── README_zh.md
├── analysis_options.yaml
├── android/
│   ├── .gitignore
│   ├── app/
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── kotlin/
│   │           │   └── tech/
│   │           │       └── lolli/
│   │           │           └── toolbox/
│   │           │               ├── ForegroundService.kt
│   │           │               ├── MainActivity.kt
│   │           │               └── widget/
│   │           │                   ├── HomeWidget.kt
│   │           │                   └── WidgetConfigureActivity.kt
│   │           └── res/
│   │               ├── drawable/
│   │               │   ├── launch_background.xml
│   │               │   ├── memory_24.xml
│   │               │   ├── net_24.xml
│   │               │   ├── settings_24.xml
│   │               │   ├── speed_24.xml
│   │               │   ├── storage_24.xml
│   │               │   └── widget_background.xml
│   │               ├── drawable-night/
│   │               │   └── launch_background.xml
│   │               ├── drawable-night-v21/
│   │               │   └── launch_background.xml
│   │               ├── drawable-v21/
│   │               │   └── launch_background.xml
│   │               ├── layout/
│   │               │   ├── home_widget.xml
│   │               │   └── widget_configure.xml
│   │               ├── mipmap-anydpi-v26/
│   │               │   ├── ic_launcher.xml
│   │               │   └── ic_launcher_round.xml
│   │               ├── values/
│   │               │   ├── colors.xml
│   │               │   ├── ic_launcher_background.xml
│   │               │   ├── strings.xml
│   │               │   └── styles.xml
│   │               ├── values-night/
│   │               │   ├── colors.xml
│   │               │   ├── ic_launcher_background.xml
│   │               │   └── styles.xml
│   │               └── xml/
│   │                   ├── backup_rules.xml
│   │                   └── home_widget.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   └── settings.gradle
├── coverage/
│   └── lcov.info
├── devtools_options.yaml
├── docs/
│   ├── .gitignore
│   ├── .vscode/
│   │   ├── extensions.json
│   │   └── launch.json
│   ├── README.md
│   ├── astro.config.mjs
│   ├── package.json
│   ├── src/
│   │   ├── content/
│   │   │   └── docs/
│   │   │       ├── advanced/
│   │   │       │   ├── bulk-import.md
│   │   │       │   ├── custom-commands.md
│   │   │       │   ├── custom-logo.md
│   │   │       │   ├── json-settings.md
│   │   │       │   ├── troubleshooting.md
│   │   │       │   └── widgets.md
│   │   │       ├── de/
│   │   │       │   ├── advanced/
│   │   │       │   │   ├── bulk-import.md
│   │   │       │   │   ├── custom-commands.md
│   │   │       │   │   ├── custom-logo.md
│   │   │       │   │   ├── json-settings.md
│   │   │       │   │   ├── troubleshooting.md
│   │   │       │   │   └── widgets.md
│   │   │       │   ├── development/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── building.md
│   │   │       │   │   ├── codegen.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   ├── structure.md
│   │   │       │   │   └── testing.md
│   │   │       │   ├── index.mdx
│   │   │       │   ├── installation.mdx
│   │   │       │   ├── introduction.mdx
│   │   │       │   ├── platforms/
│   │   │       │   │   ├── desktop.md
│   │   │       │   │   └── mobile.md
│   │   │       │   ├── principles/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── sftp.md
│   │   │       │   │   ├── ssh.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   └── terminal.md
│   │   │       │   └── quick-start.mdx
│   │   │       ├── development/
│   │   │       │   ├── architecture.md
│   │   │       │   ├── building.md
│   │   │       │   ├── codegen.md
│   │   │       │   ├── state.md
│   │   │       │   ├── structure.md
│   │   │       │   └── testing.md
│   │   │       ├── es/
│   │   │       │   ├── advanced/
│   │   │       │   │   ├── bulk-import.md
│   │   │       │   │   ├── custom-commands.md
│   │   │       │   │   ├── custom-logo.md
│   │   │       │   │   ├── json-settings.md
│   │   │       │   │   ├── troubleshooting.md
│   │   │       │   │   └── widgets.md
│   │   │       │   ├── development/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── building.md
│   │   │       │   │   ├── codegen.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   ├── structure.md
│   │   │       │   │   └── testing.md
│   │   │       │   ├── index.mdx
│   │   │       │   ├── installation.mdx
│   │   │       │   ├── introduction.mdx
│   │   │       │   ├── platforms/
│   │   │       │   │   ├── desktop.md
│   │   │       │   │   └── mobile.md
│   │   │       │   ├── principles/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── sftp.md
│   │   │       │   │   ├── ssh.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   └── terminal.md
│   │   │       │   └── quick-start.mdx
│   │   │       ├── fr/
│   │   │       │   ├── advanced/
│   │   │       │   │   ├── bulk-import.md
│   │   │       │   │   ├── custom-commands.md
│   │   │       │   │   ├── custom-logo.md
│   │   │       │   │   ├── json-settings.md
│   │   │       │   │   ├── troubleshooting.md
│   │   │       │   │   └── widgets.md
│   │   │       │   ├── development/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── building.md
│   │   │       │   │   ├── codegen.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   ├── structure.md
│   │   │       │   │   └── testing.md
│   │   │       │   ├── index.mdx
│   │   │       │   ├── installation.mdx
│   │   │       │   ├── introduction.mdx
│   │   │       │   ├── platforms/
│   │   │       │   │   ├── desktop.md
│   │   │       │   │   └── mobile.md
│   │   │       │   ├── principles/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── sftp.md
│   │   │       │   │   ├── ssh.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   └── terminal.md
│   │   │       │   └── quick-start.mdx
│   │   │       ├── index.mdx
│   │   │       ├── installation.mdx
│   │   │       ├── introduction.mdx
│   │   │       ├── ja/
│   │   │       │   ├── advanced/
│   │   │       │   │   ├── bulk-import.md
│   │   │       │   │   ├── custom-commands.md
│   │   │       │   │   ├── custom-logo.md
│   │   │       │   │   ├── json-settings.md
│   │   │       │   │   ├── troubleshooting.md
│   │   │       │   │   └── widgets.md
│   │   │       │   ├── development/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── building.md
│   │   │       │   │   ├── codegen.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   ├── structure.md
│   │   │       │   │   └── testing.md
│   │   │       │   ├── index.mdx
│   │   │       │   ├── installation.mdx
│   │   │       │   ├── introduction.mdx
│   │   │       │   ├── platforms/
│   │   │       │   │   ├── desktop.md
│   │   │       │   │   └── mobile.md
│   │   │       │   ├── principles/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── sftp.md
│   │   │       │   │   ├── ssh.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   └── terminal.md
│   │   │       │   └── quick-start.mdx
│   │   │       ├── platforms/
│   │   │       │   ├── desktop.md
│   │   │       │   └── mobile.md
│   │   │       ├── principles/
│   │   │       │   ├── architecture.md
│   │   │       │   ├── sftp.md
│   │   │       │   ├── ssh.md
│   │   │       │   ├── state.md
│   │   │       │   └── terminal.md
│   │   │       ├── quick-start.mdx
│   │   │       └── zh/
│   │   │           ├── advanced/
│   │   │           │   ├── bulk-import.md
│   │   │           │   ├── custom-commands.md
│   │   │           │   ├── custom-logo.md
│   │   │           │   ├── json-settings.md
│   │   │           │   ├── troubleshooting.md
│   │   │           │   └── widgets.md
│   │   │           ├── development/
│   │   │           │   ├── architecture.md
│   │   │           │   ├── building.md
│   │   │           │   ├── codegen.md
│   │   │           │   ├── state.md
│   │   │           │   ├── structure.md
│   │   │           │   └── testing.md
│   │   │           ├── index.mdx
│   │   │           ├── installation.mdx
│   │   │           ├── introduction.mdx
│   │   │           ├── platforms/
│   │   │           │   ├── desktop.md
│   │   │           │   └── mobile.md
│   │   │           ├── principles/
│   │   │           │   ├── architecture.md
│   │   │           │   ├── sftp.md
│   │   │           │   ├── ssh.md
│   │   │           │   ├── state.md
│   │   │           │   └── terminal.md
│   │   │           └── quick-start.mdx
│   │   ├── content.config.ts
│   │   └── styles/
│   │       └── custom.css
│   └── tsconfig.json
├── fastlane/
│   └── metadata/
│       └── android/
│           ├── en-US/
│           │   ├── full_description.txt
│           │   ├── short_description.txt
│           │   └── title.txt
│           ├── ru/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           └── zh-CN/
│               ├── full_description.txt
│               ├── short_description.txt
│               └── title.txt
├── fl_build.json
├── ios/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── AppFrameworkInfo.plist
│   │   ├── Debug.xcconfig
│   │   └── Release.xcconfig
│   ├── Podfile
│   ├── PrivacyInfo.xcprivacy
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   ├── Contents.json
│   │   │   ├── LaunchBackground.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── LaunchImage.imageset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── Main.storyboard
│   │   ├── Info-Debug.plist
│   │   ├── Info-Profile.plist
│   │   ├── Info-Release.plist
│   │   ├── LiveActivityManager.swift
│   │   ├── PrivacyInfo.xcprivacy
│   │   ├── Runner-Bridging-Header.h
│   │   ├── Runner.entitlements
│   │   ├── TerminalLiveActivityAttributes.swift
│   │   ├── Utils.swift
│   │   ├── de.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── en.lproj/
│   │   │   └── Localizable.strings
│   │   ├── es.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── fr.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── id.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── ja.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── pt-BR.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── ru.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── zh-Hans.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   └── zh-Hant.lproj/
│   │       ├── LaunchScreen.strings
│   │       ├── Localizable.strings
│   │       └── Main.strings
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       ├── IDEWorkspaceChecks.plist
│   │   │       └── WorkspaceSettings.xcsettings
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           ├── Runner.xcscheme
│   │           ├── StatusWidgetExtension.xcscheme
│   │           └── WatchApp.xcscheme
│   ├── Runner.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   ├── StatusWidget/
│   │   ├── Base.lproj/
│   │   │   └── StatusWidget.intentdefinition
│   │   ├── Info.plist
│   │   ├── PrivacyInfo.xcprivacy
│   │   ├── StatusWidget.swift
│   │   ├── StatusWidgetBundle.swift
│   │   ├── TerminalLiveActivity.swift
│   │   ├── TerminalLiveActivityAttributes.swift
│   │   ├── de.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── en.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── es.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── fr.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── id.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── ja.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── pt-BR.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── ru.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── zh-Hans.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   └── zh-Hant.lproj/
│   │       ├── Localizable.strings
│   │       └── StatusWidget.strings
│   ├── WatchApp/
│   │   ├── ContentView.swift
│   │   ├── PhoneConnMgr.swift
│   │   ├── PrivacyInfo.xcprivacy
│   │   ├── Store.swift
│   │   ├── Watch.xcassets/
│   │   │   ├── AccentColor.colorset/
│   │   │   │   └── Contents.json
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   └── Contents.json
│   │   └── WatchEndApp.swift
│   ├── WatchWidget/
│   │   ├── WatchStatusWidget.swift
│   │   └── WatchStatusWidgetBundle.swift
│   └── build/
│       └── Pods.build/
│           └── Release-iphonesimulator/
│               ├── Flutter.build/
│               │   └── dgph
│               ├── GZ-NMSSH.build/
│               │   └── dgph
│               ├── Pods-Runner.build/
│               │   └── dgph
│               ├── countly_flutter.build/
│               │   └── dgph
│               ├── path_provider.build/
│               │   └── dgph
│               ├── ssh2.build/
│               │   └── dgph
│               └── url_launcher.build/
│                   └── dgph
├── l10n.yaml
├── lib/
│   ├── app.dart
│   ├── core/
│   │   ├── app_navigator.dart
│   │   ├── chan.dart
│   │   ├── extension/
│   │   │   ├── context/
│   │   │   │   └── locale.dart
│   │   │   ├── server.dart
│   │   │   ├── sftpfile.dart
│   │   │   └── ssh_client.dart
│   │   ├── route.dart
│   │   ├── service/
│   │   │   └── ssh_discovery.dart
│   │   ├── sync.dart
│   │   └── utils/
│   │       ├── comparator.dart
│   │       ├── host_key_helper.dart
│   │       ├── jump_chain.dart
│   │       ├── misc.dart
│   │       ├── server.dart
│   │       ├── server_dedup.dart
│   │       ├── ssh_auth.dart
│   │       └── ssh_config.dart
│   ├── data/
│   │   ├── helper/
│   │   │   ├── ssh_decoder.dart
│   │   │   └── system_detector.dart
│   │   ├── model/
│   │   │   ├── ai/
│   │   │   │   └── ask_ai_models.dart
│   │   │   ├── app/
│   │   │   │   ├── bak/
│   │   │   │   │   ├── backup.dart
│   │   │   │   │   ├── backup.g.dart
│   │   │   │   │   ├── backup2.dart
│   │   │   │   │   ├── backup2.freezed.dart
│   │   │   │   │   ├── backup2.g.dart
│   │   │   │   │   ├── backup_service.dart
│   │   │   │   │   ├── backup_source.dart
│   │   │   │   │   └── utils.dart
│   │   │   │   ├── error.dart
│   │   │   │   ├── menu/
│   │   │   │   │   ├── base.dart
│   │   │   │   │   ├── container.dart
│   │   │   │   │   ├── platform.dart
│   │   │   │   │   └── server_func.dart
│   │   │   │   ├── net_view.dart
│   │   │   │   ├── path_with_prefix.dart
│   │   │   │   ├── range.dart
│   │   │   │   ├── scripts/
│   │   │   │   │   ├── cmd_types.dart
│   │   │   │   │   ├── script_builders.dart
│   │   │   │   │   ├── script_consts.dart
│   │   │   │   │   └── shell_func.dart
│   │   │   │   ├── server_detail_card.dart
│   │   │   │   ├── tab.dart
│   │   │   │   └── tab.g.dart
│   │   │   ├── container/
│   │   │   │   ├── image.dart
│   │   │   │   ├── ps.dart
│   │   │   │   ├── status.dart
│   │   │   │   └── type.dart
│   │   │   ├── pkg/
│   │   │   │   ├── manager.dart
│   │   │   │   └── upgrade_info.dart
│   │   │   ├── server/
│   │   │   │   ├── amd.dart
│   │   │   │   ├── battery.dart
│   │   │   │   ├── conn.dart
│   │   │   │   ├── connection_stat.dart
│   │   │   │   ├── connection_stat.freezed.dart
│   │   │   │   ├── connection_stat.g.dart
│   │   │   │   ├── cpu.dart
│   │   │   │   ├── custom.dart
│   │   │   │   ├── custom.g.dart
│   │   │   │   ├── discovery_result.dart
│   │   │   │   ├── discovery_result.freezed.dart
│   │   │   │   ├── discovery_result.g.dart
│   │   │   │   ├── disk.dart
│   │   │   │   ├── disk_smart.dart
│   │   │   │   ├── disk_smart.freezed.dart
│   │   │   │   ├── disk_smart.g.dart
│   │   │   │   ├── dist.dart
│   │   │   │   ├── memory.dart
│   │   │   │   ├── net_speed.dart
│   │   │   │   ├── nvdia.dart
│   │   │   │   ├── ping_result.dart
│   │   │   │   ├── private_key_info.dart
│   │   │   │   ├── private_key_info.g.dart
│   │   │   │   ├── proc.dart
│   │   │   │   ├── pve.dart
│   │   │   │   ├── sensors.dart
│   │   │   │   ├── server.dart
│   │   │   │   ├── server_private_info.dart
│   │   │   │   ├── server_private_info.freezed.dart
│   │   │   │   ├── server_private_info.g.dart
│   │   │   │   ├── server_status_update_req.dart
│   │   │   │   ├── snippet.dart
│   │   │   │   ├── snippet.freezed.dart
│   │   │   │   ├── snippet.g.dart
│   │   │   │   ├── system.dart
│   │   │   │   ├── systemd.dart
│   │   │   │   ├── temp.dart
│   │   │   │   ├── time_seq.dart
│   │   │   │   ├── try_limiter.dart
│   │   │   │   ├── windows_parser.dart
│   │   │   │   ├── wol_cfg.dart
│   │   │   │   └── wol_cfg.g.dart
│   │   │   ├── sftp/
│   │   │   │   ├── browser_status.dart
│   │   │   │   ├── req.dart
│   │   │   │   └── worker.dart
│   │   │   └── ssh/
│   │   │       └── virtual_key.dart
│   │   ├── provider/
│   │   │   ├── ai/
│   │   │   │   └── ask_ai.dart
│   │   │   ├── container.dart
│   │   │   ├── container.freezed.dart
│   │   │   ├── container.g.dart
│   │   │   ├── private_key.dart
│   │   │   ├── private_key.freezed.dart
│   │   │   ├── private_key.g.dart
│   │   │   ├── providers.dart
│   │   │   ├── pve.dart
│   │   │   ├── pve.freezed.dart
│   │   │   ├── pve.g.dart
│   │   │   ├── server/
│   │   │   │   ├── all.dart
│   │   │   │   ├── all.freezed.dart
│   │   │   │   ├── all.g.dart
│   │   │   │   ├── single.dart
│   │   │   │   ├── single.freezed.dart
│   │   │   │   └── single.g.dart
│   │   │   ├── sftp.dart
│   │   │   ├── sftp.freezed.dart
│   │   │   ├── sftp.g.dart
│   │   │   ├── snippet.dart
│   │   │   ├── snippet.freezed.dart
│   │   │   ├── snippet.g.dart
│   │   │   ├── systemd.dart
│   │   │   ├── systemd.freezed.dart
│   │   │   ├── systemd.g.dart
│   │   │   ├── virtual_keyboard.dart
│   │   │   ├── virtual_keyboard.freezed.dart
│   │   │   └── virtual_keyboard.g.dart
│   │   ├── res/
│   │   │   ├── build_data.dart
│   │   │   ├── default.dart
│   │   │   ├── github_id.dart
│   │   │   ├── highlight.dart
│   │   │   ├── misc.dart
│   │   │   ├── status.dart
│   │   │   ├── store.dart
│   │   │   ├── terminal.dart
│   │   │   └── url.dart
│   │   ├── ssh/
│   │   │   └── session_manager.dart
│   │   └── store/
│   │       ├── connection_stats.dart
│   │       ├── container.dart
│   │       ├── history.dart
│   │       ├── private_key.dart
│   │       ├── server.dart
│   │       ├── setting.dart
│   │       └── snippet.dart
│   ├── generated/
│   │   └── l10n/
│   │       ├── l10n.dart
│   │       ├── l10n_de.dart
│   │       ├── l10n_en.dart
│   │       ├── l10n_es.dart
│   │       ├── l10n_fr.dart
│   │       ├── l10n_id.dart
│   │       ├── l10n_it.dart
│   │       ├── l10n_ja.dart
│   │       ├── l10n_ko.dart
│   │       ├── l10n_nl.dart
│   │       ├── l10n_pt.dart
│   │       ├── l10n_ru.dart
│   │       ├── l10n_tr.dart
│   │       ├── l10n_uk.dart
│   │       └── l10n_zh.dart
│   ├── hive/
│   │   ├── hive_adapters.dart
│   │   ├── hive_adapters.g.dart
│   │   ├── hive_adapters.g.yaml
│   │   └── hive_registrar.g.dart
│   ├── intro.dart
│   ├── l10n/
│   │   ├── app_de.arb
│   │   ├── app_en.arb
│   │   ├── app_es.arb
│   │   ├── app_fr.arb
│   │   ├── app_id.arb
│   │   ├── app_it.arb
│   │   ├── app_ja.arb
│   │   ├── app_ko.arb
│   │   ├── app_nl.arb
│   │   ├── app_pt.arb
│   │   ├── app_ru.arb
│   │   ├── app_tr.arb
│   │   ├── app_uk.arb
│   │   ├── app_zh.arb
│   │   └── app_zh_tw.arb
│   ├── main.dart
│   └── view/
│       ├── page/
│       │   ├── backup.dart
│       │   ├── container/
│       │   │   ├── actions.dart
│       │   │   ├── container.dart
│       │   │   └── types.dart
│       │   ├── home.dart
│       │   ├── iperf.dart
│       │   ├── ping.dart
│       │   ├── private_key/
│       │   │   ├── edit.dart
│       │   │   └── list.dart
│       │   ├── process.dart
│       │   ├── pve.dart
│       │   ├── server/
│       │   │   ├── detail/
│       │   │   │   ├── misc.dart
│       │   │   │   └── view.dart
│       │   │   ├── discovery/
│       │   │   │   ├── discovery.dart
│       │   │   │   └── widget.dart
│       │   │   ├── edit/
│       │   │   │   ├── actions.dart
│       │   │   │   ├── edit.dart
│       │   │   │   └── widget.dart
│       │   │   └── tab/
│       │   │       ├── card_stat.dart
│       │   │       ├── content.dart
│       │   │       ├── landscape.dart
│       │   │       ├── tab.dart
│       │   │       ├── top_bar.dart
│       │   │       └── utils.dart
│       │   ├── setting/
│       │   │   ├── about.dart
│       │   │   ├── entries/
│       │   │   │   ├── ai.dart
│       │   │   │   ├── app.dart
│       │   │   │   ├── container.dart
│       │   │   │   ├── editor.dart
│       │   │   │   ├── full_screen.dart
│       │   │   │   ├── home_tabs.dart
│       │   │   │   ├── server.dart
│       │   │   │   ├── sftp.dart
│       │   │   │   └── ssh.dart
│       │   │   ├── entry.dart
│       │   │   ├── platform/
│       │   │   │   ├── ios.dart
│       │   │   │   └── platform_pub.dart
│       │   │   └── seq/
│       │   │       ├── srv_detail_seq.dart
│       │   │       ├── srv_func_seq.dart
│       │   │       ├── srv_seq.dart
│       │   │       └── virt_key.dart
│       │   ├── snippet/
│       │   │   ├── edit.dart
│       │   │   ├── list.dart
│       │   │   └── result.dart
│       │   ├── ssh/
│       │   │   ├── page/
│       │   │   │   ├── ask_ai.dart
│       │   │   │   ├── init.dart
│       │   │   │   ├── keyboard.dart
│       │   │   │   ├── page.dart
│       │   │   │   └── virt_key.dart
│       │   │   └── tab.dart
│       │   ├── storage/
│       │   │   ├── local.dart
│       │   │   ├── sftp.dart
│       │   │   └── sftp_mission.dart
│       │   └── systemd.dart
│       └── widget/
│           ├── omit_start_text.dart
│           ├── percent_circle.dart
│           ├── server_func_btns.dart
│           └── unix_perm.dart
├── linux/
│   ├── .gitignore
│   ├── CMakeLists.txt
│   ├── flutter/
│   │   ├── CMakeLists.txt
│   │   ├── generated_plugin_registrant.cc
│   │   ├── generated_plugin_registrant.h
│   │   └── generated_plugins.cmake
│   ├── main.cc
│   ├── my_application.cc
│   ├── my_application.h
│   └── packaging/
│       ├── appimage/
│       │   └── make_config.yaml
│       ├── deb/
│       │   └── make_config.yaml
│       └── rpm/
│           └── make_config.yaml
├── macos/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── Flutter-Debug.xcconfig
│   │   ├── Flutter-Release.xcconfig
│   │   └── GeneratedPluginRegistrant.swift
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── MainMenu.xib
│   │   ├── Configs/
│   │   │   ├── AppInfo.xcconfig
│   │   │   ├── Debug.xcconfig
│   │   │   ├── Release.xcconfig
│   │   │   └── Warnings.xcconfig
│   │   ├── DebugProfile.entitlements
│   │   ├── Info.plist
│   │   ├── MainFlutterWindow.swift
│   │   ├── PrivacyInfo.xcprivacy
│   │   ├── Release.entitlements
│   │   ├── de.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── es.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── fr.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── id.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── ja.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── pt-BR.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── ru.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── zh-Hans.lproj/
│   │   │   └── MainMenu.strings
│   │   └── zh-Hant.lproj/
│   │       └── MainMenu.strings
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   └── xcshareddata/
│   │   │       └── IDEWorkspaceChecks.plist
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   ├── Runner.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       └── IDEWorkspaceChecks.plist
│   └── RunnerTests/
│       └── RunnerTests.swift
├── make.dart
├── pubspec.yaml
├── test/
│   ├── amd_smi_test.dart
│   ├── battery_test.dart
│   ├── btrfs_test.dart
│   ├── container_test.dart
│   ├── core_utils_test.dart
│   ├── cpu_test.dart
│   ├── disabled_cmd_types_test.dart
│   ├── disk_smart_test.dart
│   ├── disk_test.dart
│   ├── jump_chain_test.dart
│   ├── memory_test.dart
│   ├── net_speed_test.dart
│   ├── nvidia.xml
│   ├── nvidia2.xml
│   ├── nvidia_test.dart
│   ├── proc_test.dart
│   ├── pve_test.dart
│   ├── script_builder_test.dart
│   ├── sensors_test.dart
│   ├── server_dedup_test.dart
│   ├── server_edit_logic_test.dart
│   ├── ssh_config_test.dart
│   ├── system_dist_test.dart
│   ├── uptime_test.dart
│   └── windows_test.dart
└── windows/
    ├── .gitignore
    ├── CMakeLists.txt
    ├── flutter/
    │   ├── CMakeLists.txt
    │   ├── generated_plugin_registrant.cc
    │   ├── generated_plugin_registrant.h
    │   └── generated_plugins.cmake
    └── runner/
        ├── CMakeLists.txt
        ├── Runner.rc
        ├── flutter_window.cpp
        ├── flutter_window.h
        ├── main.cpp
        ├── resource.h
        ├── runner.exe.manifest
        ├── utils.cpp
        ├── utils.h
        ├── win32_window.cpp
        └── win32_window.h

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

================================================
FILE: .github/FUNDING.yml
================================================
custom: ['https://cdn.lpkt.cn/donate']


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---


<!--
Thanks for your feedback:
1、Please check if there is a similar issue first
2、If it is a function or UI suggestion, please go to Discussion
-->

**Describe the bug**
<!--A clear and concise description of what the bug is.-->


**To Reproduce**
<!--
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
-->


**Desired Results**
<!--A clear description of the result you expected.-->


**Actual Results**
<!--A clear description of the actual result.-->


**Screenshots**
<!--If applicable, add screenshots(both bug screen and logs
screen) to help explain your problem.-->


**Device**
<!--
- OS: e.g. iOS16 or Android13
- App Version: e.g. 1.0.302
-->


**Additional context**
<!--Add any other context about the problem here.-->



================================================
FILE: .github/ISSUE_TEMPLATE/bug_report_cn.md
================================================
---
name: Bug 反馈
about: 帮助我们改进错误
title: ''
labels: ''
assignees: ''

---

<!--
感谢您反馈问题,请先阅读以下内容:
1、请先查看是否已存在相似 issue
2、如果是功能、UI建议,请移步至 Discussion
-->

**描述BUG**
<!--一个关于BUG的清晰描述。-->


**复现步骤**
<!--
如何复现:
1. 打开 '...'
2. 点击 '....'
3. 滚动到 '....'
4. 看到错误
-->


**期望结果**
<!--一个关于你期望的结果的清晰描述。-->


**实际结果**
<!--一个关于实际结果的清晰描述。-->


**截图**
<!--如果可以,请添加截图(包括错误界面和日志界面)来帮助解释你的问题。-->


**设备**
<!--
- 系统: e.g. iOS16 or Android13
- App版本: e.g. 1.0.302
-->


**更多信息**
<!--在这里添加关于这个问题的更多信息。-->



================================================
FILE: .github/workflows/analysis.yml
================================================
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: flutter analysis

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  check:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 1
          submodules: recursive
      
      - uses: subosito/flutter-action@v2
        with:
          channel: 'stable'

      - name: Install dependencies
        run: flutter pub get

      # Consider passing '--fatal-infos' for slightly stricter analysis.
      - name: Analyze project source
        run: flutter analyze lib test

      # Your project will need to have tests in test/ and a dependency on
      # package:test for this step to succeed. Note that Flutter projects will
      # want to change this to 'flutter test'.
      - name: Run tests
        run: flutter test


================================================
FILE: .github/workflows/release.yml
================================================
name: Flutter Release

on:
  workflow_dispatch:
  push:
    tags:
      - "v*"

permissions:
  contents: write

env:
  APP_NAME: ServerBox
  RELEASE_TAG: ${{ github.ref_name }}

jobs:
  releaseAndroid:
    name: Release android
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          submodules: recursive
      - name: Install Flutter
        uses: subosito/flutter-action@v2
        with:
          channel: "stable"
          flutter-version: "3.41.4"
      - uses: actions/setup-java@v4
        with:
          distribution: "zulu"
          java-version: "17"
      - name: Fetch secrets
        run: |
          curl -u ${{ secrets.BASIC_AUTH }} -o android/app/app.key ${{ secrets.URL_PREFIX }}app.key
          curl -u ${{ secrets.BASIC_AUTH }} -o android/key.properties ${{ secrets.URL_PREFIX }}key.properties
      - name: Build
        run: dart run fl_build -p android
      - name: Rename for fdroid
        shell: bash
        run: |
          APK_DIR="build/app/outputs/flutter-apk"
          shopt -s nullglob

          for arch in arm64 arm amd64; do
            matches=("$APK_DIR"/"${APP_NAME}"_*_"${arch}".apk)
            if [ ${#matches[@]} -ne 1 ]; then
              echo "Error: expected 1 APK for ${arch}, found ${#matches[@]}"
              echo "APK_DIR: $APK_DIR"
              ls -la "$APK_DIR" || true
              exit 1
            fi
            mv "${matches[0]}" "$APK_DIR/${APP_NAME}_${RELEASE_TAG}_${arch}.apk"
          done
      - name: Create Release
        uses: softprops/action-gh-release@v2
        with:
          files: |
            build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.RELEASE_TAG }}_arm64.apk
            build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.RELEASE_TAG }}_arm.apk
            build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.RELEASE_TAG }}_amd64.apk
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  releaseLinux:
    name: Release linux
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          submodules: recursive
      - name: Install Flutter
        uses: subosito/flutter-action@v2
      - name: Install dependencies
        run: |
          sudo apt update
          # Basic
          sudo apt install -y clang cmake ninja-build pkg-config libgtk-3-dev mesa-utils libvulkan-dev desktop-file-utils wget
          # App Specific
          sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libunwind-dev libsecret-1-dev
      - name: Build
        run: |
          dart run fl_build -p linux
      - name: Rename for release
        shell: bash
        run: |
          shopt -s nullglob
          matches=("${APP_NAME}"_*_amd64.AppImage)
          if [ ${#matches[@]} -ne 1 ]; then
            echo "Error: expected 1 AppImage, found ${#matches[@]}"
            ls -la || true
            exit 1
          fi
          mv "${matches[0]}" "${APP_NAME}_${RELEASE_TAG}_amd64.AppImage"
      - name: Create Release
        uses: softprops/action-gh-release@v2
        with:
          files: |
            ${{ env.APP_NAME }}_${{ env.RELEASE_TAG }}_amd64.AppImage
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  releaseWin:
    name: Release windows
    runs-on: windows-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          submodules: recursive
      - name: Install Flutter
        uses: subosito/flutter-action@v2
      - name: Build
        run: dart run fl_build -p windows
      - name: Rename for release
        shell: bash
        run: |
          shopt -s nullglob
          matches=("${APP_NAME}"_*_windows_amd64.zip)
          if [ ${#matches[@]} -ne 1 ]; then
            echo "Error: expected 1 zip, found ${#matches[@]}"
            ls -la || true
            exit 1
          fi
          mv "${matches[0]}" "${APP_NAME}_${RELEASE_TAG}_windows_amd64.zip"
      - name: Create Release
        uses: softprops/action-gh-release@v2
        with:
          files: |
            ${{ env.APP_NAME }}_${{ env.RELEASE_TAG }}_windows_amd64.zip
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  # releaseIOS:
  #   name: Release iOS
  #   runs-on: macos-latest
  #   steps:
  #     - name: Checkout
  #       uses: actions/checkout@v6
  #       with:
  #         submodules: recursive
  #     - name: Install Flutter
  #       uses: subosito/flutter-action@v2
  #     - name: Build
  #       run: |
  #         dart run fl_build -p ios -- --no-codesign
  #         shopt -s nullglob
  #         IPA_FILES=(build/ios/ipa/*.ipa)
  #         if [ ${#IPA_FILES[@]} -ne 1 ]; then
  #           echo "Error: expected 1 IPA, found ${#IPA_FILES[@]}"
  #           ls -la build/ios/ipa || true
  #           exit 1
  #         fi
  #         IPA_FILE="${IPA_FILES[0]}"
  #         echo "Found IPA: $IPA_FILE"
  #         cp "$IPA_FILE" "${APP_NAME}_${RELEASE_TAG}_ios.ipa"
  #     - name: Create Release
  #       uses: softprops/action-gh-release@v2
  #       with:
  #         files: |
  #           ${{ env.APP_NAME }}_${{ env.RELEASE_TAG }}_ios.ipa
  #       env:
  #         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  # releaseMacOS:
  #   name: Release macOS
  #   runs-on: macos-latest
  #   steps:
  #     - name: Checkout
  #       uses: actions/checkout@v6
  #       with:
  #         submodules: recursive
  #     - name: Install Flutter
  #       uses: subosito/flutter-action@v2
  #     - name: Build
  #       run: |
  #         dart run fl_build -p macos -- --no-codesign
  #     - name: Package
  #       run: |
  #         RELEASE_DIR="$GITHUB_WORKSPACE/build/macos/Build/Products/Release"
  #         APP_DIR="$RELEASE_DIR/$APP_NAME.app"
  #         OUT_ZIP="$GITHUB_WORKSPACE/${APP_NAME}_${RELEASE_TAG}_macos.zip"

  #         if [ ! -d "$RELEASE_DIR" ]; then
  #           echo "Error: macOS release directory not found: $RELEASE_DIR"
  #           exit 1
  #         fi
  #         if [ ! -d "$APP_DIR" ]; then
  #           echo "Error: macOS app bundle not found: $APP_DIR"
  #           exit 1
  #         fi

  #         cd "$RELEASE_DIR"
  #         zip -ry "$OUT_ZIP" "$APP_NAME.app"
  #     - name: Create Release
  #       uses: softprops/action-gh-release@v2
  #       with:
  #         files: |
  #           ${{ env.APP_NAME }}_${{ env.RELEASE_TAG }}_macos.zip
  #       env:
  #         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


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

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

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

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

# Web related
lib/generated_plugin_registrant.dart

# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

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

/android/app/fjy.androidstudio.key
/android/app/app.key
/release
test.dart

# Keep generated l10n files
# /.dart_tool/*
# !/.dart_tool/flutter_gen

.dart_tool

# Linux release
linux.AppDir
**/*.AppImage

untranlated.json

.vscode/settings.json
more_build_data.json
trans.txt
android/app/.cxx


================================================
FILE: .gitmodules
================================================
[submodule "dartssh2"]
	path = packages/dartssh2
	url = https://github.com/lollipopkit/dartssh2
	branch = master
[submodule "xterm"]
	path = packages/xterm
	url = https://github.com/lollipopkit/xterm.dart
	branch = master
[submodule "fl_lib"]
	path = packages/fl_lib
	url = https://github.com/lollipopkit/fl_lib
	branch = before-sqlite
[submodule "fl_build"]
	path = packages/fl_build
	url = https://github.com/lppcg/fl_build.git
	branch = main
[submodule "server_box_monitor"]
	path = packages/server_box_monitor
	url = https://github.com/lollipopkit/server_box_monitor
	branch = main
[submodule "circle_chart"]
	path = packages/circle_chart
	url = https://github.com/lollipopkit/circle_chart
	branch = main
[submodule "plain_notification_token"]
	path = packages/plain_notification_token
	url = https://github.com/lollipopkit/plain_notification_token
	branch = master
[submodule "watch_connectivity"]
	path = packages/watch_connectivity
	url = https://github.com/lollipopkit/watch_connectivity
	branch = master


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

version:
  revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49"
  channel: "stable"

project_type: app

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

  # User provided section

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


================================================
FILE: .vscode/launch.json
================================================
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "debug",
            "request": "launch",
            "type": "dart",
            "env": {
                // Comment this line to use the default display
                "DISPLAY": ":1"
            }
            // "args": [
            //     "-v"
            // ]
        },
        {
            "name": "profile",
            "request": "launch",
            "type": "dart",
            "flutterMode": "profile",
            "args": [
                "--cache-sksl",
                // "--purge-persistent-cache"
            ]
        }
    ]
}

================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Commands

### Development

- `flutter run` - Run the app in development mode
- `dart run fl_build -p PLATFORM` - Build the app for specific platform (see fl_build package)
- `dart run build_runner build --delete-conflicting-outputs` - Generate code for models with annotations (json_serializable, freezed, hive, riverpod)
  - Every time you change model files, run this command to regenerate code (Hive adapters, Riverpod providers, etc.)
  - Generated files include: `*.g.dart`, `*.freezed.dart` files

### Testing

- `flutter test` - Run unit tests
- `flutter test test/battery_test.dart` - Run specific test file

## Architecture

This is a Flutter application for managing Linux servers with the following key architectural components:

### Project Structure

- `lib/core/` - Core utilities, extensions, and routing
- `lib/data/` - Data layer with models, providers, and storage
  - `model/` - Data models organized by feature (server, container, ssh, etc.)
  - `provider/` - Riverpod providers for state management
  - `store/` - Local storage implementations using Hive
- `lib/view/` - UI layer with pages and widgets
- `lib/generated/` - Generated localization files
- `lib/hive/` - Hive adapters for local storage

### Key Technologies

- **State Management**: Riverpod with code generation (riverpod_annotation)
- **Local Storage**: Hive for persistent data with generated adapters
- **SSH/SFTP**: Custom dartssh2 fork for server connections
- **Terminal**: Custom xterm.dart fork for SSH terminal interface
- **Networking**: dio for HTTP requests
- **Charts**: fl_chart for server status visualization
- **Localization**: Flutter's built-in i18n with ARB files
- **Code Generation**: Uses build_runner with json_serializable, freezed, hive_generator, riverpod_generator

### Data Models

- Server management models in `lib/data/model/server/`
- Container/Docker models in `lib/data/model/container/`
- SSH and SFTP models in respective directories
- Most models use freezed for immutability and json_annotation for serialization

### Features

- Server status monitoring (CPU, memory, disk, network)
- SSH terminal with virtual keyboard
- SFTP file browser
- Docker container management
- Process and systemd service management
- Server snippets and custom commands
- Multi-language support (12+ languages)
- Cross-platform support (iOS, Android, macOS, Linux, Windows)

### State Management Pattern

- Uses Riverpod providers for dependency injection and state management
- Uses Freezed for immutable state models
- Providers are organized by feature in `lib/data/provider/`
- State is often persisted using Hive stores in `lib/data/store/`

### Build System

- Uses custom `fl_build` package for cross-platform building
- `make.dart` script handles pre/post build tasks (metadata generation)
- Supports building for multiple platforms with platform-specific configurations
- Many dependencies are custom forks hosted on GitHub (dartssh2, xterm, fl_lib, etc.)

### Important Notes

- **Never run code formatting commands** - The codebase has specific formatting that should not be changed
- **Always run code generation** after modifying models with annotations (freezed, json_serializable, hive, riverpod)
- Generated files (`*.g.dart`, `*.freezed.dart`) should not be manually edited
- AGAIN, NEVER run code formatting commands.
- USE dependency injection via GetIt for services like Stores, Services and etc.
- Generate all l10n files using `flutter gen-l10n` command after modifying ARB files.
- USE `hive_ce` not `hive` package for Hive integration.
  - Which no need to config `HiveField` and `HiveType` manually.
- USE widgets and utilities from `fl_lib` package for common functionalities.
  - Such as `CustomAppBar`, `context.showRoundDialog`, `Input`, `Btnx.cancelOk`, etc.
  - You can use context7 MCP to search `lppcg fl_lib KEYWORD` to find relevant widgets and utilities.
- USE `libL10n` and `l10n` for localization strings.
  - `libL10n` is from `fl_lib` package, and `l10n` is from this project.
  - Before adding new strings, check if it already exists in `libL10n`.
  - Prioritize using strings from `libL10n` to avoid duplication, even if the meaning is not 100% exact, just use the substitution of `libL10n`.
- Split UI into Widget build, Actions, Utils. use `extension on` to achieve this


================================================
FILE: LICENSE
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

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

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

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

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

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

                       TERMS AND CONDITIONS

  0. Definitions.

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

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

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

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

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

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

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

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

  1. Source Code.

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

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

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

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

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

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

  2. Basic Permissions.

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

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

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

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

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

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

  4. Conveying Verbatim Copies.

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

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

  5. Conveying Modified Source Versions.

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

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

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

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

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

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

  6. Conveying Non-Source Forms.

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

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

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

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

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

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

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

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

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

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

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

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

  7. Additional Terms.

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

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

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

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

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

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

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

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

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

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

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

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

  8. Termination.

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

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

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

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

  9. Acceptance Not Required for Having Copies.

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

  10. Automatic Licensing of Downstream Recipients.

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

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

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

  11. Patents.

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

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

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

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

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

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

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

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

  12. No Surrender of Others' Freedom.

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

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

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

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

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

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

  15. Disclaimer of Warranty.

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

  16. Limitation of Liability.

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

  17. Interpretation of Sections 15 and 16.

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

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

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

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

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

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

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

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

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

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

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

================================================
FILE: README.md
================================================
English | [简体中文](README_zh.md)

<h2 align="center">Flutter Server Box</h2>

<div align="center">
  <a href="https://cdn.lpkt.cn/donate"><img alt="donate" src="https://img.shields.io/badge/donate-me-pink"></a>
  <img alt="lang" src="https://img.shields.io/badge/lang-dart-cyan">
  <img alt="license" src="https://img.shields.io/badge/license-AGPLv3-yellow">
  <a href="https://deepwiki.com/lollipopkit/flutter_server_box"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
</div>

<p align="center">
A Flutter project which provides charts to display Linux, Unix and Windows server status and tools to manage servers.
<br>
Especially thanks to <a href="https://github.com/TerminalStudio/dartssh2">dartssh2</a> & <a href="https://github.com/TerminalStudio/xterm.dart">xterm.dart</a>.
</p>

## 🏙️ Screenshots

<table>
  <tr>
    <td><img width="200px" src="https://cdn.lpkt.cn/serverbox/screenshot/1.jpg"></td>
    <td><img width="200px" src="https://cdn.lpkt.cn/serverbox/screenshot/2.jpg"></td>
    <td><img width="200px" src="https://cdn.lpkt.cn/serverbox/screenshot/3.jpg"></td>
    <td><img width="200px" src="https://cdn.lpkt.cn/serverbox/screenshot/4.jpg"></td>
  </tr>
</table>

## 📥 Installation

|Platform| From|
|--|--|
| iOS / macOS     | [AppStore](https://apps.apple.com/app/id1586449703)                                                                                                                                                                                                                               |
| Android         | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/) |
| Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid)                                                                                                                                 |

Please only download pkgs from the source that **you trust**!  

## 🔖 Features

- `Status chart` (CPU, Sensors, GPU...), `SSH` Term, `SFTP`, `Docker & Process & Systemd`, `S.M.A.R.T`...
- Platform specific: `Bio auth`、`Msg push`、`Home widget`、`watchOS App`...
- English, 简体中文; Deutsch [@its-tom](https://github.com/its-tom), 繁體中文 [@kalashnikov](https://github.com/kalashnikov), Indonesian [@azkadev](https://github.com/azkadev), Français [@FrancXPT](https://github.com/FrancXPT), Dutch [@QazCetelic](https://github.com/QazCetelic), Türkçe [@mikropsoft](https://github.com/mikropsoft), Українська мова [@CakesTwix](https://github.com/CakesTwix); Español, Русский язык, Português, 日本語 (Generated by GPT)

## 🆘 Help

<div align="center">
  <a href="https://qm.qq.com/q/daCGa7eShG"><img alt="qq" src="https://img.shields.io/badge/QQ-Group-pink"></a>
  <a href="https://t.me/lpktg"><img alt="donate" src="https://img.shields.io/badge/Telegram-lpktg-green"></a>
  <a href="https://discord.gg/SsVNbRhK7w"><img alt="discord" src="https://img.shields.io/badge/Discord-lpkt-purple"></a>
</div>

- In order to push  server status to your portable device without opening ServerBox app (Such as **message push** and **home widget**), you need to install [ServerBoxMonitor](https://github.com/lollipopkit/server_box_monitor) on your servers, and config it correctly. See [wiki](https://github.com/lollipopkit/server_box_monitor/wiki) for more details.
- **Common issues** can be found in [app wiki](https://github.com/lollipopkit/flutter_server_box/wiki).

Before you open an issue, please read the following:

1. Paste the **entire log** (click the top right of the home page) in the issue template.
2. Make sure whether the issue is caused by ServerBox app.
3. Welcome all valid and positive feedback, subjective feedback (such as you think other UI is better) may not be accepted.

After you read the above, you can open an [issue](https://github.com/lollipopkit/flutter_server_box/issues/new).

## 🧱 Contributions

Any positive contribution is welcome.

If I forgot to add your name to the contributors list, please add a comment in the issue or PR you opened to let me know, I will add it as soon as possible.

### Development

1. Setup [Flutter](https://flutter.dev/docs/get-started/install) environment.
2. Clone this repo, run `flutter run` to start the app.
3. Run `dart run fl_build -p PLATFORM` to build the app.

### Translation

- [Guide](https://blog.lpkt.cn/posts/faq/) can be found in my blog.
- We need your help! Just feel free to open a PR.

## 💡 My other apps

- [GPT Box](https://github.com/lollipopkit/flutter_gpt_box) - A third-party GPT Client for OpenAI API on all platforms.
- [More](https://github.com/lollipopkit) - Tools & etc.

## 📝 License

`AGPL v3 lollipopkit & all contributors`


================================================
FILE: README_zh.md
================================================
简体中文 | [English](README.md)

<h2 align="center">Flutter Server Box</h2>

<div align="center">
  <a href="https://cdn.lpkt.cn/donate"><img alt="donate" src="https://img.shields.io/badge/捐赠-我-pink"></a>
  <img alt="语言" src="https://img.shields.io/badge/语言-dart-cyan">
  <img alt="license" src="https://img.shields.io/badge/证书-AGPLv3-yellow">
  <a href="https://deepwiki.com/lollipopkit/flutter_server_box"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
</div>

<p align="center">
使用 Flutter 开发的 Linux, Unix, Windows 服务器工具箱,提供服务器状态图表和管理工具。
<br>
特别感谢 <a href="https://github.com/TerminalStudio/dartssh2">dartssh2</a> & <a href="https://github.com/TerminalStudio/xterm.dart">xterm.dart</a>。
</p>

## 🏙️ 截屏

<table>
  <tr>
    <td><img width="200px" src="https://cdn.lpkt.cn/serverbox/screenshot/1.jpg"></td>
    <td><img width="200px" src="https://cdn.lpkt.cn/serverbox/screenshot/2.jpg"></td>
    <td><img width="200px" src="https://cdn.lpkt.cn/serverbox/screenshot/3.jpg"></td>
    <td><img width="200px" src="https://cdn.lpkt.cn/serverbox/screenshot/4.jpg"></td>
  </tr>
</table>

## 📥 安装

平台|下载
--|--
iOS / macOS     | [AppStore](https://apps.apple.com/app/id1586449703)
Android         | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/)
Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid)

请从 **信任** 的来源下载!

## 🔖 特点

- `状态图表`(CPU、传感器、GPU 等), `SSH` 终端, `SFTP`, `Docker & 进程 & Systemd` 管理,`S.M.A.R.T`...
- 特殊支持:`生物认证`、`推送`、`桌面小部件`、`watchOS App`、`跟随系统颜色`...
- 本地化
  - English, 简体中文
  - Español, Русский язык, Português, 日本語 (Generated by GPT)
  - Deutsch [@its-tom](https://github.com/its-tom), 繁體中文 [@kalashnikov](https://github.com/kalashnikov), Indonesian [@azkadev](https://github.com/azkadev), Français [@FrancXPT](https://github.com/FrancXPT), Dutch [@QazCetelic](https://github.com/QazCetelic), Türkçe [@mikropsoft](https://github.com/mikropsoft), Українська мова [@CakesTwix](https://github.com/CakesTwix);
  - 感谢贡献者们!

## 🆘 帮助

<div align="center">
  <a href="https://qm.qq.com/q/daCGa7eShG"><img alt="qq" src="https://img.shields.io/badge/QQ-群-pink"></a>
  <a href="https://t.me/lpktg"><img alt="donate" src="https://img.shields.io/badge/Telegram-lpktg-green"></a>
  <a href="https://discord.gg/SsVNbRhK7w"><img alt="discord" src="https://img.shields.io/badge/Discord-lpkt-purple"></a>
</div>

- 为了可以在不使用 ServerBox app 时获取服务器状态(例如:桌面小部件、推送服务),你需要在你的服务器上安装 [ServerBoxMonitor](https://github.com/lollipopkit/server_box_monitor),详情见 [wiki](https://github.com/lollipopkit/server_box_monitor/wiki/%E4%B8%BB%E9%A1%B5)。  
- **常见问题** 可以在 [app wiki](https://github.com/lollipopkit/flutter_server_box/wiki/主页) 查看。

反馈前须知:

1. 反馈问题请附带 log(点击首页右上角),并以 bug 模版提交。
2. 反馈问题前请检查是否是 serverbox 的问题。
3. 欢迎所有有效、正面的反馈,主观(比如你觉得其他UI更好看)的反馈不一定会接受

## 🧱 贡献

任何正面的贡献都欢迎。

如果我忘记在贡献者列表中添加你的名字,请在你打开的 issue 或 PR 中添加评论让我知道,我会尽快添加。

### 开发

1. 安装 [Flutter](https://flutter.dev/docs/get-started/install)
2. 克隆这个仓库, 运行 `flutter run` 启动应用
3. 运行 `dart run fl_build -p PLATFORM` 构建应用

### 翻译

[指南](https://blog.lpkt.cn/faq/) 可在我的博客中找到。

## 💡 我的其它 Apps

- [GPT Box](https://github.com/lollipopkit/flutter_gpt_box) - 支持 OpenAI API 的 第三方全平台客户端。
- [更多](https://github.com/lollipopkit) - 工具 & etc.

## 📝 协议

`AGPL v3 lollipopkit & 所有贡献者`


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

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

analyzer:
  exclude:
    - "**/*.g.dart"
  language:
    # strict-casts: true
    # strict-inference: true
    # strict-raw-types: true
  errors:
    invalid_annotation_target: ignore

linter:
  # The lint rules applied to this project can be customized in the
  # section below to disable rules from the `package:flutter_lints/flutter.yaml`
  # included above or to enable additional rules. A list of all available lints
  # and their documentation is published at
  # https://dart-lang.github.io/linter/lints/index.html.
  #
  # Instead of disabling a lint rule for the entire project in the
  # section below, it can also be suppressed for a single line of code
  # or a specific dart file by using the `// ignore: name_of_lint` and
  # `// ignore_for_file: name_of_lint` syntax on the line or in the file
  # producing the lint.
  rules:
    library_private_types_in_public_api: true
    use_build_context_synchronously: false
    depend_on_referenced_packages: false
    prefer_final_locals: true
    unnecessary_parenthesis: true
    implicit_call_tearoffs: true
    always_declare_return_types: true
    always_use_package_imports: true
    annotate_overrides: true
    avoid_empty_else: true
    # avoid_print: false  # Uncomment to disable the `avoid_print` rule
    prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
    avoid_return_types_on_setters: true
    directives_ordering: true # Enable sorting of imports

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


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

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


================================================
FILE: android/app/build.gradle
================================================
plugins {
    id "com.android.application"
    id "kotlin-android"
    id "dev.flutter.flutter-gradle-plugin"
}

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

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
} else {
    System.err.printf(" [!] key.properties not found in %s (%s). Build will fail. \n", rootProject, rootProject.file('.'))
}

if (keystoreProperties['storeFile'] == null || !file(keystoreProperties['storeFile']).exists()) {
    System.err.printf(" [!] storeFile defined in key.properties does not exist in %s. Build will fail. \n", file('.'))
}

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

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

android {
    namespace "tech.lolli.toolbox"
    compileSdk flutter.compileSdkVersion
    ndkVersion flutter.ndkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        applicationId "tech.lolli.toolbox"
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        
        ndk {
            if(!splits.abi.enable) { // abiFilters cannot be present when splits abi filters are set
                abiFilters 'arm64-v8a', 'armeabi-v7a'
            }
        }
    }

    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        debug {
            // No applicationIdSuffix or resValue here
        }

        profile {
            // No applicationIdSuffix or resValue here
        }
    }

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

flutter {
    source '../..'
}

dependencies {}

ext.abiCodes = ["x86_64": 1, "armeabi-v7a": 2, "arm64-v8a": 3]
import com.android.build.OutputFile
android.applicationVariants.all { variant ->
  variant.outputs.each { output ->
    def abiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
    if (abiVersionCode != null) {
      output.versionCodeOverride = variant.versionCode * 100 + abiVersionCode
    }
  }
}


================================================
FILE: android/app/proguard-rules.pro
================================================
-keep class com.jcraft.**  { *; }


================================================
FILE: android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.USE_BIOMETRIC" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

    <application
        android:label="@string/app_name"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher"
        android:allowBackup="true" 
        android:fullBackupContent="@xml/backup_rules"
        android:hasFragileUserData="true"
        android:restoreAnyVersion="true"
        tools:targetApi="q">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|locale|layoutDirection|fontScale|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
                android:name="io.flutter.embedding.android.NormalTheme"
                android:resource="@style/NormalTheme"
            />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />

        <activity
            android:name=".widget.WidgetConfigureActivity"
            android:exported="false"
            android:theme="@android:style/Theme.Material.Light.Dialog">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".widget.HomeWidget"
            android:exported="false"
            android:label="StatusWidget">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                <action android:name="tech.lolli.toolbox.UPDATE_WIDGET" />
                <action android:name="miui.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <!--
                 <meta-data
                android:name="miuiWidget"
                android:value="true" />
            -->
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/home_widget" />
        </receiver>

        <service
            android:name=".ForegroundService"
            android:enabled="true"
            android:foregroundServiceType="dataSync"
            android:exported="false" />

    </application>
    <!-- Required to query activities that can process text, see:
         https://developer.android.com/training/package-visibility?hl=en and
         https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.

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

================================================
FILE: android/app/src/main/kotlin/tech/lolli/toolbox/ForegroundService.kt
================================================
package tech.lolli.toolbox

import android.app.*
import android.content.Intent
import android.content.pm.ServiceInfo
import android.graphics.drawable.Icon
import android.os.Build
import android.os.IBinder
import android.util.Log
import org.json.JSONArray
import org.json.JSONObject
import java.io.File
import java.util.*

class ForegroundService : Service() {
    companion object {
        @Volatile
        var isRunning: Boolean = false
    }
    private val chanId = "ForegroundServiceChannel"
    private val NOTIFICATION_ID = 1000
    private val ACTION_STOP_FOREGROUND = "ACTION_STOP_FOREGROUND"
    private val ACTION_UPDATE_SESSIONS = "tech.lolli.toolbox.ACTION_UPDATE_SESSIONS"
    private val ACTION_DISCONNECT_SESSION = "tech.lolli.toolbox.ACTION_DISCONNECT_SESSION"

    private var isFgStarted = false
    private val postedIds = mutableSetOf<Int>()
    // Stable mapping from session-id -> notification-id to avoid hash collisions
    private val notificationIdMap = mutableMapOf<String, Int>()
    private val nextNotificationId = java.util.concurrent.atomic.AtomicInteger(2001)

    private fun logError(message: String, error: Throwable? = null) {
        Log.e("ForegroundService", message, error)
        try {
            val logFile = File(getExternalFilesDir(null), "server_box.log")
            val timestamp = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US).format(Date())
            val logMessage = "$timestamp [ForegroundService] ERROR: $message\n${error?.stackTraceToString() ?: ""}\n"
            logFile.appendText(logMessage)
        } catch (e: Exception) {
            Log.e("ForegroundService", "Failed to write log", e)
        }
    }

    override fun onCreate() {
        super.onCreate()
        Log.d("ForegroundService", "Service onCreate")
        isRunning = true
        createNotificationChannel()
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        try {
            // Check notification permission for Android 13+
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
                androidx.core.content.ContextCompat.checkSelfPermission(
                    this, android.Manifest.permission.POST_NOTIFICATIONS
                ) != android.content.pm.PackageManager.PERMISSION_GRANTED
            ) {
                Log.w("ForegroundService", "Notification permission denied. Stopping service gracefully.")
                // Don't call stopForegroundService() here as we haven't started foreground yet
                stopSelf()
                return START_NOT_STICKY
            }

            if (intent == null) {
                Log.w("ForegroundService", "onStartCommand called with null intent")
                // Don't call stopForegroundService() here as we haven't started foreground yet
                stopSelf()
                return START_NOT_STICKY
            }

            val action = intent.action
            Log.d("ForegroundService", "onStartCommand action=$action")

            return when (action) {
                ACTION_STOP_FOREGROUND -> {
                    // Notify Flutter to stop all connections before stopping service
                    val stopAllIntent = Intent("tech.lolli.toolbox.STOP_ALL_CONNECTIONS")
                    sendBroadcast(stopAllIntent)
                    clearAll()
                    stopForegroundService()
                    START_NOT_STICKY
                }
                ACTION_UPDATE_SESSIONS -> {
                    val payload = intent.getStringExtra("payload") ?: "{}"
                    handleUpdateSessions(payload)
                    START_STICKY
                }
                else -> {
                    // Default bring up foreground with placeholder
                    ensureForeground(createMergedNotification(0, emptyList(), emptyList()))
                    START_STICKY
                }
            }
            
        } catch (e: Exception) {
            logError("Error in onStartCommand", e)
            stopSelf()
            return START_NOT_STICKY
        }
    }

    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    private fun createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            try {
                val manager = getSystemService(NotificationManager::class.java)
                if (manager == null) {
                    Log.e("ForegroundService", "Failed to get NotificationManager")
                    return
                }
                val serviceChannel = NotificationChannel(
                    chanId,
                    "ForegroundServiceChannel",
                    NotificationManager.IMPORTANCE_DEFAULT
                ).apply {
                    description = "For foreground service"
                }
                manager.createNotificationChannel(serviceChannel)
                Log.d("ForegroundService", "Notification channel created successfully")
            } catch (e: Exception) {
                logError("Failed to create notification channel", e)
            }
        }
    }

    private fun ensureForeground(notification: Notification) {
        try {
            // Double-check notification permission before starting foreground service
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
                androidx.core.content.ContextCompat.checkSelfPermission(
                    this, android.Manifest.permission.POST_NOTIFICATIONS
                ) != android.content.pm.PackageManager.PERMISSION_GRANTED
            ) {
                Log.w("ForegroundService", "Cannot start foreground service without notification permission")
                stopSelf()
                return
            }

            if (!isFgStarted) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    startForeground(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC)
                } else {
                    startForeground(NOTIFICATION_ID, notification)
                }
                isFgStarted = true
                Log.d("ForegroundService", "Foreground service started successfully")
            } else {
                val nm = getSystemService(NotificationManager::class.java)
                if (nm != null) {
                    nm.notify(NOTIFICATION_ID, notification)
                } else {
                    Log.w("ForegroundService", "NotificationManager is null, cannot update notification")
                }
            }
        } catch (e: SecurityException) {
            logError("Security exception when starting foreground service (likely missing permission)", e)
            stopSelf()
        } catch (e: Exception) {
            logError("Failed to start/update foreground", e)
            // Don't stop the service for other exceptions, just log them
        }
    }


    private fun createMergedNotification(count: Int, lines: List<String>, sessions: List<SessionItem>): Notification {
        val notificationIntent = Intent(this, MainActivity::class.java)
        val pendingIntent = PendingIntent.getActivity(
            this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE
        )
        val stopIntent = Intent(this, ForegroundService::class.java).apply { action = ACTION_STOP_FOREGROUND }
        val stopPending = PendingIntent.getService(this, 0, stopIntent, PendingIntent.FLAG_IMMUTABLE)

        val builder = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Notification.Builder(this, chanId)
        } else {
            @Suppress("DEPRECATION")
            Notification.Builder(this)
        }

        // Use the earliest session's start time for chronometer
        val earliestStartTime = sessions.minOfOrNull { it.startWhen } ?: System.currentTimeMillis()

        val title = when (count) {
            0 -> "Server Box"
            1 -> sessions.first().title
            else -> "SSH sessions: $count active"
        }

        val contentText = when (count) {
            0 -> "Ready for connections"
            1 -> {
                val session = sessions.first()
                "${session.subtitle} · ${session.status}"
            }
            else -> "Multiple SSH connections active"
        }

        // For multiple sessions, show details in expanded view
        val style = if (count > 1) {
            val inbox = Notification.InboxStyle()
            val maxLines = 5
            val displayLines = if (lines.size > maxLines) {
                lines.take(maxLines) + "...and ${lines.size - maxLines} more"
            } else {
                lines
            }
            displayLines.forEach { inbox.addLine(it) }
            inbox.setBigContentTitle(title)
            inbox
        } else {
            null
        }

        val notification = builder
            .setContentTitle(title)
            .setContentText(contentText)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setWhen(earliestStartTime)
            .setUsesChronometer(true)
            .setOngoing(true)
            .setOnlyAlertOnce(true)
            .setContentIntent(pendingIntent)
            .addAction(
                Notification.Action.Builder(
                    Icon.createWithResource(this, android.R.drawable.ic_delete),
                    "Stop All",
                    stopPending
                ).build()
            )

        if (style != null) {
            notification.setStyle(style)
        }

        return notification.build()
    }

    private fun handleUpdateSessions(payload: String) {
        val nm = getSystemService(NotificationManager::class.java)
        if (nm == null) {
            logError("NotificationManager null")
            return
        }

        val sessions = mutableListOf<SessionItem>()
        try {
            val obj = JSONObject(payload)
            val arr: JSONArray = obj.optJSONArray("sessions") ?: JSONArray()
            for (i in 0 until arr.length()) {
                val s = arr.optJSONObject(i) ?: continue
                val id = s.optString("id")
                val title = s.optString("title")
                val sub = s.optString("subtitle")
                val whenMs = s.optLong("startTimeMs", System.currentTimeMillis())
                val status = s.optString("status", "connected")
                if (id.isNotEmpty()) {
                    sessions.add(SessionItem(id, title, sub, whenMs, status))
                }
            }
        } catch (e: Exception) {
            logError("Failed to parse payload", e)
        }

        // Clear if empty
        if (sessions.isEmpty()) {
            clearAll()
            return
        }

        // Cancel any existing individual notifications (we only show merged notification now)
        val toCancel = postedIds.toSet()
        toCancel.forEach { nm.cancel(it) }
        postedIds.clear()
        notificationIdMap.clear()

        // Create merged notification content
        val summaryLines = sessions.map { "${it.title}: ${it.status}" }
        val mergedNotification = createMergedNotification(sessions.size, summaryLines, sessions)
        ensureForeground(mergedNotification)
    }

    private fun clearAll() {
        val nm = getSystemService(NotificationManager::class.java)
        nm?.cancel(NOTIFICATION_ID)
        postedIds.forEach { id -> nm?.cancel(id) }
        postedIds.clear()
        isFgStarted = false
    }

    data class SessionItem(
        val id: String,
        val title: String,
        val subtitle: String,
        val startWhen: Long,
        val status: String,
    )

    private fun stopForegroundService() {
        try {
            if (isFgStarted) {
                stopForeground(STOP_FOREGROUND_REMOVE)
                isFgStarted = false
            }
        } catch (e: Exception) {
            logError("Error stopping foreground", e)
        }
        stopSelf()
        Log.d("ForegroundService", "ForegroundService stopped")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d("ForegroundService", "Service onDestroy")
        isRunning = false
    }
}


================================================
FILE: android/app/src/main/kotlin/tech/lolli/toolbox/MainActivity.kt
================================================
package tech.lolli.toolbox

import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.Manifest
import android.content.BroadcastReceiver
import android.content.Context
import android.content.IntentFilter
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import android.appwidget.AppWidgetManager
import tech.lolli.toolbox.widget.HomeWidget

class MainActivity: FlutterFragmentActivity() {
    private lateinit var channel: MethodChannel
    private val ACTION_UPDATE_SESSIONS = "tech.lolli.toolbox.ACTION_UPDATE_SESSIONS"
    private val ACTION_DISCONNECT_SESSION = "tech.lolli.toolbox.ACTION_DISCONNECT_SESSION"
    private val ACTION_STOP_ALL_CONNECTIONS = "tech.lolli.toolbox.STOP_ALL_CONNECTIONS"
    private var stopAllReceiver: BroadcastReceiver? = null

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        val binaryMessenger = flutterEngine.dartExecutor.binaryMessenger

        channel = MethodChannel(binaryMessenger, "tech.lolli.toolbox/main_chan")
        channel.setMethodCallHandler { method, result ->
                when (method.method) {
                    "sendToBackground" -> {
                        moveTaskToBack(true)
                        result.success(null)
                    }
                    "isServiceRunning" -> {
                        result.success(ForegroundService.isRunning)
                    }
                    "startService" -> {
                        try {
                            reqPerm()
                            if (!notificationsAllowed()) {
                                // Don't start foreground service without notification permission on API 33+
                                result.error("NOTIFICATION_PERMISSION_DENIED", "Notification permission not granted", null)
                                return@setMethodCallHandler
                            }
                            val serviceIntent = Intent(this@MainActivity, ForegroundService::class.java)
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                startForegroundService(serviceIntent)
                            } else {
                                startService(serviceIntent)
                            }
                            result.success(null)
                        } catch (e: Exception) {
                            // Log error but don't crash
                            android.util.Log.e("MainActivity", "Failed to start service: ${e.message}")
                            result.error("SERVICE_ERROR", e.message, null)
                        }
                    }
                    "stopService" -> {
                        val serviceIntent = Intent(this@MainActivity, ForegroundService::class.java)
                        stopService(serviceIntent)
                        result.success(null)
                    }
                    "updateHomeWidget" -> {
                        val intent = Intent(this@MainActivity, HomeWidget::class.java)
                        intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
                        sendBroadcast(intent)
                        result.success(null)
                    }
                    "updateSessions" -> {
                        try {
                            if (!notificationsAllowed()) {
                                // Avoid starting/continuing service updates when notifications are blocked
                                result.error("NOTIFICATION_PERMISSION_DENIED", "Notification permission not granted", null)
                                return@setMethodCallHandler
                            }
                            val serviceIntent = Intent(this@MainActivity, ForegroundService::class.java)
                            serviceIntent.action = ACTION_UPDATE_SESSIONS
                            serviceIntent.putExtra("payload", method.arguments as String)
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                startForegroundService(serviceIntent)
                            } else {
                                startService(serviceIntent)
                            }
                            result.success(null)
                        } catch (e: Exception) {
                            android.util.Log.e("MainActivity", "Failed to update sessions: ${e.message}")
                            result.error("SERVICE_ERROR", e.message, null)
                        }
                    }
                    else -> {
                        result.notImplemented()
                    }
                }
        }

        // Handle intent if launched via notification action
        handleActionIntent(intent)

        // Register broadcast receiver for stop all connections
        setupStopAllReceiver()
    }

    private fun reqPerm() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return
        
        try {
            // Check if we already have the permission to avoid unnecessary prompts
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
                != PackageManager.PERMISSION_GRANTED) {
                // Check if we should show rationale
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.POST_NOTIFICATIONS)) {
                    android.util.Log.i("MainActivity", "User previously denied notification permission")
                }
                
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(Manifest.permission.POST_NOTIFICATIONS),
                    123,
                )
            }
        } catch (e: Exception) {
            // Log error but don't crash
            android.util.Log.e("MainActivity", "Failed to request permissions: ${e.message}")
        }
    }

    private fun notificationsAllowed(): Boolean {
        return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
            true
        } else {
            ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
        }
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleActionIntent(intent)
    }

    private fun handleActionIntent(intent: Intent?) {
        if (intent == null) return
        when (intent.action) {
            ACTION_DISCONNECT_SESSION -> {
                val sessionId = intent.getStringExtra("session_id")
                if (sessionId != null && ::channel.isInitialized) {
                    try {
                        channel.invokeMethod("disconnectSession", mapOf("id" to sessionId))
                    } catch (e: Exception) {
                        android.util.Log.e("MainActivity", "Failed to invoke disconnect: ${e.message}")
                    }
                }
            }
        }
    }

    private fun setupStopAllReceiver() {
        stopAllReceiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                if (intent?.action == ACTION_STOP_ALL_CONNECTIONS && ::channel.isInitialized) {
                    try {
                        channel.invokeMethod("stopAllConnections", null)
                    } catch (e: Exception) {
                        android.util.Log.e("MainActivity", "Failed to invoke stopAllConnections: ${e.message}")
                    }
                }
            }
        }
        val filter = IntentFilter(ACTION_STOP_ALL_CONNECTIONS)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            ContextCompat.registerReceiver(this, stopAllReceiver, filter, ContextCompat.RECEIVER_NOT_EXPORTED)
        } else {
            registerReceiver(stopAllReceiver, filter)
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == 123) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                android.util.Log.i("MainActivity", "Notification permission granted")
            } else {
                android.util.Log.w("MainActivity", "Notification permission denied")
                // Optionally inform user about the limitation
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        stopAllReceiver?.let {
            try {
                unregisterReceiver(it)
            } catch (e: Exception) {
                android.util.Log.e("MainActivity", "Failed to unregister receiver: ${e.message}")
            }
            stopAllReceiver = null
        }
    }
}


================================================
FILE: android/app/src/main/kotlin/tech/lolli/toolbox/widget/HomeWidget.kt
================================================
package tech.lolli.toolbox.widget

import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.Context
import android.content.Intent
import android.os.Build
import android.util.Log
import android.view.View
import android.widget.RemoteViews
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.coroutines.withTimeoutOrNull
import org.json.JSONObject
import org.json.JSONException
import tech.lolli.toolbox.R
import java.net.URL
import java.net.HttpURLConnection
import java.net.SocketTimeoutException
import java.io.FileNotFoundException
import java.io.IOException
import java.util.concurrent.ConcurrentHashMap

class HomeWidget : AppWidgetProvider() {
    companion object {
        private const val TAG = "HomeWidget"
        private const val NETWORK_TIMEOUT = 10_000L // 10 seconds
        private const val COROUTINE_TIMEOUT = 15_000L // 15 seconds
        private val activeUpdates = ConcurrentHashMap<Int, Boolean>()
    }
    override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
        for (appWidgetId in appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId)
        }
    }

    private fun updateAppWidget(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int) {
        // Prevent concurrent updates for the same widget
        if (activeUpdates.putIfAbsent(appWidgetId, true) == true) {
            Log.d(TAG, "Widget $appWidgetId is already updating, skipping")
            return
        }

        val views = RemoteViews(context.packageName, R.layout.home_widget)
        val url = getWidgetUrl(context, appWidgetId)

        if (url.isNullOrEmpty()) {
            Log.w(TAG, "URL not found for widget $appWidgetId")
            showErrorState(views, appWidgetManager, appWidgetId, "Please configure the widget URL.")
            activeUpdates.remove(appWidgetId)
            return
        }

        setupClickIntent(context, views, appWidgetId)

        showLoadingState(views, appWidgetManager, appWidgetId)

        CoroutineScope(Dispatchers.IO).launch {
            withTimeoutOrNull(COROUTINE_TIMEOUT) {
                try {
                    val serverData = fetchServerData(url)
                    if (serverData != null) {
                        withContext(Dispatchers.Main) {
                            showSuccessState(views, appWidgetManager, appWidgetId, serverData)
                        }
                    } else {
                        withContext(Dispatchers.Main) {
                            showErrorState(views, appWidgetManager, appWidgetId, "Invalid server data received.")
                        }
                    }
                } catch (e: Exception) {
                    Log.e(TAG, "Error updating widget $appWidgetId: ${e.message}", e)
                    withContext(Dispatchers.Main) {
                        val errorMessage = when (e) {
                            is SocketTimeoutException -> "Connection timeout. Please check your network."
                            is IOException -> "Network error. Please check your connection."
                            is JSONException -> "Invalid data format received from server."
                            else -> "Failed to retrieve data: ${e.message}"
                        }
                        showErrorState(views, appWidgetManager, appWidgetId, errorMessage)
                    }
                }
            } ?: run {
                Log.w(TAG, "Widget update timed out for widget $appWidgetId")
                withContext(Dispatchers.Main) {
                    showErrorState(views, appWidgetManager, appWidgetId, "Update timed out. Please try again.")
                }
            }
            activeUpdates.remove(appWidgetId)
        }
    }

    private fun getWidgetUrl(context: Context, appWidgetId: Int): String? {
        val sp = context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE)
        return sp.getString("widget_$appWidgetId", null)
            ?: sp.getString("$appWidgetId", null)
            ?: sp.getString("widget_*", null)
    }

    private fun setupClickIntent(context: Context, views: RemoteViews, appWidgetId: Int) {
        val intentConfigure = Intent(context, WidgetConfigureActivity::class.java).apply {
            putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
        }

        val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        } else {
            PendingIntent.FLAG_UPDATE_CURRENT
        }

        val pendingConfigure = PendingIntent.getActivity(context, appWidgetId, intentConfigure, flag)
        views.setOnClickPendingIntent(R.id.widget_container, pendingConfigure)
    }

    private suspend fun fetchServerData(url: String): ServerData? = withContext(Dispatchers.IO) {
        var connection: HttpURLConnection? = null
        try {
            connection = (URL(url).openConnection() as HttpURLConnection).apply {
                requestMethod = "GET"
                connectTimeout = NETWORK_TIMEOUT.toInt()
                readTimeout = NETWORK_TIMEOUT.toInt()
                setRequestProperty("User-Agent", "ServerBox-Widget/1.0")
                setRequestProperty("Accept", "application/json")
            }

            if (connection.responseCode != HttpURLConnection.HTTP_OK) {
                throw IOException("HTTP ${connection.responseCode}: ${connection.responseMessage}")
            }

            val jsonStr = connection.inputStream.bufferedReader().use { it.readText() }
            parseServerData(jsonStr)
        } finally {
            connection?.disconnect()
        }
    }

    private fun parseServerData(jsonStr: String): ServerData? {
        return try {
            val jsonObject = JSONObject(jsonStr)
            val data = jsonObject.getJSONObject("data")
            
            val server = data.optString("name", "Unknown Server")
            val cpu = data.optString("cpu", "").takeIf { it.isNotBlank() } ?: "N/A"
            val mem = data.optString("mem", "").takeIf { it.isNotBlank() } ?: "N/A"
            val disk = data.optString("disk", "").takeIf { it.isNotBlank() } ?: "N/A"
            val net = data.optString("net", "").takeIf { it.isNotBlank() } ?: "N/A"
            
            // Return data even if some fields are missing, providing defaults
            // Only reject if we can't parse the JSON structure properly
            ServerData(server, cpu, mem, disk, net)
        } catch (e: JSONException) {
            Log.e(TAG, "JSON parsing error: ${e.message}", e)
            null
        }
    }

    private fun showLoadingState(views: RemoteViews, appWidgetManager: AppWidgetManager, appWidgetId: Int) {
        views.apply {
            setTextViewText(R.id.widget_name, "Loading...")
            setViewVisibility(R.id.error_message, View.GONE)
            setViewVisibility(R.id.widget_content, View.VISIBLE)
            setViewVisibility(R.id.widget_cpu_label, View.VISIBLE)
            setViewVisibility(R.id.widget_mem_label, View.VISIBLE)
            setViewVisibility(R.id.widget_disk_label, View.VISIBLE)
            setViewVisibility(R.id.widget_net_label, View.VISIBLE)
            setViewVisibility(R.id.widget_progress, View.VISIBLE)
            setFloat(R.id.widget_name, "setAlpha", 0.7f)
        }
        appWidgetManager.updateAppWidget(appWidgetId, views)
    }

    private fun showSuccessState(views: RemoteViews, appWidgetManager: AppWidgetManager, appWidgetId: Int, data: ServerData) {
        views.apply {
            setTextViewText(R.id.widget_name, data.name)
            setTextViewText(R.id.widget_cpu, data.cpu)
            setTextViewText(R.id.widget_mem, data.mem)
            setTextViewText(R.id.widget_disk, data.disk)
            setTextViewText(R.id.widget_net, data.net)
            
            val timeStr = android.text.format.DateFormat.format("HH:mm", java.util.Date()).toString()
            setTextViewText(R.id.widget_time, timeStr)
            
            setViewVisibility(R.id.error_message, View.GONE)
            setViewVisibility(R.id.widget_content, View.VISIBLE)
            setViewVisibility(R.id.widget_progress, View.GONE)
            
            // Smooth fade-in animation
            setFloat(R.id.widget_name, "setAlpha", 1f)
            setFloat(R.id.widget_cpu_label, "setAlpha", 1f)
            setFloat(R.id.widget_mem_label, "setAlpha", 1f)
            setFloat(R.id.widget_disk_label, "setAlpha", 1f)
            setFloat(R.id.widget_net_label, "setAlpha", 1f)
            setFloat(R.id.widget_time, "setAlpha", 1f)
        }
        appWidgetManager.updateAppWidget(appWidgetId, views)
    }

    private fun showErrorState(views: RemoteViews, appWidgetManager: AppWidgetManager, appWidgetId: Int, errorMessage: String) {
        views.apply {
            setTextViewText(R.id.widget_name, "Error")
            setViewVisibility(R.id.error_message, View.VISIBLE)
            setTextViewText(R.id.error_message, errorMessage)
            setViewVisibility(R.id.widget_content, View.GONE)
            setViewVisibility(R.id.widget_progress, View.GONE)
            setFloat(R.id.widget_name, "setAlpha", 1f)
            setFloat(R.id.error_message, "setAlpha", 1f)
        }
        appWidgetManager.updateAppWidget(appWidgetId, views)
    }

    data class ServerData(
        val name: String,
        val cpu: String,
        val mem: String,
        val disk: String,
        val net: String
    )
}

================================================
FILE: android/app/src/main/kotlin/tech/lolli/toolbox/widget/WidgetConfigureActivity.kt
================================================
package tech.lolli.toolbox.widget

import android.app.Activity
import android.appwidget.AppWidgetManager
import android.content.Intent
import android.os.Bundle
import android.util.Patterns
import android.widget.Button
import android.widget.EditText
import tech.lolli.toolbox.R

class WidgetConfigureActivity : Activity() {
    private var appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID
    private lateinit var urlEditText: EditText
    private lateinit var saveButton: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.widget_configure)

        // 设置结果为取消,以防用户在完成配置前退出
        setResult(RESULT_CANCELED)

        // 获取 widget ID
        val extras = intent.extras
        if (extras != null) {
            appWidgetId = extras.getInt(
                AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID
            )
        }

        // 如果没有有效的 widget ID,完成 activity
        if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
            finish()
            return
        }

        // 初始化 UI 元素
        urlEditText = findViewById(R.id.url_edit_text)
        saveButton = findViewById(R.id.save_button)

        // 从 SharedPreferences 加载现有配置
        val sp = getSharedPreferences("FlutterSharedPreferences", MODE_PRIVATE)
        val existingUrl = sp.getString("widget_$appWidgetId", "")
        urlEditText.setText(existingUrl)

        // 设置保存按钮点击事件
        saveButton.setOnClickListener {
            val url = urlEditText.text.toString().trim()
            if (url.isEmpty()) {
                urlEditText.error = "Please enter a URL"
                return@setOnClickListener
            }
            
            // 验证 URL 格式
            if (!Patterns.WEB_URL.matcher(url).matches()) {
                urlEditText.error = "Please enter a valid URL"
                return@setOnClickListener
            }

            // 保存 URL 到 SharedPreferences
            val editor = sp.edit()
            editor.putString("widget_$appWidgetId", url)
            editor.apply()

            // 更新 widget 使用 AppWidgetManager
            val appWidgetManager = AppWidgetManager.getInstance(this)
            val updateIntent = Intent(this, HomeWidget::class.java).apply {
                action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
                putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(appWidgetId))
            }
            sendBroadcast(updateIntent)

            // 设置结果并结束 activity
            val resultValue = Intent()
            resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
            setResult(RESULT_OK, resultValue)
            finish()
        }
    }
}

================================================
FILE: android/app/src/main/res/drawable/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background"/>
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/splash"/>
    </item>
</layer-list>


================================================
FILE: android/app/src/main/res/drawable/memory_24.xml
================================================
<vector android:height="24dp" android:tint="@color/widgetSummaryText"
    android:viewportHeight="24" android:viewportWidth="24"
    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="@android:color/white" android:pathData="M15,9L9,9v6h6L15,9zM13,13h-2v-2h2v2zM21,11L21,9h-2L19,7c0,-1.1 -0.9,-2 -2,-2h-2L15,3h-2v2h-2L11,3L9,3v2L7,5c-1.1,0 -2,0.9 -2,2v2L3,9v2h2v2L3,13v2h2v2c0,1.1 0.9,2 2,2h2v2h2v-2h2v2h2v-2h2c1.1,0 2,-0.9 2,-2v-2h2v-2h-2v-2h2zM17,17L7,17L7,7h10v10z"/>
</vector>


================================================
FILE: android/app/src/main/res/drawable/net_24.xml
================================================
<vector android:height="24dp" android:tint="@color/widgetSummaryText"
    android:viewportHeight="24" android:viewportWidth="24"
    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="@android:color/white" android:pathData="M7.77,6.76L6.23,5.48 0.82,12l5.41,6.52 1.54,-1.28L3.42,12l4.35,-5.24zM7,13h2v-2L7,11v2zM17,11h-2v2h2v-2zM11,13h2v-2h-2v2zM17.77,5.48l-1.54,1.28L20.58,12l-4.35,5.24 1.54,1.28L23.18,12l-5.41,-6.52z"/>
</vector>


================================================
FILE: android/app/src/main/res/drawable/settings_24.xml
================================================
<vector android:height="24dp" android:tint="@color/widgetSummaryText"
    android:viewportHeight="24" android:viewportWidth="24"
    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="@android:color/white" android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z"/>
</vector>


================================================
FILE: android/app/src/main/res/drawable/speed_24.xml
================================================
<vector android:height="24dp" android:tint="@color/widgetSummaryText"
    android:viewportHeight="24" android:viewportWidth="24"
    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="@android:color/white" android:pathData="M20.38,8.57l-1.23,1.85a8,8 0,0 1,-0.22 7.58L5.07,18A8,8 0,0 1,15.58 6.85l1.85,-1.23A10,10 0,0 0,3.35 19a2,2 0,0 0,1.72 1h13.85a2,2 0,0 0,1.74 -1,10 10,0 0,0 -0.27,-10.44zM10.59,15.41a2,2 0,0 0,2.83 0l5.66,-8.49 -8.49,5.66a2,2 0,0 0,0 2.83z"/>
</vector>


================================================
FILE: android/app/src/main/res/drawable/storage_24.xml
================================================
<vector android:height="24dp" android:tint="@color/widgetSummaryText"
    android:viewportHeight="24" android:viewportWidth="24"
    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="@android:color/white" android:pathData="M2,20h20v-4L2,16v4zM4,17h2v2L4,19v-2zM2,4v4h20L22,4L2,4zM6,7L4,7L4,5h2v2zM2,14h20v-4L2,10v4zM4,11h2v2L4,13v-2z"/>
</vector>


================================================
FILE: android/app/src/main/res/drawable/widget_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="16dp"/>
    <solid android:color="@color/widgetBackground" />
</shape>

================================================
FILE: android/app/src/main/res/drawable-night/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background"/>
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/splash"/>
    </item>
</layer-list>


================================================
FILE: android/app/src/main/res/drawable-night-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background"/>
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/splash"/>
    </item>
</layer-list>


================================================
FILE: android/app/src/main/res/drawable-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background"/>
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/splash"/>
    </item>
</layer-list>


================================================
FILE: android/app/src/main/res/layout/home_widget.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/widget_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/widget_background"
    android:padding="17dp"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/widget_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/widgetText"
        android:textSize="20sp"
        android:textStyle="bold"
        android:maxLines="1"
        android:ellipsize="end"
        android:alpha="0"
        android:animateLayoutChanges="true"
        android:fadingEdge="horizontal"
        android:singleLine="true"
        tools:text="Server Name" />

    <!-- Wrap the content in a LinearLayout for easy visibility management -->
    <LinearLayout
        android:id="@+id/widget_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_below="@id/widget_name"
        android:layout_marginTop="8dp">

        <RelativeLayout
            android:id="@+id/widget_container_inner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <LinearLayout
                android:id="@+id/widget_cpu_label"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="4dp"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:alpha="0"
                android:animateLayoutChanges="true">

                <ImageView
                    android:layout_width="16dp"
                    android:layout_height="16dp"
                    android:src="@drawable/speed_24"
                    android:layout_gravity="center_vertical"
                    android:contentDescription="CPU usage" />

                <TextView
                    android:id="@+id/widget_cpu"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:layout_marginStart="8dp"
                    android:singleLine="true"
                    android:ellipsize="end"
                    android:textColor="@color/widgetSummaryText"
                    android:textSize="12sp"
                    tools:text="CPU: 25.6%" />


            </LinearLayout>

            <LinearLayout
                android:id="@+id/widget_mem_label"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="4dp"
                android:layout_below="@id/widget_cpu_label"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:alpha="0"
                android:animateLayoutChanges="true">

                <ImageView
                    android:layout_width="16dp"
                    android:layout_height="16dp"
                    android:src="@drawable/memory_24"
                    android:layout_gravity="center_vertical"
                    android:contentDescription="Memory usage" />

                <TextView
                    android:id="@+id/widget_mem"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:layout_marginStart="8dp"
                    android:maxLines="1"
                    android:ellipsize="end"
                    android:textColor="@color/widgetSummaryText"
                    android:textSize="12sp"
                    tools:text="Memory: 4.2GB / 8GB" />

            </LinearLayout>

            <LinearLayout
                android:id="@+id/widget_disk_label"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="4dp"
                android:layout_below="@id/widget_mem_label"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:alpha="0"
                android:animateLayoutChanges="true">

                <ImageView
                    android:layout_width="16dp"
                    android:layout_height="16dp"
                    android:src="@drawable/storage_24"
                    android:layout_gravity="center_vertical"
                    android:contentDescription="Disk usage" />

                <TextView
                    android:id="@+id/widget_disk"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:layout_marginStart="8dp"
                    android:maxLines="1"
                    android:ellipsize="end"
                    android:textColor="@color/widgetSummaryText"
                    android:textSize="12sp"
                    tools:text="Disk: 125GB / 250GB" />

            </LinearLayout>

            <LinearLayout
                android:id="@+id/widget_net_label"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/widget_disk_label"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:alpha="0"
                android:animateLayoutChanges="true">

                <ImageView
                    android:layout_width="16dp"
                    android:layout_height="16dp"
                    android:src="@drawable/net_24"
                    android:layout_gravity="center_vertical"
                    android:contentDescription="Network usage" />

                <TextView
                    android:id="@+id/widget_net"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:layout_marginStart="8dp"
                    android:maxLines="1"
                    android:ellipsize="end"
                    android:textColor="@color/widgetSummaryText"
                    android:textSize="12sp"
                    tools:text="Network: 15MB/s ↓ 8MB/s ↑" />

            </LinearLayout>

        </RelativeLayout>

    </LinearLayout>

    <!-- Error message display -->
    <TextView
        android:id="@+id/error_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/widget_name"
        android:layout_marginTop="8dp"
        android:textColor="@color/widgetSummaryText"
        android:textSize="11sp"
        android:visibility="gone"
        android:alpha="0"
        android:animateLayoutChanges="true"
        android:lineSpacingMultiplier="1.2"
        android:maxLines="3"
        android:ellipsize="end"
        tools:text="Error message text that might be longer than usual" />

    <TextView
        android:id="@+id/widget_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:maxLines="1"
        android:textColor="@color/widgetSummaryText"
        android:textSize="10sp"
        android:alpha="0"
        android:animateLayoutChanges="true"
        android:fontFamily="monospace"
        tools:text="12:34" />

    <!-- Progress indicator for loading state -->
    <ProgressBar
        android:id="@+id/widget_progress"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_centerInParent="true"
        android:visibility="gone"
        android:indeterminate="true" />

</RelativeLayout>

================================================
FILE: android/app/src/main/res/layout/widget_configure.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Widget URL"
        android:textSize="18sp"
        android:textStyle="bold"
        android:layout_marginBottom="16dp"
        android:textColor="@android:color/black" />

    <EditText
        android:id="@+id/url_edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="https://server/status"
        android:inputType="textUri"
        android:layout_marginBottom="16dp"
        android:background="@android:drawable/edit_text"
        android:padding="12dp"
        android:textColor="@android:color/black"
        android:textColorHint="@android:color/darker_gray" />

    <Button
        android:id="@+id/save_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Save"
        android:background="#8b2252"
        android:textColor="@android:color/white"
        android:padding="12dp" />

</LinearLayout>

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

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

================================================
FILE: android/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8" ?>
<resources>
    <color name="colorLaunch">#EEEEEE</color>
    <color name="widgetBackground">#FFFFFF</color>
    <color name="widgetText">#000000</color>
    <color name="widgetSummaryText">#333333</color>
</resources>

================================================
FILE: android/app/src/main/res/values/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="ic_launcher_background">#FFFFFF</color>
</resources>

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

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


================================================
FILE: android/app/src/main/res/values-night/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="widgetBackground">#000000</color>
    <color name="widgetText">#FFFFFF</color>
    <color name="widgetSummaryText">#BBBBBB</color>
</resources>

================================================
FILE: android/app/src/main/res/values-night/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="ic_launcher_background">#372D2D</color>
</resources>

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


================================================
FILE: android/app/src/main/res/xml/backup_rules.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <exclude domain="sharedpref" path="FlutterSecureStorage"/>
</full-backup-content>

================================================
FILE: android/app/src/main/res/xml/home_widget.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="110dp"
    android:maxHeight="110dp"
    android:maxWidth="110dp"
    android:minHeight="110dp"
    android:updatePeriodMillis="1800001"
    android:initialLayout="@layout/home_widget"
    android:configure="tech.lolli.toolbox.widget.WidgetConfigureActivity"
    android:resizeMode="none"
    android:widgetCategory="home_screen">
</appwidget-provider>

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

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}

subprojects { subproject ->
  // Only works on com.android.application(the main app module)
  if (subproject.plugins.hasPlugin('com.android.application')) {
    subproject.afterEvaluate {
      android.buildTypes.matching { it.name == 'profile' }.all { buildType ->
        buildType.applicationIdSuffix = ".profile"
        buildTypes.profile.resValue 'string', 'app_name', 'SrvBxP'
      }
      android.buildTypes.matching { it.name == 'debug' }.all { buildType ->
        buildType.applicationIdSuffix = ".debug"
        buildTypes.debug.resValue 'string', 'app_name', 'SrvBxD'
      }
    }
  }
}

subprojects {
    project.evaluationDependsOn(':app')
}

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


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


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


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

    includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")

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

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

include ":app"


================================================
FILE: coverage/lcov.info
================================================
SF:lib/data/model/app/shell_func.dart
DA:32,3
DA:38,1
DA:39,1
DA:42,1
DA:43,2
DA:44,2
DA:47,0
DA:48,0
DA:49,0
DA:50,0
DA:51,0
DA:52,0
DA:55,1
DA:56,1
DA:57,1
DA:58,1
DA:59,1
DA:62,1
DA:63,1
DA:64,1
DA:65,1
DA:67,2
DA:69,1
DA:72,1
DA:73,1
DA:74,1
DA:75,1
DA:76,1
DA:77,1
DA:81,1
DA:82,1
DA:83,1
DA:84,1
DA:86,1
DA:92,1
DA:93,1
DA:94,1
DA:96,1
DA:159,0
DA:160,0
DA:161,0
DA:162,0
DA:163,0
DA:164,0
DA:165,0
DA:166,0
DA:239,1
DA:240,2
LF:48
LH:34
end_of_record
SF:lib/data/model/server/server_status_update_req.dart
DA:26,1
DA:34,1
DA:35,1
DA:36,1
DA:37,1
DA:38,2
DA:44,0
DA:45,0
DA:47,0
DA:48,0
DA:51,0
DA:52,0
DA:54,0
DA:58,0
DA:60,0
DA:63,0
DA:67,0
DA:69,0
DA:72,0
DA:76,0
DA:77,0
DA:78,0
DA:79,0
DA:80,0
DA:82,0
DA:86,0
DA:87,0
DA:88,0
DA:91,0
DA:95,0
DA:97,0
DA:100,0
DA:104,0
DA:105,0
DA:107,0
DA:111,0
DA:113,0
DA:117,0
DA:119,0
DA:122,0
DA:126,0
DA:128,0
DA:132,0
DA:133,0
DA:135,0
DA:139,0
DA:140,0
DA:142,0
DA:146,0
DA:148,0
DA:152,0
DA:154,0
DA:158,0
DA:161,0
DA:162,0
DA:163,0
DA:164,0
DA:167,0
DA:171,0
DA:172,0
DA:173,0
DA:174,0
DA:177,0
DA:181,0
DA:182,0
DA:183,0
DA:184,0
DA:187,0
DA:190,0
DA:194,0
DA:195,0
DA:198,0
DA:199,0
DA:200,0
DA:202,0
DA:206,0
DA:208,0
DA:212,0
DA:214,0
DA:218,0
DA:220,0
DA:224,0
DA:226,0
DA:229,0
DA:233,0
DA:235,0
DA:237,0
DA:245,0
DA:246,0
DA:247,0
DA:248,0
DA:249,0
DA:251,0
DA:254,0
DA:257,0
DA:258,0
DA:259,0
DA:261,0
DA:262,0
DA:263,0
DA:264,0
DA:271,0
DA:272,0
DA:273,0
DA:278,0
DA:288,0
DA:289,0
DA:290,0
DA:291,0
DA:296,1
DA:297,1
DA:298,1
DA:303,1
DA:304,1
DA:305,2
DA:306,3
DA:309,1
DA:310,1
DA:311,1
DA:312,1
DA:313,1
DA:314,1
DA:315,1
DA:316,1
DA:317,1
DA:318,1
DA:319,1
DA:320,1
DA:321,5
DA:323,1
DA:327,1
DA:329,1
DA:330,1
DA:331,1
DA:332,1
DA:333,1
DA:334,0
DA:335,0
DA:336,0
DA:337,0
DA:341,0
DA:346,1
DA:348,1
DA:349,1
DA:350,3
DA:353,0
DA:358,1
DA:360,2
DA:362,3
DA:365,3
DA:370,1
DA:373,1
DA:374,1
DA:375,1
DA:376,1
DA:377,1
DA:378,2
DA:379,1
DA:380,3
DA:385,1
DA:386,2
DA:387,4
DA:388,5
DA:391,3
DA:396,1
DA:398,1
DA:399,1
DA:400,1
DA:401,1
DA:402,1
DA:403,1
DA:405,2
DA:409,3
DA:414,1
DA:416,1
DA:417,2
DA:418,1
DA:419,2
DA:420,3
DA:423,3
DA:428,1
DA:430,2
DA:432,3
DA:435,3
DA:440,1
DA:442,1
DA:443,2
DA:444,1
DA:445,3
DA:448,3
DA:453,1
DA:455,1
DA:456,2
DA:458,3
DA:461,3
DA:466,1
DA:468,1
DA:469,2
DA:470,1
DA:471,3
DA:472,1
DA:473,3
DA:477,3
DA:482,1
DA:484,1
DA:485,2
DA:486,3
DA:489,3
DA:494,1
DA:496,3
DA:498,3
DA:502,4
DA:504,3
DA:509,1
DA:511,1
DA:512,1
DA:514,2
DA:516,2
DA:518,1
DA:519,1
DA:524,1
DA:525,0
DA:526,0
DA:528,1
DA:529,1
DA:541,1
DA:545,0
DA:547,0
DA:548,0
DA:551,0
DA:552,0
DA:553,0
DA:555,0
DA:556,0
DA:558,0
DA:559,0
DA:560,0
DA:562,0
DA:563,0
DA:564,0
DA:565,0
DA:567,0
DA:568,0
DA:569,0
DA:570,0
DA:576,0
DA:577,0
DA:578,0
DA:580,0
DA:581,0
DA:583,0
DA:584,0
DA:594,0
DA:598,0
DA:601,0
DA:602,0
DA:605,1
DA:607,1
DA:608,0
DA:611,0
DA:612,0
DA:614,0
DA:615,0
DA:617,0
DA:618,0
DA:619,0
DA:621,0
DA:622,0
DA:623,0
DA:624,0
DA:626,0
DA:627,0
DA:628,0
DA:629,0
DA:636,0
DA:637,0
DA:638,0
DA:639,0
DA:640,0
DA:642,0
DA:643,0
DA:656,1
DA:660,0
DA:663,0
DA:664,0
DA:667,1
DA:670,1
DA:671,1
DA:672,1
DA:676,1
DA:677,0
DA:680,0
DA:681,0
DA:683,0
DA:684,0
DA:685,0
DA:686,0
DA:690,0
DA:693,0
DA:697,0
DA:698,0
LF:301
LH:123
end_of_record
SF:lib/data/model/server/system.dart
DA:22,0
DA:24,0
DA:25,0
DA:26,0
DA:28,0
DA:29,0
DA:32,0
DA:33,0
DA:38,0
DA:39,0
DA:43,0
DA:44,0
DA:50,0
DA:56,3
DA:58,1
DA:60,1
DA:61,0
DA:62,1
DA:63,0
DA:64,1
DA:65,1
LF:21
LH:6
end_of_record
SF:lib/data/res/status.dart
DA:11,1
DA:12,1
DA:13,1
DA:14,5
DA:15,1
DA:16,3
DA:17,1
DA:18,5
DA:19,2
DA:20,1
DA:22,1
DA:23,1
DA:27,1
DA:28,1
DA:29,1
DA:33,1
DA:36,1
DA:37,3
LF:18
LH:18
end_of_record
SF:lib/data/model/server/disk.dart
DA:30,3
DA:44,2
DA:45,2
DA:46,2
DA:48,2
DA:50,2
DA:51,2
DA:53,4
DA:55,2
DA:59,1
DA:62,0
DA:68,2
DA:69,2
DA:71,2
DA:76,3
DA:77,4
DA:78,4
DA:79,4
DA:82,3
DA:83,1
DA:85,1
DA:92,1
DA:93,2
DA:94,2
DA:95,2
DA:97,1
DA:101,1
DA:105,2
DA:106,3
DA:108,2
DA:109,3
DA:111,2
DA:112,3
DA:115,2
DA:116,1
DA:117,1
DA:119,2
DA:120,2
DA:121,2
DA:123,1
DA:138,2
DA:139,4
DA:140,4
DA:143,4
DA:145,2
DA:148,4
DA:149,4
DA:150,2
DA:152,2
DA:157,6
DA:158,4
DA:159,6
DA:161,4
DA:162,6
DA:164,4
DA:165,6
DA:168,4
DA:169,2
DA:170,2
DA:172,4
DA:173,4
DA:174,4
DA:176,2
DA:189,1
DA:192,0
DA:193,0
DA:201,1
DA:202,1
DA:203,1
DA:204,2
DA:206,2
DA:207,1
DA:210,2
DA:211,2
DA:212,0
DA:215,1
DA:216,0
DA:220,1
DA:221,1
DA:222,1
DA:223,1
DA:224,1
DA:227,3
DA:228,4
DA:229,4
DA:230,4
DA:240,0
DA:241,0
DA:242,0
DA:243,0
DA:244,0
DA:245,0
DA:246,0
DA:247,0
DA:248,0
DA:249,0
DA:250,0
DA:251,0
DA:252,0
DA:257,1
DA:259,1
DA:261,2
DA:264,0
DA:267,0
DA:268,0
DA:272,0
DA:273,0
DA:276,0
DA:277,0
DA:278,0
DA:279,0
DA:280,0
DA:284,0
DA:285,0
DA:287,0
DA:288,0
DA:293,1
DA:294,2
DA:296,0
DA:299,0
DA:300,0
DA:301,0
DA:302,0
DA:303,0
DA:304,0
DA:307,0
DA:308,0
DA:309,0
DA:312,0
DA:313,0
DA:317,0
DA:318,0
DA:319,0
DA:320,0
DA:321,0
DA:322,0
DA:323,0
DA:324,0
DA:325,0
DA:327,0
DA:328,0
DA:329,0
DA:330,0
DA:332,0
DA:333,0
DA:351,0
DA:353,0
DA:354,0
DA:361,3
DA:363,1
DA:365,3
DA:366,4
DA:370,3
DA:372,3
DA:373,3
DA:374,6
DA:375,9
DA:378,9
DA:379,3
DA:380,3
DA:381,6
DA:382,6
DA:384,3
DA:388,3
DA:393,3
DA:395,3
DA:396,3
DA:404,6
LF:168
LH:106
end_of_record
SF:lib/data/model/server/time_seq.dart
DA:8,2
DA:10,1
DA:12,2
DA:13,4
DA:14,0
DA:16,2
DA:19,1
DA:20,2
DA:22,2
DA:24,0
DA:26,0
DA:29,0
DA:31,0
DA:34,0
DA:36,0
DA:43,3
DA:45,1
DA:46,4
DA:49,1
DA:50,4
DA:55,1
DA:56,1
DA:58,5
DA:59,0
DA:60,0
DA:63,1
LF:26
LH:17
end_of_record
SF:lib/data/res/misc.dart
DA:4,3
DA:5,3
DA:8,0
LF:3
LH:2
end_of_record
SF:lib/data/model/container/image.dart
DA:13,0
DA:27,0
DA:29,0
DA:30,0
DA:32,0
DA:33,0
DA:35,0
DA:37,0
DA:39,0
DA:40,0
DA:41,0
DA:42,0
DA:43,0
DA:44,0
DA:45,0
DA:48,0
DA:49,0
DA:50,0
DA:51,0
DA:52,0
DA:53,0
DA:54,0
DA:69,0
DA:78,0
DA:79,0
DA:81,0
DA:82,0
DA:84,0
DA:86,0
DA:88,0
DA:89,0
DA:90,0
DA:91,0
DA:93,0
DA:94,0
DA:95,0
DA:96,0
DA:98,0
DA:99,0
DA:100,0
DA:101,0
DA:103,0
DA:105,0
DA:106,0
DA:109,0
DA:113,0
DA:114,0
DA:115,0
DA:116,0
DA:117,0
DA:118,0
DA:119,0
LF:52
LH:0
end_of_record
SF:lib/data/model/container/type.dart
DA:8,0
DA:9,0
DA:10,0
DA:13,0
DA:14,0
DA:15,0
LF:6
LH:0
end_of_record
SF:lib/data/model/container/ps.dart
DA:20,0
DA:45,0
DA:47,0
DA:48,0
DA:50,0
DA:51,0
DA:53,0
DA:54,0
DA:56,0
DA:58,0
DA:59,0
DA:60,0
DA:61,0
DA:62,0
DA:63,0
DA:64,0
DA:65,0
DA:66,0
DA:67,0
DA:68,0
DA:69,0
DA:70,0
DA:73,0
DA:75,0
DA:77,0
DA:78,0
DA:79,0
DA:80,0
DA:81,0
DA:82,0
DA:83,0
DA:84,0
DA:87,0
DA:88,0
DA:89,0
DA:90,0
DA:91,0
DA:92,0
DA:93,0
DA:94,0
DA:115,1
DA:117,0
DA:118,0
DA:120,0
DA:123,1
DA:125,3
DA:129,0
DA:131,0
DA:132,0
DA:133,0
DA:134,0
DA:135,0
DA:140,1
DA:141,2
DA:142,6
LF:55
LH:6
end_of_record
SF:lib/core/extension/context/locale.dart
DA:5,0
DA:8,0
LF:2
LH:0
end_of_record
SF:lib/core/extension/ssh_client.dart
DA:18,0
DA:27,0
DA:33,0
DA:34,0
DA:35,0
DA:37,0
DA:38,0
DA:39,0
DA:40,0
DA:42,0
DA:43,0
DA:46,0
DA:47,0
DA:48,0
DA:49,0
DA:51,0
DA:52,0
DA:55,0
DA:57,0
DA:58,0
DA:60,0
DA:63,0
DA:74,0
DA:77,0
DA:84,0
DA:85,0
DA:86,0
DA:88,0
DA:89,0
DA:90,0
DA:91,0
DA:93,0
DA:94,0
DA:97,0
DA:98,0
DA:99,0
DA:100,0
DA:102,0
DA:103,0
DA:106,0
DA:108,0
DA:109,0
DA:111,0
DA:114,0
DA:123,0
DA:124,0
DA:125,0
DA:126,0
DA:128,0
DA:129,0
DA:132,0
DA:134,0
DA:136,0
DA:137,0
DA:138,0
DA:140,0
DA:148,0
DA:151,0
DA:159,0
DA:160,0
DA:161,0
DA:162,0
LF:62
LH:0
end_of_record
SF:lib/core/sync.dart
DA:9,0
DA:12,6
DA:14,0
DA:15,0
DA:17,0
DA:19,0
DA:20,0
DA:23,0
DA:25,0
DA:26,0
DA:28,0
DA:29,0
LF:12
LH:1
end_of_record
SF:lib/data/model/app/bak/backup2.dart
DA:13,0
DA:17,0
DA:41,0
DA:43,0
DA:45,0
DA:48,0
DA:49,0
DA:50,0
DA:51,0
DA:52,0
DA:53,0
DA:56,0
DA:57,0
DA:59,0
DA:64,0
DA:65,0
DA:67,0
DA:68,0
DA:69,0
DA:70,0
DA:71,0
DA:72,0
DA:73,0
DA:77,0
DA:78,0
DA:79,0
DA:81,0
DA:82,0
DA:85,0
DA:86,0
DA:90,0
DA:91,0
DA:92,0
DA:93,0
DA:95,0
DA:98,0
DA:99,0
LF:37
LH:0
end_of_record
SF:lib/data/model/app/bak/backup2.g.dart
DA:9,0
DA:10,0
DA:11,0
DA:12,0
DA:13,0
DA:14,0
DA:15,0
DA:16,0
DA:17,0
DA:20,0
DA:21,0
DA:22,0
DA:23,0
DA:24,0
DA:25,0
DA:26,0
DA:27,0
DA:28,0
LF:18
LH:0
end_of_record
SF:lib/data/model/app/bak/utils.dart
DA:6,0
DA:8,0
DA:9,0
DA:11,0
DA:12,0
LF:5
LH:0
end_of_record
SF:lib/core/utils/server.dart
DA:15,0
DA:16,0
DA:20,0
DA:22,0
DA:23,0
DA:24,0
DA:29,0
DA:30,0
DA:32,0
DA:34,0
DA:37,0
DA:56,0
DA:60,0
DA:62,0
DA:66,0
DA:67,0
DA:69,0
DA:71,0
DA:76,0
DA:78,0
DA:79,0
DA:81,0
DA:83,0
DA:85,0
DA:89,0
DA:91,0
DA:93,0
DA:94,0
DA:96,0
DA:97,0
DA:103,0
DA:105,0
DA:106,0
DA:108,0
DA:110,0
LF:35
LH:0
end_of_record
SF:lib/data/model/app/error.dart
DA:7,0
DA:9,0
DA:10,0
DA:11,0
DA:12,0
DA:13,0
DA:14,0
DA:32,0
DA:34,0
DA:41,0
DA:43,0
DA:50,0
DA:52,0
DA:59,0
DA:61,0
LF:15
LH:0
end_of_record
SF:lib/data/model/server/server_private_info.dart
DA:24,0
DA:53,0
DA:55,0
DA:56,0
DA:58,0
DA:59,0
DA:67,0
DA:70,0
DA:77,0
DA:78,0
DA:79,0
DA:80,0
DA:81,0
DA:82,0
DA:85,0
DA:87,0
DA:88,0
DA:90,0
DA:91,0
DA:92,0
DA:93,0
DA:94,0
DA:95,0
DA:96,0
DA:97,0
DA:98,0
DA:101,0
DA:102,0
DA:103,0
DA:105,0
DA:106,0
DA:107,0
DA:109,0
DA:110,0
DA:111,0
DA:112,0
DA:114,0
DA:115,0
DA:116,0
DA:117,0
DA:125,0
DA:132,0
DA:136,0
DA:139,0
DA:146,0
LF:45
LH:0
end_of_record
SF:lib/data/model/server/server_private_info.g.dart
DA:9,0
DA:10,0
DA:11,0
DA:12,0
DA:13,0
DA:14,0
DA:15,0
DA:16,0
DA:17,0
DA:18,0
DA:19,0
DA:20,0
DA:22,0
DA:23,0
DA:25,0
DA:26,0
DA:27,0
DA:29,0
DA:30,0
DA:32,0
DA:36,0
DA:37,0
DA:38,0
DA:39,0
DA:40,0
DA:41,0
DA:42,0
DA:43,0
DA:44,0
DA:45,0
DA:46,0
DA:47,0
DA:48,0
DA:49,0
DA:50,0
DA:51,0
DA:52,0
LF:37
LH:0
end_of_record
SF:lib/data/res/store.dart
DA:10,0
DA:11,0
DA:12,0
DA:13,0
DA:14,0
DA:15,0
DA:18,0
DA:19,0
DA:20,0
DA:21,0
DA:22,0
DA:23,0
DA:24,0
DA:27,0
DA:28,0
DA:31,0
DA:33,0
DA:34,0
DA:39,0
DA:40,0
DA:41,0
DA:45,0
LF:22
LH:0
end_of_record
SF:lib/core/utils/ssh_auth.dart
DA:9,0
DA:14,0
DA:15,0
DA:16,0
DA:17,0
DA:19,0
LF:6
LH:0
end_of_record
SF:lib/data/provider/app.dart
DA:17,0
DA:22,0
DA:23,0
LF:3
LH:0
end_of_record
SF:lib/data/provider/app.g.dart
DA:9,0
DA:13,0
LF:2
LH:0
end_of_record
SF:lib/data/helper/system_detector.dart
DA:16,0
DA:21,0
DA:23,0
DA:29,0
DA:30,0
DA:31,0
DA:33,0
DA:38,0
DA:39,0
DA:41,0
DA:43,0
DA:45,0
DA:49,0
DA:54,0
LF:14
LH:0
end_of_record
SF:lib/data/model/app/bak/backup.dart
DA:17,0
DA:32,0
DA:44,0
DA:46,0
DA:48,0
DA:49,0
DA:50,0
DA:52,0
DA:53,0
DA:54,0
DA:55,0
DA:56,0
DA:58,0
DA:59,0
DA:63,0
DA:64,0
DA:65,0
DA:66,0
DA:67,0
DA:71,0
DA:73,0
DA:74,0
DA:75,0
DA:77,0
DA:83,0
DA:84,0
DA:87,0
DA:88,0
DA:89,0
DA:90,0
DA:91,0
DA:92,0
DA:93,0
DA:95,0
DA:96,0
DA:98,0
DA:99,0
DA:105,0
DA:106,0
DA:109,0
DA:110,0
DA:111,0
DA:112,0
DA:113,0
DA:114,0
DA:115,0
DA:117,0
DA:118,0
DA:120,0
DA:121,0
DA:127,0
DA:128,0
DA:131,0
DA:132,0
DA:133,0
DA:134,0
DA:135,0
DA:136,0
DA:137,0
DA:139,0
DA:140,0
DA:142,0
DA:143,0
DA:149,0
DA:151,0
DA:152,0
DA:153,0
DA:154,0
DA:155,0
DA:156,0
DA:157,0
DA:159,0
DA:160,0
DA:162,0
DA:163,0
DA:169,0
DA:171,0
DA:172,0
DA:173,0
DA:174,0
DA:175,0
DA:176,0
DA:177,0
DA:179,0
DA:180,0
DA:182,0
DA:183,0
DA:188,0
DA:191,0
DA:193,0
DA:194,0
DA:195,0
DA:196,0
DA:197,0
DA:198,0
DA:199,0
DA:201,0
DA:202,0
DA:204,0
DA:205,0
DA:210,0
DA:211,0
DA:213,0
DA:216,0
DA:219,0
DA:221,0
DA:223,0
DA:224,0
DA:225,0
DA:226,0
DA:228,0
DA:230,0
LF:112
LH:0
end_of_record
SF:lib/data/model/app/bak/backup.g.dart
DA:9,0
DA:10,0
DA:11,0
DA:12,0
DA:13,0
DA:14,0
DA:15,0
DA:16,0
DA:17,0
DA:18,0
DA:19,0
DA:20,0
DA:21,0
DA:22,0
DA:23,0
DA:24,0
DA:27,0
DA:28,0
DA:29,0
DA:30,0
DA:31,0
DA:32,0
DA:33,0
DA:34,0
DA:35,0
DA:36,0
LF:26
LH:0
end_of_record
SF:lib/data/model/server/private_key_info.dart
DA:11,0
DA:13,0
DA:15,0
DA:17,0
DA:18,0
DA:19,0
DA:22,0
DA:23,0
DA:24,0
DA:27,0
LF:10
LH:0
end_of_record
SF:lib/data/model/server/private_key_info.g.dart
DA:9,0
DA:10,0
DA:11,0
DA:12,0
DA:15,0
DA:16,0
LF:6
LH:0
end_of_record
SF:lib/data/model/server/snippet.dart
DA:23,0
DA:35,0
DA:37,0
DA:38,0
DA:39,0
DA:40,0
DA:41,0
DA:47,0
DA:48,0
DA:49,0
DA:52,0
DA:53,0
DA:54,0
DA:59,0
DA:60,0
DA:61,0
DA:66,0
DA:67,0
DA:68,0
DA:69,0
DA:70,0
DA:75,0
DA:76,0
DA:80,0
DA:81,0
DA:82,0
DA:83,0
DA:86,0
DA:88,0
DA:89,0
DA:92,0
DA:94,0
DA:97,0
DA:102,0
DA:103,0
DA:108,0
DA:109,0
DA:112,0
DA:115,0
DA:121,0
DA:122,0
DA:123,0
DA:127,0
DA:130,0
DA:131,0
DA:132,0
DA:134,0
DA:137,0
DA:140,0
DA:141,0
DA:144,0
DA:145,0
DA:146,0
DA:147,0
DA:148,0
DA:149,0
DA:150,0
DA:154,0
DA:162,0
DA:168,0
DA:176,0
DA:177,0
DA:179,0
DA:180,0
DA:183,0
DA:184,0
DA:185,0
DA:186,0
LF:68
LH:0
end_of_record
SF:lib/data/model/server/snippet.g.dart
DA:9,0
DA:10,0
DA:11,0
DA:12,0
DA:13,0
DA:14,0
DA:15,0
DA:16,0
DA:19,0
DA:20,0
DA:21,0
DA:22,0
DA:23,0
DA:24,0
LF:14
LH:0
end_of_record
SF:lib/data/model/app/menu/server_func.dart
DA:21,0
DA:22,0
DA:23,0
DA:24,0
DA:25,0
DA:26,0
DA:27,0
DA:32,0
DA:40,0
DA:42,0
DA:43,0
DA:44,0
DA:46,0
DA:47,0
DA:48,0
DA:49,0
DA:50,0
DA:53,0
DA:54,0
DA:55,0
DA:57,0
DA:58,0
DA:59,0
DA:60,0
DA:61,0
LF:25
LH:0
end_of_record
SF:lib/data/model/app/net_view.dart
DA:10,0
DA:11,0
DA:12,0
DA:13,0
DA:16,0
DA:17,0
DA:18,0
DA:19,0
DA:24,0
DA:25,0
DA:28,0
DA:29,0
DA:30,0
DA:32,0
DA:34,0
DA:35,0
DA:37,0
DA:39,0
DA:42,0
DA:47,0
DA:48,0
DA:49,0
DA:50,0
DA:53,0
DA:54,0
DA:55,0
LF:26
LH:0
end_of_record
SF:lib/data/model/server/server.dart
DA:24,0
DA:26,0
DA:28,0
DA:30,0
DA:53,1
DA:84,0
LF:6
LH:1
end_of_record
SF:lib/data/model/app/script_builders.dart
DA:6,6
DA:29,6
DA:31,1
DA:34,1
DA:36,1
DA:41,1
DA:43,2
DA:46,1
DA:51,2
DA:52,6
DA:57,1
DA:59,1
DA:60,1
DA:69,2
DA:70,1
DA:72,1
DA:73,1
DA:74,7
DA:77,1
DA:81,1
DA:84,2
DA:85,1
DA:86,2
DA:87,1
DA:89,1
DA:93,1
DA:96,1
DA:97,5
DA:98,1
DA:99,1
DA:100,1
DA:101,1
DA:108,6
DA:110,0
DA:113,0
DA:119,0
DA:122,0
DA:124,0
DA:127,0
DA:132,0
DA:133,0
DA:138,0
DA:140,0
DA:141,0
DA:161,0
DA:162,0
DA:163,0
DA:164,0
DA:165,0
DA:169,0
DA:173,0
DA:174,0
DA:175,0
DA:176,0
DA:177,0
DA:179,0
DA:181,0
DA:186,0
DA:189,0
DA:191,0
DA:194,0
DA:196,0
DA:197,0
DA:198,0
DA:210,0
DA:217,0
DA:224,0
DA:237,0
DA:239,1
LF:69
LH:34
end_of_record
SF:lib/data/model/app/server_detail_card.dart
DA:28,0
DA:29,0
DA:31,0
DA:33,0
DA:34,0
DA:35,0
DA:36,0
DA:37,0
DA:38,0
DA:39,0
DA:40,0
DA:41,0
DA:42,0
DA:43,0
DA:44,0
DA:45,0
DA:46,0
DA:52,0
DA:53,0
DA:54,0
DA:55,0
DA:56,0
DA:57,0
DA:58,0
DA:62,0
DA:63,0
DA:64,0
DA:65,0
DA:66,0
DA:67,0
LF:30
LH:0
end_of_record
SF:lib/data/provider/server.dart
DA:24,6
DA:27,3
DA:28,0
DA:29,0
DA:30,0
DA:34,0
DA:36,0
DA:38,0
DA:40,0
DA:43,0
DA:44,0
DA:45,0
DA:47,0
DA:48,0
DA:49,0
DA:50,0
DA:54,0
DA:55,0
DA:56,0
DA:58,0
DA:59,0
DA:62,0
DA:63,0
DA:64,0
DA:65,0
DA:67,0
DA:70,0
DA:71,0
DA:73,0
DA:75,0
DA:81,1
DA:83,0
DA:86,2
DA:91,0
DA:93,0
DA:94,0
DA:96,0
DA:97,0
DA:100,0
DA:103,0
DA:104,0
DA:109,0
DA:111,0
DA:112,0
DA:116,0
DA:117,0
DA:118,0
DA:120,0
DA:121,0
DA:124,0
DA:126,0
DA:131,0
DA:143,0
DA:144,0
DA:149,0
DA:155,0
DA:156,0
DA:159,0
DA:160,0
DA:161,0
DA:162,0
DA:163,0
DA:165,0
DA:167,0
DA:168,0
DA:172,0
DA:174,0
DA:179,0
DA:181,0
DA:182,0
DA:183,0
DA:184,0
DA:189,0
DA:191,0
DA:192,0
DA:196,0
DA:199,0
DA:200,0
DA:202,0
DA:205,0
DA:206,0
DA:207,0
DA:208,0
DA:209,0
DA:210,0
DA:213,0
DA:214,0
DA:215,0
DA:216,0
DA:217,0
DA:218,0
DA:219,0
DA:220,0
DA:221,0
DA:224,0
DA:225,0
DA:226,0
DA:227,0
DA:228,0
DA:229,0
DA:230,0
DA:231,0
DA:234,0
DA:235,0
DA:236,0
DA:237,0
DA:238,0
DA:239,0
DA:240,0
DA:241,0
DA:244,0
DA:245,0
DA:246,0
DA:247,0
DA:249,0
DA:250,0
DA:251,0
DA:252,0
DA:253,0
DA:254,0
DA:258,0
DA:260,0
DA:261,0
DA:264,0
DA:265,0
DA:268,0
DA:269,0
DA:270,0
DA:273,0
DA:274,0
DA:275,0
DA:279,0
DA:280,0
DA:281,0
DA:282,0
DA:287,0
DA:289,0
DA:290,0
DA:292,0
DA:295,0
DA:303,0
DA:309,0
DA:310,0
DA:312,0
DA:313,0
DA:315,0
DA:316,0
DA:317,0
DA:318,0
DA:320,0
DA:323,0
DA:324,0
DA:325,0
DA:328,0
DA:332,0
DA:336,0
DA:337,0
DA:339,0
DA:340,0
DA:341,0
DA:342,0
DA:343,0
DA:344,0
DA:345,0
DA:348,0
DA:349,0
DA:350,0
DA:351,0
DA:352,0
DA:353,0
DA:355,0
DA:356,0
DA:357,0
DA:358,0
DA:359,0
DA:360,0
DA:365,0
DA:366,0
DA:367,0
DA:368,0
DA:372,0
DA:377,0
DA:378,0
DA:385,0
DA:386,0
DA:387,0
DA:388,0
DA:389,0
DA:391,0
DA:395,0
DA:396,0
DA:397,0
DA:401,0
DA:402,0
DA:403,0
DA:404,0
DA:408,0
DA:409,0
DA:410,0
DA:411,0
DA:412,0
DA:413,0
DA:414,0
DA:417,0
DA:418,0
DA:419,0
DA:421,0
DA:423,0
DA:426,0
DA:429,0
DA:430,0
DA:433,0
DA:435,0
DA:437,0
DA:438,0
DA:439,0
DA:440,0
DA:445,0
DA:447,0
LF:219
LH:4
end_of_record
SF:lib/data/model/server/amd.dart
DA:31,2
DA:33,2
DA:34,2
DA:37,3
DA:38,2
DA:39,1
DA:40,1
DA:42,2
DA:46,1
DA:48,3
DA:49,4
DA:52,3
DA:53,1
DA:56,2
DA:57,3
DA:58,1
DA:61,4
DA:64,4
DA:67,3
DA:70,4
DA:72,1
DA:87,1
DA:89,1
DA:90,1
DA:92,2
DA:93,1
DA:98,1
DA:99,1
DA:100,1
DA:102,2
DA:103,2
DA:104,1
DA:107,1
DA:108,3
DA:109,3
DA:110,2
DA:112,1
DA:113,1
DA:114,1
DA:115,2
DA:116,1
DA:117,1
DA:118,1
DA:123,1
DA:126,1
DA:127,2
DA:128,4
DA:129,3
DA:131,1
DA:132,1
DA:146,1
DA:157,1
DA:159,6
DA:169,1
DA:171,1
DA:173,6
DA:182,1
DA:184,1
DA:186,4
LF:59
LH:59
end_of_record
SF:lib/data/model/server/battery.dart
DA:22,2
DA:24,1
DA:25,1
DA:26,1
DA:27,2
DA:28,1
DA:29,2
DA:30,3
DA:33,1
DA:34,1
DA:36,1
DA:37,1
DA:39,1
DA:40,1
DA:41,2
DA:43,1
DA:44,1
DA:48,0
DA:50,0
DA:53,0
DA:62,1
DA:64,1
DA:66,1
DA:68,1
DA:77,1
DA:78,1
DA:79,1
DA:80,1
DA:81,2
DA:82,1
DA:84,2
DA:85,0
DA:86,1
DA:88,0
DA:90,1
DA:92,1
LF:36
LH:31
end_of_record
SF:lib/data/model/server/conn.dart
DA:9,7
DA:11,0
DA:12,0
DA:13,0
DA:14,0
DA:15,0
DA:16,0
DA:17,0
DA:18,0
DA:19,0
DA:20,0
LF:11
LH:1
end_of_record
SF:lib/data/model/server/cpu.dart
DA:10,1
DA:14,1
DA:16,3
DA:17,8
DA:18,2
DA:19,2
DA:20,2
DA:21,2
DA:22,1
DA:26,1
DA:27,5
DA:28,2
DA:30,7
DA:31,7
DA:32,1
DA:33,3
DA:35,0
DA:41,0
DA:44,2
DA:47,0
DA:48,1
DA:49,5
DA:50,7
DA:51,2
DA:52,2
DA:56,0
DA:57,1
DA:58,5
DA:59,7
DA:60,2
DA:61,2
DA:65,0
DA:66,1
DA:67,5
DA:68,7
DA:69,2
DA:70,2
DA:74,0
DA:75,3
DA:77,1
DA:86,1
DA:92,0
DA:93,1
DA:94,2
DA:95,3
DA:96,3
DA:98,2
DA:99,4
DA:100,1
DA:145,1
DA:156,14
DA:158,0
DA:159,0
DA:161,0
DA:162,0
DA:164,0
DA:165,0
DA:166,0
DA:168,0
DA:169,0
DA:170,0
DA:172,0
DA:173,0
DA:174,0
DA:175,0
DA:176,0
DA:177,0
DA:178,0
DA:187,0
DA:188,0
DA:190,0
DA:191,0
DA:192,0
DA:193,0
DA:194,0
DA:195,0
DA:202,0
DA:203,0
DA:205,0
DA:215,0
DA:216,0
DA:219,0
DA:221,0
DA:222,0
DA:223,0
DA:225,0
DA:226,0
DA:241,0
DA:243,0
DA:244,0
DA:245,0
DA:246,0
DA:247,0
DA:249,0
DA:250,0
DA:265,0
DA:266,0
DA:267,0
DA:268,0
DA:270,0
DA:272,0
DA:273,0
DA:274,0
DA:277,0
DA:278,0
DA:280,0
DA:281,0
DA:283,0
DA:290,0
DA:291,0
DA:293,0
LF:111
LH:44
end_of_record
SF:lib/data/model/server/custom.dart
DA:27,0
DA:38,0
DA:40,0
DA:42,0
DA:44,0
DA:46,0
DA:47,0
DA:48,0
DA:49,0
DA:50,0
DA:51,0
DA:52,0
DA:55,0
DA:58,0
DA:59,0
DA:60,0
DA:61,0
DA:62,0
DA:63,0
DA:64,0
LF:20
LH:0
end_of_record
SF:lib/data/model/server/custom.g.dart
DA:9,0
DA:10,0
DA:11,0
DA:12,0
DA:13,0
DA:15,0
DA:16,0
DA:17,0
DA:18,0
DA:21,0
DA:22,0
DA:23,0
DA:24,0
DA:25,0
DA:26,0
DA:27,0
DA:28,0
DA:29,0
LF:18
LH:0
end_of_record
SF:lib/data/model/server/disk_smart.dart
DA:11,1
DA:25,0
DA:27,1
DA:28,1
DA:30,5
DA:32,2
DA:34,2
DA:37,3
DA:39,1
DA:41,1
DA:45,1
DA:46,1
DA:47,2
DA:48,3
DA:51,1
DA:52,1
DA:54,2
DA:56,1
DA:58,1
DA:59,1
DA:72,2
DA:78,1
DA:79,1
DA:82,1
DA:83,1
DA:84,1
DA:85,1
DA:86,1
DA:87,1
DA:88,1
DA:91,3
DA:94,1
DA:96,1
DA:97,1
DA:98,0
DA:99,0
DA:103,1
DA:104,0
DA:106,0
DA:107,0
DA:112,1
DA:114,0
DA:115,0
DA:119,2
DA:123,2
DA:124,1
DA:125,2
DA:126,1
DA:132,2
DA:133,1
DA:134,1
DA:136,1
DA:145,0
DA:156,1
DA:164,1
DA:165,1
DA:167,2
DA:170,2
DA:171,1
DA:172,2
DA:174,2
DA:175,1
DA:177,1
DA:178,1
DA:179,1
DA:180,2
DA:181,2
DA:182,3
DA:183,2
DA:192,0
DA:195,1
DA:197,2
DA:198,2
DA:201,0
DA:204,0
DA:206,0
DA:208,0
DA:213,0
DA:214,0
DA:222,3
DA:224,4
DA:225,4
DA:226,4
DA:227,4
DA:228,4
DA:229,4
DA:231,0
DA:232,0
DA:237,1
DA:251,0
DA:253,0
DA:255,0
DA:261,1
DA:274,0
DA:276,1
DA:277,1
DA:278,1
DA:279,2
DA:280,2
DA:281,2
DA:282,2
DA:283,2
DA:284,2
DA:285,2
DA:289,0
DA:291,0
LF:106
LH:82
end_of_record
SF:lib/data/model/server/disk_smart.g.dart
DA:9,0
DA:10,0
DA:11,0
DA:12,0
DA:13,0
DA:14,0
DA:15,0
DA:16,0
DA:17,0
DA:18,0
DA:19,0
DA:23,1
DA:24,1
DA:25,1
DA:26,1
DA:27,1
DA:28,1
DA:29,1
DA:30,1
DA:31,1
DA:32,1
DA:33,1
DA:36,0
DA:37,0
DA:38,0
DA:39,0
DA:40,0
DA:41,0
DA:42,0
DA:43,0
DA:44,0
DA:45,0
DA:46,0
DA:47,0
DA:51,0
DA:52,0
DA:53,0
DA:54,0
DA:55,0
DA:56,0
DA:57,0
DA:58,0
DA:59,0
DA:60,0
DA:61,0
DA:64,0
DA:65,0
DA:66,0
DA:67,0
DA:68,0
DA:69,0
DA:70,0
DA:71,0
DA:72,0
DA:73,0
DA:76,0
DA:78,0
DA:79,0
DA:80,0
DA:81,0
DA:82,0
DA:83,0
DA:84,0
DA:85,0
DA:86,0
LF:65
LH:11
end_of_record
SF:lib/data/model/server/memory.dart
DA:8,7
DA:10,0
DA:11,0
DA:12,0
DA:14,0
DA:17,0
DA:19,0
DA:20,0
DA:22,0
DA:23,0
DA:24,0
DA:25,0
DA:26,0
DA:27,0
DA:28,0
DA:29,0
DA:30,0
DA:32,0
DA:36,0
DA:43,0
DA:45,0
DA:47,0
DA:50,0
DA:51,0
DA:52,0
DA:53,0
DA:55,0
DA:56,0
DA:57,0
DA:61,0
DA:63,0
DA:65,0
DA:68,0
DA:69,0
DA:70,0
DA:71,0
DA:72,0
DA:75,0
DA:76,0
DA:77,0
DA:78,0
DA:81,0
DA:85,0
DA:89,0
DA:90,0
DA:91,0
DA:92,0
DA:93,0
DA:94,0
DA:95,0
DA:96,0
DA:97,0
DA:98,0
DA:99,0
DA:101,0
DA:110,6
DA:112,0
DA:114,0
DA:116,0
DA:118,0
DA:121,0
DA:122,0
DA:124,0
DA:125,0
DA:126,0
DA:127,0
DA:128,0
DA:129,0
DA:130,0
DA:131,0
DA:132,0
DA:134,0
LF:72
LH:2
end_of_record
SF:lib/data/model/server/net_speed.dart
DA:13,1
DA:15,0
DA:16,0
DA:22,1
DA:24,0
DA:26,0
DA:27,0
DA:29,0
DA:30,0
DA:32,0
DA:33,0
DA:34,0
DA:35,0
DA:37,0
DA:53,0
DA:55,0
DA:56,0
DA:57,0
DA:58,0
DA:60,0
DA:61,0
DA:62,0
DA:65,0
DA:66,0
DA:67,0
DA:68,0
DA:72,0
DA:74,0
DA:75,0
DA:78,0
DA:79,0
DA:80,0
DA:82,0
DA:83,0
DA:84,0
DA:85,0
DA:86,0
DA:90,0
DA:92,0
DA:93,0
DA:96,0
DA:97,0
DA:98,0
DA:101,0
DA:102,0
DA:103,0
DA:104,0
DA:108,0
DA:110,0
DA:111,0
DA:114,0
DA:115,0
DA:116,0
DA:118,0
DA:119,0
DA:120,0
DA:121,0
DA:122,0
DA:126,0
DA:128,0
DA:129,0
DA:132,0
DA:134,0
DA:135,0
DA:136,0
DA:143,0
DA:150,0
DA:151,0
DA:152,0
DA:153,0
DA:156,0
DA:157,0
DA:159,0
DA:160,0
DA:162,0
DA:163,0
DA:164,0
DA:165,0
DA:166,0
DA:196,0
DA:197,0
DA:198,0
DA:199,0
DA:202,0
DA:203,0
DA:204,0
DA:205,0
DA:206,0
DA:209,0
DA:212,0
DA:215,0
DA:216,0
DA:217,0
LF:93
LH:2
end_of_record
SF:lib/data/model/server/nvdia.dart
DA:25,2
DA:26,2
DA:27,1
DA:28,3
DA:29,1
DA:30,3
DA:32,1
DA:33,1
DA:34,1
DA:35,1
DA:36,1
DA:37,2
DA:38,3
DA:39,3
DA:40,2
DA:41,3
DA:42,3
DA:43,3
DA:44,3
DA:45,1
DA:46,3
DA:47,3
DA:48,3
DA:50,1
DA:51,1
DA:53,3
DA:58,2
DA:60,1
DA:61,1
DA:62,1
DA:63,1
DA:64,1
DA:65,3
DA:67,1
DA:69,3
DA:70,3
DA:71,3
DA:72,1
DA:73,1
DA:74,3
DA:75,3
DA:77,1
DA:79,3
DA:84,2
DA:85,1
DA:98,1
DA:108,0
DA:110,0
DA:120,1
DA:122,0
DA:124,0
DA:133,1
DA:135,0
DA:137,0
LF:54
LH:48
end_of_record
SF:lib/data/model/server/sensors.dart
DA:6,6
DA:17,1
DA:18,1
DA:19,1
DA:20,1
DA:21,1
DA:22,0
DA:31,1
DA:33,0
DA:34,0
DA:35,0
DA:36,0
DA:37,0
DA:38,0
DA:40,0
DA:43,1
DA:44,3
DA:47,1
DA:48,2
DA:49,1
DA:51,3
DA:52,1
DA:53,1
DA:54,2
DA:55,1
DA:58,2
DA:61,3
DA:62,0
DA:65,1
DA:66,2
DA:68,1
DA:69,1
DA:70,1
DA:71,5
DA:73,1
DA:74,2
DA:75,1
DA:76,1
DA:77,2
DA:78,2
DA:79,2
DA:80,1
DA:82,2
LF:43
LH:34
end_of_record
SF:lib/data/model/server/temp.dart
DA:4,0
DA:5,0
DA:6,0
DA:7,0
DA:8,0
DA:9,0
DA:10,0
DA:13,0
DA:14,0
DA:18,0
DA:22,0
DA:23,0
DA:26,0
DA:27,0
DA:30,1
DA:31,2
DA:34,0
DA:35,0
DA:38,0
DA:39,0
DA:40,0
DA:43,0
LF:22
LH:2
end_of_record
SF:lib/data/model/server/wol_cfg.dart
DA:14,0
DA:16,0
DA:17,0
DA:18,0
DA:19,0
DA:20,0
DA:22,0
DA:29,0
DA:30,0
DA:31,0
DA:34,0
DA:35,0
DA:36,0
DA:37,0
DA:38,0
DA:41,0
DA:43,0
LF:17
LH:0
end_of_record
SF:lib/data/model/server/wol_cfg.g.dart
DA:9,0
DA:10,0
DA:11,0
DA:12,0
DA:15,0
DA:16,0
DA:17,0
DA:18,0
DA:19,0
LF:9
LH:0
end_of_record
SF:lib/data/store/server.dart
DA:9,0
DA:11,0
DA:13,0
DA:14,0
DA:17,0
DA:18,0
DA:19,0
DA:20,0
DA:22,0
DA:23,0
DA:24,0
DA:25,0
DA:28,0
DA:29,0
DA:32,0
DA:39,0
DA:45,0
DA:46,0
DA:49,0
DA:50,0
DA:51,0
DA:53,0
DA:54,0
DA:57,0
DA:59,0
DA:60,0
DA:61,0
DA:64,0
DA:65,0
DA:69,0
DA:72,0
DA:73,0
DA:74,0
DA:78,0
DA:79,0
DA:80,0
DA:83,0
DA:84,0
DA:85,0
DA:90,0
DA:92,0
DA:94,0
DA:95,0
DA:96,0
DA:97,0
DA:98,0
DA:104,0
DA:105,0
DA:106,0
DA:107,0
DA:108,0
DA:109,0
DA:110,0
DA:111,0
DA:116,0
DA:118,0
DA:119,0
DA:124,0
LF:58
LH:0
end_of_record
SF:lib/data/model/server/windows_parser.dart
DA:16,0
DA:19,1
DA:26,2
DA:27,0
DA:29,0
DA:30,0
DA:31,0
DA:32,0
DA:34,0
DA:36,0
DA:41,0
DA:46,1
DA:49,2
DA:50,4
DA:51,1
DA:53,1
DA:54,2
DA:59,1
DA:60,1
DA:61,1
DA:62,1
DA:63,1
DA:64,1
DA:65,1
DA:66,1
DA:67,1
DA:71,2
DA:72,1
DA:77,3
DA:81,1
DA:82,1
DA:85,3
DA:86,0
DA:90,1
DA:91,2
DA:92,2
DA:94,1
DA:95,3
DA:97,0
DA:100,0
DA:106,1
DA:108,1
DA:109,1
DA:111,1
DA:112,0
DA:113,0
DA:114,0
DA:116,0
DA:119,0
DA:120,0
DA:130,0
DA:131,0
DA:133,0
DA:134,0
DA:135,0
DA:146,1
DA:148,1
DA:150,1
DA:153,2
DA:154,2
DA:157,2
DA:158,2
DA:160,1
DA:161,1
DA:176,1
DA:184,1
DA:186,1
DA:187,1
DA:190,1
DA:191,1
DA:193,1
DA:204,1
DA:206,1
DA:207,1
DA:209,2
DA:211,2
DA:212,2
DA:214,3
DA:216,3
DA:217,0
DA:218,2
DA:221,1
DA:222,2
DA:223,2
DA:224,1
DA:227,0
DA:232,2
DA:233,2
DA:234,1
DA:235,2
DA:236,4
DA:239,1
DA:240,1
DA:254,3
DA:255,1
LF:95
LH:70
end_of_record
SF:lib/data/model/server/try_limiter.dart
DA:6,0
DA:8,0
DA:9,0
DA:10,0
DA:13,0
DA:14,0
DA:20,0
DA:21,0
DA:24,0
DA:25,0
DA:28,0
DA:29,0
LF:12
LH:0
end_of_record
SF:lib/data/model/ssh/virtual_key.dart
DA:59,0
DA:60,0
DA:61,0
DA:62,0
DA:63,0
DA:64,0
DA:65,0
DA:66,0
DA:67,0
DA:68,0
DA:69,0
DA:70,0
DA:71,0
DA:72,0
DA:73,0
DA:74,0
DA:75,0
DA:80,0
DA:81,0
DA:84,0
DA:85,0
DA:87,0
DA:88,0
DA:90,0
DA:113,0
DA:114,0
DA:115,0
DA:116,0
DA:117,0
DA:118,0
DA:119,0
DA:120,0
DA:121,0
DA:122,0
DA:123,0
DA:124,0
DA:125,0
DA:126,0
DA:127,0
DA:128,0
DA:129,0
DA:130,0
DA:131,0
DA:132,0
DA:133,0
DA:134,0
DA:135,0
DA:136,0
DA:137,0
DA:138,0
DA:143,0
DA:144,0
DA:145,0
DA:146,0
DA:147,0
DA:148,0
DA:149,0
DA:150,0
DA:151,0
DA:158,0
DA:159,0
DA:160,0
DA:161,0
DA:162,0
DA:166,0
DA:167,0
DA:171,0
DA:172,0
DA:176,0
DA:177,0
DA:178,0
DA:179,0
DA:184,0
DA:186,0
DA:187,0
DA:188,0
DA:189,0
DA:190,0
DA:192,0
LF:79
LH:0
end_of_record
SF:lib/data/store/container.dart
DA:8,0
DA:10,0
DA:12,0
DA:13,0
DA:16,0
DA:17,0
DA:20,0
DA:21,0
DA:23,0
DA:27,0
DA:30,0
DA:31,0
DA:35,0
DA:36,0
DA:38,0
DA:41,0
LF:16
LH:0
end_of_record
SF:lib/data/store/history.dart
DA:10,0
DA:13,0
DA:15,0
DA:16,0
DA:17,0
DA:18,0
DA:21,0
DA:29,0
DA:32,0
DA:34,0
DA:35,0
DA:36,0
DA:39,0
DA:43,0
DA:45,0
LF:15
LH:0
end_of_record
SF:lib/data/store/private_key.dart
DA:6,0
DA:8,0
DA:10,0
DA:11,0
DA:14,0
DA:15,0
DA:16,0
DA:17,0
DA:19,0
DA:20,0
DA:21,0
DA:22,0
DA:25,0
DA:26,0
DA:29,0
DA:36,0
DA:42,0
DA:44,0
DA:47,0
DA:48,0
LF:20
LH:0
end_of_record
SF:lib/data/store/setting.dart
DA:11,0
DA:13,0
LF:2
LH:0
end_of_record
SF:lib/data/store/snippet.dart
DA:6,0
DA:8,0
DA:10,0
DA:11,0
DA:14,0
DA:16,0
DA:17,0
DA:19,0
DA:20,0
DA:21,0
DA:22,0
DA:25,0
DA:26,0
DA:29,0
DA:36,0
DA:39,0
DA:42,0
DA:43,0
DA:46,0
DA:47,0
DA:48,0
DA:50,0
DA:51,0
DA:54,0
LF:24
LH:0
end_of_record
SF:lib/generated/l10n/l10n.dart
DA:75,0
DA:76,0
DA:80,0
DA:81,0
DA:1550,8
DA:1552,0
DA:1554,0
DA:1557,0
DA:1558,0
DA:1571,0
DA:1573,0
DA:1577,0
DA:1579,0
DA:1580,0
DA:1582,0
DA:1583,0
DA:1584,0
DA:1591,0
DA:1592,0
DA:1593,0
DA:1594,0
DA:1595,0
DA:1596,0
DA:1597,0
DA:1598,0
DA:1599,0
DA:1600,0
DA:1601,0
DA:1602,0
DA:1603,0
DA:1604,0
DA:1605,0
DA:1606,0
DA:1607,0
DA:1608,0
DA:1609,0
DA:1610,0
DA:1611,0
DA:1612,0
DA:1613,0
DA:1614,0
DA:1615,0
DA:1618,0
LF:43
LH:1
end_of_record
SF:lib/generated/l10n/l10n_en.dart
DA:9,0
DA:11,0
DA:15,0
DA:18,0
DA:22,0
DA:25,0
DA:28,0
DA:31,0
DA:35,0
DA:39,0
DA:42,0
DA:45,0
DA:48,0
DA:52,0
DA:55,0
DA:58,0
DA:62,0
DA:65,0
DA:68,0
DA:71,0
DA:74,0
DA:77,0
DA:80,0
DA:83,0
DA:87,0
DA:90,0
DA:93,0
DA:97,0
DA:100,0
DA:103,0
DA:107,0
DA:110,0
DA:113,0
DA:117,0
DA:120,0
DA:123,0
DA:127,0
DA:130,0
DA:133,0
DA:136,0
DA:139,0
DA:143,0
DA:146,0
DA:149,0
DA:152,0
DA:155,0
DA:158,0
DA:161,0
DA:163,0
DA:166,0
DA:170,0
DA:172,0
DA:175,0
DA:178,0
DA:183,0
DA:186,0
DA:188,0
DA:191,0
DA:194,0
DA:198,0
DA:201,0
DA:204,0
DA:208,0
DA:211,0
DA:214,0
DA:217,0
DA:220,0
DA:223,0
DA:226,0
DA:230,0
DA:233,0
DA:237,0
DA:239,0
DA:242,0
DA:245,0
DA:248,0
DA:251,0
DA:254,0
DA:257,0
DA:260,0
DA:263,0
DA:267,0
DA:270,0
DA:273,0
DA:276,0
DA:279,0
DA:282,0
DA:285,0
DA:287,0
DA:290,0
DA:293,0
DA:296,0
DA:299,0
DA:302,0
DA:305,0
DA:308,0
DA:312,0
DA:315,0
DA:318,0
DA:321,0
DA:324,0
DA:328,0
DA:331,0
DA:334,0
DA:338,0
DA:341,0
DA:344,0
DA:347,0
DA:349,0
DA:352,0
DA:355,0
DA:358,0
DA:361,0
DA:364,0
DA:367,0
DA:370,0
DA:373,0
DA:377,0
DA:380,0
DA:384,0
DA:387,0
DA:390,0
DA:393,0
DA:396,0
DA:399,0
DA:402,0
DA:406,0
DA:409,0
DA:412,0
DA:415,0
DA:418,0
DA:421,0
DA:425,0
DA:428,0
DA:432,0
DA:436,0
DA:438,0
DA:441,0
DA:444,0
DA:447,0
DA:450,0
DA:454,0
DA:457,0
DA:460,0
DA:463,0
DA:466,0
DA:469,0
DA:472,0
DA:475,0
DA:478,0
DA:481,0
DA:485,0
DA:489,0
DA:493,0
DA:496,0
DA:499,0
DA:502,0
DA:505,0
DA:508,0
DA:511,0
DA:514,0
DA:517,0
DA:520,0
DA:523,0
DA:526,0
DA:529,0
DA:532,0
DA:535,0
DA:538,0
DA:541,0
DA:544,0
DA:547,0
DA:550,0
DA:553,0
DA:556,0
DA:559,0
DA:562,0
DA:566,0
DA:569,0
DA:572,0
DA:575,0
DA:578,0
DA:581,0
DA:584,0
DA:587,0
DA:590,0
DA:593,0
DA:597,0
DA:600,0
DA:602,0
DA:605,0
DA:609,0
DA:611,0
DA:614,0
DA:617,0
DA:620,0
DA:623,0
DA:626,0
DA:629,0
DA:632,0
DA:635,0
DA:639,0
DA:642,0
DA:646,0
DA:648,0
DA:651,0
DA:654,0
DA:658,0
DA:661,0
DA:664,0
DA:667,0
DA:671,0
DA:674,0
DA:677,0
DA:680,0
DA:684,0
DA:687,0
DA:690,0
DA:693,0
DA:696,0
DA:699,0
DA:702,0
DA:705,0
DA:708,0
DA:711,0
DA:714,0
DA:718,0
DA:721,0
DA:724,0
DA:727,0
DA:730,0
DA:733,0
DA:737,0
DA:740,0
DA:743,0
DA:746,0
DA:749,0
DA:752,0
DA:756,0
DA:759,0
DA:762,0
DA:766,0
DA:769,0
DA:772,0
DA:775,0
DA:778,0
DA:782,0
DA:785,0
DA:789,0
LF:249
LH:0
end_of_record
SF:lib/data/model/server/pve.dart
DA:11,2
DA:12,1
DA:13,1
DA:14,1
DA:15,1
DA:16,1
DA:20,0
DA:21,0
DA:22,0
DA:23,0
DA:24,0
DA:25,0
DA:34,1
DA:35,2
DA:38,1
DA:39,1
DA:40,1
DA:41,1
DA:42,1
DA:43,1
DA:44,1
DA:45,1
DA:46,1
DA:47,1
DA:84,1
DA:104,1
DA:105,1
DA:106,1
DA:108,1
DA:109,1
DA:110,1
DA:111,1
DA:112,1
DA:113,1
DA:114,1
DA:115,2
DA:116,1
DA:117,1
DA:118,1
DA:119,1
DA:120,1
DA:121,1
DA:122,1
DA:126,0
DA:127,0
DA:129,0
DA:131,0
DA:132,0
DA:134,0
DA:162,1
DA:182,1
DA:183,1
DA:184,1
DA:186,1
DA:187,1
DA:188,1
DA:189,1
DA:190,1
DA:191,1
DA:192,1
DA:193,2
DA:194,1
DA:195,1
DA:196,1
DA:197,1
DA:198,1
DA:199,1
DA:200,1
DA:204,0
DA:205,0
DA:207,0
DA:209,0
DA:210,0
DA:212,0
DA:230,1
DA:242,1
DA:243,1
DA:244,1
DA:246,1
DA:247,1
DA:248,1
DA:249,1
DA:250,1
DA:251,2
DA:252,1
DA:256,0
DA:258,0
DA:259,0
DA:260,0
DA:262,0
DA:282,1
DA:295,1
DA:296,1
DA:297,1
DA:299,1
DA:300,1
DA:301,1
DA:302,1
DA:303,1
DA:304,1
DA:305,1
DA:306,1
DA:310,0
DA:311,0
DA:313,0
DA:314,0
DA:316,0
DA:318,0
DA:319,0
DA:321,0
DA:336,1
DA:338,1
DA:339,1
DA:340,1
DA:342,1
DA:343,1
DA:344,1
DA:348,0
DA:349,0
DA:351,0
DA:352,0
DA:354,0
DA:355,0
DA:365,0
DA:373,0
DA:375,0
DA:377,0
DA:378,0
DA:379,0
DA:381,0
DA:382,0
DA:383,0
DA:385,0
DA:386,0
DA:387,0
DA:389,0
DA:390,0
DA:391,0
DA:393,0
DA:394,0
DA:397,0
DA:399,0
DA:400,0
DA:401,0
DA:402,0
DA:403,0
DA:404,0
DA:405,0
DA:407,0
DA:408,0
DA:409,0
DA:411,0
DA:412,0
DA:414,0
DA:415,0
DA:417,0
DA:418,0
DA:420,0
DA:421,0
DA:427,0
DA:428,0
DA:429,0
DA:430,0
DA:431,0
DA:434,0
LF:165
LH:86
end_of_record
SF:lib/generated/l10n/l10n_de.dart
DA:9,0
DA:11,0
DA:15,0
DA:18,0
DA:22,0
DA:25,0
DA:28,0
DA:31,0
DA:35,0
DA:39,0
DA:42,0
DA:45,0
DA:48,0
DA:52,0
DA:56,0
DA:59,0
DA:63,0
DA:66,0
DA:69,0
DA:72,0
DA:75,0
DA:78,0
DA:81,0
DA:84,0
DA:88,0
DA:91,0
DA:94,0
DA:98,0
DA:101,0
DA:104,0
DA:108,0
DA:111,0
DA:114,0
DA:118,0
DA:121,0
DA:124,0
DA:128,0
DA:131,0
DA:134,0
DA:137,0
DA:140,0
DA:144,0
DA:147,0
DA:150,0
DA:153,0
DA:156,0
DA:159,0
DA:162,0
DA:164,0
DA:167,0
DA:171,0
DA:173,0
DA:176,0
DA:179,0
DA:184,0
DA:187,0
DA:189,0
DA:192,0
DA:195,0
DA:199,0
DA:202,0
DA:205,0
DA:209,0
DA:212,0
DA:215,0
DA:218,0
DA:221,0
DA:224,0
DA:227,0
DA:231,0
DA:234,0
DA:238,0
DA:240,0
DA:243,0
DA:246,0
DA:249,0
DA:252,0
DA:255,0
DA:258,0
DA:261,0
DA:264,0
DA:268,0
DA:271,0
DA:274,0
DA:277,0
DA:280,0
DA:283,0
DA:286,0
DA:288,0
DA:291,0
DA:294,0
DA:297,0
DA:300,0
DA:303,0
DA:306,0
DA:309,0
DA:313,0
DA:316,0
DA:319,0
DA:322,0
DA:325,0
DA:329,0
DA:332,0
DA:335,0
DA:339,0
DA:342,0
DA:345,0
DA:348,0
DA:350,0
DA:353,0
DA:356,0
DA:359,0
DA:362,0
DA:366,0
DA:369,0
DA:372,0
DA:375,0
DA:379,0
DA:382,0
DA:386,0
DA:389,0
DA:392,0
DA:395,0
DA:398,0
DA:401,0
DA:404,0
DA:408,0
DA:411,0
DA:414,0
DA:417,0
DA:420,0
DA:423,0
DA:427,0
DA:430,0
DA:434,0
DA:438,0
DA:440,0
DA:443,0
DA:446,0
DA:449,0
DA:452,0
DA:456,0
DA:459,0
DA:462,0
DA:465,0
DA:468,0
DA:471,0
DA:474,0
DA:477,0
DA:480,0
DA:483,0
DA:487,0
DA:491,0
DA:495,0
DA:498,0
DA:501,0
DA:504,0
DA:507,0
DA:510,0
DA:513,0
DA:516,0
DA:519,0
DA:522,0
DA:525,0
DA:528,0
DA:531,0
DA:535,0
DA:538,0
DA:541,0
DA:544,0
DA:547,0
DA:550,0
DA:553,0
DA:556,0
DA:559,0
DA:562,0
DA:565,0
DA:569,0
DA:573,0
DA:576,0
DA:579,0
DA:582,0
DA:585,0
DA:588,0
DA:591,0
DA:594,0
DA:597,0
DA:601,0
DA:604,0
DA:606,0
DA:609,0
DA:613,0
DA:615,0
DA:618,0
DA:622,0
DA:625,0
DA:628,0
DA:631,0
DA:634,0
DA:637,0
DA:640,0
DA:644,0
DA:647,0
DA:651,0
DA:653,0
DA:656,0
DA:659,0
DA:663,0
DA:666,0
DA:669,0
DA:672,0
DA:676,0
DA:679,0
DA:682,0
DA:685,0
DA:689,0
DA:692,0
DA:695,0
DA:698,0
DA:701,0
DA:704,0
DA:707,0
DA:710,0
DA:713,0
DA:716,0
DA:719,0
DA:723,0
DA:727,0
DA:730,0
DA:733,0
DA:736,0
DA:739,0
DA:743,0
DA:746,0
DA:749,0
DA:752,0
DA:755,0
DA:758,0
DA:762,0
DA:765,0
DA:768,0
DA:772,0
DA:775,0
DA:778,0
DA:781,0
DA:784,0
DA:788,0
DA:791,0
DA:795,0
LF:249
LH:0
end_of_record
SF:lib/generated/l10n/l10n_es.dart
DA:9,0
DA:11,0
DA:14,0
DA:17,0
DA:21,0
DA:24,0
DA:27,0
DA:30,0
DA:34,0
DA:38,0
DA:41,0
DA:44,0
DA:48,0
DA:52,0
DA:56,0
DA:59,0
DA:63,0
DA:66,0
DA:69,0
DA:72,0
DA:75,0
DA:78,0
DA:81,0
DA:84,0
DA:88,0
DA:91,0
DA:94,0
DA:98,0
DA:101,0
DA:104,0
DA:108,0
DA:111,0
DA:114,0
DA:118,0
DA:121,0
DA:124,0
DA:128,0
DA:131,0
DA:134,0
DA:137,0
DA:140,0
DA:144,0
DA:147,0
DA:150,0
DA:153,0
DA:156,0
DA:159,0
DA:162,0
DA:164,0
DA:167,0
DA:171,0
DA:173,0
DA:176,0
DA:179,0
DA:184,0
DA:187,0
DA:189,0
DA:192,0
DA:195,0
DA:199,0
DA:202,0
DA:205,0
DA:209,0
DA:212,0
DA:215,0
DA:218,0
DA:221,0
DA:224,0
DA:227,0
DA:231,0
DA:234,0
DA:238,0
DA:240,0
DA:243,0
DA:246,0
DA:249,0
DA:252,0
DA:255,0
DA:258,0
DA:261,0
DA:264,0
DA:268,0
DA:271,0
DA:274,0
DA:277,0
DA:280,0
DA:283,0
DA:286,0
DA:288,0
DA:291,0
DA:294,0
DA:297,0
DA:300,0
DA:303,0
DA:306,0
DA:309,0
DA:313,0
DA:316,0
DA:319,0
DA:322,0
DA:325,0
DA:329,0
DA:332,0
DA:335,0
DA:339,0
DA:342,0
DA:345,0
DA:348,0
DA:350,0
DA:353,0
DA:356,0
DA:359,0
DA:363,0
DA:366,0
DA:369,0
DA:372,0
DA:375,0
DA:379,0
DA:382,0
DA:386,0
DA:389,0
DA:392,0
DA:395,0
DA:398,0
DA:401,0
DA:404,0
DA:408,0
DA:411,0
DA:414,0
DA:417,0
DA:420,0
DA:423,0
DA:427,0
DA:430,0
DA:434,0
DA:438,0
DA:440,0
DA:443,0
DA:446,0
DA:449,0
DA:453,0
DA:457,0
DA:460,0
DA:463,0
DA:466,0
DA:470,0
DA:473,0
DA:476,0
DA:479,0
DA:482,0
DA:485,0
DA:489,0
DA:493,0
DA:497,0
DA:500,0
DA:503,0
DA:506,0
DA:510,0
DA:513,0
DA:516,0
DA:519,0
DA:522,0
DA:525,0
DA:528,0
DA:531,0
DA:534,0
DA:537,0
DA:540,0
DA:543,0
DA:546,0
DA:549,0
DA:552,0
DA:555,0
DA:559,0
DA:562,0
DA:565,0
DA:568,0
DA:572,0
DA:576,0
DA:579,0
DA:582,0
DA:585,0
DA:588,0
DA:591,0
DA:594,0
DA:597,0
DA:600,0
DA:604,0
DA:607,0
DA:609,0
DA:612,0
DA:616,0
DA:618,0
DA:621,0
DA:625,0
DA:628,0
DA:631,0
DA:634,0
DA:637,0
DA:640,0
DA:643,0
DA:646,0
DA:649,0
DA:653,0
DA:655,0
DA:658,0
DA:661,0
DA:665,0
DA:668,0
DA:671,0
DA:674,0
DA:678,0
DA:681,0
DA:684,0
DA:687,0
DA:691,0
DA:694,0
DA:697,0
DA:700,0
DA:703,0
DA:706,0
DA:709,0
DA:712,0
DA:715,0
DA:718,0
DA:721,0
DA:725,0
DA:729,0
DA:732,0
DA:735,0
DA:738,0
DA:741,0
DA:745,0
DA:748,0
DA:751,0
DA:754,0
DA:757,0
DA:760,0
DA:764,0
DA:767,0
DA:770,0
DA:774,0
DA:777,0
DA:780,0
DA:783,0
DA:786,0
DA:790,0
DA:793,0
DA:797,0
LF:249
LH:0
end_of_record
SF:lib/generated/l10n/l10n_fr.dart
DA:9,0
DA:11,0
DA:14,0
DA:17,0
DA:21,0
DA:24,0
DA:27,0
DA:30,0
DA:34,0
DA:38,0
DA:41,0
DA:44,0
DA:48,0
DA:52,0
DA:56,0
DA:59,0
DA:63,0
DA:66,0
DA:69,0
DA:72,0
DA:75,0
DA:78,0
DA:81,0
DA:84,0
DA:88,0
DA:91,0
DA:94,0
DA:98,0
DA:101,0
DA:104,0
DA:108,0
DA:111,0
DA:114,0
DA:118,0
DA:121,0
DA:124,0
DA:128,0
DA:131,0
DA:134,0
DA:137,0
DA:140,0
DA:144,0
DA:147,0
DA:150,0
DA:153,0
DA:156,0
DA:159,0
DA:162,0
DA:164,0
DA:167,0
DA:171,0
DA:173,0
DA:176,0
DA:179,0
DA:184,0
DA:187,0
DA:189,0
DA:192,0
DA:195,0
DA:199,0
DA:202,0
DA:205,0
DA:209,0
DA:212,0
DA:215,0
DA:218,0
DA:221,0
DA:224,0
DA:227,0
DA:231,0
DA:234,0
DA:238,0
DA:240,0
DA:243,0
DA:246,0
DA:249,0
DA:252,0
DA:255,0
DA:258,0
DA:261,0
DA:264,0
DA:268,0
DA:271,0
DA:274,0
DA:277,0
DA:280,0
DA:283,0
DA:286,0
DA:288,0
DA:291,0
DA:294,0
DA:297,0
DA:300,0
DA:303,0
DA:306,0
DA:309,0
DA:313,0
DA:316,0
DA:319,0
DA:322,0
DA:325,0
DA:329,0
DA:332,0
DA:335,0
DA:339,0
DA:342,0
DA:345,0
DA:348,0
DA:350,0
DA:353,0
DA:356,0
DA:359,0
DA:362,0
DA:365,0
DA:368,0
DA:371,0
DA:374,0
DA:378,0
DA:381,0
DA:385,0
DA:388,0
DA:391,0
DA:394,0
DA:397,0
DA:400,0
DA:404,0
DA:408,0
DA:411,0
DA:414,0
DA:417,0
DA:420,0
DA:424,0
DA:428,0
DA:431,0
DA:435,0
DA:439,0
DA:441,0
DA:444,0
DA:447,0
DA:450,0
DA:454,0
DA:458,0
DA:461,0
DA:464,0
DA:467,0
DA:471,0
DA:474,0
DA:477,0
DA:480,0
DA:483,0
DA:486,0
DA:490,0
DA:494,0
DA:498,0
DA:501,0
DA:504,0
DA:507,0
DA:511,0
DA:514,0
DA:517,0
DA:520,0
DA:523,0
DA:526,0
DA:529,0
DA:532,0
DA:535,0
DA:538,0
DA:541,0
DA:544,0
DA:547,0
DA:550,0
DA:553,0
DA:556,0
DA:560,0
DA:563,0
DA:566,0
DA:569,0
DA:573,0
DA:577,0
DA:580,0
DA:583,0
DA:586,0
DA:589,0
DA:592,0
DA:595,0
DA:598,0
DA:601,0
DA:605,0
DA:608,0
DA:610,0
DA:613,0
DA:617,0
DA:619,0
DA:622,0
DA:626,0
DA:629,0
DA:632,0
DA:635,0
DA:638,0
DA:641,0
DA:644,0
DA:648,0
DA:651,0
DA:655,0
DA:657,0
DA:660,0
DA:663,0
DA:667,0
DA:670,0
DA:673,0
DA:676,0
DA:680,0
DA:683,0
DA:686,0
DA:689,0
DA:693,0
DA:696,0
DA:699,0
DA:702,0
DA:705,0
DA:708,0
DA:711,0
DA:714,0
DA:717,0
DA:720,0
DA:723,0
DA:727,0
DA:731,0
DA:734,0
DA:737,0
DA:740,0
DA:743,0
DA:747,0
DA:750,0
DA:753,0
DA:756,0
DA:759,0
DA:762,0
DA:766,0
DA:769,0
DA:772,0
DA:776,0
DA:779,0
DA:782,0
DA:785,0
DA:788,0
DA:792,0
DA:795,0
DA:799,0
LF:249
LH:0
end_of_record
SF:lib/generated/l10n/l10n_id.dart
DA:9,0
DA:11,0
DA:15,0
DA:18,0
DA:22,0
DA:25,0
DA:28,0
DA:31,0
DA:35,0
DA:39,0
DA:42,0
DA:45,0
DA:48,0
DA:52,0
DA:55,0
DA:58,0
DA:62,0
DA:65,0
DA:68,0
DA:71,0
DA:74,0
DA:77,0
DA:80,0
DA:83,0
DA:87,0
DA:90,0
DA:93,0
DA:97,0
DA:100,0
DA:103,0
DA:107,0
DA:110,0
DA:113,0
DA:117,0
DA:120,0
DA:123,0
DA:127,0
DA:130,0
DA:133,0
DA:136,0
DA:139,0
DA:143,0
DA:146,0
DA:149,0
DA:152,0
DA:155,0
DA:158,0
DA:161,0
DA:163,0
DA:166,0
DA:170,0
DA:172,0
DA:175,0
DA:178,0
DA:183,0
DA:186,0
DA:188,0
DA:191,0
DA:194,0
DA:198,0
DA:201,0
DA:204,0
DA:208,0
DA:211,0
DA:214,0
DA:217,0
DA:220,0
DA:223,0
DA:226,0
DA:230,0
DA:233,0
DA:237,0
DA:239,0
DA:242,0
DA:245,0
DA:248,0
DA:251,0
DA:254,0
DA:257,0
DA:260,0
DA:263,0
DA:267,0
DA:270,0
DA:273,0
DA:276,0
DA:279,0
DA:282,0
DA:285,0
DA:287,0
DA:290,0
DA:293,0
DA:296,0
DA:299,0
DA:302,0
DA:305,0
DA:308,0
DA:312,0
DA:315,0
DA:318,0
DA:321,0
DA:324,0
DA:328,0
DA:331,0
DA:334,0
DA:338,0
DA:341,0
DA:344,0
DA:347,0
DA:349,0
DA:352,0
DA:355,0
DA:358,0
DA:361,0
DA:364,0
DA:367,0
DA:370,0
DA:373,0
DA:377,0
DA:380,0
DA:384,0
DA:387,0
DA:390,0
DA:393,0
DA:396,0
DA:399,0
DA:402,0
DA:406,0
DA:409,0
DA:412,0
DA:415,0
DA:418,0
DA:422,0
DA:425,0
DA:428,0
DA:432,0
DA:436,0
DA:438,0
DA:441,0
DA:444,0
DA:447,0
DA:450,0
DA:454,0
DA:457,0
DA:460,0
DA:463,0
DA:466,0
DA:469,0
DA:472,0
DA:475,0
DA:478,0
DA:481,0
DA:485,0
DA:489,0
DA:493,0
DA:496,0
DA:499,0
DA:502,0
DA:506,0
DA:509,0
DA:512,0
DA:515,0
DA:518,0
DA:521,0
DA:524,0
DA:527,0
DA:530,0
DA:533,0
DA:536,0
DA:539,0
DA:542,0
DA:545,0
DA:548,0
DA:551,0
DA:554,0
DA:557,0
DA:560,0
DA:563,0
DA:567,0
DA:570,0
DA:573,0
DA:576,0
DA:579,0
DA:582,0
DA:585,0
DA:588,0
DA:591,0
DA:594,0
DA:598,0
DA:601,0
DA:603,0
DA:606,0
DA:610,0
DA:612,0
DA:615,0
DA:618,0
DA:621,0
DA:624,0
DA:627,0
DA:630,0
DA:633,0
DA:636,0
DA:639,0
DA:642,0
DA:646,0
DA:648,0
DA:651,0
DA:654,0
DA:658,0
DA:661,0
DA:664,0
DA:667,0
DA:671,0
DA:674,0
DA:677,0
DA:680,0
DA:684,0
DA:687,0
DA:690,0
DA:693,0
DA:696,0
DA:699,0
DA:702,0
DA:705,0
DA:708,0
DA:711,0
DA:714,0
DA:718,0
DA:721,0
DA:724,0
DA:727,0
DA:730,0
DA:733,0
DA:737,0
DA:740,0
DA:743,0
DA:746,0
DA:749,0
DA:752,0
DA:756,0
DA:759,0
DA:762,0
DA:765,0
DA:768,0
DA:771,0
DA:774,0
DA:777,0
DA:781,0
DA:784,0
DA:788,0
LF:249
LH:0
end_of_record
SF:lib/generated/l10n/l10n_ja.dart
DA:9,0
DA:11,0
DA:14,0
DA:17,0
DA:21,0
DA:24,0
DA:27,0
DA:30,0
DA:33,0
DA:36,0
DA:39,0
DA:42,0
DA:45,0
DA:48,0
DA:51,0
DA:54,0
DA:58,0
DA:61,0
DA:64,0
DA:67,0
DA:70,0
DA:73,0
DA:76,0
DA:79,0
DA:83,0
DA:86,0
DA:89,0
DA:92,0
DA:95,0
DA:98,0
DA:102,0
DA:105,0
DA:108,0
DA:111,0
DA:114,0
DA:117,0
DA:121,0
DA:124,0
DA:127,0
DA:130,0
DA:133,0
DA:136,0
DA:139,0
DA:142,0
DA:145,0
DA:148,0
DA:151,0
DA:154,0
DA:156,0
DA:159,0
DA:163,0
DA:165,0
DA:168,0
DA:171,0
DA:176,0
DA:179,0
DA:181,0
DA:184,0
DA:187,0
DA:191,0
DA:194,0
DA:197,0
DA:201,0
DA:204,0
DA:207,0
DA:210,0
DA:213,0
DA:216,0
DA:219,0
DA:223,0
DA:226,0
DA:230,0
DA:232,0
DA:235,0
DA:238,0
DA:241,0
DA:244,0
DA:247,0
DA:250,0
DA:253,0
DA:256,0
DA:260,0
DA:263,0
DA:266,0
DA:269,0
DA:272,0
DA:275,0
DA:278,0
DA:280,0
DA:283,0
DA:286,0
DA:289,0
DA:292,0
DA:295,0
DA:298,0
DA:301,0
DA:305,0
DA:308,0
DA:311,0
DA:314,0
DA:317,0
DA:320,0
DA:323,0
DA:326,0
DA:329,0
DA:332,0
DA:335,0
DA:338,0
DA:340,0
DA:343,0
DA:346,0
DA:349,0
DA:352,0
DA:355,0
DA:358,0
DA:361,0
DA:364,0
DA:368,0
DA:371,0
DA:375,0
DA:378,0
DA:381,0
DA:384,0
DA:387,0
DA:390,0
DA:393,0
DA:396,0
DA:399,0
DA:402,0
DA:405,0
DA:408,0
DA:411,0
DA:414,0
DA:417,0
DA:420,0
DA:423,0
DA:425,0
DA:428,0
DA:431,0
DA:434,0
DA:437,0
DA:440,0
DA:443,0
DA:446,0
DA:449,0
DA:452,0
DA:455,0
DA:458,0
DA:461,0
DA:464,0
DA:467,0
DA:471,0
DA:475,0
DA:478,0
DA:481,0
DA:484,0
DA:487,0
DA:490,0
DA:493,0
DA:496,0
DA:499,0
DA:502,0
DA:505,0
DA:508,0
DA:511,0
DA:514,0
DA:517,0
DA:520,0
DA:523,0
DA:526,0
DA:529,0
DA:532,0
DA:535,0
DA:538,0
DA:541,0
DA:544,0
DA:547,0
DA:551,0
DA:554,0
DA:557,0
DA:560,0
DA:563,0
DA:566,0
DA:569,0
DA:572,0
DA:575,0
DA:578,0
DA:582,0
DA:585,0
DA:587,0
DA:590,0
DA:594,0
DA:596,0
DA:599,0
DA:602,0
DA:605,0
DA:608,0
DA:611,0
DA:614,0
DA:617,0
DA:620,0
DA:623,0
DA:626,0
DA:629,0
DA:631,0
DA:634,0
DA:637,0
DA:640,0
DA:643,0
DA:646,0
DA:649,0
DA:653,0
DA:656,0
DA:659,0
DA:662,0
DA:666,0
DA:669,0
DA:672,0
DA:675,0
DA:678,0
DA:681,0
DA:684,0
DA:687,0
DA:690,0
DA:693,0
DA:696,0
DA:700,0
DA:703,0
DA:706,0
DA:709,0
DA:712,0
DA:715,0
DA:718,0
DA:721,0
DA:724,0
DA:727,0
DA:730,0
DA:733,0
DA:737,0
DA:740,0
DA:743,0
DA:746,0
DA:749,0
DA:752,0
DA:755,0
DA:758,0
DA:761,0
DA:764,0
DA:768,0
LF:249
LH:0
end_of_record
SF:lib/generated/l10n/l10n_nl.dart
DA:9,0
DA:11,0
DA:15,0
DA:18,0
DA:22,0
DA:25,0
DA:28,0
DA:31,0
DA:35,0
DA:39,0
DA:42,0
DA:45,0
DA:48,0
DA:52,0
DA:55,0
DA:58,0
DA:62,0
DA:65,0
DA:68,0
DA:71,0
DA:74,0
DA:77,0
DA:80,0
DA:83,0
DA:87,0
DA:90,0
DA:93,0
DA:97,0
DA:100,0
DA:103,0
DA:107,0
DA:110,0
DA:113,0
DA:117,0
DA:120,0
DA:123,0
DA:127,0
DA:130,0
DA:133,0
DA:136,0
DA:139,0
DA:143,0
DA:146,0
DA:149,0
DA:152,0
DA:155,0
DA:158,0
DA:161,0
DA:163,0
DA:166,0
DA:170,0
DA:172,0
DA:175,0
DA:178,0
DA:183,0
DA:186,0
DA:188,0
DA:191,0
DA:194,0
DA:198,0
DA:201,0
DA:204,0
DA:208,0
DA:211,0
DA:214,0
DA:217,0
DA:220,0
DA:223,0
DA:226,0
DA:230,0
DA:233,0
DA:237,0
DA:239,0
DA:242,0
DA:245,0
DA:248,0
DA:251,0
DA:254,0
DA:257,0
DA:260,0
DA:263,0
DA:267,0
DA:270,0
DA:273,0
DA:276,0
DA:279,0
DA:282,0
DA:285,0
DA:287,0
DA:290,0
DA:293,0
DA:296,0
DA:299,0
DA:302,0
DA:305,0
DA:308,0
DA:312,0
DA:315,0
DA:318,0
DA:321,0
DA:324,0
DA:328,0
DA:331,0
DA:334,0
DA:338,0
DA:341,0
DA:344,0
DA:347,0
DA:349,0
DA:352,0
DA:355,0
DA:358,0
DA:361,0
DA:364,0
DA:367,0
DA:370,0
DA:373,0
DA:377,0
DA:380,0
DA:384,0
DA:387,0
DA:390,0
DA:393,0
DA:396,0
DA:399,0
DA:402,0
DA:406,0
DA:409,0
DA:412,0
DA:415,0
DA:418,0
DA:421,0
DA:425,0
DA:428,0
DA:432,0
DA:436,0
DA:438,0
DA:441,0
DA:444,0
DA:447,0
DA:450,0
DA:454,0
DA:457,0
DA:460,0
DA:463,0
DA:467,0
DA:470,0
DA:473,0
DA:476,0
DA:479,0
DA:482,0
DA:486,0
DA:490,0
DA:494,0
DA:497,0
DA:500,0
DA:503,0
DA:507,0
DA:510,0
DA:513,0
DA:516,0
DA:519,0
DA:522,0
DA:525,0
DA:528,0
DA:531,0
DA:534,0
DA:537,0
DA:540,0
DA:543,0
DA:546,0
DA:549,0
DA:552,0
DA:555,0
DA:558,0
DA:561,0
DA:564,0
DA:568,0
DA:572,0
DA:575,0
DA:578,0
DA:581,0
DA:584,0
DA:587,0
DA:590,0
DA:593,0
DA:596,0
DA:600,0
DA:603,0
DA:605,0
DA:608,0
DA:612,0
DA:614,0
DA:617,0
DA:621,0
DA:624,0
DA:627,0
DA:630,0
DA:633,0
DA:636,0
DA:639,0
DA:643,0
DA:646,0
DA:650,0
DA:652,0
DA:655,0
DA:658,0
DA:662,0
DA:665,0
DA:668,0
DA:671,0
DA:675,0
DA:678,0
DA:681,0
DA:684,0
DA:688,0
DA:691,0
DA:694,0
DA:697,0
DA:700,0
DA:703,0
DA:706,0
DA:709,0
DA:712,0
DA:715,0
DA:718,0
DA:722,0
DA:726,0
DA:729,0
DA:732,0
DA:735,0
DA:738,0
DA:742,0
DA:745,0
DA:748,0
DA:751,0
DA:754,0
DA:757,0
DA:761,0
DA:764,0
DA:767,0
DA:771,0
DA:774,0
DA:777,0
DA:780,0
DA:783,0
DA:787,0
DA:790,0
DA:794,0
LF:249
LH:0
end_of_record
SF:lib/generated/l10n/l10n_pt.dart
DA:9,0
DA:11,0
DA:14,0
DA:17,0
DA:21,0
DA:24,0
DA:27,0
DA:30,0
DA:34,0
DA:38,0
DA:41,0
DA:44,0
DA:48,0
DA:52,0
DA:56,0
DA:59,0
DA:63,0
DA:66,0
DA:69,0
DA:72,0
DA:75,0
DA:78,0
DA:81,0
DA:84,0
DA:88,0
DA:91,0
DA:94,0
DA:97,0
DA:100,0
DA:103,0
DA:107,0
DA:110,0
DA:113,0
DA:117,0
DA:120,0
DA:123,0
DA:127,0
DA:130,0
DA:133,0
DA:136,0
DA:139,0
DA:143,0
DA:146,0
DA:149,0
DA:152,0
DA:155,0
DA:158,0
DA:161,0
DA:163,0
DA:166,0
DA:170,0
DA:172,0
DA:175,0
DA:178,0
DA:183,0
DA:186,0
DA:188,0
DA:191,0
DA:194,0
DA:198,0
DA:201,0
DA:204,0
DA:208,0
DA:211,0
DA:214,0
DA:217,0
DA:220,0
DA:223,0
DA:226,0
DA:230,0
DA:233,0
DA:237,0
DA:239,0
DA:242,0
DA:245,0
DA:248,0
DA:251,0
DA:254,0
DA:257,0
DA:260,0
DA:263,0
DA:267,0
DA:270,0
DA:273,0
DA:276,0
DA:279,0
DA:283,0
DA:286,0
DA:288,0
DA:291,0
DA:294,0
DA:297,0
DA:300,0
DA:303,0
DA:306,0
DA:309,0
DA:313,0
DA:316,0
DA:319,0
DA:322,0
DA:325,0
DA:328,0
DA:331,0
DA:334,0
DA:338,0
DA:341,0
DA:344,0
DA:347,0
DA:349,0
DA:352,0
DA:355,0
DA:358,0
DA:362,0
DA:365,0
DA:368,0
DA:371,0
DA:374,0
DA:378,0
DA:381,0
DA:385,0
DA:388,0
DA:391,0
DA:394,0
DA:397,0
DA:400,0
DA:403,0
DA:407,0
DA:410,0
DA:413,0
DA:416,0
DA:419,0
DA:422,0
DA:426,0
DA:429,0
DA:433,0
DA:437,0
DA:439,0
DA:442,0
DA:445,0
DA:448,0
DA:451,0
DA:455,0
DA:458,0
DA:461,0
DA:464,0
DA:467,0
DA:470,0
DA:473,0
DA:476,0
DA:479,0
DA:482,0
DA:486,0
DA:490,0
DA:494,0
DA:497,0
DA:500,0
DA:503,0
DA:506,0
DA:509,0
DA:512,0
DA:515,0
DA:518,0
DA:521,0
DA:524,0
DA:527,0
DA:530,0
DA:533,0
DA:536,0
DA:539,0
DA:542,0
DA:545,0
DA:548,0
DA:551,0
DA:555,0
DA:558,0
DA:561,0
DA:564,0
DA:568,0
DA:571,0
DA:574,0
DA:577,0
DA:580,0
DA:583,0
DA:586,0
DA:589,0
DA:592,0
DA:595,0
DA:599,0
DA:602,0
DA:604,0
DA:607,0
DA:611,0
DA:613,0
DA:616,0
DA:620,0
DA:623,0
DA:626,0
DA:629,0
DA:632,0
DA:635,0
DA:638,0
DA:641,0
DA:644,0
DA:648,0
DA:650,0
DA:653,0
DA:656,0
DA:660,0
DA:663,0
DA:666,0
DA:669,0
DA:673,0
DA:676,0
DA:679,0
DA:682,0
DA:686,0
DA:689,0
DA:692,0
DA:695,0
DA:698,0
DA:701,0
DA:704,0
DA:707,0
DA:710,0
DA:713,0
DA:716,0
DA:720,0
DA:724,0
DA:727,0
DA:730,0
DA:733,0
DA:736,0
DA:740,0
DA:743,0
DA:746,0
DA:749,0
DA:752,0
DA:755,0
DA:759,0
DA:762,0
DA:765,0
DA:768,0
DA:771,0
DA:774,0
DA:777,0
DA:780,0
DA:784,0
DA:787,0
DA:791,0
LF:249
LH:0
end_of_record
SF:lib/generated/l10n/l10n_ru.dart
DA:9,0
DA:11,0
DA:14,0
DA:17,0
DA:21,0
DA:24,0
DA:27,0
DA:30,0
DA:34,0
DA:38,0
DA:41,0
DA:44,0
DA:48,0
DA:52,0
DA:56,0
DA:59,0
DA:63,0
DA:66,0
DA:69,0
DA:72,0
DA:75,0
DA:78,0
DA:81,0
DA:84,0
DA:88,0
DA:91,0
DA:94,0
DA:97,0
DA:100,0
DA:103,0
DA:107,0
DA:110,0
DA:113,0
DA:117,0
DA:120,0
DA:123,0
DA:127,0
DA:130,0
DA:133,0
DA:136,0
DA:139,0
DA:143,0
DA:146,0
DA:149,0
DA:152,0
DA:155,0
DA:158,0
DA:161,0
DA:163,0
DA:166,0
DA:170,0
DA:172,0
DA:175,0
DA:178,0
DA:183,0
DA:186,0
DA:188,0
DA:191,0
DA:194,0
DA:198,0
DA:201,0
DA:204,0
DA:208,0
DA:211,0
DA:214,0
DA:217,0
DA:220,0
DA:223,0
DA:226,0
DA:230,0
DA:233,0
DA:237,0
DA:239,0
DA:242,0
DA:245,0
DA:248,0
DA:251,0
DA:254,0
DA:257,0
DA:260,0
DA:263,0
DA:267,0
DA:270,0
DA:273,0
DA:276,0
DA:279,0
DA:282,0
DA:285,0
DA:287,0
DA:290,0
DA:293,0
DA:296,0
DA:299,0
DA:302,0
DA:305,0
DA:308,0
DA:312,0
DA:315,0
DA:318,0
DA:321,0
DA:324,0
DA:328,0
DA:331,0
DA:334,0
DA:338,0
DA:341,0
DA:344,0
DA:347,0
DA:349,0
DA:352,0
DA:355,0
DA:358,0
DA:362,0
DA:366,0
DA:369,0
DA:372,0
DA:375,0
DA:379,0
DA:382,0
DA:386,0
DA:389,0
DA:392,0
DA:395,0
DA:398,0
DA:401,0
DA:404,0
DA:408,0
DA:411,0
DA:414,0
DA:417,0
DA:420,0
DA:423,0
DA:427,0
DA:430,0
DA:434,0
DA:438,0
DA:440,0
DA:443,0
DA:446,0
DA:449,0
DA:452,0
DA:456,0
DA:459,0
DA:462,0
DA:465,0
DA:468,0
DA:471,0
DA:474,0
DA:477,0
DA:480,0
DA:483,0
DA:487,0
DA:491,0
DA:495,0
DA:498,0
DA:501,0
DA:504,0
DA:508,0
DA:511,0
DA:514,0
DA:517,0
DA:520,0
DA:523,0
DA:526,0
DA:529,0
DA:532,0
DA:535,0
DA:538,0
DA:541,0
DA:544,0
DA:547,0
DA:550,0
DA:553,0
DA:557,0
DA:560,0
DA:563,0
DA:566,0
DA:570,0
DA:574,0
DA:577,0
DA:580,0
DA:583,0
DA:586,0
DA:589,0
DA:592,0
DA:595,0
DA:598,0
DA:602,0
DA:605,0
DA:607,0
DA:610,0
DA:614,0
DA:616,0
DA:619,0
DA:623,0
DA:626,0
DA:629,0
DA:632,0
DA:635,0
DA:638,0
DA:641,0
DA:644,0
DA:647,0
DA:651,0
DA:653,0
DA:656,0
DA:659,0
DA:663,0
DA:666,0
DA:669,0
DA:672,0
DA:676,0
DA:679,0
DA:682,0
DA:685,0
DA:689,0
DA:692,0
DA:695,0
DA:698,0
DA:701,0
DA:704,0
DA:707,0
DA:710,0
DA:713,0
DA:716,0
DA:719,0
DA:723,0
DA:727,0
DA:730,0
DA:733,0
DA:736,0
DA:739,0
DA:743,0
DA:746,0
DA:749,0
DA:752,0
DA:755,0
DA:758,0
DA:762,0
DA:765,0
DA:768,0
DA:771,0
DA:774,0
DA:777,0
DA:780,0
DA:783,0
DA:787,0
DA:790,0
DA:794,0
LF:249
LH:0
end_of_record
SF:lib/generated/l10n/l10n_tr.dart
DA:9,0
DA:11,0
DA:14,0
DA:17,0
DA:21,0
DA:24,0
DA:27,0
DA:30,0
DA:34,0
DA:38,0
DA:41,0
DA:44,0
DA:47,0
DA:51,0
DA:54,0
DA:57,0
DA:61,0
DA:64,0
DA:67,0
DA:70,0
DA:73,0
DA:76,0
DA:79,0
DA:82,0
DA:86,0
DA:89,0
DA:92,0
DA:96,0
DA:99,0
DA:102,0
DA:106,0
DA:109,0
DA:112,0
DA:116,0
DA:119,0
DA:122,0
DA:126,0
DA:129,0
DA:132,0
DA:135,0
DA:138,0
DA:142,0
DA:145,0
DA:148,0
DA:151,0
DA:154,0
DA:157,0
DA:160,0
DA:162,0
DA:165,0
DA:169,0
DA:171,0
DA:174,0
DA:177,0
DA:182,0
DA:185,0
DA:187,0
DA:190,0
DA:193,0
DA:197,0
DA:200,0
DA:203,0
DA:207,0
DA:210,0
DA:213,0
DA:216,0
DA:219,0
DA:222,0
DA:225,0
DA:229,0
DA:232,0
DA:236,0
DA:238,0
DA:241,0
DA:244,0
DA:247,0
DA:250,0
DA:253,0
DA:256,0
DA:259,0
DA:262,0
DA:266,0
DA:269,0
DA:272,0
DA:275,0
DA:278,0
DA:281,0
DA:284,0
DA:286,0
DA:289,0
DA:292,0
DA:295,0
DA:298,0
DA:301,0
DA:304,0
DA:307,0
DA:311,0
DA:314,0
DA:317,0
DA:320,0
DA:323,0
DA:327,0
DA:330,0
DA:333,0
DA:337,0
DA:340,0
DA:343,0
DA:346,0
DA:348,0
DA:351,0
DA:354,0
DA:357,0
DA:360,0
DA:363,0
DA:366,0
DA:369,0
DA:372,0
DA:376,0
DA:379,0
DA:383,0
DA:386,0
DA:389,0
DA:392,0
DA:395,0
DA:398,0
DA:401,0
DA:405,0
DA:408,0
DA:411,0
DA:414,0
DA:417,0
DA:420,0
DA:424,0
DA:427,0
DA:431,0
DA:435,0
DA:437,0
DA:440,0
DA:443,0
DA:446,0
DA:449,0
DA:453,0
DA:456,0
DA:459,0
DA:462,0
DA:465,0
DA:468,0
DA:471,0
DA:474,0
DA:477,0
DA:480,0
DA:484,0
DA:488,0
DA:492,0
DA:495,0
DA:498,0
DA:501,0
DA:505,0
DA:508,0
DA:511,0
DA:514,0
DA:517,0
DA:520,0
DA:523,0
DA:526,0
DA:529,0
DA:532,0
DA:535,0
DA:538,0
DA:541,0
DA:544,0
DA:547,0
DA:550,0
DA:553,0
DA:556,0
DA:559,0
DA:562,0
DA:566,0
DA:570,0
DA:573,0
DA:576,0
DA:579,0
DA:582,0
DA:585,0
DA:588,0
DA:591,0
DA:594,0
DA:598,0
DA:601,0
DA:603,0
DA:606,0
DA:610,0
DA:612,0
DA:615,0
DA:618,0
DA:621,0
DA:624,0
DA:627,0
DA:630,0
DA:633,0
DA:636,0
DA:640,0
DA:643,0
DA:647,0
DA:649,0
DA:652,0
DA:655,0
DA:659,0
DA:662,0
DA:665,0
DA:668,0
DA:672,0
DA:675,0
DA:678,0
DA:681,0
DA:685,0
DA:688,0
DA:691,0
DA:694,0
DA:697,0
DA:700,0
DA:703,0
DA:706,0
DA:709,0
DA:712,0
DA:715,0
DA:719,0
DA:722,0
DA:725,0
DA:728,0
DA:731,0
DA:734,0
DA:738,0
DA:741,0
DA:744,0
DA:747,0
DA:750,0
DA:753,0
DA:757,0
DA:760,0
DA:763,0
DA:766,0
DA:769,0
DA:772,0
DA:775,0
DA:778,0
DA:782,0
DA:785,0
DA:789,0
LF:249
LH:0
end_of_record
SF:lib/generated/l10n/l10n_uk.dart
DA:9,0
DA:11,0
DA:14,0
DA:17,0
DA:21,0
DA:24,0
DA:27,0
DA:30,0
DA:34,0
DA:38,0
DA:41,0
DA:44,0
DA:48,0
DA:52,0
DA:56,0
DA:59,0
DA:63,0
DA:66,0
DA:69,0
DA:72,0
DA:75,0
DA:78,0
DA:81,0
DA:84,0
DA:88,0
DA:91,0
DA:94,0
DA:98,0
DA:101,0
DA:104,0
DA:108,0
DA:111,0
DA:114,0
DA:118,0
DA:121,0
DA:124,0
DA:128,0
DA:131,0
DA:134,0
DA:137,0
DA:140,0
DA:144,0
DA:147,0
DA:150,0
DA:153,0
DA:156,0
DA:159,0
DA:162,0
DA:164,0
DA:167,0
DA:171,0
DA:173,0
DA:176,0
DA:179,0
DA:184,0
DA:187,0
DA:189,0
DA:192,0
DA:195,0
DA:199,0
DA:202,0
DA:205,0
DA:209,0
DA:212,0
DA:215,0
DA:218,0
DA:221,0
DA:224,0
DA:227,0
DA:231,0
DA:234,0
DA:238,0
DA:240,0
DA:243,0
DA:246,0
DA:249,0
DA:252,0
DA:255,0
DA:258,0
DA:261,0
DA:264,0
DA:268,0
DA:271,0
DA:274,0
DA:277,0
DA:280,0
DA:284,0
DA:287,0
DA:289,0
DA:292,0
DA:295,0
DA:298,0
DA:301,0
DA:304,0
DA:307,0
DA:310,0
DA:314,0
DA:317,0
DA:320,0
DA:323,0
DA:326,0
DA:330,0
DA:333,0
DA:336,0
DA:340,0
DA:343,0
DA:346,0
DA:349,0
DA:351,0
DA:354,0
DA:357,0
DA:360,0
DA:364,0
DA:368,0
DA:371,0
DA:374,0
DA:377,0
DA:381,0
DA:384,0
DA:388,0
DA:391,0
DA:394,0
DA:397,0
DA:400,0
DA:403,0
DA:406,0
DA:410,0
DA:413,0
DA:416,0
DA:419,0
DA:422,0
DA:425,0
DA:429,0
DA:432,0
DA:436,0
DA:440,0
DA:442,0
DA:445,0
DA:448,0
DA:451,0
DA:454,0
DA:458,0
DA:461,0
DA:464,0
DA:467,0
DA:470,0
DA:473,0
DA:476,0
DA:479,0
DA:482,0
DA:485,0
DA:489,0
DA:493,0
DA:497,0
DA:500,0
DA:503,0
DA:506,0
DA:510,0
DA:513,0
DA:516,0
DA:519,0
DA:522,0
DA:525,0
DA:528,0
DA:531,0
DA:534,0
DA:537,0
DA:540,0
DA:543,0
DA:546,0
DA:549,0
DA:552,0
DA:555,0
DA:558,0
DA:561,0
DA:564,0
DA:567,0
DA:571,0
DA:575,0
DA:578,0
DA:581,0
DA:584,0
DA:587,0
DA:590,0
DA:593,0
DA:596,0
DA:599,0
DA:603,0
DA:606,0
DA:608,0
DA:611,0
DA:615,0
DA:617,0
DA:620,0
DA:624,0
DA:627,0
DA:630,0
DA:633,0
DA:636,0
DA:639,0
DA:642,0
DA:645,0
DA:648,0
DA:652,0
DA:654,0
DA:657,0
DA:660,0
DA:664,0
DA:667,0
DA:670,0
DA:673,0
DA:677,0
DA:680,0
DA:683,0
DA:686,0
DA:690,0
DA:693,0
DA:696,0
DA:699,0
DA:702,0
DA:705,0
DA:708,0
DA:711,0
DA:714,0
DA:717,0
DA:720,0
DA:724,0
DA:727,0
DA:730,0
DA:733,0
DA:736,0
DA:739,0
DA:743,0
DA:746,0
DA:749,0
DA:752,0
DA:755,0
DA:758,0
DA:762,0
DA:765,0
DA:768,0
DA:772,0
DA:775,0
DA:778,0
DA:781,0
DA:784,0
DA:788,0
DA:791,0
DA:795,0
LF:249
LH:0
end_of_record
SF:lib/generated/l10n/l10n_zh.dart
DA:9,0
DA:11,0
DA:14,0
DA:17,0
DA:20,0
DA:23,0
DA:26,0
DA:29,0
DA:32,0
DA:35,0
DA:38,0
DA:41,0
DA:44,0
DA:47,0
DA:50,0
DA:53,0
DA:56,0
DA:59,0
DA:62,0
DA:65,0
DA:68,0
DA:71,0
DA:74,0
DA:77,0
DA:81,0
DA:84,0
DA:87,0
DA:90,0
DA:93,0
DA:96,0
DA:100,0
DA:103,0
DA:106,0
DA:109,0
DA:112,0
DA:115,0
DA:119,0
DA:122,0
DA:125,0
DA:128,0
DA:131,0
DA:134,0
DA:137,0
DA:140,0
DA:143,0
DA:146,0
DA:149,0
DA:152,0
DA:154,0
DA:157,0
DA:161,0
DA:163,0
DA:166,0
DA:169,0
DA:174,0
DA:177,0
DA:179,0
DA:182,0
DA:185,0
DA:188,0
DA:191,0
DA:194,0
DA:197,0
DA:200,0
DA:203,0
DA:206,0
DA:209,0
DA:212,0
DA:215,0
DA:218,0
DA:221,0
DA:225,0
DA:227,0
DA:230,0
DA:233,0
DA:236,0
DA:239,0
DA:242,0
DA:245,0
DA:248,0
DA:251,0
DA:254,0
DA:257,0
DA:260,0
DA:263,0
DA:266,0
DA:269,0
DA:272,0
DA:274,0
DA:277,0
DA:280,0
DA:283,0
DA:286,0
DA:289,0
DA:292,0
DA:295,0
DA:299,0
DA:302,0
DA:305,0
DA:308,0
DA:311,0
DA:314,0
DA:317,0
DA:320,0
DA:323,0
DA:326,0
DA:329,0
DA:332,0
DA:334,0
DA:337,0
DA:340,0
DA:343,0
DA:346,0
DA:349,0
DA:352,0
DA:355,0
DA:358,0
DA:362,0
DA:365,0
DA:369,0
DA:372,0
DA:375,0
DA:378,0
DA:381,0
DA:384,0
DA:387,0
DA:390,0
DA:393,0
DA:396,0
DA:399,0
DA:402,0
DA:405,0
DA:408,0
DA:411,0
DA:414,0
DA:417,0
DA:419,0
DA:422,0
DA:425,0
DA:428,0
DA:431,0
DA:434,0
DA:437,0
DA:440,0
DA:443,0
DA:446,0
DA:449,0
DA:452,0
DA:455,0
DA:458,0
DA:461,0
DA:464,0
DA:467,0
DA:470,0
DA:473,0
DA:476,0
DA:479,0
DA:482,0
DA:485,0
DA:488,0
DA:491,0
DA:494,0
DA:497,0
DA:500,0
DA:503,0
DA:506,0
DA:509,0
DA:512,0
DA:515,0
DA:518,0
DA:521,0
DA:524,0
DA:527,0
DA:530,0
DA:533,0
DA:536,0
DA:539,0
DA:543,0
DA:546,0
DA:549,0
DA:552,0
DA:555,0
DA:558,0
DA:561,0
DA:564,0
DA:567,0
DA:570,0
DA:573,0
DA:576,0
DA:578,0
DA:581,0
DA:585,0
DA:587,0
DA:590,0
DA:593,0
DA:596,0
DA:599,0
DA:602,0
DA:605,0
DA:608,0
DA:611,0
DA:614,0
DA:617,0
DA:620,0
DA:622,0
DA:625,0
DA:628,0
DA:631,0
DA:634,0
DA:637,0
DA:640,0
DA:643,0
DA:646,0
DA:649,0
DA:652,0
DA:655,0
DA:658,0
DA:661,0
DA:664,0
DA:667,0
DA:670,0
DA:673,0
DA:676,0
DA:679,0
DA:682,0
DA:685,0
DA:688,0
DA:691,0
DA:694,0
DA:697,0
DA:700,0
DA:703,0
DA:706,0
DA:709,0
DA:712,0
DA:715,0
DA:718,0
DA:721,0
DA:724,0
DA:727,0
DA:730,0
DA:733,0
DA:736,0
DA:739,0
DA:742,0
DA:745,0
DA:748,0
DA:751,0
DA:754,0
DA:761,0
DA:763,0
DA:766,0
DA:769,0
DA:772,0
DA:775,0
DA:778,0
DA:781,0
DA:784,0
DA:787,0
DA:790,0
DA:793,0
DA:796,0
DA:799,0
DA:802,0
DA:805,0
DA:808,0
DA:811,0
DA:814,0
DA:817,0
DA:820,0
DA:823,0
DA:826,0
DA:829,0
DA:833,0
DA:836,0
DA:839,0
DA:842,0
DA:845,0
DA:848,0
DA:852,0
DA:855,0
DA:858,0
DA:861,0
DA:864,0
DA:867,0
DA:871,0
DA:874,0
DA:877,0
DA:880,0
DA:883,0
DA:886,0
DA:889,0
DA:892,0
DA:895,0
DA:898,0
DA:901,0
DA:904,0
DA:906,0
DA:909,0
DA:913,0
DA:915,0
DA:918,0
DA:921,0
DA:926,0
DA:929,0
DA:931,0
DA:934,0
DA:937,0
DA:940,0
DA:943,0
DA:946,0
DA:949,0
DA:952,0
DA:955,0
DA:958,0
DA:961,0
DA:964,0
DA:967,0
DA:970,0
DA:973,0
DA:977,0
DA:979,0
DA:982,0
DA:985,0
DA:988,0
DA:991,0
DA:994,0
DA:997,0
DA:1000,0
DA:1003,0
DA:1006,0
DA:1009,0
DA:1012,0
DA:1015,0
DA:1018,0
DA:1021,0
DA:1024,0
DA:1026,0
DA:1029,0
DA:1032,0
DA:1035,0
DA:1038,0
DA:1041,0
DA:1044,0
DA:1047,0
DA:1051,0
DA:1054,0
DA:1057,0
DA:1060,0
DA:1063,0
DA:1066,0
DA:1069,0
DA:1072,0
DA:1075,0
DA:1078,0
DA:1081,0
DA:1084,0
DA:1086,0
DA:1089,0
DA:1092,0
DA:1095,0
DA:1098,0
DA:1101,0
DA:1104,0
DA:1107,0
DA:1110,0
DA:1114,0
DA:1117,0
DA:1121,0
DA:1124,0
DA:1127,0
DA:1130,0
DA:1133,0
DA:1136,0
DA:1139,0
DA:1142,0
DA:1145,0
DA:1148,0
DA:1151,0
DA:1154,0
DA:1157,0
DA:1160,0
DA:1163,0
DA:1166,0
DA:1169,0
DA:1171,0
DA:1174,0
DA:1177,0
DA:1180,0
DA:1183,0
DA:1186,0
DA:1189,0
DA:1192,0
DA:1195,0
DA:1198,0
DA:1201,0
DA:1204,0
DA:1207,0
DA:1210,0
DA:1213,0
DA:1216,0
DA:1219,0
DA:1222,0
DA:1225,0
DA:1228,0
DA:1231,0
DA:1234,0
DA:1237,0
DA:1240,0
DA:1243,0
DA:1246,0
DA:1249,0
DA:1252,0
DA:1255,0
DA:1258,0
DA:1261,0
DA:1264,0
DA:1267,0
DA:1270,0
DA:1273,0
DA:1276,0
DA:1279,0
DA:1282,0
DA:1285,0
DA:1288,0
DA:1291,0
DA:1295,0
DA:1298,0
DA:1301,0
DA:1304,0
DA:1307,0
DA:1310,0
DA:1313,0
DA:1316,0
DA:1319,0
DA:1322,0
DA:1325,0
DA:1328,0
DA:1330,0
DA:1333,0
DA:1337,0
DA:1339,0
DA:1342,0
DA:1345,0
DA:1348,0
DA:1351,0
DA:1354,0
DA:1357,0
DA:1360,0
DA:1363,0
DA:1366,0
DA:1369,0
DA:1372,0
DA:1374,0
DA:1377,0
DA:1380,0
DA:1383,0
DA:1386,0
DA:1389,0
DA:1392,0
DA:1395,0
DA:1398,0
DA:1401,0
DA:1404,0
DA:1407,0
DA:1410,0
DA:1413,0
DA:1416,0
DA:1419,0
DA:1422,0
DA:1425,0
DA:1428,0
DA:1431,0
DA:1434,0
DA:1437,0
DA:1440,0
DA:1443,0
DA:1446,0
DA:1449,0
DA:1452,0
DA:1455,0
DA:1458,0
DA:1461,0
DA:1464,0
DA:1467,0
DA:1470,0
DA:1473,0
DA:1476,0
DA:1479,0
DA:1482,0
DA:1485,0
DA:1488,0
DA:1491,0
DA:1494,0
DA:1497,0
DA:1500,0
DA:1503,0
DA:1506,0
LF:498
LH:0
end_of_record
SF:lib/data/model/server/proc.dart
DA:18,1
DA:47,1
DA:61,1
DA:62,2
DA:63,1
DA:64,3
DA:65,3
DA:66,1
DA:67,1
DA:68,3
DA:69,1
DA:70,1
DA:71,3
DA:72,1
DA:73,1
DA:74,3
DA:78,0
DA:79,0
DA:80,0
DA:81,0
DA:82,0
DA:83,0
DA:84,0
DA:85,0
DA:86,0
DA:87,0
DA:88,0
DA:89,0
DA:90,0
DA:94,0
DA:96,0
DA:99,0
DA:100,0
DA:101,0
DA:110,2
DA:112,1
DA:113,5
DA:114,1
DA:116,1
DA:117,2
DA:118,3
DA:119,1
DA:120,1
DA:121,1
DA:122,1
DA:123,1
DA:124,1
DA:125,1
DA:126,1
DA:127,1
DA:128,1
DA:129,1
DA:130,1
DA:133,1
DA:134,1
DA:135,3
DA:136,1
DA:137,1
DA:139,2
DA:141,0
DA:142,0
DA:147,1
DA:148,1
DA:150,0
DA:151,0
DA:153,0
DA:154,0
DA:156,0
DA:157,0
DA:159,0
DA:160,0
DA:163,2
DA:170,1
DA:171,1
DA:172,2
LF:75
LH:47
end_of_record


================================================
FILE: devtools_options.yaml
================================================
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:


================================================
FILE: docs/.gitignore
================================================
# build output
dist/
# generated types
.astro/

# dependencies
node_modules/

# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*


# environment variables
.env
.env.production

# macOS-specific files
.DS_Store


================================================
FILE: docs/.vscode/extensions.json
================================================
{
  "recommendations": ["astro-build.astro-vscode"],
  "unwantedRecommendations": []
}


================================================
FILE: docs/.vscode/launch.json
================================================
{
  "version": "0.2.0",
  "configurations": [
    {
      "command": "./node_modules/.bin/astro dev",
      "name": "Development server",
      "request": "launch",
      "type": "node-terminal"
    }
  ]
}


================================================
FILE: docs/README.md
================================================
# Starlight Starter Kit: Basics

[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build)

```
npm create astro@latest -- --template starlight
```

> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!

## 🚀 Project Structure

Inside of your Astro + Starlight project, you'll see the following folders and files:

```
.
├── public/
├── src/
│   ├── assets/
│   ├── content/
│   │   └── docs/
│   └── content.config.ts
├── astro.config.mjs
├── package.json
└── tsconfig.json
```

Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name.

Images can be added to `src/assets/` and embedded in Markdown with a relative link.

Static assets, like favicons, can be placed in the `public/` directory.

## 🧞 Commands

All commands are run from the root of the project, from a terminal:

| Command                   | Action                                           |
| :------------------------ | :----------------------------------------------- |
| `npm install`             | Installs dependencies                            |
| `npm run dev`             | Starts local dev server at `localhost:4321`      |
| `npm run build`           | Build your production site to `./dist/`          |
| `npm run preview`         | Preview your build locally, before deploying     |
| `npm run astro ...`       | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI                     |

## 👀 Want to learn more?

Check out [Starlight’s docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat).


================================================
FILE: docs/astro.config.mjs
================================================
// @ts-check
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';

// https://astro.build/config
export default defineConfig({
	integrations: [
		starlight({
			title: 'Server Box',
			description: 'A comprehensive cross-platform server management application built with Flutter',
			defaultLocale: 'root',
			locales: {
				root: {
					label: 'English',
					lang: 'en',
				},
				zh: {
					label: '简体中文',
					lang: 'zh',
				},
				de: {
					label: 'Deutsch',
					lang: 'de',
				},
				fr: {
					label: 'Français',
					lang: 'fr',
				},
				es: {
					label: 'Español',
					lang: 'es',
				},
				ja: {
					label: '日本語',
					lang: 'ja',
				},
			},
			logo: {
				src: './src/assets/logo.svg',
			},
			social: [
				{ icon: 'github', label: 'GitHub', href: 'https://github.com/lollipopkit/flutter_server_box' },
			],
			sidebar: [
				{
					label: 'Getting Started',
					translations: {
						zh: '开始使用',
						de: 'Erste Schritte',
						fr: 'Mise en route',
						es: 'Primeros pasos',
						ja: 'はじめに',
					},
					items: [
						{ label: 'Introduction', translations: { zh: '介绍', de: 'Einführung', fr: 'Introduction', es: 'Introducción', ja: 'はじめに' }, slug: 'introduction' },
						{ label: 'Installation', translations: { zh: '安装', de: 'Installation', fr: 'Installation', es: 'Instalación', ja: 'インストール' }, slug: 'installation' },
						{ label: 'Quick Start', translations: { zh: '快速开始', de: 'Schnellstart', fr: 'Démarrage rapide', es: 'Inicio rápido', ja: 'クイックスタート' }, slug: 'quick-start' },
					],
				},
				{
					label: 'Platform Features',
					translations: {
						zh: '平台特性',
						de: 'Plattformfunktionen',
						fr: 'Fonctionnalités de la plateforme',
						es: 'Características de la plataforma',
						ja: 'プラットフォーム機能',
					},
					items: [
						{ label: 'Mobile', translations: { zh: '移动端', de: 'Mobil', fr: 'Mobile', es: 'Móvil', ja: 'モバイル' }, slug: 'platforms/mobile' },
						{ label: 'Desktop', translations: { zh: '桌面端', de: 'Desktop', fr: 'Bureau', es: 'Escritorio', ja: 'デスクトップ' }, slug: 'platforms/desktop' },
					],
				},
				{
					label: 'Advanced',
					translations: {
						zh: '进阶',
						de: 'Fortgeschritten',
						fr: 'Avancé',
						es: 'Avanzado',
						ja: '高度な設定',
					},
					items: [
						{ label: 'Bulk Import Servers', translations: { zh: '批量导入服务器', de: 'Server-Massenimport', fr: 'Importation massive de serveurs', es: 'Importación masiva de servidores', ja: 'サーバーの一括インポート' }, slug: 'advanced/bulk-import' },
						{ label: 'Widget Setup', translations: { zh: '小组件设置', de: 'Widget-Einrichtung', fr: 'Configuration du widget', es: 'Configuración de widgets', ja: 'ウィジェット設定' }, slug: 'advanced/widgets' },
						{ label: 'Custom Commands', translations: { zh: '自定义命令', de: 'Benutzerdefinierte Befehle', fr: 'Commandes personnalisées', es: 'Comandos personalizados', ja: 'カスタムコマンド' }, slug: 'advanced/custom-commands' },
						{ label: 'Custom Logo', translations: { zh: '自定义 Logo', de: 'Benutzerdefiniertes Logo', fr: 'Logo personnalisé', es: 'Logo personalizado', ja: 'カスタムロゴ' }, slug: 'advanced/custom-logo' },
						{ label: 'JSON Settings', translations: { zh: 'JSON 设置', de: 'JSON-Einstellungen', fr: 'Paramètres JSON', es: 'Ajustes JSON', ja: 'JSON 設定' }, slug: 'advanced/json-settings' },
						{ label: 'Common Issues', translations: { zh: '常见问题', de: 'Häufige Probleme', fr: 'Problèmes courants', es: 'Problemas comunes', ja: 'よくある質問' }, slug: 'advanced/troubleshooting' },
					],
				},
				{
					label: 'How It Works',
					translations: {
						zh: '工作原理',
						de: 'Wie es funktioniert',
						fr: 'Comment ça marche',
						es: 'Cómo funciona',
						ja: '仕組み',
					},
					items: [
						{ label: 'Architecture', translations: { zh: '架构', de: 'Architektur', fr: 'Architecture', es: 'Arquitectura', ja: 'アーキテクチャ' }, slug: 'principles/architecture' },
						{ label: 'SSH Connection', translations: { zh: 'SSH 连接', de: 'SSH-Verbindung', fr: 'Connexion SSH', es: 'Conexión SSH', ja: 'SSH 接続' }, slug: 'principles/ssh' },
						{ label: 'Terminal', translations: { zh: '终端', de: 'Terminal', fr: 'Terminal', es: 'Terminal', ja: 'ターミナル' }, slug: 'principles/terminal' },
						{ label: 'SFTP', translations: { zh: 'SFTP', de: 'SFTP', fr: 'SFTP', es: 'SFTP', ja: 'SFTP' }, slug: 'principles/sftp' },
						{ label: 'State Management', translations: { zh: '状态管理', de: 'Zustandsverwaltung', fr: 'Gestion d\'état', es: 'Gestión de estado', ja: '状態管理' }, slug:
Download .txt
gitextract_qpo112k4/

├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── bug_report_cn.md
│   └── workflows/
│       ├── analysis.yml
│       └── release.yml
├── .gitignore
├── .gitmodules
├── .metadata
├── .vscode/
│   └── launch.json
├── CLAUDE.md
├── LICENSE
├── README.md
├── README_zh.md
├── analysis_options.yaml
├── android/
│   ├── .gitignore
│   ├── app/
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── kotlin/
│   │           │   └── tech/
│   │           │       └── lolli/
│   │           │           └── toolbox/
│   │           │               ├── ForegroundService.kt
│   │           │               ├── MainActivity.kt
│   │           │               └── widget/
│   │           │                   ├── HomeWidget.kt
│   │           │                   └── WidgetConfigureActivity.kt
│   │           └── res/
│   │               ├── drawable/
│   │               │   ├── launch_background.xml
│   │               │   ├── memory_24.xml
│   │               │   ├── net_24.xml
│   │               │   ├── settings_24.xml
│   │               │   ├── speed_24.xml
│   │               │   ├── storage_24.xml
│   │               │   └── widget_background.xml
│   │               ├── drawable-night/
│   │               │   └── launch_background.xml
│   │               ├── drawable-night-v21/
│   │               │   └── launch_background.xml
│   │               ├── drawable-v21/
│   │               │   └── launch_background.xml
│   │               ├── layout/
│   │               │   ├── home_widget.xml
│   │               │   └── widget_configure.xml
│   │               ├── mipmap-anydpi-v26/
│   │               │   ├── ic_launcher.xml
│   │               │   └── ic_launcher_round.xml
│   │               ├── values/
│   │               │   ├── colors.xml
│   │               │   ├── ic_launcher_background.xml
│   │               │   ├── strings.xml
│   │               │   └── styles.xml
│   │               ├── values-night/
│   │               │   ├── colors.xml
│   │               │   ├── ic_launcher_background.xml
│   │               │   └── styles.xml
│   │               └── xml/
│   │                   ├── backup_rules.xml
│   │                   └── home_widget.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   └── settings.gradle
├── coverage/
│   └── lcov.info
├── devtools_options.yaml
├── docs/
│   ├── .gitignore
│   ├── .vscode/
│   │   ├── extensions.json
│   │   └── launch.json
│   ├── README.md
│   ├── astro.config.mjs
│   ├── package.json
│   ├── src/
│   │   ├── content/
│   │   │   └── docs/
│   │   │       ├── advanced/
│   │   │       │   ├── bulk-import.md
│   │   │       │   ├── custom-commands.md
│   │   │       │   ├── custom-logo.md
│   │   │       │   ├── json-settings.md
│   │   │       │   ├── troubleshooting.md
│   │   │       │   └── widgets.md
│   │   │       ├── de/
│   │   │       │   ├── advanced/
│   │   │       │   │   ├── bulk-import.md
│   │   │       │   │   ├── custom-commands.md
│   │   │       │   │   ├── custom-logo.md
│   │   │       │   │   ├── json-settings.md
│   │   │       │   │   ├── troubleshooting.md
│   │   │       │   │   └── widgets.md
│   │   │       │   ├── development/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── building.md
│   │   │       │   │   ├── codegen.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   ├── structure.md
│   │   │       │   │   └── testing.md
│   │   │       │   ├── index.mdx
│   │   │       │   ├── installation.mdx
│   │   │       │   ├── introduction.mdx
│   │   │       │   ├── platforms/
│   │   │       │   │   ├── desktop.md
│   │   │       │   │   └── mobile.md
│   │   │       │   ├── principles/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── sftp.md
│   │   │       │   │   ├── ssh.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   └── terminal.md
│   │   │       │   └── quick-start.mdx
│   │   │       ├── development/
│   │   │       │   ├── architecture.md
│   │   │       │   ├── building.md
│   │   │       │   ├── codegen.md
│   │   │       │   ├── state.md
│   │   │       │   ├── structure.md
│   │   │       │   └── testing.md
│   │   │       ├── es/
│   │   │       │   ├── advanced/
│   │   │       │   │   ├── bulk-import.md
│   │   │       │   │   ├── custom-commands.md
│   │   │       │   │   ├── custom-logo.md
│   │   │       │   │   ├── json-settings.md
│   │   │       │   │   ├── troubleshooting.md
│   │   │       │   │   └── widgets.md
│   │   │       │   ├── development/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── building.md
│   │   │       │   │   ├── codegen.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   ├── structure.md
│   │   │       │   │   └── testing.md
│   │   │       │   ├── index.mdx
│   │   │       │   ├── installation.mdx
│   │   │       │   ├── introduction.mdx
│   │   │       │   ├── platforms/
│   │   │       │   │   ├── desktop.md
│   │   │       │   │   └── mobile.md
│   │   │       │   ├── principles/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── sftp.md
│   │   │       │   │   ├── ssh.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   └── terminal.md
│   │   │       │   └── quick-start.mdx
│   │   │       ├── fr/
│   │   │       │   ├── advanced/
│   │   │       │   │   ├── bulk-import.md
│   │   │       │   │   ├── custom-commands.md
│   │   │       │   │   ├── custom-logo.md
│   │   │       │   │   ├── json-settings.md
│   │   │       │   │   ├── troubleshooting.md
│   │   │       │   │   └── widgets.md
│   │   │       │   ├── development/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── building.md
│   │   │       │   │   ├── codegen.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   ├── structure.md
│   │   │       │   │   └── testing.md
│   │   │       │   ├── index.mdx
│   │   │       │   ├── installation.mdx
│   │   │       │   ├── introduction.mdx
│   │   │       │   ├── platforms/
│   │   │       │   │   ├── desktop.md
│   │   │       │   │   └── mobile.md
│   │   │       │   ├── principles/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── sftp.md
│   │   │       │   │   ├── ssh.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   └── terminal.md
│   │   │       │   └── quick-start.mdx
│   │   │       ├── index.mdx
│   │   │       ├── installation.mdx
│   │   │       ├── introduction.mdx
│   │   │       ├── ja/
│   │   │       │   ├── advanced/
│   │   │       │   │   ├── bulk-import.md
│   │   │       │   │   ├── custom-commands.md
│   │   │       │   │   ├── custom-logo.md
│   │   │       │   │   ├── json-settings.md
│   │   │       │   │   ├── troubleshooting.md
│   │   │       │   │   └── widgets.md
│   │   │       │   ├── development/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── building.md
│   │   │       │   │   ├── codegen.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   ├── structure.md
│   │   │       │   │   └── testing.md
│   │   │       │   ├── index.mdx
│   │   │       │   ├── installation.mdx
│   │   │       │   ├── introduction.mdx
│   │   │       │   ├── platforms/
│   │   │       │   │   ├── desktop.md
│   │   │       │   │   └── mobile.md
│   │   │       │   ├── principles/
│   │   │       │   │   ├── architecture.md
│   │   │       │   │   ├── sftp.md
│   │   │       │   │   ├── ssh.md
│   │   │       │   │   ├── state.md
│   │   │       │   │   └── terminal.md
│   │   │       │   └── quick-start.mdx
│   │   │       ├── platforms/
│   │   │       │   ├── desktop.md
│   │   │       │   └── mobile.md
│   │   │       ├── principles/
│   │   │       │   ├── architecture.md
│   │   │       │   ├── sftp.md
│   │   │       │   ├── ssh.md
│   │   │       │   ├── state.md
│   │   │       │   └── terminal.md
│   │   │       ├── quick-start.mdx
│   │   │       └── zh/
│   │   │           ├── advanced/
│   │   │           │   ├── bulk-import.md
│   │   │           │   ├── custom-commands.md
│   │   │           │   ├── custom-logo.md
│   │   │           │   ├── json-settings.md
│   │   │           │   ├── troubleshooting.md
│   │   │           │   └── widgets.md
│   │   │           ├── development/
│   │   │           │   ├── architecture.md
│   │   │           │   ├── building.md
│   │   │           │   ├── codegen.md
│   │   │           │   ├── state.md
│   │   │           │   ├── structure.md
│   │   │           │   └── testing.md
│   │   │           ├── index.mdx
│   │   │           ├── installation.mdx
│   │   │           ├── introduction.mdx
│   │   │           ├── platforms/
│   │   │           │   ├── desktop.md
│   │   │           │   └── mobile.md
│   │   │           ├── principles/
│   │   │           │   ├── architecture.md
│   │   │           │   ├── sftp.md
│   │   │           │   ├── ssh.md
│   │   │           │   ├── state.md
│   │   │           │   └── terminal.md
│   │   │           └── quick-start.mdx
│   │   ├── content.config.ts
│   │   └── styles/
│   │       └── custom.css
│   └── tsconfig.json
├── fastlane/
│   └── metadata/
│       └── android/
│           ├── en-US/
│           │   ├── full_description.txt
│           │   ├── short_description.txt
│           │   └── title.txt
│           ├── ru/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           └── zh-CN/
│               ├── full_description.txt
│               ├── short_description.txt
│               └── title.txt
├── fl_build.json
├── ios/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── AppFrameworkInfo.plist
│   │   ├── Debug.xcconfig
│   │   └── Release.xcconfig
│   ├── Podfile
│   ├── PrivacyInfo.xcprivacy
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   ├── Contents.json
│   │   │   ├── LaunchBackground.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── LaunchImage.imageset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── Main.storyboard
│   │   ├── Info-Debug.plist
│   │   ├── Info-Profile.plist
│   │   ├── Info-Release.plist
│   │   ├── LiveActivityManager.swift
│   │   ├── PrivacyInfo.xcprivacy
│   │   ├── Runner-Bridging-Header.h
│   │   ├── Runner.entitlements
│   │   ├── TerminalLiveActivityAttributes.swift
│   │   ├── Utils.swift
│   │   ├── de.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── en.lproj/
│   │   │   └── Localizable.strings
│   │   ├── es.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── fr.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── id.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── ja.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── pt-BR.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── ru.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   ├── zh-Hans.lproj/
│   │   │   ├── LaunchScreen.strings
│   │   │   ├── Localizable.strings
│   │   │   └── Main.strings
│   │   └── zh-Hant.lproj/
│   │       ├── LaunchScreen.strings
│   │       ├── Localizable.strings
│   │       └── Main.strings
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       ├── IDEWorkspaceChecks.plist
│   │   │       └── WorkspaceSettings.xcsettings
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           ├── Runner.xcscheme
│   │           ├── StatusWidgetExtension.xcscheme
│   │           └── WatchApp.xcscheme
│   ├── Runner.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   ├── StatusWidget/
│   │   ├── Base.lproj/
│   │   │   └── StatusWidget.intentdefinition
│   │   ├── Info.plist
│   │   ├── PrivacyInfo.xcprivacy
│   │   ├── StatusWidget.swift
│   │   ├── StatusWidgetBundle.swift
│   │   ├── TerminalLiveActivity.swift
│   │   ├── TerminalLiveActivityAttributes.swift
│   │   ├── de.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── en.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── es.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── fr.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── id.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── ja.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── pt-BR.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── ru.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   ├── zh-Hans.lproj/
│   │   │   ├── Localizable.strings
│   │   │   └── StatusWidget.strings
│   │   └── zh-Hant.lproj/
│   │       ├── Localizable.strings
│   │       └── StatusWidget.strings
│   ├── WatchApp/
│   │   ├── ContentView.swift
│   │   ├── PhoneConnMgr.swift
│   │   ├── PrivacyInfo.xcprivacy
│   │   ├── Store.swift
│   │   ├── Watch.xcassets/
│   │   │   ├── AccentColor.colorset/
│   │   │   │   └── Contents.json
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   └── Contents.json
│   │   └── WatchEndApp.swift
│   ├── WatchWidget/
│   │   ├── WatchStatusWidget.swift
│   │   └── WatchStatusWidgetBundle.swift
│   └── build/
│       └── Pods.build/
│           └── Release-iphonesimulator/
│               ├── Flutter.build/
│               │   └── dgph
│               ├── GZ-NMSSH.build/
│               │   └── dgph
│               ├── Pods-Runner.build/
│               │   └── dgph
│               ├── countly_flutter.build/
│               │   └── dgph
│               ├── path_provider.build/
│               │   └── dgph
│               ├── ssh2.build/
│               │   └── dgph
│               └── url_launcher.build/
│                   └── dgph
├── l10n.yaml
├── lib/
│   ├── app.dart
│   ├── core/
│   │   ├── app_navigator.dart
│   │   ├── chan.dart
│   │   ├── extension/
│   │   │   ├── context/
│   │   │   │   └── locale.dart
│   │   │   ├── server.dart
│   │   │   ├── sftpfile.dart
│   │   │   └── ssh_client.dart
│   │   ├── route.dart
│   │   ├── service/
│   │   │   └── ssh_discovery.dart
│   │   ├── sync.dart
│   │   └── utils/
│   │       ├── comparator.dart
│   │       ├── host_key_helper.dart
│   │       ├── jump_chain.dart
│   │       ├── misc.dart
│   │       ├── server.dart
│   │       ├── server_dedup.dart
│   │       ├── ssh_auth.dart
│   │       └── ssh_config.dart
│   ├── data/
│   │   ├── helper/
│   │   │   ├── ssh_decoder.dart
│   │   │   └── system_detector.dart
│   │   ├── model/
│   │   │   ├── ai/
│   │   │   │   └── ask_ai_models.dart
│   │   │   ├── app/
│   │   │   │   ├── bak/
│   │   │   │   │   ├── backup.dart
│   │   │   │   │   ├── backup.g.dart
│   │   │   │   │   ├── backup2.dart
│   │   │   │   │   ├── backup2.freezed.dart
│   │   │   │   │   ├── backup2.g.dart
│   │   │   │   │   ├── backup_service.dart
│   │   │   │   │   ├── backup_source.dart
│   │   │   │   │   └── utils.dart
│   │   │   │   ├── error.dart
│   │   │   │   ├── menu/
│   │   │   │   │   ├── base.dart
│   │   │   │   │   ├── container.dart
│   │   │   │   │   ├── platform.dart
│   │   │   │   │   └── server_func.dart
│   │   │   │   ├── net_view.dart
│   │   │   │   ├── path_with_prefix.dart
│   │   │   │   ├── range.dart
│   │   │   │   ├── scripts/
│   │   │   │   │   ├── cmd_types.dart
│   │   │   │   │   ├── script_builders.dart
│   │   │   │   │   ├── script_consts.dart
│   │   │   │   │   └── shell_func.dart
│   │   │   │   ├── server_detail_card.dart
│   │   │   │   ├── tab.dart
│   │   │   │   └── tab.g.dart
│   │   │   ├── container/
│   │   │   │   ├── image.dart
│   │   │   │   ├── ps.dart
│   │   │   │   ├── status.dart
│   │   │   │   └── type.dart
│   │   │   ├── pkg/
│   │   │   │   ├── manager.dart
│   │   │   │   └── upgrade_info.dart
│   │   │   ├── server/
│   │   │   │   ├── amd.dart
│   │   │   │   ├── battery.dart
│   │   │   │   ├── conn.dart
│   │   │   │   ├── connection_stat.dart
│   │   │   │   ├── connection_stat.freezed.dart
│   │   │   │   ├── connection_stat.g.dart
│   │   │   │   ├── cpu.dart
│   │   │   │   ├── custom.dart
│   │   │   │   ├── custom.g.dart
│   │   │   │   ├── discovery_result.dart
│   │   │   │   ├── discovery_result.freezed.dart
│   │   │   │   ├── discovery_result.g.dart
│   │   │   │   ├── disk.dart
│   │   │   │   ├── disk_smart.dart
│   │   │   │   ├── disk_smart.freezed.dart
│   │   │   │   ├── disk_smart.g.dart
│   │   │   │   ├── dist.dart
│   │   │   │   ├── memory.dart
│   │   │   │   ├── net_speed.dart
│   │   │   │   ├── nvdia.dart
│   │   │   │   ├── ping_result.dart
│   │   │   │   ├── private_key_info.dart
│   │   │   │   ├── private_key_info.g.dart
│   │   │   │   ├── proc.dart
│   │   │   │   ├── pve.dart
│   │   │   │   ├── sensors.dart
│   │   │   │   ├── server.dart
│   │   │   │   ├── server_private_info.dart
│   │   │   │   ├── server_private_info.freezed.dart
│   │   │   │   ├── server_private_info.g.dart
│   │   │   │   ├── server_status_update_req.dart
│   │   │   │   ├── snippet.dart
│   │   │   │   ├── snippet.freezed.dart
│   │   │   │   ├── snippet.g.dart
│   │   │   │   ├── system.dart
│   │   │   │   ├── systemd.dart
│   │   │   │   ├── temp.dart
│   │   │   │   ├── time_seq.dart
│   │   │   │   ├── try_limiter.dart
│   │   │   │   ├── windows_parser.dart
│   │   │   │   ├── wol_cfg.dart
│   │   │   │   └── wol_cfg.g.dart
│   │   │   ├── sftp/
│   │   │   │   ├── browser_status.dart
│   │   │   │   ├── req.dart
│   │   │   │   └── worker.dart
│   │   │   └── ssh/
│   │   │       └── virtual_key.dart
│   │   ├── provider/
│   │   │   ├── ai/
│   │   │   │   └── ask_ai.dart
│   │   │   ├── container.dart
│   │   │   ├── container.freezed.dart
│   │   │   ├── container.g.dart
│   │   │   ├── private_key.dart
│   │   │   ├── private_key.freezed.dart
│   │   │   ├── private_key.g.dart
│   │   │   ├── providers.dart
│   │   │   ├── pve.dart
│   │   │   ├── pve.freezed.dart
│   │   │   ├── pve.g.dart
│   │   │   ├── server/
│   │   │   │   ├── all.dart
│   │   │   │   ├── all.freezed.dart
│   │   │   │   ├── all.g.dart
│   │   │   │   ├── single.dart
│   │   │   │   ├── single.freezed.dart
│   │   │   │   └── single.g.dart
│   │   │   ├── sftp.dart
│   │   │   ├── sftp.freezed.dart
│   │   │   ├── sftp.g.dart
│   │   │   ├── snippet.dart
│   │   │   ├── snippet.freezed.dart
│   │   │   ├── snippet.g.dart
│   │   │   ├── systemd.dart
│   │   │   ├── systemd.freezed.dart
│   │   │   ├── systemd.g.dart
│   │   │   ├── virtual_keyboard.dart
│   │   │   ├── virtual_keyboard.freezed.dart
│   │   │   └── virtual_keyboard.g.dart
│   │   ├── res/
│   │   │   ├── build_data.dart
│   │   │   ├── default.dart
│   │   │   ├── github_id.dart
│   │   │   ├── highlight.dart
│   │   │   ├── misc.dart
│   │   │   ├── status.dart
│   │   │   ├── store.dart
│   │   │   ├── terminal.dart
│   │   │   └── url.dart
│   │   ├── ssh/
│   │   │   └── session_manager.dart
│   │   └── store/
│   │       ├── connection_stats.dart
│   │       ├── container.dart
│   │       ├── history.dart
│   │       ├── private_key.dart
│   │       ├── server.dart
│   │       ├── setting.dart
│   │       └── snippet.dart
│   ├── generated/
│   │   └── l10n/
│   │       ├── l10n.dart
│   │       ├── l10n_de.dart
│   │       ├── l10n_en.dart
│   │       ├── l10n_es.dart
│   │       ├── l10n_fr.dart
│   │       ├── l10n_id.dart
│   │       ├── l10n_it.dart
│   │       ├── l10n_ja.dart
│   │       ├── l10n_ko.dart
│   │       ├── l10n_nl.dart
│   │       ├── l10n_pt.dart
│   │       ├── l10n_ru.dart
│   │       ├── l10n_tr.dart
│   │       ├── l10n_uk.dart
│   │       └── l10n_zh.dart
│   ├── hive/
│   │   ├── hive_adapters.dart
│   │   ├── hive_adapters.g.dart
│   │   ├── hive_adapters.g.yaml
│   │   └── hive_registrar.g.dart
│   ├── intro.dart
│   ├── l10n/
│   │   ├── app_de.arb
│   │   ├── app_en.arb
│   │   ├── app_es.arb
│   │   ├── app_fr.arb
│   │   ├── app_id.arb
│   │   ├── app_it.arb
│   │   ├── app_ja.arb
│   │   ├── app_ko.arb
│   │   ├── app_nl.arb
│   │   ├── app_pt.arb
│   │   ├── app_ru.arb
│   │   ├── app_tr.arb
│   │   ├── app_uk.arb
│   │   ├── app_zh.arb
│   │   └── app_zh_tw.arb
│   ├── main.dart
│   └── view/
│       ├── page/
│       │   ├── backup.dart
│       │   ├── container/
│       │   │   ├── actions.dart
│       │   │   ├── container.dart
│       │   │   └── types.dart
│       │   ├── home.dart
│       │   ├── iperf.dart
│       │   ├── ping.dart
│       │   ├── private_key/
│       │   │   ├── edit.dart
│       │   │   └── list.dart
│       │   ├── process.dart
│       │   ├── pve.dart
│       │   ├── server/
│       │   │   ├── detail/
│       │   │   │   ├── misc.dart
│       │   │   │   └── view.dart
│       │   │   ├── discovery/
│       │   │   │   ├── discovery.dart
│       │   │   │   └── widget.dart
│       │   │   ├── edit/
│       │   │   │   ├── actions.dart
│       │   │   │   ├── edit.dart
│       │   │   │   └── widget.dart
│       │   │   └── tab/
│       │   │       ├── card_stat.dart
│       │   │       ├── content.dart
│       │   │       ├── landscape.dart
│       │   │       ├── tab.dart
│       │   │       ├── top_bar.dart
│       │   │       └── utils.dart
│       │   ├── setting/
│       │   │   ├── about.dart
│       │   │   ├── entries/
│       │   │   │   ├── ai.dart
│       │   │   │   ├── app.dart
│       │   │   │   ├── container.dart
│       │   │   │   ├── editor.dart
│       │   │   │   ├── full_screen.dart
│       │   │   │   ├── home_tabs.dart
│       │   │   │   ├── server.dart
│       │   │   │   ├── sftp.dart
│       │   │   │   └── ssh.dart
│       │   │   ├── entry.dart
│       │   │   ├── platform/
│       │   │   │   ├── ios.dart
│       │   │   │   └── platform_pub.dart
│       │   │   └── seq/
│       │   │       ├── srv_detail_seq.dart
│       │   │       ├── srv_func_seq.dart
│       │   │       ├── srv_seq.dart
│       │   │       └── virt_key.dart
│       │   ├── snippet/
│       │   │   ├── edit.dart
│       │   │   ├── list.dart
│       │   │   └── result.dart
│       │   ├── ssh/
│       │   │   ├── page/
│       │   │   │   ├── ask_ai.dart
│       │   │   │   ├── init.dart
│       │   │   │   ├── keyboard.dart
│       │   │   │   ├── page.dart
│       │   │   │   └── virt_key.dart
│       │   │   └── tab.dart
│       │   ├── storage/
│       │   │   ├── local.dart
│       │   │   ├── sftp.dart
│       │   │   └── sftp_mission.dart
│       │   └── systemd.dart
│       └── widget/
│           ├── omit_start_text.dart
│           ├── percent_circle.dart
│           ├── server_func_btns.dart
│           └── unix_perm.dart
├── linux/
│   ├── .gitignore
│   ├── CMakeLists.txt
│   ├── flutter/
│   │   ├── CMakeLists.txt
│   │   ├── generated_plugin_registrant.cc
│   │   ├── generated_plugin_registrant.h
│   │   └── generated_plugins.cmake
│   ├── main.cc
│   ├── my_application.cc
│   ├── my_application.h
│   └── packaging/
│       ├── appimage/
│       │   └── make_config.yaml
│       ├── deb/
│       │   └── make_config.yaml
│       └── rpm/
│           └── make_config.yaml
├── macos/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── Flutter-Debug.xcconfig
│   │   ├── Flutter-Release.xcconfig
│   │   └── GeneratedPluginRegistrant.swift
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── MainMenu.xib
│   │   ├── Configs/
│   │   │   ├── AppInfo.xcconfig
│   │   │   ├── Debug.xcconfig
│   │   │   ├── Release.xcconfig
│   │   │   └── Warnings.xcconfig
│   │   ├── DebugProfile.entitlements
│   │   ├── Info.plist
│   │   ├── MainFlutterWindow.swift
│   │   ├── PrivacyInfo.xcprivacy
│   │   ├── Release.entitlements
│   │   ├── de.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── es.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── fr.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── id.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── ja.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── pt-BR.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── ru.lproj/
│   │   │   └── MainMenu.strings
│   │   ├── zh-Hans.lproj/
│   │   │   └── MainMenu.strings
│   │   └── zh-Hant.lproj/
│   │       └── MainMenu.strings
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   └── xcshareddata/
│   │   │       └── IDEWorkspaceChecks.plist
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   ├── Runner.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       └── IDEWorkspaceChecks.plist
│   └── RunnerTests/
│       └── RunnerTests.swift
├── make.dart
├── pubspec.yaml
├── test/
│   ├── amd_smi_test.dart
│   ├── battery_test.dart
│   ├── btrfs_test.dart
│   ├── container_test.dart
│   ├── core_utils_test.dart
│   ├── cpu_test.dart
│   ├── disabled_cmd_types_test.dart
│   ├── disk_smart_test.dart
│   ├── disk_test.dart
│   ├── jump_chain_test.dart
│   ├── memory_test.dart
│   ├── net_speed_test.dart
│   ├── nvidia.xml
│   ├── nvidia2.xml
│   ├── nvidia_test.dart
│   ├── proc_test.dart
│   ├── pve_test.dart
│   ├── script_builder_test.dart
│   ├── sensors_test.dart
│   ├── server_dedup_test.dart
│   ├── server_edit_logic_test.dart
│   ├── ssh_config_test.dart
│   ├── system_dist_test.dart
│   ├── uptime_test.dart
│   └── windows_test.dart
└── windows/
    ├── .gitignore
    ├── CMakeLists.txt
    ├── flutter/
    │   ├── CMakeLists.txt
    │   ├── generated_plugin_registrant.cc
    │   ├── generated_plugin_registrant.h
    │   └── generated_plugins.cmake
    └── runner/
        ├── CMakeLists.txt
        ├── Runner.rc
        ├── flutter_window.cpp
        ├── flutter_window.h
        ├── main.cpp
        ├── resource.h
        ├── runner.exe.manifest
        ├── utils.cpp
        ├── utils.h
        ├── win32_window.cpp
        └── win32_window.h
Download .txt
SYMBOL INDEX (2402 symbols across 252 files)

FILE: lib/app.dart
  class MyApp (line 15) | class MyApp extends StatefulWidget {
    method createState (line 19) | State<MyApp> createState()
  class _MyAppState (line 22) | class _MyAppState extends State<MyApp> {
    method build (line 26) | Widget build(BuildContext context)
    method _build (line 41) | Widget _build(BuildContext context)
    method _buildDynamicColor (line 63) | Widget _buildDynamicColor(BuildContext context)
    method _buildApp (line 98) | Widget _buildApp(BuildContext ctx, {required ThemeData light, required...
  function _setup (line 147) | void _setup(BuildContext context)

FILE: lib/core/app_navigator.dart
  class AppNavigator (line 4) | abstract final class AppNavigator {

FILE: lib/core/chan.dart
  class MethodChans (line 6) | abstract final class MethodChans {
    method moveToBg (line 9) | void moveToBg()
    method startService (line 14) | void startService()
    method stopService (line 20) | void stopService()
    method updateHomeWidget (line 25) | void updateHomeWidget()
    method updateSessions (line 33) | Future<void> updateSessions(String payload)
    method isServiceRunning (line 44) | Future<bool> isServiceRunning()
    method startLiveActivity (line 56) | Future<void> startLiveActivity(String payload)
    method updateLiveActivity (line 66) | Future<void> updateLiveActivity(String payload)
    method stopLiveActivity (line 76) | Future<void> stopLiveActivity()
    method registerHandler (line 90) | void registerHandler(Future<void> Function(String id) onDisconnect, [V...

FILE: lib/core/extension/server.dart
  function getLogoUrl (line 9) | String? getLogoUrl(BuildContext context)

FILE: lib/core/extension/sftpfile.dart
  function toUnixPerm (line 13) | UnixPerm toUnixPerm()
  function _getRoleMode (line 22) | String _getRoleMode(bool r, bool w, bool x)

FILE: lib/core/extension/ssh_client.dart
  type OnStdout (line 10) | typedef OnStdout = void Function(String data, SSHSession session);
  type OnStdin (line 11) | typedef OnStdin = void Function(SSHSession session);
  function execPowerShell (line 15) | Future<(SSHSession, String)> execPowerShell(
  function exec (line 60) | Future<(SSHSession, String)> exec(
  function execWithPwd (line 124) | Future<(int?, String)> execWithPwd(
  function execForOutput (line 158) | Future<String> execForOutput(
  function runSafe (line 184) | Future<String> runSafe(
  function execSafe (line 207) | Future<(String stdout, String stderr)> execSafe(

FILE: lib/core/route.dart
  class SpiRequiredArgs (line 4) | final class SpiRequiredArgs {

FILE: lib/core/service/ssh_discovery.dart
  class SshDiscoveryService (line 9) | class SshDiscoveryService {
    method discover (line 12) | Future<SshDiscoveryReport> discover([SshDiscoveryConfig config = const...
    method _run (line 59) | Future<String?> _run(String exe, List<String> args, {Duration? timeout})
    method _neighborsIPv4 (line 86) | Future<Set<InternetAddress>> _neighborsIPv4()
    method _neighborsIPv6 (line 122) | Future<Set<InternetAddress>> _neighborsIPv6()
    method _localIPv4Cidrs (line 148) | Future<List<_Cidr>> _localIPv4Cidrs()
    method _isBroadcastOrMulticast (line 203) | bool _isBroadcastOrMulticast(InternetAddress a)
    method _mdnsSshCandidates (line 218) | Future<Set<InternetAddress>> _mdnsSshCandidates()
  class _Cidr (line 270) | class _Cidr {
    method enumerateHosts (line 279) | Iterable<InternetAddress> enumerateHosts({int? limit})
    method toString (line 291) | String toString()
  class _ScanResult (line 294) | class _ScanResult {
  class _Scanner (line 300) | class _Scanner {
    method scan (line 305) | Future<List<_ScanResult>> scan(List<InternetAddress> addrs)
    method _probeSsh (line 315) | Future<_ScanResult?> _probeSsh(InternetAddress ip)
  class _Semaphore (line 350) | class _Semaphore {
    method withPermit (line 355) | Future<T> withPermit<T>(Future<T> Function() fn)
  function _guarded (line 373) | Future<T> _guarded<T>(_Semaphore sem, Future<T> Function() fn)
  function _ipv4ToInt (line 377) | int _ipv4ToInt(String ip)
  function _intToIPv4 (line 382) | String _intToIPv4(int v)
  function _prefixToMask (line 384) | InternetAddress _prefixToMask(int prefix)
  function _maskToPrefix (line 389) | int _maskToPrefix(String mask)
  function _networkAddress (line 402) | InternetAddress _networkAddress(InternetAddress ip, InternetAddress mask)
  function _broadcastAddress (line 407) | InternetAddress _broadcastAddress(InternetAddress ip, InternetAddress mask)

FILE: lib/core/sync.dart
  class BakSyncer (line 11) | final class BakSyncer extends SyncIface {
    method saveToFile (line 15) | Future<void> saveToFile()
    method fromFile (line 21) | Future<Mergeable> fromFile(String path)

FILE: lib/core/utils/comparator.dart
  class ChainComparator (line 1) | class ChainComparator<T> {
    method comparing (line 9) | ChainComparator<T> comparing<T, F extends Comparable<F>>(F Function(T)...
    method compare (line 13) | int compare(T a, T b)
    method call (line 22) | int call(T a, T b)
    method thenCompareBy (line 26) | ChainComparator<T> thenCompareBy<F extends Comparable<F>>(
    method thenWithComparator (line 38) | ChainComparator<T> thenWithComparator(Comparator<T> comparator, {bool ...
    method thenCompareByReversed (line 42) | ChainComparator<T> thenCompareByReversed<F extends Comparable<F>>(F Fu...
    method thenTrueFirst (line 46) | ChainComparator<T> thenTrueFirst(bool Function(T) f)
    method reversed (line 53) | ChainComparator<T> reversed()
  class Comparators (line 58) | class Comparators {
    method compareStringCaseInsensitive (line 59) | Comparator<String> compareStringCaseInsensitive({bool uppercaseFirst =...

FILE: lib/core/utils/host_key_helper.dart
  function ensureHostKeyAcceptedForSftp (line 8) | Future<bool> ensureHostKeyAcceptedForSftp(BuildContext context, Spi spi)

FILE: lib/core/utils/jump_chain.dart
  function wouldCreateJumpCycle (line 5) | bool wouldCreateJumpCycle({
  function collectJumpServers (line 35) | Map<String, Spi> collectJumpServers({

FILE: lib/core/utils/misc.dart
  function getToken (line 4) | Future<String?> getToken()

FILE: lib/core/utils/server.dart
  function loadIndentity (line 19) | List<SSHKeyPair> loadIndentity(String key)
  function decyptPem (line 24) | String decyptPem(List<String> args)
  type GenSSHClientStatus (line 31) | enum GenSSHClientStatus { socket, key, pwd }
  function getPrivateKey (line 33) | String getPrivateKey(String id)
  function genClient (line 44) | Future<SSHClient> genClient(
  type _HostKeyPersistCallback (line 183) | typedef _HostKeyPersistCallback =
  class HostKeyPromptInfo (line 186) | class HostKeyPromptInfo {
  class _HostKeyVerifier (line 204) | class _HostKeyVerifier {
    method call (line 217) | Future<bool> call(String keyType, Uint8List fingerprintBytes)
  function _loadKnownHostFingerprints (line 276) | Map<String, String> _loadKnownHostFingerprints()
  function _persistHostKeyFingerprint (line 286) | void _persistHostKeyFingerprint(String storageKey, String fingerprintHex)
  function _defaultHostKeyPrompt (line 301) | Future<bool> _defaultHostKeyPrompt(HostKeyPromptInfo info)
  function ensureKnownHostKey (line 348) | Future<void> ensureKnownHostKey(
  function _hasKnownHostFingerprintForSpi (line 400) | bool _hasKnownHostFingerprintForSpi(Spi spi, Map<String, String> cache)
  function _hostKeyStorageKey (line 405) | String _hostKeyStorageKey(Spi spi, String keyType)
  function _hostIdentifier (line 410) | String _hostIdentifier(Spi spi)
  function _fingerprintToHex (line 412) | String _fingerprintToHex(Uint8List fingerprint)
  function _fingerprintToBase64 (line 421) | String _fingerprintToBase64(Uint8List fingerprint)

FILE: lib/core/utils/server_dedup.dart
  class ServerDeduplication (line 8) | class ServerDeduplication {
    method deduplicateServers (line 11) | List<Spi> deduplicateServers(List<Spi> importedServers)
    method _isDuplicate (line 25) | bool _isDuplicate(Spi imported, List<Spi> existing)
    method resolveNameConflicts (line 36) | List<Spi> resolveNameConflicts(List<Spi> importedServers)
    method getImportSummary (line 65) | ImportSummary getImportSummary(List<Spi> originalList, List<Spi> dedup...
    method importServersWithNotification (line 80) | Future<int> importServersWithNotification({
    method _resolveServers (line 107) | List<Spi> _resolveServers(List<Spi> servers)
  class ImportSummary (line 114) | class ImportSummary {

FILE: lib/core/utils/ssh_auth.dart
  class KeybordInteractive (line 7) | abstract final class KeybordInteractive {
    method defaultHandle (line 8) | FutureOr<List<String>?> defaultHandle(Spi spi, {BuildContext? ctx})

FILE: lib/core/utils/ssh_config.dart
  class SSHConfig (line 6) | abstract final class SSHConfig {
    method parseConfig (line 40) | Future<List<Spi>> parseConfig([String? configPath])
    method _parseSSHConfig (line 52) | List<Spi> _parseSSHConfig(String content)
    method addServer (line 63) | void addServer()
    method _extractJumpHost (line 151) | String? _extractJumpHost(String value)
    method configExists (line 163) | (File?, bool) configExists([String? configPath])

FILE: lib/data/helper/ssh_decoder.dart
  class SSHDecoder (line 7) | class SSHDecoder {
    method decode (line 16) | String decode(
    method encode (line 55) | List<int> encode(String text, {bool isWindows = false})

FILE: lib/data/helper/system_detector.dart
  class SystemDetector (line 8) | class SystemDetector {
    method detect (line 17) | Future<SystemType> detect(SSHClient client, Spi spi)

FILE: lib/data/model/ai/ask_ai_models.dart
  type AskAiMessageRole (line 4) | enum AskAiMessageRole { user, assistant }
  class AskAiMessage (line 6) | @immutable
  class AskAiCommand (line 27) | @immutable
  class AskAiEvent (line 40) | @immutable
  class AskAiContentDelta (line 46) | class AskAiContentDelta extends AskAiEvent {
  class AskAiToolSuggestion (line 52) | class AskAiToolSuggestion extends AskAiEvent {
  class AskAiCompleted (line 58) | class AskAiCompleted extends AskAiEvent {
  class AskAiStreamError (line 69) | class AskAiStreamError extends AskAiEvent {

FILE: lib/data/model/app/bak/backup.dart
  class Backup (line 19) | @JsonSerializable()
    method toJson (line 46) | Map<String, dynamic> toJson()
    method loadFromStore (line 48) | Future<Backup> loadFromStore()
    method backup (line 63) | Future<String> backup([String? name])
    method merge (line 72) | Future<void> merge({bool force = false})
  function _diyEncrypt (line 219) | String _diyEncrypt(String raw)
  function _diyDecrypt (line 221) | String _diyDecrypt(String raw)

FILE: lib/data/model/app/bak/backup.g.dart
  function _$BackupFromJson (line 9) | Backup _$BackupFromJson(Map<String, dynamic> json)
  function _$BackupToJson (line 27) | Map<String, dynamic> _$BackupToJson(Backup instance)

FILE: lib/data/model/app/bak/backup2.dart
  class BackupV2 (line 18) | @freezed
    method merge (line 47) | Future<void> merge({bool force = false})
    method loadFromStore (line 67) | Future<BackupV2> loadFromStore()
    method backup (line 80) | Future<String> backup([String? name, String? password])

FILE: lib/data/model/app/bak/backup2.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toJson (line 26) | Map<String, dynamic> toJson()
  function toString (line 39) | String toString()
  class $BackupV2CopyWith (line 47) | abstract mixin class $BackupV2CopyWith<$Res>  {
    method call (line 50) | $Res call({
  class _$BackupV2CopyWithImpl (line 59) | class _$BackupV2CopyWithImpl<$Res>
    method call (line 68) | $Res call({Object? version = null,Object? date = null,Object? spis = n...
  function maybeMap (line 99) | TResult maybeMap<TResult extends Object?>(TResult Function( _BackupV2 va...
  function map (line 121) | TResult map<TResult extends Object?>(TResult Function( _BackupV2 value) ...
  function mapOrNull (line 142) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _BackupV2...
  function maybeWhen (line 163) | TResult maybeWhen<TResult extends Object?>(TResult Function( int version...
  function when (line 184) | TResult when<TResult extends Object?>(TResult Function( int version,  in...
  function whenOrNull (line 204) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int vers...
  class _BackupV2 (line 216) | @JsonSerializable()
    method toJson (line 274) | Map<String, dynamic> toJson()
    method toString (line 288) | String toString()
  class _$BackupV2CopyWith (line 296) | abstract mixin class _$BackupV2CopyWith<$Res> implements $BackupV2CopyWi...
    method call (line 299) | $Res call({
  class __$BackupV2CopyWithImpl (line 308) | class __$BackupV2CopyWithImpl<$Res>
    method call (line 317) | $Res call({Object? version = null,Object? date = null,Object? spis = n...

FILE: lib/data/model/app/bak/backup2.g.dart
  function _$BackupV2FromJson (line 9) | _BackupV2 _$BackupV2FromJson(Map<String, dynamic> json)
  function _$BackupV2ToJson (line 20) | Map<String, dynamic> _$BackupV2ToJson(_BackupV2 instance)

FILE: lib/data/model/app/bak/backup_service.dart
  class BackupService (line 10) | class BackupService {
    method backup (line 12) | Future<void> backup(BuildContext context, BackupSource source)
    method restore (line 29) | Future<void> restore(BuildContext context, BackupSource source)
    method restoreFromText (line 43) | Future<void> restoreFromText(BuildContext context, String text)
    method _confirmAndRestore (line 120) | Future<void> _confirmAndRestore(BuildContext context, (dynamic, String...
    method _showPasswordDialog (line 142) | Future<String?> _showPasswordDialog(

FILE: lib/data/model/app/bak/backup_source.dart
  class BackupSource (line 7) | abstract class BackupSource {
    method getContent (line 9) | Future<String?> getContent()
    method saveContent (line 12) | Future<void> saveContent(String filePath)
  class FileBackupSource (line 22) | class FileBackupSource implements BackupSource {
    method getContent (line 24) | Future<String?> getContent()
    method saveContent (line 29) | Future<void> saveContent(String filePath)
  class ClipboardBackupSource (line 41) | class ClipboardBackupSource implements BackupSource {
    method getContent (line 43) | Future<String?> getContent()
    method saveContent (line 52) | Future<void> saveContent(String filePath)

FILE: lib/data/model/app/bak/utils.dart
  class MergeableUtils (line 5) | abstract final class MergeableUtils {
    method fromJsonString (line 6) | (Mergeable, String) fromJsonString(String json, [String? password])

FILE: lib/data/model/app/error.dart
  type SSHErrType (line 4) | enum SSHErrType { unknown, connect, auth, noPrivateKey, chdir, segements...
  class SSHErr (line 6) | class SSHErr extends Err<SSHErrType> {
  type ContainerErrType (line 19) | enum ContainerErrType {
  class ContainerErr (line 34) | class ContainerErr extends Err<ContainerErrType> {
  type ICloudErrType (line 41) | enum ICloudErrType { generic, notFound, multipleFiles }
  class ICloudErr (line 43) | class ICloudErr extends Err<ICloudErrType> {
  type WebdavErrType (line 50) | enum WebdavErrType { generic, notFound }
  class WebdavErr (line 52) | class WebdavErr extends Err<WebdavErrType> {
  type PveErrType (line 59) | enum PveErrType { unknown, net, loginFailed }
  class PveErr (line 61) | class PveErr extends Err<PveErrType> {

FILE: lib/data/model/app/menu/base.dart
  class PopMenu (line 3) | abstract class PopMenu {
    method build (line 4) | PopupMenuItem<T> build<T>(

FILE: lib/data/model/app/menu/container.dart
  type ContainerMenu (line 4) | enum ContainerMenu {

FILE: lib/data/model/app/menu/platform.dart
  class MacOSMenuBarManager (line 13) | class MacOSMenuBarManager {
    method buildMenuBar (line 14) | List<PlatformMenu> buildMenuBar(BuildContext context, Function(int) on...
    method _buildNavigateMenuItems (line 61) | List<PlatformMenuItem> _buildNavigateMenuItems(
    method _getShortcutKeyForIndex (line 89) | LogicalKeyboardKey? _getShortcutKeyForIndex(int index)
    method _showAboutDialog (line 104) | Future<void> _showAboutDialog(BuildContext context)
    method _openSettings (line 109) | void _openSettings(BuildContext context)
    method _openURL (line 113) | Future<void> _openURL(String url)

FILE: lib/data/model/app/menu/server_func.dart
  type ServerFuncBtn (line 6) | enum ServerFuncBtn {

FILE: lib/data/model/app/net_view.dart
  type NetViewType (line 5) | enum NetViewType {

FILE: lib/data/model/app/path_with_prefix.dart
  class LocalPath (line 7) | class LocalPath {
    method update (line 15) | void update(String newPath)
    method undo (line 33) | bool undo()
  function _trimSuffix (line 42) | String _trimSuffix(String prefixPath)

FILE: lib/data/model/app/range.dart
  class Range (line 1) | final class Range<T extends num> {
    method contains (line 7) | bool contains(int value)
    method toString (line 10) | String toString()

FILE: lib/data/model/app/scripts/cmd_types.dart
  type CmdTypeSys (line 9) | enum CmdTypeSys {
  class ShellCmdType (line 27) | sealed class ShellCmdType implements Enum {
  type StatusCmdType (line 50) | enum StatusCmdType implements ShellCmdType {
  type BSDStatusCmdType (line 138) | enum BSDStatusCmdType implements ShellCmdType {
  type WindowsStatusCmdType (line 166) | enum WindowsStatusCmdType implements ShellCmdType {
  function findInMap (line 322) | String findInMap(Map<String, String> parsedOutput)

FILE: lib/data/model/app/scripts/script_builders.dart
  class ScriptBuilder (line 6) | sealed class ScriptBuilder {
    method buildScript (line 10) | String buildScript(Map<String, String>? customCmds, [List<String>? dis...
    method getInstallCommand (line 16) | String getInstallCommand(String scriptDir, String scriptPath)
    method getExecCommand (line 19) | String getExecCommand(String scriptPath, ShellFunc func)
    method getCustomCmdsString (line 22) | String getCustomCmdsString(ShellFunc func, Map<String, String>? custom...
  class WindowsScriptBuilder (line 29) | class WindowsScriptBuilder extends ScriptBuilder {
    method getInstallCommand (line 39) | String getInstallCommand(String scriptDir, String scriptPath)
    method getExecCommand (line 46) | String getExecCommand(String scriptPath, ShellFunc func)
    method getCustomCmdsString (line 51) | String getCustomCmdsString(ShellFunc func, Map<String, String>? custom...
    method buildScript (line 65) | String buildScript(Map<String, String>? customCmds, [List<String>? dis...
    method _getWindowsCommand (line 98) | String _getWindowsCommand(ShellFunc func, [List<String>? disabledCmdTy...
    method _getWindowsStatusCommand (line 108) | String _getWindowsStatusCommand({required List<String> disabledCmdTypes})
  class UnixScriptBuilder (line 115) | class UnixScriptBuilder extends ScriptBuilder {
    method getInstallCommand (line 125) | String getInstallCommand(String scriptDir, String scriptPath)
    method getExecCommand (line 134) | String getExecCommand(String scriptPath, ShellFunc func)
    method getCustomCmdsString (line 139) | String getCustomCmdsString(ShellFunc func, Map<String, String>? custom...
    method buildScript (line 153) | String buildScript(Map<String, String>? customCmds, [List<String>? dis...
    method _getUnixCommand (line 186) | String _getUnixCommand(ShellFunc func, [List<String>? disabledCmdTypes])
    method _getUnixStatusCommand (line 197) | String _getUnixStatusCommand({required List<String> disabledCmdTypes})
    method _getUnixProcessCommand (line 218) | String _getUnixProcessCommand()
    method _getUnixShutdownCommand (line 232) | String _getUnixShutdownCommand()
    method _getUnixRebootCommand (line 242) | String _getUnixRebootCommand()
    method _getUnixSuspendCommand (line 252) | String _getUnixSuspendCommand()
  class ScriptBuilderFactory (line 263) | class ScriptBuilderFactory {
    method getBuilder (line 267) | ScriptBuilder getBuilder(bool isWindows)
    method getAllBuilders (line 272) | List<ScriptBuilder> getAllBuilders()

FILE: lib/data/model/app/scripts/script_consts.dart
  class ScriptConstants (line 4) | class ScriptConstants {
    method getCmdSeparator (line 24) | String getCmdSeparator(String cmdName)
    method getCustomCmdSeparator (line 27) | String getCustomCmdSeparator(String cmdName)
    method getCmdDivider (line 30) | String getCmdDivider(String cmdName)
    method getWindowsCmdDivider (line 33) | String getWindowsCmdDivider(String cmdName)
    method parseScriptOutput (line 36) | Map<String, String> parseScriptOutput(String raw)
  class ScriptPaths (line 114) | class ScriptPaths {
    method getScriptDir (line 124) | String getScriptDir(String id, {bool isWindows = false})
    method switchScriptDir (line 131) | String switchScriptDir(String id, {bool isWindows = false})
    method getScriptPath (line 143) | String getScriptPath(String id, {bool isWindows = false})
    method clearCache (line 151) | void clearCache()

FILE: lib/data/model/app/scripts/shell_func.dart
  type ShellFunc (line 6) | enum ShellFunc {
  class ShellFuncManager (line 38) | class ShellFuncManager {
    method _normalizeDir (line 42) | String _normalizeDir(String dir, bool isWindows)
    method getScriptDir (line 53) | String getScriptDir(String id, {SystemType? systemType, required Strin...
    method switchScriptDir (line 61) | void switchScriptDir(String id, {SystemType? systemType})
    method getScriptPath (line 67) | String getScriptPath(String id, {SystemType? systemType, required Stri...
    method getInstallShellCmd (line 81) | String getInstallShellCmd(String id, {SystemType? systemType, required...
    method allScript (line 93) | String allScript(

FILE: lib/data/model/app/server_detail_card.dart
  type ServerDetailCards (line 7) | enum ServerDetailCards {

FILE: lib/data/model/app/tab.dart
  type AppTab (line 13) | @HiveType(typeId: 103)

FILE: lib/data/model/app/tab.g.dart
  class AppTabAdapter (line 9) | class AppTabAdapter extends TypeAdapter<AppTab> {
    method read (line 14) | AppTab read(BinaryReader reader)
    method write (line 30) | void write(BinaryWriter writer, AppTab obj)

FILE: lib/data/model/container/image.dart
  class ContainerImg (line 6) | abstract final class ContainerImg {
  class PodmanImg (line 16) | final class PodmanImg implements ContainerImg {
    method toRawJson (line 37) | String toRawJson()
    method toJson (line 48) | Map<String, dynamic> toJson()
  class DockerImg (line 58) | final class DockerImg implements ContainerImg {
    method toRawJson (line 86) | String toRawJson()
    method toJson (line 113) | Map<String, dynamic> toJson()
  function _asString (line 123) | String? _asString(dynamic val)
  function _asInt (line 129) | int? _asInt(dynamic val)

FILE: lib/data/model/container/ps.dart
  class ContainerPs (line 9) | sealed class ContainerPs {
    method parseStats (line 23) | void parseStats(String s, [String? version])
  class PodmanPs (line 26) | final class PodmanPs implements ContainerPs {
    method parseStats (line 58) | void parseStats(String s, [String? version])
    method toRawJson (line 96) | String toRawJson()
    method toJson (line 108) | Map<String, dynamic> toJson()
  class DockerPs (line 119) | final class DockerPs implements ContainerPs {
    method parseStats (line 148) | void parseStats(String s, [String? version])

FILE: lib/data/model/container/status.dart
  type ContainerStatus (line 5) | enum ContainerStatus {

FILE: lib/data/model/container/type.dart
  type ContainerType (line 4) | enum ContainerType {

FILE: lib/data/model/pkg/manager.dart
  type PkgManager (line 3) | enum PkgManager {

FILE: lib/data/model/pkg/upgrade_info.dart
  class UpgradePkgInfo (line 3) | class UpgradePkgInfo {
    method _parseApt (line 36) | void _parseApt(String raw)
    method _parseYum (line 45) | void _parseYum(String raw)
    method _parseZypper (line 55) | void _parseZypper(String raw)
    method _parsePacman (line 63) | void _parsePacman(String raw)
    method _parseOpkg (line 72) | void _parseOpkg(String raw)
    method _parseApk (line 82) | void _parseApk(String raw)

FILE: lib/data/model/server/amd.dart
  class AmdSmi (line 30) | class AmdSmi {
    method fromJson (line 31) | List<AmdSmiItem> fromJson(String raw)
    method _parseGpuItem (line 46) | AmdSmiItem? _parseGpuItem(Map<String, dynamic> gpu)
    method _parseIntValue (line 87) | int _parseIntValue(dynamic value)
    method _formatPower (line 98) | String _formatPower(dynamic draw, dynamic cap)
    method _parseMemory (line 107) | AmdSmiMem _parseMemory(Map<String, dynamic> memData)
    method _parseProcess (line 126) | AmdSmiMemProcess? _parseProcess(Map<String, dynamic> procData)
  class AmdSmiItem (line 136) | class AmdSmiItem {
    method toString (line 158) | String toString()
  class AmdSmiMem (line 163) | class AmdSmiMem {
    method toString (line 172) | String toString()
  class AmdSmiMemProcess (line 177) | class AmdSmiMemProcess {
    method toString (line 185) | String toString()

FILE: lib/data/model/server/battery.dart
  class Battery (line 15) | class Battery {
    method toString (line 49) | String toString()
  type BatteryStatus (line 56) | enum BatteryStatus {
  class Batteries (line 76) | abstract final class Batteries {
    method parse (line 77) | List<Battery> parse(String raw, [bool onlyLiPoly = false])

FILE: lib/data/model/server/conn.dart
  class Conn (line 3) | class Conn {
    method parse (line 11) | Conn? parse(String raw)

FILE: lib/data/model/server/connection_stat.dart
  class ConnectionStat (line 8) | @freezed
  class ServerConnectionStats (line 24) | @freezed
  type ConnectionResult (line 43) | @HiveType(typeId: 102)

FILE: lib/data/model/server/connection_stat.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toJson (line 26) | Map<String, dynamic> toJson()
  function toString (line 39) | String toString()
  class $ConnectionStatCopyWith (line 47) | abstract mixin class $ConnectionStatCopyWith<$Res>  {
    method call (line 50) | $Res call({
  class _$ConnectionStatCopyWithImpl (line 59) | class _$ConnectionStatCopyWithImpl<$Res>
    method call (line 68) | $Res call({Object? serverId = null,Object? serverName = null,Object? t...
  function maybeMap (line 97) | TResult maybeMap<TResult extends Object?>(TResult Function( _ConnectionS...
  function map (line 119) | TResult map<TResult extends Object?>(TResult Function( _ConnectionStat v...
  function mapOrNull (line 140) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Connecti...
  function maybeWhen (line 161) | TResult maybeWhen<TResult extends Object?>(TResult Function(@HiveField(0...
  function when (line 182) | TResult when<TResult extends Object?>(TResult Function(@HiveField(0)  St...
  function whenOrNull (line 202) | TResult? whenOrNull<TResult extends Object?>(TResult? Function(@HiveFiel...
  class _ConnectionStat (line 214) | @JsonSerializable()
    method toJson (line 234) | Map<String, dynamic> toJson()
    method toString (line 248) | String toString()
  class _$ConnectionStatCopyWith (line 256) | abstract mixin class _$ConnectionStatCopyWith<$Res> implements $Connecti...
    method call (line 259) | $Res call({
  class __$ConnectionStatCopyWithImpl (line 268) | class __$ConnectionStatCopyWithImpl<$Res>
    method call (line 277) | $Res call({Object? serverId = null,Object? serverName = null,Object? t...
  function toJson (line 304) | Map<String, dynamic> toJson()
  function toString (line 317) | String toString()
  class $ServerConnectionStatsCopyWith (line 325) | abstract mixin class $ServerConnectionStatsCopyWith<$Res>  {
    method call (line 328) | $Res call({
  class _$ServerConnectionStatsCopyWithImpl (line 337) | class _$ServerConnectionStatsCopyWithImpl<$Res>
    method call (line 346) | $Res call({Object? serverId = null,Object? serverName = null,Object? t...
  function maybeMap (line 378) | TResult maybeMap<TResult extends Object?>(TResult Function( _ServerConne...
  function map (line 400) | TResult map<TResult extends Object?>(TResult Function( _ServerConnection...
  function mapOrNull (line 421) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ServerCo...
  function maybeWhen (line 442) | TResult maybeWhen<TResult extends Object?>(TResult Function(@HiveField(0...
  function when (line 463) | TResult when<TResult extends Object?>(TResult Function(@HiveField(0)  St...
  function whenOrNull (line 483) | TResult? whenOrNull<TResult extends Object?>(TResult? Function(@HiveFiel...
  class _ServerConnectionStats (line 495) | @JsonSerializable()
    method toJson (line 524) | Map<String, dynamic> toJson()
    method toString (line 538) | String toString()
  class _$ServerConnectionStatsCopyWith (line 546) | abstract mixin class _$ServerConnectionStatsCopyWith<$Res> implements $S...
    method call (line 549) | $Res call({
  class __$ServerConnectionStatsCopyWithImpl (line 558) | class __$ServerConnectionStatsCopyWithImpl<$Res>
    method call (line 567) | $Res call({Object? serverId = null,Object? serverName = null,Object? t...

FILE: lib/data/model/server/connection_stat.g.dart
  class ConnectionStatAdapter (line 9) | class ConnectionStatAdapter extends TypeAdapter<ConnectionStat> {
    method read (line 14) | ConnectionStat read(BinaryReader reader)
    method write (line 30) | void write(BinaryWriter writer, ConnectionStat obj)
  class ServerConnectionStatsAdapter (line 58) | class ServerConnectionStatsAdapter extends TypeAdapter<ServerConnectionS...
    method read (line 63) | ServerConnectionStats read(BinaryReader reader)
    method write (line 84) | void write(BinaryWriter writer, ServerConnectionStats obj)
  class ConnectionResultAdapter (line 118) | class ConnectionResultAdapter extends TypeAdapter<ConnectionResult> {
    method read (line 123) | ConnectionResult read(BinaryReader reader)
    method write (line 141) | void write(BinaryWriter writer, ConnectionResult obj)
  function _$ConnectionStatFromJson (line 171) | _ConnectionStat _$ConnectionStatFromJson(Map<String, dynamic> json)
  function _$ConnectionStatToJson (line 181) | Map<String, dynamic> _$ConnectionStatToJson(_ConnectionStat instance)
  function _$ServerConnectionStatsFromJson (line 199) | _ServerConnectionStats _$ServerConnectionStatsFromJson(
  function _$ServerConnectionStatsToJson (line 221) | Map<String, dynamic> _$ServerConnectionStatsToJson(

FILE: lib/data/model/server/cpu.dart
  class Cpus (line 9) | class Cpus extends TimeSeq<SingleCpuCore> {
    method onUpdate (line 15) | void onUpdate()
    method usedPercent (line 33) | double usedPercent({int coreIdx = 0})
    method _getUser (line 57) | double _getUser()
    method _getSys (line 66) | double _getSys()
    method _getIowait (line 75) | double _getIowait()
    method _getIdle (line 84) | double _getIdle()
    method _coresLoop (line 86) | void _coresLoop(void Function(int i) callback)
    method _updateSpots (line 102) | void _updateSpots()
  class SingleCpuCore (line 144) | class SingleCpuCore extends TimeSeqIface<SingleCpuCore> {
    method same (line 159) | bool same(SingleCpuCore other)
    method parse (line 161) | List<SingleCpuCore> parse(String raw)
  class CpuBrand (line 187) | final class CpuBrand {
    method parse (line 188) | Map<String, int> parse(String raw)
  function parseBsdCpu (line 216) | Cpus parseBsdCpu(String raw)

FILE: lib/data/model/server/custom.dart
  class ServerCustom (line 5) | @JsonSerializable(includeIfNull: false)
    method toJson (line 40) | Map<String, dynamic> toJson()

FILE: lib/data/model/server/custom.g.dart
  function _$ServerCustomFromJson (line 9) | ServerCustom _$ServerCustomFromJson(Map<String, dynamic> json)
  function _$ServerCustomToJson (line 21) | Map<String, dynamic> _$ServerCustomToJson(ServerCustom instance)

FILE: lib/data/model/server/discovery_result.dart
  class SshDiscoveryResult (line 6) | @freezed
  class SshDiscoveryReport (line 18) | @freezed
  class SshDiscoveryConfig (line 30) | @freezed
  function toArgs (line 41) | List<String> toArgs()

FILE: lib/data/model/server/discovery_result.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toJson (line 26) | Map<String, dynamic> toJson()
  function toString (line 39) | String toString()
  class $SshDiscoveryResultCopyWith (line 47) | abstract mixin class $SshDiscoveryResultCopyWith<$Res>  {
    method call (line 50) | $Res call({
  class _$SshDiscoveryResultCopyWithImpl (line 59) | class _$SshDiscoveryResultCopyWithImpl<$Res>
    method call (line 68) | $Res call({Object? ip = null,Object? port = null,Object? banner = free...
  function maybeMap (line 95) | TResult maybeMap<TResult extends Object?>(TResult Function( _SshDiscover...
  function map (line 117) | TResult map<TResult extends Object?>(TResult Function( _SshDiscoveryResu...
  function mapOrNull (line 138) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SshDisco...
  function maybeWhen (line 159) | TResult maybeWhen<TResult extends Object?>(TResult Function( String ip, ...
  function when (line 180) | TResult when<TResult extends Object?>(TResult Function( String ip,  int ...
  function whenOrNull (line 200) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String i...
  class _SshDiscoveryResult (line 212) | @JsonSerializable()
    method toJson (line 230) | Map<String, dynamic> toJson()
    method toString (line 244) | String toString()
  class _$SshDiscoveryResultCopyWith (line 252) | abstract mixin class _$SshDiscoveryResultCopyWith<$Res> implements $SshD...
    method call (line 255) | $Res call({
  class __$SshDiscoveryResultCopyWithImpl (line 264) | class __$SshDiscoveryResultCopyWithImpl<$Res>
    method call (line 273) | $Res call({Object? ip = null,Object? port = null,Object? banner = free...
  function toJson (line 298) | Map<String, dynamic> toJson()
  function toString (line 311) | String toString()
  class $SshDiscoveryReportCopyWith (line 319) | abstract mixin class $SshDiscoveryReportCopyWith<$Res>  {
    method call (line 322) | $Res call({
  class _$SshDiscoveryReportCopyWithImpl (line 331) | class _$SshDiscoveryReportCopyWithImpl<$Res>
    method call (line 340) | $Res call({Object? generatedAt = null,Object? durationMs = null,Object...
  function maybeMap (line 367) | TResult maybeMap<TResult extends Object?>(TResult Function( _SshDiscover...
  function map (line 389) | TResult map<TResult extends Object?>(TResult Function( _SshDiscoveryRepo...
  function mapOrNull (line 410) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SshDisco...
  function maybeWhen (line 431) | TResult maybeWhen<TResult extends Object?>(TResult Function( String gene...
  function when (line 452) | TResult when<TResult extends Object?>(TResult Function( String generated...
  function whenOrNull (line 472) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String g...
  class _SshDiscoveryReport (line 484) | @JsonSerializable()
    method toJson (line 508) | Map<String, dynamic> toJson()
    method toString (line 522) | String toString()
  class _$SshDiscoveryReportCopyWith (line 530) | abstract mixin class _$SshDiscoveryReportCopyWith<$Res> implements $SshD...
    method call (line 533) | $Res call({
  class __$SshDiscoveryReportCopyWithImpl (line 542) | class __$SshDiscoveryReportCopyWithImpl<$Res>
    method call (line 551) | $Res call({Object? generatedAt = null,Object? durationMs = null,Object...
  function toString (line 586) | String toString()
  class $SshDiscoveryConfigCopyWith (line 594) | abstract mixin class $SshDiscoveryConfigCopyWith<$Res>  {
    method call (line 597) | $Res call({
  class _$SshDiscoveryConfigCopyWithImpl (line 606) | class _$SshDiscoveryConfigCopyWithImpl<$Res>
    method call (line 615) | $Res call({Object? timeoutMs = null,Object? maxConcurrency = null,Obje...
  function maybeMap (line 642) | TResult maybeMap<TResult extends Object?>(TResult Function( _SshDiscover...
  function map (line 664) | TResult map<TResult extends Object?>(TResult Function( _SshDiscoveryConf...
  function mapOrNull (line 685) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SshDisco...
  function maybeWhen (line 706) | TResult maybeWhen<TResult extends Object?>(TResult Function( int timeout...
  function when (line 727) | TResult when<TResult extends Object?>(TResult Function( int timeoutMs,  ...
  function whenOrNull (line 747) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int time...
  class _SshDiscoveryConfig (line 761) | class _SshDiscoveryConfig implements SshDiscoveryConfig {
    method toString (line 788) | String toString()
  class _$SshDiscoveryConfigCopyWith (line 796) | abstract mixin class _$SshDiscoveryConfigCopyWith<$Res> implements $SshD...
    method call (line 799) | $Res call({
  class __$SshDiscoveryConfigCopyWithImpl (line 808) | class __$SshDiscoveryConfigCopyWithImpl<$Res>
    method call (line 817) | $Res call({Object? timeoutMs = null,Object? maxConcurrency = null,Obje...

FILE: lib/data/model/server/discovery_result.g.dart
  function _$SshDiscoveryResultFromJson (line 9) | _SshDiscoveryResult _$SshDiscoveryResultFromJson(Map<String, dynamic> json)
  function _$SshDiscoveryResultToJson (line 17) | Map<String, dynamic> _$SshDiscoveryResultToJson(_SshDiscoveryResult inst...
  function _$SshDiscoveryReportFromJson (line 25) | _SshDiscoveryReport _$SshDiscoveryReportFromJson(Map<String, dynamic> json)
  function _$SshDiscoveryReportToJson (line 35) | Map<String, dynamic> _$SshDiscoveryReportToJson(_SshDiscoveryReport inst...

FILE: lib/data/model/server/disk.dart
  class Disk (line 9) | class Disk with EquatableMixin {
    method parse (line 44) | List<Disk> parse(String raw)
    method _processTopLevelDevice (line 95) | void _processTopLevelDevice(Map<String, dynamic> device, List<Disk> list)
    method _parseFilesystemFields (line 119) | ({BigInt size, BigInt used, BigInt avail, int usedPercent}) _parseFile...
    method parseSize (line 121) | BigInt parseSize(String? sizeStr)
    method parsePercent (line 129) | int parsePercent(String? percentStr)
    method _processSingleDevice (line 145) | Disk? _processSingleDevice(Map<String, dynamic> device)
    method _processDiskDevice (line 178) | Disk? _processDiskDevice(Map<String, dynamic> device)
    method _parseWithOldMethod (line 228) | List<Disk> _parseWithOldMethod(String raw)
  class DiskIO (line 283) | class DiskIO extends TimeSeq<DiskIOPiece> {
    method onUpdate (line 287) | void onUpdate()
    method _getSpeed (line 291) | (double?, double?) _getSpeed(String dev)
    method getSpeed (line 311) | (String?, String?) getSpeed(String dev)
    method _getAllSpeed (line 320) | (String?, String?) _getAllSpeed()
    method parse (line 344) | List<DiskIOPiece> parse(String raw, int time)
  class DiskIOPiece (line 372) | class DiskIOPiece extends TimeSeqIface<DiskIOPiece> {
    method same (line 381) | bool same(DiskIOPiece other)
  class DiskUsage (line 384) | class DiskUsage {
    method parse (line 397) | DiskUsage parse(List<Disk> disks)
  function _shouldCalc (line 415) | bool _shouldCalc(String fs, String mount)

FILE: lib/data/model/server/disk_smart.dart
  class DiskSmart (line 9) | @freezed
    method parse (line 27) | List<DiskSmart> parse(String raw)
    method _isPhysicalDisk (line 78) | bool _isPhysicalDisk(String device)
    method _parseHealthStatus (line 94) | bool? _parseHealthStatus(Map<String, dynamic> data)
    method _parseSmartAttributes (line 164) | Map<String, SmartAttribute> _parseSmartAttributes(Map<String, dynamic>...
    method _extractTemperature (line 195) | double? _extractTemperature(Map<String, dynamic> data, Map<String, Sma...
    method getAttribute (line 222) | SmartAttribute? getAttribute(String name)
    method toString (line 232) | String toString()
  class SmartAttribute (line 235) | @freezed
    method toString (line 254) | String toString()
  class SmartAttributeFlags (line 259) | @freezed
    method toString (line 290) | String toString()

FILE: lib/data/model/server/disk_smart.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toJson (line 26) | Map<String, dynamic> toJson()
  class $DiskSmartCopyWith (line 43) | abstract mixin class $DiskSmartCopyWith<$Res>  {
    method call (line 46) | $Res call({
  class _$DiskSmartCopyWithImpl (line 55) | class _$DiskSmartCopyWithImpl<$Res>
    method call (line 64) | $Res call({Object? device = null,Object? healthy = freezed,Object? tem...
  function maybeMap (line 96) | TResult maybeMap<TResult extends Object?>(TResult Function( _DiskSmart v...
  function map (line 118) | TResult map<TResult extends Object?>(TResult Function( _DiskSmart value)...
  function mapOrNull (line 139) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _DiskSmar...
  function maybeWhen (line 160) | TResult maybeWhen<TResult extends Object?>(TResult Function( String devi...
  function when (line 181) | TResult when<TResult extends Object?>(TResult Function( String device,  ...
  function whenOrNull (line 201) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String d...
  class _DiskSmart (line 213) | @JsonSerializable()
    method toJson (line 248) | Map<String, dynamic> toJson()
  class _$DiskSmartCopyWith (line 266) | abstract mixin class _$DiskSmartCopyWith<$Res> implements $DiskSmartCopy...
    method call (line 269) | $Res call({
  class __$DiskSmartCopyWithImpl (line 278) | class __$DiskSmartCopyWithImpl<$Res>
    method call (line 287) | $Res call({Object? device = null,Object? healthy = freezed,Object? tem...
  function toJson (line 317) | Map<String, dynamic> toJson()
  class $SmartAttributeCopyWith (line 334) | abstract mixin class $SmartAttributeCopyWith<$Res>  {
    method call (line 337) | $Res call({
  class _$SmartAttributeCopyWithImpl (line 346) | class _$SmartAttributeCopyWithImpl<$Res>
    method call (line 355) | $Res call({Object? id = freezed,Object? name = null,Object? value = fr...
  function maybeMap (line 396) | TResult maybeMap<TResult extends Object?>(TResult Function( _SmartAttrib...
  function map (line 418) | TResult map<TResult extends Object?>(TResult Function( _SmartAttribute v...
  function mapOrNull (line 439) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SmartAtt...
  function maybeWhen (line 460) | TResult maybeWhen<TResult extends Object?>(TResult Function( int? id,  S...
  function when (line 481) | TResult when<TResult extends Object?>(TResult Function( int? id,  String...
  function whenOrNull (line 501) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int? id,...
  class _SmartAttribute (line 513) | @JsonSerializable()
    method toJson (line 536) | Map<String, dynamic> toJson()
  class _$SmartAttributeCopyWith (line 554) | abstract mixin class _$SmartAttributeCopyWith<$Res> implements $SmartAtt...
    method call (line 557) | $Res call({
  class __$SmartAttributeCopyWithImpl (line 566) | class __$SmartAttributeCopyWithImpl<$Res>
    method call (line 575) | $Res call({Object? id = freezed,Object? name = null,Object? value = fr...
  function toJson (line 614) | Map<String, dynamic> toJson()
  class $SmartAttributeFlagsCopyWith (line 631) | abstract mixin class $SmartAttributeFlagsCopyWith<$Res>  {
    method call (line 634) | $Res call({
  class _$SmartAttributeFlagsCopyWithImpl (line 643) | class _$SmartAttributeFlagsCopyWithImpl<$Res>
    method call (line 652) | $Res call({Object? value = freezed,Object? string = freezed,Object? pr...
  function maybeMap (line 683) | TResult maybeMap<TResult extends Object?>(TResult Function( _SmartAttrib...
  function map (line 705) | TResult map<TResult extends Object?>(TResult Function( _SmartAttributeFl...
  function mapOrNull (line 726) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SmartAtt...
  function maybeWhen (line 747) | TResult maybeWhen<TResult extends Object?>(TResult Function( int? value,...
  function when (line 768) | TResult when<TResult extends Object?>(TResult Function( int? value,  Str...
  function whenOrNull (line 788) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int? val...
  class _SmartAttributeFlags (line 800) | @JsonSerializable()
    method toJson (line 822) | Map<String, dynamic> toJson()
  class _$SmartAttributeFlagsCopyWith (line 840) | abstract mixin class _$SmartAttributeFlagsCopyWith<$Res> implements $Sma...
    method call (line 843) | $Res call({
  class __$SmartAttributeFlagsCopyWithImpl (line 852) | class __$SmartAttributeFlagsCopyWithImpl<$Res>
    method call (line 861) | $Res call({Object? value = freezed,Object? string = freezed,Object? pr...

FILE: lib/data/model/server/disk_smart.g.dart
  function _$DiskSmartFromJson (line 9) | _DiskSmart _$DiskSmartFromJson(Map<String, dynamic> json)
  function _$DiskSmartToJson (line 23) | Map<String, dynamic> _$DiskSmartToJson(_DiskSmart instance)
  function _$SmartAttributeFromJson (line 36) | _SmartAttribute _$SmartAttributeFromJson(Map<String, dynamic> json)
  function _$SmartAttributeToJson (line 51) | Map<String, dynamic> _$SmartAttributeToJson(_SmartAttribute instance)
  function _$SmartAttributeFlagsFromJson (line 64) | _SmartAttributeFlags _$SmartAttributeFlagsFromJson(Map<String, dynamic> ...
  function _$SmartAttributeFlagsToJson (line 76) | Map<String, dynamic> _$SmartAttributeFlagsToJson(

FILE: lib/data/model/server/dist.dart
  type Dist (line 1) | enum Dist {

FILE: lib/data/model/server/memory.dart
  class Memory (line 3) | class Memory {
    method parse (line 19) | Memory parse(String raw)
  function parseBsdMemory (line 39) | Memory parseBsdMemory(String raw)
  function _convertToKB (line 87) | int _convertToKB(double amount, String unit)
  class Swap (line 103) | class Swap {
    method toString (line 115) | String toString()
    method parse (line 119) | Swap parse(String raw)

FILE: lib/data/model/server/net_speed.dart
  class NetSpeedPart (line 7) | class NetSpeedPart extends TimeSeqIface<NetSpeedPart> {
    method same (line 16) | bool same(NetSpeedPart other)
  type CachedNetVals (line 19) | typedef CachedNetVals = ({String sizeIn, String sizeOut, String speedIn,...
  class NetSpeed (line 21) | class NetSpeed extends TimeSeq<NetSpeedPart> {
    method onUpdate (line 25) | void onUpdate()
    method speedInBytes (line 55) | double speedInBytes(int i)
    method speedOutBytes (line 56) | double speedOutBytes(int i)
    method sizeInBytes (line 57) | BigInt sizeInBytes(int i)
    method sizeOutBytes (line 58) | BigInt sizeOutBytes(int i)
    method speedIn (line 60) | String speedIn({String? device})
    method sizeIn (line 78) | String sizeIn({String? device})
    method speedOut (line 96) | String speedOut({String? device})
    method sizeOut (line 114) | String sizeOut({String? device})
    method deviceIdx (line 132) | int deviceIdx(String? device)
    method buildStandardOutput (line 143) | String buildStandardOutput(double speed)
    method parse (line 150) | List<NetSpeedPart> parse(String raw, int time)
    method parseBsd (line 197) | List<NetSpeedPart> parseBsd(String raw, int time)

FILE: lib/data/model/server/nvdia.dart
  class NvidiaSmi (line 24) | class NvidiaSmi {
    method fromXml (line 25) | List<NvidiaSmiItem> fromXml(String raw)
  class NvidiaSmiItem (line 89) | class NvidiaSmiItem {
    method toString (line 109) | String toString()
  class NvidiaSmiMem (line 114) | class NvidiaSmiMem {
    method toString (line 123) | String toString()
  class NvidiaSmiMemProcess (line 128) | class NvidiaSmiMemProcess {
    method toString (line 136) | String toString()

FILE: lib/data/model/server/ping_result.dart
  class PingResult (line 8) | class PingResult {
  class PingSeqResult (line 28) | class PingSeqResult {
    method toString (line 44) | String toString()
  class PingStatistics (line 49) | class PingStatistics {

FILE: lib/data/model/server/private_key_info.dart
  class PrivateKeyInfo (line 5) | @JsonSerializable()
    method toJson (line 15) | Map<String, dynamic> toJson()

FILE: lib/data/model/server/private_key_info.g.dart
  function _$PrivateKeyInfoFromJson (line 9) | PrivateKeyInfo _$PrivateKeyInfoFromJson(Map<String, dynamic> json)
  function _$PrivateKeyInfoToJson (line 15) | Map<String, dynamic> _$PrivateKeyInfoToJson(PrivateKeyInfo instance)

FILE: lib/data/model/server/proc.dart
  class _ProcValIdxMap (line 5) | class _ProcValIdxMap {
  class Proc (line 34) | class Proc {
    method toJson (line 78) | Map toJson()
    method toString (line 95) | String toString()
  class PsResult (line 106) | class PsResult {
  type ProcSortMode (line 167) | enum ProcSortMode { cpu, mem, pid, user, name }
  function indexOfOrNull (line 170) | int? indexOfOrNull(String val)

FILE: lib/data/model/server/pve.dart
  type PveResType (line 4) | enum PveResType {
  class PveResIface (line 29) | sealed class PveResIface {
    method fromJson (line 34) | PveResIface? fromJson(Map<String, dynamic> json)
  class PveCtrlIface (line 52) | abstract interface class PveCtrlIface {
  class PveLxc (line 60) | final class PveLxc extends PveResIface implements PveCtrlIface {
    method fromJson (line 104) | PveLxc fromJson(Map<String, dynamic> json)
  class PveQemu (line 138) | final class PveQemu extends PveResIface implements PveCtrlIface {
    method fromJson (line 182) | PveQemu fromJson(Map<String, dynamic> json)
  class PveNode (line 216) | final class PveNode extends PveResIface {
    method fromJson (line 242) | PveNode fromJson(Map<String, dynamic> json)
  class PveStorage (line 266) | final class PveStorage extends PveResIface implements PveCtrlIface {
    method fromJson (line 295) | PveStorage fromJson(Map<String, dynamic> json)
  class PveSdn (line 325) | final class PveSdn extends PveResIface implements PveCtrlIface {
    method fromJson (line 338) | PveSdn fromJson(Map<String, dynamic> json)
  class PveRes (line 358) | final class PveRes {
    method parse (line 397) | Future<PveRes> parse((List list, PveRes? old) val)

FILE: lib/data/model/server/sensors.dart
  class SensorAdaptor (line 3) | final class SensorAdaptor {
    method parse (line 17) | SensorAdaptor parse(String raw)
  class SensorItem (line 26) | final class SensorItem {
    method parse (line 47) | List<SensorItem> parse(String raw)

FILE: lib/data/model/server/server.dart
  class ServerStatus (line 16) | class ServerStatus {
  type ServerConn (line 53) | enum ServerConn {

FILE: lib/data/model/server/server_private_info.dart
  class Spi (line 20) | @freezed
    method toString (line 57) | String toString()
    method parseId (line 60) | String parseId(Object? id)
  function save (line 72) | void save()
  function migrateId (line 79) | String? migrateId()
  function toJsonString (line 88) | String toJsonString()
  function isSameAs (line 91) | bool isSameAs(Spi other)
  function shouldReconnect (line 101) | bool shouldReconnect(Spi old)
  function parseAlterUrl (line 106) | (String ip, String usr, int port) parseAlterUrl()

FILE: lib/data/model/server/server_private_info.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toJson (line 31) | Map<String, dynamic> toJson()
  class $SpiCopyWith (line 48) | abstract mixin class $SpiCopyWith<$Res>  {
    method call (line 51) | $Res call({
  class _$SpiCopyWithImpl (line 60) | class _$SpiCopyWithImpl<$Res>
    method call (line 69) | $Res call({Object? name = null,Object? ip = null,Object? port = null,O...
  function maybeMap (line 108) | TResult maybeMap<TResult extends Object?>(TResult Function( _Spi value)?...
  function map (line 130) | TResult map<TResult extends Object?>(TResult Function( _Spi value)  $def...
  function mapOrNull (line 151) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Spi valu...
  function maybeWhen (line 172) | TResult maybeWhen<TResult extends Object?>(TResult Function( String name...
  function when (line 193) | TResult when<TResult extends Object?>(TResult Function( String name,  St...
  function whenOrNull (line 213) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String n...
  class _Spi (line 226) | @JsonSerializable(includeIfNull: false)
    method toJson (line 286) | Map<String, dynamic> toJson()
  class _$SpiCopyWith (line 304) | abstract mixin class _$SpiCopyWith<$Res> implements $SpiCopyWith<$Res> {
    method call (line 307) | $Res call({
  class __$SpiCopyWithImpl (line 316) | class __$SpiCopyWithImpl<$Res>
    method call (line 325) | $Res call({Object? name = null,Object? ip = null,Object? port = null,O...

FILE: lib/data/model/server/server_private_info.g.dart
  function _$SpiFromJson (line 9) | _Spi _$SpiFromJson(Map<String, dynamic> json)
  function _$SpiToJson (line 39) | Map<String, dynamic> _$SpiToJson(_Spi instance)

FILE: lib/data/model/server/server_status_update_req.dart
  class ServerStatusUpdateReq (line 21) | class ServerStatusUpdateReq {
  function getStatus (line 35) | Future<ServerStatus> getStatus(ServerStatusUpdateReq req)
  function _getLinuxStatus (line 45) | Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req)
  function _getBsdStatus (line 201) | Future<ServerStatus> _getBsdStatus(ServerStatusUpdateReq req)
  function _parseUpTime (line 252) | String? _parseUpTime(String raw)
  function _parseSysVer (line 291) | String? _parseSysVer(String raw)
  function _parseHostName (line 299) | String? _parseHostName(String raw)
  function _getWindowsStatus (line 308) | Future<ServerStatus> _getWindowsStatus(ServerStatusUpdateReq req)
  function _parseWindowsNetworkData (line 333) | void _parseWindowsNetworkData(ServerStatusUpdateReq req, Map<String, Str...
  function _parseWindowsSystemData (line 352) | void _parseWindowsSystemData(ServerStatusUpdateReq req, Map<String, Stri...
  function _parseWindowsHostData (line 364) | void _parseWindowsHostData(ServerStatusUpdateReq req, Map<String, String...
  function _parseWindowsCpuData (line 376) | void _parseWindowsCpuData(ServerStatusUpdateReq req, Map<String, String>...
  function _parseWindowsMemoryData (line 408) | void _parseWindowsMemoryData(ServerStatusUpdateReq req, Map<String, Stri...
  function _parseWindowsDiskData (line 423) | void _parseWindowsDiskData(ServerStatusUpdateReq req, Map<String, String...
  function _parseWindowsUptimeData (line 437) | void _parseWindowsUptimeData(ServerStatusUpdateReq req, Map<String, Stri...
  function _parseWindowsDiskIOData (line 452) | void _parseWindowsDiskIOData(ServerStatusUpdateReq req, Map<String, Stri...
  function _parseWindowsConnectionData (line 465) | void _parseWindowsConnectionData(ServerStatusUpdateReq req, Map<String, ...
  function _parseWindowsBatteryData (line 478) | void _parseWindowsBatteryData(ServerStatusUpdateReq req, Map<String, Str...
  function _parseWindowsTemperatureData (line 494) | void _parseWindowsTemperatureData(ServerStatusUpdateReq req, Map<String,...
  function _parseWindowsGpuData (line 506) | void _parseWindowsGpuData(ServerStatusUpdateReq req, Map<String, String>...
  function _parseWindowsBatteries (line 520) | List<Battery> _parseWindowsBatteries(String raw)
  function _parseWindowsNetwork (line 551) | List<NetSpeedPart> _parseWindowsNetwork(String raw, int currentTime)
  function _parseWindowsDiskIO (line 597) | List<DiskIOPiece> _parseWindowsDiskIO(String raw, int currentTime)
  function _parseWindowsTemperatures (line 651) | void _parseWindowsTemperatures(Temperatures temps, String raw)

FILE: lib/data/model/server/snippet.dart
  class Snippet (line 11) | @freezed
  function fmtWithSpi (line 37) | String fmtWithSpi(Spi spi)
  function runInTerm (line 47) | Future<void> runInTerm(Terminal terminal, Spi spi, {bool autoEnter = fal...
  function _doTermKeys (line 115) | Future<void> _doTermKeys(Terminal terminal, MapEntry<String, TerminalKey...
  function _find (line 140) | MapEntry<String, T>? _find<T>(Map<String, T> map, String key)
  class SnippetResult (line 157) | class SnippetResult {
  type SnippetFuncCtx (line 165) | typedef SnippetFuncCtx = ({Terminal term, String raw});
  class SnippetFuncs (line 167) | abstract final class SnippetFuncs {
    method sleep (line 176) | FutureOr<void> sleep(SnippetFuncCtx ctx)
    method enter (line 183) | FutureOr<void> enter(SnippetFuncCtx ctx)

FILE: lib/data/model/server/snippet.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toJson (line 27) | Map<String, dynamic> toJson()
  function toString (line 40) | String toString()
  class $SnippetCopyWith (line 48) | abstract mixin class $SnippetCopyWith<$Res>  {
    method call (line 51) | $Res call({
  class _$SnippetCopyWithImpl (line 60) | class _$SnippetCopyWithImpl<$Res>
    method call (line 69) | $Res call({Object? name = null,Object? script = null,Object? tags = fr...
  function maybeMap (line 97) | TResult maybeMap<TResult extends Object?>(TResult Function( _Snippet val...
  function map (line 119) | TResult map<TResult extends Object?>(TResult Function( _Snippet value)  ...
  function mapOrNull (line 140) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Snippet ...
  function maybeWhen (line 161) | TResult maybeWhen<TResult extends Object?>(TResult Function( String name...
  function when (line 182) | TResult when<TResult extends Object?>(TResult Function( String name,  St...
  function whenOrNull (line 202) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String n...
  class _Snippet (line 214) | @JsonSerializable()
    method toJson (line 251) | Map<String, dynamic> toJson()
    method toString (line 265) | String toString()
  class _$SnippetCopyWith (line 273) | abstract mixin class _$SnippetCopyWith<$Res> implements $SnippetCopyWith...
    method call (line 276) | $Res call({
  class __$SnippetCopyWithImpl (line 285) | class __$SnippetCopyWithImpl<$Res>
    method call (line 294) | $Res call({Object? name = null,Object? script = null,Object? tags = fr...

FILE: lib/data/model/server/snippet.g.dart
  function _$SnippetFromJson (line 9) | _Snippet _$SnippetFromJson(Map<String, dynamic> json)
  function _$SnippetToJson (line 19) | Map<String, dynamic> _$SnippetToJson(_Snippet instance)

FILE: lib/data/model/server/system.dart
  type SystemType (line 3) | enum SystemType {

FILE: lib/data/model/server/systemd.dart
  type SystemdUnitFunc (line 5) | enum SystemdUnitFunc {
  type SystemdUnitType (line 25) | enum SystemdUnitType {
  type SystemdUnitScope (line 36) | enum SystemdUnitScope {
  type SystemdScopeFilter (line 53) | enum SystemdScopeFilter {
  type SystemdUnitState (line 65) | enum SystemdUnitState {
  class SystemdUnit (line 82) | final class SystemdUnit {
    method getCmd (line 97) | String getCmd({required SystemdUnitFunc func, required bool isRoot})

FILE: lib/data/model/server/temp.dart
  class Temperatures (line 1) | class Temperatures {
    method parse (line 4) | void parse(String type, String value)
    method get (line 22) | double? get(String name)

FILE: lib/data/model/server/time_seq.dart
  class Fifo (line 3) | class Fifo<T> extends ListBase<T> {
    method add (line 11) | void add(element)
  class TimeSeq (line 40) | abstract class TimeSeq<T extends TimeSeqIface<T>> extends Fifo<List<T>> {
    method onUpdate (line 53) | void onUpdate()
    method update (line 55) | void update(List<T> new_)
  class TimeSeqIface (line 79) | abstract class TimeSeqIface<T> {
    method same (line 80) | bool same(T other)

FILE: lib/data/model/server/try_limiter.dart
  class TryLimiter (line 3) | class TryLimiter {
    method canTry (line 8) | bool canTry(String id)
    method inc (line 20) | void inc(String sid)
    method reset (line 24) | void reset(String id)
    method clear (line 28) | void clear()

FILE: lib/data/model/server/windows_parser.dart
  class WindowsCpuResult (line 11) | class WindowsCpuResult {
  class WindowsParser (line 22) | class WindowsParser {
    method parseCustomCommands (line 26) | void parseCustomCommands(
    method parseUpTime (line 43) | String? parseUpTime(String raw)
    method parseCpu (line 105) | WindowsCpuResult parseCpu(String raw, ServerStatus serverStatus)
    method parseMemory (line 224) | Memory? parseMemory(String raw)
    method parseDisks (line 244) | List<Disk> parseDisks(String raw)

FILE: lib/data/model/server/wol_cfg.dart
  class WakeOnLanCfg (line 8) | @JsonSerializable(includeIfNull: false)
    method validate (line 16) | (Object?, bool) validate()
    method wake (line 29) | Future<void> wake()
    method toJson (line 43) | Map<String, dynamic> toJson()

FILE: lib/data/model/server/wol_cfg.g.dart
  function _$WakeOnLanCfgFromJson (line 9) | WakeOnLanCfg _$WakeOnLanCfgFromJson(Map<String, dynamic> json)
  function _$WakeOnLanCfgToJson (line 15) | Map<String, dynamic> _$WakeOnLanCfgToJson(WakeOnLanCfg instance)

FILE: lib/data/model/sftp/browser_status.dart
  class SftpBrowserStatus (line 7) | class SftpBrowserStatus {
  class _AbsolutePath (line 17) | class _AbsolutePath {
    method undo (line 42) | bool undo()

FILE: lib/data/model/sftp/req.dart
  class SftpReq (line 3) | class SftpReq {
  type SftpReqType (line 69) | enum SftpReqType { download, upload }
  class SftpReqStatus (line 71) | class SftpReqStatus {
    method dispose (line 101) | void dispose()
    method onNotify (line 106) | void onNotify(dynamic event)
  type SftpWorkerStatus (line 134) | enum SftpWorkerStatus { preparing, sshConnectted, loading, finished }

FILE: lib/data/model/sftp/worker.dart
  class SftpWorker (line 16) | class SftpWorker {
    method _dispose (line 24) | void _dispose()
    method init (line 30) | Future<void> init()
    method mainMessageHandler (line 41) | void mainMessageHandler(dynamic data, SendPort isolateSendPort)
  function isolateMessageHandler (line 47) | Future<void> isolateMessageHandler(
  function _download (line 68) | Future<void> _download(
  function _upload (line 136) | Future<void> _upload(

FILE: lib/data/model/ssh/virtual_key.dart
  type VirtualKeyFunc (line 7) | enum VirtualKeyFunc { toggleIME, backspace, clipboard, snippet, file }
  type VirtKey (line 9) | enum VirtKey {
  function loadFromStore (line 184) | List<VirtKey> loadFromStore({bool saveDefaultIfErr = true})

FILE: lib/data/provider/ai/ask_ai.dart
  class AskAiRepository (line 15) | class AskAiRepository {
    method ask (line 23) | Stream<AskAiEvent> ask({
    method _buildRequestBody (line 203) | Map<String, dynamic> _buildRequestBody({
    method _composeUri (line 265) | Uri _composeUri(String base, String path)
  class _ToolCallBuilder (line 272) | class _ToolCallBuilder {
    method tryBuild (line 279) | AskAiCommand? tryBuild({bool force = false})
  type AskAiConfigField (line 307) | @immutable
  class AskAiConfigException (line 310) | class AskAiConfigException implements Exception {
    method toString (line 319) | String toString()
  class AskAiNetworkException (line 334) | @immutable
    method toString (line 342) | String toString()

FILE: lib/data/provider/container.dart
  class ContainerState (line 24) | @freezed
  class ContainerNotifier (line 37) | @riverpod
    method build (line 43) | ContainerState build(SSHClient? client, String userName, String hostId...
    method _getSudoPassword (line 53) | Future<String?> _getSudoPassword()
    method setType (line 65) | Future<void> setType(ContainerType type)
    method _requiresSudo (line 72) | void _requiresSudo()
    method refresh (line 86) | Future<void> refresh({bool isAuto = false})
    method stop (line 280) | Future<ContainerErr?> stop(String id)
    method start (line 282) | Future<ContainerErr?> start(String id)
    method delete (line 284) | Future<ContainerErr?> delete(String id, bool force)
    method restart (line 291) | Future<ContainerErr?> restart(String id)
    method pruneImages (line 293) | Future<ContainerErr?> pruneImages({bool all = true})
    method pruneContainers (line 298) | Future<ContainerErr?> pruneContainers()
    method pruneVolumes (line 302) | Future<ContainerErr?> pruneVolumes()
    method pruneSystem (line 306) | Future<ContainerErr?> pruneSystem()
    method run (line 310) | Future<ContainerErr?> run(String cmd, {bool autoRefresh = true})
    method _wrap (line 363) | String _wrap(String cmd)
  function _buildSudoCmd (line 376) | String _buildSudoCmd(String baseCmd, String password)
  type ContainerCmdType (line 381) | enum ContainerCmdType {

FILE: lib/data/provider/container.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toString (line 36) | String toString()
  class $ContainerStateCopyWith (line 44) | abstract mixin class $ContainerStateCopyWith<$Res>  {
    method call (line 47) | $Res call({
  class _$ContainerStateCopyWithImpl (line 56) | class _$ContainerStateCopyWithImpl<$Res>
    method call (line 65) | $Res call({Object? items = freezed,Object? images = freezed,Object? ve...
  function maybeMap (line 95) | TResult maybeMap<TResult extends Object?>(TResult Function( _ContainerSt...
  function map (line 117) | TResult map<TResult extends Object?>(TResult Function( _ContainerState v...
  function mapOrNull (line 138) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Containe...
  function maybeWhen (line 159) | TResult maybeWhen<TResult extends Object?>(TResult Function( List<Contai...
  function when (line 180) | TResult when<TResult extends Object?>(TResult Function( List<ContainerPs...
  function whenOrNull (line 200) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( List<Con...
  class _ContainerState (line 214) | class _ContainerState implements ContainerState {
    method toString (line 260) | String toString()
  class _$ContainerStateCopyWith (line 268) | abstract mixin class _$ContainerStateCopyWith<$Res> implements $Containe...
    method call (line 271) | $Res call({
  class __$ContainerStateCopyWithImpl (line 280) | class __$ContainerStateCopyWithImpl<$Res>
    method call (line 289) | $Res call({Object? items = freezed,Object? images = freezed,Object? ve...

FILE: lib/data/provider/container.g.dart
  class ContainerNotifierProvider (line 15) | final class ContainerNotifierProvider
    method debugGetCreateSourceHash (line 29) | String debugGetCreateSourceHash()
    method toString (line 32) | String toString()
    method create (line 40) | ContainerNotifier create()
    method overrideWithValue (line 43) | Override overrideWithValue(ContainerState value)
  function _$containerNotifierHash (line 61) | String _$containerNotifierHash()
  class ContainerNotifierFamily (line 63) | final class ContainerNotifierFamily extends $Family
    method call (line 81) | ContainerNotifierProvider call(
    method toString (line 92) | String toString()
  class _$ContainerNotifier (line 95) | abstract class _$ContainerNotifier extends $Notifier<ContainerState> {
    method build (line 102) | ContainerState build(
    method runBuild (line 110) | void runBuild()

FILE: lib/data/provider/private_key.dart
  class PrivateKeyState (line 10) | @freezed
  class PrivateKeyNotifier (line 15) | @Riverpod(keepAlive: true)
    method build (line 18) | PrivateKeyState build()
    method reload (line 22) | void reload()
    method _load (line 28) | PrivateKeyState _load()
    method add (line 33) | void add(PrivateKeyInfo info)
    method delete (line 40) | void delete(PrivateKeyInfo info)
    method update (line 47) | void update(PrivateKeyInfo old, PrivateKeyInfo newInfo)

FILE: lib/data/provider/private_key.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toString (line 36) | String toString()
  class $PrivateKeyStateCopyWith (line 44) | abstract mixin class $PrivateKeyStateCopyWith<$Res>  {
    method call (line 47) | $Res call({
  class _$PrivateKeyStateCopyWithImpl (line 56) | class _$PrivateKeyStateCopyWithImpl<$Res>
    method call (line 65) | $Res call({Object? keys = null,})
  function maybeMap (line 89) | TResult maybeMap<TResult extends Object?>(TResult Function( _PrivateKeyS...
  function map (line 111) | TResult map<TResult extends Object?>(TResult Function( _PrivateKeyState ...
  function mapOrNull (line 132) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _PrivateK...
  function maybeWhen (line 153) | TResult maybeWhen<TResult extends Object?>(TResult Function( List<Privat...
  function when (line 174) | TResult when<TResult extends Object?>(TResult Function( List<PrivateKeyI...
  function whenOrNull (line 194) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( List<Pri...
  class _PrivateKeyState (line 208) | class _PrivateKeyState implements PrivateKeyState {
    method toString (line 238) | String toString()
  class _$PrivateKeyStateCopyWith (line 246) | abstract mixin class _$PrivateKeyStateCopyWith<$Res> implements $Private...
    method call (line 249) | $Res call({
  class __$PrivateKeyStateCopyWithImpl (line 258) | class __$PrivateKeyStateCopyWithImpl<$Res>
    method call (line 267) | $Res call({Object? keys = null,})

FILE: lib/data/provider/private_key.g.dart
  class PrivateKeyNotifierProvider (line 15) | final class PrivateKeyNotifierProvider
    method debugGetCreateSourceHash (line 29) | String debugGetCreateSourceHash()
    method create (line 33) | PrivateKeyNotifier create()
    method overrideWithValue (line 36) | Override overrideWithValue(PrivateKeyState value)
  function _$privateKeyNotifierHash (line 44) | String _$privateKeyNotifierHash()
  class _$PrivateKeyNotifier (line 47) | abstract class _$PrivateKeyNotifier extends $Notifier<PrivateKeyState> {
    method build (line 48) | PrivateKeyState build()
    method runBuild (line 51) | void runBuild()

FILE: lib/data/provider/providers.dart
  function useNotifier (line 18) | T useNotifier<T extends Notifier<Object?>>(NotifierProvider<T, Object?> ...
  function readProvider (line 22) | T readProvider<T>(ProviderBase<T> provider)
  function watchProvider (line 26) | T watchProvider<T>(ProviderBase<T> provider)
  class MyProviders (line 33) | final class MyProviders {
  class ReadMyProvider (line 42) | final class ReadMyProvider {
    method call (line 46) | T call<T>(ProviderBase<T> provider)
  class WatchMyProvider (line 56) | final class WatchMyProvider {
    method call (line 60) | T call<T>(ProviderBase<T> provider)
  class UseNotifierMyProvider (line 70) | final class UseNotifierMyProvider {
    method call (line 74) | T call<T extends Notifier<Object?>>(NotifierProvider<T, Object?> provi...

FILE: lib/data/provider/pve.dart
  type PveCtrlFunc (line 20) | typedef PveCtrlFunc = Future<bool> Function(String node, String id);
  class PveState (line 22) | @freezed
  class PveNotifier (line 33) | @riverpod
    method build (line 45) | PveState build(Spi spiParam)
    method _initSession (line 65) | void _initSession()
    method _init (line 82) | Future<void> _init()
    method _forward (line 96) | Future<void> _forward()
    method cf (line 114) | Future<ConnectionTask<Socket>> cf(
    method _login (line 139) | Future<void> _login()
    method _getRelease (line 163) | Future<void> _getRelease()
    method list (line 171) | Future<void> list()
    method reboot (line 190) | Future<bool> reboot(String node, String id)
    method start (line 200) | Future<bool> start(String node, String id)
    method stop (line 210) | Future<bool> stop(String node, String id)
    method shutdown (line 220) | Future<bool> shutdown(String node, String id)
    method _isCtrlSuc (line 230) | bool _isCtrlSuc(Response resp)
    method dispose (line 234) | Future<void> dispose()

FILE: lib/data/provider/pve.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toString (line 36) | String toString()
  class $PveStateCopyWith (line 44) | abstract mixin class $PveStateCopyWith<$Res>  {
    method call (line 47) | $Res call({
  class _$PveStateCopyWithImpl (line 56) | class _$PveStateCopyWithImpl<$Res>
    method call (line 65) | $Res call({Object? error = freezed,Object? data = freezed,Object? rele...
  function maybeMap (line 93) | TResult maybeMap<TResult extends Object?>(TResult Function( _PveState va...
  function map (line 115) | TResult map<TResult extends Object?>(TResult Function( _PveState value) ...
  function mapOrNull (line 136) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _PveState...
  function maybeWhen (line 157) | TResult maybeWhen<TResult extends Object?>(TResult Function( PveErr? err...
  function when (line 178) | TResult when<TResult extends Object?>(TResult Function( PveErr? error,  ...
  function whenOrNull (line 198) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( PveErr? ...
  class _PveState (line 212) | class _PveState implements PveState {
    method toString (line 240) | String toString()
  class _$PveStateCopyWith (line 248) | abstract mixin class _$PveStateCopyWith<$Res> implements $PveStateCopyWi...
    method call (line 251) | $Res call({
  class __$PveStateCopyWithImpl (line 260) | class __$PveStateCopyWithImpl<$Res>
    method call (line 269) | $Res call({Object? error = freezed,Object? data = freezed,Object? rele...

FILE: lib/data/provider/pve.g.dart
  class PveNotifierProvider (line 15) | final class PveNotifierProvider
    method debugGetCreateSourceHash (line 29) | String debugGetCreateSourceHash()
    method toString (line 32) | String toString()
    method create (line 40) | PveNotifier create()
    method overrideWithValue (line 43) | Override overrideWithValue(PveState value)
  function _$pveNotifierHash (line 61) | String _$pveNotifierHash()
  class PveNotifierFamily (line 63) | final class PveNotifierFamily extends $Family
    method call (line 74) | PveNotifierProvider call(Spi spiParam)
    method toString (line 78) | String toString()
  class _$PveNotifier (line 81) | abstract class _$PveNotifier extends $Notifier<PveState> {
    method build (line 85) | PveState build(Spi spiParam)
    method runBuild (line 88) | void runBuild()

FILE: lib/data/provider/server/all.dart
  class ServersState (line 17) | @freezed
  class ServersNotifier (line 28) | @Riverpod(keepAlive: true)
    method build (line 31) | ServersState build()
    method reload (line 35) | Future<void> reload()
    method _load (line 42) | ServersState _load()
    method _calculateTags (line 70) | Set<String> _calculateTags(Map<String, Spi> servers)
    method pick (line 85) | Spi? pick({Spi? spi, String? id})
    method refresh (line 97) | Future<void> refresh({Spi? spi, bool onlyFailed = false})
    method startAutoRefresh (line 137) | Future<void> startAutoRefresh()
    method stopAutoRefresh (line 151) | void stopAutoRefresh()
    method setDisconnected (line 161) | void setDisconnected()
    method closeServer (line 173) | void closeServer({String? id})
    method closeOneServer (line 183) | void closeOneServer(String id)
    method addServer (line 201) | void addServer(Spi spi)
    method delServer (line 216) | void delServer(String id)
    method deleteAll (line 235) | void deleteAll()
    method updateServerOrder (line 249) | void updateServerOrder(List<String> order)
    method _isSameOrder (line 278) | bool _isSameOrder(List<String> a, List<String> b)
    method updateServer (line 293) | Future<void> updateServer(Spi old, Spi newSpi)

FILE: lib/data/provider/server/all.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toString (line 36) | String toString()
  class $ServersStateCopyWith (line 44) | abstract mixin class $ServersStateCopyWith<$Res>  {
    method call (line 47) | $Res call({
  class _$ServersStateCopyWithImpl (line 56) | class _$ServersStateCopyWithImpl<$Res>
    method call (line 65) | $Res call({Object? servers = null,Object? serverOrder = null,Object? t...
  function maybeMap (line 93) | TResult maybeMap<TResult extends Object?>(TResult Function( _ServersStat...
  function map (line 115) | TResult map<TResult extends Object?>(TResult Function( _ServersState val...
  function mapOrNull (line 136) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ServersS...
  function maybeWhen (line 157) | TResult maybeWhen<TResult extends Object?>(TResult Function( Map<String,...
  function when (line 178) | TResult when<TResult extends Object?>(TResult Function( Map<String, Spi>...
  function whenOrNull (line 198) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( Map<Stri...
  class _ServersState (line 212) | class _ServersState implements ServersState {
    method toString (line 264) | String toString()
  class _$ServersStateCopyWith (line 272) | abstract mixin class _$ServersStateCopyWith<$Res> implements $ServersSta...
    method call (line 275) | $Res call({
  class __$ServersStateCopyWithImpl (line 284) | class __$ServersStateCopyWithImpl<$Res>
    method call (line 293) | $Res call({Object? servers = null,Object? serverOrder = null,Object? t...

FILE: lib/data/provider/server/all.g.dart
  class ServersNotifierProvider (line 15) | final class ServersNotifierProvider
    method debugGetCreateSourceHash (line 29) | String debugGetCreateSourceHash()
    method create (line 33) | ServersNotifier create()
    method overrideWithValue (line 36) | Override overrideWithValue(ServersState value)
  function _$serversNotifierHash (line 44) | String _$serversNotifierHash()
  class _$ServersNotifier (line 46) | abstract class _$ServersNotifier extends $Notifier<ServersState> {
    method build (line 47) | ServersState build()
    method runBuild (line 50) | void runBuild()

FILE: lib/data/provider/server/single.dart
  class ServerState (line 30) | @freezed
  class ServerNotifier (line 41) | @Riverpod(keepAlive: true)
    method build (line 44) | ServerState build(String serverId)
    method updateConnection (line 55) | void updateConnection(ServerConn conn)
    method updateStatus (line 60) | void updateStatus(ServerStatus status)
    method updateClient (line 65) | void updateClient(SSHClient? client)
    method updateSpi (line 70) | void updateSpi(Spi spi)
    method closeConnection (line 75) | void closeConnection()
    method refresh (line 84) | Future<void> refresh()
    method _updateServer (line 95) | Future<void> _updateServer()
    method _getData (line 99) | Future<void> _getData()

FILE: lib/data/provider/server/single.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toString (line 36) | String toString()
  class $ServerStateCopyWith (line 44) | abstract mixin class $ServerStateCopyWith<$Res>  {
    method call (line 47) | $Res call({
  class _$ServerStateCopyWithImpl (line 56) | class _$ServerStateCopyWithImpl<$Res>
    method call (line 65) | $Res call({Object? spi = null,Object? status = null,Object? conn = nul...
  function maybeMap (line 101) | TResult maybeMap<TResult extends Object?>(TResult Function( _ServerState...
  function map (line 123) | TResult map<TResult extends Object?>(TResult Function( _ServerState valu...
  function mapOrNull (line 144) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ServerSt...
  function maybeWhen (line 165) | TResult maybeWhen<TResult extends Object?>(TResult Function( Spi spi,  S...
  function when (line 186) | TResult when<TResult extends Object?>(TResult Function( Spi spi,  Server...
  function whenOrNull (line 206) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( Spi spi,...
  class _ServerState (line 220) | class _ServerState implements ServerState {
    method toString (line 247) | String toString()
  class _$ServerStateCopyWith (line 255) | abstract mixin class _$ServerStateCopyWith<$Res> implements $ServerState...
    method call (line 258) | $Res call({
  class __$ServerStateCopyWithImpl (line 267) | class __$ServerStateCopyWithImpl<$Res>
    method call (line 276) | $Res call({Object? spi = null,Object? status = null,Object? conn = nul...

FILE: lib/data/provider/server/single.g.dart
  class ServerNotifierProvider (line 15) | final class ServerNotifierProvider
    method debugGetCreateSourceHash (line 29) | String debugGetCreateSourceHash()
    method toString (line 32) | String toString()
    method create (line 40) | ServerNotifier create()
    method overrideWithValue (line 43) | Override overrideWithValue(ServerState value)
  function _$serverNotifierHash (line 61) | String _$serverNotifierHash()
  class ServerNotifierFamily (line 63) | final class ServerNotifierFamily extends $Family
    method call (line 81) | ServerNotifierProvider call(String serverId)
    method toString (line 85) | String toString()
  class _$ServerNotifier (line 88) | abstract class _$ServerNotifier extends $Notifier<ServerState> {
    method build (line 92) | ServerState build(String serverId)
    method runBuild (line 95) | void runBuild()

FILE: lib/data/provider/sftp.dart
  class SftpState (line 11) | @freezed
  class SftpNotifier (line 18) | @Riverpod(keepAlive: true)
    method build (line 21) | SftpState build()
    method get (line 25) | SftpReqStatus? get(int id)
    method add (line 33) | int add(SftpReq req, {Completer? completer})
    method dispose (line 45) | void dispose()
    method cancel (line 52) | void cancel(int id)
    method _notifyListeners (line 65) | void _notifyListeners()

FILE: lib/data/provider/sftp.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toString (line 36) | String toString()
  class $SftpStateCopyWith (line 44) | abstract mixin class $SftpStateCopyWith<$Res>  {
    method call (line 47) | $Res call({
  class _$SftpStateCopyWithImpl (line 56) | class _$SftpStateCopyWithImpl<$Res>
    method call (line 65) | $Res call({Object? requests = null,})
  function maybeMap (line 89) | TResult maybeMap<TResult extends Object?>(TResult Function( _SftpState v...
  function map (line 111) | TResult map<TResult extends Object?>(TResult Function( _SftpState value)...
  function mapOrNull (line 132) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SftpStat...
  function maybeWhen (line 153) | TResult maybeWhen<TResult extends Object?>(TResult Function( List<SftpRe...
  function when (line 174) | TResult when<TResult extends Object?>(TResult Function( List<SftpReqStat...
  function whenOrNull (line 194) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( List<Sft...
  class _SftpState (line 208) | class _SftpState implements SftpState {
    method toString (line 238) | String toString()
  class _$SftpStateCopyWith (line 246) | abstract mixin class _$SftpStateCopyWith<$Res> implements $SftpStateCopy...
    method call (line 249) | $Res call({
  class __$SftpStateCopyWithImpl (line 258) | class __$SftpStateCopyWithImpl<$Res>
    method call (line 267) | $Res call({Object? requests = null,})

FILE: lib/data/provider/sftp.g.dart
  class SftpNotifierProvider (line 15) | final class SftpNotifierProvider
    method debugGetCreateSourceHash (line 29) | String debugGetCreateSourceHash()
    method create (line 33) | SftpNotifier create()
    method overrideWithValue (line 36) | Override overrideWithValue(SftpState value)
  function _$sftpNotifierHash (line 44) | String _$sftpNotifierHash()
  class _$SftpNotifier (line 46) | abstract class _$SftpNotifier extends $Notifier<SftpState> {
    method build (line 47) | SftpState build()
    method runBuild (line 50) | void runBuild()

FILE: lib/data/provider/snippet.dart
  class SnippetState (line 11) | @freezed
  class SnippetNotifier (line 19) | @Riverpod(keepAlive: true)
    method build (line 22) | SnippetState build()
    method reload (line 26) | void reload()
    method _load (line 32) | SnippetState _load()
    method _computeTags (line 51) | Set<String> _computeTags(List<Snippet> snippets)
    method add (line 62) | void add(Snippet snippet)
    method del (line 70) | void del(Snippet snippet)
    method update (line 78) | void update(Snippet old, Snippet newOne)
    method renameTag (line 87) | void renameTag(String old, String newOne)

FILE: lib/data/provider/snippet.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toString (line 36) | String toString()
  class $SnippetStateCopyWith (line 44) | abstract mixin class $SnippetStateCopyWith<$Res>  {
    method call (line 47) | $Res call({
  class _$SnippetStateCopyWithImpl (line 56) | class _$SnippetStateCopyWithImpl<$Res>
    method call (line 65) | $Res call({Object? snippets = null,Object? tags = null,})
  function maybeMap (line 90) | TResult maybeMap<TResult extends Object?>(TResult Function( _SnippetStat...
  function map (line 112) | TResult map<TResult extends Object?>(TResult Function( _SnippetState val...
  function mapOrNull (line 133) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnippetS...
  function maybeWhen (line 154) | TResult maybeWhen<TResult extends Object?>(TResult Function( List<Snippe...
  function when (line 175) | TResult when<TResult extends Object?>(TResult Function( List<Snippet> sn...
  function whenOrNull (line 195) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( List<Sni...
  class _SnippetState (line 209) | class _SnippetState implements SnippetState {
    method toString (line 246) | String toString()
  class _$SnippetStateCopyWith (line 254) | abstract mixin class _$SnippetStateCopyWith<$Res> implements $SnippetSta...
    method call (line 257) | $Res call({
  class __$SnippetStateCopyWithImpl (line 266) | class __$SnippetStateCopyWithImpl<$Res>
    method call (line 275) | $Res call({Object? snippets = null,Object? tags = null,})

FILE: lib/data/provider/snippet.g.dart
  class SnippetNotifierProvider (line 15) | final class SnippetNotifierProvider
    method debugGetCreateSourceHash (line 29) | String debugGetCreateSourceHash()
    method create (line 33) | SnippetNotifier create()
    method overrideWithValue (line 36) | Override overrideWithValue(SnippetState value)
  function _$snippetNotifierHash (line 44) | String _$snippetNotifierHash()
  class _$SnippetNotifier (line 46) | abstract class _$SnippetNotifier extends $Notifier<SnippetState> {
    method build (line 47) | SnippetState build()
    method runBuild (line 50) | void runBuild()

FILE: lib/data/provider/systemd.dart
  class SystemdState (line 13) | @freezed
  class SystemdNotifier (line 22) | @riverpod
    method build (line 27) | SystemdState build(Spi spi)
    method setScopeFilter (line 46) | void setScopeFilter(SystemdScopeFilter filter)
    method getUnits (line 50) | Future<void> getUnits()
    method _parseUnitObj (line 79) | Future<List<SystemdUnit>> _parseUnitObj(List<String> unitNames, System...
  function _getIniVal (line 183) | String? _getIniVal(String line)

FILE: lib/data/provider/systemd.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toString (line 36) | String toString()
  class $SystemdStateCopyWith (line 44) | abstract mixin class $SystemdStateCopyWith<$Res>  {
    method call (line 47) | $Res call({
  class _$SystemdStateCopyWithImpl (line 56) | class _$SystemdStateCopyWithImpl<$Res>
    method call (line 65) | $Res call({Object? isBusy = null,Object? units = null,Object? scopeFil...
  function maybeMap (line 91) | TResult maybeMap<TResult extends Object?>(TResult Function( _SystemdStat...
  function map (line 113) | TResult map<TResult extends Object?>(TResult Function( _SystemdState val...
  function mapOrNull (line 134) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SystemdS...
  function maybeWhen (line 155) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool isBusy...
  function when (line 176) | TResult when<TResult extends Object?>(TResult Function( bool isBusy,  Li...
  function whenOrNull (line 196) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool isB...
  class _SystemdState (line 210) | class _SystemdState implements SystemdState {
    method toString (line 242) | String toString()
  class _$SystemdStateCopyWith (line 250) | abstract mixin class _$SystemdStateCopyWith<$Res> implements $SystemdSta...
    method call (line 253) | $Res call({
  class __$SystemdStateCopyWithImpl (line 262) | class __$SystemdStateCopyWithImpl<$Res>
    method call (line 271) | $Res call({Object? isBusy = null,Object? units = null,Object? scopeFil...

FILE: lib/data/provider/systemd.g.dart
  class SystemdNotifierProvider (line 15) | final class SystemdNotifierProvider
    method debugGetCreateSourceHash (line 29) | String debugGetCreateSourceHash()
    method toString (line 32) | String toString()
    method create (line 40) | SystemdNotifier create()
    method overrideWithValue (line 43) | Override overrideWithValue(SystemdState value)
  function _$systemdNotifierHash (line 61) | String _$systemdNotifierHash()
  class SystemdNotifierFamily (line 63) | final class SystemdNotifierFamily extends $Family
    method call (line 81) | SystemdNotifierProvider call(Spi spi)
    method toString (line 85) | String toString()
  class _$SystemdNotifier (line 88) | abstract class _$SystemdNotifier extends $Notifier<SystemdState> {
    method build (line 92) | SystemdState build(Spi spi)
    method runBuild (line 95) | void runBuild()

FILE: lib/data/provider/virtual_keyboard.dart
  class VirtKeyState (line 9) | @freezed
  class VirtKeyboard (line 18) | @riverpod
    method build (line 21) | VirtKeyState build()
    method setCtrl (line 29) | void setCtrl(bool value)
    method setAlt (line 35) | void setAlt(bool value)
    method setShift (line 41) | void setShift(bool value)
    method reset (line 47) | void reset(TerminalKeyboardEvent e)
    method call (line 56) | String? call(TerminalKeyboardEvent event)

FILE: lib/data/provider/virtual_keyboard.freezed.dart
  function _$identity (line 13) | T _$identity<T>(T value)
  function toString (line 36) | String toString()
  class $VirtKeyStateCopyWith (line 44) | abstract mixin class $VirtKeyStateCopyWith<$Res>  {
    method call (line 47) | $Res call({
  class _$VirtKeyStateCopyWithImpl (line 56) | class _$VirtKeyStateCopyWithImpl<$Res>
    method call (line 65) | $Res call({Object? ctrl = null,Object? alt = null,Object? shift = null,})
  function maybeMap (line 91) | TResult maybeMap<TResult extends Object?>(TResult Function( _VirtKeyStat...
  function map (line 113) | TResult map<TResult extends Object?>(TResult Function( _VirtKeyState val...
  function mapOrNull (line 134) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _VirtKeyS...
  function maybeWhen (line 155) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool ctrl, ...
  function when (line 176) | TResult when<TResult extends Object?>(TResult Function( bool ctrl,  bool...
  function whenOrNull (line 196) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool ctr...
  class _VirtKeyState (line 210) | class _VirtKeyState implements VirtKeyState {
    method toString (line 236) | String toString()
  class _$VirtKeyStateCopyWith (line 244) | abstract mixin class _$VirtKeyStateCopyWith<$Res> implements $VirtKeySta...
    method call (line 247) | $Res call({
  class __$VirtKeyStateCopyWithImpl (line 256) | class __$VirtKeyStateCopyWithImpl<$Res>
    method call (line 265) | $Res call({Object? ctrl = null,Object? alt = null,Object? shift = null,})

FILE: lib/data/provider/virtual_keyboard.g.dart
  class VirtKeyboardProvider (line 15) | final class VirtKeyboardProvider
    method debugGetCreateSourceHash (line 29) | String debugGetCreateSourceHash()
    method create (line 33) | VirtKeyboard create()
    method overrideWithValue (line 36) | Override overrideWithValue(VirtKeyState value)
  function _$virtKeyboardHash (line 44) | String _$virtKeyboardHash()
  class _$VirtKeyboard (line 46) | abstract class _$VirtKeyboard extends $Notifier<VirtKeyState> {
    method build (line 47) | VirtKeyState build()
    method runBuild (line 50) | void runBuild()

FILE: lib/data/res/build_data.dart
  class BuildData (line 4) | abstract class BuildData {

FILE: lib/data/res/default.dart
  class Defaults (line 3) | abstract final class Defaults {

FILE: lib/data/res/github_id.dart
  class GithubIds (line 1) | abstract final class GithubIds {
  type GhId (line 157) | typedef GhId = String;

FILE: lib/data/res/highlight.dart
  class Highlights (line 35) | abstract final class Highlights {
    method getCode (line 75) | String? getCode(String? fileName)

FILE: lib/data/res/misc.dart
  class Miscs (line 3) | abstract final class Miscs {

FILE: lib/data/res/status.dart
  class InitStatus (line 10) | abstract final class InitStatus {

FILE: lib/data/res/store.dart
  class Stores (line 13) | abstract final class Stores {
    method init (line 34) | Future<void> init()

FILE: lib/data/res/terminal.dart
  class TerminalThemes (line 4) | abstract final class TerminalThemes {
  function copyWith (line 60) | TerminalTheme copyWith({

FILE: lib/data/res/url.dart
  class Urls (line 1) | abstract final class Urls {

FILE: lib/data/ssh/session_manager.dart
  type TermSessionStatus (line 9) | enum TermSessionStatus {
  class TermSessionInfo (line 21) | class TermSessionInfo {
    method toJson (line 36) | Map<String, Object> toJson()
  class TermSessionManager (line 46) | abstract final class TermSessionManager {
    method init (line 52) | void init()
    method stopAllConnections (line 67) | void stopAllConnections()
    method add (line 80) | void add({
    method updateStatus (line 99) | void updateStatus(String id, TermSessionStatus status)
    method remove (line 116) | void remove(String id)
    method _sync (line 124) | Future<void> _sync()
    method _updateLiveActivity (line 157) | Future<void> _updateLiveActivity()
    method setActive (line 192) | void setActive(String id, {bool hasTerminal = true})
    method stopLiveActivityOnAppClose (line 202) | Future<void> stopLiveActivityOnAppClose()
  class _Entry (line 214) | class _Entry {

FILE: lib/data/store/connection_stats.dart
  class ConnectionStatsStore (line 4) | class ConnectionStatsStore extends HiveStore {
    method recordConnection (line 10) | void recordConnection(ConnectionStat stat)
    method _cleanOldRecords (line 17) | void _cleanOldRecords(String serverId)
    method getServerStats (line 43) | ServerConnectionStats getServerStats(String serverId, String serverName)
    method getConnectionHistory (line 102) | List<ConnectionStat> getConnectionHistory(String serverId)
    method getAllServerStats (line 134) | List<ServerConnectionStats> getAllServerStats()
    method clearAll (line 179) | void clearAll()
    method clearServerStats (line 184) | void clearServerStats(String serverId)
    method compact (line 194) | Future<void> compact()

FILE: lib/data/store/container.dart
  class ContainerStore (line 7) | class ContainerStore extends HiveStore {
    method fetch (line 12) | String? fetch(String? id)
    method put (line 16) | void put(String id, String host)
    method getType (line 20) | ContainerType getType([String id = ''])
    method setType (line 35) | void setType(ContainerType type, [String id = ''])

FILE: lib/data/store/history.dart
  class _ListHistory (line 5) | class _ListHistory {
    method add (line 15) | void add(String path)
  class _MapHistory (line 24) | class _MapHistory {
    method put (line 34) | void put(String id, String val)
    method fetch (line 39) | String? fetch(String id)
  class HistoryStore (line 42) | class HistoryStore extends HiveStore {

FILE: lib/data/store/private_key.dart
  class PrivateKeyStore (line 5) | class PrivateKeyStore extends HiveStore {
    method put (line 10) | void put(PrivateKeyInfo info)
    method fetch (line 14) | List<PrivateKeyInfo> fetch()
    method fetchOne (line 42) | PrivateKeyInfo? fetchOne(String? id)
    method delete (line 47) | void delete(PrivateKeyInfo s)

FILE: lib/data/store/server.dart
  class ServerStore (line 8) | class ServerStore extends HiveStore {
    method put (line 13) | void put(Spi info)
    method fetch (line 17) | List<Spi> fetch()
    method delete (line 45) | void delete(String id)
    method update (line 49) | void update(Spi old, Spi newInfo)
    method have (line 57) | bool have(Spi s)
    method migrateIds (line 59) | void migrateIds()

FILE: lib/data/store/setting.dart
  class SettingStore (line 11) | class SettingStore extends HiveStore {

FILE: lib/data/store/snippet.dart
  class SnippetStore (line 5) | class SnippetStore extends HiveStore {
    method put (line 10) | void put(Snippet snippet)
    method fetch (line 14) | List<Snippet> fetch()
    method delete (line 42) | void delete(Snippet s)
    method update (line 46) | void update(Snippet old, Snippet newInfo)
    method have (line 54) | bool have(Snippet s)

FILE: lib/generated/l10n/l10n.dart
  class AppLocalizations (line 76) | abstract class AppLocalizations {
    method of (line 82) | AppLocalizations? of(BuildContext context)
    method askAiConfigMissing (line 196) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 376) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 382) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 400) | String compactDatabaseContent(Object size)
    method dl2Local (line 550) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 562) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 574) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 583) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 667) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 757) | String httpFailedWithCode(Object code)
    method madeWithLove (line 853) | String madeWithLove(Object myGithub)
    method percentOfSize (line 991) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 1033) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 1219) | String spentTime(Object time)
    method sshConfigAllExist (line 1225) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 1231) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 1243) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 1273) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 1279) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 1285) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 1291) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 1303) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 1309) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 1333) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 1345) | String sshTip(Object url)
    method switchTo (line 1375) | String switchTo(Object val)
  class _AppLocalizationsDelegate (line 1606) | class _AppLocalizationsDelegate
    method load (line 1611) | Future<AppLocalizations> load(Locale locale)
    method isSupported (line 1616) | bool isSupported(Locale locale)
    method shouldReload (line 1634) | bool shouldReload(_AppLocalizationsDelegate old)
  function lookupAppLocalizations (line 1637) | AppLocalizations lookupAppLocalizations(Locale locale)

FILE: lib/generated/l10n/l10n_de.dart
  class AppLocalizationsDe (line 8) | class AppLocalizationsDe extends AppLocalizations {
    method askAiConfigMissing (line 47) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 147) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 152) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 163) | String compactDatabaseContent(Object size)
    method dl2Local (line 247) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 256) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 264) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 272) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 321) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 370) | String httpFailedWithCode(Object code)
    method madeWithLove (line 424) | String madeWithLove(Object myGithub)
    method percentOfSize (line 502) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 526) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 628) | String spentTime(Object time)
    method sshConfigAllExist (line 633) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 638) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 647) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 667) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 672) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 677) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 682) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 690) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 695) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 712) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 721) | String sshTip(Object url)
    method switchTo (line 741) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_en.dart
  class AppLocalizationsEn (line 8) | class AppLocalizationsEn extends AppLocalizations {
    method askAiConfigMissing (line 47) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 146) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 151) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 162) | String compactDatabaseContent(Object size)
    method dl2Local (line 246) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 255) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 263) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 271) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 319) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 368) | String httpFailedWithCode(Object code)
    method madeWithLove (line 422) | String madeWithLove(Object myGithub)
    method percentOfSize (line 499) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 523) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 623) | String spentTime(Object time)
    method sshConfigAllExist (line 628) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 633) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 641) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 661) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 666) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 671) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 676) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 684) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 689) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 705) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 714) | String sshTip(Object url)
    method switchTo (line 733) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_es.dart
  class AppLocalizationsEs (line 8) | class AppLocalizationsEs extends AppLocalizations {
    method askAiConfigMissing (line 46) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 147) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 152) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 163) | String compactDatabaseContent(Object size)
    method dl2Local (line 247) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 256) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 264) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 272) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 320) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 369) | String httpFailedWithCode(Object code)
    method madeWithLove (line 423) | String madeWithLove(Object myGithub)
    method percentOfSize (line 502) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 528) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 632) | String spentTime(Object time)
    method sshConfigAllExist (line 637) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 642) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 650) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 670) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 675) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 680) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 685) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 693) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 698) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 715) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 724) | String sshTip(Object url)
    method switchTo (line 743) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_fr.dart
  class AppLocalizationsFr (line 8) | class AppLocalizationsFr extends AppLocalizations {
    method askAiConfigMissing (line 46) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 147) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 152) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 163) | String compactDatabaseContent(Object size)
    method dl2Local (line 247) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 256) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 264) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 272) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 321) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 370) | String httpFailedWithCode(Object code)
    method madeWithLove (line 424) | String madeWithLove(Object myGithub)
    method percentOfSize (line 504) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 530) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 633) | String spentTime(Object time)
    method sshConfigAllExist (line 638) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 643) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 652) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 672) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 677) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 682) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 687) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 695) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 700) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 717) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 726) | String sshTip(Object url)
    method switchTo (line 746) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_id.dart
  class AppLocalizationsId (line 8) | class AppLocalizationsId extends AppLocalizations {
    method askAiConfigMissing (line 47) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 145) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 150) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 161) | String compactDatabaseContent(Object size)
    method dl2Local (line 245) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 254) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 262) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 270) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 319) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 368) | String httpFailedWithCode(Object code)
    method madeWithLove (line 422) | String madeWithLove(Object myGithub)
    method percentOfSize (line 499) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 523) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 624) | String spentTime(Object time)
    method sshConfigAllExist (line 629) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 634) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 642) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 662) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 667) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 672) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 677) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 685) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 690) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 707) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 716) | String sshTip(Object url)
    method switchTo (line 734) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_it.dart
  class AppLocalizationsIt (line 8) | class AppLocalizationsIt extends AppLocalizations {
    method askAiConfigMissing (line 47) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 146) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 151) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 162) | String compactDatabaseContent(Object size)
    method dl2Local (line 246) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 255) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 263) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 271) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 319) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 368) | String httpFailedWithCode(Object code)
    method madeWithLove (line 422) | String madeWithLove(Object myGithub)
    method percentOfSize (line 500) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 524) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 626) | String spentTime(Object time)
    method sshConfigAllExist (line 631) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 636) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 645) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 665) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 670) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 675) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 680) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 688) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 693) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 710) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 719) | String sshTip(Object url)
    method switchTo (line 739) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_ja.dart
  class AppLocalizationsJa (line 8) | class AppLocalizationsJa extends AppLocalizations {
    method askAiConfigMissing (line 46) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 140) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 145) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 156) | String compactDatabaseContent(Object size)
    method dl2Local (line 236) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 245) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 253) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 261) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 309) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 357) | String httpFailedWithCode(Object code)
    method madeWithLove (line 409) | String madeWithLove(Object myGithub)
    method percentOfSize (line 482) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 505) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 604) | String spentTime(Object time)
    method sshConfigAllExist (line 609) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 614) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 622) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 640) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 645) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 650) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 655) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 663) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 668) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 682) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 691) | String sshTip(Object url)
    method switchTo (line 708) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_ko.dart
  class AppLocalizationsKo (line 8) | class AppLocalizationsKo extends AppLocalizations {
    method askAiConfigMissing (line 46) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 140) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 145) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 156) | String compactDatabaseContent(Object size)
    method dl2Local (line 236) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 245) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 253) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 261) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 307) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 355) | String httpFailedWithCode(Object code)
    method madeWithLove (line 406) | String madeWithLove(Object myGithub)
    method percentOfSize (line 479) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 502) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 602) | String spentTime(Object time)
    method sshConfigAllExist (line 607) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 612) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 620) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 638) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 643) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 648) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 653) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 661) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 666) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 681) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 690) | String sshTip(Object url)
    method switchTo (line 707) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_nl.dart
  class AppLocalizationsNl (line 8) | class AppLocalizationsNl extends AppLocalizations {
    method askAiConfigMissing (line 47) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 146) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 151) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 162) | String compactDatabaseContent(Object size)
    method dl2Local (line 246) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 255) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 263) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 271) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 320) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 369) | String httpFailedWithCode(Object code)
    method madeWithLove (line 423) | String madeWithLove(Object myGithub)
    method percentOfSize (line 500) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 525) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 627) | String spentTime(Object time)
    method sshConfigAllExist (line 632) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 637) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 646) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 666) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 671) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 676) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 681) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 689) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 694) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 710) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 719) | String sshTip(Object url)
    method switchTo (line 739) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_pt.dart
  class AppLocalizationsPt (line 8) | class AppLocalizationsPt extends AppLocalizations {
    method askAiConfigMissing (line 46) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 146) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 151) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 162) | String compactDatabaseContent(Object size)
    method dl2Local (line 245) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 254) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 262) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 270) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 318) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 368) | String httpFailedWithCode(Object code)
    method madeWithLove (line 421) | String madeWithLove(Object myGithub)
    method percentOfSize (line 499) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 523) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 624) | String spentTime(Object time)
    method sshConfigAllExist (line 629) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 634) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 642) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 662) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 667) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 672) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 677) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 685) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 690) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 707) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 716) | String sshTip(Object url)
    method switchTo (line 735) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_ru.dart
  class AppLocalizationsRu (line 8) | class AppLocalizationsRu extends AppLocalizations {
    method askAiConfigMissing (line 46) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 147) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 152) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 163) | String compactDatabaseContent(Object size)
    method dl2Local (line 246) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 255) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 263) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 271) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 320) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 369) | String httpFailedWithCode(Object code)
    method madeWithLove (line 423) | String madeWithLove(Object myGithub)
    method percentOfSize (line 502) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 526) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 629) | String spentTime(Object time)
    method sshConfigAllExist (line 634) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 639) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 647) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 667) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 672) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 677) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 682) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 690) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 695) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 711) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 720) | String sshTip(Object url)
    method switchTo (line 739) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_tr.dart
  class AppLocalizationsTr (line 8) | class AppLocalizationsTr extends AppLocalizations {
    method askAiConfigMissing (line 46) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 145) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 150) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 161) | String compactDatabaseContent(Object size)
    method dl2Local (line 245) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 254) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 262) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 270) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 319) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 368) | String httpFailedWithCode(Object code)
    method madeWithLove (line 422) | String madeWithLove(Object myGithub)
    method percentOfSize (line 499) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 523) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 625) | String spentTime(Object time)
    method sshConfigAllExist (line 630) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 635) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 643) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 663) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 668) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 673) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 678) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 686) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 691) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 707) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 716) | String sshTip(Object url)
    method switchTo (line 735) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_uk.dart
  class AppLocalizationsUk (line 8) | class AppLocalizationsUk extends AppLocalizations {
    method askAiConfigMissing (line 46) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 146) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 151) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 162) | String compactDatabaseContent(Object size)
    method dl2Local (line 246) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 255) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 263) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 271) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 320) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 370) | String httpFailedWithCode(Object code)
    method madeWithLove (line 424) | String madeWithLove(Object myGithub)
    method percentOfSize (line 503) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 527) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 629) | String spentTime(Object time)
    method sshConfigAllExist (line 634) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 639) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 647) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 667) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 672) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 677) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 682) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 690) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 695) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 711) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 720) | String sshTip(Object url)
    method switchTo (line 739) | String switchTo(Object val)

FILE: lib/generated/l10n/l10n_zh.dart
  class AppLocalizationsZh (line 8) | class AppLocalizationsZh extends AppLocalizations {
    method askAiConfigMissing (line 45) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 138) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 143) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 154) | String compactDatabaseContent(Object size)
    method dl2Local (line 232) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 241) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 249) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 257) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 302) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 349) | String httpFailedWithCode(Object code)
    method madeWithLove (line 400) | String madeWithLove(Object myGithub)
    method percentOfSize (line 473) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 496) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 592) | String spentTime(Object time)
    method sshConfigAllExist (line 597) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 602) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 610) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 627) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 632) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 637) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 642) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 650) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 655) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 669) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 678) | String sshTip(Object url)
    method switchTo (line 695) | String switchTo(Object val)
  class AppLocalizationsZhTw (line 817) | class AppLocalizationsZhTw extends AppLocalizationsZh {
    method askAiConfigMissing (line 854) | String askAiConfigMissing(Object fields)
    method clearServerStatsContent (line 947) | String clearServerStatsContent(Object serverName)
    method clearServerStatsTitle (line 952) | String clearServerStatsTitle(Object serverName)
    method compactDatabaseContent (line 963) | String compactDatabaseContent(Object size)
    method dl2Local (line 1041) | String dl2Local(Object fileName)
    method dockerImagesFmt (line 1050) | String dockerImagesFmt(Object count)
    method dockerStatusRunningAndStoppedFmt (line 1058) | String dockerStatusRunningAndStoppedFmt(
    method dockerStatusRunningFmt (line 1066) | String dockerStatusRunningFmt(Object count)
    method fileTooLarge (line 1111) | String fileTooLarge(Object file, Object size, Object sizeMax)
    method httpFailedWithCode (line 1158) | String httpFailedWithCode(Object code)
    method madeWithLove (line 1209) | String madeWithLove(Object myGithub)
    method percentOfSize (line 1282) | String percentOfSize(Object percent, Object size)
    method privateKeyNotFoundFmt (line 1305) | String privateKeyNotFoundFmt(Object keyId)
    method spentTime (line 1401) | String spentTime(Object time)
    method sshConfigAllExist (line 1406) | String sshConfigAllExist(Object duplicateCount)
    method sshConfigDuplicatesSkipped (line 1411) | String sshConfigDuplicatesSkipped(Object duplicateCount)
    method sshConfigFoundServers (line 1419) | String sshConfigFoundServers(Object totalCount)
    method sshConfigImported (line 1436) | String sshConfigImported(Object count)
    method sshHostKeyChangedDesc (line 1441) | String sshHostKeyChangedDesc(Object serverName)
    method sshHostKeyFingerprintMd5Base64 (line 1446) | String sshHostKeyFingerprintMd5Base64(Object fingerprint)
    method sshHostKeyFingerprintMd5Hex (line 1451) | String sshHostKeyFingerprintMd5Hex(Object fingerprint)
    method sshHostKeyNewDesc (line 1459) | String sshHostKeyNewDesc(Object serverName)
    method sshHostKeyStoredFingerprint (line 1464) | String sshHostKeyStoredFingerprint(Object fingerprint)
    method sshConfigServersToImport (line 1478) | String sshConfigServersToImport(Object importCount)
    method sshTip (line 1487) | String sshTip(Object url)
    method switchTo (line 1504) | String switchTo(Object val)

FILE: lib/hive/hive_adapters.g.dart
  class PrivateKeyInfoAdapter (line 9) | class PrivateKeyInfoAdapter extends TypeAdapter<PrivateKeyInfo> {
    method read (line 14) | PrivateKeyInfo read(BinaryReader reader)
    method write (line 23) | void write(BinaryWriter writer, PrivateKeyInfo obj)
  class SnippetAdapter (line 43) | class SnippetAdapter extends TypeAdapter<Snippet> {
    method read (line 48) | Snippet read(BinaryReader reader)
    method write (line 63) | void write(BinaryWriter writer, Snippet obj)
  class SpiAdapter (line 89) | class SpiAdapter extends TypeAdapter<Spi> {
    method read (line 94) | Spi read(BinaryReader reader)
    method write (line 120) | void write(BinaryWriter writer, Spi obj)
  class VirtKeyAdapter (line 168) | class VirtKeyAdapter extends TypeAdapter<VirtKey> {
    method read (line 173) | VirtKey read(BinaryReader reader)
    method write (line 271) | void write(BinaryWriter writer, VirtKey obj)
  class NetViewTypeAdapter (line 377) | class NetViewTypeAdapter extends TypeAdapter<NetViewType> {
    method read (line 382) | NetViewType read(BinaryReader reader)
    method write (line 396) | void write(BinaryWriter writer, NetViewType obj)
  class ServerFuncBtnAdapter (line 418) | class ServerFuncBtnAdapter extends TypeAdapter<ServerFuncBtn> {
    method read (line 423) | ServerFuncBtn read(BinaryReader reader)
    method write (line 445) | void write(BinaryWriter writer, ServerFuncBtn obj)
  class ServerCustomAdapter (line 475) | class ServerCustomAdapter extends TypeAdapter<ServerCustom> {
    method read (line 480) | ServerCustom read(BinaryReader reader)
    method write (line 497) | void write(BinaryWriter writer, ServerCustom obj)
  class WakeOnLanCfgAdapter (line 527) | class WakeOnLanCfgAdapter extends TypeAdapter<WakeOnLanCfg> {
    method read (line 532) | WakeOnLanCfg read(BinaryReader reader)
    method write (line 545) | void write(BinaryWriter writer, WakeOnLanCfg obj)
  class SystemTypeAdapter (line 567) | class SystemTypeAdapter extends TypeAdapter<SystemType> {
    method read (line 572) | SystemType read(BinaryReader reader)
    method write (line 586) | void write(BinaryWriter writer, SystemType obj)

FILE: lib/hive/hive_registrar.g.dart
  function registerAdapters (line 11) | void registerAdapters()
  function registerAdapters (line 29) | void registerAdapters()

FILE: lib/intro.dart
  class _IntroPage (line 3) | final class _IntroPage extends StatelessWidget {
    method build (line 11) | Widget build(BuildContext context)
    method _buildAppSettings (line 29) | Widget _buildAppSettings(BuildContext ctx, double padTop)
    method _buildBackupPasswordMigration (line 79) | Widget _buildBackupPasswordMigration(BuildContext ctx, double padTop)

FILE: lib/main.dart
  function main (line 21) | Future<void> main()
  function _runInZone (line 28) | void _runInZone(void Function() body)
  function _initApp (line 38) | Future<void> _initApp()
  function _initData (line 51) | Future<void> _initData()
  function _setupDebug (line 69) | void _setupDebug()
  function _doPlatformRelated (line 78) | void _doPlatformRelated()
  function _doDbMigrate (line 89) | Future<void> _doDbMigrate()
  function _initWindow (line 104) | Future<void> _initWindow()

FILE: lib/view/page/backup.dart
  class BackupPage (line 21) | class BackupPage extends ConsumerStatefulWidget {
    method createState (line 25) | ConsumerState<BackupPage> createState()
  class _BackupPageState (line 30) | final class _BackupPageState extends ConsumerState<BackupPage> with Auto...
    method dispose (line 35) | void dispose()
    method build (line 42) | Widget build(BuildContext context)
    method _onTapSetBakPwd (line 100) | Future<void> _onTapSetBakPwd(BuildContext context)
  function _onTapWebdavDl (line 421) | Future<void> _onTapWebdavDl(BuildContext context)
  function _onTapWebdavUp (line 441) | Future<void> _onTapWebdavUp(BuildContext context)
  function _onTapGistDl (line 460) | Future<void> _onTapGistDl(BuildContext context)
  function _onTapGistUp (line 480) | Future<void> _onTapGistUp(BuildContext context)
  function _onTapGistSetting (line 499) | Future<void> _onTapGistSetting(BuildContext context)
  function _onTapWebdavSetting (line 539) | Future<void> _onTapWebdavSetting(BuildContext context)
  function _onBulkImportServers (line 594) | void _onBulkImportServers(BuildContext context)
  function _ensureBakPwd (line 643) | Future<bool> _ensureBakPwd(BuildContext context)

FILE: lib/view/page/container/actions.dart
  function _showAddFAB (line 10) | Future<void> _showAddFAB()
  function _showPruneDialog (line 54) | Future<void> _showPruneDialog({
  function _showAddCmdPreview (line 78) | Future<void> _showAddCmdPreview(String cmd)
  function _showEditHostDialog (line 100) | Future<void> _showEditHostDialog()
  function _onSaveDockerHost (line 117) | void _onSaveDockerHost(String val)
  function _showImageRmDialog (line 123) | void _showImageRmDialog(ContainerImg e)
  function _onTapMoreBtn (line 140) | void _onTapMoreBtn(ContainerMenu item, ContainerPs dItem)
  function _initAutoRefresh (line 229) | void _initAutoRefresh()

FILE: lib/view/page/container/container.dart
  class ContainerPage (line 23) | class ContainerPage extends ConsumerStatefulWidget {
    method createState (line 28) | ConsumerState<ContainerPage> createState()
  class _ContainerPageState (line 33) | class _ContainerPageState extends ConsumerState<ContainerPage> {
    method dispose (line 38) | void dispose()
    method initState (line 44) | void initState()
    method build (line 57) | Widget build(BuildContext context)
    method _buildAppBar (line 67) | CustomAppBar _buildAppBar()
    method _buildFAB (line 80) | Widget _buildFAB()
    method _buildMain (line 84) | Widget _buildMain()
    method _buildEmptyStateMessage (line 122) | Widget _buildEmptyStateMessage(ContainerState containerState)
    method _buildImage (line 136) | Widget _buildImage(ContainerState containerState)
    method _buildImageItem (line 146) | Widget _buildImageItem(ContainerImg e)
    method _buildLoading (line 162) | Widget _buildLoading(ContainerState containerState)
    method _buildVersion (line 176) | Widget _buildVersion(ContainerState containerState)
    method _buildPs (line 188) | Widget _buildPs(ContainerState containerState)
    method _buildPsItem (line 205) | Widget _buildPsItem(ContainerPs item)
    method _buildPsItemStats (line 233) | Widget _buildPsItemStats(ContainerPs item)
    method _buildPsItemStatsItem (line 261) | Widget _buildPsItemStatsItem(String title, String? value, IconData ico...
    method _buildMoreBtn (line 285) | Widget _buildMoreBtn(ContainerPs dItem)
    method _buildAddCmd (line 292) | String _buildAddCmd(String image, String name, String args)
    method _buildPruneBtn (line 315) | Widget _buildPruneBtn(_PruneTypes type)
    method _buildSettingTile (line 349) | Widget _buildSettingTile(_SettingsMenuItems item, ContainerState conta...

FILE: lib/view/page/container/types.dart
  type _SettingsMenuItems (line 3) | enum _SettingsMenuItems { editDockerHost, switchProvider }
  type _PruneTypes (line 5) | enum _PruneTypes {

FILE: lib/view/page/home.dart
  class HomePage (line 19) | class HomePage extends ConsumerStatefulWidget {
    method createState (line 23) | ConsumerState<HomePage> createState()
  class _HomePageState (line 28) | class _HomePageState extends ConsumerState<HomePage>
    method dispose (line 43) | void dispose()
    method initState (line 58) | void initState()
    method didChangeAppLifecycleState (line 90) | void didChangeAppLifecycleState(AppLifecycleState state)
    method build (line 136) | Widget build(BuildContext context)
    method _buildBottomBar (line 175) | Widget _buildBottomBar()
    method _buildRailBar (line 190) | Widget _buildRailBar({bool extended = false})
    method afterFirstLayout (line 229) | Future<void> afterFirstLayout(BuildContext context)
    method _goAuth (line 266) | void _goAuth()
    method _onDestinationSelected (line 273) | void _onDestinationSelected(int index)
  class _AppBar (line 289) | final class _AppBar extends StatelessWidget implements PreferredSizeWidg...
    method build (line 295) | Widget build(BuildContext context)

FILE: lib/view/page/iperf.dart
  class IPerfPage (line 6) | class IPerfPage extends StatefulWidget {
    method createState (line 12) | State<IPerfPage> createState()
  class _IPerfPageState (line 17) | class _IPerfPageState extends State<IPerfPage> {
    method dispose (line 22) | void dispose()
    method build (line 29) | Widget build(BuildContext context)
    method _buildFAB (line 37) | Widget _buildFAB()
    method _buildBody (line 55) | Widget _buildBody()

FILE: lib/view/page/ping.dart
  class PingPage (line 14) | class PingPage extends ConsumerStatefulWidget {
    method createState (line 18) | ConsumerState<PingPage> createState()
  class _PingPageState (line 23) | class _PingPageState extends ConsumerState<PingPage> with AutomaticKeepA...
    method dispose (line 29) | void dispose()
    method initState (line 36) | void initState()
    method build (line 42) | Widget build(BuildContext context)
    method _buildFAB (line 47) | Widget _buildFAB()
    method _doPing (line 68) | Future<void> _doPing()
    method _buildBody (line 82) | Widget _buildBody(List<PingResult> results)
    method _buildResultItem (line 94) | Widget _buildResultItem(PingResult result)
    method _buildPingSummary (line 113) | String _buildPingSummary(PingResult result, String unknown, String ms)
    method doPing (line 125) | Future<void> doPing()

FILE: lib/view/page/private_key/edit.dart
  class PrivateKeyEditPageArgs (line 16) | final class PrivateKeyEditPageArgs {
  class PrivateKeyEditPage (line 21) | class PrivateKeyEditPage extends ConsumerStatefulWidget {
    method createState (line 26) | ConsumerState<PrivateKeyEditPage> createState()
  class _PrivateKeyEditPageState (line 31) | class _PrivateKeyEditPageState extends ConsumerState<PrivateKeyEditPage> {
    method dispose (line 48) | void dispose()
    method initState (line 60) | void initState()
    method didChangeDependencies (line 78) | void didChangeDependencies()
    method build (line 84) | Widget build(BuildContext context)
    method _buildAppBar (line 88) | CustomAppBar _buildAppBar()
    method _standardizeLineSeparators (line 115) | String _standardizeLineSeparators(String value)
    method _buildFAB (line 119) | Widget _buildFAB()
    method _buildBody (line 123) | Widget _buildBody()
    method _onTapSave (line 187) | void _onTapSave()

FILE: lib/view/page/private_key/list.dart
  class PrivateKeysListPage (line 13) | class PrivateKeysListPage extends ConsumerStatefulWidget {
    method createState (line 17) | ConsumerState<PrivateKeysListPage> createState()
  class _PrivateKeyListState (line 22) | class _PrivateKeyListState extends ConsumerState<PrivateKeysListPage> wi...
    method build (line 24) | Widget build(BuildContext context)
    method _buildBody (line 34) | Widget _buildBody()
    method _buildKeyItem (line 46) | Widget _buildKeyItem(PrivateKeyInfo item)
    method afterFirstLayout (line 56) | FutureOr<void> afterFirstLayout(BuildContext context)
  function _autoAddSystemPriavteKey (line 62) | void _autoAddSystemPriavteKey()

FILE: lib/view/page/process.dart
  class ProcessPage (line 13) | class ProcessPage extends ConsumerStatefulWidget {
    method createState (line 19) | ConsumerState<ProcessPage> createState()
  class _ProcessPageState (line 24) | class _ProcessPageState extends ConsumerState<ProcessPage> {
    method dispose (line 42) | void dispose()
    method initState (line 48) | void initState()
    method didChangeDependencies (line 57) | void didChangeDependencies()
    method _refresh (line 62) | Future<void> _refresh()
    method build (line 87) | Widget build(BuildContext context)
    method _buildListItem (line 132) | Widget _buildListItem(Proc proc)
    method _buildItemTrail (line 147) | Widget _buildItemTrail(Proc proc)

FILE: lib/view/page/pve.dart
  class PvePageArgs (line 13) | final class PvePageArgs {
  class PvePage (line 19) | final class PvePage extends ConsumerStatefulWidget {
    method createState (line 25) | ConsumerState<PvePage> createState()
  class _PvePageState (line 32) | final class _PvePageState extends ConsumerState<PvePage> {
    method dispose (line 40) | void dispose()
    method didChangeDependencies (line 46) | void didChangeDependencies()
    method initState (line 52) | void initState()
    method build (line 59) | Widget build(BuildContext context)
    method _buildBody (line 91) | Widget _buildBody(PveRes? data)
    method _buildNode (line 137) | Widget _buildNode(PveNode item)
    method _buildQemu (line 187) | Widget _buildQemu(PveQemu item)
    method _buildLxc (line 247) | Widget _buildLxc(PveLxc item)
    method _buildStorage (line 307) | Widget _buildStorage(PveStorage item)
    method _buildSdn (line 329) | Widget _buildSdn(PveSdn item)
    method _buildCtrlBtns (line 333) | Widget _buildCtrlBtns(PveCtrlIface item)
  function _onCtrl (line 364) | void _onCtrl(String action, PveCtrlIface item, Future<bool> Function() f...
  function _wrapNodeName (line 381) | String _wrapNodeName(PveCtrlIface item)
  function _initRefreshTimer (line 389) | void _initRefreshTimer()
  function _afterInit (line 398) | void _afterInit()

FILE: lib/view/page/server/detail/misc.dart
  function _onTapNvidiaGpuItem (line 4) | void _onTapNvidiaGpuItem(NvidiaSmiItem item)
  function _onTapAmdGpuItem (line 22) | void _onTapAmdGpuItem(AmdSmiItem item)
  function _onTapGpuProcessItem (line 40) | void _onTapGpuProcessItem(NvidiaSmiMemProcess process)
  function _onTapAmdGpuProcessItem (line 58) | void _onTapAmdGpuProcessItem(AmdSmiMemProcess process)
  function _onTapCustomItem (line 76) | void _onTapCustomItem(MapEntry<String, String> cmd)
  function _onTapSensorItem (line 84) | void _onTapSensorItem(SensorItem si)
  function _onTapTemperatureItem (line 99) | void _onTapTemperatureItem(String key)
  function _getInitExpand (line 104) | bool _getInitExpand(int len, [int? max])
  type _NetSortType (line 111) | enum _NetSortType {
  function _buildLineChart (line 143) | Widget _buildLineChart(

FILE: lib/view/page/server/detail/view.dart
  class ServerDetailPage (line 32) | class ServerDetailPage extends ConsumerStatefulWidget {
    method createState (line 37) | ConsumerState<ServerDetailPage> createState()
  class _ServerDetailPageState (line 42) | class _ServerDetailPageState extends ConsumerState<ServerDetailPage> wit...
    method dispose (line 71) | void dispose()
    method didChangeDependencies (line 77) | void didChangeDependencies()
    method initState (line 83) | void initState()
    method build (line 92) | Widget build(BuildContext context)
    method _buildMainPage (line 103) | Widget _buildMainPage(ServerState si)
    method _buildAppBar (line 120) | CustomAppBar _buildAppBar(ServerState si)
    method _buildLogo (line 141) | Widget? _buildLogo(ServerState si)
    method _buildAbout (line 162) | Widget? _buildAbout(ServerState si)
    method _buildCPUView (line 187) | Widget? _buildCPUView(ServerState si)
    method _buildCpuModelItem (line 226) | Widget _buildCpuModelItem(MapEntry<String, int> e)
    method _buildDetailPercent (line 248) | Widget _buildDetailPercent(double percent, String timeType)
    method _buildCPUProgress (line 260) | List<Widget> _buildCPUProgress(Cpus cs)
    method _buildCPUChart (line 314) | Widget _buildCPUChart(server_model.ServerStatus ss)
    method _buildProgress (line 333) | Widget _buildProgress(double percent)
    method _buildMemView (line 344) | Widget? _buildMemView(ServerState si)
    method _buildSwapView (line 385) | Widget? _buildSwapView(ServerState si)
    method _buildGpuView (line 417) | Widget? _buildGpuView(ServerState si)
    method _buildNvidiaGpuItem (line 444) | Widget _buildNvidiaGpuItem(NvidiaSmiItem item)
    method _buildAmdGpuItem (line 473) | Widget _buildAmdGpuItem(AmdSmiItem item)
    method _buildGpuProcessItem (line 499) | Widget _buildGpuProcessItem(NvidiaSmiMemProcess process)
    method _buildAmdGpuProcessItem (line 520) | Widget _buildAmdGpuProcessItem(AmdSmiMemProcess process)
    method _buildDiskView (line 541) | Widget? _buildDiskView(ServerState si)
    method _buildDiskItemWithHierarchy (line 562) | Widget _buildDiskItemWithHierarchy(Disk disk, server_model.ServerStatu...
    method _buildDiskItem (line 579) | Widget _buildDiskItem(Disk disk, server_model.ServerStatus ss, int depth)
    method _buildDiskSmart (line 634) | Widget? _buildDiskSmart(ServerState si)
    method _buildDiskSmartItem (line 648) | Widget _buildDiskSmartItem(DiskSmart smart)
    method _getDiskHealthStatus (line 665) | ({String text, Color color, Widget icon}) _getDiskHealthStatus(DiskSma...
    method _buildDiskSmartDetails (line 683) | Widget? _buildDiskSmartDetails(DiskSmart smart)
    method _onTapDiskSmartItem (line 714) | void _onTapDiskSmartItem(DiskSmart smart)
    method _buildNetView (line 779) | Widget? _buildNetView(ServerState si)
    method _buildNetSpeedItem (line 819) | Widget _buildNetSpeedItem(NetSpeed ns, String device)
    method _buildTemperature (line 856) | Widget? _buildTemperature(ServerState si)
    method _buildTemperatureItem (line 871) | Widget _buildTemperatureItem(String key, double? val)
    method _buildBatteries (line 888) | Widget? _buildBatteries(ServerState si)
    method _buildBatteryItem (line 903) | Widget _buildBatteryItem(Battery battery)
    method _buildSensors (line 923) | Widget? _buildSensors(ServerState si)
    method _buildSensorItem (line 937) | Widget _buildSensorItem(SensorItem si)
    method _buildPve (line 976) | Widget? _buildPve(ServerState si)
    method _buildCustomCmd (line 989) | Widget? _buildCustomCmd(ServerState si)
    method _buildCustomCmdItem (line 1002) | Widget _buildCustomCmdItem(MapEntry<String, String> cmd)
    method _buildAnimatedText (line 1019) | Widget _buildAnimatedText(Key key, String text, TextStyle style)

FILE: lib/view/page/server/discovery/discovery.dart
  class SshDiscoveryPage (line 11) | class SshDiscoveryPage extends ConsumerStatefulWidget {
    method createState (line 20) | ConsumerState<SshDiscoveryPage> createState()
  class _SshDiscoveryPageState (line 23) | class _SshDiscoveryPageState extends ConsumerState<SshDiscoveryPage> {
    method dispose (line 30) | void dispose()
    method build (line 39) | Widget build(BuildContext context)
    method _buildBody (line 53) | Widget _buildBody()
    method _buildSummary (line 62) | Widget _buildSummary()
    method _buildResultsList (line 91) | Widget _buildResultsList()
    method _buildResultTile (line 126) | Widget _buildResultTile(SshDiscoveryResult result, int index)
    method _buildFAB (line 146) | Widget _buildFAB()
    method _startDiscovery (line 187) | Future<void> _startDiscovery()
    method _showSettings (line 205) | void _showSettings()
    method _importSelected (line 212) | void _importSelected()

FILE: lib/view/page/server/discovery/widget.dart
  class _DiscoverySettingsDialog (line 3) | class _DiscoverySettingsDialog extends StatefulWidget {
    method createState (line 13) | State<_DiscoverySettingsDialog> createState()
  class _DiscoverySettingsDialogState (line 16) | class _DiscoverySettingsDialogState extends State<_DiscoverySettingsDial...
    method dispose (line 22) | void dispose()
    method build (line 29) | Widget build(BuildContext context)

FILE: lib/view/page/server/edit/actions.dart
  function _isInvalidJumpSelection (line 7) | bool _isInvalidJumpSelection(String? candidateJumpId)
  function _onTapCustomItem (line 16) | void _onTapCustomItem()
  function _onTapDisabledCmdTypes (line 25) | void _onTapDisabledCmdTypes()
  function _onSave (line 34) | void _onSave()
  function _checkSSHConfigImport (line 141) | Future<void> _checkSSHConfigImport()
  function _showCmdTypesDialog (line 198) | Future<void> _showCmdTypesDialog(Set<ShellCmdType> allCmdTypes)
  function _initWithSpi (line 244) | void _initWithSpi(Spi spi)

FILE: lib/view/page/server/edit/edit.dart
  class ServerEditPage (line 27) | class ServerEditPage extends ConsumerStatefulWidget {
    method createState (line 38) | ConsumerState<ServerEditPage> createState()
  class _ServerEditPageState (line 41) | class _ServerEditPageState extends ConsumerState<ServerEditPage>
    method dispose (line 79) | void dispose()
    method didChangeDependencies (line 114) | void didChangeDependencies()
    method build (line 120) | Widget build(BuildContext context)
    method _buildForm (line 134) | Widget _buildForm()
    method afterFirstLayout (line 210) | void afterFirstLayout(BuildContext context)

FILE: lib/view/page/server/edit/widget.dart
  function _buildAuth (line 4) | Widget _buildAuth()
  function _buildKeyAuth (line 43) | Widget _buildKeyAuth()
  function _buildEnvs (line 110) | Widget _buildEnvs()
  function _buildMore (line 132) | Widget _buildMore()
  function _buildScriptDir (line 156) | Widget _buildScriptDir()
  function _buildCustomDev (line 167) | Widget _buildCustomDev()
  function _buildSystemType (line 196) | Widget _buildSystemType()
  function _buildAltUrl (line 219) | Widget _buildAltUrl()
  function _buildPVEs (line 231) | Widget _buildPVEs()
  function _buildCustomCmds (line 261) | Widget _buildCustomCmds()
  function _buildDisabledCmdTypes (line 287) | Widget _buildDisabledCmdTypes()
  function _buildWOLs (line 307) | Widget _buildWOLs()
  function _buildFAB (line 344) | Widget _buildFAB()
  function _buildJumpServer (line 351) | Widget _buildJumpServer()
  function _buildWriteScriptTip (line 395) | Widget _buildWriteScriptTip()
  function _buildDelBtn (line 411) | Widget _buildDelBtn()

FILE: lib/view/page/server/tab/card_stat.dart
  type _CardNotifier (line 3) | typedef _CardNotifier = ValueNotifier<_CardStatus>;
  class _CardStatus (line 5) | class _CardStatus {
    method copyWith (line 12) | _CardStatus copyWith({bool? flip, bool? diskIO, NetViewType? net})

FILE: lib/view/page/server/tab/content.dart
  function _buildServerCardTitle (line 4) | Widget _buildServerCardTitle(ServerState s)
  function _buildTopRightWidget (line 20) | Widget _buildTopRightWidget(ServerState s)
  function _buildTopRightText (line 54) | Widget _buildTopRightText(ServerState s)
  function _showFailReason (line 67) | void _showFailReason(ServerStatus ss)
  function _buildDisk (line 82) | Widget _buildDisk(ServerStatus ss, String id)
  function _buildNet (line 106) | Widget _buildNet(ServerStatus ss, String id)
  function _buildIOData (line 123) | Widget _buildIOData(String up, String down, {void Function()? onTap, Key...

FILE: lib/view/page/server/tab/landscape.dart
  function _buildLandscape (line 4) | Widget _buildLandscape()
  function _buildLandscapeBody (line 28) | Widget _buildLandscapeBody()

FILE: lib/view/page/server/tab/tab.dart
  class ServerPage (line 36) | class ServerPage extends ConsumerStatefulWidget {
    method createState (line 40) | ConsumerState<ServerPage> createState()
  class _ServerPageState (line 48) | class _ServerPageState extends ConsumerState<ServerPage>
    method dispose (line 65) | void dispose()
    method initState (line 75) | void initState()
    method didChangeDependencies (line 82) | void didChangeDependencies()
    method build (line 89) | Widget build(BuildContext context)
    method _buildScaffold (line 108) | Widget _buildScaffold(Widget child)
    method _buildPortrait (line 134) | Widget _buildPortrait()
    method _buildBodySmall (line 154) | Widget _buildBodySmall({required List<String> filtered})
    method _buildEachServerCard (line 198) | Widget _buildEachServerCard(ServerState srv)
    method _wrapWithSizedbox (line 219) | Widget _wrapWithSizedbox(Widget child, double maxWidth, [bool circle =...
    method _buildRealServerCard (line 228) | Widget _buildRealServerCard(ServerState srv)
    method _buildFlippedCard (line 265) | Widget _buildFlippedCard(ServerState srv)
    method _buildNormalCard (line 312) | Widget _buildNormalCard(ServerStatus ss, Spi spi)
    method afterFirstLayout (line 341) | Future<void> afterFirstLayout(BuildContext context)

FILE: lib/view/page/server/tab/top_bar.dart
  class _TopBar (line 3) | final class _TopBar extends ConsumerWidget implements PreferredSizeWidget {
    method build (line 11) | Widget build(BuildContext context, WidgetRef ref)

FILE: lib/view/page/server/tab/utils.dart
  function _onTapCard (line 6) | void _onTapCard(ServerState srv)
  function _onLongPressCard (line 22) | void _onLongPressCard(ServerState srv)
  function _onTapAddServer (line 32) | void _onTapAddServer()
  function _onTapSuspend (line 45) | void _onTapSuspend(ServerState srv)
  function _onTapShutdown (line 64) | void _onTapShutdown(ServerState srv)
  function _onTapReboot (line 78) | void _onTapReboot(ServerState srv)
  function _onTapEdit (line 93) | void _onTapEdit(ServerState srv)
  function _filterServers (line 103) | List<String> _filterServers(List<String> order)
  function _calcCardHeight (line 113) | double? _calcCardHeight(ServerConn cs, bool flip)
  function _askFor (line 127) | void _askFor({required void Function() func, required String typ, requir...
  function _getCardNoti (line 140) | _CardNotifier _getCardNoti(String id)
  function _updateOffset (line 143) | void _updateOffset()
  function _updateTextScaler (line 151) | void _updateTextScaler(double val)
  function _startAvoidJitterTimer (line 156) | void _startAvoidJitterTimer()
  function _getTopRightStr (line 170) | String? _getTopRightStr(Spi spi)

FILE: lib/view/page/setting/about.dart
  class _AppAboutPage (line 3) | final class _AppAboutPage extends StatefulWidget {
    method createState (line 7) | State<_AppAboutPage> createState()
  class _AppAboutPageState (line 10) | final class _AppAboutPageState extends State<_AppAboutPage> with Automat...
    method build (line 12) | Widget build(BuildContext context)

FILE: lib/view/page/setting/entries/ai.dart
  function _buildAskAiConfig (line 4) | Widget _buildAskAiConfig()
  function _showAskAiFieldDialog (line 55) | Future<void> _showAskAiFieldDialog({
  function onSave (line 65) | void onSave()

FILE: lib/view/page/setting/entries/app.dart
  function _buildApp (line 4) | Widget _buildApp()
  function _buildAndroidSettings (line 22) | Widget _buildAndroidSettings()
  function _buildBgRun (line 33) | Widget _buildBgRun()
  function _buildAndroidWidgetSharedPreference (line 40) | Widget _buildAndroidWidgetSharedPreference()
  function _saveWidgetSP (line 65) | Future<void> _saveWidgetSP(Map<String, String> map, Map<String, String> ...
  function _buildPlatformSetting (line 82) | Widget? _buildPlatformSetting()
  function _buildCheckUpdate (line 92) | Widget _buildCheckUpdate()
  function _buildUpdateInterval (line 124) | Widget _buildUpdateInterval()
  function _buildAppColor (line 145) | Widget _buildAppColor()
  function _onSaveColor (line 204) | void _onSaveColor(String s)
  function _buildMaxRetry (line 225) | Widget _buildMaxRetry()
  function _buildThemeMode (line 246) | Widget _buildThemeMode()
  function _buildThemeModeStr (line 271) | String _buildThemeModeStr(int n)
  function _buildLocale (line 286) | Widget _buildLocale()
  function _buildAppMore (line 310) | Widget _buildAppMore()
  function _buildBeta (line 325) | Widget _buildBeta()
  function _buildWakeLock (line 332) | Widget _buildWakeLock()
  function _buildCollapseUI (line 339) | Widget _buildCollapseUI()
  function _buildHideTitleBar (line 346) | Widget _buildHideTitleBar()
  function _buildHomeTabs (line 353) | Widget _buildHomeTabs()
  function _buildEditRawSettings (line 364) | Widget _buildEditRawSettings()
  function _editRawSettings (line 372) | Future<void> _editRawSettings()
  function resolvePassword (line 380) | Future<String?> resolvePassword()
  function onSave (line 437) | void onSave(EditorPageRet ret)

FILE: lib/view/page/setting/entries/container.dart
  function _buildContainer (line 4) | Widget _buildContainer()
  function _buildUsePodman (line 14) | Widget _buildUsePodman()
  function _buildContainerTrySudo (line 22) | Widget _buildContainerTrySudo()
  function _buildContainerParseStat (line 30) | Widget _buildContainerParseStat()

FILE: lib/view/page/setting/entries/editor.dart
  function _buildEditor (line 4) | Widget _buildEditor()
  function _buildEditorCloseAfterEdit (line 18) | Widget _buildEditorCloseAfterEdit()
  function _buildEditorHighlight (line 26) | Widget _buildEditorHighlight()
  function _buildEditorTheme (line 36) | Widget _buildEditorTheme()
  function _buildEditorDarkTheme (line 58) | Widget _buildEditorDarkTheme()
  function _buildEditorWrap (line 80) | Widget _buildEditorWrap()
  function _buildEditorFontSize (line 88) | Widget _buildEditorFontSize()
  function _buildEditorFontFamily (line 100) | Widget _buildEditorFontFamily()
  function _showFontFamilyDialog (line 115) | void _showFontFamilyDialog(HiveProp<String> property)
  function onSave (line 117) | void onSave()
  function _showFontSizeDialog (line 137) | void _showFontSizeDialog(HiveProp<double> property)
  function onSave (line 139) | void onSave()

FILE: lib/view/page/setting/entries/full_screen.dart
  function _buildFullScreen (line 4) | Widget _buildFullScreen()
  function _buildFullScreenSwitch (line 13) | Widget _buildFullScreenSwitch()
  function _buildFullScreenJitter (line 26) | Widget _buildFullScreenJitter()

FILE: lib/view/page/setting/entries/home_tabs.dart
  class HomeTabsConfigPage (line 8) | class HomeTabsConfigPage extends ConsumerStatefulWidget {
    method createState (line 14) | ConsumerState<HomeTabsConfigPage> createState()
  class _HomeTabsConfigPageState (line 17) | class _HomeTabsConfigPageState extends ConsumerState<HomeTabsConfigPage> {
    method build (line 22) | Widget build(BuildContext context)
    method _buildTabItem (line 70) | Widget _buildTabItem(AppTab tab, int index, bool isSelected)
    method _onReorder (line 93) | void _onReorder(int oldIndex, int newIndex)
    method _addTab (line 103) | void _addTab(AppTab tab)
    method _removeTab (line 109) | void _removeTab(AppTab tab)
    method _saveAndExit (line 123) | void _saveAndExit()
    method _resetToDefault (line 128) | void _resetToDefault()

FILE: lib/view/page/setting/entries/server.dart
  function _buildServer (line 4) | Widget _buildServer()
  function _buildNetViewType (line 19) | Widget _buildNetViewType()
  function _buildDeleteServers (line 41) | Widget _buildDeleteServers()
  function _buildTextScaler (line 74) | Widget _buildTextScaler()
  function _onSaveTextScaler (line 99) | void _onSaveTextScaler(String s)
  function _buildServerFuncBtns (line 110) | Widget _buildServerFuncBtns()
  function _buildServerFuncBtnsSwitch (line 118) | Widget _buildServerFuncBtnsSwitch()
  function _buildServerFuncBtnsOrder (line 127) | Widget _buildServerFuncBtnsOrder()
  function _buildServerSeq (line 135) | Widget _buildServerSeq()
  function _buildServerDetailCardSeq (line 144) | Widget _buildServerDetailCardSeq()
  function _buildDoubleColumnServersPage (line 153) | Widget _buildDoubleColumnServersPage()
  function _buildKeepStatusWhenErr (line 162) | Widget _buildKeepStatusWhenErr()
  function _buildServerMore (line 170) | Widget _buildServerMore()
  function _buildRememberPwdInMem (line 188) | Widget _buildRememberPwdInMem()
  function _buildCpuView (line 197) | Widget _buildCpuView()
  function _buildServerLogoUrl (line 215) | Widget _buildServerLogoUrl()
  function onSave (line 216) | void onSave(String url)
  function _buildServerTabPreferDiskAmount (line 257) | Widget _buildServerTabPreferDiskAmount()
  function _buildSSHConfigAutoImportToggle (line 264) | Widget _buildSSHConfigAutoImportToggle()

FILE: lib/view/page/setting/entries/sftp.dart
  function _buildSFTP (line 4) | Widget _buildSFTP()
  function _buildSftpOpenLastPath (line 15) | Widget _buildSftpOpenLastPath()
  function _buildSftpShowFoldersFirst (line 25) | Widget _buildSftpShowFoldersFirst()
  function _buildSftpRmrDir (line 33) | Widget _buildSftpRmrDir()
  function _buildSftpEditor (line 41) | Widget _buildSftpEditor()
  function onSave (line 49) | void onSave()

FILE: lib/view/page/setting/entries/ssh.dart
  function _buildSSH (line 4) | Widget _buildSSH()
  function _buildSSHConfigImport (line 23) | Widget _buildSSHConfigImport()
  function _buildQrScan (line 32) | Widget _buildQrScan()
  function _onTapQrScan (line 41) | Future<void> _onTapQrScan()
  function _buildSSHDiscovery (line 66) | Widget _buildSSHDiscovery()
  function _onTapSSHDiscovery (line 75) | Future<void> _onTapSSHDiscovery()
  function _processDiscoveredServers (line 89) | Future<void> _processDiscoveredServers(
  function _onTapSSHConfigImport (line 143) | Future<void> _onTapSSHConfigImport()
  function _processSSHServers (line 159) | Future<void> _processSSHServers(List<Spi> servers)
  function _handleImportSSHCfgPermissionIssue (line 208) | Future<void> _handleImportSSHCfgPermissionIssue(Object e, StackTrace s)
  function _onTapSSHImportWithFilePicker (line 237) | Future<void> _onTapSSHImportWithFilePicker()
  function _buildSSHVirtKeys (line 263) | Widget _buildSSHVirtKeys()
  function _buildSSHVirtualKeyAutoOff (line 272) | Widget _buildSSHVirtualKeyAutoOff()
  function _buildFont (line 281) | Widget _buildFont()
  function _pickFontFile (line 308) | Future<void> _pickFontFile()
  function _buildTermFontSize (line 327) | Widget _buildTermFontSize()
  function _pickBgImage (line 339) | Future<void> _pickBgImage()
  function _buildDesktopTerminal (line 358) | Widget _buildDesktopTerminal()
  function onSave (line 367) | void onSave()
  function _buildTermTheme (line 391) | Widget _buildTermTheme()
  function index2Str (line 392) | String index2Str(int index)
  function _buildSSHWakeLock (line 426) | Widget _buildSSHWakeLock()
  function _buildLetterCache (line 434) | Widget _buildLetterCache()
  function _buildSshBg (line 447) | Widget _buildSshBg()
  function _buildSshBgImage (line 455) | Widget _buildSshBgImage()
  function _buildSshBgOpacity (line 482) | Widget _buildSshBgOpacity()
  function onSave (line 483) | void onSave(String s)
  function _buildSshBlurRadius (line 516) | Widget _buildSshBlurRadius()
  function onSave (line 517) | void onSave(String s)

FILE: lib/view/page/setting/entry.dart
  class SettingsPage (line 47) | class SettingsPage extends ConsumerStatefulWidget {
    method createState (line 53) | ConsumerState<SettingsPage> createState()
  class _SettingsPageState (line 56) | class _SettingsPageState extends ConsumerState<SettingsPage> with Single...
    method dispose (line 60) | void dispose()
    method build (line 66) | Widget build(BuildContext context)
  class AppSettingsPage (line 110) | final class AppSettingsPage extends ConsumerStatefulWidget {
    method createState (line 114) | ConsumerState<AppSettingsPage> createState()
  class _AppSettingsPageState (line 117) | final class _AppSettingsPageState extends ConsumerState<AppSettingsPage> {
    method build (line 126) | Widget build(BuildContext context)
  type SettingsTabs (line 142) | enum SettingsTabs {

FILE: lib/view/page/setting/platform/ios.dart
  class IosSettingsPage (line 8) | class IosSettingsPage extends StatefulWidget {
    method createState (line 12) | State<IosSettingsPage> createState()
  class _IosSettingsPageState (line 17) | class _IosSettingsPageState extends State<IosSettingsPage> {
    method _loadWatchContext (line 23) | Future<Map<String, dynamic>?> _loadWatchContext()
    method dispose (line 29) | void dispose()
    method build (line 35) | Widget build(BuildContext context)
    method _buildPushToken (line 49) | Widget _buildPushToken()
    method _buildAutoUpdateHomeWidget (line 78) | Widget _buildAutoUpdateHomeWidget()
    method _buildWatchApp (line 86) | Widget _buildWatchApp()
    method _onTapWatchApp (line 113) | void _onTapWatchApp(Map<String, dynamic> map)

FILE: lib/view/page/setting/platform/platform_pub.dart
  class PlatformPublicSettings (line 5) | abstract final class PlatformPublicSettings {
    method _buildBioAuthDelay (line 14) | Widget _buildBioAuthDelay()
    method _buildBioAuth (line 34) | Widget _buildBioAuth()

FILE: lib/view/page/setting/seq/srv_detail_seq.dart
  class ServerDetailOrderPage (line 8) | class ServerDetailOrderPage extends StatefulWidget {
    method createState (line 12) | State<ServerDetailOrderPage> createState()
  class _ServerDetailOrderPageState (line 17) | class _ServerDetailOrderPageState extends State<ServerDetailOrderPage> {
    method initState (line 25) | void initState()
    method _loadData (line 30) | void _loadData()
    method build (line 43) | Widget build(BuildContext context)
    method _proxyDecorator (line 50) | Widget _proxyDecorator(Widget child, int _, Animation<double> animation)
    method _buildBody (line 66) | Widget _buildBody()
    method _buildListItem (line 78) | Widget _buildListItem(String key, int idx)
    method _buildCheckBox (line 100) | Widget _buildCheckBox(String key, bool isEnabled)
    method _handleReorder (line 107) | void _handleReorder(int oldIndex, int newIndex)
    method _toggleEnabled (line 123) | void _toggleEnabled(String key)
    method _saveChanges (line 134) | void _saveChanges()

FILE: lib/view/page/setting/seq/srv_func_seq.dart
  class ServerFuncBtnsOrderPage (line 6) | class ServerFuncBtnsOrderPage extends StatefulWidget {
    method createState (line 10) | State<ServerFuncBtnsOrderPage> createState()
  class _ServerDetailOrderPageState (line 15) | class _ServerDetailOrderPageState extends State<ServerFuncBtnsOrderPage> {
    method build (line 19) | Widget build(BuildContext context)
    method _buildBody (line 26) | Widget _buildBody()
    method _buildListItem (line 49) | Widget _buildListItem(int key, int idx, List<int> keys)
    method _buildCheckBox (line 68) | Widget _buildCheckBox(List<int> keys, int key, int idx, bool value)

FILE: lib/view/page/setting/seq/srv_seq.dart
  class ServerOrderPage (line 10) | class ServerOrderPage extends ConsumerStatefulWidget {
    method createState (line 14) | ConsumerState<ServerOrderPage> createState()
  class _ServerOrderPageState (line 19) | class _ServerOrderPageState extends ConsumerState<ServerOrderPage> {
    method initState (line 23) | void initState()
    method build (line 29) | Widget build(BuildContext context)
    method _proxyDecorator (line 45) | Widget _proxyDecorator(Widget child, int _, Animation<double> animation)
    method _buildBody (line 61) | Widget _buildBody()
    method _buildItem (line 100) | Widget _buildItem(int index, String id, Spi? spi)
    method _buildCardTile (line 111) | Widget _buildCardTile(int index, Spi? spi)

FILE: lib/view/page/setting/seq/virt_key.dart
  class SSHVirtKeySettingPage (line 8) | class SSHVirtKeySettingPage extends StatefulWidget {
    method createState (line 12) | State<SSHVirtKeySettingPage> createState()
  class _SSHVirtKeySettingPageState (line 20) | class _SSHVirtKeySettingPageState extends State<SSHVirtKeySettingPage> {
    method initState (line 28) | void initState()
    method _loadData (line 33) | void _loadData()
    method build (line 46) | Widget build(BuildContext context)
    method _buildOneLineVirtKey (line 63) | Widget _buildOneLineVirtKey()
    method _proxyDecorator (line 70) | Widget _proxyDecorator(Widget child, int _, Animation<double> animation)
    method _buildBody (line 86) | Widget _buildBody()
    method _buildListItem (line 98) | Widget _buildListItem(int key, int idx)
    method _buildTitle (line 124) | Widget _buildTitle(VirtKey key, bool isEnabled)
    method _buildCheckBox (line 142) | Widget _buildCheckBox(int key, bool isEnabled)
    method _handleReorder (line 149) | void _handleReorder(int oldIndex, int newIndex)
    method _toggleEnabled (line 165) | void _toggleEnabled(int key)
    method _saveChanges (line 176) | void _saveChanges()

FILE: lib/view/page/snippet/edit.dart
  class SnippetEditPageArgs (line 10) | final class SnippetEditPageArgs {
  class SnippetEditPage (line 15) | class SnippetEditPage extends ConsumerStatefulWidget {
    method createState (line 21) | ConsumerState<SnippetEditPage> createState()
  class _SnippetEditPageState (line 26) | class _SnippetEditPageState extends ConsumerState<SnippetEditPage> with ...
    method dispose (line 35) | void dispose()
    method build (line 46) | Widget build(BuildContext context)
    method _buildAppBarActions (line 54) | List<Widget>? _buildAppBarActions()
    method _buildFAB (line 79) | Widget _buildFAB()
    method _buildBody (line 110) | Widget _buildBody()
    method _buildAutoRunOn (line 153) | Widget _buildAutoRunOn()
    method _buildTip (line 191) | Widget _buildTip()
    method afterFirstLayout (line 213) | void afterFirstLayout(BuildContext context)

FILE: lib/view/page/snippet/list.dart
  class SnippetListPage (line 9) | class SnippetListPage extends ConsumerStatefulWidget {
    method createState (line 13) | ConsumerState<SnippetListPage> createState()
  class _SnippetListPageState (line 18) | class _SnippetListPageState extends ConsumerState<SnippetListPage> with ...
    method dispose (line 25) | void dispose()
    method build (line 32) | Widget build(BuildContext context)
    method _buildBody (line 37) | Widget _buildBody()
    method _buildScaffold (line 58) | Widget _buildScaffold(List<Snippet> snippets, String tag)
    method _buildSnippetList (line 82) | Widget _buildSnippetList(List<Snippet> snippets, String tag)
    method _buildSnippetItem (line 103) | Widget _buildSnippetItem(Snippet snippet)

FILE: lib/view/page/snippet/result.dart
  class SnippetResultPage (line 6) | class SnippetResultPage extends StatelessWidget {
    method build (line 14) | Widget build(BuildContext context)
    method _buildBody (line 21) | Widget _buildBody()

FILE: lib/view/page/ssh/page/ask_ai.dart
  function _buildTerminalToolbar (line 4) | List<ContextMenuButtonItem> _buildTerminalToolbar(
  function _showAskAiSheet (line 28) | Future<void> _showAskAiSheet(String selection)
  function _applyAiCommand (line 41) | void _applyAiCommand(String command)
  class _AskAiSheet (line 50) | class _AskAiSheet extends ConsumerStatefulWidget {
    method createState (line 58) | ConsumerState<_AskAiSheet> createState()
  type _ChatEntryType (line 61) | enum _ChatEntryType { user, assistant, command }
  class _ChatEntry (line 63) | class _ChatEntry {
  class _AskAiSheetState (line 77) | class _AskAiSheetState extends ConsumerState<_AskAiSheet> {
    method initState (line 90) | void initState()
    method dispose (line 97) | void dispose()
    method _handleInputChanged (line 106) | void _handleInputChanged()
    method _startStream (line 111) | void _startStream()
    method _handleEvent (line 143) | void _handleEvent(AskAiEvent event)
    method _scheduleAutoScroll (line 184) | void _scheduleAutoScroll()
    method _describeError (line 196) | String _describeError(Object error)
    method _handleApplyCommand (line 232) | Future<void> _handleApplyCommand(BuildContext context, AskAiCommand co...
    method _copyCommand (line 248) | Future<void> _copyCommand(BuildContext context, AskAiCommand command)
    method _copyText (line 254) | Future<void> _copyText(BuildContext context, String text)
    method _sendMessage (line 261) | void _sendMessage()
    method _buildConversationWidgets (line 275) | List<Widget> _buildConversationWidgets(BuildContext context, ThemeData...
    method _buildChatItem (line 296) | Widget _buildChatItem(BuildContext context, ThemeData theme, _ChatEntr...
    method _buildAssistantBubble (line 313) | Widget _buildAssistantBubble(ThemeData theme, {required String content...
    method _buildCommandBubble (line 346) | Widget _buildCommandBubble(BuildContext context, ThemeData theme, AskA...
    method build (line 388) | Widget build(BuildContext context)

FILE: lib/view/page/ssh/page/init.dart
  function _initStoredCfg (line 4) | void _initStoredCfg()
  function _showHelp (line 12) | Future<void> _showHelp()
  function _initTerminal (line 30) | Future<void> _initTerminal()
  function _listen (line 97) | void _listen(Stream<Uint8List>? stream)
  function _setupDiscontinuityTimer (line 115) | void _setupDiscontinuityTimer()
  function _checkConnectionHealth (line 126) | Future<void> _checkConnectionHealth()
  function _handleConnectionCheckFailure (line 146) | void _handleConnectionCheckFailure(Object error, [StackTrace? stackTrace])
  function _onConnectionLossSuspected (line 158) | void _onConnectionLossSuspected()
  function _showDisconnectDialog (line 169) | Future<void> _showDisconnectDialog()
  function _writeLn (line 194) | void _writeLn(String p0)
  function _disconnectFromNotification (line 200) | void _disconnectFromNotification()

FILE: lib/view/page/ssh/page/keyboard.dart
  function _handleEscKeyOrBackButton (line 4) | void _handleEscKeyOrBackButton()
  function _handleKeyEvent (line 9) | bool _handleKeyEvent(KeyEvent event)

FILE: lib/view/page/ssh/page/page.dart
  class SshPageArgs (line 36) | final class SshPageArgs {
  class SSHPage (line 56) | class SSHPage extends ConsumerStatefulWidget {
    method createState (line 62) | ConsumerState<SSHPage> createState()
  class SSHPageState (line 69) | class SSHPageState extends ConsumerState<SSHPage>
    method dispose (line 101) | void dispose()
    method initState (line 122) | void initState()
    method didChangeDependencies (line 151) | void didChangeDependencies()
    method build (line 174) | Widget build(BuildContext context)
    method _buildBody (line 207) | Widget _buildBody()
    method _buildBottom (line 271) | Widget _buildBottom()
    method _buildVirtualKey (line 297) | Widget _buildVirtualKey(VirtKeyState virtKeyState, VirtKeyboard virtKe...
    method _buildVirtKeyItem (line 322) | Widget _buildVirtKeyItem(VirtKey item, double virtKeyWidth, VirtKeySta...
    method _onTerminalCopied (line 368) | void _onTerminalCopied()
    method _onTerminalSelectAll (line 374) | void _onTerminalSelectAll()
    method _onTerminalPaste (line 379) | Future<void> _onTerminalPaste()
    method _onClipboardAction (line 388) | Future<void> _onClipboardAction()
    method afterFirstLayout (line 407) | FutureOr<void> afterFirstLayout(BuildContext context)

FILE: lib/view/page/ssh/page/virt_key.dart
  function _doVirtualKey (line 4) | void _doVirtualKey(VirtKey item, VirtKeyboard virtKeyNotifier)
  function _doVirtualKeyInput (line 21) | void _doVirtualKeyInput(TerminalKey key, VirtKeyboard virtKeyNotifier)
  function _doVirtualKeyFunc (line 38) | Future<void> _doVirtualKeyFunc(VirtualKeyFunc type)
  function _initVirtKeys (line 125) | void _initVirtKeys()

FILE: lib/view/page/ssh/tab.dart
  class SSHTabPage (line 13) | class SSHTabPage extends ConsumerStatefulWidget {
    method createState (line 17) | ConsumerState<SSHTabPage> createState()
  type _TabMap (line 22) | typedef _TabMap = Map<String, ({Widget page, FocusNode? focus})>;
  class _SSHTabPageState (line 24) | class _SSHTabPageState extends ConsumerState<SSHTabPage>
    method dispose (line 32) | void dispose()
    method build (line 40) | Widget build(BuildContext context)
    method _buildBody (line 65) | Widget _buildBody()
  function _onTapInitCard (line 88) | void _onTapInitCard(Spi spi)
  function _toPage (line 124) | Future<void> _toPage(int idx)
  function _onTapTab (line 132) | void _onTapTab(int idx)
  function _onTapClose (line 136) | void _onTapClose(String name)
  class _TabBar (line 151) | final class _TabBar extends StatelessWidget implements PreferredSizeWidg...
    method build (line 165) | Widget build(BuildContext context)
    method _buildItem (line 186) | Widget _buildItem(int idx)
  class _AddPage (line 239) | class _AddPage extends ConsumerWidget {
    method build (line 247) | Widget build(BuildContext context, WidgetRef ref)

FILE: lib/view/page/storage/local.dart
  class LocalFilePageArgs (line 18) | final class LocalFilePageArgs {
  class LocalFilePage (line 24) | class LocalFilePage extends ConsumerStatefulWidget {
    method createState (line 32) | ConsumerState<LocalFilePage> createState()
  class _LocalFilePageState (line 35) | class _LocalFilePageState extends ConsumerState<LocalFilePage> with Auto...
    method dispose (line 42) | void dispose()
    method _refresh (line 47) | Future<void> _refresh()
    method build (line 55) | Widget build(BuildContext context)
    method _buildBody (line 99) | Widget _buildBody()
    method _buildItem (line 136) | Widget _buildItem({
    method _buildMissionBtn (line 179) | Widget _buildMissionBtn()
    method _getEntities (line 186) | Future<List<(FileSystemEntity, FileStat)>> _getEntities()
    method _buildSortBtn (line 193) | Widget _buildSortBtn()
  function _showDirActionDialog (line 210) | Future<void> _showDirActionDialog(FileSystemEntity file)
  function _showFileActionDialog (line 236) | Future<void> _showFileActionDialog(FileSystemEntity file)
  function _showRenameDialog (line 296) | void _showRenameDialog(FileSystemEntity file)
  function onSubmit (line 299) | void onSubmit()
  function _showDeleteDialog (line 328) | void _showDeleteDialog(FileSystemEntity file)
  function _onTapEdit (line 350) | void _onTapEdit(FileSystemEntity file, String fileName)
  function _onTapUpload (line 380) | void _onTapUpload(FileSystemEntity file, String fileName)
  type _SortType (line 405) | enum _SortType {

FILE: lib/view/page/storage/sftp.dart
  class SftpPageArgs (line 26) | final class SftpPageArgs {
  class SftpPage (line 34) | class SftpPage extends ConsumerStatefulWidget {
    method createState (line 40) | ConsumerState<SftpPage> createState()
  class _SftpPageState (line 45) | class _SftpPageState extends ConsumerState<SftpPage> with AfterLayoutMix...
    method initState (line 51) | void initState()
    method dispose (line 59) | void dispose()
    method build (line 65) | Widget build(BuildContext context)
    method afterFirstLayout (line 81) | FutureOr<void> afterFirstLayout(BuildContext context)
  function _buildSortMenu (line 120) | Widget _buildSortMenu()
  function _buildBottom (line 158) | Widget _buildBottom()
  function _buildFileView (line 179) | Widget _buildFileView()
  function _buildItem (line 201) | Widget _buildItem(SftpName file, {VoidCallback? beforeTap})
  function _onItemPress (line 257) | void _onItemPress(SftpName file, bool notDir)
  function _edit (line 317) | Future<void> _edit(SftpName name)
  function _download (line 373) | void _download(SftpName name)
  function _delete (line 400) | void _delete(SftpName file)
  function _mkdir (line 465) | void _mkdir()
  function onSubmitted (line 469) | void onSubmitted()
  function _newFile (line 503) | void _newFile()
  function onSubmitted (line 507) | void onSubmitted()
  function _rename (line 541) | void _rename(SftpName file)
  function onSubmitted (line 545) | void onSubmitted()
  function _decompress (line 582) | Future<void> _decompress(SftpName name)
  function _getRemotePath (line 607) | String _getRemotePath(SftpName name)
  function _getLocalPath (line 614) | String _getLocalPath(String remotePath)
  function _listDir (line 623) | Future<bool?> _listDir()
  function _backward (line 667) | Future<void> _backward()
  function _buildBackBtn (line 673) | Widget _buildBackBtn()
  function _buildSearchBtn (line 677) | Widget _buildSearchBtn()
  function find (line 680) | Stream<SftpName> find(String query)
  function _buildUploadBtn (line 700) | Widget _buildUploadBtn()
  function _buildAddBtn (line 734) | Widget _buildAddBtn()
  function _buildGotoBtn (line 749) | Widget _buildGotoBtn()
  function _buildRefreshBtn (line 789) | Widget _buildRefreshBtn()
  function _buildHomeBtn (line 793) | Widget _buildHomeBtn()
  function _normalizeSftpPath (line 805) | String _normalizeSftpPath(String path)
  function _getDecompressCmd (line 807) | String? _getDecompressCmd(String filename)
  function _canDecompress (line 816) | bool _canDecompress(String filename)
  function _getTime (line 874) | String _getTime(int? unixMill)
  type _SortType (line 878) | enum _SortType {
  class _SortOption (line 910) | class _SortOption {
    method copyWith (line 916) | _SortOption copyWith({_SortType? sortBy, bool? reversed})

FILE: lib/view/page/storage/sftp_mission.dart
  class SftpMissionPage (line 9) | class SftpMissionPage extends ConsumerStatefulWidget {
    method createState (line 13) | ConsumerState<SftpMissionPage> createState()
  class _SftpMissionPageState (line 18) | class _SftpMissionPageState extends ConsumerState<SftpMissionPage> {
    method build (line 20) | Widget build(BuildContext context)
    method _buildBody (line 27) | Widget _buildBody()
    method _buildItem (line 41) | Widget _buildItem(SftpReqStatus status)
    method _buildPreparing (line 62) | Widget _buildPreparing(SftpReqStatus status)
    method _buildDefault (line 70) | Widget _buildDefault(SftpReqStatus status)
    method _buildConnected (line 84) | Widget _buildConnected(SftpReqStatus status)
    method _buildLoading (line 92) | Widget _buildLoading(SftpReqStatus status)
    method _buildFinished (line 102) | Widget _buildFinished(SftpReqStatus status)
    method _wrapInCard (line 127) | Widget _wrapInCard({required SftpReqStatus status, String? subtitle, W...
    method _buildDelete (line 139) | Widget _buildDelete(String name, int id)

FILE: lib/view/page/systemd.dart
  class SystemdPage (line 10) | final class SystemdPage extends ConsumerStatefulWidget {
    method createState (line 18) | ConsumerState<SystemdPage> createState()
  class _SystemdPageState (line 21) | final class _SystemdPageState extends ConsumerState<SystemdPage> {
    method build (line 27) | Widget build(BuildContext context)
    method _buildBody (line 37) | Widget _buildBody()
    method _buildScopeFilterChips (line 60) | Widget _buildScopeFilterChips()
    method _buildUnitList (line 75) | Widget _buildUnitList()
    method _buildUnitFuncs (line 96) | Widget _buildUnitFuncs(SystemdUnit unit)
    method _handleUnitFuncSelected (line 103) | void _handleUnitFuncSelected(SystemdUnit unit, SystemdUnitFunc func)
    method _showConfirmDialog (line 113) | void _showConfirmDialog(String cmd)
    method _navigateToSsh (line 130) | void _navigateToSsh(String cmd)
    method _buildUnitFuncBtn (line 135) | PopupMenuEntry _buildUnitFuncBtn(SystemdUnitFunc func)
    method _buildScopeTag (line 146) | Widget _buildScopeTag(SystemdUnitScope scope)
    method _buildStateTag (line 150) | Widget _buildStateTag(SystemdUnitState state)
    method _buildTypeTag (line 154) | Widget _buildTypeTag(SystemdUnitType type)
    method _buildTag (line 158) | Widget _buildTag(String tag, [Color? color, bool noPad = false])

FILE: lib/view/widget/omit_start_text.dart
  class OmitStartText (line 3) | class OmitStartText extends StatelessWidget {
    method build (line 12) | Widget build(BuildContext context)

FILE: lib/view/widget/percent_circle.dart
  class PercentCircle (line 5) | final class PercentCircle extends StatelessWidget {
    method build (line 11) | Widget build(BuildContext context)

FILE: lib/view/widget/server_func_btns.dart
  class ServerFuncBtnsTopRight (line 23) | class ServerFuncBtnsTopRight extends ConsumerWidget {
    method build (line 29) | Widget build(BuildContext context, WidgetRef ref)
  class ServerFuncBtns (line 38) | class ServerFuncBtns extends StatelessWidget {
    method build (line 44) | Widget build(BuildContext context)
    method _buildItem (line 63) | Widget _buildItem(BuildContext context, ServerFuncBtn e, WidgetRef ref)
  function _onTapMoreBtns (line 105) | void _onTapMoreBtns(ServerFuncBtn value, Spi spi, BuildContext context, ...
  function _gotoSSH (line 212) | void _gotoSSH(Spi spi, BuildContext context)
  function _checkClient (line 283) | bool _checkClient(BuildContext context, String id, WidgetRef ref)

FILE: lib/view/widget/unix_perm.dart
  class UnixPermOp (line 4) | final class UnixPermOp {
    method copyWith (line 11) | UnixPermOp copyWith({bool? r, bool? w, bool? x})
  type UnixPermScope (line 20) | enum UnixPermScope {
  class UnixPerm (line 34) | final class UnixPerm {
    method copyWith (line 45) | UnixPerm copyWith({UnixPermOp? user, UnixPermOp? group, UnixPermOp? ot...
    method copyWithScope (line 53) | UnixPerm copyWithScope(UnixPermScope scope, UnixPermOp rwx)
  class UnixPermEditor (line 76) | final class UnixPermEditor extends StatefulWidget {
    method createState (line 87) | State<UnixPermEditor> createState()
  class _UnixPermEditorState (line 90) | final class _UnixPermEditorState extends State<UnixPermEditor> {
    method initState (line 94) | void initState()
    method build (line 100) | Widget build(BuildContext context)
    method _buildRow (line 120) | Widget _buildRow(UnixPermScope scope, UnixPermOp rwx)
    method _buildSwitch (line 147) | Widget _buildSwitch(bool value, void Function(bool) onChanged)

FILE: linux/flutter/generated_plugin_registrant.cc
  function fl_register_plugins (line 16) | void fl_register_plugins(FlPluginRegistry* registry) {

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

FILE: linux/my_application.cc
  type _MyApplication (line 10) | struct _MyApplication {
  function my_application_activate (line 18) | static void my_application_activate(GApplication* application) {
  function gboolean (line 66) | static gboolean my_application_local_command_line(GApplication* applicat...
  function my_application_startup (line 85) | static void my_application_startup(GApplication* application) {
  function my_application_shutdown (line 94) | static void my_application_shutdown(GApplication* application) {
  function my_application_dispose (line 103) | static void my_application_dispose(GObject* object) {
  function my_application_class_init (line 109) | static void my_application_class_init(MyApplicationClass* klass) {
  function my_application_init (line 117) | static void my_application_init(MyApplication* self) {}
  function MyApplication (line 119) | MyApplication* my_application_new() {

FILE: make.dart
  function main (line 10) | void main(List<String> args)
  function getScriptCommitCount (line 26) | Future<int> getScriptCommitCount()

FILE: test/amd_smi_test.dart
  function main (line 141) | void main()

FILE: test/battery_test.dart
  function main (line 210) | void main()

FILE: test/btrfs_test.dart
  function main (line 6) | void main()

FILE: test/container_test.dart
  function main (line 5) | void main()

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

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

FILE: test/disabled_cmd_types_test.dart
  function main (line 6) | void main()

FILE: test/disk_smart_test.dart
  function main (line 472) | void main()

FILE: test/disk_test.dart
  function main (line 6) | void main()

FILE: test/jump_chain_test.dart
  function _spi (line 5) | Spi _spi({required String id, required String name, String? jumpId})
  function main (line 16) | void main()

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

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

FILE: test/nvidia_test.dart
  function main (line 843) | void main()

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

FILE: test/pve_test.dart
  function main (line 130) | void main()

FILE: test/script_builder_test.dart
  function main (line 7) | void main()

FILE: test/sensors_test.dart
  function main (line 101) | void main()

FILE: test/server_dedup_test.dart
  function _mockDeduplicateServers (line 6) | List<Spi> _mockDeduplicateServers(List<Spi> importedServers, List<Spi> e...
  function _mockIsDuplicate (line 22) | bool _mockIsDuplicate(Spi imported, List<Spi> existing)
  function _mockResolveNameConflicts (line 35) | List<Spi> _mockResolveNameConflicts(List<Spi> importedServers, List<Stri...
  function main (line 62) | void main()

FILE: test/server_edit_logic_test.dart
  function main (line 4) | void main()
  function shouldPrompt (line 25) | bool shouldPrompt(bool firstTime, bool configExists, bool isNew)
  function validateServer (line 202) | void validateServer(Spi server)
  function resolveNameConflict (line 251) | String resolveNameConflict(String proposedName, List<String> existing)
  function shouldShowSSHImport (line 280) | bool shouldShowSSHImport({

FILE: test/ssh_config_test.dart
  function main (line 5) | void main()

FILE: test/system_dist_test.dart
  function main (line 5) | void main()

FILE: test/uptime_test.dart
  function main (line 3) | void main()
  function _testParseUpTime (line 50) | String? _testParseUpTime(String raw)

FILE: test/windows_test.dart
  function main (line 9) | void main()

FILE: windows/flutter/generated_plugin_registrant.cc
  function RegisterPlugins (line 18) | void RegisterPlugins(flutter::PluginRegistry* registry) {

FILE: windows/runner/flutter_window.cpp
  function LRESULT (line 40) | LRESULT

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

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

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

FILE: windows/runner/win32_window.cpp
  function Scale (line 18) | int Scale(int source, double scale_factor) {
  function EnableFullDpiSupportIfAvailable (line 24) | void EnableFullDpiSupportIfAvailable(HWND hwnd) {
  class WindowClassRegistrar (line 41) | class WindowClassRegistrar {
    method WindowClassRegistrar (line 46) | static WindowClassRegistrar* GetInstance() {
    method WindowClassRegistrar (line 62) | WindowClassRegistrar() = default;
  function wchar_t (line 71) | const wchar_t* WindowClassRegistrar::GetWindowClass() {
  function LRESULT (line 133) | LRESULT CALLBACK Win32Window::WndProc(HWND const window,
  function LRESULT (line 152) | LRESULT
  function Win32Window (line 208) | Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
  function RECT (line 224) | RECT Win32Window::GetClientArea() {
  function HWND (line 230) | HWND Win32Window::GetHandle() {

FILE: windows/runner/win32_window.h
  type Size (line 21) | struct Size {
Condensed preview — 636 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,268K chars).
[
  {
    "path": ".github/FUNDING.yml",
    "chars": 39,
    "preview": "custom: ['https://cdn.lpkt.cn/donate']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 892,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n\n<!--\nThanks for"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report_cn.md",
    "chars": 480,
    "preview": "---\nname: Bug 反馈\nabout: 帮助我们改进错误\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n<!--\n感谢您反馈问题,请先阅读以下内容:\n1、请先查看是否已存在相似 issue\n2、如"
  },
  {
    "path": ".github/workflows/analysis.yml",
    "chars": 1012,
    "preview": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 6516,
    "preview": "name: Flutter Release\n\non:\n  workflow_dispatch:\n  push:\n    tags:\n      - \"v*\"\n\npermissions:\n  contents: write\n\nenv:\n  A"
  },
  {
    "path": ".gitignore",
    "chars": 1027,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
  },
  {
    "path": ".gitmodules",
    "chars": 1013,
    "preview": "[submodule \"dartssh2\"]\n\tpath = packages/dartssh2\n\turl = https://github.com/lollipopkit/dartssh2\n\tbranch = master\n[submod"
  },
  {
    "path": ".metadata",
    "chars": 1706,
    "preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 749,
    "preview": "{\n    // 使用 IntelliSense 了解相关属性。 \n    // 悬停以查看现有属性的描述。\n    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=83038"
  },
  {
    "path": "CLAUDE.md",
    "chars": 4441,
    "preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
  },
  {
    "path": "LICENSE",
    "chars": 34522,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "README.md",
    "chars": 4931,
    "preview": "English | [简体中文](README_zh.md)\n\n<h2 align=\"center\">Flutter Server Box</h2>\n\n<div align=\"center\">\n  <a href=\"https://cdn."
  },
  {
    "path": "README_zh.md",
    "chars": 3559,
    "preview": "简体中文 | [English](README.md)\n\n<h2 align=\"center\">Flutter Server Box</h2>\n\n<div align=\"center\">\n  <a href=\"https://cdn.lpk"
  },
  {
    "path": "analysis_options.yaml",
    "chars": 2091,
    "preview": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n#"
  },
  {
    "path": "android/.gitignore",
    "chars": 285,
    "preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remembe"
  },
  {
    "path": "android/app/build.gradle",
    "chars": 3635,
    "preview": "plugins {\n    id \"com.android.application\"\n    id \"kotlin-android\"\n    id \"dev.flutter.flutter-gradle-plugin\"\n}\n\ndef loc"
  },
  {
    "path": "android/app/proguard-rules.pro",
    "chars": 34,
    "preview": "-keep class com.jcraft.**  { *; }\n"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "chars": 4324,
    "preview": "<manifest xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">"
  },
  {
    "path": "android/app/src/main/kotlin/tech/lolli/toolbox/ForegroundService.kt",
    "chars": 12209,
    "preview": "package tech.lolli.toolbox\n\nimport android.app.*\nimport android.content.Intent\nimport android.content.pm.ServiceInfo\nimp"
  },
  {
    "path": "android/app/src/main/kotlin/tech/lolli/toolbox/MainActivity.kt",
    "chars": 9204,
    "preview": "package tech.lolli.toolbox\n\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Bui"
  },
  {
    "path": "android/app/src/main/kotlin/tech/lolli/toolbox/widget/HomeWidget.kt",
    "chars": 9756,
    "preview": "package tech.lolli.toolbox.widget\n\nimport android.app.PendingIntent\nimport android.appwidget.AppWidgetManager\nimport and"
  },
  {
    "path": "android/app/src/main/kotlin/tech/lolli/toolbox/widget/WidgetConfigureActivity.kt",
    "chars": 2762,
    "preview": "package tech.lolli.toolbox.widget\n\nimport android.app.Activity\nimport android.appwidget.AppWidgetManager\nimport android."
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "chars": 321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "android/app/src/main/res/drawable/memory_24.xml",
    "chars": 539,
    "preview": "<vector android:height=\"24dp\" android:tint=\"@color/widgetSummaryText\"\n    android:viewportHeight=\"24\" android:viewportWi"
  },
  {
    "path": "android/app/src/main/res/drawable/net_24.xml",
    "chars": 492,
    "preview": "<vector android:height=\"24dp\" android:tint=\"@color/widgetSummaryText\"\n    android:viewportHeight=\"24\" android:viewportWi"
  },
  {
    "path": "android/app/src/main/res/drawable/settings_24.xml",
    "chars": 1201,
    "preview": "<vector android:height=\"24dp\" android:tint=\"@color/widgetSummaryText\"\n    android:viewportHeight=\"24\" android:viewportWi"
  },
  {
    "path": "android/app/src/main/res/drawable/speed_24.xml",
    "chars": 536,
    "preview": "<vector android:height=\"24dp\" android:tint=\"@color/widgetSummaryText\"\n    android:viewportHeight=\"24\" android:viewportWi"
  },
  {
    "path": "android/app/src/main/res/drawable/storage_24.xml",
    "chars": 407,
    "preview": "<vector android:height=\"24dp\" android:tint=\"@color/widgetSummaryText\"\n    android:viewportHeight=\"24\" android:viewportWi"
  },
  {
    "path": "android/app/src/main/res/drawable/widget_background.xml",
    "chars": 205,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <corners a"
  },
  {
    "path": "android/app/src/main/res/drawable-night/launch_background.xml",
    "chars": 321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "android/app/src/main/res/drawable-night-v21/launch_background.xml",
    "chars": 321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "android/app/src/main/res/drawable-v21/launch_background.xml",
    "chars": 321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "android/app/src/main/res/layout/home_widget.xml",
    "chars": 8273,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "android/app/src/main/res/layout/widget_configure.xml",
    "chars": 1325,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 334,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 265,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "android/app/src/main/res/values/colors.xml",
    "chars": 258,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<resources>\n    <color name=\"colorLaunch\">#EEEEEE</color>\n    <color name=\"widge"
  },
  {
    "path": "android/app/src/main/res/values/ic_launcher_background.xml",
    "chars": 120,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/strings.xml",
    "chars": 110,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">ServerBox</string>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "chars": 1265,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/main/res/values-night/colors.xml",
    "chars": 211,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"widgetBackground\">#000000</color>\n    <color name=\"w"
  },
  {
    "path": "android/app/src/main/res/values-night/ic_launcher_background.xml",
    "chars": 120,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#372D2D</color>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values-night/styles.xml",
    "chars": 1264,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/main/res/xml/backup_rules.xml",
    "chars": 146,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<full-backup-content>\n    <exclude domain=\"sharedpref\" path=\"FlutterSecureStorage"
  },
  {
    "path": "android/app/src/main/res/xml/home_widget.xml",
    "chars": 492,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<appwidget-provider xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  "
  },
  {
    "path": "android/build.gradle",
    "chars": 926,
    "preview": "allprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nrootProject.buildDir = '../build'\nsubp"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 203,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dist"
  },
  {
    "path": "android/gradle.properties",
    "chars": 190,
    "preview": "org.gradle.jvmargs=-Xmx4G\nandroid.useAndroidX=true\nandroid.enableJetifier=true\nandroid.defaults.buildfeatures.buildconfi"
  },
  {
    "path": "android/settings.gradle",
    "chars": 791,
    "preview": "pluginManagement {\n    def flutterSdkPath = {\n        def properties = new Properties()\n        file(\"local.properties\")"
  },
  {
    "path": "coverage/lcov.info",
    "chars": 58810,
    "preview": "SF:lib/data/model/app/shell_func.dart\nDA:32,3\nDA:38,1\nDA:39,1\nDA:42,1\nDA:43,2\nDA:44,2\nDA:47,0\nDA:48,0\nDA:49,0\nDA:50,0\nDA"
  },
  {
    "path": "devtools_options.yaml",
    "chars": 184,
    "preview": "description: This file stores settings for Dart & Flutter DevTools.\ndocumentation: https://docs.flutter.dev/tools/devtoo"
  },
  {
    "path": "docs/.gitignore",
    "chars": 229,
    "preview": "# build output\ndist/\n# generated types\n.astro/\n\n# dependencies\nnode_modules/\n\n# logs\nnpm-debug.log*\nyarn-debug.log*\nyarn"
  },
  {
    "path": "docs/.vscode/extensions.json",
    "chars": 87,
    "preview": "{\n  \"recommendations\": [\"astro-build.astro-vscode\"],\n  \"unwantedRecommendations\": []\n}\n"
  },
  {
    "path": "docs/.vscode/launch.json",
    "chars": 207,
    "preview": "{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"command\": \"./node_modules/.bin/astro dev\",\n      \"name\": \"Dev"
  },
  {
    "path": "docs/README.md",
    "chars": 1780,
    "preview": "# Starlight Starter Kit: Basics\n\n[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https"
  },
  {
    "path": "docs/astro.config.mjs",
    "chars": 5800,
    "preview": "// @ts-check\nimport { defineConfig } from 'astro/config';\nimport starlight from '@astrojs/starlight';\n\n// https://astro."
  },
  {
    "path": "docs/package.json",
    "chars": 321,
    "preview": "{\n  \"name\": \"docs\",\n  \"type\": \"module\",\n  \"version\": \"0.0.1\",\n  \"scripts\": {\n    \"dev\": \"astro dev\",\n    \"start\": \"astro"
  },
  {
    "path": "docs/src/content/docs/advanced/bulk-import.md",
    "chars": 2016,
    "preview": "---\ntitle: Bulk Import Servers\ndescription: Import multiple servers from JSON file\n---\n\nImport multiple server configura"
  },
  {
    "path": "docs/src/content/docs/advanced/custom-commands.md",
    "chars": 1171,
    "preview": "---\ntitle: Custom Commands\ndescription: Display custom command output on server page\n---\n\nAdd custom shell commands to s"
  },
  {
    "path": "docs/src/content/docs/advanced/custom-logo.md",
    "chars": 1007,
    "preview": "---\ntitle: Custom Server Logo\ndescription: Use custom images for server cards\n---\n\nDisplay custom logos on server cards "
  },
  {
    "path": "docs/src/content/docs/advanced/json-settings.md",
    "chars": 1205,
    "preview": "---\ntitle: Hidden Settings (JSON)\ndescription: Access advanced settings via JSON editor\n---\n\nSome settings are hidden fr"
  },
  {
    "path": "docs/src/content/docs/advanced/troubleshooting.md",
    "chars": 2554,
    "preview": "---\ntitle: Common Issues\ndescription: Solutions to common problems\n---\n\n## Connection Issues\n\n### SSH Won't Connect\n\n**S"
  },
  {
    "path": "docs/src/content/docs/advanced/widgets.md",
    "chars": 1965,
    "preview": "---\ntitle: Home Screen Widgets\ndescription: Add server status widgets to your home screen\n---\n\nRequires [ServerBox Monit"
  },
  {
    "path": "docs/src/content/docs/de/advanced/bulk-import.md",
    "chars": 2343,
    "preview": "---\ntitle: Massenimport von Servern\ndescription: Importieren Sie mehrere Server aus einer JSON-Datei\n---\n\nImportieren Si"
  },
  {
    "path": "docs/src/content/docs/de/advanced/custom-commands.md",
    "chars": 1386,
    "preview": "---\ntitle: Benutzerdefinierte Befehle\ndescription: Anzeige der Ausgabe benutzerdefinierter Befehle auf der Serverseite\n-"
  },
  {
    "path": "docs/src/content/docs/de/advanced/custom-logo.md",
    "chars": 1180,
    "preview": "---\ntitle: Benutzerdefiniertes Server-Logo\ndescription: Verwenden Sie benutzerdefinierte Bilder für Serverkarten\n---\n\nZe"
  },
  {
    "path": "docs/src/content/docs/de/advanced/json-settings.md",
    "chars": 1406,
    "preview": "---\ntitle: Versteckte Einstellungen (JSON)\ndescription: Zugriff auf erweiterte Einstellungen über den JSON-Editor\n---\n\nE"
  },
  {
    "path": "docs/src/content/docs/de/advanced/troubleshooting.md",
    "chars": 3169,
    "preview": "---\ntitle: Häufige Probleme\ndescription: Lösungen für gängige Probleme\n---\n\n## Verbindungsprobleme\n\n### SSH verbindet ni"
  },
  {
    "path": "docs/src/content/docs/de/advanced/widgets.md",
    "chars": 2507,
    "preview": "---\ntitle: Startbildschirm-Widgets\ndescription: Fügen Sie Serverstatus-Widgets zu Ihrem Startbildschirm hinzu\n---\n\nErfor"
  },
  {
    "path": "docs/src/content/docs/de/development/architecture.md",
    "chars": 2654,
    "preview": "---\ntitle: Architektur\ndescription: Architekturmuster und Designentscheidungen\n---\n\nServer Box folgt den Prinzipien der "
  },
  {
    "path": "docs/src/content/docs/de/development/building.md",
    "chars": 1857,
    "preview": "---\ntitle: Bauen\ndescription: Bauanleitungen für verschiedene Plattformen\n---\n\nServer Box verwendet ein benutzerdefinier"
  },
  {
    "path": "docs/src/content/docs/de/development/codegen.md",
    "chars": 2074,
    "preview": "---\ntitle: Codegenerierung\ndescription: Verwendung von build_runner für die Codegenerierung\n---\n\nServer Box verwendet in"
  },
  {
    "path": "docs/src/content/docs/de/development/state.md",
    "chars": 2240,
    "preview": "---\ntitle: Zustandsverwaltung\ndescription: Riverpod-basierte Zustandsverwaltungsmuster\n---\n\nServer Box verwendet Riverpo"
  },
  {
    "path": "docs/src/content/docs/de/development/structure.md",
    "chars": 2415,
    "preview": "---\ntitle: Projektstruktur\ndescription: Verständnis der Server Box Codebasis\n---\n\nDas Server Box-Projekt folgt einer mod"
  },
  {
    "path": "docs/src/content/docs/de/development/testing.md",
    "chars": 2286,
    "preview": "---\ntitle: Testen\ndescription: Teststrategien und Ausführung von Tests\n---\n\n## Tests ausführen\n\n```bash\n# Alle Tests aus"
  },
  {
    "path": "docs/src/content/docs/de/index.mdx",
    "chars": 1855,
    "preview": "---\ntitle: Server Box\ndescription: Eine umfassende plattformübergreifende Server-Management-Anwendung\nhero:\n  tagline: V"
  },
  {
    "path": "docs/src/content/docs/de/installation.mdx",
    "chars": 1565,
    "preview": "---\ntitle: Installation\ndescription: Laden Sie Server Box herunter und installieren Sie es auf Ihrem Gerät\n---\n\nServer B"
  },
  {
    "path": "docs/src/content/docs/de/introduction.mdx",
    "chars": 1616,
    "preview": "---\ntitle: Einführung\ndescription: Erfahren Sie, was Server Box ist und was es kann\n---\n\nServer Box ist eine umfassende "
  },
  {
    "path": "docs/src/content/docs/de/platforms/desktop.md",
    "chars": 1882,
    "preview": "---\ntitle: Desktop-Funktionen\ndescription: Spezifische Funktionen für macOS, Linux und Windows\n---\n\nServer Box bietet au"
  },
  {
    "path": "docs/src/content/docs/de/platforms/mobile.md",
    "chars": 2026,
    "preview": "---\ntitle: Mobile Funktionen\ndescription: Spezifische Funktionen für iOS und Android\n---\n\nServer Box bietet mehrere mobi"
  },
  {
    "path": "docs/src/content/docs/de/principles/architecture.md",
    "chars": 5245,
    "preview": "---\ntitle: Architektur-Übersicht\ndescription: High-Level-Anwendungsarchitektur\n---\n\nServer Box folgt einer Schichtarchit"
  },
  {
    "path": "docs/src/content/docs/de/principles/sftp.md",
    "chars": 10478,
    "preview": "---\ntitle: SFTP-System\ndescription: Wie der SFTP-Dateibrowser funktioniert\n---\n\nDas SFTP-System bietet Dateimanagement-F"
  },
  {
    "path": "docs/src/content/docs/de/principles/ssh.md",
    "chars": 6103,
    "preview": "---\ntitle: SSH-Verbindung\ndescription: Wie SSH-Verbindungen aufgebaut und verwaltet werden\n---\n\nVerständnis der SSH-Verb"
  },
  {
    "path": "docs/src/content/docs/de/principles/state.md",
    "chars": 5556,
    "preview": "---\ntitle: Zustandsverwaltung\ndescription: Wie der Zustand mit Riverpod verwaltet wird\n---\n\nVerständnis der Architektur "
  },
  {
    "path": "docs/src/content/docs/de/principles/terminal.md",
    "chars": 4933,
    "preview": "---\ntitle: Terminal-Implementierung\ndescription: Wie das SSH-Terminal intern funktioniert\n---\n\nDas SSH-Terminal ist eine"
  },
  {
    "path": "docs/src/content/docs/de/quick-start.mdx",
    "chars": 1718,
    "preview": "---\ntitle: Schnellstart\ndescription: In wenigen Minuten mit Server Box loslegen\n---\n\nFolgen Sie dieser Schnellstartanlei"
  },
  {
    "path": "docs/src/content/docs/development/architecture.md",
    "chars": 2427,
    "preview": "---\ntitle: Architecture\ndescription: Architecture patterns and design decisions\n---\n\nServer Box follows clean architectu"
  },
  {
    "path": "docs/src/content/docs/development/building.md",
    "chars": 1694,
    "preview": "---\ntitle: Building\ndescription: Build instructions for different platforms\n---\n\nServer Box uses a custom build system ("
  },
  {
    "path": "docs/src/content/docs/development/codegen.md",
    "chars": 1906,
    "preview": "---\ntitle: Code Generation\ndescription: Using build_runner for code generation\n---\n\nServer Box heavily uses code generat"
  },
  {
    "path": "docs/src/content/docs/development/state.md",
    "chars": 2126,
    "preview": "---\ntitle: State Management\ndescription: Riverpod-based state management patterns\n---\n\nServer Box uses Riverpod with cod"
  },
  {
    "path": "docs/src/content/docs/development/structure.md",
    "chars": 2239,
    "preview": "---\ntitle: Project Structure\ndescription: Understanding the Server Box codebase\n---\n\nThe Server Box project follows a mo"
  },
  {
    "path": "docs/src/content/docs/development/testing.md",
    "chars": 2154,
    "preview": "---\ntitle: Testing\ndescription: Testing strategies and running tests\n---\n\n## Running Tests\n\n```bash\n# Run all tests\nflut"
  },
  {
    "path": "docs/src/content/docs/es/advanced/bulk-import.md",
    "chars": 2297,
    "preview": "---\ntitle: Importación Masiva de Servidores\ndescription: Importar múltiples servidores desde un archivo JSON\n---\n\nImport"
  },
  {
    "path": "docs/src/content/docs/es/advanced/custom-commands.md",
    "chars": 1460,
    "preview": "---\ntitle: Comandos Personalizados\ndescription: Mostrar la salida de comandos personalizados en la página del servidor\n-"
  },
  {
    "path": "docs/src/content/docs/es/advanced/custom-logo.md",
    "chars": 1202,
    "preview": "---\ntitle: Logo de Servidor Personalizado\ndescription: Usa imágenes personalizadas para las tarjetas de servidor\n---\n\nMu"
  },
  {
    "path": "docs/src/content/docs/es/advanced/json-settings.md",
    "chars": 1374,
    "preview": "---\ntitle: Ajustes Ocultos (JSON)\ndescription: Accede a ajustes avanzados mediante el editor JSON\n---\n\nAlgunos ajustes e"
  },
  {
    "path": "docs/src/content/docs/es/advanced/troubleshooting.md",
    "chars": 3385,
    "preview": "---\ntitle: Problemas Comunes\ndescription: Soluciones a problemas frecuentes\n---\n\n## Problemas de Conexión\n\n### SSH no co"
  },
  {
    "path": "docs/src/content/docs/es/advanced/widgets.md",
    "chars": 2469,
    "preview": "---\ntitle: Widgets de Pantalla de Inicio\ndescription: Añade widgets de estado del servidor a tu pantalla de inicio\n---\n\n"
  },
  {
    "path": "docs/src/content/docs/es/development/architecture.md",
    "chars": 2751,
    "preview": "---\ntitle: Arquitectura\ndescription: Patrones de arquitectura y decisiones de diseño\n---\n\nServer Box sigue los principio"
  },
  {
    "path": "docs/src/content/docs/es/development/building.md",
    "chars": 2036,
    "preview": "---\ntitle: Compilación\ndescription: Instrucciones de compilación para diferentes plataformas\n---\n\nServer Box utiliza un "
  },
  {
    "path": "docs/src/content/docs/es/development/codegen.md",
    "chars": 2047,
    "preview": "---\ntitle: Generación de Código\ndescription: Uso de build_runner para la generación de código\n---\n\nServer Box utiliza in"
  },
  {
    "path": "docs/src/content/docs/es/development/state.md",
    "chars": 2247,
    "preview": "---\ntitle: Gestión de Estado\ndescription: Patrones de gestión de estado basados en Riverpod\n---\n\nServer Box utiliza Rive"
  },
  {
    "path": "docs/src/content/docs/es/development/structure.md",
    "chars": 2583,
    "preview": "---\ntitle: Estructura del Proyecto\ndescription: Comprendiendo la base de código de Server Box\n---\n\nEl proyecto Server Bo"
  },
  {
    "path": "docs/src/content/docs/es/development/testing.md",
    "chars": 2478,
    "preview": "---\ntitle: Pruebas\ndescription: Estrategias de prueba y ejecución de pruebas\n---\n\n## Ejecución de Pruebas\n\n```bash\n# Eje"
  },
  {
    "path": "docs/src/content/docs/es/index.mdx",
    "chars": 1780,
    "preview": "---\ntitle: Server Box\ndescription: Una aplicación integral de gestión de servidores multiplataforma\nhero:\n  tagline: Adm"
  },
  {
    "path": "docs/src/content/docs/es/installation.mdx",
    "chars": 1618,
    "preview": "---\ntitle: Instalación\ndescription: Descarga e instala Server Box en tu dispositivo\n---\n\nServer Box está disponible en m"
  },
  {
    "path": "docs/src/content/docs/es/introduction.mdx",
    "chars": 1560,
    "preview": "---\ntitle: Introducción\ndescription: Aprende qué es Server Box y qué puede hacer\n---\n\nServer Box es una aplicación integ"
  },
  {
    "path": "docs/src/content/docs/es/platforms/desktop.md",
    "chars": 2013,
    "preview": "---\ntitle: Funciones de Escritorio\ndescription: Funciones específicas para macOS, Linux y Windows\n---\n\nServer Box en pla"
  },
  {
    "path": "docs/src/content/docs/es/platforms/mobile.md",
    "chars": 2034,
    "preview": "---\ntitle: Funciones Móviles\ndescription: Funciones específicas para iOS y Android\n---\n\nServer Box proporciona varias fu"
  },
  {
    "path": "docs/src/content/docs/es/principles/architecture.md",
    "chars": 5610,
    "preview": "---\ntitle: Descripción General de la Arquitectura\ndescription: Arquitectura de alto nivel de la aplicación\n---\n\nServer B"
  },
  {
    "path": "docs/src/content/docs/es/principles/sftp.md",
    "chars": 10526,
    "preview": "---\ntitle: Sistema SFTP\ndescription: Cómo funciona el explorador de archivos SFTP\n---\n\nEl sistema SFTP proporciona capac"
  },
  {
    "path": "docs/src/content/docs/es/principles/ssh.md",
    "chars": 6107,
    "preview": "---\ntitle: Conexión SSH\ndescription: Cómo se establecen y gestionan las conexiones SSH\n---\n\nEntendiendo las conexiones S"
  },
  {
    "path": "docs/src/content/docs/es/principles/state.md",
    "chars": 4453,
    "preview": "---\ntitle: Gestión de Estado\ndescription: Cómo se gestiona el estado con Riverpod\n---\n\nEntendiendo la arquitectura de ge"
  },
  {
    "path": "docs/src/content/docs/es/principles/terminal.md",
    "chars": 5131,
    "preview": "---\ntitle: Implementación de la Terminal\ndescription: Cómo funciona internamente la terminal SSH\n---\n\nLa terminal SSH es"
  },
  {
    "path": "docs/src/content/docs/es/quick-start.mdx",
    "chars": 1597,
    "preview": "---\ntitle: Inicio Rápido\ndescription: Comienza a usar Server Box en cuestión de minutos\n---\n\nSigue esta guía de inicio r"
  },
  {
    "path": "docs/src/content/docs/fr/advanced/bulk-import.md",
    "chars": 2449,
    "preview": "---\ntitle: Importation massive de serveurs\ndescription: Importer plusieurs serveurs à partir d'un fichier JSON\n---\n\nImpo"
  },
  {
    "path": "docs/src/content/docs/fr/advanced/custom-commands.md",
    "chars": 1483,
    "preview": "---\ntitle: Commandes personnalisées\ndescription: Afficher la sortie des commandes personnalisées sur la page du serveur\n"
  },
  {
    "path": "docs/src/content/docs/fr/advanced/custom-logo.md",
    "chars": 1190,
    "preview": "---\ntitle: Logo de serveur personnalisé\ndescription: Utiliser des images personnalisées pour les cartes de serveur\n---\n\n"
  },
  {
    "path": "docs/src/content/docs/fr/advanced/json-settings.md",
    "chars": 1431,
    "preview": "---\ntitle: Paramètres cachés (JSON)\ndescription: Accéder aux paramètres avancés via l'éditeur JSON\n---\n\nCertains paramèt"
  },
  {
    "path": "docs/src/content/docs/fr/advanced/troubleshooting.md",
    "chars": 3530,
    "preview": "---\ntitle: Problèmes courants\ndescription: Solutions aux problèmes fréquents\n---\n\n## Problèmes de connexion\n\n### SSH ne "
  },
  {
    "path": "docs/src/content/docs/fr/advanced/widgets.md",
    "chars": 2632,
    "preview": "---\ntitle: Widgets de l'écran d'accueil\ndescription: Ajoutez des widgets d'état du serveur à votre écran d'accueil\n---\n\n"
  },
  {
    "path": "docs/src/content/docs/fr/development/architecture.md",
    "chars": 2775,
    "preview": "---\ntitle: Architecture\ndescription: Modèles d'architecture et décisions de conception\n---\n\nServer Box suit les principe"
  },
  {
    "path": "docs/src/content/docs/fr/development/building.md",
    "chars": 2101,
    "preview": "---\ntitle: Construction (Building)\ndescription: Instructions de construction pour différentes plateformes\n---\n\nServer Bo"
  },
  {
    "path": "docs/src/content/docs/fr/development/codegen.md",
    "chars": 2085,
    "preview": "---\ntitle: Génération de code\ndescription: Utiliser build_runner pour la génération de code\n---\n\nServer Box utilise inte"
  },
  {
    "path": "docs/src/content/docs/fr/development/state.md",
    "chars": 2290,
    "preview": "---\ntitle: Gestion de l'état\ndescription: Modèles de gestion de l'état basés sur Riverpod\n---\n\nServer Box utilise Riverp"
  },
  {
    "path": "docs/src/content/docs/fr/development/structure.md",
    "chars": 2570,
    "preview": "---\ntitle: Structure du projet\ndescription: Comprendre la base de code de Server Box\n---\n\nLe projet Server Box suit une "
  },
  {
    "path": "docs/src/content/docs/fr/development/testing.md",
    "chars": 2436,
    "preview": "---\ntitle: Tests\ndescription: Stratégies de test et exécution des tests\n---\n\n## Exécuter les tests\n\n```bash\n# Exécuter t"
  },
  {
    "path": "docs/src/content/docs/fr/index.mdx",
    "chars": 1837,
    "preview": "---\ntitle: Server Box\ndescription: Une application complète de gestion de serveurs multiplateforme\nhero:\n  tagline: Gére"
  },
  {
    "path": "docs/src/content/docs/fr/installation.mdx",
    "chars": 1668,
    "preview": "---\ntitle: Installation\ndescription: Téléchargez et installez Server Box sur votre appareil\n---\n\nServer Box est disponib"
  },
  {
    "path": "docs/src/content/docs/fr/introduction.mdx",
    "chars": 1645,
    "preview": "---\ntitle: Introduction\ndescription: Découvrez ce qu'est Server Box et ce qu'il peut faire\n---\n\nServer Box est une appli"
  },
  {
    "path": "docs/src/content/docs/fr/platforms/desktop.md",
    "chars": 2086,
    "preview": "---\ntitle: Fonctionnalités de bureau\ndescription: Fonctionnalités spécifiques à macOS, Linux et Windows\n---\n\nServer Box "
  },
  {
    "path": "docs/src/content/docs/fr/platforms/mobile.md",
    "chars": 2206,
    "preview": "---\ntitle: Fonctionnalités mobiles\ndescription: Fonctionnalités spécifiques à iOS et Android\n---\n\nServer Box offre plusi"
  },
  {
    "path": "docs/src/content/docs/fr/principles/architecture.md",
    "chars": 5650,
    "preview": "---\ntitle: Présentation de l'architecture\ndescription: Architecture de haut niveau de l'application\n---\n\nServer Box suit"
  },
  {
    "path": "docs/src/content/docs/fr/principles/sftp.md",
    "chars": 10639,
    "preview": "---\ntitle: Système SFTP\ndescription: Comment fonctionne le navigateur de fichiers SFTP\n---\n\nLe système SFTP fournit des "
  },
  {
    "path": "docs/src/content/docs/fr/principles/ssh.md",
    "chars": 6211,
    "preview": "---\ntitle: Connexion SSH\ndescription: Comment les connexions SSH sont établies et gérées\n---\n\nComprendre les connexions "
  },
  {
    "path": "docs/src/content/docs/fr/principles/state.md",
    "chars": 4591,
    "preview": "---\ntitle: Gestion de l'état\ndescription: Comment l'état est géré avec Riverpod\n---\n\nComprendre l'architecture de gestio"
  },
  {
    "path": "docs/src/content/docs/fr/principles/terminal.md",
    "chars": 5090,
    "preview": "---\ntitle: Implémentation du terminal\ndescription: Comment le terminal SSH fonctionne en interne\n---\n\nLe terminal SSH es"
  },
  {
    "path": "docs/src/content/docs/fr/quick-start.mdx",
    "chars": 1778,
    "preview": "---\ntitle: Démarrage Rapide\ndescription: Soyez opérationnel avec Server Box en quelques minutes\n---\n\nSuivez ce guide de "
  },
  {
    "path": "docs/src/content/docs/index.mdx",
    "chars": 1683,
    "preview": "---\ntitle: Server Box\ndescription: A comprehensive cross-platform server management application\nhero:\n  tagline: Manage "
  },
  {
    "path": "docs/src/content/docs/installation.mdx",
    "chars": 1431,
    "preview": "---\ntitle: Installation\ndescription: Download and install Server Box on your device\n---\n\nServer Box is available on mult"
  },
  {
    "path": "docs/src/content/docs/introduction.mdx",
    "chars": 1399,
    "preview": "---\ntitle: Introduction\ndescription: Learn what Server Box is and what it can do\n---\n\nServer Box is a comprehensive cros"
  },
  {
    "path": "docs/src/content/docs/ja/advanced/bulk-import.md",
    "chars": 1621,
    "preview": "---\ntitle: サーバーの一括インポート\ndescription: JSON ファイルから複数のサーバーをインポートする\n---\n\nJSON ファイルを使用して、複数のサーバー設定を一度にインポートします。\n\n## JSON 形式\n\n"
  },
  {
    "path": "docs/src/content/docs/ja/advanced/custom-commands.md",
    "chars": 862,
    "preview": "---\ntitle: カスタムコマンド\ndescription: サーバーページにカスタムコマンドの出力を表示する\n---\n\nカスタムシェルコマンドを追加して、サーバー詳細ページに出力を表示します。\n\n## 設定\n\n1. サーバー設定 → "
  },
  {
    "path": "docs/src/content/docs/ja/advanced/custom-logo.md",
    "chars": 869,
    "preview": "---\ntitle: カスタムサーバーロゴ\ndescription: サーバーカードにカスタム画像を使用する\n---\n\n画像の URL を使用して、サーバーカードにカスタムロゴを表示します。\n\n## 設定\n\n1. サーバー設定 → カスタム"
  },
  {
    "path": "docs/src/content/docs/ja/advanced/json-settings.md",
    "chars": 941,
    "preview": "---\ntitle: 隠し設定 (JSON)\ndescription: JSON エディタ経由で詳細設定にアクセスする\n---\n\n一部の設定は UI 上では非表示になっていますが、JSON エディタからアクセス可能です。\n\n## アクセス方"
  },
  {
    "path": "docs/src/content/docs/ja/advanced/troubleshooting.md",
    "chars": 1976,
    "preview": "---\ntitle: 一般的な問題\ndescription: よくある問題の解決策\n---\n\n## 接続の問題\n\n### SSH が接続できない\n\n**症状:** タイムアウト、接続拒否、認証失敗\n\n**解決策:**\n\n1. **サーバーの"
  },
  {
    "path": "docs/src/content/docs/ja/advanced/widgets.md",
    "chars": 1629,
    "preview": "---\ntitle: ホーム画面ウィジェット\ndescription: サーバーの状態を表示するウィジェットをホーム画面に追加する\n---\n\nサーバーに [ServerBox Monitor](https://github.com/loll"
  },
  {
    "path": "docs/src/content/docs/ja/development/architecture.md",
    "chars": 1849,
    "preview": "---\ntitle: アーキテクチャ\ndescription: アーキテクチャパターンと設計上の決定事項\n---\n\nServer Box は、データ層、ドメイン層、プレゼンテーション層を明確に分離したクリーンアーキテクチャの原則に従っていま"
  },
  {
    "path": "docs/src/content/docs/ja/development/building.md",
    "chars": 1396,
    "preview": "---\ntitle: ビルド\ndescription: 各プラットフォーム向けのビルド手順\n---\n\nServer Box は、クロスプラットフォームビルドのためにカスタムビルドシステム (`fl_build`) を使用しています。\n\n##"
  },
  {
    "path": "docs/src/content/docs/ja/development/codegen.md",
    "chars": 1682,
    "preview": "---\ntitle: コード生成\ndescription: build_runner を使用したコード生成\n---\n\nServer Box では、モデル、状態管理、シリアライズのためにコード生成を多用しています。\n\n## コード生成を実行す"
  },
  {
    "path": "docs/src/content/docs/ja/development/state.md",
    "chars": 1889,
    "preview": "---\ntitle: 状態管理\ndescription: Riverpod ベースの状態管理パターン\n---\n\nServer Box は、状態管理のためにコード生成を伴う Riverpod を使用しています。\n\n## Provider の種"
  },
  {
    "path": "docs/src/content/docs/ja/development/structure.md",
    "chars": 1761,
    "preview": "---\ntitle: プロジェクト構造\ndescription: Server Box のコードベースを理解する\n---\n\nServer Box プロジェクトは、関心の分離を明確にしたモジュール式のアーキテクチャを採用しています。\n\n## "
  },
  {
    "path": "docs/src/content/docs/ja/development/testing.md",
    "chars": 1840,
    "preview": "---\ntitle: テスト\ndescription: テスト戦略とテストの実行\n---\n\n## テストの実行\n\n```bash\n# すべてのテストを実行\nflutter test\n\n# 特定のテストファイルを実行\nflutter test"
  },
  {
    "path": "docs/src/content/docs/ja/index.mdx",
    "chars": 1284,
    "preview": "---\ntitle: Server Box\ndescription: 総合的なクロスプラットフォーム・サーバー管理アプリケーション\nhero:\n  tagline: どこからでも Linux サーバーを管理\n  actions:\n    -"
  },
  {
    "path": "docs/src/content/docs/ja/installation.mdx",
    "chars": 1207,
    "preview": "---\ntitle: インストール\ndescription: お使いのデバイスに Server Box をダウンロードしてインストールする\n---\n\nServer Box は複数のプラットフォームで利用可能です。お好みのインストール方法を選"
  },
  {
    "path": "docs/src/content/docs/ja/introduction.mdx",
    "chars": 915,
    "preview": "---\ntitle: はじめに\ndescription: Server Box とはその何か、何ができるのかを学ぶ\n---\n\nServer Box は、Flutter で構築された包括的なクロスプラットフォームのサーバー管理アプリケーション"
  },
  {
    "path": "docs/src/content/docs/ja/platforms/desktop.md",
    "chars": 1029,
    "preview": "---\ntitle: デスクトップ版の機能\ndescription: macOS、Linux、Windows 特有の機能\n---\n\nデスクトッププラットフォーム上の Server Box は、さらなる生産性向上機能を提供します。\n\n## m"
  },
  {
    "path": "docs/src/content/docs/ja/platforms/mobile.md",
    "chars": 1106,
    "preview": "---\ntitle: モバイル版の機能\ndescription: iOS および Android 特有の機能\n---\n\nServer Box は、iOS および Android デバイス向けにいくつかのモバイル特有の機能を提供しています。\n"
  },
  {
    "path": "docs/src/content/docs/ja/principles/architecture.md",
    "chars": 3708,
    "preview": "---\ntitle: アーキテクチャの概要\ndescription: アプリケーションのハイレベル・アーキテクチャ\n---\n\nServer Box は、関心の分離を明確にした階層型アーキテクチャを採用しています。\n\n## アーキテクチャ階層"
  },
  {
    "path": "docs/src/content/docs/ja/principles/sftp.md",
    "chars": 9472,
    "preview": "---\ntitle: SFTP システム\ndescription: SFTP ファイルブラウザの仕組み\n---\n\nSFTP システムは、SSH を介したファイル管理機能を提供します。\n\n## アーキテクチャ\n\n```\n┌──────────"
  },
  {
    "path": "docs/src/content/docs/ja/principles/ssh.md",
    "chars": 4753,
    "preview": "---\ntitle: SSH 接続\ndescription: SSH 接続の確立と管理の仕組み\n---\n\nServer Box における SSH 接続の仕組みについて解説します。\n\n## 接続フロー\n\n```text\nユーザー入力 → Sp"
  },
  {
    "path": "docs/src/content/docs/ja/principles/state.md",
    "chars": 3725,
    "preview": "---\ntitle: 状態管理\ndescription: Riverpod を使用した状態管理の仕組み\n---\n\nServer Box における状態管理アーキテクチャについて解説します。\n\n## なぜ Riverpod なのか?\n\n**主な"
  },
  {
    "path": "docs/src/content/docs/ja/principles/terminal.md",
    "chars": 3650,
    "preview": "---\ntitle: ターミナルの実装\ndescription: SSH ターミナルの内部的な仕組み\n---\n\nSSH ターミナルは、カスタマイズされた xterm.dart フォークをベースに構築された、最も複雑な機能の一つです。\n\n##"
  },
  {
    "path": "docs/src/content/docs/ja/quick-start.mdx",
    "chars": 904,
    "preview": "---\ntitle: クイックスタート\ndescription: Server Box を数分で使い始める\n---\n\nこのクイックスタートガイドに従って、最初のサーバーに接続し、監視を開始しましょう。\n\n## ステップ 1: サーバーを追加"
  },
  {
    "path": "docs/src/content/docs/platforms/desktop.md",
    "chars": 1607,
    "preview": "---\ntitle: Desktop Features\ndescription: macOS, Linux, and Windows specific features\n---\n\nServer Box on desktop platform"
  },
  {
    "path": "docs/src/content/docs/platforms/mobile.md",
    "chars": 1698,
    "preview": "---\ntitle: Mobile Features\ndescription: iOS and Android specific features\n---\n\nServer Box provides several mobile-specif"
  },
  {
    "path": "docs/src/content/docs/principles/architecture.md",
    "chars": 4765,
    "preview": "---\ntitle: Architecture Overview\ndescription: High-level application architecture\n---\n\nServer Box follows a layered arch"
  },
  {
    "path": "docs/src/content/docs/principles/sftp.md",
    "chars": 10165,
    "preview": "---\ntitle: SFTP System\ndescription: How the SFTP file browser works\n---\n\nThe SFTP system provides file management capabi"
  },
  {
    "path": "docs/src/content/docs/principles/ssh.md",
    "chars": 5491,
    "preview": "---\ntitle: SSH Connection\ndescription: How SSH connections are established and managed\n---\n\nUnderstanding SSH connection"
  },
  {
    "path": "docs/src/content/docs/principles/state.md",
    "chars": 8645,
    "preview": "---\ntitle: State Management\ndescription: How state is managed with Riverpod\n---\n\nUnderstanding the state management arch"
  },
  {
    "path": "docs/src/content/docs/principles/terminal.md",
    "chars": 7073,
    "preview": "---\ntitle: Terminal Implementation\ndescription: How the SSH terminal works internally\n---\n\nThe SSH terminal is one of th"
  },
  {
    "path": "docs/src/content/docs/quick-start.mdx",
    "chars": 1347,
    "preview": "---\ntitle: Quick Start\ndescription: Get up and running with Server Box in minutes\n---\n\nFollow this quick start guide to "
  },
  {
    "path": "docs/src/content/docs/zh/advanced/bulk-import.md",
    "chars": 1332,
    "preview": "---\ntitle: 批量导入服务器\ndescription: 从 JSON 文件中导入多个服务器\n---\n\n使用 JSON 文件一次性导入多个服务器配置。\n\n## JSON 格式\n\n:::danger[安全警告]\n**切勿在文件中存储明文"
  },
  {
    "path": "docs/src/content/docs/zh/advanced/custom-commands.md",
    "chars": 758,
    "preview": "---\ntitle: 自定义命令\ndescription: 在服务器页面上显示自定义命令输出\n---\n\n添加自定义 shell 命令,以在服务器详情页面上显示其输出。\n\n## 设置步骤\n\n1. 服务器设置 → 自定义命令\n2. 以 JSON"
  },
  {
    "path": "docs/src/content/docs/zh/advanced/custom-logo.md",
    "chars": 765,
    "preview": "---\ntitle: 自定义服务器 Logo\ndescription: 为服务器卡片使用自定义图标\n---\n\n通过图片 URL 在服务器卡片上显示自定义 Logo。\n\n## 设置步骤\n\n1. 服务器设置 → 自定义 Logo\n2. 输入图片"
  },
  {
    "path": "docs/src/content/docs/zh/advanced/json-settings.md",
    "chars": 805,
    "preview": "---\ntitle: 隐藏设置 (JSON)\ndescription: 通过 JSON 编辑器访问高级设置\n---\n\n有些设置在 UI 中是隐藏的,但可以通过 JSON 编辑器进行访问。\n\n## 如何访问\n\n长按侧边栏中的**“设置”**即"
  },
  {
    "path": "docs/src/content/docs/zh/advanced/troubleshooting.md",
    "chars": 1434,
    "preview": "---\ntitle: 常见问题\ndescription: 常见问题的解决方案\n---\n\n## 连接问题\n\n### SSH 无法连接\n\n**症状:** 超时、连接被拒绝、身份验证失败\n\n**解决方案:**\n\n1. **核对服务器类型:** 仅"
  },
  {
    "path": "docs/src/content/docs/zh/advanced/widgets.md",
    "chars": 1286,
    "preview": "---\ntitle: 主屏幕小组件\ndescription: 在主屏幕上添加服务器状态小组件\n---\n\n需要在服务器上安装 [ServerBox Monitor](https://github.com/lollipopkit/server_"
  },
  {
    "path": "docs/src/content/docs/zh/development/architecture.md",
    "chars": 1656,
    "preview": "---\ntitle: 架构\ndescription: 架构模式与设计决策\n---\n\nServer Box 遵循整洁架构 (Clean Architecture) 原则,在数据层、领域层和表现层之间实现了清晰的分离。\n\n## 分层架构\n\n``"
  },
  {
    "path": "docs/src/content/docs/zh/development/building.md",
    "chars": 1217,
    "preview": "---\ntitle: 构建指南\ndescription: 不同平台的构建说明\n---\n\nServer Box 使用自定义构建系统 (`fl_build`) 进行跨平台构建。\n\n## 前置条件\n\n- Flutter SDK (stable c"
  },
  {
    "path": "docs/src/content/docs/zh/development/codegen.md",
    "chars": 1573,
    "preview": "---\ntitle: 代码生成\ndescription: 使用 build_runner 进行代码生成\n---\n\nServer Box 大量使用代码生成技术来处理模型、状态管理和序列化。\n\n## 何时运行代码生成\n\n在修改以下内容后需要运行"
  },
  {
    "path": "docs/src/content/docs/zh/development/state.md",
    "chars": 1819,
    "preview": "---\ntitle: 状态管理\ndescription: 基于 Riverpod 的状态管理模式\n---\n\nServer Box 使用 Riverpod 及其代码生成工具进行状态管理。\n\n## Provider 类型\n\n### StateP"
  },
  {
    "path": "docs/src/content/docs/zh/development/structure.md",
    "chars": 1495,
    "preview": "---\ntitle: 项目结构\ndescription: 了解 Server Box 的代码库结构\n---\n\nServer Box 项目遵循模块化架构,具有清晰的关注点分离。\n\n## 目录结构\n\n```\nlib/\n├── core/    "
  },
  {
    "path": "docs/src/content/docs/zh/development/testing.md",
    "chars": 1740,
    "preview": "---\ntitle: 测试指南\ndescription: 测试策略与运行测试\n---\n\n## 运行测试\n\n```bash\n# 运行所有测试\nflutter test\n\n# 运行特定测试文件\nflutter test test/battery"
  },
  {
    "path": "docs/src/content/docs/zh/index.mdx",
    "chars": 1337,
    "preview": "---\ntitle: Server Box\ndescription: 一款全面的跨平台服务器管理应用\nhero:\n  tagline: 随时随地管理您的 Linux 服务器\n  actions:\n    - text: 开始使用\n     "
  },
  {
    "path": "docs/src/content/docs/zh/installation.mdx",
    "chars": 1196,
    "preview": "---\ntitle: 安装\ndescription: 在您的设备上下载并安装 Server Box\n---\n\nServer Box 适用于多个平台。选择您偏好的安装方式。\n\n## 移动应用\n\n### iOS\n\n从 **[App Store]"
  },
  {
    "path": "docs/src/content/docs/zh/introduction.mdx",
    "chars": 713,
    "preview": "---\ntitle: 介绍\ndescription: 了解 Server Box 是什么以及它能做什么\n---\n\nServer Box 是一款使用 Flutter 构建的全面跨平台服务器管理应用。它允许您随时随地监控、管理和控制您的 Lin"
  },
  {
    "path": "docs/src/content/docs/zh/platforms/desktop.md",
    "chars": 757,
    "preview": "---\ntitle: 桌面端功能\ndescription: macOS, Linux 和 Windows 的平台特定功能\n---\n\nServer Box 在桌面平台上提供了额外的效率功能。\n\n## macOS\n\n### 菜单栏集成\n\n- 在"
  },
  {
    "path": "docs/src/content/docs/zh/platforms/mobile.md",
    "chars": 808,
    "preview": "---\ntitle: 移动端功能\ndescription: iOS 和 Android 的平台特定功能\n---\n\nServer Box 为 iOS 和 Android 设备提供了多项移动端特有功能。\n\n## 生物识别身份验证\n\n使用生物识别"
  },
  {
    "path": "docs/src/content/docs/zh/principles/architecture.md",
    "chars": 3140,
    "preview": "---\ntitle: 架构概览\ndescription: 应用程序的高层架构设计\n---\n\nServer Box 采用分层架构,实现了清晰的关注点分离。\n\n## 架构分层\n\n```\n┌────────────────────────────"
  },
  {
    "path": "docs/src/content/docs/zh/principles/sftp.md",
    "chars": 9208,
    "preview": "---\ntitle: SFTP 系统\ndescription: SFTP 文件浏览器的工作原理\n---\n\nSFTP 系统通过 SSH 提供文件管理功能。\n\n## 架构\n\n```\n┌──────────────────────────────"
  },
  {
    "path": "docs/src/content/docs/zh/principles/ssh.md",
    "chars": 4430,
    "preview": "---\ntitle: SSH 连接\ndescription: SSH 连接是如何建立和管理的\n---\n\n了解 Server Box 中的 SSH 连接机制。\n\n## 连接流程\n\n```text\n用户输入 → Spi 配置 → genClie"
  },
  {
    "path": "docs/src/content/docs/zh/principles/state.md",
    "chars": 5881,
    "preview": "---\ntitle: 状态管理\ndescription: 如何使用 Riverpod 进行状态管理\n---\n\n了解 Server Box 中的状态管理架构。\n\n## 为何选择 Riverpod?\n\n**主要优势:**\n- **编译时安全**"
  },
  {
    "path": "docs/src/content/docs/zh/principles/terminal.md",
    "chars": 4357,
    "preview": "---\ntitle: 终端实现\ndescription: SSH 终端的内部工作原理\n---\n\nSSH 终端是功能最复杂的模块之一,基于自定义的 xterm.dart 分支构建。\n\n## 架构概览\n\n```\n┌───────────────"
  },
  {
    "path": "docs/src/content/docs/zh/quick-start.mdx",
    "chars": 744,
    "preview": "---\ntitle: 快速开始\ndescription: 在几分钟内开始使用 Server Box\n---\n\n按照本快速入门指南连接您的第一台服务器并开始监控。\n\n## 第一步:添加服务器\n\n1. 打开 Server Box\n2. 点击 *"
  },
  {
    "path": "docs/src/content.config.ts",
    "chars": 269,
    "preview": "import { defineCollection } from 'astro:content';\nimport { docsLoader } from '@astrojs/starlight/loaders';\nimport { docs"
  },
  {
    "path": "docs/src/styles/custom.css",
    "chars": 162,
    "preview": "/* Server Box Custom Styles */\n\n:root {\n\t--sl-color-accent: #02569b;\n\t--sl-color-accent-low: #02569b15;\n\t--starlight-car"
  },
  {
    "path": "docs/tsconfig.json",
    "chars": 109,
    "preview": "{\n  \"extends\": \"astro/tsconfigs/strict\",\n  \"include\": [\".astro/types.d.ts\", \"**/*\"],\n  \"exclude\": [\"dist\"]\n}\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "chars": 389,
    "preview": "A Flutter project which provide charts to display Linux server status and tools to manage server.\nEspecially thanks to d"
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "chars": 44,
    "preview": "A server status & toolbox app using Flutter\n"
  }
]

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

About this extraction

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

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

Copied to clipboard!