Full Code of asv-soft/asv-drones for AI

main 9f78310d7315 cached
322 files
999.4 KB
233.0k tokens
841 symbols
1 requests
Download .txt
Showing preview only (1,113K chars total). Download the full file or copy to clipboard to get everything.
Repository: asv-soft/asv-drones
Branch: main
Commit: 9f78310d7315
Files: 322
Total size: 999.4 KB

Directory structure:
gitextract_fy5d8uuq/

├── .config/
│   └── dotnet-tools.json
├── .csharpierignore
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   └── workflows/
│       ├── api-release-dev.yml
│       ├── api-release.yml
│       └── drones-release-windows.yml
├── .gitignore
├── .husky/
│   ├── pre-commit
│   └── task-runner.json
├── LICENSE
├── README.md
├── api_build.bat
├── api_publish_github.bat
├── publish.bat
├── src/
│   ├── .aiassistant/
│   │   └── rules/
│   │       └── comments.md
│   ├── .editorconfig
│   ├── .gitignore
│   ├── .run/
│   │   └── Publish win-x64.run.xml
│   ├── Asv.Drones/
│   │   ├── App.axaml
│   │   ├── App.axaml.cs
│   │   ├── Asv.Drones.csproj
│   │   ├── Asv.Drones.csproj.DotSettings
│   │   ├── AsvDronesMixin.cs
│   │   ├── Core/
│   │   │   ├── Commands/
│   │   │   │   ├── Behaviour/
│   │   │   │   │   ├── Remove/
│   │   │   │   │   │   └── RemoveItemCommand.cs
│   │   │   │   │   └── Rename/
│   │   │   │   │       └── CommitRenameCommand.cs
│   │   │   │   ├── FileBrowser/
│   │   │   │   │   ├── FileBrowserViewModel/
│   │   │   │   │   │   └── FindFileCommand.cs
│   │   │   │   │   ├── Items/
│   │   │   │   │   │   ├── CalculateCrc32Command.cs
│   │   │   │   │   │   └── CreateDirectoryCommand.cs
│   │   │   │   │   ├── OpenFileBrowserCommand.cs
│   │   │   │   │   └── Transfer/
│   │   │   │   │       ├── BurstDownloadItemCommand.cs
│   │   │   │   │       ├── DownloadItemCommand.cs
│   │   │   │   │       ├── ITransferFtpEntries.cs
│   │   │   │   │       ├── TransferCommandBase.cs
│   │   │   │   │       └── UploadItemCommand.cs
│   │   │   │   ├── Flight/
│   │   │   │   │   ├── OpenFlight.cs
│   │   │   │   │   ├── OpenFlightMode.cs
│   │   │   │   │   └── Widgets/
│   │   │   │   │       └── UavWidget/
│   │   │   │   │           ├── AutoModeCommand.cs
│   │   │   │   │           ├── GuidedModeCommand.cs
│   │   │   │   │           ├── LandCommand.cs
│   │   │   │   │           ├── MissionProgress/
│   │   │   │   │           │   └── UpdateMissionCommand.cs
│   │   │   │   │           ├── RTLCommand.cs
│   │   │   │   │           ├── StartMissionCommand.cs
│   │   │   │   │           └── TakeOffCommand.cs
│   │   │   │   ├── MavParams/
│   │   │   │   │   ├── MavParamsPageViewModel/
│   │   │   │   │   │   ├── RemoveAllPinsCommand.cs
│   │   │   │   │   │   ├── StopUpdateParamsCommand.cs
│   │   │   │   │   │   └── UpdateParamsCommand.cs
│   │   │   │   │   └── OpenMavParamsCommand.cs
│   │   │   │   ├── Mavlink/
│   │   │   │   │   ├── MavlinkCommands.cs
│   │   │   │   │   ├── MavlinkCommandsMixin.cs
│   │   │   │   │   ├── MavlinkParamReadCommand.cs
│   │   │   │   │   ├── MavlinkParamsWriteCommand.cs
│   │   │   │   │   └── NullMavlinkCommands.cs
│   │   │   │   ├── PacketViewer/
│   │   │   │   │   ├── ClearAllPacketsCommand.cs
│   │   │   │   │   ├── ExportPacketsToCsvCommand.cs
│   │   │   │   │   └── OpenPacketViewer.cs
│   │   │   │   └── Setup/
│   │   │   │       ├── FrameType/
│   │   │   │       │   └── ChangeFrameTypeCommand.cs
│   │   │   │       └── OpenSetupCommand.cs
│   │   │   ├── Controls/
│   │   │   │   └── DeviceTelemetry/
│   │   │   │       ├── AngleUavIndicator/
│   │   │   │       │   ├── Items/
│   │   │   │       │   │   ├── Pitch/
│   │   │   │       │   │   │   ├── PitchItem.cs
│   │   │   │       │   │   │   └── PitchItem.properties.cs
│   │   │   │       │   │   └── Roll/
│   │   │   │       │   │       ├── RollItem.cs
│   │   │   │       │   │       └── RollItem.properties.cs
│   │   │   │       │   ├── UavAngleIndicator.cs
│   │   │   │       │   ├── UavAngleIndicator.properties.cs
│   │   │   │       │   └── UavAngleIndicatorStyles.axaml
│   │   │   │       ├── CompassUavIndicator/
│   │   │   │       │   ├── CompassScaleItem.cs
│   │   │   │       │   ├── CompassUavIndicator.cs
│   │   │   │       │   ├── CompassUavIndicator.properties.cs
│   │   │   │       │   └── CompassUavIndicatorStyles.axaml
│   │   │   │       ├── DeviceTelemetryDesignPreview.cs
│   │   │   │       ├── OldAttitudeIndicator/
│   │   │   │       │   ├── AttitudeIndicator.cs
│   │   │   │       │   ├── AttitudeIndicator.properties.cs
│   │   │   │       │   ├── AttitudeIndicatorStyles.axaml
│   │   │   │       │   └── Items/
│   │   │   │       │       ├── Heading/
│   │   │   │       │       │   └── HeadingScaleItem.cs
│   │   │   │       │       ├── Pitch/
│   │   │   │       │       │   ├── PitchItem.cs
│   │   │   │       │       │   └── PitchItem.properties.cs
│   │   │   │       │       ├── Roll/
│   │   │   │       │       │   ├── RollItem.cs
│   │   │   │       │       │   └── RollItem.properties.cs
│   │   │   │       │       └── Scale/
│   │   │   │       │           ├── ScaleItem.cs
│   │   │   │       │           └── ScaleItem.properties.cs
│   │   │   │       ├── RouteUavIndicator/
│   │   │   │       │   ├── RouteUavIndicator.cs
│   │   │   │       │   └── RouteUavIndicatorStyles.axaml
│   │   │   │       └── Rtt/
│   │   │   │           ├── AltitudeUavIndicator/
│   │   │   │           │   ├── AltitudeUavIndicator.axaml
│   │   │   │           │   ├── AltitudeUavIndicator.axaml.cs
│   │   │   │           │   └── AltitudeUavIndicatorViewModel.cs
│   │   │   │           ├── AngleUavRttIndicator/
│   │   │   │           │   ├── AngleUavRttIndicator.axaml
│   │   │   │           │   ├── AngleUavRttIndicator.axaml.cs
│   │   │   │           │   └── AngleUavRttIndicatorViewModel.cs
│   │   │   │           ├── BatteryUavIndicator/
│   │   │   │           │   ├── BatteryUavIndicator.axaml
│   │   │   │           │   ├── BatteryUavIndicator.axaml.cs
│   │   │   │           │   └── BatteryUavIndicatorViewModel.cs
│   │   │   │           ├── HeadingUavIndicator/
│   │   │   │           │   ├── HeadingUavIndicator.axaml
│   │   │   │           │   ├── HeadingUavIndicator.axaml.cs
│   │   │   │           │   └── HeadingUavIndicatorViewModel.cs
│   │   │   │           ├── HomeAzimuthUavIndicator/
│   │   │   │           │   ├── HomeAzimuthUavIndicator.axaml
│   │   │   │           │   ├── HomeAzimuthUavIndicator.axaml.cs
│   │   │   │           │   └── HomeAzimuthUavIndicatorViewModel.cs
│   │   │   │           └── VelocityUavIndicator/
│   │   │   │               ├── VelocityUavIndicator.axaml
│   │   │   │               ├── VelocityUavIndicator.axaml.cs
│   │   │   │               └── VelocityUavIndicatorViewModel.cs
│   │   │   ├── Converters/
│   │   │   │   └── Crc32StatusToColorConverter.cs
│   │   │   └── Services/
│   │   │       ├── ClientDeviceWidgetFactory/
│   │   │       │   └── ClientDeviceWidgetFactory.cs
│   │   │       ├── Devices/
│   │   │       │   └── Gnss/
│   │   │       │       └── GnssDeviceManagerExtentsion.cs
│   │   │       └── Files/
│   │   │           ├── BusyFlag.cs
│   │   │           ├── Local/
│   │   │           │   └── LocalFilesService.cs
│   │   │           ├── PathHelper.cs
│   │   │           ├── ProgressWithLock.cs
│   │   │           └── Remote/
│   │   │               ├── FtpClientService.cs
│   │   │               └── RemoteEntriesSync.cs
│   │   ├── RS.Designer.cs
│   │   ├── RS.resx
│   │   ├── RS.ru.resx
│   │   └── Shell/
│   │       └── Pages/
│   │           ├── Device/
│   │           │   ├── FileBrowser/
│   │           │   │   ├── Contracts/
│   │           │   │   │   ├── FileBrowserBackend.cs
│   │           │   │   │   ├── IBrowserItemsOperations.cs
│   │           │   │   │   ├── LocalBrowserItemsOperations.cs
│   │           │   │   │   └── RemoteBrowserItemsOperations.cs
│   │           │   │   ├── Dialogs/
│   │           │   │   │   ├── BurstDownloadDialogView.axaml
│   │           │   │   │   ├── BurstDownloadDialogView.axaml.cs
│   │           │   │   │   └── BurstDownloadDialogViewModel.cs
│   │           │   │   ├── FileBrowserView.axaml
│   │           │   │   ├── FileBrowserView.axaml.cs
│   │           │   │   ├── FileBrowserViewModel.cs
│   │           │   │   ├── HomePageFileBrowserDeviceItemAction.cs
│   │           │   │   ├── IO/
│   │           │   │   │   ├── FileSize.cs
│   │           │   │   │   ├── FtpBrowserNamingPolicy.cs
│   │           │   │   │   ├── FtpBrowserPath.cs
│   │           │   │   │   └── Types/
│   │           │   │   │       ├── Crc32Status.cs
│   │           │   │   │       └── FtpBrowserSourceType.cs
│   │           │   │   └── Tree/
│   │           │   │       ├── BrowserNode.cs
│   │           │   │       ├── BrowserTree.cs
│   │           │   │       └── Items/
│   │           │   │           ├── BrowserItemComparer.cs
│   │           │   │           ├── BrowserItemViewModel.cs
│   │           │   │           ├── DirectoryItemViewModel.cs
│   │           │   │           ├── FileItemViewModel.cs
│   │           │   │           └── IBrowserItemViewModel.cs
│   │           │   ├── MavParams/
│   │           │   │   ├── Dialog/
│   │           │   │   │   ├── TryCloseWithApprovalDialogView.axaml
│   │           │   │   │   ├── TryCloseWithApprovalDialogView.axaml.cs
│   │           │   │   │   └── TryCloseWithApprovalDialogViewModel.cs
│   │           │   │   ├── HomePageParamsDeviceItemAction.cs
│   │           │   │   ├── MavParamsPageView.axaml
│   │           │   │   ├── MavParamsPageView.axaml.cs
│   │           │   │   ├── MavParamsPageViewModel.cs
│   │           │   │   └── ParamItem/
│   │           │   │       ├── ParamItemView.axaml
│   │           │   │       ├── ParamItemView.axaml.cs
│   │           │   │       ├── ParamItemViewModel.cs
│   │           │   │       └── RoutedEvents/
│   │           │   │           └── ParamItemChangedEvent.cs
│   │           │   └── Setup/
│   │           │       ├── DefaultSetupExtension.cs
│   │           │       ├── HomePageSetupDeviceItemAction.cs
│   │           │       ├── SetupMixin.cs
│   │           │       ├── SetupPageView.axaml
│   │           │       ├── SetupPageView.axaml.cs
│   │           │       ├── SetupPageViewModel.cs
│   │           │       └── Subpage/
│   │           │           ├── FrameType/
│   │           │           │   ├── DroneFrameItem/
│   │           │           │   │   ├── DroneFrameItemView.axaml
│   │           │           │   │   ├── DroneFrameItemView.axaml.cs
│   │           │           │   │   ├── DroneFrameItemViewModel.cs
│   │           │           │   │   ├── NullDroneFrame.cs
│   │           │           │   │   └── RoutedEvents/
│   │           │           │   │       └── CurrentDroneFrameChangeEvent.cs
│   │           │           │   ├── FrameTypeSetupPageExtension.cs
│   │           │           │   ├── SetupFrameTypeView.axaml
│   │           │           │   ├── SetupFrameTypeView.axaml.cs
│   │           │           │   └── SetupFrameTypeViewModel.cs
│   │           │           ├── Motors/
│   │           │           │   ├── MotorItem/
│   │           │           │   │   ├── MotorItemView.axaml
│   │           │           │   │   ├── MotorItemView.axaml.cs
│   │           │           │   │   └── MotorItemViewModel.cs
│   │           │           │   ├── MotorsSetupPageExtension.cs
│   │           │           │   ├── SetupMotorsView.axaml
│   │           │           │   ├── SetupMotorsView.axaml.cs
│   │           │           │   └── SetupMotorsViewModel.cs
│   │           │           └── SetupSubpage.cs
│   │           ├── Flight/
│   │           │   ├── Anchors/
│   │           │   │   ├── FlightUavAnchorsExtension.cs
│   │           │   │   ├── MissionAnchor.cs
│   │           │   │   └── UavAnchor.cs
│   │           │   ├── FlightPageView.axaml
│   │           │   ├── FlightPageView.axaml.cs
│   │           │   ├── FlightPageViewModel.cs
│   │           │   ├── HomePageFlightExtension.cs
│   │           │   └── Widgets/
│   │           │       ├── FlightWidgetsExtension.cs
│   │           │       └── UavWidget/
│   │           │           ├── Dialogs/
│   │           │           │   ├── SetAltitudeDialogView.axaml
│   │           │           │   ├── SetAltitudeDialogView.axaml.cs
│   │           │           │   └── SetAltitudeDialogViewModel.cs
│   │           │           ├── MissionProgress/
│   │           │           │   ├── MissionProgressView.axaml
│   │           │           │   ├── MissionProgressView.axaml.cs
│   │           │           │   └── MissionProgressViewModel.cs
│   │           │           ├── UavWidgetView.axaml
│   │           │           ├── UavWidgetView.axaml.cs
│   │           │           └── UavWidgetViewModel.cs
│   │           ├── FlightMode/
│   │           │   ├── Anchors/
│   │           │   │   └── FlightModeAnchorsExtension.cs
│   │           │   ├── FlightModePageView.axaml
│   │           │   ├── FlightModePageView.axaml.cs
│   │           │   ├── FlightModePageViewModel.cs
│   │           │   ├── HomePageFlightModeExtension.cs
│   │           │   └── Widgets/
│   │           │       ├── Device/
│   │           │       │   ├── FlightModeClientDeviceWidgetExtension.cs
│   │           │       │   └── Mavlink/
│   │           │       │       └── Drone/
│   │           │       │           ├── DroneFlightWidgetViewModel.cs
│   │           │       │           ├── DroneWidgetCreationHandler.cs
│   │           │       │           ├── Plane/
│   │           │       │           │   ├── PlaneWidgetCreationHandler.cs
│   │           │       │           │   ├── PlaneWidgetViewModel.cs
│   │           │       │           │   └── Sections/
│   │           │       │           │       ├── PlaneSectionExtension.cs
│   │           │       │           │       ├── PlaneSectionView.axaml
│   │           │       │           │       ├── PlaneSectionView.axaml.cs
│   │           │       │           │       └── PlaneSectionViewModel.cs
│   │           │       │           └── Sections/
│   │           │       │               ├── AttitudeIndicator/
│   │           │       │               │   ├── AttitudeIndicatorSectionView.axaml
│   │           │       │               │   ├── AttitudeIndicatorSectionView.axaml.cs
│   │           │       │               │   ├── AttitudeIndicatorSectionViewModel.cs
│   │           │       │               │   └── DroneFlightWidgetExtensionAttitudeIndicatorSection.cs
│   │           │       │               ├── FlightControl/
│   │           │       │               │   ├── DroneFlightWidgetFlightControlSectionExtension.cs
│   │           │       │               │   ├── FlightControlSectionView.axaml
│   │           │       │               │   ├── FlightControlSectionView.axaml.cs
│   │           │       │               │   └── FlightControlSectionViewModel.cs
│   │           │       │               └── Telemetry/
│   │           │       │                   ├── DroneFlightWidgetTelemetrySectionExtension.cs
│   │           │       │                   ├── TelemetrySectionView.axaml
│   │           │       │                   ├── TelemetrySectionView.axaml.cs
│   │           │       │                   └── TelemetrySectionViewModel.cs
│   │           │       └── Test/
│   │           │           ├── PluginFlightItemView.axaml
│   │           │           ├── PluginFlightItemView.axaml.cs
│   │           │           ├── PluginFlightItemViewModel.cs
│   │           │           └── PluginFlightItemWidgetExtension.cs
│   │           └── PacketViewer/
│   │               ├── Dialogs/
│   │               │   ├── SavePacketMessagesDialogView.axaml
│   │               │   ├── SavePacketMessagesDialogView.axaml.cs
│   │               │   └── SavePacketMessagesDialogViewModel.cs
│   │               ├── Filters/
│   │               │   ├── Comparers/
│   │               │   │   ├── PacketFilterComparerBase.cs
│   │               │   │   ├── SourcePacketFilterComparer.cs
│   │               │   │   └── TypePacketFilterComparer.cs
│   │               │   ├── PacketFilterViewModelBase.cs
│   │               │   ├── SourcePacketFilterViewModel.cs
│   │               │   └── TypePacketFilterViewModel.cs
│   │               ├── HomePacketViewerExtension.cs
│   │               ├── PacketConverter/
│   │               │   └── DefaultMavlinkPacketConverter.cs
│   │               ├── PacketMessage/
│   │               │   ├── PacketMessageView.axaml
│   │               │   ├── PacketMessageView.axaml.cs
│   │               │   └── PacketMessageViewModel.cs
│   │               ├── PacketViewerView.axaml
│   │               ├── PacketViewerView.axaml.cs
│   │               └── PacketViewerViewModel.cs
│   ├── Asv.Drones.Android/
│   │   ├── Asv.Drones.Android.csproj
│   │   ├── MainActivity.cs
│   │   ├── Properties/
│   │   │   └── AndroidManifest.xml
│   │   └── Resources/
│   │       ├── AboutResources.txt
│   │       ├── drawable/
│   │       │   └── splash_screen.xml
│   │       ├── drawable-night-v31/
│   │       │   └── avalonia_anim.xml
│   │       ├── drawable-v31/
│   │       │   └── avalonia_anim.xml
│   │       ├── values/
│   │       │   ├── colors.xml
│   │       │   └── styles.xml
│   │       ├── values-night/
│   │       │   └── colors.xml
│   │       └── values-v31/
│   │           └── styles.xml
│   ├── Asv.Drones.Api/
│   │   ├── Asv.Drones.Api.csproj
│   │   ├── Asv.Drones.Api.csproj.DotSettings
│   │   ├── Core/
│   │   │   ├── Commands/
│   │   │   │   ├── Behaviour/
│   │   │   │   │   ├── Remove/
│   │   │   │   │   │   ├── IRemoveItemCommand.cs
│   │   │   │   │   │   └── ISupportRemove.cs
│   │   │   │   │   └── Rename/
│   │   │   │   │       ├── ICommitRenameCommand.cs
│   │   │   │   │       └── ISupportRename.cs
│   │   │   │   ├── Commands.cs
│   │   │   │   ├── Flight/
│   │   │   │   │   └── IFlightModeCommands.cs
│   │   │   │   ├── Mavlink/
│   │   │   │   │   └── IMavlinkCommands.cs
│   │   │   │   └── MavlinkMicroserviceCommand.cs
│   │   │   ├── Controls/
│   │   │   │   ├── FlightWidget/
│   │   │   │   │   ├── FlightWidgetView.axaml
│   │   │   │   │   ├── FlightWidgetView.axaml.cs
│   │   │   │   │   ├── FlightWidgetViewModel.cs
│   │   │   │   │   ├── FlightWidgetsComparer.cs
│   │   │   │   │   ├── IFlightWidget.cs
│   │   │   │   │   └── Section/
│   │   │   │   │       ├── FlightWidgetSectionsComparer.cs
│   │   │   │   │       └── IFlightWidgetSection.cs
│   │   │   │   └── MavParam/
│   │   │   │       ├── Button/
│   │   │   │       │   ├── MavParamButtonView.axaml
│   │   │   │       │   ├── MavParamButtonView.axaml.cs
│   │   │   │       │   └── MavParamButtonViewModel.cs
│   │   │   │       ├── ComboBox/
│   │   │   │       │   ├── MavParamComboBoxView.axaml
│   │   │   │       │   ├── MavParamComboBoxView.axaml.cs
│   │   │   │       │   └── MavParamComboboxViewModel.cs
│   │   │   │       ├── Geopoint/
│   │   │   │       │   ├── MavParamAltitudeTextBoxView.cs
│   │   │   │       │   ├── MavParamAltitudeTextBoxViewModel.cs
│   │   │   │       │   ├── MavParamLatLonTextBoxView.cs
│   │   │   │       │   └── MavParamLatLonTextBoxViewModel.cs
│   │   │   │       ├── MavParamFactory.cs
│   │   │   │       ├── MavParamInfo.cs
│   │   │   │       ├── MavParamViewModel.cs
│   │   │   │       ├── String/
│   │   │   │       │   ├── MavParamAsciiCharView.cs
│   │   │   │       │   └── MavParamAsciiCharViewModel.cs
│   │   │   │       └── TextBox/
│   │   │   │           ├── MavParamTextBoxView.axaml
│   │   │   │           ├── MavParamTextBoxView.axaml.cs
│   │   │   │           └── MavParamTextBoxViewModel.cs
│   │   │   └── Services/
│   │   │       ├── ClientDeviceWidgetFactory/
│   │   │       │   ├── IClientDeviceWidgetCreationHandler.cs
│   │   │       │   └── IClientDeviceWidgetFactory.cs
│   │   │       ├── Converters/
│   │   │       │   └── IPacketConverter.cs
│   │   │       └── Devices/
│   │   │           └── Mavlink/
│   │   │               └── IMavlinkHost.cs
│   │   ├── RS.Designer.cs
│   │   ├── RS.resx
│   │   ├── RS.ru.resx
│   │   ├── Shell/
│   │   │   └── Pages/
│   │   │       ├── FileBrowser/
│   │   │       │   └── IFileBrowserViewModel.cs
│   │   │       ├── Flight/
│   │   │       │   ├── FlightMode.cs
│   │   │       │   ├── IFlightMode.cs
│   │   │       │   └── Widgets/
│   │   │       │       └── UavWidget/
│   │   │       │           └── IUavFlightWidget.cs
│   │   │       ├── FlightMode/
│   │   │       │   ├── IFlightModePage.cs
│   │   │       │   └── Widgets/
│   │   │       │       └── Device/
│   │   │       │           ├── DeviceFlightWidgetViewModelBase.cs
│   │   │       │           ├── IDeviceFlightWidget.cs
│   │   │       │           └── Mavlink/
│   │   │       │               ├── Drone/
│   │   │       │               │   ├── DroneFlightWidgetViewModelBase.cs
│   │   │       │               │   └── IDroneFlightWidget.cs
│   │   │       │               ├── IMavlinkDeviceFlightWidget.cs
│   │   │       │               └── MavlinkDeviceFlightWidgetViewModelBase.cs
│   │   │       ├── MavParams/
│   │   │       │   └── IMavParamsPageViewModel.cs
│   │   │       └── Setup/
│   │   │           ├── ISetupPage.cs
│   │   │           └── Subpage/
│   │   │               └── ISetupSubpage.cs
│   │   └── Tools/
│   │       └── Mavlink/
│   │           ├── DeviceIconMixin.cs
│   │           └── MavlinkHost.cs
│   ├── Asv.Drones.Desktop/
│   │   ├── Asv.Drones.Desktop.csproj
│   │   ├── Program.cs
│   │   ├── app.manifest
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.Production.json
│   │   └── appsettings.json
│   ├── Asv.Drones.iOS/
│   │   ├── AppDelegate.cs
│   │   ├── Asv.Drones.iOS.csproj
│   │   ├── Entitlements.plist
│   │   ├── Info.plist
│   │   ├── Main.cs
│   │   └── Resources/
│   │       └── LaunchScreen.xib
│   ├── Asv.Drones.slnx
│   ├── CodeStyle.ruleset
│   ├── Directory.Build.props
│   └── global.json
├── win-64-install.nsi
├── win-arm-install.iss
├── win-arm64-install.iss
├── win-x64-install.iss
└── win-x86-install.iss

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

================================================
FILE: .config/dotnet-tools.json
================================================
{
  "version": 1,
  "isRoot": true,
  "tools": {
    "husky": {
      "version": "0.8.0",
      "commands": [
        "husky"
      ],
      "rollForward": false
    },
    "run-script": {
      "version": "0.6.0",
      "commands": [
        "r"
      ],
      "rollForward": false
    },
    "csharpier": {
      "version": "1.2.1",
      "commands": [
        "csharpier"
      ],
      "rollForward": false
    }
  }
}

================================================
FILE: .csharpierignore
================================================
*
!**/*.cs
!**/*.axaml


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

---

1. Description:
A brief description of the error or issue you have encountered.

2. Steps to Reproduce:
[Step 1]
[Step 2]
[Step 3]
...

3. Expected Result:
Describe what you expected to see after performing the steps mentioned above.

4. Actual Result:
Describe what actually happened after performing the steps mentioned above.

5. Screenshots:
If applicable, add screenshots to help explain your problem.

6. Environment:
Desktop:
    OS: [e.g., Windows 10]
    Version: [e.g., 99.0]

7. Additional Context:
 Include relevant console logs.[Your console logs here]❌Errors [], ⚠️Info [], 📜Log [] 

Please ensure you have provided all necessary steps and information to reproduce the bug.


================================================
FILE: .github/workflows/api-release-dev.yml
================================================
name: Release Api Github only

on:
  push:
    tags:
      - "api-v[0-9]+.[0-9]+.[0-9]+-dev.[0-9]+"
      - "api-v[0-9]+.[0-9]+.[0-9]+-dev"

env:
  GITHUB_PACKAGES_URL: 'https://nuget.pkg.github.com/asv-soft/index.json'
  PROJECT_NAME: 'Asv.Drones'
  PROPS_VERSION_VAR_NAME: 'ApiVersion'

jobs:
  build:
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/api-v')
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '10.x.x'
          
      - name: Add NuGet source
        run: dotnet nuget add source ${{ env.GITHUB_PACKAGES_URL }} \--username '${{secrets.USER_NAME}}' \--password '${{secrets.GIHUB_NUGET_AUTH_TOKEN}}' \--store-password-in-clear-text

      - name: Install dependencies
        run: |
          dotnet restore ./src/${{env.PROJECT_NAME}}/${{env.PROJECT_NAME}}.csproj
          dotnet restore ./src/${{env.PROJECT_NAME}}.Api/${{env.PROJECT_NAME}}.Api.csproj

      - name: Build
        run: |
          dotnet build ./src/${{env.PROJECT_NAME}}/${{env.PROJECT_NAME}}.csproj --configuration Release --no-restore
          dotnet build ./src/${{env.PROJECT_NAME}}.Api/${{env.PROJECT_NAME}}.Api.csproj --configuration Release --no-restore

      - name: Set version variable
        env:
          TAG: ${{ github.ref_name }}
        run: echo "VERSION=${TAG#api-v}" >> $GITHUB_ENV
        
      - name: Read version from Directory.Build.props
        id: read-version
        run: |
            version=$(grep -oP '<${{env.PROPS_VERSION_VAR_NAME}}>\K[^<]+' ./src/Directory.Build.props)
            echo "PropsVersion=${version}" >> $GITHUB_ENV
            
      - name: Compare tag with NuGet package version
        run: |
          if [ "${{ env.PropsVersion }}" != "${{ env.VERSION }}" ]; then
            echo "Error: Tag does not match NuGet package version"
            exit 1
          fi

      - name: Pack package
        run: |
          dotnet pack ./src/${{env.PROJECT_NAME}}/${{env.PROJECT_NAME}}.csproj -c Release /p:ProductVersion=${VERSION} --no-build -o .
          dotnet pack ./src/${{env.PROJECT_NAME}}.Api/${{env.PROJECT_NAME}}.Api.csproj -c Release /p:ProductVersion=${VERSION} --no-build -o .

      - name: List output files
        run: ls -la

      - name: Push package to GitHub
        run: |
          dotnet nuget push ${{env.PROJECT_NAME}}.${{ env.VERSION }}.nupkg --api-key ${{ secrets.GIHUB_NUGET_AUTH_TOKEN }} --skip-duplicate --source ${{ env.GITHUB_PACKAGES_URL }}
          dotnet nuget push ${{env.PROJECT_NAME}}.Api.${{ env.VERSION }}.nupkg --api-key ${{ secrets.GIHUB_NUGET_AUTH_TOKEN }} --skip-duplicate --source ${{ env.GITHUB_PACKAGES_URL }}


================================================
FILE: .github/workflows/api-release.yml
================================================
name: Release Api NuGet

on:
  push:
    tags:
      - "api-v[0-9]+.[0-9]+.[0-9]+"
      - "api-v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+"
      - "api-v[0-9]+.[0-9]+.[0-9]+-rc"

env:
  NUGET_SOURCE_URL: 'https://api.nuget.org/v3/index.json'
  GITHUB_PACKAGES_URL: 'https://nuget.pkg.github.com/asv-soft/index.json'
  PROJECT_NAME: 'Asv.Drones'
  PROPS_VERSION_VAR_NAME: 'ApiVersion'

jobs:
  build:
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/api-v')
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '10.x.x'
          
      - name: Add NuGet source
        run: dotnet nuget add source ${{ env.GITHUB_PACKAGES_URL }} \--username '${{secrets.USER_NAME}}' \--password '${{secrets.GIHUB_NUGET_AUTH_TOKEN}}' \--store-password-in-clear-text

      - name: Install dependencies
        run: | 
          dotnet restore ./src/${{env.PROJECT_NAME}}/${{env.PROJECT_NAME}}.csproj
          dotnet restore ./src/${{env.PROJECT_NAME}}.Api/${{env.PROJECT_NAME}}.Api.csproj

      - name: Build
        run: |
          dotnet build ./src/${{env.PROJECT_NAME}}/${{env.PROJECT_NAME}}.csproj --configuration Release --no-restore
          dotnet build ./src/${{env.PROJECT_NAME}}.Api/${{env.PROJECT_NAME}}.Api.csproj --configuration Release --no-restore

      - name: Set version variable
        env:
          TAG: ${{ github.ref_name }}
        run: echo "VERSION=${TAG#api-v}" >> $GITHUB_ENV
        
      - name: Read version from Directory.Build.props
        id: read-version
        run: |
          version=$(grep -oP '<${{env.PROPS_VERSION_VAR_NAME}}>\K[^<]+' ./src/Directory.Build.props)
          echo "PropsVersion=${version}" >> $GITHUB_ENV
          
      - name: Compare tag with NuGet package version
        run: |
          if [ "${{ env.PropsVersion }}" != "${{ env.VERSION }}" ]; then
            echo "Error: Tag does not match NuGet package version"
            exit 1
          fi

      - name: Pack package
        run: |
          dotnet pack ./src/${{env.PROJECT_NAME}}/${{env.PROJECT_NAME}}.csproj -c Release /p:ProductVersion=${VERSION} --no-build -o .
          dotnet pack ./src/${{env.PROJECT_NAME}}.Api/${{env.PROJECT_NAME}}.Api.csproj -c Release /p:ProductVersion=${VERSION} --no-build -o .

      - name: List output files
        run: ls -la

      - name: Push package to GitHub
        run: |
          dotnet nuget push ${{env.PROJECT_NAME}}.${{ env.VERSION }}.nupkg --api-key ${{ secrets.GIHUB_NUGET_AUTH_TOKEN }} --skip-duplicate --source ${{ env.GITHUB_PACKAGES_URL }}
          dotnet nuget push ${{env.PROJECT_NAME}}.Api.${{ env.VERSION }}.nupkg --api-key ${{ secrets.GIHUB_NUGET_AUTH_TOKEN }} --skip-duplicate --source ${{ env.GITHUB_PACKAGES_URL }}

      - name: Push package to Nuget
        run: |
          dotnet nuget push ${{env.PROJECT_NAME}}.${{ env.VERSION }}.nupkg --api-key ${{ secrets.NUGET_AUTH_TOKEN }} --skip-duplicate --source ${{ env.NUGET_SOURCE_URL }}
          dotnet nuget push ${{env.PROJECT_NAME}}.Api.${{ env.VERSION }}.nupkg --api-key ${{ secrets.NUGET_AUTH_TOKEN }} --skip-duplicate --source ${{ env.NUGET_SOURCE_URL }}

================================================
FILE: .github/workflows/drones-release-windows.yml
================================================
name: Build and Release Drones For Windows

on:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'
      - 'v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+'
      - 'v[0-9]+.[0-9]+.[0-9]+-rc'

env:
  NUGET_SOURCE_URL: 'https://api.nuget.org/v3/index.json'
  GITHUB_PACKAGES_URL: 'https://nuget.pkg.github.com/asv-soft/index.json'
  PROJECT_NAME: 'Asv.Drones'
  PROPS_VERSION_VAR_NAME: 'ApiVersion'

jobs:
  build-and-release:
    runs-on: windows-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '10.x.x'

      - name: Add NuGet source
        run: dotnet nuget add source ${{ env.GITHUB_PACKAGES_URL }} --username '${{secrets.USER_NAME}}' --password '${{secrets.GIHUB_NUGET_AUTH_TOKEN}}' --store-password-in-clear-text

      - name: Install dependencies
        run: |
          dotnet restore ./src/${{ env.PROJECT_NAME }}/${{ env.PROJECT_NAME }}.csproj
          dotnet restore ./src/${{ env.PROJECT_NAME }}.Desktop/${{ env.PROJECT_NAME }}.Desktop.csproj

      - name: Build
        run: |
          dotnet build ./src/${{ env.PROJECT_NAME }}/${{ env.PROJECT_NAME }}.csproj --no-restore
          dotnet build ./src/${{ env.PROJECT_NAME }}.Desktop/${{ env.PROJECT_NAME }}.Desktop.csproj --no-restore

      - name: Set version variable
        env:
          TAG: ${{ github.ref_name }}
        run: echo "VERSION=${TAG#v}" >> $GITHUB_ENV


      # here you must define path to your .csproj
      - name: Publish project for installer
        run: dotnet publish ./src/${{ env.PROJECT_NAME }}.Desktop/${{ env.PROJECT_NAME }}.Desktop.csproj -c Release -o ./publish/app

      - name: Sign app files
        uses: dlemstra/code-sign-action@v1
        with:
          certificate: '${{ secrets.WINDOWS_SIGNING_CERTIFICATE }}'
          password: '${{ secrets.WINDOWS_SIGNING_PASSWORD }}'
          folder: './publish/app'
          recursive: true
          description: 'Sign The App'

      - name: Install NSIS
        run: |
          choco install nsis

      #here you must define path to your .nsi file (it is used for installer setup and creation)
      - name: Create EXE installer
        uses: joncloud/makensis-action@v4
        with:
          script-file: win-64-install.nsi

      - name: Sign the installer
        uses: dlemstra/code-sign-action@v1
        with:
          certificate: '${{ secrets.WINDOWS_SIGNING_CERTIFICATE }}'
          password: '${{ secrets.WINDOWS_SIGNING_PASSWORD }}'
          files: |
            AsvDronesInstaller.exe
          description: 'Sign The Installer'

      - name: List output files
        run: Get-ChildItem -Path ./publish/app -Force

      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GIHUB_NUGET_AUTH_TOKEN }}
          RELEASE_BODY: ${{ steps.create-release-notes.outputs.release-notes }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          draft: false
          prerelease: ${{ contains(github.ref, 'rc') }}


      - name: Upload Release Asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GIHUB_NUGET_AUTH_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./AsvDronesInstaller.exe
          asset_name: asv-drones-${{ github.ref_name }}-setup-windows-64.exe
          asset_content_type: application/vnd.microsoft.portable-executable

================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/


================================================
FILE: .husky/pre-commit
================================================
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

## husky task runner examples -------------------
## Note : for local installation use 'dotnet' prefix. e.g. 'dotnet husky'

## run all tasks
#husky run

### run all tasks with group: 'group-name'
#husky run --group group-name

## run task with name: 'task-name'
#husky run --name task-name

## pass hook arguments to task
#husky run --args "$1" "$2"

## or put your custom commands -------------------
#echo 'Husky.Net is awesome!'

dotnet husky run --group check
dotnet husky run --group check


================================================
FILE: .husky/task-runner.json
================================================
{
   "$schema": "https://alirezanet.github.io/Husky.Net/schema.json",
   "tasks": [
      {
         "name": "Run csharpier",
         "command": "dotnet",
         "args": [ "csharpier", "format", "." ],
         "group": "prettier"
      },
      {
         "name": "Run csharpier check",
         "command": "dotnet",
         "args": [ "csharpier", "check", "." ],
         "group": "check"
      }
   ]
}


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2023 Asv Soft LLC

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
![linkedin](https://github.com/user-attachments/assets/4fa5221e-7ae5-4b6b-98a8-1c1e39b49afb)



[//]: [![Release](https://github.com/asv-soft/asv-drones/actions/workflows/ReleaseDeployAction.yml/badge.svg)](https://github.com/asv-soft/asv-drones/actions/workflows/ReleaseDeployAction.yml)

## 1. Introduction

Asv.Drones: Empowering Innovation in Unmanned Aerial Systems

Welcome to Asv.Drones, an advanced and modular open-source application designed to revolutionize the field of Unmanned Aerial Systems (UAS). 
Committed to fostering innovation and collaboration, Asv.Drones is not just a drone application; it's a community-driven platform that opens the doors to limitless possibilities.

Key Features:

1. **Modularity:**
   Asv.Drones embraces a modular architecture, allowing users to tailor the application to their specific needs. Each module serves a distinct purpose, contributing to the overall functionality and versatility of the platform.

2. **Open Source Philosophy:**
   Transparency and collaboration lie at the heart of Asv.Drones. The entire application, along with its constituent modules, is open source. This means that not only can users benefit from the software, but they can also actively contribute to its enhancement and evolution.

3. **Modules Overview:**

  - **[Asv.Drones.Gbs](https://github.com/asv-soft/asv-drones-gbs) (Ground Base Station Service):**
    This module provides a robust ground base station service, ensuring seamless communication between the drone and the operator on the ground. Open source nature encourages customization for specific ground station requirements.

  - **Obsolete [Asv.Drones.Sdr](https://github.com/asv-soft/asv-drones-sdr) (SDR Payload Example Project):**
    Explore the possibilities of Software-Defined Radio (SDR) payloads with this open-source example project. Asv.Drones.Sdr serves as a foundation for integrating cutting-edge SDR technologies into unmanned aerial systems.

  - **[Asv.Gnss](https://github.com/asv-soft/asv-gnss) (GNSS Library):**
    The Asv.Gnss module is a comprehensive GNSS library that parses RTCMv2, RTCMv3 and NMEA protocols. It goes a step further by providing control over receivers through SBF, ComNav and UBX protocols, all tailored for .NET environments.

  - **[Asv.Mavlink](https://github.com/asv-soft/asv-mavlink) (MAVLink Library for .NET 9.0):**
    For seamless communication and control, Asv.MAVLink is a dedicated library compatible with .NET 9.0. It ensures that your drone's communication adheres to the MAVLink protocol standards.

  - **[Asv.Common](https://github.com/asv-soft/asv-common):**
    Asv.Common serves as the backbone, offering common types and extensions for all Asv-based libraries. It streamlines development, ensuring consistency and efficiency across different modules.

  - **[Asv.Avalonia](https://github.com/asv-soft/asv-avalonia):**
    Asv.Avalonia is a custom framework built on top of Avalonia. It defines the fundamental rules for cross-platform applications and allows for their rapid assembly. 
    Out of the box, the framework provides an event system for ViewModels, a powerful undo/redo mechanism for various user actions, a theme with diverse styles, a cross-platform dialog system and more. 
    Asv.Avalonia features various additional modules that extend its functionality.
    
  Here's a schematic representation of the whole project:
<p align="center">
    <img src="img/screenshot-asv-drones-structure.png" alt="structure" width="650" />
</p>

4. **Community Collaboration:**
   Asv.Drones thrives on community collaboration. Developers, enthusiasts and innovators are encouraged to contribute, share insights and collectively shape the future of unmanned aerial systems.

Embark on a journey of exploration, experimentation and innovation with Asv.Drones. Whether you're a developer, researcher or drone enthusiast, this open-source platform invites you to redefine the possibilities of unmanned aerial systems.

<p align="center">
    <img src="img/screenshot-windows-flights.png" alt="win" width="650" />
    <img src="img/screenshot-flight-many-drones.png" alt="win" width="650" />
    <img src="img/screenshot-packet-viewer.png" alt="packet-viewer" width="650" />
    <img src="img/screenshot-connections.png" alt="connections" width="650" />
    <img src="img/screenshot-settings-commands.png" alt="settings" width="650" />
</p>

## 2. Different sets of components
Asv.Drones can work with different combinations of its components

### Example Of Usage With GBS

**Ground Base Station Integration:** Asv.Drones offers seamless integration with ground base stations through our proprietary implementation called [Asv.Drones.Gbs](https://github.com/asv-soft/asv-drones-gbs). 
Built to operate via the MAVLink protocol, Asv.Drones.Gbs allows users to remotely manage and monitor drone operations from a centralized platform. 
Moreover, any other ground base station software compatible with MAVLink can seamlessly interface with our application, ensuring flexibility and interoperability across different systems (development of additional UI controls may be required).
With Asv.Drones.Gbs, users can plan missions, monitor telemetry data and adjust flight parameters with ease.
To connect to a gbs, create a new connection (usually tcp) in the connection settings.

<div align="center">
   <img src="img/asv-drones-gbs-packets.png" alt="gbs-packets" width="650" />
</div>

## 3. Getting Started

### Setting Up the Development Environment

To ensure a smooth development experience, follow the steps below to set up your development environment:

### 3.1 Prerequisites:
- **Operating System:** This project is compatible with Windows, macOS and Linux. Ensure that your development machine runs one of these supported operating systems.
- **IDE (Integrated Development Environment):** We recommend using [Visual Studio](https://visualstudio.microsoft.com/) or [JetBrains Rider](https://www.jetbrains.com/rider/) as your IDE for C# development. 
- Make sure to install the necessary extensions and plugins for a better development experience.

### 3.2 .NET Installation:
- This project is built using [.NET 9.0](https://dotnet.microsoft.com/download/dotnet/9.0), the latest version of the .NET platform. 
We recommend installing .NET 9.0 by following the instructions provided on the official [.NET website](https://dotnet.microsoft.com/download/dotnet/9.0).

   ```bash
   # Check your current .NET version
   dotnet --version
   ```

### 3.3 Version Control:
- If you haven't already, install a version control system such as [Git](https://git-scm.com/) to track changes and collaborate with other developers.

### 3.4 Clone the Repository:
- Clone the project repository to your local machine using the following command:

   ```bash
   git clone https://github.com/asv-soft/asv-drones.git
   ```

### 3.5 Restore Dependencies:
- Navigate to the platform project directory and restore the required dependencies. 
There are three possible platform directories to build and debug our app: __Asv.Drones.Desktop__, __Asv.Drones.Android__, __Asv.Drones.iOS__.
Currently, we support only the desktop platform.
For example, we will use __Asv.Drones.Desktop__ platform, so you have to execute the following command:

   ```bash
   cd asv-drones/src/Asv.Drones.Desktop
   dotnet workload restore
   dotnet workload repair
   ```

### 3.6 Build and Run:
- After restoring, you have to build the project to ensure that everything is set up correctly, and if it's not - try to restore workloads again:

   ```bash
   dotnet build
   ```

- Run the project:

   ```bash
   dotnet run
   ```

Congratulations! Your development environment is now set up, and you are ready to start contributing to the project. 
If you encounter any issues during the setup process, refer to the project's documentation or reach out to the development team for assistance.

### Building for Android

Coming soon...

## 4. Code Structure

The organization of the codebase plays a crucial role in maintaining a clean, scalable and easily understandable project. 
This section outlines the structure of our codebase, highlighting key directories and their purposes.

### 4.1 Solution Organization

Our solution is organized the following way:

- **`src/`:** This directory contains the source code of the application. 
The code is further organized into projects, each residing in its own subdirectory. The goal is to promote modularity and maintainability.

  ```
  src/
  ├── Asv.Drones.Android/
  ├── Asv.Drones.Desktop/
  ├── Asv.Drones.iOS/
  ├── Asv.Drones/
  │   ├── Commands/
  │   ├── Controls/
  │   ├── Shell/
  │   └── ...
  └── Asv.Drones.Api/
      ├── Commands/
      ├── Controls/
      ├── Shell/
      └── ...

### 4.2 Naming Conventions

Consistent naming conventions are essential for code readability. 
Throughout the codebase, we follow the guidelines outlined [in our documentation](https://docs.asv.me/use-cases/for-developers)

These conventions contribute to a unified and coherent codebase.

By adhering to this organized structure and naming conventions, we aim to create a codebase that is easy to navigate, scalable and conducive to collaboration among developers.

## 5. Coding Style

Maintaining a consistent coding style across the project enhances readability, reduces errors and facilitates collaboration. 
The following guidelines outline our preferred coding style for C#:

**Note:** We have auto formatters in our project to make your life easier. Read more about them in the husky section.

### 5.1 C# Coding Style

#### 5.1.1 Formatting

- **Indentation:** Use tabs for indentation. Each level of indentation should consist of one tab.
- **Brace Placement:** Place opening braces on the same line as the statement they belong to, and closing braces on a new line.

    ```c#
    // Good
    if (condition)
    {
        // Code here
    }

    // Bad
    if (condition) {
        // Code here
    }
    ```

#### 5.1.2 Naming Conventions

- **Pascal Case:** Use Pascal case for class names, method names and property names.

    ```c#
    public class MyClass
    {
        public void MyMethod()
        {
            // Code here
        }

        public int MyProperty { get; set; }
    }
    ```

#### 5.1.3 Language Features

- **Expression-bodied Members:** Utilize expression-bodied members for concise one-liners.

    ```c#
    // Good
    public int CalculateSquare(int x) => x * x;

    // Bad
    public int CalculateSquare(int x)
    {
        return x * x;
    }
    ```

- **Null Conditional Operator:** Use the null conditional operator (`?.`) for safe property or method access.

    ```c#
    // Good
    int? length = text?.Length;

    // Bad
    int length = (text != null) ? text.Length : 0;
    
    // or
    
    int length = text!.Length;
    ```

#### 5.1.4 Special Cases

Usually you place public members after private members, but we have some exceptions:
- **Page constants:** We place page ids and viewmodel ids at the top of the class.
  ```c#
  public const string PageId = "files.browser";
  public const MaterialIconKind PageIcon = MaterialIconKind.FolderEye;
  ```
- **Export information:** We place export information at the end of the class.
  ```c#
  
  ```

#### 5.1.5 Husky

We use husky to make sure that our code is formatted correctly before committing. You may use it for your own code.

1. Go to the src folder
2. run:
    ```bash
    dotnet tool restore
    ```
3. run (use husky-unix instead of husky if you are on linux or macOS):
    ```bash
    dotnet r husky
    ```
4. run the following command to format the code:
    ```bash
    dotnet husky run
    ```

### 5.2 Documentation

#### 5.2.1 Comments

- **XML Documentation:** Include XML comments for classes, methods, and properties to provide comprehensive documentation.

    ```c#
    /// <summary>
    /// Represents a sample class.
    /// </summary>
    public class SampleClass
    {
        /// <summary>
        /// Calculates the sum of two numbers.
        /// </summary>
        /// <param name="a">The first number.</param>
        /// <param name="b">The second number.</param>
        /// <returns>The sum of the two numbers.</returns>
        public int Add(int a, int b)
        {
            // Code here
        }
    }
    ```

#### 5.2.2 Code Comments

- Use comments sparingly and focus on explaining complex or non-intuitive code sections.

By adhering to these coding style guidelines, we aim to create code that is straightforward to read, understand, and maintain.

## 6. Version Control

Version control is a fundamental aspect of our development process, providing a systematic way to track changes, collaborate with team members and manage the evolution of our codebase. 
We use Git as our version control system.

### 6.1 Branching Strategy

#### 6.1.1 Feature Branches

For each new feature or bug fix, create a dedicated feature branch. 
The branch name should be descriptive of the feature or issue it addresses.

```bash
# Example: Creating a new feature branch
git checkout -b feature/my-new-feature
```

#### 6.1.2 Hotfix Branches

In case of critical issues in the production environment, create a hotfix branch. 
This allows for a quick resolution without affecting the main development branch.

```bash
# Example: Creating a hotfix branch
git checkout -b hotfix/1.0.1
```

### 6.2 Commit Messages

Write clear and concise commit messages that convey the purpose of the change. Follow these guidelines:

- Start with a verb in the imperative mood (e.g., "Add," "Fix," "Update").
- Keep messages short but descriptive.
- Use present tense.
- Use feat, fix or chore prefixes to indicate the type of change.

Example:

```bash
# Good
git commit -m "fix: add user authentication feature"

# Bad
git commit -m "Updated stuff"
```

### 6.3 Pull Requests

Before merging changes into the main branch, create a pull request (PR). 
This allows for code review and ensures that changes adhere to coding standards.

- Assign reviewers to the PR.
- Include a clear description of the changes.
- Ensure that automated tests pass before merging.

### 6.4 Merging Strategy

Adopt a merging strategy based on the nature of the changes:

- **Feature Branches:** Merge feature branches into the main branch after code review and approval.
- **Release Branches:** Merge release branches into the main branch and tag the commit for the release.

```bash
# Example: Merging a feature branch
git checkout main
git merge --no-ff feature/my-new-feature
```

### 6.5 Repository Hosting

Our Git repository is hosted on [GitHub](https://github.com/asv-soft/asv-drones). 
Ensure that you have the necessary permissions and follow the best practices for repository management.

By following these version control practices, we aim to maintain a well-organized and collaborative development process. 

## 7. Build and Deployment

The build and deployment processes are crucial parts of our development workflow. 
This section outlines the steps for building the project and deploying it using GitHub Actions.

### 7.1 Build Process

To compile the project, use the following command:

```bash
dotnet build
```

This command compiles the code and produces executable binaries.

### 7.2 Deployment using GitHub Releases

Our application is deployed using [GitHub Actions](https://docs.github.com/en/actions).

The latest release can be found [here](https://github.com/asv-soft/asv-drones/releases).

## 8. Contributing

We welcome contributions from the community to help enhance and improve our project. 
Before contributing, please take a moment to review this guide.

### 8.1 Code Reviews

All code changes undergo a review process to ensure quality and consistency. Here are the steps to follow:

1. **Fork the Repository:** Start by forking the repository to your own GitHub account.

2. **Create a Feature Branch:** Create a new branch for your feature or bug fix.

   ```bash
   git checkout -b feature/my-feature
   ```

3. **Commit Changes:** Make your changes, commit them with clear and concise messages, and push the branch to your forked repository.

   ```bash
   git commit -m "feat: add new feature"
   git push origin feature/my-feature
   ```

4. **Squash your commit:** Squash your commits into a single commit before submitting a pull request.

 ```bash
   git rebase -i main
   
    # squash your commits into a single commit by leaving the first line as "pick" and changing the rest to "squash"
   
   git push --force
```

5**Open a Pull Request (PR):** Submit a pull request to the main repository, detailing the changes made and any relevant information. Ensure your PR adheres to the established coding standards.

6**Code Review:** Participate in the code review process by responding to feedback and making necessary adjustments. 
Addressing comments promptly helps streamline the review process.

7**Merge:** Once the code review is complete and the changes are approved, your pull request will be merged into the main branch.

### 8.2 Submitting Changes

Before submitting changes, ensure the following:

- **Coding Standards:** Adhere to the coding standards and guidelines outlined in this document.

- **Tests:** If applicable, include tests for your changes and ensure that existing tests pass.

- **Documentation:** Update relevant documentation, including code comments and external documentation, to reflect your changes.

### 8.3 Communication

For larger changes or feature additions, it's beneficial to discuss the proposed changes beforehand. Engage with the community through:

- **Opening an Issue:** Discuss your proposed changes by opening an issue. 
This provides an opportunity for community input before investing significant time in development.

- **Joining Discussions:** Participate in existing discussions related to the project. Your insights and feedback are valuable.

### 8.4 Contributor License Agreement (CLA)

By contributing to this project, you agree that your contributions will be licensed under the project's license. 
If a Contributor License Agreement (CLA) is required, it will be provided in the repository.

We appreciate your contributions, and together we can make this project even better!

## 9. Code Documentation

Clear and comprehensive code documentation is essential for ensuring that developers can easily understand, use and contribute to the project. 
Follow these guidelines for documenting your code:

### 9.1 Inline Comments

Use inline comments to explain specific sections of your code, especially for complex logic or non-intuitive implementations. Follow these principles:

- **Clarity:** Write comments that enhance code comprehension. If a piece of code is not self-explanatory, provide comments explaining the reasoning or intention.

- **Conciseness:** Keep comments concise and to the point. Avoid unnecessary comments that do not add value.

- **Update Comments:** Regularly review and update comments to reflect any changes in the code. Outdated comments can be misleading.

Example:

```c#
// Calculate the sum of two numbers
int CalculateSum(int a, int b)
{
    return a + b;
}
```

### 9.2 XML Documentation

For classes, methods, properties and other significant code elements, use XML documentation comments to provide comprehensive information. Follow these guidelines:

- **Summary:** Provide a summary that succinctly describes the purpose of the class or member.

- **Parameters:** Document each parameter, specifying its purpose and any constraints.

- **Returns:** If applicable, document the return value and its significance.

- **Examples:** Include examples that demonstrate how to use the class or member.

Example:

```c#
/// <summary>
/// Represents a utility class for mathematical operations.
/// </summary>
public class MathUtility
{
    /// <summary>
    /// Calculates the sum of two numbers.
    /// </summary>
    /// <param name="a">The first number.</param>
    /// <param name="b">The second number.</param>
    /// <returns>The sum of the two numbers.</returns>
    public int CalculateSum(int a, int b)
    {
        return a + b;
    }
}
```

### 9.3 Consistency

Ensure consistency in your documentation style across the codebase. 
Consistent documentation makes it easier for developers to navigate and understand the project.

By following these documentation guidelines, we aim to create a codebase that is not only functional but also accessible and easily maintainable for all contributors.

## 10. Security

Ensuring the security of our software is paramount to maintaining the integrity and confidentiality of user data. 
Developers should adhere to best practices and follow guidelines outlined in this section.

### 10.1 Code Security Practices

#### 10.1.1 Input Validation

Always validate and sanitize user input to prevent injection attacks and ensure the integrity of your application.

```c#
// Example for C#
public ActionResult ProcessUserInput(string userInput)
{
    if (string.IsNullOrWhiteSpace(userInput))
    {
        // Handle invalid input
    }

    // Process input
}
```

#### 10.1.2 Authentication and Authorization

Implement secure authentication and authorization mechanisms to control access to sensitive functionalities and data. 
Leverage industry-standard protocols like OAuth when applicable.

#### 10.1.3 Secure Communication

Ensure that communication between components, APIs and external services is encrypted using secure protocols (e.g., HTTPS).

### 10.2 Dependency Security

#### 10.2.1 Dependency Scanning

Regularly scan and update dependencies to identify and address security vulnerabilities. 
Leverage tools and services that provide automated dependency analysis.

#### 10.2.2 Minimal Dependencies

Keep dependencies to a minimum and only include libraries and packages that are actively maintained and have a good security track record.

### 10.3 Data Protection

#### 10.3.1 Encryption

Sensitive data, both at rest and in transit, should be encrypted. Use strong encryption algorithms and ensure proper key management.

#### 10.3.2 Data Backups

Implement regular data backup procedures to prevent data loss in the event of security incidents or system failures.

### 10.4 Secure Coding Standards

Adhere to secure coding standards to mitigate common vulnerabilities. 
Follow principles such as the [OWASP Top Ten](https://owasp.org/www-project-top-ten/) to address security concerns in your codebase.

### 10.5 Reporting Security Issues

If you discover a security vulnerability or have concerns about the security of the project, please report it immediately to our team at [our telegram channel](https://t.me/asvsoft).
Do not disclose security-related issues publicly until they have been addressed.

### 9.6 Security Training

Encourage ongoing security training for all team members to stay informed about the latest security threats and best practices. 
Knowledgeable developers are key to maintaining a secure codebase.

By incorporating security practices into our development process, we aim to create a robust and secure software environment for our users.

## 11. License

This project is licensed under the terms of the MIT License. 
A copy of the MIT License is provided in the [LICENSE](https://github.com/asv-soft/asv-drones?tab=MIT-1-ov-file#) file.

### MIT License

```
MIT License

Copyright (c) 2023 Asv Soft LLC

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

### Using the MIT License

The MIT License is a permissive open-source license that allows for the free use, modification and distribution of the software. 
It is important to review and understand the terms of the license before using, contributing to or distributing this software.

By contributing to this project, you agree that your contributions will be licensed under the MIT License.

For more details about the MIT License, please visit [opensource.org/licenses/MIT](https://opensource.org/licenses/MIT).

## 12. Contact

If you have questions, suggestions, or need assistance with the project, we encourage you to reach out through the following channels:

### 12.1 Telegram Channel

Visit our Telegram channel: [ASVSoft on Telegram](https://t.me/asvsoft)

Feel free to join our Telegram community to engage in discussions, seek help, or share your insights.

### 12.2 GitHub Issues

For bug reports, feature requests or any project-related discussions, please use our GitHub Issues:

[Project Issues on GitHub](https://github.com/asv-soft/asv-drones/issues)

Our GitHub repository is the central hub for project-related discussions and issue tracking. 
Please check existing issues before creating new ones to avoid duplication.

### 12.3 Security Concerns

If you discover a security vulnerability or have concerns about the security of the project, please report it immediately to our telegram channel: [ASVSoft on Telegram](https://t.me/asvsoft). 
Do not disclose security-related issues publicly until they have been addressed.

### 12.4 General Inquiries

For general inquiries or if you prefer email communication, you can reach us at [me@asv.me](mailto:me@asv.me).

We value your feedback and contributions, and we look forward to hearing from you!


================================================
FILE: api_build.bat
================================================
@echo off
setlocal enabledelayedexpansion
rem ====== projects ======

set project=Asv.Drones.Gui.Api


set "file=.\src\Directory.Build.props"


::    ApiVersion   
for /f "tokens=2 delims=> " %%a in ('findstr /i /c:"<ApiVersion>" "%file%"') do (
    set "line=%%a"
    for /f "tokens=1 delims=<" %%b in ("!line!") do (
        set "ApiVersion=%%b"
    )
)

::    
if defined ApiVersion (
    echo ApiVersion: %ApiVersion%
    	dotnet restore ./src/%project%/%project%.csproj
	dotnet build /p:SolutionDir=../;ProductVersion=%ApiVersion% ./src/%project%/%project%.csproj -c Release
	dotnet pack ./src/%project%/%project%.csproj -c Release


) else (
    echo ApiVersion not found
)

endlocal
pause

================================================
FILE: api_publish_github.bat
================================================
@echo off
setlocal enabledelayedexpansion
rem ====== projects ======

set project=Asv.Drones.Gui.Api


set "file=.\src\Directory.Build.props"


::    ApiVersion   
for /f "tokens=2 delims=> " %%a in ('findstr /i /c:"<ApiVersion>" "%file%"') do (
    set "line=%%a"
    for /f "tokens=1 delims=<" %%b in ("!line!") do (
        set "ApiVersion=%%b"
    )
)

::    
if defined ApiVersion (
    echo ApiVersion: %ApiVersion%
	cd src\%project%\bin\Release\
rem	dotnet nuget push %project%.%ApiVersion%.nupkg --skip-duplicate --source https://api.nuget.org/v3/index.json
	dotnet nuget push %project%.%ApiVersion%.nupkg --skip-duplicate --source https://nuget.pkg.github.com/asv-soft/index.json


) else (
    echo ApiVersion not found
)

endlocal
pause





================================================
FILE: publish.bat
================================================
cd publish

for /d %%i in (".\*") do (
    rmdir /s /q "%%i"
)

cd ../src/Asv.Drones.Gui.Desktop

dotnet publish -c Release -r win-arm --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true  -o ~/../../../publish/win-arm/app
dotnet publish -c Release -r win-arm64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true  -o ~/../../../publish/win-arm64/app
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/win-x64/app
dotnet publish -c Release -r win-x86 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/win-x86/app

dotnet publish -c Release -r linux-arm --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/linux-arm/app
dotnet publish -c Release -r linux-arm64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/linux-arm64/app
dotnet publish -c Release -r linux-musl-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/linux-musl-x64/app
dotnet publish -c Release -r linux-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/linux-x64/app

dotnet publish -c Release -r osx-arm64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/osx-arm64/app
dotnet publish -c Release -r osx-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ~/../../../publish/osx-x64/app

cd ../../publish
del /S *.pdb

cd win-arm/app
move Asv.Drones.Gui.Desktop.exe asv-drones-win-arm.exe
cd ../../win-arm64/app
move Asv.Drones.Gui.Desktop.exe asv-drones-win-arm64.exe
cd ../../win-x64/app
move Asv.Drones.Gui.Desktop.exe asv-drones-win-x64.exe
cd ../../win-x86/app
move Asv.Drones.Gui.Desktop.exe asv-drones-win-x86.exe

cd ../../linux-arm/app
move Asv.Drones.Gui.Desktop asv-drones-linux-arm
cd ../../linux-arm64/app
move Asv.Drones.Gui.Desktop asv-drones-linux-arm64 
cd ../../linux-musl-x64/app
move Asv.Drones.Gui.Desktop asv-drones-linux-musl-x64
cd ../../linux-x64/app
move Asv.Drones.Gui.Desktop asv-drones-linux-x64

cd ../../osx-arm64/app
move Asv.Drones.Gui.Desktop asv-drones-osx-arm64
cd ../../osx-x64/app
move Asv.Drones.Gui.Desktop asv-drones-osx-x64
cd ../../..

setlocal enabledelayedexpansion

set "xmlFile=src\Directory.Build.props"

for /f "tokens=2 delims=<> " %%a in ('findstr /i "<ProductVersion>" "%xmlFile%"') do (
    set "productVersion=%%a"
)

set "issFile=win-arm-install.iss"

set "tempFile=%temp%\temp.iss"

for /f "tokens=*" %%a in ('type "%issFile%"') do (
    set "line=%%a"

    echo !line! | findstr /C:"#define MyAppVersion" > nul

    if !errorlevel! == 0 (
        echo #define MyAppVersion "%productVersion%" >> "%tempFile%"
    ) else (
        echo !line! >> "%tempFile%"
    )
)

move /y "%tempFile%" "%issFile%" > nul

set "issFile=win-arm64-install.iss"

set "tempFile=%temp%\temp.iss"

for /f "tokens=*" %%a in ('type "%issFile%"') do (
    set "line=%%a"

    echo !line! | findstr /C:"#define MyAppVersion" > nul

    if !errorlevel! == 0 (
        echo #define MyAppVersion "%productVersion%" >> "%tempFile%"
    ) else (
        echo !line! >> "%tempFile%"
    )
)

move /y "%tempFile%" "%issFile%" > nul

set "issFile=win-x64-install.iss"

set "tempFile=%temp%\temp.iss"

for /f "tokens=*" %%a in ('type "%issFile%"') do (
    set "line=%%a"

    echo !line! | findstr /C:"#define MyAppVersion" > nul

    if !errorlevel! == 0 (
        echo #define MyAppVersion "%productVersion%" >> "%tempFile%"
    ) else (
        echo !line! >> "%tempFile%"
    )
)

move /y "%tempFile%" "%issFile%" > nul

set "issFile=win-x86-install.iss"

set "tempFile=%temp%\temp.iss"

for /f "tokens=*" %%a in ('type "%issFile%"') do (
    set "line=%%a"

    echo !line! | findstr /C:"#define MyAppVersion" > nul

    if !errorlevel! == 0 (
        echo #define MyAppVersion "%productVersion%" >> "%tempFile%"
    ) else (
        echo !line! >> "%tempFile%"
    )
)

move /y "%tempFile%" "%issFile%" > nul

endlocal

cd publish

iscc ../win-arm-install.iss
iscc ../win-arm64-install.iss
iscc ../win-x86-install.iss
iscc ../win-x64-install.iss


wsl sed -i 's/\r//' linux_packages.sh
wsl sed -i 's/\r//' osx_packages.sh

wsl ../linux_packages.sh

wsl ../osx_packages.sh

================================================
FILE: src/.aiassistant/rules/comments.md
================================================
---
apply: always
---

## Comment and Documentation Language

- Write all code comments in English.
- Write all XML documentation, Markdown documentation, README content, and other developer-facing documentation in English.
- Do not use Russian or mixed-language comments or documentation.
- Keep terminology consistent across code, comments, and documentation.
- Use clear English names for types, members, variables, files, modules, and public APIs.

## Comment Quality

- Prefer self-explanatory code over excessive comments.
- Add comments only when they explain intent, constraints, assumptions, tradeoffs, or non-obvious behavior.
- Do not add comments that only restate what the code already makes obvious.
- Keep comments concise, accurate, and aligned with the current implementation.
- Update or remove comments when the code changes so documentation never becomes misleading.

## Architecture and Design

- Keep the architecture clean, modular, and easy to maintain.
- Follow SOLID principles in design and implementation.
- Give each class, service, and module a single, well-defined responsibility.
- Prefer composition over inheritance unless inheritance is clearly justified.
- Minimize coupling and keep related behavior cohesive.
- Separate domain logic from UI, infrastructure, persistence, and framework-specific concerns.
- Depend on abstractions at system boundaries when this improves testability, extensibility, or clarity.
- Keep public APIs explicit, stable, and easy to understand.
- Eliminate duplicated logic through extraction or refactoring instead of copying behavior.
- Avoid god objects, hidden side effects, and unclear ownership of responsibilities.

---
apply: always
---

Behavioral guidelines to reduce common LLM coding mistakes. Merge with project-specific instructions as needed.

**Tradeoff:** These guidelines bias toward caution over speed. For trivial tasks, use judgment.

## 1. Think Before Coding

**Don't assume. Don't hide confusion. Surface tradeoffs.**

Before implementing:
- State your assumptions explicitly. If uncertain, ask.
- If multiple interpretations exist, present them - don't pick silently.
- If a simpler approach exists, say so. Push back when warranted.
- If something is unclear, stop. Name what's confusing. Ask.

## 2. Simplicity First

**Minimum code that solves the problem. Nothing speculative.**

- No features beyond what was asked.
- No abstractions for single-use code.
- No "flexibility" or "configurability" that wasn't requested.
- No error handling for impossible scenarios.
- If you write 200 lines and it could be 50, rewrite it.

Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.

## 3. Surgical Changes

**Touch only what you must. Clean up only your own mess.**

When editing existing code:
- Don't "improve" adjacent code, comments, or formatting.
- Don't refactor things that aren't broken.
- Match existing style, even if you'd do it differently.
- If you notice unrelated dead code, mention it - don't delete it.

When your changes create orphans:
- Remove imports/variables/functions that YOUR changes made unused.
- Don't remove pre-existing dead code unless asked.

The test: Every changed line should trace directly to the user's request.

## 4. Goal-Driven Execution

**Define success criteria. Loop until verified.**

Transform tasks into verifiable goals:
- "Add validation" → "Write tests for invalid inputs, then make them pass"
- "Fix the bug" → "Write a test that reproduces it, then make it pass"
- "Refactor X" → "Ensure tests pass before and after"

For multi-step tasks, state a brief plan:
```
1. [Step] → verify: [check]
2. [Step] → verify: [check]
3. [Step] → verify: [check]
```

Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.

---

**These guidelines are working if:** fewer unnecessary changes in diffs, fewer rewrites due to overcomplication, and clarifying questions come before implementation rather than after mistakes.



================================================
FILE: src/.editorconfig
================================================
[*.cs]
dotnet_diagnostic.RCS1037.severity = none
dotnet_diagnostic.RCS1251.severity = none

[*.axaml]
csharpier_formatter = xml
indent_size = 4

================================================
FILE: src/.gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# Tye
.tye/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd

##
## Visual studio for Mac
##


# globs
Makefile.in
*.userprefs
*.usertasks
config.make
config.status
aclocal.m4
install-sh
autom4te.cache/
*.tar.gz
tarballs/
test-results/

# Mac bundle stuff
*.dmg
*.app

# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon


# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db

# Dump file
*.stackdump

# Folder config file
[Dd]esktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp

# Windows shortcuts
*.lnk

# JetBrains Rider
.idea/
*.sln.iml

##
## Visual Studio Code
##
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json

.qodo


================================================
FILE: src/.run/Publish win-x64.run.xml
================================================
<component name="ProjectRunConfigurationManager">
  <configuration default="false" name="Publish win-x64" type="DotNetFolderPublish" factoryName="Publish to folder">
    <riderPublish configuration="Release" delete_existing_files="true" platform="Any CPU" produce_single_file="true" ready_to_run="true" self_contained="true" target_folder="$PROJECT_DIR$/Asv.Drones.Desktop/bin/Release/net10.0/publish" target_framework="net10.0" uuid_high="-6069974389149972757" uuid_low="-5498245974063364756">
      <runtimes>
        <item value="win-x64" />
      </runtimes>
    </riderPublish>
    <method v="2" />
  </configuration>
</component>

================================================
FILE: src/Asv.Drones/App.axaml
================================================
<Application
    xmlns="https://github.com/avaloniaui"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="Asv.Drones.App"
    RequestedThemeVariant="Dark"
>
    <!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceInclude Source="avares://Asv.Drones/Core/Controls/DeviceTelemetry/RouteUavIndicator/RouteUavIndicatorStyles.axaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
    <Application.Styles>
        <StyleInclude Source="avares://Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/AttitudeIndicatorStyles.axaml" />
        <StyleInclude Source="avares://Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/UavAngleIndicatorStyles.axaml" />
        <StyleInclude Source="avares://Asv.Drones/Core/Controls/DeviceTelemetry/CompassUavIndicator/CompassUavIndicatorStyles.axaml" />
        <StyleInclude Source="avares://Asv.Avalonia/Styling/Theme.axaml" />
        <StyleInclude Source="avares://Asv.Avalonia.GeoMap/Theme.axaml" />
    </Application.Styles>
</Application>


================================================
FILE: src/Asv.Drones/App.axaml.cs
================================================
using Asv.Avalonia;
using Avalonia.Markup.Xaml;

namespace Asv.Drones;

public partial class App : AsvApplication
{
    public override void Initialize()
    {
        AvaloniaXamlLoader.Load(this);
    }
}


================================================
FILE: src/Asv.Drones/Asv.Drones.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>$(TargetFramework)</TargetFramework>
        <FileVersion>$(ProductVersion)</FileVersion>
        <Version>$(ProductVersion)</Version>

        <Authors>https://github.com/asv-soft</Authors>
        <Company>https://github.com/asv-soft</Company>
        <Copyright>https://github.com/asv-soft</Copyright>
        
        <Nullable>enable</Nullable>
        <LangVersion>preview</LangVersion>
        <AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
        <AvaloniaUseCompilation>true</AvaloniaUseCompilation>
        <CodeAnalysisRuleSet>../CodeStyle.ruleset</CodeAnalysisRuleSet>
        <WarningsAsErrors>
            CS0169,
            CS0618,
            CS1502,
            CS1503,
            CS8524,
            CS8600,
            CS8601,
            CS8602,
            CS8603,
            CS8604,
            CS8625,
            CS8629,
            CS8762,
            CA1510,
            CA1851
        </WarningsAsErrors>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    </PropertyGroup>

    <ItemGroup>
        <AvaloniaResource Include="Assets\**"/>
    </ItemGroup>
    
    <ItemGroup>
        <PackageReference Include="Asv.Mavlink" Version="$(AsvMavlinkVersion)" />
        <PackageReference Include="Asv.Gnss" Version="$(AsvGnssVersion)" />
        
        <PackageReference Include="Avalonia" Version="$(AvaloniaVersion)"/>
        <PackageReference Include="Avalonia.Themes.Fluent" Version="$(AvaloniaVersion)"/>
        <PackageReference Include="Avalonia.Fonts.Inter" Version="$(AvaloniaVersion)"/>
        <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
        <PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="$(AvaloniaVersion)"/>
        <PackageReference Include="Roslynator.Analyzers" Version="4.14.0">
          <PrivateAssets>all</PrivateAssets>
          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
        <PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
          <PrivateAssets>all</PrivateAssets>
          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
    </ItemGroup>

    <ItemGroup>
      <ProjectReference Include="..\Asv.Drones.Api\Asv.Drones.Api.csproj" />
    </ItemGroup>

    <ItemGroup>
      <EmbeddedResource Update="RS.resx">
        <Generator>PublicResXFileCodeGenerator</Generator>
        <LastGenOutput>RS.Designer.cs</LastGenOutput>
      </EmbeddedResource>
    </ItemGroup>

    <ItemGroup>
      <Compile Update="RS.Designer.cs">
        <DesignTime>True</DesignTime>
        <AutoGen>True</AutoGen>
        <DependentUpon>RS.resx</DependentUpon>
      </Compile>
      <Compile Update="Pages\FileBrowser\Dialogs\BurstDownloadDialogView.axaml.cs">
        <DependentUpon>BurstDownloadDialogView.axaml</DependentUpon>
        <SubType>Code</SubType>
      </Compile>
    </ItemGroup>

    <ItemGroup>
      <Folder Include="Core\" />
      <Folder Include="Core\Controls\DeviceTelemetry\AngleUavIndicator\Items\" />
      <Folder Include="Core\Controls\DeviceTelemetry\Rtt\" />
    </ItemGroup>

    <ItemGroup>
      <AdditionalFiles Include="Core\Controls\DeviceTelemetry\AngleUavIndicator\UavAngleIndicatorStyles.axaml" />
      <AdditionalFiles Include="Core\Controls\DeviceTelemetry\Rtt\HeadingUavIndicator\HeadingUavIndicator.axaml" />
      <AdditionalFiles Include="Core\Controls\DeviceTelemetry\Rtt\HomeAzimuthUavIndicator\HomeAzimuthUavIndicator.axaml" />
      <AdditionalFiles Include="Shell\Pages\FlightMode\Widgets\Test\PluginFlightItemView.axaml" />
    </ItemGroup>
</Project>


================================================
FILE: src/Asv.Drones/Asv.Drones.csproj.DotSettings
================================================
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cbehaviour/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cbehaviour_005Cremovable/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cbehaviour_005Cremove/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cbehaviour_005Crenamable/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cbehaviour_005Crename/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cfilebrowser/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cfilebrowser_005Cfilebrowserviewmodel/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cfilebrowser_005Citems/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cfilebrowser_005Ctransfer/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cfilebrowser_005Ctransferable/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cflight/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cflight_005Cwidgets/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cflight_005Cwidgets_005Cuavwidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cflight_005Cwidgets_005Cuavwidget_005Cmissionprogress/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cmavlink/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cmavparams/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cmavparams_005Ccommandargs/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cmavparams_005Cmavparamspageviewmodel/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cmavparams_005Cparamitemviewmodel/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cpacketviewer/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cremovable/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Crenamable/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Cpacketviewer_005Ccommandargs/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Csetup/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Csetup_005Cframetype/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=commands_005Ctransferable/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cattitude/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cflight/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cflight_005Cuavwidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cflight_005Cuavwidget_005Cattitude/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cflight_005Cuavwidget_005Cattitude_005Citems/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cflight_005Cuavwidget_005Cattitude_005Citems_005Cheading/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cflight_005Cuavwidget_005Cattitude_005Citems_005Cpitch/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cflight_005Cuavwidget_005Cattitude_005Citems_005Croll/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cflight_005Cuavwidget_005Cattitude_005Citems_005Cscale/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cflight_005Cuavwidget_005Crouteindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cftpbrowser/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cftpbrowser_005Ctree/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cparams/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cftpbrowser_005Ctree_005Ccrc32/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cftpbrowser_005Ctree_005Cprimitives/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Cftpbrowser_005Ctree_005Ctypes/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls_005Crouteindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=controls/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=converters/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=converters_005Ccrc32statustocolorconverter/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cbehaviour_005Cremove/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cbehaviour_005Crename/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cbehaviour/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cfilebrowser_005Cfilebrowserviewmodel/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cfilebrowser_005Citems/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cfilebrowser_005Ctransfer/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cfilebrowser/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cflight_005Cwidgets_005Cuavwidget_005Cmissionprogress/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cflight_005Cwidgets_005Cuavwidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cflight_005Cwidgets/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cflight/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cmavlink/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cmavparams_005Cmavparamspageviewmodel/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cmavparams/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Cpacketviewer/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Csetup_005Cframetype/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands_005Csetup/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccommands/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Caltitudeuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cangleuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cangleuavindicator_005Citems/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cangleuavindicator_005Citems_005Cpitch/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cangleuavindicator_005Citems_005Croll/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cangleuavrttindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cattitude_005Citems_005Cheading/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cattitude_005Citems_005Cpitch/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cattitude_005Citems_005Croll/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cattitude_005Citems_005Cscale/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cattitude_005Citems/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cattitude/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cbatteryuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Ccompass/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Ccompassuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cheadinguavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Chomeazimuthuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Coldattitudeindicator/@EntryIndexedValue">False</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Crouteindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Crouteuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Crtt/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Crtt_005Caltitudeuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Crtt_005Cangleuavrttindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Crtt_005Cbatteryuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Crtt_005Cheadinguavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Crtt_005Chomeazimuthuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Crtt_005Cvelocityuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry_005Cvelocityuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cdevicetelemetry/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflightwidget_005Csection/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflightwidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Corderablewidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cuavwidget_005Cattitude_005Citems_005Cheading/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cuavwidget_005Cattitude_005Citems_005Cpitch/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cuavwidget_005Cattitude_005Citems_005Croll/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cuavwidget_005Cattitude_005Citems_005Cscale/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cuavwidget_005Cattitude_005Citems/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cuavwidget_005Cattitude/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cuavwidget_005Cbatteryuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cuavwidget_005Crouteindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cuavwidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cuavwidget_005Cvelocityuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cwidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cwidget_005Corderable/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cwidget_005Corderablewidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cwidget_005Csection/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cflight_005Cwidget_005Csections/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Corderablewidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Caltitudeuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Cangleuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Cangleuavrttindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Cattitude_005Citems_005Cheading/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Cattitude_005Citems_005Cpitch/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Cattitude_005Citems_005Croll/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Cattitude_005Citems_005Cscale/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Cattitude_005Citems/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Cattitude/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Cbatteryuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Cheadinguavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Chomeazimuthuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Crouteindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget_005Cvelocityuavindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cuavwidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cwidget_005Csection/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005Cwidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Ccontrols_005C_005Fmovetoasvavalonia/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Cconverters/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Cservices_005Cclientdevicewidgetfactory/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Cservices_005Cdevices_005Cgnss/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Cservices_005Cdevices_005Cmavlink/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Cservices_005Cdevices/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Cservices_005Cfiles_005Clocal/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Cservices_005Cfiles_005Cremote/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Cservices_005Cfiles/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=core_005Cservices/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Cfilebrowser_005Ccontracts/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Cfilebrowser_005Cdialogs/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Cfilebrowser_005Cio_005Ctypes/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Cfilebrowser_005Cio/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Cfilebrowser_005Ctree_005Citems/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Cfilebrowser_005Ctree/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Cfilebrowser/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Cmavparams_005Cdialog/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Cmavparams_005Cparamitem_005Croutedevents/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Cmavparams_005Cparamitem/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Cmavparams/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Csetup_005Csubpage_005Cframetype/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Csetup_005Csubpage/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Csetup/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Csetup_005Csubpage_005Cframetype_005Cdroneframeitem/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Csetup_005Csubpage_005Cframetype_005Cdroneframeitem_005Croutedevents/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cdevice_005Csetup_005Csubpage_005Cframetype_005Croutedevents/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cfilebrowser/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cfilebrowser_005Ccommands/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cfilebrowser_005Ccontracts/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cfilebrowser_005Cdialogs/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cfilebrowser_005Cio/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cfilebrowser_005Cio_005Ctypes/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cfilebrowser_005Cmisc/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cfilebrowser_005Cservices/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cfilebrowser_005Ctree/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cfilebrowser_005Ctree_005Citems/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cfilebrowser_005Ctree_005Cprimitives/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Canchors/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Ccommands/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Cmove_005Fto_005Fasv_005Favalonia_005Fio/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Cwidgets/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Cwidgets_005Cuavwidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Cwidgets_005Cuavwidget_005Cactions/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Cwidgets_005Cuavwidget_005Ccommands/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Cwidgets_005Cuavwidget_005Ccontrols/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Cwidgets_005Cuavwidget_005Ccontrols_005Cattitude/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Cwidgets_005Cuavwidget_005Ccontrols_005Crouteindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Cwidgets_005Cuavwidget_005Cdialogs/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Cwidgets_005Cuavwidget_005Cmissionprogress/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005Cwidgets_005Cuavwidget_005Cmissionprogress_005Ccommands/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005C_005Fmove_005Fto_005Fasv_005Favalonia_005Fio/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cflight_005C_005Fmove_005Fto_005Fasv_005Favalonia_005Fio_005Cdesigntime/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cmavparams/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cmavparams_005Ccommands/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cmavparams_005Ccommands_005Cmavparamspageviewmodel/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cmavparams_005Ccommands_005Cparamitemviewmodel/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cmavparams_005Cdialog/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cmavparams_005Cparamitem/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cmavparams_005Cparamitem_005Croutedevents/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cpacketviewer/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cpacketviewer_005Ccommand/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cpacketviewer_005Cdialogs/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cpacketviewer_005Cfilters/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cpacketviewer_005Cfilters_005Ccomparers/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Cpacketviewer_005Cpacketmessage/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Csetup/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Csetup_005Csubpage/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Csetup_005Csubpages/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Csetup_005Csubpages_005Cframetype/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Csetup_005Csubpage_005Cframetype/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Csetup_005Csubpage_005Cframetype_005Cardu/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Csetup_005Csubpage_005Cframetype_005Ccommands/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=pages_005Csetup_005Csubpage_005Cframetype_005Cdefault/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=services/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=services_005Cconverters/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=services_005Cdevices/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=services_005Cdevices_005Cgnss/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=services_005Cdevices_005Cmavlink/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=services_005Cfiles/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=services_005Cfiles_005Clocal/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=services_005Cfiles_005Cremote/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=services_005Cfiles_005Ctransfer/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Cfilebrowser_005Ccontracts/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Cfilebrowser_005Cdialogs/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Cfilebrowser_005Cio_005Ctypes/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Cfilebrowser_005Cio/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Cfilebrowser_005Ctree_005Citems/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Cfilebrowser_005Ctree/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Cfilebrowser/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Cmavparams_005Cdialog/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Cmavparams_005Cparamitem_005Croutedevents/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Cmavparams_005Cparamitem/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Cmavparams/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Csetup_005Csubpage_005Cframetype_005Cdroneframeitem_005Croutedevents/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Csetup_005Csubpage_005Cframetype_005Cdroneframeitem/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Csetup_005Csubpage_005Cframetype/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Csetup_005Csubpage/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Csetup/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Csetup_005Csubpage_005Cmotors/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cdevice_005Csetup_005Csubpage_005Cmotors_005Cmotoritem/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Canchors/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Canchors/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cdrones/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cdrones_005Cattitudeindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cdrones_005Cflightcontrol/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cdrones_005Ctelemetry/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cmavlink/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cmavlink_005Cdrones_005Cattitudeindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cmavlink_005Cdrones_005Cflightcontrol/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cmavlink_005Cdrones_005Csections/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cmavlink_005Cdrones_005Csections_005Cattitudeindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cmavlink_005Cdrones_005Csections_005Cflightcontrol/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cmavlink_005Cdrones_005Csections_005Ctelemetry/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cmavlink_005Cdrones_005Ctelemetry/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevices_005Cmavlink_005Cdrones/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrones_005Csections_005Cattitudeindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrones_005Csections_005Cflightcontrol/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrones_005Csections_005Ctelemetry/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrones_005Csections/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrones/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrone_005Cplane_005Csections/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrone_005Csections_005Casyncsectionfortest/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrone_005Csections_005Cattitudeindicator/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrone_005Csections_005Cflightcontrol/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrone_005Csections_005Ctelemetry/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrone_005Csections/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Cdevice_005Cmavlink_005Cdrone/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Corderable/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Ctest/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflightmode_005Cwidgets_005Ctest_005Casync/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflight_005Canchors/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflight_005Cwidgets_005Cuavwidget_005Cdialogs/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflight_005Cwidgets_005Cuavwidget_005Cmissionprogress/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflight_005Cwidgets_005Cuavwidget/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflight_005Cwidgets/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cflight/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cpacketviewer_005Cdialogs/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cpacketviewer_005Cfilters_005Ccomparers/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cpacketviewer_005Cfilters/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cpacketviewer_005Cpacketconverter/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cpacketviewer_005Cpacketmessage/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages_005Cpacketviewer/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shell_005Cpages/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

================================================
FILE: src/Asv.Drones/AsvDronesMixin.cs
================================================
using System;
using Asv.Avalonia;
using Asv.Avalonia.IO;
using Asv.Drones.Api;
using Asv.Drones.Plane;
using Asv.Mavlink;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Asv.Drones;

public static class AsvDronesMixin
{
    extension(IHostApplicationBuilder builder)
    {
        public IHostApplicationBuilder UseDronesApp(Action<Builder>? configure = null)
        {
            configure ??= b => b.UseDefault();
            configure(new Builder(builder));
            return builder;
        }
    }

    public class Builder(IHostApplicationBuilder builder)
    {
        public IHostApplicationBuilder Parent => builder;

        public Builder UseDefault()
        {
            builder.Services.AddSingleton<IPacketSequenceCalculator, PacketSequenceCalculator>();
            builder.Services.AddSingleton<IDeviceManagerExtension, GnssDeviceManagerExtension>();
            return UseMavlinkHost()
                .UseMavParams()
                .UseOptionalPacketViewer()
                .UseFlightMode()
                .UseExtendableFlightMode()
                .UseCommands()
                .UseFileBrowser()
                .UseSetupPage();
        }

        public Builder UseControls()
        {
            builder.ViewLocator.RegisterViewFor<UavWidgetViewModel, UavWidgetView>();
            builder.ViewLocator.RegisterViewFor<
                VelocityUavIndicatorViewModel,
                VelocityUavIndicator
            >();
            builder.ViewLocator.RegisterViewFor<
                BatteryUavIndicatorViewModel,
                BatteryUavIndicator
            >();
            return this;
        }

        public Builder UseCommands()
        {
            builder.Services.AddSingleton<IMavlinkCommands, MavlinkCommands>();
            builder
                .RegisterMavlinkCommands()
                .Commands.Register<OpenSetupCommand>()
                .Register<ChangeFrameTypeCommand>()
                .Register<OpenPacketViewerCommand>()
                .Register<ExportPacketsToCsvCommand>()
                .Register<ClearAllPacketsCommand>()
                .Register<OpenMavParamsCommand>()
                .Register<UpdateParamsCommand>()
                .Register<StopUpdateParamsCommand>()
                .Register<RemoveAllPinsCommand>()
                .Register<MavlinkParamsWriteCommand>()
                .Register<MavlinkParamReadCommand>()
                .Register<OpenFlightModeCommand>()
                .Register<OpenFlightCommand>()
                .Register<TakeOffCommand>()
                .Register<StartMissionCommand>()
                .Register<RTLCommand>()
                .Register<LandCommand>()
                .Register<GuidedModeCommand>()
                .Register<AutoModeCommand>()
                .Register<UpdateMissionCommand>()
                .Register<OpenFileBrowserCommand>()
                .Register<UploadItemCommand>()
                .Register<DownloadItemCommand>()
                .Register<BurstDownloadItemCommand>()
                .Register<CreateDirectoryCommand>()
                .Register<CalculateCrc32Command>()
                .Register<FindFileCommand>()
                .Register<CommitRenameCommand>()
                .Register<RemoveItemCommand>();
            return this;
        }

        public Builder UseMavlinkHost()
        {
            builder.Services.AddSingleton<MavlinkHost>();
            builder.Services.AddHostedService(svc => svc.GetRequiredService<MavlinkHost>());
            builder.Services.AddSingleton<IMavlinkHost>(svc =>
                svc.GetRequiredService<MavlinkHost>()
            );
            builder.Services.AddSingleton<IDeviceManagerExtension>(svc =>
                svc.GetRequiredService<MavlinkHost>()
            );
            return this;
        }

        public Builder UseMavParams()
        {
            builder.ViewLocator.RegisterViewFor<MavParamTextBoxViewModel, MavParamTextBoxView>();
            builder.ViewLocator.RegisterViewFor<MavParamButtonViewModel, MavParamButtonView>();
            builder.ViewLocator.RegisterViewFor<MavParamComboBoxViewModel, MavParamComboBoxView>();
            builder.ViewLocator.RegisterViewFor<
                MavParamAltitudeTextBoxViewModel,
                MavParamAltitudeTextBoxView
            >();
            builder.ViewLocator.RegisterViewFor<
                MavParamLatLonTextBoxViewModel,
                MavParamLatLonTextBoxView
            >();
            builder.ViewLocator.RegisterViewFor<
                MavParamAsciiCharViewModel,
                MavParamAsciiCharView
            >();
            builder.ViewLocator.RegisterViewFor<MavParamButtonViewModel, MavParamButtonView>();

            builder.Shell.Pages.Register<MavParamsPageViewModel, MavParamsPageView>(
                MavParamsPageViewModel.PageId
            );
            builder.Shell.Pages.Home.UseItemExtension<HomePageParamsDeviceItemAction>();
            builder.ViewLocator.RegisterViewFor<ParamItemViewModel, ParamItemView>();
            builder.ViewLocator.RegisterViewFor<
                TryCloseWithApprovalDialogViewModel,
                TryCloseWithApprovalDialogView
            >();
            return this;
        }

        public Builder UseFileBrowser()
        {
            builder.Shell.Pages.Register<FileBrowserViewModel, FileBrowserView>(
                FileBrowserViewModel.PageId
            );
            builder.Shell.Pages.Home.UseItemExtension<HomePageFileBrowserDeviceItemAction>();
            builder.ViewLocator.RegisterViewFor<
                BurstDownloadDialogViewModel,
                BurstDownloadDialogView
            >();
            return this;
        }

        public Builder UseFlightMode()
        {
            builder.Shell.Pages.Register<FlightPageViewModel, FlightPageView>(
                FlightPageViewModel.PageId
            );
            builder.Shell.Pages.Home.UseExtension<HomePageFlightExtension>();
            builder.Extensions.Register<IFlightMode, FlightUavAnchorsExtension>();
            builder.Extensions.Register<IFlightMode, FlightWidgetsExtension>();
            builder.ViewLocator.RegisterViewFor<UavWidgetViewModel, UavWidgetView>();
            builder.ViewLocator.RegisterViewFor<MissionProgressViewModel, MissionProgressView>();
            builder.ViewLocator.RegisterViewFor<
                SetAltitudeDialogViewModel,
                SetAltitudeDialogView
            >();
            return this;
        }

        public Builder UseExtendableFlightMode()
        {
            // FlightMode
            builder.Shell.Pages.Register<FlightModePageViewModel, FlightModePageView>(
                FlightModePageViewModel.PageId
            );
            builder.Shell.Pages.Home.UseExtension<HomePageFlightModeExtension>();

            // Anchors
            builder.Extensions.Register<IFlightModePage, FlightModeAnchorsExtension>();

            // Factory for client device widgets
            builder.Services.AddSingleton<IClientDeviceWidgetFactory, ClientDeviceWidgetFactory>();

            // Create widgets for client devices
            builder.Extensions.Register<IFlightModePage, FlightModeClientDeviceWidgetExtension>();

            // Widget for all drones
            builder.Services.AddSingleton<
                IClientDeviceWidgetCreationHandler,
                DroneWidgetCreationHandler
            >();
            builder.Services.AddTransient<IDroneFlightWidget, DroneFlightWidgetViewModel>();
            builder.ViewLocator.RegisterViewFor<DroneFlightWidgetViewModel, FlightWidgetView>();

            // Sections for the drone Widget
            builder.Services.AddKeyedTransient<TelemetrySectionViewModel>(
                TelemetrySectionViewModel.SectionId
            );
            builder.Extensions.Register<
                IDroneFlightWidget,
                DroneFlightWidgetTelemetrySectionExtension
            >();
            builder.ViewLocator.RegisterViewFor<TelemetrySectionViewModel, TelemetrySectionView>();

            builder.Services.AddKeyedTransient<AttitudeIndicatorSectionViewModel>(
                AttitudeIndicatorSectionViewModel.SectionId
            );
            builder.Extensions.Register<
                IDroneFlightWidget,
                DroneFlightWidgetExtensionAttitudeIndicatorSection
            >();
            builder.ViewLocator.RegisterViewFor<
                AttitudeIndicatorSectionViewModel,
                AttitudeIndicatorSectionView
            >();

            builder.Services.AddKeyedTransient<FlightControlSectionViewModel>(
                FlightControlSectionViewModel.SectionId
            );
            builder.Extensions.Register<
                IDroneFlightWidget,
                DroneFlightWidgetFlightControlSectionExtension
            >();
            builder.ViewLocator.RegisterViewFor<
                FlightControlSectionViewModel,
                FlightControlSectionView
            >();

            // Test plugin widget
            builder.ViewLocator.RegisterViewFor<PluginFlightItemViewModel, PluginFlightItemView>();
            builder.Extensions.Register<IFlightModePage, PluginFlightItemWidgetExtension>();

            // Test plane widget
            builder.Services.AddSingleton<
                IClientDeviceWidgetCreationHandler,
                PlaneWidgetCreationHandler
            >();
            builder.Services.AddTransient<IPlaneWidget, PlaneWidgetViewModel>();
            builder.ViewLocator.RegisterViewFor<PlaneWidgetViewModel, FlightWidgetView>();

            // Test plane section
            builder.Services.AddKeyedTransient<PlaneSectionViewModel>(
                PlaneSectionViewModel.SectionId
            );
            builder.Extensions.Register<IPlaneWidget, PlaneSectionExtension>();
            builder.ViewLocator.RegisterViewFor<PlaneSectionViewModel, PlaneSectionView>();

            return this;
        }

        public Builder UseOptionalPacketViewer()
        {
            builder.Shell.Pages.Register<PacketViewerViewModel, PacketViewerView>(
                PacketViewerViewModel.PageId
            );
            builder.Shell.Pages.Home.UseExtension<HomePacketViewerExtension>();
            builder.ViewLocator.RegisterViewFor<PacketMessageViewModel, PacketMessageView>();
            builder.Services.AddSingleton<IPacketConverter, DefaultMavlinkPacketConverter>();
            builder.ViewLocator.RegisterViewFor<
                SavePacketMessagesDialogViewModel,
                SavePacketMessagesDialogView
            >();
            return this;
        }
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Behaviour/Remove/RemoveItemCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.Drones.Api;
using Material.Icons;

namespace Asv.Drones;

public class RemoveItemCommand : ContextCommand<ISupportRemove>, IRemoveItemCommand
{
    public const string Id = IRemoveItemCommand.CommandId;

    private static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.RemoveItemCommand_CommandInfo_Name,
        Description = RS.RemoveItemCommand_CommandInfo_Description,
        Icon = MaterialIconKind.Delete,
        DefaultHotKey = "Shift + Delete",
    };

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<CommandArg?> InternalExecute(
        ISupportRemove context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        // TODO: make removing items command undoable
        await context.RemoveAsync(cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Behaviour/Rename/CommitRenameCommand.cs
================================================
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.Drones.Api;
using Material.Icons;

namespace Asv.Drones;

/// <summary>
/// <para>Executes with:</para>
/// <para>- <c>arg["old"]</c> as Old Value.</para>
/// <para>- <c>arg["new"]</c> as New Value.</para>
/// </summary>
public class CommitRenameCommand : ContextCommand<ISupportRename, DictArg>, ICommitRenameCommand
{
    public const string Id = ICommitRenameCommand.CommandId;

    public const string OldValue = "old";
    public const string NewValue = "new";

    private static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.RenameItemCommand_CommandInfo_Name,
        Description = RS.RenameItemCommand_CommandInfo_Description,
        Icon = MaterialIconKind.Check,
        DefaultHotKey = "Enter",
    };

    public override ICommandInfo Info => StaticInfo;

    public override async ValueTask<DictArg?> InternalExecute(
        ISupportRename context,
        DictArg arg,
        CancellationToken cancel
    )
    {
        arg.TryGetValue(OldValue, out var oldValue);
        arg.TryGetValue(NewValue, out var newValue);

        if (oldValue is not StringArg || newValue is not StringArg)
        {
            return null;
        }

        var oldString = oldValue.AsString();
        var newString = newValue.AsString();

        if (string.IsNullOrWhiteSpace(oldString) || string.IsNullOrWhiteSpace(newString))
        {
            return null;
        }
        try
        {
            await context.RenameAsync(oldString, newString, cancel);
        }
        catch
        {
            return null;
        }
        return CommandArg.CreateDictionary(
            new Dictionary<string, CommandArg>
            {
                { NewValue, CommandArg.CreateString(oldString) },
                { OldValue, CommandArg.CreateString(newString) },
            }
        );
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/FileBrowser/FileBrowserViewModel/FindFileCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Material.Icons;

namespace Asv.Drones;

public class FindFileCommand : ContextCommand<FileBrowserViewModel>
{
    public const string Id = $"{BaseId}.find_file";

    private static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.FindFileOnLocalCommand_CommandInfo_Name,
        Description = RS.FindFileOnLocalCommand_CommandInfo_Description,
        Icon = MaterialIconKind.Magnify,
        DefaultHotKey = null,
    };

    public override ICommandInfo Info => StaticInfo;

    protected override ValueTask<CommandArg?> InternalExecute(
        FileBrowserViewModel context,
        CommandArg arg,
        CancellationToken cancel
    )
    {
        context.FindFileOnLocal();
        return ValueTask.FromResult<CommandArg?>(null);
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/FileBrowser/Items/CalculateCrc32Command.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Material.Icons;

namespace Asv.Drones;

public class CalculateCrc32Command : ContextCommand<IBrowserItemViewModel>
{
    public const string Id = $"{BaseId}.crc32";

    private static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.CalculateCrc32Command_CommandInfo_Name,
        Description = RS.CalculateCrc32Command_CommandInfo_Description,
        Icon = MaterialIconKind.KeyOutline,
        DefaultHotKey = "Ctrl + Q",
    };

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<CommandArg?> InternalExecute(
        IBrowserItemViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        await context.CalculateCrc32Async(cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/FileBrowser/Items/CreateDirectoryCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Material.Icons;

namespace Asv.Drones;

public class CreateDirectoryCommand : ContextCommand<IBrowserItemViewModel>
{
    public const string Id = $"{BaseId}.create_directory";

    private static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.CreateDirectoryCommand_CommandInfo_Name,
        Description = RS.CreateDirectoryCommand_CommandInfo_Description,
        Icon = MaterialIconKind.FolderAdd,
        DefaultHotKey = "Ctrl + N",
    };

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<CommandArg?> InternalExecute(
        IBrowserItemViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        await context.CreateDirectoryAsync(cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/FileBrowser/OpenFileBrowserCommand.cs
================================================
using Asv.Avalonia;

namespace Asv.Drones;

public class OpenFileBrowserCommand(INavigationService nav)
    : OpenPageCommandBase(FileBrowserViewModel.PageId, nav)
{
    #region Static

    public const string Id = $"{BaseId}.open.{FileBrowserViewModel.PageId}";

    public static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.OpenFileBrowserCommand_CommandInfo_Name,
        Description = RS.OpenFileBrowserCommand_CommandInfo_Description,
        Icon = FileBrowserViewModel.PageIcon,
        DefaultHotKey = null,
    };

    #endregion

    public override ICommandInfo Info => StaticInfo;
}


================================================
FILE: src/Asv.Drones/Core/Commands/FileBrowser/Transfer/BurstDownloadItemCommand.cs
================================================
using System;
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.Mavlink;
using Material.Icons;

namespace Asv.Drones;

/// <summary>
/// <para>Executes with:</para>
/// <para>- <c>arg["src"]</c> as <c>string</c> sourcePath.</para>
/// <para>- <c>arg["dst"]</c> as <c>string</c> destinationPath.</para>
/// <para>- <c>arg["prt"]</c> as <c>int</c> partSize.</para>
/// <para>- <c>arg["typ"]</c> as <c>string</c> entryType.</para>
/// </summary>
public class BurstDownloadItemCommand : TransferCommandBase
{
    public const string Id = $"{BaseIdTransferCmd}.burst_download";

    private static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.BurstDownloadItemCommand_CommandInfo_Name,
        Description = RS.BurstDownloadItemCommand_CommandInfo_Description,
        Icon = MaterialIconKind.TransferLeft,
        DefaultHotKey = null,
    };

    public override ICommandInfo Info => StaticInfo;

    public override async ValueTask<DictArg?> InternalExecute(
        ITransferFtpEntries context,
        DictArg newValue,
        CancellationToken cancel
    )
    {
        if (!TryReadRequiredString(newValue, SourcePath, out var src))
        {
            return null;
        }

        if (!TryReadRequiredString(newValue, DestinationPath, out var dst))
        {
            return null;
        }

        if (!TryReadRequiredByte(newValue, PartSize, out var part))
        {
            return null;
        }

        if (!TryReadRequiredEntryType(newValue, EntryType, out var type))
        {
            return null;
        }

        await context.BurstDownloadItem(src, dst, part, type, cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/FileBrowser/Transfer/DownloadItemCommand.cs
================================================
using System;
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.Mavlink;
using Material.Icons;

namespace Asv.Drones;

/// <summary>
/// <para>Executes with:</para>
/// <para>- <c>arg["src"]</c> as <c>string</c> sourcePath.</para>
/// <para>- <c>arg["dst"]</c> as <c>string</c> destinationPath.</para>
/// <para>- <c>arg["prt"]</c> as <c>int</c> partSize.</para>
/// <para>- <c>arg["typ"]</c> as <c>string</c> entryType.</para>
/// </summary>
public class DownloadItemCommand : TransferCommandBase
{
    public const string Id = $"{BaseIdTransferCmd}.download";

    private static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.DownloadItemCommand_CommandInfo_Name,
        Description = RS.DownloadItemCommand_CommandInfo_Description,
        Icon = MaterialIconKind.TransferLeft,
        DefaultHotKey = null,
    };

    public override ICommandInfo Info => StaticInfo;

    public override async ValueTask<DictArg?> InternalExecute(
        ITransferFtpEntries context,
        DictArg newValue,
        CancellationToken cancel
    )
    {
        if (!TryReadRequiredString(newValue, SourcePath, out var src))
        {
            return null;
        }

        if (!TryReadRequiredString(newValue, DestinationPath, out var dst))
        {
            return null;
        }

        if (!TryReadRequiredByte(newValue, PartSize, out var part))
        {
            return null;
        }

        if (!TryReadRequiredEntryType(newValue, EntryType, out var type))
        {
            return null;
        }

        await context.DownloadItem(src, dst, part, type, cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/FileBrowser/Transfer/ITransferFtpEntries.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.Mavlink;

namespace Asv.Drones;

public interface ITransferFtpEntries : IRoutable
{
    ValueTask UploadItem(
        string source,
        string destination,
        FtpEntryType type,
        CancellationToken ct
    );
    ValueTask DownloadItem(
        string source,
        string destination,
        byte partSize,
        FtpEntryType type,
        CancellationToken ct
    );
    ValueTask BurstDownloadItem(
        string source,
        string destination,
        byte partSize,
        FtpEntryType type,
        CancellationToken ct
    );
}


================================================
FILE: src/Asv.Drones/Core/Commands/FileBrowser/Transfer/TransferCommandBase.cs
================================================
using System;
using Asv.Avalonia;
using Asv.Mavlink;

namespace Asv.Drones;

public abstract class TransferCommandBase : ContextCommand<ITransferFtpEntries, DictArg>
{
    protected const string BaseIdTransferCmd = $"{BaseId}.transfer";

    public const string SourcePath = "src";
    public const string DestinationPath = "dst";
    public const string PartSize = "prt";
    public const string EntryType = "typ";

    protected static bool TryReadRequiredString(DictArg args, string key, out string value)
    {
        value = string.Empty;
        if (!args.TryGetValue(key, out var v))
        {
            return false;
        }

        value = v.AsString();
        return value.Length > 0;
    }

    protected static bool TryReadRequiredByte(DictArg args, string key, out byte value)
    {
        value = 0;
        if (!args.TryGetValue(key, out var v))
        {
            return false;
        }

        var i = v.AsInt();
        if (i is < byte.MinValue or > byte.MaxValue)
        {
            return false;
        }

        value = (byte)i;
        return true;
    }

    protected static bool TryReadRequiredEntryType(
        DictArg args,
        string key,
        out FtpEntryType entryType
    )
    {
        entryType = default;
        return args.TryGetValue(key, out var v)
            && Enum.TryParse(v.AsString(), ignoreCase: true, out entryType);
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/FileBrowser/Transfer/UploadItemCommand.cs
================================================
using System;
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.Mavlink;
using Material.Icons;

namespace Asv.Drones;

/// <summary>
/// <para>Executes with:</para>
/// <para>- <c>arg["src"]</c> as <c>string</c> sourcePath.</para>
/// <para>- <c>arg["dst"]</c> as <c>string</c> destinationPath.</para>
/// <para>- <c>arg["typ"]</c> as <c>string</c> entryType.</para>
/// </summary>
public class UploadItemCommand : TransferCommandBase
{
    public const string Id = $"{BaseIdTransferCmd}.upload";

    private static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.UploadItemCommand_CommandInfo_Name,
        Description = RS.UploadItemCommand_CommandInfo_Description,
        Icon = MaterialIconKind.TransferRight,
        DefaultHotKey = null,
    };

    public override ICommandInfo Info => StaticInfo;

    public override async ValueTask<DictArg?> InternalExecute(
        ITransferFtpEntries context,
        DictArg newValue,
        CancellationToken cancel
    )
    {
        if (!TryReadRequiredString(newValue, SourcePath, out var src))
        {
            return null;
        }

        if (!TryReadRequiredString(newValue, DestinationPath, out var dst))
        {
            return null;
        }

        if (!TryReadRequiredEntryType(newValue, EntryType, out var type))
        {
            return null;
        }

        await context.UploadItem(src, dst, type, cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Flight/OpenFlight.cs
================================================
using Asv.Avalonia;

namespace Asv.Drones;

public class OpenFlightCommand(INavigationService nav)
    : OpenPageCommandBase(FlightModePageViewModel.PageId, nav)
{
    #region Static

    public const string Id = $"{BaseId}.open.{FlightModePageViewModel.PageId}";

    public static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = "Open Flight Mode (BETA)",
        Description = "Command opens Flight Mode (BETA)",
        Icon = FlightModePageViewModel.PageIcon,
        DefaultHotKey = null, // TODO: add after BETA
    };

    #endregion
    public override ICommandInfo Info => StaticInfo;
}


================================================
FILE: src/Asv.Drones/Core/Commands/Flight/OpenFlightMode.cs
================================================
using Asv.Avalonia;
using Asv.Drones.Api;

namespace Asv.Drones;

public class OpenFlightModeCommand(INavigationService nav)
    : OpenPageCommandBase(FlightMode.PageId, nav)
{
    #region Static

    public const string Id = $"{BaseId}.open.{FlightMode.PageId}";

    public static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.OpenFlightModeCommand_CommandInfo_Name,
        Description = RS.OpenFlightModeCommand_CommandInfo_Description,
        Icon = FlightMode.PageIcon,
        DefaultHotKey = "Ctrl+F2",
    };

    #endregion
    public override ICommandInfo Info => StaticInfo;
}


================================================
FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/AutoModeCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.IO;
using Asv.Mavlink;
using Material.Icons;

namespace Asv.Drones;

public class AutoModeCommand : ContextCommand<UavWidgetViewModel> // TODO: make basic class for commands that change the uav mode
{
    #region Static

    public const string Id = $"{BaseId}.change.mode.auto";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.UavAction_AutoMode_Name,
        Description = RS.UavAction_AutoMode_Description,
        Icon = MaterialIconKind.Automatic,
        DefaultHotKey = null,
    };

    #endregion

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<CommandArg?> InternalExecute(
        UavWidgetViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        var control = context.Device.GetMicroservice<ControlClient>();

        if (control == null)
        {
            return null;
        }

        await control.SetAutoMode(cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/GuidedModeCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.IO;
using Asv.Mavlink;
using Material.Icons;

namespace Asv.Drones;

public class GuidedModeCommand : ContextCommand<UavWidgetViewModel>
{
    #region Static

    public const string Id = $"{BaseId}.change.mode.guided";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.UavAction_GuidedMode,
        Description = RS.UavAction_GuidedMode_Description,
        Icon = MaterialIconKind.Controller,
        DefaultHotKey = null,
    };

    #endregion

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<CommandArg?> InternalExecute(
        UavWidgetViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        var control = context.Device.GetMicroservice<ControlClient>();

        if (control == null)
        {
            return null;
        }

        await control.SetGuidedMode(cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/LandCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.IO;
using Asv.Mavlink;
using Material.Icons;

namespace Asv.Drones;

public class LandCommand : ContextCommand<UavWidgetViewModel>
{
    #region Static

    public const string Id = $"{BaseId}.uav.land";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.UavAction_Land,
        Description = RS.UavAction_Land_Description,
        Icon = MaterialIconKind.AeroplaneLanding,
        DefaultHotKey = null,
    };

    #endregion

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<CommandArg?> InternalExecute(
        UavWidgetViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        var control = context.Device.GetMicroservice<ControlClient>();

        if (control == null)
        {
            return null;
        }

        await control.EnsureGuidedMode(cancel: cancel);
        await control.DoLand(cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/MissionProgress/UpdateMissionCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Material.Icons;

namespace Asv.Drones;

public class UpdateMissionCommand : ContextCommand<MissionProgressViewModel>
{
    #region StaticInfo

    public const string Id = $"{BaseId}.mission-items.update";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.UavAction_Land,
        Description = RS.UavAction_Land_Description,
        Icon = MaterialIconKind.Reload,
        DefaultHotKey = null,
    };

    #endregion

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<CommandArg?> InternalExecute(
        MissionProgressViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        await context.InitiateMissionPoints(cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/RTLCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.IO;
using Asv.Mavlink;
using Material.Icons;

namespace Asv.Drones;

public class RTLCommand : ContextCommand<UavWidgetViewModel>
{
    #region Static

    public const string Id = $"{BaseId}.uav.rtl";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.UavAction_Rtl_Name,
        Description = RS.UavAction_Rtl_Description,
        Icon = MaterialIconKind.Home,
        DefaultHotKey = null,
    };

    #endregion

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<CommandArg?> InternalExecute(
        UavWidgetViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        var control = context.Device.GetMicroservice<ControlClient>();

        if (control is null)
        {
            return null;
        }

        await control.EnsureGuidedMode(cancel: cancel);
        await control.DoRtl(cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/StartMissionCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.IO;
using Asv.Mavlink;
using Material.Icons;
using R3;

namespace Asv.Drones;

public class StartMissionCommand : ContextCommand<UavWidgetViewModel>
{
    #region Static

    public const string Id = $"{BaseId}.uav.start";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.UavAction_StartMission,
        Description = RS.UavAction_StartMission_Description,
        Icon = MaterialIconKind.MapMarkerPath,
        DefaultHotKey = null,
    };

    #endregion

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<CommandArg?> InternalExecute(
        UavWidgetViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        var control = context.Device.GetMicroservice<ControlClient>();
        var mission = context.Device.GetMicroservice<MissionClientEx>();

        if (control is null || mission is null)
        {
            return null;
        }

        context.MissionProgress.UpdateMission.Execute(Unit.Default);

        await mission.SetCurrent(0, cancel);
        await control.SetAutoMode(cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/TakeOffCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.IO;
using Asv.Mavlink;
using Material.Icons;

namespace Asv.Drones;

public class TakeOffCommand : ContextCommand<UavWidgetViewModel, DoubleArg>
{
    #region Static

    public const string Id = $"{BaseId}.uav.takeOff";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.UavAction_TakeOff,
        Description = RS.UavAction_TakeOff_Description,
        Icon = MaterialIconKind.AeroplaneTakeoff,
        DefaultHotKey = null,
    };

    #endregion

    public override ICommandInfo Info => StaticInfo;

    public override async ValueTask<DoubleArg?> InternalExecute(
        UavWidgetViewModel context,
        DoubleArg arg,
        CancellationToken cancel
    )
    {
        var device = context.Device;
        var controlClient = device.GetMicroservice<ControlClient>();

        if (controlClient == null)
        {
            return null;
        }

        await controlClient.SetGuidedMode(cancel);
        await controlClient.TakeOff(arg.Value, cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/MavParams/MavParamsPageViewModel/RemoveAllPinsCommand.cs
================================================
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Material.Icons;

namespace Asv.Drones;

public class RemoveAllPinsCommand : ContextCommand<MavParamsPageViewModel, DictArg>
{
    public const string Id = $"{BaseId}.params.remove-all-pins";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.UnpinAllParamsCommand_CommandInfo_Name,
        Description = RS.UnpinAllParamsCommand_CommandInfo_Description,
        Icon = MaterialIconKind.PinOff,
        DefaultHotKey = null, // TODO: make a key bind when new key listener system appears
    };

    public override ICommandInfo Info => StaticInfo;

    public override ValueTask<DictArg?> InternalExecute(
        MavParamsPageViewModel context,
        DictArg arg,
        CancellationToken cancel
    )
    {
        if (context.AllParams is null)
        {
            return ValueTask.FromResult<DictArg?>(null);
        }

        if (arg.Count == 0)
        {
            var oldValue = new DictArg();
            foreach (var item in context.AllParams.Where(item => item.IsPinned.ViewValue.Value))
            {
                oldValue.Add(
                    new KeyValuePair<string, CommandArg>(item.Id.ToString(), new BoolArg(true))
                );
                item.IsPinned.ModelValue.Value = false;
            }

            var notSelected = context
                .ViewedParams.Where(it => it.Id != context.SelectedItem.Value?.Id)
                .ToArray();

            foreach (var item in notSelected)
            {
                context.ViewedParams.Remove(item);
            }

            return ValueTask.FromResult<DictArg?>(oldValue);
        }

        foreach (var item in context.AllParams.Where(item => arg.ContainsKey(item.Id.ToString())))
        {
            item.IsPinned.ModelValue.Value = !item.IsPinned.ModelValue.Value;
        }

        return ValueTask.FromResult<DictArg?>(arg);
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/MavParams/MavParamsPageViewModel/StopUpdateParamsCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Material.Icons;

namespace Asv.Drones;

public class StopUpdateParamsCommand : ContextCommand<MavParamsPageViewModel>
{
    public const string Id = $"{BaseId}.params.stop-update";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.StopUpdateParamsCommand_CommandInfo_Name,
        Description = RS.StopUpdateParamsCommand_CommandInfo_Description,
        Icon = MaterialIconKind.CancelCircle,
        DefaultHotKey = null, // TODO: make a key bind when new key listener system appears
    };

    public override ICommandInfo Info => StaticInfo;

    protected override ValueTask<CommandArg?> InternalExecute(
        MavParamsPageViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        context.StopUpdateParamsImpl();
        return default;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/MavParams/MavParamsPageViewModel/UpdateParamsCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Material.Icons;

namespace Asv.Drones;

public class UpdateParamsCommand : ContextCommand<MavParamsPageViewModel>
{
    public const string Id = $"{BaseId}.params.update";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.UpdateParamsCommand_CommandInfo_Name,
        Description = RS.UpdateParamsCommand_CommandInfo_Description,
        Icon = MaterialIconKind.Refresh,
        DefaultHotKey = null, // TODO: make a key bind when new key listener system appears
    };

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<CommandArg?> InternalExecute(
        MavParamsPageViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        await context.UpdateParamsImpl(cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/MavParams/OpenMavParamsCommand.cs
================================================
using Asv.Avalonia;

namespace Asv.Drones;

public class OpenMavParamsCommand(INavigationService nav)
    : OpenPageCommandBase(MavParamsPageViewModel.PageId, nav)
{
    #region Static

    public const string Id = $"{BaseId}.open.{MavParamsPageViewModel.PageId}";

    public static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.OpenMavParamsCommand_CommandInfo_Name,
        Description = RS.OpenMavParamsCommand_CommandInfo_Description,
        Icon = MavParamsPageViewModel.PageIcon,
        DefaultHotKey = null,
    };

    #endregion
    public override ICommandInfo Info => StaticInfo;
}


================================================
FILE: src/Asv.Drones/Core/Commands/Mavlink/MavlinkCommands.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.Drones.Api;
using Asv.Mavlink;

namespace Asv.Drones;

public class MavlinkCommands : IMavlinkCommands
{
    public ICommandInfo WriteParamInfo => MavlinkParamsWriteCommand.StaticInfo;

    public ValueTask WriteParam(
        IRoutable context,
        string name,
        MavParamValue value,
        CancellationToken cancel = default
    ) => MavlinkParamsWriteCommand.Execute(context, name, value, cancel);

    public ICommandInfo ReadParamInfo => MavlinkParamReadCommand.StaticInfo;

    public ValueTask ReadParam(
        IRoutable context,
        string name,
        CancellationToken cancel = default
    ) => MavlinkParamReadCommand.Execute(context, name, cancel);
}


================================================
FILE: src/Asv.Drones/Core/Commands/Mavlink/MavlinkCommandsMixin.cs
================================================
using Asv.Drones.Api;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Asv.Drones;

public static class MavlinkCommandsMixin
{
    public static IHostApplicationBuilder RegisterMavlinkCommands(
        this IHostApplicationBuilder builder
    )
    {
        builder.Services.AddSingleton<IMavlinkCommands, MavlinkCommands>();
        return builder;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Mavlink/MavlinkParamReadCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.Drones.Api;
using Asv.Mavlink;
using Material.Icons;

namespace Asv.Drones;

public class MavlinkParamReadCommand : MavlinkMicroserviceCommand<IParamsClientEx, StringArg>
{
    public const string Id = $"{BaseId}.mavlink.param.read";
    public static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.ReadParamCommand_CommandInfo_Name,
        Description = RS.ReadParamCommand_CommandInfo_Description,
        Icon = MaterialIconKind.Set,

        DefaultHotKey = null,
    };

    public static ValueTask Execute(
        IRoutable context,
        string name,
        CancellationToken cancel = default
    )
    {
        return context.ExecuteCommand(Id, CommandArg.CreateString(name), cancel: cancel);
    }

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<StringArg?> InternalExecute(
        IParamsClientEx microservice,
        StringArg arg,
        CancellationToken cancel
    )
    {
        await microservice.ReadOnce(arg.Value, cancel);
        return null; // this is command without undo, so we return null
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Mavlink/MavlinkParamsWriteCommand.cs
================================================
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.Drones.Api;
using Asv.Mavlink;
using Material.Icons;

namespace Asv.Drones;

public class MavlinkParamsWriteCommand : MavlinkMicroserviceCommand<IParamsClientEx, ActionArg>
{
    public const string Id = $"{BaseId}.mavlink.param.write";
    public static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.WritePatamCommand_CommandInfo_Name,
        Description = RS.WriteParamCommand_CommandInfo_Description,
        Icon = MaterialIconKind.Set,

        DefaultHotKey = null,
    };

    public static ValueTask Execute(
        IRoutable context,
        string name,
        MavParamValue value,
        CancellationToken cancel = default
    )
    {
        return context.ExecuteCommand(
            Id,
            CommandArg.ChangeAction(name, CommandArg.CreateString(value.PrintValue())),
            cancel
        );
    }

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<ActionArg?> InternalExecute(
        IParamsClientEx microservice,
        ActionArg arg,
        CancellationToken cancel
    )
    {
        if (string.IsNullOrWhiteSpace(arg.SubjectId))
        {
            throw new ArgumentException(
                $@"{nameof(arg.SubjectId)} cannot be null or empty.",
                nameof(arg.SubjectId)
            );
        }

        MavParamValue prevValue;
        if (!microservice.Items.TryGetValue(arg.SubjectId, out var param))
        {
            prevValue = await microservice.ReadOnce(arg.SubjectId, cancel);
        }
        else
        {
            prevValue = param.Value.Value;
        }

        var stringValue = arg.Value?.AsString();
        if (string.IsNullOrWhiteSpace(stringValue))
        {
            throw new ArgumentException(
                $@"{nameof(arg.Value)} must be of type {CommandArg.Id.String}.",
                nameof(arg.Value)
            );
        }

        var result = MavParamValue.TryParseValue(stringValue, prevValue.Type, out var value);
        if (!result.IsSuccess)
        {
            Debug.Assert(result.ValidationException != null, "result.ValidationException != null");
            throw new ArgumentException(
                $"Cannot parse value '{stringValue}' to type {prevValue.Type}: {result.ValidationException.Message}",
                nameof(arg.Value),
                result.ValidationException
            );
        }

        Debug.Assert(value != null, nameof(value) + " != null");
        await microservice.WriteOnce(arg.SubjectId, value.Value, cancel);

        return CommandArg.ChangeAction(
            arg.SubjectId,
            CommandArg.CreateString(prevValue.PrintValue())
        );
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Mavlink/NullMavlinkCommands.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Asv.Drones.Api;
using Asv.Mavlink;

namespace Asv.Drones;

public sealed class NullMavlinkCommands : IMavlinkCommands
{
    public static NullMavlinkCommands Instance { get; } = new();

    private NullMavlinkCommands() { }

    public ICommandInfo WriteParamInfo => MavlinkParamsWriteCommand.StaticInfo;

    public ValueTask WriteParam(
        IRoutable context,
        string name,
        MavParamValue value,
        CancellationToken cancel = default
    )
    {
        return ValueTask.CompletedTask;
    }

    public ICommandInfo ReadParamInfo => MavlinkParamReadCommand.StaticInfo;

    public ValueTask ReadParam(IRoutable context, string name, CancellationToken cancel = default)
    {
        return ValueTask.CompletedTask;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/PacketViewer/ClearAllPacketsCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Material.Icons;

namespace Asv.Drones;

public sealed class ClearAllPacketsCommand : ContextCommand<PacketViewerViewModel>
{
    public const string Id = $"{BaseId}.packet-viewer.clear-all";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.ClearAllPacketsCommand_CommandInfo_Name,
        Description = RS.ClearAllPacketsCommand_CommandInfo_Description,
        Icon = MaterialIconKind.Bin,
        DefaultHotKey = null, // TODO: make a key bind later
    };

    public override ICommandInfo Info => StaticInfo;

    protected override ValueTask<CommandArg?> InternalExecute(
        PacketViewerViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        context.ClearAllImpl();
        return ValueTask.FromResult<CommandArg?>(null);
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/PacketViewer/ExportPacketsToCsvCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Material.Icons;

namespace Asv.Drones;

public class ExportPacketsToCsvCommand : ContextCommand<PacketViewerViewModel>
{
    public const string Id = $"{BaseId}.packet-viewer.export-to-csv";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.ExportPacketsToCsvCommand_CommandInfo_Name,
        Description = RS.ExportPacketsToCsvCommand_CommandInfo_Description,
        Icon = MaterialIconKind.ContentSave,
        DefaultHotKey = null, // TODO: make a key bind later
    };

    public override ICommandInfo Info => StaticInfo;

    protected override async ValueTask<CommandArg?> InternalExecute(
        PacketViewerViewModel context,
        CommandArg newValue,
        CancellationToken cancel
    )
    {
        await context.ExportToCsvImpl(cancel);
        return null;
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/PacketViewer/OpenPacketViewer.cs
================================================
using Asv.Avalonia;

namespace Asv.Drones;

public class OpenPacketViewerCommand(INavigationService nav)
    : OpenPageCommandBase(PacketViewerViewModel.PageId, nav)
{
    #region Static
    public const string Id = $"{BaseId}.open.{PacketViewerViewModel.PageId}";

    public static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.OpenPacketViewerCommand_CommandInfo_Name,
        Description = RS.OpenPacketViewerCommand_CommandInfo_Description,
        Icon = PacketViewerViewModel.PageIcon,
        DefaultHotKey = null,
    };
    #endregion

    public override ICommandInfo Info => StaticInfo;
}


================================================
FILE: src/Asv.Drones/Core/Commands/Setup/FrameType/ChangeFrameTypeCommand.cs
================================================
using System.Threading;
using System.Threading.Tasks;
using Asv.Avalonia;
using Material.Icons;

namespace Asv.Drones;

public class ChangeFrameTypeCommand : ContextCommand<SetupFrameTypeViewModel, StringArg>
{
    public const string Id = $"{BaseId}.setup.frame-type.change";

    internal static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.ChangeFrameTypeCommand_CommandInfo_Name,
        Description = RS.ChangeFrameTypeCommand_CommandInfo_Description,
        Icon = MaterialIconKind.KeyChange,
        DefaultHotKey = null,
    };

    public override ICommandInfo Info => StaticInfo;

    public override async ValueTask<StringArg?> InternalExecute(
        SetupFrameTypeViewModel context,
        StringArg newValue,
        CancellationToken cancel
    )
    {
        var currentFrameId = context.CurrentFrame?.Value?.Id;

        if (currentFrameId is null)
        {
            return null;
        }

        await context.ChangeFrameType(newValue.Value, cancel);

        return new StringArg(currentFrameId);
    }
}


================================================
FILE: src/Asv.Drones/Core/Commands/Setup/OpenSetupCommand.cs
================================================
using Asv.Avalonia;

namespace Asv.Drones;

public class OpenSetupCommand(INavigationService nav)
    : OpenPageCommandBase(SetupPageViewModel.PageId, nav)
{
    #region Static

    public const string Id = $"{BaseId}.open.{SetupPageViewModel.PageId}";

    public static readonly ICommandInfo StaticInfo = new CommandInfo
    {
        Id = Id,
        Name = RS.OpenSetupCommand_CommandInfo_Name,
        Description = RS.OpenSetupCommand_CommandInfo_Description,
        Icon = SetupPageViewModel.PageIcon,
        DefaultHotKey = null,
    };

    #endregion

    public override ICommandInfo Info => StaticInfo;
}


================================================
FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Pitch/PitchItem.cs
================================================
using System;
using Avalonia;

namespace Asv.Drones;

public partial class PitchItem : AvaloniaObject
{
    private readonly int _pitch;

    public PitchItem(
        int pitch,
        double scale,
        bool titleIsVisible = true,
        double controlHeight = 284
    )
    {
        _pitch = pitch;
        Value = ((controlHeight / 2) - pitch) * scale;
        if (titleIsVisible)
        {
            Title = pitch.ToString();
            StartLine = new Point(0 * scale, 0 * scale);
            StopLine = new Point(20 * scale, 0 * scale);
        }
        else
        {
            Title = string.Empty;
            StartLine = new Point(4 * scale, 0 * scale);
            StopLine = new Point(16 * scale, 0 * scale);
        }

        IsVisible = Math.Abs(pitch) <= 20;
    }

    public void UpdateVisibility(double pitch)
    {
        IsVisible = pitch >= _pitch - 20 && pitch <= _pitch + 20;
    }
}


================================================
FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Pitch/PitchItem.properties.cs
================================================
using Avalonia;

namespace Asv.Drones;

public partial class PitchItem
{
    public static readonly DirectProperty<OldAttitudeIndicator.PitchItem, string> TitleProperty =
        AvaloniaProperty.RegisterDirect<OldAttitudeIndicator.PitchItem, string>(
            nameof(Title),
            _ => _.Title,
            (_, value) => _.Title = value
        );

    public string Title
    {
        get;
        set => SetAndRaise(TitleProperty, ref field, value);
    }

    public static readonly DirectProperty<OldAttitudeIndicator.PitchItem, double> ValueProperty =
        AvaloniaProperty.RegisterDirect<OldAttitudeIndicator.PitchItem, double>(
            nameof(Value),
            _ => _.Value,
            (_, value) => _.Value = value
        );

    public double Value
    {
        get;
        set => SetAndRaise(ValueProperty, ref field, value);
    }

    public static readonly DirectProperty<OldAttitudeIndicator.PitchItem, bool> IsVisibleProperty =
        AvaloniaProperty.RegisterDirect<OldAttitudeIndicator.PitchItem, bool>(
            nameof(IsVisible),
            _ => _.IsVisible,
            (_, value) => _.IsVisible = value
        );

    public bool IsVisible
    {
        get;
        set => SetAndRaise(IsVisibleProperty, ref field, value);
    }

    public static readonly DirectProperty<OldAttitudeIndicator.PitchItem, Point> StartLineProperty =
        AvaloniaProperty.RegisterDirect<OldAttitudeIndicator.PitchItem, Point>(
            nameof(StartLine),
            _ => _.StartLine,
            (_, value) => _.StartLine = value
        );

    public Point StartLine
    {
        get;
        set => SetAndRaise(StartLineProperty, ref field, value);
    }

    public static readonly DirectProperty<OldAttitudeIndicator.PitchItem, Point> StopLineProperty =
        AvaloniaProperty.RegisterDirect<OldAttitudeIndicator.PitchItem, Point>(
            nameof(StopLine),
            _ => _.StopLine,
            (_, value) => _.StopLine = value
        );

    public Point StopLine
    {
        get;
        set => SetAndRaise(StopLineProperty, ref field, value);
    }
}


================================================
FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Roll/RollItem.cs
================================================
using System;
using Avalonia;

namespace Asv.Drones;

public partial class RollItem : AvaloniaObject
{
    public RollItem(int angle)
    {
        Value = angle;
        Title =
            Math.Abs(angle) > 180 ? (360 - Math.Abs(angle)).ToString() : Math.Abs(angle).ToString();
    }
}


================================================
FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Roll/RollItem.properties.cs
================================================
using Avalonia;

namespace Asv.Drones;

public partial class RollItem
{
    public static readonly DirectProperty<OldAttitudeIndicator.RollItem, string> TitleProperty =
        AvaloniaProperty.RegisterDirect<OldAttitudeIndicator.RollItem, string>(
            nameof(Title),
            _ => _.Title,
            (_, value) => _.Title = value
        );

    public string Title
    {
        get;
        set => SetAndRaise(TitleProperty, ref field, value);
    }

    public static readonly DirectProperty<OldAttitudeIndicator.RollItem, double> ValueProperty =
        AvaloniaProperty.RegisterDirect<OldAttitudeIndicator.RollItem, double>(
            nameof(Value),
            _ => _.Value,
            (_, value) => _.Value = value
        );

    public double Value
    {
        get;
        set => SetAndRaise(ValueProperty, ref field, value);
    }
}


================================================
FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/UavAngleIndicator.cs
================================================
using System;
using Avalonia;
using Avalonia.Collections;
using Avalonia.Controls.Primitives;

namespace Asv.Drones;

public partial class UavAngleIndicator : TemplatedControl
{
    public UavAngleIndicator()
    {
        Scale = Math.Min(InternalWidth, InternalHeight) / 100;

        RollItems = new AvaloniaList<OldAttitudeIndicator.RollItem>(
            new OldAttitudeIndicator.RollItem(0),
            new OldAttitudeIndicator.RollItem(10),
            new OldAttitudeIndicator.RollItem(20),
            new OldAttitudeIndicator.RollItem(30),
            new OldAttitudeIndicator.RollItem(45),
            new OldAttitudeIndicator.RollItem(60),
            new OldAttitudeIndicator.RollItem(300),
            new OldAttitudeIndicator.RollItem(315),
            new OldAttitudeIndicator.RollItem(330),
            new OldAttitudeIndicator.RollItem(340),
            new OldAttitudeIndicator.RollItem(350)
        );

        PitchItems = new AvaloniaList<OldAttitudeIndicator.PitchItem>(
            new OldAttitudeIndicator.PitchItem(135, Scale, false),
            new OldAttitudeIndicator.PitchItem(130, Scale),
            new OldAttitudeIndicator.PitchItem(125, Scale, false),
            new OldAttitudeIndicator.PitchItem(120, Scale),
            new OldAttitudeIndicator.PitchItem(115, Scale, false),
            new OldAttitudeIndicator.PitchItem(110, Scale),
            new OldAttitudeIndicator.PitchItem(105, Scale, false),
            new OldAttitudeIndicator.PitchItem(100, Scale),
            new OldAttitudeIndicator.PitchItem(95, Scale, false),
            new OldAttitudeIndicator.PitchItem(90, Scale),
            new OldAttitudeIndicator.PitchItem(85, Scale, false),
            new OldAttitudeIndicator.PitchItem(80, Scale),
            new OldAttitudeIndicator.PitchItem(75, Scale, false),
            new OldAttitudeIndicator.PitchItem(70, Scale),
            new OldAttitudeIndicator.PitchItem(65, Scale, false),
            new OldAttitudeIndicator.PitchItem(60, Scale),
            new OldAttitudeIndicator.PitchItem(55, Scale, false),
            new OldAttitudeIndicator.PitchItem(50, Scale),
            new OldAttitudeIndicator.PitchItem(45, Scale, false),
            new OldAttitudeIndicator.PitchItem(40, Scale),
            new OldAttitudeIndicator.PitchItem(35, Scale, false),
            new OldAttitudeIndicator.PitchItem(30, Scale),
            new OldAttitudeIndicator.PitchItem(25, Scale, false),
            new OldAttitudeIndicator.PitchItem(20, Scale),
            new OldAttitudeIndicator.PitchItem(15, Scale, false),
            new OldAttitudeIndicator.PitchItem(10, Scale),
            new OldAttitudeIndicator.PitchItem(5, Scale, false),
            new OldAttitudeIndicator.PitchItem(0, Scale),
            new OldAttitudeIndicator.PitchItem(-5, Scale, false),
            new OldAttitudeIndicator.PitchItem(-10, Scale),
            new OldAttitudeIndicator.PitchItem(-15, Scale, false),
            new OldAttitudeIndicator.PitchItem(-20, Scale),
            new OldAttitudeIndicator.PitchItem(-25, Scale, false),
            new OldAttitudeIndicator.PitchItem(-30, Scale),
            new OldAttitudeIndicator.PitchItem(-35, Scale, false),
            new OldAttitudeIndicator.PitchItem(-40, Scale),
            new OldAttitudeIndicator.PitchItem(-45, Scale, false),
            new OldAttitudeIndicator.PitchItem(-50, Scale),
            new OldAttitudeIndicator.PitchItem(-55, Scale, false),
            new OldAttitudeIndicator.PitchItem(-60, Scale),
            new OldAttitudeIndicator.PitchItem(-65, Scale, false),
            new OldAttitudeIndicator.PitchItem(-70, Scale),
            new OldAttitudeIndicator.PitchItem(-75, Scale, false),
            new OldAttitudeIndicator.PitchItem(-80, Scale),
            new OldAttitudeIndicator.PitchItem(-85, Scale, false),
            new OldAttitudeIndicator.PitchItem(-90, Scale),
            new OldAttitudeIndicator.PitchItem(-95, Scale, false),
            new OldAttitudeIndicator.PitchItem(-100, Scale),
            new OldAttitudeIndicator.PitchItem(-105, Scale, false),
            new OldAttitudeIndicator.PitchItem(-110, Scale),
            new OldAttitudeIndicator.PitchItem(-115, Scale, false),
            new OldAttitudeIndicator.PitchItem(-120, Scale),
            new OldAttitudeIndicator.PitchItem(-125, Scale, false),
            new OldAttitudeIndicator.PitchItem(-130, Scale),
            new OldAttitudeIndicator.PitchItem(-135, Scale, false)
        );
    }

    public double Scale { get; }

    protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
    {
        base.OnPropertyChanged(change);

        if (change.Property == RollAngleProperty)
        {
            UpdateRollAngle(change.Sender);
        }
        else if (change.Property == PitchAngleProperty)
        {
            UpdateAngle(change.Sender);
        }
    }

    private static void UpdateAngle(AvaloniaObject source)
    {
        if (source is not UavAngleIndicator indicator)
        {
            return;
        }

        var pitch = indicator.PitchAngle;
        UpdateRollAngle(source);
        foreach (var item in indicator.PitchItems)
        {
            item.UpdateVisibility(pitch);
        }
    }

    private static void UpdateRollAngle(AvaloniaObject source)
    {
        if (source is not UavAngleIndicator indicator)
        {
            return;
        }

        var roll = indicator.RollAngle;
        var pitch = indicator.PitchAngle;
        indicator.PitchTranslateX =
            -pitch * indicator.Scale * Math.Cos((roll - 90.0) * Math.PI / 180.0);
        indicator.PitchTranslateY =
            pitch * indicator.Scale * Math.Sin((90 - roll) * Math.PI / 180.0);
    }
}


================================================
FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/UavAngleIndicator.properties.cs
================================================
using System.Collections.Generic;
using Avalonia;

namespace Asv.Drones;

public partial class UavAngleIndicator
{
    public static readonly StyledProperty<double> RollAngleProperty = AvaloniaProperty.Register<
        UavAngleIndicator,
        double
    >(nameof(RollAngle));

    public double RollAngle
    {
        get => GetValue(RollAngleProperty);
        set => SetValue(RollAngleProperty, value);
    }

    public static readonly StyledProperty<double> PitchAngleProperty = AvaloniaProperty.Register<
        UavAngleIndicator,
        double
    >(nameof(PitchAngle));

    public double PitchAngle
    {
        get => GetValue(PitchAngleProperty);
        set => SetValue(PitchAngleProperty, value);
    }

    #region Internal direct property

    public static readonly DirectProperty<UavAngleIndicator, double> InternalWidthProperty =
        AvaloniaProperty.RegisterDirect<UavAngleIndicator, double>(
            nameof(InternalWidth),
            _ => _.InternalWidth,
            (_, value) => _.InternalWidth = value
        );

    public double InternalWidth
    {
        get;
        set => SetAndRaise(InternalWidthProperty, ref field, value);
    } = 1000;

    public static readonly DirectProperty<UavAngleIndicator, double> InternalHeightProperty =
        AvaloniaProperty.RegisterDirect<UavAngleIndicator, double>(
            nameof(InternalHeight),
            _ => _.InternalHeight,
            (_, value) => _.InternalHeight = value
        );

    public double InternalHeight
    {
        get;
        set => SetAndRaise(InternalHeightProperty, ref field, value);
    } = 1000;

    public static readonly DirectProperty<UavAngleIndicator, double> PitchTranslateXProperty =
        AvaloniaProperty.RegisterDirect<UavAngleIndicator, double>(
            nameof(PitchTranslateX),
            _ => _.PitchTranslateX,
            (_, value) => _.PitchTranslateX = value
        );

    private double PitchTranslateX
    {
        get;
        set => SetAndRaise(PitchTranslateXProperty, ref field, value);
    }

    public static readonly DirectProperty<UavAngleIndicator, double> PitchTranslateYProperty =
        AvaloniaProperty.RegisterDirect<UavAngleIndicator, double>(
            nameof(PitchTranslateY),
            _ => _.PitchTranslateY,
            (_, value) => _.PitchTranslateY = value
        );

    public double PitchTranslateY
    {
        get;
        set => SetAndRaise(PitchTranslateYProperty, ref field, value);
    }

    public static readonly DirectProperty<
        UavAngleIndicator,
        IEnumerable<OldAttitudeIndicator.RollItem>
    > RollItemsProperty = AvaloniaProperty.RegisterDirect<
        UavAngleIndicator,
        IEnumerable<OldAttitudeIndicator.RollItem>
    >(nameof(RollItems), _ => _.RollItems, (_, value) => _.RollItems = value);

    public IEnumerable<OldAttitudeIndicator.RollItem> RollItems
    {
        get;
        set => SetAndRaise(RollItemsProperty, ref field, value);
    }

    public static readonly DirectProperty<
        UavAngleIndicator,
        IEnumerable<OldAttitudeIndicator.PitchItem>
    > PitchItemsProperty = AvaloniaProperty.RegisterDirect<
        UavAngleIndicator,
        IEnumerable<OldAttitudeIndicator.PitchItem>
    >(nameof(PitchItems), _ => _.PitchItems, (_, value) => _.PitchItems = value);

    public IEnumerable<OldAttitudeIndicator.PitchItem> PitchItems
    {
        get;
        set => SetAndRaise(PitchItemsProperty, ref field, value);
    }
    #endregion
}


================================================
FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/UavAngleIndicatorStyles.axaml
================================================
<Styles
    xmlns="https://github.com/avaloniaui"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:drones="clr-namespace:Asv.Drones"
>
    <Design.PreviewWith>
        <drones:UavAngleIndicator
            Width="500"
            Height="500"
            RollAngle="0"
            PitchAngle="0"
            CornerRadius="500"
        />
    </Design.PreviewWith>

    <Style Selector="drones|UavAngleIndicator">
        <Setter Property="VerticalAlignment" Value="Center" />
        <Setter Property="HorizontalAlignment" Value="Stretch" />
        <Setter Property="Template">
            <ControlTemplate>
                <Viewbox>
                    <Border CornerRadius="{TemplateBinding CornerRadius}" ClipToBounds="True">
                        <Canvas
                            x:Name="Canvas"
                            Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=InternalWidth}"
                            Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=InternalHeight}"
                            ClipToBounds="True"
                            Background="Transparent"
                        >
                            <Rectangle
                                x:Name="Sky"
                                Canvas.Top="-920"
                                Canvas.Left="-210"
                                Width="1420"
                                Height="1420"
                            >
                                <Rectangle.Fill>
                                    <LinearGradientBrush EndPoint="0,0" StartPoint="0,1420">
                                        <GradientStop Color="#64b5f6" Offset="0" />
                                        <GradientStop Color="#1565c0" Offset="0.3" />
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                                <Rectangle.RenderTransform>
                                    <TransformGroup>
                                        <ScaleTransform />
                                        <SkewTransform />
                                        <RotateTransform
                                            Angle="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=RollAngle}"
                                            CenterX="0"
                                            CenterY="710"
                                        />
                                        <TranslateTransform
                                            X="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PitchTranslateX}"
                                            Y="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PitchTranslateY}"
                                        />
                                    </TransformGroup>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle
                                Canvas.Top="500"
                                Canvas.Left="-210"
                                Width="2000"
                                Height="2000"
                            >
                                <Rectangle.Fill>
                                    <LinearGradientBrush
                                        StartPoint="50%,0%"
                                        EndPoint="50%,100%"
                                        Opacity="0.2"
                                    >
                                        <LinearGradientBrush.GradientStops>
                                            <GradientStop Offset="0" Color="#4679ba" />
                                            <GradientStop Offset="0.5" Color="#a2acc5" />
                                            <GradientStop Offset="0.7" Color="#081b5d" />
                                            <GradientStop Offset="1" Color="#2e4469" />
                                        </LinearGradientBrush.GradientStops>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                                <Rectangle.RenderTransform>
                                    <TransformGroup>
                                        <ScaleTransform />
                                        <SkewTransform />
                                        <RotateTransform
                                            Angle="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=RollAngle}"
                                            CenterX="0"
                                            CenterY="-710"
                                        />
                                        <TranslateTransform
                                            X="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PitchTranslateX}"
                                            Y="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PitchTranslateY}"
                                        />
                                    </TransformGroup>
                                </Rectangle.RenderTransform>
                            </Rectangle>

                            <Path Width="500" Height="500" Stroke="#e0e0e0" StrokeThickness="5">
                                <Path.RenderTransform>
                                    <TransformGroup>
                                        <ScaleTransform />
                                        <SkewTransform />
                                        <RotateTransform
                                            Angle="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=RollAngle}"
                                            CenterX="250"
                                            CenterY="250"
                                        />
                                    </TransformGroup>
                                </Path.RenderTransform>
                                <Path.Data>
                                    <PathGeometry>
                                        <PathFigure StartPoint="240,350" IsClosed="False">
                                            <ArcSegment
                                                Size="300,300"
                                                IsLargeArc="False"
                                                SweepDirection="Clockwise"
                                                Point="760,350"
                                            />
                                        </PathFigure>
                                    </PathGeometry>
                                </Path.Data>
                            </Path>

                            <ItemsControl
                                x:Name="Ticks"
                                Canvas.Left="150"
                                Canvas.Top="150"
                                Width="700"
                                Height="700"
                                ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=RollItems}"
                                HorizontalAlignment="Center"
                                VerticalAlignment="Center"
                            >
                                <ItemsControl.RenderTransform>
                                    <TransformGroup>
                                        <RotateTransform
                                            Angle="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=RollAngle}"
                                            CenterX="0"
                                            CenterY="0"
                                        />
                                    </TransformGroup>
                                </ItemsControl.RenderTransform>
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <Grid />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel
                                            x:DataType="drones:RollItem"
                                            Orientation="Vertical"
                                        >
                                            <StackPanel.RenderTransform>
                                                <TransformGroup>
                                                    <RotateTransform
                                                        CenterX="0"
                                                        CenterY="0"
                                                        Angle="{CompiledBinding Value}"
                                                    />
                                                </TransformGroup>
                                            </StackPanel.RenderTransform>
                                            <TextBlock
                                                Text="{CompiledBinding Title}"
                                                TextAlignment="Center"
                                                Foreground="#e0e0e0"
                                                Margin="0,-5"
                                                Width="100"
                                                FontSize="37"
                                            />
                                            <Line
                                                Stroke="#e0e0e0"
                                                StartPoint="350,0"
                                                EndPoint="350,10"
                                                Margin="0,0,0,0"
                                                StrokeThickness="5"
                                            />
                                        </StackPanel>
                                  
Download .txt
gitextract_fy5d8uuq/

├── .config/
│   └── dotnet-tools.json
├── .csharpierignore
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   └── workflows/
│       ├── api-release-dev.yml
│       ├── api-release.yml
│       └── drones-release-windows.yml
├── .gitignore
├── .husky/
│   ├── pre-commit
│   └── task-runner.json
├── LICENSE
├── README.md
├── api_build.bat
├── api_publish_github.bat
├── publish.bat
├── src/
│   ├── .aiassistant/
│   │   └── rules/
│   │       └── comments.md
│   ├── .editorconfig
│   ├── .gitignore
│   ├── .run/
│   │   └── Publish win-x64.run.xml
│   ├── Asv.Drones/
│   │   ├── App.axaml
│   │   ├── App.axaml.cs
│   │   ├── Asv.Drones.csproj
│   │   ├── Asv.Drones.csproj.DotSettings
│   │   ├── AsvDronesMixin.cs
│   │   ├── Core/
│   │   │   ├── Commands/
│   │   │   │   ├── Behaviour/
│   │   │   │   │   ├── Remove/
│   │   │   │   │   │   └── RemoveItemCommand.cs
│   │   │   │   │   └── Rename/
│   │   │   │   │       └── CommitRenameCommand.cs
│   │   │   │   ├── FileBrowser/
│   │   │   │   │   ├── FileBrowserViewModel/
│   │   │   │   │   │   └── FindFileCommand.cs
│   │   │   │   │   ├── Items/
│   │   │   │   │   │   ├── CalculateCrc32Command.cs
│   │   │   │   │   │   └── CreateDirectoryCommand.cs
│   │   │   │   │   ├── OpenFileBrowserCommand.cs
│   │   │   │   │   └── Transfer/
│   │   │   │   │       ├── BurstDownloadItemCommand.cs
│   │   │   │   │       ├── DownloadItemCommand.cs
│   │   │   │   │       ├── ITransferFtpEntries.cs
│   │   │   │   │       ├── TransferCommandBase.cs
│   │   │   │   │       └── UploadItemCommand.cs
│   │   │   │   ├── Flight/
│   │   │   │   │   ├── OpenFlight.cs
│   │   │   │   │   ├── OpenFlightMode.cs
│   │   │   │   │   └── Widgets/
│   │   │   │   │       └── UavWidget/
│   │   │   │   │           ├── AutoModeCommand.cs
│   │   │   │   │           ├── GuidedModeCommand.cs
│   │   │   │   │           ├── LandCommand.cs
│   │   │   │   │           ├── MissionProgress/
│   │   │   │   │           │   └── UpdateMissionCommand.cs
│   │   │   │   │           ├── RTLCommand.cs
│   │   │   │   │           ├── StartMissionCommand.cs
│   │   │   │   │           └── TakeOffCommand.cs
│   │   │   │   ├── MavParams/
│   │   │   │   │   ├── MavParamsPageViewModel/
│   │   │   │   │   │   ├── RemoveAllPinsCommand.cs
│   │   │   │   │   │   ├── StopUpdateParamsCommand.cs
│   │   │   │   │   │   └── UpdateParamsCommand.cs
│   │   │   │   │   └── OpenMavParamsCommand.cs
│   │   │   │   ├── Mavlink/
│   │   │   │   │   ├── MavlinkCommands.cs
│   │   │   │   │   ├── MavlinkCommandsMixin.cs
│   │   │   │   │   ├── MavlinkParamReadCommand.cs
│   │   │   │   │   ├── MavlinkParamsWriteCommand.cs
│   │   │   │   │   └── NullMavlinkCommands.cs
│   │   │   │   ├── PacketViewer/
│   │   │   │   │   ├── ClearAllPacketsCommand.cs
│   │   │   │   │   ├── ExportPacketsToCsvCommand.cs
│   │   │   │   │   └── OpenPacketViewer.cs
│   │   │   │   └── Setup/
│   │   │   │       ├── FrameType/
│   │   │   │       │   └── ChangeFrameTypeCommand.cs
│   │   │   │       └── OpenSetupCommand.cs
│   │   │   ├── Controls/
│   │   │   │   └── DeviceTelemetry/
│   │   │   │       ├── AngleUavIndicator/
│   │   │   │       │   ├── Items/
│   │   │   │       │   │   ├── Pitch/
│   │   │   │       │   │   │   ├── PitchItem.cs
│   │   │   │       │   │   │   └── PitchItem.properties.cs
│   │   │   │       │   │   └── Roll/
│   │   │   │       │   │       ├── RollItem.cs
│   │   │   │       │   │       └── RollItem.properties.cs
│   │   │   │       │   ├── UavAngleIndicator.cs
│   │   │   │       │   ├── UavAngleIndicator.properties.cs
│   │   │   │       │   └── UavAngleIndicatorStyles.axaml
│   │   │   │       ├── CompassUavIndicator/
│   │   │   │       │   ├── CompassScaleItem.cs
│   │   │   │       │   ├── CompassUavIndicator.cs
│   │   │   │       │   ├── CompassUavIndicator.properties.cs
│   │   │   │       │   └── CompassUavIndicatorStyles.axaml
│   │   │   │       ├── DeviceTelemetryDesignPreview.cs
│   │   │   │       ├── OldAttitudeIndicator/
│   │   │   │       │   ├── AttitudeIndicator.cs
│   │   │   │       │   ├── AttitudeIndicator.properties.cs
│   │   │   │       │   ├── AttitudeIndicatorStyles.axaml
│   │   │   │       │   └── Items/
│   │   │   │       │       ├── Heading/
│   │   │   │       │       │   └── HeadingScaleItem.cs
│   │   │   │       │       ├── Pitch/
│   │   │   │       │       │   ├── PitchItem.cs
│   │   │   │       │       │   └── PitchItem.properties.cs
│   │   │   │       │       ├── Roll/
│   │   │   │       │       │   ├── RollItem.cs
│   │   │   │       │       │   └── RollItem.properties.cs
│   │   │   │       │       └── Scale/
│   │   │   │       │           ├── ScaleItem.cs
│   │   │   │       │           └── ScaleItem.properties.cs
│   │   │   │       ├── RouteUavIndicator/
│   │   │   │       │   ├── RouteUavIndicator.cs
│   │   │   │       │   └── RouteUavIndicatorStyles.axaml
│   │   │   │       └── Rtt/
│   │   │   │           ├── AltitudeUavIndicator/
│   │   │   │           │   ├── AltitudeUavIndicator.axaml
│   │   │   │           │   ├── AltitudeUavIndicator.axaml.cs
│   │   │   │           │   └── AltitudeUavIndicatorViewModel.cs
│   │   │   │           ├── AngleUavRttIndicator/
│   │   │   │           │   ├── AngleUavRttIndicator.axaml
│   │   │   │           │   ├── AngleUavRttIndicator.axaml.cs
│   │   │   │           │   └── AngleUavRttIndicatorViewModel.cs
│   │   │   │           ├── BatteryUavIndicator/
│   │   │   │           │   ├── BatteryUavIndicator.axaml
│   │   │   │           │   ├── BatteryUavIndicator.axaml.cs
│   │   │   │           │   └── BatteryUavIndicatorViewModel.cs
│   │   │   │           ├── HeadingUavIndicator/
│   │   │   │           │   ├── HeadingUavIndicator.axaml
│   │   │   │           │   ├── HeadingUavIndicator.axaml.cs
│   │   │   │           │   └── HeadingUavIndicatorViewModel.cs
│   │   │   │           ├── HomeAzimuthUavIndicator/
│   │   │   │           │   ├── HomeAzimuthUavIndicator.axaml
│   │   │   │           │   ├── HomeAzimuthUavIndicator.axaml.cs
│   │   │   │           │   └── HomeAzimuthUavIndicatorViewModel.cs
│   │   │   │           └── VelocityUavIndicator/
│   │   │   │               ├── VelocityUavIndicator.axaml
│   │   │   │               ├── VelocityUavIndicator.axaml.cs
│   │   │   │               └── VelocityUavIndicatorViewModel.cs
│   │   │   ├── Converters/
│   │   │   │   └── Crc32StatusToColorConverter.cs
│   │   │   └── Services/
│   │   │       ├── ClientDeviceWidgetFactory/
│   │   │       │   └── ClientDeviceWidgetFactory.cs
│   │   │       ├── Devices/
│   │   │       │   └── Gnss/
│   │   │       │       └── GnssDeviceManagerExtentsion.cs
│   │   │       └── Files/
│   │   │           ├── BusyFlag.cs
│   │   │           ├── Local/
│   │   │           │   └── LocalFilesService.cs
│   │   │           ├── PathHelper.cs
│   │   │           ├── ProgressWithLock.cs
│   │   │           └── Remote/
│   │   │               ├── FtpClientService.cs
│   │   │               └── RemoteEntriesSync.cs
│   │   ├── RS.Designer.cs
│   │   ├── RS.resx
│   │   ├── RS.ru.resx
│   │   └── Shell/
│   │       └── Pages/
│   │           ├── Device/
│   │           │   ├── FileBrowser/
│   │           │   │   ├── Contracts/
│   │           │   │   │   ├── FileBrowserBackend.cs
│   │           │   │   │   ├── IBrowserItemsOperations.cs
│   │           │   │   │   ├── LocalBrowserItemsOperations.cs
│   │           │   │   │   └── RemoteBrowserItemsOperations.cs
│   │           │   │   ├── Dialogs/
│   │           │   │   │   ├── BurstDownloadDialogView.axaml
│   │           │   │   │   ├── BurstDownloadDialogView.axaml.cs
│   │           │   │   │   └── BurstDownloadDialogViewModel.cs
│   │           │   │   ├── FileBrowserView.axaml
│   │           │   │   ├── FileBrowserView.axaml.cs
│   │           │   │   ├── FileBrowserViewModel.cs
│   │           │   │   ├── HomePageFileBrowserDeviceItemAction.cs
│   │           │   │   ├── IO/
│   │           │   │   │   ├── FileSize.cs
│   │           │   │   │   ├── FtpBrowserNamingPolicy.cs
│   │           │   │   │   ├── FtpBrowserPath.cs
│   │           │   │   │   └── Types/
│   │           │   │   │       ├── Crc32Status.cs
│   │           │   │   │       └── FtpBrowserSourceType.cs
│   │           │   │   └── Tree/
│   │           │   │       ├── BrowserNode.cs
│   │           │   │       ├── BrowserTree.cs
│   │           │   │       └── Items/
│   │           │   │           ├── BrowserItemComparer.cs
│   │           │   │           ├── BrowserItemViewModel.cs
│   │           │   │           ├── DirectoryItemViewModel.cs
│   │           │   │           ├── FileItemViewModel.cs
│   │           │   │           └── IBrowserItemViewModel.cs
│   │           │   ├── MavParams/
│   │           │   │   ├── Dialog/
│   │           │   │   │   ├── TryCloseWithApprovalDialogView.axaml
│   │           │   │   │   ├── TryCloseWithApprovalDialogView.axaml.cs
│   │           │   │   │   └── TryCloseWithApprovalDialogViewModel.cs
│   │           │   │   ├── HomePageParamsDeviceItemAction.cs
│   │           │   │   ├── MavParamsPageView.axaml
│   │           │   │   ├── MavParamsPageView.axaml.cs
│   │           │   │   ├── MavParamsPageViewModel.cs
│   │           │   │   └── ParamItem/
│   │           │   │       ├── ParamItemView.axaml
│   │           │   │       ├── ParamItemView.axaml.cs
│   │           │   │       ├── ParamItemViewModel.cs
│   │           │   │       └── RoutedEvents/
│   │           │   │           └── ParamItemChangedEvent.cs
│   │           │   └── Setup/
│   │           │       ├── DefaultSetupExtension.cs
│   │           │       ├── HomePageSetupDeviceItemAction.cs
│   │           │       ├── SetupMixin.cs
│   │           │       ├── SetupPageView.axaml
│   │           │       ├── SetupPageView.axaml.cs
│   │           │       ├── SetupPageViewModel.cs
│   │           │       └── Subpage/
│   │           │           ├── FrameType/
│   │           │           │   ├── DroneFrameItem/
│   │           │           │   │   ├── DroneFrameItemView.axaml
│   │           │           │   │   ├── DroneFrameItemView.axaml.cs
│   │           │           │   │   ├── DroneFrameItemViewModel.cs
│   │           │           │   │   ├── NullDroneFrame.cs
│   │           │           │   │   └── RoutedEvents/
│   │           │           │   │       └── CurrentDroneFrameChangeEvent.cs
│   │           │           │   ├── FrameTypeSetupPageExtension.cs
│   │           │           │   ├── SetupFrameTypeView.axaml
│   │           │           │   ├── SetupFrameTypeView.axaml.cs
│   │           │           │   └── SetupFrameTypeViewModel.cs
│   │           │           ├── Motors/
│   │           │           │   ├── MotorItem/
│   │           │           │   │   ├── MotorItemView.axaml
│   │           │           │   │   ├── MotorItemView.axaml.cs
│   │           │           │   │   └── MotorItemViewModel.cs
│   │           │           │   ├── MotorsSetupPageExtension.cs
│   │           │           │   ├── SetupMotorsView.axaml
│   │           │           │   ├── SetupMotorsView.axaml.cs
│   │           │           │   └── SetupMotorsViewModel.cs
│   │           │           └── SetupSubpage.cs
│   │           ├── Flight/
│   │           │   ├── Anchors/
│   │           │   │   ├── FlightUavAnchorsExtension.cs
│   │           │   │   ├── MissionAnchor.cs
│   │           │   │   └── UavAnchor.cs
│   │           │   ├── FlightPageView.axaml
│   │           │   ├── FlightPageView.axaml.cs
│   │           │   ├── FlightPageViewModel.cs
│   │           │   ├── HomePageFlightExtension.cs
│   │           │   └── Widgets/
│   │           │       ├── FlightWidgetsExtension.cs
│   │           │       └── UavWidget/
│   │           │           ├── Dialogs/
│   │           │           │   ├── SetAltitudeDialogView.axaml
│   │           │           │   ├── SetAltitudeDialogView.axaml.cs
│   │           │           │   └── SetAltitudeDialogViewModel.cs
│   │           │           ├── MissionProgress/
│   │           │           │   ├── MissionProgressView.axaml
│   │           │           │   ├── MissionProgressView.axaml.cs
│   │           │           │   └── MissionProgressViewModel.cs
│   │           │           ├── UavWidgetView.axaml
│   │           │           ├── UavWidgetView.axaml.cs
│   │           │           └── UavWidgetViewModel.cs
│   │           ├── FlightMode/
│   │           │   ├── Anchors/
│   │           │   │   └── FlightModeAnchorsExtension.cs
│   │           │   ├── FlightModePageView.axaml
│   │           │   ├── FlightModePageView.axaml.cs
│   │           │   ├── FlightModePageViewModel.cs
│   │           │   ├── HomePageFlightModeExtension.cs
│   │           │   └── Widgets/
│   │           │       ├── Device/
│   │           │       │   ├── FlightModeClientDeviceWidgetExtension.cs
│   │           │       │   └── Mavlink/
│   │           │       │       └── Drone/
│   │           │       │           ├── DroneFlightWidgetViewModel.cs
│   │           │       │           ├── DroneWidgetCreationHandler.cs
│   │           │       │           ├── Plane/
│   │           │       │           │   ├── PlaneWidgetCreationHandler.cs
│   │           │       │           │   ├── PlaneWidgetViewModel.cs
│   │           │       │           │   └── Sections/
│   │           │       │           │       ├── PlaneSectionExtension.cs
│   │           │       │           │       ├── PlaneSectionView.axaml
│   │           │       │           │       ├── PlaneSectionView.axaml.cs
│   │           │       │           │       └── PlaneSectionViewModel.cs
│   │           │       │           └── Sections/
│   │           │       │               ├── AttitudeIndicator/
│   │           │       │               │   ├── AttitudeIndicatorSectionView.axaml
│   │           │       │               │   ├── AttitudeIndicatorSectionView.axaml.cs
│   │           │       │               │   ├── AttitudeIndicatorSectionViewModel.cs
│   │           │       │               │   └── DroneFlightWidgetExtensionAttitudeIndicatorSection.cs
│   │           │       │               ├── FlightControl/
│   │           │       │               │   ├── DroneFlightWidgetFlightControlSectionExtension.cs
│   │           │       │               │   ├── FlightControlSectionView.axaml
│   │           │       │               │   ├── FlightControlSectionView.axaml.cs
│   │           │       │               │   └── FlightControlSectionViewModel.cs
│   │           │       │               └── Telemetry/
│   │           │       │                   ├── DroneFlightWidgetTelemetrySectionExtension.cs
│   │           │       │                   ├── TelemetrySectionView.axaml
│   │           │       │                   ├── TelemetrySectionView.axaml.cs
│   │           │       │                   └── TelemetrySectionViewModel.cs
│   │           │       └── Test/
│   │           │           ├── PluginFlightItemView.axaml
│   │           │           ├── PluginFlightItemView.axaml.cs
│   │           │           ├── PluginFlightItemViewModel.cs
│   │           │           └── PluginFlightItemWidgetExtension.cs
│   │           └── PacketViewer/
│   │               ├── Dialogs/
│   │               │   ├── SavePacketMessagesDialogView.axaml
│   │               │   ├── SavePacketMessagesDialogView.axaml.cs
│   │               │   └── SavePacketMessagesDialogViewModel.cs
│   │               ├── Filters/
│   │               │   ├── Comparers/
│   │               │   │   ├── PacketFilterComparerBase.cs
│   │               │   │   ├── SourcePacketFilterComparer.cs
│   │               │   │   └── TypePacketFilterComparer.cs
│   │               │   ├── PacketFilterViewModelBase.cs
│   │               │   ├── SourcePacketFilterViewModel.cs
│   │               │   └── TypePacketFilterViewModel.cs
│   │               ├── HomePacketViewerExtension.cs
│   │               ├── PacketConverter/
│   │               │   └── DefaultMavlinkPacketConverter.cs
│   │               ├── PacketMessage/
│   │               │   ├── PacketMessageView.axaml
│   │               │   ├── PacketMessageView.axaml.cs
│   │               │   └── PacketMessageViewModel.cs
│   │               ├── PacketViewerView.axaml
│   │               ├── PacketViewerView.axaml.cs
│   │               └── PacketViewerViewModel.cs
│   ├── Asv.Drones.Android/
│   │   ├── Asv.Drones.Android.csproj
│   │   ├── MainActivity.cs
│   │   ├── Properties/
│   │   │   └── AndroidManifest.xml
│   │   └── Resources/
│   │       ├── AboutResources.txt
│   │       ├── drawable/
│   │       │   └── splash_screen.xml
│   │       ├── drawable-night-v31/
│   │       │   └── avalonia_anim.xml
│   │       ├── drawable-v31/
│   │       │   └── avalonia_anim.xml
│   │       ├── values/
│   │       │   ├── colors.xml
│   │       │   └── styles.xml
│   │       ├── values-night/
│   │       │   └── colors.xml
│   │       └── values-v31/
│   │           └── styles.xml
│   ├── Asv.Drones.Api/
│   │   ├── Asv.Drones.Api.csproj
│   │   ├── Asv.Drones.Api.csproj.DotSettings
│   │   ├── Core/
│   │   │   ├── Commands/
│   │   │   │   ├── Behaviour/
│   │   │   │   │   ├── Remove/
│   │   │   │   │   │   ├── IRemoveItemCommand.cs
│   │   │   │   │   │   └── ISupportRemove.cs
│   │   │   │   │   └── Rename/
│   │   │   │   │       ├── ICommitRenameCommand.cs
│   │   │   │   │       └── ISupportRename.cs
│   │   │   │   ├── Commands.cs
│   │   │   │   ├── Flight/
│   │   │   │   │   └── IFlightModeCommands.cs
│   │   │   │   ├── Mavlink/
│   │   │   │   │   └── IMavlinkCommands.cs
│   │   │   │   └── MavlinkMicroserviceCommand.cs
│   │   │   ├── Controls/
│   │   │   │   ├── FlightWidget/
│   │   │   │   │   ├── FlightWidgetView.axaml
│   │   │   │   │   ├── FlightWidgetView.axaml.cs
│   │   │   │   │   ├── FlightWidgetViewModel.cs
│   │   │   │   │   ├── FlightWidgetsComparer.cs
│   │   │   │   │   ├── IFlightWidget.cs
│   │   │   │   │   └── Section/
│   │   │   │   │       ├── FlightWidgetSectionsComparer.cs
│   │   │   │   │       └── IFlightWidgetSection.cs
│   │   │   │   └── MavParam/
│   │   │   │       ├── Button/
│   │   │   │       │   ├── MavParamButtonView.axaml
│   │   │   │       │   ├── MavParamButtonView.axaml.cs
│   │   │   │       │   └── MavParamButtonViewModel.cs
│   │   │   │       ├── ComboBox/
│   │   │   │       │   ├── MavParamComboBoxView.axaml
│   │   │   │       │   ├── MavParamComboBoxView.axaml.cs
│   │   │   │       │   └── MavParamComboboxViewModel.cs
│   │   │   │       ├── Geopoint/
│   │   │   │       │   ├── MavParamAltitudeTextBoxView.cs
│   │   │   │       │   ├── MavParamAltitudeTextBoxViewModel.cs
│   │   │   │       │   ├── MavParamLatLonTextBoxView.cs
│   │   │   │       │   └── MavParamLatLonTextBoxViewModel.cs
│   │   │   │       ├── MavParamFactory.cs
│   │   │   │       ├── MavParamInfo.cs
│   │   │   │       ├── MavParamViewModel.cs
│   │   │   │       ├── String/
│   │   │   │       │   ├── MavParamAsciiCharView.cs
│   │   │   │       │   └── MavParamAsciiCharViewModel.cs
│   │   │   │       └── TextBox/
│   │   │   │           ├── MavParamTextBoxView.axaml
│   │   │   │           ├── MavParamTextBoxView.axaml.cs
│   │   │   │           └── MavParamTextBoxViewModel.cs
│   │   │   └── Services/
│   │   │       ├── ClientDeviceWidgetFactory/
│   │   │       │   ├── IClientDeviceWidgetCreationHandler.cs
│   │   │       │   └── IClientDeviceWidgetFactory.cs
│   │   │       ├── Converters/
│   │   │       │   └── IPacketConverter.cs
│   │   │       └── Devices/
│   │   │           └── Mavlink/
│   │   │               └── IMavlinkHost.cs
│   │   ├── RS.Designer.cs
│   │   ├── RS.resx
│   │   ├── RS.ru.resx
│   │   ├── Shell/
│   │   │   └── Pages/
│   │   │       ├── FileBrowser/
│   │   │       │   └── IFileBrowserViewModel.cs
│   │   │       ├── Flight/
│   │   │       │   ├── FlightMode.cs
│   │   │       │   ├── IFlightMode.cs
│   │   │       │   └── Widgets/
│   │   │       │       └── UavWidget/
│   │   │       │           └── IUavFlightWidget.cs
│   │   │       ├── FlightMode/
│   │   │       │   ├── IFlightModePage.cs
│   │   │       │   └── Widgets/
│   │   │       │       └── Device/
│   │   │       │           ├── DeviceFlightWidgetViewModelBase.cs
│   │   │       │           ├── IDeviceFlightWidget.cs
│   │   │       │           └── Mavlink/
│   │   │       │               ├── Drone/
│   │   │       │               │   ├── DroneFlightWidgetViewModelBase.cs
│   │   │       │               │   └── IDroneFlightWidget.cs
│   │   │       │               ├── IMavlinkDeviceFlightWidget.cs
│   │   │       │               └── MavlinkDeviceFlightWidgetViewModelBase.cs
│   │   │       ├── MavParams/
│   │   │       │   └── IMavParamsPageViewModel.cs
│   │   │       └── Setup/
│   │   │           ├── ISetupPage.cs
│   │   │           └── Subpage/
│   │   │               └── ISetupSubpage.cs
│   │   └── Tools/
│   │       └── Mavlink/
│   │           ├── DeviceIconMixin.cs
│   │           └── MavlinkHost.cs
│   ├── Asv.Drones.Desktop/
│   │   ├── Asv.Drones.Desktop.csproj
│   │   ├── Program.cs
│   │   ├── app.manifest
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.Production.json
│   │   └── appsettings.json
│   ├── Asv.Drones.iOS/
│   │   ├── AppDelegate.cs
│   │   ├── Asv.Drones.iOS.csproj
│   │   ├── Entitlements.plist
│   │   ├── Info.plist
│   │   ├── Main.cs
│   │   └── Resources/
│   │       └── LaunchScreen.xib
│   ├── Asv.Drones.slnx
│   ├── CodeStyle.ruleset
│   ├── Directory.Build.props
│   └── global.json
├── win-64-install.nsi
├── win-arm-install.iss
├── win-arm64-install.iss
├── win-x64-install.iss
└── win-x86-install.iss
Download .txt
SYMBOL INDEX (841 symbols across 230 files)

FILE: src/Asv.Drones.Android/MainActivity.cs
  class MainActivity (line 9) | [Activity(
    method CustomizeAppBuilder (line 20) | protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)

FILE: src/Asv.Drones.Api/Core/Commands/Behaviour/Remove/IRemoveItemCommand.cs
  type IRemoveItemCommand (line 5) | public interface IRemoveItemCommand

FILE: src/Asv.Drones.Api/Core/Commands/Behaviour/Remove/ISupportRemove.cs
  type ISupportRemove (line 5) | public interface ISupportRemove : IRoutable
    method RemoveAsync (line 7) | ValueTask RemoveAsync(CancellationToken ct);

FILE: src/Asv.Drones.Api/Core/Commands/Behaviour/Rename/ICommitRenameCommand.cs
  type ICommitRenameCommand (line 5) | public interface ICommitRenameCommand

FILE: src/Asv.Drones.Api/Core/Commands/Behaviour/Rename/ISupportRename.cs
  type ISupportRename (line 5) | public interface ISupportRename : IRoutable
    method RenameAsync (line 8) | ValueTask<string> RenameAsync(string oldValue, string newValue, Cancel...

FILE: src/Asv.Drones.Api/Core/Commands/Commands.cs
  class Commands (line 6) | public static class Commands

FILE: src/Asv.Drones.Api/Core/Commands/Flight/IFlightModeCommands.cs
  type IFlightModeCommands (line 3) | public interface IFlightModeCommands { }

FILE: src/Asv.Drones.Api/Core/Commands/Mavlink/IMavlinkCommands.cs
  type IMavlinkCommands (line 6) | public interface IMavlinkCommands
    method WriteParam (line 9) | ValueTask WriteParam(
    method ReadParam (line 16) | ValueTask ReadParam(IRoutable context, string name, CancellationToken ...

FILE: src/Asv.Drones.Api/Core/Commands/MavlinkMicroserviceCommand.cs
  class MavlinkMicroserviceCommand (line 7) | public abstract class MavlinkMicroserviceCommand<TMicroservice, TArg>
    method CanExecute (line 12) | public override bool CanExecute(
    method InternalExecute (line 31) | public override ValueTask<TArg?> InternalExecute(
    method InternalExecute (line 47) | protected abstract ValueTask<TArg?> InternalExecute(

FILE: src/Asv.Drones.Api/Core/Controls/FlightWidget/FlightWidgetView.axaml.cs
  class FlightWidgetView (line 5) | public partial class FlightWidgetView : UserControl
    method FlightWidgetView (line 7) | public FlightWidgetView()

FILE: src/Asv.Drones.Api/Core/Controls/FlightWidget/FlightWidgetViewModel.cs
  class FlightWidgetViewModel (line 11) | public abstract class FlightWidgetViewModel<TContext, TSelf>(
    method InitWith (line 19) | public abstract void InitWith(TContext context);
    method FlightWidgetViewModel (line 25) | protected FlightWidgetViewModel(
    method GetChildren (line 99) | public override IEnumerable<IRoutable> GetChildren()
    method AfterLoadExtensions (line 112) | protected override void AfterLoadExtensions()
  class FlightWidgetViewModel (line 22) | public abstract class FlightWidgetViewModel<TSelf> : ExtendableViewModel...
    method InitWith (line 19) | public abstract void InitWith(TContext context);
    method FlightWidgetViewModel (line 25) | protected FlightWidgetViewModel(
    method GetChildren (line 99) | public override IEnumerable<IRoutable> GetChildren()
    method AfterLoadExtensions (line 112) | protected override void AfterLoadExtensions()

FILE: src/Asv.Drones.Api/Core/Controls/FlightWidget/FlightWidgetsComparer.cs
  class FlightWidgetsComparer (line 3) | public class FlightWidgetsComparer : IComparer<IFlightWidget>
    method Compare (line 7) | public int Compare(IFlightWidget? x, IFlightWidget? y)
    method CompareWidgetGroups (line 33) | private static int CompareWidgetGroups(IFlightWidget x, IFlightWidget y)
    method GetGroupKey (line 38) | private static string GetGroupKey(IFlightWidget widget)

FILE: src/Asv.Drones.Api/Core/Controls/FlightWidget/IFlightWidget.cs
  type IFlightWidget (line 6) | public interface IFlightWidget<in TContext> : IFlightWidget
    method InitWith (line 9) | void InitWith(TContext context);
  type IFlightWidget (line 12) | public interface IFlightWidget : IWorkspaceWidget
    method InitWith (line 9) | void InitWith(TContext context);

FILE: src/Asv.Drones.Api/Core/Controls/FlightWidget/Section/FlightWidgetSectionsComparer.cs
  class FlightWidgetSectionsComparer (line 3) | public class FlightWidgetSectionsComparer : IComparer<IFlightWidgetSection>
    method Compare (line 7) | public int Compare(IFlightWidgetSection? x, IFlightWidgetSection? y)

FILE: src/Asv.Drones.Api/Core/Controls/FlightWidget/Section/IFlightWidgetSection.cs
  type IAsyncFlightWidgetSection (line 5) | public interface IAsyncFlightWidgetSection<in TContext> : IFlightWidgetS...
    method InitWithAsync (line 8) | ValueTask InitWithAsync(TContext context, CancellationToken cancel = d...
  type IFlightWidgetSection (line 11) | public interface IFlightWidgetSection<in TContext> : IFlightWidgetSection
    method InitWith (line 14) | void InitWith(TContext context);
  type IFlightWidgetSection (line 17) | public interface IFlightWidgetSection : IRoutable
    method InitWith (line 14) | void InitWith(TContext context);

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/Button/MavParamButtonView.axaml.cs
  class MavParamButtonView (line 8) | public partial class MavParamButtonView : UserControl
    method MavParamButtonView (line 10) | public MavParamButtonView()

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/Button/MavParamButtonViewModel.cs
  class MavParamButtonViewModel (line 10) | public class MavParamButtonViewModel : MavParamViewModel
    method MavParamButtonViewModel (line 12) | public MavParamButtonViewModel()
    method MavParamButtonViewModel (line 45) | public MavParamButtonViewModel(
    method InternalWrite (line 56) | public void InternalWrite()

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/ComboBox/MavParamComboBoxView.axaml.cs
  class MavParamComboBoxView (line 8) | public partial class MavParamComboBoxView : UserControl
    method MavParamComboBoxView (line 10) | public MavParamComboBoxView()

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/ComboBox/MavParamComboboxViewModel.cs
  class MavParamComboBoxViewModel (line 10) | public class MavParamComboBoxViewModel : MavParamViewModel
    method MavParamComboBoxViewModel (line 14) | public MavParamComboBoxViewModel()
    method MavParamComboBoxViewModel (line 58) | public MavParamComboBoxViewModel(

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/Geopoint/MavParamAltitudeTextBoxView.cs
  class MavParamAltitudeTextBoxView (line 5) | public class MavParamAltitudeTextBoxView : MavParamTextBoxView;

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/Geopoint/MavParamAltitudeTextBoxViewModel.cs
  class MavParamAltitudeTextBoxViewModel (line 8) | public class MavParamAltitudeTextBoxViewModel : MavParamTextBoxViewModel
    method MavParamAltitudeTextBoxViewModel (line 12) | public MavParamAltitudeTextBoxViewModel(
    method ValueToText (line 26) | protected override string ValueToText(ValueType remoteValue)
    method TextToValue (line 34) | protected override Exception? TextToValue(string valueAsString, out Va...

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/Geopoint/MavParamLatLonTextBoxView.cs
  class MavParamLatLonTextBoxView (line 5) | public class MavParamLatLonTextBoxView : MavParamTextBoxView;

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/Geopoint/MavParamLatLonTextBoxViewModel.cs
  class MavParamLatLonTextBoxViewModel (line 8) | public class MavParamLatLonTextBoxViewModel : MavParamTextBoxViewModel
    method MavParamLatLonTextBoxViewModel (line 12) | public MavParamLatLonTextBoxViewModel(
    method ValueToText (line 30) | protected override string ValueToText(ValueType remoteValue)
    method TextToValue (line 36) | protected override Exception? TextToValue(string valueAsString, out Va...

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/MavParamFactory.cs
  class MavParamFactory (line 8) | public static class MavParamFactory
    method Create (line 10) | public static MavParamViewModel Create(
    method Create (line 66) | public static MavParamViewModel Create(

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/MavParamInfo.cs
  type MavParamWidgetType (line 13) | public enum MavParamWidgetType
  class MavParamInfo (line 24) | public partial class MavParamInfo
    method CreateLongDescRegex (line 31) | [GeneratedRegex(LongDescRegexString, RegexOptions.Compiled)]
    method CreateMetadataRegex (line 38) | [GeneratedRegex(MetadataRegexString, RegexOptions.Compiled)]
    method ParseAdditionalInfo (line 43) | private static void ParseAdditionalInfo(
    method MavParamInfo (line 98) | public MavParamInfo(IMavParamTypeMetadata metadata)
    method GetAdditionalAsEnum (line 108) | private static T? GetAdditionalAsEnum<T>(ImmutableDictionary<string, s...
    method GetAdditionalAsInt (line 122) | private static int GetAdditionalAsInt(
    method GetAdditionalAsDouble (line 139) | private static double GetAdditionalAsDouble(
    method NormalizeAdditionalValue (line 156) | private static string NormalizeAdditionalValue(string value)
    method GetPredefinedValues (line 185) | public IEnumerable<MavParamValueItem> GetPredefinedValues()
    method Convert (line 208) | public MavParamValue Convert(ValueType value)
    method Convert (line 223) | public ValueType Convert(MavParamValue value)
    method Print (line 253) | public string? Print(ValueType? value)
    method GetError (line 289) | public string? GetError(ValueType? value)
    method IsValid (line 414) | public bool IsValid(ValueType? value)
    method ValidateString (line 495) | public Exception? ValidateString(string valueAsString, out ValueType v...
  class MavParamValueItem (line 589) | public class MavParamValueItem(

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/MavParamViewModel.cs
  class MavParamViewModel (line 20) | public class MavParamViewModel
    method MavParamViewModel (line 27) | protected MavParamViewModel(
    method Init (line 59) | private async void Init(InitialReadParamDelegate callback)
    method InternalOnRemoteChanged (line 77) | private void InternalOnRemoteChanged(MavParamValue value)
    method ResetToDefault (line 90) | public void ResetToDefault()
    method Refresh (line 96) | public async void Refresh()
    method Write (line 117) | public async void Write()
    method GetChildren (line 205) | public override IEnumerable<IRoutable> GetChildren()
    method Cancel (line 210) | public void Cancel() { }
    method CompareTo (line 212) | public int CompareTo(MavParamViewModel? other)
    method CompareTo (line 227) | public int CompareTo(object? obj)

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/String/MavParamAsciiCharView.cs
  class MavParamAsciiCharView (line 5) | public class MavParamAsciiCharView : MavParamTextBoxView;

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/String/MavParamAsciiCharViewModel.cs
  class MavParamAsciiCharViewModel (line 9) | public class MavParamAsciiCharViewModel : MavParamTextBoxViewModel
    method MavParamAsciiCharViewModel (line 11) | public MavParamAsciiCharViewModel(
    method ValueToText (line 19) | protected override string ValueToText(ValueType remoteValue)
    method TextToValue (line 34) | protected override Exception? TextToValue(string valueAsString, out Va...

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/TextBox/MavParamTextBoxView.axaml.cs
  class MavParamTextBoxView (line 8) | public partial class MavParamTextBoxView : UserControl
    method MavParamTextBoxView (line 10) | public MavParamTextBoxView()
    method PART_TextBox_OnGotFocus (line 15) | private void PART_TextBox_OnGotFocus(object? sender, GotFocusEventArgs e)

FILE: src/Asv.Drones.Api/Core/Controls/MavParam/TextBox/MavParamTextBoxViewModel.cs
  class MavParamTextBoxViewModel (line 13) | public class MavParamTextBoxViewModel : MavParamViewModel
    method MavParamTextBoxViewModel (line 18) | public MavParamTextBoxViewModel()
    method MavParamTextBoxViewModel (line 74) | public MavParamTextBoxViewModel(
    method ValueToText (line 105) | protected virtual string ValueToText(ValueType remoteValue)
    method TextToValue (line 110) | protected virtual Exception? TextToValue(string valueAsString, out Val...
    method Validator (line 115) | private Exception? Validator(string valueAsString)

FILE: src/Asv.Drones.Api/Core/Services/ClientDeviceWidgetFactory/IClientDeviceWidgetCreationHandler.cs
  type IClientDeviceWidgetCreationHandler (line 5) | public interface IClientDeviceWidgetCreationHandler
    method Create (line 8) | IFlightWidget? Create(in IClientDevice device);

FILE: src/Asv.Drones.Api/Core/Services/ClientDeviceWidgetFactory/IClientDeviceWidgetFactory.cs
  type IClientDeviceWidgetFactory (line 5) | public interface IClientDeviceWidgetFactory
    method CreateWidget (line 7) | public IFlightWidget? CreateWidget(in IClientDevice device);

FILE: src/Asv.Drones.Api/Core/Services/Converters/IPacketConverter.cs
  type PacketFormatting (line 8) | public enum PacketFormatting
  type IPacketConverter (line 24) | public interface IPacketConverter
    method CanConvert (line 36) | bool CanConvert(MavlinkMessage packet);
    method Convert (line 48) | string Convert(MavlinkMessage packet, PacketFormatting formatting = Pa...

FILE: src/Asv.Drones.Api/Core/Services/Devices/Mavlink/IMavlinkHost.cs
  type IMavlinkMessagesExtension (line 7) | public interface IMavlinkMessagesExtension
    method Extend (line 9) | void Extend(ImmutableDictionary<int, Func<MavlinkMessage>>.Builder bui...
  type IMavlinkHost (line 12) | public interface IMavlinkHost

FILE: src/Asv.Drones.Api/RS.Designer.cs
  class RS (line 21) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
    method RS (line 30) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...

FILE: src/Asv.Drones.Api/Shell/Pages/FileBrowser/IFileBrowserViewModel.cs
  type IFileBrowserViewModel (line 5) | public interface IFileBrowserViewModel : IDevicePage { }

FILE: src/Asv.Drones.Api/Shell/Pages/Flight/FlightMode.cs
  class FlightMode (line 5) | public static class FlightMode

FILE: src/Asv.Drones.Api/Shell/Pages/Flight/IFlightMode.cs
  type IFlightMode (line 8) | public interface IFlightMode : IPage

FILE: src/Asv.Drones.Api/Shell/Pages/Flight/Widgets/UavWidget/IUavFlightWidget.cs
  type IUavFlightWidget (line 6) | public interface IUavFlightWidget : IWorkspaceWidget

FILE: src/Asv.Drones.Api/Shell/Pages/FlightMode/IFlightModePage.cs
  type IFlightModePage (line 7) | public interface IFlightModePage : IPage

FILE: src/Asv.Drones.Api/Shell/Pages/FlightMode/Widgets/Device/DeviceFlightWidgetViewModelBase.cs
  class DeviceFlightWidgetViewModelBase (line 10) | public abstract class DeviceFlightWidgetViewModelBase<TDeviceContext, TS...
    method DeviceFlightWidgetViewModelBase (line 17) | protected DeviceFlightWidgetViewModelBase(
    method InitWith (line 32) | public override void InitWith(TDeviceContext device)

FILE: src/Asv.Drones.Api/Shell/Pages/FlightMode/Widgets/Device/IDeviceFlightWidget.cs
  type IDeviceFlightWidget (line 5) | public interface IDeviceFlightWidget<TDeviceContext> : IFlightWidget<TDe...

FILE: src/Asv.Drones.Api/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/DroneFlightWidgetViewModelBase.cs
  class DroneFlightWidgetViewModelBase (line 8) | public class DroneFlightWidgetViewModelBase<TDrone, TSelf>(

FILE: src/Asv.Drones.Api/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/IDroneFlightWidget.cs
  type IDroneFlightWidget (line 5) | public interface IDroneFlightWidget : IDroneFlightWidget<MavlinkClientDe...
  type IDroneFlightWidget (line 7) | public interface IDroneFlightWidget<TDrone> : IMavlinkDeviceFlightWidget...

FILE: src/Asv.Drones.Api/Shell/Pages/FlightMode/Widgets/Device/Mavlink/IMavlinkDeviceFlightWidget.cs
  type IMavlinkDeviceFlightWidget (line 5) | public interface IMavlinkDeviceFlightWidget : IMavlinkDeviceFlightWidget...
  type IMavlinkDeviceFlightWidget (line 7) | public interface IMavlinkDeviceFlightWidget<TMavlinkClientDevice>

FILE: src/Asv.Drones.Api/Shell/Pages/FlightMode/Widgets/Device/Mavlink/MavlinkDeviceFlightWidgetViewModelBase.cs
  class MavlinkDeviceFlightWidgetViewModelBase (line 8) | public abstract class MavlinkDeviceFlightWidgetViewModelBase<TMavlinkCli...
    method InitWith (line 26) | public override void InitWith(TMavlinkClientDevice device)
    method CreateOrderFromId (line 37) | private static int CreateOrderFromId(MavlinkClientDeviceId id)

FILE: src/Asv.Drones.Api/Shell/Pages/MavParams/IMavParamsPageViewModel.cs
  type IMavParamsPageViewModel (line 5) | public interface IMavParamsPageViewModel : IDevicePage { }

FILE: src/Asv.Drones.Api/Shell/Pages/Setup/ISetupPage.cs
  type ISetupPage (line 6) | public interface ISetupPage : ITreePageViewModel, IDevicePage { }

FILE: src/Asv.Drones.Api/Shell/Pages/Setup/Subpage/ISetupSubpage.cs
  type ISetupSubpage (line 5) | public interface ISetupSubpage : ITreeSubpage<ISetupPage> { }

FILE: src/Asv.Drones.Api/Tools/Mavlink/DeviceIconMixin.cs
  class DeviceIconMixin (line 8) | public static class DeviceIconMixin
    method GetIcon (line 10) | public static MaterialIconKind? GetIcon(DeviceId deviceId)
    method GetIconCenterX (line 21) | public static HorizontalOffset GetIconCenterX(DeviceId deviceId)
    method GetIconCenterY (line 36) | public static VerticalOffset GetIconCenterY(DeviceId deviceId)

FILE: src/Asv.Drones.Api/Tools/Mavlink/MavlinkHost.cs
  class MavlinkDeviceManagerExtensionConfig (line 32) | public class MavlinkDeviceManagerExtensionConfig
  class MavlinkHost (line 38) | public class MavlinkHost : IDeviceManagerExtension, IMavlinkHost, IHoste...
    method MavlinkHost (line 45) | public MavlinkHost(
    method Configure (line 82) | public void Configure(IProtocolBuilder builder)
    method Configure (line 89) | public void Configure(IDeviceExplorerBuilder builder)
    method TryGetIcon (line 94) | public bool TryGetIcon(DeviceId id, out MaterialIconKind? icon)
    method TryGetDeviceBrush (line 100) | public bool TryGetDeviceBrush(DeviceId id, out AsvColorKind brush)
    method Run (line 106) | public void Run(IDeviceManager deviceManager)
    method StartAsync (line 132) | public Task StartAsync(CancellationToken cancellationToken)
    method StopAsync (line 137) | public Task StopAsync(CancellationToken cancellationToken)

FILE: src/Asv.Drones.Desktop/Program.cs
  class Program (line 20) | sealed class Program
    method Main (line 25) | [STAThread]
    method BuildAvaloniaApp (line 42) | public static AppBuilder BuildAvaloniaApp()

FILE: src/Asv.Drones.iOS/AppDelegate.cs
  class AppDelegate (line 13) | [Register("AppDelegate")]
    method CustomizeAppBuilder (line 18) | protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)

FILE: src/Asv.Drones.iOS/Main.cs
  class Application (line 5) | public class Application
    method Main (line 8) | static void Main(string[] args)

FILE: src/Asv.Drones/App.axaml.cs
  class App (line 6) | public partial class App : AsvApplication
    method Initialize (line 8) | public override void Initialize()

FILE: src/Asv.Drones/AsvDronesMixin.cs
  class AsvDronesMixin (line 12) | public static class AsvDronesMixin
    method extension (line 14) | extension(IHostApplicationBuilder builder)
    class Builder (line 24) | public class Builder(IHostApplicationBuilder builder)
      method UseDefault (line 28) | public Builder UseDefault()
      method UseControls (line 42) | public Builder UseControls()
      method UseCommands (line 56) | public Builder UseCommands()
      method UseMavlinkHost (line 93) | public Builder UseMavlinkHost()
      method UseMavParams (line 106) | public Builder UseMavParams()
      method UseFileBrowser (line 137) | public Builder UseFileBrowser()
      method UseFlightMode (line 150) | public Builder UseFlightMode()
      method UseExtendableFlightMode (line 167) | public Builder UseExtendableFlightMode()
      method UseOptionalPacketViewer (line 248) | public Builder UseOptionalPacketViewer()

FILE: src/Asv.Drones/Core/Commands/Behaviour/Remove/RemoveItemCommand.cs
  class RemoveItemCommand (line 9) | public class RemoveItemCommand : ContextCommand<ISupportRemove>, IRemove...
    method InternalExecute (line 24) | protected override async ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/Behaviour/Rename/CommitRenameCommand.cs
  class CommitRenameCommand (line 15) | public class CommitRenameCommand : ContextCommand<ISupportRename, DictAr...
    method InternalExecute (line 33) | public override async ValueTask<DictArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/FileBrowser/FileBrowserViewModel/FindFileCommand.cs
  class FindFileCommand (line 8) | public class FindFileCommand : ContextCommand<FileBrowserViewModel>
    method InternalExecute (line 23) | protected override ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/FileBrowser/Items/CalculateCrc32Command.cs
  class CalculateCrc32Command (line 8) | public class CalculateCrc32Command : ContextCommand<IBrowserItemViewModel>
    method InternalExecute (line 23) | protected override async ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/FileBrowser/Items/CreateDirectoryCommand.cs
  class CreateDirectoryCommand (line 8) | public class CreateDirectoryCommand : ContextCommand<IBrowserItemViewModel>
    method InternalExecute (line 23) | protected override async ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/FileBrowser/OpenFileBrowserCommand.cs
  class OpenFileBrowserCommand (line 5) | public class OpenFileBrowserCommand(INavigationService nav)

FILE: src/Asv.Drones/Core/Commands/FileBrowser/Transfer/BurstDownloadItemCommand.cs
  class BurstDownloadItemCommand (line 17) | public class BurstDownloadItemCommand : TransferCommandBase
    method InternalExecute (line 32) | public override async ValueTask<DictArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/FileBrowser/Transfer/DownloadItemCommand.cs
  class DownloadItemCommand (line 17) | public class DownloadItemCommand : TransferCommandBase
    method InternalExecute (line 32) | public override async ValueTask<DictArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/FileBrowser/Transfer/ITransferFtpEntries.cs
  type ITransferFtpEntries (line 8) | public interface ITransferFtpEntries : IRoutable
    method UploadItem (line 10) | ValueTask UploadItem(
    method DownloadItem (line 16) | ValueTask DownloadItem(
    method BurstDownloadItem (line 23) | ValueTask BurstDownloadItem(

FILE: src/Asv.Drones/Core/Commands/FileBrowser/Transfer/TransferCommandBase.cs
  class TransferCommandBase (line 7) | public abstract class TransferCommandBase : ContextCommand<ITransferFtpE...
    method TryReadRequiredString (line 16) | protected static bool TryReadRequiredString(DictArg args, string key, ...
    method TryReadRequiredByte (line 28) | protected static bool TryReadRequiredByte(DictArg args, string key, ou...
    method TryReadRequiredEntryType (line 46) | protected static bool TryReadRequiredEntryType(

FILE: src/Asv.Drones/Core/Commands/FileBrowser/Transfer/UploadItemCommand.cs
  class UploadItemCommand (line 16) | public class UploadItemCommand : TransferCommandBase
    method InternalExecute (line 31) | public override async ValueTask<DictArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/Flight/OpenFlight.cs
  class OpenFlightCommand (line 5) | public class OpenFlightCommand(INavigationService nav)

FILE: src/Asv.Drones/Core/Commands/Flight/OpenFlightMode.cs
  class OpenFlightModeCommand (line 6) | public class OpenFlightModeCommand(INavigationService nav)

FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/AutoModeCommand.cs
  class AutoModeCommand (line 10) | public class AutoModeCommand : ContextCommand<UavWidgetViewModel> // TOD...
    method InternalExecute (line 29) | protected override async ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/GuidedModeCommand.cs
  class GuidedModeCommand (line 10) | public class GuidedModeCommand : ContextCommand<UavWidgetViewModel>
    method InternalExecute (line 29) | protected override async ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/LandCommand.cs
  class LandCommand (line 10) | public class LandCommand : ContextCommand<UavWidgetViewModel>
    method InternalExecute (line 29) | protected override async ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/MissionProgress/UpdateMissionCommand.cs
  class UpdateMissionCommand (line 8) | public class UpdateMissionCommand : ContextCommand<MissionProgressViewMo...
    method InternalExecute (line 27) | protected override async ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/RTLCommand.cs
  class RTLCommand (line 10) | public class RTLCommand : ContextCommand<UavWidgetViewModel>
    method InternalExecute (line 29) | protected override async ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/StartMissionCommand.cs
  class StartMissionCommand (line 11) | public class StartMissionCommand : ContextCommand<UavWidgetViewModel>
    method InternalExecute (line 30) | protected override async ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/TakeOffCommand.cs
  class TakeOffCommand (line 10) | public class TakeOffCommand : ContextCommand<UavWidgetViewModel, DoubleArg>
    method InternalExecute (line 29) | public override async ValueTask<DoubleArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/MavParams/MavParamsPageViewModel/RemoveAllPinsCommand.cs
  class RemoveAllPinsCommand (line 10) | public class RemoveAllPinsCommand : ContextCommand<MavParamsPageViewMode...
    method InternalExecute (line 25) | public override ValueTask<DictArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/MavParams/MavParamsPageViewModel/StopUpdateParamsCommand.cs
  class StopUpdateParamsCommand (line 8) | public class StopUpdateParamsCommand : ContextCommand<MavParamsPageViewM...
    method InternalExecute (line 23) | protected override ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/MavParams/MavParamsPageViewModel/UpdateParamsCommand.cs
  class UpdateParamsCommand (line 8) | public class UpdateParamsCommand : ContextCommand<MavParamsPageViewModel>
    method InternalExecute (line 23) | protected override async ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/MavParams/OpenMavParamsCommand.cs
  class OpenMavParamsCommand (line 5) | public class OpenMavParamsCommand(INavigationService nav)

FILE: src/Asv.Drones/Core/Commands/Mavlink/MavlinkCommands.cs
  class MavlinkCommands (line 9) | public class MavlinkCommands : IMavlinkCommands
    method WriteParam (line 13) | public ValueTask WriteParam(
    method ReadParam (line 22) | public ValueTask ReadParam(

FILE: src/Asv.Drones/Core/Commands/Mavlink/MavlinkCommandsMixin.cs
  class MavlinkCommandsMixin (line 7) | public static class MavlinkCommandsMixin
    method RegisterMavlinkCommands (line 9) | public static IHostApplicationBuilder RegisterMavlinkCommands(

FILE: src/Asv.Drones/Core/Commands/Mavlink/MavlinkParamReadCommand.cs
  class MavlinkParamReadCommand (line 10) | public class MavlinkParamReadCommand : MavlinkMicroserviceCommand<IParam...
    method Execute (line 23) | public static ValueTask Execute(
    method InternalExecute (line 34) | protected override async ValueTask<StringArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/Mavlink/MavlinkParamsWriteCommand.cs
  class MavlinkParamsWriteCommand (line 12) | public class MavlinkParamsWriteCommand : MavlinkMicroserviceCommand<IPar...
    method Execute (line 25) | public static ValueTask Execute(
    method InternalExecute (line 41) | protected override async ValueTask<ActionArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/Mavlink/NullMavlinkCommands.cs
  class NullMavlinkCommands (line 9) | public sealed class NullMavlinkCommands : IMavlinkCommands
    method NullMavlinkCommands (line 13) | private NullMavlinkCommands() { }
    method WriteParam (line 17) | public ValueTask WriteParam(
    method ReadParam (line 29) | public ValueTask ReadParam(IRoutable context, string name, Cancellatio...

FILE: src/Asv.Drones/Core/Commands/PacketViewer/ClearAllPacketsCommand.cs
  class ClearAllPacketsCommand (line 8) | public sealed class ClearAllPacketsCommand : ContextCommand<PacketViewer...
    method InternalExecute (line 23) | protected override ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/PacketViewer/ExportPacketsToCsvCommand.cs
  class ExportPacketsToCsvCommand (line 8) | public class ExportPacketsToCsvCommand : ContextCommand<PacketViewerView...
    method InternalExecute (line 23) | protected override async ValueTask<CommandArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/PacketViewer/OpenPacketViewer.cs
  class OpenPacketViewerCommand (line 5) | public class OpenPacketViewerCommand(INavigationService nav)

FILE: src/Asv.Drones/Core/Commands/Setup/FrameType/ChangeFrameTypeCommand.cs
  class ChangeFrameTypeCommand (line 8) | public class ChangeFrameTypeCommand : ContextCommand<SetupFrameTypeViewM...
    method InternalExecute (line 23) | public override async ValueTask<StringArg?> InternalExecute(

FILE: src/Asv.Drones/Core/Commands/Setup/OpenSetupCommand.cs
  class OpenSetupCommand (line 5) | public class OpenSetupCommand(INavigationService nav)

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Pitch/PitchItem.cs
  class PitchItem (line 6) | public partial class PitchItem : AvaloniaObject
    method PitchItem (line 10) | public PitchItem(
    method UpdateVisibility (line 35) | public void UpdateVisibility(double pitch)

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Pitch/PitchItem.properties.cs
  class PitchItem (line 5) | public partial class PitchItem

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Roll/RollItem.cs
  class RollItem (line 6) | public partial class RollItem : AvaloniaObject
    method RollItem (line 8) | public RollItem(int angle)

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Roll/RollItem.properties.cs
  class RollItem (line 5) | public partial class RollItem

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/UavAngleIndicator.cs
  class UavAngleIndicator (line 8) | public partial class UavAngleIndicator : TemplatedControl
    method UavAngleIndicator (line 10) | public UavAngleIndicator()
    method OnPropertyChanged (line 89) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...
    method UpdateAngle (line 103) | private static void UpdateAngle(AvaloniaObject source)
    method UpdateRollAngle (line 118) | private static void UpdateRollAngle(AvaloniaObject source)

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/UavAngleIndicator.properties.cs
  class UavAngleIndicator (line 6) | public partial class UavAngleIndicator

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/CompassUavIndicator/CompassScaleItem.cs
  class CompassScaleItem (line 6) | public class CompassScaleItem : AvaloniaObject
    method CompassScaleItem (line 14) | public CompassScaleItem(double angle, string? title, bool isMajor)
    method Update (line 82) | public void Update(double heading)
    method NormalizeSignedAngle (line 98) | private static double NormalizeSignedAngle(double value)

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/CompassUavIndicator/CompassUavIndicator.cs
  class CompassUavIndicator (line 8) | public partial class CompassUavIndicator : TemplatedControl
    method CompassUavIndicator (line 10) | public CompassUavIndicator()
    method OnPropertyChanged (line 33) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...
    method UpdateCompass (line 43) | private void UpdateCompass()
    method NormalizeAngle (line 58) | private static double NormalizeAngle(double value)
    method NormalizeSignedAngle (line 69) | private static double NormalizeSignedAngle(double value)

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/CompassUavIndicator/CompassUavIndicator.properties.cs
  class CompassUavIndicator (line 6) | public partial class CompassUavIndicator

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/DeviceTelemetryDesignPreview.cs
  class DeviceTelemetryDesignPreview (line 5) | internal static class DeviceTelemetryDesignPreview
    method Unit (line 20) | public static IUnit Unit(string id) => UnitService.Units[id];
    method ConfigureUnits (line 22) | private static void ConfigureUnits()

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/AttitudeIndicator.cs
  class AttitudeIndicator (line 12) | public partial class AttitudeIndicator : TemplatedControl
    method AttitudeIndicator (line 29) | public AttitudeIndicator()
    method OnPropertyChanged (line 171) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...
    method UpdateColorX (line 212) | private static void UpdateColorX(AvaloniaObject source)
    method UpdateColorY (line 233) | private static void UpdateColorY(AvaloniaObject source)
    method UpdateColorZ (line 254) | private static void UpdateColorZ(AvaloniaObject source)
    method UpdateAngle (line 275) | private static void UpdateAngle(AvaloniaObject source)
    method UpdateRollAngle (line 290) | private static void UpdateRollAngle(AvaloniaObject source)
    method UpdateVelocityItems (line 305) | private static void UpdateVelocityItems(AvaloniaObject source)
    method UpdateAltitudeItems (line 318) | private static void UpdateAltitudeItems(AvaloniaObject source)
    method UpdateHeadingItems (line 331) | private static void UpdateHeadingItems(AvaloniaObject source)
    method UpdateHomeAzimuthPosition (line 349) | private static void UpdateHomeAzimuthPosition(AvaloniaObject source)
    method GetHomeAzimuthPosition (line 367) | private static double GetHomeAzimuthPosition(double? value, double hea...

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/AttitudeIndicator.properties.cs
  class AttitudeIndicator (line 8) | public partial class AttitudeIndicator

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Heading/HeadingScaleItem.cs
  class HeadingScaleItem (line 5) | public class HeadingScaleItem : ScaleItem
    method HeadingScaleItem (line 7) | public HeadingScaleItem(
    method GetTitle (line 17) | protected override string GetTitle(double value)

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Pitch/PitchItem.cs
  class PitchItem (line 6) | public partial class PitchItem : AvaloniaObject
    method PitchItem (line 10) | public PitchItem(
    method UpdateVisibility (line 35) | public void UpdateVisibility(double pitch)

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Pitch/PitchItem.properties.cs
  class PitchItem (line 5) | public partial class PitchItem

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Roll/RollItem.cs
  class RollItem (line 6) | public partial class RollItem : AvaloniaObject
    method RollItem (line 8) | public RollItem(int angle)

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Roll/RollItem.properties.cs
  class RollItem (line 5) | public partial class RollItem

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Scale/ScaleItem.cs
  class ScaleItem (line 6) | public partial class ScaleItem : AvaloniaObject
    method ScaleItem (line 8) | public ScaleItem(
    method UpdateValue (line 49) | public void UpdateValue(double value)
    method GetTitle (line 61) | protected virtual string? GetTitle(double value)
    method GetValue (line 66) | private double GetValue(double value)
    method GetPosition (line 71) | private double GetPosition(double value)

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Scale/ScaleItem.properties.cs
  class ScaleItem (line 5) | public partial class ScaleItem

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/RouteUavIndicator/RouteUavIndicator.cs
  class RouteUavIndicator (line 9) | [PseudoClasses(ProgressDisabledPseudoclass, ProgressCompletedPseudoclass)]
    method OnPropertyChanged (line 105) | protected override void OnPropertyChanged(AvaloniaPropertyChangedEvent...

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/AltitudeUavIndicator/AltitudeUavIndicator.axaml.cs
  class AltitudeUavIndicator (line 5) | public partial class AltitudeUavIndicator : UserControl
    method AltitudeUavIndicator (line 7) | public AltitudeUavIndicator()

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/AltitudeUavIndicator/AltitudeUavIndicatorViewModel.cs
  type AltitudeRttBoxData (line 11) | public record AltitudeRttBoxData(double AltitudeAgl, double AltitudeMsl,...
  class AltitudeUavIndicatorViewModel (line 14) | public class AltitudeUavIndicatorViewModel : TwoColumnRttBoxViewModel<Al...
    method AltitudeUavIndicatorViewModel (line 16) | [SetsRequiredMembers]
    method AltitudeUavIndicatorViewModel (line 30) | [SetsRequiredMembers]

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/AngleUavRttIndicator/AngleUavRttIndicator.axaml.cs
  class AngleUavRttIndicator (line 5) | public partial class AngleUavRttIndicator : UserControl
    method AngleUavRttIndicator (line 7) | public AngleUavRttIndicator()

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/AngleUavRttIndicator/AngleUavRttIndicatorViewModel.cs
  type AngleRttBoxData (line 11) | public record AngleRttBoxData(double Pitch, double Roll, IUnitItem Angle...
  class AngleUavRttIndicatorViewModel (line 14) | public class AngleUavRttIndicatorViewModel : TwoColumnRttBoxViewModel<An...
    method AngleUavRttIndicatorViewModel (line 16) | [SetsRequiredMembers]
    method AngleUavRttIndicatorViewModel (line 30) | [SetsRequiredMembers]

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/BatteryUavIndicator/BatteryUavIndicator.axaml.cs
  class BatteryUavIndicator (line 5) | public partial class BatteryUavIndicator : UserControl
    method BatteryUavIndicator (line 7) | public BatteryUavIndicator()

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/BatteryUavIndicator/BatteryUavIndicatorViewModel.cs
  type BatteryRttBoxData (line 11) | public record BatteryRttBoxData(
  class BatteryUavIndicatorViewModel (line 23) | public class BatteryUavIndicatorViewModel : KeyValueRttBoxViewModel<Batt...
    method BatteryUavIndicatorViewModel (line 27) | [SetsRequiredMembers]
    method BatteryUavIndicatorViewModel (line 46) | [SetsRequiredMembers]
    method ChangeBatteryStatus (line 113) | private void ChangeBatteryStatus(double percent)

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/HeadingUavIndicator/HeadingUavIndicator.axaml.cs
  class HeadingUavIndicator (line 5) | public partial class HeadingUavIndicator : UserControl
    method HeadingUavIndicator (line 7) | public HeadingUavIndicator()

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/HeadingUavIndicator/HeadingUavIndicatorViewModel.cs
  class HeadingUavIndicatorViewModel (line 9) | public class HeadingUavIndicatorViewModel : SplitDigitRttBoxViewModel
    method HeadingUavIndicatorViewModel (line 11) | public HeadingUavIndicatorViewModel()
    method HeadingUavIndicatorViewModel (line 23) | public HeadingUavIndicatorViewModel(

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/HomeAzimuthUavIndicator/HomeAzimuthUavIndicator.axaml.cs
  class HomeAzimuthUavIndicator (line 5) | public partial class HomeAzimuthUavIndicator : UserControl
    method HomeAzimuthUavIndicator (line 7) | public HomeAzimuthUavIndicator()

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/HomeAzimuthUavIndicator/HomeAzimuthUavIndicatorViewModel.cs
  class HomeAzimuthUavIndicatorViewModel (line 9) | public class HomeAzimuthUavIndicatorViewModel : SplitDigitRttBoxViewModel
    method HomeAzimuthUavIndicatorViewModel (line 11) | public HomeAzimuthUavIndicatorViewModel()
    method HomeAzimuthUavIndicatorViewModel (line 23) | public HomeAzimuthUavIndicatorViewModel(

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/VelocityUavIndicator/VelocityUavIndicator.axaml.cs
  class VelocityUavIndicator (line 5) | public partial class VelocityUavIndicator : UserControl
    method VelocityUavIndicator (line 7) | public VelocityUavIndicator()

FILE: src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/VelocityUavIndicator/VelocityUavIndicatorViewModel.cs
  class VelocityUavIndicatorViewModel (line 9) | public class VelocityUavIndicatorViewModel : SplitDigitRttBoxViewModel
    method VelocityUavIndicatorViewModel (line 11) | public VelocityUavIndicatorViewModel()
    method VelocityUavIndicatorViewModel (line 23) | public VelocityUavIndicatorViewModel(

FILE: src/Asv.Drones/Core/Converters/Crc32StatusToColorConverter.cs
  class Crc32StatusToColorConverter (line 11) | public class Crc32StatusToColorConverter : IValueConverter
    method Convert (line 13) | public object? Convert(object? value, Type targetType, object? paramet...
    method ConvertBack (line 29) | public object? ConvertBack(

FILE: src/Asv.Drones/Core/Services/ClientDeviceWidgetFactory/ClientDeviceWidgetFactory.cs
  class ClientDeviceWidgetFactory (line 8) | public class ClientDeviceWidgetFactory : IClientDeviceWidgetFactory
    method ClientDeviceWidgetFactory (line 12) | public ClientDeviceWidgetFactory(IEnumerable<IClientDeviceWidgetCreati...
    method CreateWidget (line 30) | public IFlightWidget? CreateWidget(in IClientDevice device)

FILE: src/Asv.Drones/Core/Services/Devices/Gnss/GnssDeviceManagerExtentsion.cs
  class GnssDeviceManagerExtension (line 10) | public class GnssDeviceManagerExtension : IDeviceManagerExtension
    method Configure (line 12) | public void Configure(IProtocolBuilder builder)
    method Configure (line 19) | public void Configure(IDeviceExplorerBuilder builder)
    method TryGetIcon (line 24) | public bool TryGetIcon(DeviceId id, out MaterialIconKind? icon)
    method TryGetDeviceBrush (line 36) | public bool TryGetDeviceBrush(DeviceId id, out AsvColorKind brush)
    method Run (line 42) | public void Run(IDeviceManager deviceManager)

FILE: src/Asv.Drones/Core/Services/Files/BusyFlag.cs
  class BusyFlag (line 6) | public sealed class BusyFlag : IDisposable
    method BusyFlag (line 14) | public BusyFlag()
    method Enter (line 25) | public IDisposable Enter()
    method Dispose (line 31) | public void Dispose() => _delta.OnCompleted();

FILE: src/Asv.Drones/Core/Services/Files/Local/LocalFilesService.cs
  class LocalFilesService (line 14) | public class LocalFilesService(IFileSystem? fileSystem = null)
    method LoadBrowserItems (line 18) | public IReadOnlyList<IBrowserItemViewModel> LoadBrowserItems(
    method ProcessBrowserDirectory (line 43) | private void ProcessBrowserDirectory(
    method RenameFile (line 133) | public string RenameFile(string oldPath, string newPath, ILogger? log ...
    method RenameDirectory (line 159) | public string RenameDirectory(string oldPath, string newPath, ILogger?...
    method CreateDirectory (line 184) | public void CreateDirectory(string path, ILogger? log = null)
    method RemoveFile (line 202) | public void RemoveFile(string path, ILogger? log = null)
    method RemoveDirectory (line 215) | public void RemoveDirectory(string path, bool recursive, ILogger? log ...
    method CalculateCrc32Async (line 228) | public async Task<uint> CalculateCrc32Async(

FILE: src/Asv.Drones/Core/Services/Files/PathHelper.cs
  class PathHelper (line 6) | public static class PathHelper
    method EncodePathToId (line 8) | public static NavigationId EncodePathToId(string path)

FILE: src/Asv.Drones/Core/Services/Files/ProgressWithLock.cs
  class ProgressWithLock (line 9) | public sealed class ProgressWithLock(ILoggerFactory? loggerFactory = nul...
    type TransferScope (line 31) | public readonly struct TransferScope : IDisposable
      method TransferScope (line 44) | internal TransferScope(ProgressWithLock owner, CancellationToken token)
      method Dispose (line 51) | public void Dispose()
    method BeginScope (line 62) | public TransferScope BeginScope(CancellationToken ct = default)
    method Complete (line 84) | public void Complete()
    method Report (line 104) | public void Report(double value)
    method TryCancel (line 127) | public bool TryCancel()
    method Dispose (line 149) | public void Dispose()

FILE: src/Asv.Drones/Core/Services/Files/Remote/FtpClientService.cs
  class FtpClientService (line 17) | public sealed class FtpClientService(
    method DownloadAsync (line 37) | public async Task DownloadAsync(
    method BurstDownloadAsync (line 67) | public async Task BurstDownloadAsync(
    method UploadAsync (line 97) | public async Task UploadAsync(
    method DownloadFileAsync (line 121) | private async Task DownloadFileAsync(
    method BurstDownloadFileAsync (line 143) | private async Task BurstDownloadFileAsync(
    method UploadFileAsync (line 165) | private async Task UploadFileAsync(
    method DownloadDirectoryAsync (line 189) | private async Task DownloadDirectoryAsync(
    method BurstDownloadDirectoryAsync (line 292) | private async Task BurstDownloadDirectoryAsync(
    method UploadDirectoryAsync (line 396) | private async Task UploadDirectoryAsync(
    method RemoveDirectoryAsync (line 502) | public async Task RemoveDirectoryAsync(
    method RemoveFileAsync (line 556) | public async Task RemoveFileAsync(string path, CancellationToken ct = ...
    method CreateDirectoryAsync (line 563) | public async Task CreateDirectoryAsync(string path, CancellationToken ...
    method CalculateCrc32Async (line 588) | public async Task<uint> CalculateCrc32Async(string filePath, Cancellat...
    method RenameAsync (line 604) | public async Task<string> RenameAsync(
    method Refresh (line 642) | public async Task<IReadOnlyObservableDictionary<string, IFtpEntry>> Re...
    method GetRemoteFileName (line 650) | private static string GetRemoteFileName(string path)
    method Dispose (line 661) | public void Dispose()

FILE: src/Asv.Drones/Core/Services/Files/Remote/RemoteEntriesSync.cs
  class RemoteEntriesSync (line 18) | public sealed class RemoteEntriesSync : IDisposable
    method RemoteEntriesSync (line 28) | public RemoteEntriesSync(
    method TrySyncMetadata (line 117) | private static void TrySyncMetadata(IBrowserItemViewModel vm, IFtpEntr...
    method Dispose (line 125) | public void Dispose()

FILE: src/Asv.Drones/RS.Designer.cs
  class RS (line 21) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
    method RS (line 30) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Contracts/FileBrowserBackend.cs
  class FileBrowserBackend (line 5) | public sealed class FileBrowserBackend(LocalFilesService local, FtpClien...
    method ResolveOps (line 10) | public IBrowserItemsOperations ResolveOps(FtpBrowserSourceType type)

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Contracts/IBrowserItemsOperations.cs
  type IBrowserItemsOperations (line 7) | public interface IBrowserItemsOperations
    method RenameFileAsync (line 11) | ValueTask<string> RenameFileAsync(
    method RenameDirectoryAsync (line 17) | ValueTask<string> RenameDirectoryAsync(
    method RemoveDirectoryAsync (line 23) | ValueTask RemoveDirectoryAsync(string path, ILogger logger, Cancellati...
    method RemoveFileAsync (line 24) | ValueTask RemoveFileAsync(string path, ILogger logger, CancellationTok...
    method CreateDirectoryAsync (line 25) | ValueTask CreateDirectoryAsync(string path, ILogger logger, Cancellati...
    method CalculateCrc32Async (line 26) | ValueTask<uint> CalculateCrc32Async(string path, ILogger logger, Cance...

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Contracts/LocalBrowserItemsOperations.cs
  class LocalBrowserItemsOperations (line 9) | public sealed class LocalBrowserItemsOperations(LocalFilesService local)...
    method RenameDirectoryAsync (line 16) | public ValueTask<string> RenameDirectoryAsync(
    method RenameFileAsync (line 27) | public ValueTask<string> RenameFileAsync(
    method RemoveDirectoryAsync (line 38) | public ValueTask RemoveDirectoryAsync(string path, ILogger logger, Can...
    method RemoveFileAsync (line 45) | public ValueTask RemoveFileAsync(string path, ILogger logger, Cancella...
    method CreateDirectoryAsync (line 52) | public ValueTask CreateDirectoryAsync(string path, ILogger logger, Can...
    method CalculateCrc32Async (line 58) | public async ValueTask<uint> CalculateCrc32Async(

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Contracts/RemoteBrowserItemsOperations.cs
  class RemoteBrowserItemsOperations (line 9) | public sealed class RemoteBrowserItemsOperations(FtpClientService ftp) :...
    method RenameDirectoryAsync (line 15) | public async ValueTask<string> RenameDirectoryAsync(
    method RenameFileAsync (line 25) | public async ValueTask<string> RenameFileAsync(
    method RemoveDirectoryAsync (line 35) | public async ValueTask RemoveDirectoryAsync(string path, ILogger logge...
    method RemoveFileAsync (line 40) | public async ValueTask RemoveFileAsync(string path, ILogger logger, Ca...
    method CreateDirectoryAsync (line 45) | public async ValueTask CreateDirectoryAsync(string path, ILogger logge...
    method CalculateCrc32Async (line 50) | public async ValueTask<uint> CalculateCrc32Async(

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Dialogs/BurstDownloadDialogView.axaml.cs
  class BurstDownloadDialogView (line 6) | public partial class BurstDownloadDialogView : UserControl
    method BurstDownloadDialogView (line 8) | public BurstDownloadDialogView()

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Dialogs/BurstDownloadDialogViewModel.cs
  class BurstDownloadDialogViewModel (line 10) | public class BurstDownloadDialogViewModel : DialogViewModelBase
    method BurstDownloadDialogViewModel (line 14) | public BurstDownloadDialogViewModel()
    method BurstDownloadDialogViewModel (line 20) | public BurstDownloadDialogViewModel(ILoggerFactory loggerFactory)
    method ApplyDialog (line 48) | public override void ApplyDialog(ContentDialog dialog)
    method GetChildren (line 54) | public override IEnumerable<IRoutable> GetChildren()
    method Dispose (line 61) | protected override void Dispose(bool disposing)

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/FileBrowserView.axaml.cs
  class FileBrowserViewConfig (line 12) | public class FileBrowserViewConfig : IGridColumnLayoutConfig
  class FileBrowserView (line 18) | public partial class FileBrowserView : UserControl
    method FileBrowserView (line 27) | public FileBrowserView()
    method FileBrowserView (line 33) | public FileBrowserView(ILayoutService layoutService)
    method OnAttachedToVisualTree (line 39) | protected override void OnAttachedToVisualTree(VisualTreeAttachmentEve...
    method GridSplitter_Dragged (line 45) | private void GridSplitter_Dragged(object? sender, VectorEventArgs e)
    method LoadLayout (line 60) | private void LoadLayout()
    method SaveLayout (line 118) | private void SaveLayout()
    method TreeView_OnPointerPressed (line 178) | private void TreeView_OnPointerPressed(object? sender, PointerPressedE...
    method IsInsideTreeViewItem (line 200) | private static bool IsInsideTreeViewItem(IInputElement? hit)
  class TreeViewBehaviors (line 212) | public static class TreeViewBehaviors
    method TreeViewBehaviors (line 217) | static TreeViewBehaviors()
    method SetIgnoreEnter (line 222) | public static void SetIgnoreEnter(TreeView element, bool value) =>
    method GetIgnoreEnter (line 225) | public static bool GetIgnoreEnter(TreeView element) => element.GetValu...
    method OnIgnoreEnterChanged (line 227) | private static void OnIgnoreEnterChanged(TreeView tree, AvaloniaProper...
    method OnTreeKeyDown (line 240) | private static void OnTreeKeyDown(object? sender, KeyEventArgs e)

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/FileBrowserViewModel.cs
  class FileBrowserViewModelConfig (line 26) | public sealed class FileBrowserViewModelConfig
  class FileBrowserViewModel (line 38) | public class FileBrowserViewModel
    method FileBrowserViewModel (line 66) | public FileBrowserViewModel()
    method FileBrowserViewModel (line 180) | public FileBrowserViewModel(
    method InitCommands (line 385) | private void InitCommands()
    method UploadImpl (line 504) | private async Task UploadImpl(BrowserNode item, CancellationToken ct)
    method DownloadImpl (line 565) | private async ValueTask DownloadImpl(BrowserNode item, CancellationTok...
    method BurstDownloadImpl (line 628) | private async ValueTask BurstDownloadImpl(BrowserNode item, Cancellati...
    method RemoveItemImpl (line 686) | private async ValueTask RemoveItemImpl(BrowserNode item, CancellationT...
    method CreateFolderImpl (line 703) | private static async ValueTask CreateFolderImpl(
    method RefreshRemoteImpl (line 711) | private async Task RefreshRemoteImpl(CancellationToken ct)
    method RefreshLocalImpl (line 769) | private ValueTask RefreshLocalImpl(Unit arg, CancellationToken ct)
    method SetEditModeImpl (line 816) | private ValueTask SetEditModeImpl(BrowserNode? node, CancellationToken...
    method CalculateCrc32Impl (line 831) | private static async ValueTask CalculateCrc32Impl(BrowserNode item, Ca...
    method CompareSelectedItemsImpl (line 841) | private async ValueTask CompareSelectedItemsImpl(CancellationToken ct)
    method FindFileOnLocal (line 882) | public void FindFileOnLocal()
    method UploadItem (line 908) | public async ValueTask UploadItem(
    method DownloadItem (line 938) | public async ValueTask DownloadItem(
    method BurstDownloadItem (line 969) | public async ValueTask BurstDownloadItem(
    method Refresh (line 1001) | public void Refresh()
    method PerformLocalSearch (line 1009) | private Task PerformLocalSearch(
    method PerformRemoteSearch (line 1019) | private Task PerformRemoteSearch(
    method PerformSearch (line 1029) | private static void PerformSearch(
    method ExpandParents (line 1054) | private static void ExpandParents(BrowserNode node)
    method RemoteEntryToBrowserItem (line 1074) | private IBrowserItemViewModel RemoteEntryToBrowserItem(string key, IFt...
    method InternalCatchEvent (line 1129) | private ValueTask InternalCatchEvent(IRoutable src, AsyncRoutedEvent<I...
    method GetChildren (line 1223) | public override IEnumerable<IRoutable> GetChildren()
    method AfterLoadExtensions (line 1239) | protected override void AfterLoadExtensions() { }
    method Dispose (line 1245) | protected override void Dispose(bool disposing)
    method AfterDeviceInitialized (line 1258) | protected override void AfterDeviceInitialized(

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/HomePageFileBrowserDeviceItemAction.cs
  class HomePageFileBrowserDeviceItemAction (line 9) | public class HomePageFileBrowserDeviceItemAction(ILoggerFactory loggerFa...
    method TryCreateAction (line 12) | protected override IActionViewModel? TryCreateAction(

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/IO/FileSize.cs
  type FileSize (line 5) | public readonly struct FileSize(long size) : IEquatable<FileSize>
    method ToString (line 14) | public override string ToString()
    method CompareTo (line 46) | public int CompareTo(FileSize other)
    method Equals (line 51) | public bool Equals(FileSize other)
    method Equals (line 56) | public override bool Equals(object? obj)
    method GetHashCode (line 71) | public override int GetHashCode()

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/IO/FtpBrowserNamingPolicy.cs
  class FtpBrowserNamingPolicy (line 10) | public static partial class FtpBrowserNamingPolicy
    method AllowedCharsRegex (line 22) | [GeneratedRegex(AllowedCharsPattern, RegexOptions.Compiled)]
    method AllowedNameRegex (line 25) | [GeneratedRegex(AllowedNamePattern, RegexOptions.Compiled)]
    method SanitizeForDisplay (line 28) | public static string SanitizeForDisplay(string? value)
    method Validate (line 44) | public static ValidationResult Validate(string name)

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/IO/FtpBrowserPath.cs
  class FtpBrowserPath (line 6) | public static class FtpBrowserPath
    method Normalize (line 16) | public static string Normalize(string path, bool isDirectory, char sep...
    method CombineDir (line 26) | public static string CombineDir(string parentDir, string name, char se...
    method CombineFile (line 36) | public static string CombineFile(string parentDir, string name, char s...
    method ParentDirOf (line 47) | public static string ParentDirOf(string path, char sep)
    method NameOf (line 72) | public static string NameOf(string? path, char sep)
    method EnsureDir (line 92) | private static string EnsureDir(string path, char sep)
    method EnsureFile (line 105) | private static string EnsureFile(string path, char sep)

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/IO/Types/Crc32Status.cs
  type Crc32Status (line 3) | public enum Crc32Status

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/IO/Types/FtpBrowserSourceType.cs
  type FtpBrowserSourceType (line 3) | public enum FtpBrowserSourceType

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/BrowserNode.cs
  class BrowserNode (line 8) | public class BrowserNode(

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/BrowserTree.cs
  class BrowserTree (line 6) | public class BrowserTree(IReadOnlyObservableList<IBrowserItemViewModel> ...

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/Items/BrowserItemComparer.cs
  class BrowserItemComparer (line 5) | public sealed class BrowserItemComparer : IComparer<IBrowserItemViewModel>
    method BrowserItemComparer (line 9) | private BrowserItemComparer() { }
    method Compare (line 11) | public int Compare(IBrowserItemViewModel? x, IBrowserItemViewModel? y)
  class DirectoryItemComparer (line 34) | public sealed class DirectoryItemComparer : IComparer<DirectoryItemViewM...
    method DirectoryItemComparer (line 38) | private DirectoryItemComparer() { }
    method Compare (line 40) | public int Compare(DirectoryItemViewModel? x, DirectoryItemViewModel? y)
  class FileItemComparer (line 60) | public sealed class FileItemComparer : IComparer<FileItemViewModel>
    method FileItemComparer (line 64) | private FileItemComparer() { }
    method Compare (line 66) | public int Compare(FileItemViewModel? x, FileItemViewModel? y)

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/Items/BrowserItemViewModel.cs
  class BrowserItemViewModel (line 13) | public abstract class BrowserItemViewModel : RoutableViewModel, IBrowser...
    method BrowserItemViewModel (line 23) | protected BrowserItemViewModel(
    method RenameAsync (line 144) | public abstract ValueTask<string> RenameAsync(
    method RemoveAsync (line 150) | public abstract ValueTask RemoveAsync(CancellationToken ct);
    method CalculateCrc32Async (line 152) | public abstract ValueTask<uint> CalculateCrc32Async(CancellationToken ...
    method CreateDirectoryAsync (line 153) | public abstract ValueTask CreateDirectoryAsync(CancellationToken ct);
    method CommitRenameImpl (line 155) | private async ValueTask CommitRenameImpl(CancellationToken ct)
    method AttachBackend (line 194) | public void AttachBackend(FileBrowserBackend backend)
    method GetChildren (line 199) | public override IEnumerable<IRoutable> GetChildren()

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/Items/DirectoryItemViewModel.cs
  class DirectoryItemViewModelConfig (line 10) | public class DirectoryItemViewModelConfig
  class DirectoryItemViewModel (line 15) | public class DirectoryItemViewModel : BrowserItemViewModel
    method DirectoryItemViewModel (line 17) | public DirectoryItemViewModel(
    method RenameAsync (line 34) | public override async ValueTask<string> RenameAsync(
    method RemoveAsync (line 56) | public override async ValueTask RemoveAsync(CancellationToken ct)
    method CalculateCrc32Async (line 61) | public override ValueTask<uint> CalculateCrc32Async(CancellationToken ct)
    method CreateDirectoryAsync (line 67) | public override async ValueTask CreateDirectoryAsync(CancellationToken...

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/Items/FileItemViewModel.cs
  class FileItemViewModel (line 10) | public class FileItemViewModel : BrowserItemViewModel
    method FileItemViewModel (line 12) | public FileItemViewModel(
    method Crc32ToHex (line 46) | private static string Crc32ToHex(uint crc32) => crc32.ToString("X8");
    method RenameAsync (line 48) | public override async ValueTask<string> RenameAsync(
    method RemoveAsync (line 70) | public override async ValueTask RemoveAsync(CancellationToken ct)
    method CalculateCrc32Async (line 75) | public override async ValueTask<uint> CalculateCrc32Async(Cancellation...
    method CreateDirectoryAsync (line 83) | public override async ValueTask CreateDirectoryAsync(CancellationToken...

FILE: src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/Items/IBrowserItemViewModel.cs
  type IBrowserItemViewModel (line 10) | public interface IBrowserItemViewModel : ISupportRename, ISupportRemove
    method AttachBackend (line 27) | void AttachBackend(FileBrowserBackend backend);
    method CreateDirectoryAsync (line 29) | ValueTask CreateDirectoryAsync(CancellationToken ct);
    method CalculateCrc32Async (line 30) | ValueTask<uint> CalculateCrc32Async(CancellationToken ct);

FILE: src/Asv.Drones/Shell/Pages/Device/MavParams/Dialog/TryCloseWithApprovalDialogView.axaml.cs
  class TryCloseWithApprovalDialogView (line 6) | public partial class TryCloseWithApprovalDialogView : UserControl
    method TryCloseWithApprovalDialogView (line 8) | public TryCloseWithApprovalDialogView()

FILE: src/Asv.Drones/Shell/Pages/Device/MavParams/Dialog/TryCloseWithApprovalDialogViewModel.cs
  class TryCloseWithApprovalDialogViewModel (line 7) | public class TryCloseWithApprovalDialogViewModel : DialogViewModelBase
    method TryCloseWithApprovalDialogViewModel (line 11) | public TryCloseWithApprovalDialogViewModel()
    method TryCloseWithApprovalDialogViewModel (line 17) | public TryCloseWithApprovalDialogViewModel(ILoggerFactory loggerFactory)
    method GetChildren (line 25) | public override IEnumerable<IRoutable> GetChildren()

FILE: src/Asv.Drones/Shell/Pages/Device/MavParams/HomePageParamsDeviceItemAction.cs
  class HomePageParamsDeviceItemAction (line 10) | public class HomePageParamsDeviceItemAction(ILoggerFactory loggerFactory...
    method TryCreateAction (line 12) | protected override IActionViewModel? TryCreateAction(

FILE: src/Asv.Drones/Shell/Pages/Device/MavParams/MavParamsPageView.axaml.cs
  class MavParamsPageViewConfig (line 12) | public class MavParamsPageViewConfig : IGridColumnLayoutConfig
  class MavParamsPageView (line 18) | public partial class MavParamsPageView : UserControl
    method MavParamsPageView (line 27) | public MavParamsPageView()
    method MavParamsPageView (line 33) | public MavParamsPageView(ILayoutService layoutService)
    method OnAttachedToVisualTree (line 39) | protected override void OnAttachedToVisualTree(VisualTreeAttachmentEve...
    method GridSplitter_Dragged (line 45) | private void GridSplitter_Dragged(object? sender, VectorEventArgs e)
    method LoadLayout (line 60) | private void LoadLayout()
    method SaveLayout (line 118) | private void SaveLayout()
    method ItemDockPanel_DoubleTapped (line 178) | private void ItemDockPanel_DoubleTapped(object? sender, RoutedEventArg...
    method Button_DoubleTapped (line 201) | private void Button_DoubleTapped(object? sender, RoutedEventArgs e)

FILE: src/Asv.Drones/Shell/Pages/Device/MavParams/MavParamsPageViewModel.cs
  class MavParamsPageViewModelConfig (line 24) | public sealed class MavParamsPageViewModelConfig
  class MavParamsPageViewModel (line 32) | public class MavParamsPageViewModel
    method MavParamsPageViewModel (line 56) | public MavParamsPageViewModel()
    method MavParamsPageViewModel (line 80) | public MavParamsPageViewModel(
    method UpdateImpl (line 204) | private Task UpdateImpl(string? query, IProgress<double> progress, Can...
    method UpdateFilter (line 210) | private void UpdateFilter()
    method InternalInit (line 223) | private void InternalInit(CancellationToken cancel)
    method StopUpdateParamsImpl (line 282) | internal void StopUpdateParamsImpl()
    method UpdateParamsImpl (line 300) | internal async Task UpdateParamsImpl(CancellationToken cancel = default)
    method AfterDeviceInitialized (line 343) | protected override void AfterDeviceInitialized(IClientDevice device, C...
    method GetChildren (line 378) | public override IEnumerable<IRoutable> GetChildren()
    method AfterLoadExtensions (line 392) | protected override void AfterLoadExtensions() { }
    method InternalCatchEvent (line 394) | private async ValueTask InternalCatchEvent(IRoutable src, AsyncRoutedE...
    method UpdateViewedItems (line 478) | private void UpdateViewedItems(ParamItemViewModel param)
    method TryCloseWithApproval (line 496) | private async Task<bool> TryCloseWithApproval(CancellationToken cancel...
  class ParamsKvpComparer (line 535) | file class ParamsKvpComparer : IComparer<KeyValuePair<string, ParamItem>>
    method Compare (line 539) | public int Compare(KeyValuePair<string, ParamItem> x, KeyValuePair<str...

FILE: src/Asv.Drones/Shell/Pages/Device/MavParams/ParamItem/ParamItemView.axaml.cs
  class ParamItemView (line 6) | public partial class ParamItemView : UserControl
    method ParamItemView (line 8) | public ParamItemView()

FILE: src/Asv.Drones/Shell/Pages/Device/MavParams/ParamItem/ParamItemViewModel.cs
  class ParamItemViewModelConfig (line 17) | public class ParamItemViewModelConfig
  class ParamItemViewModel (line 24) | public class ParamItemViewModel : RoutableViewModel
    method ParamItemViewModel (line 31) | public ParamItemViewModel()
    method ParamItemViewModel (line 43) | public ParamItemViewModel(
    method Filter (line 306) | public bool Filter(string? searchText, bool starredOnly)
    method GetChildren (line 324) | public override IEnumerable<IRoutable> GetChildren()
    method Dispose (line 337) | protected override void Dispose(bool disposing)
    method InternalCatchEvent (line 360) | private ValueTask InternalCatchEvent(IRoutable src, AsyncRoutedEvent<I...

FILE: src/Asv.Drones/Shell/Pages/Device/MavParams/ParamItem/RoutedEvents/ParamItemChangedEvent.cs
  class ParamItemChangedEvent (line 11) | public sealed class ParamItemChangedEvent(IRoutable source, object track...

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/DefaultSetupExtension.cs
  class DefaultSetupExtension (line 10) | public class DefaultSetupExtension(
    method Extend (line 14) | public void Extend(ISetupPage context, CompositeDisposable contextDisp...

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/HomePageSetupDeviceItemAction.cs
  class HomePageSetupDeviceItemAction (line 8) | public class HomePageSetupDeviceItemAction(ILoggerFactory loggerFactory)...
    method TryCreateAction (line 10) | protected override IActionViewModel? TryCreateAction(

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/SetupMixin.cs
  class SetupMixin (line 10) | public static class SetupMixin
    method extension (line 12) | extension(AsvDronesMixin.Builder builder)
    method extension (line 23) | extension(ShellMixin.PageBuilder builder)
  class Builder (line 28) | public class Builder(IHostApplicationBuilder builder)
    method UseDefault (line 30) | public Builder UseDefault()
    method UseFrameTypeSubPage (line 42) | public Builder UseFrameTypeSubPage()
    method UseMotorSubPage (line 50) | public Builder UseMotorSubPage()
    method AddSubPage (line 58) | public Builder AddSubPage<TViewModel, TView>(string pageId)
    method AddSubPage (line 67) | public Builder AddSubPage<TViewModel, TView, TTreeMenu>(string pageId)

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/SetupPageView.axaml.cs
  class SetupPageView (line 6) | public partial class SetupPageView : UserControl
    method SetupPageView (line 8) | public SetupPageView()

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/SetupPageViewModel.cs
  class SetupPageViewModel (line 12) | public class SetupPageViewModel : TreeDevicePageViewModel<ISetupPage, IS...
    method SetupPageViewModel (line 17) | public SetupPageViewModel(
    method AfterDeviceInitialized (line 31) | protected override void AfterDeviceInitialized(

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/DroneFrameItem/DroneFrameItemView.axaml.cs
  class DroneFrameItemView (line 6) | public partial class DroneFrameItemView : UserControl
    method DroneFrameItemView (line 8) | public DroneFrameItemView()

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/DroneFrameItem/DroneFrameItemViewModel.cs
  class DroneFrameItemViewModel (line 14) | public sealed class DroneFrameItemViewModel : RoutableViewModel
    method DroneFrameItemViewModel (line 18) | public DroneFrameItemViewModel()
    method DroneFrameItemViewModel (line 33) | public DroneFrameItemViewModel(IDroneFrame model, ILoggerFactory logge...
    method Filter (line 54) | public bool Filter(string? searchText)
    method GetChildren (line 64) | public override IEnumerable<IRoutable> GetChildren()

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/DroneFrameItem/NullDroneFrame.cs
  class NullDroneFrame (line 6) | public class NullDroneFrame : IDroneFrame

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/DroneFrameItem/RoutedEvents/CurrentDroneFrameChangeEvent.cs
  class CurrentDroneFrameChangeEvent (line 11) | public sealed class CurrentDroneFrameChangeEvent(DroneFrameItemViewModel...

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/FrameTypeSetupPageExtension.cs
  class FrameTypeSetupPageExtension (line 14) | public class FrameTypeSetupPageExtension(ILoggerFactory loggerFactory) :...
    method Extend (line 16) | public void Extend(ISetupPage context, CompositeDisposable contextDisp...

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/SetupFrameTypeView.axaml.cs
  class SetupFrameTypeView (line 6) | public partial class SetupFrameTypeView : UserControl
    method SetupFrameTypeView (line 8) | public SetupFrameTypeView()

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/SetupFrameTypeViewModel.cs
  class SetupFrameTypeViewModel (line 21) | public sealed class SetupFrameTypeViewModel : SetupSubpage
    method SetupFrameTypeViewModel (line 41) | public SetupFrameTypeViewModel()
    method SetupFrameTypeViewModel (line 72) | public SetupFrameTypeViewModel(ILoggerFactory loggerFactory, IDialogSe...
    method Init (line 128) | public override ValueTask Init(ISetupPage context)
    method GetChildren (line 179) | public override IEnumerable<IRoutable> GetChildren()
    method ChangeFrameType (line 197) | internal async Task ChangeFrameType(string frameId, CancellationToken ...
    method InternalCatchEvent (line 237) | private async ValueTask InternalCatchEvent(IRoutable src, AsyncRoutedE...
    method UpdateImpl (line 254) | private Task UpdateImpl(string? query, IProgress<double> progress, Can...
    method Refresh (line 267) | private async ValueTask Refresh(Unit unit, CancellationToken cancel = ...

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/MotorItem/MotorItemView.axaml.cs
  class MotorItemView (line 6) | public partial class MotorItemView : UserControl
    method MotorItemView (line 8) | public MotorItemView()

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/MotorItem/MotorItemViewModel.cs
  class MotorItemViewModel (line 14) | public sealed class MotorItemViewModel : RoutableViewModel
    method MotorItemViewModel (line 21) | public MotorItemViewModel()
    method MotorItemViewModel (line 32) | public MotorItemViewModel(
    method GetChildren (line 89) | public override IEnumerable<IRoutable> GetChildren()
    method RunMotorTest (line 94) | private async Task RunMotorTest(ITestMotor motor, CancellationToken cts)

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/MotorsSetupPageExtension.cs
  class MotorsSetupPageExtension (line 12) | public class MotorsSetupPageExtension(ILoggerFactory loggerFactory) : IE...
    method Extend (line 14) | public void Extend(ISetupPage context, CompositeDisposable contextDisp...

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/SetupMotorsView.axaml.cs
  class SetupMotorsView (line 6) | public partial class SetupMotorsView : UserControl
    method SetupMotorsView (line 8) | public SetupMotorsView()

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/SetupMotorsViewModel.cs
  class SetupMotorsViewModel (line 18) | public sealed class SetupMotorsViewModel : SetupSubpage
    method SetupMotorsViewModel (line 31) | public SetupMotorsViewModel()
    method SetupMotorsViewModel (line 34) | public SetupMotorsViewModel(ILoggerFactory loggerFactory, IUnitService...
    method Init (line 76) | public override ValueTask Init(ISetupPage context)
    method GetChildren (line 101) | public override IEnumerable<IRoutable> GetChildren()

FILE: src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/SetupSubpage.cs
  class SetupSubpage (line 7) | public abstract class SetupSubpage : TreeSubpage<ISetupPage>, ISetupSubpage
    method SetupSubpage (line 9) | protected SetupSubpage(NavigationId id, ILoggerFactory loggerFactory)

FILE: src/Asv.Drones/Shell/Pages/Flight/Anchors/FlightUavAnchorsExtension.cs
  class FlightUavAnchorsExtension (line 13) | public class FlightUavAnchorsExtension(IDeviceManager conn, ILoggerFacto...
    method Extend (line 16) | public void Extend(IFlightMode context, CompositeDisposable contextDis...
    method TryCreateAnchor (line 26) | private UavAnchor? TryCreateAnchor(IClientDevice device)
    method RemoveAnchor (line 32) | private static bool RemoveAnchor(IClientDevice dev, UavAnchor anchor)

FILE: src/Asv.Drones/Shell/Pages/Flight/Anchors/MissionAnchor.cs
  class MissionAnchor (line 10) | public class MissionAnchor : MapAnchor<MissionAnchor>
    method MissionAnchor (line 12) | public MissionAnchor(int index, GeoPoint current, GeoPoint next, ILogg...
    method MissionAnchor (line 26) | public MissionAnchor(int index, GeoPoint current, ILoggerFactory logge...

FILE: src/Asv.Drones/Shell/Pages/Flight/Anchors/UavAnchor.cs
  class UavAnchor (line 15) | public class UavAnchor : MapAnchor<UavAnchor>
    method UavAnchor (line 21) | public UavAnchor()
    method UavAnchor (line 27) | public UavAnchor(

FILE: src/Asv.Drones/Shell/Pages/Flight/FlightPageView.axaml.cs
  class FlightPageViewConfig (line 7) | public sealed class FlightPageViewConfig
  class FlightPageView (line 16) | public partial class FlightPageView : UserControl
    method FlightPageView (line 22) | public FlightPageView()
    method FlightPageView (line 28) | public FlightPageView(ILayoutService layoutService)
    method WorkspacePanel_OnAttachedToVisualTree (line 34) | private void WorkspacePanel_OnAttachedToVisualTree(
    method OnWorkspaceChanged (line 48) | private void OnWorkspaceChanged(object? sender, WorkspaceEventArgs wor...
    method LoadLayout (line 58) | private void LoadLayout()
    method SaveLayout (line 93) | private void SaveLayout(WorkspaceEventArgs workspaceEventArgs)

FILE: src/Asv.Drones/Shell/Pages/Flight/FlightPageViewModel.cs
  class FlightPageViewModelConfig (line 15) | public sealed class FlightPageViewModelConfig
  class FlightPageViewModel (line 22) | public class FlightPageViewModel : PageViewModel<IFlightMode>, IFlightMode
    method FlightPageViewModel (line 29) | public FlightPageViewModel()
    method FlightPageViewModel (line 58) | public FlightPageViewModel(
    method GetChildren (line 85) | public override IEnumerable<IRoutable> GetChildren()
    method InternalCatchEvent (line 95) | private ValueTask InternalCatchEvent(IRoutable src, AsyncRoutedEvent<I...
    method AfterLoadExtensions (line 138) | protected override void AfterLoadExtensions()

FILE: src/Asv.Drones/Shell/Pages/Flight/HomePageFlightExtension.cs
  class HomePageFlightExtension (line 8) | public class HomePageFlightExtension(ILoggerFactory loggerFactory) : IEx...
    method Extend (line 10) | public void Extend(IHomePage context, CompositeDisposable contextDispose)

FILE: src/Asv.Drones/Shell/Pages/Flight/Widgets/FlightWidgetsExtension.cs
  class FlightWidgetsExtension (line 13) | public class FlightWidgetsExtension(
    method Extend (line 20) | public void Extend(IFlightMode context, CompositeDisposable contextDis...
    method TryCreateWidget (line 26) | private UavWidgetViewModel? TryCreateWidget(IClientDevice device)
    method RemoveWidget (line 43) | private bool RemoveWidget(IClientDevice model, UavWidgetViewModel vm)

FILE: src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/Dialogs/SetAltitudeDialogView.axaml.cs
  class SetAltitudeDialogView (line 6) | public partial class SetAltitudeDialogView : UserControl
    method SetAltitudeDialogView (line 8) | public SetAltitudeDialogView()

FILE: src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/Dialogs/SetAltitudeDialogViewModel.cs
  class SetAltitudeDialogViewModel (line 11) | public class SetAltitudeDialogViewModel : DialogViewModelBase
    method SetAltitudeDialogViewModel (line 15) | public SetAltitudeDialogViewModel()
    method SetAltitudeDialogViewModel (line 24) | public SetAltitudeDialogViewModel(IUnit unit, ILoggerFactory loggerFac...
    method ApplyDialog (line 51) | public override void ApplyDialog(ContentDialog dialog)
    method GetChildren (line 56) | public override IEnumerable<IRoutable> GetChildren()
    method Dispose (line 68) | protected override void Dispose(bool disposing)

FILE: src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/MissionProgress/MissionProgressView.axaml.cs
  class MissionProgressView (line 5) | public partial class MissionProgressView : UserControl
    method MissionProgressView (line 7) | public MissionProgressView()

FILE: src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/MissionProgress/MissionProgressViewModel.cs
  class MissionProgressViewModel (line 17) | public class MissionProgressViewModel : RoutableViewModel
    method MissionProgressViewModel (line 31) | public MissionProgressViewModel()
    method MissionProgressViewModel (line 121) | public MissionProgressViewModel(
    method GetChildren (line 381) | public override IEnumerable<IRoutable> GetChildren()
    method InitiateMissionPoints (line 389) | internal async Task InitiateMissionPoints(CancellationToken cancel)
    method DownloadMissionsImpl (line 394) | private async ValueTask DownloadMissionsImpl(CancellationToken cancel)
    method CalculateMissionProgress (line 425) | private void CalculateMissionProgress()
    method CalculateMissionFlightTime (line 444) | private string CalculateMissionFlightTime(double time)
    method CalculatePathProgressValue (line 461) | private double CalculatePathProgressValue(double missionDistance, doub...

FILE: src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/UavWidgetView.axaml.cs
  class UavWidgetView (line 6) | public partial class UavWidgetView : UserControl
    method UavWidgetView (line 8) | public UavWidgetView()

FILE: src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/UavWidgetViewModel.cs
  class UavWidgetViewModel (line 18) | public class UavWidgetViewModel : MapWidget, IUavFlightWidget
    type BatteryRttBoxData (line 36) | private record BatteryRttBoxData(
    type AltitudeRttBoxData (line 47) | private record AltitudeRttBoxData(
    type GnssRttBoxData (line 53) | private record GnssRttBoxData(
    method UavWidgetViewModel (line 61) | public UavWidgetViewModel()
    method UavWidgetViewModel (line 356) | public UavWidgetViewModel(
    method GetChildren (line 761) | public override IEnumerable<IRoutable> GetChildren()
    method ChangeBatteryStatus (line 773) | private void ChangeBatteryStatus(double percent)
    method ChangeLinkStatus (line 785) | private void ChangeLinkStatus(LinkState state)
    method CheckSpeedAltitude (line 796) | private void CheckSpeedAltitude(double alt, double gs)
    method ChangeGnssStatus (line 812) | private void ChangeGnssStatus(int satellitesCount, Mavlink.Common.GpsF...
    method GpsFixTypeToString (line 841) | private string GpsFixTypeToString(Mavlink.Common.GpsFixType type)

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Anchors/FlightModeAnchorsExtension.cs
  class FlightModeAnchorsExtension (line 13) | public class FlightModeAnchorsExtension(IDeviceManager conn, ILoggerFact...
    method Extend (line 16) | public void Extend(IFlightModePage context, CompositeDisposable contex...
    method TryCreateAnchor (line 26) | private UavAnchor? TryCreateAnchor(IClientDevice device)
    method RemoveAnchor (line 32) | private static bool RemoveAnchor(IClientDevice dev, UavAnchor anchor)

FILE: src/Asv.Drones/Shell/Pages/FlightMode/FlightModePageView.axaml.cs
  class FlightModePageViewConfig (line 7) | public sealed class FlightModePageViewConfig
  class FlightModePageView (line 16) | public partial class FlightModePageView : UserControl
    method FlightModePageView (line 22) | public FlightModePageView()
    method FlightModePageView (line 28) | public FlightModePageView(ILayoutService layoutService)
    method WorkspacePanel_OnAttachedToVisualTree (line 34) | private void WorkspacePanel_OnAttachedToVisualTree(
    method OnWorkspaceChanged (line 48) | private void OnWorkspaceChanged(object? sender, WorkspaceEventArgs wor...
    method LoadLayout (line 58) | private void LoadLayout()
    method SaveLayout (line 93) | private void SaveLayout(WorkspaceEventArgs workspaceEventArgs)

FILE: src/Asv.Drones/Shell/Pages/FlightMode/FlightModePageViewModel.cs
  class FlightModePageViewModelConfig (line 16) | public sealed class FlightModePageViewModelConfig
  class FlightModePageViewModel (line 22) | public class FlightModePageViewModel : PageViewModel<IFlightModePage>, I...
    method FlightModePageViewModel (line 29) | public FlightModePageViewModel()
    method FlightModePageViewModel (line 38) | public FlightModePageViewModel(
    method GetChildren (line 72) | public override IEnumerable<IRoutable> GetChildren()
    method InternalCatchEvent (line 82) | private ValueTask InternalCatchEvent(IRoutable src, AsyncRoutedEvent<I...
    method AfterLoadExtensions (line 123) | protected override void AfterLoadExtensions()

FILE: src/Asv.Drones/Shell/Pages/FlightMode/HomePageFlightModeExtension.cs
  class HomePageFlightModeExtension (line 8) | public class HomePageFlightModeExtension(ILoggerFactory loggerFactory) :...
    method Extend (line 10) | public void Extend(IHomePage context, CompositeDisposable contextDispose)

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/FlightModeClientDeviceWidgetExtension.cs
  class FlightModeClientDeviceWidgetExtension (line 11) | public class FlightModeClientDeviceWidgetExtension(
    method Extend (line 16) | public void Extend(IFlightModePage context, CompositeDisposable contex...
    method TryCreateWidget (line 26) | private IFlightWidget? TryCreateWidget(IClientDevice device)
    method IsRemoveWidget (line 31) | private static bool IsRemoveWidget(IClientDevice model, IFlightWidget vm)

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/DroneFlightWidgetViewModel.cs
  class DroneFlightWidgetViewModel (line 10) | public class DroneFlightWidgetViewModel(
    method DroneFlightWidgetViewModel (line 25) | public DroneFlightWidgetViewModel()
    method AfterLoadExtensions (line 32) | protected override void AfterLoadExtensions()

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/DroneWidgetCreationHandler.cs
  class DroneWidgetCreationHandler (line 9) | public class DroneWidgetCreationHandler(IServiceProvider services)
    method Create (line 14) | public IFlightWidget? Create(in IClientDevice device)

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Plane/PlaneWidgetCreationHandler.cs
  class PlaneWidgetCreationHandler (line 9) | public class PlaneWidgetCreationHandler(IServiceProvider services)
    method Create (line 14) | public IFlightWidget? Create(in IClientDevice device)

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Plane/PlaneWidgetViewModel.cs
  type IPlaneWidget (line 9) | public interface IPlaneWidget : IPlaneWidget<ArduPlaneClientDevice> { }
  type IPlaneWidget (line 11) | public interface IPlaneWidget<TPlane> : IDroneFlightWidget<TPlane>
  class PlaneWidgetViewModel (line 14) | public class PlaneWidgetViewModel
    method PlaneWidgetViewModel (line 20) | public PlaneWidgetViewModel(
  class PlaneWidgetViewModelBase (line 28) | public abstract class PlaneWidgetViewModelBase<TPlane, TSelf>
    method PlaneWidgetViewModelBase (line 33) | protected PlaneWidgetViewModelBase(

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Plane/Sections/PlaneSectionExtension.cs
  class PlaneSectionExtension (line 7) | public class PlaneSectionExtension(IServiceProvider services) : IExtensi...
    method Extend (line 9) | public void Extend(IPlaneWidget context, R3.CompositeDisposable contex...

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Plane/Sections/PlaneSectionView.axaml.cs
  class PlaneSectionView (line 7) | public partial class PlaneSectionView : UserControl
    method PlaneSectionView (line 9) | public PlaneSectionView()

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Plane/Sections/PlaneSectionViewModel.cs
  class PlaneSectionViewModel (line 9) | public class PlaneSectionViewModel : RoutableViewModel, IFlightWidgetSec...
    method PlaneSectionViewModel (line 13) | public PlaneSectionViewModel()
    method PlaneSectionViewModel (line 16) | public PlaneSectionViewModel(ILoggerFactory loggerFactory)
    method InitWith (line 34) | public void InitWith(ArduPlaneClientDevice context)
    method GetChildren (line 42) | public override IEnumerable<IRoutable> GetChildren()

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Sections/AttitudeIndicator/AttitudeIndicatorSectionView.axaml.cs
  class AttitudeIndicatorSectionView (line 7) | public partial class AttitudeIndicatorSectionView : UserControl
    method AttitudeIndicatorSectionView (line 9) | public AttitudeIndicatorSectionView()

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Sections/AttitudeIndicator/AttitudeIndicatorSectionViewModel.cs
  class AttitudeIndicatorSectionViewModel (line 13) | public class AttitudeIndicatorSectionViewModel
    method AttitudeIndicatorSectionViewModel (line 19) | public AttitudeIndicatorSectionViewModel(ILoggerFactory loggerFactory)
    method InitWith (line 29) | public void InitWith(MavlinkClientDevice device)
    method GetChildren (line 60) | public override IEnumerable<IRoutable> GetChildren()

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Sections/AttitudeIndicator/DroneFlightWidgetExtensionAttitudeIndicatorSection.cs
  class DroneFlightWidgetExtensionAttitudeIndicatorSection (line 11) | public sealed class DroneFlightWidgetExtensionAttitudeIndicatorSection(
    method Extend (line 16) | public void Extend(IDroneFlightWidget context, CompositeDisposable con...

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Sections/FlightControl/DroneFlightWidgetFlightControlSectionExtension.cs
  class DroneFlightWidgetFlightControlSectionExtension (line 9) | public sealed class DroneFlightWidgetFlightControlSectionExtension(IServ...
    method Extend (line 12) | public void Extend(IDroneFlightWidget context, CompositeDisposable con...

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Sections/FlightControl/FlightControlSectionView.axaml.cs
  class FlightControlSectionView (line 6) | public partial class FlightControlSectionView : UserControl
    method FlightControlSectionView (line 8) | public FlightControlSectionView()

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Sections/FlightControl/FlightControlSectionViewModel.cs
  class FlightControlSectionViewModel (line 15) | public class FlightControlSectionViewModel
    method FlightControlSectionViewModel (line 23) | public FlightControlSectionViewModel()
    method FlightControlSectionViewModel (line 36) | public FlightControlSectionViewModel(
    method InitWith (line 88) | public void InitWith(MavlinkClientDevice device)
    method GetChildren (line 96) | public override IEnumerable<IRoutable> GetChildren()

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Sections/Telemetry/DroneFlightWidgetTelemetrySectionExtension.cs
  class DroneFlightWidgetTelemetrySectionExtension (line 9) | public sealed class DroneFlightWidgetTelemetrySectionExtension(IServiceP...
    method Extend (line 12) | public void Extend(IDroneFlightWidget context, CompositeDisposable con...

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Sections/Telemetry/TelemetrySectionView.axaml.cs
  class TelemetrySectionView (line 6) | public partial class TelemetrySectionView : UserControl
    method TelemetrySectionView (line 8) | public TelemetrySectionView()

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Sections/Telemetry/TelemetrySectionViewModel.cs
  class TelemetrySectionViewModel (line 13) | public class TelemetrySectionViewModel
    method TelemetrySectionViewModel (line 23) | public TelemetrySectionViewModel()
    method TelemetrySectionViewModel (line 31) | public TelemetrySectionViewModel(ILoggerFactory loggerFactory, IUnitSe...
    method InitWith (line 44) | public void InitWith(MavlinkClientDevice device)
    method GetChildren (line 188) | public override IEnumerable<IRoutable> GetChildren()

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Test/PluginFlightItemView.axaml.cs
  class PluginFlightItemView (line 7) | public partial class PluginFlightItemView : UserControl
    method PluginFlightItemView (line 9) | public PluginFlightItemView()

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Test/PluginFlightItemViewModel.cs
  class PluginFlightItemViewModel (line 11) | public class PluginFlightItemViewModel : FlightWidgetViewModel<PluginFli...
    method PluginFlightItemViewModel (line 15) | public PluginFlightItemViewModel(ILoggerFactory loggerFactory, IExtens...

FILE: src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Test/PluginFlightItemWidgetExtension.cs
  class PluginFlightItemWidgetExtension (line 14) | public class PluginFlightItemWidgetExtension(ILoggerFactory loggerFactor...
    method Extend (line 17) | public void Extend(IFlightModePage context, CompositeDisposable contex...

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/Dialogs/SavePacketMessagesDialogView.axaml.cs
  class SavePacketMessagesDialogView (line 6) | public partial class SavePacketMessagesDialogView : UserControl
    method SavePacketMessagesDialogView (line 8) | public SavePacketMessagesDialogView()

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/Dialogs/SavePacketMessagesDialogViewModel.cs
  class SavePacketMessagesDialogViewModel (line 11) | public class SavePacketMessagesDialogViewModel : DialogViewModelBase
    method SavePacketMessagesDialogViewModel (line 17) | public SavePacketMessagesDialogViewModel()
    method SavePacketMessagesDialogViewModel (line 23) | public SavePacketMessagesDialogViewModel(ILoggerFactory loggerFactory)
    method ApplyDialog (line 73) | public override void ApplyDialog(ContentDialog dialog)
    method GetChildren (line 83) | public override IEnumerable<IRoutable> GetChildren() => [];
    method Dispose (line 92) | protected override void Dispose(bool isDisposing)

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/Filters/Comparers/PacketFilterComparerBase.cs
  class PacketFilterComparerBase (line 6) | public abstract class PacketFilterComparerBase<TFilter>
    method Equals (line 10) | public virtual bool Equals(
    method GetHashCode (line 40) | public virtual int GetHashCode(PacketFilterViewModelBase<TFilter> obj)

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/Filters/Comparers/SourcePacketFilterComparer.cs
  class SourcePacketFilterComparer (line 3) | public class SourcePacketFilterComparer : PacketFilterComparerBase<Sourc...

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/Filters/Comparers/TypePacketFilterComparer.cs
  class TypePacketFilterComparer (line 3) | public class TypePacketFilterComparer : PacketFilterComparerBase<TypePac...

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/Filters/PacketFilterViewModelBase.cs
  class PacketFilterViewModelBaseConfig (line 13) | public class PacketFilterViewModelBaseConfig
  class PacketFilterViewModelBase (line 18) | public abstract class PacketFilterViewModelBase<TFilter> : RoutableViewM...
    method PacketFilterViewModelBase (line 37) | protected PacketFilterViewModelBase(
    method IncreaseRatesCounterSafe (line 73) | public void IncreaseRatesCounterSafe()
    method GetChildren (line 78) | public override IEnumerable<IRoutable> GetChildren()
    method InternalCatchEvent (line 83) | private ValueTask InternalCatchEvent(IRoutable src, AsyncRoutedEvent<I...
    method UpdateRateText (line 110) | private void UpdateRateText()

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/Filters/SourcePacketFilterViewModel.cs
  class SourcePacketFilterViewModel (line 6) | public sealed class SourcePacketFilterViewModel(

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/Filters/TypePacketFilterViewModel.cs
  class TypePacketFilterViewModel (line 6) | public sealed class TypePacketFilterViewModel(

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/HomePacketViewerExtension.cs
  class HomePacketViewerExtension (line 8) | public class HomePacketViewerExtension(ILoggerFactory loggerFactory) : I...
    method Extend (line 10) | public void Extend(IHomePage context, CompositeDisposable contextDispose)

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/PacketConverter/DefaultMavlinkPacketConverter.cs
  class DefaultMavlinkPacketConverter (line 11) | public class DefaultMavlinkPacketConverter : IPacketConverter
    method CanConvert (line 15) | public bool CanConvert(MavlinkMessage packet)
    method Convert (line 25) | public string Convert(

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/PacketMessage/PacketMessageView.axaml.cs
  class PacketMessageView (line 6) | public partial class PacketMessageView : UserControl
    method PacketMessageView (line 8) | public PacketMessageView()

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/PacketMessage/PacketMessageViewModel.cs
  class PacketMessageViewModel (line 10) | public class PacketMessageViewModel : RoutableViewModel
    method PacketMessageViewModel (line 27) | public PacketMessageViewModel()
    method PacketMessageViewModel (line 39) | public PacketMessageViewModel(
    method GetChildren (line 62) | public override IEnumerable<IRoutable> GetChildren()

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/PacketViewerView.axaml.cs
  class PacketViewerViewConfig (line 8) | public sealed class PacketViewerViewConfig
  class PacketViewerView (line 14) | public partial class PacketViewerView : UserControl
    method PacketViewerView (line 20) | public PacketViewerView()
    method PacketViewerView (line 26) | public PacketViewerView(ILayoutService layoutService)
    method OnAttachedToVisualTree (line 32) | protected override void OnAttachedToVisualTree(VisualTreeAttachmentEve...
    method Expander_StateChanged (line 38) | private void Expander_StateChanged(object? sender, RoutedEventArgs e)
    method LoadLayout (line 48) | private void LoadLayout()
    method SaveLayout (line 60) | private void SaveLayout()
    method HasChanges (line 87) | private bool HasChanges()

FILE: src/Asv.Drones/Shell/Pages/PacketViewer/PacketViewerViewModel.cs
  class PacketViewerViewModelConfig (line 26) | public sealed class PacketViewerViewModelConfig
  class PacketViewerViewModel (line 33) | public class PacketViewerViewModel : PageViewModel<PacketViewerViewModel>
    method PacketViewerViewModel (line 66) | public PacketViewerViewModel()
    method PacketViewerViewModel (line 91) | public PacketViewerViewModel(
    method GetChildren (line 286) | public override IEnumerable<IRoutable> GetChildren()
    method ClearAllImpl (line 309) | internal void ClearAllImpl()
    method ExportToCsvImpl (line 314) | internal async ValueTask ExportToCsvImpl(CancellationToken cancel = de...
    method AfterLoadExtensions (line 371) | protected override void AfterLoadExtensions() { }
    method CreateSynchronizedViewFilter (line 373) | private ISynchronizedViewFilter<
    method InternalCatchEvent (line 422) | private ValueTask InternalCatchEvent(IRoutable src, AsyncRoutedEvent<I...
    method ConvertToPacketMessage (line 460) | private IEnumerable<PacketMessageViewModel> ConvertToPacketMessage(
    method UpdateFilters (line 474) | private void UpdateFilters(PacketMessageViewModel vm)
    method UpdateSourceFilters (line 480) | private void UpdateSourceFilters(PacketMessageViewModel vm)
    method UpdateTypeFilters (line 500) | private void UpdateTypeFilters(PacketMessageViewModel vm)
    method Dispose (line 522) | protected override void Dispose(bool disposing)
Condensed preview — 322 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,099K chars).
[
  {
    "path": ".config/dotnet-tools.json",
    "chars": 422,
    "preview": "{\n  \"version\": 1,\n  \"isRoot\": true,\n  \"tools\": {\n    \"husky\": {\n      \"version\": \"0.8.0\",\n      \"commands\": [\n        \"h"
  },
  {
    "path": ".csharpierignore",
    "chars": 24,
    "preview": "*\n!**/*.cs\n!**/*.axaml\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 792,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n1. Description:\n"
  },
  {
    "path": ".github/workflows/api-release-dev.yml",
    "chars": 2754,
    "preview": "name: Release Api Github only\n\non:\n  push:\n    tags:\n      - \"api-v[0-9]+.[0-9]+.[0-9]+-dev.[0-9]+\"\n      - \"api-v[0-9]+"
  },
  {
    "path": ".github/workflows/api-release.yml",
    "chars": 3232,
    "preview": "name: Release Api NuGet\n\non:\n  push:\n    tags:\n      - \"api-v[0-9]+.[0-9]+.[0-9]+\"\n      - \"api-v[0-9]+.[0-9]+.[0-9]+-rc"
  },
  {
    "path": ".github/workflows/drones-release-windows.yml",
    "chars": 3589,
    "preview": "name: Build and Release Drones For Windows\n\non:\n  push:\n    tags:\n      - 'v[0-9]+.[0-9]+.[0-9]+'\n      - 'v[0-9]+.[0-9]"
  },
  {
    "path": ".gitignore",
    "chars": 6002,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
  },
  {
    "path": ".husky/pre-commit",
    "chars": 538,
    "preview": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\n## husky task runner examples -------------------\n## Note : for local installa"
  },
  {
    "path": ".husky/task-runner.json",
    "chars": 410,
    "preview": "{\n   \"$schema\": \"https://alirezanet.github.io/Husky.Net/schema.json\",\n   \"tasks\": [\n      {\n         \"name\": \"Run csharp"
  },
  {
    "path": "LICENSE",
    "chars": 1069,
    "preview": "MIT License\n\nCopyright (c) 2023 Asv Soft LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
  },
  {
    "path": "README.md",
    "chars": 26197,
    "preview": "![linkedin](https://github.com/user-attachments/assets/4fa5221e-7ae5-4b6b-98a8-1c1e39b49afb)\n\n\n\n[//]: [![Release](https:"
  },
  {
    "path": "api_build.bat",
    "chars": 695,
    "preview": "@echo off\nsetlocal enabledelayedexpansion\nrem ====== projects ======\n\nset project=Asv.Drones.Gui.Api\n\n\nset \"file=.\\src\\D"
  },
  {
    "path": "api_publish_github.bat",
    "chars": 751,
    "preview": "@echo off\nsetlocal enabledelayedexpansion\nrem ====== projects ======\n\nset project=Asv.Drones.Gui.Api\n\n\nset \"file=.\\src\\D"
  },
  {
    "path": "publish.bat",
    "chars": 4592,
    "preview": "cd publish\n\nfor /d %%i in (\".\\*\") do (\n    rmdir /s /q \"%%i\"\n)\n\ncd ../src/Asv.Drones.Gui.Desktop\n\ndotnet publish -c Rele"
  },
  {
    "path": "src/.aiassistant/rules/comments.md",
    "chars": 4042,
    "preview": "---\napply: always\n---\n\n## Comment and Documentation Language\n\n- Write all code comments in English.\n- Write all XML docu"
  },
  {
    "path": "src/.editorconfig",
    "chars": 143,
    "preview": "[*.cs]\ndotnet_diagnostic.RCS1037.severity = none\ndotnet_diagnostic.RCS1251.severity = none\n\n[*.axaml]\ncsharpier_formatte"
  },
  {
    "path": "src/.gitignore",
    "chars": 7466,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
  },
  {
    "path": "src/.run/Publish win-x64.run.xml",
    "chars": 636,
    "preview": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Publish win-x64\" type=\"DotNetF"
  },
  {
    "path": "src/Asv.Drones/App.axaml",
    "chars": 1276,
    "preview": "<Application\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    x:"
  },
  {
    "path": "src/Asv.Drones/App.axaml.cs",
    "chars": 207,
    "preview": "using Asv.Avalonia;\nusing Avalonia.Markup.Xaml;\n\nnamespace Asv.Drones;\n\npublic partial class App : AsvApplication\n{\n    "
  },
  {
    "path": "src/Asv.Drones/Asv.Drones.csproj",
    "chars": 3881,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n    <PropertyGroup>\n        <TargetFramework>$(TargetFramework)</TargetFramework>\n   "
  },
  {
    "path": "src/Asv.Drones/Asv.Drones.csproj.DotSettings",
    "chars": 49760,
    "preview": "<wpf:ResourceDictionary xml:space=\"preserve\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:s=\"clr-namesp"
  },
  {
    "path": "src/Asv.Drones/AsvDronesMixin.cs",
    "chars": 10689,
    "preview": "using System;\nusing Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.Drones.Api;\nusing Asv.Drones.Plane;\nusing Asv.Mavlin"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Behaviour/Remove/RemoveItemCommand.cs",
    "chars": 949,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Drones.Api;\nusing Material.Icons;\n\n"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Behaviour/Rename/CommitRenameCommand.cs",
    "chars": 1973,
    "preview": "using System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.D"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/FileBrowser/FileBrowserViewModel/FindFileCommand.cs",
    "chars": 871,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Material.Icons;\n\nnamespace Asv.Drones;\n"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/FileBrowser/Items/CalculateCrc32Command.cs",
    "chars": 874,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Material.Icons;\n\nnamespace Asv.Drones;\n"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/FileBrowser/Items/CreateDirectoryCommand.cs",
    "chars": 888,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Material.Icons;\n\nnamespace Asv.Drones;\n"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/FileBrowser/OpenFileBrowserCommand.cs",
    "chars": 644,
    "preview": "using Asv.Avalonia;\n\nnamespace Asv.Drones;\n\npublic class OpenFileBrowserCommand(INavigationService nav)\n    : OpenPageC"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/FileBrowser/Transfer/BurstDownloadItemCommand.cs",
    "chars": 1720,
    "preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Mavlink;\nusing Materi"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/FileBrowser/Transfer/DownloadItemCommand.cs",
    "chars": 1694,
    "preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Mavlink;\nusing Materi"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/FileBrowser/Transfer/ITransferFtpEntries.cs",
    "chars": 646,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Mavlink;\n\nnamespace Asv.Drones;\n\npu"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/FileBrowser/Transfer/TransferCommandBase.cs",
    "chars": 1400,
    "preview": "using System;\nusing Asv.Avalonia;\nusing Asv.Mavlink;\n\nnamespace Asv.Drones;\n\npublic abstract class TransferCommandBase "
  },
  {
    "path": "src/Asv.Drones/Core/Commands/FileBrowser/Transfer/UploadItemCommand.cs",
    "chars": 1504,
    "preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Mavlink;\nusing Materi"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Flight/OpenFlight.cs",
    "chars": 639,
    "preview": "using Asv.Avalonia;\n\nnamespace Asv.Drones;\n\npublic class OpenFlightCommand(INavigationService nav)\n    : OpenPageComman"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Flight/OpenFlightMode.cs",
    "chars": 637,
    "preview": "using Asv.Avalonia;\nusing Asv.Drones.Api;\n\nnamespace Asv.Drones;\n\npublic class OpenFlightModeCommand(INavigationService"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/AutoModeCommand.cs",
    "chars": 1109,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing Materi"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/GuidedModeCommand.cs",
    "chars": 1051,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing Materi"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/LandCommand.cs",
    "chars": 1078,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing Materi"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/MissionProgress/UpdateMissionCommand.cs",
    "chars": 884,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Material.Icons;\n\nnamespace Asv.Drones;\n"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/RTLCommand.cs",
    "chars": 1066,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing Materi"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/StartMissionCommand.cs",
    "chars": 1266,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing Materi"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Flight/Widgets/UavWidget/TakeOffCommand.cs",
    "chars": 1145,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing Materi"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/MavParams/MavParamsPageViewModel/RemoveAllPinsCommand.cs",
    "chars": 2036,
    "preview": "using System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Ava"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/MavParams/MavParamsPageViewModel/StopUpdateParamsCommand.cs",
    "chars": 939,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Material.Icons;\n\nnamespace Asv.Drones;\n\n"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/MavParams/MavParamsPageViewModel/UpdateParamsCommand.cs",
    "chars": 928,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Material.Icons;\n\nnamespace Asv.Drones;\n\n"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/MavParams/OpenMavParamsCommand.cs",
    "chars": 643,
    "preview": "using Asv.Avalonia;\n\nnamespace Asv.Drones;\n\npublic class OpenMavParamsCommand(INavigationService nav)\n    : OpenPageCom"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Mavlink/MavlinkCommands.cs",
    "chars": 767,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Drones.Api;\nusing Asv.Mavlink;\n\nnam"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Mavlink/MavlinkCommandsMixin.cs",
    "chars": 405,
    "preview": "using Asv.Drones.Api;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\n\nnamespace Asv"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Mavlink/MavlinkParamReadCommand.cs",
    "chars": 1208,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Drones.Api;\nusing Asv.Mavlink;\nusin"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Mavlink/MavlinkParamsWriteCommand.cs",
    "chars": 2825,
    "preview": "using System;\nusing System.Diagnostics;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing "
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Mavlink/NullMavlinkCommands.cs",
    "chars": 829,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Drones.Api;\nusing Asv.Mavlink;\n\nname"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/PacketViewer/ClearAllPacketsCommand.cs",
    "chars": 931,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Material.Icons;\n\nnamespace Asv.Drones;\n"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/PacketViewer/ExportPacketsToCsvCommand.cs",
    "chars": 931,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Material.Icons;\n\nnamespace Asv.Drones;\n"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/PacketViewer/OpenPacketViewer.cs",
    "chars": 647,
    "preview": "using Asv.Avalonia;\n\nnamespace Asv.Drones;\n\npublic class OpenPacketViewerCommand(INavigationService nav)\n    : OpenPageC"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Setup/FrameType/ChangeFrameTypeCommand.cs",
    "chars": 1081,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Material.Icons;\n\nnamespace Asv.Drones;\n\n"
  },
  {
    "path": "src/Asv.Drones/Core/Commands/Setup/OpenSetupCommand.cs",
    "chars": 619,
    "preview": "using Asv.Avalonia;\n\nnamespace Asv.Drones;\n\npublic class OpenSetupCommand(INavigationService nav)\n    : OpenPageCommandB"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Pitch/PitchItem.cs",
    "chars": 922,
    "preview": "using System;\nusing Avalonia;\n\nnamespace Asv.Drones;\n\npublic partial class PitchItem : AvaloniaObject\n{\n    private read"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Pitch/PitchItem.properties.cs",
    "chars": 2113,
    "preview": "using Avalonia;\n\nnamespace Asv.Drones;\n\npublic partial class PitchItem\n{\n    public static readonly DirectProperty<OldAt"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Roll/RollItem.cs",
    "chars": 288,
    "preview": "using System;\nusing Avalonia;\n\nnamespace Asv.Drones;\n\npublic partial class RollItem : AvaloniaObject\n{\n    public RollIt"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/Items/Roll/RollItem.properties.cs",
    "chars": 863,
    "preview": "using Avalonia;\n\nnamespace Asv.Drones;\n\npublic partial class RollItem\n{\n    public static readonly DirectProperty<OldAtt"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/UavAngleIndicator.cs",
    "chars": 5742,
    "preview": "using System;\nusing Avalonia;\nusing Avalonia.Collections;\nusing Avalonia.Controls.Primitives;\n\nnamespace Asv.Drones;\n\npu"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/UavAngleIndicator.properties.cs",
    "chars": 3496,
    "preview": "using System.Collections.Generic;\nusing Avalonia;\n\nnamespace Asv.Drones;\n\npublic partial class UavAngleIndicator\n{\n    p"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/AngleUavIndicator/UavAngleIndicatorStyles.axaml",
    "chars": 16815,
    "preview": "<Styles\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:d"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/CompassUavIndicator/CompassScaleItem.cs",
    "chars": 3331,
    "preview": "using System;\nusing Avalonia;\n\nnamespace Asv.Drones;\n\npublic class CompassScaleItem : AvaloniaObject\n{\n    private const"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/CompassUavIndicator/CompassUavIndicator.cs",
    "chars": 2220,
    "preview": "using System.Linq;\nusing Avalonia;\nusing Avalonia.Collections;\nusing Avalonia.Controls.Primitives;\n\nnamespace Asv.Drones"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/CompassUavIndicator/CompassUavIndicator.properties.cs",
    "chars": 2060,
    "preview": "using System.Collections.Generic;\nusing Avalonia;\n\nnamespace Asv.Drones;\n\npublic partial class CompassUavIndicator\n{\n   "
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/CompassUavIndicator/CompassUavIndicatorStyles.axaml",
    "chars": 5851,
    "preview": "<Styles\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:d"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/DeviceTelemetryDesignPreview.cs",
    "chars": 1612,
    "preview": "using Asv.Avalonia;\n\nnamespace Asv.Drones;\n\ninternal static class DeviceTelemetryDesignPreview\n{\n    public const AsvCol"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/AttitudeIndicator.cs",
    "chars": 13603,
    "preview": "using System;\nusing System.Linq;\nusing Avalonia;\nusing Avalonia.Collections;\nusing Avalonia.Controls;\nusing Avalonia.Co"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/AttitudeIndicator.properties.cs",
    "chars": 12164,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Avalonia;\nusing Avalonia.Media;\n\nnamespace Asv.Drones.OldAttitude"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/AttitudeIndicatorStyles.axaml",
    "chars": 46683,
    "preview": "<Styles\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Heading/HeadingScaleItem.cs",
    "chars": 1073,
    "preview": "using System;\n\nnamespace Asv.Drones.OldAttitudeIndicator;\n\npublic class HeadingScaleItem : ScaleItem\n{\n    public Headin"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Pitch/PitchItem.cs",
    "chars": 943,
    "preview": "using System;\nusing Avalonia;\n\nnamespace Asv.Drones.OldAttitudeIndicator;\n\npublic partial class PitchItem : AvaloniaObje"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Pitch/PitchItem.properties.cs",
    "chars": 2134,
    "preview": "using Avalonia;\n\nnamespace Asv.Drones.OldAttitudeIndicator;\n\npublic partial class PitchItem\n{\n    public static readonly"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Roll/RollItem.cs",
    "chars": 309,
    "preview": "using System;\nusing Avalonia;\n\nnamespace Asv.Drones.OldAttitudeIndicator;\n\npublic partial class RollItem : AvaloniaObjec"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Roll/RollItem.properties.cs",
    "chars": 884,
    "preview": "using Avalonia;\n\nnamespace Asv.Drones.OldAttitudeIndicator;\n\npublic partial class RollItem\n{\n    public static readonly "
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Scale/ScaleItem.cs",
    "chars": 1884,
    "preview": "using System;\nusing Avalonia;\n\nnamespace Asv.Drones.OldAttitudeIndicator;\n\npublic partial class ScaleItem : AvaloniaObje"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/OldAttitudeIndicator/Items/Scale/ScaleItem.properties.cs",
    "chars": 1975,
    "preview": "using Avalonia;\n\nnamespace Asv.Drones.OldAttitudeIndicator;\n\npublic partial class ScaleItem\n{\n    private readonly doubl"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/RouteUavIndicator/RouteUavIndicator.cs",
    "chars": 4392,
    "preview": "using System;\nusing Asv.Avalonia;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Metadata;\n\nnamespace"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/RouteUavIndicator/RouteUavIndicatorStyles.axaml",
    "chars": 12121,
    "preview": "<ResourceDictionary\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/AltitudeUavIndicator/AltitudeUavIndicator.axaml",
    "chars": 651,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/AltitudeUavIndicator/AltitudeUavIndicator.axaml.cs",
    "chars": 186,
    "preview": "using Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class AltitudeUavIndicator : UserControl\n{\n    public Al"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/AltitudeUavIndicator/AltitudeUavIndicatorViewModel.cs",
    "chars": 2345,
    "preview": "using System;\nusing System.Diagnostics.CodeAnalysis;\nusing Asv.Avalonia;\nusing Material.Icons;\nusing Microsoft.Extension"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/AngleUavRttIndicator/AngleUavRttIndicator.axaml",
    "chars": 651,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/AngleUavRttIndicator/AngleUavRttIndicator.axaml.cs",
    "chars": 186,
    "preview": "using Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class AngleUavRttIndicator : UserControl\n{\n    public An"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/AngleUavRttIndicator/AngleUavRttIndicatorViewModel.cs",
    "chars": 2315,
    "preview": "using System;\nusing System.Diagnostics.CodeAnalysis;\nusing Asv.Avalonia;\nusing Material.Icons;\nusing Microsoft.Extension"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/BatteryUavIndicator/BatteryUavIndicator.axaml",
    "chars": 671,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/BatteryUavIndicator/BatteryUavIndicator.axaml.cs",
    "chars": 184,
    "preview": "using Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class BatteryUavIndicator : UserControl\n{\n    public Bat"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/BatteryUavIndicator/BatteryUavIndicatorViewModel.cs",
    "chars": 4384,
    "preview": "using System;\nusing System.Diagnostics.CodeAnalysis;\nusing Asv.Avalonia;\nusing Material.Icons;\nusing Microsoft.Extension"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/HeadingUavIndicator/HeadingUavIndicator.axaml",
    "chars": 649,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/HeadingUavIndicator/HeadingUavIndicator.axaml.cs",
    "chars": 184,
    "preview": "using Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class HeadingUavIndicator : UserControl\n{\n    public Hea"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/HeadingUavIndicator/HeadingUavIndicatorViewModel.cs",
    "chars": 1175,
    "preview": "using System;\nusing Asv.Avalonia;\nusing Material.Icons;\nusing Microsoft.Extensions.Logging;\nusing R3;\n\nnamespace Asv.Dro"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/HomeAzimuthUavIndicator/HomeAzimuthUavIndicator.axaml",
    "chars": 661,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/HomeAzimuthUavIndicator/HomeAzimuthUavIndicator.axaml.cs",
    "chars": 192,
    "preview": "using Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class HomeAzimuthUavIndicator : UserControl\n{\n    public"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/HomeAzimuthUavIndicator/HomeAzimuthUavIndicatorViewModel.cs",
    "chars": 1209,
    "preview": "using System;\nusing Asv.Avalonia;\nusing Material.Icons;\nusing Microsoft.Extensions.Logging;\nusing R3;\n\nnamespace Asv.Dro"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/VelocityUavIndicator/VelocityUavIndicator.axaml",
    "chars": 652,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/VelocityUavIndicator/VelocityUavIndicator.axaml.cs",
    "chars": 186,
    "preview": "using Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class VelocityUavIndicator : UserControl\n{\n    public Ve"
  },
  {
    "path": "src/Asv.Drones/Core/Controls/DeviceTelemetry/Rtt/VelocityUavIndicator/VelocityUavIndicatorViewModel.cs",
    "chars": 1172,
    "preview": "using System;\nusing Asv.Avalonia;\nusing Material.Icons;\nusing Microsoft.Extensions.Logging;\nusing R3;\n\nnamespace Asv.Dro"
  },
  {
    "path": "src/Asv.Drones/Core/Converters/Crc32StatusToColorConverter.cs",
    "chars": 1234,
    "preview": "using System;\nusing System.Globalization;\nusing Asv.Avalonia;\nusing Avalonia.Data.Converters;\n\nnamespace Asv.Drones;\n\n/"
  },
  {
    "path": "src/Asv.Drones/Core/Services/ClientDeviceWidgetFactory/ClientDeviceWidgetFactory.cs",
    "chars": 1250,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Asv.Drones.Api;\nusing Asv.IO;\n\nnamespace Asv.Drones;\n\npublic class"
  },
  {
    "path": "src/Asv.Drones/Core/Services/Devices/Gnss/GnssDeviceManagerExtentsion.cs",
    "chars": 978,
    "preview": "using Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.Gnss;\nusing Asv.IO;\nusing Avalonia.Media;\nusing Material.Icons;\n\nn"
  },
  {
    "path": "src/Asv.Drones/Core/Services/Files/BusyFlag.cs",
    "chars": 809,
    "preview": "using System;\nusing R3;\n\nnamespace Asv.Drones;\n\npublic sealed class BusyFlag : IDisposable\n{\n    // guarantees correct "
  },
  {
    "path": "src/Asv.Drones/Core/Services/Files/Local/LocalFilesService.cs",
    "chars": 7446,
    "preview": "using System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.IO.Abstractions;\nu"
  },
  {
    "path": "src/Asv.Drones/Core/Services/Files/PathHelper.cs",
    "chars": 386,
    "preview": "using System;\nusing Asv.Avalonia;\n\nnamespace Asv.Drones;\n\npublic static class PathHelper\n{\n    public static Navigation"
  },
  {
    "path": "src/Asv.Drones/Core/Services/Files/ProgressWithLock.cs",
    "chars": 4340,
    "preview": "using System;\nusing System.Threading;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Extensions.Logging.Abstractio"
  },
  {
    "path": "src/Asv.Drones/Core/Services/Files/Remote/FtpClientService.cs",
    "chars": 20758,
    "preview": "using System;\nusing System.IO;\nusing System.IO.Abstractions;\nusing System.Linq;\nusing System.Threading;\nusing System.Th"
  },
  {
    "path": "src/Asv.Drones/Core/Services/Files/Remote/RemoteEntriesSync.cs",
    "chars": 4273,
    "preview": "using System;\nusing System.Linq;\nusing Asv.Avalonia;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing Asv.Modeling;\nusing Microso"
  },
  {
    "path": "src/Asv.Drones/RS.Designer.cs",
    "chars": 72186,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "src/Asv.Drones/RS.resx",
    "chars": 26799,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<root>\n    <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLS"
  },
  {
    "path": "src/Asv.Drones/RS.ru.resx",
    "chars": 26999,
    "preview": "<root>\n    <resheader name=\"resmimetype\">\n        <value>text/microsoft-resx</value>\n    </resheader>\n    <resheader nam"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Contracts/FileBrowserBackend.cs",
    "chars": 643,
    "preview": "using System;\n\nnamespace Asv.Drones;\n\npublic sealed class FileBrowserBackend(LocalFilesService local, FtpClientService "
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Contracts/IBrowserItemsOperations.cs",
    "chars": 836,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Extensions.Logging;\n\nnamespace Asv.Drones;\n\npubli"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Contracts/LocalBrowserItemsOperations.cs",
    "chars": 1857,
    "preview": "using System;\nusing System.IO;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Extensions.Logging"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Contracts/RemoteBrowserItemsOperations.cs",
    "chars": 1574,
    "preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Mavlink;\nusing Microsoft.Extensions.Loggi"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Dialogs/BurstDownloadDialogView.axaml",
    "chars": 775,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Dialogs/BurstDownloadDialogView.axaml.cs",
    "chars": 212,
    "preview": "using Asv.Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class BurstDownloadDialogView : User"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Dialogs/BurstDownloadDialogViewModel.cs",
    "chars": 1872,
    "preview": "using System.Collections.Generic;\nusing Asv.Avalonia;\nusing Asv.Common;\nusing Asv.Mavlink;\nusing Microsoft.Extensions.L"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/FileBrowserView.axaml",
    "chars": 24076,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    x"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/FileBrowserView.axaml.cs",
    "chars": 6818,
    "preview": "using System.Collections.Generic;\nusing System.Linq;\nusing Asv.Avalonia;\nusing Avalonia;\nusing Avalonia.Controls;\nusing"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/FileBrowserViewModel.cs",
    "chars": 43980,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/HomePageFileBrowserDeviceItemAction.cs",
    "chars": 990,
    "preview": "using Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing Microsoft.Extensions.Logging;\n\nnamesp"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/IO/FileSize.cs",
    "chars": 1920,
    "preview": "using System;\n\nnamespace Asv.Drones;\n\npublic readonly struct FileSize(long size) : IEquatable<FileSize>\n{\n    private c"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/IO/FtpBrowserNamingPolicy.cs",
    "chars": 2159,
    "preview": "using System;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing Asv.Co"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/IO/FtpBrowserPath.cs",
    "chars": 4207,
    "preview": "namespace Asv.Drones;\n\n/// <summary>\n/// Utility methods for working with FTP browser paths.\n/// </summary>\npublic stat"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/IO/Types/Crc32Status.cs",
    "chars": 340,
    "preview": "namespace Asv.Drones;\n\npublic enum Crc32Status\n{\n    /// <summary>\n    /// Basic status.\n    /// </summary>\n    Default"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/IO/Types/FtpBrowserSourceType.cs",
    "chars": 84,
    "preview": "namespace Asv.Drones;\n\npublic enum FtpBrowserSourceType\n{\n    Local,\n    Remote,\n}\n"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/BrowserNode.cs",
    "chars": 734,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Asv.Avalonia;\nusing ObservableCollections;\n\nnamespace Asv.Drones;"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/BrowserTree.cs",
    "chars": 792,
    "preview": "using Asv.Avalonia;\nusing ObservableCollections;\n\nnamespace Asv.Drones;\n\npublic class BrowserTree(IReadOnlyObservableLi"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/Items/BrowserItemComparer.cs",
    "chars": 2653,
    "preview": "using System.Collections.Generic;\n\nnamespace Asv.Drones;\n\npublic sealed class BrowserItemComparer : IComparer<IBrowserI"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/Items/BrowserItemViewModel.cs",
    "chars": 5304,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avaloni"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/Items/DirectoryItemViewModel.cs",
    "chars": 2011,
    "preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Mavlink;\nusing Micros"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/Items/FileItemViewModel.cs",
    "chars": 2348,
    "preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Mavlink;\nusing Micros"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/FileBrowser/Tree/Items/IBrowserItemViewModel.cs",
    "chars": 911,
    "preview": "using System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Drones.Api;\nusing Asv.Mavlink;\nusin"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/MavParams/Dialog/TryCloseWithApprovalDialogView.axaml",
    "chars": 710,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/MavParams/Dialog/TryCloseWithApprovalDialogView.axaml.cs",
    "chars": 226,
    "preview": "using Asv.Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class TryCloseWithApprovalDialogView"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/MavParams/Dialog/TryCloseWithApprovalDialogViewModel.cs",
    "chars": 723,
    "preview": "using System.Collections.Generic;\nusing Asv.Avalonia;\nusing Microsoft.Extensions.Logging;\n\nnamespace Asv.Drones;\n\npubli"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/MavParams/HomePageParamsDeviceItemAction.cs",
    "chars": 1036,
    "preview": "using Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing Material.Icons;\nusing Microsoft.Exten"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/MavParams/MavParamsPageView.axaml",
    "chars": 10055,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    x"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/MavParams/MavParamsPageView.axaml.cs",
    "chars": 5642,
    "preview": "using System.Collections.Generic;\nusing System.Linq;\nusing Asv.Avalonia;\nusing Avalonia;\nusing Avalonia.Controls;\nusing"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/MavParams/MavParamsPageViewModel.cs",
    "chars": 17349,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/MavParams/ParamItem/ParamItemView.axaml",
    "chars": 4930,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/MavParams/ParamItem/ParamItemView.axaml.cs",
    "chars": 192,
    "preview": "using Asv.Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class ParamItemView : UserControl\n{\n"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/MavParams/ParamItem/ParamItemViewModel.cs",
    "chars": 11984,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Threading.Tasks;\nusing System.W"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/MavParams/ParamItem/RoutedEvents/ParamItemChangedEvent.cs",
    "chars": 407,
    "preview": "using Asv.Avalonia;\nusing Asv.Common;\nusing Asv.Modeling;\n\nnamespace Asv.Drones;\n\n/// <summary>\n/// Represents an event "
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/DefaultSetupExtension.cs",
    "chars": 570,
    "preview": "using System.Collections.Generic;\nusing Asv.Avalonia;\nusing Asv.Common;\nusing Asv.Drones.Api;\nusing Microsoft.Extensions"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/HomePageSetupDeviceItemAction.cs",
    "chars": 800,
    "preview": "using Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.IO;\nusing Microsoft.Extensions.Logging;\n\nnamespace Asv.Drones;\n\npub"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/SetupMixin.cs",
    "chars": 2665,
    "preview": "using System;\nusing Asv.Avalonia;\nusing Asv.Drones.Api;\nusing Avalonia.Controls;\nusing Microsoft.Extensions.DependencyI"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/SetupPageView.axaml",
    "chars": 921,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/SetupPageView.axaml.cs",
    "chars": 192,
    "preview": "using Asv.Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class SetupPageView : UserControl\n{\n"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/SetupPageViewModel.cs",
    "chars": 1084,
    "preview": "using System;\nusing System.Threading;\nusing Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.Drones.Api;\nusing Asv.IO;\nusi"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/DroneFrameItem/DroneFrameItemView.axaml",
    "chars": 4574,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/DroneFrameItem/DroneFrameItemView.axaml.cs",
    "chars": 202,
    "preview": "using Asv.Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class DroneFrameItemView : UserContr"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/DroneFrameItem/DroneFrameItemViewModel.cs",
    "chars": 1869,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Common;\nusin"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/DroneFrameItem/NullDroneFrame.cs",
    "chars": 414,
    "preview": "using System.Collections.Generic;\nusing Asv.Mavlink;\n\nnamespace Asv.Drones;\n\npublic class NullDroneFrame : IDroneFrame\n{"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/DroneFrameItem/RoutedEvents/CurrentDroneFrameChangeEvent.cs",
    "chars": 374,
    "preview": "using Asv.Avalonia;\nusing Asv.Common;\nusing Asv.Modeling;\n\nnamespace Asv.Drones;\n\n/// <summary>\n/// Represents an event "
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/FrameTypeSetupPageExtension.cs",
    "chars": 1473,
    "preview": "using System.Linq;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Common;\nusing Asv.Drones.Api;\nusing Asv."
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/SetupFrameTypeView.axaml",
    "chars": 8411,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/SetupFrameTypeView.axaml.cs",
    "chars": 202,
    "preview": "using Asv.Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class SetupFrameTypeView : UserContr"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/FrameType/SetupFrameTypeViewModel.cs",
    "chars": 9157,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Linq;\nusing System.Thre"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/MotorItem/MotorItemView.axaml",
    "chars": 5311,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/MotorItem/MotorItemView.axaml.cs",
    "chars": 192,
    "preview": "using Asv.Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class MotorItemView : UserControl\n{\n"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/MotorItem/MotorItemViewModel.cs",
    "chars": 3435,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Asv.Avalonia"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/MotorsSetupPageExtension.cs",
    "chars": 1394,
    "preview": "using System.Linq;\nusing Asv.Avalonia;\nusing Asv.Common;\nusing Asv.Drones.Api;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing M"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/SetupMotorsView.axaml",
    "chars": 2045,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/SetupMotorsView.axaml.cs",
    "chars": 196,
    "preview": "using Asv.Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class SetupMotorsView : UserControl\n"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/Motors/SetupMotorsViewModel.cs",
    "chars": 3709,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Common;\nusin"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Device/Setup/Subpage/SetupSubpage.cs",
    "chars": 294,
    "preview": "using Asv.Avalonia;\nusing Asv.Drones.Api;\nusing Microsoft.Extensions.Logging;\n\nnamespace Asv.Drones;\n\npublic abstract cl"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Anchors/FlightUavAnchorsExtension.cs",
    "chars": 1007,
    "preview": "using Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.Common;\nusing Asv.Drones.Api;\nusing Asv.IO;\nusing Asv.Mavlink;\nusi"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Anchors/MissionAnchor.cs",
    "chars": 1162,
    "preview": "using Asv.Avalonia;\nusing Asv.Avalonia.GeoMap;\nusing Asv.Common;\nusing Avalonia.Media;\nusing Material.Icons;\nusing Micr"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Anchors/UavAnchor.cs",
    "chars": 2458,
    "preview": "using System;\nusing Asv.Avalonia;\nusing Asv.Avalonia.GeoMap;\nusing Asv.Avalonia.IO;\nusing Asv.Common;\nusing Asv.Drones."
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/FlightPageView.axaml",
    "chars": 4315,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    x"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/FlightPageView.axaml.cs",
    "chars": 3036,
    "preview": "using Asv.Avalonia;\nusing Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic sealed class FlightPageView"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/FlightPageViewModel.cs",
    "chars": 4536,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Avalonia.Ge"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/HomePageFlightExtension.cs",
    "chars": 472,
    "preview": "using Asv.Avalonia;\nusing Asv.Common;\nusing Microsoft.Extensions.Logging;\nusing R3;\n\nnamespace Asv.Drones;\n\npublic clas"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Widgets/FlightWidgetsExtension.cs",
    "chars": 1213,
    "preview": "using Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.Common;\nusing Asv.Drones.Api;\nusing Asv.IO;\nusing Asv.Mavlink;\nusi"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/Dialogs/SetAltitudeDialogView.axaml",
    "chars": 1102,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xm"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/Dialogs/SetAltitudeDialogView.axaml.cs",
    "chars": 208,
    "preview": "using Asv.Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class SetAltitudeDialogView : UserCo"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/Dialogs/SetAltitudeDialogViewModel.cs",
    "chars": 2165,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Asv.Avalonia;\nusing Asv.Common;\nusing Microsoft"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/MissionProgress/MissionProgressView.axaml",
    "chars": 3244,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    x"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/MissionProgress/MissionProgressView.axaml.cs",
    "chars": 185,
    "preview": "using Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class MissionProgressView : UserControl\n{\n    public Mi"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/MissionProgress/MissionProgressViewModel.cs",
    "chars": 17290,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/UavWidgetView.axaml",
    "chars": 7927,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    x"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/UavWidgetView.axaml.cs",
    "chars": 193,
    "preview": "using Asv.Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic partial class UavWidgetView : UserControl\n{"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/Flight/Widgets/UavWidget/UavWidgetViewModel.cs",
    "chars": 35451,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Windows.Input;\nusing Asv.Avalonia;\nusing Asv.Avalonia.GeoMa"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/Anchors/FlightModeAnchorsExtension.cs",
    "chars": 1007,
    "preview": "using Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.Common;\nusing Asv.Drones.Api;\nusing Asv.IO;\nusing Asv.Mavlink;\nusi"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/FlightModePageView.axaml",
    "chars": 4309,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    x"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/FlightModePageView.axaml.cs",
    "chars": 3060,
    "preview": "using Asv.Avalonia;\nusing Avalonia;\nusing Avalonia.Controls;\n\nnamespace Asv.Drones;\n\npublic sealed class FlightModePage"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/FlightModePageViewModel.cs",
    "chars": 3848,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Asv.Avalonia;\nusing Asv.Avalonia.Ge"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/HomePageFlightModeExtension.cs",
    "chars": 438,
    "preview": "using Asv.Avalonia;\nusing Asv.Common;\nusing Microsoft.Extensions.Logging;\nusing R3;\n\nnamespace Asv.Drones;\n\npublic clas"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/FlightModeClientDeviceWidgetExtension.cs",
    "chars": 878,
    "preview": "using Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.Common;\nusing Asv.Drones.Api;\nusing Asv.IO;\nusing Asv.Modeling;\nus"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/DroneFlightWidgetViewModel.cs",
    "chars": 849,
    "preview": "using Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.Drones.Api;\nusing Asv.Mavlink;\nusing Microsoft.Extensions.Logging;"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/DroneWidgetCreationHandler.cs",
    "chars": 757,
    "preview": "using System;\nusing Asv.Drones.Api;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing Microsoft.Extensions.DependencyInjection;\n\nn"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Plane/PlaneWidgetCreationHandler.cs",
    "chars": 745,
    "preview": "using System;\nusing Asv.Drones.Api;\nusing Asv.IO;\nusing Asv.Mavlink;\nusing Microsoft.Extensions.DependencyInjection;\n\nn"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Plane/PlaneWidgetViewModel.cs",
    "chars": 1176,
    "preview": "using Asv.Avalonia;\nusing Asv.Avalonia.IO;\nusing Asv.Drones.Api;\nusing Asv.Mavlink;\nusing Microsoft.Extensions.Logging;"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Plane/Sections/PlaneSectionExtension.cs",
    "chars": 559,
    "preview": "using System;\nusing Asv.Avalonia;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace Asv.Drones.Plane;\n\npublic "
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Plane/Sections/PlaneSectionView.axaml",
    "chars": 646,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    x"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Plane/Sections/PlaneSectionView.axaml.cs",
    "chars": 229,
    "preview": "using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace Asv.Drones.Plane;\n\npublic partial class"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Plane/Sections/PlaneSectionViewModel.cs",
    "chars": 1000,
    "preview": "using System.Collections.Generic;\nusing Asv.Avalonia;\nusing Asv.Drones.Api;\nusing Asv.Mavlink;\nusing Microsoft.Extensio"
  },
  {
    "path": "src/Asv.Drones/Shell/Pages/FlightMode/Widgets/Device/Mavlink/Drone/Sections/AttitudeIndicator/AttitudeIndicatorSectionView.axaml",
    "chars": 964,
    "preview": "<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    x"
  }
]

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

About this extraction

This page contains the full source code of the asv-soft/asv-drones GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 322 files (999.4 KB), approximately 233.0k tokens, and a symbol index with 841 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!