From 01b72bc3c119998063ec52f17a8ce869852634e7 Mon Sep 17 00:00:00 2001 From: Z User Date: Mon, 6 Apr 2026 22:32:13 +0000 Subject: [PATCH] =?UTF-8?q?Clean=20slate=20=E2=80=94=20content=20moved=20t?= =?UTF-8?q?o=20dedicated=20repos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shelled/package-lock.json | 6 - shelled/plan-os-ui.md | 300 - shelled/rustdesk-as-ref/.cargo/config.toml | 16 - shelled/rustdesk-as-ref/.gitattributes | 1 - shelled/rustdesk-as-ref/.github/FUNDING.yml | 2 - .../.github/ISSUE_TEMPLATE/bug_report.yaml | 55 - .../.github/ISSUE_TEMPLATE/config.yml | 8 - .../rustdesk-as-ref/.github/dependabot.yml | 11 - ...ter_3.24.4_dropdown_menu_enableFilter.diff | 42 - .../.github/workflows/bridge.yml | 98 - .../rustdesk-as-ref/.github/workflows/ci.yml | 250 - .../.github/workflows/clear-cache.yml | 37 - .../.github/workflows/fdroid.yml | 39 - .../.github/workflows/flutter-build.yml | 2062 --- .../.github/workflows/flutter-ci.yml | 24 - .../.github/workflows/flutter-nightly.yml | 15 - .../.github/workflows/flutter-tag.yml | 18 - .../.github/workflows/playground.yml | 418 - .../third-party-RustDeskTempTopMostWindow.yml | 60 - shelled/rustdesk-as-ref/.gitignore | 58 - shelled/rustdesk-as-ref/.gitmodules | 3 - shelled/rustdesk-as-ref/CLAUDE.md | 91 - shelled/rustdesk-as-ref/Cargo.lock | 11288 ---------------- shelled/rustdesk-as-ref/Cargo.toml | 247 - shelled/rustdesk-as-ref/Dockerfile | 64 - shelled/rustdesk-as-ref/LICENCE | 661 - shelled/rustdesk-as-ref/README.md | 182 - .../appimage/AppImageBuilder-aarch64.yml | 102 - .../appimage/AppImageBuilder-x86_64.yml | 105 - shelled/rustdesk-as-ref/build.py | 647 - shelled/rustdesk-as-ref/build.rs | 94 - .../docs/CODE_OF_CONDUCT-DE.md | 137 - .../docs/CODE_OF_CONDUCT-JP.md | 101 - .../docs/CODE_OF_CONDUCT-KR.md | 133 - .../docs/CODE_OF_CONDUCT-NL.md | 136 - .../docs/CODE_OF_CONDUCT-NO.md | 125 - .../docs/CODE_OF_CONDUCT-PL.md | 133 - .../docs/CODE_OF_CONDUCT-RO.md | 85 - .../docs/CODE_OF_CONDUCT-RU.md | 134 - .../docs/CODE_OF_CONDUCT-TR.md | 89 - .../docs/CODE_OF_CONDUCT-ZH.md | 87 - .../rustdesk-as-ref/docs/CODE_OF_CONDUCT.md | 133 - .../rustdesk-as-ref/docs/CONTRIBUTING-DE.md | 50 - .../rustdesk-as-ref/docs/CONTRIBUTING-ID.md | 31 - .../rustdesk-as-ref/docs/CONTRIBUTING-IT.md | 37 - .../rustdesk-as-ref/docs/CONTRIBUTING-JP.md | 41 - .../rustdesk-as-ref/docs/CONTRIBUTING-KR.md | 46 - .../rustdesk-as-ref/docs/CONTRIBUTING-NL.md | 50 - .../rustdesk-as-ref/docs/CONTRIBUTING-NO.md | 46 - .../rustdesk-as-ref/docs/CONTRIBUTING-PL.md | 45 - .../rustdesk-as-ref/docs/CONTRIBUTING-RO.md | 31 - .../rustdesk-as-ref/docs/CONTRIBUTING-RU.md | 45 - .../rustdesk-as-ref/docs/CONTRIBUTING-TR.md | 31 - .../rustdesk-as-ref/docs/CONTRIBUTING-ZH.md | 32 - shelled/rustdesk-as-ref/docs/CONTRIBUTING.md | 46 - shelled/rustdesk-as-ref/docs/README-AR.md | 173 - shelled/rustdesk-as-ref/docs/README-CS.md | 157 - shelled/rustdesk-as-ref/docs/README-DA.md | 149 - shelled/rustdesk-as-ref/docs/README-DE.md | 182 - shelled/rustdesk-as-ref/docs/README-EO.md | 148 - shelled/rustdesk-as-ref/docs/README-ES.md | 180 - shelled/rustdesk-as-ref/docs/README-FA.md | 159 - shelled/rustdesk-as-ref/docs/README-FI.md | 148 - shelled/rustdesk-as-ref/docs/README-FR.md | 152 - shelled/rustdesk-as-ref/docs/README-GR.md | 171 - shelled/rustdesk-as-ref/docs/README-HU.md | 163 - shelled/rustdesk-as-ref/docs/README-ID.md | 166 - shelled/rustdesk-as-ref/docs/README-IT.md | 179 - shelled/rustdesk-as-ref/docs/README-JP.md | 183 - shelled/rustdesk-as-ref/docs/README-KR.md | 182 - shelled/rustdesk-as-ref/docs/README-ML.md | 148 - shelled/rustdesk-as-ref/docs/README-NL.md | 168 - shelled/rustdesk-as-ref/docs/README-NO.md | 177 - shelled/rustdesk-as-ref/docs/README-PL.md | 169 - shelled/rustdesk-as-ref/docs/README-PTBR.md | 152 - shelled/rustdesk-as-ref/docs/README-RO.md | 181 - shelled/rustdesk-as-ref/docs/README-RU.md | 183 - shelled/rustdesk-as-ref/docs/README-TR.md | 181 - shelled/rustdesk-as-ref/docs/README-UA.md | 174 - shelled/rustdesk-as-ref/docs/README-VN.md | 161 - shelled/rustdesk-as-ref/docs/README-ZH.md | 233 - shelled/rustdesk-as-ref/docs/SECURITY-DE.md | 9 - shelled/rustdesk-as-ref/docs/SECURITY-IT.md | 11 - shelled/rustdesk-as-ref/docs/SECURITY-JP.md | 9 - shelled/rustdesk-as-ref/docs/SECURITY-KR.md | 7 - shelled/rustdesk-as-ref/docs/SECURITY-NL.md | 11 - shelled/rustdesk-as-ref/docs/SECURITY-NO.md | 9 - shelled/rustdesk-as-ref/docs/SECURITY-PL.md | 9 - shelled/rustdesk-as-ref/docs/SECURITY-RO.md | 9 - shelled/rustdesk-as-ref/docs/SECURITY-TR.md | 9 - shelled/rustdesk-as-ref/docs/SECURITY.md | 9 - shelled/rustdesk-as-ref/entrypoint.sh | 36 - shelled/rustdesk-as-ref/examples/ipc.rs | 90 - .../android/en-US/full_description.txt | 11 - .../android/en-US/short_description.txt | 1 - .../android/fr-FR/full_description.txt | 11 - .../android/fr-FR/short_description.txt | 1 - .../android/nl-NL/full_description.txt | 11 - .../android/nl-NL/short_description.txt | 1 - .../android/zh-CN/full_description.txt | 12 - .../android/zh-CN/short_description.txt | 1 - .../com.rustdesk.RustDesk.metainfo.xml | 59 - shelled/rustdesk-as-ref/flatpak/rustdesk.json | 66 - .../rustdesk-as-ref/flutter/.gitattributes | 1 - shelled/rustdesk-as-ref/flutter/.gitignore | 56 - shelled/rustdesk-as-ref/flutter/.metadata | 36 - shelled/rustdesk-as-ref/flutter/README.md | 16 - .../flutter/analysis_options.yaml | 6 - .../flutter/android/.gitignore | 11 - .../flutter/android/app/build.gradle | 137 - .../flutter/android/app/proguard-rules | 7 - .../android/app/src/debug/AndroidManifest.xml | 7 - .../android/app/src/main/AndroidManifest.xml | 106 - .../carriez/flutter_hbb/AudioRecordHandle.kt | 193 - .../com/carriez/flutter_hbb/BootReceiver.kt | 47 - .../flutter_hbb/FloatingWindowService.kt | 394 - .../com/carriez/flutter_hbb/InputService.kt | 741 - .../flutter_hbb/KeyboardKeyEventMapper.kt | 122 - .../com/carriez/flutter_hbb/MainActivity.kt | 414 - .../carriez/flutter_hbb/MainApplication.kt | 17 - .../com/carriez/flutter_hbb/MainService.kt | 729 - .../PermissionRequestTransparentActivity.kt | 54 - .../carriez/flutter_hbb/RdClipboardManager.kt | 197 - .../carriez/flutter_hbb/VolumeController.kt | 78 - .../kotlin/com/carriez/flutter_hbb/common.kt | 157 - .../android/app/src/main/kotlin/ffi.kt | 30 - .../res/drawable-v21/launch_background.xml | 12 - .../app/src/main/res/drawable/check_blue.xml | 5 - .../app/src/main/res/drawable/close_red.xml | 5 - .../src/main/res/drawable/floating_window.xml | 7 - .../main/res/drawable/launch_background.xml | 12 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 - .../app/src/main/res/values-night/styles.xml | 18 - .../app/src/main/res/values/colors.xml | 4 - .../res/values/ic_launcher_background.xml | 4 - .../app/src/main/res/values/strings.xml | 4 - .../app/src/main/res/values/styles.xml | 26 - .../res/xml/accessibility_service_config.xml | 7 - .../app/src/profile/AndroidManifest.xml | 7 - .../flutter/android/build.gradle | 19 - .../flutter/android/gradle.properties | 4 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../flutter/android/settings.gradle | 25 - .../flutter/assets/address_book.ttf | Bin 1792 -> 0 bytes .../flutter/assets/device_group.ttf | Bin 2012 -> 0 bytes .../flutter/assets/gestures.ttf | Bin 8068 -> 0 bytes .../rustdesk-as-ref/flutter/assets/more.ttf | Bin 1620 -> 0 bytes .../flutter/assets/peer_searchbar.ttf | Bin 1940 -> 0 bytes .../rustdesk-as-ref/flutter/assets/tabbar.ttf | Bin 2288 -> 0 bytes .../rustdesk-as-ref/flutter/build_android.sh | 10 - .../flutter/build_android_deps.sh | 88 - .../rustdesk-as-ref/flutter/build_fdroid.sh | 630 - shelled/rustdesk-as-ref/flutter/build_ios.sh | 8 - .../rustdesk-as-ref/flutter/ios/.gitignore | 33 - .../ios/Flutter/AppFrameworkInfo.plist | 26 - .../flutter/ios/Flutter/Debug.xcconfig | 2 - .../flutter/ios/Flutter/Release.xcconfig | 2 - shelled/rustdesk-as-ref/flutter/ios/Podfile | 45 - .../rustdesk-as-ref/flutter/ios/Podfile.lock | 142 - .../ios/Runner.xcodeproj/project.pbxproj | 756 -- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../xcshareddata/xcschemes/Runner.xcscheme | 87 - .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../flutter/ios/Runner/AppDelegate.swift | 19 - .../AppIcon.appiconset/Contents.json | 122 - .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 - .../ios/Runner/Base.lproj/Main.storyboard | 29 - .../ios/Runner/GoogleService-Info.plist | 36 - .../flutter/ios/Runner/Info.plist | 82 - .../ios/Runner/Runner-Bridging-Header.h | 3 - .../flutter/ios/Runner/Runner.entitlements | 10 - .../flutter/ios/exportOptions.plist | 15 - shelled/rustdesk-as-ref/flutter/ios_arm64.sh | 2 - shelled/rustdesk-as-ref/flutter/ios_x64.sh | 2 - .../rustdesk-as-ref/flutter/lib/common.dart | 4161 ------ .../lib/common/formatter/id_formatter.dart | 60 - .../flutter/lib/common/hbbs/hbbs.dart | 302 - .../flutter/lib/common/shared_state.dart | 368 - .../lib/common/widgets/address_book.dart | 899 -- .../widgets/animated_rotation_widget.dart | 53 - .../lib/common/widgets/audio_input.dart | 81 - .../lib/common/widgets/autocomplete.dart | 257 - .../flutter/lib/common/widgets/chat_page.dart | 180 - .../common/widgets/connection_page_title.dart | 38 - .../lib/common/widgets/custom_password.dart | 129 - .../lib/common/widgets/custom_scale_base.dart | 156 - .../flutter/lib/common/widgets/dialog.dart | 2867 ---- .../flutter/lib/common/widgets/gestures.dart | 797 -- .../flutter/lib/common/widgets/login.dart | 751 - .../flutter/lib/common/widgets/my_group.dart | 309 - .../flutter/lib/common/widgets/overlay.dart | 674 - .../flutter/lib/common/widgets/peer_card.dart | 1581 --- .../lib/common/widgets/peer_tab_page.dart | 1039 -- .../lib/common/widgets/peers_view.dart | 598 - .../lib/common/widgets/remote_input.dart | 680 - .../lib/common/widgets/setting_widgets.dart | 340 - .../flutter/lib/common/widgets/toolbar.dart | 1024 -- .../rustdesk-as-ref/flutter/lib/consts.dart | 685 - .../lib/desktop/pages/connection_page.dart | 615 - .../lib/desktop/pages/desktop_home_page.dart | 1146 -- .../desktop/pages/desktop_setting_page.dart | 3124 ----- .../lib/desktop/pages/desktop_tab_page.dart | 119 - .../lib/desktop/pages/file_manager_page.dart | 1694 --- .../desktop/pages/file_manager_tab_page.dart | 177 - .../lib/desktop/pages/install_page.dart | 274 - .../lib/desktop/pages/port_forward_page.dart | 357 - .../desktop/pages/port_forward_tab_page.dart | 149 - .../lib/desktop/pages/remote_page.dart | 1054 -- .../lib/desktop/pages/remote_tab_page.dart | 624 - .../lib/desktop/pages/server_page.dart | 1415 -- .../pages/terminal_connection_manager.dart | 98 - .../lib/desktop/pages/terminal_page.dart | 205 - .../lib/desktop/pages/terminal_tab_page.dart | 591 - .../lib/desktop/pages/view_camera_page.dart | 717 - .../desktop/pages/view_camera_tab_page.dart | 522 - .../screen/desktop_file_transfer_screen.dart | 30 - .../screen/desktop_port_forward_screen.dart | 27 - .../desktop/screen/desktop_remote_screen.dart | 35 - .../screen/desktop_terminal_screen.dart | 27 - .../screen/desktop_view_camera_screen.dart | 35 - .../flutter/lib/desktop/widgets/button.dart | 171 - .../lib/desktop/widgets/dragable_divider.dart | 52 - .../widgets/kb_layout_type_chooser.dart | 225 - .../widgets/list_search_action_listener.dart | 76 - .../widgets/material_mod_popup_menu.dart | 1434 -- .../lib/desktop/widgets/menu_button.dart | 64 - .../lib/desktop/widgets/popup_menu.dart | 755 -- .../lib/desktop/widgets/refresh_wrapper.dart | 45 - .../lib/desktop/widgets/remote_toolbar.dart | 2801 ---- .../lib/desktop/widgets/tabbar_widget.dart | 1540 --- .../lib/desktop/widgets/titlebar_widget.dart | 31 - .../lib/desktop/widgets/update_progress.dart | 267 - shelled/rustdesk-as-ref/flutter/lib/main.dart | 594 - .../lib/mobile/pages/connection_page.dart | 377 - .../lib/mobile/pages/file_manager_page.dart | 769 -- .../flutter/lib/mobile/pages/home_page.dart | 255 - .../flutter/lib/mobile/pages/remote_page.dart | 1430 -- .../flutter/lib/mobile/pages/scan_page.dart | 165 - .../flutter/lib/mobile/pages/server_page.dart | 942 -- .../lib/mobile/pages/settings_page.dart | 1354 -- .../lib/mobile/pages/terminal_page.dart | 441 - .../lib/mobile/pages/view_camera_page.dart | 729 - .../mobile/widgets/custom_scale_widget.dart | 71 - .../flutter/lib/mobile/widgets/dialog.dart | 234 - .../lib/mobile/widgets/floating_mouse.dart | 1209 -- .../widgets/floating_mouse_widgets.dart | 905 -- .../lib/mobile/widgets/gesture_help.dart | 391 - .../flutter/lib/models/ab_model.dart | 1981 --- .../flutter/lib/models/chat_model.dart | 562 - .../flutter/lib/models/cm_file_model.dart | 328 - .../lib/models/desktop_render_texture.dart | 256 - .../flutter/lib/models/file_model.dart | 1849 --- .../flutter/lib/models/group_model.dart | 377 - .../flutter/lib/models/input_model.dart | 1930 --- .../flutter/lib/models/model.dart | 4188 ------ .../flutter/lib/models/native_model.dart | 290 - .../flutter/lib/models/peer_model.dart | 287 - .../flutter/lib/models/peer_tab_model.dart | 270 - .../flutter/lib/models/platform_model.dart | 16 - .../flutter/lib/models/printer_model.dart | 48 - .../lib/models/relative_mouse_model.dart | 1061 -- .../flutter/lib/models/server_model.dart | 943 -- .../flutter/lib/models/state_model.dart | 147 - .../flutter/lib/models/terminal_model.dart | 433 - .../flutter/lib/models/user_model.dart | 246 - .../flutter/lib/models/web_model.dart | 195 - .../flutter/lib/native/common.dart | 17 - .../flutter/lib/native/custom_cursor.dart | 44 - .../flutter/lib/native/win32.dart | 41 - .../flutter/lib/plugin/common.dart | 42 - .../flutter/lib/plugin/event.dart | 18 - .../flutter/lib/plugin/handlers.dart | 79 - .../flutter/lib/plugin/manager.dart | 319 - .../flutter/lib/plugin/model.dart | 110 - .../flutter/lib/plugin/ui_manager.dart | 17 - .../flutter/lib/plugin/utils/dialogs.dart | 86 - .../flutter/lib/plugin/widgets/desc_ui.dart | 301 - .../lib/plugin/widgets/desktop_settings.dart | 202 - .../flutter/lib/utils/event_loop.dart | 79 - .../flutter/lib/utils/http_service.dart | 126 - .../flutter/lib/utils/image.dart | 133 - .../lib/utils/multi_window_manager.dart | 581 - .../flutter/lib/utils/platform_channel.dart | 45 - .../lib/utils/relative_mouse_accumulator.dart | 58 - .../flutter/lib/utils/scale.dart | 34 - .../flutter/lib/web/bridge.dart | 2038 --- .../flutter/lib/web/common.dart | 21 - .../flutter/lib/web/custom_cursor.dart | 127 - .../flutter/lib/web/dummy.dart | 14 - .../flutter/lib/web/plugin/handlers.dart | 14 - .../flutter/lib/web/settings_page.dart | 26 - .../lib/web/texture_rgba_renderer.dart | 20 - .../flutter/lib/web/web_unique.dart | 30 - .../flutter/lib/web/win32.dart | 5 - .../rustdesk-as-ref/flutter/linux/.gitignore | 1 - .../flutter/linux/CMakeLists.txt | 209 - .../flutter/linux/bump_mouse.cc | 18 - .../flutter/linux/bump_mouse.h | 3 - .../flutter/linux/bump_mouse_x11.cc | 30 - .../flutter/linux/bump_mouse_x11.h | 3 - .../flutter/linux/flutter/CMakeLists.txt | 88 - shelled/rustdesk-as-ref/flutter/linux/main.cc | 124 - .../flutter/linux/my_application.cc | 262 - .../flutter/linux/my_application.h | 18 - .../linux/wayland_shortcuts_inhibit.cc | 244 - .../flutter/linux/wayland_shortcuts_inhibit.h | 22 - .../rustdesk-as-ref/flutter/macos/.gitignore | 7 - .../macos/Flutter/Flutter-Debug.xcconfig | 2 - .../macos/Flutter/Flutter-Release.xcconfig | 2 - shelled/rustdesk-as-ref/flutter/macos/Podfile | 40 - .../flutter/macos/Podfile.lock | 125 - .../macos/Runner.xcodeproj/project.pbxproj | 690 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/xcschemes/Runner.xcscheme | 87 - .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../flutter/macos/Runner/AppDelegate.swift | 24 - .../flutter/macos/Runner/AppIcon.icns | Bin 27761 -> 0 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 343 - .../macos/Runner/Configs/AppInfo.xcconfig | 14 - .../macos/Runner/Configs/Debug.xcconfig | 2 - .../macos/Runner/Configs/Release.xcconfig | 2 - .../macos/Runner/Configs/Warnings.xcconfig | 13 - .../macos/Runner/DebugProfile.entitlements | 14 - .../flutter/macos/Runner/Info.plist | 51 - .../macos/Runner/MainFlutterWindow.swift | 286 - .../flutter/macos/Runner/Release.entitlements | 14 - shelled/rustdesk-as-ref/flutter/ndk_arm.sh | 2 - shelled/rustdesk-as-ref/flutter/ndk_arm64.sh | 2 - shelled/rustdesk-as-ref/flutter/ndk_x64.sh | 2 - shelled/rustdesk-as-ref/flutter/ndk_x86.sh | 10 - shelled/rustdesk-as-ref/flutter/pubspec.lock | 1663 --- shelled/rustdesk-as-ref/flutter/pubspec.yaml | 200 - shelled/rustdesk-as-ref/flutter/run.sh | 9 - .../rustdesk-as-ref/flutter/test/cm_test.dart | 62 - .../flutter/windows/.gitignore | 17 - .../flutter/windows/CMakeLists.txt | 122 - .../flutter/windows/flutter/CMakeLists.txt | 109 - .../flutter/windows/runner/CMakeLists.txt | 40 - .../flutter/windows/runner/Runner.rc | 121 - .../flutter/windows/runner/flutter_window.cpp | 127 - .../flutter/windows/runner/flutter_window.h | 33 - .../flutter/windows/runner/main.cpp | 168 - .../flutter/windows/runner/resource.h | 16 - .../windows/runner/resources/app_icon.ico | Bin 1961 -> 0 bytes .../windows/runner/runner.exe.manifest | 20 - .../flutter/windows/runner/utils.cpp | 64 - .../flutter/windows/runner/utils.h | 19 - .../flutter/windows/runner/win32_desktop.cpp | 82 - .../flutter/windows/runner/win32_desktop.h | 13 - .../flutter/windows/runner/win32_window.cpp | 338 - .../flutter/windows/runner/win32_window.h | 99 - .../rustdesk-as-ref/libs/clipboard/Cargo.toml | 57 - .../rustdesk-as-ref/libs/clipboard/README.md | 161 - .../rustdesk-as-ref/libs/clipboard/build.rs | 35 - .../libs/clipboard/src/cliprdr.h | 247 - .../libs/clipboard/src/context_send.rs | 79 - .../rustdesk-as-ref/libs/clipboard/src/lib.rs | 298 - .../libs/clipboard/src/platform/mod.rs | 26 - .../clipboard/src/platform/unix/filetype.rs | 188 - .../clipboard/src/platform/unix/fuse/cs.rs | 1010 -- .../clipboard/src/platform/unix/fuse/mod.rs | 225 - .../clipboard/src/platform/unix/local_file.rs | 387 - .../src/platform/unix/macos/README.md | 25 - .../platform/unix/macos/item_data_provider.rs | 77 - .../clipboard/src/platform/unix/macos/mod.rs | 14 - .../src/platform/unix/macos/paste_observer.rs | 179 - .../src/platform/unix/macos/paste_task.rs | 639 - .../platform/unix/macos/pasteboard_context.rs | 460 - .../libs/clipboard/src/platform/unix/mod.rs | 58 - .../clipboard/src/platform/unix/serv_files.rs | 271 - .../libs/clipboard/src/platform/windows.rs | 1327 -- .../libs/clipboard/src/windows/wf_cliprdr.c | 3380 ----- .../rustdesk-as-ref/libs/enigo/.gitattributes | 1 - .../.github/ISSUE_TEMPLATE/bug_report.md | 25 - .../.github/ISSUE_TEMPLATE/feature_request.md | 20 - .../enigo/.github/ISSUE_TEMPLATE/question.md | 19 - shelled/rustdesk-as-ref/libs/enigo/.gitignore | 14 - .../rustdesk-as-ref/libs/enigo/.travis.yml | 15 - shelled/rustdesk-as-ref/libs/enigo/Cargo.toml | 44 - shelled/rustdesk-as-ref/libs/enigo/LICENSE | 21 - shelled/rustdesk-as-ref/libs/enigo/README.md | 46 - .../rustdesk-as-ref/libs/enigo/appveyor.yml | 121 - shelled/rustdesk-as-ref/libs/enigo/build.rs | 61 - .../libs/enigo/examples/dsl.rs | 11 - .../libs/enigo/examples/key.rs | 17 - .../libs/enigo/examples/keyboard.rs | 16 - .../libs/enigo/examples/mouse.rs | 54 - .../libs/enigo/examples/timer.rs | 22 - .../rustdesk-as-ref/libs/enigo/rustfmt.toml | 1 - shelled/rustdesk-as-ref/libs/enigo/src/dsl.rs | 184 - shelled/rustdesk-as-ref/libs/enigo/src/lib.rs | 552 - .../libs/enigo/src/linux/mod.rs | 4 - .../libs/enigo/src/linux/nix_impl.rs | 392 - .../libs/enigo/src/linux/xdo.rs | 412 - .../libs/enigo/src/macos/keycodes.rs | 120 - .../libs/enigo/src/macos/macos_impl.rs | 864 -- .../libs/enigo/src/macos/mod.rs | 4 - .../libs/enigo/src/win/keycodes.rs | 83 - .../rustdesk-as-ref/libs/enigo/src/win/mod.rs | 4 - .../libs/enigo/src/win/win_impl.rs | 478 - shelled/rustdesk-as-ref/libs/hbb_common | 1 - .../libs/libxdo-sys-stub/Cargo.toml | 9 - .../libs/libxdo-sys-stub/src/lib.rs | 505 - .../rustdesk-as-ref/libs/portable/.gitignore | 3 - .../rustdesk-as-ref/libs/portable/Cargo.lock | 285 - .../rustdesk-as-ref/libs/portable/Cargo.toml | 39 - .../rustdesk-as-ref/libs/portable/build.rs | 20 - .../rustdesk-as-ref/libs/portable/generate.py | 108 - .../libs/portable/requirements.txt | 1 - .../libs/portable/src/bin_reader.rs | 139 - .../rustdesk-as-ref/libs/portable/src/main.rs | 248 - .../libs/portable/src/res/spin.gif | Bin 59332 -> 0 bytes .../rustdesk-as-ref/libs/portable/src/ui.rs | 232 - .../libs/remote_printer/Cargo.toml | 11 - .../libs/remote_printer/src/lib.rs | 34 - .../libs/remote_printer/src/setup/driver.rs | 202 - .../libs/remote_printer/src/setup/mod.rs | 101 - .../libs/remote_printer/src/setup/port.rs | 128 - .../libs/remote_printer/src/setup/printer.rs | 161 - .../libs/remote_printer/src/setup/setup.rs | 94 - shelled/rustdesk-as-ref/libs/scrap/.gitignore | 4 - shelled/rustdesk-as-ref/libs/scrap/Cargo.toml | 68 - shelled/rustdesk-as-ref/libs/scrap/README.md | 62 - shelled/rustdesk-as-ref/libs/scrap/build.rs | 267 - .../libs/scrap/examples/benchmark.rs | 331 - .../libs/scrap/examples/capture_mag.rs | 124 - .../libs/scrap/examples/ffplay.rs | 58 - .../libs/scrap/examples/list.rs | 16 - .../libs/scrap/examples/record-screen.rs | 160 - .../libs/scrap/examples/screenshot.rs | 141 - .../libs/scrap/src/android/ffi.rs | 511 - .../libs/scrap/src/android/mod.rs | 3 - .../libs/scrap/src/bindings/aom_ffi.h | 10 - .../libs/scrap/src/bindings/vpx_ffi.h | 9 - .../libs/scrap/src/bindings/yuv_ffi.h | 6 - .../libs/scrap/src/common/android.rs | 189 - .../libs/scrap/src/common/aom.rs | 581 - .../libs/scrap/src/common/camera.rs | 286 - .../libs/scrap/src/common/codec.rs | 1157 -- .../libs/scrap/src/common/convert.rs | 236 - .../libs/scrap/src/common/dxgi.rs | 264 - .../libs/scrap/src/common/hwcodec.rs | 763 -- .../libs/scrap/src/common/linux.rs | 139 - .../libs/scrap/src/common/mediacodec.rs | 171 - .../libs/scrap/src/common/mod.rs | 547 - .../libs/scrap/src/common/quartz.rs | 151 - .../libs/scrap/src/common/record.rs | 423 - .../libs/scrap/src/common/vpx.rs | 26 - .../libs/scrap/src/common/vpxcodec.rs | 597 - .../libs/scrap/src/common/vram.rs | 404 - .../libs/scrap/src/common/wayland.rs | 129 - .../libs/scrap/src/common/x11.rs | 139 - .../libs/scrap/src/dxgi/gdi.rs | 213 - .../libs/scrap/src/dxgi/mag.rs | 651 - .../libs/scrap/src/dxgi/mod.rs | 884 -- shelled/rustdesk-as-ref/libs/scrap/src/lib.rs | 26 - .../libs/scrap/src/quartz/capturer.rs | 111 - .../libs/scrap/src/quartz/config.rs | 75 - .../libs/scrap/src/quartz/display.rs | 87 - .../libs/scrap/src/quartz/ffi.rs | 241 - .../libs/scrap/src/quartz/frame.rs | 71 - .../libs/scrap/src/quartz/mod.rs | 17 - .../rustdesk-as-ref/libs/scrap/src/wayland.rs | 6 - .../libs/scrap/src/wayland/README.md | 11 - .../libs/scrap/src/wayland/capturable.rs | 60 - .../libs/scrap/src/wayland/display.rs | 256 - .../libs/scrap/src/wayland/pipewire.rs | 1528 --- .../src/wayland/remote_desktop_portal.rs | 315 - .../libs/scrap/src/wayland/request_portal.rs | 45 - .../scrap/src/wayland/screencast_portal.rs | 106 - .../libs/scrap/src/x11/capturer.rs | 115 - .../libs/scrap/src/x11/display.rs | 70 - .../rustdesk-as-ref/libs/scrap/src/x11/ffi.rs | 283 - .../libs/scrap/src/x11/iter.rs | 138 - .../rustdesk-as-ref/libs/scrap/src/x11/mod.rs | 10 - .../libs/scrap/src/x11/server.rs | 146 - .../libs/virtual_display/Cargo.lock | 1358 -- .../libs/virtual_display/Cargo.toml | 10 - .../libs/virtual_display/README.md | 3 - .../libs/virtual_display/dylib/Cargo.toml | 19 - .../libs/virtual_display/dylib/README.md | 32 - .../libs/virtual_display/dylib/build.rs | 35 - .../dylib/examples/idd_controller.rs | 188 - .../libs/virtual_display/dylib/src/lib.rs | 191 - .../dylib/src/win10/IddController.c | 1006 -- .../dylib/src/win10/IddController.h | 161 - .../virtual_display/dylib/src/win10/Public.h | 54 - .../virtual_display/dylib/src/win10/idd.rs | 215 - .../virtual_display/dylib/src/win10/mod.rs | 9 - .../examples/virtual_display_1.rs | 102 - .../libs/virtual_display/src/lib.rs | 196 - shelled/rustdesk-as-ref/res/DEBIAN/postinst | 27 - shelled/rustdesk-as-ref/res/DEBIAN/postrm | 11 - shelled/rustdesk-as-ref/res/DEBIAN/preinst | 16 - shelled/rustdesk-as-ref/res/DEBIAN/prerm | 27 - shelled/rustdesk-as-ref/res/PKGBUILD | 35 - shelled/rustdesk-as-ref/res/ab.py | 791 -- shelled/rustdesk-as-ref/res/audits.py | 374 - shelled/rustdesk-as-ref/res/bump.sh | 3 - shelled/rustdesk-as-ref/res/device-groups.py | 274 - shelled/rustdesk-as-ref/res/devices.py | 205 - .../patches/0000-flutter-android-x86.patch | 16 - .../patches/0001-x86-no-debuggable.patch | 24 - shelled/rustdesk-as-ref/res/gen_icon.sh | 8 - shelled/rustdesk-as-ref/res/icon.ico | Bin 99678 -> 0 bytes shelled/rustdesk-as-ref/res/inline-sciter.py | 82 - shelled/rustdesk-as-ref/res/job.py | 321 - shelled/rustdesk-as-ref/res/lang.py | 90 - shelled/rustdesk-as-ref/res/manifest.xml | 36 - shelled/rustdesk-as-ref/res/msi/.gitignore | 13 - .../res/msi/CustomActions/Common.h | 23 - .../res/msi/CustomActions/CustomActions.cpp | 1080 -- .../res/msi/CustomActions/CustomActions.def | 16 - .../msi/CustomActions/CustomActions.vcxproj | 86 - .../res/msi/CustomActions/DeviceUtils.cpp | 84 - .../res/msi/CustomActions/FirewallRules.cpp | 413 - .../res/msi/CustomActions/ReadConfig.cpp | 36 - .../res/msi/CustomActions/RemotePrinter.cpp | 517 - .../res/msi/CustomActions/ServiceUtils.cpp | 175 - .../res/msi/CustomActions/dllmain.cpp | 26 - .../res/msi/CustomActions/framework.h | 10 - .../res/msi/CustomActions/packages.config | 5 - .../res/msi/CustomActions/pch.cpp | 5 - .../res/msi/CustomActions/pch.h | 13 - .../res/msi/Package/Components/Folders.wxs | 38 - .../res/msi/Package/Components/Regs.wxs | 56 - .../res/msi/Package/Components/RustDesk.wxs | 154 - .../Package/Fragments/AddRemoveProperties.wxs | 37 - .../msi/Package/Fragments/CustomActions.wxs | 23 - .../Package/Fragments/ShortcutProperties.wxs | 83 - .../res/msi/Package/Fragments/Upgrades.wxs | 10 - .../res/msi/Package/Includes.wxi | 7 - .../msi/Package/Language/Package.en-us.wxl | 56 - .../res/msi/Package/Language/WixExt_en-us.wxl | 32 - .../res/msi/Package/License.rtf | 303 - .../res/msi/Package/Package.wixproj | 22 - .../res/msi/Package/Package.wxs | 62 - .../res/msi/Package/UI/AnotherApp.wxs | 15 - .../res/msi/Package/UI/MyInstallDirDlg.wxs | 32 - .../res/msi/Package/UI/MyInstallDlg.wxs | 87 - shelled/rustdesk-as-ref/res/msi/README.md | 44 - shelled/rustdesk-as-ref/res/msi/msi.sln | 26 - shelled/rustdesk-as-ref/res/msi/preprocess.py | 560 - shelled/rustdesk-as-ref/res/osx-dist.sh | 14 - shelled/rustdesk-as-ref/res/pacman_install | 47 - .../rustdesk-as-ref/res/pam.d/rustdesk.debian | 5 - .../rustdesk-as-ref/res/pam.d/rustdesk.suse | 5 - .../rustdesk-as-ref/res/rpm-flutter-suse.spec | 98 - shelled/rustdesk-as-ref/res/rpm-flutter.spec | 98 - shelled/rustdesk-as-ref/res/rpm-suse.spec | 93 - shelled/rustdesk-as-ref/res/rpm.spec | 96 - .../rustdesk-as-ref/res/rustdesk-link.desktop | 11 - shelled/rustdesk-as-ref/res/rustdesk.desktop | 19 - shelled/rustdesk-as-ref/res/rustdesk.service | 22 - shelled/rustdesk-as-ref/res/startwm.sh | 130 - shelled/rustdesk-as-ref/res/strategies.py | 301 - shelled/rustdesk-as-ref/res/tray-icon.ico | Bin 4286 -> 0 bytes shelled/rustdesk-as-ref/res/user-groups.py | 302 - shelled/rustdesk-as-ref/res/users.py | 292 - .../res/vcpkg/aom/aom-avx2.diff | 60 - .../res/vcpkg/aom/aom-install.diff | 75 - .../vcpkg/aom/aom-uninitialized-pointer.diff | 13 - .../res/vcpkg/aom/portfile.cmake | 79 - .../rustdesk-as-ref/res/vcpkg/aom/vcpkg.json | 18 - .../ffmpeg/0001-create-lib-libraries.patch | 27 - .../res/vcpkg/ffmpeg/0002-fix-msvc-link.patch | 11 - .../ffmpeg/0003-fix-windowsinclude.patch | 13 - .../res/vcpkg/ffmpeg/0004-dependencies.patch | 65 - .../res/vcpkg/ffmpeg/0005-fix-nasm.patch | 78 - .../vcpkg/ffmpeg/0007-fix-lib-naming.patch | 12 - .../res/vcpkg/ffmpeg/0013-define-WINVER.patch | 15 - .../ffmpeg/0020-fix-aarch64-libswscale.patch | 28 - .../vcpkg/ffmpeg/0024-fix-osx-host-c11.patch | 15 - ...av_stream_get_first_dts-for-chromium.patch | 35 - ...0041-add-const-for-opengl-definition.patch | 13 - .../vcpkg/ffmpeg/0042-fix-arm64-linux.patch | 9 - .../res/vcpkg/ffmpeg/0043-fix-miss-head.patch | 12 - .../res/vcpkg/ffmpeg/build.sh.in | 152 - ...dd-query_timeout-option-for-h264-hev.patch | 71 - ...-amfenc-reconfig-when-bitrate-change.patch | 71 - .../0004-videotoolbox-changing-bitrate.patch | 85 - .../0005-mediacodec-changing-bitrate.patch | 246 - .../ffmpeg/patch/0006-dlopen-libva.patch | 1883 --- .../patch/0007-fix-linux-configure.patch | 30 - .../patch/0008-remove-amf-loop-query.patch | 26 - .../0009-fix-nvenc-reconfigure-blur.patch | 28 - ...10.disable-loading-DLLs-from-app-dir.patch | 31 - ...1-android-mediacodec-encode-align-64.patch | 42 - ...acos-big-sur-CVBufferCopyAttachments.patch | 60 - .../res/vcpkg/ffmpeg/portfile.cmake | 705 - .../vcpkg/ffmpeg/vcpkg-cmake-wrapper.cmake | 47 - .../res/vcpkg/ffmpeg/vcpkg.json | 44 - .../0003-add-uwp-v142-and-v143-support.patch | 168 - .../libvpx/0004-remove-library-suffixes.patch | 13 - .../res/vcpkg/libvpx/portfile.cmake | 316 - .../libvpx/unofficial-libvpx-config.cmake.in | 49 - .../res/vcpkg/libvpx/vcpkg.json | 26 - .../res/vcpkg/libvpx/vpx.pc.in | 12 - .../res/vcpkg/libyuv/fix-cmakelists.patch | 80 - .../res/vcpkg/libyuv/libyuv-config.cmake | 5 - .../res/vcpkg/libyuv/portfile.cmake | 81 - .../rustdesk-as-ref/res/vcpkg/libyuv/usage | 4 - .../res/vcpkg/libyuv/usage-msvc | 9 - .../res/vcpkg/libyuv/vcpkg.json | 22 - .../0003-upgrade-cmake-3.14.patch | 10 - .../res/vcpkg/mfx-dispatch/fix-pkgconf.patch | 39 - .../mfx-dispatch/fix-unresolved-symbol.patch | 66 - .../res/vcpkg/mfx-dispatch/portfile.cmake | 40 - .../res/vcpkg/mfx-dispatch/vcpkg.json | 16 - .../vcpkg/opus/fix-pkgconfig-version.patch | 15 - .../res/vcpkg/opus/portfile.cmake | 61 - .../rustdesk-as-ref/res/vcpkg/opus/vcpkg.json | 22 - shelled/rustdesk-as-ref/res/xorg.conf | 30 - shelled/rustdesk-as-ref/src/auth_2fa.rs | 204 - shelled/rustdesk-as-ref/src/cli.rs | 193 - shelled/rustdesk-as-ref/src/client.rs | 4198 ------ .../rustdesk-as-ref/src/client/file_trait.rs | 193 - shelled/rustdesk-as-ref/src/client/helper.rs | 37 - shelled/rustdesk-as-ref/src/client/io_loop.rs | 2441 ---- .../rustdesk-as-ref/src/client/screenshot.rs | 99 - shelled/rustdesk-as-ref/src/clipboard.rs | 885 -- shelled/rustdesk-as-ref/src/clipboard_file.rs | 427 - shelled/rustdesk-as-ref/src/common.rs | 3007 ---- shelled/rustdesk-as-ref/src/core_main.rs | 850 -- shelled/rustdesk-as-ref/src/custom_server.rs | 219 - shelled/rustdesk-as-ref/src/flutter.rs | 2363 ---- shelled/rustdesk-as-ref/src/flutter_ffi.rs | 3082 ----- shelled/rustdesk-as-ref/src/hbbs_http.rs | 40 - .../rustdesk-as-ref/src/hbbs_http/account.rs | 366 - .../src/hbbs_http/downloader.rs | 309 - .../src/hbbs_http/http_client.rs | 336 - .../src/hbbs_http/record_upload.rs | 211 - shelled/rustdesk-as-ref/src/hbbs_http/sync.rs | 310 - shelled/rustdesk-as-ref/src/ipc.rs | 1700 --- shelled/rustdesk-as-ref/src/kcp_stream.rs | 151 - shelled/rustdesk-as-ref/src/keyboard.rs | 1401 -- shelled/rustdesk-as-ref/src/lan.rs | 344 - shelled/rustdesk-as-ref/src/lang.rs | 269 - shelled/rustdesk-as-ref/src/lang/README.md | 4 - shelled/rustdesk-as-ref/src/lang/ar.rs | 747 - shelled/rustdesk-as-ref/src/lang/be.rs | 747 - shelled/rustdesk-as-ref/src/lang/bg.rs | 747 - shelled/rustdesk-as-ref/src/lang/ca.rs | 747 - shelled/rustdesk-as-ref/src/lang/cn.rs | 747 - shelled/rustdesk-as-ref/src/lang/cs.rs | 747 - shelled/rustdesk-as-ref/src/lang/da.rs | 747 - shelled/rustdesk-as-ref/src/lang/de.rs | 747 - shelled/rustdesk-as-ref/src/lang/el.rs | 747 - shelled/rustdesk-as-ref/src/lang/en.rs | 278 - shelled/rustdesk-as-ref/src/lang/eo.rs | 747 - shelled/rustdesk-as-ref/src/lang/es.rs | 747 - shelled/rustdesk-as-ref/src/lang/et.rs | 747 - shelled/rustdesk-as-ref/src/lang/eu.rs | 747 - shelled/rustdesk-as-ref/src/lang/fa.rs | 747 - shelled/rustdesk-as-ref/src/lang/fi.rs | 747 - shelled/rustdesk-as-ref/src/lang/fr.rs | 747 - shelled/rustdesk-as-ref/src/lang/ge.rs | 747 - shelled/rustdesk-as-ref/src/lang/he.rs | 747 - shelled/rustdesk-as-ref/src/lang/hr.rs | 747 - shelled/rustdesk-as-ref/src/lang/hu.rs | 747 - shelled/rustdesk-as-ref/src/lang/id.rs | 747 - shelled/rustdesk-as-ref/src/lang/it.rs | 747 - shelled/rustdesk-as-ref/src/lang/ja.rs | 747 - shelled/rustdesk-as-ref/src/lang/ko.rs | 747 - shelled/rustdesk-as-ref/src/lang/kz.rs | 747 - shelled/rustdesk-as-ref/src/lang/lt.rs | 747 - shelled/rustdesk-as-ref/src/lang/lv.rs | 747 - shelled/rustdesk-as-ref/src/lang/nb.rs | 747 - shelled/rustdesk-as-ref/src/lang/nl.rs | 747 - shelled/rustdesk-as-ref/src/lang/pl.rs | 747 - shelled/rustdesk-as-ref/src/lang/pt_PT.rs | 747 - shelled/rustdesk-as-ref/src/lang/ptbr.rs | 747 - shelled/rustdesk-as-ref/src/lang/ro.rs | 747 - shelled/rustdesk-as-ref/src/lang/ru.rs | 747 - shelled/rustdesk-as-ref/src/lang/sc.rs | 747 - shelled/rustdesk-as-ref/src/lang/sk.rs | 747 - shelled/rustdesk-as-ref/src/lang/sl.rs | 747 - shelled/rustdesk-as-ref/src/lang/sq.rs | 747 - shelled/rustdesk-as-ref/src/lang/sr.rs | 747 - shelled/rustdesk-as-ref/src/lang/sv.rs | 747 - shelled/rustdesk-as-ref/src/lang/ta.rs | 747 - shelled/rustdesk-as-ref/src/lang/template.rs | 747 - shelled/rustdesk-as-ref/src/lang/th.rs | 747 - shelled/rustdesk-as-ref/src/lang/tr.rs | 747 - shelled/rustdesk-as-ref/src/lang/tw.rs | 747 - shelled/rustdesk-as-ref/src/lang/uk.rs | 747 - shelled/rustdesk-as-ref/src/lang/vi.rs | 747 - shelled/rustdesk-as-ref/src/lib.rs | 79 - shelled/rustdesk-as-ref/src/main.rs | 104 - shelled/rustdesk-as-ref/src/naming.rs | 28 - .../rustdesk-as-ref/src/platform/delegate.rs | 277 - .../rustdesk-as-ref/src/platform/gtk_sudo.rs | 773 -- shelled/rustdesk-as-ref/src/platform/linux.rs | 2209 --- .../src/platform/linux_desktop_manager.rs | 744 - shelled/rustdesk-as-ref/src/platform/macos.mm | 909 -- shelled/rustdesk-as-ref/src/platform/macos.rs | 1230 -- shelled/rustdesk-as-ref/src/platform/mod.rs | 248 - .../platform/privileges_scripts/agent.plist | 37 - .../platform/privileges_scripts/daemon.plist | 30 - .../platform/privileges_scripts/install.scpt | 16 - .../privileges_scripts/uninstall.scpt | 6 - .../platform/privileges_scripts/update.scpt | 26 - .../src/platform/win_device.rs | 459 - .../rustdesk-as-ref/src/platform/windows.cc | 1058 -- .../rustdesk-as-ref/src/platform/windows.rs | 4384 ------ .../src/platform/windows_delete_test_cert.cc | 406 - .../src/plugin/callback_ext.rs | 44 - .../src/plugin/callback_msg.rs | 411 - shelled/rustdesk-as-ref/src/plugin/config.rs | 363 - shelled/rustdesk-as-ref/src/plugin/desc.rs | 100 - shelled/rustdesk-as-ref/src/plugin/errno.rs | 50 - shelled/rustdesk-as-ref/src/plugin/ipc.rs | 230 - shelled/rustdesk-as-ref/src/plugin/manager.rs | 600 - shelled/rustdesk-as-ref/src/plugin/mod.rs | 188 - shelled/rustdesk-as-ref/src/plugin/native.rs | 40 - .../src/plugin/native_handlers/macros.rs | 27 - .../src/plugin/native_handlers/mod.rs | 126 - .../src/plugin/native_handlers/session.rs | 219 - .../src/plugin/native_handlers/ui.rs | 143 - shelled/rustdesk-as-ref/src/plugin/plog.rs | 34 - shelled/rustdesk-as-ref/src/plugin/plugins.rs | 659 - shelled/rustdesk-as-ref/src/port_forward.rs | 220 - shelled/rustdesk-as-ref/src/privacy_mode.rs | 431 - .../rustdesk-as-ref/src/privacy_mode/macos.rs | 81 - .../privacy_mode/win_exclude_from_capture.rs | 11 - .../src/privacy_mode/win_input.rs | 276 - .../src/privacy_mode/win_mag.rs | 57 - .../src/privacy_mode/win_topmost_window.rs | 383 - .../src/privacy_mode/win_virtual_display.rs | 586 - .../src/rendezvous_mediator.rs | 933 -- shelled/rustdesk-as-ref/src/server.rs | 834 -- .../src/server/audio_service.rs | 527 - .../src/server/clipboard_service.rs | 274 - .../rustdesk-as-ref/src/server/connection.rs | 5671 -------- shelled/rustdesk-as-ref/src/server/dbus.rs | 92 - .../src/server/display_service.rs | 488 - .../src/server/input_service.rs | 2373 ---- .../src/server/portable_service.rs | 992 -- .../src/server/printer_service.rs | 163 - .../rustdesk-as-ref/src/server/rdp_input.rs | 605 - shelled/rustdesk-as-ref/src/server/service.rs | 358 - .../src/server/terminal_helper.rs | 1062 -- .../src/server/terminal_service.rs | 1847 --- shelled/rustdesk-as-ref/src/server/uinput.rs | 1307 -- .../rustdesk-as-ref/src/server/video_qos.rs | 595 - .../src/server/video_service.rs | 1419 -- shelled/rustdesk-as-ref/src/server/wayland.rs | 308 - shelled/rustdesk-as-ref/src/service.rs | 11 - shelled/rustdesk-as-ref/src/tray.rs | 281 - shelled/rustdesk-as-ref/src/ui.rs | 872 -- shelled/rustdesk-as-ref/src/ui/ab.tis | 772 -- shelled/rustdesk-as-ref/src/ui/chatbox.html | 35 - shelled/rustdesk-as-ref/src/ui/cm.css | 279 - shelled/rustdesk-as-ref/src/ui/cm.html | 21 - shelled/rustdesk-as-ref/src/ui/cm.rs | 186 - shelled/rustdesk-as-ref/src/ui/cm.tis | 569 - shelled/rustdesk-as-ref/src/ui/common.css | 492 - shelled/rustdesk-as-ref/src/ui/common.tis | 482 - .../rustdesk-as-ref/src/ui/file_transfer.css | 269 - .../rustdesk-as-ref/src/ui/file_transfer.tis | 819 -- shelled/rustdesk-as-ref/src/ui/grid.tis | 258 - shelled/rustdesk-as-ref/src/ui/header.css | 97 - shelled/rustdesk-as-ref/src/ui/header.tis | 716 - shelled/rustdesk-as-ref/src/ui/index.css | 441 - shelled/rustdesk-as-ref/src/ui/index.html | 19 - shelled/rustdesk-as-ref/src/ui/index.tis | 1680 --- shelled/rustdesk-as-ref/src/ui/install.html | 22 - shelled/rustdesk-as-ref/src/ui/install.tis | 70 - shelled/rustdesk-as-ref/src/ui/msgbox.tis | 390 - .../rustdesk-as-ref/src/ui/port_forward.tis | 77 - shelled/rustdesk-as-ref/src/ui/printer.tis | 41 - shelled/rustdesk-as-ref/src/ui/remote.css | 46 - shelled/rustdesk-as-ref/src/ui/remote.html | 44 - shelled/rustdesk-as-ref/src/ui/remote.rs | 918 -- shelled/rustdesk-as-ref/src/ui/remote.tis | 599 - .../rustdesk-as-ref/src/ui_cm_interface.rs | 1853 --- shelled/rustdesk-as-ref/src/ui_interface.rs | 1611 --- .../src/ui_session_interface.rs | 2055 --- shelled/rustdesk-as-ref/src/updater.rs | 290 - .../src/virtual_display_manager.rs | 925 -- .../rustdesk-as-ref/src/whiteboard/client.rs | 258 - .../rustdesk-as-ref/src/whiteboard/linux.rs | 463 - .../rustdesk-as-ref/src/whiteboard/macos.rs | 323 - shelled/rustdesk-as-ref/src/whiteboard/mod.rs | 41 - .../rustdesk-as-ref/src/whiteboard/server.rs | 171 - .../src/whiteboard/win_linux.rs | 180 - .../rustdesk-as-ref/src/whiteboard/windows.rs | 230 - shelled/rustdesk-as-ref/vcpkg.json | 105 - shelled/rustdesk-as-ref/web_deps.tar.gz | Bin 1864351 -> 0 bytes shelled/rustdesk-as-ref/web_deps/libopus.js | 5555 -------- shelled/rustdesk-as-ref/web_deps/libopus.wasm | Bin 489750 -> 0 bytes .../web_deps/ogvjs-1.8.6/COPYING | 21 - .../web_deps/ogvjs-1.8.6/COPYING-dav1d.txt | 23 - .../web_deps/ogvjs-1.8.6/COPYING-ogg.txt | 28 - .../web_deps/ogvjs-1.8.6/COPYING-opus.txt | 44 - .../web_deps/ogvjs-1.8.6/COPYING-theora.txt | 28 - .../web_deps/ogvjs-1.8.6/COPYING-vorbis.txt | 28 - .../web_deps/ogvjs-1.8.6/LICENSE-nestegg.txt | 13 - .../web_deps/ogvjs-1.8.6/LICENSE-vpx.txt | 31 - .../web_deps/ogvjs-1.8.6/PATENTS-vpx.txt | 23 - .../web_deps/ogvjs-1.8.6/README.md | 391 - .../ogv-decoder-audio-opus-wasm.js | 39 - .../ogv-decoder-audio-opus-wasm.wasm | Bin 143417 -> 0 bytes .../ogv-decoder-audio-vorbis-wasm.js | 40 - .../ogv-decoder-audio-vorbis-wasm.wasm | Bin 155787 -> 0 bytes .../ogv-decoder-video-av1-mt-wasm.js | 21 - .../ogv-decoder-video-av1-mt-wasm.wasm | Bin 418335 -> 0 bytes .../ogv-decoder-video-av1-mt-wasm.worker.js | 1 - .../ogv-decoder-video-av1-simd-mt-wasm.js | 21 - .../ogv-decoder-video-av1-simd-mt-wasm.wasm | Bin 495935 -> 0 bytes ...v-decoder-video-av1-simd-mt-wasm.worker.js | 1 - .../ogv-decoder-video-av1-simd-wasm.js | 43 - .../ogv-decoder-video-av1-simd-wasm.wasm | Bin 484008 -> 0 bytes .../ogvjs-1.8.6/ogv-decoder-video-av1-wasm.js | 43 - .../ogv-decoder-video-av1-wasm.wasm | Bin 406454 -> 0 bytes .../ogv-decoder-video-theora-wasm.js | 42 - .../ogv-decoder-video-theora-wasm.wasm | Bin 48923 -> 0 bytes .../ogv-decoder-video-vp8-mt-wasm.js | 21 - .../ogv-decoder-video-vp8-mt-wasm.wasm | Bin 139143 -> 0 bytes .../ogv-decoder-video-vp8-mt-wasm.worker.js | 1 - .../ogvjs-1.8.6/ogv-decoder-video-vp8-wasm.js | 44 - .../ogv-decoder-video-vp8-wasm.wasm | Bin 113790 -> 0 bytes .../ogv-decoder-video-vp9-mt-wasm.js | 21 - .../ogv-decoder-video-vp9-mt-wasm.wasm | Bin 259095 -> 0 bytes .../ogv-decoder-video-vp9-mt-wasm.worker.js | 1 - .../ogv-decoder-video-vp9-simd-mt-wasm.js | 21 - .../ogv-decoder-video-vp9-simd-mt-wasm.wasm | Bin 277701 -> 0 bytes ...v-decoder-video-vp9-simd-mt-wasm.worker.js | 1 - .../ogv-decoder-video-vp9-simd-wasm.js | 45 - .../ogv-decoder-video-vp9-simd-wasm.wasm | Bin 260523 -> 0 bytes .../ogvjs-1.8.6/ogv-decoder-video-vp9-wasm.js | 45 - .../ogv-decoder-video-vp9-wasm.wasm | Bin 241857 -> 0 bytes .../ogvjs-1.8.6/ogv-demuxer-ogg-wasm.js | 43 - .../ogvjs-1.8.6/ogv-demuxer-ogg-wasm.wasm | Bin 39042 -> 0 bytes .../ogvjs-1.8.6/ogv-demuxer-webm-wasm.js | 46 - .../ogvjs-1.8.6/ogv-demuxer-webm-wasm.wasm | Bin 43838 -> 0 bytes .../web_deps/ogvjs-1.8.6/ogv-es2017.js | 2 - .../web_deps/ogvjs-1.8.6/ogv-support.js | 1 - .../web_deps/ogvjs-1.8.6/ogv-version.js | 1 - .../web_deps/ogvjs-1.8.6/ogv-worker-audio.js | 1 - .../web_deps/ogvjs-1.8.6/ogv-worker-video.js | 1 - .../web_deps/ogvjs-1.8.6/ogv.js | 2 - .../web_deps/yuv-canvas-1.2.6.js | 1234 -- shelled/rustdesk-web-client/css/style.css | 468 - shelled/rustdesk-web-client/index.html | 152 - shelled/rustdesk-web-client/js/app.js | 586 - shelled/rustdesk-web-client/js/audio.js | 260 - shelled/rustdesk-web-client/js/connection.js | 1017 -- shelled/rustdesk-web-client/js/crypto.js | 341 - shelled/rustdesk-web-client/js/input.js | 412 - shelled/rustdesk-web-client/js/proto.js | 1209 -- shelled/rustdesk-web-client/js/video.js | 409 - shelled/rustdesk-web-client/lib/libopus.js | 5555 -------- shelled/rustdesk-web-client/lib/libopus.wasm | Bin 489750 -> 0 bytes .../lib/ogvjs-1.8.6/COPYING | 21 - .../lib/ogvjs-1.8.6/COPYING-dav1d.txt | 23 - .../lib/ogvjs-1.8.6/COPYING-ogg.txt | 28 - .../lib/ogvjs-1.8.6/COPYING-opus.txt | 44 - .../lib/ogvjs-1.8.6/COPYING-theora.txt | 28 - .../lib/ogvjs-1.8.6/COPYING-vorbis.txt | 28 - .../lib/ogvjs-1.8.6/LICENSE-nestegg.txt | 13 - .../lib/ogvjs-1.8.6/LICENSE-vpx.txt | 31 - .../lib/ogvjs-1.8.6/PATENTS-vpx.txt | 23 - .../lib/ogvjs-1.8.6/README.md | 391 - .../ogv-decoder-audio-opus-wasm.js | 39 - .../ogv-decoder-audio-opus-wasm.wasm | Bin 143417 -> 0 bytes .../ogv-decoder-audio-vorbis-wasm.js | 40 - .../ogv-decoder-audio-vorbis-wasm.wasm | Bin 155787 -> 0 bytes .../ogv-decoder-video-av1-mt-wasm.js | 21 - .../ogv-decoder-video-av1-mt-wasm.wasm | Bin 418335 -> 0 bytes .../ogv-decoder-video-av1-mt-wasm.worker.js | 1 - .../ogv-decoder-video-av1-simd-mt-wasm.js | 21 - .../ogv-decoder-video-av1-simd-mt-wasm.wasm | Bin 495935 -> 0 bytes ...v-decoder-video-av1-simd-mt-wasm.worker.js | 1 - .../ogv-decoder-video-av1-simd-wasm.js | 43 - .../ogv-decoder-video-av1-simd-wasm.wasm | Bin 484008 -> 0 bytes .../ogvjs-1.8.6/ogv-decoder-video-av1-wasm.js | 43 - .../ogv-decoder-video-av1-wasm.wasm | Bin 406454 -> 0 bytes .../ogv-decoder-video-theora-wasm.js | 42 - .../ogv-decoder-video-theora-wasm.wasm | Bin 48923 -> 0 bytes .../ogv-decoder-video-vp8-mt-wasm.js | 21 - .../ogv-decoder-video-vp8-mt-wasm.wasm | Bin 139143 -> 0 bytes .../ogv-decoder-video-vp8-mt-wasm.worker.js | 1 - .../ogvjs-1.8.6/ogv-decoder-video-vp8-wasm.js | 44 - .../ogv-decoder-video-vp8-wasm.wasm | Bin 113790 -> 0 bytes .../ogv-decoder-video-vp9-mt-wasm.js | 21 - .../ogv-decoder-video-vp9-mt-wasm.wasm | Bin 259095 -> 0 bytes .../ogv-decoder-video-vp9-mt-wasm.worker.js | 1 - .../ogv-decoder-video-vp9-simd-mt-wasm.js | 21 - .../ogv-decoder-video-vp9-simd-mt-wasm.wasm | Bin 277701 -> 0 bytes ...v-decoder-video-vp9-simd-mt-wasm.worker.js | 1 - .../ogv-decoder-video-vp9-simd-wasm.js | 45 - .../ogv-decoder-video-vp9-simd-wasm.wasm | Bin 260523 -> 0 bytes .../ogvjs-1.8.6/ogv-decoder-video-vp9-wasm.js | 45 - .../ogv-decoder-video-vp9-wasm.wasm | Bin 241857 -> 0 bytes .../lib/ogvjs-1.8.6/ogv-demuxer-ogg-wasm.js | 43 - .../lib/ogvjs-1.8.6/ogv-demuxer-ogg-wasm.wasm | Bin 39042 -> 0 bytes .../lib/ogvjs-1.8.6/ogv-demuxer-webm-wasm.js | 46 - .../ogvjs-1.8.6/ogv-demuxer-webm-wasm.wasm | Bin 43838 -> 0 bytes .../lib/ogvjs-1.8.6/ogv-es2017.js | 2 - .../lib/ogvjs-1.8.6/ogv-support.js | 1 - .../lib/ogvjs-1.8.6/ogv-version.js | 1 - .../lib/ogvjs-1.8.6/ogv-worker-audio.js | 1 - .../lib/ogvjs-1.8.6/ogv-worker-video.js | 1 - .../lib/ogvjs-1.8.6/ogv.js | 2 - .../lib/yuv-canvas-1.2.6.js | 1234 -- shelled/shelled-os-ui/.gitignore | 4 - shelled/shelled-os-ui/package-lock.json | 244 - shelled/shelled-os-ui/package.json | 16 - shelled/shelled-os-ui/src-tauri/Cargo.lock | 4946 ------- shelled/shelled-os-ui/src-tauri/Cargo.toml | 14 - .../src-tauri/binaries/README.md | 95 - shelled/shelled-os-ui/src-tauri/build.rs | 3 - .../src-tauri/capabilities/default.json | 13 - .../src-tauri/gen/schemas/acl-manifests.json | 1 - .../src-tauri/gen/schemas/capabilities.json | 1 - .../src-tauri/gen/schemas/desktop-schema.json | 2244 --- .../src-tauri/gen/schemas/windows-schema.json | 2244 --- .../shelled-os-ui/src-tauri/icons/128x128.png | Bin 16589 -> 0 bytes .../src-tauri/icons/128x128@2x.png | Bin 63624 -> 0 bytes .../shelled-os-ui/src-tauri/icons/32x32.png | Bin 1981 -> 0 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 63624 -> 0 bytes .../shelled-os-ui/src-tauri/icons/icon.ico | Bin 311270 -> 0 bytes .../shelled-os-ui/src-tauri/icons/icon.png | Bin 86111 -> 0 bytes shelled/shelled-os-ui/src-tauri/src/main.rs | 229 - .../shelled-os-ui/src-tauri/tauri.conf.json | 22 - shelled/shelled-os-ui/src/css/browser.css | 52 - .../shelled-os-ui/src/css/file-explorer.css | 62 - shelled/shelled-os-ui/src/css/main.css | 94 - .../shelled-os-ui/src/css/remote-desktop.css | 217 - shelled/shelled-os-ui/src/css/settings.css | 71 - shelled/shelled-os-ui/src/css/start-menu.css | 115 - shelled/shelled-os-ui/src/css/taskbar.css | 76 - shelled/shelled-os-ui/src/css/variables.css | 26 - shelled/shelled-os-ui/src/index.html | 168 - .../src/js/components/Browser.js | 26 - .../src/js/components/FileExplorer.js | 68 - .../src/js/components/RemoteDesktop.js | 142 - .../src/js/components/Settings.js | 77 - .../src/js/components/StartMenu.js | 92 - .../src/js/components/Taskbar.js | 80 - shelled/shelled-os-ui/src/js/main.js | 62 - 950 files changed, 297931 deletions(-) delete mode 100644 shelled/package-lock.json delete mode 100644 shelled/plan-os-ui.md delete mode 100644 shelled/rustdesk-as-ref/.cargo/config.toml delete mode 100644 shelled/rustdesk-as-ref/.gitattributes delete mode 100644 shelled/rustdesk-as-ref/.github/FUNDING.yml delete mode 100644 shelled/rustdesk-as-ref/.github/ISSUE_TEMPLATE/bug_report.yaml delete mode 100644 shelled/rustdesk-as-ref/.github/ISSUE_TEMPLATE/config.yml delete mode 100644 shelled/rustdesk-as-ref/.github/dependabot.yml delete mode 100644 shelled/rustdesk-as-ref/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff delete mode 100644 shelled/rustdesk-as-ref/.github/workflows/bridge.yml delete mode 100644 shelled/rustdesk-as-ref/.github/workflows/ci.yml delete mode 100644 shelled/rustdesk-as-ref/.github/workflows/clear-cache.yml delete mode 100644 shelled/rustdesk-as-ref/.github/workflows/fdroid.yml delete mode 100644 shelled/rustdesk-as-ref/.github/workflows/flutter-build.yml delete mode 100644 shelled/rustdesk-as-ref/.github/workflows/flutter-ci.yml delete mode 100644 shelled/rustdesk-as-ref/.github/workflows/flutter-nightly.yml delete mode 100644 shelled/rustdesk-as-ref/.github/workflows/flutter-tag.yml delete mode 100644 shelled/rustdesk-as-ref/.github/workflows/playground.yml delete mode 100644 shelled/rustdesk-as-ref/.github/workflows/third-party-RustDeskTempTopMostWindow.yml delete mode 100644 shelled/rustdesk-as-ref/.gitignore delete mode 100644 shelled/rustdesk-as-ref/.gitmodules delete mode 100644 shelled/rustdesk-as-ref/CLAUDE.md delete mode 100644 shelled/rustdesk-as-ref/Cargo.lock delete mode 100644 shelled/rustdesk-as-ref/Cargo.toml delete mode 100644 shelled/rustdesk-as-ref/Dockerfile delete mode 100644 shelled/rustdesk-as-ref/LICENCE delete mode 100644 shelled/rustdesk-as-ref/README.md delete mode 100644 shelled/rustdesk-as-ref/appimage/AppImageBuilder-aarch64.yml delete mode 100644 shelled/rustdesk-as-ref/appimage/AppImageBuilder-x86_64.yml delete mode 100644 shelled/rustdesk-as-ref/build.py delete mode 100644 shelled/rustdesk-as-ref/build.rs delete mode 100644 shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-DE.md delete mode 100644 shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-JP.md delete mode 100644 shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-KR.md delete mode 100644 shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-NL.md delete mode 100644 shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-NO.md delete mode 100644 shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-PL.md delete mode 100644 shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-RO.md delete mode 100644 shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-RU.md delete mode 100644 shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-TR.md delete mode 100644 shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-ZH.md delete mode 100644 shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-DE.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-ID.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-IT.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-JP.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-KR.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-NL.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-NO.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-PL.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-RO.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-RU.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-TR.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING-ZH.md delete mode 100644 shelled/rustdesk-as-ref/docs/CONTRIBUTING.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-AR.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-CS.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-DA.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-DE.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-EO.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-ES.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-FA.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-FI.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-FR.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-GR.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-HU.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-ID.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-IT.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-JP.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-KR.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-ML.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-NL.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-NO.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-PL.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-PTBR.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-RO.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-RU.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-TR.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-UA.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-VN.md delete mode 100644 shelled/rustdesk-as-ref/docs/README-ZH.md delete mode 100644 shelled/rustdesk-as-ref/docs/SECURITY-DE.md delete mode 100644 shelled/rustdesk-as-ref/docs/SECURITY-IT.md delete mode 100644 shelled/rustdesk-as-ref/docs/SECURITY-JP.md delete mode 100644 shelled/rustdesk-as-ref/docs/SECURITY-KR.md delete mode 100644 shelled/rustdesk-as-ref/docs/SECURITY-NL.md delete mode 100644 shelled/rustdesk-as-ref/docs/SECURITY-NO.md delete mode 100644 shelled/rustdesk-as-ref/docs/SECURITY-PL.md delete mode 100644 shelled/rustdesk-as-ref/docs/SECURITY-RO.md delete mode 100644 shelled/rustdesk-as-ref/docs/SECURITY-TR.md delete mode 100644 shelled/rustdesk-as-ref/docs/SECURITY.md delete mode 100644 shelled/rustdesk-as-ref/entrypoint.sh delete mode 100644 shelled/rustdesk-as-ref/examples/ipc.rs delete mode 100644 shelled/rustdesk-as-ref/fastlane/metadata/android/en-US/full_description.txt delete mode 100644 shelled/rustdesk-as-ref/fastlane/metadata/android/en-US/short_description.txt delete mode 100644 shelled/rustdesk-as-ref/fastlane/metadata/android/fr-FR/full_description.txt delete mode 100644 shelled/rustdesk-as-ref/fastlane/metadata/android/fr-FR/short_description.txt delete mode 100644 shelled/rustdesk-as-ref/fastlane/metadata/android/nl-NL/full_description.txt delete mode 100644 shelled/rustdesk-as-ref/fastlane/metadata/android/nl-NL/short_description.txt delete mode 100644 shelled/rustdesk-as-ref/fastlane/metadata/android/zh-CN/full_description.txt delete mode 100644 shelled/rustdesk-as-ref/fastlane/metadata/android/zh-CN/short_description.txt delete mode 100644 shelled/rustdesk-as-ref/flatpak/com.rustdesk.RustDesk.metainfo.xml delete mode 100644 shelled/rustdesk-as-ref/flatpak/rustdesk.json delete mode 100644 shelled/rustdesk-as-ref/flutter/.gitattributes delete mode 100644 shelled/rustdesk-as-ref/flutter/.gitignore delete mode 100644 shelled/rustdesk-as-ref/flutter/.metadata delete mode 100644 shelled/rustdesk-as-ref/flutter/README.md delete mode 100644 shelled/rustdesk-as-ref/flutter/analysis_options.yaml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/.gitignore delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/build.gradle delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/proguard-rules delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/debug/AndroidManifest.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/AndroidManifest.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/AudioRecordHandle.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/BootReceiver.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/FloatingWindowService.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/KeyboardKeyEventMapper.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainApplication.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/PermissionRequestTransparentActivity.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/RdClipboardManager.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/VolumeController.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/common.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/ffi.kt delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable-v21/launch_background.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/check_blue.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/close_red.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/floating_window.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values-night/styles.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/colors.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/ic_launcher_background.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/strings.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/styles.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/main/res/xml/accessibility_service_config.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/app/src/profile/AndroidManifest.xml delete mode 100644 shelled/rustdesk-as-ref/flutter/android/build.gradle delete mode 100644 shelled/rustdesk-as-ref/flutter/android/gradle.properties delete mode 100644 shelled/rustdesk-as-ref/flutter/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 shelled/rustdesk-as-ref/flutter/android/settings.gradle delete mode 100644 shelled/rustdesk-as-ref/flutter/assets/address_book.ttf delete mode 100644 shelled/rustdesk-as-ref/flutter/assets/device_group.ttf delete mode 100644 shelled/rustdesk-as-ref/flutter/assets/gestures.ttf delete mode 100644 shelled/rustdesk-as-ref/flutter/assets/more.ttf delete mode 100644 shelled/rustdesk-as-ref/flutter/assets/peer_searchbar.ttf delete mode 100644 shelled/rustdesk-as-ref/flutter/assets/tabbar.ttf delete mode 100644 shelled/rustdesk-as-ref/flutter/build_android.sh delete mode 100644 shelled/rustdesk-as-ref/flutter/build_android_deps.sh delete mode 100644 shelled/rustdesk-as-ref/flutter/build_fdroid.sh delete mode 100644 shelled/rustdesk-as-ref/flutter/build_ios.sh delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/.gitignore delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Flutter/Debug.xcconfig delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Flutter/Release.xcconfig delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Podfile delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Podfile.lock delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner/AppDelegate.swift delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner/GoogleService-Info.plist delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner/Info.plist delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner/Runner-Bridging-Header.h delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/Runner/Runner.entitlements delete mode 100644 shelled/rustdesk-as-ref/flutter/ios/exportOptions.plist delete mode 100644 shelled/rustdesk-as-ref/flutter/ios_arm64.sh delete mode 100644 shelled/rustdesk-as-ref/flutter/ios_x64.sh delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/formatter/id_formatter.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/hbbs/hbbs.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/shared_state.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/address_book.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/animated_rotation_widget.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/audio_input.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/autocomplete.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/chat_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/connection_page_title.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/custom_password.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/custom_scale_base.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/dialog.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/gestures.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/login.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/my_group.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/overlay.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/peer_card.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/peer_tab_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/peers_view.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/remote_input.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/setting_widgets.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/common/widgets/toolbar.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/consts.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/connection_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_home_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_setting_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_tab_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/file_manager_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/file_manager_tab_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/install_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/port_forward_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/port_forward_tab_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/remote_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/remote_tab_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/server_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_connection_manager.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_tab_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/view_camera_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/pages/view_camera_tab_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_file_transfer_screen.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_port_forward_screen.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_remote_screen.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_terminal_screen.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_view_camera_screen.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/button.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/dragable_divider.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/kb_layout_type_chooser.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/list_search_action_listener.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/material_mod_popup_menu.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/menu_button.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/popup_menu.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/refresh_wrapper.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/remote_toolbar.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/tabbar_widget.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/titlebar_widget.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/update_progress.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/main.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/pages/connection_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/pages/file_manager_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/pages/home_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/pages/remote_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/pages/scan_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/pages/server_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/pages/settings_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/pages/terminal_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/pages/view_camera_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/widgets/custom_scale_widget.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/widgets/dialog.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/widgets/floating_mouse.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/widgets/floating_mouse_widgets.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/mobile/widgets/gesture_help.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/ab_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/chat_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/cm_file_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/desktop_render_texture.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/file_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/group_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/input_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/native_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/peer_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/peer_tab_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/platform_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/printer_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/relative_mouse_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/server_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/state_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/terminal_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/user_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/models/web_model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/native/common.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/native/custom_cursor.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/native/win32.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/plugin/common.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/plugin/event.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/plugin/handlers.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/plugin/manager.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/plugin/model.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/plugin/ui_manager.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/plugin/utils/dialogs.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/plugin/widgets/desc_ui.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/plugin/widgets/desktop_settings.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/utils/event_loop.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/utils/http_service.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/utils/image.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/utils/multi_window_manager.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/utils/platform_channel.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/utils/relative_mouse_accumulator.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/utils/scale.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/web/bridge.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/web/common.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/web/custom_cursor.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/web/dummy.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/web/plugin/handlers.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/web/settings_page.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/web/texture_rgba_renderer.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/web/web_unique.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/lib/web/win32.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/.gitignore delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/CMakeLists.txt delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/bump_mouse.cc delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/bump_mouse.h delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/bump_mouse_x11.cc delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/bump_mouse_x11.h delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/flutter/CMakeLists.txt delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/main.cc delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/my_application.cc delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/my_application.h delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/wayland_shortcuts_inhibit.cc delete mode 100644 shelled/rustdesk-as-ref/flutter/linux/wayland_shortcuts_inhibit.h delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/.gitignore delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Flutter/Flutter-Debug.xcconfig delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Flutter/Flutter-Release.xcconfig delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Podfile delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Podfile.lock delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner.xcodeproj/project.pbxproj delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner/AppDelegate.swift delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner/AppIcon.icns delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner/Base.lproj/MainMenu.xib delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner/Configs/AppInfo.xcconfig delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner/Configs/Debug.xcconfig delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner/Configs/Release.xcconfig delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner/Configs/Warnings.xcconfig delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner/DebugProfile.entitlements delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner/Info.plist delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner/MainFlutterWindow.swift delete mode 100644 shelled/rustdesk-as-ref/flutter/macos/Runner/Release.entitlements delete mode 100644 shelled/rustdesk-as-ref/flutter/ndk_arm.sh delete mode 100644 shelled/rustdesk-as-ref/flutter/ndk_arm64.sh delete mode 100644 shelled/rustdesk-as-ref/flutter/ndk_x64.sh delete mode 100644 shelled/rustdesk-as-ref/flutter/ndk_x86.sh delete mode 100644 shelled/rustdesk-as-ref/flutter/pubspec.lock delete mode 100644 shelled/rustdesk-as-ref/flutter/pubspec.yaml delete mode 100644 shelled/rustdesk-as-ref/flutter/run.sh delete mode 100644 shelled/rustdesk-as-ref/flutter/test/cm_test.dart delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/.gitignore delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/CMakeLists.txt delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/flutter/CMakeLists.txt delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/CMakeLists.txt delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/Runner.rc delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/flutter_window.cpp delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/flutter_window.h delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/main.cpp delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/resource.h delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/resources/app_icon.ico delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/runner.exe.manifest delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/utils.cpp delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/utils.h delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/win32_desktop.cpp delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/win32_desktop.h delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/win32_window.cpp delete mode 100644 shelled/rustdesk-as-ref/flutter/windows/runner/win32_window.h delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/Cargo.toml delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/README.md delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/build.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/cliprdr.h delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/context_send.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/lib.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/filetype.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/fuse/cs.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/fuse/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/local_file.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/macos/README.md delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/macos/item_data_provider.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/macos/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/macos/paste_observer.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/macos/paste_task.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/macos/pasteboard_context.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/unix/serv_files.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/platform/windows.rs delete mode 100644 shelled/rustdesk-as-ref/libs/clipboard/src/windows/wf_cliprdr.c delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/.gitattributes delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/.github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/.github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/.github/ISSUE_TEMPLATE/question.md delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/.gitignore delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/.travis.yml delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/Cargo.toml delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/LICENSE delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/README.md delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/appveyor.yml delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/build.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/examples/dsl.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/examples/key.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/examples/keyboard.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/examples/mouse.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/examples/timer.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/rustfmt.toml delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/src/dsl.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/src/lib.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/src/linux/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/src/linux/nix_impl.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/src/linux/xdo.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/src/macos/keycodes.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/src/macos/macos_impl.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/src/macos/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/src/win/keycodes.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/src/win/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/enigo/src/win/win_impl.rs delete mode 160000 shelled/rustdesk-as-ref/libs/hbb_common delete mode 100644 shelled/rustdesk-as-ref/libs/libxdo-sys-stub/Cargo.toml delete mode 100644 shelled/rustdesk-as-ref/libs/libxdo-sys-stub/src/lib.rs delete mode 100644 shelled/rustdesk-as-ref/libs/portable/.gitignore delete mode 100644 shelled/rustdesk-as-ref/libs/portable/Cargo.lock delete mode 100644 shelled/rustdesk-as-ref/libs/portable/Cargo.toml delete mode 100644 shelled/rustdesk-as-ref/libs/portable/build.rs delete mode 100644 shelled/rustdesk-as-ref/libs/portable/generate.py delete mode 100644 shelled/rustdesk-as-ref/libs/portable/requirements.txt delete mode 100644 shelled/rustdesk-as-ref/libs/portable/src/bin_reader.rs delete mode 100644 shelled/rustdesk-as-ref/libs/portable/src/main.rs delete mode 100644 shelled/rustdesk-as-ref/libs/portable/src/res/spin.gif delete mode 100644 shelled/rustdesk-as-ref/libs/portable/src/ui.rs delete mode 100644 shelled/rustdesk-as-ref/libs/remote_printer/Cargo.toml delete mode 100644 shelled/rustdesk-as-ref/libs/remote_printer/src/lib.rs delete mode 100644 shelled/rustdesk-as-ref/libs/remote_printer/src/setup/driver.rs delete mode 100644 shelled/rustdesk-as-ref/libs/remote_printer/src/setup/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/remote_printer/src/setup/port.rs delete mode 100644 shelled/rustdesk-as-ref/libs/remote_printer/src/setup/printer.rs delete mode 100644 shelled/rustdesk-as-ref/libs/remote_printer/src/setup/setup.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/.gitignore delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/Cargo.toml delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/README.md delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/build.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/examples/benchmark.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/examples/capture_mag.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/examples/ffplay.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/examples/list.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/examples/record-screen.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/examples/screenshot.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/android/ffi.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/android/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/bindings/aom_ffi.h delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/bindings/vpx_ffi.h delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/bindings/yuv_ffi.h delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/android.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/aom.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/camera.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/codec.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/convert.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/dxgi.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/hwcodec.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/linux.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/mediacodec.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/quartz.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/record.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/vpx.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/vpxcodec.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/vram.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/wayland.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/common/x11.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/dxgi/gdi.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/dxgi/mag.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/dxgi/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/lib.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/quartz/capturer.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/quartz/config.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/quartz/display.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/quartz/ffi.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/quartz/frame.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/quartz/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/wayland.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/wayland/README.md delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/wayland/capturable.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/wayland/display.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/wayland/pipewire.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/wayland/remote_desktop_portal.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/wayland/request_portal.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/wayland/screencast_portal.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/x11/capturer.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/x11/display.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/x11/ffi.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/x11/iter.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/x11/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/scrap/src/x11/server.rs delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/Cargo.lock delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/Cargo.toml delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/README.md delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/dylib/Cargo.toml delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/dylib/README.md delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/dylib/build.rs delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/dylib/examples/idd_controller.rs delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/dylib/src/lib.rs delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/dylib/src/win10/IddController.c delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/dylib/src/win10/IddController.h delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/dylib/src/win10/Public.h delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/dylib/src/win10/idd.rs delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/dylib/src/win10/mod.rs delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/examples/virtual_display_1.rs delete mode 100644 shelled/rustdesk-as-ref/libs/virtual_display/src/lib.rs delete mode 100644 shelled/rustdesk-as-ref/res/DEBIAN/postinst delete mode 100644 shelled/rustdesk-as-ref/res/DEBIAN/postrm delete mode 100644 shelled/rustdesk-as-ref/res/DEBIAN/preinst delete mode 100644 shelled/rustdesk-as-ref/res/DEBIAN/prerm delete mode 100644 shelled/rustdesk-as-ref/res/PKGBUILD delete mode 100644 shelled/rustdesk-as-ref/res/ab.py delete mode 100644 shelled/rustdesk-as-ref/res/audits.py delete mode 100644 shelled/rustdesk-as-ref/res/bump.sh delete mode 100644 shelled/rustdesk-as-ref/res/device-groups.py delete mode 100644 shelled/rustdesk-as-ref/res/devices.py delete mode 100644 shelled/rustdesk-as-ref/res/fdroid/patches/0000-flutter-android-x86.patch delete mode 100644 shelled/rustdesk-as-ref/res/fdroid/patches/0001-x86-no-debuggable.patch delete mode 100644 shelled/rustdesk-as-ref/res/gen_icon.sh delete mode 100644 shelled/rustdesk-as-ref/res/icon.ico delete mode 100644 shelled/rustdesk-as-ref/res/inline-sciter.py delete mode 100644 shelled/rustdesk-as-ref/res/job.py delete mode 100644 shelled/rustdesk-as-ref/res/lang.py delete mode 100644 shelled/rustdesk-as-ref/res/manifest.xml delete mode 100644 shelled/rustdesk-as-ref/res/msi/.gitignore delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/Common.h delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/CustomActions.cpp delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/CustomActions.def delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/CustomActions.vcxproj delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/DeviceUtils.cpp delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/FirewallRules.cpp delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/ReadConfig.cpp delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/RemotePrinter.cpp delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/ServiceUtils.cpp delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/dllmain.cpp delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/framework.h delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/packages.config delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/pch.cpp delete mode 100644 shelled/rustdesk-as-ref/res/msi/CustomActions/pch.h delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Components/Folders.wxs delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Components/Regs.wxs delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Components/RustDesk.wxs delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Fragments/AddRemoveProperties.wxs delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Fragments/CustomActions.wxs delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Fragments/ShortcutProperties.wxs delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Fragments/Upgrades.wxs delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Includes.wxi delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Language/Package.en-us.wxl delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Language/WixExt_en-us.wxl delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/License.rtf delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Package.wixproj delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/Package.wxs delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/UI/AnotherApp.wxs delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/UI/MyInstallDirDlg.wxs delete mode 100644 shelled/rustdesk-as-ref/res/msi/Package/UI/MyInstallDlg.wxs delete mode 100644 shelled/rustdesk-as-ref/res/msi/README.md delete mode 100644 shelled/rustdesk-as-ref/res/msi/msi.sln delete mode 100644 shelled/rustdesk-as-ref/res/msi/preprocess.py delete mode 100644 shelled/rustdesk-as-ref/res/osx-dist.sh delete mode 100644 shelled/rustdesk-as-ref/res/pacman_install delete mode 100644 shelled/rustdesk-as-ref/res/pam.d/rustdesk.debian delete mode 100644 shelled/rustdesk-as-ref/res/pam.d/rustdesk.suse delete mode 100644 shelled/rustdesk-as-ref/res/rpm-flutter-suse.spec delete mode 100644 shelled/rustdesk-as-ref/res/rpm-flutter.spec delete mode 100644 shelled/rustdesk-as-ref/res/rpm-suse.spec delete mode 100644 shelled/rustdesk-as-ref/res/rpm.spec delete mode 100644 shelled/rustdesk-as-ref/res/rustdesk-link.desktop delete mode 100644 shelled/rustdesk-as-ref/res/rustdesk.desktop delete mode 100644 shelled/rustdesk-as-ref/res/rustdesk.service delete mode 100644 shelled/rustdesk-as-ref/res/startwm.sh delete mode 100644 shelled/rustdesk-as-ref/res/strategies.py delete mode 100644 shelled/rustdesk-as-ref/res/tray-icon.ico delete mode 100644 shelled/rustdesk-as-ref/res/user-groups.py delete mode 100644 shelled/rustdesk-as-ref/res/users.py delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/aom/aom-avx2.diff delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/aom/aom-install.diff delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/aom/aom-uninitialized-pointer.diff delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/aom/portfile.cmake delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/aom/vcpkg.json delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0001-create-lib-libraries.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0002-fix-msvc-link.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0003-fix-windowsinclude.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0004-dependencies.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0005-fix-nasm.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0007-fix-lib-naming.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0013-define-WINVER.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0020-fix-aarch64-libswscale.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0024-fix-osx-host-c11.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0040-ffmpeg-add-av_stream_get_first_dts-for-chromium.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0041-add-const-for-opengl-definition.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0042-fix-arm64-linux.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/0043-fix-miss-head.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/build.sh.in delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/patch/0001-avcodec-amfenc-add-query_timeout-option-for-h264-hev.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/patch/0002-libavcodec-amfenc-reconfig-when-bitrate-change.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/patch/0004-videotoolbox-changing-bitrate.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/patch/0005-mediacodec-changing-bitrate.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/patch/0006-dlopen-libva.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/patch/0007-fix-linux-configure.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/patch/0008-remove-amf-loop-query.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/patch/0009-fix-nvenc-reconfigure-blur.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/patch/0010.disable-loading-DLLs-from-app-dir.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/patch/0011-android-mediacodec-encode-align-64.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/patch/0012-fix-macos-big-sur-CVBufferCopyAttachments.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/portfile.cmake delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/vcpkg-cmake-wrapper.cmake delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/ffmpeg/vcpkg.json delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libvpx/0003-add-uwp-v142-and-v143-support.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libvpx/0004-remove-library-suffixes.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libvpx/portfile.cmake delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libvpx/unofficial-libvpx-config.cmake.in delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libvpx/vcpkg.json delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libvpx/vpx.pc.in delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libyuv/fix-cmakelists.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libyuv/libyuv-config.cmake delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libyuv/portfile.cmake delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libyuv/usage delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libyuv/usage-msvc delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/libyuv/vcpkg.json delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/mfx-dispatch/0003-upgrade-cmake-3.14.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/mfx-dispatch/fix-pkgconf.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/mfx-dispatch/fix-unresolved-symbol.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/mfx-dispatch/portfile.cmake delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/mfx-dispatch/vcpkg.json delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/opus/fix-pkgconfig-version.patch delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/opus/portfile.cmake delete mode 100644 shelled/rustdesk-as-ref/res/vcpkg/opus/vcpkg.json delete mode 100644 shelled/rustdesk-as-ref/res/xorg.conf delete mode 100644 shelled/rustdesk-as-ref/src/auth_2fa.rs delete mode 100644 shelled/rustdesk-as-ref/src/cli.rs delete mode 100644 shelled/rustdesk-as-ref/src/client.rs delete mode 100644 shelled/rustdesk-as-ref/src/client/file_trait.rs delete mode 100644 shelled/rustdesk-as-ref/src/client/helper.rs delete mode 100644 shelled/rustdesk-as-ref/src/client/io_loop.rs delete mode 100644 shelled/rustdesk-as-ref/src/client/screenshot.rs delete mode 100644 shelled/rustdesk-as-ref/src/clipboard.rs delete mode 100644 shelled/rustdesk-as-ref/src/clipboard_file.rs delete mode 100644 shelled/rustdesk-as-ref/src/common.rs delete mode 100644 shelled/rustdesk-as-ref/src/core_main.rs delete mode 100644 shelled/rustdesk-as-ref/src/custom_server.rs delete mode 100644 shelled/rustdesk-as-ref/src/flutter.rs delete mode 100644 shelled/rustdesk-as-ref/src/flutter_ffi.rs delete mode 100644 shelled/rustdesk-as-ref/src/hbbs_http.rs delete mode 100644 shelled/rustdesk-as-ref/src/hbbs_http/account.rs delete mode 100644 shelled/rustdesk-as-ref/src/hbbs_http/downloader.rs delete mode 100644 shelled/rustdesk-as-ref/src/hbbs_http/http_client.rs delete mode 100644 shelled/rustdesk-as-ref/src/hbbs_http/record_upload.rs delete mode 100644 shelled/rustdesk-as-ref/src/hbbs_http/sync.rs delete mode 100644 shelled/rustdesk-as-ref/src/ipc.rs delete mode 100644 shelled/rustdesk-as-ref/src/kcp_stream.rs delete mode 100644 shelled/rustdesk-as-ref/src/keyboard.rs delete mode 100644 shelled/rustdesk-as-ref/src/lan.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/README.md delete mode 100644 shelled/rustdesk-as-ref/src/lang/ar.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/be.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/bg.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/ca.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/cn.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/cs.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/da.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/de.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/el.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/en.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/eo.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/es.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/et.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/eu.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/fa.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/fi.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/fr.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/ge.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/he.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/hr.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/hu.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/id.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/it.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/ja.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/ko.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/kz.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/lt.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/lv.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/nb.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/nl.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/pl.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/pt_PT.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/ptbr.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/ro.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/ru.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/sc.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/sk.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/sl.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/sq.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/sr.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/sv.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/ta.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/template.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/th.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/tr.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/tw.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/uk.rs delete mode 100644 shelled/rustdesk-as-ref/src/lang/vi.rs delete mode 100644 shelled/rustdesk-as-ref/src/lib.rs delete mode 100644 shelled/rustdesk-as-ref/src/main.rs delete mode 100644 shelled/rustdesk-as-ref/src/naming.rs delete mode 100644 shelled/rustdesk-as-ref/src/platform/delegate.rs delete mode 100644 shelled/rustdesk-as-ref/src/platform/gtk_sudo.rs delete mode 100644 shelled/rustdesk-as-ref/src/platform/linux.rs delete mode 100644 shelled/rustdesk-as-ref/src/platform/linux_desktop_manager.rs delete mode 100644 shelled/rustdesk-as-ref/src/platform/macos.mm delete mode 100644 shelled/rustdesk-as-ref/src/platform/macos.rs delete mode 100644 shelled/rustdesk-as-ref/src/platform/mod.rs delete mode 100644 shelled/rustdesk-as-ref/src/platform/privileges_scripts/agent.plist delete mode 100644 shelled/rustdesk-as-ref/src/platform/privileges_scripts/daemon.plist delete mode 100644 shelled/rustdesk-as-ref/src/platform/privileges_scripts/install.scpt delete mode 100644 shelled/rustdesk-as-ref/src/platform/privileges_scripts/uninstall.scpt delete mode 100644 shelled/rustdesk-as-ref/src/platform/privileges_scripts/update.scpt delete mode 100644 shelled/rustdesk-as-ref/src/platform/win_device.rs delete mode 100644 shelled/rustdesk-as-ref/src/platform/windows.cc delete mode 100644 shelled/rustdesk-as-ref/src/platform/windows.rs delete mode 100644 shelled/rustdesk-as-ref/src/platform/windows_delete_test_cert.cc delete mode 100644 shelled/rustdesk-as-ref/src/plugin/callback_ext.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/callback_msg.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/config.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/desc.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/errno.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/ipc.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/manager.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/mod.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/native.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/native_handlers/macros.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/native_handlers/mod.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/native_handlers/session.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/native_handlers/ui.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/plog.rs delete mode 100644 shelled/rustdesk-as-ref/src/plugin/plugins.rs delete mode 100644 shelled/rustdesk-as-ref/src/port_forward.rs delete mode 100644 shelled/rustdesk-as-ref/src/privacy_mode.rs delete mode 100644 shelled/rustdesk-as-ref/src/privacy_mode/macos.rs delete mode 100644 shelled/rustdesk-as-ref/src/privacy_mode/win_exclude_from_capture.rs delete mode 100644 shelled/rustdesk-as-ref/src/privacy_mode/win_input.rs delete mode 100644 shelled/rustdesk-as-ref/src/privacy_mode/win_mag.rs delete mode 100644 shelled/rustdesk-as-ref/src/privacy_mode/win_topmost_window.rs delete mode 100644 shelled/rustdesk-as-ref/src/privacy_mode/win_virtual_display.rs delete mode 100644 shelled/rustdesk-as-ref/src/rendezvous_mediator.rs delete mode 100644 shelled/rustdesk-as-ref/src/server.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/audio_service.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/clipboard_service.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/connection.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/dbus.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/display_service.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/input_service.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/portable_service.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/printer_service.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/rdp_input.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/service.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/terminal_helper.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/terminal_service.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/uinput.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/video_qos.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/video_service.rs delete mode 100644 shelled/rustdesk-as-ref/src/server/wayland.rs delete mode 100644 shelled/rustdesk-as-ref/src/service.rs delete mode 100644 shelled/rustdesk-as-ref/src/tray.rs delete mode 100644 shelled/rustdesk-as-ref/src/ui.rs delete mode 100644 shelled/rustdesk-as-ref/src/ui/ab.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui/chatbox.html delete mode 100644 shelled/rustdesk-as-ref/src/ui/cm.css delete mode 100644 shelled/rustdesk-as-ref/src/ui/cm.html delete mode 100644 shelled/rustdesk-as-ref/src/ui/cm.rs delete mode 100644 shelled/rustdesk-as-ref/src/ui/cm.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui/common.css delete mode 100644 shelled/rustdesk-as-ref/src/ui/common.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui/file_transfer.css delete mode 100644 shelled/rustdesk-as-ref/src/ui/file_transfer.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui/grid.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui/header.css delete mode 100644 shelled/rustdesk-as-ref/src/ui/header.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui/index.css delete mode 100644 shelled/rustdesk-as-ref/src/ui/index.html delete mode 100644 shelled/rustdesk-as-ref/src/ui/index.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui/install.html delete mode 100644 shelled/rustdesk-as-ref/src/ui/install.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui/msgbox.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui/port_forward.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui/printer.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui/remote.css delete mode 100644 shelled/rustdesk-as-ref/src/ui/remote.html delete mode 100644 shelled/rustdesk-as-ref/src/ui/remote.rs delete mode 100644 shelled/rustdesk-as-ref/src/ui/remote.tis delete mode 100644 shelled/rustdesk-as-ref/src/ui_cm_interface.rs delete mode 100644 shelled/rustdesk-as-ref/src/ui_interface.rs delete mode 100644 shelled/rustdesk-as-ref/src/ui_session_interface.rs delete mode 100644 shelled/rustdesk-as-ref/src/updater.rs delete mode 100644 shelled/rustdesk-as-ref/src/virtual_display_manager.rs delete mode 100644 shelled/rustdesk-as-ref/src/whiteboard/client.rs delete mode 100644 shelled/rustdesk-as-ref/src/whiteboard/linux.rs delete mode 100644 shelled/rustdesk-as-ref/src/whiteboard/macos.rs delete mode 100644 shelled/rustdesk-as-ref/src/whiteboard/mod.rs delete mode 100644 shelled/rustdesk-as-ref/src/whiteboard/server.rs delete mode 100644 shelled/rustdesk-as-ref/src/whiteboard/win_linux.rs delete mode 100644 shelled/rustdesk-as-ref/src/whiteboard/windows.rs delete mode 100644 shelled/rustdesk-as-ref/vcpkg.json delete mode 100644 shelled/rustdesk-as-ref/web_deps.tar.gz delete mode 100644 shelled/rustdesk-as-ref/web_deps/libopus.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/libopus.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/COPYING delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/COPYING-dav1d.txt delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/COPYING-ogg.txt delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/COPYING-opus.txt delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/COPYING-theora.txt delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/COPYING-vorbis.txt delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/LICENSE-nestegg.txt delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/LICENSE-vpx.txt delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/PATENTS-vpx.txt delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/README.md delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-audio-opus-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-audio-opus-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.worker.js delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.worker.js delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-simd-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-simd-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-theora-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-theora-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp8-mt-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp8-mt-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp8-mt-wasm.worker.js delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp8-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp8-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.worker.js delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.worker.js delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-ogg-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-ogg-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-webm-wasm.js delete mode 100755 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-webm-wasm.wasm delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-es2017.js delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-support.js delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-version.js delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-worker-audio.js delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-worker-video.js delete mode 100644 shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv.js delete mode 100644 shelled/rustdesk-as-ref/web_deps/yuv-canvas-1.2.6.js delete mode 100644 shelled/rustdesk-web-client/css/style.css delete mode 100644 shelled/rustdesk-web-client/index.html delete mode 100644 shelled/rustdesk-web-client/js/app.js delete mode 100644 shelled/rustdesk-web-client/js/audio.js delete mode 100644 shelled/rustdesk-web-client/js/connection.js delete mode 100644 shelled/rustdesk-web-client/js/crypto.js delete mode 100644 shelled/rustdesk-web-client/js/input.js delete mode 100644 shelled/rustdesk-web-client/js/proto.js delete mode 100644 shelled/rustdesk-web-client/js/video.js delete mode 100644 shelled/rustdesk-web-client/lib/libopus.js delete mode 100755 shelled/rustdesk-web-client/lib/libopus.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/COPYING delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/COPYING-dav1d.txt delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/COPYING-ogg.txt delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/COPYING-opus.txt delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/COPYING-theora.txt delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/COPYING-vorbis.txt delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/LICENSE-nestegg.txt delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/LICENSE-vpx.txt delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/PATENTS-vpx.txt delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/README.md delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-audio-opus-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-audio-opus-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.worker.js delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.worker.js delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-simd-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-simd-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-theora-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-theora-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp8-mt-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp8-mt-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp8-mt-wasm.worker.js delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp8-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp8-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.worker.js delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.worker.js delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp9-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-vp9-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-demuxer-ogg-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-demuxer-ogg-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-demuxer-webm-wasm.js delete mode 100755 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-demuxer-webm-wasm.wasm delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-es2017.js delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-support.js delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-version.js delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-worker-audio.js delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-worker-video.js delete mode 100644 shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv.js delete mode 100644 shelled/rustdesk-web-client/lib/yuv-canvas-1.2.6.js delete mode 100644 shelled/shelled-os-ui/.gitignore delete mode 100644 shelled/shelled-os-ui/package-lock.json delete mode 100644 shelled/shelled-os-ui/package.json delete mode 100644 shelled/shelled-os-ui/src-tauri/Cargo.lock delete mode 100644 shelled/shelled-os-ui/src-tauri/Cargo.toml delete mode 100644 shelled/shelled-os-ui/src-tauri/binaries/README.md delete mode 100644 shelled/shelled-os-ui/src-tauri/build.rs delete mode 100644 shelled/shelled-os-ui/src-tauri/capabilities/default.json delete mode 100644 shelled/shelled-os-ui/src-tauri/gen/schemas/acl-manifests.json delete mode 100644 shelled/shelled-os-ui/src-tauri/gen/schemas/capabilities.json delete mode 100644 shelled/shelled-os-ui/src-tauri/gen/schemas/desktop-schema.json delete mode 100644 shelled/shelled-os-ui/src-tauri/gen/schemas/windows-schema.json delete mode 100644 shelled/shelled-os-ui/src-tauri/icons/128x128.png delete mode 100644 shelled/shelled-os-ui/src-tauri/icons/128x128@2x.png delete mode 100644 shelled/shelled-os-ui/src-tauri/icons/32x32.png delete mode 100644 shelled/shelled-os-ui/src-tauri/icons/Square107x107Logo.png delete mode 100644 shelled/shelled-os-ui/src-tauri/icons/icon.ico delete mode 100644 shelled/shelled-os-ui/src-tauri/icons/icon.png delete mode 100644 shelled/shelled-os-ui/src-tauri/src/main.rs delete mode 100644 shelled/shelled-os-ui/src-tauri/tauri.conf.json delete mode 100644 shelled/shelled-os-ui/src/css/browser.css delete mode 100644 shelled/shelled-os-ui/src/css/file-explorer.css delete mode 100644 shelled/shelled-os-ui/src/css/main.css delete mode 100644 shelled/shelled-os-ui/src/css/remote-desktop.css delete mode 100644 shelled/shelled-os-ui/src/css/settings.css delete mode 100644 shelled/shelled-os-ui/src/css/start-menu.css delete mode 100644 shelled/shelled-os-ui/src/css/taskbar.css delete mode 100644 shelled/shelled-os-ui/src/css/variables.css delete mode 100644 shelled/shelled-os-ui/src/index.html delete mode 100644 shelled/shelled-os-ui/src/js/components/Browser.js delete mode 100644 shelled/shelled-os-ui/src/js/components/FileExplorer.js delete mode 100644 shelled/shelled-os-ui/src/js/components/RemoteDesktop.js delete mode 100644 shelled/shelled-os-ui/src/js/components/Settings.js delete mode 100644 shelled/shelled-os-ui/src/js/components/StartMenu.js delete mode 100644 shelled/shelled-os-ui/src/js/components/Taskbar.js delete mode 100644 shelled/shelled-os-ui/src/js/main.js diff --git a/shelled/package-lock.json b/shelled/package-lock.json deleted file mode 100644 index 8b89bf5..0000000 --- a/shelled/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "shelled", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/shelled/plan-os-ui.md b/shelled/plan-os-ui.md deleted file mode 100644 index 4122269..0000000 --- a/shelled/plan-os-ui.md +++ /dev/null @@ -1,300 +0,0 @@ -```markdown -# Shelled OS UI Development Specification for LLM Implementation - -## Project Overview -Generate a complete Shelled OS UI implementation using HTML/CSS/JavaScript with Tauri 2.0 integration. The UI is a desktop environment that runs applications from Android, Windows, macOS, and Linux platforms. - -## Technology Stack Requirements -- Frontend: HTML5, CSS3, JavaScript ES6+ modules -- Backend: Tauri 2.0 with Rust -- Rendering: WebView -- Icons: Google Material Icons -- Fonts: Outfit (primary), Noto Sans SC (secondary) -- Build System: Cargo (Rust) + npm - -## Project Structure to Generate -``` -shelled-os-ui/ -├── src/ -│ ├── index.html -│ ├── css/ -│ │ ├── variables.css -│ │ ├── main.css -│ │ ├── taskbar.css -│ │ ├── start-menu.css -│ │ ├── file-explorer.css -│ │ ├── browser.css -│ │ └── settings.css -│ ├── js/ -│ │ ├── main.js -│ │ └── components/ -│ │ ├── Taskbar.js -│ │ ├── StartMenu.js -│ │ ├── FileExplorer.js -│ │ ├── Browser.js -│ │ └── Settings.js -│ └── assets/ -│ └── images/ -│ └── conch-shell.png -├── src-tauri/ -│ ├── src/ -│ │ └── main.rs -│ ├── Cargo.toml -│ └── tauri.conf.json -└── package.json -``` - -## HTML Structure Requirements - -### Main Layout (index.html) -- Full-screen desktop environment container -- Gradient background (purple to blue gradient) -- Bottom taskbar component -- Popup windows for: Start Menu, File Explorer, Browser, Settings -- Include Material Icons and Google Fonts CDN links - -### Taskbar Component -- Fixed at bottom of screen -- Height: 60px -- Background: Glassmorphism effect (semi-transparent white with blur) -- Contains 4 clickable icons: Shell (start), Folder, Browser, Settings -- System tray on right with WiFi, Volume, Battery icons -- All icons must have hover effects and click handlers - -### Start Menu Component -- Position: Bottom-left, above taskbar -- Size: 650px × 540px -- Header with "All Applications" title -- Search input box with real-time filtering -- Two-column grid layout for apps -- Alphabetically organized with letter dividers (A, B, C, D, G, M, W, Y) -- Each app item contains: icon, name, description -- Selection state with blue left border indicator - -### File Explorer Component -- Position: Bottom, offset from folder icon -- Size: 580px × 480px -- Header with "File Explorer" title and close button -- List of mock files and folders -- Click to select functionality - -### Browser Component -- Position: Bottom, offset from browser icon -- Size: 520px × 420px -- Header with "Browser" title and close button -- Address bar with lock icon -- Content area with placeholder - -### Settings Component -- Position: Bottom, offset from settings icon -- Size: 460px × 380px -- Header with "Settings" title and close button -- List of toggle switches for: Dark Mode, Notifications, Sound Effects, Bluetooth, Location Services -- Toggle switches must be clickable and change state - -## CSS Requirements - -### Design System Variables -```css -:root { - --primary-blue: #0078D7; - --secondary-blue: #005A9E; - --accent-cyan: #00BCF2; - --bg-white: #FFFFFF; - --text-dark: #1F1F1F; - --text-grey: #605E5C; - --glass-bg: rgba(255, 255, 255, 0.15); - --glass-border: rgba(255, 255, 255, 0.2); - --shadow-lg: 0 -8px 32px rgba(0, 0, 0, 0.3); -} -``` - -### Animation Requirements -- Popup windows: Slide up with scale animation (0.95 to 1.0) -- Hover effects: scale(1.05) for buttons, translateX(4px) for list items -- Transition timing: 0.2-0.3s ease -- Use cubic-bezier(0.175, 0.885, 0.32, 1.275) for popup animations - -### Glassmorphism Effects -- Background: rgba(255, 255, 255, 0.15) -- Backdrop-filter: blur(20px) -- Border: 1px solid rgba(255, 255, 255, 0.2) - -## JavaScript Requirements - -### Main Controller (main.js) -- Initialize all component controllers -- Manage popup state (only one popup open at a time) -- Click outside to close popups -- Export application data (list of apps with icons, colors, descriptions) - -### Component Controllers -Each component should have: -- `element` property referencing the DOM element -- `buttonElement` property for the triggering button -- `open()` method to show popup -- `close()` method to hide popup -- `render()` method to populate content -- `initialize()` method to setup event listeners - -### App Data Structure -```javascript -[ - { name: "Angry Birds", icon: "mood_bad", color: "red", desc: "Mobile Game", letter: "A" }, - { name: "Adobe Photoshop", icon: "edit", color: "green", desc: "Image Editor", letter: "A" }, - { name: "Brave Browser", icon: "language", color: "blue", desc: "Web Browser", letter: "B" }, - { name: "Books", icon: "book", color: "purple", desc: "Reading App", letter: "B" }, - { name: "Chrome", icon: "code", color: "orange", desc: "Web Browser", letter: "C" }, - { name: "Discord", icon: "chat", color: "blue", desc: "Communication", letter: "D" }, - { name: "GarageBand", icon: "music_note", color: "yellow", desc: "macOS Music App", letter: "G" }, - { name: "Movies & TV", icon: "movie", color: "purple", desc: "Media Player", letter: "M" }, - { name: "Music", icon: "music_note", color: "green", desc: "Audio Player", letter: "M" }, - { name: "Word", icon: "description", color: "default", desc: "Document Editor", letter: "W" }, - { name: "YouTube", icon: "theaters", color: "orange", desc: "Video Platform", letter: "Y" } -] -``` - -### Search Functionality -- Real-time filtering as user types -- Filter by app name (case-insensitive) -- Show/hide letter dividers based on visible apps -- Clear search when popup closes - -### File Explorer Data -```javascript -[ - { name: "Documents", type: "folder", icon: "folder", meta: "5 items • Modified today" }, - { name: "Downloads", type: "folder", icon: "folder", meta: "12 items • Modified yesterday" }, - { name: "Pictures", type: "folder", icon: "folder", meta: "28 items • Modified 2 days ago" }, - { name: "report.pdf", type: "file", icon: "insert_drive_file", meta: "PDF • 2.4 MB • Today" }, - { name: "photo_001.jpg", type: "image", icon: "image", meta: "JPEG • 3.8 MB • Today" }, - { name: "notes.txt", type: "document", icon: "description", meta: "Text • 1.2 KB • Yesterday" }, - { name: "Music", type: "folder", icon: "folder", meta: "45 items • Modified last week" } -] -``` - -### Settings Data -```javascript -[ - { label: "Dark Mode", icon: "dark_mode", active: false }, - { label: "Notifications", icon: "notifications", active: true }, - { label: "Sound Effects", icon: "volume_up", active: true }, - { label: "Bluetooth", icon: "bluetooth", active: false }, - { label: "Location Services", icon: "location_on", active: false } -] -``` - -## Tauri Configuration Requirements - -### tauri.conf.json -- Product name: "shelled-os" -- Version: "0.1.0" -- Window configuration: fullscreen, resizable -- Identifier: "com.shelledos.app" -- Enable all Tauri features for development - -### Cargo.toml -- Package name: "shelled-os-ui" -- Tauri version: "2.0" -- Dependencies: tauri, serde, serde_json -- Edition: "2021" - -### main.rs -- Simple Tauri builder initialization -- Windows subsystem configuration for release builds - -## Interactive Behaviors - -### Click Interactions -1. Click Shell button → Toggle Start Menu -2. Click Folder button → Toggle File Explorer -3. Click Browser button → Toggle Browser popup -4. Click Settings button → Toggle Settings popup -5. Click app item → Select it (add blue left border) -6. Click file item → Select it -7. Click toggle switch → Toggle active state -8. Click close button (X) → Close respective popup -9. Click outside popup → Close all popups - -### Search Interactions -1. Type in search box → Filter apps in real-time -2. Empty search → Show all apps -3. Partial match → Show matching apps -4. No match → Show no apps (hide letter dividers) - -### Visual Feedback -1. Hover over button → Scale up (1.05) -2. Hover over list item → Slide right (4px) and change color -3. Active popup → Button shows indicator -4. Selected item → Blue left border appears -5. Toggle switch → Smooth transition of thumb position - -## Color Coding for App Icons -- red: linear-gradient(135deg, #e52e00 0%, #ff6b35 100%) -- green: linear-gradient(135deg, #11998e 0%, #38ef7d 100%) -- blue: linear-gradient(135deg, #0078D7 0%, #00BCF2 100%) -- orange: linear-gradient(135deg, #f093fb 0%, #f5576c 100%) -- purple: linear-gradient(135deg, #a18cd1 0%, #fbc2eb 100%) -- yellow: linear-gradient(135deg, #f7971e 0%, #ffd200 100%) -- default: linear-gradient(135deg, #667eea 0%, #764ba2 100%) - -## File Icon Colors -- folder: #ff9800 -- file: #90caf9 -- image: #66bb6a -- document: #42a5f5 - -## Performance Requirements -- Startup time: < 3 seconds -- Menu open animation: < 200ms -- Search filtering: < 50ms response time -- All animations: 60fps -- Memory usage: < 150MB - -## Browser Compatibility -- Chrome 90+ -- Firefox 88+ -- Safari 14+ -- Edge 90+ - -## Testing Checklist -After implementation, verify: -- [ ] Application opens fullscreen -- [ ] Taskbar displays at bottom -- [ ] All 4 icons are clickable -- [ ] Clicking Shell opens Start Menu -- [ ] Start Menu shows 11 apps alphabetically -- [ ] Search filters apps correctly -- [ ] Clicking apps selects them -- [ ] File Explorer opens with mock files -- [ ] Browser popup opens -- [ ] Settings popup opens with working toggles -- [ ] Close buttons work -- [ ] Click outside closes popups -- [ ] Animations are smooth -- [ ] No console errors - -## Implementation Notes -- Use ES6 modules for JavaScript -- All event listeners must use stopPropagation where appropriate -- Use document fragments for DOM manipulation -- Implement proper cleanup when closing popups -- Use CSS transitions, not JavaScript animations where possible -- Ensure z-index management prevents layering issues -- All text must use the Outfit font family - -## Critical Constraints -1. DO NOT use any external JavaScript libraries -2. DO NOT modify the specified color values -3. DO NOT change the layout dimensions -4. DO NOT alter the interaction behaviors -5. DO NOT add additional features beyond specification -6. MUST maintain exact animations as specified -7. MUST use glassmorphism effects as described -8. MUST implement all search functionality -9. MUST ensure all toggles are interactive -10. MUST follow the exact component architecture - ---- -End of Specification Document -``` \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/.cargo/config.toml b/shelled/rustdesk-as-ref/.cargo/config.toml deleted file mode 100644 index 42a4adb..0000000 --- a/shelled/rustdesk-as-ref/.cargo/config.toml +++ /dev/null @@ -1,16 +0,0 @@ -[target.x86_64-pc-windows-msvc] -rustflags = ["-Ctarget-feature=+crt-static"] -[target.i686-pc-windows-msvc] -rustflags = ["-C", "target-feature=+crt-static", "-C", "link-args=/NODEFAULTLIB:MSVCRT"] -[target.'cfg(target_os="macos")'] -rustflags = [ - "-C", "link-args=-sectcreate __CGPreLoginApp __cgpreloginapp /dev/null", -] -#[target.'cfg(target_os="linux")'] -# glibc-static required, this may fix https://github.com/rustdesk/rustdesk/issues/9103, but I do not want this big change -# this is unlikely to help also, because the other so files still use libc dynamically -#rustflags = [ -# "-C", "link-args=-Wl,-Bstatic -lc -Wl,-Bdynamic" -#] -[net] -git-fetch-with-cli = true diff --git a/shelled/rustdesk-as-ref/.gitattributes b/shelled/rustdesk-as-ref/.gitattributes deleted file mode 100644 index 176a458..0000000 --- a/shelled/rustdesk-as-ref/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto diff --git a/shelled/rustdesk-as-ref/.github/FUNDING.yml b/shelled/rustdesk-as-ref/.github/FUNDING.yml deleted file mode 100644 index 1745f9b..0000000 --- a/shelled/rustdesk-as-ref/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -github: [rustdesk] -ko_fi: rustdesk diff --git a/shelled/rustdesk-as-ref/.github/ISSUE_TEMPLATE/bug_report.yaml b/shelled/rustdesk-as-ref/.github/ISSUE_TEMPLATE/bug_report.yaml deleted file mode 100644 index dbb8ed8..0000000 --- a/shelled/rustdesk-as-ref/.github/ISSUE_TEMPLATE/bug_report.yaml +++ /dev/null @@ -1,55 +0,0 @@ -name: 🐞 Bug report -description: Thanks for taking the time to fill out this bug report! Please fill the form in **English** -labels: ["bug"] -body: - - type: textarea - id: desc - attributes: - label: Bug Description - description: A clear and concise description of what the bug is (if it's a keyboard issue, provide the keyboard mode you're using. e.g. legacy, map, translate) - validations: - required: true - - type: textarea - id: reproduce - attributes: - label: How to Reproduce - description: What steps can we take to reproduce this behavior? - validations: - required: true - - type: textarea - id: expected - attributes: - label: Expected Behavior - description: A clear and concise description of what you expected to happen - validations: - required: true - - type: input - id: os - attributes: - label: Operating system(s) on local (controlling) side and remote (controlled) side - description: What operating system(s) do you see this bug on? local (controlling) side -> remote (controlled) side. - placeholder: | - Windows 10 -> osx - validations: - required: true - - type: input - id: version - attributes: - label: RustDesk Version(s) on local (controlling) side and remote (controlled) side - description: What RustDesk version(s) do you see this bug on? local (controlling) side -> remote (controlled) side. - placeholder: | - 1.1.9 -> 1.1.8 - validations: - required: true - - type: textarea - id: screenshots - attributes: - label: Screenshots - description: Please add screenshots to help explain your problem, if applicable, please upload video. - validations: - required: true - - type: textarea - id: context - attributes: - label: Additional Context - description: Add any additonal context about the problem here diff --git a/shelled/rustdesk-as-ref/.github/ISSUE_TEMPLATE/config.yml b/shelled/rustdesk-as-ref/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 8a5429b..0000000 --- a/shelled/rustdesk-as-ref/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,8 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Feature Request - url: https://github.com/rustdesk/rustdesk/discussions/categories/feature-request - about: Discuss ideas for new features or enhancements, it will be converted to GitHub issue when we commit to building those changes or are helping a community member contribute their own changes - - name: Ask a question - url: https://github.com/rustdesk/rustdesk/discussions/category_choices - about: Ask questions and discuss with other community members. diff --git a/shelled/rustdesk-as-ref/.github/dependabot.yml b/shelled/rustdesk-as-ref/.github/dependabot.yml deleted file mode 100644 index 56258e4..0000000 --- a/shelled/rustdesk-as-ref/.github/dependabot.yml +++ /dev/null @@ -1,11 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "gitsubmodule" - directory: "/" - target-branch: "master" - schedule: - interval: "daily" - commit-message: - prefix: "Git submodule" - labels: - - "dependencies" diff --git a/shelled/rustdesk-as-ref/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff b/shelled/rustdesk-as-ref/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff deleted file mode 100644 index 9b8ea26..0000000 --- a/shelled/rustdesk-as-ref/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff +++ /dev/null @@ -1,42 +0,0 @@ -diff --git a/packages/flutter/lib/src/material/dropdown_menu.dart b/packages/flutter/lib/src/material/dropdown_menu.dart -index 7e634cd2aa..c1e9acc295 100644 ---- a/packages/flutter/lib/src/material/dropdown_menu.dart -+++ b/packages/flutter/lib/src/material/dropdown_menu.dart -@@ -475,7 +475,7 @@ class _DropdownMenuState extends State> { - final GlobalKey _leadingKey = GlobalKey(); - late List buttonItemKeys; - final MenuController _controller = MenuController(); -- late bool _enableFilter; -+ bool _enableFilter = false; - late List> filteredEntries; - List? _initialMenu; - int? currentHighlight; -@@ -524,6 +524,11 @@ class _DropdownMenuState extends State> { - } - _localTextEditingController = widget.controller ?? TextEditingController(); - } -+ if (oldWidget.enableFilter != widget.enableFilter) { -+ if (!widget.enableFilter) { -+ _enableFilter = false; -+ } -+ } - if (oldWidget.enableSearch != widget.enableSearch) { - if (!widget.enableSearch) { - currentHighlight = null; -@@ -663,6 +668,7 @@ class _DropdownMenuState extends State> { - ); - currentHighlight = widget.enableSearch ? i : null; - widget.onSelected?.call(entry.value); -+ _enableFilter = false; - } - : null, - requestFocusOnHover: false, -@@ -735,6 +741,8 @@ class _DropdownMenuState extends State> { - if (_enableFilter) { - filteredEntries = widget.filterCallback?.call(filteredEntries, _localTextEditingController!.text) - ?? filter(widget.dropdownMenuEntries, _localTextEditingController!); -+ } else { -+ filteredEntries = widget.dropdownMenuEntries; - } - - if (widget.enableSearch) { diff --git a/shelled/rustdesk-as-ref/.github/workflows/bridge.yml b/shelled/rustdesk-as-ref/.github/workflows/bridge.yml deleted file mode 100644 index 1913132..0000000 --- a/shelled/rustdesk-as-ref/.github/workflows/bridge.yml +++ /dev/null @@ -1,98 +0,0 @@ -# This yaml shares the build bridge steps with ci and nightly. -name: Build flutter-rust-bridge -# 2023-11-23 18:00:00+00:00 - -on: - workflow_call: - -env: - CARGO_EXPAND_VERSION: "1.0.95" - FLUTTER_VERSION: "3.22.3" - FLUTTER_RUST_BRIDGE_VERSION: "1.80.1" - RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503 - -jobs: - generate_bridge: - runs-on: ${{ matrix.job.os }} - strategy: - fail-fast: false - matrix: - job: - - { - target: x86_64-unknown-linux-gnu, - os: ubuntu-22.04, - extra-build-args: "", - } - steps: - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install prerequisites - run: | - sudo apt-get install ca-certificates -y - sudo apt-get update -y - sudo apt-get install -y \ - clang \ - cmake \ - curl \ - gcc \ - git \ - g++ \ - libclang-dev \ - libgtk-3-dev \ - llvm-dev \ - nasm \ - ninja-build \ - pkg-config \ - wget - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - with: - toolchain: ${{ env.RUST_VERSION }} - targets: ${{ matrix.job.target }} - components: "rustfmt" - - - uses: Swatinem/rust-cache@v2 - with: - prefix-key: bridge-${{ matrix.job.os }} - - - name: Cache Bridge - id: cache-bridge - uses: actions/cache@v3 - with: - path: /tmp/flutter_rust_bridge - key: vcpkg-${{ matrix.job.arch }} - - - name: Install flutter - uses: subosito/flutter-action@v2 - with: - channel: "stable" - flutter-version: ${{ env.FLUTTER_VERSION }} - cache: true - - - name: Install flutter rust bridge deps - shell: bash - run: | - cargo install cargo-expand --version ${{ env.CARGO_EXPAND_VERSION }} --locked - cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" --locked - pushd flutter && sed -i -e 's/extended_text: 14.0.0/extended_text: 13.0.0/g' pubspec.yaml && flutter pub get && popd - - - name: Run flutter rust bridge - run: | - ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h - cp ./flutter/macos/Runner/bridge_generated.h ./flutter/ios/Runner/bridge_generated.h - - - name: Upload Artifact - uses: actions/upload-artifact@master - with: - name: bridge-artifact - path: | - ./src/bridge_generated.rs - ./src/bridge_generated.io.rs - ./flutter/lib/generated_bridge.dart - ./flutter/lib/generated_bridge.freezed.dart - ./flutter/macos/Runner/bridge_generated.h - ./flutter/ios/Runner/bridge_generated.h diff --git a/shelled/rustdesk-as-ref/.github/workflows/ci.yml b/shelled/rustdesk-as-ref/.github/workflows/ci.yml deleted file mode 100644 index 3a7d21d..0000000 --- a/shelled/rustdesk-as-ref/.github/workflows/ci.yml +++ /dev/null @@ -1,250 +0,0 @@ -name: CI - -env: -# MIN_SUPPORTED_RUST_VERSION: "1.46.0" -# CICD_INTERMEDIATES_DIR: "_cicd-intermediates" - VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" - # for multiarch gcc compatibility - VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b" - -on: - workflow_dispatch: - pull_request: - paths-ignore: - - "docs/**" - - "README.md" - push: - branches: - - master - paths-ignore: - - ".github/**" - - "docs/**" - - "README.md" - - "res/**" - - "appimage/**" - - "flatpak/**" - -jobs: - # ensure_cargo_fmt: - # name: Ensure 'cargo fmt' has been run - # runs-on: ubuntu-20.04 - # steps: - # - uses: actions-rs/toolchain@v1 - # with: - # toolchain: stable - # default: true - # profile: minimal - # components: rustfmt - # - uses: actions/checkout@v3 - # - run: cargo fmt -- --check - - # min_version: - # name: Minimum supported rust version - # runs-on: ubuntu-20.04 - # steps: - # - name: Checkout source code - # uses: actions/checkout@v3 - # with: - # submodules: recursive - - # - name: Install rust toolchain (v${{ env.MIN_SUPPORTED_RUST_VERSION }}) - # uses: actions-rs/toolchain@v1 - # with: - # toolchain: ${{ env.MIN_SUPPORTED_RUST_VERSION }} - # default: true - # profile: minimal # minimal component installation (ie, no documentation) - # components: clippy - # - name: Run clippy (on minimum supported rust version to prevent warnings we can't fix) - # uses: actions-rs/cargo@v1 - # with: - # command: clippy - # args: --locked --all-targets --all-features -- --allow clippy::unknown_clippy_lints - # - name: Run tests - # uses: actions-rs/cargo@v1 - # with: - # command: test - # args: --locked - - build: - name: ${{ matrix.job.target }} (${{ matrix.job.os }}) - runs-on: ${{ matrix.job.os }} - strategy: - fail-fast: false - matrix: - job: - # - { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true } - # - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true } - # - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true } - # - { target: i686-pc-windows-msvc , os: windows-2022 } - # - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true } - # - { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true } - # - { target: x86_64-apple-darwin , os: macos-10.15 } - # - { target: x86_64-pc-windows-gnu , os: windows-2022 } - # - { target: x86_64-pc-windows-msvc , os: windows-2022 } - - { target: x86_64-unknown-linux-gnu , os: ubuntu-24.04 } - # - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true } - steps: - - name: Free Disk Space (Ubuntu) - if: runner.os == 'Linux' - # jlumbroso/free-disk-space@main is used in .github\workflows\flutter-build.yml - # But pinning to a specific version to avoid unexpected issues is preferred. - uses: jlumbroso/free-disk-space@v1.3.1 - with: - tool-cache: false - android: true - dotnet: true - haskell: true - large-packages: false - docker-images: true - swap-storage: false - - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install prerequisites - shell: bash - run: | - case ${{ matrix.job.target }} in - x86_64-unknown-linux-gnu) - sudo apt-get -y update - sudo apt-get install -y \ - clang \ - cmake \ - curl \ - gcc \ - git \ - g++ \ - libpam0g-dev \ - libasound2-dev \ - libunwind-dev \ - libgstreamer1.0-dev \ - libgstreamer-plugins-base1.0-dev \ - libgtk-3-dev \ - libpulse-dev \ - libva-dev \ - libvdpau-dev \ - libxcb-randr0-dev \ - libxcb-shape0-dev \ - libxcb-xfixes0-dev \ - libxdo-dev \ - libxfixes-dev \ - nasm \ - wget - ;; - # arm-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;; - # aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;; - esac - - - name: Setup vcpkg with Github Actions binary cache - uses: lukka/run-vcpkg@v11 - with: - vcpkgDirectory: /opt/artifacts/vcpkg - vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} - - - name: Install vcpkg dependencies - run: | - $VCPKG_ROOT/vcpkg install --x-install-root="$VCPKG_ROOT/installed" - shell: bash - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - with: - toolchain: stable - targets: ${{ matrix.job.target }} - components: '' - - - name: Show version information (Rust, cargo, GCC) - shell: bash - run: | - gcc --version || true - rustup -V - rustup toolchain list - rustup default - cargo -V - rustc -V - - - uses: Swatinem/rust-cache@v2 - - - name: Build - uses: actions-rs/cargo@v1 - with: - use-cross: ${{ matrix.job.use-cross }} - command: build - args: --locked --target=${{ matrix.job.target }} - - - name: clean - shell: bash - run: | - cargo clean - - # - name: Strip debug information from executable - # id: strip - # shell: bash - # run: | - # # Figure out suffix of binary - # EXE_suffix="" - # case ${{ matrix.job.target }} in - # *-pc-windows-*) EXE_suffix=".exe" ;; - # esac; - - # # Figure out what strip tool to use if any - # STRIP="strip" - # case ${{ matrix.job.target }} in - # arm-unknown-linux-*) STRIP="arm-linux-gnueabihf-strip" ;; - # aarch64-unknown-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;; - # *-pc-windows-msvc) STRIP="" ;; - # esac; - - # # Setup paths - # BIN_DIR="${{ env.CICD_INTERMEDIATES_DIR }}/stripped-release-bin/" - # mkdir -p "${BIN_DIR}" - # BIN_NAME="${{ env.PROJECT_NAME }}${EXE_suffix}" - # BIN_PATH="${BIN_DIR}/${BIN_NAME}" - - # # Copy the release build binary to the result location - # cp "target/${{ matrix.job.target }}/release/${BIN_NAME}" "${BIN_DIR}" - - # # Also strip if possible - # if [ -n "${STRIP}" ]; then - # "${STRIP}" "${BIN_PATH}" - # fi - - # # Let subsequent steps know where to find the (stripped) bin - # echo ::set-output name=BIN_PATH::${BIN_PATH} - # echo ::set-output name=BIN_NAME::${BIN_NAME} - - - name: Set testing options - id: test-options - shell: bash - run: | - # test only library unit tests and binary for arm-type targets - unset CARGO_TEST_OPTIONS - - case ${{ matrix.job.target }} in - arm-* | aarch64-*) - CARGO_TEST_OPTIONS="--lib --bin ${PROJECT_NAME}" - ;; - *) - CARGO_TEST_OPTIONS="--workspace --no-fail-fast -- --skip test_get_cursor_pos --skip test_get_key_state" - ;; - esac; - - #deprecated echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS} - echo "CARGO_TEST_OPTIONS=${CARGO_TEST_OPTIONS}" >> $GITHUB_ENV - echo "CARGO_TEST_OPTIONS=${CARGO_TEST_OPTIONS}" >> $GITHUB_OUTPUT - - - name: Run tests - uses: actions-rs/cargo@v1 - with: - use-cross: ${{ matrix.job.use-cross }} - command: test - args: --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}} diff --git a/shelled/rustdesk-as-ref/.github/workflows/clear-cache.yml b/shelled/rustdesk-as-ref/.github/workflows/clear-cache.yml deleted file mode 100644 index cd94cab..0000000 --- a/shelled/rustdesk-as-ref/.github/workflows/clear-cache.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Clear cache - -on: - workflow_dispatch: - -permissions: - actions: write - -jobs: - clear-cache: - runs-on: ubuntu-latest - steps: - - name: Clear cache - uses: actions/github-script@v7 - with: - script: | - console.log("About to clear") - const caches = await github.rest.actions.getActionsCacheList({ - owner: context.repo.owner, - repo: context.repo.repo, - }) - for (const cache of caches.data.actions_caches) { - console.log(cache) - github.rest.actions.deleteActionsCacheById({ - owner: context.repo.owner, - repo: context.repo.repo, - cache_id: cache.id, - }) - } - console.log("Clear completed") - - - name: Purge cache # Above seems not clear thouroughly, so add this to double clear - uses: MyAlbum/purge-cache@v2 - with: - accessed: true # Purge caches by their last accessed time (default) - created: false # Purge caches by their created time (default) - max-age: 1 # in seconds diff --git a/shelled/rustdesk-as-ref/.github/workflows/fdroid.yml b/shelled/rustdesk-as-ref/.github/workflows/fdroid.yml deleted file mode 100644 index 94f8d3d..0000000 --- a/shelled/rustdesk-as-ref/.github/workflows/fdroid.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Fdroid version file generation - -on: - workflow_dispatch: - push: - tags: - - 'v[0-9]+.[0-9]+.[0-9]+' - - '[0-9]+.[0-9]+.[0-9]+' - - 'v[0-9]+.[0-9]+.[0-9]+-[0-9]+' - - '[0-9]+.[0-9]+.[0-9]+-[0-9]+' - -jobs: - # https://gitlab.com/fdroid/fdroiddata/-/blob/master/metadata/com.carriez.flutter_hbb.yml - # Finds latest release and transforms F-Droid version code from version as follows: - # X.Y.Z-A => X * 1e6 + Y * 1e4 + Z * 1e2 + A - update-fdroid-version-file: - name: Publish RustDesk version file for F-Droid updater - runs-on: ubuntu-latest - steps: - - name: Generate RustDesk version file - run: | - if [ "${GITHUB_REF_TYPE}" = "tag" ]; then - UPSTREAM_VERNAME="${GITHUB_REF##refs/tags/}" - UPSTREAM_VERNAME="${UPSTREAM_VERNAME##v}" - else - UPSTREAM_VERNAME="$(curl https://api.github.com/repos/rustdesk/rustdesk/releases/latest | jq -r .tag_name | sed 's/^v//')" - fi - UPSTREAM_VERCODE="$(echo "$UPSTREAM_VERNAME" | tr '.' ' ' | tr '-' ' ' | while read -r MAJOR MINOR PATCH REV; do [ -z "$MAJOR" ] && MAJOR=0; [ -z "$MINOR" ] && MINOR=0; [ -z "$PATCH" ] && PATCH=0; [ -z "$REV" ] && REV=0; echo "$(( 1000000 * $MAJOR + 10000 * $MINOR + 100 * $PATCH + $REV ))"; done)" - echo "versionName=$UPSTREAM_VERNAME" > rustdesk-version.txt - echo "versionCode=$UPSTREAM_VERCODE" >> rustdesk-version.txt - shell: bash - - - name: Publish RustDesk version file - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: "fdroid-version" - files: | - ./rustdesk-version.txt diff --git a/shelled/rustdesk-as-ref/.github/workflows/flutter-build.yml b/shelled/rustdesk-as-ref/.github/workflows/flutter-build.yml deleted file mode 100644 index 263bd67..0000000 --- a/shelled/rustdesk-as-ref/.github/workflows/flutter-build.yml +++ /dev/null @@ -1,2062 +0,0 @@ -name: Build the flutter version of the RustDesk - -on: - workflow_call: - inputs: - upload-artifact: - type: boolean - default: true - upload-tag: - type: string - default: "nightly" - -# NOTE: F-Droid builder script 'flutter/build_fdroid.sh' reads environment -# variables from this workflow! -# -# It does NOT read build steps, however, so please fix 'flutter/build_fdroid.sh -# whenever you add changes to Android CI build action ('build-rustdesk-android') -# in this file! - -env: - SCITER_RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503, also 1.78 has ABI change which causes our sciter version not working, https://blog.rust-lang.org/2024/03/30/i128-layout-update.html - RUST_VERSION: "1.75" # sciter failed on m1 with 1.78 because of https://blog.rust-lang.org/2024/03/30/i128-layout-update.html - MAC_RUST_VERSION: "1.81" # 1.81 is requred for macos, because of https://github.com/yury/cidre requires 1.81 - CARGO_NDK_VERSION: "3.1.2" - SCITER_ARMV7_CMAKE_VERSION: "3.29.7" - SCITER_NASM_DEBVERSION: "2.15.05-1" - LLVM_VERSION: "15.0.6" - FLUTTER_VERSION: "3.24.5" - ANDROID_FLUTTER_VERSION: "3.24.5" - # for arm64 linux because official Dart SDK does not work - FLUTTER_ELINUX_VERSION: "3.16.9" - TAG_NAME: "${{ inputs.upload-tag }}" - VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" - # vcpkg version: 2025.08.27 - # If we change the `VCPKG COMMIT_ID`, please remember: - # 1. Call `$VCPKG_ROOT/vcpkg x-update-baseline` to update the baseline in `vcpkg.json`. - # Or we may face build issue like - # https://github.com/rustdesk/rustdesk/actions/runs/14414119794/job/40427970174 - # 2. Update the `VCPKG_COMMIT_ID` in `ci.yml` and `playground.yml`. - VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b" - ARMV7_VCPKG_COMMIT_ID: "6f29f12e82a8293156836ad81cc9bf5af41fe836" # 2025.01.13, got "/opt/artifacts/vcpkg/vcpkg: No such file or directory" with latest version - VERSION: "1.4.6" - NDK_VERSION: "r28c" - #signing keys env variable checks - ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}" - MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}" - UPLOAD_ARTIFACT: "${{ inputs.upload-artifact }}" - SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}-2" - -jobs: - generate-bridge: - uses: ./.github/workflows/bridge.yml - - build-RustDeskTempTopMostWindow: - uses: ./.github/workflows/third-party-RustDeskTempTopMostWindow.yml - with: - upload-artifact: ${{ inputs.upload-artifact }} - target: windows-2022 - configuration: Release - platform: x64 - target_version: Windows10 - strategy: - fail-fast: false - - build-for-windows-flutter: - name: ${{ matrix.job.target }} - needs: [build-RustDeskTempTopMostWindow, generate-bridge] - runs-on: ${{ matrix.job.os }} - strategy: - fail-fast: false - matrix: - job: - # - { target: i686-pc-windows-msvc , os: windows-2022 } - # - { target: x86_64-pc-windows-gnu , os: windows-2022 } - - { - target: x86_64-pc-windows-msvc, - os: windows-2022, - arch: x86_64, - vcpkg-triplet: x64-windows-static, - } - # - { target: aarch64-pc-windows-msvc, os: windows-2022, arch: aarch64 } - steps: - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Restore bridge files - uses: actions/download-artifact@master - with: - name: bridge-artifact - path: ./ - - - name: Install LLVM and Clang - uses: KyleMayes/install-llvm-action@v1 - with: - version: ${{ env.LLVM_VERSION }} - - - name: Install flutter - uses: subosito/flutter-action@v2.12.0 #https://github.com/subosito/flutter-action/issues/277 - with: - channel: "stable" - flutter-version: ${{ env.FLUTTER_VERSION }} - - # https://github.com/flutter/flutter/issues/155685 - - name: Replace engine with rustdesk custom flutter engine - run: | - flutter doctor -v - flutter precache --windows - Invoke-WebRequest -Uri https://github.com/rustdesk/engine/releases/download/main/windows-x64-release.zip -OutFile windows-x64-release.zip - Expand-Archive -Path windows-x64-release.zip -DestinationPath windows-x64-release - mv -Force windows-x64-release/*  C:/hostedtoolcache/windows/flutter/stable-${{ env.FLUTTER_VERSION }}-x64/bin/cache/artifacts/engine/windows-x64-release/ - - - name: Patch flutter - shell: bash - run: | - cp .github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff $(dirname $(dirname $(which flutter))) - cd $(dirname $(dirname $(which flutter))) - [[ "3.24.5" == ${{env.FLUTTER_VERSION}} ]] && git apply flutter_3.24.4_dropdown_menu_enableFilter.diff - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - with: - toolchain: ${{ env.SCITER_RUST_VERSION }} - targets: ${{ matrix.job.target }} - components: "rustfmt" - - - uses: Swatinem/rust-cache@v2 - with: - prefix-key: ${{ matrix.job.os }} - - - name: Setup vcpkg with Github Actions binary cache - uses: lukka/run-vcpkg@v11 - with: - vcpkgDirectory: C:\vcpkg - vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} - doNotCache: false - - - name: Install vcpkg dependencies - env: - VCPKG_DEFAULT_HOST_TRIPLET: ${{ matrix.job.vcpkg-triplet }} - run: | - if ! $VCPKG_ROOT/vcpkg \ - install \ - --triplet ${{ matrix.job.vcpkg-triplet }} \ - --x-install-root="$VCPKG_ROOT/installed"; then - find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do - echo "$_1:" - echo "======" - cat "$_1" - echo "======" - echo "" - done - exit 1 - fi - head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true - shell: bash - - - name: Build rustdesk - run: | - # Windows: build RustDesk - python3 .\build.py --portable --hwcodec --flutter --vram --skip-portable-pack - mv ./flutter/build/windows/x64/runner/Release ./rustdesk - - # Download usbmmidd_v2.zip and extract it to ./rustdesk - Invoke-WebRequest -Uri https://github.com/rustdesk-org/rdev/releases/download/usbmmidd_v2/usbmmidd_v2.zip -OutFile usbmmidd_v2.zip - Expand-Archive usbmmidd_v2.zip -DestinationPath . - Remove-Item -Path usbmmidd_v2\Win32 -Recurse - Remove-Item -Path "usbmmidd_v2\deviceinstaller64.exe", "usbmmidd_v2\deviceinstaller.exe", "usbmmidd_v2\usbmmidd.bat" - mv -Force .\usbmmidd_v2 ./rustdesk - - # Download printer driver files and extract them to ./rustdesk - try { - Invoke-WebRequest -Uri https://github.com/rustdesk/hbb_common/releases/download/driver/rustdesk_printer_driver_v4-1.4.zip -OutFile rustdesk_printer_driver_v4-1.4.zip - Invoke-WebRequest -Uri https://github.com/rustdesk/hbb_common/releases/download/driver/printer_driver_adapter.zip -OutFile printer_driver_adapter.zip - Invoke-WebRequest -Uri https://github.com/rustdesk/hbb_common/releases/download/driver/sha256sums -OutFile sha256sums - - # Check and move the files - $checksum_driver = (Select-String -Path .\sha256sums -Pattern '^([a-fA-F0-9]{64}) \*rustdesk_printer_driver_v4-1.4\.zip$').Matches.Groups[1].Value - $downloadsum_driver = Get-FileHash -Path rustdesk_printer_driver_v4-1.4.zip -Algorithm SHA256 - $checksum_adapter = (Select-String -Path .\sha256sums -Pattern '^([a-fA-F0-9]{64}) \*printer_driver_adapter\.zip$').Matches.Groups[1].Value - $downloadsum_adapter = Get-FileHash -Path printer_driver_adapter.zip -Algorithm SHA256 - if ($checksum_driver -eq $downloadsum_driver.Hash -and $checksum_adapter -eq $downloadsum_adapter.Hash) { - Write-Output "rustdesk_printer_driver_v4-1.4, checksums match, extract the file." - Expand-Archive rustdesk_printer_driver_v4-1.4.zip -DestinationPath . - mkdir ./rustdesk/drivers - mv -Force .\rustdesk_printer_driver_v4-1.4 ./rustdesk/drivers/RustDeskPrinterDriver - Expand-Archive printer_driver_adapter.zip -DestinationPath . - mv -Force .\printer_driver_adapter.dll ./rustdesk - } elseif ($checksum_driver -ne $downloadsum_driver.Hash) { - Write-Output "rustdesk_printer_driver_v4-1.4, checksums do not match, ignore the file." - } else { - Write-Output "printer_driver_adapter.dll, checksums do not match, ignore the file." - } - } catch { - Write-Host "Ingore the printer driver error." - } - - - name: find Runner.res - # Windows: find Runner.res (compiled from ./flutter/windows/runner/Runner.rc), copy to ./Runner.res - # Runner.rc does not contain actual version, but Runner.res does - continue-on-error: true - shell: bash - run: | - runner_res=$(find . -name "Runner.res"); - if [ "$runner_res" == "" ]; then - echo "Runner.res: not found"; - else - echo "Runner.res: $runner_res"; - cp $runner_res ./libs/portable/Runner.res; - echo "list ./libs/portable/Runner.res"; - ls -l ./libs/portable/Runner.res; - fi - - - name: Download RustDeskTempTopMostWindow artifacts - uses: actions/download-artifact@master - if: ${{ inputs.upload-artifact }} - with: - name: topmostwindow-artifacts - path: "./rustdesk" - - - name: Upload unsigned - if: env.UPLOAD_ARTIFACT == 'true' - uses: actions/upload-artifact@master - with: - name: rustdesk-unsigned-windows-${{ matrix.job.arch }} - path: rustdesk - - - name: Sign rustdesk files - if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != '-2' - shell: bash - run: | - pip3 install requests argparse - BASE_URL=${{ env.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./rustdesk/ - - - name: Build self-extracted executable - shell: bash - if: env.UPLOAD_ARTIFACT == 'true' - run: | - sed -i '/dpiAware/d' res/manifest.xml - pushd ./libs/portable - pip3 install -r requirements.txt - python3 ./generate.py -f ../../rustdesk/ -o . -e ../../rustdesk/rustdesk.exe - popd - mkdir -p ./SignOutput - mv ./target/release/rustdesk-portable-packer.exe ./SignOutput/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.exe - - - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v2 - - - name: Build msi - if: env.UPLOAD_ARTIFACT == 'true' - run: | - pushd ./res/msi - python preprocess.py --arp -d ../../rustdesk - nuget restore msi.sln - msbuild msi.sln -p:Configuration=Release -p:Platform=x64 /p:TargetVersion=Windows10 - mv ./Package/bin/x64/Release/en-us/Package.msi ../../SignOutput/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.msi - sha256sum ../../SignOutput/rustdesk-*.msi - - - name: Sign rustdesk self-extracted file - if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != '-2' - shell: bash - run: | - BASE_URL=${{ env.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./SignOutput - - - name: Publish Release - uses: softprops/action-gh-release@v1 - if: env.UPLOAD_ARTIFACT == 'true' - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - ./SignOutput/rustdesk-*.msi - ./SignOutput/rustdesk-*.exe - - # The fallback for the flutter version, we use Sciter for 32bit Windows. - build-for-windows-sciter: - name: ${{ matrix.job.target }} (${{ matrix.job.os }}) - runs-on: ${{ matrix.job.os }} - # Temporarily disable this action due to additional test is needed. - # if: false - strategy: - fail-fast: false - matrix: - job: - # - { target: i686-pc-windows-msvc , os: windows-2022 } - # - { target: x86_64-pc-windows-gnu , os: windows-2022 } - - { - target: i686-pc-windows-msvc, - os: windows-2022, - arch: x86, - vcpkg-triplet: x86-windows-static, - } - # - { target: aarch64-pc-windows-msvc, os: windows-2022 } - steps: - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install LLVM and Clang - uses: rustdesk-org/install-llvm-action-32bit@master - with: - version: ${{ env.LLVM_VERSION }} - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - with: - toolchain: nightly-2023-10-13-${{ matrix.job.target }} # must use nightly here, because of abi_thiscall feature required - targets: ${{ matrix.job.target }} - components: "rustfmt" - - - uses: Swatinem/rust-cache@v2 - with: - prefix-key: ${{ matrix.job.os }}-sciter - - - name: Setup vcpkg with Github Actions binary cache - uses: lukka/run-vcpkg@v11 - with: - vcpkgDirectory: C:\vcpkg - vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} - doNotCache: false - - - name: Install vcpkg dependencies - env: - VCPKG_DEFAULT_HOST_TRIPLET: ${{ matrix.job.vcpkg-triplet }} - run: | - if ! $VCPKG_ROOT/vcpkg \ - install \ - --triplet ${{ matrix.job.vcpkg-triplet }} \ - --x-install-root="$VCPKG_ROOT/installed"; then - find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do - echo "$_1:" - echo "======" - cat "$_1" - echo "======" - echo "" - done - exit 1 - fi - head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true - shell: bash - - - name: Build rustdesk - id: build - shell: bash - run: | - python3 res/inline-sciter.py - # Patch sciter x86 - sed -i 's/branch = "dyn"/branch = "dyn_x86"/g' ./Cargo.toml - cargo build --features inline,vram,hwcodec --release --bins - mkdir -p ./Release - mv ./target/release/rustdesk.exe ./Release/rustdesk.exe - curl -LJ -o ./Release/sciter.dll https://github.com/c-smile/sciter-sdk/raw/master/bin.win/x32/sciter.dll - echo "output_folder=./Release" >> $GITHUB_OUTPUT - curl -LJ -o ./usbmmidd_v2.zip https://github.com/rustdesk-org/rdev/releases/download/usbmmidd_v2/usbmmidd_v2.zip - unzip usbmmidd_v2.zip - # Do not remove x64 files, because the user may run the 32bit version on a 64bit system. - # Do not remove ./usbmmidd_v2/deviceinstaller64.exe, as x86 exe cannot install and uninstall drivers when running on x64, - # we need the x64 exe to install and uninstall the driver. - rm -rf ./usbmmidd_v2/deviceinstaller.exe ./usbmmidd_v2/usbmmidd.bat - mv ./usbmmidd_v2 ./Release || true - - - name: find Runner.res - # Windows: find Runner.res (compiled from ./flutter/windows/runner/Runner.rc), copy to ./Runner.res - # Runner.rc does not contain actual version, but Runner.res does - continue-on-error: true - shell: bash - run: | - runner_res=$(find . -name "Runner.res"); - if [ "$runner_res" == "" ]; then - echo "Runner.res: not found"; - else - echo "Runner.res: $runner_res"; - cp $runner_res ./libs/portable/Runner.res; - echo "list ./libs/portable/Runner.res"; - ls -l ./libs/portable/Runner.res; - fi - - - name: Upload unsigned - if: env.UPLOAD_ARTIFACT == 'true' - uses: actions/upload-artifact@master - with: - name: rustdesk-unsigned-windows-${{ matrix.job.arch }} - path: Release - - - name: Sign rustdesk files - if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != '-2' - shell: bash - run: | - pip3 install requests argparse - BASE_URL=${{ env.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./Release/ - - - name: Build self-extracted executable - shell: bash - run: | - sed -i '/dpiAware/d' res/manifest.xml - pushd ./libs/portable - pip3 install -r requirements.txt - python3 ./generate.py -f ../../Release/ -o . -e ../../Release/rustdesk.exe - popd - mkdir -p ./SignOutput - mv ./target/release/rustdesk-portable-packer.exe ./SignOutput/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.exe - - - name: Sign rustdesk self-extracted file - if: env.UPLOAD_ARTIFACT == 'true' && env.SIGN_BASE_URL != '-2' - shell: bash - run: | - BASE_URL=${{ env.SIGN_BASE_URL }} SECRET_KEY=${{ secrets.SIGN_SECRET_KEY }} python3 res/job.py sign_files ./SignOutput/ - - - name: Publish Release - uses: softprops/action-gh-release@v1 - if: env.UPLOAD_ARTIFACT == 'true' - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - ./SignOutput/rustdesk-*.exe - - build-rustdesk-ios: - if: ${{ inputs.upload-artifact }} - name: build rustdesk ios ipa - runs-on: ${{ matrix.job.os }} - needs: [generate-bridge] - strategy: - fail-fast: false - matrix: - job: - - { - arch: aarch64, - target: aarch64-apple-ios, - os: macos-latest, - vcpkg-triplet: arm64-ios, - } - steps: - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Install dependencies - run: | - brew install nasm yasm - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install flutter - uses: subosito/flutter-action@v2 - with: - channel: "stable" - flutter-version: ${{ env.FLUTTER_VERSION }} - - - name: Patch flutter - run: | - cd $(dirname $(dirname $(which flutter))) - [[ "3.24.5" == ${{env.FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff - - - name: Setup vcpkg with Github Actions binary cache - uses: lukka/run-vcpkg@v11 - with: - vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} - doNotCache: false - - - name: Install vcpkg dependencies - run: | - if ! $VCPKG_ROOT/vcpkg \ - install \ - --triplet ${{ matrix.job.vcpkg-triplet }} \ - --x-install-root="$VCPKG_ROOT/installed"; then - find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do - echo "$_1:" - echo "======" - cat "$_1" - echo "======" - echo "" - done - exit 1 - fi - head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true - shell: bash - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - with: - toolchain: ${{ env.RUST_VERSION }} - targets: ${{ matrix.job.target }} - components: "rustfmt" - - - uses: Swatinem/rust-cache@v2 - with: - prefix-key: rustdesk-lib-cache-ios - key: ${{ matrix.job.target }} - - - name: Restore bridge files - uses: actions/download-artifact@master - with: - name: bridge-artifact - path: ./ - - - name: Build rustdesk lib - run: | - rustup target add ${{ matrix.job.target }} - cargo build --features flutter,hwcodec --release --target aarch64-apple-ios --lib - - - name: Upload liblibrustdesk.a Artifacts - uses: actions/upload-artifact@master - with: - name: liblibrustdesk.a - path: target/aarch64-apple-ios/release/liblibrustdesk.a - - - name: Build rustdesk - shell: bash - run: | - pushd flutter - # flutter build ipa --release --obfuscate --split-debug-info=./split-debug-info --no-codesign - # for easy debugging - flutter build ipa --release --no-codesign - - # - name: Upload Artifacts - # # if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true' - # uses: actions/upload-artifact@master - # with: - # name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk - # path: flutter/build/ios/ipa/*.ipa - - # - name: Publish ipa package - # # if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true' - # uses: softprops/action-gh-release@v1 - # with: - # prerelease: true - # tag_name: ${{ env.TAG_NAME }} - # files: | - # flutter/build/ios/ipa/*.ipa - - - build-for-macOS: - name: ${{ matrix.job.target }} - runs-on: ${{ matrix.job.os }} - needs: [generate-bridge] - strategy: - fail-fast: false - matrix: - job: - - { - target: x86_64-apple-darwin, - os: macos-15-intel, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel - extra-build-args: "", - arch: x86_64, - vcpkg-triplet: x64-osx, - } - - { - target: aarch64-apple-darwin, - os: macos-14, - # extra-build-args: "--disable-flutter-texture-render", # disable this for mac, because we see a lot of users reporting flickering both on arm and x64, and we can not confirm if texture rendering has better performance if htere is no vram, https://github.com/rustdesk/rustdesk/issues/6296 - extra-build-args: "--screencapturekit", - arch: aarch64, - vcpkg-triplet: arm64-osx, - } - steps: - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Import the codesign cert - if: env.MACOS_P12_BASE64 != null - uses: apple-actions/import-codesign-certs@v1 - with: - p12-file-base64: ${{ secrets.MACOS_P12_BASE64 }} - p12-password: ${{ secrets.MACOS_P12_PASSWORD }} - keychain: rustdesk - - - name: Check sign and import sign key - if: env.MACOS_P12_BASE64 != null - run: | - security default-keychain -s rustdesk.keychain - security find-identity -v - - - name: Import notarize key - if: env.MACOS_P12_BASE64 != null - uses: timheuer/base64-to-file@v1.2 - with: - # https://gregoryszorc.com/docs/apple-codesign/stable/apple_codesign_rcodesign.html#notarizing-and-stapling - fileName: rustdesk.json - fileDir: ${{ github.workspace }} - encodedString: ${{ secrets.MACOS_NOTARIZE_JSON }} - - - name: Install rcodesign tool - if: env.MACOS_P12_BASE64 != null - shell: bash - run: | - pushd /tmp - wget https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.22.0/apple-codesign-0.22.0-macos-universal.tar.gz - tar -zxvf apple-codesign-0.22.0-macos-universal.tar.gz - mv apple-codesign-0.22.0-macos-universal/rcodesign /usr/local/bin - popd - - - name: Install build runtime - run: | - brew install llvm create-dmg - # pkg-config is handled in a separate step, because it may be already installed by `macos-latest`(14.7.1) runner - if command -v pkg-config &>/dev/null; then - echo "pkg-config is already installed" - else - brew install pkg-config - fi - - - name: Install NASM - run: | - # Install NASM 2.16.x from official release. - # Do NOT use `brew install nasm` which installs NASM 3.x. - # NASM 3.x is a complete rewrite with incompatible CLI options and removed features. - # aom and other multimedia libraries require NASM 2.x for x86/x86_64 assembly. - wget https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/macosx/nasm-2.16.03-macosx.zip - unzip nasm-2.16.03-macosx.zip - sudo cp nasm-2.16.03/nasm /usr/local/bin/nasm - nasm --version - - - name: Install flutter - uses: subosito/flutter-action@v2 - with: - channel: "stable" - flutter-version: ${{ env.FLUTTER_VERSION }} - - - name: Patch flutter - run: | - cd $(dirname $(dirname $(which flutter))) - [[ "3.24.5" == ${{env.FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff - - - name: Workaround for flutter issue - shell: bash - run: | - cd "$(dirname "$(which flutter)")" - # https://github.com/flutter/flutter/issues/133533 - sed -i -e 's/_setFramesEnabledState(false);/\/\/_setFramesEnabledState(false);/g' ../packages/flutter/lib/src/scheduler/binding.dart - grep -n '_setFramesEnabledState(false);' ../packages/flutter/lib/src/scheduler/binding.dart - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - with: - toolchain: ${{ env.MAC_RUST_VERSION }} - targets: ${{ matrix.job.target }} - components: "rustfmt" - - - uses: Swatinem/rust-cache@v2 - with: - prefix-key: ${{ matrix.job.os }} - - - name: Restore bridge files - uses: actions/download-artifact@master - with: - name: bridge-artifact - path: ./ - - - name: Setup vcpkg with Github Actions binary cache - uses: lukka/run-vcpkg@v11 - with: - vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} - doNotCache: false - - - name: Install vcpkg dependencies - run: | - if ! $VCPKG_ROOT/vcpkg \ - install \ - --x-install-root="$VCPKG_ROOT/installed"; then - find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do - echo "$_1:" - echo "======" - cat "$_1" - echo "======" - echo "" - done - exit 1 - fi - head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true - - - name: Show version information (Rust, cargo, Clang) - shell: bash - run: | - clang --version || true - rustup -V - rustup toolchain list - rustup default - cargo -V - rustc -V - - - name: Build rustdesk - run: | - if [ "${{ matrix.job.target }}" = "aarch64-apple-darwin" ]; then - MIN_MACOS_VERSION="12.3" - sed -i -e "s/MACOSX_DEPLOYMENT_TARGET\=[0-9]*.[0-9]*/MACOSX_DEPLOYMENT_TARGET=${MIN_MACOS_VERSION}/" build.py - sed -i -e "s/platform :osx, '.*'/platform :osx, '${MIN_MACOS_VERSION}'/" flutter/macos/Podfile - sed -i -e "s/osx_minimum_system_version = \"[0-9]*.[0-9]*\"/osx_minimum_system_version = \"${MIN_MACOS_VERSION}\"/" Cargo.toml - sed -i -e "s/MACOSX_DEPLOYMENT_TARGET = [0-9]*.[0-9]*;/MACOSX_DEPLOYMENT_TARGET = ${MIN_MACOS_VERSION};/" flutter/macos/Runner.xcodeproj/project.pbxproj - fi - ./build.py --flutter --hwcodec --unix-file-copy-paste ${{ matrix.job.extra-build-args }} - - - name: create unsigned dmg - if: env.UPLOAD_ARTIFACT == 'true' - run: | - CREATE_DMG="$(command -v create-dmg)" - CREATE_DMG="$(readlink -f "$CREATE_DMG")" - sed -i -e 's/MAXIMUM_UNMOUNTING_ATTEMPTS=3/MAXIMUM_UNMOUNTING_ATTEMPTS=7/' "$CREATE_DMG" - create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app - - - name: Upload unsigned macOS app - if: env.UPLOAD_ARTIFACT == 'true' - uses: actions/upload-artifact@master - with: - name: rustdesk-unsigned-macos-${{ matrix.job.arch }} - path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.dmg # can not upload the directory directly or tar.gz, which destroy the link structure, causing the codesign failed - - - name: Codesign app and create signed dmg - if: env.MACOS_P12_BASE64 != null && env.UPLOAD_ARTIFACT == 'true' - run: | - # Patch create-dmg to give more attempts to unmount image - CREATE_DMG="$(command -v create-dmg)" - CREATE_DMG="$(readlink -f "$CREATE_DMG")" - sed -i -e 's/MAXIMUM_UNMOUNTING_ATTEMPTS=3/MAXIMUM_UNMOUNTING_ATTEMPTS=7/' "$CREATE_DMG" - # Unlock keychain - security default-keychain -s rustdesk.keychain - security unlock-keychain -p ${{ secrets.MACOS_P12_PASSWORD }} rustdesk.keychain - # start sign the rustdesk.app and dmg - rm -rf *.dmg || true - codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict ./flutter/build/macos/Build/Products/Release/RustDesk.app -vvv - create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app - codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict rustdesk-${{ env.VERSION }}.dmg -vvv - # notarize the rustdesk-${{ env.VERSION }}.dmg - rcodesign notary-submit --api-key-path ${{ github.workspace }}/rustdesk.json --staple rustdesk-${{ env.VERSION }}.dmg - - - name: Rename rustdesk - if: env.UPLOAD_ARTIFACT == 'true' - run: | - for name in rustdesk*??.dmg; do - mv "$name" "${name%%.dmg}-${{ matrix.job.arch }}.dmg" - done - - - name: Publish DMG package - if: env.UPLOAD_ARTIFACT == 'true' - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - rustdesk*-${{ matrix.job.arch }}.dmg - - publish_unsigned: - needs: - - build-for-macOS - - build-for-windows-flutter - - build-for-windows-sciter - runs-on: ubuntu-latest - if: ${{ inputs.upload-artifact }} - steps: - - name: Download artifacts - uses: actions/download-artifact@master - with: - name: rustdesk-unsigned-macos-x86_64 - path: ./ - - - name: Download Artifacts - uses: actions/download-artifact@master - with: - name: rustdesk-unsigned-macos-aarch64 - path: ./ - - - name: Download Artifacts - uses: actions/download-artifact@master - with: - name: rustdesk-unsigned-windows-x86_64 - path: ./windows-x86_64/ - - - name: Download Artifacts - uses: actions/download-artifact@master - with: - name: rustdesk-unsigned-windows-x86 - path: ./windows-x86/ - - - name: Combine unsigned app - run: | - tar czf rustdesk-${{ env.VERSION }}-unsigned.tar.gz *.dmg windows-x86_64 windows-x86 - - - name: Publish unsigned app - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: rustdesk-${{ env.VERSION }}-unsigned.tar.gz - - build-rustdesk-android: - needs: [generate-bridge] - name: build rustdesk android apk ${{ matrix.job.target }} - runs-on: ${{ matrix.job.os }} - strategy: - fail-fast: false - matrix: - job: - - { - arch: aarch64, - target: aarch64-linux-android, - os: ubuntu-24.04, - reltype: release, - suffix: "", - } - - { - arch: armv7, - target: armv7-linux-androideabi, - os: ubuntu-24.04, - reltype: release, - suffix: "", - } - - { - arch: x86_64, - target: x86_64-linux-android, - os: ubuntu-24.04, - reltype: release, - suffix: "", - } - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@main - with: - tool-cache: false - android: false - dotnet: true - haskell: true - large-packages: false - docker-images: true - swap-storage: false - - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y \ - clang \ - cmake \ - curl \ - gcc-multilib \ - git \ - g++ \ - g++-multilib \ - libayatana-appindicator3-dev \ - libasound2-dev \ - libc6-dev \ - libclang-dev \ - libunwind-dev \ - libgstreamer1.0-dev \ - libgstreamer-plugins-base1.0-dev \ - libgtk-3-dev \ - libpam0g-dev \ - libpulse-dev \ - libva-dev \ - libxcb-randr0-dev \ - libxcb-shape0-dev \ - libxcb-xfixes0-dev \ - libxdo-dev \ - libxfixes-dev \ - llvm-dev \ - nasm \ - ninja-build \ - openjdk-17-jdk-headless \ - pkg-config \ - tree \ - wget - - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install flutter - uses: subosito/flutter-action@v2 - with: - channel: "stable" - flutter-version: ${{ env.ANDROID_FLUTTER_VERSION }} - - - name: Patch flutter - run: | - cd $(dirname $(dirname $(which flutter))) - [[ "3.24.5" == ${{env.ANDROID_FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff - - - uses: nttld/setup-ndk@v1 - id: setup-ndk - with: - ndk-version: ${{ env.NDK_VERSION }} - add-to-path: true - - - name: Setup vcpkg with Github Actions binary cache - uses: lukka/run-vcpkg@v11 - with: - vcpkgDirectory: /opt/artifacts/vcpkg - vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} - doNotCache: false - - - name: Install vcpkg dependencies - run: | - case ${{ matrix.job.target }} in - aarch64-linux-android) - ANDROID_TARGET=arm64-v8a - ;; - armv7-linux-androideabi) - ANDROID_TARGET=armeabi-v7a - ;; - x86_64-linux-android) - ANDROID_TARGET=x86_64 - ;; - i686-linux-android) - ANDROID_TARGET=x86 - ;; - esac - if ! ./flutter/build_android_deps.sh "${ANDROID_TARGET}"; then - find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do - echo "$_1:" - echo "======" - cat "$_1" - echo "======" - echo "" - done - exit 1 - fi - shell: bash - - - name: Restore bridge files - uses: actions/download-artifact@master - with: - name: bridge-artifact - path: ./ - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - with: - toolchain: ${{ env.RUST_VERSION }} - components: "rustfmt" - - - uses: Swatinem/rust-cache@v2 - with: - prefix-key: rustdesk-lib-cache-android # TODO: drop '-android' part after caches are invalidated - key: ${{ matrix.job.target }} - - - name: Build rustdesk lib - env: - ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} - ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} - run: | - rustup target add ${{ matrix.job.target }} - cargo install cargo-ndk --version ${{ env.CARGO_NDK_VERSION }} --locked - case ${{ matrix.job.target }} in - aarch64-linux-android) - ./flutter/ndk_arm64.sh - mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so - ;; - armv7-linux-androideabi) - ./flutter/ndk_arm.sh - mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so - ;; - x86_64-linux-android) - ./flutter/ndk_x64.sh - mkdir -p ./flutter/android/app/src/main/jniLibs/x86_64 - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86_64/librustdesk.so - ;; - i686-linux-android) - ./flutter/ndk_x86.sh - mkdir -p ./flutter/android/app/src/main/jniLibs/x86 - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86/librustdesk.so - ;; - esac - - - name: Upload Rustdesk library to Artifacts - uses: actions/upload-artifact@master - with: - name: librustdesk.so.${{ matrix.job.target }} - path: ./target/${{ matrix.job.target }}/release/liblibrustdesk.so - - - name: Build rustdesk - shell: bash - env: - JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64 - run: | - export PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH - # Increase Gradle JVM memory for CI builds - sed -i "s/org.gradle.jvmargs=-Xmx1024M/org.gradle.jvmargs=-Xmx2g/g" ./flutter/android/gradle.properties - # temporary use debug sign config - sed -i "s/signingConfigs.release/signingConfigs.debug/g" ./flutter/android/app/build.gradle - case ${{ matrix.job.target }} in - aarch64-linux-android) - mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a - cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/ - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so - # build flutter - pushd flutter - flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm64 --split-per-abi - mv build/app/outputs/flutter-apk/app-arm64-v8a-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk - ;; - armv7-linux-androideabi) - mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a - cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/ - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so - # build flutter - pushd flutter - flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-arm --split-per-abi - mv build/app/outputs/flutter-apk/app-armeabi-v7a-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk - ;; - x86_64-linux-android) - mkdir -p ./flutter/android/app/src/main/jniLibs/x86_64 - cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86_64/ - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86_64/librustdesk.so - # build flutter - pushd flutter - flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x64 --split-per-abi - mv build/app/outputs/flutter-apk/app-x86_64-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk - ;; - i686-linux-android) - mkdir -p ./flutter/android/app/src/main/jniLibs/x86 - cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86/ - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86/librustdesk.so - # build flutter - pushd flutter - flutter build apk "--${{ matrix.job.reltype }}" --target-platform android-x86 --split-per-abi - mv build/app/outputs/flutter-apk/app-x86-${{ matrix.job.reltype }}.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk - ;; - esac - popd - mkdir -p signed-apk; pushd signed-apk - mv ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.apk . - - # https://github.com/r0adkll/sign-android-release/issues/84#issuecomment-1889636075 - - name: Setup sign tool version variable - shell: bash - run: | - BUILD_TOOL_VERSION=$(ls /usr/local/lib/android/sdk/build-tools/ | tail -n 1) - echo "ANDROID_SIGN_TOOL_VERSION=$BUILD_TOOL_VERSION" >> $GITHUB_ENV - echo Last build tool version is: $BUILD_TOOL_VERSION - - - uses: r0adkll/sign-android-release@v1 - name: Sign app APK - if: env.ANDROID_SIGNING_KEY != null - id: sign-rustdesk - with: - releaseDirectory: ./signed-apk - signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }} - alias: ${{ secrets.ANDROID_ALIAS }} - keyStorePassword: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }} - keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }} - env: - # env.ANDROID_SIGN_TOOL_VERSION is set by Step "Setup sign tool version variable" - BUILD_TOOLS_VERSION: ${{ env.ANDROID_SIGN_TOOL_VERSION }} - - - name: Upload Artifacts - if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true' - uses: actions/upload-artifact@master - with: - name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk - path: ${{steps.sign-rustdesk.outputs.signedReleaseFile}} - - - name: Publish signed apk package - if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true' - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - ${{steps.sign-rustdesk.outputs.signedReleaseFile}} - - - name: Publish unsigned apk package - if: env.ANDROID_SIGNING_KEY == null && env.UPLOAD_ARTIFACT == 'true' - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - signed-apk/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk - - build-rustdesk-android-universal: - needs: [build-rustdesk-android] - name: build rustdesk android universal apk - if: ${{ inputs.upload-artifact }} - runs-on: ubuntu-24.04 - env: - reltype: release - x86_target: "" # can be ",android-x86" - suffix: "" - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@main - with: - tool-cache: false - android: false - dotnet: true - haskell: true - large-packages: false - docker-images: true - swap-storage: false - - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y \ - clang \ - cmake \ - curl \ - gcc-multilib \ - git \ - g++ \ - g++-multilib \ - libayatana-appindicator3-dev \ - libasound2-dev \ - libc6-dev \ - libclang-dev \ - libunwind-dev \ - libgstreamer1.0-dev \ - libgstreamer-plugins-base1.0-dev \ - libgtk-3-dev \ - libpam0g-dev \ - libpulse-dev \ - libva-dev \ - libxcb-randr0-dev \ - libxcb-shape0-dev \ - libxcb-xfixes0-dev \ - libxdo-dev \ - libxfixes-dev \ - llvm-dev \ - nasm \ - ninja-build \ - openjdk-17-jdk-headless \ - pkg-config \ - tree \ - wget - - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install flutter - uses: subosito/flutter-action@v2 - with: - channel: "stable" - flutter-version: ${{ env.ANDROID_FLUTTER_VERSION }} - - - name: Patch flutter - run: | - cd $(dirname $(dirname $(which flutter))) - [[ "3.24.5" == ${{env.ANDROID_FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff - - - name: Restore bridge files - uses: actions/download-artifact@master - with: - name: bridge-artifact - path: ./ - - - name: Download Rustdesk library from Artifacts - uses: actions/download-artifact@master - with: - name: librustdesk.so.aarch64-linux-android - path: ./flutter/android/app/src/main/jniLibs/arm64-v8a - - - name: Download Rustdesk library from Artifacts - uses: actions/download-artifact@master - with: - name: librustdesk.so.armv7-linux-androideabi - path: ./flutter/android/app/src/main/jniLibs/armeabi-v7a - - - name: Download Rustdesk library from Artifacts - uses: actions/download-artifact@master - with: - name: librustdesk.so.x86_64-linux-android - path: ./flutter/android/app/src/main/jniLibs/x86_64 - - - name: Download Rustdesk library from Artifacts - if: ${{ env.reltype == 'debug' }} - uses: actions/download-artifact@master - with: - name: librustdesk.so.i686-linux-android - path: ./flutter/android/app/src/main/jniLibs/x86 - - - name: Build rustdesk - shell: bash - env: - JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64 - run: | - export PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH - # Increase Gradle JVM memory for CI builds - sed -i "s/org.gradle.jvmargs=-Xmx1024M/org.gradle.jvmargs=-Xmx2g/g" ./flutter/android/gradle.properties - # temporary use debug sign config - sed -i "s/signingConfigs.release/signingConfigs.debug/g" ./flutter/android/app/build.gradle - mv ./flutter/android/app/src/main/jniLibs/arm64-v8a/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so - cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/ - mv ./flutter/android/app/src/main/jniLibs/armeabi-v7a/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so - cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/ - mv ./flutter/android/app/src/main/jniLibs/x86_64/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86_64/librustdesk.so - cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86_64/ - if [ "${{ env.reltype }}" = "debug" ]; then - mv ./flutter/android/app/src/main/jniLibs/x86/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/x86/librustdesk.so - cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/x86/ - fi - # build flutter - pushd flutter - flutter build apk "--${{ env.reltype }}" --target-platform android-arm64,android-arm,android-x64${{ env.x86_target }} - popd - mkdir -p signed-apk - mv ./flutter/build/app/outputs/flutter-apk/app-${{ env.reltype }}.apk signed-apk/rustdesk-${{ env.VERSION }}-universal${{ env.suffix }}.apk - - # https://github.com/r0adkll/sign-android-release/issues/84#issuecomment-1889636075 - - name: Setup sign tool version variable - shell: bash - run: | - BUILD_TOOL_VERSION=$(ls /usr/local/lib/android/sdk/build-tools/ | tail -n 1) - echo "ANDROID_SIGN_TOOL_VERSION=$BUILD_TOOL_VERSION" >> $GITHUB_ENV - echo Last build tool version is: $BUILD_TOOL_VERSION - - - uses: r0adkll/sign-android-release@v1 - name: Sign app APK - if: env.ANDROID_SIGNING_KEY != null - id: sign-rustdesk - with: - releaseDirectory: ./signed-apk - signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }} - alias: ${{ secrets.ANDROID_ALIAS }} - keyStorePassword: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }} - keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }} - env: - # env.ANDROID_SIGN_TOOL_VERSION is set by Step "Setup sign tool version variable" - BUILD_TOOLS_VERSION: ${{ env.ANDROID_SIGN_TOOL_VERSION }} - - - name: Upload Artifacts - if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true' - uses: actions/upload-artifact@master - with: - name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk - path: ${{steps.sign-rustdesk.outputs.signedReleaseFile}} - - - name: Publish signed apk package - if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true' - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - ${{steps.sign-rustdesk.outputs.signedReleaseFile}} - - - name: Publish unsigned apk package - if: env.ANDROID_SIGNING_KEY == null && env.UPLOAD_ARTIFACT == 'true' - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - signed-apk/rustdesk-${{ env.VERSION }}-universal${{ env.suffix }}.apk - - build-rustdesk-linux: - needs: [generate-bridge] - name: build rustdesk linux ${{ matrix.job.target }} - runs-on: ${{ matrix.job.on }} - strategy: - fail-fast: false - matrix: - # use a high level qemu-user-static - job: - - { - arch: x86_64, - target: x86_64-unknown-linux-gnu, - distro: ubuntu18.04, - on: ubuntu-22.04, - deb_arch: amd64, - vcpkg-triplet: x64-linux, - } - - { - arch: aarch64, - target: aarch64-unknown-linux-gnu, - distro: ubuntu18.04, - on: ubuntu-22.04-arm, - deb_arch: arm64, - vcpkg-triplet: arm64-linux, - } - steps: - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Maximize build space - run: | - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/lib/android - sudo rm -rf /usr/share/dotnet - sudo apt-get update -y - sudo apt-get install -y nasm - if [[ "${{ matrix.job.arch }}" == "x86_64" ]]; then - sudo apt-get install -y qemu-user-static - fi - - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Set Swap Space - if: ${{ matrix.job.arch == 'x86_64' }} - uses: pierotofy/set-swap-space@master - with: - swap-size-gb: 12 - - - name: Free Space - run: | - df -h - free -m - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' - with: - toolchain: ${{ env.RUST_VERSION }} - targets: ${{ matrix.job.target }} - components: "rustfmt" - - - name: Save Rust toolchain version - run: | - RUST_TOOLCHAIN_VERSION=$(cargo --version | awk '{print $2}') - echo "RUST_TOOLCHAIN_VERSION=$RUST_TOOLCHAIN_VERSION" >> $GITHUB_ENV - - - name: Disable rust bridge build - run: | - # only build cdylib - sed -i "s/\[\"cdylib\", \"staticlib\", \"rlib\"\]/\[\"cdylib\"\]/g" Cargo.toml - - - name: Restore bridge files - if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' - uses: actions/download-artifact@master - with: - name: bridge-artifact - path: ./ - - - name: Setup vcpkg with Github Actions binary cache - if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' - uses: lukka/run-vcpkg@v11 - with: - vcpkgDirectory: /opt/artifacts/vcpkg - vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} - doNotCache: false - - - name: Install vcpkg dependencies - if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' - run: | - sudo apt install -y libva-dev && apt show libva-dev - if ! $VCPKG_ROOT/vcpkg \ - install \ - --triplet ${{ matrix.job.vcpkg-triplet }} \ - --x-install-root="$VCPKG_ROOT/installed"; then - find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do - echo "$_1:" - echo "======" - cat "$_1" - echo "======" - echo "" - done - exit 1 - fi - head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true - shell: bash - - - name: Restore bridge files - if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' - uses: actions/download-artifact@master - with: - name: bridge-artifact - path: ./ - - - uses: rustdesk-org/run-on-arch-action@amd64-support - name: Build rustdesk - id: vcpkg - if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' - with: - arch: ${{ matrix.job.arch }} - distro: ${{ matrix.job.distro }} - githubToken: ${{ github.token }} - setup: | - ls -l "${PWD}" - ls -l /opt/artifacts/vcpkg/installed - dockerRunArgs: | - --volume "${PWD}:/workspace" - --volume "/opt/artifacts:/opt/artifacts" - shell: /bin/bash - install: | - apt-get update -y - echo -e "installing deps" - apt-get install -y \ - build-essential \ - clang \ - cmake \ - curl \ - gcc \ - git \ - g++ \ - libayatana-appindicator3-dev \ - libasound2-dev \ - libclang-10-dev \ - libgstreamer1.0-dev \ - libgstreamer-plugins-base1.0-dev \ - libgtk-3-dev \ - libpam0g-dev \ - libpulse-dev \ - libva-dev \ - libxcb-randr0-dev \ - libxcb-shape0-dev \ - libxcb-xfixes0-dev \ - libxdo-dev \ - libxfixes-dev \ - llvm-10-dev \ - nasm \ - ninja-build \ - pkg-config \ - tree \ - python3 \ - rpm \ - unzip \ - wget \ - xz-utils \ - libssl-dev - # we have libopus compiled by us. - apt-get remove -y libopus-dev || true - # output devs - ls -l ./ - tree -L 3 /opt/artifacts/vcpkg/installed - run: | - # disable git safe.directory - git config --global --add safe.directory "*" - # rust - pushd /opt - # do not use rustup, because memory overflow in qemu - wget -O rust.tar.gz https://static.rust-lang.org/dist/rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}.tar.gz - tar -zxvf rust.tar.gz > /dev/null && rm rust.tar.gz - cd rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }} && ./install.sh - rm -rf rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }} - # edit config - mkdir -p ~/.cargo/ - echo """ - [source.crates-io] - registry = 'https://github.com/rust-lang/crates.io-index' - """ > ~/.cargo/config - cat ~/.cargo/config - # start build - pushd /workspace - export VCPKG_ROOT=/opt/artifacts/vcpkg - if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then - export JOBS="--jobs 3" - else - export JOBS="" - fi - echo $JOBS - cargo build --lib $JOBS --features hwcodec,flutter,unix-file-copy-paste --release - rm -rf target/release/deps target/release/build - rm -rf ~/.cargo - - # Setup Flutter - # disable git safe.directory - git config --global --add safe.directory "*" - pushd /workspace - case ${{ matrix.job.arch }} in - aarch64) - export PATH=/opt/flutter-elinux/bin:$PATH - sed -i "s/flutter build linux --release/flutter-elinux build linux --verbose/g" ./build.py - sed -i "s/x64\/release/arm64\/release/g" ./build.py - ;; - x86_64) - export PATH=/opt/flutter/bin:$PATH - ;; - esac - popd - pushd /opt - wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz - tar xf flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz - case ${{ matrix.job.arch }} in - aarch64) - # clone repo and reset to flutter ${{ env.FLUTTER_VERSION }} - git clone https://github.com/sony/flutter-elinux.git || true - pushd flutter-elinux - git fetch - git reset --hard ${{ env.FLUTTER_VERSION }} - bin/flutter-elinux doctor -v - bin/flutter-elinux precache --linux - popd - cp -R flutter/bin/cache/artifacts/engine/linux-x64/shader_lib flutter-elinux/flutter/bin/cache/artifacts/engine/linux-arm64 - rm -rf flutter - ;; - x86_64) - flutter doctor -v - ;; - esac - - if [[ "3.24.5" == ${{ env.FLUTTER_VERSION }} ]]; then - case ${{ matrix.job.arch }} in - aarch64) - pushd /opt/flutter-elinux/flutter - ;; - x86_64) - pushd /opt/flutter - ;; - esac - git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff - popd - fi - - # build flutter - pushd /workspace - export CARGO_INCREMENTAL=0 - export DEB_ARCH=${{ matrix.job.deb_arch }} - python3 ./build.py --flutter --skip-cargo - for name in rustdesk*??.deb; do - mv "$name" "${name%%.deb}-${{ matrix.job.arch }}.deb" - done - - # rpm package - echo -e "start packaging fedora package" - pushd /workspace - case ${{ matrix.job.arch }} in - aarch64) - sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter.spec - ;; - esac - HBB=`pwd` rpmbuild ./res/rpm-flutter.spec -bb - pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }} - for name in rustdesk*??.rpm; do - mv "$name" /workspace/"${name%%.rpm}.rpm" - done - - # rpm suse package - echo -e "start packaging suse package" - pushd /workspace - case ${{ matrix.job.arch }} in - aarch64) - sed -i "s/linux\/x64/linux\/arm64/g" ./res/rpm-flutter-suse.spec - ;; - esac - HBB=`pwd` rpmbuild ./res/rpm-flutter-suse.spec -bb - pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }} - for name in rustdesk*??.rpm; do - mv "$name" /workspace/"${name%%.rpm}-suse.rpm" - done - - - name: Publish debian/rpm package - if: env.UPLOAD_ARTIFACT == 'true' - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - rustdesk-*.deb - rustdesk-*.rpm - - - name: Upload deb - uses: actions/upload-artifact@master - if: env.UPLOAD_ARTIFACT == 'true' - with: - name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb - path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb - - # only x86_64 for arch since we can not find newest arm64 docker image to build - # old arch image does not make sense for arch since it is "arch" which always update to date - # and failed to makepkg arm64 on x86_64 - - name: Patch archlinux PKGBUILD - if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true' - run: | - sed -i "s/x86_64/${{ matrix.job.arch }}/g" res/PKGBUILD - if [[ "${{ matrix.job.arch }}" == "aarch64" ]]; then - sed -i "s/x86_64/aarch64/g" ./res/PKGBUILD - fi - - - name: Build archlinux package - if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true' - uses: rustdesk-org/arch-makepkg-action@master - with: - packages: - scripts: | - cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f - - - name: Publish archlinux package - if: matrix.job.arch == 'x86_64' && env.UPLOAD_ARTIFACT == 'true' - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - res/rustdesk-${{ env.VERSION }}*.zst - - build-rustdesk-linux-sciter: - if: ${{ inputs.upload-artifact }} - runs-on: ${{ matrix.job.on }} - name: build-rustdesk-linux-sciter ${{ matrix.job.target }} - strategy: - fail-fast: false - matrix: - # use a high level qemu-user-static - job: - - { - arch: x86_64, - target: x86_64-unknown-linux-gnu, - on: ubuntu-22.04, - distro: ubuntu18.04, - deb_arch: amd64, - sciter_arch: x64, - vcpkg-triplet: x64-linux, - extra_features: ",hwcodec,unix-file-copy-paste", - } - - { - arch: armv7, - target: armv7-unknown-linux-gnueabihf, - on: ubuntu-22.04-arm, - distro: ubuntu18.04-rustdesk, - deb_arch: armhf, - sciter_arch: arm32, - vcpkg-triplet: arm-linux, - extra_features: ",unix-file-copy-paste", - } - steps: - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Modify vcpkg.json for armv7 - if: matrix.job.vcpkg-triplet == 'arm-linux' - run: | - # Replace the baseline in vcpkg.json with ARMV7_VCPKG_COMMIT_ID for armv7 builds - sed -i 's/"baseline": ".*"/"baseline": "${{ env.ARMV7_VCPKG_COMMIT_ID }}"/' vcpkg.json - echo "Modified vcpkg.json for armv7 build:" - grep -A 2 -B 2 '"baseline"' vcpkg.json - - - name: Free Space - run: | - df -h - free -m - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - with: - toolchain: ${{ env.SCITER_RUST_VERSION }} - targets: ${{ matrix.job.target }} - components: "rustfmt" - - - name: Save Rust toolchain version - run: | - RUST_TOOLCHAIN_VERSION=$(cargo --version | awk '{print $2}') - echo "RUST_TOOLCHAIN_VERSION=$RUST_TOOLCHAIN_VERSION" >> $GITHUB_ENV - - - uses: rustdesk-org/run-on-arch-action@amd64-support - name: Build rustdesk sciter binary for ${{ matrix.job.arch }} - id: vcpkg - with: - arch: ${{ matrix.job.arch }} - distro: ${{ matrix.job.distro }} - githubToken: ${{ github.token }} - setup: | - ls -l "${PWD}" - dockerRunArgs: | - --volume "${PWD}:/workspace" - shell: /bin/bash - install: | - apt-get update - apt-get install -y \ - build-essential \ - clang \ - curl \ - gcc \ - git \ - g++ \ - libayatana-appindicator3-dev \ - libasound2-dev \ - libclang-dev \ - libdbus-1-dev \ - libglib2.0-dev \ - libgstreamer1.0-dev \ - libgstreamer-plugins-base1.0-dev \ - libgtk-3-dev \ - liblzma-dev \ - libpam0g-dev \ - libpulse-dev \ - libva-dev \ - libxcb-randr0-dev \ - libxcb-shape0-dev \ - libxcb-xfixes0-dev \ - libxdo-dev \ - libxfixes-dev \ - ninja-build \ - pkg-config \ - python3 \ - python3.7 \ - rpm \ - unzip \ - wget \ - xz-utils \ - zip \ - libssl-dev - # arm-linux needs CMake and vcokg built from source as there - # are no prebuilts available from Kitware and Microsoft - if [ "${{ matrix.job.vcpkg-triplet }}" = "arm-linux" ]; then - # install gcc/g++ 8 for vcpkg and OpenSSL headers for CMake - apt-get install -y gcc-8 g++-8 - # bootstrap CMake amd add it to PATH - git clone --depth 1 https://github.com/kitware/cmake -b "v${{ env.SCITER_ARMV7_CMAKE_VERSION }}" /tmp/cmake - pushd /tmp/cmake - ./bootstrap --generator='Unix Makefiles' "--prefix=/opt/cmake-${{ env.SCITER_ARMV7_CMAKE_VERSION }}-linux-armhf" - make -j1 install - popd - rm -rf /tmp/cmake - export PATH="/opt/cmake-${{ env.SCITER_ARMV7_CMAKE_VERSION }}-linux-armhf/bin:$PATH" - fi - # bootstrap vcpkg and set VCPKG_ROOT - export VCPKG_ROOT=/opt/artifacts/vcpkg - mkdir -p /opt/artifacts - pushd /opt/artifacts - rm -rf vcpkg - git clone https://github.com/microsoft/vcpkg - pushd vcpkg - # build vcpkg helper executable with gcc-8 for arm-linux but use prebuilt one on x64-linux - if [ "${{ matrix.job.vcpkg-triplet }}" = "arm-linux" ]; then - git reset --hard ${{ env.ARMV7_VCPKG_COMMIT_ID }} - CC=/usr/bin/gcc-8 CXX=/usr/bin/g++-8 sh bootstrap-vcpkg.sh -disableMetrics - else - git reset --hard ${{ env.VCPKG_COMMIT_ID }} - sh bootstrap-vcpkg.sh -disableMetrics - fi - popd - popd - # rust - pushd /opt - # do not use rustup, because memory overflow in qemu - wget --output-document rust.tar.gz https://static.rust-lang.org/dist/rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }}.tar.gz - tar -zxvf rust.tar.gz > /dev/null && rm rust.tar.gz - pushd rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }} - ./install.sh - popd - rm -rf rust-${{env.RUST_TOOLCHAIN_VERSION}}-${{ matrix.job.target }} - popd - # install newer nasm for aom - wget --output-document nasm.deb "http://ftp.us.debian.org/debian/pool/main/n/nasm/nasm_${{ env.SCITER_NASM_DEBVERSION }}_${{ matrix.job.deb_arch }}.deb" - dpkg -i nasm.deb - rm -f nasm.deb - run: | - # disable git safe.directory - git config --global --add safe.directory "*" - # set python3.7 as default python3 - update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 - # add built CMake to PATH and set VCPKG_FORCE_SYSTEM_BINARIES Afor arm-linux - if [ "${{ matrix.job.vcpkg-triplet }}" = "arm-linux" ]; then - export PATH="/opt/cmake-${{ env.SCITER_ARMV7_CMAKE_VERSION }}-linux-armhf/bin:$PATH" - export VCPKG_FORCE_SYSTEM_BINARIES=1 - fi - # edit cargo config - mkdir -p ~/.cargo/ - echo """ - [source.crates-io] - registry = 'https://github.com/rust-lang/crates.io-index' - """ > ~/.cargo/config - cat ~/.cargo/config - # install dependencies from vcpkg - export VCPKG_ROOT=/opt/artifacts/vcpkg - # remove this when support higher version - export USE_AOM_391=1 - if ! $VCPKG_ROOT/vcpkg install --triplet ${{ matrix.job.vcpkg-triplet }} --x-install-root="$VCPKG_ROOT/installed"; then - find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do - echo "$_1:" - echo "======" - cat "$_1" - echo "======" - echo "" - done - exit 1 - fi - head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true - # build rustdesk - python3 ./res/inline-sciter.py - export CARGO_INCREMENTAL=0 - cargo build --features inline${{ matrix.job.extra_features }} --release --bins --jobs 1 - # make debian package - mkdir -p ./Release - mv ./target/release/rustdesk ./Release/rustdesk - wget -O ./Release/libsciter-gtk.so https://github.com/c-smile/sciter-sdk/raw/master/bin.lnx/${{ matrix.job.sciter_arch }}/libsciter-gtk.so - export DEB_ARCH=${{ matrix.job.deb_arch }} - ./build.py --package ./Release - - - name: Rename rustdesk - shell: bash - run: | - for name in rustdesk*??.deb; do - # use cp to duplicate deb files to fit other packages. - cp "$name" "${name%%.deb}-${{ matrix.job.arch }}-sciter.deb" - done - - - name: Publish debian package - if: env.UPLOAD_ARTIFACT == 'true' - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb - - - name: Upload deb - uses: actions/upload-artifact@master - if: env.UPLOAD_ARTIFACT == 'true' - with: - name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb - path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb - - build-appimage: - name: Build appimage ${{ matrix.job.target }} - needs: [build-rustdesk-linux] - runs-on: ubuntu-22.04 - if: ${{ inputs.upload-artifact }} - strategy: - fail-fast: false - matrix: - job: - - { target: x86_64-unknown-linux-gnu, arch: x86_64 } - - { target: aarch64-unknown-linux-gnu, arch: aarch64 } - steps: - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Download Binary - uses: actions/download-artifact@master - with: - name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb - path: . - - - name: Rename Binary - run: | - mv rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb appimage/rustdesk.deb - - - name: Build appimage package - shell: bash - run: | - # install libarchive-tools for bsdtar command used in AppImageBuilder.yml - sudo apt-get update -y - # https://github.com/AppImage/AppImageKit/wiki/FUSE - sudo apt-get install -y libarchive-tools libfuse2 - # set-up appimage-builder - # https://github.com/AppImage/AppImageKit/issues/1395 - sudo pip3 install git+https://github.com/rustdesk-org/appimage-builder.git - # run appimage-builder - pushd appimage - sudo appimage-builder --skip-tests --recipe ./AppImageBuilder-${{ matrix.job.arch }}.yml - - - name: Publish appimage package - if: env.UPLOAD_ARTIFACT == 'true' - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - ./appimage/rustdesk-${{ env.VERSION }}-*.AppImage - - build-flatpak: - name: Build flatpak ${{ matrix.job.target }}${{ matrix.job.suffix }} - needs: - - build-rustdesk-linux - - build-rustdesk-linux-sciter - runs-on: ${{ matrix.job.on }} - if: ${{ inputs.upload-artifact }} - strategy: - fail-fast: false - matrix: - job: - - { - target: x86_64-unknown-linux-gnu, - # https://github.com/ostreedev/ostree/commit/4bac96a8c817beda37448f9b8c662162bb619981 - distro: ubuntu22.04, - on: ubuntu-22.04, - arch: x86_64, - suffix: "", - } - - { - target: x86_64-unknown-linux-gnu, - distro: ubuntu22.04, - on: ubuntu-22.04, - arch: x86_64, - suffix: "-sciter", - } - - { - target: aarch64-unknown-linux-gnu, - # try out newer flatpak since error of "error: Nothing matches org.freedesktop.Platform in remote flathub" - distro: ubuntu22.04, - on: ubuntu-22.04-arm, - arch: aarch64, - suffix: "", - } - steps: - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Download Binary - uses: actions/download-artifact@master - with: - name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.deb - path: . - - - name: Rename Binary - run: | - mv rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.deb flatpak/rustdesk.deb - - - uses: rustdesk-org/run-on-arch-action@amd64-support - name: Build rustdesk flatpak package for ${{ matrix.job.arch }} - id: flatpak - with: - arch: ${{ matrix.job.arch }} - distro: ${{ matrix.job.distro }} - githubToken: ${{ github.token }} - setup: | - ls -l "${PWD}" - dockerRunArgs: | - --volume "${PWD}:/workspace" - shell: /bin/bash - install: | - apt-get update -y - apt-get install -y git flatpak flatpak-builder - run: | - # disable git safe.directory - git config --global --add safe.directory "*" - pushd /workspace - # flatpak deps - flatpak --user remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo - # package - pushd flatpak - git clone https://github.com/flathub/shared-modules.git --depth=1 - flatpak-builder --user --install-deps-from=flathub -y --force-clean --repo=repo ./build ./rustdesk.json - flatpak build-bundle ./repo rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.flatpak com.rustdesk.RustDesk - - - name: Publish flatpak package - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - flatpak/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.flatpak - - build-rustdesk-web: - if: False - name: build-rustdesk-web - runs-on: ubuntu-22.04 - permissions: - contents: read - strategy: - fail-fast: false - env: - RELEASE_NAME: web-basic - steps: - - name: Checkout source code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Prepare env - run: | - sudo apt-get update -y - sudo apt-get install -y wget npm - - - name: Install flutter - uses: subosito/flutter-action@v2.12.0 #https://github.com/subosito/flutter-action/issues/277 - with: - channel: "stable" - flutter-version: ${{ env.FLUTTER_VERSION }} - - - name: Patch flutter - shell: bash - run: | - cd $(dirname $(dirname $(which flutter))) - [[ "3.24.5" == ${{env.FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff - - # https://rustdesk.com/docs/en/dev/build/web/ - - name: Build web - shell: bash - run: | - pushd flutter/web/js - npm install yarn -g - npm install typescript -g - npm install protoc -g - # Install protoc first, see: https://google.github.io/proto-lens/installing-protoc.html - npm install ts-proto - # Only works with vite <= 2.8, see: https://github.com/vitejs/vite/blob/main/docs/guide/build.md#chunking-strategy - npm install vite@2.8 - yarn install && yarn build - popd - - pushd flutter/web - wget https://github.com/rustdesk/doc.rustdesk.com/releases/download/console/web_deps.tar.gz - tar xzf web_deps.tar.gz - popd - - pushd flutter - flutter build web --release - cd build - cp ../web/README.md web - # TODO: Remove the following line when the web is almost complete. - echo -e "\n\nThis build is for preview and not full functionality." >> web/README.md - dir_name="rustdesk-${{ env.VERSION }}-${{ env.RELEASE_NAME }}" - mv web "${dir_name}" && tar czf "${dir_name}".tar.gz "${dir_name}" - sha256sum "${dir_name}".tar.gz - popd - - - name: Publish web - if: env.UPLOAD_ARTIFACT == 'true' - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - flutter/build/rustdesk-${{ env.VERSION }}-${{ env.RELEASE_NAME }}.tar.gz diff --git a/shelled/rustdesk-as-ref/.github/workflows/flutter-ci.yml b/shelled/rustdesk-as-ref/.github/workflows/flutter-ci.yml deleted file mode 100644 index a64dd11..0000000 --- a/shelled/rustdesk-as-ref/.github/workflows/flutter-ci.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Full Flutter CI - -on: - workflow_dispatch: - pull_request: - paths-ignore: - - "docs/**" - - "README.md" - push: - branches: - - master - paths-ignore: - - ".github/**" - - "docs/**" - - "README.md" - - "res/**" - - "appimage/**" - - "flatpak/**" - -jobs: - run-ci: - uses: ./.github/workflows/flutter-build.yml - with: - upload-artifact: false diff --git a/shelled/rustdesk-as-ref/.github/workflows/flutter-nightly.yml b/shelled/rustdesk-as-ref/.github/workflows/flutter-nightly.yml deleted file mode 100644 index b16db4c..0000000 --- a/shelled/rustdesk-as-ref/.github/workflows/flutter-nightly.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Flutter Nightly Build - -on: - schedule: - # schedule build every night - - cron: "0 0 * * *" - workflow_dispatch: - -jobs: - run-flutter-nightly-build: - uses: ./.github/workflows/flutter-build.yml - secrets: inherit - with: - upload-artifact: true - upload-tag: "nightly" diff --git a/shelled/rustdesk-as-ref/.github/workflows/flutter-tag.yml b/shelled/rustdesk-as-ref/.github/workflows/flutter-tag.yml deleted file mode 100644 index bf39db5..0000000 --- a/shelled/rustdesk-as-ref/.github/workflows/flutter-tag.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Flutter Tag Build - -on: - workflow_dispatch: - push: - tags: - - 'v[0-9]+.[0-9]+.[0-9]+' - - '[0-9]+.[0-9]+.[0-9]+' - - 'v[0-9]+.[0-9]+.[0-9]+-[0-9]+' - - '[0-9]+.[0-9]+.[0-9]+-[0-9]+' - -jobs: - run-flutter-tag-build: - uses: ./.github/workflows/flutter-build.yml - secrets: inherit - with: - upload-artifact: true - upload-tag: ${{ github.ref_name }} \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/.github/workflows/playground.yml b/shelled/rustdesk-as-ref/.github/workflows/playground.yml deleted file mode 100644 index 110437e..0000000 --- a/shelled/rustdesk-as-ref/.github/workflows/playground.yml +++ /dev/null @@ -1,418 +0,0 @@ -name: playground - -on: - #schedule: - # schedule build every night - # - cron: "0/6 * * * *" - workflow_dispatch: - -env: - RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503 - CARGO_NDK_VERSION: "3.1.2" - LLVM_VERSION: "15.0.6" - FLUTTER_VERSION: "3.22.2" - FLUTTER_RUST_BRIDGE_VERSION: "1.80.1" - # for arm64 linux because official Dart SDK does not work - FLUTTER_ELINUX_VERSION: "3.16.9" - TAG_NAME: "nightly" - VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" - VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b" - VERSION: "1.4.6" - NDK_VERSION: "r26d" - #signing keys env variable checks - ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}" - MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}" - # To make a custom build with your own servers set the below secret values - RS_PUB_KEY: "${{ secrets.RS_PUB_KEY }}" - RENDEZVOUS_SERVER: "${{ secrets.RENDEZVOUS_SERVER }}" - API_SERVER: "${{ secrets.API_SERVER }}" - UPLOAD_ARTIFACT: "${{ inputs.upload-artifact }}" - SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}" - -jobs: - build-for-macOS: - name: ${{ matrix.job.target }} - runs-on: ${{ matrix.job.os }} - strategy: - fail-fast: false - matrix: - job: - - { - target: x86_64-apple-darwin, - os: macos-13, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel - extra-build-args: "", - arch: x86_64, - flutter: "3.13.9", - ref: "f6509e3fd6917aa976bad2fc684182601ebf2434", - bridge: "1.80.1", - date: "20231219" - } - - { - target: x86_64-apple-darwin, - os: macos-13, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel - extra-build-args: "", - arch: x86_64, - flutter: "3.10.6", - ref: "f6509e3fd6917aa976bad2fc684182601ebf2434", - bridge: "1.80.1", - date: "20231219" - } - - { - target: x86_64-apple-darwin, - os: macos-13, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel - extra-build-args: "", - arch: x86_64, - flutter: "3.10.6", - ref: "85ddfc0739f052cab0029c46b899b959ee94eeb8", - bridge: "1.80.1", - date: "20231119" - } - - { - target: x86_64-apple-darwin, - os: macos-13, #macos-latest or macos-14 use M1 now, https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#:~:text=14%20GB-,macos%2Dlatest%20or%20macos%2D14,-The%20macos%2Dlatestlabel - extra-build-args: "", - arch: x86_64, - flutter: "3.13.9", - ref: "85ddfc0739f052cab0029c46b899b959ee94eeb8", - bridge: "1.80.1", - date: "20231119" - } - steps: - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Checkout source code - uses: actions/checkout@v3 - with: - ref: ${{ matrix.job.ref }} - submodules: recursive - - - name: Import the codesign cert - if: env.MACOS_P12_BASE64 != null - uses: apple-actions/import-codesign-certs@v1 - with: - p12-file-base64: ${{ secrets.MACOS_P12_BASE64 }} - p12-password: ${{ secrets.MACOS_P12_PASSWORD }} - keychain: rustdesk - - - name: Check sign and import sign key - if: env.MACOS_P12_BASE64 != null - run: | - security default-keychain -s rustdesk.keychain - security find-identity -v - - - name: Import notarize key - if: env.MACOS_P12_BASE64 != null - uses: timheuer/base64-to-file@v1.2 - with: - # https://gregoryszorc.com/docs/apple-codesign/stable/apple_codesign_rcodesign.html#notarizing-and-stapling - fileName: rustdesk.json - fileDir: ${{ github.workspace }} - encodedString: ${{ secrets.MACOS_NOTARIZE_JSON }} - - - name: Install rcodesign tool - if: env.MACOS_P12_BASE64 != null - shell: bash - run: | - pushd /tmp - wget https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.22.0/apple-codesign-0.22.0-macos-universal.tar.gz - tar -zxvf apple-codesign-0.22.0-macos-universal.tar.gz - mv apple-codesign-0.22.0-macos-universal/rcodesign /usr/local/bin - popd - - - name: Install build runtime - run: | - brew install llvm create-dmg nasm pkg-config - - - name: Install flutter - uses: subosito/flutter-action@v2 - with: - channel: "stable" - flutter-version: ${{ matrix.job.flutter }} - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - with: - toolchain: ${{ env.RUST_VERSION }} - targets: ${{ matrix.job.target }} - components: "rustfmt" - - - uses: Swatinem/rust-cache@v2 - with: - prefix-key: ${{ matrix.job.os }} - - - name: Install flutter rust bridge deps - shell: bash - run: | - sed -i '' 's/3.1.0/2.17.0/g' flutter/pubspec.yaml; - cargo install flutter_rust_bridge_codegen --version ${{ matrix.job.bridge }} --features "uuid" --locked - # below works for mac to make buildable on 3.13.9 - # pushd flutter/lib; find . -name "*.dart" | xargs -I{} sed -i '' 's/textScaler: TextScaler.linear(\(.*\)),/textScaleFactor: \1,/g' {}; popd; - pushd flutter && flutter pub get && popd - ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h - - - name: Setup vcpkg with Github Actions binary cache - uses: lukka/run-vcpkg@v11 - with: - vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} - - - name: Install vcpkg dependencies - run: | - $VCPKG_ROOT/vcpkg install --x-install-root="$VCPKG_ROOT/installed" - - - name: Restore from cache and install vcpkg - uses: lukka/run-vcpkg@v7 - if: false - with: - setupOnly: true - vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} - - - name: Install vcpkg dependencies - if: false - run: | - $VCPKG_ROOT/vcpkg install libvpx libyuv opus aom - - - name: Show version information (Rust, cargo, Clang) - shell: bash - run: | - clang --version || true - rustup -V - rustup toolchain list - rustup default - cargo -V - rustc -V - - - name: Build rustdesk - run: | - ./build.py --flutter ${{ matrix.job.extra-build-args }} - - - name: create unsigned dmg - run: | - CREATE_DMG="$(command -v create-dmg)" - CREATE_DMG="$(readlink -f "$CREATE_DMG")" - sed -i -e 's/MAXIMUM_UNMOUNTING_ATTEMPTS=3/MAXIMUM_UNMOUNTING_ATTEMPTS=7/' "$CREATE_DMG" - create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app - - - name: Codesign app and create signed dmg - if: env.MACOS_P12_BASE64 != null - run: | - # Patch create-dmg to give more attempts to unmount image - CREATE_DMG="$(command -v create-dmg)" - CREATE_DMG="$(readlink -f "$CREATE_DMG")" - sed -i -e 's/MAXIMUM_UNMOUNTING_ATTEMPTS=3/MAXIMUM_UNMOUNTING_ATTEMPTS=7/' "$CREATE_DMG" - # Unlock keychain - security default-keychain -s rustdesk.keychain - security unlock-keychain -p ${{ secrets.MACOS_P12_PASSWORD }} rustdesk.keychain - # start sign the rustdesk.app and dmg - rm -rf *.dmg || true - codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict ./flutter/build/macos/Build/Products/Release/RustDesk.app -vvv - create-dmg --icon "RustDesk.app" 200 190 --hide-extension "RustDesk.app" --window-size 800 400 --app-drop-link 600 185 rustdesk-${{ env.VERSION }}.dmg ./flutter/build/macos/Build/Products/Release/RustDesk.app - codesign --force --options runtime -s ${{ secrets.MACOS_CODESIGN_IDENTITY }} --deep --strict rustdesk-${{ env.VERSION }}.dmg -vvv - # notarize the rustdesk-${{ env.VERSION }}.dmg - rcodesign notary-submit --api-key-path ${{ github.workspace }}/rustdesk.json --staple rustdesk-${{ env.VERSION }}.dmg - - - name: Rename rustdesk - run: | - for name in rustdesk*??.dmg; do - mv "$name" "${name%%.dmg}-${{ matrix.job.arch }}-flutter${{ matrix.job.flutter }}-flutter${{ matrix.job.date }}.dmg" - done - - - name: Publish DMG package - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - rustdesk*-${{ matrix.job.arch }}*.dmg - - - build-rustdesk-android: - if: false - name: build rustdesk android apk ${{ matrix.job.target }} - runs-on: ${{ matrix.job.os }} - strategy: - fail-fast: false - matrix: - job: - - { - arch: aarch64, - target: aarch64-linux-android, - os: ubuntu-22.04, - openssl-arch: android-arm64, - ref: master, # latest - } - steps: - - name: Checkout source code - uses: actions/checkout@v3 - with: - ref: ${{ matrix.job.ref }} - submodules: recursive - - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y \ - clang \ - cmake \ - curl \ - gcc-multilib \ - git \ - g++ \ - g++-multilib \ - libayatana-appindicator3-dev\ - libasound2-dev \ - libc6-dev \ - libclang-dev \ - libunwind-dev \ - libgstreamer1.0-dev \ - libgstreamer-plugins-base1.0-dev \ - libgtk-3-dev \ - libpam0g-dev \ - libpulse-dev \ - libva-dev \ - libvdpau-dev \ - libxcb-randr0-dev \ - libxcb-shape0-dev \ - libxcb-xfixes0-dev \ - libxdo-dev \ - libxfixes-dev \ - llvm-dev \ - nasm \ - yasm \ - ninja-build \ - openjdk-11-jdk-headless \ - pkg-config \ - tree \ - wget - - - name: Install flutter - uses: subosito/flutter-action@v2 - with: - channel: "stable" - flutter-version: ${{ env.FLUTTER_VERSION }} - - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@v1 - with: - toolchain: ${{ env.RUST_VERSION }} - components: "rustfmt" - - - name: Install flutter rust bridge deps - run: | - git config --global core.longpaths true - cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid" --locked - sed -i 's/uni_links_desktop/#uni_links_desktop/g' flutter/pubspec.yaml - pushd flutter/lib; find . | grep dart | xargs sed -i 's/textScaler: TextScaler.linear(\(.*\)),/textScaleFactor: \1,/g'; popd; - pushd flutter ; flutter pub get ; popd - ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart - - - uses: nttld/setup-ndk@v1 - id: setup-ndk - with: - ndk-version: ${{ env.NDK_VERSION }} - add-to-path: true - - - name: Setup vcpkg with Github Actions binary cache - uses: lukka/run-vcpkg@v11 - with: - vcpkgDirectory: /opt/artifacts/vcpkg - vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} - - - name: Install vcpkg dependencies - run: | - case ${{ matrix.job.target }} in - aarch64-linux-android) - ./flutter/build_android_deps.sh arm64-v8a - ;; - armv7-linux-androideabi) - ./flutter/build_android_deps.sh armeabi-v7a - ;; - esac - shell: bash - - - name: Clone deps - shell: bash - run: | - pushd /opt - git clone https://github.com/rustdesk-org/rustdesk_thirdparty_lib.git --depth=1 - ls -ls /opt/artifacts/vcpkg/installed/arm64-android/lib/ - # cp -rf /opt/rustdesk_thirdparty_lib/vcpkg/* /opt/artifacts/vcpkg/ - ls -ls /opt/artifacts/vcpkg/installed/arm64-android/lib/ - - - name: Build rustdesk lib - env: - ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} - ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} - run: | - rustup target add ${{ matrix.job.target }} - cargo install cargo-ndk --version ${{ env.CARGO_NDK_VERSION }} --locked - case ${{ matrix.job.target }} in - aarch64-linux-android) - ./flutter/ndk_arm64.sh - mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so - ;; - armv7-linux-androideabi) - ./flutter/ndk_arm.sh - mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so - ;; - esac - - - name: Build rustdesk - shell: bash - env: - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64 - run: | - export PATH=/usr/lib/jvm/java-11-openjdk-amd64/bin:$PATH - # temporary use debug sign config - sed -i "s/signingConfigs.release/signingConfigs.debug/g" ./flutter/android/app/build.gradle - case ${{ matrix.job.target }} in - aarch64-linux-android) - mkdir -p ./flutter/android/app/src/main/jniLibs/arm64-v8a - cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/ - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so - # build flutter - pushd flutter - flutter build apk --release --target-platform android-arm64 --split-per-abi - mv build/app/outputs/flutter-apk/app-arm64-v8a-release.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk - ;; - armv7-linux-androideabi) - mkdir -p ./flutter/android/app/src/main/jniLibs/armeabi-v7a - cp ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/ - cp ./target/${{ matrix.job.target }}/release/liblibrustdesk.so ./flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so - # build flutter - pushd flutter - flutter build apk --release --target-platform android-arm --split-per-abi - mv build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk - ;; - esac - popd - mkdir -p signed-apk; pushd signed-apk - mv ../rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.apk ./rustdesk-test-${{ matrix.job.ref }}-${{ matrix.job.ndk }}.apk - - - uses: r0adkll/sign-android-release@v1 - name: Sign app APK - if: env.ANDROID_SIGNING_KEY != null - id: sign-rustdesk - with: - releaseDirectory: ./signed-apk - signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }} - alias: ${{ secrets.ANDROID_ALIAS }} - keyStorePassword: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }} - keyPassword: ${{ secrets.ANDROID_KEY_PASSWORD }} - env: - # override default build-tools version (29.0.3) -- optional - BUILD_TOOLS_VERSION: "30.0.2" - - - name: Publish signed apk package - uses: softprops/action-gh-release@v1 - with: - prerelease: true - tag_name: ${{ env.TAG_NAME }} - files: | - ${{steps.sign-rustdesk.outputs.signedReleaseFile}} diff --git a/shelled/rustdesk-as-ref/.github/workflows/third-party-RustDeskTempTopMostWindow.yml b/shelled/rustdesk-as-ref/.github/workflows/third-party-RustDeskTempTopMostWindow.yml deleted file mode 100644 index 2f89092..0000000 --- a/shelled/rustdesk-as-ref/.github/workflows/third-party-RustDeskTempTopMostWindow.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: build RustDeskTempTopMostWindow - -on: - workflow_call: - inputs: - upload-artifact: - type: boolean - default: true - target: - description: 'Target' - required: true - type: string - default: 'windows-2022' - configuration: - description: 'Configuration' - required: true - type: string - default: 'Release' - platform: - description: 'Platform' - required: true - type: string - default: 'x64' - target_version: - description: 'TargetVersion' - required: true - type: string - default: 'Windows10' - -env: - project_path: WindowInjection/WindowInjection.vcxproj - -jobs: - build-RustDeskTempTopMostWindow: - runs-on: ${{ inputs.target }} - strategy: - fail-fast: false - env: - build_output_dir: RustDeskTempTopMostWindow/WindowInjection/${{ inputs.platform }}/${{ inputs.configuration }} - steps: - - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v2 - - - name: Download the source code - run: | - git clone https://github.com/rustdesk-org/RustDeskTempTopMostWindow RustDeskTempTopMostWindow - - # Build. commit 53b548a5398624f7149a382000397993542ad796 is tag v0.3 - - name: Build the project - run: | - cd RustDeskTempTopMostWindow && git checkout 53b548a5398624f7149a382000397993542ad796 - msbuild ${{ env.project_path }} -p:Configuration=${{ inputs.configuration }} -p:Platform=${{ inputs.platform }} /p:TargetVersion=${{ inputs.target_version }} - - - name: Archive build artifacts - uses: actions/upload-artifact@master - if: ${{ inputs.upload-artifact }} - with: - name: topmostwindow-artifacts - path: | - ./${{ env.build_output_dir }}/WindowInjection.dll diff --git a/shelled/rustdesk-as-ref/.gitignore b/shelled/rustdesk-as-ref/.gitignore deleted file mode 100644 index d2e09a9..0000000 --- a/shelled/rustdesk-as-ref/.gitignore +++ /dev/null @@ -1,58 +0,0 @@ -/build -/target -.vscode -.idea -.DS_Store -.env -libsciter-gtk.so -src/ui/inline.rs -extractor -__pycache__ -src/version.rs -*dmg -*exe -*tgz -cert.pfx -*.bak -*png -*svg -*jpg -sciter.dll -**pdb -src/bridge_generated.rs -src/bridge_generated.io.rs -*deb -rustdesk -*.cache -# appimage -appimage/AppDir -appimage/*.AppImage -appimage/appimage-build -appimage/*.xz -# flutter -flutter/linux/build/** -flutter/linux/cmake-build-debug/** -# flatpak -flatpak/.flatpak-builder/** -flatpak/ccache/** -flatpak/.flatpak-builder/build/** -flatpak/.flatpak-builder/shared-modules/** -flatpak/.flatpak-builder/shared-modules/*.tar.xz -flatpak/.flatpak-builder/debian-binary -flatpak/build/** -flatpak/repo/** -flatpak/*.flatpak -# bridge file -lib/generated_bridge.dart -# vscode devcontainer -.gitconfig -.vscode-server/ -.ssh -.devcontainer/.* -# build cache in examples -examples/**/target/ -# === -vcpkg_installed -flutter/lib/generated_plugin_registrant.dart -libsciter.dylib -flutter/web/ \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/.gitmodules b/shelled/rustdesk-as-ref/.gitmodules deleted file mode 100644 index d80e69a..0000000 --- a/shelled/rustdesk-as-ref/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "libs/hbb_common"] - path = libs/hbb_common - url = https://github.com/rustdesk/hbb_common diff --git a/shelled/rustdesk-as-ref/CLAUDE.md b/shelled/rustdesk-as-ref/CLAUDE.md deleted file mode 100644 index 8d46e1f..0000000 --- a/shelled/rustdesk-as-ref/CLAUDE.md +++ /dev/null @@ -1,91 +0,0 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Development Commands - -### Build Commands -- `cargo run` - Build and run the desktop application (requires libsciter library) -- `python3 build.py --flutter` - Build Flutter version (desktop) -- `python3 build.py --flutter --release` - Build Flutter version in release mode -- `python3 build.py --hwcodec` - Build with hardware codec support -- `python3 build.py --vram` - Build with VRAM feature (Windows only) -- `cargo build --release` - Build Rust binary in release mode -- `cargo build --features hwcodec` - Build with specific features - -### Flutter Mobile Commands -- `cd flutter && flutter build android` - Build Android APK -- `cd flutter && flutter build ios` - Build iOS app -- `cd flutter && flutter run` - Run Flutter app in development mode -- `cd flutter && flutter test` - Run Flutter tests - -### Testing -- `cargo test` - Run Rust tests -- `cd flutter && flutter test` - Run Flutter tests - -### Platform-Specific Build Scripts -- `flutter/build_android.sh` - Android build script -- `flutter/build_ios.sh` - iOS build script -- `flutter/build_fdroid.sh` - F-Droid build script - -## Project Architecture - -### Directory Structure -- **`src/`** - Main Rust application code - - `src/ui/` - Legacy Sciter UI (deprecated, use Flutter instead) - - `src/server/` - Audio/clipboard/input/video services and network connections - - `src/client.rs` - Peer connection handling - - `src/platform/` - Platform-specific code -- **`flutter/`** - Flutter UI code for desktop and mobile -- **`libs/`** - Core libraries - - `libs/hbb_common/` - Video codec, config, network wrapper, protobuf, file transfer utilities - - `libs/scrap/` - Screen capture functionality - - `libs/enigo/` - Platform-specific keyboard/mouse control - - `libs/clipboard/` - Cross-platform clipboard implementation - -### Key Components -- **Remote Desktop Protocol**: Custom protocol implemented in `src/rendezvous_mediator.rs` for communicating with rustdesk-server -- **Screen Capture**: Platform-specific screen capture in `libs/scrap/` -- **Input Handling**: Cross-platform input simulation in `libs/enigo/` -- **Audio/Video Services**: Real-time audio/video streaming in `src/server/` -- **File Transfer**: Secure file transfer implementation in `libs/hbb_common/` - -### UI Architecture -- **Legacy UI**: Sciter-based (deprecated) - files in `src/ui/` -- **Modern UI**: Flutter-based - files in `flutter/` - - Desktop: `flutter/lib/desktop/` - - Mobile: `flutter/lib/mobile/` - - Shared: `flutter/lib/common/` and `flutter/lib/models/` - -## Important Build Notes - -### Dependencies -- Requires vcpkg for C++ dependencies: `libvpx`, `libyuv`, `opus`, `aom` -- Set `VCPKG_ROOT` environment variable -- Download appropriate Sciter library for legacy UI support - -### Ignore Patterns -When working with files, ignore these directories: -- `target/` - Rust build artifacts -- `flutter/build/` - Flutter build output -- `flutter/.dart_tool/` - Flutter tooling files - -### Cross-Platform Considerations -- Windows builds require additional DLLs and virtual display drivers -- macOS builds need proper signing and notarization for distribution -- Linux builds support multiple package formats (deb, rpm, AppImage) -- Mobile builds require platform-specific toolchains (Android SDK, Xcode) - -### Feature Flags -- `hwcodec` - Hardware video encoding/decoding -- `vram` - VRAM optimization (Windows only) -- `flutter` - Enable Flutter UI -- `unix-file-copy-paste` - Unix file clipboard support -- `screencapturekit` - macOS ScreenCaptureKit (macOS only) - -### Config -All configurations or options are under `libs/hbb_common/src/config.rs` file, 4 types: -- Settings -- Local -- Display -- Built-in diff --git a/shelled/rustdesk-as-ref/Cargo.lock b/shelled/rustdesk-as-ref/Cargo.lock deleted file mode 100644 index febfd6b..0000000 --- a/shelled/rustdesk-as-ref/Cargo.lock +++ /dev/null @@ -1,11288 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "ab_glyph" -version = "0.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e074464580a518d16a7126262fffaaa47af89d4099d4cb403f8ed938ba12ee7d" -dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", -] - -[[package]] -name = "ab_glyph_rasterizer" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" - -[[package]] -name = "addr2line" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array", -] - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if 1.0.0", - "cipher", - "cpufeatures", -] - -[[package]] -name = "aes-gcm" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.15", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if 1.0.0", - "getrandom 0.3.2", - "once_cell", - "version_check", - "zerocopy 0.8.26", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allo-isolate" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b6d794345b06592d0ebeed8e477e41b71e5a0a49df4fc0e4184d5938b99509" -dependencies = [ - "anyhow", - "atomic", - "chrono", - "uuid", -] - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "alsa" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37fe60779335388a88c01ac6c3be40304d1e349de3ada3b15f7808bb90fa9dce" -dependencies = [ - "alsa-sys", - "bitflags 2.9.1", - "libc", -] - -[[package]] -name = "alsa-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "android-activity" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" -dependencies = [ - "android-properties", - "bitflags 2.9.1", - "cc", - "cesu8", - "jni", - "jni-sys", - "libc", - "log", - "ndk 0.9.0", - "ndk-context", - "ndk-sys 0.6.0+11769913", - "num_enum 0.7.2", - "thiserror 1.0.61", -] - -[[package]] -name = "android-properties" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android-wakelock" -version = "0.1.0" -source = "git+https://github.com/rustdesk-org/android-wakelock#d0292e5a367e627c4fa6f1ca6bdfad005dca7d90" -dependencies = [ - "jni", - "log", - "ndk-context", -] - -[[package]] -name = "android_log-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" - -[[package]] -name = "android_logger" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c494134f746c14dc653a35a4ea5aca24ac368529da5370ecf41fe0341c35772f" -dependencies = [ - "android_log-sys", - "env_logger 0.10.2", - "log", - "once_cell", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "anstream" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" - -[[package]] -name = "anstyle-parse" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - -[[package]] -name = "arboard" -version = "3.4.0" -source = "git+https://github.com/rustdesk-org/arboard#85be1218668ff218a7b170c9d424fde73e069914" -dependencies = [ - "clipboard-win", - "core-graphics 0.23.2", - "image 0.25.1", - "log", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "parking_lot", - "percent-encoding", - "serde 1.0.228", - "serde_derive", - "windows-sys 0.48.0", - "wl-clipboard-rs", - "x11rb 0.13.1", -] - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - -[[package]] -name = "asn1-rs" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" -dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits 0.2.19", - "rusticata-macros", - "thiserror 1.0.61", - "time 0.3.36", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", - "synstructure", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "associative-cache" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46016233fc1bb55c23b856fe556b7db6ccd05119a0a392e04f0b3b7c79058f16" - -[[package]] -name = "async-broadcast" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" -dependencies = [ - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-compression" -version = "0.4.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" -dependencies = [ - "compression-codecs", - "compression-core", - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "async-executor" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand 2.1.0", - "futures-lite 2.3.0", - "slab", -] - -[[package]] -name = "async-fs" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" -dependencies = [ - "async-lock 2.8.0", - "autocfg 1.3.0", - "blocking", - "futures-lite 1.13.0", -] - -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock 2.8.0", - "autocfg 1.3.0", - "cfg-if 1.0.0", - "concurrent-queue", - "futures-lite 1.13.0", - "log", - "parking", - "polling 2.8.0", - "rustix 0.37.27", - "slab", - "socket2 0.4.10", - "waker-fn", -] - -[[package]] -name = "async-io" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" -dependencies = [ - "async-lock 3.4.0", - "cfg-if 1.0.0", - "concurrent-queue", - "futures-io", - "futures-lite 2.3.0", - "parking", - "polling 3.7.2", - "rustix 0.38.34", - "slab", - "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", -] - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener 5.3.1", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-process" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" -dependencies = [ - "async-io 1.13.0", - "async-lock 2.8.0", - "async-signal", - "blocking", - "cfg-if 1.0.0", - "event-listener 3.1.0", - "futures-lite 1.13.0", - "rustix 0.38.34", - "windows-sys 0.48.0", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "async-signal" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d" -dependencies = [ - "async-io 2.3.3", - "async-lock 3.4.0", - "atomic-waker", - "cfg-if 1.0.0", - "futures-core", - "futures-io", - "rustix 0.38.34", - "signal-hook-registry", - "slab", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "atk" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4af014b17dd80e8af9fa689b2d4a211ddba6eb583c1622f35d0cb543f6b17e4" -dependencies = [ - "atk-sys", - "glib 0.18.5", - "libc", -] - -[[package]] -name = "atk-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009" -dependencies = [ - "glib-sys 0.18.1", - "gobject-sys 0.18.0", - "libc", - "system-deps 6.2.2", -] - -[[package]] -name = "atomic" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "auto_impl" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "autocfg" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.3.0", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide 0.7.4", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base32" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde 1.0.228", -] - -[[package]] -name = "bindgen" -version = "0.59.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "clap 2.34.0", - "env_logger 0.9.3", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "proc-macro2 1.0.93", - "quote 1.0.36", - "regex", - "rustc-hash 1.1.0", - "shlex", - "which", -] - -[[package]] -name = "bindgen" -version = "0.65.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "prettyplease", - "proc-macro2 1.0.93", - "quote 1.0.36", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.98", - "which", -] - -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.9.1", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "proc-macro2 1.0.93", - "quote 1.0.36", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.98", -] - -[[package]] -name = "bindgen" -version = "0.71.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" -dependencies = [ - "bitflags 2.9.1", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "proc-macro2 1.0.93", - "quote 1.0.36", - "regex", - "rustc-hash 2.1.1", - "shlex", - "syn 2.0.98", -] - -[[package]] -name = "bit_field" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" -dependencies = [ - "serde 1.0.228", -] - -[[package]] -name = "bitmask-enum" -version = "2.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb15541e888071f64592c0b4364fdff21b7cb0a247f984296699351963a8721" -dependencies = [ - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-sys" -version = "0.1.0-beta.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" -dependencies = [ - "objc-sys 0.2.0-beta.2", -] - -[[package]] -name = "block2" -version = "0.2.0-alpha.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" -dependencies = [ - "block-sys", - "objc2-encode 2.0.0-pre.2", -] - -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2 0.5.2", -] - -[[package]] -name = "block2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2 0.6.4", -] - -[[package]] -name = "blocking" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" -dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite 2.3.0", - "piper", -] - -[[package]] -name = "brotli" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "build-target" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832133bbabbbaa9fbdba793456a2827627a7d2b8fb96032fa1e7666d7895832b" - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecodec" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adf4c9d0bbf32eea58d7c0f812058138ee8edaf0f2802b6d03561b504729a325" -dependencies = [ - "byteorder", - "trackable 0.2.24", -] - -[[package]] -name = "bytemuck" -version = "1.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -dependencies = [ - "serde 1.0.228", -] - -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "cacao" -version = "0.4.0-beta2" -source = "git+https://github.com/clslaid/cacao?branch=feat/set-file-urls#05e1536b0b43aaae308ec72c0eed703e875b7b95" -dependencies = [ - "bitmask-enum", - "block2 0.2.0-alpha.6", - "core-foundation 0.9.3", - "core-graphics 0.23.1", - "dispatch", - "lazy_static", - "libc", - "objc2 0.3.0-beta.2", - "os_info", - "percent-encoding", - "url", -] - -[[package]] -name = "cairo-rs" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" -dependencies = [ - "bitflags 2.9.1", - "cairo-sys-rs", - "glib 0.18.5", - "libc", - "once_cell", - "thiserror 1.0.61", -] - -[[package]] -name = "cairo-sys-rs" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" -dependencies = [ - "glib-sys 0.18.1", - "libc", - "system-deps 6.2.2", -] - -[[package]] -name = "calloop" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" -dependencies = [ - "bitflags 2.9.1", - "log", - "polling 3.7.2", - "rustix 0.38.34", - "slab", - "thiserror 1.0.61", -] - -[[package]] -name = "calloop" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9f6e1368bd4621d2c86baa7e37de77a938adf5221e5dd3d6133340101b309e" -dependencies = [ - "bitflags 2.9.1", - "polling 3.7.2", - "rustix 1.1.2", - "slab", - "tracing", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" -dependencies = [ - "calloop 0.13.0", - "rustix 0.38.34", - "wayland-backend", - "wayland-client", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" -dependencies = [ - "calloop 0.14.3", - "rustix 1.1.2", - "wayland-backend", - "wayland-client", -] - -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - -[[package]] -name = "cc" -version = "1.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "ccm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae3c82e4355234767756212c570e29833699ab63e6ffd161887314cc5b43847" -dependencies = [ - "aead", - "cipher", - "ctr", - "subtle", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if 1.0.0", - "cipher", - "cpufeatures", -] - -[[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" -dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", - "zeroize", -] - -[[package]] -name = "chrono" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits 0.2.19", - "wasm-bindgen", - "windows-link 0.1.1", -] - -[[package]] -name = "cidr-utils" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2315f7119b7146d6a883de6acd63ddf96071b5f79d9d98d2adaa84d749f6abf1" -dependencies = [ - "debug-helper", - "num-bigint", - "num-traits 0.2.19", - "once_cell", - "regex", -] - -[[package]] -name = "cidre" -version = "0.4.0" -source = "git+https://github.com/yury/cidre.git?rev=f05c428#f05c4288f9870c9fab53272ddafd6ec01c7b2dbf" -dependencies = [ - "cidre-macros", - "parking_lot", -] - -[[package]] -name = "cidre-macros" -version = "0.1.0" -source = "git+https://github.com/yury/cidre.git?rev=f05c428#f05c4288f9870c9fab53272ddafd6ec01c7b2dbf" - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", - "zeroize", -] - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading 0.8.4", -] - -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "ansi_term", - "atty", - "bitflags 1.3.2", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", -] - -[[package]] -name = "clap" -version = "4.5.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" -dependencies = [ - "clap_builder", -] - -[[package]] -name = "clap_builder" -version = "4.5.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim 0.11.1", -] - -[[package]] -name = "clap_lex" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" - -[[package]] -name = "clipboard" -version = "0.1.0" -dependencies = [ - "cacao", - "cc", - "dashmap 5.5.3", - "dirs 5.0.1", - "fsevent", - "fuser", - "hbb_common", - "lazy_static", - "libc", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "once_cell", - "parking_lot", - "percent-encoding", - "rand 0.8.5", - "serde 1.0.228", - "serde_derive", - "thiserror 1.0.61", - "utf16string", - "uuid", - "x11-clipboard 0.8.1", - "x11rb 0.12.0", - "xattr", -] - -[[package]] -name = "clipboard-master" -version = "4.0.0-beta.6" -source = "git+https://github.com/rustdesk-org/clipboard-master#ddc39f00a6211959489ae683aa6ae6eedf03a809" -dependencies = [ - "objc", - "objc-foundation", - "objc_id", - "wayland-client", - "wayland-protocols", - "wayland-protocols-wlr", - "windows-win", - "wl-clipboard-rs", - "x11-clipboard 0.9.2", - "x11rb 0.13.1", -] - -[[package]] -name = "clipboard-win" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" -dependencies = [ - "error-code", -] - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - -[[package]] -name = "cocoa" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c49e86fc36d5704151f5996b7b3795385f50ce09e3be0f47a0cfde869681cf8" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.7.0", - "core-graphics 0.19.2", - "foreign-types 0.3.2", - "libc", - "objc", -] - -[[package]] -name = "cocoa" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation", - "core-foundation 0.9.4", - "core-graphics 0.22.3", - "foreign-types 0.3.2", - "libc", - "objc", -] - -[[package]] -name = "cocoa" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation", - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "foreign-types 0.5.0", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "libc", - "objc", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "colorchoice" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "compression-codecs" -version = "0.4.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" -dependencies = [ - "compression-core", - "flate2", - "memchr", -] - -[[package]] -name = "compression-core" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "confy" -version = "0.4.0-2" -source = "git+https://github.com/rustdesk-org/confy#83db9ec19a2f97e9718aef69e4fc5611bb382479" -dependencies = [ - "directories-next", - "serde 1.0.228", - "thiserror 1.0.61", - "toml 0.5.11", -] - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const_fn" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373e9fafaa20882876db20562275ff58d50e0caa2590077fe7ce7bef90211d0d" - -[[package]] -name = "const_format" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "unicode-xid 0.2.4", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "constant_time_eq" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" - -[[package]] -name = "core-foundation" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" -dependencies = [ - "core-foundation-sys 0.7.0", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd#7d593d016175755e492a92ef89edca68ac3bd5cd" -dependencies = [ - "core-foundation-sys 0.8.6", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys 0.8.7", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys 0.8.7", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd#7d593d016175755e492a92ef89edca68ac3bd5cd" -dependencies = [ - "objc2-encode 2.0.0-pre.2", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.7.0", - "foreign-types 0.3.2", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types 0.3.2", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.23.1" -source = "git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd#7d593d016175755e492a92ef89edca68ac3bd5cd" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.3", - "core-graphics-types 0.1.2", - "foreign-types 0.5.0", - "libc", - "objc2-encode 2.0.0-pre.2", -] - -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.2" -source = "git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd#7d593d016175755e492a92ef89edca68ac3bd5cd" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.3", - "libc", - "objc2-encode 2.0.0-pre.2", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "libc", -] - -[[package]] -name = "core-media-sys" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "273bf3fc5bf51fd06a7766a84788c1540b6527130a0bce39e00567d6ab9f31f1" -dependencies = [ - "cfg-if 0.1.10", - "core-foundation-sys 0.7.0", - "libc", -] - -[[package]] -name = "core-text" -version = "19.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d74ada66e07c1cefa18f8abfba765b486f250de2e4a999e5727fc0dd4b4a25" -dependencies = [ - "core-foundation 0.9.4", - "core-graphics 0.22.3", - "foreign-types 0.3.2", - "libc", -] - -[[package]] -name = "core-video-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" -dependencies = [ - "cfg-if 0.1.10", - "core-foundation-sys 0.7.0", - "core-graphics 0.19.2", - "libc", - "metal", - "objc", -] - -[[package]] -name = "core_maths" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" -dependencies = [ - "libm", -] - -[[package]] -name = "coreaudio-rs" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" -dependencies = [ - "bitflags 1.3.2", - "core-foundation-sys 0.8.7", - "coreaudio-sys", -] - -[[package]] -name = "coreaudio-sys" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f01585027057ff5f0a5bf276174ae4c1594a2c5bde93d5f46a016d76270f5a9" -dependencies = [ - "bindgen 0.69.4", -] - -[[package]] -name = "cpal" -version = "0.15.3" -source = "git+https://github.com/rustdesk-org/cpal?branch=osx-screencapturekit#6b374bcaed076750ca8fce6da518ab39b882e14a" -dependencies = [ - "alsa", - "cidre", - "core-foundation-sys 0.8.7", - "coreaudio-rs", - "dasp_sample", - "jni", - "js-sys", - "libc", - "mach2", - "ndk 0.8.0", - "ndk-context", - "oboe", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows 0.54.0", -] - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "ctor-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f791803201ab277ace03903de1594460708d2d54df6053f2d9e82f592b19e3b" - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "ctrlc" -version = "3.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "672465ae37dc1bc6380a6547a8883d5dd397b0f1faaad4f265726cc7042a5345" -dependencies = [ - "nix 0.28.0", - "windows-sys 0.52.0", -] - -[[package]] -name = "cursor-icon" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "curve25519-dalek-derive", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "dart-sys" -version = "4.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57967e4b200d767d091b961d6ab42cc7d0cc14fe9e052e75d0d3cf9eb732d895" -dependencies = [ - "cc", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if 1.0.0", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "dasp" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7381b67da416b639690ac77c73b86a7b5e64a29e31d1f75fb3b1102301ef355a" -dependencies = [ - "dasp_envelope", - "dasp_frame", - "dasp_interpolate", - "dasp_peak", - "dasp_ring_buffer", - "dasp_rms", - "dasp_sample", - "dasp_signal", - "dasp_slice", - "dasp_window", -] - -[[package]] -name = "dasp_envelope" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ec617ce7016f101a87fe85ed44180839744265fae73bb4aa43e7ece1b7668b6" -dependencies = [ - "dasp_frame", - "dasp_peak", - "dasp_ring_buffer", - "dasp_rms", - "dasp_sample", -] - -[[package]] -name = "dasp_frame" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a3937f5fe2135702897535c8d4a5553f8b116f76c1529088797f2eee7c5cd6" -dependencies = [ - "dasp_sample", -] - -[[package]] -name = "dasp_interpolate" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc975a6563bb7ca7ec0a6c784ead49983a21c24835b0bc96eea11ee407c7486" -dependencies = [ - "dasp_frame", - "dasp_ring_buffer", - "dasp_sample", -] - -[[package]] -name = "dasp_peak" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cf88559d79c21f3d8523d91250c397f9a15b5fc72fbb3f87fdb0a37b79915bf" -dependencies = [ - "dasp_frame", - "dasp_sample", -] - -[[package]] -name = "dasp_ring_buffer" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07d79e19b89618a543c4adec9c5a347fe378a19041699b3278e616e387511ea1" - -[[package]] -name = "dasp_rms" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6c5dcb30b7e5014486e2822537ea2beae50b19722ffe2ed7549ab03774575aa" -dependencies = [ - "dasp_frame", - "dasp_ring_buffer", - "dasp_sample", -] - -[[package]] -name = "dasp_sample" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" - -[[package]] -name = "dasp_signal" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa1ab7d01689c6ed4eae3d38fe1cea08cba761573fbd2d592528d55b421077e7" -dependencies = [ - "dasp_envelope", - "dasp_frame", - "dasp_interpolate", - "dasp_peak", - "dasp_ring_buffer", - "dasp_rms", - "dasp_sample", - "dasp_window", -] - -[[package]] -name = "dasp_slice" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1c7335d58e7baedafa516cb361360ff38d6f4d3f9d9d5ee2a2fc8e27178fa1" -dependencies = [ - "dasp_frame", - "dasp_sample", -] - -[[package]] -name = "dasp_window" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ded7b88821d2ce4e8b842c9f1c86ac911891ab89443cc1de750cae764c5076" -dependencies = [ - "dasp_sample", -] - -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - -[[package]] -name = "dbus" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" -dependencies = [ - "libc", - "libdbus-sys", - "winapi 0.3.9", -] - -[[package]] -name = "dbus-crossroads" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a4c83437187544ba5142427746835061b330446ca8902eabd70e4afb8f76de0" -dependencies = [ - "dbus", -] - -[[package]] -name = "debug-helper" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" - -[[package]] -name = "default-net" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4898b43aed56499fad6b294d15b3e76a51df68079bf492e5daae38ca084e003" -dependencies = [ - "dlopen2", - "libc", - "memalloc", - "netlink-packet-core", - "netlink-packet-route", - "netlink-sys", - "once_cell", - "system-configuration", - "windows 0.32.0", -] - -[[package]] -name = "default_net" -version = "0.1.0" -source = "git+https://github.com/rustdesk-org/default_net#78f8f70cd85151a3a2c4a3230d80d5272703c02e" -dependencies = [ - "anyhow", - "regex", - "winapi 0.3.9", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "der-parser" -version = "9.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint", - "num-traits 0.2.19", - "rusticata-macros", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "directories-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" -dependencies = [ - "cfg-if 1.0.0", - "dirs-sys-next", -] - -[[package]] -name = "dirs" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" -dependencies = [ - "cfg-if 0.1.10", - "dirs-sys 0.3.7", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys 0.3.7", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys 0.4.1", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys 0.5.0", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if 1.0.0", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users 0.4.5", - "winapi 0.3.9", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.4.5", - "windows-sys 0.48.0", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.5.2", - "windows-sys 0.61.2", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users 0.4.5", - "winapi 0.3.9", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dispatch2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" -dependencies = [ - "bitflags 2.9.1", - "objc2 0.6.4", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading 0.8.4", -] - -[[package]] -name = "dlopen" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e80ad39f814a9abe68583cd50a2d45c8a67561c3361ab8da240587dda80937" -dependencies = [ - "dlopen_derive", - "lazy_static", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "dlopen2" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b121caccfc363e4d9a4589528f3bef7c71b83c6ed01c8dc68cbeeb7fd29ec698" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi 0.3.9", -] - -[[package]] -name = "dlopen2_derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a09ac8bb8c16a282264c379dffba707b9c998afc7506009137f3c6136888078" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 1.0.109", -] - -[[package]] -name = "dlopen_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f236d9e1b1fbd81cea0f9cbdc8dcc7e8ebcd80e6659cd7cb2ad5f6c05946c581" -dependencies = [ - "libc", - "quote 0.6.13", - "syn 0.15.44", -] - -[[package]] -name = "dlv-list" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" - -[[package]] -name = "docopt" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3f119846c823f9eafcf953a8f6ffb6ed69bf6240883261a7f13b634579a51f" -dependencies = [ - "lazy_static", - "regex", - "serde 1.0.228", - "strsim 0.10.0", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dpi" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" - -[[package]] -name = "drm" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437ae9cbb5d1" -dependencies = [ - "bitflags 2.9.1", - "bytemuck", - "drm-ffi", - "drm-fourcc", - "rustix 0.38.34", -] - -[[package]] -name = "drm-ffi" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97c98727e48b7ccb4f4aea8cfe881e5b07f702d17b7875991881b41af7278d53" -dependencies = [ - "drm-sys", - "rustix 0.38.34", -] - -[[package]] -name = "drm-fourcc" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" - -[[package]] -name = "drm-sys" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd39dde40b6e196c2e8763f23d119ddb1a8714534bf7d77fa97a65b0feda3986" -dependencies = [ - "libc", - "linux-raw-sys 0.6.5", -] - -[[package]] -name = "dtls" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f531dd7c181beaf3cebab3716afa4d0d41ab888be85232583f56bbaf07ca208a" -dependencies = [ - "aes", - "aes-gcm", - "async-trait", - "bincode", - "byteorder", - "cbc", - "ccm", - "chacha20poly1305", - "der-parser", - "hmac", - "log", - "p256", - "p384", - "portable-atomic", - "rand 0.9.2", - "rand_core 0.6.4", - "rcgen", - "ring", - "rustls", - "sec1", - "serde 1.0.228", - "sha1", - "sha2", - "thiserror 1.0.61", - "tokio", - "webrtc-util", - "x25519-dalek", - "x509-parser", -] - -[[package]] -name = "dtoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dylib_virtual_display" -version = "0.1.0" -dependencies = [ - "cc", - "hbb_common", - "lazy_static", - "serde 1.0.228", - "serde_derive", - "thiserror 1.0.61", -] - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest", - "elliptic-curve", - "rfc6979", - "signature 2.2.0", - "spki", -] - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest", - "ff", - "generic-array", - "group", - "hkdf", - "pem-rfc7468", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "enigo" -version = "0.0.14" -dependencies = [ - "core-graphics 0.22.3", - "hbb_common", - "libxdo-sys", - "log", - "objc", - "pkg-config", - "rdev", - "serde 1.0.228", - "serde_derive", - "tfc", - "unicode-segmentation", - "winapi 0.3.9", -] - -[[package]] -name = "enquote" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c36cb11dbde389f4096111698d8b567c0720e3452fd5ac3e6b4e47e1939932" -dependencies = [ - "thiserror 1.0.61", -] - -[[package]] -name = "enum-map" -version = "2.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" -dependencies = [ - "enum-map-derive", -] - -[[package]] -name = "enum-map-derive" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "enumflags2" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" -dependencies = [ - "enumflags2_derive", - "serde 1.0.228", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "env_filter" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "env_logger" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "humantime", - "log", -] - -[[package]] -name = "epoll" -version = "4.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74351c3392ea1ff6cd2628e0042d268ac2371cb613252ff383b6dfa50d22fa79" -dependencies = [ - "bitflags 2.9.1", - "libc", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "error-code" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" - -[[package]] -name = "evdev" -version = "0.11.5" -source = "git+https://github.com/rustdesk-org/evdev#cec616e37790293d2cd2aa54a96601ed6b1b35a9" -dependencies = [ - "bitvec", - "libc", - "nix 0.23.2", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" -dependencies = [ - "event-listener 5.3.1", - "pin-project-lite", -] - -[[package]] -name = "exr" -version = "1.72.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" -dependencies = [ - "bit_field", - "flume", - "half", - "lebe", - "miniz_oxide 0.7.4", - "rayon-core", - "smallvec", - "zune-inflate", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "fdeflate" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "field-offset" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" -dependencies = [ - "memoffset 0.9.1", - "rustc_version", -] - -[[package]] -name = "filedescriptor" -version = "0.8.2" -source = "git+https://github.com/rustdesk-org/wezterm?branch=rustdesk/pty_based_0.8.1#80174f8009f41565f0fa8c66dab90d4f9211ae16" -dependencies = [ - "libc", - "thiserror 1.0.61", - "winapi 0.3.9", -] - -[[package]] -name = "filetime" -version = "0.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide 0.8.9", -] - -[[package]] -name = "flexi_logger" -version = "0.27.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469e584c031833564840fb0cdbce99bdfe946fd45480a188545e73a76f45461c" -dependencies = [ - "chrono", - "crossbeam-channel", - "crossbeam-queue", - "glob", - "is-terminal", - "lazy_static", - "log", - "nu-ansi-term 0.49.0", - "regex", - "thiserror 1.0.61", -] - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "spin", -] - -[[package]] -name = "flutter_rust_bridge" -version = "1.80.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd0305ebc9f097d9826530a55fc2acd63222e912c663f7adce3ab641ecc0f346" -dependencies = [ - "allo-isolate", - "anyhow", - "build-target", - "bytemuck", - "cc", - "chrono", - "console_error_panic_hook", - "dart-sys", - "flutter_rust_bridge_macros", - "js-sys", - "lazy_static", - "libc", - "log", - "parking_lot", - "threadpool", - "uuid", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "flutter_rust_bridge_macros" -version = "1.82.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7fe743d921bedf4578b9472346d03a9643a01cd565ca7df7961baebad534ba5" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "fon" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad46a0e6c9bc688823a742aa969b5c08fdc56c2a436ee00d5c6fbcb5982c55c4" -dependencies = [ - "libm", -] - -[[package]] -name = "fontconfig-parser" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" -dependencies = [ - "roxmltree", -] - -[[package]] -name = "fontdb" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2", - "slotmap", - "tinyvec", - "ttf-parser", -] - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fruitbasket" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "898289b8e0528c84fb9b88f15ac9d5109bcaf23e0e49bb6f64deee0d86b6a351" -dependencies = [ - "dirs 2.0.2", - "objc", - "objc-foundation", - "objc_id", - "time 0.1.45", -] - -[[package]] -name = "fsevent" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8836d1f147a0a195bf517a5fd211ea7023d19ced903135faf6c4504f2cf8775f" -dependencies = [ - "bitflags 1.3.2", - "fsevent-sys", -] - -[[package]] -name = "fsevent-sys" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" -dependencies = [ - "libc", -] - -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "fuser" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53274f494609e77794b627b1a3cddfe45d675a6b2e9ba9c0fdc8d8eee2184369" -dependencies = [ - "libc", - "log", - "memchr", - "nix 0.29.0", - "page_size", - "smallvec", - "zerocopy 0.8.26", -] - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-lite" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" -dependencies = [ - "fastrand 2.1.0", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "gdk" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5ba081bdef3b75ebcdbfc953699ed2d7417d6bd853347a42a37d76406a33646" -dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib 0.18.5", - "libc", - "pango", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" -dependencies = [ - "gdk-pixbuf-sys", - "gio", - "glib 0.18.5", - "libc", - "once_cell", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" -dependencies = [ - "gio-sys", - "glib-sys 0.18.1", - "gobject-sys 0.18.0", - "libc", - "system-deps 6.2.2", -] - -[[package]] -name = "gdk-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys 0.18.1", - "gobject-sys 0.18.0", - "libc", - "pango-sys", - "pkg-config", - "system-deps 6.2.2", -] - -[[package]] -name = "gdkwayland-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90fbf5c033c65d93792192a49a8efb5bb1e640c419682a58bb96f5ae77f3d4a" -dependencies = [ - "gdk-sys", - "glib-sys 0.18.1", - "gobject-sys 0.18.0", - "libc", - "pkg-config", - "system-deps 6.2.2", -] - -[[package]] -name = "gdkx11-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee8f00f4ee46cad2939b8990f5c70c94ff882c3028f3cc5abf950fa4ab53043" -dependencies = [ - "gdk-sys", - "glib-sys 0.18.1", - "libc", - "system-deps 6.2.2", - "x11 2.21.0", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "gethostname" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb65d4ba3173c56a500b555b532f72c42e8d1fe64962b518897f8959fae2c177" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "gethostname" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" -dependencies = [ - "libc", - "windows-targets 0.48.5", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", - "wasm-bindgen", -] - -[[package]] -name = "ghash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" -dependencies = [ - "opaque-debug", - "polyval", -] - -[[package]] -name = "gif" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" -dependencies = [ - "color_quant", - "weezl", -] - -[[package]] -name = "gimli" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - -[[package]] -name = "gio" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib 0.18.5", - "libc", - "once_cell", - "pin-project-lite", - "smallvec", - "thiserror 1.0.61", -] - -[[package]] -name = "gio-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" -dependencies = [ - "glib-sys 0.18.1", - "gobject-sys 0.18.0", - "libc", - "system-deps 6.2.2", - "winapi 0.3.9", -] - -[[package]] -name = "git2" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf7f68c2995f392c49fffb4f95ae2c873297830eb25c6bc4c114ce8f4562acc" -dependencies = [ - "bitflags 1.3.2", - "libc", - "libgit2-sys", - "log", - "url", -] - -[[package]] -name = "glib" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c685013b7515e668f1b57a165b009d4d28cb139a8a989bbd699c10dad29d0c5" -dependencies = [ - "bitflags 1.3.2", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "glib-macros 0.10.1", - "glib-sys 0.10.1", - "gobject-sys 0.10.0", - "libc", - "once_cell", -] - -[[package]] -name = "glib" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" -dependencies = [ - "bitflags 2.9.1", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "gio-sys", - "glib-macros 0.18.5", - "glib-sys 0.18.1", - "gobject-sys 0.18.0", - "libc", - "memchr", - "once_cell", - "smallvec", - "thiserror 1.0.61", -] - -[[package]] -name = "glib-macros" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41486a26d1366a8032b160b59065a59fb528530a46a49f627e7048fb8c064039" -dependencies = [ - "anyhow", - "heck 0.3.3", - "itertools 0.9.0", - "proc-macro-crate 0.1.5", - "proc-macro-error", - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 1.0.109", -] - -[[package]] -name = "glib-macros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" -dependencies = [ - "heck 0.4.1", - "proc-macro-crate 2.0.2", - "proc-macro-error", - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "glib-sys" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e9b997a66e9a23d073f2b1abb4dbfc3925e0b8952f67efd8d9b6e168e4cdc1" -dependencies = [ - "libc", - "system-deps 1.3.2", -] - -[[package]] -name = "glib-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" -dependencies = [ - "libc", - "system-deps 6.2.2", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gobject-sys" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "952133b60c318a62bf82ee75b93acc7e84028a093e06b9e27981c2b6fe68218c" -dependencies = [ - "glib-sys 0.10.1", - "libc", - "system-deps 1.3.2", -] - -[[package]] -name = "gobject-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" -dependencies = [ - "glib-sys 0.18.1", - "libc", - "system-deps 6.2.2", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "gstreamer" -version = "0.16.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ff5d0f7ff308ae37e6eb47b6ded17785bdea06e438a708cd09e0288c1862f33" -dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", - "futures-channel", - "futures-core", - "futures-util", - "glib 0.10.3", - "glib-sys 0.10.1", - "gobject-sys 0.10.0", - "gstreamer-sys", - "libc", - "muldiv", - "num-rational", - "once_cell", - "paste", - "pretty-hex", - "thiserror 1.0.61", -] - -[[package]] -name = "gstreamer-app" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc80888271338c3ede875d8cafc452eb207476ff5539dcbe0018a8f5b827af0e" -dependencies = [ - "bitflags 1.3.2", - "futures-core", - "futures-sink", - "glib 0.10.3", - "glib-sys 0.10.1", - "gobject-sys 0.10.0", - "gstreamer", - "gstreamer-app-sys", - "gstreamer-base", - "gstreamer-sys", - "libc", - "once_cell", -] - -[[package]] -name = "gstreamer-app-sys" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "813f64275c9e7b33b828b9efcf9dfa64b95996766d4de996e84363ac65b87e3d" -dependencies = [ - "glib-sys 0.10.1", - "gstreamer-base-sys", - "gstreamer-sys", - "libc", - "system-deps 1.3.2", -] - -[[package]] -name = "gstreamer-base" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bafd01c56f59cb10f4b5a10f97bb4bdf8c2b2784ae5b04da7e2d400cf6e6afcf" -dependencies = [ - "bitflags 1.3.2", - "glib 0.10.3", - "glib-sys 0.10.1", - "gobject-sys 0.10.0", - "gstreamer", - "gstreamer-base-sys", - "gstreamer-sys", - "libc", -] - -[[package]] -name = "gstreamer-base-sys" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b7b6dc2d6e160a1ae28612f602bd500b3fa474ce90bf6bb2f08072682beef5" -dependencies = [ - "glib-sys 0.10.1", - "gobject-sys 0.10.0", - "gstreamer-sys", - "libc", - "system-deps 1.3.2", -] - -[[package]] -name = "gstreamer-sys" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1f154082d01af5718c5f8a8eb4f565a4ea5586ad8833a8fc2c2aa6844b601d" -dependencies = [ - "glib-sys 0.10.1", - "gobject-sys 0.10.0", - "libc", - "system-deps 1.3.2", -] - -[[package]] -name = "gstreamer-video" -version = "0.16.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7bbb1485d87469849ec45c08e03c2f280d3ea20ff3c439d03185be54e3ce98e" -dependencies = [ - "bitflags 1.3.2", - "futures-channel", - "futures-util", - "glib 0.10.3", - "glib-sys 0.10.1", - "gobject-sys 0.10.0", - "gstreamer", - "gstreamer-base", - "gstreamer-base-sys", - "gstreamer-sys", - "gstreamer-video-sys", - "libc", - "once_cell", -] - -[[package]] -name = "gstreamer-video-sys" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92347e46438007d6a2386302125f62cb9df6769cdacb931af5c0f12c1ee21de4" -dependencies = [ - "glib-sys 0.10.1", - "gobject-sys 0.10.0", - "gstreamer-base-sys", - "gstreamer-sys", - "libc", - "system-deps 1.3.2", -] - -[[package]] -name = "gtk" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93c4f5e0e20b60e10631a5f06da7fe3dda744b05ad0ea71fee2f47adf865890c" -dependencies = [ - "atk", - "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib 0.18.5", - "gtk-sys", - "gtk3-macros", - "libc", - "pango", - "pkg-config", -] - -[[package]] -name = "gtk-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys 0.18.1", - "gobject-sys 0.18.0", - "libc", - "pango-sys", - "system-deps 6.2.2", -] - -[[package]] -name = "gtk3-macros" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "half" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "cfg-if 1.0.0", - "crunchy", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" - -[[package]] -name = "hbb_common" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-recursion", - "backtrace", - "base64 0.22.1", - "bytes", - "chrono", - "clap 4.5.53", - "confy", - "default_net", - "directories-next", - "dirs-next", - "dlopen", - "env_logger 0.11.6", - "filetime", - "flexi_logger", - "futures", - "futures-util", - "httparse", - "lazy_static", - "libc", - "libloading 0.8.4", - "log", - "mac_address", - "machine-uid", - "osascript", - "protobuf", - "protobuf-codegen", - "rand 0.8.5", - "regex", - "rustls-native-certs", - "rustls-pki-types", - "rustls-platform-verifier", - "serde 1.0.228", - "serde_derive", - "serde_json 1.0.118", - "sha2", - "smithay-client-toolkit 0.20.0", - "socket2 0.3.19", - "sodiumoxide", - "sysinfo", - "thiserror 1.0.61", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tokio-socks", - "tokio-tungstenite", - "tokio-util", - "toml 0.7.8", - "tungstenite", - "url", - "users 0.11.0", - "uuid", - "webpki-roots 1.0.4", - "webrtc", - "whoami", - "winapi 0.3.9", - "x11 2.21.0", - "zstd 0.13.1", -] - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - -[[package]] -name = "hermit-abi" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "hound" -version = "3.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" - -[[package]] -name = "html-escape" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" -dependencies = [ - "utf8-width", -] - -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa 1.0.11", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hwcodec" -version = "0.7.1" -source = "git+https://github.com/rustdesk-org/hwcodec#398e5a8938dd8768ade0fcdc27ea80e8b4b38738" -dependencies = [ - "bindgen 0.59.2", - "cc", - "log", - "serde 1.0.228", - "serde_derive", - "serde_json 1.0.118", -] - -[[package]] -name = "hyper" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "http", - "http-body", - "httparse", - "itoa 1.0.11", - "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots 1.0.4", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys 0.8.7", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core 0.52.0", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "image" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "exr", - "gif", - "jpeg-decoder", - "num-traits 0.2.19", - "png 0.17.13", - "qoi", - "tiff", -] - -[[package]] -name = "image" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" -dependencies = [ - "bytemuck", - "byteorder", - "num-traits 0.2.19", - "png 0.17.13", - "tiff", -] - -[[package]] -name = "impersonate_system" -version = "0.1.0" -source = "git+https://github.com/rustdesk-org/impersonate-system#2f429010a5a10b1fe5eceb553c6672fd53d20167" -dependencies = [ - "cc", -] - -[[package]] -name = "include_dir" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" -dependencies = [ - "include_dir_macros", -] - -[[package]] -name = "include_dir_macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown 0.14.5", -] - -[[package]] -name = "inotify" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" -dependencies = [ - "bitflags 1.3.2", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "interceptor" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea51375727680dc15f06e8ad90fa31df75d79dd030100e8ad60eef1c27fe2c98" -dependencies = [ - "async-trait", - "bytes", - "futures", - "log", - "portable-atomic", - "rand 0.9.2", - "rtcp", - "rtp", - "thiserror 1.0.61", - "tokio", - "waitgroup", - "webrtc-srtp", - "webrtc-util", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "ioctl-rs" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7970510895cee30b3e9128319f2cefd4bde883a39f38baa279567ba3a7eb97d" -dependencies = [ - "libc", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" -dependencies = [ - "memchr", - "serde 1.0.228", -] - -[[package]] -name = "is-terminal" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" -dependencies = [ - "hermit-abi 0.5.0", - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "is_debug" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d198e9919d9822d5f7083ba8530e04de87841eaf21ead9af8f2304efd57c89" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" - -[[package]] -name = "itertools" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c" - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if 1.0.0", - "combine", - "jni-sys", - "log", - "thiserror 1.0.61", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" -dependencies = [ - "libc", -] - -[[package]] -name = "jpeg-decoder" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" -dependencies = [ - "rayon", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "kcp-sys" -version = "0.1.0" -source = "git+https://github.com/rustdesk-org/kcp-sys#32a6c09fc6223f54aea83981a6aa8995931d29be" -dependencies = [ - "anyhow", - "auto_impl", - "bindgen 0.71.1", - "bitflags 2.9.1", - "bytes", - "cc", - "dashmap 6.1.0", - "log", - "parking_lot", - "rand 0.8.5", - "thiserror 2.0.17", - "tokio", - "tokio-util", - "tracing", - "tracing-subscriber", - "zerocopy 0.7.34", -] - -[[package]] -name = "keepawake" -version = "0.4.3" -source = "git+https://github.com/rustdesk-org/keepawake-rs#64d568586dd16551d02120e19668d2b0fec8e3c9" -dependencies = [ - "anyhow", - "cfg-if 1.0.0", - "core-foundation 0.9.4", - "shadow-rs", - "windows 0.48.0", - "winres", - "zbus", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "keyboard-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" -dependencies = [ - "bitflags 2.9.1", - "serde 1.0.228", - "unicode-segmentation", -] - -[[package]] -name = "kurbo" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd85a5776cd9500c2e2059c8c76c3b01528566b7fcbaf8098b55a33fc298849b" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "lebe" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" - -[[package]] -name = "libappindicator" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" -dependencies = [ - "glib 0.18.5", - "gtk", - "gtk-sys", - "libappindicator-sys", - "log", -] - -[[package]] -name = "libappindicator-sys" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" -dependencies = [ - "gtk-sys", - "libloading 0.7.4", - "once_cell", -] - -[[package]] -name = "libc" -version = "0.2.171" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" - -[[package]] -name = "libdbus-sys" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" -dependencies = [ - "pkg-config", -] - -[[package]] -name = "libgit2-sys" -version = "0.14.2+1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3d95f6b51075fe9810a7ae22c7095f12b98005ab364d8544797a825ce946a4" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if 1.0.0", - "winapi 0.3.9", -] - -[[package]] -name = "libloading" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" -dependencies = [ - "cfg-if 1.0.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libpulse-binding" -version = "2.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3557a2dfc380c8f061189a01c6ae7348354e0c9886038dc6c171219c08eaff" -dependencies = [ - "bitflags 1.3.2", - "libc", - "libpulse-sys", - "num-derive 0.3.3", - "num-traits 0.2.19", - "winapi 0.3.9", -] - -[[package]] -name = "libpulse-simple-binding" -version = "2.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05fd6b68f33f6a251265e6ed1212dc3107caad7c5c6fdcd847b2e65ef58c308d" -dependencies = [ - "libpulse-binding", - "libpulse-simple-sys", - "libpulse-sys", -] - -[[package]] -name = "libpulse-simple-sys" -version = "1.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6613b4199d8b9f0edcfb623e020cb17bbd0bee8dd21f3c7cc938de561c4152" -dependencies = [ - "libpulse-sys", - "pkg-config", -] - -[[package]] -name = "libpulse-sys" -version = "1.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc19e110fbf42c17260d30f6d3dc545f58491c7830d38ecb9aaca96e26067a9b" -dependencies = [ - "libc", - "num-derive 0.3.3", - "num-traits 0.2.19", - "pkg-config", - "winapi 0.3.9", -] - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.9.1", - "libc", - "redox_syscall 0.5.2", -] - -[[package]] -name = "libsamplerate-sys" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28853b399f78f8281cd88d333b54a63170c4275f6faea66726a2bea5cca72e0d" -dependencies = [ - "cmake", -] - -[[package]] -name = "libsodium-sys" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b779387cd56adfbc02ea4a668e704f729be8d6a6abd2c27ca5ee537849a92fd" -dependencies = [ - "cc", - "libc", - "pkg-config", - "walkdir", -] - -[[package]] -name = "libxdo" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00333b8756a3d28e78def82067a377de7fa61b24909000aeaa2b446a948d14db" -dependencies = [ - "libxdo-sys", -] - -[[package]] -name = "libxdo-sys" -version = "0.11.0" -dependencies = [ - "hbb_common", -] - -[[package]] -name = "libz-sys" -version = "1.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "line-wrap" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd1bc4d24ad230d21fb898d1116b1801d7adfc449d42026475862ab48b11e70e" - -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "linux-raw-sys" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg 1.3.0", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "mac_address" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8836fae9d0d4be2c8b4efcdd79e828a2faa058a90d005abf42f91cac5493a08e" -dependencies = [ - "nix 0.28.0", - "winapi 0.3.9", -] - -[[package]] -name = "mach2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" -dependencies = [ - "libc", -] - -[[package]] -name = "machine-uid" -version = "0.3.0" -source = "git+https://github.com/rustdesk-org/machine-uid#381ff579c1dc3a6c54db9dfec47c44bcb0246542" -dependencies = [ - "bindgen 0.59.2", - "cc", - "winreg 0.11.0", -] - -[[package]] -name = "magnum-opus" -version = "0.4.0" -source = "git+https://github.com/rustdesk-org/magnum-opus#5cd2bf989c148662fa3a2d9d539a71d71fd1d256" -dependencies = [ - "bindgen 0.59.2", - "pkg-config", - "target_build_utils", -] - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if 1.0.0", - "digest", -] - -[[package]] -name = "md5" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" - -[[package]] -name = "memalloc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df39d232f5c40b0891c10216992c2f250c054105cb1e56f0fc9032db6203ecc1" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memmap2" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg 1.3.0", -] - -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg 1.3.0", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg 1.3.0", -] - -[[package]] -name = "metal" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e198a0ee42bdbe9ef2c09d0b9426f3b2b47d90d93a4a9b0395c4cea605e92dc0" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa 0.20.2", - "core-graphics 0.19.2", - "foreign-types 0.3.2", - "log", - "objc", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", - "simd-adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "mozjpeg" -version = "0.10.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55571bce4f12d80ceb4296526e7614f796df72daaaac85f265ab732fa47b7bc9" -dependencies = [ - "arrayvec", - "bytemuck", - "libc", - "mozjpeg-sys", - "rgb", -] - -[[package]] -name = "mozjpeg-sys" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad3626d7942d5b56cc6d47b1c59724c0a976b786fca059c5aaa904aef6324d55" -dependencies = [ - "cc", - "dunce", - "libc", - "nasm-rs", -] - -[[package]] -name = "muda" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" -dependencies = [ - "crossbeam-channel", - "dpi", - "gtk", - "keyboard-types", - "libxdo", - "objc2 0.6.4", - "objc2-app-kit 0.3.2", - "objc2-core-foundation", - "objc2-foundation 0.3.2", - "once_cell", - "png 0.17.13", - "thiserror 2.0.17", - "windows-sys 0.60.2", -] - -[[package]] -name = "muldiv" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0419348c027fa7be448d2ae7ea0e4e04c2334c31dc4e74ab29f00a2a7ca69204" - -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "nasm-rs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12fcfa1bd49e0342ec1d07ed2be83b59963e7acbeb9310e1bb2c07b69dadd959" -dependencies = [ - "jobserver", -] - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework 2.10.0", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "native-windows-gui" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7003a669f68deb6b7c57d74fff4f8e533c44a3f0b297492440ef4ff5a28454" -dependencies = [ - "bitflags 1.3.2", - "lazy_static", - "winapi 0.3.9", - "winapi-build", -] - -[[package]] -name = "ndk" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" -dependencies = [ - "bitflags 1.3.2", - "jni-sys", - "ndk-sys 0.4.1+23.1.7779620", - "num_enum 0.5.11", - "raw-window-handle 0.5.2", - "thiserror 1.0.61", -] - -[[package]] -name = "ndk" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" -dependencies = [ - "bitflags 2.9.1", - "jni-sys", - "log", - "ndk-sys 0.5.0+25.2.9519653", - "num_enum 0.7.2", - "thiserror 1.0.61", -] - -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.9.1", - "jni-sys", - "log", - "ndk-sys 0.6.0+11769913", - "num_enum 0.7.2", - "raw-window-handle 0.6.2", - "thiserror 1.0.61", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.4.1+23.1.7779620" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "ndk-sys" -version = "0.5.0+25.2.9519653" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "netlink-packet-core" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e5cf0b54effda4b91615c40ff0fd12d0d4c9a6e0f5116874f03941792ff535a" -dependencies = [ - "anyhow", - "byteorder", - "libc", - "netlink-packet-utils", -] - -[[package]] -name = "netlink-packet-route" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea993e32c77d87f01236c38f572ecb6c311d592e56a06262a007fd2a6e31253c" -dependencies = [ - "anyhow", - "bitflags 1.3.2", - "byteorder", - "libc", - "netlink-packet-core", - "netlink-packet-utils", -] - -[[package]] -name = "netlink-packet-utils" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" -dependencies = [ - "anyhow", - "byteorder", - "paste", - "thiserror 1.0.61", -] - -[[package]] -name = "netlink-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416060d346fbaf1f23f9512963e3e878f1a78e707cb699ba9215761754244307" -dependencies = [ - "bytes", - "libc", - "log", -] - -[[package]] -name = "nix" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" -dependencies = [ - "bitflags 1.3.2", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" -dependencies = [ - "autocfg 1.3.0", - "bitflags 1.3.2", - "cfg-if 1.0.0", - "libc", - "memoffset 0.6.5", - "pin-utils", -] - -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", - "libc", - "memoffset 0.7.1", - "pin-utils", -] - -[[package]] -name = "nix" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" -dependencies = [ - "bitflags 2.9.1", - "cfg-if 1.0.0", - "cfg_aliases 0.1.1", - "libc", - "memoffset 0.9.1", -] - -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.9.1", - "cfg-if 1.0.0", - "cfg_aliases 0.2.1", - "libc", -] - -[[package]] -name = "nokhwa" -version = "0.10.7" -source = "git+https://github.com/rustdesk-org/nokhwa.git?branch=fix_from_raw_parts#c2f74662b6ce117f7f94301693fdfadc0b1ec91a" -dependencies = [ - "flume", - "image 0.25.1", - "nokhwa-bindings-linux", - "nokhwa-bindings-macos", - "nokhwa-bindings-windows", - "nokhwa-core", - "paste", - "thiserror 2.0.17", -] - -[[package]] -name = "nokhwa-bindings-linux" -version = "0.1.1" -source = "git+https://github.com/rustdesk-org/nokhwa.git?branch=fix_from_raw_parts#c2f74662b6ce117f7f94301693fdfadc0b1ec91a" -dependencies = [ - "nokhwa-core", - "v4l", -] - -[[package]] -name = "nokhwa-bindings-macos" -version = "0.2.2" -source = "git+https://github.com/rustdesk-org/nokhwa.git?branch=fix_from_raw_parts#c2f74662b6ce117f7f94301693fdfadc0b1ec91a" -dependencies = [ - "block", - "cocoa-foundation", - "core-foundation 0.9.4", - "core-media-sys", - "core-video-sys", - "flume", - "nokhwa-core", - "objc", - "once_cell", -] - -[[package]] -name = "nokhwa-bindings-windows" -version = "0.4.2" -source = "git+https://github.com/rustdesk-org/nokhwa.git?branch=fix_from_raw_parts#c2f74662b6ce117f7f94301693fdfadc0b1ec91a" -dependencies = [ - "dlopen", - "lazy_static", - "nokhwa-core", - "once_cell", - "windows 0.43.0", -] - -[[package]] -name = "nokhwa-core" -version = "0.1.5" -source = "git+https://github.com/rustdesk-org/nokhwa.git?branch=fix_from_raw_parts#c2f74662b6ce117f7f94301693fdfadc0b1ec91a" -dependencies = [ - "bytes", - "image 0.25.1", - "mozjpeg", - "thiserror 2.0.17", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "ntapi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi 0.3.9", -] - -[[package]] -name = "nu-ansi-term" -version = "0.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c073d3c1930d0751774acf49e66653acecb416c3a54c6ec095a9b11caddb5a68" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits 0.2.19", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits 0.2.19", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 1.0.109", -] - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits 0.2.19", -] - -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg 1.3.0", - "num-integer", - "num-traits 0.2.19", -] - -[[package]] -name = "num-traits" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" -dependencies = [ - "num-traits 0.2.19", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg 1.3.0", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.9", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - -[[package]] -name = "num_enum" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" -dependencies = [ - "num_enum_derive 0.7.2", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 1.0.109", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" -dependencies = [ - "proc-macro-crate 2.0.2", - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", - "objc_exception", -] - -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - -[[package]] -name = "objc-sys" -version = "0.2.0-beta.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.3.0-beta.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49f420f16c8814efdcd6b4258664de9d9920cbc26b6f95d034a1ca9850ccc2c" -dependencies = [ - "block2 0.2.0-alpha.6", - "objc-sys 0.2.0-beta.2", - "objc2-encode 2.0.0-pre.2", -] - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys 0.3.5", - "objc2-encode 4.1.0", -] - -[[package]] -name = "objc2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" -dependencies = [ - "objc2-encode 4.1.0", -] - -[[package]] -name = "objc2-app-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" -dependencies = [ - "bitflags 2.9.1", - "block2 0.5.1", - "libc", - "objc2 0.5.2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation 0.2.2", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.9.1", - "objc2 0.6.4", - "objc2-core-foundation", - "objc2-foundation 0.3.2", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" -dependencies = [ - "bitflags 2.9.1", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-contacts" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" -dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.9.1", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.9.1", - "dispatch2", - "objc2 0.6.4", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" -dependencies = [ - "bitflags 2.9.1", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-core-image" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" -dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-core-location" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" -dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-contacts", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-encode" -version = "2.0.0-pre.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" -dependencies = [ - "objc-sys 0.2.0-beta.2", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.9.1", - "block2 0.5.1", - "dispatch", - "libc", - "objc2 0.5.2", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.9.1", - "block2 0.6.2", - "objc2 0.6.4", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-link-presentation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" -dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.9.1", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.9.1", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-symbols" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" -dependencies = [ - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" -dependencies = [ - "bitflags 2.9.1", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-image", - "objc2-core-location", - "objc2-foundation 0.2.2", - "objc2-link-presentation", - "objc2-quartz-core", - "objc2-symbols", - "objc2-uniform-type-identifiers", - "objc2-user-notifications", -] - -[[package]] -name = "objc2-uniform-type-identifiers" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" -dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-user-notifications" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" -dependencies = [ - "bitflags 2.9.1", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - -[[package]] -name = "object" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" -dependencies = [ - "memchr", -] - -[[package]] -name = "oboe" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" -dependencies = [ - "jni", - "ndk 0.8.0", - "ndk-context", - "num-derive 0.4.2", - "num-traits 0.2.19", - "oboe-sys", -] - -[[package]] -name = "oboe-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" -dependencies = [ - "cc", -] - -[[package]] -name = "oid-registry" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" -dependencies = [ - "asn1-rs", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl" -version = "0.10.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" -dependencies = [ - "bitflags 2.9.1", - "cfg-if 1.0.0", - "foreign-types 0.3.2", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-src" -version = "300.5.3+3.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6bad8cd0233b63971e232cc9c5e83039375b8586d2312f31fda85db8f888c2" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" -dependencies = [ - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "orbclient" -version = "0.3.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" -dependencies = [ - "libredox", -] - -[[package]] -name = "ordered-multimap" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" -dependencies = [ - "dlv-list", - "hashbrown 0.12.3", -] - -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "os-version" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a8a1fed76ac765e39058ca106b6229a93c5a60292a1bd4b602ce2be11e1c020" -dependencies = [ - "anyhow", - "plist", - "uname", - "winapi 0.3.9", -] - -[[package]] -name = "os_info" -version = "3.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae99c7fa6dd38c7cafe1ec085e804f8f555a2f8659b0dbe03f1f9963a9b51092" -dependencies = [ - "log", - "serde 1.0.228", - "windows-sys 0.52.0", -] - -[[package]] -name = "os_pipe" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29d73ba8daf8fac13b0501d1abeddcfe21ba7401ada61a819144b6c2a4f32209" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "osascript" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38731fa859ef679f1aec66ca9562165926b442f298467f76f5990f431efe87dc" -dependencies = [ - "serde 1.0.228", - "serde_derive", - "serde_json 1.0.118", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "owned_ttf_parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" -dependencies = [ - "ttf-parser", -] - -[[package]] -name = "p256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2", -] - -[[package]] -name = "p384" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2", -] - -[[package]] -name = "page_size" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "pam" -version = "0.7.0" -source = "git+https://github.com/rustdesk-org/pam#7bfd25510202cd269292cbdd7c71f3977a6fd762" -dependencies = [ - "libc", - "pam-macros", - "pam-sys", - "users 0.10.0", -] - -[[package]] -name = "pam-macros" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94f3b9b97df3c6d4e51a14916639b24e02c7d15d1dba686ce9b1118277cb811" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 1.0.109", -] - -[[package]] -name = "pam-sys" -version = "1.0.0-alpha4" -source = "git+https://github.com/rustdesk-org/pam-sys?branch=fix/v1.0.0-alpha4_gnuc_va_list#3337c9bb9a9c68d7497ec8c93cad2368c26091b7" -dependencies = [ - "bindgen 0.59.2", - "libc", -] - -[[package]] -name = "pango" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" -dependencies = [ - "gio", - "glib 0.18.5", - "libc", - "once_cell", - "pango-sys", -] - -[[package]] -name = "pango-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" -dependencies = [ - "glib-sys 0.18.1", - "gobject-sys 0.18.0", - "libc", - "system-deps 6.2.2", -] - -[[package]] -name = "parity-tokio-ipc" -version = "0.7.3-5" -source = "git+https://github.com/rustdesk-org/parity-tokio-ipc#c8c8bbcbabf9be1201c53afb0269b92b9b02d291" -dependencies = [ - "futures", - "libc", - "log", - "rand 0.8.5", - "tokio", - "winapi 0.3.9", -] - -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall 0.5.2", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest", - "hmac", - "password-hash", - "sha2", -] - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "pem" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" -dependencies = [ - "base64 0.22.1", - "serde_core", -] - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "phf" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" -dependencies = [ - "phf_shared 0.7.24", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_codegen" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" -dependencies = [ - "phf_generator 0.7.24", - "phf_shared 0.7.24", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_generator" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" -dependencies = [ - "phf_shared 0.7.24", - "rand 0.6.5", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.5", -] - -[[package]] -name = "phf_shared" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" -dependencies = [ - "siphasher 0.2.3", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher 1.0.1", -] - -[[package]] -name = "piet" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e381186490a3e2017a506d62b759ea8eaf4be14666b13ed53973e8ae193451b1" -dependencies = [ - "kurbo", - "unic-bidi", -] - -[[package]] -name = "piet-coregraphics" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a819b41d2ddb1d8abf3e45e49422f866cba281b4abb5e2fb948bba06e2c3d3f7" -dependencies = [ - "associative-cache", - "core-foundation 0.9.4", - "core-foundation-sys 0.8.7", - "core-graphics 0.22.3", - "core-text", - "foreign-types 0.3.2", - "piet", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" -dependencies = [ - "atomic-waker", - "fastrand 2.1.0", - "futures-io", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "plist" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9d34169e64b3c7a80c8621a48adaf44e0cf62c78a9b25dd9dd35f1881a17cf9" -dependencies = [ - "base64 0.21.7", - "indexmap", - "line-wrap", - "quick-xml 0.31.0", - "serde 1.0.228", - "time 0.3.36", -] - -[[package]] -name = "png" -version = "0.17.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide 0.7.4", -] - -[[package]] -name = "png" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" -dependencies = [ - "bitflags 2.9.1", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide 0.8.9", -] - -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg 1.3.0", - "bitflags 1.3.2", - "cfg-if 1.0.0", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] - -[[package]] -name = "polling" -version = "3.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" -dependencies = [ - "cfg-if 1.0.0", - "concurrent-queue", - "hermit-abi 0.4.0", - "pin-project-lite", - "rustix 0.38.34", - "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "poly1305" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" -dependencies = [ - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "polyval" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "portable-atomic" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" - -[[package]] -name = "portable-pty" -version = "0.8.1" -source = "git+https://github.com/rustdesk-org/wezterm?branch=rustdesk/pty_based_0.8.1#80174f8009f41565f0fa8c66dab90d4f9211ae16" -dependencies = [ - "anyhow", - "bitflags 1.3.2", - "downcast-rs", - "filedescriptor", - "lazy_static", - "libc", - "log", - "nix 0.25.1", - "serial", - "shared_library", - "shell-words", - "winapi 0.3.9", - "winreg 0.10.1", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "pretty-hex" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5c99d529f0d30937f6f4b8a86d988047327bb88d04d2c4afc356de74722131" - -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2 1.0.93", - "syn 2.0.98", -] - -[[package]] -name = "primal-check" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" -dependencies = [ - "num-integer", -] - -[[package]] -name = "primeorder" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve", -] - -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml 0.5.11", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" -dependencies = [ - "toml_datetime", - "toml_edit 0.20.2", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - -[[package]] -name = "proc-macro2" -version = "1.0.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "protobuf" -version = "3.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65a1d4ddae7d8b5de68153b48f6aa3bba8cb002b243dbdbc55a5afbc98f99f4" -dependencies = [ - "bytes", - "once_cell", - "protobuf-support", - "thiserror 1.0.61", -] - -[[package]] -name = "protobuf-codegen" -version = "3.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3976825c0014bbd2f3b34f0001876604fe87e0c86cd8fa54251530f1544ace" -dependencies = [ - "anyhow", - "once_cell", - "protobuf", - "protobuf-parse", - "regex", - "tempfile", - "thiserror 1.0.61", -] - -[[package]] -name = "protobuf-parse" -version = "3.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4aeaa1f2460f1d348eeaeed86aea999ce98c1bded6f089ff8514c9d9dbdc973" -dependencies = [ - "anyhow", - "indexmap", - "log", - "protobuf", - "protobuf-support", - "tempfile", - "thiserror 1.0.61", - "which", -] - -[[package]] -name = "protobuf-support" -version = "3.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e36c2f31e0a47f9280fb347ef5e461ffcd2c52dd520d8e216b52f93b0b0d7d6" -dependencies = [ - "thiserror 1.0.61", -] - -[[package]] -name = "qoi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "qrcode-generator" -version = "4.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d06cb9646c7a14096231a2474d7f21e5e8c13de090c68d13bde6157cfe7f159" -dependencies = [ - "html-escape", - "image 0.24.9", - "qrcodegen", -] - -[[package]] -name = "qrcodegen" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4339fc7a1021c9c1621d87f5e3505f2805c8c105420ba2f2a4df86814590c142" - -[[package]] -name = "quest" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556af5f5c953a2ee13f45753e581a38f9778e6551bc3ccc56d90b14628fe59d8" -dependencies = [ - "cfg-if 0.1.10", - "rpassword 2.1.0", - "tempfile", - "termios 0.3.3", - "winapi 0.3.9", -] - -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", -] - -[[package]] -name = "quick-xml" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" -dependencies = [ - "memchr", -] - -[[package]] -name = "quick-xml" -version = "0.37.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" -dependencies = [ - "memchr", -] - -[[package]] -name = "quinn" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases 0.2.1", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.1", - "rustls", - "socket2 0.5.10", - "thiserror 2.0.17", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" -dependencies = [ - "bytes", - "getrandom 0.3.2", - "lru-slab", - "rand 0.9.2", - "ring", - "rustc-hash 2.1.1", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.17", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases 0.2.1", - "libc", - "once_cell", - "socket2 0.5.10", - "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2 1.0.93", -] - -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi 0.3.9", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.2", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi 0.3.9", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi 0.3.9", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.4.2", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "raw-window-handle" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "rcgen" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" -dependencies = [ - "pem", - "ring", - "rustls-pki-types", - "time 0.3.36", - "x509-parser", - "yasna", -] - -[[package]] -name = "rdev" -version = "0.5.0-2" -source = "git+https://github.com/rustdesk-org/rdev#f9b60b1dd0f3300a1b797d7a74c116683cd232c8" -dependencies = [ - "cocoa 0.24.1", - "core-foundation 0.9.4", - "core-foundation-sys 0.8.7", - "core-graphics 0.22.3", - "dispatch", - "enum-map", - "epoll", - "inotify", - "lazy_static", - "libc", - "log", - "mio 0.8.11", - "strum 0.24.1", - "strum_macros 0.24.3", - "widestring", - "winapi 0.3.9", - "x11 2.21.0", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "realfft" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953d9f7e5cdd80963547b456251296efc2626ed4e3cbf36c869d9564e0220571" -dependencies = [ - "rustfft", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "redox_users" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" -dependencies = [ - "getrandom 0.2.15", - "libredox", - "thiserror 1.0.61", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.15", - "libredox", - "thiserror 2.0.17", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "remote_printer" -version = "0.1.0" -dependencies = [ - "hbb_common", - "winapi 0.3.9", - "windows-strings 0.3.1", -] - -[[package]] -name = "repng" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd57cd2cb5cc699b3eb4824d654e5a32f3bc013766da4966f71fe94805abbda" -dependencies = [ - "byteorder", - "flate2", -] - -[[package]] -name = "reqwest" -version = "0.12.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" -dependencies = [ - "async-compression", - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "native-tls", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "serde 1.0.228", - "serde_json 1.0.118", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tokio-util", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 1.0.4", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "rgb" -version = "0.8.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if 1.0.0", - "getrandom 0.2.15", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "ringbuf" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79abed428d1fd2a128201cec72c5f6938e2da607c6f3745f769fabea399d950a" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "roxmltree" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" - -[[package]] -name = "rpassword" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37473170aedbe66ffa3ad3726939ba677d83c646ad4fd99e5b4bc38712f45ec" -dependencies = [ - "kernel32-sys", - "libc", - "winapi 0.2.8", -] - -[[package]] -name = "rpassword" -version = "7.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" -dependencies = [ - "libc", - "rtoolbox", - "windows-sys 0.48.0", -] - -[[package]] -name = "rtcp" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d30d1c4091644431c22acf9f8be6191b56805e0e977f15ca7104b4a6d6eaec" -dependencies = [ - "bytes", - "thiserror 1.0.61", - "webrtc-util", -] - -[[package]] -name = "rtoolbox" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "rtp" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f126f38ea84c02480e32e547c1459a939052f74fb92117ac3eef23fdac6b023" -dependencies = [ - "bytes", - "memchr", - "portable-atomic", - "rand 0.9.2", - "serde 1.0.228", - "thiserror 1.0.61", - "webrtc-util", -] - -[[package]] -name = "rubato" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd70209c27d5b08f5528bdc779ea3ffb418954e28987f9f9775c6eac41003f9c" -dependencies = [ - "num-complex", - "num-integer", - "num-traits 0.2.19", - "realfft", -] - -[[package]] -name = "runas" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96d6b6c505282b007a9b009f2aa38b2fd0359b81a0430ceacc60f69ade4c6a0" -dependencies = [ - "libc", - "security-framework-sys", - "which", - "windows-sys 0.48.0", -] - -[[package]] -name = "rust-ini" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" -dependencies = [ - "cfg-if 1.0.0", - "ordered-multimap", -] - -[[package]] -name = "rust-pulsectl" -version = "0.2.12" -source = "git+https://github.com/rustdesk-org/pulsectl#aa34dde499aa912a3abc5289cc0b547bd07dd6e2" -dependencies = [ - "libpulse-binding", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustdesk" -version = "1.4.6" -dependencies = [ - "android-wakelock", - "android_logger", - "arboard", - "async-process", - "async-trait", - "bytemuck", - "bytes", - "cc", - "cfg-if 1.0.0", - "chrono", - "cidr-utils", - "clap 4.5.53", - "clipboard", - "clipboard-master", - "cocoa 0.24.1", - "core-foundation 0.9.4", - "core-graphics 0.22.3", - "cpal", - "crossbeam-queue", - "ctrlc", - "dasp", - "dbus", - "dbus-crossroads", - "default-net", - "dispatch", - "docopt", - "enigo", - "errno", - "evdev", - "flutter_rust_bridge", - "fon", - "fontdb", - "foreign-types 0.3.2", - "fruitbasket", - "gtk", - "hbb_common", - "hex", - "hound", - "image 0.24.9", - "impersonate_system", - "include_dir", - "jni", - "kcp-sys", - "keepawake", - "lazy_static", - "libpulse-binding", - "libpulse-simple-binding", - "libxdo-sys", - "mac_address", - "magnum-opus", - "nix 0.29.0", - "num_cpus", - "objc", - "objc_id", - "once_cell", - "openssl", - "os-version", - "pam", - "parity-tokio-ipc", - "percent-encoding", - "piet", - "piet-coregraphics", - "portable-pty", - "qrcode-generator", - "rdev", - "remote_printer", - "repng", - "reqwest", - "ringbuf", - "rpassword 7.3.1", - "rubato", - "runas", - "rust-pulsectl", - "samplerate", - "sciter-rs", - "scrap", - "serde 1.0.228", - "serde_derive", - "serde_json 1.0.118", - "serde_repr", - "sha2", - "shared_memory", - "shutdown_hooks", - "softbuffer", - "stunclient", - "sys-locale", - "system_shutdown", - "tao", - "tauri-winrt-notification", - "terminfo", - "termios 0.3.3", - "tiny-skia", - "totp-rs", - "tray-icon", - "ttf-parser", - "url", - "uuid", - "virtual_display", - "wallpaper", - "winapi 0.3.9", - "windows 0.61.1", - "windows-service", - "winit", - "winreg 0.11.0", - "winres", - "wol-rs", - "x11-clipboard 0.8.1", - "x11rb 0.12.0", - "zip", -] - -[[package]] -name = "rustdesk-portable-packer" -version = "1.4.6" -dependencies = [ - "brotli", - "dirs 5.0.1", - "md5", - "native-windows-gui", - "winapi 0.3.9", - "windows 0.61.1", - "winres", -] - -[[package]] -name = "rustfft" -version = "6.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43806561bc506d0c5d160643ad742e3161049ac01027b5e6d7524091fd401d86" -dependencies = [ - "num-complex", - "num-integer", - "num-traits 0.2.19", - "primal-check", - "strength_reduce", - "transpose", - "version_check", -] - -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "0.37.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustix" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys 0.11.0", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.23.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework 3.5.1", -] - -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" -dependencies = [ - "web-time", -] - -[[package]] -name = "rustls-platform-verifier" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" -dependencies = [ - "core-foundation 0.10.1", - "core-foundation-sys 0.8.7", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki", - "security-framework 3.5.1", - "security-framework-sys", - "webpki-root-certs", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" - -[[package]] -name = "rustls-webpki" -version = "0.103.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "samplerate" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e032b2b24715c4f982f483ea3abdb3c9ba444d9f63e87b2843d6f998f5ba2698" -dependencies = [ - "libsamplerate-sys", -] - -[[package]] -name = "schannel" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "sciter-rs" -version = "0.5.57" -source = "git+https://github.com/rustdesk-org/rust-sciter?branch=dyn#5322f3a755a0e6bf999fbc60d1efc35246c0f821" -dependencies = [ - "lazy_static", - "libc", - "objc", - "objc-foundation", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scrap" -version = "0.5.0" -dependencies = [ - "android_logger", - "bindgen 0.65.1", - "block", - "cfg-if 1.0.0", - "dbus", - "docopt", - "gstreamer", - "gstreamer-app", - "gstreamer-video", - "hbb_common", - "hwcodec", - "jni", - "lazy_static", - "log", - "ndk 0.7.0", - "ndk-context", - "nokhwa", - "num_cpus", - "pkg-config", - "quest", - "repng", - "serde 1.0.228", - "serde_json 1.0.118", - "target_build_utils", - "tracing", - "webm", - "winapi 0.3.9", - "zbus", -] - -[[package]] -name = "sctk-adwaita" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" -dependencies = [ - "ab_glyph", - "log", - "memmap2", - "smithay-client-toolkit 0.19.2", - "tiny-skia", -] - -[[package]] -name = "sdp" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c374dceda16965d541c8800ce9cc4e1c14acfd661ddf7952feeedc3411e5c6" -dependencies = [ - "rand 0.9.2", - "substring", - "thiserror 1.0.61", - "url", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-foundation-sys 0.8.7", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" -dependencies = [ - "bitflags 2.9.1", - "core-foundation 0.10.1", - "core-foundation-sys 0.8.7", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" -dependencies = [ - "core-foundation-sys 0.8.7", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "serde" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b623917345a631dc9608d5194cc206b3fe6c3554cd1c75b937e55e285254af" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "serde_json" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8bcf487be7d2e15d3d543f04312de991d631cfe1b43ea0ade69e6a8a5b16a1" -dependencies = [ - "dtoa", - "itoa 0.3.4", - "num-traits 0.1.43", - "serde 0.9.15", -] - -[[package]] -name = "serde_json" -version = "1.0.118" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" -dependencies = [ - "itoa 1.0.11", - "ryu", - "serde 1.0.228", -] - -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "serde_spanned" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" -dependencies = [ - "serde 1.0.228", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa 1.0.11", - "ryu", - "serde 1.0.228", -] - -[[package]] -name = "serial" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1237a96570fc377c13baa1b88c7589ab66edced652e43ffb17088f003db3e86" -dependencies = [ - "serial-core", - "serial-unix", - "serial-windows", -] - -[[package]] -name = "serial-core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f46209b345401737ae2125fe5b19a77acce90cd53e1658cda928e4fe9a64581" -dependencies = [ - "libc", -] - -[[package]] -name = "serial-unix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f03fbca4c9d866e24a459cbca71283f545a37f8e3e002ad8c70593871453cab7" -dependencies = [ - "ioctl-rs", - "libc", - "serial-core", - "termios 0.2.2", -] - -[[package]] -name = "serial-windows" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c6d3b776267a75d31bbdfd5d36c0ca051251caafc285827052bc53bcdc8162" -dependencies = [ - "libc", - "serial-core", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest", -] - -[[package]] -name = "shadow-rs" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427f07ab5f873000cf55324882e12a88c0a7ea7025df4fc1e7e35e688877a583" -dependencies = [ - "const_format", - "git2", - "is_debug", - "time 0.3.36", - "tzdb 0.5.10", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shared_library" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" -dependencies = [ - "lazy_static", - "libc", -] - -[[package]] -name = "shared_memory" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba8593196da75d9dc4f69349682bd4c2099f8cde114257d1ef7ef1b33d1aba54" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "nix 0.23.2", - "rand 0.8.5", - "win-sys", -] - -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "shutdown_hooks" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6057adedbec913419c92996f395ba69931acbd50b7d56955394cd3f7bedbfa45" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core 0.6.4", -] - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "siphasher" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg 1.3.0", -] - -[[package]] -name = "slotmap" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "smithay-client-toolkit" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" -dependencies = [ - "bitflags 2.9.1", - "calloop 0.13.0", - "calloop-wayland-source 0.3.0", - "cursor-icon", - "libc", - "log", - "memmap2", - "rustix 0.38.34", - "thiserror 1.0.61", - "wayland-backend", - "wayland-client", - "wayland-csd-frame", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-wlr", - "wayland-scanner", - "xkeysym", -] - -[[package]] -name = "smithay-client-toolkit" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" -dependencies = [ - "bitflags 2.9.1", - "calloop 0.14.3", - "calloop-wayland-source 0.4.1", - "cursor-icon", - "libc", - "log", - "memmap2", - "rustix 1.1.2", - "thiserror 2.0.17", - "wayland-backend", - "wayland-client", - "wayland-csd-frame", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-experimental", - "wayland-protocols-misc", - "wayland-protocols-wlr", - "wayland-scanner", - "xkeysym", -] - -[[package]] -name = "smol_str" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" -dependencies = [ - "serde 1.0.228", -] - -[[package]] -name = "socket2" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "sodiumoxide" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e26be3acb6c2d9a7aac28482586a7856436af4cfe7100031d219de2d2ecb0028" -dependencies = [ - "ed25519", - "libc", - "libsodium-sys", - "serde 1.0.228", -] - -[[package]] -name = "softbuffer" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d623bff5d06f60d738990980d782c8c866997d9194cfe79ecad00aa2f76826dd" -dependencies = [ - "as-raw-xcb-connection", - "bytemuck", - "cfg_aliases 0.2.1", - "core-graphics 0.23.2", - "drm", - "fastrand 2.1.0", - "foreign-types 0.5.0", - "js-sys", - "log", - "memmap2", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "objc2-quartz-core", - "raw-window-handle 0.6.2", - "redox_syscall 0.5.2", - "rustix 0.38.34", - "tiny-xlib", - "wasm-bindgen", - "wayland-backend", - "wayland-client", - "wayland-sys", - "web-sys", - "windows-sys 0.52.0", - "x11rb 0.13.1", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strength_reduce" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" - -[[package]] -name = "strict-num" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b" - -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" - -[[package]] -name = "strum_macros" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" -dependencies = [ - "heck 0.3.3", - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 1.0.109", -] - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.93", - "quote 1.0.36", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "stun" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a512c5d501e3e3b5a4bb3e8e31462d56d54a66b95a28b8596e14422bf21c32b" -dependencies = [ - "base64 0.22.1", - "crc", - "lazy_static", - "md-5", - "rand 0.9.2", - "ring", - "subtle", - "thiserror 1.0.61", - "tokio", - "url", - "webrtc-util", -] - -[[package]] -name = "stun_codec" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feed9dafe0bda84f2b6ca3ce726b0a1f1ac2e8b63c6ecfb89b08b32313247b5b" -dependencies = [ - "bytecodec", - "byteorder", - "crc", - "hmac", - "md5", - "sha1", - "trackable 1.3.0", -] - -[[package]] -name = "stunclient" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c969a14b4a4c09c320416ebf880b3d5a81ad1612065741eb10521951c06c8991" -dependencies = [ - "bytecodec", - "rand 0.8.5", - "stun_codec", - "tokio", -] - -[[package]] -name = "substring" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" -dependencies = [ - "autocfg 1.3.0", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "sys-locale" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0" -dependencies = [ - "libc", -] - -[[package]] -name = "sysinfo" -version = "0.29.10" -source = "git+https://github.com/rustdesk-org/sysinfo?branch=rlim_max#90b1705d909a4902dbbbdea37ee64db17841077d" -dependencies = [ - "cfg-if 1.0.0", - "core-foundation-sys 0.8.7", - "libc", - "ntapi", - "once_cell", - "rayon", - "windows 0.51.1", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys 0.8.7", - "libc", -] - -[[package]] -name = "system-deps" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3ecc17269a19353b3558b313bba738b25d82993e30d62a18406a24aba4649b" -dependencies = [ - "heck 0.3.3", - "pkg-config", - "strum 0.18.0", - "strum_macros 0.18.0", - "thiserror 1.0.61", - "toml 0.5.11", - "version-compare 0.0.10", -] - -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml 0.8.2", - "version-compare 0.2.0", -] - -[[package]] -name = "system_shutdown" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7567f71160af5e9abfb4f5a21532cf2174cefe91ac5c336419295685a695cc66" -dependencies = [ - "windows 0.44.0", - "zbus", -] - -[[package]] -name = "tao" -version = "0.25.0" -source = "git+https://github.com/rustdesk-org/tao?branch=dev#288c219cb0527e509590c2b2d8e7072aa9feb2d3" -dependencies = [ - "bitflags 1.3.2", - "cc", - "cocoa 0.25.0", - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "crossbeam-channel", - "dispatch", - "gdkwayland-sys", - "gdkx11-sys", - "gtk", - "image 0.24.9", - "instant", - "jni", - "lazy_static", - "libc", - "log", - "ndk 0.7.0", - "ndk-context", - "ndk-sys 0.4.1+23.1.7779620", - "objc", - "once_cell", - "parking_lot", - "png 0.17.13", - "raw-window-handle 0.6.2", - "scopeguard", - "tao-macros", - "unicode-segmentation", - "url", - "windows 0.52.0", - "windows-implement 0.52.0", - "windows-version", - "x11-dl", - "zbus", -] - -[[package]] -name = "tao-macros" -version = "0.1.2" -source = "git+https://github.com/rustdesk-org/tao?branch=dev#288c219cb0527e509590c2b2d8e7072aa9feb2d3" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 1.0.109", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "target-lexicon" -version = "0.12.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" - -[[package]] -name = "target_build_utils" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "013d134ae4a25ee744ad6129db589018558f620ddfa44043887cdd45fa08e75c" -dependencies = [ - "phf 0.7.24", - "phf_codegen 0.7.24", - "serde_json 0.9.10", -] - -[[package]] -name = "tauri-winrt-notification" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006851c9ccefa3c38a7646b8cec804bb429def3da10497bfa977179869c3e8e2" -dependencies = [ - "quick-xml 0.30.0", - "windows 0.51.1", -] - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if 1.0.0", - "fastrand 2.1.0", - "rustix 0.38.34", - "windows-sys 0.52.0", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "terminfo" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666cd3a6681775d22b200409aad3b089c5b99fb11ecdd8a204d9d62f8148498f" -dependencies = [ - "dirs 4.0.0", - "fnv", - "nom", - "phf 0.11.3", - "phf_codegen 0.11.3", -] - -[[package]] -name = "termios" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a" -dependencies = [ - "libc", -] - -[[package]] -name = "termios" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" -dependencies = [ - "libc", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "tfc" -version = "0.7.0" -source = "git+https://github.com/rustdesk-org/The-Fat-Controller?branch=history/rebase_upstream_20240722#78bb80a8e596e4c14ae57c8448f5fca75f91f2b0" -dependencies = [ - "anyhow", - "core-graphics 0.23.2", - "unicode-segmentation", - "winapi 0.3.9", - "x11 2.19.0", -] - -[[package]] -name = "thiserror" -version = "1.0.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" -dependencies = [ - "thiserror-impl 1.0.61", -] - -[[package]] -name = "thiserror" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" -dependencies = [ - "thiserror-impl 2.0.17", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if 1.0.0", - "once_cell", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "tiff" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" -dependencies = [ - "flate2", - "jpeg-decoder", - "weezl", -] - -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi 0.3.9", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa 1.0.11", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde 1.0.228", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-skia" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" -dependencies = [ - "arrayref", - "arrayvec", - "bytemuck", - "cfg-if 1.0.0", - "log", - "png 0.17.13", - "tiny-skia-path", -] - -[[package]] -name = "tiny-skia-path" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" -dependencies = [ - "arrayref", - "bytemuck", - "strict-num", -] - -[[package]] -name = "tiny-xlib" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" -dependencies = [ - "as-raw-xcb-connection", - "ctor-lite", - "libloading 0.8.4", - "pkg-config", - "tracing", -] - -[[package]] -name = "tinyvec" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio 1.0.3", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2 0.5.10", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-socks" -version = "0.5.2-3" -source = "git+https://github.com/rustdesk-org/tokio-socks#bdb9aa3de5bac41602d0742b8ef6bbc6bfebd127" -dependencies = [ - "bytes", - "either", - "futures-core", - "futures-sink", - "futures-util", - "pin-project", - "thiserror 2.0.17", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" -dependencies = [ - "futures-util", - "log", - "native-tls", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tungstenite", - "webpki-roots 0.26.9", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "futures-util", - "hashbrown 0.15.4", - "pin-project-lite", - "slab", - "tokio", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde 1.0.228", -] - -[[package]] -name = "toml" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" -dependencies = [ - "serde 1.0.228", - "serde_spanned", - "toml_datetime", - "toml_edit 0.19.15", -] - -[[package]] -name = "toml" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" -dependencies = [ - "serde 1.0.228", - "serde_spanned", - "toml_datetime", - "toml_edit 0.20.2", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde 1.0.228", -] - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap", - "serde 1.0.228", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" -dependencies = [ - "indexmap", - "serde 1.0.228", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "totp-rs" -version = "5.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4ae9724c5888c0417d2396037ed3b60665925624766416e3e342b6ba5dbd3f" -dependencies = [ - "base32", - "constant_time_eq 0.2.6", - "hmac", - "rand 0.8.5", - "sha1", - "sha2", - "url", - "urlencoding", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" -dependencies = [ - "bitflags 2.9.1", - "bytes", - "futures-util", - "http", - "http-body", - "iri-string", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "tracing-core" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "nu-ansi-term 0.46.0", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "trackable" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98abb9e7300b9ac902cc04920945a874c1973e08c310627cc4458c04b70dd32" -dependencies = [ - "trackable 1.3.0", - "trackable_derive", -] - -[[package]] -name = "trackable" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15bd114abb99ef8cee977e517c8f37aee63f184f2d08e3e6ceca092373369ae" -dependencies = [ - "trackable_derive", -] - -[[package]] -name = "trackable_derive" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebeb235c5847e2f82cfe0f07eb971d1e5f6804b18dac2ae16349cc604380f82f" -dependencies = [ - "quote 1.0.36", - "syn 1.0.109", -] - -[[package]] -name = "transpose" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" -dependencies = [ - "num-integer", - "strength_reduce", -] - -[[package]] -name = "tray-icon" -version = "0.21.3" -source = "git+https://github.com/tauri-apps/tray-icon#0a5835b0e6828e37a1f781de9c2d671ae7a939e6" -dependencies = [ - "crossbeam-channel", - "dirs 6.0.0", - "libappindicator", - "muda", - "objc2 0.6.4", - "objc2-app-kit 0.3.2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation 0.3.2", - "once_cell", - "png 0.18.1", - "thiserror 2.0.17", - "windows-sys 0.60.2", -] - -[[package]] -name = "tree_magic_mini" -version = "3.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469a727cac55b41448315cc10427c069c618ac59bb6a4480283fcd811749bdc2" -dependencies = [ - "fnv", - "home", - "memchr", - "nom", - "once_cell", - "petgraph", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" -dependencies = [ - "core_maths", -] - -[[package]] -name = "tungstenite" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" -dependencies = [ - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "native-tls", - "rand 0.9.2", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "sha1", - "thiserror 2.0.17", - "utf-8", - "webpki-roots 0.26.9", -] - -[[package]] -name = "turn" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed995882f66ab94238de77c62e5e778389698ab700afa4696f4754da8f457cb" -dependencies = [ - "async-trait", - "base64 0.22.1", - "futures", - "log", - "md-5", - "portable-atomic", - "rand 0.9.2", - "ring", - "stun", - "thiserror 1.0.61", - "tokio", - "tokio-util", - "webrtc-util", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "tz-rs" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33851b15c848fad2cf4b105c6bb66eb9512b6f6c44a4b13f57c53c73c707e2b4" -dependencies = [ - "const_fn", -] - -[[package]] -name = "tzdb" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a18ee5bde3433d683d41859650804a5ad89cad17f153a53f1e6a96e0da2d969" -dependencies = [ - "iana-time-zone", - "tz-rs", - "tzdb 0.6.1", -] - -[[package]] -name = "tzdb" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b580f6b365fa89f5767cdb619a55d534d04a4e14c2d7e5b9a31e94598687fb1" -dependencies = [ - "iana-time-zone", - "tz-rs", - "tzdb_data", -] - -[[package]] -name = "tzdb_data" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1889fdffac09d65c1d95c42d5202e9b21ad8c758f426e9fe09088817ea998d6" -dependencies = [ - "tz-rs", -] - -[[package]] -name = "uds_windows" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" -dependencies = [ - "memoffset 0.9.1", - "tempfile", - "winapi 0.3.9", -] - -[[package]] -name = "uname" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72f89f0ca32e4db1c04e2a72f5345d59796d4866a1ee0609084569f73683dc8" -dependencies = [ - "libc", -] - -[[package]] -name = "unic-bidi" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1356b759fb6a82050666f11dce4b6fe3571781f1449f3ef78074e408d468ec09" -dependencies = [ - "matches", - "unic-ucd-bidi", -] - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-ucd-bidi" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1d568b51222484e1f8209ce48caa6b430bf352962b877d592c29ab31fb53d8c" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - -[[package]] -name = "unicase" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "unicode-width" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" - -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde 1.0.228", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "users" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4227e95324a443c9fcb06e03d4d85e91aabe9a5a02aa818688b6918b6af486" -dependencies = [ - "libc", - "log", -] - -[[package]] -name = "users" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24cc0f6d6f267b73e5a2cadf007ba8f9bc39c6a6f9666f8cf25ea809a153b032" -dependencies = [ - "libc", - "log", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf16string" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b62a1e85e12d5d712bf47a85f426b73d303e2d00a90de5f3004df3596e9d216" -dependencies = [ - "byteorder", -] - -[[package]] -name = "utf8-width" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" -dependencies = [ - "getrandom 0.3.2", -] - -[[package]] -name = "v4l" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8fbfea44a46799d62c55323f3c55d06df722fbe577851d848d328a1041c3403" -dependencies = [ - "bitflags 1.3.2", - "libc", - "v4l2-sys-mit", -] - -[[package]] -name = "v4l2-sys-mit" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6779878362b9bacadc7893eac76abe69612e8837ef746573c4a5239daf11990b" -dependencies = [ - "bindgen 0.65.1", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "version-compare" -version = "0.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1" - -[[package]] -name = "version-compare" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "virtual_display" -version = "0.1.0" -dependencies = [ - "hbb_common", - "lazy_static", -] - -[[package]] -name = "waitgroup" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" -dependencies = [ - "atomic-waker", -] - -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wallpaper" -version = "3.2.0" -source = "git+https://github.com/rustdesk-org/wallpaper.rs#ce4a0cd3f58327c7cc44d15a63706fb0c022bacf" -dependencies = [ - "dirs 5.0.1", - "enquote", - "rust-ini", - "thiserror 1.0.61", - "winapi 0.3.9", - "winreg 0.11.0", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if 1.0.0", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote 1.0.36", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wayland-backend" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" -dependencies = [ - "cc", - "downcast-rs", - "rustix 1.1.2", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" -dependencies = [ - "bitflags 2.9.1", - "rustix 1.1.2", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-csd-frame" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" -dependencies = [ - "bitflags 2.9.1", - "cursor-icon", - "wayland-backend", -] - -[[package]] -name = "wayland-cursor" -version = "0.31.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef9489a8df197ebf3a8ce8a7a7f0a2320035c3743f3c1bd0bdbccf07ce64f95" -dependencies = [ - "rustix 0.38.34", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" -dependencies = [ - "bitflags 2.9.1", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-experimental" -version = "20250721.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" -dependencies = [ - "bitflags 2.9.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-misc" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfe33d551eb8bffd03ff067a8b44bb963919157841a99957151299a6307d19c" -dependencies = [ - "bitflags 2.9.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-plasma" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79f2d57c7fcc6ab4d602adba364bf59a5c24de57bd194486bf9b8360e06bfc4" -dependencies = [ - "bitflags 2.9.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-wlr" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd993de54a40a40fbe5601d9f1fbcaef0aebcc5fda447d7dc8f6dcbaae4f8953" -dependencies = [ - "bitflags 2.9.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" -dependencies = [ - "proc-macro2 1.0.93", - "quick-xml 0.37.5", - "quote 1.0.36", -] - -[[package]] -name = "wayland-sys" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" -dependencies = [ - "dlib", - "log", - "once_cell", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webm" -version = "1.1.0" -source = "git+https://github.com/rustdesk-org/rust-webm#d2c4d3ac133c7b0e4c0f656da710b48391981e64" -dependencies = [ - "webm-sys", -] - -[[package]] -name = "webm-sys" -version = "1.0.4" -source = "git+https://github.com/rustdesk-org/rust-webm#d2c4d3ac133c7b0e4c0f656da710b48391981e64" -dependencies = [ - "cc", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d651ec480de84b762e7be71e6efa7461699c19d9e2c272c8d93455f567786e" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webpki-roots" -version = "0.26.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29aad86cec885cafd03e8305fd727c418e970a521322c91688414d5b8efba16b" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webpki-roots" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webrtc" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08fd686c0920ac08f3a57eacc48e31f0e4ca1ffefba4478784606f78c14e83ad" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "dtls", - "hex", - "interceptor", - "lazy_static", - "log", - "portable-atomic", - "rand 0.9.2", - "rcgen", - "regex", - "ring", - "rtcp", - "rtp", - "sdp", - "serde 1.0.228", - "serde_json 1.0.118", - "sha2", - "smol_str", - "stun", - "thiserror 1.0.61", - "tokio", - "turn", - "unicase", - "url", - "waitgroup", - "webrtc-data", - "webrtc-ice", - "webrtc-mdns", - "webrtc-media", - "webrtc-sctp", - "webrtc-srtp", - "webrtc-util", -] - -[[package]] -name = "webrtc-data" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062a5438d63bb0756a221693d76cc0dd6119affee1dfdfe57abe3a2a8c8b3eea" -dependencies = [ - "bytes", - "log", - "portable-atomic", - "thiserror 1.0.61", - "tokio", - "webrtc-sctp", - "webrtc-util", -] - -[[package]] -name = "webrtc-ice" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cb13fd1a373e68addc4bba0c8ca058627518e54342583d024bdcbb8ae5d97d" -dependencies = [ - "arc-swap", - "async-trait", - "crc", - "log", - "portable-atomic", - "rand 0.9.2", - "serde 1.0.228", - "serde_json 1.0.118", - "stun", - "thiserror 1.0.61", - "tokio", - "turn", - "url", - "uuid", - "waitgroup", - "webrtc-mdns", - "webrtc-util", -] - -[[package]] -name = "webrtc-mdns" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17279a067e75df72ce923fdeb7f04cd808f6f5aa4910dc6bcb4fbe66b396ace" -dependencies = [ - "log", - "socket2 0.5.10", - "thiserror 1.0.61", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-media" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a84c910fec0848fd5a0d8a5651e0ddbdedaf25a7d3ae3f0b15f71ac73a1773" -dependencies = [ - "byteorder", - "bytes", - "rand 0.9.2", - "rtp", - "thiserror 1.0.61", -] - -[[package]] -name = "webrtc-sctp" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f985465467d8910c1f8ac4382cd64f83b1f6a1a75021a82b221546f6fb3b856f" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "crc", - "log", - "portable-atomic", - "rand 0.9.2", - "thiserror 1.0.61", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-srtp" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d8cdc33413f1d0192670a80ce93d17cb78d57fe3a2414be30d6f6dff121123" -dependencies = [ - "aead", - "aes", - "aes-gcm", - "byteorder", - "bytes", - "ctr", - "hmac", - "log", - "rtcp", - "rtp", - "sha1", - "subtle", - "thiserror 1.0.61", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-util" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1c0c7e0c8f280f2bbfae442701465777ac07adaf46ce0c5863cd58e13fe472a" -dependencies = [ - "async-trait", - "bitflags 1.3.2", - "bytes", - "ipnet", - "lazy_static", - "log", - "nix 0.26.4", - "portable-atomic", - "rand 0.9.2", - "thiserror 1.0.61", - "tokio", - "winapi 0.3.9", -] - -[[package]] -name = "weezl" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.34", -] - -[[package]] -name = "whoami" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" -dependencies = [ - "redox_syscall 0.5.2", - "wasite", - "web-sys", -] - -[[package]] -name = "widestring" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" - -[[package]] -name = "win-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b7b128a98c1cfa201b09eb49ba285887deb3cbe7466a98850eb1adabb452be5" -dependencies = [ - "windows 0.34.0", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "winapi-wsapoll" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eafc5f679c576995526e81635d0cf9695841736712b4e892f87abbe6fed3f28" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbedf6db9096bc2364adce0ae0aa636dcd89f3c3f2cd67947062aaf0ca2a10ec" -dependencies = [ - "windows_aarch64_msvc 0.32.0", - "windows_i686_gnu 0.32.0", - "windows_i686_msvc 0.32.0", - "windows_x86_64_gnu 0.32.0", - "windows_x86_64_msvc 0.32.0", -] - -[[package]] -name = "windows" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" -dependencies = [ - "windows_aarch64_msvc 0.34.0", - "windows_i686_gnu 0.34.0", - "windows_i686_msvc 0.34.0", - "windows_x86_64_gnu 0.34.0", - "windows_x86_64_msvc 0.34.0", -] - -[[package]] -name = "windows" -version = "0.43.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04662ed0e3e5630dfa9b26e4cb823b817f1a9addda855d973a9458c236556244" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows" -version = "0.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows" -version = "0.51.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" -dependencies = [ - "windows-core 0.51.1", - "windows-targets 0.48.5", -] - -[[package]] -name = "windows" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" -dependencies = [ - "windows-core 0.52.0", - "windows-implement 0.52.0", - "windows-interface 0.52.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows" -version = "0.54.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" -dependencies = [ - "windows-core 0.54.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows" -version = "0.61.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" -dependencies = [ - "windows-collections", - "windows-core 0.61.0", - "windows-future", - "windows-link 0.1.1", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.0", -] - -[[package]] -name = "windows-core" -version = "0.51.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.54.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" -dependencies = [ - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.61.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" -dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", - "windows-link 0.1.1", - "windows-result 0.3.2", - "windows-strings 0.4.0", -] - -[[package]] -name = "windows-future" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32" -dependencies = [ - "windows-core 0.61.0", - "windows-link 0.1.1", -] - -[[package]] -name = "windows-implement" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12168c33176773b86799be25e2a2ba07c7aab9968b37541f1094dbd7a60c8946" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "windows-interface" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8dc32e0095a7eeccebd0e3f09e9509365ecb3fc6ac4d6f5f14a3f6392942d1" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.0", - "windows-link 0.1.1", -] - -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" -dependencies = [ - "windows-link 0.1.1", -] - -[[package]] -name = "windows-service" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9db37ecb5b13762d95468a2fc6009d4b2c62801243223aabd44fca13ad13c8" -dependencies = [ - "bitflags 1.3.2", - "widestring", - "windows-sys 0.45.0", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link 0.1.1", -] - -[[package]] -name = "windows-strings" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" -dependencies = [ - "windows-link 0.1.1", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows-version" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-win" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e23e33622b3b52f948049acbec9bcc34bf6e26d74176b88941f213c75cf2dc" -dependencies = [ - "error-code", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" - -[[package]] -name = "windows_i686_gnu" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" - -[[package]] -name = "windows_i686_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winit" -version = "0.30.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a809eacf18c8eca8b6635091543f02a5a06ddf3dad846398795460e6e0ae3cc0" -dependencies = [ - "ahash 0.8.12", - "android-activity", - "atomic-waker", - "bitflags 2.9.1", - "block2 0.5.1", - "bytemuck", - "calloop 0.13.0", - "cfg_aliases 0.2.1", - "concurrent-queue", - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "cursor-icon", - "dpi", - "js-sys", - "libc", - "memmap2", - "ndk 0.9.0", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "objc2-ui-kit", - "orbclient", - "percent-encoding", - "pin-project", - "raw-window-handle 0.6.2", - "redox_syscall 0.4.1", - "rustix 0.38.34", - "sctk-adwaita", - "smithay-client-toolkit 0.19.2", - "smol_str", - "tracing", - "unicode-segmentation", - "wasm-bindgen", - "wasm-bindgen-futures", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-plasma", - "web-sys", - "web-time", - "windows-sys 0.52.0", - "x11-dl", - "x11rb 0.13.1", - "xkbcommon-dl", -] - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "winreg" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a1a57ff50e9b408431e8f97d5456f2807f8eb2a2cd79b06068fc87f8ecf189" -dependencies = [ - "cfg-if 1.0.0", - "winapi 0.3.9", -] - -[[package]] -name = "winres" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" -dependencies = [ - "toml 0.5.11", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "wl-clipboard-rs" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de22eebb1d1e2bad2d970086e96da0e12cde0b411321e5b0f7b2a1f876aa26f" -dependencies = [ - "libc", - "log", - "os_pipe", - "rustix 0.38.34", - "tempfile", - "thiserror 1.0.61", - "tree_magic_mini", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-wlr", -] - -[[package]] -name = "wol-rs" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5a8a033ef9b208ec8b5946761958ed2b2693ac49b04f647fdc013000870b8f" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "x11" -version = "2.19.0" -source = "git+https://github.com/bjornsnoen/x11-rs#c2e9bfaa7b196938f8700245564d8ac5d447786a" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "x11" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "x11-clipboard" -version = "0.8.1" -source = "git+https://github.com/clslaid/x11-clipboard?branch=feat/store-batch#5fc2e73bc01ada3681159b34cf3ea8f0d14cd904" -dependencies = [ - "x11rb 0.12.0", -] - -[[package]] -name = "x11-clipboard" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98785a09322d7446e28a13203d2cae1059a0dd3dfb32cb06d0a225f023d8286" -dependencies = [ - "libc", - "x11rb 0.13.1", -] - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - -[[package]] -name = "x11rb" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1641b26d4dec61337c35a1b1aaf9e3cba8f46f0b43636c609ab0291a648040a" -dependencies = [ - "gethostname 0.3.0", - "nix 0.26.4", - "winapi 0.3.9", - "winapi-wsapoll", - "x11rb-protocol 0.12.0", -] - -[[package]] -name = "x11rb" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" -dependencies = [ - "as-raw-xcb-connection", - "gethostname 0.4.3", - "libc", - "libloading 0.8.4", - "once_cell", - "rustix 0.38.34", - "x11rb-protocol 0.13.1", -] - -[[package]] -name = "x11rb-protocol" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d6c3f9a0fb6701fab8f6cea9b0c0bd5d6876f1f89f7fada07e558077c344bc" -dependencies = [ - "nix 0.26.4", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" - -[[package]] -name = "x25519-dalek" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" -dependencies = [ - "curve25519-dalek", - "rand_core 0.6.4", - "serde 1.0.228", - "zeroize", -] - -[[package]] -name = "x509-parser" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" -dependencies = [ - "asn1-rs", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "ring", - "rusticata-macros", - "thiserror 1.0.61", - "time 0.3.36", -] - -[[package]] -name = "xattr" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" -dependencies = [ - "libc", - "linux-raw-sys 0.4.14", - "rustix 0.38.34", -] - -[[package]] -name = "xcursor" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" - -[[package]] -name = "xdg-home" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "xkbcommon-dl" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" -dependencies = [ - "bitflags 2.9.1", - "dlib", - "log", - "once_cell", - "xkeysym", -] - -[[package]] -name = "xkeysym" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" - -[[package]] -name = "yasna" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" -dependencies = [ - "time 0.3.36", -] - -[[package]] -name = "zbus" -version = "3.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" -dependencies = [ - "async-broadcast", - "async-executor", - "async-fs", - "async-io 1.13.0", - "async-lock 2.8.0", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "byteorder", - "derivative", - "enumflags2", - "event-listener 2.5.3", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix 0.26.4", - "once_cell", - "ordered-stream", - "rand 0.8.5", - "serde 1.0.228", - "serde_repr", - "sha1", - "static_assertions", - "tracing", - "uds_windows", - "winapi 0.3.9", - "xdg-home", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "3.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.93", - "quote 1.0.36", - "regex", - "syn 1.0.109", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" -dependencies = [ - "serde 1.0.228", - "static_assertions", - "zvariant", -] - -[[package]] -name = "zerocopy" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" -dependencies = [ - "byteorder", - "zerocopy-derive 0.7.34", -] - -[[package]] -name = "zerocopy" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" -dependencies = [ - "zerocopy-derive 0.8.26", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 2.0.98", -] - -[[package]] -name = "zip" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" -dependencies = [ - "aes", - "byteorder", - "bzip2", - "constant_time_eq 0.1.5", - "crc32fast", - "crossbeam-utils", - "flate2", - "hmac", - "pbkdf2", - "sha1", - "time 0.3.36", - "zstd 0.11.2+zstd.1.5.2", -] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe 5.0.2+zstd.1.5.2", -] - -[[package]] -name = "zstd" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" -dependencies = [ - "zstd-safe 7.1.0", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-safe" -version = "7.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.11+zstd.1.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "zvariant" -version = "3.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" -dependencies = [ - "byteorder", - "enumflags2", - "libc", - "serde 1.0.228", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "3.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 1.0.109", - "zvariant_utils", -] - -[[package]] -name = "zvariant_utils" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" -dependencies = [ - "proc-macro2 1.0.93", - "quote 1.0.36", - "syn 1.0.109", -] diff --git a/shelled/rustdesk-as-ref/Cargo.toml b/shelled/rustdesk-as-ref/Cargo.toml deleted file mode 100644 index 3961e9d..0000000 --- a/shelled/rustdesk-as-ref/Cargo.toml +++ /dev/null @@ -1,247 +0,0 @@ -[package] -name = "rustdesk" -version = "1.4.6" -authors = ["rustdesk "] -edition = "2021" -build= "build.rs" -description = "RustDesk Remote Desktop" -default-run = "rustdesk" -rust-version = "1.75" - -[lib] -name = "librustdesk" -crate-type = ["cdylib", "staticlib", "rlib"] - -[[bin]] -name = "naming" -path = "src/naming.rs" - -[[bin]] -name = "service" -path = "src/service.rs" - -[features] -inline = [] -cli = [] -use_samplerate = ["samplerate"] -use_rubato = ["rubato"] -use_dasp = ["dasp"] -flutter = ["flutter_rust_bridge"] -default = ["use_dasp"] -hwcodec = ["scrap/hwcodec"] -vram = ["scrap/vram"] -mediacodec = ["scrap/mediacodec"] -plugin_framework = [] -linux-pkg-config = ["magnum-opus/linux-pkg-config", "scrap/linux-pkg-config"] -unix-file-copy-paste = [ - "dep:x11-clipboard", - "dep:x11rb", - "dep:percent-encoding", - "dep:once_cell", - "clipboard/unix-file-copy-paste", -] -screencapturekit = ["cpal/screencapturekit"] - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -async-trait = "0.1" -scrap = { path = "libs/scrap", features = ["wayland"] } -hbb_common = { path = "libs/hbb_common" } -serde_derive = "1.0" -serde = "1.0" -serde_json = "1.0" -serde_repr = "0.1" -cfg-if = "1.0" -lazy_static = "1.4" -sha2 = "0.10" -repng = "0.2" -parity-tokio-ipc = { git = "https://github.com/rustdesk-org/parity-tokio-ipc" } -magnum-opus = { git = "https://github.com/rustdesk-org/magnum-opus" } -dasp = { version = "0.11", features = ["signal", "interpolate-linear", "interpolate"], optional = true } -rubato = { version = "0.12", optional = true } -samplerate = { version = "0.2", optional = true } -uuid = { version = "1.3", features = ["v4"] } -clap = "4.2" -rpassword = "7.2" -num_cpus = "1.15" -bytes = { version = "1.4", features = ["serde"] } -default-net = "0.14" -wol-rs = "1.0" -flutter_rust_bridge = { version = "=1.80", features = ["uuid"], optional = true} -errno = "0.3" -rdev = { git = "https://github.com/rustdesk-org/rdev" } -url = { version = "2.3", features = ["serde"] } -crossbeam-queue = "0.3" -hex = "0.4" -chrono = "0.4" -cidr-utils = "0.5" -fon = "0.6" -zip = "0.6" -shutdown_hooks = "0.1" -totp-rs = { version = "5.4", default-features = false, features = ["gen_secret", "otpauth"] } -stunclient = "0.4" -kcp-sys= { git = "https://github.com/rustdesk-org/kcp-sys"} -reqwest = { version = "0.12", features = ["blocking", "socks", "json", "native-tls", "rustls-tls", "rustls-tls-native-roots", "gzip"], default-features=false } - -[target.'cfg(not(target_os = "linux"))'.dependencies] -# https://github.com/rustdesk/rustdesk/discussions/10197, not use cpal on linux -cpal = { git = "https://github.com/rustdesk-org/cpal", branch = "osx-screencapturekit" } -ringbuf = "0.3" - -[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] -mac_address = "1.1" -sciter-rs = { git = "https://github.com/rustdesk-org/rust-sciter", branch = "dyn" } -sys-locale = "0.3" -enigo = { path = "libs/enigo", features = [ "with_serde" ] } -clipboard = { path = "libs/clipboard" } -ctrlc = "3.2" -# arboard = { version = "3.4", features = ["wayland-data-control"] } -arboard = { git = "https://github.com/rustdesk-org/arboard", features = ["wayland-data-control"] } -clipboard-master = { git = "https://github.com/rustdesk-org/clipboard-master" } -portable-pty = { git = "https://github.com/rustdesk-org/wezterm", branch = "rustdesk/pty_based_0.8.1", package = "portable-pty" } - -system_shutdown = "4.0" -qrcode-generator = "4.1" - -[target.'cfg(target_os = "windows")'.dependencies] -winapi = { version = "0.3", features = [ - "winuser", - "wincrypt", - "shellscalingapi", - "pdh", - "synchapi", - "memoryapi", - "shellapi", - "devguid", - "setupapi", - "cguid", - "cfgmgr32", - "ioapiset", - "winspool", -] } -windows = { version = "0.61", features = [ - "Win32", - "Win32_Foundation", - "Win32_Security", - "Win32_Security_Authorization", - "Win32_Storage_FileSystem", - "Win32_System", - "Win32_System_Diagnostics", - "Win32_System_Diagnostics_ToolHelp", - "Win32_System_Environment", - "Win32_System_IO", - "Win32_System_Memory", - "Win32_System_Pipes", - "Win32_System_Threading", - "Win32_UI_Shell", -] } -winreg = "0.11" -windows-service = "0.6" -virtual_display = { path = "libs/virtual_display" } -remote_printer = { path = "libs/remote_printer" } -impersonate_system = { git = "https://github.com/rustdesk-org/impersonate-system" } -shared_memory = "0.12" -tauri-winrt-notification = "0.1" -runas = "1.2" - -[target.'cfg(target_os = "macos")'.dependencies] -objc = "0.2" -cocoa = "0.24" -dispatch = "0.2" -core-foundation = "0.9" -core-graphics = "0.22" -include_dir = "0.7" -fruitbasket = "0.10" -objc_id = "0.1" -# If we use piet "0.7" here, we must also update core-graphics to "0.24". -piet = "0.6" -piet-coregraphics = "0.6" -foreign-types = "0.3" - -[target.'cfg(any(target_os = "macos", target_os = "linux", target_os = "windows"))'.dependencies] -tray-icon = { git = "https://github.com/tauri-apps/tray-icon", version = "0.21.3" } -tao = { git = "https://github.com/rustdesk-org/tao", branch = "dev" } -image = "0.24" - -[target.'cfg(any(target_os = "macos", target_os = "linux"))'.dependencies] -keepawake = { git = "https://github.com/rustdesk-org/keepawake-rs" } - -[target.'cfg(any(target_os = "windows", target_os = "linux"))'.dependencies] -wallpaper = { git = "https://github.com/rustdesk-org/wallpaper.rs" } -tiny-skia = "0.11" -softbuffer = "0.4" -fontdb = "0.23" -bytemuck = "1.23" -ttf-parser = "0.25" - -[target.'cfg(target_os = "linux")'.dependencies] -libxdo-sys = "0.11" -psimple = { package = "libpulse-simple-binding", version = "2.27" } -pulse = { package = "libpulse-binding", version = "2.27" } -rust-pulsectl = { git = "https://github.com/rustdesk-org/pulsectl" } -async-process = "1.7" -evdev = { git="https://github.com/rustdesk-org/evdev" } -dbus = "0.9" -dbus-crossroads = "0.5" -pam = { git="https://github.com/rustdesk-org/pam" } -x11-clipboard = {git="https://github.com/clslaid/x11-clipboard", branch = "feat/store-batch", optional = true} -x11rb = {version = "0.12", features = ["all-extensions"], optional = true} -percent-encoding = {version = "2.3", optional = true} -once_cell = {version = "1.18", optional = true} -nix = { version = "0.29", features = ["term", "process"]} -gtk = "0.18" -termios = "0.3" -terminfo = "0.8" -winit = "0.30" - -[target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] -openssl = { version = "0.10", features = ["vendored"] } - -[target.'cfg(target_os = "android")'.dependencies] -android_logger = "0.13" -jni = "0.21" -android-wakelock = { git = "https://github.com/rustdesk-org/android-wakelock" } - -[workspace] -members = ["libs/scrap", "libs/hbb_common", "libs/enigo", "libs/clipboard", "libs/virtual_display", "libs/virtual_display/dylib", "libs/portable", "libs/remote_printer"] -exclude = ["vdi/host", "examples/custom_plugin"] - -# Patch libxdo-sys to use a stub implementation that doesn't require libxdo -# This allows building and running on systems without libxdo installed (e.g., Wayland-only) -[patch.crates-io] -libxdo-sys = { path = "libs/libxdo-sys-stub" } - -[package.metadata.winres] -LegalCopyright = "Copyright © 2025 Purslane Ltd. All rights reserved." -ProductName = "RustDesk" -FileDescription = "RustDesk Remote Desktop" -OriginalFilename = "rustdesk.exe" - -[target.'cfg(target_os="windows")'.build-dependencies] -winres = "0.1" -winapi = { version = "0.3", features = [ "winnt", "pdh", "synchapi" ] } - -[build-dependencies] -cc = "1.0" -hbb_common = { path = "libs/hbb_common" } -os-version = "0.2" - -[dev-dependencies] -hound = "3.5" -docopt = "1.1" - -[package.metadata.bundle] -name = "RustDesk" -identifier = "com.carriez.rustdesk" -icon = ["res/32x32.png", "res/128x128.png", "res/128x128@2x.png"] -osx_minimum_system_version = "10.14" - -#https://github.com/johnthagen/min-sized-rust -[profile.release] -lto = true -codegen-units = 1 -panic = 'abort' -strip = true -#opt-level = 'z' # only have smaller size after strip -rpath = true diff --git a/shelled/rustdesk-as-ref/Dockerfile b/shelled/rustdesk-as-ref/Dockerfile deleted file mode 100644 index f0e4e4a..0000000 --- a/shelled/rustdesk-as-ref/Dockerfile +++ /dev/null @@ -1,64 +0,0 @@ -FROM debian:bullseye-slim - -WORKDIR / -ARG DEBIAN_FRONTEND=noninteractive -ENV VCPKG_FORCE_SYSTEM_BINARIES=1 -RUN apt update -y && \ - apt install --yes --no-install-recommends \ - g++ \ - gcc \ - git \ - curl \ - nasm \ - yasm \ - libgtk-3-dev \ - clang \ - libxcb-randr0-dev \ - libxdo-dev \ - libxfixes-dev \ - libxcb-shape0-dev \ - libxcb-xfixes0-dev \ - libasound2-dev \ - libpam0g-dev \ - libpulse-dev \ - make \ - wget \ - libssl-dev \ - unzip \ - zip \ - sudo \ - libgstreamer1.0-dev \ - libgstreamer-plugins-base1.0-dev \ - ca-certificates \ - ninja-build && \ - rm -rf /var/lib/apt/lists/* - -RUN wget https://github.com/Kitware/CMake/releases/download/v3.30.6/cmake-3.30.6.tar.gz --no-check-certificate && \ - tar xzf cmake-3.30.6.tar.gz && \ - cd cmake-3.30.6 && \ - ./configure --prefix=/usr/local && \ - make && \ - make install - -RUN git clone --branch 2023.04.15 --depth=1 https://github.com/microsoft/vcpkg && \ - /vcpkg/bootstrap-vcpkg.sh -disableMetrics && \ - /vcpkg/vcpkg --disable-metrics install libvpx libyuv opus aom - -RUN groupadd -r user && \ - useradd -r -g user user --home /home/user && \ - mkdir -p /home/user/rustdesk && \ - chown -R user: /home/user && \ - echo "user ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/user - -WORKDIR /home/user -RUN curl -LO https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so - -USER user -RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > rustup.sh && \ - chmod +x rustup.sh && \ - ./rustup.sh -y - -USER root -ENV HOME=/home/user -COPY ./entrypoint.sh / -ENTRYPOINT ["/entrypoint.sh"] diff --git a/shelled/rustdesk-as-ref/LICENCE b/shelled/rustdesk-as-ref/LICENCE deleted file mode 100644 index 0ad25db..0000000 --- a/shelled/rustdesk-as-ref/LICENCE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/shelled/rustdesk-as-ref/README.md b/shelled/rustdesk-as-ref/README.md deleted file mode 100644 index ae5c8d3..0000000 --- a/shelled/rustdesk-as-ref/README.md +++ /dev/null @@ -1,182 +0,0 @@ -

- RustDesk - Your remote desktop
- Build • - Docker • - Structure • - Snapshot
- [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Dansk] | [Ελληνικά] | [Türkçe] | [Norsk] | [Română]
- We need your help to translate this README, RustDesk UI and RustDesk Doc to your native language -

- -> [!Caution] -> **Misuse Disclaimer:**
-> The developers of RustDesk do not condone or support any unethical or illegal use of this software. Misuse, such as unauthorized access, control or invasion of privacy, is strictly against our guidelines. The authors are not responsible for any misuse of the application. - - -Chat with us: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Advanced%20Features-blue)](https://rustdesk.com/pricing.html) - -Yet another remote desktop solution, written in Rust. Works out of the box with no configuration required. You have full control of your data, with no concerns about security. You can use our rendezvous/relay server, [set up your own](https://rustdesk.com/server), or [write your own rendezvous/relay server](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk welcomes contribution from everyone. See [CONTRIBUTING.md](docs/CONTRIBUTING.md) for help getting started. - -[**FAQ**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**BINARY DOWNLOAD**](https://github.com/rustdesk/rustdesk/releases) - -[**NIGHTLY BUILD**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) -[Get it on Flathub](https://flathub.org/apps/com.rustdesk.RustDesk) - -## Dependencies - -Desktop versions use Flutter or Sciter (deprecated) for GUI, this tutorial is for Sciter only, since it is easier and more friendly to start. Check out our [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml) for building Flutter version. - -Please download Sciter dynamic library yourself. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Raw Steps to build - -- Prepare your Rust development env and C++ build env - -- Install [vcpkg](https://github.com/microsoft/vcpkg), and set `VCPKG_ROOT` env variable correctly - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/macOS: vcpkg install libvpx libyuv opus aom - -- run `cargo run` - -## [Build](https://rustdesk.com/docs/en/dev/build/) - -## How to Build on Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libpam0g-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel pam-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel pam-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Install vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Fix libvpx (For Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Build - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone --recurse-submodules https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## How to build with Docker - -Begin by cloning the repository and building the Docker container: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -git submodule update --init --recursive -docker build -t "rustdesk-builder" . -``` - -Then, each time you need to build the application, run the following command: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Note that the first build may take longer before dependencies are cached, subsequent builds will be faster. Additionally, if you need to specify different arguments to the build command, you may do so at the end of the command in the `` position. For instance, if you wanted to build an optimized release version, you would run the command above followed by `--release`. The resulting executable will be available in the target folder on your system, and can be run with: - -```sh -target/debug/rustdesk -``` - -Or, if you're running a release executable: - -```sh -target/release/rustdesk -``` - -Please ensure that you run these commands from the root of the RustDesk repository, or the application may not find the required resources. Also note that other cargo subcommands such as `install` or `run` are not currently supported via this method as they would install or run the program inside the container instead of the host. - -## File Structure - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video codec, config, tcp/udp wrapper, protobuf, fs functions for file transfer, and some other utility functions -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: screen capture -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: platform specific keyboard/mouse control -- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: file copy and paste implementation for Windows, Linux, macOS. -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: obsolete Sciter UI (deprecated) -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: audio/clipboard/input/video services, and network connections -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: start a peer connection -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Communicate with [rustdesk-server](https://github.com/rustdesk/rustdesk-server), wait for remote direct (TCP hole punching) or relayed connection -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: platform specific code -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: Flutter code for desktop and mobile -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/v1/js)**: JavaScript for Flutter web client - -## Screenshots - -![Connection Manager](https://github.com/rustdesk/rustdesk/assets/28412477/db82d4e7-c4bc-4823-8e6f-6af7eadf7651) - -![Connected to a Windows PC](https://github.com/rustdesk/rustdesk/assets/28412477/9baa91e9-3362-4d06-aa1a-7518edcbd7ea) - -![File Transfer](https://github.com/rustdesk/rustdesk/assets/28412477/39511ad3-aa9a-4f8c-8947-1cce286a46ad) - -![TCP Tunneling](https://github.com/rustdesk/rustdesk/assets/28412477/78e8708f-e87e-4570-8373-1360033ea6c5) - diff --git a/shelled/rustdesk-as-ref/appimage/AppImageBuilder-aarch64.yml b/shelled/rustdesk-as-ref/appimage/AppImageBuilder-aarch64.yml deleted file mode 100644 index 64d6c2c..0000000 --- a/shelled/rustdesk-as-ref/appimage/AppImageBuilder-aarch64.yml +++ /dev/null @@ -1,102 +0,0 @@ -# appimage-builder recipe see https://appimage-builder.readthedocs.io for details -version: 1 -script: - - rm -rf ./AppDir || true - - bsdtar -zxvf rustdesk.deb - - tar -xvf ./data.tar.xz - - mkdir ./AppDir - - mv ./usr ./AppDir/usr - # 32x32 icon - - for i in {32,64,128}; do mkdir -p ./AppDir/usr/share/icons/hicolor/$i\x$i/apps/; cp ../res/$i\x$i.png ./AppDir/usr/share/icons/hicolor/$i\x$i/apps/rustdesk.png; done - - mkdir -p ./AppDir/usr/share/icons/hicolor/scalable/apps/; cp ../res/scalable.svg ./AppDir/usr/share/icons/hicolor/scalable/apps/rustdesk.svg - # desktop file - # - sed -i "s/Icon=\/usr\/share\/rustdesk\/files\/rustdesk.png/Icon=rustdesk/g" ./AppDir/usr/share/applications/rustdesk.desktop - - rm -rf ./AppDir/usr/share/applications -AppDir: - path: ./AppDir - app_info: - id: rustdesk - name: rustdesk - icon: rustdesk - version: 1.4.6 - exec: usr/share/rustdesk/rustdesk - exec_args: $@ - apt: - arch: - - arm64 - allow_unauthenticated: true - sources: - - sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal main restricted universe multiverse - key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32' - - sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal-updates main restricted universe multiverse - key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32' - - sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal-backports main restricted - universe multiverse - key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32' - - sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ focal-security main restricted - universe multiverse - key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32' - include: - - libc6:arm64 - - libgtk-3-0 - - libxcb-randr0 - - libxdo3 - - libxfixes3 - - libxcb-shape0 - - libxcb-xfixes0 - - libasound2 - - libsystemd0 - - curl - - libva2 - - libva-drm2 - - libva-x11-2 - - libgstreamer-plugins-base1.0-0 - - gstreamer1.0-pipewire - - libwayland-client0 - - libwayland-cursor0 - - libwayland-egl1 - - libpulse0 - - packagekit-gtk3-module - - libcanberra-gtk3-module - - libpam0g - - libdrm2 - exclude: - - humanity-icon-theme - - hicolor-icon-theme - - adwaita-icon-theme - - ubuntu-mono - files: - include: [] - exclude: - - usr/share/man - - usr/share/doc/*/README.* - - usr/share/doc/*/changelog.* - - usr/share/doc/*/NEWS.* - - usr/share/doc/*/TODO.* - runtime: - env: - GIO_MODULE_DIR: /lib64/gio/modules:/usr/lib/aarch64-linux-gnu/gio/modules:$APPDIR/usr/lib/aarch64-linux-gnu/gio/modules - GDK_BACKEND: x11 - APPDIR_LIBRARY_PATH: /lib64:/usr/lib/aarch64-linux-gnu:$APPDIR/lib/aarch64-linux-gnu:$APPDIR/lib/aarch64-linux-gnu/security:$APPDIR/lib/systemd:$APPDIR/usr/lib/aarch64-linux-gnu:$APPDIR/usr/lib/aarch64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders:$APPDIR/usr/lib/aarch64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/aarch64-linux-gnu/gtk-3.0/3.0.0/immodules:$APPDIR/usr/lib/aarch64-linux-gnu/gtk-3.0/3.0.0/printbackends:$APPDIR/usr/lib/aarch64-linux-gnu/krb5/plugins/preauth:$APPDIR/usr/lib/aarch64-linux-gnu/libcanberra-0.30:$APPDIR/usr/lib/aarch64-linux-gnu/pulseaudio:$APPDIR/usr/lib/aarch64-linux-gnu/sasl2:$APPDIR/usr/lib/aarch64-linux-gnu/vdpau:$APPDIR/usr/share/rustdesk/lib:$APPDIR/lib/aarch64 - GST_PLUGIN_PATH: /lib64/gstreamer-1.0:/usr/lib/aarch64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/aarch64-linux-gnu/gstreamer-1.0 - GST_PLUGIN_SYSTEM_PATH: /lib64/gstreamer-1.0:/usr/lib/aarch64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/aarch64-linux-gnu/gstreamer-1.0 - test: - fedora-30: - image: appimagecrafters/tests-env:fedora-30 - command: ./AppRun - debian-stable: - image: appimagecrafters/tests-env:debian-stable - command: ./AppRun - archlinux-latest: - image: appimagecrafters/tests-env:archlinux-latest - command: ./AppRun - centos-7: - image: appimagecrafters/tests-env:centos-7 - command: ./AppRun - ubuntu-xenial: - image: appimagecrafters/tests-env:ubuntu-xenial - command: ./AppRun -AppImage: - arch: aarch64 - update-information: guess - comp: gzip diff --git a/shelled/rustdesk-as-ref/appimage/AppImageBuilder-x86_64.yml b/shelled/rustdesk-as-ref/appimage/AppImageBuilder-x86_64.yml deleted file mode 100644 index 933673c..0000000 --- a/shelled/rustdesk-as-ref/appimage/AppImageBuilder-x86_64.yml +++ /dev/null @@ -1,105 +0,0 @@ -# appimage-builder recipe see https://appimage-builder.readthedocs.io for details -version: 1 -script: - - rm -rf ./AppDir || true - - bsdtar -zxvf rustdesk.deb - - tar -xvf ./data.tar.xz - - mkdir ./AppDir - - mv ./usr ./AppDir/usr - # 32x32 icon - - for i in {32,64,128}; do mkdir -p ./AppDir/usr/share/icons/hicolor/$i\x$i/apps/; cp ../res/$i\x$i.png ./AppDir/usr/share/icons/hicolor/$i\x$i/apps/rustdesk.png; done - - mkdir -p ./AppDir/usr/share/icons/hicolor/scalable/apps/; cp ../res/scalable.svg ./AppDir/usr/share/icons/hicolor/scalable/apps/rustdesk.svg - # desktop file - # - sed -i "s/Icon=\/usr\/share\/rustdesk\/files\/rustdesk.png/Icon=rustdesk/g" ./AppDir/usr/share/applications/rustdesk.desktop - - rm -rf ./AppDir/usr/share/applications -AppDir: - path: ./AppDir - app_info: - id: rustdesk - name: rustdesk - icon: rustdesk - version: 1.4.6 - exec: usr/share/rustdesk/rustdesk - exec_args: $@ - apt: - arch: - - amd64 - allow_unauthenticated: true - sources: - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal main restricted - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal universe - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates universe - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal multiverse - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates multiverse - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-backports main restricted - universe multiverse - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-security main restricted - universe multiverse - include: - # https://github.com/rustdesk/rustdesk/issues/9103 - # Because of APPDIR_LIBRARY_PATH, this libc6 is not used, use LD_PRELOAD: $APPDIR/usr/lib/x86_64-linux-gnu/libc.so.6 may help, If you have time, please have a try. - # We modify APPDIR_LIBRARY_PATH to use system lib first because gst crashed if not doing so, but you can try to change it. - - libc6:amd64 - - libgtk-3-0 - - libxcb-randr0 - - libxdo3 - - libxfixes3 - - libxcb-shape0 - - libxcb-xfixes0 - - libasound2 - - libsystemd0 - - curl - - libva2 - - libva-drm2 - - libva-x11-2 - - libgstreamer-plugins-base1.0-0 - - gstreamer1.0-pipewire - - libwayland-client0 - - libwayland-cursor0 - - libwayland-egl1 - - libpulse0 - - packagekit-gtk3-module - - libcanberra-gtk3-module - - libpam0g - - libdrm2 - exclude: - - humanity-icon-theme - - hicolor-icon-theme - - adwaita-icon-theme - - ubuntu-mono - files: - include: [] - exclude: - - usr/share/man - - usr/share/doc/*/README.* - - usr/share/doc/*/changelog.* - - usr/share/doc/*/NEWS.* - - usr/share/doc/*/TODO.* - runtime: - env: - GIO_MODULE_DIR: /lib64/gio/modules:/usr/lib/x86_64-linux-gnu/gio/modules:$APPDIR/usr/lib/x86_64-linux-gnu/gio/modules - GDK_BACKEND: x11 - APPDIR_LIBRARY_PATH: /lib64:/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu/security:$APPDIR/lib/systemd:$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders:$APPDIR/usr/lib/x86_64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules:$APPDIR/usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/printbackends:$APPDIR/usr/lib/x86_64-linux-gnu/krb5/plugins/preauth:$APPDIR/usr/lib/x86_64-linux-gnu/libcanberra-0.30:$APPDIR/usr/lib/x86_64-linux-gnu/pulseaudio:$APPDIR/usr/lib/x86_64-linux-gnu/sasl2:$APPDIR/usr/lib/x86_64-linux-gnu/vdpau:$APPDIR/usr/share/rustdesk/lib:$APPDIR/lib/x86_64 - GST_PLUGIN_PATH: /lib64/gstreamer-1.0:/usr/lib/x86_64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/x86_64-linux-gnu/gstreamer-1.0 - GST_PLUGIN_SYSTEM_PATH: /lib64/gstreamer-1.0:/usr/lib/x86_64-linux-gnu/gstreamer-1.0:$APPDIR/usr/lib/x86_64-linux-gnu/gstreamer-1.0 - test: - fedora-30: - image: appimagecrafters/tests-env:fedora-30 - command: ./AppRun - debian-stable: - image: appimagecrafters/tests-env:debian-stable - command: ./AppRun - archlinux-latest: - image: appimagecrafters/tests-env:archlinux-latest - command: ./AppRun - centos-7: - image: appimagecrafters/tests-env:centos-7 - command: ./AppRun - ubuntu-xenial: - image: appimagecrafters/tests-env:ubuntu-xenial - command: ./AppRun -AppImage: - arch: x86_64 - update-information: guess - comp: gzip diff --git a/shelled/rustdesk-as-ref/build.py b/shelled/rustdesk-as-ref/build.py deleted file mode 100644 index ce9a09e..0000000 --- a/shelled/rustdesk-as-ref/build.py +++ /dev/null @@ -1,647 +0,0 @@ -#!/usr/bin/env python3 - -import os -import pathlib -import platform -import zipfile -import urllib.request -import shutil -import hashlib -import argparse -import sys -from pathlib import Path - -windows = platform.platform().startswith('Windows') -osx = platform.platform().startswith( - 'Darwin') or platform.platform().startswith("macOS") -hbb_name = 'rustdesk' + ('.exe' if windows else '') -exe_path = 'target/release/' + hbb_name -if windows: - flutter_build_dir = 'build/windows/x64/runner/Release/' -elif osx: - flutter_build_dir = 'build/macos/Build/Products/Release/' -else: - flutter_build_dir = 'build/linux/x64/release/bundle/' -flutter_build_dir_2 = f'flutter/{flutter_build_dir}' -skip_cargo = False - - -def get_deb_arch() -> str: - custom_arch = os.environ.get("DEB_ARCH") - if custom_arch is None: - return "amd64" - return custom_arch - -def get_deb_extra_depends() -> str: - custom_arch = os.environ.get("DEB_ARCH") - if custom_arch == "armhf": # for arm32v7 libsciter-gtk.so - return ", libatomic1" - return "" - -def system2(cmd): - exit_code = os.system(cmd) - if exit_code != 0: - sys.stderr.write(f"Error occurred when executing: `{cmd}`. Exiting.\n") - sys.exit(-1) - - -def get_version(): - with open("Cargo.toml", encoding="utf-8") as fh: - for line in fh: - if line.startswith("version"): - return line.replace("version", "").replace("=", "").replace('"', '').strip() - return '' - - -def parse_rc_features(feature): - available_features = {} - apply_features = {} - if not feature: - feature = [] - - def platform_check(platforms): - if windows: - return 'windows' in platforms - elif osx: - return 'osx' in platforms - else: - return 'linux' in platforms - - def get_all_features(): - features = [] - for (feat, feat_info) in available_features.items(): - if platform_check(feat_info['platform']): - features.append(feat) - return features - - if isinstance(feature, str) and feature.upper() == 'ALL': - return get_all_features() - elif isinstance(feature, list): - if windows: - # download third party is deprecated, we use github ci instead. - # feature.append('PrivacyMode') - pass - for feat in feature: - if isinstance(feat, str) and feat.upper() == 'ALL': - return get_all_features() - if feat in available_features: - if platform_check(available_features[feat]['platform']): - apply_features[feat] = available_features[feat] - else: - print(f'Unrecognized feature {feat}') - return apply_features - else: - raise Exception(f'Unsupported features param {feature}') - - -def make_parser(): - parser = argparse.ArgumentParser(description='Build script.') - parser.add_argument( - '-f', - '--feature', - dest='feature', - metavar='N', - type=str, - nargs='+', - default='', - help='Integrate features, windows only.' - 'Available: [Not used for now]. Special value is "ALL" and empty "". Default is empty.') - parser.add_argument('--flutter', action='store_true', - help='Build flutter package', default=False) - parser.add_argument( - '--hwcodec', - action='store_true', - help='Enable feature hwcodec' + ( - '' if windows or osx else ', need libva-dev.') - ) - parser.add_argument( - '--vram', - action='store_true', - help='Enable feature vram, only available on windows now.' - ) - parser.add_argument( - '--portable', - action='store_true', - help='Build windows portable' - ) - parser.add_argument( - '--unix-file-copy-paste', - action='store_true', - help='Build with unix file copy paste feature' - ) - parser.add_argument( - '--skip-cargo', - action='store_true', - help='Skip cargo build process, only flutter version + Linux supported currently' - ) - if windows: - parser.add_argument( - '--skip-portable-pack', - action='store_true', - help='Skip packing, only flutter version + Windows supported' - ) - parser.add_argument( - "--package", - type=str - ) - if osx: - parser.add_argument( - '--screencapturekit', - action='store_true', - help='Enable feature screencapturekit' - ) - return parser - - -# Generate build script for docker -# -# it assumes all build dependencies are installed in environments -# Note: do not use it in bare metal, or may break build environments -def generate_build_script_for_docker(): - with open("/tmp/build.sh", "w") as f: - f.write(''' - #!/bin/bash - # environment - export CPATH="$(clang -v 2>&1 | grep "Selected GCC installation: " | cut -d' ' -f4-)/include" - # flutter - pushd /opt - wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.0.5-stable.tar.xz - tar -xvf flutter_linux_3.0.5-stable.tar.xz - export PATH=`pwd`/flutter/bin:$PATH - popd - # flutter_rust_bridge - dart pub global activate ffigen --version 5.0.1 - pushd /tmp && git clone https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge --depth=1 && popd - pushd /tmp/flutter_rust_bridge/frb_codegen && cargo install --path . && popd - pushd flutter && flutter pub get && popd - ~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart - # install vcpkg - pushd /opt - export VCPKG_ROOT=`pwd`/vcpkg - git clone https://github.com/microsoft/vcpkg - vcpkg/bootstrap-vcpkg.sh - popd - $VCPKG_ROOT/vcpkg install --x-install-root="$VCPKG_ROOT/installed" - # build rustdesk - ./build.py --flutter --hwcodec - ''') - system2("chmod +x /tmp/build.sh") - system2("bash /tmp/build.sh") - - -# Downloading third party resources is deprecated. -# We can use this function in an offline build environment. -# Even in an online environment, we recommend building third-party resources yourself. -def download_extract_features(features, res_dir): - import re - - proxy = '' - - def req(url): - if not proxy: - return url - else: - r = urllib.request.Request(url) - r.set_proxy(proxy, 'http') - r.set_proxy(proxy, 'https') - return r - - for (feat, feat_info) in features.items(): - includes = feat_info['include'] if 'include' in feat_info and feat_info['include'] else [] - includes = [re.compile(p) for p in includes] - excludes = feat_info['exclude'] if 'exclude' in feat_info and feat_info['exclude'] else [] - excludes = [re.compile(p) for p in excludes] - - print(f'{feat} download begin') - download_filename = feat_info['zip_url'].split('/')[-1] - checksum_md5_response = urllib.request.urlopen( - req(feat_info['checksum_url'])) - for line in checksum_md5_response.read().decode('utf-8').splitlines(): - if line.split()[1] == download_filename: - checksum_md5 = line.split()[0] - filename, _headers = urllib.request.urlretrieve(feat_info['zip_url'], - download_filename) - md5 = hashlib.md5(open(filename, 'rb').read()).hexdigest() - if checksum_md5 != md5: - raise Exception(f'{feat} download failed') - print(f'{feat} download end. extract bein') - zip_file = zipfile.ZipFile(filename) - zip_list = zip_file.namelist() - for f in zip_list: - file_exclude = False - for p in excludes: - if p.match(f) is not None: - file_exclude = True - break - if file_exclude: - continue - - file_include = False if includes else True - for p in includes: - if p.match(f) is not None: - file_include = True - break - if file_include: - print(f'extract file {f}') - zip_file.extract(f, res_dir) - zip_file.close() - os.remove(download_filename) - print(f'{feat} extract end') - - -def external_resources(flutter, args, res_dir): - features = parse_rc_features(args.feature) - if not features: - return - - print(f'Build with features {list(features.keys())}') - if os.path.isdir(res_dir) and not os.path.islink(res_dir): - shutil.rmtree(res_dir) - elif os.path.exists(res_dir): - raise Exception(f'Find file {res_dir}, not a directory') - os.makedirs(res_dir, exist_ok=True) - download_extract_features(features, res_dir) - if flutter: - os.makedirs(flutter_build_dir_2, exist_ok=True) - for f in pathlib.Path(res_dir).iterdir(): - print(f'{f}') - if f.is_file(): - shutil.copy2(f, flutter_build_dir_2) - else: - shutil.copytree(f, f'{flutter_build_dir_2}{f.stem}') - - -def get_features(args): - features = ['inline'] if not args.flutter else [] - if args.hwcodec: - features.append('hwcodec') - if args.vram: - features.append('vram') - if args.flutter: - features.append('flutter') - if args.unix_file_copy_paste: - features.append('unix-file-copy-paste') - if osx: - if args.screencapturekit: - features.append('screencapturekit') - print("features:", features) - return features - - -def generate_control_file(version): - control_file_path = "../res/DEBIAN/control" - system2('/bin/rm -rf %s' % control_file_path) - - content = """Package: rustdesk -Section: net -Priority: optional -Version: %s -Architecture: %s -Maintainer: rustdesk -Homepage: https://rustdesk.com -Depends: libgtk-3-0, libxcb-randr0, libxdo3 | libxdo4, libxfixes3, libxcb-shape0, libxcb-xfixes0, libasound2, libsystemd0, curl, libva2, libva-drm2, libva-x11-2, libgstreamer-plugins-base1.0-0, libpam0g, gstreamer1.0-pipewire%s -Recommends: libayatana-appindicator3-1 -Description: A remote control software. - -""" % (version, get_deb_arch(), get_deb_extra_depends()) - file = open(control_file_path, "w") - file.write(content) - file.close() - - -def ffi_bindgen_function_refactor(): - # workaround ffigen - system2( - 'sed -i "s/ffi.NativeFunction> tmpdeb/usr/share/rustdesk/files/polkit && chmod a+x tmpdeb/usr/share/rustdesk/files/polkit") - - system2('mkdir -p tmpdeb/DEBIAN') - generate_control_file(version) - system2('cp -a ../res/DEBIAN/* tmpdeb/DEBIAN/') - md5_file_folder("tmpdeb/") - system2('dpkg-deb -b tmpdeb rustdesk.deb;') - - system2('/bin/rm -rf tmpdeb/') - system2('/bin/rm -rf ../res/DEBIAN/control') - os.rename('rustdesk.deb', '../rustdesk-%s.deb' % version) - os.chdir("..") - - -def build_deb_from_folder(version, binary_folder): - os.chdir('flutter') - system2('mkdir -p tmpdeb/usr/bin/') - system2('mkdir -p tmpdeb/usr/share/rustdesk') - system2('mkdir -p tmpdeb/usr/share/rustdesk/files/systemd/') - system2('mkdir -p tmpdeb/usr/share/icons/hicolor/256x256/apps/') - system2('mkdir -p tmpdeb/usr/share/icons/hicolor/scalable/apps/') - system2('mkdir -p tmpdeb/usr/share/applications/') - system2('mkdir -p tmpdeb/usr/share/polkit-1/actions') - system2('rm tmpdeb/usr/bin/rustdesk || true') - system2( - f'cp -r ../{binary_folder}/* tmpdeb/usr/share/rustdesk/') - system2( - 'cp ../res/rustdesk.service tmpdeb/usr/share/rustdesk/files/systemd/') - system2( - 'cp ../res/128x128@2x.png tmpdeb/usr/share/icons/hicolor/256x256/apps/rustdesk.png') - system2( - 'cp ../res/scalable.svg tmpdeb/usr/share/icons/hicolor/scalable/apps/rustdesk.svg') - system2( - 'cp ../res/rustdesk.desktop tmpdeb/usr/share/applications/rustdesk.desktop') - system2( - 'cp ../res/rustdesk-link.desktop tmpdeb/usr/share/applications/rustdesk-link.desktop') - system2( - "echo \"#!/bin/sh\" >> tmpdeb/usr/share/rustdesk/files/polkit && chmod a+x tmpdeb/usr/share/rustdesk/files/polkit") - - system2('mkdir -p tmpdeb/DEBIAN') - generate_control_file(version) - system2('cp -a ../res/DEBIAN/* tmpdeb/DEBIAN/') - md5_file_folder("tmpdeb/") - system2('dpkg-deb -b tmpdeb rustdesk.deb;') - - system2('/bin/rm -rf tmpdeb/') - system2('/bin/rm -rf ../res/DEBIAN/control') - os.rename('rustdesk.deb', '../rustdesk-%s.deb' % version) - os.chdir("..") - - -def build_flutter_dmg(version, features): - if not skip_cargo: - # set minimum osx build target, now is 10.14, which is the same as the flutter xcode project - system2( - f'MACOSX_DEPLOYMENT_TARGET=10.14 cargo build --features {features} --release') - # copy dylib - system2( - "cp target/release/liblibrustdesk.dylib target/release/librustdesk.dylib") - os.chdir('flutter') - system2('flutter build macos --release') - system2('cp -rf ../target/release/service ./build/macos/Build/Products/Release/RustDesk.app/Contents/MacOS/') - ''' - system2( - "create-dmg --volname \"RustDesk Installer\" --window-pos 200 120 --window-size 800 400 --icon-size 100 --app-drop-link 600 185 --icon RustDesk.app 200 190 --hide-extension RustDesk.app rustdesk.dmg ./build/macos/Build/Products/Release/RustDesk.app") - os.rename("rustdesk.dmg", f"../rustdesk-{version}.dmg") - ''' - os.chdir("..") - - -def build_flutter_arch_manjaro(version, features): - if not skip_cargo: - system2(f'cargo build --features {features} --lib --release') - ffi_bindgen_function_refactor() - os.chdir('flutter') - system2('flutter build linux --release') - system2(f'strip {flutter_build_dir}/lib/librustdesk.so') - os.chdir('../res') - system2('HBB=`pwd`/.. FLUTTER=1 makepkg -f') - - -def build_flutter_windows(version, features, skip_portable_pack): - if not skip_cargo: - system2(f'cargo build --features {features} --lib --release') - if not os.path.exists("target/release/librustdesk.dll"): - print("cargo build failed, please check rust source code.") - exit(-1) - os.chdir('flutter') - system2('flutter build windows --release') - os.chdir('..') - shutil.copy2('target/release/deps/dylib_virtual_display.dll', - flutter_build_dir_2) - if skip_portable_pack: - return - os.chdir('libs/portable') - system2('pip3 install -r requirements.txt') - system2( - f'python3 ./generate.py -f ../../{flutter_build_dir_2} -o . -e ../../{flutter_build_dir_2}/rustdesk.exe') - os.chdir('../..') - if os.path.exists('./rustdesk_portable.exe'): - os.replace('./target/release/rustdesk-portable-packer.exe', - './rustdesk_portable.exe') - else: - os.rename('./target/release/rustdesk-portable-packer.exe', - './rustdesk_portable.exe') - print( - f'output location: {os.path.abspath(os.curdir)}/rustdesk_portable.exe') - os.rename('./rustdesk_portable.exe', f'./rustdesk-{version}-install.exe') - print( - f'output location: {os.path.abspath(os.curdir)}/rustdesk-{version}-install.exe') - - -def main(): - global skip_cargo - parser = make_parser() - args = parser.parse_args() - - if os.path.exists(exe_path): - os.unlink(exe_path) - if os.path.isfile('/usr/bin/pacman'): - system2('git checkout src/ui/common.tis') - version = get_version() - features = ','.join(get_features(args)) - flutter = args.flutter - if not flutter: - system2('python3 res/inline-sciter.py') - print(args.skip_cargo) - if args.skip_cargo: - skip_cargo = True - portable = args.portable - package = args.package - if package: - build_deb_from_folder(version, package) - return - res_dir = 'resources' - external_resources(flutter, args, res_dir) - if windows: - # build virtual display dynamic library - os.chdir('libs/virtual_display/dylib') - system2('cargo build --release') - os.chdir('../../..') - - if flutter: - build_flutter_windows(version, features, args.skip_portable_pack) - return - system2('cargo build --release --features ' + features) - # system2('upx.exe target/release/rustdesk.exe') - system2('mv target/release/rustdesk.exe target/release/RustDesk.exe') - pa = os.environ.get('P') - if pa: - # https://certera.com/kb/tutorial-guide-for-safenet-authentication-client-for-code-signing/ - system2( - f'signtool sign /a /v /p {pa} /debug /f .\\cert.pfx /t http://timestamp.digicert.com ' - 'target\\release\\rustdesk.exe') - else: - print('Not signed') - system2( - f'cp -rf target/release/RustDesk.exe {res_dir}') - os.chdir('libs/portable') - system2('pip3 install -r requirements.txt') - system2( - f'python3 ./generate.py -f ../../{res_dir} -o . -e ../../{res_dir}/rustdesk-{version}-win7-install.exe') - system2('mv ../../{res_dir}/rustdesk-{version}-win7-install.exe ../..') - elif os.path.isfile('/usr/bin/pacman'): - # pacman -S -needed base-devel - system2("sed -i 's/pkgver=.*/pkgver=%s/g' res/PKGBUILD" % version) - if flutter: - build_flutter_arch_manjaro(version, features) - else: - system2('cargo build --release --features ' + features) - system2('git checkout src/ui/common.tis') - system2('strip target/release/rustdesk') - system2('ln -s res/pacman_install && ln -s res/PKGBUILD') - system2('HBB=`pwd` makepkg -f') - system2('mv rustdesk-%s-0-x86_64.pkg.tar.zst rustdesk-%s-manjaro-arch.pkg.tar.zst' % ( - version, version)) - # pacman -U ./rustdesk.pkg.tar.zst - elif os.path.isfile('/usr/bin/yum'): - system2('cargo build --release --features ' + features) - system2('strip target/release/rustdesk') - system2( - "sed -i 's/Version: .*/Version: %s/g' res/rpm.spec" % version) - system2('HBB=`pwd` rpmbuild -ba res/rpm.spec') - system2( - 'mv $HOME/rpmbuild/RPMS/x86_64/rustdesk-%s-0.x86_64.rpm ./rustdesk-%s-fedora28-centos8.rpm' % ( - version, version)) - # yum localinstall rustdesk.rpm - elif os.path.isfile('/usr/bin/zypper'): - system2('cargo build --release --features ' + features) - system2('strip target/release/rustdesk') - system2( - "sed -i 's/Version: .*/Version: %s/g' res/rpm-suse.spec" % version) - system2('HBB=`pwd` rpmbuild -ba res/rpm-suse.spec') - system2( - 'mv $HOME/rpmbuild/RPMS/x86_64/rustdesk-%s-0.x86_64.rpm ./rustdesk-%s-suse.rpm' % ( - version, version)) - # yum localinstall rustdesk.rpm - else: - if flutter: - if osx: - build_flutter_dmg(version, features) - pass - else: - # system2( - # 'mv target/release/bundle/deb/rustdesk*.deb ./flutter/rustdesk.deb') - build_flutter_deb(version, features) - else: - system2('cargo bundle --release --features ' + features) - if osx: - system2( - 'strip target/release/bundle/osx/RustDesk.app/Contents/MacOS/rustdesk') - system2( - 'cp libsciter.dylib target/release/bundle/osx/RustDesk.app/Contents/MacOS/') - # https://github.com/sindresorhus/create-dmg - system2('/bin/rm -rf *.dmg') - pa = os.environ.get('P') - if pa: - system2(''' - # buggy: rcodesign sign ... path/*, have to sign one by one - # install rcodesign via cargo install apple-codesign - #rcodesign sign --p12-file ~/.p12/rustdesk-developer-id.p12 --p12-password-file ~/.p12/.cert-pass --code-signature-flags runtime ./target/release/bundle/osx/RustDesk.app/Contents/MacOS/rustdesk - #rcodesign sign --p12-file ~/.p12/rustdesk-developer-id.p12 --p12-password-file ~/.p12/.cert-pass --code-signature-flags runtime ./target/release/bundle/osx/RustDesk.app/Contents/MacOS/libsciter.dylib - #rcodesign sign --p12-file ~/.p12/rustdesk-developer-id.p12 --p12-password-file ~/.p12/.cert-pass --code-signature-flags runtime ./target/release/bundle/osx/RustDesk.app - # goto "Keychain Access" -> "My Certificates" for below id which starts with "Developer ID Application:" - codesign -s "Developer ID Application: {0}" --force --options runtime ./target/release/bundle/osx/RustDesk.app/Contents/MacOS/* - codesign -s "Developer ID Application: {0}" --force --options runtime ./target/release/bundle/osx/RustDesk.app - '''.format(pa)) - system2( - 'create-dmg "RustDesk %s.dmg" "target/release/bundle/osx/RustDesk.app"' % version) - os.rename('RustDesk %s.dmg' % - version, 'rustdesk-%s.dmg' % version) - if pa: - system2(''' - # https://pyoxidizer.readthedocs.io/en/apple-codesign-0.14.0/apple_codesign.html - # https://pyoxidizer.readthedocs.io/en/stable/tugger_code_signing.html - # https://developer.apple.com/developer-id/ - # goto xcode and login with apple id, manager certificates (Developer ID Application and/or Developer ID Installer) online there (only download and double click (install) cer file can not export p12 because no private key) - #rcodesign sign --p12-file ~/.p12/rustdesk-developer-id.p12 --p12-password-file ~/.p12/.cert-pass --code-signature-flags runtime ./rustdesk-{1}.dmg - codesign -s "Developer ID Application: {0}" --force --options runtime ./rustdesk-{1}.dmg - # https://appstoreconnect.apple.com/access/api - # https://gregoryszorc.com/docs/apple-codesign/stable/apple_codesign_getting_started.html#apple-codesign-app-store-connect-api-key - # p8 file is generated when you generate api key (can download only once) - rcodesign notary-submit --api-key-path ../.p12/api-key.json --staple rustdesk-{1}.dmg - # verify: spctl -a -t exec -v /Applications/RustDesk.app - '''.format(pa, version)) - else: - print('Not signed') - else: - # build deb package - system2( - 'mv target/release/bundle/deb/rustdesk*.deb ./rustdesk.deb') - system2('dpkg-deb -R rustdesk.deb tmpdeb') - system2('mkdir -p tmpdeb/usr/share/rustdesk/files/systemd/') - system2('mkdir -p tmpdeb/usr/share/icons/hicolor/256x256/apps/') - system2('mkdir -p tmpdeb/usr/share/icons/hicolor/scalable/apps/') - system2( - 'cp res/rustdesk.service tmpdeb/usr/share/rustdesk/files/systemd/') - system2( - 'cp res/128x128@2x.png tmpdeb/usr/share/icons/hicolor/256x256/apps/rustdesk.png') - system2( - 'cp res/scalable.svg tmpdeb/usr/share/icons/hicolor/scalable/apps/rustdesk.svg') - system2( - 'cp res/rustdesk.desktop tmpdeb/usr/share/applications/rustdesk.desktop') - system2( - 'cp res/rustdesk-link.desktop tmpdeb/usr/share/applications/rustdesk-link.desktop') - os.system('mkdir -p tmpdeb/etc/rustdesk/') - os.system('cp -a res/startwm.sh tmpdeb/etc/rustdesk/') - os.system('mkdir -p tmpdeb/etc/X11/rustdesk/') - os.system('cp res/xorg.conf tmpdeb/etc/X11/rustdesk/') - os.system('cp -a DEBIAN/* tmpdeb/DEBIAN/') - os.system('mkdir -p tmpdeb/etc/pam.d/') - os.system('cp pam.d/rustdesk.debian tmpdeb/etc/pam.d/rustdesk') - system2('strip tmpdeb/usr/bin/rustdesk') - system2('mkdir -p tmpdeb/usr/share/rustdesk') - system2('mv tmpdeb/usr/bin/rustdesk tmpdeb/usr/share/rustdesk/') - system2('cp libsciter-gtk.so tmpdeb/usr/share/rustdesk/') - md5_file_folder("tmpdeb/") - system2('dpkg-deb -b tmpdeb rustdesk.deb; /bin/rm -rf tmpdeb/') - os.rename('rustdesk.deb', 'rustdesk-%s.deb' % version) - - -def md5_file(fn): - md5 = hashlib.md5(open('tmpdeb/' + fn, 'rb').read()).hexdigest() - system2('echo "%s /%s" >> tmpdeb/DEBIAN/md5sums' % (md5, fn)) - -def md5_file_folder(base_dir): - base_path = Path(base_dir) - for file in base_path.rglob('*'): - if file.is_file() and 'DEBIAN' not in file.parts: - relative_path = file.relative_to(base_path) - md5_file(str(relative_path)) - - -if __name__ == "__main__": - main() diff --git a/shelled/rustdesk-as-ref/build.rs b/shelled/rustdesk-as-ref/build.rs deleted file mode 100644 index 92fb1f4..0000000 --- a/shelled/rustdesk-as-ref/build.rs +++ /dev/null @@ -1,94 +0,0 @@ -#[cfg(windows)] -fn build_windows() { - let file = "src/platform/windows.cc"; - let file2 = "src/platform/windows_delete_test_cert.cc"; - cc::Build::new().file(file).file(file2).compile("windows"); - println!("cargo:rustc-link-lib=WtsApi32"); - println!("cargo:rerun-if-changed={}", file); - println!("cargo:rerun-if-changed={}", file2); -} - -#[cfg(target_os = "macos")] -fn build_mac() { - let file = "src/platform/macos.mm"; - let mut b = cc::Build::new(); - if let Ok(os_version::OsVersion::MacOS(v)) = os_version::detect() { - let v = v.version; - if v.contains("10.14") { - b.flag("-DNO_InputMonitoringAuthStatus=1"); - } - } - b.flag("-std=c++17").file(file).compile("macos"); - println!("cargo:rerun-if-changed={}", file); -} - -#[cfg(all(windows, feature = "inline"))] -fn build_manifest() { - use std::io::Write; - if std::env::var("PROFILE").unwrap() == "release" { - let mut res = winres::WindowsResource::new(); - res.set_icon("res/icon.ico") - .set_language(winapi::um::winnt::MAKELANGID( - winapi::um::winnt::LANG_ENGLISH, - winapi::um::winnt::SUBLANG_ENGLISH_US, - )) - .set_manifest_file("res/manifest.xml"); - match res.compile() { - Err(e) => { - write!(std::io::stderr(), "{}", e).unwrap(); - std::process::exit(1); - } - Ok(_) => {} - } - } -} - -fn install_android_deps() { - let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap(); - if target_os != "android" { - return; - } - let mut target_arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap(); - if target_arch == "x86_64" { - target_arch = "x64".to_owned(); - } else if target_arch == "x86" { - target_arch = "x86".to_owned(); - } else if target_arch == "aarch64" { - target_arch = "arm64".to_owned(); - } else { - target_arch = "arm".to_owned(); - } - let target = format!("{}-android", target_arch); - let vcpkg_root = std::env::var("VCPKG_ROOT").unwrap(); - let mut path: std::path::PathBuf = vcpkg_root.into(); - if let Ok(vcpkg_root) = std::env::var("VCPKG_INSTALLED_ROOT") { - path = vcpkg_root.into(); - } else { - path.push("installed"); - } - path.push(target); - println!( - "cargo:rustc-link-search={}", - path.join("lib").to_str().unwrap() - ); - println!("cargo:rustc-link-lib=ndk_compat"); - println!("cargo:rustc-link-lib=oboe"); - println!("cargo:rustc-link-lib=c++"); - println!("cargo:rustc-link-lib=OpenSLES"); -} - -fn main() { - hbb_common::gen_version(); - install_android_deps(); - #[cfg(all(windows, feature = "inline"))] - build_manifest(); - #[cfg(windows)] - build_windows(); - let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap(); - if target_os == "macos" { - #[cfg(target_os = "macos")] - build_mac(); - println!("cargo:rustc-link-lib=framework=ApplicationServices"); - } - println!("cargo:rerun-if-changed=build.rs"); -} diff --git a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-DE.md b/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-DE.md deleted file mode 100644 index ea42545..0000000 --- a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-DE.md +++ /dev/null @@ -1,137 +0,0 @@ - -# Verhaltenskodex (Code of Conduct) für Mitwirkende - -## Unsere Verpflichtung - -Wir als Mitglieder, Mitwirkende und Führungskräfte verpflichten uns, -die Teilnahme unserer Community zu einer Erfahrung zu machen, -die für alle frei von Belästigungen ist, unabhängig von Alter, Körpergröße, -sichtbarer oder unsichtbarer Behinderung, ethnischer Zugehörigkeit, -Geschlechtsmerkmalen, Geschlechtsidentität und -ausdruck, Erfahrungsniveau, -Bildung, sozioökonomischem Status, Nationalität, persönlichem Erscheinungsbild, -Rasse, Religion oder sexueller Identität und Orientierung. - -Wir verpflichten uns, so zu handeln und zu interagieren, dass wir zu einer offenen, -einladenden, vielfältigen, integrativen und lebendigen Gemeinschaft beitragen. - -## Unsere Standards - -Beispiele für Verhaltensweisen, die zu einem positiven Umfeld für unsere -Gemeinschaft beitragen, sind: - -* Empathie und Freundlichkeit gegenüber anderen Menschen zu zeigen -* Respektvoll gegenüber anderen Meinungen, Sichtweisen und Erfahrungen zu sein -* Das Vergeben von sowie das großzügige Empfangen von konstruktivem Feedback -* Verantwortung übernehmen, sich bei den Betroffenen entschuldigen - und aus den Erfahrungen lernen -* Nicht darauf zu achten, was das Beste für sich selbst, - sondern zu Achten, was das Beste für die gesamte Community ist - -Beispiele für nicht akzeptables Verhalten sind: - -* Die Verwendung sexualisierter bzw. anstößiger Sprache oder Bilder - sowie sexuelle Aufmerksamkeit oder Annäherungsversuche jeglicher Art -* Trolling, beleidigende oder herabwürdigende Kommentare - sowie persönliche oder politische Angriffe -* Öffentliche sowie private Belästigung -* Das Teilen privater Informationen anderer Leute ohne deren explizite Zustimmung, - wie bspw. die physische oder die E-Mail-Adresse -* Anderes Verhalten, das in einem professionellen Umfeld begründeter Weise als - unangemessen angesehen werden könnte - -## Durchsetzungsbefugnisse - -Die Leiter der Community sind dafür verantwortlich, unsere Standards für -akzeptables Verhalten zu klären und durchzusetzen und werden angemessene -und faire Korrekturmaßnahmen ergreifen, wenn sie ein Verhalten als unangemessen, -bedrohlich, beleidigend oder schädlich erachten. - -Die Leiter der Community haben das Recht und die Pflicht, Kommentare, Commits, -Code, Wiki-Bearbeitungen, Issues und andere Beiträge, die nicht mit dem -Verhaltenskodex vereinbar sind, zu entfernen, zu bearbeiten oder abzulehnen. -Sie werden, falls angebracht, die Gründe für Moderationsentscheidungen mitteilen. - -## Geltungsbereich - -Dieser Verhaltenskodex gilt in allen Community-Bereichen und auch dann, wenn -eine Person die Community offiziell in öffentlichen Bereichen vertritt. -Beispiele für die Vertretung unserer Community sind die Verwendung einer -offiziellen E-Mail-Adresse, das Posten über einen offiziellen -Social-Media-Account oder die Tätigkeit als ernannter -Vertreter bei einer Online- oder Präsenzveranstaltung. - -## Geltendmachung - -Fälle von missbräuchlichem, belästigendem oder anderweitig inakzeptablem Verhalten können -den für die Durchsetzung zuständigen Community-Leitern -unter [info@rustdesk.com](mailto:info@rustdesk.com) gemeldet werden. -Jeder Fall wird umgehend und fair geprüft und untersucht. - -## Richtlinien zur Geltendmachung - -Die Community-Leiter werden die folgenden Community-Auswirkungsrichtlinien befolgen, -um die Konsequenzen für jede Handlung zu bestimmen, die sie als Verstoß gegen diesen -Verhaltenskodex ansehen: - -### 1. Korrektur - -**Auswirkungen auf die Community**: Verwendung unangemessener Sprache oder anderes -Verhalten, welches als unprofessionell oder in der Community unerwünscht angesehen wird. - -**Konsequenz**: Eine private, schriftliche Verwarnung durch die Leiter der Community, -in der die Art des Verstoßes klar dargelegt und erklärt wird, warum das -Verhalten unangemessen war. Eine öffentliche Entschuldigung kann verlangt werden. - -### 2. Warnung - -**Auswirkungen auf die Community**: Ein Verstoß durch einen einzelnen Vorfall -oder eine Reihe von Handlungen. - -**Konsequenz**: Eine Verwarnung mit Konsequenzen für das weitere Verhalten. Keine -Interaktion mit den beteiligten Personen, einschließlich unaufgeforderter Interaktion mit -denjenigen, die den Verhaltenskodex durchsetzen, für einen bestimmten Zeitraum. Dies -schließt die Vermeidung von Interaktionen in Gemeinschaftsräumen sowie externen Kanälen -wie sozialen Medien ein. Ein Verstoß gegen diese Bedingungen kann zu einer vorübergehenden oder -dauerhaften Sperrung führen. - -### 3. Temporärer Sperrung - - -**Auswirkungen auf die Community**: Ein schwerwiegender Verstoß gegen die Community-Standards, -einschließlich anhaltend unangemessenem Verhalten. - -**Konsequenz**: Eine vorübergehende Sperrung jeglicher Art von Interaktion oder öffentlicher -Kommunikation mit der Community für einen bestimmten Zeitraum. Während dieses Zeitraums sind -keine öffentlichen oder privaten Interaktionen mit den betroffenen Personen, -einschließlich unaufgeforderter Interaktionen mit denjenigen, -die den Verhaltenskodex durchsetzen, erlaubt. -Ein Verstoß gegen diese Bedingungen kann zu einer dauerhaften Sperrung führen. - -### 4. Dauerhafte Sperrung - -**Auswirkungen auf die Community**: Wiederholte Verstöße gegen die Community-Standards, -einschließlich anhaltend unangemessenem Verhalten, Belästigung einer -Person oder Aggression gegenüber oder Herabwürdigung von Personengruppen. - -**Konsequenz**: Ein dauerhafter Ausschluss von jeglicher öffentlicher -Interaktion innerhalb der Community. - -## Quellenangabe - -Dieser Verhaltenskodex ist eine Adaption des [Contributor Covenant][homepage], -Version 2.0, verfügbar unter -[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. - -Die Richtlinien zu den Auswirkungen auf die Gemeinschaft wurden inspiriert von -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. - -Für Antworten auf häufig gestellte Fragen zu diesem Verhaltenskodex siehe die -häufig gestellten Fragen (FAQ) unter -[https://www.contributor-covenant.org/faq][FAQ]. Übersetzungen sind verfügbar -unter [https://www.contributor-covenant.org/translations][translations]. - -[homepage]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations diff --git a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-JP.md b/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-JP.md deleted file mode 100644 index 5b21624..0000000 --- a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-JP.md +++ /dev/null @@ -1,101 +0,0 @@ - -# コントリビューター規約 行動規範 - -## 私たちの誓い - -私たちは、メンバー、貢献者、リーダーとして、年齢、体格、目に見える・見えない障害、 -民族性、性の特徴、性自認と表現、経験のレベル、教育、社会経済的地位、国籍、個人の外見、 -人種、宗教、性的自認と指向に関係なく、誰もがハラスメントのないコミュニティに参加できるようにすることを誓います。 - -私たちは、開かれた、歓迎された、多様で、包容力のある、健全な地域社会に貢献するように行動し、交流することを誓います。 - -## 私たちの基準 - -地域社会にとって好ましい環境にコントリビュートする行動の例には、以下のようなものがある: - -* 他者への共感と優しさ -* 異なる意見、視点、経験を尊重すること -* 建設的なフィードバックを与え、潔く受け入れること -* 私たちの過ちによって影響を受けた人々に責任を受け入れ、謝罪し、経験から学ぶこと -* 私たち個人にとってだけでなく、地域社会全体にとって何が最善であるかに焦点を合わせること - -許されない行為の例: - -* 性的な言葉やイメージの使用、性的な注目や誘いかけ -* 荒らし、侮辱的または軽蔑的なコメント、個人的または政治的な攻撃 -* 公的または私的な嫌がらせ -* 明示的な許可なく、他人の住所や電子メールアドレスなどの個人情報を公開すること -* 職業上不適切と見なされるその他の行為 - -## 執行責任 - -コミュニティリーダーは、許容される行動の基準を明確にし、実施する責任があり、 -不適切、脅迫的、攻撃的、または有害と判断される行動に対しては、適切かつ公正な是正措置をとります - -コミュニティリーダーは、本行動規範に沿わないコメント、コミット、コード、ウィキ編集、 -課題、その他の貢献を削除、編集、拒否する権利と責任を有し、適切な場合にはモデレーション決定の理由を伝えます。 - -## スコープ - -この行動規範は、すべてのコミュニティスペースで適用され、また個人が公的なスペースでコミュニティを公式に代表している場合にも適用されます。 -当コミュニティを代表する例としては、公式 E メールアドレスの使用、公式ソーシャルメディアアカウントによる投稿、 -オンラインまたはオフラインのイベントでの任命された代表としての行動などが挙げられます。 - -## 施行 - -虐待、ハラスメント、その他容認できない行為があった場合は、[info@rustdesk.com](mailto:info@rustdesk.com) の -執行担当コミュニティリーダーに報告することができる。 -すべての苦情は、迅速かつ公正に検討・調査されます。 - -すべての地域社会の指導者は、いかなる事件の報告者のプライバシーと安全を尊重する義務がある。 - -## 執行ガイドライン - -コミュニティリーダーは、本行動規範に違反すると判断した行為に対する結果を決定する際、 -以下の「コミュニティへの影響に関するガイドライン」に従います: - -### 1. 修正 - -**コミュニティへの影響**: 不適切な言葉の使用、またはプロフェッショナルでない、あるいは地域社会で歓迎されないとみなされるその他の行動。 - -**結果**: コミュニティリーダーからの私的な書面による警告。違反の性質と、 -なぜその行為が不適切であったのかについての説明を明確にする。公的な謝罪が要求される場合もある。 - -### 2. 警告 - -**コミュニティへの影響**: 単一の出来事または一連の行動による違反。 - -**結果**: 行動を続けた場合の結果を伴う警告。一定期間、行動規範の実施者との勝手な交流を含め、 -関係者と交流しないこと。これには、ソーシャルメディアなどの外部チャンネルだけでなく、 -コミュニティスペースでの交流を避けることも含まれます。これらの条件に違反した場合、一時的または恒久的に追放される可能性があります。 - -### 3. 一時的な禁止 - -**コミュニティへの影響**: 継続的な不適切な行動を含む、コミュニティ基準に対する重大な違反。 - -**結果**: 一定期間、地域社会とのあらゆる交流や公的なコミュニケーションを一時的に禁止すること。 -この期間中は、行動規範を執行する人々との未承諾の交流を含め、関係者との公私にわたる交流は許されない。 -これらの条件に違反した場合、永久禁止となる可能性があります。 - -### 4. 永久禁止 - -**コミュニティへの影響**: 継続的な不適切な行動、個人に対する嫌がらせ、 -または個人クラスに対する攻撃や中傷など、地域社会の基準に対する違反のパターンを示すこと。 - -**結果**: コミュニティ内でのあらゆる公的交流の永久禁止。 - -## 帰属 - -この行動規範は、[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0] に掲載されている -[コントリビューター規約][ホームページ]、バージョン 2.0 から引用したものです。 - -コミュニティインパクトガイドラインは、[Mozilla's code of conduct enforcement ladder][Mozilla CoC] に触発されました。 - -この行動規範に関するよくある質問については、[https://www.contributor-covenant.org/faq][FAQ] の FAQ をご覧ください。 -翻訳は [https://www.contributor-covenant.org/translations][翻訳] にあります。 - -[ホームページ]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[翻訳]: https://www.contributor-covenant.org/translations diff --git a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-KR.md b/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-KR.md deleted file mode 100644 index 40fea02..0000000 --- a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-KR.md +++ /dev/null @@ -1,133 +0,0 @@ - -# 기여자 계약 행동 강령 - -## 우리의 서약 - -회원, 기여자, 리더로서 우리는 나이, 신체 크기, 눈에 -보이거나 보이지 않는 장애, 민족, 성 특성, 성 정체성 및 -표현, 경험 수준, 교육, 사회 경제적 지위, 국적, 외모, -인종, 종교, 성적 정체성 및 지향에 관계없이 모든 사람이 -괴롭힘 없이 커뮤니티에 참여할 수 있도록 할 것을 -서약합니다. - -우리는 개방적이고 환영하며 다양하고 포용적이며 건강한 커뮤니티에 -기여하는 방식으로 행동하고 교류할 것을 약속합니다. - -## 우리의 표준 - -커뮤니티의 긍정적인 환경에 기여하는 행동의 예는 -다음과 같습니다: - -* 다른 사람들에게 공감과 친절을 보여주기 -* 다양한 의견, 관점, 경험을 존중하기 -* 건설적인 피드백을 제공하고 우아하게 받아들이기 -* 우리의 실수로 인해 영향을 받은 사람들에게 책임을 받아들이고 사과하며 - 그 경험을 통해 배우기 -* 우리 개인뿐만 아니라 전체 커뮤니티에 가장 좋은 것이 무엇인지 - 집중하기 - -용납할 수 없는 행동의 예는 다음과 같습니다: - -* 성적인 언어 또는 이미지의 사용, 모든 종류의 성적 관심 또는 - 접근 행위 -* 트롤링, 모욕적이거나 경멸적인 댓글, 개인적 또는 정치적 공격 -* 공개적 또는 사적인 괴롭힘 -* 명시적인 허가 없이 타인의 실제 주소 또는 이메일 주소와 같은 - 개인정보를 게시하는 행위 -* 직업적 환경에서 합리적으로 부적절하다고 간주될 수 있는 - 기타 행위 - -## 시행 책임 - -커뮤니티 리더는 허용되는 행동의 기준을 명확히 하고 시행할 -책임이 있으며 부적절하거나 위협적이거나 모욕적이거나 -유해하다고 판단되는 행동에 대해 적절하고 공정한 시정 조치를 -취합니다. - -커뮤니티 리더는 본 행동 강령에 부합하지 않는 댓글, 커밋, -코드, 위키 편집, 이슈 및 기타 기여를 삭제, 편집 또는 거부할 -권한과 책임이 있으며, 적절한 경우 중재 결정의 이유를 -전달합니다. - -## 범위 - -본 행동 강령은 모든 커뮤니티 공간에서 적용되며, 개인이 공개 -공간에서 커뮤니티를 공식적으로 대표하는 경우에도 적용됩니다. -커뮤니티를 대표하는 예로는 공식 이메일 주소 사용, 공식 소셜 미디어 -계정을 통한 게시, 온라인 또는 오프라인 이벤트에서 지정된 대표자로 -활동하는 것 등이 있습니다. - -## 시행 - -모욕적, 괴롭힘 또는 기타 용납할 수 없는 행동은 - [info@rustdesk.com](mailto:info@rustdesk.com)으로 법 집행을 담당하는 커뮤니티 리더에게 -신고하실 수 있습니다. -모든 불만 사항은 신속하고 공정하게 검토 및 조사됩니다. - -모든 커뮤니티 리더는 모든 사건 신고자의 사생활과 보안을 존중할 의무가 -있습니다. - -## 시행 지침 - -커뮤니티 리더는 이 행동 강령을 위반한 것으로 간주되는 모든 행동에 대한 -결과를 결정할 때 다음 커뮤니티 영향 지침을 따릅니다: - -### 1. 수정 - -**커뮤니티 영향**: 커뮤니티에서 비전문적이거나 환영받지 못하는 -것으로 간주되는 부적절한 언어 사용이나 기타 행위입니다. - -**결과**: 커뮤니티 리더의 비공개 서면 경고. 위반 사항의 성격과 -해당 행동이 부적절했던 이유를 명확히 설명해야 합니다. -공개 사과를 요청할 수도 있습니다. - -### 2. 경고 - -**커뮤니티 영향**: 단일 사건 또는 일련의 행위를 통한 -위반입니다. - -**결과**: 지속적인 행동에 대한 경고 및 결과. 행동 강령 시행 담당자와의 -원치 않는 상호작용을 포함하여 관련자와의 상호작용은 일정 -기간 동안 금지됩니다. 여기에는 공동 공간 및 소셜 미디어와 -같은 외부 채널에서의 상호작용 금지가 포함됩니다. 이러한 -조건을 위반할 경우 일시적 또는 영구적으로 이용이 금지될 수 -있습니다. - -### 3. 일시 금지 - -**커뮤니티 영향**: 지속적인 부적절한 행동을 포함하여 -커뮤니티 기준을 심각하게 위반한 경우입니다. - -**결과**: 일정 기간 동안 커뮤니티와의 모든 상호작용이나 공개적인 소통이 -일시적으로 금지됩니다. 이 기간 동안에는 행동 강령을 시행하는 -사람들과의 원치 않는 상호작용을 포함하여 관련자들과의 공개적 또는 -사적인 상호작용이 허용되지 않습니다. -이러한 조건을 위반할 경우 영구적으로 이용이 금지될 수 있습니다. - -### 4. 영구 금지 - -**커뮤니티 영향**: 지속적인 부적절한 행동, 특정 개인에 대한 괴롭힘, -특정 계층에 대한 공격성 또는 비하 등 공동체 기준을 위반하는 -행동을 보이는 경우입니다. - -**결과**: 공동체 내 모든 종류의 공개적인 상호작용이 영구적으로 -금지됩니다. - -## 귀속 - -본 행동 강령은 [Contributor Covenant][homepage] 버전 2.0을 바탕으로 작성되었으며 -[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]에서 - 확인하실 수 있습니다. - -커뮤니티 영향 지침은 -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]에서 영감을 받았습니다. - -본 행동 강령에 대한 일반적인 질문은 [https://www.contributor-covenant.org/faq][FAQ]에서 FAQ를 -참조하세요. 번역은 [https://www.contributor-covenant.org/translations][translations]에서 -확인하실 수 있습니다. - -[homepage]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations diff --git a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-NL.md b/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-NL.md deleted file mode 100644 index 49923a2..0000000 --- a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-NL.md +++ /dev/null @@ -1,136 +0,0 @@ - -# Gedragscode Overeenkomst Medewerkers - -## Onze Belofte - -Wij als leden, medewerkers en leiders beloven deelname aan onze -gemeenschap een pesterij-vrije ervaring te maken voor iedereen, ongeacht leeftijd, lichaamsgrootte, -zichtbare of onzichtbare handicap, etniciteit, geslachtskenmerken, gender -identiteit en expressie, ervaringsniveau, opleiding, sociaal-economische status, -nationaliteit, persoonlijk voorkomen, ras, religie of seksuele identiteit -en geaardheid. - -Wij beloven te handelen en met elkaar om te gaan op manieren die bijdragen aan een open, gastvrije, -diverse, inclusieve en gezonde gemeenschap. - -## Onze Normen - -Voorbeelden van gedrag dat bijdraagt tot een positieve omgeving voor onze -gemeenschap omvatten: - -* Medeleven en vriendelijkheid tonen tegenover andere mensen -* Respect hebben voor verschillende meningen, standpunten en ervaringen -* Constructieve feedback geven en met dank aanvaarden -* Verantwoordelijkheid accepteren en excuses aanbieden aan degenen die door onze fouten zijn getroffen, - en leren van de ervaring -* Focussen op wat het beste is, niet alleen voor ons als individu, maar voor de - totale gemeenschap - -Voorbeelden van onaanvaardbaar gedrag zijn: - -* Het gebruik van seksueel getinte taal of beelden, en seksuele aandacht of - alle soorten avances -* Treiteren, beledigende of denigrerende opmerkingen en persoonlijke of politieke aanvallen. -* Openbare of persoonlijke intimidatie -* Publiceren van andermans persoonlijke informatie, zoals een fysiek adres of e-mail, - zonder hun uitdrukkelijke toestemming -* Ander gedrag dat normaal als ongepast kan worden beschouwd in een - professionele omgeving - -## Verantwoordelijkheden inzake Handhaving - -De leiders van de Gemeenschap zijn verantwoordelijk voor het verduidelijken -en handhaven van onze normen voor aanvaardbaar gedrag en zullen passende -en billijke corrigerende maatregelen nemen als reactie op gedrag dat zij ongepast, -bedreigend, beledigend of schadelijk achten. - -Leiders van de Gemeenschap hebben het recht en de verantwoordelijkheid om -commentaar, bijdragen, code, wikibewerkingen, issues en andere bijdragen die -niet in overeenstemming zijn met deze Gedragscode te verwijderen, te bewerken of -af te wijzen, en zullen de redenen voor moderatiebeslissingen zo nodig meedelen. - -## Toepassingsgebied - -Deze Gedragscode geldt binnen alle gemeenschapsruimtes en is ook van toepassing -wanneer iemand de gemeenschap officieel vertegenwoordigt in openbare ruimtes. -Voorbeelden van het vertegenwoordigen van onze gemeenschap zijn het gebruik van -een officieel e-mailadres, het posten via een officieel sociaal media-account of het -optreden als aangewezen vertegenwoordiger bij een online of offline evenement. - -## Handhaving - -Gevallen van beledigend, intimiderend of anderszins onaanvaardbaar gedrag kunnen -worden gemeld aan de gemeenschapsleiders die verantwoordelijk zijn voor de -handhaving op [info@rustdesk.com](mailto:info@rustdesk.com). -Alle klachten zullen snel en eerlijk worden onderzocht. - -Alle leiders van de gemeenschap zijn verplicht de privacy en de veiligheid van -de melder van een incident te respecteren. - -## Handhaving Richtlijnen - -De leiders van de Gemeenschap volgen deze Communautaire Impact Richtlijnen bij -het bepalen van de consequenties voor elke actie die zij in strijd achten -met deze Gedragscode: - -### 1. Rechtzetting - -**Gevolgen Gemeenschap**: Gebruik van ongepast taalgebruik of ander gedrag -dat onprofessioneel of ongewenst wordt geacht in de gemeenschap. - -**Gevolgen**: Een persoonlijke, schriftelijke waarschuwing van de leiders van -de gemeenschap, met duidelijkheid over de aard van de overtreding en een -uitleg waarom het gedrag ongepast was. -Een publieke verontschuldiging kan worden gevraagd. - -### 2. Waarschuwing - -**Gevolgen Gemeenschap**: Een overtreding door een enkel incident of -een reeks handelingen. - -**Gevolgen**: Geen interactie met de betrokken personen, inclusief -ongevraagde interactie met degenen die de Gedragscode handhaven, -gedurende een bepaalde periode. Dit omvat het vermijden van interacties -in gemeenschapsruimtes en externe kanalen zoals sociale media. -Overtreding van deze voorwaarden kan leiden tot een tijdelijke -of permanente uitsluiting. - -### 3. Tijdelijke Uitsluiting - -**Gevolgen Gemeenschap**: Een ernstige schending van de -gemeenschapsnormen, waaronder aanhoudend ongepast gedrag. - -**Gevolgen**: Een tijdelijk verbod op elke vorm van interactie -of openbare communicatie met de gemeenschap voor een bepaalde - periode. Geen openbare of private interactie met de betrokkenen, - inclusief ongevraagde interactie met degenen die de gedragscode - handhaven, is gedurende deze periode toegestaan. - Overtreding van deze voorwaarden kan leiden tot een permanente uitsluiting. - -### 4. Permanente Uitsluiting - -**Gevolgen Gemeenschap**: Aantonen van een patroon van schending van -de gemeenschapsnormen, waaronder aanhoudend ongepast gedrag, intimidatie -van een individu, of agressie tegen of vernedering van klassen van individuen. - -**Gevolgen**: Een permanente uitsluiting van elke vorm van publieke interactie -binnen de gemeenschap. - -## Naamsvermelding - -Deze gedragscode is overgenomen uit de [Bijdrager Overeenkomst][homepagina], -versie 2.0, beschikbaar op -[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. - -De Invloed op Richtlijnen voor Gemeenschap zijn gebaseerd op -[Mozilla's gedragscode handhavingslijst][Mozilla CoC]. - -Voor antwoorden op veelgestelde vragen over deze gedragscode, zie de FAQ op -[https://www.contributor-covenant.org/faq][FAQ]. Vertalingen zijn beschikbaar -op [https://www.contributor-covenant.org/translations][translations]. - -[homepagina]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[vertalingen]: https://www.contributor-covenant.org/translations diff --git a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-NO.md b/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-NO.md deleted file mode 100644 index baefda0..0000000 --- a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-NO.md +++ /dev/null @@ -1,125 +0,0 @@ - -# Atferdskodeks for bidragsyterpaktern - -## Hva Vi Står For - -Vi som medlemer, bidragere, og ledere står for å skape ett hat-fritt felleskap, -uansett alder, kroppstørrelse, synlig eller usynlige funksjonsnedsettninger, -etnesitet, kjønns karaktertrekk, kjønnsidentitet, kunnskapsnivå, utdanning, -sosial-økonomisk status, nasjonalitet, utsende, rase, religion, eller seksual -identitet og orientasjon. - -Vi står for åpen, velkommende, mangfold, inklusiv og sunn oppførsel i vårt felleskap. - -## Våre Standarer - -Eksempler på oppførsel som hjelper ett positivt felleskap inkluderer: - -* Vise empati og vennlighet mot andre mennesker -* Være respektfull ovenfor ulike meninger, synspunkter og erfaringer -* Gi og ta konstruktiv kritikk i beste mening -* Akseptere ansvar og unskylde seg for de som er utsatt av våre feil, - og lære av disse -* Fokusere på det som er best ikke bare for individer, men for felleskapet - -Eksempler på uakseptabel oppførsel inkluderer: - -* Bruk av seksualisert språk eller bilder, og seksual oppmerksomhet. -* Troll-ene, fornermende og nedsettende kommentarer, og personlig eller politiske angrep -* Offentlig eller privat trakassering -* Publisering av andres private informasjon, sånn som bosteds- og epost-addresser, - uten deres godskjenning. -* Andre rettningslinjer som kan bli sett på som upassende i en profesjonell setting. - -## Håndhevingsansvar - -Felleskapets ledere har ansvar for å klarifisere og håndheve våre standarer av -akseptert oppførsel og vill ta rimelige og rettferdige handliger som respons på -oppførsel de anser som upassende, truende, fornermende eller skadelig. - -Felleskapets ledere har retten og ansvaret til å fjerne, redigere, eller avslå -kommentarer, commits, kode, wiki endringer, issues, og andre birag som ikke -samsvarer med disse etiske rettningslinjene, og vill kommunisere grunner for -moderatorenes valg når passende. - -## Omfang - -Disse etiske rettningslinjene gjelder innenfor alle platformene til felleskapet, og -de gjelder også når ett individ representerer felleskapet på offentlige medier. -Eksempler på representasjon av vårt felleskap inkluderer bruke av offisielle e-mail -addresser, publisering gjennom en offisiell sosial media bruker, eller oppførsel som en -utpekt representant på digitale og fysiske arrangsjemanger. - -## Håndheving - -Hendelser av misbruk, trakasserende eller på noen måte uakseptert oppførsel kann -bli raportert til felleskapets ledere med ansvar for håndheving på -[info@rustdesk.com](mailto:info@rustdesk.com). -All tilbakemelding vill bli sett gjennom og investigert rettferdig så fort som mulig. - -Alle felleskapets ledere er obligert til å respektere privatlivet og sikkerhetet ovenfor -den som raporterer en hendelse. - -## Håndhevings Guide - -Felleskapets ledere vill følge disse Rettningslinjene for sammfunspåvirkning med -tanke på konsekvenser for en handling de anser i brudd med disse etiske rettningslinjene: - -### 1. Korreksjon - -**Sammfunspåvirkning**: Bruk av upassende språk eller annen oppførsel ansett som -uprofesjonelt eller uvelkommen i dette felleskapet. - -**Konsekvens**: En privat, skrevet advarsel fra en leder av felleskapet, som -klarifiserer grunnlaget til hvorfor denne oppførselen var upassende. En offentlig -unskyldning kan bli forespurt. - -### 2. Advarsel - -**Sammfunspåvirkning**: Ett brudd på en singulær hendelse eller en serie handlinger. - -**Konsekvens**: En advarsel med konsekvenser for kontinuerende oppførsel. Ingen -interaksjon med individene involvert, inkluderer uoppfordret interaksjoner med -de som håndhever disse etiske rettningslinjene, er tillat for en spesifisert tidsperiode. -Dette inkluderer å unngå interaksjoner i felleskapets platformer, samt eksterne -kanaler, som f.eks sosial media. Brudd av disse vilkårene kan føre til midlertidig -eller permanent bannlysning. - -### 3. Midlertidig Bannlysning - -**Sammfunspåvirkning**: Ett særiøst brudd på felleskapets standarer, inkludert -vedvarende upassende oppførsel. - -**Konsekvens**: En midlertidig bannlysning fra noen som helst interaksjon eller -offentlig kommunikasjon med felleskapet for en spesifisert tidsperiode. Ingen -interaksjon med individene involvert, inkluderer uoppfordret interaksjoner med -de som håndhever disse etiske rettningslinjene, er tillat for denne perioden. -Brudd på disse vilkårene kan føre til permanent bannlysning. - -### 4. Permanent Bannlysning - -**Sammfunspåvirkning**: Demonstasjon av mønster i brudd på felleskapets standarer, -inklusivt vedvarende upassende oppførsel, trakassering av ett individ, eller -aggresjon mot eller nedsettelse av grupper individer. - -**Konsekvens**: En permanent bannlysning fra alle offentlige interaksjoner i -felleskapet - -## Attribusjon - -Disse etiske rettningslinjene er adaptert fra [Contributor Covenant][homepage], -versjon 2.0, tilgjengelig ved -[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. - -Sammfunspåvirknings guid inspirert av -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. - -For svar til vanlige spørsmål angående disse etiske rettningslinjene, se FAQ på -[https://www.contributor-covenant.org/faq][FAQ]. Oversettelse tilgjengelig -ved [https://www.contributor-covenant.org/translations][translations]. - -[homepage]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations diff --git a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-PL.md b/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-PL.md deleted file mode 100644 index 8aedf83..0000000 --- a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-PL.md +++ /dev/null @@ -1,133 +0,0 @@ - -# Kod postępowania Contributor Covenant Code of Conduct - -## Nasza przysięga - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Nasze standardy - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -[info@rustdesk.com](mailto:info@rustdesk.com). -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. - -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. - -For answers to common questions about this code of conduct, see the FAQ at -[https://www.contributor-covenant.org/faq][FAQ]. Translations are available -at [https://www.contributor-covenant.org/translations][translations]. - -[homepage]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations diff --git a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-RO.md b/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-RO.md deleted file mode 100644 index 6fe8564..0000000 --- a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-RO.md +++ /dev/null @@ -1,85 +0,0 @@ -# Codul de Conduită al Contributorilor - -## Angajamentul Nostru - -Noi, ca membri, contribuitori și lideri, ne angajăm să facem ca participarea în comunitatea noastră să fie o experiență fără hărțuire pentru toată lumea, indiferent de vârstă, dimensiunea corpului, dizabilități vizibile sau invizibile, etnie, caracteristici sexuale, identitate și exprimare de gen, nivel de experiență, educație, statut socio-economic, naționalitate, aspect personal, rasă, religie sau identitate și orientare sexuală. - -Ne angajăm să acționăm și să interacționăm în moduri care contribuie la o comunitate deschisă, primitoare, diversă, incluzivă și sănătoasă. - -## Standardele Noastre - -Exemple de comportamente care contribuie la un mediu pozitiv pentru comunitatea noastră includ: - -* Demonstrarea empatiei și a bunătății față de ceilalți -* Respectarea opiniilor, punctelor de vedere și experiențelor diferite -* Oferirea și acceptarea cu grație a feedback-ului constructiv -* Asumarea responsabilității și cererea de scuze celor afectați de greșelile noastre și învățarea din experiență -* Concentrarea pe ceea ce este cel mai bun nu doar pentru noi ca indivizi, ci pentru întreaga comunitate - -Exemple de comportamente inacceptabile includ: - -* Utilizarea limbajului sau imaginilor sexualizate, precum și atenția sau avansurile sexuale de orice fel -* Trollare, insulte sau comentarii denigratoare și atacuri personale sau politice -* Hărțuire publică sau privată -* Publicarea informațiilor private ale altora, cum ar fi adresa fizică sau de e-mail, fără permisiunea explicită -* Alte comportamente care ar putea fi considerate inadecvate într-un cadru profesional - -## Responsabilități de Aplicare - -Liderii comunității sunt responsabili pentru clarificarea și aplicarea standardelor noastre de comportament acceptabil și vor lua măsuri corective adecvate și echitabile ca răspuns la orice comportament pe care îl consideră inadecvat, amenințător, ofensator sau dăunător. - -Liderii comunității au dreptul și responsabilitatea de a elimina, edita sau respinge comentarii, commit-uri, cod, editări wiki, probleme și alte contribuții care nu se aliniază acestui Cod de Conduită și vor comunica motivele pentru deciziile de moderare atunci când este cazul. - -## Domeniu de Aplicare - -Acest Cod de Conduită se aplică în toate spațiile comunității și se aplică și atunci când un individ reprezintă oficial comunitatea în spații publice. -Exemple de reprezentare a comunității includ utilizarea unei adrese de e-mail oficiale, postarea printr-un cont oficial de social media sau acționarea ca reprezentant desemnat la un eveniment online sau offline. - -## Aplicare - -Cazurile de comportament abuziv, hărțuitor sau altfel inacceptabil pot fi raportate liderilor comunității responsabili pentru aplicare la [info@rustdesk.com](mailto:info@rustdesk.com). -Toate plângerile vor fi revizuite și investigate prompt și corect. - -Toți liderii comunității sunt obligați să respecte confidențialitatea și securitatea persoanei care raportează orice incident. - -## Ghiduri de Aplicare - -Liderii comunității vor urma aceste Ghiduri privind Impactul Comunității pentru a stabili consecințele pentru orice acțiune pe care o consideră o încălcare a acestui Cod de Conduită: - -### 1. Corectare - -**Impact asupra comunității**: Utilizarea limbajului neadecvat sau alte comportamente considerate neprofesionale sau nedorite în comunitate. - -**Consecință**: O avertizare scrisă și privată din partea liderilor comunității, oferind claritate asupra naturii încălcării și o explicație despre motivul pentru care comportamentul a fost inadecvat. Poate fi cerută o scuză publică. - -### 2. Avertisment - -**Impact asupra comunității**: Încălcare printr-un incident singular sau o serie de acțiuni. - -**Consecință**: Un avertisment cu consecințe pentru continuarea comportamentului. Nicio interacțiune cu persoanele implicate, inclusiv interacțiuni nesolicitate cu cei care aplică Codul de Conduită, pentru o perioadă specificată. Aceasta include evitarea interacțiunilor în spațiile comunității, precum și pe canale externe, cum ar fi rețelele sociale. Încălcarea acestor termeni poate duce la o suspendare temporară sau permanentă. - -### 3. Suspendare Temporară - -**Impact asupra comunității**: O încălcare serioasă a standardelor comunității, inclusiv comportament neadecvat susținut. - -**Consecință**: Suspendare temporară de la orice tip de interacțiune sau comunicare publică cu comunitatea pentru o perioadă specificată. Nicio interacțiune publică sau privată cu persoanele implicate, inclusiv interacțiuni nesolicitate cu cei care aplică Codul de Conduită, nu este permisă în această perioadă. Încălcarea acestor termeni poate duce la o interdicție permanentă. - -### 4. Interdicție Permanentă - -**Impact asupra comunității**: Demonstrând un tipar de încălcare a standardelor comunității, inclusiv comportament neadecvat susținut, hărțuire a unei persoane sau agresiune față de sau denigrare a unor grupuri de persoane. - -**Consecință**: Interdicție permanentă de la orice tip de interacțiune publică în cadrul comunității. - -## Atribuire - -Acest Cod de Conduită este adaptat din [Contributor Covenant][homepage], versiunea 2.0, disponibil la [https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. - -Ghidurile privind Impactul Comunității au fost inspirate de [scara de aplicare a codului de conduită Mozilla][Mozilla CoC]. - -Pentru răspunsuri la întrebări frecvente despre acest cod de conduită, vezi FAQ la [https://www.contributor-covenant.org/faq][FAQ]. Traduceri sunt disponibile la [https://www.contributor-covenant.org/translations][translations]. - -[homepage]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-RU.md b/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-RU.md deleted file mode 100644 index 53f4ab8..0000000 --- a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-RU.md +++ /dev/null @@ -1,134 +0,0 @@ - -# Кодекс поведения участников и вкладчиков - -## Наше обещание - -Мы, как члены, вкладчики и лидеры, обязуемся сделать участие в нашем -сообществе свободным от притеснений для всех, независимо от возраста, -размера тела, видимой или невидимой инвалидности, этнической принадлежности, половых характеристик, гендерной -идентичности и самовыражения, уровня опыта, образования, социально-экономического статуса, -национальности, внешнего вида, расы, религии или сексуальной идентичности -и ориентации. - -Мы обязуемся действовать и взаимодействовать таким образом, чтобы способствовать созданию открытого, гостеприимного, -разнообразного, инклюзивного и здорового сообщества. - -## Наши Стандарты - -Примеры поведения, способствующего созданию благоприятной среды для нашего -сообщества, включают: - -* Демонстрация сочувствия и доброты по отношению к другим людям -* Уважительное отношение к различным мнениям, точкам зрения и опыту -* Предоставление и вежливое принятие конструктивной обратной связи -* Принятие ответственности и извинения перед теми, кто пострадал от наших ошибок, -а также извлечение уроков из накопленного опыта -* Сосредоточение внимания на том, что лучше не только для нас как отдельных людей, но и для -всего сообщества в целом. - -Примеры неприемлемого поведения включают: - -* Использование сексуализированных выражений или образов, а также сексуальное внимание или -заигрывания любого рода -* Троллинг, оскорбительные или уничижительные комментарии, а также личные или политические нападки -* Публичные или частные домогательства -* Публикация личной информации других лиц, такой как физический адрес или адрес электронной -почты, без их явного разрешения -* Другое поведение, которое можно обоснованно считать неуместным в -профессиональной среде - -## Правоприменительные обязанности - -Лидеры сообщества несут ответственность за разъяснение и обеспечение соблюдения наших стандартов -приемлемого поведения и предпримут надлежащие и справедливые корректирующие действия в -ответ на любое поведение, которое они сочтут неуместным, угрожающим, оскорбительным -или вредным. - -Лидеры сообщества имеют право и ответственность удалять, редактировать или отклонять -комментарии, коммиты, код, вики-правки, проблемы и другие материалы, которые -не соответствуют настоящему Кодексу поведения, и -при необходимости сообщат причины принятия решений о модерации. - -## Сфера действия - -Этот Кодекс поведения применяется во всех общественных местах, а также применяется, когда -физическое лицо официально представляет сообщество в общественных местах. -Примеры представления нашего сообщества включают использование официального адреса электронной почты, -размещение сообщений через официальную учетную запись в социальных сетях или выступление в качестве назначенного -представителя на онлайн- или оффлайн-мероприятии. - -## Правоприменение - -О случаях оскорбительного, домогательского или иного неприемлемого поведения можно -сообщать лидерам сообщества, ответственным за правоприменение в -[info@rustdesk.com ](mailto:info@rustdesk.com). -Все жалобы будут рассмотрены и расследованы быстро и справедливо. - -Все лидеры сообщества обязаны уважать частную жизнь и безопасность -репортера о любом инциденте. - -## Руководящие принципы воздействия - -Лидеры сообщества будут следовать этим руководящим принципам воздействия на сообщество при определении -последствий любого действия, которое они сочтут нарушением настоящего Кодекса поведения: - -### 1. Правки - -**Воздействие на сообщество**: Использование неподобающих выражений или другого поведения, которое считается -непрофессиональным или нежелательным в сообществе. - -**Последствие**: частное письменное предупреждение от лидеров сообщества, дающее -ясность в отношении характера нарушения и объяснение того, почему -поведение было неуместным. Могут быть запрошены публичные извинения. - - -### 2. Предупреждение - -**Воздействие на сообщество**: нарушение в результате одного инцидента или серии -действий. - -**Последствие**: Предупреждение с последствиями для дальнейшего поведения. Никакого -взаимодействия с вовлеченными лицами, включая нежелательное взаимодействие с -теми, кто обеспечивает соблюдение Кодекса поведения, в течение определенного периода времени. Это -включает в себя избегание взаимодействия в общественных пространствах, а также внешних каналов -, таких как социальные сети. Нарушение этих условий может привести к временному или -постоянному запрету. - -### 3. Временная блокировка - -**Воздействие на сообщество**: Серьезное нарушение стандартов сообщества, включая -длительное неподобающее поведение. - -**Последствие**: Временный запрет на любое взаимодействие или публичное -общение с сообществом в течение определенного периода времени. -В течение этого периода не допускается никакое публичное или частное взаимодействие с вовлеченными лицами, включая незапрашиваемое взаимодействие -с теми, кто обеспечивает соблюдение Кодекса поведения. -Нарушение этих условий может привести к постоянному запрету. - -### 4. Блокировка навсегда - -**Воздействие на сообщество**: Демонстрация модели нарушения -стандартов сообщества, включая постоянное неподобающее поведение, преследование отдельного -лица или агрессию по отношению к классам людей или пренебрежительное отношение к ним. - -**Последствие**: Постоянный запрет на любое публичное взаимодействие внутри -сообщества. - -## Определение - -Настоящий Кодекс поведения адаптирован из [Соглашения о вкладчиках][homepage], -версии 2.0, доступной по ссылке -[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. - -Руководящие принципы воздействия на сообщество были вдохновлены -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. - -Ответы на распространенные вопросы об этом кодексе поведения см. в разделе Часто задаваемые вопросы по адресу -[https://www.contributor-covenant.org/faq][FAQ]. Переводы доступны -по адресу [https://www.contributor-covenant.org/translations][translations]. - -[homepage]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations diff --git a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-TR.md b/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-TR.md deleted file mode 100644 index 76088bd..0000000 --- a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-TR.md +++ /dev/null @@ -1,89 +0,0 @@ -# Katkıda Bulunanların Davranış Kuralları - -## Taahhüdümüz - -Biz üyeler, katkıda bulunanlar ve liderler olarak, yaş, beden büyüklüğü, görünür veya görünmez engellilik, etnik köken, cinsiyet özellikleri, cinsiyet kimliği ve ifadesi, deneyim seviyesi, eğitim, sosyo-ekonomik durum, milliyet, kişisel görünüm, ırk, din veya cinsel kimlik ve yönelim ayrımı gözetmeksizin herkes için topluluğumuzdaki katılımı taciz içermeyen bir deneyim haline getirmeyi taahhüt ederiz. - -Açık, hoşgörülü, çeşitli, kapsayıcı ve sağlıklı bir topluluğa katkıda bulunacak şekillerde hareket etmeyi ve etkileşimde bulunmayı taahhüt ederiz. - -## Standartlarımız - -Topluluğumuz için olumlu bir ortam yaratmaya katkıda bulunan davranış örnekleri şunlardır: - -* Diğer insanlara empati ve nezaket göstermek -* Farklı görüşlere, bakış açılarına ve deneyimlere saygılı olmak -* Yapıcı eleştiriyi vermek ve zarifçe kabul etmek -* Hatalarımızdan etkilenenlere sorumluluk kabul etmek, özür dilemek ve deneyimden öğrenmek -* Sadece bireyler olarak değil, aynı zamanda genel topluluk için en iyisi üzerine odaklanmak - -Kabul edilemez davranış örnekleri şunları içerir: - -* Cinselleştirilmiş dil veya imgelerin kullanımı ve cinsel ilgi veya herhangi bir türdeki yaklaşımlar -* Trollük, aşağılayıcı veya hakaret içeren yorumlar ve kişisel veya siyasi saldırılar -* Kamuoyu veya özel taciz -* Başkalarının fiziksel veya e-posta adresi gibi özel bilgilerini, açık izinleri olmadan yayınlamak -* Profesyonel bir ortamda makul bir şekilde uygunsuz kabul edilebilecek diğer davranışlar - -## Uygulama Sorumlulukları - -Topluluk liderleri, kabul edilebilir davranış standartlarımızı açıklığa kavuşturmak ve uygulamakla sorumludur ve uygunsuz, tehditkar, saldırgan veya zarar verici herhangi bir davranışa yanıt olarak uygun ve adil düzeltici önlemler alacaklardır. - -Topluluk liderleri, bu Davranış Kurallarına uyumlu olmayan yorumları, taahhütlerini veya kodu, wiki düzenlemelerini, sorunları ve diğer katkıları kaldırma, düzenleme veya reddetme hakkına sahiptir. Denetim kararlarının nedenlerini uygun olduğunda ileteceklerdir. - -## Kapsam - -Bu Davranış Kuralları, tüm topluluk alanlarında geçerlidir ve aynı zamanda birey resmi olarak topluluğu halka açık alanlarda temsil ettiğinde de geçerlidir. Topluluğumuzu temsil etme örnekleri, resmi bir e-posta adresi kullanmak, resmi bir sosyal medya hesabı üzerinden gönderi yapmak veya çevrimiçi veya çevrimdışı bir etkinlikte atanmış bir temsilci olarak hareket etmeyi içerir. - -## Uygulama - -Taciz edici, rahatsız edici veya başka türlü kabul edilemez davranış örnekleri, [info@rustdesk.com](mailto:info@rustdesk.com) adresindeki uygulama sorumlularına bildirilebilir. Tüm şikayetler hızlı ve adil bir şekilde incelenecek ve araştırılacaktır. - -Tüm topluluk liderleri, olayın raporlayıcısının gizliliğine ve güvenliğine saygı gösterme yükümlülüğündedir. - -## Uygulama Kılavuzları - -Topluluk liderleri, bu Davranış Kurallarını ihlal olarak değerlendirdikleri herhangi bir eylem için bu Topluluk Etkisi Kılavuzlarını izleyeceklerdir: - -### 1. Düzeltme - -**Topluluk Etkisi**: Topluluk içinde profesyonel veya hoşgörülü olmayan uygun olmayan dil veya diğer davranışların kullanımı. - -**Sonuç**: Topluluk liderlerinden özel ve yazılı bir uyarı almak, ihlalin niteliği ve davranışın nedeninin açıklığa kavuşturulması. Bir kamu özrü istenebilir. - -### 2. Uyarı - -**Topluluk Etkisi**: Tek bir olay veya dizi aracılığıyla bir ihlal. - -**Sonuç**: Devam eden davranış için sonuçları olan bir uyarı. Topluluk liderleri de dahil olmak üzere ihlalle ilgili kişilerle etkileşim, belirli bir süre boyunca önerilmez. Bu, topluluk alanlarında ve sosyal medya gibi harici kanallarda etkileşimleri içerir. Bu koşulları ihlal etmek geçici veya kalıcı bir yasağa yol açabilir. - -### 3. Geçici Yasak - -**Topluluk Etkisi**: Sürekli uygunsuz davranış da dahil olmak üzere topluluk standartlarının ciddi bir ihlali. - -**Sonuç**: Belirli bir süre için toplulukla herhangi bir türdeki etkileşim veya halka açık iletişimden geçici bir yasak. Bu dönem boyunca, toplul - -ukla veya uygulama kurallarını uygulayanlarla her türlü kamuoyu veya özel etkileşim izin verilmez. Bu koşulları ihlal etmek geçici veya kalıcı bir yasağa yol açabilir. - -### 4. Kalıcı Yasak - -**Topluluk Etkisi**: Topluluk standartlarının ihlalinde sürekli bir desen sergilemek, bireye sürekli olarak uygun olmayan davranışlarda bulunmak, bir bireye tacizde bulunmak veya birey sınıflarına karşı saldırganlık veya aşağılama yapmak. - -**Sonuç**: Topluluk içinde her türlü halka açık etkileşimden kalıcı bir yasak. - -## Atıf - -Bu Davranış Kuralları, [Contributor Covenant][anasayfa], 2.0 sürümünden uyarlanmıştır ve -[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0] adresinde bulunmaktadır. - -Topluluk Etkisi Kılavuzları, -[Mozilla'nın davranış kuralları uygulama merdiveni][Mozilla DK] tarafından ilham alınarak oluşturulmuştur. - -Bu davranış kuralları hakkında yaygın soruların cevapları için, SSS'ye göz atın: -[https://www.contributor-covenant.org/faq][SSS]. Çeviriler, -[https://www.contributor-covenant.org/translations][çeviriler] adresinde bulunabilir. - -[anasayfa]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[Mozilla DK]: https://github.com/mozilla/diversity -[SSS]: https://www.contributor-covenant.org/faq -[çeviriler]: https://www.contributor-covenant.org/translations diff --git a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-ZH.md b/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-ZH.md deleted file mode 100644 index 0877ab2..0000000 --- a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT-ZH.md +++ /dev/null @@ -1,87 +0,0 @@ - -# 贡献者公约行为准则 - -## 我们的承诺 - -身为社区成员、贡献者和领袖,我们承诺使社区参与者不受骚扰,无论其年龄、体型、可见或不可见的缺陷、族裔、性征、性别认同和表达、经验水平、教育程度、社会与经济地位、国籍、相貌、种族、种姓、肤色、宗教信仰、性倾向或性取向如何。 - -我们承诺以有助于建立开放、友善、多样化、包容、健康社区的方式行事和互动。 - -## 我们的标准 - -有助于为我们的社区创造积极环境的行为例子包括但不限于: - -* 表现出对他人的同情和善意 -* 尊重不同的主张、观点和感受 -* 提出和大方接受建设性意见 -* 承担责任并向受我们错误影响的人道歉 -* 注重社区共同诉求,而非个人得失 - -不当行为例子包括: - -* 使用情色化的语言或图像,及性引诱或挑逗 -* 嘲弄、侮辱或诋毁性评论,以及人身或政治攻击 -* 公开或私下的骚扰行为 -* 未经他人明确许可,公布他人的私人信息,如物理或电子邮件地址 -* 其他有理由认定为违反职业操守的不当行为 - -## 责任和权力 - -社区领袖有责任解释和落实我们所认可的行为准则,并妥善公正地对他们认为不当、威胁、冒犯或有害的任何行为采取纠正措施。 - -社区领导有权力和责任删除、编辑或拒绝或拒绝与本行为准则不相符的评论(comment)、提交(commits)、代码、维基(wiki)编辑、议题(issues)或其他贡献,并在适当时机知采取措施的理由。 - -## 适用范围 - -本行为准则适用于所有社区场合,也适用于在公共场所代表社区时的个人。 - -代表社区的情形包括使用官方电子邮件地址、通过官方社交媒体帐户发帖或在线上或线下活动中担任指定代表。 - -## 监督 - -辱骂、骚扰或其他不可接受的行为可通过[info@rustdesk.com](mailto:info@rustdesk.com)向负责监督的社区领袖报告。 所有投诉都将得到及时和公平的审查和调查。 - -所有社区领袖都有义务尊重任何事件报告者的隐私和安全。 - -## 处理方针 - -社区领袖将遵循下列社区处理方针来明确他们所认定违反本行为准则的行为的处理方式: - -### 1. 纠正 - -**社区影响**: 使用不恰当的语言或其他在社区中被认定为不符合职业道德或不受欢迎的行为。 - -**处理意见**: 由社区领袖发出非公开的书面警告,明确说明违规行为的性质,并解释举止如何不妥。或将要求公开道歉。 - -### 2. 警告 - -**社区影响**: 单个或一系列违规行为。 - -**处理意见**: 警告并对连续性行为进行处理。在指定时间内,不得与相关人员互动,包括主动与行为准则执行者互动。这包括避免在社区场所和外部渠道中的互动。违反这些条款可能会导致临时或永久封禁。 - -### 3. 临时封禁 - -**社区影响**: 严重违反社区准则,包括持续的不当行为。 - -**处理意见**: 在指定时间内,暂时禁止与社区进行任何形式的互动或公开交流。在此期间,不得与相关人员进行公开或私下互动,包括主动与行为准则执行者互动。违反这些条款可能会导致永久封禁。 - -### 4. 永久封禁 - -**社区影响**: 行为模式表现出违反社区准则,包括持续的不当行为、骚扰个人或攻击或贬低某个类别的个体。 - -**处理意见**: 永久禁止在社区内进行任何形式的公开互动。 - -## 参见 - -本行为准则改编自[参与者公约][homepage]2.0 版, 参见 -[https://www.contributor-covenant.org/zh-cn/version/2/0/code_of_conduct.html][v2.0]. - -指导方针借鉴自[Mozilla纪检分级][Mozilla CoC]. - -有关本行为准则的常见问题的答案,参见 [https://www.contributor-covenant.org/faq][FAQ]。 其他语言翻译参见[https://www.contributor-covenant.org/translations][translations]。 - -[homepage]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/zh-cn/version/2/0/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT.md b/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT.md deleted file mode 100644 index e5db8ed..0000000 --- a/shelled/rustdesk-as-ref/docs/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,133 +0,0 @@ - -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -[info@rustdesk.com](mailto:info@rustdesk.com). -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. - -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. - -For answers to common questions about this code of conduct, see the FAQ at -[https://www.contributor-covenant.org/faq][FAQ]. Translations are available -at [https://www.contributor-covenant.org/translations][translations]. - -[homepage]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-DE.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-DE.md deleted file mode 100644 index b45c23d..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-DE.md +++ /dev/null @@ -1,50 +0,0 @@ -# Beiträge zu RustDesk - -RustDesk begrüßt Beiträge von jedem. Hier sind die Richtlinien, wenn Sie uns -helfen möchten: - -## Beiträge - -Beiträge zu RustDesk oder seinen Abhängigkeiten sollten in Form von Pull -Requests auf GitHub erfolgen. Jeder Pull Request wird von einem Hauptakteur -(jemand mit der Erlaubnis, Korrekturen einzubringen) geprüft und entweder in den -Hauptbaum eingefügt oder Feedback für notwendige Änderungen gegeben. Alle -Beiträge sollten diesem Format folgen, auch die von Hauptakteuren. - -Wenn Sie an einem Problem arbeiten möchten, melden Sie es bitte zuerst an, indem -Sie auf GitHub erklären, dass Sie daran arbeiten möchten. Damit soll verhindert -werden, dass Beiträge zum gleichen Thema doppelt bearbeitet werden. - -## Checkliste für Pull Requests - -- Verzweigen Sie sich vom Master-Branch und, falls nötig, wechseln Sie zum - aktuellen Master-Branch, bevor Sie Ihren Pull Request einreichen. Wenn das - Zusammenführen mit dem Master nicht reibungslos funktioniert, werden Sie - möglicherweise aufgefordert, Ihre Änderungen zu überarbeiten. - -- Commits sollten so klein wie möglich sein und gleichzeitig sicherstellen, dass - jeder Commit unabhängig voneinander korrekt ist (d. h., jeder Commit sollte - sich übersetzen lassen und Tests bestehen). - -- Commits sollten von einem "Herkunftszertifikat für Entwickler" - (https://developercertificate.org) begleitet werden, das besagt, dass Sie (und - ggf. Ihr Arbeitgeber) mit den Bedingungen der [Projektlizenz](../LICENCE) - einverstanden sind. In Git ist dies die Option `-s` für `git commit`. - -- Wenn Ihr Patch nicht begutachtet wird oder Sie eine bestimmte Person zur - Begutachtung benötigen, können Sie einem Gutachter mit @ antworten und um eine - Begutachtung des Pull Requests oder einen Kommentar bitten. Sie können auch - per [E-Mail](mailto:info@rustdesk.com) um eine Begutachtung bitten. - -- Fügen Sie Tests hinzu, die sich auf den behobenen Fehler oder die neue - Funktion beziehen. - -Spezifische Git-Anweisungen finden Sie im [GitHub-Workflow](https://github.com/servo/servo/wiki/GitHub-workflow). - -## Verhalten - -https://github.com/rustdesk/rustdesk/blob/master/docs/CODE_OF_CONDUCT.md - -## Kommunikation - -RustDesk-Mitarbeiter arbeiten häufig im [Discord](https://discord.gg/nDceKgxnkV). diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-ID.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-ID.md deleted file mode 100644 index cdff6c0..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-ID.md +++ /dev/null @@ -1,31 +0,0 @@ -# Berkontribusi dalam pengembangan RustDesk - -RustDesk mengajak semua orang untuk ikut berkontribusi. Berikut ini adalah panduan jika kamu sedang mempertimbangkan untuk memberikan bantuan kepada kami: - -## Kontirbusi - -Untuk melakukan kontribusi pada RustDesk atau dependensinya, sebaiknya dilakukan dalam bentuk pull request di GitHub. Setiap permintaan pull request akan ditinjau oleh kontributor utama atau seseorang yang memiliki wewenang untuk menggabungkan perubahan kode, baik yang sudah dimasukkan ke dalam struktur utama ataupun memberikan umpan balik untuk perubahan yang akan diperlukan. Setiap kontribusi harus sesuai dengan format ini, juga termasuk yang berasal dari kontributor utama. - -Apabila kamu ingin mengatasi sebuah masalah yang sudah ada di daftar issue, harap klaim terlebih dahulu dengan memberikan komentar pada GitHub issue yang ingin kamu kerjakan. Hal ini dilakukan untuk mencegah terjadinya duplikasi dari kontributor pada daftar issue yang sama. - -## Pemeriksaan Pull Request - -- Branch yang menjadi acuan adalah branch master dari repositori utama dan, jika diperlukan, lakukan rebase ke branch master yang terbaru sebelum kamu mengirim pull request. Apabila terdapat masalah kita melakukan proses merge ke branch master kemungkinan kamu akan diminta untuk melakukan rebase pada perubahan yang sudah dibuat. - -- Sebaiknya buatlah commit seminimal mungkin, sambil memastikan bahwa setiap commit yang dibuat sudah benar (contohnya, setiap commit harus bisa di kompilasi dan berhasil melewati tahap test). - -- Setiap commit harus disertai dengan tanda tangan Sertifikat Asal Pengembang (Developer Certificate of Origin) (), yang mengindikasikan bahwa kamu (and your employer if applicable) bersedia untuk patuh terhadap persyaratan dari [lisensi projek](../LICENCE). Di git bash, ini adalah opsi parameter `-s` pada `git commit` - -- Jika perubahan yang kamu buat tidak mendapat tinjauan atau kamu membutuhkan orang tertentu untuk meninjaunya, kamu bisa @-reply seorang reviewer meminta peninjauan dalam permintaan pull request atau komentar, atau kamu bisa meminta tinjauan melalui [email](mailto:info@rustdesk.com). - -- Sertakan test yang relevan terhadap bug atau fitur baru yang sudah dikerjakan. - -Untuk instruksi Git yang lebih lanjut, cek disini [GitHub workflow 101](https://github.com/servo/servo/wiki/GitHub-workflow). - -## Tindakan - - - -## Komunikasi - -Kontributor RustDesk sering berkunjung ke [Discord](https://discord.gg/nDceKgxnkV). diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-IT.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-IT.md deleted file mode 100644 index a3a5fd2..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-IT.md +++ /dev/null @@ -1,37 +0,0 @@ -# Contribuzione a RustDesk - -RustDesk accoglie con favore il contributo di tutti. -Ecco le linee guida se stai pensando di aiutarci. - -## Contribuzione - -I contributi a RustDesk o alle sue dipendenze dovrebbero essere forniti sotto forma di richieste pull GitHub. -Ogni richiesta pull verr esaminata da un collaboratore principale (qualcuno con il permesso di applicare) ed abilitato all'uso dell'albero principale o dare un feedback per le modifiche che sarebbero necessarie. -Tutti i contributi dovrebbero seguire questo formato, anche quelli dei contributori principali. - -Se desideri lavorare su un problema, rivendicalo prima commentando -il problema di GitHub su cui vuoi lavorare. -Questo per evitare duplicati sforzi dei contributori sullo stesso problema. - -## Elenco di controllo delle richieste pull - -- Branch del master branch e, se necessario, rebase al master attuale branch prima di inviare la richiesta pull. - Se l'unione non in mod pulito con il master ti potrebbe essere chiesto di effettuare il rebase delle modifiche. - -- Le modifiche dovrebbero essere le pi piccole possibile, assicurando al tempo stesso che ogni modifica sia corretta in modo indipendente (ovvero, ogni modifica dovrebbe essere compilabile e superare i test). - -- Le modifiche devono essere accompagnati da un certificato di origine per sviluppatori firmato (http://developercertificate.org), che indica che tu (e il tuo datore di lavoro se applicabile) accetti di essere vincolato dai termini della [licenza progetto](../LICENCE). In git, questa l'opzione `-s` di `git commit` - -- Se la tua patch non viene esaminata o hai bisogno che una persona specifica la esamini, puoi @-rispondere ad un revisore chiedendo una revisione nella richiesta pull o un commento, oppure puoi chiedere una revisione tramite [email](mailto:info@rustdesk.com). - -- Aggiungi test relativi al bug corretto o alla nuova funzionalit. - -Per istruzioni specifiche su git, vedi [Workflow GitHub - 101](https://github.com/servo/servo/wiki/GitHub-workflow). - -## Condotta - -https://github.com/rustdesk/rustdesk/blob/master/docs/CODE_OF_CONDUCT-IT.md - -## Comunicazioni - -I contributori di RustDesk frequentano [Discord](https://discord.gg/nDceKgxnkV). diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-JP.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-JP.md deleted file mode 100644 index 03a1853..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-JP.md +++ /dev/null @@ -1,41 +0,0 @@ -# RustDesk へのコントリビュート - -RustDesk は皆さんからのコントリビュートを歓迎します。ご協力いただける方のガイドラインは -以下の通りです: - -## コントリビューション - -RustDesk またはその依存関係へのコントリビュートは、GitHub のプルリクエストの形で行ってください。 -それぞれのプルリクエストは、コアコントリビューター(パッチの適用を許可されている人)によってレビューされ、 -メインツリーに適用されるか、必要な変更についてのフィードバックが与えられます。 -コアコントリビューターからのものであっても、すべてのコントリビューターはこのフォーマットに従うべきです。 - -ある issue に取り組みたい場合は、GitHub の issue にコメントすることで、まずその対応を主張してください。 -これは、同じ issue に対するコントリビューターの重複作業を防ぐためです。 - -## プルリクエストのチェックリスト - -- master ブランチからブランチし、必要であればプルリクエストを提出する前に現在の master ブランチにリベースしてください。 - master と正しくマージできない場合、変更をリベースするよう求められる可能性があります。 - -- コミットは、各コミットが独立して正しい(すなわち、各コミットがコンパイルされ、テストに合格する)ことを保証しながら、 - 可能な限り小さくすべきです。 - -- コミットには、Developer Certificate of Origin (http://developercertificate.org) の sign-off を添えてください。 - これは、あなた(および該当する場合はあなたの雇用主)が [プロジェクトのライセンス](../LICENCE) の条項に拘束されることに - 同意していることを示すものです。git では、これは `git commit` の `-s` オプションを使います。 - -- もしあなたのパッチがレビューされなかったり、特定の人にレビューしてもらう必要がある場合、 - プルリクエストやコメントでレビューを依頼するレビュアーに@返信したり、[email](mailto:info@rustdesk.com) でレビューを依頼することができます。 - -- 修正したバグや新機能に関連するテストを追加する。 - -具体的なgitの手順については、[GitHub workflow 101](https://github.com/servo/servo/wiki/GitHub-workflow)を参照してください。 - -## 行動規範 - -https://github.com/rustdesk/rustdesk/blob/master/docs/CODE_OF_CONDUCT.md - -## コミュニケーション - -RustDesk のコントリビューターは、[Discord](https://discord.gg/nDceKgxnkV) を良く使っています。 diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-KR.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-KR.md deleted file mode 100644 index 5e43264..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-KR.md +++ /dev/null @@ -1,46 +0,0 @@ -# RustDesk 기여하기 - -RustDesk는 모든 분들의 참여를 환영합니다. 저희를 도와주실 생각이 있으시다면 - 다음 지침을 따르세요: - -## 기여 - -RustDesk 또는 그 종속성에 대한 기여는 GitHub 풀 리퀘스트 형태로 -이루어져야 합니다. 각 풀 리퀘스트는 핵심 기여자 (패치 적용 권한이 -있는 사람)가 검토하여 메인 트리에 추가하거나 필요한 변경 사항에 -대한 피드백을 제공합니다. 핵심 기여자의 기여를 포함하여 모든 기여는 -이 형식을 따라야 합니다. - -이슈에 대해 작업하고 싶으시면 먼저 해당 이슈에 대해 작업하고 싶다는 -댓글을 달아 해당 이슈를 요청하세요. 이는 동일한 이슈에 대한 기여자의 -중복된 노력을 방지하기 위한 것입니다. - -## 풀 리퀘스트 체크리스트 - -- Master 브랜치에서 브랜치를 만들고, 필요한 경우 풀 리퀘스트를 제출하기 - 전에 현재 마스터 브랜치로 리베이스하세요. 마스터 브랜치와 깔끔하게 - 병합되지 않으면 변경 사항을 리베이스하라는 요청을 받을 수 있습니다. - -- 커밋은 가능한 한 작아야 하지만, 각 커밋이 독립적으로 올바른지 확인 - 해야 합니다 (즉, 각 커밋은 컴파일되어 테스트를 통과해야 함). - -- 커밋에는 개발자 출처 증명서 (http://developercertificate.org) - 서명이 첨부되어야 하며, 이는 귀하 (및 해당되는 경우 고용주)가 - [프로젝트 라이선스](../LICENCE). 조건에 구속되는 데 동의한다는 것을 나타냅니다. - git에서는 `git commit`에 `-s` 옵션입니다 - -- 패치가 검토되지 않거나 특정인이 검토해야 하는 경우, 풀 리퀘스트나 - 댓글에서 검토자에게 @-답글을 보내 검토를 요청하거나 - [이메일](mailto:info@rustdesk.com)을 통해 검토를 요청할 수 있습니다. - -- 수정된 버그 또는 새 기능과 관련된 테스트를 추가합니다. - -구체적인 git 지침은, [GitHub workflow 101](https://github.com/servo/servo/wiki/GitHub-workflow)을 참조하세요. - -## 행동 강령 - -https://github.com/rustdesk/rustdesk/blob/master/docs/CODE_OF_CONDUCT.md - -## 커뮤니케이션 - -RustDesk 기여자들은 [Discord](https://discord.gg/nDceKgxnkV)에서 활동하고 있습니다. diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-NL.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-NL.md deleted file mode 100644 index a39e8ce..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-NL.md +++ /dev/null @@ -1,50 +0,0 @@ -# Bijdragen aan RustDesk - -RustDesk verwelkomt bijdragen van iedereen. Hier zijn de richtlijnen als u denkt -ons te willen helpen: - -## Bijdragen - -Bijdragen aan RustDesk of haar afhankelijkheden moeten worden gedaan in de -vorm van GitHub pull verzoeken. Elk pull verzoek zal worden beoordeeld door -een core bijdrager (iemand met toestemming om patches te plaatsen) en ofwel -worden geplaatst in de hoofd structuur of feedback krijgen voor veranderingen -die nodig zouden zijn. Alle bijdragen zouden dit formaat moeten volgen, -zelfs die van kernmedewerkers. - -Als je aan een onderwerp wilt werken, eis het dan eerst op door commentaar -te geven op het GitHub onderwerp dat je eraan wilt werken. Dit is om dubbele -inspanningen van medewerkers aan hetzelfde issue te voorkomen. - -## Checklist Pull Aanvragen - -- Maak een vertakking vanaf de master tak en, indien nodig, veranker naar de - huidige master tak voordat je je pull verzoek indient. Als je het niet netjes - samenvoegt met master kan je gevraagd worden om je wijzigingen - opnieuw op te bouwen. - -- Toezeggingen moeten zo klein mogelijk zijn, terwijl er voor gezorgd moet - worden dat elke toezegging onafhankelijk correct is (dat wil zeggen, elke - toezegging moet compileren en testen doorstaan). - -- Toezeggingen moeten vergezeld gaan van een Certificaat van Oorsprong - van de Ontwikkelaar (http://developercertificate.org) ondertekening, die aangeeft - dat u (en uw werkgever indien van toepassing) akkoord gaat met de - voorwaarden van het [project licentie](../LICENCE). - In git is dit de `-s` optie van `git commit` - -- Als je patch niet beoordeeld wordt of je hebt een specifiek persoon nodig om hem - te beoordelen kunt u @-reply een reviewer vragen in het pull verzoek of een - commentaar, of je kunt om een review vragen via [email](mailto:info@rustdesk.com). - -- Tests toevoegen die relevant zijn voor de gerepareerde bug of de nieuwe functie. - -Voor specifieke git instructies, zie [GitHub workflow 101](https://github.com/servo/servo/wiki/GitHub-workflow). - -## Gedrag - -https://github.com/rustdesk/rustdesk/blob/master/docs/CODE_OF_CONDUCT.md - -## Communicatie - -RustDesk medewerkers bezoeken frequent [Discord](https://discord.gg/nDceKgxnkV). diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-NO.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-NO.md deleted file mode 100644 index 89a5745..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-NO.md +++ /dev/null @@ -1,46 +0,0 @@ -# Bidrag til RustDesk - -RustDesk er åpene for bidrag fra alle. Her er reglene for de som har lyst til å -hjelpe oss: - -## Bidrag - -Bidrag til RustDesk eller deres avhengigheter burde være i form av GitHub pull requests. -Hver pull request vill bli sett igjennom av en kjerne bidrager (noen med autoritet til -å godkjenne endringene) og enten bli sendt til main treet eller respondert med -tilbakemelding på endringer som er nødvendig. Alle bidrag burde følge dette formate -også de fra kjerne bidragere. - -Om du ønsker å jobbe på en issue må du huske å gjøre krav på den først. Dette -kann gjøres ved å kommentere på den GitHub issue-en du ønsker å jobbe på. -Dette er for å hindre duplikat innsats på samme problem. - -## Pull Request Sjekkliste - -- Lag en gren fra master grenen og, hvis det er nødvendig, rebase den til den nåværende - master grenen før du sender inn din pull request. Hvis ikke dette gjøres på rent - vis vill du bli spurt om å rebase dine endringer. - -- Commits burde være så små som mulig, samtidig som de må være korrekt uavhenging av hverandre - (hver commit burde kompilere og bestå tester). - -- Commits burde være akkopaniert med en Developer Certificate of Origin - (http://developercertificate.org), som indikerer att du (og din arbeidsgiver - i det tilfellet) godkjenner å bli knyttet til vilkårene av [prosjekt lisensen](../LICENCE). - Ved bruk av git er dette `-s` opsjonen til `git commit`. - -- Hvis dine endringer ikke blir sett eller hvis du trenger en spesefik person til - å se på dem kan du @-svare en med autoritet til å godkjenne dine endringer. - Dette kann gjøres i en pull request, en kommentar eller via epost på [email](mailto:info@rustdesk.com). - -- Legg til tester relevant til en fikset bug eller en ny tilgjengelighet. - -For spesefike git instruksjoner, se [GitHub workflow 101](https://github.com/servo/servo/wiki/GitHub-workflow). - -## Oppførsel - -https://github.com/rustdesk/rustdesk/blob/master/docs/CODE_OF_CONDUCT.md - -## Kommunikasjon - -RustDesk bidragere burker [Discord](https://discord.gg/nDceKgxnkV). diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-PL.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-PL.md deleted file mode 100644 index 8341692..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-PL.md +++ /dev/null @@ -1,45 +0,0 @@ -# Współtworzenie RustDesk - -RustDesk z zadowoleniem przyjmuje wkład od każdego. Oto wytyczne, jeśli chcesz nam pomóc: - -## Współtwórcy - -Contributions to RustDesk or its dependencies should be made in the form of GitHub -pull requests. Each pull request will be reviewed by a core contributor -(someone with permission to land patches) and either landed in the main tree or -given feedback for changes that would be required. All contributions should -follow this format, even those from core contributors. - -Should you wish to work on an issue, please claim it first by commenting on -the GitHub issue that you want to work on it. This is to prevent duplicated -efforts from contributors on the same issue. - -## Pull Request Checklist - -- Branch from the master branch and, if needed, rebase to the current master - branch before submitting your pull request. If it doesn't merge cleanly with - master you may be asked to rebase your changes. - -- Commits should be as small as possible, while ensuring that each commit is - correct independently (i.e., each commit should compile and pass tests). - -- Commits should be accompanied by a Developer Certificate of Origin - (http://developercertificate.org) sign-off, which indicates that you (and - your employer if applicable) agree to be bound by the terms of the - [project license](../LICENCE). In git, this is the `-s` option to `git commit` - -- If your patch is not getting reviewed or you need a specific person to review - it, you can @-reply a reviewer asking for a review in the pull request or a - comment, or you can ask for a review via [email](mailto:info@rustdesk.com). - -- Add tests relevant to the fixed bug or new feature. - -For specific git instructions, see [GitHub workflow 101](https://github.com/servo/servo/wiki/GitHub-workflow). - -## Kodeks postępowania - -[Kodeks postępowania](CODE_OF_CONDUCT-PL.md) - -## Komunikacja - -RustDesk contributors frequent the [Discord](https://discord.gg/nDceKgxnkV). diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-RO.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-RO.md deleted file mode 100644 index 8249fb8..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-RO.md +++ /dev/null @@ -1,31 +0,0 @@ -# Contribuții la RustDesk - -RustDesk primește cu plăcere contribuții din partea tuturor. Iată ghidurile dacă te gândești să ne ajuți: - -## Contribuții - -Contribuțiile la RustDesk sau la dependențele sale ar trebui făcute sub forma de pull request-uri pe GitHub. Fiecare pull request va fi revizuit de un contributor principal (cineva cu permisiunea de a aplica patch-uri) și fie va fi integrat în arborele principal, fie vor fi oferite sugestii pentru modificările necesare. Toate contribuțiile trebuie să urmeze acest format, chiar și cele ale contributorilor principali. - -Dacă dorești să lucrezi la o problemă, te rugăm să o revendici mai întâi comentând pe GitHub issue-ul pe care vrei să lucrezi. Aceasta previne eforturi duplicate din partea contributorilor asupra aceleiași probleme. - -## Lista de verificare pentru Pull Request - -- Creează un branch din branch-ul `master` și, dacă este necesar, fă rebase la branch-ul `master` curent înainte de a trimite pull request-ul. Dacă nu se poate integra curat cu `master`, ți se poate cere să faci rebase la modificările tale. - -- Commit-urile ar trebui să fie cât mai mici posibil, asigurând totodată că fiecare commit este corect independent (adică fiecare commit ar trebui să compileze și să treacă testele). - -- Commit-urile trebuie să fie însoțite de un semnătura Developer Certificate of Origin (http://developercertificate.org), care indică faptul că tu (și angajatorul tău, dacă este cazul) ești de acord să respecți termenii [licenței proiectului](../LICENCE). În git, aceasta este opțiunea `-s` la `git commit`. - -- Dacă patch-ul tău nu este revizuit sau ai nevoie ca o anumită persoană să-l revizuiască, poți @-reply unui reviewer cerând o revizuire în pull request sau într-un comentariu, sau poți solicita o revizuire prin [email](mailto:info@rustdesk.com). - -- Adaugă teste relevante pentru bug-ul corectat sau pentru funcționalitatea nouă. - -Pentru instrucțiuni specifice git, vezi [GitHub workflow 101](https://github.com/servo/servo/wiki/GitHub-workflow). - -## Conduită - -[Codul de Conduită RustDesk](https://github.com/rustdesk/rustdesk/blob/master/docs/CODE_OF_CONDUCT.md) - -## Comunicare - -Contributorii RustDesk frecventează [Discord](https://discord.gg/nDceKgxnkV). diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-RU.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-RU.md deleted file mode 100644 index 1cf9a47..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-RU.md +++ /dev/null @@ -1,45 +0,0 @@ -# Вклад в RustDesk - -RustDesk приветствует вклад каждого. -Ниже приведены рекомендации, если вы собираетесь помочь нам: - -## Вклад в развитие - -Вклады в развитие RustDesk или его зависимости должны быть сделаны в виде `pull request` на GitHub. -Каждый такой `pull request` будет рассмотрен основным участником (кем-то, у кого есть разрешение -на влив исправлений) и либо помещен в основное дерево, либо Вам будет дан отзыв о необходимых правках. -Все материалы должны соответствовать этому формату, даже те, которые поступают от основных авторов. - -Если вы хотите поработать над какой-либо проблемой, то пожалуйста, сначала напишите об этом, -создав `issue` на GitHub, и описав, над чем вы хотите поработать. Это делается для того, -чтобы предотвратить дублирование усилий участников по одному и тому же вопросу. - -## Контрольный список для Ваших `pull request` - -- Ответвляйтесь от главной ветки и, при необходимости, делайте `rebase` в текущую `master` - ветку перед отправкой `pull request`. При наличии конфликтов слияния вам будет - предложено их устранить, возможно при помощи того же `rebase`. - -- Коммиты должны быть, по возможности, небольшими, при этом гарантируя, что каждый - коммит является независимо правильным (т.е., каждый коммит должен компилироваться и проходить тесты). - -- Коммиты должны сопровождаться подписью `Developer Certificate of Origin` - (http://developercertificate.org), которая укажет на то, что вы (и ваш работодатель, - если это применимо) согласны соблюдать условия [лицензии проекта](../LICENCE). - В `git` это флаг `-s` при использовании `git commit` - -- Если ваш патч не проходит рецензирование или вам нужно, - чтобы его проверил конкретный человек, Вы можете ответить рецензенту через `@`, - в обсуждениях вашего `pull request` или Вы можете запросить рецензию через[email](mailto:info@rustdesk.com). - -- Добавьте тесты, относящиеся к исправленной ошибке или новой функции. - -Для получения конкретных инструкций `git` см. [GitHub workflow 101](https://github.com/servo/servo/wiki/Github-workflow). - -## Правила поведения участников и вкладчиков - -Нормы поведения внутри сообщества подробно описаны [здесь](CODE_OF_CONDUCT-RU.md). - -## Общение - -RustDesk контрибьюторы могут посетить [Discord](https://discord.gg/nDceKgxnkV). diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-TR.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-TR.md deleted file mode 100644 index 6e9e3f3..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-TR.md +++ /dev/null @@ -1,31 +0,0 @@ -# RustDesk'a Katkı Sağlamak - -RustDesk, herkesten katkıyı memnuniyetle karşılar. Eğer bize yardımcı olmayı düşünüyorsanız, işte rehberlik eden kurallar: - -## Katkılar - -RustDesk veya bağımlılıklarına yapılan katkılar, GitHub pull istekleri şeklinde yapılmalıdır. Her bir pull isteği, çekirdek katkıcı tarafından gözden geçirilecek (yamaları kabul etme izni olan biri) ve ana ağaca kabul edilecek veya gerekli değişiklikler için geri bildirim verilecektir. Tüm katkılar bu formata uymalıdır, çekirdek katkıcılardan gelenler bile. - -Eğer bir konu üzerinde çalışmak isterseniz, önce üzerinde çalışmak istediğinizi belirten bir yorum yaparak konuyu talep ediniz. Bu, katkı sağlayanların aynı konuda çift çalışmasını engellemek içindir. - -## Pull İstek Kontrol Listesi - -- Master dalından dallandırın ve gerekiyorsa pull isteğinizi göndermeden önce mevcut master dalına rebase yapın. Eğer master ile temiz bir şekilde birleşmezse, değişikliklerinizi rebase yapmanız istenebilir. - -- Her bir commit mümkün olduğunca küçük olmalıdır, ancak her commit'in bağımsız olarak doğru olduğundan emin olun (örneğin, her commit derlenebilir ve testleri geçmelidir). - -- Commit'ler, bir Geliştirici Sertifikası ile desteklenmelidir (http://developercertificate.org). Bu, [proje lisansının](../LICENCE) koşullarına uymayı kabul ettiğinizi gösteren bir onaydır. Git'te bunu `git commit` seçeneği olarak `-s` seçeneği ile yapabilirsiniz. - -- Yamalarınız gözden geçirilmiyorsa veya belirli bir kişinin gözden geçirmesine ihtiyacınız varsa, çekme isteği veya yorum içinde bir gözden geçirmeyi istemek için bir inceleyiciyi @etiketleyebilir veya inceleme için [e-posta](mailto:info@rustdesk.com) ile talep edebilirsiniz. - -- Düzelttiğiniz hatanın veya eklediğiniz yeni özelliğin ilgili testlerini ekleyin. - -Daha spesifik git talimatları için, [GitHub iş akışı 101](https://github.com/servo/servo/wiki/GitHub-workflow)'e bakınız. - -## Davranış - -https://github.com/rustdesk/rustdesk/blob/master/docs/CODE_OF_CONDUCT-TR.md - -## İletişim - -RustDesk katkı sağlayıcıları, [Discord](https://discord.gg/nDceKgxnkV) kanalını sık sık ziyaret ederler. diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-ZH.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING-ZH.md deleted file mode 100644 index 718cdac..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING-ZH.md +++ /dev/null @@ -1,32 +0,0 @@ -# 为RustDesk做贡献 - -Rust欢迎每一位贡献者,如果您有意向为我们做出贡献,请遵循以下指南: - -## 贡献方式 - -对 RustDesk 或其依赖项的贡献需要通过 GitHub 的 Pull Request (PR) 的形式提交。每个 PR 都会由核心贡献者(即有权限合并代码的人)进行审核,审核通过后代码会合并到主分支,或者您会收到需要修改的反馈。所有贡献者,包括核心贡献者,提交的代码都应遵循此流程。 - -如果您希望处理某个问题,请先在对应的 GitHub issue 下发表评论,声明您将处理该问题,以避免该问题被多位贡献者重复处理。 - -## PR 注意事项 - -- 从 master 分支创建一个新的分支,并在提交PR之前,如果需要,将您的分支 变基(rebase) 到最新的 master 分支。如果您的分支无法顺利合并到 master 分支,您可能会被要求更新您的代码。 - -- 每次提交的改动应该尽可能少,并且要保证每次提交的代码都是正确的(即每个 commit 都应能成功编译并通过测试)。 - -- 每个提交都应附有开发者证书签名(http://developercertificate.org), 表明您(以及您的雇主,若适用)同意遵守项目[许可证条款](../LICENCE)。在使用 git 提交代码时,可以通过在 `git commit` 时使用 `-s` 选项加入签名 - -- 如果您的 PR 未被及时审核,或需要指定的人员进行审核,您可以通过在 PR 或评论中 @ 提到相关审核者,以及发送[电子邮件](mailto:info@rustdesk.com)的方式请求审核。 - -- 请为修复的 bug 或新增的功能添加相应的测试用例。 - -有关具体的 git 使用说明,请参考[GitHub workflow 101](https://github.com/servo/servo/wiki/GitHub-workflow). - -## 行为准则 - -请遵守项目的[贡献者公约行为准则](./CODE_OF_CONDUCT-ZH.md)。 - - -## 沟通渠道 - -RustDesk 的贡献者主要通过 [Discord](https://discord.gg/nDceKgxnkV) 进行交流。 diff --git a/shelled/rustdesk-as-ref/docs/CONTRIBUTING.md b/shelled/rustdesk-as-ref/docs/CONTRIBUTING.md deleted file mode 100644 index 31fd632..0000000 --- a/shelled/rustdesk-as-ref/docs/CONTRIBUTING.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributing to RustDesk - -RustDesk welcomes contribution from everyone. Here are the guidelines if you are -thinking of helping us: - -## Contributions - -Contributions to RustDesk or its dependencies should be made in the form of GitHub -pull requests. Each pull request will be reviewed by a core contributor -(someone with permission to land patches) and either landed in the main tree or -given feedback for changes that would be required. All contributions should -follow this format, even those from core contributors. - -Should you wish to work on an issue, please claim it first by commenting on -the GitHub issue that you want to work on it. This is to prevent duplicated -efforts from contributors on the same issue. - -## Pull Request Checklist - -- Branch from the master branch and, if needed, rebase to the current master - branch before submitting your pull request. If it doesn't merge cleanly with - master you may be asked to rebase your changes. - -- Commits should be as small as possible, while ensuring that each commit is - correct independently (i.e., each commit should compile and pass tests). - -- Commits should be accompanied by a Developer Certificate of Origin - (http://developercertificate.org) sign-off, which indicates that you (and - your employer if applicable) agree to be bound by the terms of the - [project license](../LICENCE). In git, this is the `-s` option to `git commit` - -- If your patch is not getting reviewed or you need a specific person to review - it, you can @-reply a reviewer asking for a review in the pull request or a - comment, or you can ask for a review via [email](mailto:info@rustdesk.com). - -- Add tests relevant to the fixed bug or new feature. - -For specific git instructions, see [GitHub workflow 101](https://github.com/servo/servo/wiki/GitHub-workflow). - -## Conduct - -https://github.com/rustdesk/rustdesk/blob/master/docs/CODE_OF_CONDUCT.md - -## Communication - -RustDesk contributors frequent the [Discord](https://discord.gg/nDceKgxnkV). diff --git a/shelled/rustdesk-as-ref/docs/README-AR.md b/shelled/rustdesk-as-ref/docs/README-AR.md deleted file mode 100644 index 5aa09da..0000000 --- a/shelled/rustdesk-as-ref/docs/README-AR.md +++ /dev/null @@ -1,173 +0,0 @@ -

- RustDesk - Your remote desktop
- Servers • - Build • - Docker • - Structure • - Snapshot
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [Tiếng Việt] | [Ελληνικά]
- لغتك الأم, Doc و RustDesk UI, README نحن بحاجة إلى مساعدتك لترجمة هذا -

- -[Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) :تواصل معنا عبر - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA%20%D8%A7%D9%84%D9%85%D8%AA%D9%82%D8%AF%D9%85%D8%A9-blue)](https://rustdesk.com/pricing.html) - -.Rustبرنامج آخر لسطح المكتب عن بعد، مكتوب بـ -يعمل خارج الصندوق، لا حاجة إلى إعدادات. لديك سيطرة كاملة على بياناتك، دون مخاوف بشأن الأمن. يمكنك استخدام خادم - الخاص بنا rendezvous/relay -[جهز لنفسك واحدا](https://rustdesk.com/server), أو -[خاص بك rendezvous/relay أكتب خادم](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -لمساعدتك على ذلك [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) يرحب بمساهمة الجميع. اطلع على RustDesk. - -[**؟ RustDesk كيفية يعمل**](https://github.com/rustdesk/rustdesk/wiki/How-does-RustDesk-work%3F) - -[**BINARY تنزيل**](https://github.com/rustdesk/rustdesk/releases) - - -## التبعيات - - لواجهة المستخدم الرسومية [sciter](https://sciter.com/) نسخة سطح المكتب تستخدم - بنفسك sciter dynamic library عليك تحميل - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - - Sciter إلى Flutter سنقوم بترحيل نسخة سطح المكتب من .Flutter تستخدم إصدارات الهاتف المحمول. - -## خطوات البناء - -- C++ build env و Rust development env قم بإعداد - -- بطريقة صحيحة `VCPKG_ROOT` env variable وأعد [vcpkg](https://github.com/microsoft/vcpkg) ثبت - - - Windows: `vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static` - - Linux/MacOS: `vcpkg install libvpx libyuv opus aom` - -- run `cargo run` - -## [البناء](https://rustdesk.com/docs/en/dev/build/) - -## Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - - -### vcpkg تثبيت - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Fix libvpx (For Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### البناء - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Docker طريقة البناء باستخدام - -ابدأ باستنساخ المستودع وبناء الكونتاينر: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -ثم، في كل مرة تحتاج إلى بناء التطبيق، قم بتشغيل الأمر التالي: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -لاحظ أن البناء الأول قد يستغرق وقتًا أطول قبل تخزين التبعيات، وسيكون البناء اللاحق أسرع. بالإضافة إلى ذلك، إذا كنت بحاجة إلى تحديد وسائط مختلفة لأمر البناء، فيمكنك القيام بذلك في نهاية الأمر بوضع -`` -على سبيل المثال، إذا كنت ترغب في بناء إصدار محسن، فستقوم بتشغيل الأمر أعلاه متبوعًا بـ -`--release` -:سيكون الملف القابل للتنفيذ الناتج متاحًا في مجلد تارغت، ويمكن تشغيله باستخدام - -```sh -target/debug/rustdesk -``` - -:أو في حال قمت ببناء إصدار محسن - -```sh -target/release/rustdesk -``` - -RustDesk يرجى التأكد من أنك تنفذ هذه الأوامر من جذر مستودع -وإلا فقد لا يتمكن التطبيق من العثور على الموارد المطلوبة. لاحظ أيضًا أن الأوامر الفرعية الأخرى مثل -`install` أو `run` -لا يتم دعمها حاليًا عبر هذه الطريقة لأنها ستقوم بتثبيت أو تشغيل البرنامج داخل الكونتاينر بدلاً من الهوست. - -## هيكل الملف - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: وظائف لنقل الملفات، وبعض وظائف المرافق الأخرى tcp/udp، protobuf ترميز الفيديو، إعدادات - -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: التقاط الشاشة -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: التحكم في لوحة المفاتيح/الماوس الخاصة بكل منصة -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: واجهة المستخدم الرسومية -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: خدمات الصوت/الحافظة/المدخلات/الفيديو، ووصلات الشبكة -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: بدء اتصال متقارن -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: أو المنقول عن بُعد (TCP hole punching) انتظر الاتصال المباشر [rustdesk-server](https://github.com/rustdesk/rustdesk-server) الإتصال ب -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: رمز خاص بكل منصة -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: رمز الهاتف المحمول -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**:Flutter لعميل الويب الخاص ب Javascript - -## لقطات - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-CS.md b/shelled/rustdesk-as-ref/docs/README-CS.md deleted file mode 100644 index b208414..0000000 --- a/shelled/rustdesk-as-ref/docs/README-CS.md +++ /dev/null @@ -1,157 +0,0 @@ -

- RustDesk – vaše vzdálená plocha
- Servery • - Sestavení ze zdrojových kódů • - Docker • - Struktura • - Ukázky
- [English] | [Українська] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Potřebujeme Vaši pomoc s překladem tohoto README, uživatelského rozhraní aplikace RustDesk a dokumentace k ní do vašeho jazyka -

- -Popovídejte si s námi: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Pokro%C4%8Dil%C3%A9%20Funkce-blue)](https://rustdesk.com/pricing.html) - -Zase další software pro přístup k ploše na dálku, naprogramovaný v jazyce Rust. Funguje hned tak, jak je – není třeba žádného nastavování. Svá data máte ve svých rukách, bez obav o zabezpečení. Je možné používat námi poskytovaný propojovací/předávací (relay) server, [vytvořit si svůj vlastní](https://rustdesk.com/server), nebo [si dokonce svůj vlastní naprogramovat](https://github.com/rustdesk/rustdesk-server-demo), budete-li chtít. - -Projekt RustDesk vítá přiložení ruky k dílu od každého. Jak začít se dozvíte z [`docs/CONTRIBUTING.md`](CONTRIBUTING.md). - -[**Jak RustDesk funguje?**](https://github.com/rustdesk/rustdesk/wiki/How-does-RustDesk-work%3F) - -[**STAHOVÁNÍ ZKOMPILOVANÝCH APLIKACÍ**](https://github.com/rustdesk/rustdesk/releases) - -## Softwarové součásti, na kterých závisí - -Varianta pro počítač používá pro grafické uživatelské rozhraní [sciter](https://sciter.com/) – stáhněte si potřebnou knihovnu. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -Varianta pro mobilní platformy používá aplikační rámec (framework) Flutter. Na tu také v budoucnu předěláme i variantu pro počítač. - -## Stručně kroky pro sestavení ze zdrojových kódů - -- Připravte si vývojové prostředí pro jazyky Rust a C++ - -- Nainstalujte [vcpkg](https://github.com/microsoft/vcpkg), a správně nastavte proměnnou prostředí `VCPKG_ROOT` - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- spusťte `cargo run` - -## [Sestavení ze zdrojových kódů](https://rustdesk.com/docs/en/dev/build/) - -## Jak zkompilovat na Linuxu - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Instalace vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Oprava libvpx (pro Fedoru) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Sestavení - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Jak sestavit prostřednictvím Docker kontejnerizace - -Začněte tím, že si naklonujete tento repozitář a sestavíte docker kontejner: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Poté pokaždé, když bude třeba aplikaci sestavit, spusťte následující příkaz: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Všimněte si, že prvotní sestavení může trvat déle (než se do mezipaměti uloží veškeré softwarové součásti, které jsou potřeba) – následná opakování už budou rychlejší. Pokud navíc potřebujete zadat různé argumenty příkazu pro sestavení, můžete tak učinit na konci příkazu v pozici ``. Například, pokud byste chtěli sestavit optimalizovanou verzi pro vydání, spustili byste výše uvedený příkaz následovaný `--release`. Výsledný spustitelný soubor se objeví v cílové složce na vašem systému a bude ho možné spustit pomocí: - -```sh -target/debug/rustdesk -``` - -Nebo, pokud spouštíte variantu pro vydání: - -```sh -target/release/rustdesk -``` - -Ujistěte se, že tyto příkazy spouštíte z kořenového adresáře RustDesk, jinak aplikace nemusí být schopná nalézt potřebné prostředky (resources). Také si všimněte, že ostatní dílčí príkazy nástroje cargo, jako třeba `install` nebo `run` zatím nejsou prostřednictvím této metody podporovány, protože by vedly k instalaci či spuštění program uvnitř kontejneru namísto přímo v systému. - -## Struktura souborů - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: kodek videa, nastavení, obalovaní tcp/udp, vyrovnávací paměť protokolu, funkce souborového systému pro přenos souborů a pár dalších podpůrných funkcí -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: zachytávání obsahu obrazovky -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: ovládání klávesnice/myši pro jednotlivé platformy -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: grafické uživatelské rozhraní -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: služby pro zvuk/schránku/zadávání/video a síťová spojení -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: spouští připojení k protějšku -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: komunikace s [rustdesk-server](https://github.com/rustdesk/rustdesk-server), očekávání vzdálených příméhých („proděrováváním“ TCP) nebo předávaných (relay) spojení -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: zdrojové kódy, specifické pro jednotlivé platformy -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: zdrojové kódy pro použití s aplikačním rámcem (framework) Flutter pro mobilní platformy -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: Javascript pro Flutter webový klient - -## Ukázky - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-DA.md b/shelled/rustdesk-as-ref/docs/README-DA.md deleted file mode 100644 index 9ad109d..0000000 --- a/shelled/rustdesk-as-ref/docs/README-DA.md +++ /dev/null @@ -1,149 +0,0 @@ -

- RustDesk - Your remote desktop
- Servere • - Byg • - Docker • - Filstruktur • - Skærmbilleder
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Vi har brug for din hjælp til at oversætte denne README, RustDesk UI og Dokument til dit modersmål -

- -Chat med os: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Avancerede%20Funktioner-blue)](https://rustdesk.com/pricing.html) - -Endnu en fjernskrivebordssoftware, skrevet i Rust. Fungerer ud af æsken, ingen konfiguration påkrævet. Du har fuld kontrol over dine data uden bekymringer om sikkerhed. Du kan bruge vores rendezvous/relay-server, [opsætte din egen](https://rustdesk.com/server), eller [skrive din egen rendezvous/relay-server](https://github.com/rustdesk/rustdesk- server-demo). - -RustDesk hilser bidrag fra alle velkommen. Se [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) for at få hjælp til at komme i gang. - -[**PROGRAM DOWNLOAD**](https://github.com/rustdesk/rustdesk/releases) - -## Afhængigheder - -Desktopversioner bruger [sciter](https://sciter.com/) eller Flutter til GUI, denne vejledning er kun for Sciter. - -Hent venligst sciter dynamic library selv. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Rå trin til at bygge - -- Forbered din Rust-udviklings-env og C++ build-env - -- Installer [vcpkg](https://github.com/microsoft/vcpkg), og indstil env-variabelen "VCPKG_ROOT" korrekt - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- kør `cargo run` - -## [Byg](https://rustdesk.com/docs/en/dev/build/) - -## Sådan bygger du på Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### vcpkg installation - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### libvpx rettelse (For Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Byg - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -cargo run -``` - -## Sådan bygger du med Docker - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Kør derefter følgende kommando, hver gang du skal bygge applikationen: -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Bemærk, at den første bygning kan tage længere tid, før afhængigheder cachelagres, efterfølgende bygninger vil være hurtigere. Derudover, hvis du har brug for at angive forskellige argumenter til bygge-kommandoen, kan du gøre det i slutningen af kommandoen i ``-positionen. For eksempel, hvis du ville bygge en optimeret udgivelsesversion, ville du køre kommandoen ovenfor efterfulgt af `--release`. Den resulterende eksekverbare vil være tilgængelig i målmappen på dit system og kan køres med: - -```sh -target/debug/rustdesk -``` - -Eller, hvis du kører en udgivelses eksekverbar: - -```sh -target/release/rustdesk -``` - -Sørg for, at du kører disse kommandoer fra roden af RustDesk-lageret, ellers kan applikationen muligvis ikke finde de nødvendige ressourcer. Bemærk også, at andre cargo underkommandoer såsom 'install' eller 'run' i øjeblikket ikke understøttes via denne metode, da de ville installere eller køre programmet inde i containeren i stedet for værten. - -## Filstruktur - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video codec, config, tcp/udp wrapper, protobuf, fs funktioner til filoverførsel og nogle andre hjælpefunktioner -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: Skærmbillede -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: platform specifik tastatur/mus kontrol -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: GUI -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: lyd/udklipsholder/input/videotjenester og netværksforbindelser -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: starte en peer-forbindelse -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Kommuniker med [rustdesk-server](https://github.com/rustdesk/rustdesk-server), vent på direkte fjernforbindelse (TCP-hulning) eller relæforbindelse -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: Javascript til Flutter webklient - -## Skærmbilleder - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-DE.md b/shelled/rustdesk-as-ref/docs/README-DE.md deleted file mode 100644 index ba88944..0000000 --- a/shelled/rustdesk-as-ref/docs/README-DE.md +++ /dev/null @@ -1,182 +0,0 @@ -

- RustDesk - Dein Remote-Desktop
- Kompilieren • - Docker • - Dateistruktur • - Screenshots
- [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Dansk] | [Ελληνικά] | [Türkçe] | [Norsk] | [Română]
- Wir brauchen Ihre Hilfe, um dieses README, die RustDesk-Benutzeroberfläche und die Dokumentation in Ihre Muttersprache zu übersetzen. -

- -> [!Caution] -> **Haftungsausschluss bei Missbrauch::**
-> Die Entwickler von RustDesk billigen oder unterstützen keine unethische oder illegale Nutzung dieser Software. Missbrauch, wie unbefugter Zugriff, unbefugte Kontrolle oder Verletzung der Privatsphäre, verstößt strikt gegen unsere Richtlinien. Die Autoren sind nicht verantwortlich für jeglichen Missbrauch der Anwendung. - - -Reden Sie mit uns auf: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Erweiterte%20Funktionen-blue)](https://rustdesk.com/pricing.html) - -RustDesk ist eine in Rust geschriebene Remote-Desktop-Software, die out of the box ohne besondere Konfiguration funktioniert. Sie haben die volle Kontrolle über Ihre Daten und müssen sich keine Sorgen um die Sicherheit machen. Sie können unseren Rendezvous/Relay-Server nutzen, [einen eigenen Server aufsetzen](https://rustdesk.com/server) oder [einen eigenen Server programmieren](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk heißt jegliche Mitarbeit willkommen. Schauen Sie sich [CONTRIBUTING-DE.md](CONTRIBUTING-DE.md) an, wenn Sie Unterstützung beim Start brauchen. - -[**FAQ**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**Programm herunterladen**](https://github.com/rustdesk/rustdesk/releases) - -[**Nightly Builds**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) -[Get it on Flathub](https://flathub.org/apps/com.rustdesk.RustDesk) - -## Abhängigkeiten - -Desktop-Versionen verwenden [Sciter](https://sciter.com/) oder Flutter für die GUI, dieses Tutorial ist nur für Sciter. - -Bitte laden Sie die dynamische Bibliothek Sciter selbst herunter. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Grobe Schritte zum Kompilieren - -- Bereiten Sie Ihre Rust-Entwicklungsumgebung und C++-Build-Umgebung vor - -- Installieren Sie [vcpkg](https://github.com/microsoft/vcpkg) und fügen Sie die Systemumgebungsvariable `VCPKG_ROOT` hinzu - - - Windows: `vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static` - - Linux/macOS: `vcpkg install libvpx libyuv opus aom` - -- Nutzen Sie `cargo run` - -## [Erstellen](https://rustdesk.com/docs/de/dev/build/) - -## Kompilieren auf Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libpam0g-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel pam-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel pam-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### vcpkg installieren - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### libvpx reparieren (für Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Kompilieren - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone --recurse-submodules https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Auf Docker kompilieren - -Beginnen Sie damit, das Repository zu klonen und den Docker-Container zu bauen: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -git submodule update --init --recursive -docker build -t "rustdesk-builder" . -``` - -Führen Sie jedes Mal, wenn Sie das Programm kompilieren müssen, folgenden Befehl aus: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Bedenken Sie, dass das erste Kompilieren länger dauern kann, bis die Abhängigkeiten zwischengespeichert sind. Nachfolgende Kompiliervorgänge sind schneller. Wenn Sie verschiedene Argumente für den Kompilierbefehl angeben müssen, können Sie dies am Ende des Befehls an der Position `` tun. Wenn Sie zum Beispiel eine optimierte Releaseversion kompilieren wollen, können Sie `--release` am Ende des Befehls anhängen. Das daraus entstehende Programm finden Sie im Zielordner auf Ihrem System. Sie können es mit folgendem Befehl ausführen: - -```sh -target/debug/rustdesk -``` - -Oder, wenn Sie eine Releaseversion benutzen: - -```sh -target/release/rustdesk -``` - -Bitte stellen Sie sicher, dass Sie diese Befehle im Stammverzeichnis des RustDesk-Repositorys nutzen. Ansonsten kann es passieren, dass das Programm die Ressourcen nicht finden kann. Bitte bedenken Sie auch, dass andere Cargo-Unterbefehle wie `install` oder `run` aktuell noch nicht unterstützt werden, da sie das Programm innerhalb des Containers starten oder installieren würden, anstatt auf Ihrem eigentlichen System. - -## Dateistruktur - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: Video-Codec, Konfiguration, TCP/UDP-Wrapper, Protokoll-Puffer, fs-Funktionen für Dateitransfer und ein paar andere nützliche Funktionen -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: Bildschirmaufnahme -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: Plattformspezifische Maus- und Tastatursteuerung -- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: Datei kopieren und einfügen Implementierung für Windows, Linux, macOS. -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: GUI -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: Audio/Zwischenablage/Eingabe/Videodienste und Netzwerkverbindungen -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: Starten einer Peer-Verbindung -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Mit [rustdesk-server](https://github.com/rustdesk/rustdesk-server) kommunizieren, warten auf direkte (TCP hole punching) oder weitergeleitete Verbindung -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: Plattformspezifischer Code -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: Flutter-Code für Handys -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: JavaScript für Flutter-Webclient - -## Screenshots - -![Verbindungsmanager](https://github.com/rustdesk/rustdesk/assets/28412477/db82d4e7-c4bc-4823-8e6f-6af7eadf7651) - -![Verbunden zu einem Windows PC](https://github.com/rustdesk/rustdesk/assets/28412477/9baa91e9-3362-4d06-aa1a-7518edcbd7ea) - -![Dateiübertragung](https://github.com/rustdesk/rustdesk/assets/28412477/39511ad3-aa9a-4f8c-8947-1cce286a46ad) - -![TCP-Tunneling](https://github.com/rustdesk/rustdesk/assets/28412477/78e8708f-e87e-4570-8373-1360033ea6c5) - diff --git a/shelled/rustdesk-as-ref/docs/README-EO.md b/shelled/rustdesk-as-ref/docs/README-EO.md deleted file mode 100644 index d2a9315..0000000 --- a/shelled/rustdesk-as-ref/docs/README-EO.md +++ /dev/null @@ -1,148 +0,0 @@ -

- RustDesk - Your remote desktop
- Serviloj • - Kompili • - Docker • - Strukturo • - Ekrankopio
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Ni bezonas helpon traduki tiun README kaj la interfacon al via denaska lingvo -

- -Babili kun ni: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Altnivela%20Funkcioj-blue)](https://rustdesk.com/pricing.html) - -Denove alia fora labortabla programo, skribita en Rust. Ĝi funkcias elskatole, ne bezonas konfiguraĵon. Vi havas la tutan kontrolon sur viaj datumoj, sen zorgo pri sekureco. Vi povas uzi nian servilon rendezvous/relajsan, [agordi vian propran](https://rustdesk.com/server), aŭ [skribi vian propran servilon rendezvous/relajsan](https://github.com/rustdesk/rustdesk-server-demo). - -RustDesk bonvenigas kontribuon de ĉiuj. Vidu [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) por helpo komenci. - -[**BINARA ELŜUTO**](https://github.com/rustdesk/rustdesk/releases) - -## Dependantaĵoj - -La labortabla versio uzas [sciter](https://sciter.com/) por la interfaco, bonvolu elŝuti la bibliotekon dinamikan sciter. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Paŝoj por kompili - -- Preparu vian medion de programado Rust kaj vian medion de kompilado C++ - -- Instalu [vcpkg](https://github.com/microsoft/vcpkg), kaj agordu la medivariablon `VCPKG_ROOT` korekte - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- Plenumu `cargo run` - -## Kiel kompili sur Linukso - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Instali vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Ripari libvpx (Por Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Kompili - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Kiel kompili kun Docker - -Komencu klonante la deponejon kaj kompilu la konteneron Docker: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Tiam, ĉiuj fojoj, kiuj vi bezonas kompili la programon, plenumu tiun komandon: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Notu, ke la unua kompilado povas daŭri longe, antaŭ ke la dependantaĵoj estu kaŝitaj, sekvaj kompiladoj estos pli rapidaj. Aldone, se vi bezonas specifi diferentajn argumentojn por la kompilkomando, vi povas fari ĝin en la fine de la komando, en la posicio ``. Ekzemple, se vi volas kompili version de eldono optimigita, vi plenumus la komandon supre, kun `--release`. La plenumebla dosiero disponeblos en la cela dosierujo sur via sistemo, kaj povos esti plenumita kun: - -```sh -target/debug/rustdesk -``` - -Aŭ, se vi plenumas eldonan plenumeblan dosieron: - -```sh -target/release/rustdesk -``` - -Bonvolu certigi, ke vi plenumas tiujn komandojn el la radiko de la deponejo RustDesk, alie la programo povus esti nekapabla de trovi la devigajn resursojn. Ankaŭ notu, ke la aliaj subkomandoj de cargo kiel `install` aŭ `run` momente ne estas subtenitaj per tiu metodo, ĉar instalus aŭ plenumus la programon en la kontenero anstataŭ de la gastiganto. - -## Dosierstrukturo - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: videa kodeko, agordado, kovrilo tcp/udp, protobuf, funkcioj fs por dosiertransigo, kaj aliaj utilaĵaj funkcioj -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: ekrankaptado -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: operaciumspecifa kontrolo de klavaro/muso -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: interfaco -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: aŭdio/poŝo/enigo/videa servoj, kaj retkonektoj -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: starti konekto kun samtavolo -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: komuniki kun [rustdesk-server](https://github.com/rustdesk/rustdesk-server), atendi foran direktan (TCP hole punching) aŭ relajsatan konekton -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: operaciumspecifa kodo - -## Ekrankopio - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-ES.md b/shelled/rustdesk-as-ref/docs/README-ES.md deleted file mode 100644 index da939bd..0000000 --- a/shelled/rustdesk-as-ref/docs/README-ES.md +++ /dev/null @@ -1,180 +0,0 @@ -

- RustDesk - Your remote desktop
- Servidores • - Compilar • - Docker • - Estructura • - Capturas de pantalla
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Necesitamos tu ayuda para traducir este README a tu idioma -

- -> [!Caution] -> **Descargo de responsabilidad por mal uso:**
-> Los desarrolladores de RustDesk no aprueban ni apoyan ningún uso no ético o ilegal de este software. El mal uso, como el acceso no autorizado, el control o la invasión de la privacidad, va estrictamente en contra de nuestras directrices. Los autores no se hacen responsables de ningún uso indebido de la aplicación. - -Chatea con nosotros: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Caracter%C3%ADsticas%20Avanzadas-blue)](https://rustdesk.com/pricing.html) - -Otro software de escritorio remoto, escrito en Rust. Funciona de forma inmediata, sin necesidad de configuración. Tienes el control total de tus datos, sin preocupaciones sobre la seguridad. Puedes utilizar nuestro servidor de rendezvous/relay, [instalar el tuyo](https://rustdesk.com/server), o [escribir tu propio servidor rendezvous/relay](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk agradece la contribución de todo el mundo. Lee [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) para ayuda para empezar. - -[**¿Cómo funciona rustdesk?**](https://github.com/rustdesk/rustdesk/wiki/How-does-RustDesk-work%3F) - -[**DESCARGA DE BINARIOS**](https://github.com/rustdesk/rustdesk/releases) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) -[Get it on Flathub](https://flathub.org/apps/com.rustdesk.RustDesk) - -## Dependencias - -Las versiones de escritorio utilizan Flutter o Sciter (obsoleto) para GUI, este tutorial es sólo para Sciter, ya que es más fácil y más amigable para empezar. Echa un vistazo a nuestro [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml) para la construcción de la versión Flutter. - -Por favor descarga la librería dinámica de Sciter tú mismo. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Pasos para compilar desde el inicio - -- Prepara el entorno de desarrollo de Rust y el entorno de compilación de C++ y Rust. - -- Instala [vcpkg](https://github.com/microsoft/vcpkg), y configura la variable de entono `VCPKG_ROOT` correctamente. - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/Osx: vcpkg install libvpx libyuv opus aom - -- Corre `cargo run` - -## Como compilar en linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libpam0g-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel pam-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel pam-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Instala vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Arregla libvpx (Para Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Compila - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone --recurse-submodules https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Como compilar con Docker - -Empieza clonando el repositorio y compilando el contenedor de docker: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -git submodule update --init --recursive -docker build -t "rustdesk-builder" . -``` - -Entonces, cada vez que necesites compilar la aplicación, ejecuta el siguiente comando: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Ten en cuenta que la primera compilación puede tardar más tiempo antes de que las dependencias se almacenen en la caché, las siguientes compilaciones serán más rápidas. Además, si necesitas especificar diferentes argumentos al comando de compilación, puedes hacerlo al final del comando en la posición ``. Por ejemplo, si deseas compilar una versión optimizada para publicación, deberas ejecutar el comando anterior seguido de `--release`. El ejecutable resultante estará disponible en la carpeta de destino en tu sistema, y puede ser ejecutado con: - -```sh -target/debug/rustdesk -``` - -O si estas ejecutando una versión para su publicación: - -```sh -target/release/rustdesk -``` - -Por favor, asegurate de que estás ejecutando estos comandos desde la raíz del repositorio de RustDesk, de lo contrario la aplicación puede ser incapaz de encontrar los recursos necesarios. También ten en cuenta que otros subcomandos de cargo como `install` o `run` no estan actualmente soportados usando este metodo, ya que instalarían o ejecutarían el programa dentro del contenedor en lugar del host. - -## Estructura de archivos - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: codec de video, configuración, tcp/udp wrapper, protobuf, funciones para transferencia de archivos, y otras funciones de utilidad. -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: captura de pantalla -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: control del teclado/mouse especificos de cada plataforma -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: GUI -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: sonido/portapapeles/input/servicios de video, y conexiones de red -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: iniciar una conexión "peer to peer" -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Comunicación con [rustdesk-server](https://github.com/rustdesk/rustdesk-server), esperar la conexión remota directa ("TCP hole punching") o conexión indirecta ("relayed") -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: código específico de cada plataforma -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: Flutter, código para moviles -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: Javascript para el cliente web Flutter - -> [!Precaución] -> **Descargo de responsabilidad por uso indebido:**
-> Los desarrolladores de RustDesk no aprueban ni apoyan ningún uso no ético o ilegal de este software. El uso indebido, como el acceso no autorizado, el control o la invasión de la privacidad, está estrictamente en contra de nuestras directrices. Los autores no son responsables de ningún uso indebido de la aplicación. - -## Capturas de pantalla - -![Connection Manager](https://github.com/rustdesk/rustdesk/assets/28412477/db82d4e7-c4bc-4823-8e6f-6af7eadf7651) - -![Connected to a Windows PC](https://github.com/rustdesk/rustdesk/assets/28412477/9baa91e9-3362-4d06-aa1a-7518edcbd7ea) - -![File Transfer](https://github.com/rustdesk/rustdesk/assets/28412477/39511ad3-aa9a-4f8c-8947-1cce286a46ad) - -![TCP Tunneling](https://github.com/rustdesk/rustdesk/assets/28412477/78e8708f-e87e-4570-8373-1360033ea6c5) diff --git a/shelled/rustdesk-as-ref/docs/README-FA.md b/shelled/rustdesk-as-ref/docs/README-FA.md deleted file mode 100644 index a0645e0..0000000 --- a/shelled/rustdesk-as-ref/docs/README-FA.md +++ /dev/null @@ -1,159 +0,0 @@ -

- RustDesk - Your remote desktop
- تصاویر محیط نرم‌افزار • - ساختار • - داکر • - ساخت • - سرور -

-

[English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]

-

برای ترجمه این سند (README)، رابط کاربری RustDesk، و مستندات آن به زبان مادری شما به کمکتان نیازمندیم.

- -با ما گفتگو کنید: [Reddit](https://www.reddit.com/r/rustdesk) | [Twitter](https://twitter.com/rustdesk) | [Discord](https://discord.gg/nDceKgxnkV) | [YouTube](https://www.youtube.com/@rustdesk) - - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-%D9%88%DB%8C%DA%98%DA%AF%DB%8C%E2%80%8C%D9%87%D8%A7%DB%8C%20%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87-blue)](https://rustdesk.com/pricing.html) - -راست‌دسک (RustDesk) نرم‌افزاری برای کارکردن با رایانه‌ی رومیزی از راه دور است و با زبان برنامه‌نویسی Rust نوشته شده است. نیاز به تنظیمات چندانی ندارد و شما را قادر می سازد تا بدون نگرانی از امنیت اطلاعات خود بر آن‌ها کنترل کامل داشته باشید. - -می‌توانید از سرور rendezvous/relay ما استفاده کنید، [سرور خودتان را راه‌اندازی کنید](https://rustdesk.com/server) یا -[ سرورrendezvous/relay خود را بنویسید](https://github.com/rustdesk/rustdesk). - -ما از مشارکت همه استقبال می کنیم. برای راهنمایی جهت مشارکت به[`docs/CONTRIBUTING.md`](CONTRIBUTING.md) مراجعه کنید. - -[راست‌دسک چطور کار می کند؟](https://github.com/rustdesk/rustdesk/wiki/How-does-RustDesk-work%3F) - -[دریافت نرم‌افزار](https://github.com/rustdesk/rustdesk/releases) - -## وابستگی ها - -نسخه‌های رومیزی از [sciter](https://sciter.com/) برای رابط کاربری گرافیکی استفاده می‌کنند. خواهشمندیم کتابخانه‌ی پویای sciter را خودتان دانلود کنید از این منابع دریافت کنید. - -- [ویندوز](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) -- [لینوکس](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) -- [مک](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -نسخه های همراه از Flutter استفاده می کنند. نسخه‌ی رومیزی را هم از Sciter به Flutter منتقل خواهیم کرد. - -## نیازمندی‌های ساخت - -- محیط توسعه نرم افزار Rust و محیط ساخت ++C خود را آماده کنید - -- نرم افزار [vcpkg](https://github.com/microsoft/vcpkg) را نصب کنید و متغیر `VCPKG_ROOT` را به درستی تنظیم کنید. -- بسته‌های vcpkg مورد نیاز را نصب کنید: - - ویندوز: `vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static` - - مک و لینوکس: `vcpkg install libvpx libyuv opus aom` -- این دستور را اجرا کنید: `cargo run` - -## [ساخت](https://rustdesk.com/docs/en/dev/build/) - -## نحوه ساخت بر روی لینوکس - -### ساخت بر روی (Ubuntu 18 (Debian 10 - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### ساخت بر روی (Fedora 28 (CentOS 8 - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### ساخت بر روی (Arch (Manjaro - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### نرم افزار vcpkg را نصب کنید - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### رفع ایراد libvpx (برای فدورا) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### ساخت - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## نحوه ساخت با داکر - -این مخزن Git را دریافت کنید و کانتینر را به روش زیر بسازید - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -سپس، هر بار که نیاز به ساخت نرم‌افزار داشتید، دستور زیر را اجرا کنید: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -توجه داشته باشید که نخستین ساخت ممکن است به دلیل محلی نبودن وابستگی‌ها بیشتر طول بکشد. اما دفعات بعدی سریعتر خواهند بود. علاوه بر این، اگر نیاز به تعیین آرگومان های مختلف برای دستور ساخت دارید، می توانید این کار را در انتهای دستور ساخت و از طریق `` انجام دهید. به عنوان مثال، اگر می خواهید یک نسخه نهایی بهینه سازی شده ایجاد کنید، دستور بالا را تایپ کنید و در انتها `release--` را اضافه کنید. فایل اجرایی به دست آمده در پوشه مقصد در سیستم شما در دسترس خواهد بود و می تواند با دستور: - -```sh -target/debug/rustdesk -``` - -یا برای نسخه بهینه سازی شده دستور زیر را اجرا کنید: - -```sh -target/release/rustdesk -``` - -لطفاً اطمینان حاصل کنید که این دستورات را از پوشه مخزن RustDesk اجرا می کنید، در غیر این صورت ممکن است برنامه نتواند منابع مورد نیاز را پیدا کند. همچنین توجه داشته باشید که سایر دستورات فرعی Cargo مانند `install` یا `run` در حال حاضر از طریق این روش پشتیبانی نمی شوند زیرا برنامه به جای سیستم عامل میزبان, در داخل کانتینر نصب و اجرا میشود. - -## ساختار پوشه ها - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video codec, config, tcp/udp wrapper, protobuf, fs functions for file transfer, and some other utility functions -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: screen capture -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: platform specific keyboard/mouse control -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: GUI -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: audio/clipboard/input/video services, and network connections -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: start a peer connection -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Communicate with [rustdesk-server](https://github.com/rustdesk/rustdesk-server), wait for remote direct (TCP hole punching) or relayed connection -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: platform specific code -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: Flutter code for mobile -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: Javascript for Flutter web client - -## تصاویر محیط نرم‌افزار - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-FI.md b/shelled/rustdesk-as-ref/docs/README-FI.md deleted file mode 100644 index 4c16797..0000000 --- a/shelled/rustdesk-as-ref/docs/README-FI.md +++ /dev/null @@ -1,148 +0,0 @@ -

- RustDesk - Etätyöpöytäsi
- Palvelimet • - Rakenna • - Docker • - Rakenne • - Tilannevedos
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Tarvitsemme apua tämän README-tiedoston kääntämiseksi äidinkielellesi -

- -Juttele meidän kanssa: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Edistyneet%20Ominaisuudet-blue)](https://rustdesk.com/pricing.html) - -Vielä yksi etätyöpöytäohjelmisto, ohjelmoitu Rust-kielellä. Toimii suoraan pakkauksesta, ei tarvitse asetusta. Hallitset täysin tietojasi, ei tarvitse murehtia turvallisuutta. Voit käyttää meidän rendezvous/relay-palvelinta, [aseta omasi](https://rustdesk.com/server), tai [kirjoittaa oma rendezvous/relay-palvelin](https://github.com/rustdesk/rustdesk-server-demo). - -RustDesk toivottaa avustukset tervetulleiksi kaikilta. Katso lisätietoja [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) avun saamiseksi. - -[**BINAARILATAUS**](https://github.com/rustdesk/rustdesk/releases) - -## Riippuvuudet - -Desktop-versiot käyttävät [sciter](https://sciter.com/) graafisena käyttöliittymänä, lataa sciter-dynaaminen kirjasto itsellesi. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Rakentamisaskeleet harppoen - -- Valmistele Rust-kehitysympäristö ja C++-rakentamisympäristö - -- Asenna [vcpkg](https://github.com/microsoft/vcpkg), ja aseta `VCPKG_ROOT`-ympäristömuuttuja oikein - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- suorita `cargo run` - -## Kuinka rakentaa Linux:issa - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Asenna vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Korjaa libvpx (Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Rakenna - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Kuinka rakennetaan Dockerin kanssa - -Aloita kloonaamalla tietovarasto ja rakentamalla docker-säiliö: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Sitten, joka kerta kun sinun on rakennettava sovellus, suorita seuraava komento: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Huomaa, että ensimmäinen rakentaminen saattaa kestää pitempään ennen kuin riippuvuudet on siirretty välimuistiin, seuraavat rakentamiset ovat nopeampia. Lisäksi, jos sinun on määritettävä eri väittämiä rakentamiskomennolle, saatat tehdä sen niin, että komennon lopussa `-kohdassa. Esimerkiksi, jos haluat rakentaa optimoidun julkaisuversion, sinun on ajettava komento yllä siten, että sitä seuraa väittämä`--release`. Suoritettava tiedosto on saatavilla järjestelmäsi kohdehakemistossa, ja se voidaan suorittaa seuraavan kera: - -```sh -target/debug/rustdesk -``` - -Tai, jos olet suorittamassa jakeluversion suoritettavaa tiedostoa: - -```sh -target/release/rustdesk -``` - -Varmista, että suoritat näitä komentoja RustDesktop-tietovaraston juurihakemistossa, muutoin sovellus ei ehkä löydä vaadittuja resursseja. Huomaa myös, että muita cargo-alikomentoja kuten `install` tai `run` ei nykyisin tueta tässä menetelmässä, koska ne asentavat tai suorittavat ohjelman säiliön sisällä eikä isäntäohjelman sisällä. - -## Tiedostorakenne - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video codec, config, tcp/udp wrapper, protobuf, fs-funktiot tiedostosiirtoon, ja jotkut muut apuohjelmafunktiot -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: näyttökaappaukset -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: platform specific keyboard/mouse control -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: Graafinen käyttöliittymä -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: audio/clipboard/input/video services, and network connections -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: start a peer connection -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Communicate with [rustdesk-server](https://github.com/rustdesk/rustdesk-server), wait for remote direct (TCP hole punching) or relayed connection -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: platform specific code - -## Tilannekuvat - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-FR.md b/shelled/rustdesk-as-ref/docs/README-FR.md deleted file mode 100644 index c2e2588..0000000 --- a/shelled/rustdesk-as-ref/docs/README-FR.md +++ /dev/null @@ -1,152 +0,0 @@ -

- RustDesk - Your remote desktop
- Serveurs - - Build - - Docker - - Structure - - Images
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Nous avons besoin de votre aide pour traduire ce README dans votre langue maternelle. -

- -Chattez avec nous : [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Fonctionnalit%C3%A9s%20Avanc%C3%A9es-blue)](https://rustdesk.com/pricing.html) - -Encore un autre logiciel de bureau à distance, écrit en Rust. Fonctionne directement, aucune configuration n'est nécessaire. Vous avez le contrôle total de vos données, sans aucun souci de sécurité. Vous pouvez utiliser notre serveur de rendez-vous/relais, [configurer le vôtre](https://rustdesk.com/server), ou [écrire votre propre serveur de rendez-vous/relais](https://github.com/rustdesk/rustdesk-server-demo). - -RustDesk accueille les contributions de tout le monde. Voir [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) pour plus d'informations. - -[**TÉLÉCHARGEMENT BINAIRE**](https://github.com/rustdesk/rustdesk/releases) - -## Dépendances - -Les versions de bureau utilisent [sciter](https://sciter.com/) pour l'interface graphique, veuillez télécharger la bibliothèque dynamique sciter vous-même. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Étapes brutes de la compilation/build - -- Préparez votre environnement de développement Rust et votre environnement de compilation C++. - -- Installez [vcpkg](https://github.com/microsoft/vcpkg), et définissez correctement la variable d'environnement `VCPKG_ROOT`. - - - Windows : vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/Osx : vcpkg install libvpx libyuv opus aom - -- Exécuter `cargo run` - -## Comment compiler/build sous Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Installer vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Corriger libvpx (Pour Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Construire - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -Exécution du cargo -``` - -## Comment construire avec Docker - -Commencez par cloner le dépôt et construire le conteneur Docker : - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Ensuite, chaque fois que vous devez compiler le logiciel, exécutez la commande suivante : - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Notez que la première compilation peut prendre plus de temps avant que les dépendances ne soient mises en cache, les compilations suivantes seront plus rapides. De plus, si vous devez spécifier différents arguments à la commande de compilation, vous pouvez le faire à la fin de la commande à la position ``. Par exemple, si vous voulez compiler une version de release optimisée, vous devez exécuter la commande ci-dessus suivie de `--release`. L'exécutable résultant sera disponible dans le dossier cible sur votre système, et peut être lancé avec : - -```sh -target/debug/rustdesk -``` - -Ou, si vous exécutez un exécutable provenant d'une release : - -```sh -target/release/rustdesk -``` - -Veuillez vous assurer que vous exécutez ces commandes à partir de la racine du dépôt RustDesk, sinon l'application ne pourra pas trouver les ressources requises. Notez également que les autres sous-commandes de cargo telles que `install` ou `run` ne sont pas actuellement supportées par cette méthode car elles installeraient ou exécuteraient le programme à l'intérieur du conteneur au lieu de l'hôte. - -## Structure du projet - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)** : codec vidéo, config, wrapper tcp/udp, protobuf, fonctions fs pour le transfert de fichiers, et quelques autres fonctions utilitaires. -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)** : capture d'écran -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)** : contrôle clavier/souris spécifique à la plate-forme -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)** : interface graphique -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)** : services audio/clipboard/input/vidéo, et connexions réseau -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)** : démarrer une connexion entre pairs -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)** : Communiquer avec [rustdesk-server](https://github.com/rustdesk/rustdesk-server), attendre une connexion distante directe (TCP hole punching) ou relayée. -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)** : code spécifique à la plateforme - -> [!Attention] -> **Avertissement contre l'utilisation abusive:**
-> Les développeurs de RustDesk ne cautionnent ni ne soutiennent aucune utilisation non éthique ou illégale de ce logiciel. Toute utilisation abusive, telle que l'accès non autorisé, le contrôle ou l'invasion de la vie privée, est strictement contraire à nos directives. Les auteurs ne sont pas responsables de toute utilisation abusive de l'application. - -## Images - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-GR.md b/shelled/rustdesk-as-ref/docs/README-GR.md deleted file mode 100644 index 8b0276b..0000000 --- a/shelled/rustdesk-as-ref/docs/README-GR.md +++ /dev/null @@ -1,171 +0,0 @@ -

- RustDesk - Your remote desktop
- Διακομιστές • - Build • - Docker • - Δομή • - Στιγμιότυπα
- [English] | [Українська] | [česky] | [中文] | | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Dansk]
- Χρειαζόμαστε τη βοήθειά σας για να μεταφράσουμε αυτό το αρχείο README, το RustDesk UI και το Doc στη μητρική σας γλώσσα -

- -Επικοινωνήστε μαζί μας μέσω: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-%CE%A0%CF%81%CE%BF%CE%B7%CE%B3%CE%BC%CE%AD%CE%BD%CE%B5%CF%82%20%CE%94%CF%85%CE%BD%CE%B1%CF%84%CF%8C%CF%84%CE%B7%CF%84%CE%B5%CF%82-blue)](https://rustdesk.com/pricing.html) - -Ένα λογισμικό απομακρυσμένης επιφάνειας εργασίας, γραμμένο σε γλώσσα Rust. Δεν χρειάζεται κάποια παραμετροποίηση, λειτουργεί αμέσως μετά την εγκατάσταση. Έχετε τον πλήρη έλεγχο των δεδομένων σας, χωρίς να ανησυχείτε για την ασφάλειά τους. Μπορείτε να χρησιμοποιήσετε τους προκαθορισμένους διακομιστές rendezvous/αναμετάδοσης, [να εγκαταστήσετε τον δικό σας διακομιστή](https://rustdesk.com/server), ή [να αναπτύξετε ένα δικό σας διακομιστή rendezvous/αναμετάδοσης](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -Το RustDesk ενθαρρύνει τη συνεισφορά όλων. Διαβάστε το [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) για βοήθεια στο πως να ξεκινήσετε. - -[**Συχνές ερωτήσεις**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**Κατεβάστε τα αρχεία**](https://github.com/rustdesk/rustdesk/releases) - -[**NIGHTLY BUILD**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) - -## Προαπαιτούμενα για build - -Στις παραθυρικές εκδόσεις χρησιμοποιείται είτε το [sciter](https://sciter.com/) είτε το Flutter, τα παρακάτω βήματα είναι μόνο για το Sciter. - -Παρακαλώ κατεβάστε μόνοι σας την δυναμική βιβλιοθήκη sciter. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Γενικά βήματα ώστε να κάνετε build - -- Προετοιμάστε τα περιβάλλοντα προγραμματισμού Rust και C++ - -- Εγκαταστήσετε το [vcpkg](https://github.com/microsoft/vcpkg), και ρυθμίστε σωστά την παράμετρο συστήματος `VCPKG_ROOT` - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- Εκτελέστε `cargo run` - -## [Build](https://rustdesk.com/docs/en/dev/build/) - -## Πως να το κάνετε build στο Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel -``` -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Εγκατάσταση vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Διόρθωση libvpx (για Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Build - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Πως να κάνετε build στο Docker - -Ξεκινήστε κλωνοποιώντας το αποθετήριο και κάνοντας build το docker container: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Στη συνέχεια, κάθε φορά που επιθυμείτε να κάνετε build την εφαρμογή, εκτελέστε την ακόλουθη εντολή: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Σημειώστε ότι το πρώτο build μπορεί να διαρκέσει περισσότερο, ώστε να αποθηκευτούν στην προσωρινή μνήμη οι εξαρτήσεις, τα επόμενα build θα είναι ταχύτερα. Επιπλέον, εάν πρέπει να καθορίσετε διαφορετικές παραμέτρους στην εντολή build, μπορείτε να το κάνετε στο τέλος της εντολής με την χρήση ``. Για παράδειγμα, εάν επιθυμείτε να δημιουργήσετε μια βελτιστοποιημένη έκδοση της εφαρμογής, θα εκτελέσετε την παραπάνω εντολή ακολουθούμενη από το `--release`. Το εκτελέσιμο αρχείο θα είναι διαθέσιμο στον προκαθορισμένο φάκελο στο σύστημά σας και μπορεί να εκτελεστεί με: - -```sh -target/debug/rustdesk -``` - -Ή στην περίπτωση μιας βελτιστοποιημένης έκδοσης της εφαρμογής εκτελέστε: - -```sh -target/release/rustdesk -``` - -Βεβαιωθείτε ότι εκτελείτε αυτές τις εντολές από την αρχική διαδρομή του αποθετηρίου του RustDesk, διαφορετικά η εφαρμογή ενδέχεται να μην είναι σε θέση να βρεί τους απαιτούμενους πόρους. Σημειώστε επίσης ότι άλλες υποεντολές, όπως το `install` ή το `run` δεν υποστηρίζονται επί του παρόντος μέσω αυτής της μεθόδου καθώς θα εγκαταστήσουν ή θα εκτελέσουν το πρόγραμμα εντός του container αντί του κεντρικού υπολογιστή. - -## Δομή φακέλων - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video codec, config, tcp/udp wrapper, protobuf, fs functions for file transfer, and some other utility functions -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: screen capture -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: platform specific keyboard/mouse control -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: GUI -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: audio/clipboard/input/video services, and network connections -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: start a peer connection -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Communicate with [rustdesk-server](https://github.com/rustdesk/rustdesk-server), wait for remote direct (TCP hole punching) or relayed connection -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: platform specific code -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: Flutter code for mobile -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: JavaScript for Flutter web client - -## Στιγμιότυπα - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-HU.md b/shelled/rustdesk-as-ref/docs/README-HU.md deleted file mode 100644 index 82d1d55..0000000 --- a/shelled/rustdesk-as-ref/docs/README-HU.md +++ /dev/null @@ -1,163 +0,0 @@ -

- RustDesk - Your remote desktop
- Szerverek • - Építés • - Docker • - Struktúra • - Képernyőképek
- [English] | [Українська] | [česky] | [中文] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Kell a segítséged, hogy lefordítsuk ezt a README-t, a RustDesk UI-t és a Dokumentációt az anyanyelvedre -

- -Beszélgess velünk: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Speci%C3%A1lis%20Funkci%C3%B3k-blue)](https://rustdesk.com/pricing.html) - -A RustDesk egy távoli elérésű asztali szoftver, Rust-ban írva. Működik mindenféle konfiguráció nélkül, feltelepítéssel, vagy anélkül. Az adataidat teljesen te kezeled, nincs szükség aggódásra a harmadik felek miatt. Használhatod a RustDesk punblikus randevú/relay szervereit, [hostolhatsz sajátot](https://rustdesk.com/server), vagy akár [írhatsz is egyet](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -A RustDesk szívesen fogad minden contributiont, támogatást mindenkitől. Lásd a [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) fájlt a kezdéshez. - -[**Hogyan működik a RustDesk?**](https://github.com/rustdesk/rustdesk/wiki/How-does-RustDesk-work%3F) - -[**BINARY LELTÖLTÉS**](https://github.com/rustdesk/rustdesk/releases) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) - -## Dependencies - -Az asztali verziók [sciter](https://sciter.com/)-t használnak a GUI-hoz, kérlek telepítsd a dynamikus könyvtárat magad. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -A telefonos verziók Flutter-t hasznának. Később lehetséges hogy Sciterről Flutterre migrálunk az asztali verziókban is. - -## Építési pontok - -- Készítsd elő a Rust, C++ fejlesztői környezetet (env) - -- Telepítsd a [vcpkg](https://github.com/microsoft/vcpkg)-t, és állítsd be a `VCPKG_ROOT` környezeti változót helyesen - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- Futtasd a `cargo run` parancsot - -## [Építés](https://rustdesk.com/docs/hu/dev/build/) - -## Hogyan építs Linuxon - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Telepítsd a vcpkg-t - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Fixeld a libvpx-t (Fedora-n csak) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Építés - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Hogyan építs Dockerrel - -Kezdjünk a repo clónozásával, majd pedig a Docker container megépítésével: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Ezután, minden egyes alkalommal amikor meg kell építened a RustDesk-et, futtasd a kövezkező parancsot: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Fontos, hogy az első építés lehet hogy több ideig fog tartani mint a következőek, mivel a dependenciek még nincsenek cachelve. Emelett, ha esetleg szeretnél valamilyen argumentumot hozzáadni az építő parancshoz, akkor megteheted a paracssor végén, a `` argumentum használatával. Például ha egy optimalizált release éptést szeretnél megépíteni, akkor add hozzá a fenti parancsorhoz a `--release` opciót. A futtatható binary elérhető lesz a target mappában a rendszereden, futtatni a következőképpen tudod: - -```sh -target/debug/rustdesk -``` - -Vagy ha release binary, akkor: - -```sh -target/release/rustdesk -``` - -Kérlek mindenképpen nézd meg hogy ezeket a parancsokat a root RustDesk mappában futtatod e, különben a RustDesk lehet hogy nem fogja megtalálni az építéshez szükséges elemeket. Fontos az is, hogy jelenleg más cargo subparancsok, például `install`vagy `run` nem támogatottak, mivel egy Dockeres építés esetén elindítanák a programot a containeren belül. - - -## Fájl Struktúra - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video codec, config, tcp/udp wrapper, protobuf, fs functions for file transfer, and some other utility functions -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: screen capture -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: platform specific keyboard/mouse control -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: GUI -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: audio/clipboard/input/video services, and network connections -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: start a peer connection -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Communicate with [rustdesk-server](https://github.com/rustdesk/rustdesk-server), wait for remote direct (TCP hole punching) or relayed connection -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: platform specific code -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: Flutter code for mobile -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: Javascript for Flutter web client - -## Képernyőképek - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-ID.md b/shelled/rustdesk-as-ref/docs/README-ID.md deleted file mode 100644 index 7b63d0e..0000000 --- a/shelled/rustdesk-as-ref/docs/README-ID.md +++ /dev/null @@ -1,166 +0,0 @@ -

- RustDesk - Your remote desktop
- Servers • - Build • - Docker • - Structure • - Snapshot
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Kami membutuhkan bantuanmu untuk menterjemahkan file README dan RustDesk UI ke Bahasa Indonesia -

- -Mari mengobrol bersama kami: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Fitur%20Lanjutan-blue)](https://rustdesk.com/pricing.html) - -[![Open Bounties](https://img.shields.io/endpoint?url=https%3A%2F%2Fconsole.algora.io%2Fapi%2Fshields%2Frustdesk%2Fbounties%3Fstatus%3Dopen)](https://console.algora.io/org/rustdesk/bounties?status=open) - -Merupakan perangkat lunak Remote Desktop yang baru, dan dibangun dengan Rust. Bahkan kamu bisa langsung menggunakannya tanpa perlu melakukan konfigurasi tambahan. Serta memiliki kontrol penuh terhadap semua data, tanpa perlu merasa was-was tentang isu keamanan, dan yang lebih menarik adalah memiliki opsi untuk menggunakan server rendezvous/relay milik kami, [konfigurasi server sendiri](https://rustdesk.com/server), atau [tulis rendezvous/relay server anda sendiri](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk mengajak semua orang untuk ikut berkontribusi. Lihat [`docs/CONTRIBUTING-ID.md`](CONTRIBUTING-ID.md) untuk melihat panduan. - -[**FAQ**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**UNDUH BINARY**](https://github.com/rustdesk/rustdesk/releases) - -[**NIGHTLY BUILD**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) - -## Dependensi - -Pada versi desktop, antarmuka pengguna (GUI) menggunakan [Sciter](https://sciter.com/) atau flutter - -Kamu bisa mengunduh Sciter dynamic library disini. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Langkah awal untuk memulai - -- Siapkan env development Rust dan env build C++ - -- Install [vcpkg](https://github.com/microsoft/vcpkg), dan atur variabel env `VCPKG_ROOT` dengan benar - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- jalankan `cargo run` - -## [Build](https://rustdesk.com/docs/en/dev/build/) - -## Cara Build di Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Install vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Mengatasi masalah libvpx (Untuk Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Build - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Cara Build dengan Docker - -Mulailah dengan melakukan kloning (clone) repositori dan build dengan docker container: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Selanjutnya, setiap kali ketika kamu akan melakukan build aplikasi, jalankan perintah berikut: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Perlu diingat bahwa pada saat build pertama kali, mungkin memerlukan waktu lebih lama sebelum dependensi di-cache, build berikutnya akan lebih cepat. Selain itu, jika perlu menentukan argumen yang berbeda untuk perintah build, kamu dapat melakukannya di akhir perintah di posisi ``. Misalnya, jika ingin membangun versi rilis yang dioptimalkan, jalankan perintah di atas dan tambahkan `--release`. Hasil eksekusi perintah tersebut akan tersimpan pada target folder di sistem kamu, dan dapat dijalankan dengan: - -```sh -target/debug/rustdesk -``` - -Atau, jika kamu menjalankan rilis yang dapat dieksekusi: - -```sh -target/release/rustdesk -``` - -Harap pastikan bahwa kamu menjalankan perintah ini dari repositori root RustDesk, jika tidak demikian, aplikasi mungkin tidak dapat menemukan sumber yang diperlukan. Dan juga, perintah cargo seperti `install` atau `run` saat ini tidak didukung melalui metode ini karena, proses menginstal atau menjalankan program terjadi di dalam container bukan pada host. - -## Struktur File - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video codec, config, tcp/udp wrapper, protobuf, fs functions untuk transfer file, dan beberapa fungsi utilitas lainnya -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: screen capture -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: spesifikasi platform keyboard/mouse control -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: GUI -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: audio/clipboard/input/video services, dan network connections -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: start a peer connection -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Komunikasi dengan [rustdesk-server](https://github.com/rustdesk/rustdesk-server), menunggu untuk remote direct (TCP hole punching) atau relayed connection -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: kode khusus platform - -## Snapshots - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-IT.md b/shelled/rustdesk-as-ref/docs/README-IT.md deleted file mode 100644 index 0393ee6..0000000 --- a/shelled/rustdesk-as-ref/docs/README-IT.md +++ /dev/null @@ -1,179 +0,0 @@ -

- RustDesk - il tuo desktop remoto
- Server • - Compilazione • - Docker • - Struttura • - Schermate
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Dansk] | [Ελληνικά] | [Türkçe]
- Abbiamo bisogno del tuo aiuto per tradurre questo file README e la UI RustDesk nella tua lingua nativa -

- -Chatta con noi su: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Funzionalit%C3%A0%20Avanzate-blue)](https://rustdesk.com/pricing.html) - -[![Bounties aperti](https://img.shields.io/endpoint?url=https%3A%2F%2Fconsole.algora.io%2Fapi%2Fshields%2Frustdesk%2Fbounties%3Fstatus%3Dopen)](https://console.algora.io/org/rustdesk/bounties?status=open) - -Ancora un altro software per il controllo remoto del desktop, scritto in Rust. Funziona immediatamente, nessuna configurazione richiesta. Hai il pieno controllo dei tuoi dati, senza preoccupazioni per la sicurezza. Puoi usare il nostro server rendezvous/relay, [configurare il tuo server](https://rustdesk.com/server) o [realizzare il tuo server rendezvous/relay](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk accoglie il contributo di tutti. Per ulteriori informazioni su come iniziare a contribuire, vedi [CONTRIBUTING.md](CONTRIBUTING-IT.md). - -[**FAQ**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**SCARICA PROGRAMMA**](https://github.com/rustdesk/rustdesk/releases) - -[**SCARICA NIGHTLY**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) - -## Dipendenze - -Le versioni desktop utilizzano Flutter o Sciter (deprecato) per l'interfaccia utente, questo tutorial è solo per Sciter, poiché è più facile per iniziare. Controlla il nostro [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml) per la compilazione della versione Flutter. - -Scarica la libreria dinamica Sciter. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Passaggi per la compilazione - -- Prepara l'ambiente per lo sviluppo e compilazione in Rust e C++ - -- Installa [vcpkg](https://github.com/microsoft/vcpkg), e imposta correttamente la variabile d'ambiente `VCPKG_ROOT` - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- Esegui `cargo run` - -## [Build](https://rustdesk.com/docs/en/dev/build/) - -## Come compilare in Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Installa vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Correzione libvpx (per Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Compilazione - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Come compilare con Docker - -Clona il repository e compila i container docker: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Quindi, ogni volta che devi compilare l'applicazione, esegui il seguente comando: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Tieni presente che la prima build potrebbe richiedere più tempo prima che le dipendenze vengano memorizzate nella cache, le build successive saranno più veloci. Inoltre, se hai bisogno di specificare argomenti diversi per il comando build, puoi farlo alla fine del comando nella posizione ``. Ad esempio, se vuoi creare una versione di rilascio ottimizzata, esegui il comando precedentemente indicato seguito da `--release`. L'eseguibile generato sarà creato nella cartella destinazione del sistema e può essere eseguito con: - -```sh -target/debug/rustdesk -``` - -Oppure, se stai avviando un eseguibile di rilascio: - -```sh -target/release/rustdesk -``` - -Assicurati di eseguire questi comandi dalla radice del repository RustDesk, altrimenti l'applicazione potrebbe non essere in grado di trovare le risorse richieste. Nota inoltre che altri sottocomandi cargo come `install` o `run` non sono attualmente supportati tramite questo metodo poiché installerebbero o eseguirebbero il programma all'interno del container anziché nell'host. - -## Struttura dei file - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: codec video, config, wrapper tcp/udp, protobuf, funzioni per il trasferimento file, e altre funzioni utili. -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: cattura dello schermo -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: controllo tastiera/mouse specifico della piattaforma -- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: implementazione del copia e incolla dei file per Windows, Linux, macOS. -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: Sciter UI obsoleto (deprecato) -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: servizi audio/appunti/input/video e connessioni di rete -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: avvio di una connessione peer -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: comunica con [rustdesk-server](https://github.com/rustdesk/rustdesk-server), attende la connessione remota diretta (TCP hole punching) oppure indiretta (relayed) -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: codice specifico della piattaforma -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: codice Flutter per desktop e mobile -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: JavaScript per client web Flutter - -> [!Attenzione] -> **Dichiarazione di non responsabilità per uso improprio:**
-> Gli sviluppatori di RustDesk non approvano né supportano alcun uso non etico o illegale di questo software. L'uso improprio, come l'accesso non autorizzato, il controllo o l'invasione della privacy, è strettamente contro le nostre linee guida. Gli autori non sono responsabili per qualsiasi uso improprio dell'applicazione. - -## Schermate - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-JP.md b/shelled/rustdesk-as-ref/docs/README-JP.md deleted file mode 100644 index c9f7564..0000000 --- a/shelled/rustdesk-as-ref/docs/README-JP.md +++ /dev/null @@ -1,183 +0,0 @@ -

- RustDesk - あなたのためのリモートデスクトップ
- Servers • - Build • - Docker • - Structure • - Snapshot
- [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Dansk] | [Ελληνικά] | [Türkçe]
- READMEやRustDesk UIRustDesk Docの翻訳者を歓迎します! -

- -私たちと話す: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-%E9%AB%98%E5%BA%A6%E3%81%AA%E6%A9%9F%E8%83%BD-blue)](https://rustdesk.com/pricing.html) - -Rustで書かれた、設定不要ですぐに使えるリモートデスクトップソフトウェアです。自分のデータを完全にコントロールでき、セキュリティの心配もありません。私たちのランデブー/リレーサーバを使うことも、[自分でサーバーをセットアップする](https://rustdesk.com/server) ことも、 [自分でランデブー/リレーサーバを作成する](https://github.com/rustdesk/rustdesk-server-demo)こともできます。 - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDeskは皆さんの貢献を歓迎します。 -貢献の方法については[CONTRIBUTING.md](CONTRIBUTING.md)をご確認ください。 - -[**よくある質問**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**パッケージのダウンロード**](https://github.com/rustdesk/rustdesk/releases) - -[**ナイトリービルド**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[F-Droidで入手する](https://f-droid.org/en/packages/com.carriez.flutter_hbb) - -## 依存関係 - -デスクトップ版ではGUIにFlutterまたはSciter(非推奨)を使用しますが、チュートリアルでは分かりやすく、簡単なSciterのみを対象に解説しています。Flutterでのビルド方法については[CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml)をご覧ください。 - -Sciter dynamic libraryを事前にダウンロードしてください。 - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## ビルド手順 - -- Rust開発環境とC++ビルド環境を準備します。 - -- [vcpkg](https://github.com/microsoft/vcpkg)をインストールし、環境変数に`VCPKG_ROOT`を設定します。 -その後、以下のコマンドを実行します。 - - - Windowsの場合: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/macOSの場合: vcpkg install libvpx libyuv opus aom - -- `cargo run`を実行します。 - -## [ビルド](https://rustdesk.com/docs/en/dev/build/) - -## Linuxでのビルド方法 - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### vcpkgのインストール - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### libvpxの修正 (Fedoraのみ) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### ビルド - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Dockerでのビルド方法 - -リポジトリをクローンし、Dockerコンテナを構築します: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -以下のコマンドを実行します: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` -このコマンドはRustDeskをビルドする度に実行する必要があります。 - -初回ビルドは時間がかかるかもしれませんが、2回目以降は依存関係がキャッシュされるため、ビルドにかかる時間が短くなります。 -ビルドコマンドに追加の引数を指定する必要がある場合は、コマンドの最後(``の位置)で指定することができます。例えば、最適化されたリリースバージョンをビルドしたい場合は、上記のコマンドの後に `--release` を追記し実行します。ビルドされた実行ファイルはあなたのシステムのターゲットフォルダに保存され、下記のコマンドで実行することができます。 - -デバッグビルドを起動する場合: -```sh -target/debug/rustdesk -``` - -リリースビルドを起動する場合: - -```sh -target/release/rustdesk -``` - -コマンドをRustDeskリポジトリのルートから実行していることを確認してください。また、`install` や `run` などの他のcargoサブコマンドは、ホストではなくコンテナ内でプログラムをインストール、実行するため、現在の方法ではサポートされていません。 - -## ファイル構造 - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: ビデオコーデック、設定、tcp/udpラッパー、protobuf、ファイル転送に利用されるfs関数やその他のユーティリティ関数 -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: スクリーンキャプチャ -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: プラットフォーム固有のキーボード/マウス操作 -- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: Windows、Linux、macOS向けのファイルのコピーと貼り付けの実装 -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: 廃止された Sciter UI (非推奨) -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: -オーディオ/クリップボード/入力/ビデオ サービスとネットワーク接続 -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: ピア接続の開始 -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: [rustdesk-server](https://github.com/rustdesk/rustdesk-server)と通信し、リモートの直接接続(TCPホールパンチング)や中継接続を担う。 -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: プラットフォーム固有のコード -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: デスクトップとモバイル向けのFlutterコード -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: Flutterウェブクライアント向けのJavaScript - -> [!注意] -> **:不正使用に関する免責事項**
-> RustDeskの開発者は、このソフトウェアの非倫理的または違法な使用を容認または支持しません。不正アクセス、不正な制御、またはプライバシーの侵害などの不正使用は、当社のガイドラインに厳密に違反します。開発者は、アプリケーションの不正使用に対して一切の責任を負いません。 - -## スクリーンショット - -![Connection Manager](https://github.com/rustdesk/rustdesk/assets/28412477/db82d4e7-c4bc-4823-8e6f-6af7eadf7651) - -![Connected to a Windows PC](https://github.com/rustdesk/rustdesk/assets/28412477/9baa91e9-3362-4d06-aa1a-7518edcbd7ea) - -![File Transfer](https://github.com/rustdesk/rustdesk/assets/28412477/39511ad3-aa9a-4f8c-8947-1cce286a46ad) - -![TCP Tunneling](https://github.com/rustdesk/rustdesk/assets/28412477/78e8708f-e87e-4570-8373-1360033ea6c5) diff --git a/shelled/rustdesk-as-ref/docs/README-KR.md b/shelled/rustdesk-as-ref/docs/README-KR.md deleted file mode 100644 index c301fde..0000000 --- a/shelled/rustdesk-as-ref/docs/README-KR.md +++ /dev/null @@ -1,182 +0,0 @@ -

- RustDesk - Your remote desktop
- 빌드 • - Docker • - 구조 • - 스냇샷
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Dansk] | [Ελληνικά] | [Türkçe] | [Norsk]
- 이 README, RustDesk UIRustDesk 문서를 귀하의 모국어로 번역하는 데 도움이 필요합니다 -

- -> [!Caution] -> **오용 면책 조항:**
-> RustDesk의 개발자는 이 소프트웨어의 비윤리적 또는 불법적인 사용을 묵인하거나 지원하지 않습니다. 무단 액세스, 제어 또는 개인정보 침해와 같은 오용은 엄격하게 당사의 지침에 위배됩니다. 작성자는 응용 프로그램의 오용에 대해 책임을 지지 않습니다. - - -우리와 채팅: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-%EA%B3%A0%EA%B8%89%20%EA%B8%B0%EB%8A%A5-blue)](https://rustdesk.com/pricing.html) - -또 하나의 원격 데스크톱 솔루션으로, Rust로 작성되었습니다. 별도의 설정 없이 바로 사용할 수 있습니다. 데이터에 대한 완전한 통제권을 가지며 보안에 대한 걱정이 없습니다. 저희 랑데부/릴레이 서버를 사용하거나, [직접 설정](https://rustdesk.com/server)하거나, [자신만의 랑데부/릴레이 서버를 작성](https://github.com/rustdesk/rustdesk-server-demo)할 수 있습니다. - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk는 모든 분들의 기여를 환영합니다. 시작하는 데 도움이 필요하면 [CONTRIBUTING-KR.md](CONTRIBUTING-KR.md)를 참조하세요. - -[**자주 묻는 질문**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**바이너리 다운로드**](https://github.com/rustdesk/rustdesk/releases) - -[**개발자 빌드**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) -[Get it on Flathub](https://flathub.org/apps/com.rustdesk.RustDesk) - -## 종속성 - -데스크톱 버전은 GUI로 Flutter 또는 Sciter (더 이상 지원되지 않음)를 사용하며, 이 자습서는 시작하기 더 쉽고 친숙한 Sciter 전용입니다. Flutter 버전 빌드는 [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml)을 확인하세요. - -Sciter 동적 라이브러리를 직접 다운로드하세요. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## 빌드를 위한 원시 단계 - -- Rust 개발 환경과 C++ 빌드 환경을 준비합니다 - -- [vcpkg](https://github.com/microsoft/vcpkg)를 설치하고 `VCPKG_ROOT` 환경 변수를 올바르게 설정합니다 - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/macOS: vcpkg install libvpx libyuv opus aom - -- `cargo run` 실행 - -## [빌드](https://rustdesk.com/docs/en/dev/build/) - -## Linux에서 빌드하는 방법 - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libpam0g-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel pam-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel pam-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### vcpkg 설치 - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### libvpx 수정 (Fedora용) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### 빌드 - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone --recurse-submodules https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Docker로 빌드하는 방법 - -먼저 리포지토리를 복제하고 Docker 컨테이너를 빌드합니다: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -git submodule update --init --recursive -docker build -t "rustdesk-builder" . -``` - -그런 다음 응용 프로그램을 빌드해야 할 때마다 다음 명령을 실행합니다: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -첫 번째 빌드는 종속성이 캐시되기까지 시간이 오래 걸릴 수 있으며, 이후 빌드는 더 빨라집니다. 또한 빌드 명령에 다른 인수를 지정해야 하는 경우 명령 끝의 `` 위치에 인수를 지정할 수 있습니다. 예를 들어 최적화된 릴리스 버전을 빌드하려면 위의 명령 뒤에 `--release`를 추가하면 됩니다. 결과 실행 파일은 시스템의 대상 폴더에서 사용할 수 있으며 실행할 수 있습니다:: - -```sh -target/debug/rustdesk -``` - -또는 릴리스 실행 파일을 실행하는 경우: - -```sh -target/release/rustdesk -``` - -RustDesk 리포지토리의 루트에서 이러한 명령을 실행하고 있는지 확인하세요. 그렇지 않으면 응용 프로그램이 필요한 리소스를 찾지 못할 수 있습니다. 또한 `install` 또는 `run` 과 같은 다른 cargo 하위 명령은 호스트가 아닌 컨테이너 내부에 프로그램을 설치하거나 실행하므로 현재 이 방법을 통해 지원되지 않는다는 점에 유의하세요. - -## 파일 구조 - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: 비디오 코덱, 구성, tcp/udp wrapper, protobuf, 파일 전송을 위한 fs 함수 및 기타 유틸리티 함수 -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: 화면 캡쳐 -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: 플랫폼별 키보드/마우스 제어 -- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: Windows, Linux, macOS용 파일 복사 및 붙여넣기 구현 -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: 더 이상 사용되지 않는 Sciter UI (지원 중단) -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: 오디오/클립보드/입력/비디오 서비스 및 네트워크 연결 -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: 피어 연결 시작 -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: [rustdesk-server](https://github.com/rustdesk/rustdesk-server)와 통신, 원격 다이렉트 (TCP 홀 펀칭) 또는 릴레이 연결 대기 -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: 플랫폼별 코드 -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: 데스크톱 및 모바일용 Flutter 코드 -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/v1/js)**: Flutter 웹 클라이언트용 JavaScript - -## 스크린샷 - -![Connection Manager](https://github.com/rustdesk/rustdesk/assets/28412477/db82d4e7-c4bc-4823-8e6f-6af7eadf7651) - -![Connected to a Windows PC](https://github.com/rustdesk/rustdesk/assets/28412477/9baa91e9-3362-4d06-aa1a-7518edcbd7ea) - -![File Transfer](https://github.com/rustdesk/rustdesk/assets/28412477/39511ad3-aa9a-4f8c-8947-1cce286a46ad) - -![TCP Tunneling](https://github.com/rustdesk/rustdesk/assets/28412477/78e8708f-e87e-4570-8373-1360033ea6c5) - diff --git a/shelled/rustdesk-as-ref/docs/README-ML.md b/shelled/rustdesk-as-ref/docs/README-ML.md deleted file mode 100644 index 225d7b9..0000000 --- a/shelled/rustdesk-as-ref/docs/README-ML.md +++ /dev/null @@ -1,148 +0,0 @@ -

- RustDesk - Your remote desktop
- Servers • - Build • - Docker • - Structure • - Snapshot
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- ഈ README നിങ്ങളുടെ മാതൃഭാഷയിലേക്ക് വിവർത്തനം ചെയ്യാൻ ഞങ്ങൾക്ക് നിങ്ങളുടെ സഹായം ആവശ്യമാണ് -

- -ഞങ്ങളുമായി ചാറ്റ് ചെയ്യുക: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-%E0%B4%B5%E0%B4%BF%E0%B4%95%E0%B4%B8%E0%B4%BF%E0%B4%A4%20%E0%B4%B8%E0%B4%B5%E0%B4%BF%E0%B4%B6%E0%B5%87%E0%B4%B7%E0%B4%A4%E0%B4%95%E0%B5%BE-blue)](https://rustdesk.com/pricing.html) - -റസ്റ്റിൽ എഴുതിയ മറ്റൊരു റിമോട്ട് ഡെസ്ക്ടോപ്പ് സോഫ്റ്റ്‌വെയർ. ബോക്‌സിന് പുറത്ത് പ്രവർത്തിക്കുന്നു, കോൺഫിഗറേഷൻ ആവശ്യമില്ല. സുരക്ഷയെക്കുറിച്ച് ആശങ്കകളൊന്നുമില്ലാതെ, നിങ്ങളുടെ ഡാറ്റയുടെ പൂർണ്ണ നിയന്ത്രണം നിങ്ങൾക്കുണ്ട്. നിങ്ങൾക്ക് ഞങ്ങളുടെ rendezvous/relay സെർവർ ഉപയോഗിക്കാം, [സ്വന്തമായി സജ്ജീകരിക്കുക](https://rustdesk.com/server), അല്ലെങ്കിൽ [നിങ്ങളുടെ സ്വന്തം rendezvous/relay സെർവർ എഴുതുക](https://github.com/rustdesk/rustdesk-server-demo). - -എല്ലാവരുടെയും സംഭാവനയെ RustDesk സ്വാഗതം ചെയ്യുന്നു. ആരംഭിക്കുന്നതിനുള്ള സഹായത്തിന് [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) കാണുക. - -[**BINARY DOWNLOAD**](https://github.com/rustdesk/rustdesk/releases) - -## ഡിപെൻഡൻസികൾ - -ഡെസ്‌ക്‌ടോപ്പ് പതിപ്പുകൾ GUI-യ്‌ക്കായി [sciter](https://sciter.com/) ഉപയോഗിക്കുന്നു, ദയവായി സ്‌സൈറ്റർ ഡൈനാമിക് ലൈബ്രറി സ്വയം ഡൗൺലോഡ് ചെയ്യുക. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## നിർമ്മിക്കാനുള്ള അസംസ്കൃത പടികൾ - -- നിങ്ങളുടെ Rust development envയും and C++ build envയും തയ്യാറാക്കുക - -- [vcpkg](https://github.com/microsoft/vcpkg) ഇൻസ്റ്റാൾ ചെയ്ത് `VCPKG_ROOT` env വേരിയബിൾ ശരിയായി സജ്ജമാക്കുക - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- run `cargo run` - -## ലിനക്സിൽ എങ്ങനെ നിർമ്മിക്കാം - -### ഉബുണ്ടു 18 (ഡെബിയൻ 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### ഫെഡോറ 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### ആർച് (മഞ്ചാരോ) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### vcpkg ഇൻസ്റ്റാൾ ചെയ്യുക - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### libvpx പരിഹരിക്കുക (ഫെഡോറയ്ക്ക്) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### നിർമാണം - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## ഡോക്കർ ഉപയോഗിച്ച് എങ്ങനെ നിർമ്മിക്കാം - - റെപ്പോസിറ്റോറി ക്ലോണുചെയ്‌ത് ഡോക്കർ കണ്ടെയ്‌നർ നിർമ്മിക്കുന്നതിലൂടെ ആരംഭിക്കുക: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -തുടർന്ന്, ഓരോ തവണയും നിങ്ങൾ ആപ്ലിക്കേഷൻ നിർമ്മിക്കേണ്ടതുണ്ട്, ഇനിപ്പറയുന്ന കമാൻഡ് പ്രവർത്തിപ്പിക്കുക: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -ഡിപൻഡൻസികൾ കാഷെ ചെയ്യുന്നതിനുമുമ്പ് ആദ്യ ബിൽഡ് കൂടുതൽ സമയമെടുത്തേക്കാം, തുടർന്നുള്ള ബിൽഡുകൾ വേഗത്തിലാകും. കൂടാതെ, നിങ്ങൾക്ക് ബിൽഡ് കമാൻഡിലേക്ക് വ്യത്യസ്ത ആർഗ്യുമെന്റുകൾ വ്യക്തമാക്കണമെങ്കിൽ, കമാൻഡിന്റെ അവസാനം `` സ്ഥാനത്ത് നിങ്ങൾക്ക് അങ്ങനെ ചെയ്യാം. ഉദാഹരണത്തിന്, നിങ്ങൾ ഒരു ഒപ്റ്റിമൈസ് ചെയ്ത റിലീസ് പതിപ്പ് നിർമ്മിക്കാൻ ആഗ്രഹിക്കുന്നുവെങ്കിൽ, മുകളിലുള്ള കമാൻഡ് തുടർന്ന് `--release` നിങ്ങൾ പ്രവർത്തിപ്പിക്കും. തത്ഫലമായുണ്ടാകുന്ന എക്സിക്യൂട്ടബിൾ നിങ്ങളുടെ സിസ്റ്റത്തിലെ ടാർഗെറ്റ് ഫോൾഡറിൽ ലഭ്യമാകും, കൂടാതെ ഇത് ഉപയോഗിച്ച് പ്രവർത്തിപ്പിക്കാം: - -```sh -target/debug/rustdesk -``` - -അല്ലെങ്കിൽ, നിങ്ങൾ ഒരു റിലീസ് എക്സിക്യൂട്ടബിൾ പ്രവർത്തിപ്പിക്കുകയാണെങ്കിൽ: - -```sh -target/release/rustdesk -``` - -RustDesk റിപ്പോസിറ്ററിയുടെ റൂട്ടിൽ നിന്നാണ് നിങ്ങൾ ഈ കമാൻഡുകൾ പ്രവർത്തിപ്പിക്കുന്നതെന്ന് ദയവായി ഉറപ്പാക്കുക, അല്ലാത്തപക്ഷം ആപ്ലിക്കേഷന് ആവശ്യമായ ഉറവിടങ്ങൾ കണ്ടെത്താൻ കഴിഞ്ഞേക്കില്ല. ഹോസ്റ്റിന് പകരം കണ്ടെയ്‌നറിനുള്ളിൽ പ്രോഗ്രാം ഇൻസ്റ്റാൾ ചെയ്യുകയോ പ്രവർത്തിപ്പിക്കുകയോ ചെയ്യുന്നതിനാൽ, `install` അല്ലെങ്കിൽ `run` പോലുള്ള മറ്റ് കാർഗോ സബ്‌കമാൻഡുകൾ നിലവിൽ ഈ രീതിയെ പിന്തുണയ്ക്കുന്നില്ല എന്നതും ശ്രദ്ധിക്കുക. - -## ഫയൽ ഘടന - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video codec, config, tcp/udp wrapper, protobuf, fs functions for file transfer, and some other utility functions -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: screen capture -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: platform specific keyboard/mouse control -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: GUI -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: audio/clipboard/input/video services, and network connections -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: start a peer connection -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Communicate with [rustdesk-server](https://github.com/rustdesk/rustdesk-server), wait for remote direct (TCP hole punching) or relayed connection -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: platform specific code - -## സ്നാപ്പ്ഷോട്ടുകൾ - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-NL.md b/shelled/rustdesk-as-ref/docs/README-NL.md deleted file mode 100644 index 45d68b2..0000000 --- a/shelled/rustdesk-as-ref/docs/README-NL.md +++ /dev/null @@ -1,168 +0,0 @@ -

- RustDesk - Uw bureaublad op afstand
- Servers • - Bouwen • - Docker • - Structuur • - Snapshot
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Wij hebben uw hulp nodig om dit README bestand te vertalen, RustDesk UI en Doc naar uw moedertaal -

- -Chat met ons: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Geavanceerde%20Functies-blue)](https://rustdesk.com/pricing.html) - -Alweer een andere programma voor -bureaublad op afstand-, geschreven in Rust. Werkt -out of the box-, geen configuratie nodig. U heeft volledige controle over uw gegevens, en hoeft zich geen zorgen te maken over de beveiliging. U kunt onze rendez-vous/relay server gebruiken, [je eigen server opzetten](https://rustdesk.com/blog/id-relay-set), of [je eigen rendez-vous/relay-server schrijven](https://github.com/rustdesk/rustdesk-server-demo). - -RustDesk verwelkomt bijdragen van iedereen. Zie [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) voor hulp om aan de slag te gaan. - -[**FAQ**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**BINARY DOWNLOAD**](https://github.com/rustdesk/rustdesk/releases) - -[**NIGHTLY BUILD**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) (meest recente build) - -[Download het op F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) - -## Afhankelijkheden - -Desktop versies gebruiken [sciter](https://sciter.com/) of Flutter voor GUI, deze handleiding is alleen voor Sciter. - -Download zelf de dynamic library van Sciter. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Ruwe stappen om te bouwen - -- Bereid je Rust-ontwikkelomgeving en C++-bouwomgeving voor. - -- Installeer [vcpkg](https://github.com/microsoft/vcpkg) en configureer de `VCPKG_ROOT` omgevingsvariabele op de juiste manier: - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- Voer uit: `cargo run` - -## [Bouwen](https://rustdesk.com/docs/en/dev/build/) - -## Bouwen op Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Installatie van vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Fix voor libvpx (voor Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Bouwen - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Bouwen met Docker - -Begin met het klonen van de repository en het bouwen van de docker container: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Elke keer dat u de toepassing moet bouwen, voert u het volgende commando uit: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Let op dat de eerste build langer kan duren omdat de dependencies nog niet zijn gecached; latere builds zullen sneller zijn. Als je extra command line arguments wilt toevoegen aan het build-commando, dan kun je dat doen aan het einde van de opdrachtregel in plaats van ``. Bijvoorbeeld: als je een geoptimaliseerde releaseversie wilt bouwen, draai dan het bovenstaande commando gevolgd door `--release`. - - Het uitvoerbare bestand, in debug-modus, zal verschijnen in de target-map, en kan als volgt worden uitgevoerd: - -```sh -target/debug/rustdesk -``` - -Als je een release-versie hebt gebouwd, is het commando als volgt: - -```sh -target/release/rustdesk -``` - -Zorg ervoor dat je deze commando's van de root van de RustDesk-repository uitvoert, anders kan het programma de nodige afhankelijkheden mogelijk niet vinden. Let ook op dat andere cargo-subcommando's zoals `install` en `run` zijn momenteel niet ondersteund, aangezien deze zouden worden uitgevoerd in een container in plaats van op de host. - -## Bestandsstructuur - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: videocodec, configuratie, TCP/UDP-wrapper, protobuf, bestandssysteemfuncties voor bestandsoverdracht en nog wat andere nuttige functies -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: schermopname -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: platformspecifieke muis- en toetsenbordbeheer -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: GUI -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: geluids-, klembord-, invoer- en video-services, netwerkverbindingen -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: voor het opzetten van peer-verbindingen -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Communicatie met [rustdesk-server](https://github.com/rustdesk/rustdesk-server), afwachten van redirect op afstand (TCP hole punching) of een relayed verbinding -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: platformspecifieke code - -## Snapshot - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-NO.md b/shelled/rustdesk-as-ref/docs/README-NO.md deleted file mode 100644 index 1352e8a..0000000 --- a/shelled/rustdesk-as-ref/docs/README-NO.md +++ /dev/null @@ -1,177 +0,0 @@ -

- RustDesk - Your remote desktop
- Servere • - Build • - Docker • - Struktur • - Snapshot
- [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Dansk] | [Ελληνικά] | [Türkçe] | [Norsk
- Vi trenger din hjelp til å oversette denne README-en, RustDesk UI og RustDesk Doc tid ditt morsmål -

- -Snakk med oss: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Avanserte%20Funksjoner-blue)](https://rustdesk.com/pricing.html) - -Enda en annen fjernstyrt desktop programvare, skrevet i Rust. Virker rett ut av pakken, ingen konfigurasjon nødvendig. Du har full kontroll over din data, uten beskymring for sikkerhet. Du kan bruke vår rendezvous_mediator/relay server, [sett opp din egen](https://rustdesk.com/server), eller [skriv din egen rendezvous_mediator/relay server](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk er velkommen for bidrag fra alle. Se [CONTRIBUTING.md](CONTRIBUTING-NO.md) for hjelp med oppstart. - -[**FAQ**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**BINARY NEDLASTING**](https://github.com/rustdesk/rustdesk/releases) - -[**NIGHTLY BUILD**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Få det på F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) -[Få det på Flathub](https://flathub.org/apps/com.rustdesk.RustDesk) - -## Avhengigheter - -Desktop versjoner bruker Flutter eller Sciter (avviklet) for GUI, denne veiledningen er bare for Sciter, grunnet att det er letter og en mer venlig start. Skjekk ut vår [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml) for bygging av Flutter versjonen. - -Venligst last ned Sciters dynamiske bibliotek selv. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Rå steg for bygging - -- Klargjør ditt Rust development env og C++ build env - -- Installer [vcpkg](https://github.com/microsoft/vcpkg), og koriger `VCPKG_ROOT` env vaiabelen - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/macOS: vcpkg install libvpx libyuv opus aom - -- Kjør `cargo run` - -## [Bygg](https://rustdesk.com/docs/en/dev/build/) - -## Hvordan Bygge til Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libpam0g-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel pam-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel pam-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Installer vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Fiks libvpx (For Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Bygg - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Hvordan bygge med Docker - -Start med å klone repositoret og bygg Docker konteineren: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Deretter, hver gang du trenger å bygge applikasjonen, kjør følgene kommando: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Det kan ta lengere tid før avhengighetene blir bufret første gang du bygger, senere bygg er raskere. Hvis du trenger å spesifisere forkjellige argumenter til bygge kommandoen, kan du gjøre det på slutten av kommandoen ved `` feltet. For eksempel, hvis du ville bygge en optimalisert release versjon, ville du kjørt kommandoen over fulgt `--release`. Den kjørbare filen vill være tilgjengelig i mål direktive på ditt system, og kan bli kjørt med: - -```sh -target/debug/rustdesk -``` - -Eller, hvis du kjører ett release program: - -```sh -target/release/rustdesk -``` - -Venligst pass på att du kjører disse kommandoene fra roten av RustDesk repositoret, eller kan det hende att applikasjon ikke finner de riktige ressursene. Pass også på att andre cargo subkommandoer som for eksempel `install` eller `run` ikke støttes med denne metoden da de vill installere eller kjøre programmet i konteineren istedet for verten. - -## Fil Struktur - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video kodek, configurasjon, tcp/udp innpakning, protobuf, fs funksjon for fil overføring, og noen andre verktøy funksjoner -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: skjermfangst -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: platform spesefik keyboard/mus kontroll -- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: fil kopi og innliming implementasjon for Windows, Linux, macOS. -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: foreldret Sciter UI (avviklet) -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: lyd/utklippstavle/input/video tjenester, og internett tilkobling -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: start en peer tilkobling -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Kommunikasjon med [rustdesk-server](https://github.com/rustdesk/rustdesk-server), vent på direkte fjernstyring (TCP hulling) eller vidresendt tilkobling -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: platform spesefik kode -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: Flutter kode for desktop og mobil -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: JavaScript for Flutter nettsted klient - -## Skjermbilder - -![Tilkoblings Manager](https://github.com/rustdesk/rustdesk/assets/28412477/db82d4e7-c4bc-4823-8e6f-6af7eadf7651) - -![Koble til Windows PC](https://github.com/rustdesk/rustdesk/assets/28412477/9baa91e9-3362-4d06-aa1a-7518edcbd7ea) - -![Fil Overføring](https://github.com/rustdesk/rustdesk/assets/28412477/39511ad3-aa9a-4f8c-8947-1cce286a46ad) - -![TCP Tunneling](https://github.com/rustdesk/rustdesk/assets/28412477/78e8708f-e87e-4570-8373-1360033ea6c5) - diff --git a/shelled/rustdesk-as-ref/docs/README-PL.md b/shelled/rustdesk-as-ref/docs/README-PL.md deleted file mode 100644 index 437682a..0000000 --- a/shelled/rustdesk-as-ref/docs/README-PL.md +++ /dev/null @@ -1,169 +0,0 @@ -

- RustDesk - Twój zdalny pulpit
- Serwery • - Kompilacja • - Docker • - Struktura • - Snapshot
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Potrzebujemy twojej pomocy w tłumaczeniu README na twój ojczysty język -

- -Porozmawiaj z nami na: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Zaawansowane%20Funkcje-blue)](https://rustdesk.com/pricing.html) - -## O projekcie - -RustDesk to wieloplatformowe oprogramowanie do zdalnego pulpitu, napisane w języku Rust, zaprojektowane z myślą o prostocie wdrożenia, bezpieczeństwie i pełnej kontroli użytkownika nad danymi. Aplikacja działa od razu po uruchomieniu i nie wymaga skomplikowanej konfiguracji. Możesz skorzystać z naszego darmowego serwera publicznego, [skonfigurować własny](https://rustdesk.com/server), lub [napisać własny serwer](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk zaprasza do współpracy każdego. Zobacz [`docs/CONTRIBUTING-PL.md`](CONTRIBUTING-PL.md) pomoc w uruchomieniu programu. - -[**PYTANIA I ODPOWIEDZI (FAQ)**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**POBIERANIE BINARIÓW**](https://github.com/rustdesk/rustdesk/releases) - -[**WERSJE TESTOWE (NIGHTLY)**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) - -## Zależności - -Wersje desktopowe korzystają z biblioteki [sciter](https://sciter.com/) jako silnika GUI. Bibliotekę Sciter należy pobrać i zainstalować samodzielnie. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Podstawowe kroki do kompilacji - -- Przygotuj środowisko programistyczne Rust i środowisko programowania C++ - -- Zainstaluj [vcpkg](https://github.com/microsoft/vcpkg), i ustaw prawidłowo zmienną `VCPKG_ROOT` - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- uruchom `cargo run` - -## Jak Kompilować na Linuxie - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Zainstaluj vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Popraw libvpx (Dla Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Kompilacja - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -cargo run -``` - -## Jak kompilować za pomocą Dockera - -Rozpocznij od sklonowania repozytorium i stworzenia kontenera docker: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Następnie, za każdym razem, gdy potrzebujesz skompilować aplikację, uruchom następujące polecenie: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Zauważ, że pierwsza kompilacja może potrwać dłużej zanim zależności zostaną zbuforowane, kolejne będą szybsze. Dodatkowo, jeśli potrzebujesz określić inne argumenty dla polecenia budowania, możesz to zrobić na końcu komendy w miejscu ``. Na przykład, jeśli chciałbyś zbudować zoptymalizowaną wersję wydania, uruchomiłbyś powyższą komendę a następnie `--release`. Powstały plik wykonywalny będzie dostępny w folderze docelowym w twoim systemie i może być uruchomiony z: - -```sh -target/debug/rustdesk -``` - -Lub jeśli uruchamiasz plik wykonywalny wersji: - -```sh -target/release/rustdesk -``` - -Upewnij się, że uruchamiasz te polecenia z katalogu głównego repozytorium RustDesk, w przeciwnym razie aplikacja może nie być w stanie znaleźć wymaganych zasobów. Należy również pamiętać, że inne podpolecenia ładowania, takie jak `install` lub `run` nie są obecnie obsługiwane za pomocą tej metody, ponieważ instalowałyby lub uruchamiały program wewnątrz kontenera zamiast na hoście. - -## Struktura plików - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: kodek wideo, konfiguracja, obsługa tcp/udp, protobuf, funkcje systemu plików do transferu plików i kilka innych funkcji użytkowych -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: przechwytywanie ekranu -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: specyficzne dla danej platformy sterowanie klawiaturą/myszą -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: GUI -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: audio/schowek/wejście(input)/wideo oraz połączenia sieciowe -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: uruchamia połączenie bezpośrednie -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Komunikacja z [rustdesk-server](https://github.com/rustdesk/rustdesk-server), czekanie na bezpośrednie (odpytywanie TCP) lub przekazywane połączenie -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: kod specyficzny dla danej platformy -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: kod Flutter dla urządzeń mobilnych -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: JavaScript dla Flutter - klient web - -## Zrzuty ekranu - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) - diff --git a/shelled/rustdesk-as-ref/docs/README-PTBR.md b/shelled/rustdesk-as-ref/docs/README-PTBR.md deleted file mode 100644 index 6c3e6b9..0000000 --- a/shelled/rustdesk-as-ref/docs/README-PTBR.md +++ /dev/null @@ -1,152 +0,0 @@ -

- RustDesk - Seu desktop remoto
- Servidores • - Compilar • - Docker • - Estrutura • - Screenshots
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Precisamos de sua ajuda para traduzir este README e a UI do RustDesk para sua língua nativa -

- -Converse conosco: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Recursos%20Avan%C3%A7ados-blue)](https://rustdesk.com/pricing.html) - -Mais um software de desktop remoto, escrito em Rust. Funciona por padrão, sem necessidade de configuração. Você tem completo controle de seus dados, sem se preocupar com segurança. Você pode usar nossos servidores de rendezvous/relay, [configurar seu próprio](https://rustdesk.com/server), ou [escrever seu próprio servidor de rendezvous/relay](https://github.com/rustdesk/rustdesk-server-demo). - -RustDesk acolhe contribuições de todos. Leia [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) para ver como começar. - -[**DOWNLOAD DE BINÁRIOS**](https://github.com/rustdesk/rustdesk/releases) - -## Dependências - -Versões de desktop utilizam [sciter](https://sciter.com/) para a GUI, por favor baixe a biblioteca dinâmica sciter por conta própria. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Compilação crua - -- Prepare seu ambiente de desenvolvimento Rust e ambiente de compilação C++ - -- Instale [vcpkg](https://github.com/microsoft/vcpkg), e configure a variável de ambiente `VCPKG_ROOT` corretamente - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/MacOS: vcpkg install libvpx libyuv opus aom - -- Execute `cargo run` - -## Como compilar no Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Instale vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Conserte libvpx (Para o Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Compile - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Como compilar com Docker - -Comece clonando o repositório e montando o container docker: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Então, sempre que precisar compilar a aplicação, execute este comando: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Note que a primeira compilação pode demorar mais antes que as dependências sejam armazenadas em cache, as compilações subsequentes serão mais rápidas. Adicionalmente, se você precisar especificar argumentos diferentes para o comando de compilação, você pode fazê-lo ao final do comando na posição do ``. Por exemplo, se você gostaria de compilar uma versão de release otimizada, você executaria o comando acima seguido de `--release`. O executável gerado estará disponível no diretório alvo no seu sistema, e pode ser executado com: - -```sh -target/debug/rustdesk -``` - -Ou, se estiver rodando um executável de release: - -```sh -target/release/rustdesk -``` - -Por favor verifique que está executando estes comandos da raiz do repositório do RustDesk, senão a aplicação pode não encontrar os recursos necessários. Note também que outros subcomandos do cargo como `install` ou `run` não são suportados atualmente via este método, já que eles iriam instalar ou rodar o programa dentro do container ao invés do host. - -## Estrutura de arquivos - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: codec de vídeo, configurações, wrapper de tcp/udp, protobuf, funções de sistema de arquivos para transferência de arquivos, e outras funções utilitárias -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: captura de tela -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: controle de teclado/mouse específico a cada plataforma -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: GUI -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: serviços de áudio/área de transferência/entrada/vídeo, e conexões de rede -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: iniciar uma conexão "peer to peer" -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: Comunicação com [rustdesk-server](https://github.com/rustdesk/rustdesk-server), aguardar pela conexão remota direta (TCP hole punching) ou conexão indireta (relayed) -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: código específico a cada plataforma - -> [!Cuidadob] -> **Aviso de uso indevido:**
-> Os desenvolvedores do RustDesk não aprovam nem apoiam qualquer uso antiético ou ilegal deste software. O uso indevido, como acesso não autorizado, controle ou invasão de privacidade, é estritamente contra nossas diretrizes. Os autores não são responsáveis por qualquer uso indevido da aplicação. - -## Screenshots - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-RO.md b/shelled/rustdesk-as-ref/docs/README-RO.md deleted file mode 100644 index be7ecf1..0000000 --- a/shelled/rustdesk-as-ref/docs/README-RO.md +++ /dev/null @@ -1,181 +0,0 @@ -

- RustDesk - desktopul tău la distanță
- Construire • - Docker • - Structură • - Capturi
- [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Dansk] | [Ελληνικά] | [Türkçe] | [Norsk] | [Română]
- Avem nevoie de ajutorul tău pentru a traduce acest README, RustDesk UI și RustDesk Doc în limba ta maternă -

- -> [!Atenție] -> **Declinare de responsabilitate privind utilizarea abuzivă:**
-> Dezvoltatorii RustDesk nu susțin sau aprobă utilizarea neetică sau ilegală a acestui software. Utilizarea abuzivă, cum ar fi accesul neautorizat, controlul sau invadarea intimității, este strict împotriva regulilor noastre. Autorii nu sunt responsabili pentru utilizarea necorespunzătoare a aplicației. - - -Conversați cu noi: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Advanced%20Features-blue)](https://rustdesk.com/pricing.html) - -Încă o soluție de desktop la distanță scrisă în Rust. Funcționează imediat, fără configurare necesară. Ai control total asupra datelor tale, fără probleme de securitate. Poți folosi serverul nostru de rendezvous/relay, [să-ți configurezi propriul server](https://rustdesk.com/server) sau [să scrii propriul server de rendezvous/relay](https://github.com/rustdesk/rustdesk-server-demo). - -![imagine](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk primește contribuții de la oricine. Vezi [CONTRIBUTING.md](../docs/CONTRIBUTING.md) pentru ajutor la început. - -[**ÎNTREBĂRI FRECVENTE (FAQ)**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**DESCĂRCARE BINARE**](https://github.com/rustdesk/rustdesk/releases) - -[**BUILD NIGHTLY**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) -[Get it on Flathub](https://flathub.org/apps/com.rustdesk.RustDesk) - -## Dependențe - -Versiunile desktop folosesc Flutter sau Sciter (depreciat) pentru interfață; acest ghid este pentru Sciter doar, deoarece este mai ușor și mai prietenos pentru început. Vezi [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml) pentru construire cu Flutter. - -Te rugăm să descarci singur librăria dinamică Sciter. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Pași pentru construire (Raw Steps to build) - -- Pregătește mediul de dezvoltare Rust și mediul de construire C++ - -- Instalează [vcpkg](https://github.com/microsoft/vcpkg) și setează corect variabila de mediu `VCPKG_ROOT` - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/macOS: vcpkg install libvpx libyuv opus aom - -- rulează `cargo run` - -## [Construire](https://rustdesk.com/docs/en/dev/build/) - -## Cum se construiește pe Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libpam0g-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel pam-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel pam-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Instalează vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Repară libvpx (Pentru Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Build - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone --recurse-submodules https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Cum să construiești cu Docker - -Începe prin clonarea repository-ului și construirea imaginii Docker: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -git submodule update --init --recursive -docker build -t "rustdesk-builder" . -``` - -Apoi, de fiecare dată când trebuie să construiești aplicația, rulează comanda următoare: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Reține că prima construire poate dura mai mult până când dependențele sunt în cache; construirile ulterioare vor fi mai rapide. De asemenea, dacă trebuie să specifici argumente diferite comenzii de build, le poți adăuga la finalul comenzii în poziția ``. De exemplu, pentru a construi o versiune optimizată de release, adaugă `--release`. Executabilul rezultat va fi disponibil în folderul `target` pe sistemul tău, și poate fi rulat cu: - -```sh -target/debug/rustdesk -``` - -Sau, dacă rulezi un executabil release: - -```sh -target/release/rustdesk -``` - -Asigură-te că rulezi aceste comenzi din rădăcina repository-ului RustDesk, altfel aplicația poate să nu găsească resursele necesare. De asemenea, reține că alte subcomenzi cargo, cum ar fi `install` sau `run`, nu sunt acceptate în prezent prin această metodă, deoarece ar instala sau rula programul în interiorul containerului în loc de gazdă. - -## Structura fișierelor - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: codec video, config, wrapper tcp/udp, protobuf, funcții fs pentru transfer de fișiere și alte funcții utilitare -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: capturare ecran -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: control tastatură/mouse specific platformei -- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: implementare copy/paste pentru fișiere pentru Windows, Linux, macOS. -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: interfață Sciter învechită (depreciată) -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: servicii audio/clipboard/input/video și conexiuni de rețea -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: inițiază o conexiune peer -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: comunică cu [rustdesk-server](https://github.com/rustdesk/rustdesk-server), așteaptă conexiune directă remote (TCP hole punching) sau prin relay -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: cod specific platformei -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: cod Flutter pentru desktop și mobil -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/v1/js)**: JavaScript pentru clientul Flutter web - -## Capturi de ecran - -![Connection Manager](https://github.com/rustdesk/rustdesk/assets/28412477/db82d4e7-c4bc-4823-8e6f-6af7eadf7651) - -![Connected to a Windows PC](https://github.com/rustdesk/rustdesk/assets/28412477/9baa91e9-3362-4d06-aa1a-7518edcbd7ea) - -![File Transfer](https://github.com/rustdesk/rustdesk/assets/28412477/39511ad3-aa9a-4f8c-8947-1cce286a46ad) - -![TCP Tunneling](https://github.com/rustdesk/rustdesk/assets/28412477/78e8708f-e87e-4570-8373-1360033ea6c5) diff --git a/shelled/rustdesk-as-ref/docs/README-RU.md b/shelled/rustdesk-as-ref/docs/README-RU.md deleted file mode 100644 index 928faad..0000000 --- a/shelled/rustdesk-as-ref/docs/README-RU.md +++ /dev/null @@ -1,183 +0,0 @@ -

- RustDesk - Ваш удаленый рабочий стол
- Первичные шаги для сборки • - Как собрать с помощью Docker • - Структура файлов • - Скриншоты
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
- Нам нужна ваша помощь в переводе этого README, интерфейса RustDesk - и документации RustDesk на ваш родной язык. -

- -> [!Caution] -> **Отказ от ответственности за неправомерное использование**
-> Разработчики RustDesk не одобряют и не поддерживают какое-либо неэтичное или незаконное использование данного программного обеспечения. Неправомерное использование (несанкционированный доступ, контроль или вторжение в частную жизнь) строго противоречит нашим правилам. Авторы не несут ответственности за любое неправомерное использование приложения. - -Общение с нами: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%92%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8-blue)](https://rustdesk.com/pricing.html) - -Ещё одно программное обеспечение для удаленного рабочего стола, написанное на Rust. Работает из коробки, настройки не требует. Вы полностью контролируете свои данные, не беспокоясь о безопасности. Вы можете использовать наш сервер ретрансляции, [настроить свой собственный](https://rustdesk.com/server), или [написать свой](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk приветствует вклад каждого. Ознакомьтесь с [`docs/CONTRIBUTING-RU.md`](CONTRIBUTING-RU.md) в начале работы для понимания. - -[**Как работает RustDesk?**](https://github.com/rustdesk/rustdesk/wiki/How-does-RustDesk-work%3F) (Документация на английском языке) - -[**Часто задаваемые вопросы**](https://github.com/rustdesk/rustdesk/wiki/FAQ) (Страница на английском языке) - -[**СКАЧАТЬ ПРИЛОЖЕНИЕ**](https://github.com/rustdesk/rustdesk/releases) - -[**НОЧНЫЕ СБОРКИ (Актуальные)**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) -[Get it on Flathub](https://flathub.org/apps/com.rustdesk.RustDesk) - -## Зависимости - -Для ПК-версии используются библиотеки Flutter или Sciter (устаревшее) для графического интерфейса. Данное руководство подразумевает работу с Sciter, так как он более простой в использовании и с ним легче начать работу. Вы можете также посмотреть на механизм нашего [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml) для сборок на Flutter. - -Загрузите динамическую библиотеку Flutter самостоятельно. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Первичные шаги для сборки - -- Подготовьте среду разработки Rust и среду сборки C++. - -- Установите [vcpkg](https://github.com/microsoft/vcpkg), и правильно установите переменную `VCPKG_ROOT` - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/macOS: vcpkg install libvpx libyuv opus aom - -- Выполните команду `cargo run` - -## [Сборка](https://rustdesk.com/docs/ru/dev/build/) - -## Как собрать на Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libpam0g-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel pam-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel pam-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Установка vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Исправление libvpx (для Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Сборка - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone --recurse-submodules https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Как собрать с помощью Docker - -Начните с клонирования репозитория и создания docker-контейнера: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -git submodule update --init --recursive -docker build -t "rustdesk-builder" . -``` - -Затем при каждой сборке приложения выполняйте следующую команду: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Обратите внимание, что первая сборка может занять больше времени, прежде чем зависимости будут кэшированы, но последующие сборки будут выполняться быстрее. Кроме того, если вам нужно указать другие аргументы для команды сборки, вы можете сделать это в конце команды в переменной ``. Например, если вы хотите создать оптимизированную версию, вы должны выполнить приведенную выше команду и в конце строки добавить `--release`. Полученный исполняемый файл будет доступен в целевой папке вашей системы и может быть запущен с помощью следующей команды: - -```sh -target/debug/rustdesk -``` - -Или, если вы используете исполняемый файл релиза: - -```sh -target/release/rustdesk -``` - -Пожалуйста, убедитесь, что вы запускаете эти команды из корня репозитория RustDesk, иначе приложение не сможет найти необходимые ресурсы. Также обратите внимание, что другие подкоманды Cargo, такие как `install` или `run`, в настоящее время не поддерживаются этим методом, поскольку они будут устанавливать или запускать программу внутри контейнера, а не на хосте. - -## Структура файлов - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: видеокодек, конфигурация, враппер TCP/UDP, protobuf, функции файловой системы для передачи файлов и некоторые другие служебные функции -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: захват экрана -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: специфичное для платформы управление клавиатурой/мышью -- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: функционал буфера обмена файлами для Windows, Linux, и macOS -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: графический пользовательский интерфейс на Sciter (устаревшее) -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: сервисы аудио, буфера обмена, ввода, видео и сетевых подключений -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: одноранговое соединение -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: связь с [сервером RustDesk](https://github.com/rustdesk/rustdesk-server), ожидает удаленного прямого (через TCP hole punching) или ретранслируемого соединения -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: специфичный для платформы код -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: код Flutter для ПК-версии и мобильных устройств -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/v1/js)**: JavaScript для Web-клиента Flutter - -## Скриншоты - -![Менеджер соединений](https://github.com/rustdesk/rustdesk/assets/28412477/db82d4e7-c4bc-4823-8e6f-6af7eadf7651) - -![Подключение к удалённому рабочему столу на Windows](https://github.com/rustdesk/rustdesk/assets/28412477/9baa91e9-3362-4d06-aa1a-7518edcbd7ea) - -![Передача файлов](https://github.com/rustdesk/rustdesk/assets/28412477/39511ad3-aa9a-4f8c-8947-1cce286a46ad) - -![TCP-туннелирование](https://github.com/rustdesk/rustdesk/assets/28412477/78e8708f-e87e-4570-8373-1360033ea6c5) \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/docs/README-TR.md b/shelled/rustdesk-as-ref/docs/README-TR.md deleted file mode 100644 index 99c961e..0000000 --- a/shelled/rustdesk-as-ref/docs/README-TR.md +++ /dev/null @@ -1,181 +0,0 @@ - -

- RustDesk - Uzak masaüstü uygulamanız
- Sunucular • - Derleme • - Docker ile Derleme • - Dosya Yapısı • - Ekran Görüntüleri
- [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Dansk] | [Ελληνικά]
- README, RustDesk UI ve RustDesk Dökümantasyonu'nu ana dilinize çevirmemiz için yardımınıza ihtiyacımız var -

- - -> [!Dikkat] -> **Yanlış Kullanım Uyarısı:**
-> RustDesk geliştiricileri, bu yazılımın etik olmayan veya yasa dışı kullanımını onaylamaz veya desteklemez. Yetkisiz erişim, kontrol veya gizlilik ihlali gibi kötüye kullanımlar kesinlikle yönergelerimize aykırıdır. Yazarlar, uygulamanın herhangi bir yanlış kullanımından sorumlu değildir. - -Bizimle sohbet edin: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-Geli%C5%9Fmi%C5%9F%20%C3%96zellikler-blue)](https://rustdesk.com/pricing.html) - -Rust dilinde yazılmış, başka bir uzak masaüstü yazılımı daha. Hiçbir yapılandırma gerekmeksizin, hemen kullanıma hazır. Güvenlik konusunda hiçbir endişe duymadan, verileriniz üzerinde tam kontrole sahip olun. Kendi rendezvous/relay sunucumuzu kullanabilirsiniz, [kendi sunucunuzu kurabilirsiniz](https://rustdesk.com/server) veya [kendi rendezvous/relay sunucunuzu yazabilirsiniz](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk, herkesin katkısına açıktır. Başlamak için [CONTRIBUTING.md](CONTRIBUTING-TR.md) belgesine göz atın. - -[**SSS**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**BINARY İNDİR**](https://github.com/rustdesk/rustdesk/releases) - -[**NIGHTLY DERLEME**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[F-Droid'de Alın](https://f-droid.org/en/packages/com.carriez.flutter_hbb) - -## Gereksinimler - -Masaüstü sürümleri GUI için; [Sciter](https://sciter.com/)(kaldırılacak) veya Flutter kullanır. Sciter daha kolay ve başlamak için daha dostcanlısı, bundan dolayı bu kılavuz sadece Sciter içindir. Flutter sürümünü derlemek için [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml)'ımıza bakın. - -Lütfen Sciter dinamik kütüphanesini kendiniz indirin. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Temel Derleme Adımları - -- Rust geliştirme ortamınızı ve C++ derleme ortamınızı hazırlayın. - -- [vcpkg](https://github.com/microsoft/vcpkg) yükleyin ve `VCPKG_ROOT` ortam değişkenini doğru bir şekilde ayarlayın. - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/macOS: vcpkg install libvpx libyuv opus aom - -- `cargo run` komutunu çalıştırın. - -## [Derleme](https://rustdesk.com/docs/en/dev/build/) - -## Linux Üzerinde Derleme Nasıl Yapılır - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### vcpkg'yi Yükleyin - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### libvpx'i Düzeltin (Fedora için) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Derleme - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Docker ile Derleme Nasıl Yapılır - -Önce repository'i klonlayın ve Docker container'ını oluşturun. - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Ardından, uygulamayı her derlemeniz gerektiğinde aşağıdaki komutu çalıştırın: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Bilin ki ilk derlemeniz gereksinimlerin önbelleği yüklenmesinden ötürü uzun sürebilir, sonraki derlemeleriniz daha hızlı olacaktır. Ayrıca, derleme komutuna isteğe bağlı argümanlar belirtmeniz gerekiyorsa, bunu komutun sonunda ki `` yerine yazabilirsiniz. Örneğin, optimize edilmiş bir sürümü derlemek isterseniz, yukarıdaki komutu çalıştırdıktan sonra `--release` ekleyebilirsiniz. Oluşan çalıştırılabilir dosya sisteminizdeki hedef klasöründe bulunacak ve şu komutla çalıştırılabilir olacaktır: - -```sh -target/debug/rustdesk -``` - -Veya, yayım çalıştırılabilir dosyası için: - -```sh -target/release/rustdesk -``` - -Lütfen bu komutları RustDesk reposunun root klasöründe çalıştırdığınızdan emin olun, aksi takdirde uygulama gereken kaynakları bulamayabilir. Ayrıca, `install` veya `run` gibi diğer cargo altkomutları şu anda bu yöntem aracılığıyla desteklenmemektedir, çünkü bunlar programı konteyner içinde kurar veya çalıştırır, ana makinede değil. - -## Dosya Yapısı - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video codec, config, tcp/udp wrapper, protobuf, dosya transferi için fs fonksiyonları ve diğer bazı yardımcı işlevler -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: ekran yakalama -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: platforma özgü klavye/fare kontrolü -- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: platforma özgü kopyala/yapıştır implementasyonları. -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: Eski Sciter UI (kaldırılacak) -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: ses/pano/input/video servisleri ve ağ bağlantıları -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: Eşli bağlantı başlat -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: [rustdesk-server](https://github.com/rustdesk/rustdesk-server) ile iletişime gir, remote direct(TCP delik açma) yada relay bağlantısı için bekle -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: platforma özgü kod -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: Masaüstü ve mobil için Flutter kodu -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/v1/js)**: Flutter web istemcisi için JavaScript - - -## Ekran Görüntüleri - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) -``` diff --git a/shelled/rustdesk-as-ref/docs/README-UA.md b/shelled/rustdesk-as-ref/docs/README-UA.md deleted file mode 100644 index eb4c9ed..0000000 --- a/shelled/rustdesk-as-ref/docs/README-UA.md +++ /dev/null @@ -1,174 +0,0 @@ -

- RustDesk - Ваша віддалена стільниця
- Сервери • - Збирання • - Docker • - Структура • - Знімки екрана
- [English] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Dansk] | [Ελληνικά] | [Türkçe]
- Нам потрібна ваша допомога для перекладу цього README, інтерфейсу та документації RustDesk вашою рідною мовою -

- -Спілкування з нами: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-%D0%A0%D0%BE%D0%B7%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D1%96%20%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D1%96%D1%97-blue)](https://rustdesk.com/pricing.html) - -Ще один застосунок для віддаленого керування стільницею, написаний на Rust. Працює з коробки, не потребує налаштування. Ви повністю контролюєте свої дані, не турбуючись про безпеку. Ви можете використовувати наш сервер ретрансляції, [налаштувати свій власний](https://rustdesk.com/server), або [написати свій власний сервер ретрансляції](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk вітає внесок кожного. Ознайомтеся з [CONTRIBUTING.md](CONTRIBUTING.md), щоб отримати допомогу на початковому етапі. - -[**ЧаПи**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**ЗАВАНТАЖЕННЯ ЗАСТОСУНКУ**](https://github.com/rustdesk/rustdesk/releases) - -[**НІЧНІ ЗБІРКИ**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) - -## Залежності - -Стільничні версії використовують Flutter чи Sciter (застаріле) для графічного інтерфейсу. Ця інструкція лише для Sciter, оскільки він є більш простим та дружнім для початківців. Перегляньте [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml) для збірки версії на Flutter. - -Будь ласка, завантажте динамічну бібліотеку Sciter самостійно. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Кроки для збірки - -- Підготуйте середовище розробки Rust і середовище збирання C++. - -- Встановіть [vcpkg](https://github.com/microsoft/vcpkg), і правильно встановіть змінну `VCPKG_ROOT`. - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/macOS: vcpkg install libvpx libyuv opus aom - -- Запустіть `cargo run` - -## [Збирання](https://rustdesk.com/docs/en/dev/build/) - -## Як зібрати на Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libpam0g-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel pam-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel pam-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Встановлення vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Виправлення libvpx (для Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Збирання - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Як зібрати за допомогою Docker - -Почніть з клонування сховища та створення docker-контейнера: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Надалі щоразу, коли вам буде потрібно зібрати застосунок, запускайте таку команду: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Зверніть увагу, що перша збірка може зайняти більше часу, перш ніж залежності будуть кешовані, але наступні збірки будуть виконуватися швидше. Крім того, якщо вам потрібно вказати інші аргументи для команди збірки, ви можете зробити це в кінці команди у змінній ``. Наприклад, якщо ви хочете створити оптимізовану версію, ви маєте запустити наведену вище команду і в кінці рядка додати `--release`. Отриманий виконуваний файл буде доступний у цільовій папці вашої системи і може бути запущений за допомогою: - -```sh -target/debug/rustdesk -``` - -Або, якщо ви використовуєте виконуваний файл релізу: - -```sh -target/release/rustdesk -``` - -Будь ласка, переконайтеся, що ви запускаєте ці команди з кореня сховища RustDesk, інакше додаток не зможе знайти необхідні ресурси. Також зверніть увагу, що інші cargo підкоманди, такі як `install` або `run`, наразі не підтримуються цим методом, оскільки вони будуть встановлювати або запускати програму всередині контейнера, а не на хості. - -## Структура файлів - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: відеокодек, конфіг, обгортка tcp/udp, protobuf, функції fs для передавання файлів і деякі інші службові функції -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: захоплення екрана -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: специфічне для платформи керування клавіатурою/мишею -- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: реалізація копіювання та вставлення файлів для Windows, Linux, macOS. -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: графічний інтерфейс користувача -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: сервіси аудіо/буфера обміну/вводу/відео та мережевих підключень -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: однорангове зʼєднання -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: комунікація з [rustdesk-server](https://github.com/rustdesk/rustdesk-server), очікування віддаленого прямого (обхід TCP NAT) або ретрансльованого зʼєднання -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: специфічний для платформи код -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: код Flutter для мобільних пристроїв -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: JavaScript для веб клієнта на Flutter - -## Знімки екрана - -![Менеджер зʼєднань](https://github.com/rustdesk/rustdesk/assets/28412477/db82d4e7-c4bc-4823-8e6f-6af7eadf7651) - -![Підключення до ПК з Windows](https://github.com/rustdesk/rustdesk/assets/28412477/9baa91e9-3362-4d06-aa1a-7518edcbd7ea) - -![Передача файлів](https://github.com/rustdesk/rustdesk/assets/28412477/39511ad3-aa9a-4f8c-8947-1cce286a46ad) - -![Тунелювання TCP](https://github.com/rustdesk/rustdesk/assets/28412477/78e8708f-e87e-4570-8373-1360033ea6c5) - diff --git a/shelled/rustdesk-as-ref/docs/README-VN.md b/shelled/rustdesk-as-ref/docs/README-VN.md deleted file mode 100644 index 38cdc10..0000000 --- a/shelled/rustdesk-as-ref/docs/README-VN.md +++ /dev/null @@ -1,161 +0,0 @@ - - -

- RustDesk - Your remote desktop
- Server • - Build • - Docker • - Structure • - Snapshot
- [English] | [Українська] | [česky] | [中文] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Ελληνικά]
- Chúng tôi rất hoan nghênh sự hỗ trợ của bạn trong việc dịch trang README, trang giao diện người dùng của RustDesk - RustDesk UI và trang tài liệu của RustDesk - RustDesk Doc sang Tiếng Việt -

- -Hãy trao đổi với chúng tôi qua: [Discord](https://discord.gg/nDceKgxnkV) | [Twitter](https://twitter.com/rustdesk) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-T%C3%ADnh%20N%C4%83ng%20N%C3%A2ng%20Cao-blue)](https://rustdesk.com/pricing.html) - -RustDesk là một phần mềm điểu khiển máy tính từ xa mã nguồn mở, được viết bằng Rust. Nó hoạt động ngay sau khi cài đặt, không yêu cầu cấu hình phức tạp. Bạn có toàn quyền kiểm soát với dữ liệu của mình mà không cần phải lo lắng về vấn đề bảo mật. Bạn có thể sử dụng máy chủ rendezvous/relay của chúng tôi hoặc [tự cài đặt máy chủ của riêng mình](https://rustdesk.com/server) hay thậm chí [tự tạo máy chủ rendezvous/relay cho riêng bạn](https://github.com/rustdesk/rustdesk-server-demo). - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -**RustDesk** luôn hoan nghênh mọi đóng góp từ mọi người. Hãy xem tệp [`docs/CONTRIBUTING.md`](CONTRIBUTING.md) để bắt đầu. - -[**FAQ**](https://github.com/rustdesk/rustdesk/wiki/FAQ) -[**BINARY DOWNLOAD**](https://github.com/rustdesk/rustdesk/releases) -[**NIGHTLY BUILD**](https://github.com/rustdesk/rustdesk/FAQreleases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) - -## Dependencies - -Phiên bản máy tính sử dụng __Flutter__ hoặc __Sciter__ (đã lỗi thời) cho giao diện người dùng (GUI). Hướng dẫn này chỉ áp dụng cho phiên bản Sciter, vì nó thân thiện và dễ bắt đầu hơn. Hãy kiểm tra [CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml) của chúng tôi để xây dựng phiên bản Flutter. - -Vui lòng tự tải thư viện `Sciter` về máy theo hướng dẫn cho từng hệ điều hành. - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | [Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | [MacOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## Các bước build cơ bản - -- Chuẩn bị môi trường phát triển Rust và môi trường biên dịch C++ - -- Tải và cài đặt [`vcpkg`](https://github.com/microsoft/vcpkg), và thiết lập biến môi trường `VCPKG_ROOT`. - - - Windows: `vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static` - - Linux/MacOS: `vcpkg install libvpx libyuv opus aom` -- Chạy lệnh `cargo run` - -## [Build](https://rustdesk.com/docs/en/dev/build/) - -## Cách build cho Linux - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### Cách cài đặt `vcpkg` - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### Cách sửa lỗi `libvpx` (Dành cho hệ điều hành Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### Build - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## Cách build bằng Docker - -Bắt đầu bằng cách sao chép repo này về máy tính của bạn và tạo Docker container: - -```sh -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -docker build -t "rustdesk-builder" . -``` - -Sau đó, mỗi khi bạn chạy ứng dụng, thì hãy chạy dòng lệnh sau: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -Lưu ý rằng **lần build đầu tiên có thể mất thời gian hơn trước khi các dependencies được lưu vào bộ nhớ cache**, nhưng các lần build sau sẽ nhanh hơn. Ngoài ra, nếu bạn cần chỉ định các đối số khác cho lệnh build, bạn có thể thêm chúng vào cuối lệnh ở phần ``. Ví dụ, nếu bạn muốn build phiên bản tối ưu hóa, bạn sẽ chạy lệnh trên với tùy chọn `--release`. Kết quả biên dịch sẽ được lưu trong thư mục target trên máy tính của bạn, và có thể chạy với lệnh: - -```sh -target/debug/rustdesk -``` - -Nếu bạn đang chạy bản build được tối ưu hóa, thì bạn có thể chạy với lệnh: - -```sh -target/release/rustdesk -``` - -Hãy đảm bảo rằng bạn đang chạy các lệnh này từ gốc của thư mục **RustDesk**, nếu không, ứng dụng có thể không thể tìm thấy các tệp tài nguyên cần thiết. Hãy lưu ý rằng các câu lệnh con khác của **cargo** như **install** hoặc **run** hiện không được hỗ trợ qua phương pháp này, vì chúng sẽ cài đặt hoặc chạy chương trình bên trong **container** thay vì trên máy tính của bạn. - -## Cấu trúc tệp tin - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: video codec, cấu hình, tcp/udp wrapper, protobuf, fs functions để truyền file, và một số hàm tiện ích khác -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: ghi lại màn hình -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: điều khiển máy tính/chuột trên các nền tảng khác nhau -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: giao diện người dùng -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: các dịch vụ âm thanh, clipboard, đầu vào, video và các kết nối mạng -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: bắt đầu kết nối với một peer -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: giao tiếp với [rustdesk-server](https://github.com/rustdesk/rustdesk-server), đợi kết nối trực tiếp (TCP hole punching) hoặc kết nối được chuyển tiếp. -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: mã nguồn riêng cho mỗi nền tảng -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: Mã Flutter dành máy tính và điện thoại -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: Mã JavaScript dành cho giao diện trên web bằng Flutter - -## Snapshot - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/README-ZH.md b/shelled/rustdesk-as-ref/docs/README-ZH.md deleted file mode 100644 index 9328e52..0000000 --- a/shelled/rustdesk-as-ref/docs/README-ZH.md +++ /dev/null @@ -1,233 +0,0 @@ -

- RustDesk - Your remote desktop
- 服务器 • - 编译 • - Docker • - 结构 • - 截图
- [English] | [Українська] | [česky] | [Magyar] | [Español] | [فارسی] | [Français] | [Deutsch] | [Polski] | [Indonesian] | [Suomi] | [മലയാളം] | [日本語] | [Nederlands] | [Italiano] | [Русский] | [Português (Brasil)] | [Esperanto] | [한국어] | [العربي] | [Tiếng Việt] | [Ελληνικά]
-

- -> [!CAUTION] -> **免责声明:**
-> RustDesk 的开发人员不纵容或支持任何不道德或非法的软件使用行为。滥用行为,例如未经授权的访问、控制或侵犯隐私,严格违反我们的准则。作者对应用程序的任何滥用行为概不负责。 - -与我们交流: [知乎](https://www.zhihu.com/people/rustdesk) | [Discord](https://discord.gg/nDceKgxnkV) | [Reddit](https://www.reddit.com/r/rustdesk) | [YouTube](https://www.youtube.com/@rustdesk) - -[![RustDesk Server Pro](https://img.shields.io/badge/RustDesk%20Server%20Pro-%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD-blue)](https://rustdesk.com/pricing.html) - -远程桌面软件,开箱即用,无需任何配置。您完全掌控数据,不用担心安全问题。您可以使用我们的注册/中继服务器, -或者[自己设置](https://rustdesk.com/server), -亦或者[开发您的版本](https://github.com/rustdesk/rustdesk-server-demo)。 - -![image](https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png) - -RustDesk 期待各位的贡献. 如何参与开发? 详情请看 [CONTRIBUTING-ZH.md](CONTRIBUTING-ZH.md). - -[**FAQ**](https://github.com/rustdesk/rustdesk/wiki/FAQ) - -[**BINARY DOWNLOAD**](https://github.com/rustdesk/rustdesk/releases) - -[**NIGHTLY BUILD**](https://github.com/rustdesk/rustdesk/releases/tag/nightly) - -[Get it on F-Droid](https://f-droid.org/en/packages/com.carriez.flutter_hbb) - -## 依赖 - -桌面版本使用 Flutter 或 Sciter(已弃用)作为 GUI,本教程仅适用于 Sciter,因为它更简单且更易于上手。查看我们的[CI](https://github.com/rustdesk/rustdesk/blob/master/.github/workflows/flutter-build.yml)以构建 Flutter 版本。 - -请自行下载Sciter动态库。 - -[Windows](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.win/x64/sciter.dll) | -[Linux](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so) | -[macOS](https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.osx/libsciter.dylib) - -## 基本构建步骤 - -- 请准备好 Rust 开发环境和 C++ 编译环境 - -- 安装 [vcpkg](https://github.com/microsoft/vcpkg), 正确设置 `VCPKG_ROOT` 环境变量 - - - Windows: vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static - - Linux/macOS: vcpkg install libvpx libyuv opus aom - -- 运行 `cargo run` - -## [构建](https://rustdesk.com/docs/en/dev/build/) - -## 在 Linux 上编译 - -### Ubuntu 18 (Debian 10) - -```sh -sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \ - libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \ - libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev -``` - -### openSUSE Tumbleweed - -```sh -sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel -``` - -### Fedora 28 (CentOS 8) - -```sh -sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel -``` - -### Arch (Manjaro) - -```sh -sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire -``` - -### 安装 vcpkg - -```sh -git clone https://github.com/microsoft/vcpkg -cd vcpkg -git checkout 2023.04.15 -cd .. -vcpkg/bootstrap-vcpkg.sh -export VCPKG_ROOT=$HOME/vcpkg -vcpkg/vcpkg install libvpx libyuv opus aom -``` - -### 修复 libvpx (仅仅针对 Fedora) - -```sh -cd vcpkg/buildtrees/libvpx/src -cd * -./configure -sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile -sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile -make -cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/ -cd -``` - -### 构建 - -```sh -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source $HOME/.cargo/env -git clone https://github.com/rustdesk/rustdesk -cd rustdesk -mkdir -p target/debug -wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so -mv libsciter-gtk.so target/debug -VCPKG_ROOT=$HOME/vcpkg cargo run -``` - -## 使用 Docker 编译 - -克隆版本库并构建 Docker 容器: - -```sh -git clone https://github.com/rustdesk/rustdesk # 克隆Github存储库 -cd rustdesk # 进入文件夹 -docker build -t "rustdesk-builder" . # 构建容器 -``` - -请注意: -* 针对国内网络访问问题,可以做以下几点优化: - 1. Dockerfile 中修改系统的源到国内镜像 - ``` - 在Dockerfile的RUN apt update之前插入两行: - - RUN sed -i "s|deb.debian.org|mirrors.aliyun.com|g" /etc/apt/sources.list && \ - sed -i "s|security.debian.org|mirrors.aliyun.com|g" /etc/apt/sources.list - ``` - - 2. 修改容器系统中的 cargo 源,在`RUN ./rustup.sh -y`后插入下面代码: - - ``` - RUN echo '[source.crates-io]' > ~/.cargo/config \ - && echo 'registry = "https://github.com/rust-lang/crates.io-index"' >> ~/.cargo/config \ - && echo '# 替换成你偏好的镜像源' >> ~/.cargo/config \ - && echo "replace-with = 'sjtu'" >> ~/.cargo/config \ - && echo '# 上海交通大学' >> ~/.cargo/config \ - && echo '[source.sjtu]' >> ~/.cargo/config \ - && echo 'registry = "https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index"' >> ~/.cargo/config \ - && echo '' >> ~/.cargo/config - ``` - - 3. Dockerfile 中加入代理的 env - - ``` - 在User root后插入两行 - - ENV http_proxy=http://host:port - ENV https_proxy=http://host:port - ``` - - 4. docker build 命令后面加上 proxy 参数 - - ``` - docker build -t "rustdesk-builder" . --build-arg http_proxy=http://host:port --build-arg https_proxy=http://host:port - ``` - -### 构建 RustDesk 程序 - -然后, 每次需要构建应用程序时, 运行以下命令: - -```sh -docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder -``` - -请注意: -* 因为需要缓存依赖项,首次构建一般很慢(国内网络会经常出现拉取失败,可以多试几次)。 -* 如果您需要添加不同的构建参数,可以在指令末尾的`` 位置进行修改。例如构建一个"Release"版本,在指令后面加上` --release`即可。 -* 如果出现以下的提示,则是无权限问题,可以尝试把`-e PUID="$(id -u)" -e PGID="$(id -g)"`参数去掉。 - ``` - usermod: user user is currently used by process 1 - groupmod: Permission denied. - groupmod: cannot lock /etc/group; try again later. - ``` - > **原因:** 容器的 entrypoint 脚本会检测 UID 和 GID,在度判和给定的环境变量的不一致时,会强行修改 user 的 UID 和 GID 并重新运行。但在重启后读不到环境中的 UID 和 GID,然后再次进入判错重启环节 - - -### 运行 RustDesk 程序 - -生成的可执行程序在 target 目录下,可直接通过指令运行调试 (Debug) 版本的 RustDesk: -```sh -target/debug/rustdesk -``` - -或者您想运行发行 (Release) 版本: - -```sh -target/release/rustdesk -``` - -请注意: -* 请保证您运行的目录是在 RustDesk 库的根目录内,否则软件会读不到文件。 -* `install`、`run`等 Cargo 的子指令在容器内不可用,宿主机才行。 - -## 文件结构 - -- **[libs/hbb_common](https://github.com/rustdesk/rustdesk/tree/master/libs/hbb_common)**: 视频编解码, 配置, tcp/udp 封装, protobuf, 文件传输相关文件系统操作函数, 以及一些其他实用函数 -- **[libs/scrap](https://github.com/rustdesk/rustdesk/tree/master/libs/scrap)**: 屏幕截取 -- **[libs/enigo](https://github.com/rustdesk/rustdesk/tree/master/libs/enigo)**: 平台相关的鼠标键盘输入 -- **[libs/clipboard](https://github.com/rustdesk/rustdesk/tree/master/libs/clipboard)**: Windows、Linux、macOS 的文件复制和粘贴实现 -- **[src/ui](https://github.com/rustdesk/rustdesk/tree/master/src/ui)**: 过时的 Sciter UI(已弃用) -- **[src/server](https://github.com/rustdesk/rustdesk/tree/master/src/server)**: 被控端服务音频、剪切板、输入、视频服务、网络连接的实现 -- **[src/client.rs](https://github.com/rustdesk/rustdesk/tree/master/src/client.rs)**: 控制端 -- **[src/rendezvous_mediator.rs](https://github.com/rustdesk/rustdesk/tree/master/src/rendezvous_mediator.rs)**: 与[rustdesk-server](https://github.com/rustdesk/rustdesk-server)保持UDP通讯, 等待远程连接(通过打洞直连或者中继) -- **[src/platform](https://github.com/rustdesk/rustdesk/tree/master/src/platform)**: 平台服务相关代码 -- **[flutter](https://github.com/rustdesk/rustdesk/tree/master/flutter)**: 适用于桌面和移动设备的 Flutter 代码 -- **[flutter/web/js](https://github.com/rustdesk/rustdesk/tree/master/flutter/web/js)**: Flutter Web版本中的Javascript代码 - -## 截图 - -![image](https://user-images.githubusercontent.com/71636191/113112362-ae4deb80-923b-11eb-957d-ff88daad4f06.png) - -![image](https://user-images.githubusercontent.com/71636191/113112619-f705a480-923b-11eb-911d-97e984ef52b6.png) - -![image](https://user-images.githubusercontent.com/71636191/113112857-3fbd5d80-923c-11eb-9836-768325faf906.png) - -![image](https://user-images.githubusercontent.com/71636191/135385039-38fdbd72-379a-422d-b97f-33df71fb1cec.png) diff --git a/shelled/rustdesk-as-ref/docs/SECURITY-DE.md b/shelled/rustdesk-as-ref/docs/SECURITY-DE.md deleted file mode 100644 index 65f4f79..0000000 --- a/shelled/rustdesk-as-ref/docs/SECURITY-DE.md +++ /dev/null @@ -1,9 +0,0 @@ -# Sicherheitsrichtlinie - -## Melden einer Schwachstelle - -Wir legen großen Wert auf die Sicherheit des Projekts. Wir ermutigen alle Benutzer, uns alle Sicherheitslücken zu melden, die sie entdecken. -Wenn Sie eine Sicherheitslücke im RustDesk-Projekt finden, melden Sie diese bitte verantwortungsbewusst per E-Mail an info@rustdesk.com. - -Zum jetzigen Zeitpunkt haben wir kein Bug-Bounty-Programm. Wir sind ein kleines Team, das versucht, ein großes Problem zu lösen. Wir bitten Sie dringend, -alle Schwachstellen verantwortungsbewusst zu melden, damit wir weiterhin eine sichere Anwendung für die ganze Gemeinschaft entwickeln können. diff --git a/shelled/rustdesk-as-ref/docs/SECURITY-IT.md b/shelled/rustdesk-as-ref/docs/SECURITY-IT.md deleted file mode 100644 index 91573dc..0000000 --- a/shelled/rustdesk-as-ref/docs/SECURITY-IT.md +++ /dev/null @@ -1,11 +0,0 @@ -# Policy sicurezza - -## Segnalazione di una vulnerabilità - -Attribuiamo grande importanza alla sicurezza del progetto. -Incoraggiamo tutti gli utenti a segnalare eventuali vulnerabilità di sicurezza che ci scoprono. -Se trovi una vulnerabilità nel progetto RustDesk, segnalala responsabilmente inviando un'email a info@rustdesk.com. - -Al momento non abbiamo un programma di taglia sui bug. -Siamo una piccola squadra che cerca di risolvere un grosso problema. -Ti esortiamo a segnalare responsabilmente tutte le vulnerabilità in modo da poter continuare a sviluppare un'applicazione sicura per l'intera comunità. diff --git a/shelled/rustdesk-as-ref/docs/SECURITY-JP.md b/shelled/rustdesk-as-ref/docs/SECURITY-JP.md deleted file mode 100644 index bddf6d9..0000000 --- a/shelled/rustdesk-as-ref/docs/SECURITY-JP.md +++ /dev/null @@ -1,9 +0,0 @@ -# セキュリティポリシー - -## 脆弱性の報告 - -私たちはプロジェクトのセキュリティを非常に重視しています。私たちは、すべてのユーザーが脆弱性を発見した場合、私たちに報告することを奨励しています。 -RustDesk プロジェクトにセキュリティの脆弱性を発見した場合は、info@rustdesk.com までメールで責任を持って報告してください。 - -現時点では、バグ報奨金制度はありません。私たちは大きな問題を解決しようとしている小さなチームです。コミュニティ全体のために安全なアプリケーションを作り続けることができるよう、 -責任を持って脆弱性を報告してください。 diff --git a/shelled/rustdesk-as-ref/docs/SECURITY-KR.md b/shelled/rustdesk-as-ref/docs/SECURITY-KR.md deleted file mode 100644 index 94ce8f2..0000000 --- a/shelled/rustdesk-as-ref/docs/SECURITY-KR.md +++ /dev/null @@ -1,7 +0,0 @@ -# 보안 정책 - -## 취약점 보고 - -저희는 프로젝트의 보안을 매우 중요하게 생각합니다. 모든 사용자가 발견한 취약점을 저희에게 보고할 것을 권장합니다. RustDesk 프로젝트에서 보안 취약점이 발견되면 info@rustdesk.com으로 이메일을 보내 책임감 있게 보고해 주시기 바랍니다. - -현재로서는 버그 현상금 프로그램이 없습니다. 저희는 큰 문제를 해결하기 위해 노력하는 소규모 팀입니다. 전체 커뮤니티를 위한 안전한 응용 프로그램을 계속 구축할 수 있도록 취약점을 책임감 있게 신고해 주시기 바랍니다. diff --git a/shelled/rustdesk-as-ref/docs/SECURITY-NL.md b/shelled/rustdesk-as-ref/docs/SECURITY-NL.md deleted file mode 100644 index 463b322..0000000 --- a/shelled/rustdesk-as-ref/docs/SECURITY-NL.md +++ /dev/null @@ -1,11 +0,0 @@ -# Veiligheidsbeleid - -## Een Kwetsbaarheid Melden - -Wij hechten veel waarde aan de veiligheid van het project. We moedigen alle gebruikers aan om kwetsbaarheden die ze ontdekken -aan ons te melden. Als u een beveiligingslek in het RustDesk project vindt, meld dit dan op verantwoorde wijze door -een e-mail te sturen naar info@rustdesk.com. - -Op dit moment hebben we geen bug premie programma. We zijn een klein team dat een groot probleem probeert op te lossen. -We verzoeken u dringend om alle kwetsbaarheden op verantwoorde wijze te melden, zodat we verder kunnen bouwen aan -een veilige applicatie voor de hele gemeenschap. diff --git a/shelled/rustdesk-as-ref/docs/SECURITY-NO.md b/shelled/rustdesk-as-ref/docs/SECURITY-NO.md deleted file mode 100644 index 1f8dcb4..0000000 --- a/shelled/rustdesk-as-ref/docs/SECURITY-NO.md +++ /dev/null @@ -1,9 +0,0 @@ -# Sikkerhets Rettningslinjer - -## Reportering av en Sårbarhet - -Vi verdsetter pris på sikkerhet for prosjektet høyt. Og oppmunterer alle brukere til å rapportere sårbarheter de oppdager til oss. -Om du finner en sikkerhets sårbarhet i RustDesk prosjektet, venligst raportere det ansvarsfult ved å sende oss en email til info@rustdesk.com. - -På dette tidspunktet har vi ingen bug dusør program. Vi er ett lite team som prøver å løse ett stort problem. Vi trenger att du raporterer alle sårbarhetene -annsvarfult så vi kan fortsettte å bygge ett en sikker applikasjon for hele felleskapet. diff --git a/shelled/rustdesk-as-ref/docs/SECURITY-PL.md b/shelled/rustdesk-as-ref/docs/SECURITY-PL.md deleted file mode 100644 index 0d4975b..0000000 --- a/shelled/rustdesk-as-ref/docs/SECURITY-PL.md +++ /dev/null @@ -1,9 +0,0 @@ -# Polityka bezpieczeństwa - -## Zgłaszanie podatności - -Bardzo cenimy sobie bezpieczeństwo projektu. Zachęcamy wszystkich użytkowników do zgłaszania nam wszelkich wykrytych luk. -Jeżeli znajdziesz lukę w projekcie RustDesk, proszę zgłosić ją jak najszybciej wysyłając e-mail na adres info@rustdesk.com. - -W tym momencie, nie mamy uruchomionego programu nagradzania za wykryte błędy. Jesteśmy małym zespołem próbującym rozwiązywać duże problemy. -Prosimy o odpowidzialne zgłaszanie wszelkich podatności w zabezpieczeniach, abyśmy mogli kontynuować tworzenie bezpiecznej aplikacji dla całej społeczności. diff --git a/shelled/rustdesk-as-ref/docs/SECURITY-RO.md b/shelled/rustdesk-as-ref/docs/SECURITY-RO.md deleted file mode 100644 index 029e01d..0000000 --- a/shelled/rustdesk-as-ref/docs/SECURITY-RO.md +++ /dev/null @@ -1,9 +0,0 @@ -# Politica de Securitate - -## Raportarea unei Vulnerabilități - -Acordăm o mare importanță securității proiectului. Încurajăm toți utilizatorii să ne raporteze orice vulnerabilități pe care le descoperă. -Dacă găsești o vulnerabilitate de securitate în proiectul RustDesk, te rugăm să o raportezi responsabil trimițând un e-mail la info@rustdesk.com. - -În acest moment, nu avem un program de recompense pentru descoperirea de bug-uri. Suntem o echipă mică care încearcă să rezolve o problemă mare. -Te rugăm să raportezi orice vulnerabilitate în mod responsabil, astfel încât să putem continua să construim o aplicație sigură pentru întreaga comunitate. diff --git a/shelled/rustdesk-as-ref/docs/SECURITY-TR.md b/shelled/rustdesk-as-ref/docs/SECURITY-TR.md deleted file mode 100644 index 88037ac..0000000 --- a/shelled/rustdesk-as-ref/docs/SECURITY-TR.md +++ /dev/null @@ -1,9 +0,0 @@ -# Güvenlik Politikası - -## Bir Güvenlik Açığı Bildirme - -Projemiz için güvenliği çok önemsiyoruz. Kullanıcıların keşfettikleri herhangi bir güvenlik açığını bize bildirmelerini teşvik ediyoruz. -Eğer RustDesk projesinde bir güvenlik açığı bulursanız, lütfen info@rustdesk.com adresine sorumlu bir şekilde bildirin. - -Şu an için bir hata ödül programımız bulunmamaktadır. Büyük bir sorunu çözmeye çalışan küçük bir ekibiz. Herhangi bir güvenlik açığını sorumlu bir şekilde bildirmenizi rica ederiz, -böylece tüm topluluk için güvenli bir uygulama oluşturmaya devam edebiliriz. diff --git a/shelled/rustdesk-as-ref/docs/SECURITY.md b/shelled/rustdesk-as-ref/docs/SECURITY.md deleted file mode 100644 index c595885..0000000 --- a/shelled/rustdesk-as-ref/docs/SECURITY.md +++ /dev/null @@ -1,9 +0,0 @@ -# Security Policy - -## Reporting a Vulnerability - -We value security for the project very highly. We encourage all users to report any vulnerabilities they discover to us. -If you find a security vulnerability in the RustDesk project, please report it responsibly by sending an email to info@rustdesk.com. - -At this juncture, we don't have a bug bounty program. We are a small team trying to solve a big problem. We urge you to report any vulnerabilities responsibly -so that we can continue building a secure application for the entire community. diff --git a/shelled/rustdesk-as-ref/entrypoint.sh b/shelled/rustdesk-as-ref/entrypoint.sh deleted file mode 100644 index 8c7be07..0000000 --- a/shelled/rustdesk-as-ref/entrypoint.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh - -cd "$HOME"/rustdesk || exit 1 -# shellcheck source=/dev/null -. "$HOME"/.cargo/env - -argv=$* - -while test $# -gt 0; do - case "$1" in - --release) - mkdir -p target/release - test -f target/release/libsciter-gtk.so || cp "$HOME"/libsciter-gtk.so target/release/ - release=1 - shift - ;; - --target) - shift - if test $# -gt 0; then - rustup target add "$1" - shift - fi - ;; - *) - shift - ;; - esac -done - -if [ -z $release ]; then - mkdir -p target/debug - test -f target/debug/libsciter-gtk.so || cp "$HOME"/libsciter-gtk.so target/debug/ -fi -set -f -#shellcheck disable=2086 -VCPKG_ROOT=/vcpkg cargo build $argv diff --git a/shelled/rustdesk-as-ref/examples/ipc.rs b/shelled/rustdesk-as-ref/examples/ipc.rs deleted file mode 100644 index bca2321..0000000 --- a/shelled/rustdesk-as-ref/examples/ipc.rs +++ /dev/null @@ -1,90 +0,0 @@ -use docopt::Docopt; -use hbb_common::{ - env_logger::{init_from_env, Env, DEFAULT_FILTER_ENV}, - log, tokio, -}; -use librustdesk::{ipc::Data, *}; - -const USAGE: &'static str = " -IPC test program. - -Usage: - ipc (-s | --server | -c | --client) [-p | --postfix=] - ipc (-h | --help) - -Options: - -h --help Show this screen. - -s --server Run as IPC server. - -c --client Run as IPC client. - -p --postfix= IPC path postfix [default: ]. -"; - -#[derive(Debug, serde::Deserialize)] -struct Args { - flag_server: bool, - flag_client: bool, - flag_postfix: String, -} - -#[tokio::main] -async fn main() { - init_from_env(Env::default().filter_or(DEFAULT_FILTER_ENV, "info")); - - let args: Args = Docopt::new(USAGE) - .and_then(|d| d.deserialize()) - .unwrap_or_else(|e| e.exit()); - - if args.flag_server { - if args.flag_postfix.is_empty() { - log::info!("Starting IPC server..."); - } else { - log::info!( - "Starting IPC server with postfix: '{}'...", - args.flag_postfix - ); - } - ipc_server(&args.flag_postfix).await; - } else if args.flag_client { - if args.flag_postfix.is_empty() { - log::info!("Starting IPC client..."); - } else { - log::info!( - "Starting IPC client with postfix: '{}'...", - args.flag_postfix - ); - } - ipc_client(&args.flag_postfix).await; - } -} - -async fn ipc_server(postfix: &str) { - let postfix = postfix.to_string(); - let postfix2 = postfix.clone(); - std::thread::spawn(move || { - if let Err(err) = crate::ipc::start(&postfix) { - log::error!("Failed to start ipc: {}", err); - std::process::exit(-1); - } - }); - tokio::time::sleep(std::time::Duration::from_secs(1)).await; - ipc_client(&postfix2).await; -} - -async fn ipc_client(postfix: &str) { - loop { - match crate::ipc::connect(1000, postfix).await { - Ok(mut conn) => match conn.send(&Data::Empty).await { - Ok(_) => { - log::info!("send message to ipc server success"); - } - Err(e) => { - log::error!("Failed to send message to ipc server: {}", e); - } - }, - Err(e) => { - log::error!("Failed to connect to ipc server: {}", e); - } - } - tokio::time::sleep(std::time::Duration::from_secs(6)).await; - } -} diff --git a/shelled/rustdesk-as-ref/fastlane/metadata/android/en-US/full_description.txt b/shelled/rustdesk-as-ref/fastlane/metadata/android/en-US/full_description.txt deleted file mode 100644 index f78b3a2..0000000 --- a/shelled/rustdesk-as-ref/fastlane/metadata/android/en-US/full_description.txt +++ /dev/null @@ -1,11 +0,0 @@ -An open-source remote desktop application, the open source TeamViewer alternative. -Source code: https://github.com/rustdesk/rustdesk -Doc: https://rustdesk.com/docs/en/manual/mobile/ - -In order for a remote device to control your Android device via mouse or touch, you need to allow RustDesk to use the "Accessibility" service, RustDesk uses AccessibilityService API to implement Android remote control. - -In addition to remote control, you can also transfer files between Android devices and PCs easily with RustDesk. - -You have full control of your data, with no concerns about security. You can use our rendezvous/relay server, or self-hosting, or write your own rendezvous/relay server. Self-hosting server is free and open source: https://github.com/rustdesk/rustdesk-server - -Please download and install desktop version from: https://rustdesk.com, then you can access and control your desktop from your mobile, or control your mobile from desktop. diff --git a/shelled/rustdesk-as-ref/fastlane/metadata/android/en-US/short_description.txt b/shelled/rustdesk-as-ref/fastlane/metadata/android/en-US/short_description.txt deleted file mode 100644 index 91e796a..0000000 --- a/shelled/rustdesk-as-ref/fastlane/metadata/android/en-US/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -An open-source remote desktop application, the TeamViewer alternative diff --git a/shelled/rustdesk-as-ref/fastlane/metadata/android/fr-FR/full_description.txt b/shelled/rustdesk-as-ref/fastlane/metadata/android/fr-FR/full_description.txt deleted file mode 100644 index effb820..0000000 --- a/shelled/rustdesk-as-ref/fastlane/metadata/android/fr-FR/full_description.txt +++ /dev/null @@ -1,11 +0,0 @@ -Une application de bureau à distance open source, l'alternative open source à TeamViewer. -Code source : https://github.com/rustdesk/rustdesk -Doc : https://rustdesk.com/docs/en/manual/mobile/ - -Pour qu'un appareil distant puisse contrôler votre appareil Android via la souris ou le toucher, vous devez autoriser RustDesk à utiliser le service "Accessibilité", RustDesk utilise l'API AccessibilityService pour implémenter la télécommande Addroid. - -En plus du contrôle à distance, vous pouvez également transférer facilement des fichiers entre des appareils Android et des PC avec RustDesk. - -Vous avez le contrôle total de vos données, sans aucun souci de sécurité. Vous pouvez utiliser notre serveur de rendez-vous/relais, ou l'auto-hébergement, ou écrire votre propre serveur de rendez-vous/relais. Le serveur auto-hébergé est gratuit et open source : https://github.com/rustdesk/rustdesk-server - -Veuillez télécharger et installer la version de bureau à partir de : https://rustdesk.com, vous pourrez alors accéder et contrôler votre bureau à partir de votre mobile, ou contrôler votre mobile à partir du bureau. diff --git a/shelled/rustdesk-as-ref/fastlane/metadata/android/fr-FR/short_description.txt b/shelled/rustdesk-as-ref/fastlane/metadata/android/fr-FR/short_description.txt deleted file mode 100644 index e1f4b4b..0000000 --- a/shelled/rustdesk-as-ref/fastlane/metadata/android/fr-FR/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -Une application de bureau à distance open source, l'alternative open source à TeamViewer. diff --git a/shelled/rustdesk-as-ref/fastlane/metadata/android/nl-NL/full_description.txt b/shelled/rustdesk-as-ref/fastlane/metadata/android/nl-NL/full_description.txt deleted file mode 100644 index b60d52c..0000000 --- a/shelled/rustdesk-as-ref/fastlane/metadata/android/nl-NL/full_description.txt +++ /dev/null @@ -1,11 +0,0 @@ -Een open-source toepassing voor bureaublad op afstand, het open-source alternatief voor TeamViewer. -Bron code: https://github.com/rustdesk/rustdesk -Doc: https://rustdesk.com/docs/en/manual/mobile/ - -Om ervoor te zorgen dat een extern apparaat uw Android-apparaat via muis of aanraking kan besturen, moet u RustDesk toestaan de "Toegankelijkheid" service te gebruiken. RustDesk gebruikt AccessibilityService API om Android afstandsbediening te kunnen implementeren. - -Naast bediening op afstand kunt u met RustDesk ook eenvoudig bestanden overzetten tussen Android-apparaten en pc's. - -U hebt volledige controle over uw gegevens, en u hoeft zich geen zorgen te maken over de veiligheid. U kunt onze rendez-vous/relay server gebruiken, of zelf hosten, of uw eigen rendez-vous/relay server schrijven. Self-hosting server is gratis en open source: https://github.com/rustdesk/rustdesk-server - -Download en installeer de desktop versie vanaf: https://rustdesk.com, dan kunt u uw desktop benaderen en bedienen vanaf uw mobiel, of uw mobiel bedienen vanaf uw desktop. diff --git a/shelled/rustdesk-as-ref/fastlane/metadata/android/nl-NL/short_description.txt b/shelled/rustdesk-as-ref/fastlane/metadata/android/nl-NL/short_description.txt deleted file mode 100644 index 18a4600..0000000 --- a/shelled/rustdesk-as-ref/fastlane/metadata/android/nl-NL/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -Een open-source toepassing voor bureaublad op afstand, het open-source alternatief voor TeamViewer. diff --git a/shelled/rustdesk-as-ref/fastlane/metadata/android/zh-CN/full_description.txt b/shelled/rustdesk-as-ref/fastlane/metadata/android/zh-CN/full_description.txt deleted file mode 100644 index f1f4405..0000000 --- a/shelled/rustdesk-as-ref/fastlane/metadata/android/zh-CN/full_description.txt +++ /dev/null @@ -1,12 +0,0 @@ -开源远程桌面应用,开源 TeamViewer 替代方案。 -源代码:https://github.com/rustdesk/rustdesk -文档:https://rustdesk.com/docs/en/manual/mobile/ - -为了让远程设备通过鼠标或触摸控制您的 Android 设备,您需要允许 RustDesk 使用“Accessibility”服务,RustDesk 使用 AccessibilityService API 来实现 Addroid 远程控制。 - -除了远程控制,您还可以使用 RustDesk 在 Android 设备和 PC 之间轻松传输文件。 - -您完全掌控数据,不用担心安全问题。您可以使用我们的注册/中继服务器,或者自建,亦或者开发您的版本。 -自托管服务器是免费和开源的:https://github.com/rustdesk/rustdesk-server - -请从:https://rustdesk.com 下载并安装桌面版,然后您可以通过手机访问和控制您的桌面,或从桌面控制您的手机。 diff --git a/shelled/rustdesk-as-ref/fastlane/metadata/android/zh-CN/short_description.txt b/shelled/rustdesk-as-ref/fastlane/metadata/android/zh-CN/short_description.txt deleted file mode 100644 index 69a4a5b..0000000 --- a/shelled/rustdesk-as-ref/fastlane/metadata/android/zh-CN/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -开源远程桌面应用,开源 TeamViewer 替代方案 diff --git a/shelled/rustdesk-as-ref/flatpak/com.rustdesk.RustDesk.metainfo.xml b/shelled/rustdesk-as-ref/flatpak/com.rustdesk.RustDesk.metainfo.xml deleted file mode 100644 index 0d3b33b..0000000 --- a/shelled/rustdesk-as-ref/flatpak/com.rustdesk.RustDesk.metainfo.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - com.rustdesk.RustDesk - - RustDesk - - com.rustdesk.RustDesk.desktop - CC0-1.0 - AGPL-3.0-only - RustDesk - Secure remote desktop access - -

- RustDesk is a full-featured open source remote control alternative for self-hosting and security with minimal configuration. -

-
    -
  • Works on Windows, macOS, Linux, iOS, Android, Web.
  • -
  • Supports VP8 / VP9 / AV1 software codecs, and H264 / H265 hardware codecs.
  • -
  • Own your data, easily set up self-hosting solution on your infrastructure.
  • -
  • P2P connection with end-to-end encryption based on NaCl.
  • -
  • No administrative privileges or installation needed for Windows, elevate priviledge locally or from remote on demand.
  • -
  • We like to keep things simple and will strive to make simpler where possible.
  • -
-

- For self-hosting setup instructions please go to our home page. -

-
- - Utility - - - - Remote desktop session - https://user-images.githubusercontent.com/71636191/171661982-430285f0-2e12-4b1d-9957-4a58e375304d.png - - - - #d9eaf8 - #0160ee - - https://rustdesk.com - https://github.com/rustdesk/rustdesk/issues - https://github.com/rustdesk/rustdesk/wiki/FAQ - https://rustdesk.com/docs - https://ko-fi.com/rustdesk - https://github.com/rustdesk/rustdesk - https://github.com/rustdesk/rustdesk/tree/master/src/lang - https://github.com/rustdesk/rustdesk/blob/master/docs/CONTRIBUTING.md - https://rustdesk.com/docs/en/technical-support - - 600 - always - - - keyboard - pointing - - -
\ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flatpak/rustdesk.json b/shelled/rustdesk-as-ref/flatpak/rustdesk.json deleted file mode 100644 index 2418ac2..0000000 --- a/shelled/rustdesk-as-ref/flatpak/rustdesk.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "id": "com.rustdesk.RustDesk", - "runtime": "org.freedesktop.Platform", - "runtime-version": "24.08", - "sdk": "org.freedesktop.Sdk", - "command": "rustdesk", - "cleanup": ["/include", "/lib/pkgconfig", "/share/gtk-doc"], - "rename-desktop-file": "rustdesk.desktop", - "rename-icon": "rustdesk", - "modules": [ - "shared-modules/libappindicator/libappindicator-gtk3-12.10.json", - { - "name": "xdotool", - "no-autogen": true, - "make-install-args": ["PREFIX=${FLATPAK_DEST}"], - "sources": [ - { - "type": "archive", - "url": "https://github.com/jordansissel/xdotool/releases/download/v3.20211022.1/xdotool-3.20211022.1.tar.gz", - "sha256": "96f0facfde6d78eacad35b91b0f46fecd0b35e474c03e00e30da3fdd345f9ada" - } - ] - }, - { - "name": "pam", - "buildsystem": "autotools", - "config-opts": ["--disable-selinux"], - "sources": [ - { - "type": "archive", - "url": "https://github.com/linux-pam/linux-pam/releases/download/v1.3.1/Linux-PAM-1.3.1.tar.xz", - "sha256": "eff47a4ecd833fbf18de9686632a70ee8d0794b79aecb217ebd0ce11db4cd0db" - } - ] - }, - { - "name": "rustdesk", - "buildsystem": "simple", - "build-commands": [ - "bsdtar -Oxf rustdesk.deb data.tar.xz | bsdtar -xf -", - "cp -r usr/* /app/", - "mkdir -p /app/bin && ln -s /app/share/rustdesk/rustdesk /app/bin/rustdesk" - ], - "sources": [ - { - "type": "file", - "path": "rustdesk.deb" - }, - { - "type": "file", - "path": "com.rustdesk.RustDesk.metainfo.xml" - } - ] - } - ], - "finish-args": [ - "--share=ipc", - "--socket=wayland", - "--socket=x11", - "--share=network", - "--filesystem=home", - "--device=dri", - "--socket=pulseaudio", - "--talk-name=org.freedesktop.Flatpak" - ] -} \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flutter/.gitattributes b/shelled/rustdesk-as-ref/flutter/.gitattributes deleted file mode 100644 index 176a458..0000000 --- a/shelled/rustdesk-as-ref/flutter/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto diff --git a/shelled/rustdesk-as-ref/flutter/.gitignore b/shelled/rustdesk-as-ref/flutter/.gitignore deleted file mode 100644 index ee7e42c..0000000 --- a/shelled/rustdesk-as-ref/flutter/.gitignore +++ /dev/null @@ -1,56 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -**/ios/Flutter/.last_build_id -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -/build/ - -# Web related - -# Symbolication related -app.*.symbols -# Obfuscation related -app.*.map.json -jniLibs -.vscode - -# flutter rust bridge -lib/generated_bridge.dart -lib/generated_bridge.freezed.dart - -# Flutter Generated Files -**/GeneratedPluginRegistrant.swift -**/flutter/generated_plugin_registrant.cc -**/flutter/generated_plugin_registrant.h -**/flutter/generated_plugins.cmake -**/Runner/bridge_generated.h -flutter_export_environment.sh -Flutter-Generated.xcconfig -key.jks -macos/rustdesk.xcodeproj/project.xcworkspace/ diff --git a/shelled/rustdesk-as-ref/flutter/.metadata b/shelled/rustdesk-as-ref/flutter/.metadata deleted file mode 100644 index 8b4892c..0000000 --- a/shelled/rustdesk-as-ref/flutter/.metadata +++ /dev/null @@ -1,36 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled. - -version: - revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - channel: stable - -project_type: app - -# Tracks metadata for the flutter migrate command -migration: - platforms: - - platform: root - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: linux - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: macos - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: windows - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - # User provided section - - # List of Local paths (relative to this file) that should be - # ignored by the migrate tool. - # - # Files that are not part of the templates will be ignored by default. - unmanaged_files: - - 'lib/main.dart' - - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/shelled/rustdesk-as-ref/flutter/README.md b/shelled/rustdesk-as-ref/flutter/README.md deleted file mode 100644 index 519b85e..0000000 --- a/shelled/rustdesk-as-ref/flutter/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# flutter_hbb - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples and guidance on mobile development, and a full API reference. diff --git a/shelled/rustdesk-as-ref/flutter/analysis_options.yaml b/shelled/rustdesk-as-ref/flutter/analysis_options.yaml deleted file mode 100644 index a679f57..0000000 --- a/shelled/rustdesk-as-ref/flutter/analysis_options.yaml +++ /dev/null @@ -1,6 +0,0 @@ -include: package:lints/recommended.yaml - -linter: - rules: - non_constant_identifier_names: false - sort_child_properties_last: false diff --git a/shelled/rustdesk-as-ref/flutter/android/.gitignore b/shelled/rustdesk-as-ref/flutter/android/.gitignore deleted file mode 100644 index 0a741cb..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java - -# Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties diff --git a/shelled/rustdesk-as-ref/flutter/android/app/build.gradle b/shelled/rustdesk-as-ref/flutter/android/app/build.gradle deleted file mode 100644 index 830cbc2..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/build.gradle +++ /dev/null @@ -1,137 +0,0 @@ -import com.google.protobuf.gradle.* -import groovy.json.JsonSlurper - -plugins { - id "com.google.protobuf" version "0.9.4" - id "com.android.application" - id "kotlin-android" - id "dev.flutter.flutter-gradle-plugin" -} - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} - -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -// Add rustls-platform-verifier Android support -String findRustlsPlatformVerifierMavenDir() { - def dependencyText = providers.exec { - it.workingDir = new File("../..") - commandLine("cargo", "metadata", "--format-version", "1") - }.standardOutput.asText.get() - - def dependencyJson = new JsonSlurper().parseText(dependencyText) - def pkg = dependencyJson.packages.find { it.name == "rustls-platform-verifier-android" } - - if (pkg == null) { - throw new GradleException("rustls-platform-verifier-android package not found in cargo metadata!") - } - - def manifestPath = file(pkg.manifest_path) - def mavenDir = new File(manifestPath.parentFile, "maven") - - if (!mavenDir.exists()) { - throw new GradleException("Maven directory not found at: ${mavenDir.path}") - } - - println("✓ Found rustls-platform-verifier maven repo at: ${mavenDir.path}") - return mavenDir.path -} - - -repositories { - maven { - url = findRustlsPlatformVerifierMavenDir() - metadataSources.artifact() - } -} - -protobuf { - protoc { - artifact = 'com.google.protobuf:protoc:3.20.1' - } - - generateProtoTasks { - all().configureEach { task -> - task.builtins { - java { - option "lite" - } - } - } - } -} - -android { - compileSdkVersion 34 - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - - main.proto.srcDirs += '../../../libs/hbb_common/protos' - main.proto.includes += "message.proto" - } - - compileOptions { - targetCompatibility JavaVersion.VERSION_1_8 - sourceCompatibility JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.carriez.flutter_hbb" - minSdkVersion 22 - targetSdkVersion 33 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - } - - signingConfigs { - release { - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null - storePassword keystoreProperties['storePassword'] - } - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.release - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules' - } - } -} - -flutter { - source '../..' -} - -dependencies { - implementation 'com.google.protobuf:protobuf-javalite:3.20.1' - implementation "androidx.media:media:1.6.0" - implementation 'com.github.getActivity:XXPermissions:18.5' - implementation("org.jetbrains.kotlin:kotlin-stdlib") { version { strictly("1.9.10") } } - implementation 'com.caverock:androidsvg-aar:1.4' - implementation "rustls:rustls-platform-verifier:0.1.1" -} diff --git a/shelled/rustdesk-as-ref/flutter/android/app/proguard-rules b/shelled/rustdesk-as-ref/flutter/android/app/proguard-rules deleted file mode 100644 index 5174025..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/proguard-rules +++ /dev/null @@ -1,7 +0,0 @@ -# Keep class members from protobuf generated code. --keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite { - ; -} - -# Keep rustls-platform-verifier classes for JNI --keep, includedescriptorclasses class org.rustls.platformverifier.** { *; } \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/debug/AndroidManifest.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 64d68a5..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/AndroidManifest.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index f4788af..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/AudioRecordHandle.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/AudioRecordHandle.kt deleted file mode 100644 index db222dc..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/AudioRecordHandle.kt +++ /dev/null @@ -1,193 +0,0 @@ -package com.carriez.flutter_hbb - -import ffi.FFI - -import android.Manifest -import android.content.Context -import android.media.* -import android.content.pm.PackageManager -import android.media.projection.MediaProjection -import androidx.annotation.RequiresApi -import androidx.core.app.ActivityCompat -import android.os.Build -import android.util.Log -import kotlin.concurrent.thread - -const val AUDIO_ENCODING = AudioFormat.ENCODING_PCM_FLOAT // ENCODING_OPUS need API 30 -const val AUDIO_SAMPLE_RATE = 48000 -const val AUDIO_CHANNEL_MASK = AudioFormat.CHANNEL_IN_STEREO - -class AudioRecordHandle(private var context: Context, private var isVideoStart: ()->Boolean, private var isAudioStart: ()->Boolean) { - private val logTag = "LOG_AUDIO_RECORD_HANDLE" - - private var audioRecorder: AudioRecord? = null - private var audioReader: AudioReader? = null - private var minBufferSize = 0 - private var audioRecordStat = false - private var audioThread: Thread? = null - - @RequiresApi(Build.VERSION_CODES.M) - fun createAudioRecorder(inVoiceCall: Boolean, mediaProjection: MediaProjection?): Boolean { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - return false - } - if (ActivityCompat.checkSelfPermission( - context, - Manifest.permission.RECORD_AUDIO - ) != PackageManager.PERMISSION_GRANTED - ) { - Log.d(logTag, "createAudioRecorder failed, no RECORD_AUDIO permission") - return false - } - - var builder = AudioRecord.Builder() - .setAudioFormat( - AudioFormat.Builder() - .setEncoding(AUDIO_ENCODING) - .setSampleRate(AUDIO_SAMPLE_RATE) - .setChannelMask(AUDIO_CHANNEL_MASK).build() - ); - if (inVoiceCall) { - builder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION) - } else { - mediaProjection?.let { - var apcc = AudioPlaybackCaptureConfiguration.Builder(it) - .addMatchingUsage(AudioAttributes.USAGE_MEDIA) - .addMatchingUsage(AudioAttributes.USAGE_ALARM) - .addMatchingUsage(AudioAttributes.USAGE_GAME) - .addMatchingUsage(AudioAttributes.USAGE_UNKNOWN).build(); - builder.setAudioPlaybackCaptureConfig(apcc); - } ?: let { - Log.d(logTag, "createAudioRecorder failed, mediaProjection null") - return false - } - } - audioRecorder = builder.build() - Log.d(logTag, "createAudioRecorder done,minBufferSize:$minBufferSize") - return true - } - - @RequiresApi(Build.VERSION_CODES.M) - private fun checkAudioReader() { - if (audioReader != null && minBufferSize != 0) { - return - } - // read f32 to byte , length * 4 - minBufferSize = 2 * 4 * AudioRecord.getMinBufferSize( - AUDIO_SAMPLE_RATE, - AUDIO_CHANNEL_MASK, - AUDIO_ENCODING - ) - if (minBufferSize == 0) { - Log.d(logTag, "get min buffer size fail!") - return - } - audioReader = AudioReader(minBufferSize, 4) - Log.d(logTag, "init audioData len:$minBufferSize") - } - - @RequiresApi(Build.VERSION_CODES.M) - fun startAudioRecorder() { - checkAudioReader() - if (audioReader != null && audioRecorder != null && minBufferSize != 0) { - try { - FFI.setFrameRawEnable("audio", true) - audioRecorder!!.startRecording() - audioRecordStat = true - audioThread = thread { - while (audioRecordStat) { - audioReader!!.readSync(audioRecorder!!)?.let { - FFI.onAudioFrameUpdate(it) - } - } - // let's release here rather than onDestroy to avoid threading issue - audioRecorder?.release() - audioRecorder = null - minBufferSize = 0 - FFI.setFrameRawEnable("audio", false) - Log.d(logTag, "Exit audio thread") - } - } catch (e: Exception) { - Log.d(logTag, "startAudioRecorder fail:$e") - } - } else { - Log.d(logTag, "startAudioRecorder fail") - } - } - - fun onVoiceCallStarted(mediaProjection: MediaProjection?): Boolean { - if (!isSupportVoiceCall()) { - return false - } - // No need to check if video or audio is started here. - if (!switchToVoiceCall(mediaProjection)) { - return false - } - return true - } - - fun onVoiceCallClosed(mediaProjection: MediaProjection?): Boolean { - // Return true if not supported, because is was not started. - if (!isSupportVoiceCall()) { - return true - } - if (isVideoStart()) { - switchOutVoiceCall(mediaProjection) - } - tryReleaseAudio() - return true - } - - @RequiresApi(Build.VERSION_CODES.M) - fun switchToVoiceCall(mediaProjection: MediaProjection?): Boolean { - audioRecorder?.let { - if (it.getAudioSource() == MediaRecorder.AudioSource.VOICE_COMMUNICATION) { - return true - } - } - audioRecordStat = false - audioThread?.join() - audioThread = null - - if (!createAudioRecorder(true, mediaProjection)) { - Log.e(logTag, "createAudioRecorder fail") - return false - } - startAudioRecorder() - return true - } - - @RequiresApi(Build.VERSION_CODES.M) - fun switchOutVoiceCall(mediaProjection: MediaProjection?): Boolean { - audioRecorder?.let { - if (it.getAudioSource() != MediaRecorder.AudioSource.VOICE_COMMUNICATION) { - return true - } - } - audioRecordStat = false - audioThread?.join() - - if (!createAudioRecorder(false, mediaProjection)) { - Log.e(logTag, "createAudioRecorder fail") - return false - } - startAudioRecorder() - return true - } - - fun tryReleaseAudio() { - if (isAudioStart() || isVideoStart()) { - return - } - audioRecordStat = false - audioThread?.join() - audioThread = null - } - - fun destroy() { - Log.d(logTag, "destroy audio record handle") - - audioRecordStat = false - audioThread?.join() - } -} diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/BootReceiver.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/BootReceiver.kt deleted file mode 100644 index 71bbba7..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/BootReceiver.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.carriez.flutter_hbb - -import android.Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -import android.Manifest.permission.SYSTEM_ALERT_WINDOW -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.os.Build -import android.util.Log -import android.widget.Toast -import com.hjq.permissions.XXPermissions -import io.flutter.embedding.android.FlutterActivity - -const val DEBUG_BOOT_COMPLETED = "com.carriez.flutter_hbb.DEBUG_BOOT_COMPLETED" - -class BootReceiver : BroadcastReceiver() { - private val logTag = "tagBootReceiver" - - override fun onReceive(context: Context, intent: Intent) { - Log.d(logTag, "onReceive ${intent.action}") - - if (Intent.ACTION_BOOT_COMPLETED == intent.action || DEBUG_BOOT_COMPLETED == intent.action) { - // check SharedPreferences config - val prefs = context.getSharedPreferences(KEY_SHARED_PREFERENCES, FlutterActivity.MODE_PRIVATE) - if (!prefs.getBoolean(KEY_START_ON_BOOT_OPT, false)) { - Log.d(logTag, "KEY_START_ON_BOOT_OPT is false") - return - } - // check pre-permission - if (!XXPermissions.isGranted(context, REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, SYSTEM_ALERT_WINDOW)){ - Log.d(logTag, "REQUEST_IGNORE_BATTERY_OPTIMIZATIONS or SYSTEM_ALERT_WINDOW is not granted") - return - } - - val it = Intent(context, MainService::class.java).apply { - action = ACT_INIT_MEDIA_PROJECTION_AND_SERVICE - putExtra(EXT_INIT_FROM_BOOT, true) - } - Toast.makeText(context, "RustDesk is Open", Toast.LENGTH_LONG).show() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context.startForegroundService(it) - } else { - context.startService(it) - } - } - } -} diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/FloatingWindowService.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/FloatingWindowService.kt deleted file mode 100644 index 6dd4a2f..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/FloatingWindowService.kt +++ /dev/null @@ -1,394 +0,0 @@ -package com.carriez.flutter_hbb - -import android.annotation.SuppressLint -import android.app.PendingIntent -import android.app.Service -import android.content.Intent -import android.content.res.Configuration -import android.graphics.Bitmap -import android.graphics.Canvas -import android.graphics.PixelFormat -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.Drawable -import android.os.Build -import android.os.Handler -import android.os.IBinder -import android.os.Looper -import android.util.Log -import android.view.Gravity -import android.view.MotionEvent -import android.view.View -import android.view.WindowManager -import android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN -import android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE -import android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL -import android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON -import android.widget.ImageView -import android.widget.PopupMenu -import com.caverock.androidsvg.SVG -import ffi.FFI -import kotlin.math.abs - -class FloatingWindowService : Service(), View.OnTouchListener { - - private lateinit var windowManager: WindowManager - private lateinit var layoutParams: WindowManager.LayoutParams - private lateinit var floatingView: ImageView - private lateinit var originalDrawable: Drawable - private lateinit var leftHalfDrawable: Drawable - private lateinit var rightHalfDrawable: Drawable - - private var dragging = false - private var lastDownX = 0f - private var lastDownY = 0f - private var viewCreated = false; - private var keepScreenOn = KeepScreenOn.DURING_CONTROLLED - - companion object { - private val logTag = "floatingService" - private var firstCreate = true - private var viewWidth = 120 - private var viewHeight = 120 - private const val MIN_VIEW_SIZE = 32 // size 0 does not help prevent the service from being killed - private const val MAX_VIEW_SIZE = 320 - private var viewUntouchable = false - private var viewTransparency = 1f // 0 means invisible but can help prevent the service from being killed - private var customSvg = "" - private var lastLayoutX = 0 - private var lastLayoutY = 0 - private var lastOrientation = Configuration.ORIENTATION_UNDEFINED - } - - override fun onBind(intent: Intent): IBinder? { - return null - } - - override fun onCreate() { - super.onCreate() - windowManager = getSystemService(WINDOW_SERVICE) as WindowManager - try { - if (firstCreate) { - firstCreate = false - onFirstCreate(windowManager) - } - Log.d(logTag, "floating window size: $viewWidth x $viewHeight, transparency: $viewTransparency, lastLayoutX: $lastLayoutX, lastLayoutY: $lastLayoutY, customSvg: $customSvg") - createView(windowManager) - handler.postDelayed(runnable, 1000) - Log.d(logTag, "onCreate success") - } catch (e: Exception) { - Log.d(logTag, "onCreate failed: $e") - } - } - - override fun onDestroy() { - super.onDestroy() - if (viewCreated) { - windowManager.removeView(floatingView) - } - handler.removeCallbacks(runnable) - } - - @SuppressLint("ClickableViewAccessibility") - private fun createView(windowManager: WindowManager) { - floatingView = ImageView(this) - viewCreated = true - originalDrawable = resources.getDrawable(R.drawable.floating_window, null) - if (customSvg.isNotEmpty()) { - try { - val svg = SVG.getFromString(customSvg) - Log.d(logTag, "custom svg info: ${svg.documentWidth} x ${svg.documentHeight}"); - // This make the svg render clear - svg.documentWidth = viewWidth * 1f - svg.documentHeight = viewHeight * 1f - originalDrawable = svg.renderToPicture().let { - BitmapDrawable( - resources, - Bitmap.createBitmap(it.width, it.height, Bitmap.Config.ARGB_8888) - .also { bitmap -> - it.draw(Canvas(bitmap)) - }) - } - floatingView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); - Log.d(logTag, "custom svg loaded") - } catch (e: Exception) { - e.printStackTrace() - } - } - val originalBitmap = Bitmap.createBitmap( - originalDrawable.intrinsicWidth, - originalDrawable.intrinsicHeight, - Bitmap.Config.ARGB_8888 - ) - val canvas = Canvas(originalBitmap) - originalDrawable.setBounds( - 0, - 0, - originalDrawable.intrinsicWidth, - originalDrawable.intrinsicHeight - ) - originalDrawable.draw(canvas) - val leftHalfBitmap = Bitmap.createBitmap( - originalBitmap, - 0, - 0, - originalDrawable.intrinsicWidth / 2, - originalDrawable.intrinsicHeight - ) - val rightHalfBitmap = Bitmap.createBitmap( - originalBitmap, - originalDrawable.intrinsicWidth / 2, - 0, - originalDrawable.intrinsicWidth / 2, - originalDrawable.intrinsicHeight - ) - leftHalfDrawable = BitmapDrawable(resources, leftHalfBitmap) - rightHalfDrawable = BitmapDrawable(resources, rightHalfBitmap) - - floatingView.setImageDrawable(rightHalfDrawable) - floatingView.setOnTouchListener(this) - floatingView.alpha = viewTransparency * 1f - - var flags = FLAG_LAYOUT_IN_SCREEN or FLAG_NOT_TOUCH_MODAL or FLAG_NOT_FOCUSABLE - if (viewUntouchable || viewTransparency == 0f) { - flags = flags or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE - } - layoutParams = WindowManager.LayoutParams( - viewWidth / 2, - viewHeight, - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY else WindowManager.LayoutParams.TYPE_PHONE, - flags, - PixelFormat.TRANSLUCENT - ) - - layoutParams.gravity = Gravity.TOP or Gravity.START - layoutParams.x = lastLayoutX - layoutParams.y = lastLayoutY - - val keepScreenOnOption = FFI.getLocalOption("keep-screen-on").lowercase() - keepScreenOn = when (keepScreenOnOption) { - "never" -> KeepScreenOn.NEVER - "service-on" -> KeepScreenOn.SERVICE_ON - else -> KeepScreenOn.DURING_CONTROLLED - } - Log.d(logTag, "keepScreenOn option: $keepScreenOnOption, value: $keepScreenOn") - updateKeepScreenOnLayoutParams() - - windowManager.addView(floatingView, layoutParams) - moveToScreenSide() - } - - private fun onFirstCreate(windowManager: WindowManager) { - val wh = getScreenSize(windowManager) - val w = wh.first - val h = wh.second - // size - FFI.getLocalOption("floating-window-size").let { - if (it.isNotEmpty()) { - try { - val size = it.toInt() - if (size in MIN_VIEW_SIZE..MAX_VIEW_SIZE && size <= w / 2 && size <= h / 2) { - viewWidth = size - viewHeight = size - } - } catch (e: Exception) { - e.printStackTrace() - } - } - } - // untouchable - viewUntouchable = FFI.getLocalOption("floating-window-untouchable") == "Y" - // transparency - FFI.getLocalOption("floating-window-transparency").let { - if (it.isNotEmpty()) { - try { - val transparency = it.toInt() - if (transparency in 0..10) { - viewTransparency = transparency * 1f / 10 - } - } catch (e: Exception) { - e.printStackTrace() - } - } - } - // custom svg - FFI.getLocalOption("floating-window-svg").let { - if (it.isNotEmpty()) { - customSvg = it - } - } - // position - lastLayoutX = 0 - lastLayoutY = (wh.second - viewHeight) / 2 - lastOrientation = resources.configuration.orientation - } - - - - private fun performClick() { - showPopupMenu() - } - - override fun onTouch(view: View?, event: MotionEvent?): Boolean { - when (event?.action) { - MotionEvent.ACTION_DOWN -> { - dragging = false - lastDownX = event.rawX - lastDownY = event.rawY - } - MotionEvent.ACTION_UP -> { - val clickDragTolerance = 10f - if (abs(event.rawX - lastDownX) < clickDragTolerance && abs(event.rawY - lastDownY) < clickDragTolerance) { - performClick() - } else { - moveToScreenSide() - } - } - MotionEvent.ACTION_MOVE -> { - val dx = event.rawX - lastDownX - val dy = event.rawY - lastDownY - // ignore too small fist start moving(some time is click) - if (!dragging && dx*dx+dy*dy < 25) { - return false - } - dragging = true - layoutParams.x = event.rawX.toInt() - layoutParams.y = event.rawY.toInt() - layoutParams.width = viewWidth - floatingView.setImageDrawable(originalDrawable) - windowManager.updateViewLayout(view, layoutParams) - lastLayoutX = layoutParams.x - lastLayoutY = layoutParams.y - } - } - return false - } - - private fun moveToScreenSide(center: Boolean = false) { - val windowManager = getSystemService(WINDOW_SERVICE) as WindowManager - val wh = getScreenSize(windowManager) - val w = wh.first - if (layoutParams.x < w / 2) { - layoutParams.x = 0 - floatingView.setImageDrawable(rightHalfDrawable) - } else { - layoutParams.x = w - viewWidth / 2 - floatingView.setImageDrawable(leftHalfDrawable) - } - if (center) { - layoutParams.y = (wh.second - viewHeight) / 2 - } - layoutParams.width = viewWidth / 2 - windowManager.updateViewLayout(floatingView, layoutParams) - lastLayoutX = layoutParams.x - lastLayoutY = layoutParams.y - } - - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - if (newConfig.orientation != lastOrientation) { - lastOrientation = newConfig.orientation - val wh = getScreenSize(windowManager) - Log.d(logTag, "orientation: $lastOrientation, screen size: ${wh.first} x ${wh.second}") - val newW = wh.first - val newH = wh.second - if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE || newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { - // Proportional change - layoutParams.x = (layoutParams.x.toFloat() / newH.toFloat() * newW.toFloat()).toInt() - layoutParams.y = (layoutParams.y.toFloat() / newW.toFloat() * newH.toFloat()).toInt() - } - moveToScreenSide() - } - } - - private fun showPopupMenu() { - val popupMenu = PopupMenu(this, floatingView) - val idShowRustDesk = 0 - popupMenu.menu.add(0, idShowRustDesk, 0, translate("Show RustDesk")) - // For host side, clipboard sync - val idSyncClipboard = 1 - val isServiceSyncEnabled = (MainActivity.rdClipboardManager?.isCaptureStarted ?: false) && FFI.isServiceClipboardEnabled() - if (isServiceSyncEnabled) { - popupMenu.menu.add(0, idSyncClipboard, 0, translate("Update client clipboard")) - } - val idStopService = 2 - val hideStopService = FFI.getBuildinOption("hide-stop-service") == "Y" - if (!hideStopService) { - popupMenu.menu.add(0, idStopService, 0, translate("Stop service")) - } - popupMenu.setOnMenuItemClickListener { menuItem -> - when (menuItem.itemId) { - idShowRustDesk -> { - openMainActivity() - true - } - idSyncClipboard -> { - syncClipboard() - true - } - idStopService -> { - stopMainService() - true - } - else -> false - } - } - popupMenu.setOnDismissListener { - moveToScreenSide() - } - popupMenu.show() - } - - - private fun openMainActivity() { - val intent = Intent(this, MainActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - val pendingIntent = PendingIntent.getActivity( - this, 0, intent, - PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT - ) - try { - pendingIntent.send() - } catch (e: PendingIntent.CanceledException) { - e.printStackTrace() - } - } - - private fun syncClipboard() { - MainActivity.rdClipboardManager?.syncClipboard(false) - } - - private fun stopMainService() { - MainActivity.flutterMethodChannel?.invokeMethod("stop_service", null) - } - - enum class KeepScreenOn { - NEVER, - DURING_CONTROLLED, - SERVICE_ON, - } - - private val handler = Handler(Looper.getMainLooper()) - private val runnable = object : Runnable { - override fun run() { - if (updateKeepScreenOnLayoutParams()) { - windowManager.updateViewLayout(floatingView, layoutParams) - } - handler.postDelayed(this, 1000) // 1000 milliseconds = 1 second - } - } - - private fun updateKeepScreenOnLayoutParams(): Boolean { - val oldOn = layoutParams.flags and FLAG_KEEP_SCREEN_ON != 0 - val newOn = keepScreenOn == KeepScreenOn.SERVICE_ON || (keepScreenOn == KeepScreenOn.DURING_CONTROLLED && MainService.isStart) - if (oldOn != newOn) { - Log.d(logTag, "change keep screen on to $newOn") - if (newOn) { - layoutParams.flags = layoutParams.flags or FLAG_KEEP_SCREEN_ON - } else { - layoutParams.flags = layoutParams.flags and FLAG_KEEP_SCREEN_ON.inv() - } - return true - } - return false - } -} diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt deleted file mode 100644 index 3ca83fb..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt +++ /dev/null @@ -1,741 +0,0 @@ -package com.carriez.flutter_hbb - -/** - * Handle remote input and dispatch android gesture - * - * Inspired by [droidVNC-NG] https://github.com/bk138/droidVNC-NG - */ - -import android.accessibilityservice.AccessibilityService -import android.accessibilityservice.GestureDescription -import android.graphics.Path -import android.os.Build -import android.os.Bundle -import android.os.Handler -import android.os.Looper -import android.util.Log -import android.widget.EditText -import android.view.accessibility.AccessibilityEvent -import android.view.ViewGroup.LayoutParams -import android.view.accessibility.AccessibilityNodeInfo -import android.view.KeyEvent as KeyEventAndroid -import android.view.ViewConfiguration -import android.graphics.Rect -import android.media.AudioManager -import android.accessibilityservice.AccessibilityServiceInfo -import android.accessibilityservice.AccessibilityServiceInfo.FLAG_INPUT_METHOD_EDITOR -import android.accessibilityservice.AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS -import android.view.inputmethod.EditorInfo -import androidx.annotation.RequiresApi -import java.util.* -import java.lang.Character -import kotlin.math.abs -import kotlin.math.max -import hbb.MessageOuterClass.KeyEvent -import hbb.MessageOuterClass.KeyboardMode -import hbb.KeyEventConverter - -// const val BUTTON_UP = 2 -// const val BUTTON_BACK = 0x08 - -const val LEFT_DOWN = 9 -const val LEFT_MOVE = 8 -const val LEFT_UP = 10 -const val RIGHT_UP = 18 -// (BUTTON_BACK << 3) | BUTTON_UP -const val BACK_UP = 66 -const val WHEEL_BUTTON_DOWN = 33 -const val WHEEL_BUTTON_UP = 34 -const val WHEEL_DOWN = 523331 -const val WHEEL_UP = 963 - -const val TOUCH_SCALE_START = 1 -const val TOUCH_SCALE = 2 -const val TOUCH_SCALE_END = 3 -const val TOUCH_PAN_START = 4 -const val TOUCH_PAN_UPDATE = 5 -const val TOUCH_PAN_END = 6 - -const val WHEEL_STEP = 120 -const val WHEEL_DURATION = 50L -const val LONG_TAP_DELAY = 200L - -class InputService : AccessibilityService() { - - companion object { - var ctx: InputService? = null - val isOpen: Boolean - get() = ctx != null - } - - private val logTag = "input service" - private var leftIsDown = false - private var touchPath = Path() - private var stroke: GestureDescription.StrokeDescription? = null - private var lastTouchGestureStartTime = 0L - private var mouseX = 0 - private var mouseY = 0 - private var timer = Timer() - private var recentActionTask: TimerTask? = null - // 100(tap timeout) + 400(long press timeout) - private val longPressDuration = ViewConfiguration.getTapTimeout().toLong() + ViewConfiguration.getLongPressTimeout().toLong() - - private val wheelActionsQueue = LinkedList() - private var isWheelActionsPolling = false - private var isWaitingLongPress = false - - private var fakeEditTextForTextStateCalculation: EditText? = null - - private var lastX = 0 - private var lastY = 0 - - private val volumeController: VolumeController by lazy { VolumeController(applicationContext.getSystemService(AUDIO_SERVICE) as AudioManager) } - - @RequiresApi(Build.VERSION_CODES.N) - fun onMouseInput(mask: Int, _x: Int, _y: Int) { - val x = max(0, _x) - val y = max(0, _y) - - if (mask == 0 || mask == LEFT_MOVE) { - val oldX = mouseX - val oldY = mouseY - mouseX = x * SCREEN_INFO.scale - mouseY = y * SCREEN_INFO.scale - if (isWaitingLongPress) { - val delta = abs(oldX - mouseX) + abs(oldY - mouseY) - Log.d(logTag,"delta:$delta") - if (delta > 8) { - isWaitingLongPress = false - } - } - } - - // left button down, was up - if (mask == LEFT_DOWN) { - isWaitingLongPress = true - timer.schedule(object : TimerTask() { - override fun run() { - if (isWaitingLongPress) { - isWaitingLongPress = false - continueGesture(mouseX, mouseY) - } - } - }, longPressDuration) - - leftIsDown = true - startGesture(mouseX, mouseY) - return - } - - // left down, was down - if (leftIsDown) { - continueGesture(mouseX, mouseY) - } - - // left up, was down - if (mask == LEFT_UP) { - if (leftIsDown) { - leftIsDown = false - isWaitingLongPress = false - endGesture(mouseX, mouseY) - return - } - } - - if (mask == RIGHT_UP) { - longPress(mouseX, mouseY) - return - } - - if (mask == BACK_UP) { - performGlobalAction(GLOBAL_ACTION_BACK) - return - } - - // long WHEEL_BUTTON_DOWN -> GLOBAL_ACTION_RECENTS - if (mask == WHEEL_BUTTON_DOWN) { - timer.purge() - recentActionTask = object : TimerTask() { - override fun run() { - performGlobalAction(GLOBAL_ACTION_RECENTS) - recentActionTask = null - } - } - timer.schedule(recentActionTask, LONG_TAP_DELAY) - } - - // wheel button up - if (mask == WHEEL_BUTTON_UP) { - if (recentActionTask != null) { - recentActionTask!!.cancel() - performGlobalAction(GLOBAL_ACTION_HOME) - } - return - } - - if (mask == WHEEL_DOWN) { - if (mouseY < WHEEL_STEP) { - return - } - val path = Path() - path.moveTo(mouseX.toFloat(), mouseY.toFloat()) - path.lineTo(mouseX.toFloat(), (mouseY - WHEEL_STEP).toFloat()) - val stroke = GestureDescription.StrokeDescription( - path, - 0, - WHEEL_DURATION - ) - val builder = GestureDescription.Builder() - builder.addStroke(stroke) - wheelActionsQueue.offer(builder.build()) - consumeWheelActions() - - } - - if (mask == WHEEL_UP) { - if (mouseY < WHEEL_STEP) { - return - } - val path = Path() - path.moveTo(mouseX.toFloat(), mouseY.toFloat()) - path.lineTo(mouseX.toFloat(), (mouseY + WHEEL_STEP).toFloat()) - val stroke = GestureDescription.StrokeDescription( - path, - 0, - WHEEL_DURATION - ) - val builder = GestureDescription.Builder() - builder.addStroke(stroke) - wheelActionsQueue.offer(builder.build()) - consumeWheelActions() - } - } - - @RequiresApi(Build.VERSION_CODES.N) - fun onTouchInput(mask: Int, _x: Int, _y: Int) { - when (mask) { - TOUCH_PAN_UPDATE -> { - mouseX -= _x * SCREEN_INFO.scale - mouseY -= _y * SCREEN_INFO.scale - mouseX = max(0, mouseX); - mouseY = max(0, mouseY); - continueGesture(mouseX, mouseY) - } - TOUCH_PAN_START -> { - mouseX = max(0, _x) * SCREEN_INFO.scale - mouseY = max(0, _y) * SCREEN_INFO.scale - startGesture(mouseX, mouseY) - } - TOUCH_PAN_END -> { - endGesture(mouseX, mouseY) - mouseX = max(0, _x) * SCREEN_INFO.scale - mouseY = max(0, _y) * SCREEN_INFO.scale - } - else -> {} - } - } - - @RequiresApi(Build.VERSION_CODES.N) - private fun consumeWheelActions() { - if (isWheelActionsPolling) { - return - } else { - isWheelActionsPolling = true - } - wheelActionsQueue.poll()?.let { - dispatchGesture(it, null, null) - timer.purge() - timer.schedule(object : TimerTask() { - override fun run() { - isWheelActionsPolling = false - consumeWheelActions() - } - }, WHEEL_DURATION + 10) - } ?: let { - isWheelActionsPolling = false - return - } - } - - @RequiresApi(Build.VERSION_CODES.N) - private fun performClick(x: Int, y: Int, duration: Long) { - val path = Path() - path.moveTo(x.toFloat(), y.toFloat()) - try { - val longPressStroke = GestureDescription.StrokeDescription(path, 0, duration) - val builder = GestureDescription.Builder() - builder.addStroke(longPressStroke) - Log.d(logTag, "performClick x:$x y:$y time:$duration") - dispatchGesture(builder.build(), null, null) - } catch (e: Exception) { - Log.e(logTag, "performClick, error:$e") - } - } - - @RequiresApi(Build.VERSION_CODES.N) - private fun longPress(x: Int, y: Int) { - performClick(x, y, longPressDuration) - } - - private fun startGesture(x: Int, y: Int) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - touchPath.reset() - } else { - touchPath = Path() - } - touchPath.moveTo(x.toFloat(), y.toFloat()) - lastTouchGestureStartTime = System.currentTimeMillis() - lastX = x - lastY = y - } - - @RequiresApi(Build.VERSION_CODES.N) - private fun doDispatchGesture(x: Int, y: Int, willContinue: Boolean) { - touchPath.lineTo(x.toFloat(), y.toFloat()) - var duration = System.currentTimeMillis() - lastTouchGestureStartTime - if (duration <= 0) { - duration = 1 - } - try { - if (stroke == null) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - stroke = GestureDescription.StrokeDescription( - touchPath, - 0, - duration, - willContinue - ) - } else { - stroke = GestureDescription.StrokeDescription( - touchPath, - 0, - duration - ) - } - } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - stroke = stroke?.continueStroke(touchPath, 0, duration, willContinue) - } else { - stroke = null - stroke = GestureDescription.StrokeDescription( - touchPath, - 0, - duration - ) - } - } - stroke?.let { - val builder = GestureDescription.Builder() - builder.addStroke(it) - Log.d(logTag, "doDispatchGesture x:$x y:$y time:$duration") - dispatchGesture(builder.build(), null, null) - } - } catch (e: Exception) { - Log.e(logTag, "doDispatchGesture, willContinue:$willContinue, error:$e") - } - } - - @RequiresApi(Build.VERSION_CODES.N) - private fun continueGesture(x: Int, y: Int) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - doDispatchGesture(x, y, true) - touchPath.reset() - touchPath.moveTo(x.toFloat(), y.toFloat()) - lastTouchGestureStartTime = System.currentTimeMillis() - lastX = x - lastY = y - } else { - touchPath.lineTo(x.toFloat(), y.toFloat()) - } - } - - @RequiresApi(Build.VERSION_CODES.N) - private fun endGestureBelowO(x: Int, y: Int) { - try { - touchPath.lineTo(x.toFloat(), y.toFloat()) - var duration = System.currentTimeMillis() - lastTouchGestureStartTime - if (duration <= 0) { - duration = 1 - } - val stroke = GestureDescription.StrokeDescription( - touchPath, - 0, - duration - ) - val builder = GestureDescription.Builder() - builder.addStroke(stroke) - Log.d(logTag, "end gesture x:$x y:$y time:$duration") - dispatchGesture(builder.build(), null, null) - } catch (e: Exception) { - Log.e(logTag, "endGesture error:$e") - } - } - - @RequiresApi(Build.VERSION_CODES.N) - private fun endGesture(x: Int, y: Int) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - doDispatchGesture(x, y, false) - touchPath.reset() - stroke = null - } else { - endGestureBelowO(x, y) - } - } - - @RequiresApi(Build.VERSION_CODES.N) - fun onKeyEvent(data: ByteArray) { - val keyEvent = KeyEvent.parseFrom(data) - val keyboardMode = keyEvent.getMode() - - var textToCommit: String? = null - - // [down] indicates the key's state(down or up). - // [press] indicates a click event(down and up). - // https://github.com/rustdesk/rustdesk/blob/3a7594755341f023f56fa4b6a43b60d6b47df88d/flutter/lib/models/input_model.dart#L688 - if (keyEvent.hasSeq()) { - textToCommit = keyEvent.getSeq() - } else if (keyboardMode == KeyboardMode.Legacy) { - if (keyEvent.hasChr() && (keyEvent.getDown() || keyEvent.getPress())) { - val chr = keyEvent.getChr() - if (chr != null) { - textToCommit = String(Character.toChars(chr)) - } - } - } else if (keyboardMode == KeyboardMode.Translate) { - } else { - } - - Log.d(logTag, "onKeyEvent $keyEvent textToCommit:$textToCommit") - - var ke: KeyEventAndroid? = null - if (Build.VERSION.SDK_INT < 33 || textToCommit == null) { - ke = KeyEventConverter.toAndroidKeyEvent(keyEvent) - } - ke?.let { event -> - if (tryHandleVolumeKeyEvent(event)) { - return - } else if (tryHandlePowerKeyEvent(event)) { - return - } - } - - if (Build.VERSION.SDK_INT >= 33) { - getInputMethod()?.let { inputMethod -> - inputMethod.getCurrentInputConnection()?.let { inputConnection -> - if (textToCommit != null) { - textToCommit?.let { text -> - inputConnection.commitText(text, 1, null) - } - } else { - ke?.let { event -> - inputConnection.sendKeyEvent(event) - if (keyEvent.getPress()) { - val actionUpEvent = KeyEventAndroid(KeyEventAndroid.ACTION_UP, event.keyCode) - inputConnection.sendKeyEvent(actionUpEvent) - } - } - } - } - } - } else { - val handler = Handler(Looper.getMainLooper()) - handler.post { - ke?.let { event -> - val possibleNodes = possibleAccessibiltyNodes() - Log.d(logTag, "possibleNodes:$possibleNodes") - for (item in possibleNodes) { - val success = trySendKeyEvent(event, item, textToCommit) - if (success) { - if (keyEvent.getPress()) { - val actionUpEvent = KeyEventAndroid(KeyEventAndroid.ACTION_UP, event.keyCode) - trySendKeyEvent(actionUpEvent, item, textToCommit) - } - break - } - } - } - } - } - } - - private fun tryHandleVolumeKeyEvent(event: KeyEventAndroid): Boolean { - when (event.keyCode) { - KeyEventAndroid.KEYCODE_VOLUME_UP -> { - if (event.action == KeyEventAndroid.ACTION_DOWN) { - volumeController.raiseVolume(null, true, AudioManager.STREAM_SYSTEM) - } - return true - } - KeyEventAndroid.KEYCODE_VOLUME_DOWN -> { - if (event.action == KeyEventAndroid.ACTION_DOWN) { - volumeController.lowerVolume(null, true, AudioManager.STREAM_SYSTEM) - } - return true - } - KeyEventAndroid.KEYCODE_VOLUME_MUTE -> { - if (event.action == KeyEventAndroid.ACTION_DOWN) { - volumeController.toggleMute(true, AudioManager.STREAM_SYSTEM) - } - return true - } - else -> { - return false - } - } - } - - private fun tryHandlePowerKeyEvent(event: KeyEventAndroid): Boolean { - if (event.keyCode == KeyEventAndroid.KEYCODE_POWER) { - // Perform power dialog action when action is up - if (event.action == KeyEventAndroid.ACTION_UP) { - performGlobalAction(GLOBAL_ACTION_POWER_DIALOG); - } - return true - } - return false - } - - private fun insertAccessibilityNode(list: LinkedList, node: AccessibilityNodeInfo) { - if (node == null) { - return - } - if (list.contains(node)) { - return - } - list.add(node) - } - - private fun findChildNode(node: AccessibilityNodeInfo?): AccessibilityNodeInfo? { - if (node == null) { - return null - } - if (node.isEditable() && node.isFocusable()) { - return node - } - val childCount = node.getChildCount() - for (i in 0 until childCount) { - val child = node.getChild(i) - if (child != null) { - if (child.isEditable() && child.isFocusable()) { - return child - } - if (Build.VERSION.SDK_INT < 33) { - child.recycle() - } - } - } - for (i in 0 until childCount) { - val child = node.getChild(i) - if (child != null) { - val result = findChildNode(child) - if (Build.VERSION.SDK_INT < 33) { - if (child != result) { - child.recycle() - } - } - if (result != null) { - return result - } - } - } - return null - } - - private fun possibleAccessibiltyNodes(): LinkedList { - val linkedList = LinkedList() - val latestList = LinkedList() - - val focusInput = findFocus(AccessibilityNodeInfo.FOCUS_INPUT) - var focusAccessibilityInput = findFocus(AccessibilityNodeInfo.FOCUS_ACCESSIBILITY) - - val rootInActiveWindow = getRootInActiveWindow() - - Log.d(logTag, "focusInput:$focusInput focusAccessibilityInput:$focusAccessibilityInput rootInActiveWindow:$rootInActiveWindow") - - if (focusInput != null) { - if (focusInput.isFocusable() && focusInput.isEditable()) { - insertAccessibilityNode(linkedList, focusInput) - } else { - insertAccessibilityNode(latestList, focusInput) - } - } - - if (focusAccessibilityInput != null) { - if (focusAccessibilityInput.isFocusable() && focusAccessibilityInput.isEditable()) { - insertAccessibilityNode(linkedList, focusAccessibilityInput) - } else { - insertAccessibilityNode(latestList, focusAccessibilityInput) - } - } - - val childFromFocusInput = findChildNode(focusInput) - Log.d(logTag, "childFromFocusInput:$childFromFocusInput") - - if (childFromFocusInput != null) { - insertAccessibilityNode(linkedList, childFromFocusInput) - } - - val childFromFocusAccessibilityInput = findChildNode(focusAccessibilityInput) - if (childFromFocusAccessibilityInput != null) { - insertAccessibilityNode(linkedList, childFromFocusAccessibilityInput) - } - Log.d(logTag, "childFromFocusAccessibilityInput:$childFromFocusAccessibilityInput") - - if (rootInActiveWindow != null) { - insertAccessibilityNode(linkedList, rootInActiveWindow) - } - - for (item in latestList) { - insertAccessibilityNode(linkedList, item) - } - - return linkedList - } - - private fun trySendKeyEvent(event: KeyEventAndroid, node: AccessibilityNodeInfo, textToCommit: String?): Boolean { - node.refresh() - this.fakeEditTextForTextStateCalculation?.setSelection(0,0) - this.fakeEditTextForTextStateCalculation?.setText(null) - - val text = node.getText() - var isShowingHint = false - if (Build.VERSION.SDK_INT >= 26) { - isShowingHint = node.isShowingHintText() - } - - var textSelectionStart = node.textSelectionStart - var textSelectionEnd = node.textSelectionEnd - - if (text != null) { - if (textSelectionStart > text.length) { - textSelectionStart = text.length - } - if (textSelectionEnd > text.length) { - textSelectionEnd = text.length - } - if (textSelectionStart > textSelectionEnd) { - textSelectionStart = textSelectionEnd - } - } - - var success = false - - Log.d(logTag, "existing text:$text textToCommit:$textToCommit textSelectionStart:$textSelectionStart textSelectionEnd:$textSelectionEnd") - - if (textToCommit != null) { - if ((textSelectionStart == -1) || (textSelectionEnd == -1)) { - val newText = textToCommit - this.fakeEditTextForTextStateCalculation?.setText(newText) - success = updateTextForAccessibilityNode(node) - } else if (text != null) { - this.fakeEditTextForTextStateCalculation?.setText(text) - this.fakeEditTextForTextStateCalculation?.setSelection( - textSelectionStart, - textSelectionEnd - ) - this.fakeEditTextForTextStateCalculation?.text?.insert(textSelectionStart, textToCommit) - success = updateTextAndSelectionForAccessibiltyNode(node) - } - } else { - if (isShowingHint) { - this.fakeEditTextForTextStateCalculation?.setText(null) - } else { - this.fakeEditTextForTextStateCalculation?.setText(text) - } - if (textSelectionStart != -1 && textSelectionEnd != -1) { - Log.d(logTag, "setting selection $textSelectionStart $textSelectionEnd") - this.fakeEditTextForTextStateCalculation?.setSelection( - textSelectionStart, - textSelectionEnd - ) - } - - this.fakeEditTextForTextStateCalculation?.let { - // This is essiential to make sure layout object is created. OnKeyDown may not work if layout is not created. - val rect = Rect() - node.getBoundsInScreen(rect) - - it.layout(rect.left, rect.top, rect.right, rect.bottom) - it.onPreDraw() - if (event.action == KeyEventAndroid.ACTION_DOWN) { - val succ = it.onKeyDown(event.getKeyCode(), event) - Log.d(logTag, "onKeyDown $succ") - } else if (event.action == KeyEventAndroid.ACTION_UP) { - val success = it.onKeyUp(event.getKeyCode(), event) - Log.d(logTag, "keyup $success") - } else {} - } - - success = updateTextAndSelectionForAccessibiltyNode(node) - } - return success - } - - fun updateTextForAccessibilityNode(node: AccessibilityNodeInfo): Boolean { - var success = false - this.fakeEditTextForTextStateCalculation?.text?.let { - val arguments = Bundle() - arguments.putCharSequence( - AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, - it.toString() - ) - success = node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments) - } - return success - } - - fun updateTextAndSelectionForAccessibiltyNode(node: AccessibilityNodeInfo): Boolean { - var success = updateTextForAccessibilityNode(node) - - if (success) { - val selectionStart = this.fakeEditTextForTextStateCalculation?.selectionStart - val selectionEnd = this.fakeEditTextForTextStateCalculation?.selectionEnd - - if (selectionStart != null && selectionEnd != null) { - val arguments = Bundle() - arguments.putInt( - AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, - selectionStart - ) - arguments.putInt( - AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, - selectionEnd - ) - success = node.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, arguments) - Log.d(logTag, "Update selection to $selectionStart $selectionEnd success:$success") - } - } - - return success - } - - - override fun onAccessibilityEvent(event: AccessibilityEvent) { - } - - override fun onServiceConnected() { - super.onServiceConnected() - ctx = this - val info = AccessibilityServiceInfo() - if (Build.VERSION.SDK_INT >= 33) { - info.flags = FLAG_INPUT_METHOD_EDITOR or FLAG_RETRIEVE_INTERACTIVE_WINDOWS - } else { - info.flags = FLAG_RETRIEVE_INTERACTIVE_WINDOWS - } - setServiceInfo(info) - fakeEditTextForTextStateCalculation = EditText(this) - // Size here doesn't matter, we won't show this view. - fakeEditTextForTextStateCalculation?.layoutParams = LayoutParams(100, 100) - fakeEditTextForTextStateCalculation?.onPreDraw() - val layout = fakeEditTextForTextStateCalculation?.getLayout() - Log.d(logTag, "fakeEditTextForTextStateCalculation layout:$layout") - Log.d(logTag, "onServiceConnected!") - } - - override fun onDestroy() { - ctx = null - super.onDestroy() - } - - override fun onInterrupt() {} -} diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/KeyboardKeyEventMapper.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/KeyboardKeyEventMapper.kt deleted file mode 100644 index ccb3319..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/KeyboardKeyEventMapper.kt +++ /dev/null @@ -1,122 +0,0 @@ -package hbb; -import android.view.KeyEvent -import android.view.KeyCharacterMap -import hbb.MessageOuterClass.KeyboardMode -import hbb.MessageOuterClass.ControlKey - -object KeyEventConverter { - fun toAndroidKeyEvent(keyEventProto: hbb.MessageOuterClass.KeyEvent): KeyEvent { - var chrValue = 0 - var modifiers = 0 - - val keyboardMode = keyEventProto.getMode() - - if (keyEventProto.hasChr()) { - if (keyboardMode == KeyboardMode.Map || keyboardMode == KeyboardMode.Translate) { - chrValue = keyEventProto.getChr() - } else { - chrValue = convertUnicodeToKeyCode(keyEventProto.getChr() as Int) - } - } else if (keyEventProto.hasControlKey()) { - chrValue = convertControlKeyToKeyCode(keyEventProto.getControlKey()) - } - - var modifiersList = keyEventProto.getModifiersList() - - if (modifiersList != null) { - for (modifier in keyEventProto.getModifiersList()) { - val modifierValue = convertModifier(modifier) - modifiers = modifiers or modifierValue - } - } - - var action = 0 - if (keyEventProto.getDown() || keyEventProto.getPress()) { - action = KeyEvent.ACTION_DOWN - } else { - action = KeyEvent.ACTION_UP - } - - return KeyEvent(0, 0, action, chrValue, 0, modifiers) - } - - private fun convertModifier(controlKey: hbb.MessageOuterClass.ControlKey): Int { - // Add logic to map ControlKey values to Android KeyEvent key codes. - // You'll need to provide the mapping for each key. - return when (controlKey) { - ControlKey.Alt -> KeyEvent.META_ALT_ON - ControlKey.Control -> KeyEvent.META_CTRL_ON - ControlKey.CapsLock -> KeyEvent.META_CAPS_LOCK_ON - ControlKey.Meta -> KeyEvent.META_META_ON - ControlKey.NumLock -> KeyEvent.META_NUM_LOCK_ON - ControlKey.RShift -> KeyEvent.META_SHIFT_RIGHT_ON - ControlKey.Shift -> KeyEvent.META_SHIFT_ON - ControlKey.RAlt -> KeyEvent.META_ALT_RIGHT_ON - ControlKey.RControl -> KeyEvent.META_CTRL_RIGHT_ON - else -> 0 // Default to unknown. - } - } - - private val tag = "KeyEventConverter" - - private fun convertUnicodeToKeyCode(unicode: Int): Int { - val charMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD) - android.util.Log.d(tag, "unicode: $unicode") - val events = charMap.getEvents(charArrayOf(unicode.toChar())) - if (events != null && events.size > 0) { - android.util.Log.d(tag, "keycode ${events[0].keyCode}") - return events[0].keyCode - } - return 0 - } - - private fun convertControlKeyToKeyCode(controlKey: hbb.MessageOuterClass.ControlKey): Int { - // Add logic to map ControlKey values to Android KeyEvent key codes. - // You'll need to provide the mapping for each key. - return when (controlKey) { - ControlKey.Alt -> KeyEvent.KEYCODE_ALT_LEFT - ControlKey.Backspace -> KeyEvent.KEYCODE_DEL - ControlKey.Control -> KeyEvent.KEYCODE_CTRL_LEFT - ControlKey.CapsLock -> KeyEvent.KEYCODE_CAPS_LOCK - ControlKey.Meta -> KeyEvent.KEYCODE_META_LEFT - ControlKey.NumLock -> KeyEvent.KEYCODE_NUM_LOCK - ControlKey.RShift -> KeyEvent.KEYCODE_SHIFT_RIGHT - ControlKey.Shift -> KeyEvent.KEYCODE_SHIFT_LEFT - ControlKey.RAlt -> KeyEvent.KEYCODE_ALT_RIGHT - ControlKey.RControl -> KeyEvent.KEYCODE_CTRL_RIGHT - ControlKey.DownArrow -> KeyEvent.KEYCODE_DPAD_DOWN - ControlKey.LeftArrow -> KeyEvent.KEYCODE_DPAD_LEFT - ControlKey.RightArrow -> KeyEvent.KEYCODE_DPAD_RIGHT - ControlKey.UpArrow -> KeyEvent.KEYCODE_DPAD_UP - ControlKey.End -> KeyEvent.KEYCODE_MOVE_END - ControlKey.Home -> KeyEvent.KEYCODE_MOVE_HOME - ControlKey.PageUp -> KeyEvent.KEYCODE_PAGE_UP - ControlKey.PageDown -> KeyEvent.KEYCODE_PAGE_DOWN - ControlKey.Insert -> KeyEvent.KEYCODE_INSERT - ControlKey.Escape -> KeyEvent.KEYCODE_ESCAPE - ControlKey.F1 -> KeyEvent.KEYCODE_F1 - ControlKey.F2 -> KeyEvent.KEYCODE_F2 - ControlKey.F3 -> KeyEvent.KEYCODE_F3 - ControlKey.F4 -> KeyEvent.KEYCODE_F4 - ControlKey.F5 -> KeyEvent.KEYCODE_F5 - ControlKey.F6 -> KeyEvent.KEYCODE_F6 - ControlKey.F7 -> KeyEvent.KEYCODE_F7 - ControlKey.F8 -> KeyEvent.KEYCODE_F8 - ControlKey.F9 -> KeyEvent.KEYCODE_F9 - ControlKey.F10 -> KeyEvent.KEYCODE_F10 - ControlKey.F11 -> KeyEvent.KEYCODE_F11 - ControlKey.F12 -> KeyEvent.KEYCODE_F12 - ControlKey.Space -> KeyEvent.KEYCODE_SPACE - ControlKey.Tab -> KeyEvent.KEYCODE_TAB - ControlKey.Return -> KeyEvent.KEYCODE_ENTER - ControlKey.Delete -> KeyEvent.KEYCODE_FORWARD_DEL - ControlKey.Clear -> KeyEvent.KEYCODE_CLEAR - ControlKey.Pause -> KeyEvent.KEYCODE_BREAK - ControlKey.VolumeMute -> KeyEvent.KEYCODE_VOLUME_MUTE - ControlKey.VolumeUp -> KeyEvent.KEYCODE_VOLUME_UP - ControlKey.VolumeDown -> KeyEvent.KEYCODE_VOLUME_DOWN - ControlKey.Power -> KeyEvent.KEYCODE_POWER - else -> 0 // Default to unknown. - } - } -} diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt deleted file mode 100644 index fea8e55..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainActivity.kt +++ /dev/null @@ -1,414 +0,0 @@ -package com.carriez.flutter_hbb - -/** - * Handle events from flutter - * Request MediaProjection permission - * - * Inspired by [droidVNC-NG] https://github.com/bk138/droidVNC-NG - */ - -import ffi.FFI - -import android.content.ComponentName -import android.content.Context -import android.content.Intent -import android.content.ServiceConnection -import android.content.ClipboardManager -import android.os.Bundle -import android.os.Build -import android.os.IBinder -import android.util.Log -import android.view.WindowManager -import android.media.MediaCodecInfo -import android.media.MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface -import android.media.MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar -import android.media.MediaCodecList -import android.media.MediaFormat -import android.util.DisplayMetrics -import androidx.annotation.RequiresApi -import org.json.JSONArray -import org.json.JSONObject -import com.hjq.permissions.XXPermissions -import io.flutter.embedding.android.FlutterActivity -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.plugin.common.MethodChannel -import kotlin.concurrent.thread - - -class MainActivity : FlutterActivity() { - companion object { - var flutterMethodChannel: MethodChannel? = null - private var _rdClipboardManager: RdClipboardManager? = null - val rdClipboardManager: RdClipboardManager? - get() = _rdClipboardManager; - } - - private val channelTag = "mChannel" - private val logTag = "mMainActivity" - private var mainService: MainService? = null - - private var isAudioStart = false - private val audioRecordHandle = AudioRecordHandle(this, { false }, { isAudioStart }) - - override fun configureFlutterEngine(flutterEngine: FlutterEngine) { - super.configureFlutterEngine(flutterEngine) - if (MainService.isReady) { - Intent(activity, MainService::class.java).also { - bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) - } - } - flutterMethodChannel = MethodChannel( - flutterEngine.dartExecutor.binaryMessenger, - channelTag - ) - initFlutterChannel(flutterMethodChannel!!) - thread { - try { - setCodecInfo() - } catch (e: Exception) { - Log.e("MainActivity", "Failed to setCodecInfo: ${e.message}", e) - } - } - } - - override fun onResume() { - super.onResume() - val inputPer = InputService.isOpen - activity.runOnUiThread { - flutterMethodChannel?.invokeMethod( - "on_state_changed", - mapOf("name" to "input", "value" to inputPer.toString()) - ) - } - } - - private fun requestMediaProjection() { - val intent = Intent(this, PermissionRequestTransparentActivity::class.java).apply { - action = ACT_REQUEST_MEDIA_PROJECTION - } - startActivityForResult(intent, REQ_INVOKE_PERMISSION_ACTIVITY_MEDIA_PROJECTION) - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQ_INVOKE_PERMISSION_ACTIVITY_MEDIA_PROJECTION && resultCode == RES_FAILED) { - flutterMethodChannel?.invokeMethod("on_media_projection_canceled", null) - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - if (_rdClipboardManager == null) { - _rdClipboardManager = RdClipboardManager(getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager) - FFI.setClipboardManager(_rdClipboardManager!!) - } - } - - override fun onDestroy() { - Log.e(logTag, "onDestroy") - mainService?.let { - unbindService(serviceConnection) - } - super.onDestroy() - } - - private val serviceConnection = object : ServiceConnection { - override fun onServiceConnected(name: ComponentName?, service: IBinder?) { - Log.d(logTag, "onServiceConnected") - val binder = service as MainService.LocalBinder - mainService = binder.getService() - } - - override fun onServiceDisconnected(name: ComponentName?) { - Log.d(logTag, "onServiceDisconnected") - mainService = null - } - } - - private fun initFlutterChannel(flutterMethodChannel: MethodChannel) { - flutterMethodChannel.setMethodCallHandler { call, result -> - // make sure result will be invoked, otherwise flutter will await forever - when (call.method) { - "init_service" -> { - Intent(activity, MainService::class.java).also { - bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) - } - if (MainService.isReady) { - result.success(false) - return@setMethodCallHandler - } - requestMediaProjection() - result.success(true) - } - "start_capture" -> { - mainService?.let { - result.success(it.startCapture()) - } ?: let { - result.success(false) - } - } - "stop_service" -> { - Log.d(logTag, "Stop service") - mainService?.let { - it.destroy() - result.success(true) - } ?: let { - result.success(false) - } - } - "check_permission" -> { - if (call.arguments is String) { - result.success(XXPermissions.isGranted(context, call.arguments as String)) - } else { - result.success(false) - } - } - "request_permission" -> { - if (call.arguments is String) { - requestPermission(context, call.arguments as String) - result.success(true) - } else { - result.success(false) - } - } - START_ACTION -> { - if (call.arguments is String) { - startAction(context, call.arguments as String) - result.success(true) - } else { - result.success(false) - } - } - "check_video_permission" -> { - mainService?.let { - result.success(it.checkMediaPermission()) - } ?: let { - result.success(false) - } - } - "check_service" -> { - Companion.flutterMethodChannel?.invokeMethod( - "on_state_changed", - mapOf("name" to "input", "value" to InputService.isOpen.toString()) - ) - Companion.flutterMethodChannel?.invokeMethod( - "on_state_changed", - mapOf("name" to "media", "value" to MainService.isReady.toString()) - ) - result.success(true) - } - "stop_input" -> { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - InputService.ctx?.disableSelf() - } - InputService.ctx = null - Companion.flutterMethodChannel?.invokeMethod( - "on_state_changed", - mapOf("name" to "input", "value" to InputService.isOpen.toString()) - ) - result.success(true) - } - "cancel_notification" -> { - if (call.arguments is Int) { - val id = call.arguments as Int - mainService?.cancelNotification(id) - } else { - result.success(true) - } - } - "enable_soft_keyboard" -> { - // https://blog.csdn.net/hanye2020/article/details/105553780 - if (call.arguments as Boolean) { - window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM) - } else { - window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM) - } - result.success(true) - - } - "try_sync_clipboard" -> { - rdClipboardManager?.syncClipboard(true) - result.success(true) - } - GET_START_ON_BOOT_OPT -> { - val prefs = getSharedPreferences(KEY_SHARED_PREFERENCES, MODE_PRIVATE) - result.success(prefs.getBoolean(KEY_START_ON_BOOT_OPT, false)) - } - SET_START_ON_BOOT_OPT -> { - if (call.arguments is Boolean) { - val prefs = getSharedPreferences(KEY_SHARED_PREFERENCES, MODE_PRIVATE) - val edit = prefs.edit() - edit.putBoolean(KEY_START_ON_BOOT_OPT, call.arguments as Boolean) - edit.apply() - result.success(true) - } else { - result.success(false) - } - } - SYNC_APP_DIR_CONFIG_PATH -> { - if (call.arguments is String) { - val prefs = getSharedPreferences(KEY_SHARED_PREFERENCES, MODE_PRIVATE) - val edit = prefs.edit() - edit.putString(KEY_APP_DIR_CONFIG_PATH, call.arguments as String) - edit.apply() - result.success(true) - } else { - result.success(false) - } - } - GET_VALUE -> { - if (call.arguments is String) { - if (call.arguments == KEY_IS_SUPPORT_VOICE_CALL) { - result.success(isSupportVoiceCall()) - } else { - result.error("-1", "No such key", null) - } - } else { - result.success(null) - } - } - "on_voice_call_started" -> { - onVoiceCallStarted() - } - "on_voice_call_closed" -> { - onVoiceCallClosed() - } - else -> { - result.error("-1", "No such method", null) - } - } - } - } - - private fun setCodecInfo() { - val codecList = MediaCodecList(MediaCodecList.REGULAR_CODECS) - val codecs = codecList.codecInfos - val codecArray = JSONArray() - - val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager - val wh = getScreenSize(windowManager) - var w = wh.first - var h = wh.second - val align = 64 - w = (w + align - 1) / align * align - h = (h + align - 1) / align * align - codecs.forEach { codec -> - val codecObject = JSONObject() - codecObject.put("name", codec.name) - codecObject.put("is_encoder", codec.isEncoder) - var hw: Boolean? = null; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - hw = codec.isHardwareAccelerated - } else { - // https://chromium.googlesource.com/external/webrtc/+/HEAD/sdk/android/src/java/org/webrtc/MediaCodecUtils.java#29 - // https://chromium.googlesource.com/external/webrtc/+/master/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java#229 - if (listOf("OMX.google.", "OMX.SEC.", "c2.android").any { codec.name.startsWith(it, true) }) { - hw = false - } else if (listOf("c2.qti", "OMX.qcom.video", "OMX.Exynos", "OMX.hisi", "OMX.MTK", "OMX.Intel", "OMX.Nvidia").any { codec.name.startsWith(it, true) }) { - hw = true - } - } - if (hw != true) { - return@forEach - } - codecObject.put("hw", hw) - var mime_type = "" - codec.supportedTypes.forEach { type -> - if (listOf("video/avc", "video/hevc").contains(type)) { // "video/x-vnd.on2.vp8", "video/x-vnd.on2.vp9", "video/av01" - mime_type = type; - } - } - if (mime_type.isNotEmpty()) { - codecObject.put("mime_type", mime_type) - val caps = codec.getCapabilitiesForType(mime_type) - if (codec.isEncoder) { - // Encoder's max_height and max_width are interchangeable - if (!caps.videoCapabilities.isSizeSupported(w,h) && !caps.videoCapabilities.isSizeSupported(h,w)) { - return@forEach - } - } - codecObject.put("min_width", caps.videoCapabilities.supportedWidths.lower) - codecObject.put("max_width", caps.videoCapabilities.supportedWidths.upper) - codecObject.put("min_height", caps.videoCapabilities.supportedHeights.lower) - codecObject.put("max_height", caps.videoCapabilities.supportedHeights.upper) - val surface = caps.colorFormats.contains(COLOR_FormatSurface); - codecObject.put("surface", surface) - val nv12 = caps.colorFormats.contains(COLOR_FormatYUV420SemiPlanar) - codecObject.put("nv12", nv12) - if (!(nv12 || surface)) { - return@forEach - } - codecObject.put("min_bitrate", caps.videoCapabilities.bitrateRange.lower / 1000) - codecObject.put("max_bitrate", caps.videoCapabilities.bitrateRange.upper / 1000) - if (!codec.isEncoder) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - codecObject.put("low_latency", caps.isFeatureSupported(MediaCodecInfo.CodecCapabilities.FEATURE_LowLatency)) - } - } - if (!codec.isEncoder) { - return@forEach - } - codecArray.put(codecObject) - } - } - val result = JSONObject() - result.put("version", Build.VERSION.SDK_INT) - result.put("w", w) - result.put("h", h) - result.put("codecs", codecArray) - FFI.setCodecInfo(result.toString()) - } - - private fun onVoiceCallStarted() { - var ok = false - mainService?.let { - ok = it.onVoiceCallStarted() - } ?: let { - isAudioStart = true - ok = audioRecordHandle.onVoiceCallStarted(null) - } - if (!ok) { - // Rarely happens, So we just add log and msgbox here. - Log.e(logTag, "onVoiceCallStarted fail") - flutterMethodChannel?.invokeMethod("msgbox", mapOf( - "type" to "custom-nook-nocancel-hasclose-error", - "title" to "Voice call", - "text" to "Failed to start voice call.")) - } else { - Log.d(logTag, "onVoiceCallStarted success") - } - } - - private fun onVoiceCallClosed() { - var ok = false - mainService?.let { - ok = it.onVoiceCallClosed() - } ?: let { - isAudioStart = false - ok = audioRecordHandle.onVoiceCallClosed(null) - } - if (!ok) { - // Rarely happens, So we just add log and msgbox here. - Log.e(logTag, "onVoiceCallClosed fail") - flutterMethodChannel?.invokeMethod("msgbox", mapOf( - "type" to "custom-nook-nocancel-hasclose-error", - "title" to "Voice call", - "text" to "Failed to stop voice call.")) - } else { - Log.d(logTag, "onVoiceCallClosed success") - } - } - - override fun onStop() { - super.onStop() - val disableFloatingWindow = FFI.getLocalOption("disable-floating-window") == "Y" - if (!disableFloatingWindow && MainService.isReady) { - startService(Intent(this, FloatingWindowService::class.java)) - } - } - - override fun onStart() { - super.onStart() - stopService(Intent(this, FloatingWindowService::class.java)) - } -} diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainApplication.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainApplication.kt deleted file mode 100644 index 59a3b0f..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainApplication.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.carriez.flutter_hbb - -import android.app.Application -import android.util.Log -import ffi.FFI - -class MainApplication : Application() { - companion object { - private const val TAG = "MainApplication" - } - - override fun onCreate() { - super.onCreate() - Log.d(TAG, "App start") - FFI.onAppStart(applicationContext) - } -} diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt deleted file mode 100644 index 7bb16a0..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/MainService.kt +++ /dev/null @@ -1,729 +0,0 @@ -package com.carriez.flutter_hbb - -import ffi.FFI - -/** - * Capture screen,get video and audio,send to rust. - * Dispatch notifications - * - * Inspired by [droidVNC-NG] https://github.com/bk138/droidVNC-NG - */ - -import android.Manifest -import android.annotation.SuppressLint -import android.app.* -import android.app.PendingIntent.FLAG_IMMUTABLE -import android.app.PendingIntent.FLAG_UPDATE_CURRENT -import android.content.Context -import android.content.Intent -import android.content.pm.PackageManager -import android.content.res.Configuration -import android.content.res.Configuration.ORIENTATION_LANDSCAPE -import android.graphics.Color -import android.graphics.PixelFormat -import android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR -import android.hardware.display.VirtualDisplay -import android.media.* -import android.media.projection.MediaProjection -import android.media.projection.MediaProjectionManager -import android.os.* -import android.util.DisplayMetrics -import android.util.Log -import android.view.Surface -import android.view.Surface.FRAME_RATE_COMPATIBILITY_DEFAULT -import android.view.WindowManager -import androidx.annotation.Keep -import androidx.annotation.RequiresApi -import androidx.core.app.ActivityCompat -import androidx.core.app.NotificationCompat -import androidx.core.content.ContextCompat -import io.flutter.embedding.android.FlutterActivity -import java.util.concurrent.Executors -import kotlin.concurrent.thread -import org.json.JSONException -import org.json.JSONObject -import java.nio.ByteBuffer -import kotlin.math.max -import kotlin.math.min - -const val DEFAULT_NOTIFY_TITLE = "RustDesk" -const val DEFAULT_NOTIFY_TEXT = "Service is running" -const val DEFAULT_NOTIFY_ID = 1 -const val NOTIFY_ID_OFFSET = 100 - -const val MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_VP9 - -// video const - -const val MAX_SCREEN_SIZE = 1200 - -const val VIDEO_KEY_BIT_RATE = 1024_000 -const val VIDEO_KEY_FRAME_RATE = 30 - -class MainService : Service() { - - @Keep - @RequiresApi(Build.VERSION_CODES.N) - fun rustPointerInput(kind: Int, mask: Int, x: Int, y: Int) { - // turn on screen with LEFT_DOWN when screen off - if (!powerManager.isInteractive && (kind == 0 || mask == LEFT_DOWN)) { - if (wakeLock.isHeld) { - Log.d(logTag, "Turn on Screen, WakeLock release") - wakeLock.release() - } - Log.d(logTag,"Turn on Screen") - wakeLock.acquire(5000) - } else { - when (kind) { - 0 -> { // touch - InputService.ctx?.onTouchInput(mask, x, y) - } - 1 -> { // mouse - InputService.ctx?.onMouseInput(mask, x, y) - } - else -> { - } - } - } - } - - @Keep - @RequiresApi(Build.VERSION_CODES.N) - fun rustKeyEventInput(input: ByteArray) { - InputService.ctx?.onKeyEvent(input) - } - - @Keep - fun rustGetByName(name: String): String { - return when (name) { - "screen_size" -> { - JSONObject().apply { - put("width",SCREEN_INFO.width) - put("height",SCREEN_INFO.height) - put("scale",SCREEN_INFO.scale) - }.toString() - } - "is_start" -> { - isStart.toString() - } - else -> "" - } - } - - @Keep - fun rustSetByName(name: String, arg1: String, arg2: String) { - when (name) { - "add_connection" -> { - try { - val jsonObject = JSONObject(arg1) - val id = jsonObject["id"] as Int - val username = jsonObject["name"] as String - val peerId = jsonObject["peer_id"] as String - val authorized = jsonObject["authorized"] as Boolean - val isFileTransfer = jsonObject["is_file_transfer"] as Boolean - val type = if (isFileTransfer) { - translate("Transfer file") - } else { - translate("Share screen") - } - if (authorized) { - if (!isFileTransfer && !isStart) { - startCapture() - } - onClientAuthorizedNotification(id, type, username, peerId) - } else { - loginRequestNotification(id, type, username, peerId) - } - } catch (e: JSONException) { - e.printStackTrace() - } - } - "update_voice_call_state" -> { - try { - val jsonObject = JSONObject(arg1) - val id = jsonObject["id"] as Int - val username = jsonObject["name"] as String - val peerId = jsonObject["peer_id"] as String - val inVoiceCall = jsonObject["in_voice_call"] as Boolean - val incomingVoiceCall = jsonObject["incoming_voice_call"] as Boolean - if (!inVoiceCall) { - if (incomingVoiceCall) { - voiceCallRequestNotification(id, "Voice Call Request", username, peerId) - } else { - if (!audioRecordHandle.switchOutVoiceCall(mediaProjection)) { - Log.e(logTag, "switchOutVoiceCall fail") - MainActivity.flutterMethodChannel?.invokeMethod("msgbox", mapOf( - "type" to "custom-nook-nocancel-hasclose-error", - "title" to "Voice call", - "text" to "Failed to switch out voice call.")) - } - } - } else { - if (!audioRecordHandle.switchToVoiceCall(mediaProjection)) { - Log.e(logTag, "switchToVoiceCall fail") - MainActivity.flutterMethodChannel?.invokeMethod("msgbox", mapOf( - "type" to "custom-nook-nocancel-hasclose-error", - "title" to "Voice call", - "text" to "Failed to switch to voice call.")) - } - } - } catch (e: JSONException) { - e.printStackTrace() - } - } - "stop_capture" -> { - Log.d(logTag, "from rust:stop_capture") - stopCapture() - } - "half_scale" -> { - val halfScale = arg1.toBoolean() - if (isHalfScale != halfScale) { - isHalfScale = halfScale - updateScreenInfo(resources.configuration.orientation) - } - - } - else -> { - } - } - } - - private var serviceLooper: Looper? = null - private var serviceHandler: Handler? = null - - private val powerManager: PowerManager by lazy { applicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager } - private val wakeLock: PowerManager.WakeLock by lazy { powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP or PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "rustdesk:wakelock")} - - companion object { - private var _isReady = false // media permission ready status - private var _isStart = false // screen capture start status - private var _isAudioStart = false // audio capture start status - val isReady: Boolean - get() = _isReady - val isStart: Boolean - get() = _isStart - val isAudioStart: Boolean - get() = _isAudioStart - } - - private val logTag = "LOG_SERVICE" - private val useVP9 = false - private val binder = LocalBinder() - - private var reuseVirtualDisplay = Build.VERSION.SDK_INT > 33 - - // video - private var mediaProjection: MediaProjection? = null - private var surface: Surface? = null - private val sendVP9Thread = Executors.newSingleThreadExecutor() - private var videoEncoder: MediaCodec? = null - private var imageReader: ImageReader? = null - private var virtualDisplay: VirtualDisplay? = null - - // audio - private val audioRecordHandle = AudioRecordHandle(this, { isStart }, { isAudioStart }) - - // notification - private lateinit var notificationManager: NotificationManager - private lateinit var notificationChannel: String - private lateinit var notificationBuilder: NotificationCompat.Builder - - override fun onCreate() { - super.onCreate() - Log.d(logTag,"MainService onCreate, sdk int:${Build.VERSION.SDK_INT} reuseVirtualDisplay:$reuseVirtualDisplay") - FFI.init(this) - HandlerThread("Service", Process.THREAD_PRIORITY_BACKGROUND).apply { - start() - serviceLooper = looper - serviceHandler = Handler(looper) - } - updateScreenInfo(resources.configuration.orientation) - initNotification() - - // keep the config dir same with flutter - val prefs = applicationContext.getSharedPreferences(KEY_SHARED_PREFERENCES, FlutterActivity.MODE_PRIVATE) - val configPath = prefs.getString(KEY_APP_DIR_CONFIG_PATH, "") ?: "" - FFI.startServer(configPath, "") - - createForegroundNotification() - } - - override fun onDestroy() { - checkMediaPermission() - stopService(Intent(this, FloatingWindowService::class.java)) - super.onDestroy() - } - - private var isHalfScale: Boolean? = null; - private fun updateScreenInfo(orientation: Int) { - var w: Int - var h: Int - var dpi: Int - val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager - - @Suppress("DEPRECATION") - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - val m = windowManager.maximumWindowMetrics - w = m.bounds.width() - h = m.bounds.height() - dpi = resources.configuration.densityDpi - } else { - val dm = DisplayMetrics() - windowManager.defaultDisplay.getRealMetrics(dm) - w = dm.widthPixels - h = dm.heightPixels - dpi = dm.densityDpi - } - - val max = max(w,h) - val min = min(w,h) - if (orientation == ORIENTATION_LANDSCAPE) { - w = max - h = min - } else { - w = min - h = max - } - Log.d(logTag,"updateScreenInfo:w:$w,h:$h") - var scale = 1 - if (w != 0 && h != 0) { - if (isHalfScale == true && (w > MAX_SCREEN_SIZE || h > MAX_SCREEN_SIZE)) { - scale = 2 - w /= scale - h /= scale - dpi /= scale - } - if (SCREEN_INFO.width != w) { - SCREEN_INFO.width = w - SCREEN_INFO.height = h - SCREEN_INFO.scale = scale - SCREEN_INFO.dpi = dpi - if (isStart) { - stopCapture() - FFI.refreshScreen() - startCapture() - } else { - FFI.refreshScreen() - } - } - - } - } - - override fun onBind(intent: Intent): IBinder { - Log.d(logTag, "service onBind") - return binder - } - - inner class LocalBinder : Binder() { - init { - Log.d(logTag, "LocalBinder init") - } - - fun getService(): MainService = this@MainService - } - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - Log.d("whichService", "this service: ${Thread.currentThread()}") - super.onStartCommand(intent, flags, startId) - if (intent?.action == ACT_INIT_MEDIA_PROJECTION_AND_SERVICE) { - createForegroundNotification() - - if (intent.getBooleanExtra(EXT_INIT_FROM_BOOT, false)) { - FFI.startService() - } - Log.d(logTag, "service starting: ${startId}:${Thread.currentThread()}") - val mediaProjectionManager = - getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager - - intent.getParcelableExtra(EXT_MEDIA_PROJECTION_RES_INTENT)?.let { - mediaProjection = - mediaProjectionManager.getMediaProjection(Activity.RESULT_OK, it) - checkMediaPermission() - _isReady = true - } ?: let { - Log.d(logTag, "getParcelableExtra intent null, invoke requestMediaProjection") - requestMediaProjection() - } - } - return START_NOT_STICKY // don't use sticky (auto restart), the new service (from auto restart) will lose control - } - - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - updateScreenInfo(newConfig.orientation) - } - - private fun requestMediaProjection() { - val intent = Intent(this, PermissionRequestTransparentActivity::class.java).apply { - action = ACT_REQUEST_MEDIA_PROJECTION - flags = Intent.FLAG_ACTIVITY_NEW_TASK - } - startActivity(intent) - } - - @SuppressLint("WrongConstant") - private fun createSurface(): Surface? { - return if (useVP9) { - // TODO - null - } else { - Log.d(logTag, "ImageReader.newInstance:INFO:$SCREEN_INFO") - imageReader = - ImageReader.newInstance( - SCREEN_INFO.width, - SCREEN_INFO.height, - PixelFormat.RGBA_8888, - 4 - ).apply { - setOnImageAvailableListener({ imageReader: ImageReader -> - try { - // If not call acquireLatestImage, listener will not be called again - imageReader.acquireLatestImage().use { image -> - if (image == null || !isStart) return@setOnImageAvailableListener - val planes = image.planes - val buffer = planes[0].buffer - buffer.rewind() - FFI.onVideoFrameUpdate(buffer) - } - } catch (ignored: java.lang.Exception) { - } - }, serviceHandler) - } - Log.d(logTag, "ImageReader.setOnImageAvailableListener done") - imageReader?.surface - } - } - - fun onVoiceCallStarted(): Boolean { - return audioRecordHandle.onVoiceCallStarted(mediaProjection) - } - - fun onVoiceCallClosed(): Boolean { - return audioRecordHandle.onVoiceCallClosed(mediaProjection) - } - - fun startCapture(): Boolean { - if (isStart) { - return true - } - if (mediaProjection == null) { - Log.w(logTag, "startCapture fail,mediaProjection is null") - return false - } - - updateScreenInfo(resources.configuration.orientation) - Log.d(logTag, "Start Capture") - surface = createSurface() - - if (useVP9) { - startVP9VideoRecorder(mediaProjection!!) - } else { - startRawVideoRecorder(mediaProjection!!) - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - if (!audioRecordHandle.createAudioRecorder(false, mediaProjection)) { - Log.d(logTag, "createAudioRecorder fail") - } else { - Log.d(logTag, "audio recorder start") - audioRecordHandle.startAudioRecorder() - } - } - checkMediaPermission() - _isStart = true - FFI.setFrameRawEnable("video",true) - MainActivity.rdClipboardManager?.setCaptureStarted(_isStart) - return true - } - - @Synchronized - fun stopCapture() { - Log.d(logTag, "Stop Capture") - FFI.setFrameRawEnable("video",false) - _isStart = false - MainActivity.rdClipboardManager?.setCaptureStarted(_isStart) - // release video - if (reuseVirtualDisplay) { - // The virtual display video projection can be paused by calling `setSurface(null)`. - // https://developer.android.com/reference/android/hardware/display/VirtualDisplay.Callback - // https://learn.microsoft.com/en-us/dotnet/api/android.hardware.display.virtualdisplay.callback.onpaused?view=net-android-34.0 - virtualDisplay?.setSurface(null) - } else { - virtualDisplay?.release() - } - // suface needs to be release after `imageReader.close()` to imageReader access released surface - // https://github.com/rustdesk/rustdesk/issues/4118#issuecomment-1515666629 - imageReader?.close() - imageReader = null - videoEncoder?.let { - it.signalEndOfInputStream() - it.stop() - it.release() - } - if (!reuseVirtualDisplay) { - virtualDisplay = null - } - videoEncoder = null - // suface needs to be release after `imageReader.close()` to imageReader access released surface - // https://github.com/rustdesk/rustdesk/issues/4118#issuecomment-1515666629 - surface?.release() - - // release audio - _isAudioStart = false - audioRecordHandle.tryReleaseAudio() - } - - fun destroy() { - Log.d(logTag, "destroy service") - _isReady = false - _isAudioStart = false - - stopCapture() - - if (reuseVirtualDisplay) { - virtualDisplay?.release() - virtualDisplay = null - } - - mediaProjection = null - checkMediaPermission() - stopForeground(true) - stopService(Intent(this, FloatingWindowService::class.java)) - stopSelf() - } - - fun checkMediaPermission(): Boolean { - Handler(Looper.getMainLooper()).post { - MainActivity.flutterMethodChannel?.invokeMethod( - "on_state_changed", - mapOf("name" to "media", "value" to isReady.toString()) - ) - } - Handler(Looper.getMainLooper()).post { - MainActivity.flutterMethodChannel?.invokeMethod( - "on_state_changed", - mapOf("name" to "input", "value" to InputService.isOpen.toString()) - ) - } - return isReady - } - - private fun startRawVideoRecorder(mp: MediaProjection) { - Log.d(logTag, "startRawVideoRecorder,screen info:$SCREEN_INFO") - if (surface == null) { - Log.d(logTag, "startRawVideoRecorder failed,surface is null") - return - } - createOrSetVirtualDisplay(mp, surface!!) - } - - private fun startVP9VideoRecorder(mp: MediaProjection) { - createMediaCodec() - videoEncoder?.let { - surface = it.createInputSurface() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - surface!!.setFrameRate(1F, FRAME_RATE_COMPATIBILITY_DEFAULT) - } - it.setCallback(cb) - it.start() - createOrSetVirtualDisplay(mp, surface!!) - } - } - - // https://github.com/bk138/droidVNC-NG/blob/b79af62db5a1c08ed94e6a91464859ffed6f4e97/app/src/main/java/net/christianbeier/droidvnc_ng/MediaProjectionService.java#L250 - // Reuse virtualDisplay if it exists, to avoid media projection confirmation dialog every connection. - private fun createOrSetVirtualDisplay(mp: MediaProjection, s: Surface) { - try { - virtualDisplay?.let { - it.resize(SCREEN_INFO.width, SCREEN_INFO.height, SCREEN_INFO.dpi) - it.setSurface(s) - } ?: let { - virtualDisplay = mp.createVirtualDisplay( - "RustDeskVD", - SCREEN_INFO.width, SCREEN_INFO.height, SCREEN_INFO.dpi, VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, - s, null, null - ) - } - } catch (e: SecurityException) { - Log.w(logTag, "createOrSetVirtualDisplay: got SecurityException, re-requesting confirmation"); - // This initiates a prompt dialog for the user to confirm screen projection. - requestMediaProjection() - } - } - - private val cb: MediaCodec.Callback = object : MediaCodec.Callback() { - override fun onInputBufferAvailable(codec: MediaCodec, index: Int) {} - override fun onOutputFormatChanged(codec: MediaCodec, format: MediaFormat) {} - - override fun onOutputBufferAvailable( - codec: MediaCodec, - index: Int, - info: MediaCodec.BufferInfo - ) { - codec.getOutputBuffer(index)?.let { buf -> - sendVP9Thread.execute { - val byteArray = ByteArray(buf.limit()) - buf.get(byteArray) - // sendVp9(byteArray) - codec.releaseOutputBuffer(index, false) - } - } - } - - override fun onError(codec: MediaCodec, e: MediaCodec.CodecException) { - Log.e(logTag, "MediaCodec.Callback error:$e") - } - } - - private fun createMediaCodec() { - Log.d(logTag, "MediaFormat.MIMETYPE_VIDEO_VP9 :$MIME_TYPE") - videoEncoder = MediaCodec.createEncoderByType(MIME_TYPE) - val mFormat = - MediaFormat.createVideoFormat(MIME_TYPE, SCREEN_INFO.width, SCREEN_INFO.height) - mFormat.setInteger(MediaFormat.KEY_BIT_RATE, VIDEO_KEY_BIT_RATE) - mFormat.setInteger(MediaFormat.KEY_FRAME_RATE, VIDEO_KEY_FRAME_RATE) - mFormat.setInteger( - MediaFormat.KEY_COLOR_FORMAT, - MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible - ) - mFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5) - try { - videoEncoder!!.configure(mFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE) - } catch (e: Exception) { - Log.e(logTag, "mEncoder.configure fail!") - } - } - - private fun initNotification() { - notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - notificationChannel = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val channelId = "RustDesk" - val channelName = "RustDesk Service" - val channel = NotificationChannel( - channelId, - channelName, NotificationManager.IMPORTANCE_HIGH - ).apply { - description = "RustDesk Service Channel" - } - channel.lightColor = Color.BLUE - channel.lockscreenVisibility = Notification.VISIBILITY_PRIVATE - notificationManager.createNotificationChannel(channel) - channelId - } else { - "" - } - notificationBuilder = NotificationCompat.Builder(this, notificationChannel) - } - - @SuppressLint("UnspecifiedImmutableFlag") - private fun createForegroundNotification() { - val intent = Intent(this, MainActivity::class.java).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED - action = Intent.ACTION_MAIN - addCategory(Intent.CATEGORY_LAUNCHER) - putExtra("type", type) - } - val pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - PendingIntent.getActivity(this, 0, intent, FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE) - } else { - PendingIntent.getActivity(this, 0, intent, FLAG_UPDATE_CURRENT) - } - val notification = notificationBuilder - .setOngoing(true) - .setSmallIcon(R.mipmap.ic_stat_logo) - .setDefaults(Notification.DEFAULT_ALL) - .setAutoCancel(true) - .setPriority(NotificationCompat.PRIORITY_DEFAULT) - .setContentTitle(DEFAULT_NOTIFY_TITLE) - .setContentText(translate(DEFAULT_NOTIFY_TEXT)) - .setOnlyAlertOnce(true) - .setContentIntent(pendingIntent) - .setColor(ContextCompat.getColor(this, R.color.primary)) - .setWhen(System.currentTimeMillis()) - .build() - startForeground(DEFAULT_NOTIFY_ID, notification) - } - - private fun loginRequestNotification( - clientID: Int, - type: String, - username: String, - peerId: String - ) { - val notification = notificationBuilder - .setOngoing(false) - .setPriority(NotificationCompat.PRIORITY_MAX) - .setContentTitle(translate("Do you accept?")) - .setContentText("$type:$username-$peerId") - // .setStyle(MediaStyle().setShowActionsInCompactView(0, 1)) - // .addAction(R.drawable.check_blue, "check", genLoginRequestPendingIntent(true)) - // .addAction(R.drawable.close_red, "close", genLoginRequestPendingIntent(false)) - .build() - notificationManager.notify(getClientNotifyID(clientID), notification) - } - - private fun onClientAuthorizedNotification( - clientID: Int, - type: String, - username: String, - peerId: String - ) { - cancelNotification(clientID) - val notification = notificationBuilder - .setOngoing(false) - .setPriority(NotificationCompat.PRIORITY_MAX) - .setContentTitle("$type ${translate("Established")}") - .setContentText("$username - $peerId") - .build() - notificationManager.notify(getClientNotifyID(clientID), notification) - } - - private fun voiceCallRequestNotification( - clientID: Int, - type: String, - username: String, - peerId: String - ) { - val notification = notificationBuilder - .setOngoing(false) - .setPriority(NotificationCompat.PRIORITY_MAX) - .setContentTitle(translate("Do you accept?")) - .setContentText("$type:$username-$peerId") - .build() - notificationManager.notify(getClientNotifyID(clientID), notification) - } - - private fun getClientNotifyID(clientID: Int): Int { - return clientID + NOTIFY_ID_OFFSET - } - - fun cancelNotification(clientID: Int) { - notificationManager.cancel(getClientNotifyID(clientID)) - } - - @SuppressLint("UnspecifiedImmutableFlag") - private fun genLoginRequestPendingIntent(res: Boolean): PendingIntent { - val intent = Intent(this, MainService::class.java).apply { - action = ACT_LOGIN_REQ_NOTIFY - putExtra(EXT_LOGIN_REQ_NOTIFY, res) - } - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - PendingIntent.getService(this, 111, intent, FLAG_IMMUTABLE) - } else { - PendingIntent.getService(this, 111, intent, FLAG_UPDATE_CURRENT) - } - } - - private fun setTextNotification(_title: String?, _text: String?) { - val title = _title ?: DEFAULT_NOTIFY_TITLE - val text = _text ?: translate(DEFAULT_NOTIFY_TEXT) - val notification = notificationBuilder - .clearActions() - .setStyle(null) - .setContentTitle(title) - .setContentText(text) - .build() - notificationManager.notify(DEFAULT_NOTIFY_ID, notification) - } -} diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/PermissionRequestTransparentActivity.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/PermissionRequestTransparentActivity.kt deleted file mode 100644 index 3beb7ec..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/PermissionRequestTransparentActivity.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.carriez.flutter_hbb - -import android.app.Activity -import android.content.Intent -import android.media.projection.MediaProjectionManager -import android.os.Build -import android.os.Bundle -import android.util.Log - -class PermissionRequestTransparentActivity: Activity() { - private val logTag = "permissionRequest" - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - Log.d(logTag, "onCreate PermissionRequestTransparentActivity: intent.action: ${intent.action}") - - when (intent.action) { - ACT_REQUEST_MEDIA_PROJECTION -> { - val mediaProjectionManager = - getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager - val intent = mediaProjectionManager.createScreenCaptureIntent() - startActivityForResult(intent, REQ_REQUEST_MEDIA_PROJECTION) - } - else -> finish() - } - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQ_REQUEST_MEDIA_PROJECTION) { - if (resultCode == RESULT_OK && data != null) { - launchService(data) - } else { - setResult(RES_FAILED) - } - } - - finish() - } - - private fun launchService(mediaProjectionResultIntent: Intent) { - Log.d(logTag, "Launch MainService") - val serviceIntent = Intent(this, MainService::class.java) - serviceIntent.action = ACT_INIT_MEDIA_PROJECTION_AND_SERVICE - serviceIntent.putExtra(EXT_MEDIA_PROJECTION_RES_INTENT, mediaProjectionResultIntent) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - startForegroundService(serviceIntent) - } else { - startService(serviceIntent) - } - } - -} \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/RdClipboardManager.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/RdClipboardManager.kt deleted file mode 100644 index 8c9d850..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/RdClipboardManager.kt +++ /dev/null @@ -1,197 +0,0 @@ -package com.carriez.flutter_hbb - -import java.nio.ByteBuffer -import java.util.Timer -import java.util.TimerTask - -import android.content.ClipData -import android.content.ClipDescription -import android.content.ClipboardManager -import android.util.Log -import androidx.annotation.Keep - -import hbb.MessageOuterClass.ClipboardFormat -import hbb.MessageOuterClass.Clipboard -import hbb.MessageOuterClass.MultiClipboards - -import ffi.FFI - -class RdClipboardManager(private val clipboardManager: ClipboardManager) { - private val logTag = "RdClipboardManager" - private val supportedMimeTypes = arrayOf( - ClipDescription.MIMETYPE_TEXT_PLAIN, - ClipDescription.MIMETYPE_TEXT_HTML - ) - - // 1. Avoid listening to the same clipboard data updated by `rustUpdateClipboard`. - // 2. Avoid sending the clipboard data before enabling client clipboard. - // 1) Disable clipboard - // 2) Copy text "a" - // 3) Enable clipboard - // 4) Switch to another app - // 5) Switch back to the app - // 6) "a" should not be sent to the client, because it's copied before enabling clipboard - // - // It's okay to that `rustEnableClientClipboard(false)` is called after `rustUpdateClipboard`, - // though the `lastUpdatedClipData` will be set to null once. - private var lastUpdatedClipData: ClipData? = null - private var isClientEnabled = true; - private var _isCaptureStarted = false; - - val isCaptureStarted: Boolean - get() = _isCaptureStarted - - fun checkPrimaryClip(isClient: Boolean) { - val clipData = clipboardManager.primaryClip - if (clipData != null && clipData.itemCount > 0) { - // Only handle the first item in the clipboard for now. - val clip = clipData.getItemAt(0) - // Ignore the `isClipboardDataEqual()` check if it's a host operation. - // Because it's an action manually triggered by the user. - if (isClient) { - if (lastUpdatedClipData != null && isClipboardDataEqual(clipData, lastUpdatedClipData!!)) { - Log.d(logTag, "Clipboard data is the same as last update, ignore") - return - } - } - val mimeTypeCount = clipData.description.getMimeTypeCount() - val mimeTypes = mutableListOf() - for (i in 0 until mimeTypeCount) { - mimeTypes.add(clipData.description.getMimeType(i)) - } - var text: CharSequence? = null; - var html: String? = null; - if (isSupportedMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) { - text = clip?.text - } - if (isSupportedMimeType(ClipDescription.MIMETYPE_TEXT_HTML)) { - text = clip?.text - html = clip?.htmlText - } - var count = 0 - val clips = MultiClipboards.newBuilder() - if (text != null) { - val content = com.google.protobuf.ByteString.copyFromUtf8(text.toString()) - clips.addClipboards(Clipboard.newBuilder().setFormat(ClipboardFormat.Text).setContent(content).build()) - count++ - } - if (html != null) { - val content = com.google.protobuf.ByteString.copyFromUtf8(html) - clips.addClipboards(Clipboard.newBuilder().setFormat(ClipboardFormat.Html).setContent(content).build()) - count++ - } - if (count > 0) { - val clipsBytes = clips.build().toByteArray() - val isClientFlag = if (isClient) 1 else 0 - val clipsBuf = ByteBuffer.allocateDirect(clipsBytes.size + 1).apply { - put(isClientFlag.toByte()) - put(clipsBytes) - } - clipsBuf.flip() - lastUpdatedClipData = clipData - Log.d(logTag, "${if (isClient) "client" else "host"}, send clipboard data to the remote") - FFI.onClipboardUpdate(clipsBuf) - } - } - } - - private fun isSupportedMimeType(mimeType: String): Boolean { - return supportedMimeTypes.contains(mimeType) - } - - private fun isClipboardDataEqual(left: ClipData, right: ClipData): Boolean { - if (left.description.getMimeTypeCount() != right.description.getMimeTypeCount()) { - return false - } - val mimeTypeCount = left.description.getMimeTypeCount() - for (i in 0 until mimeTypeCount) { - if (left.description.getMimeType(i) != right.description.getMimeType(i)) { - return false - } - } - - if (left.itemCount != right.itemCount) { - return false - } - for (i in 0 until left.itemCount) { - val mimeType = left.description.getMimeType(i) - if (!isSupportedMimeType(mimeType)) { - continue - } - val leftItem = left.getItemAt(i) - val rightItem = right.getItemAt(i) - if (mimeType == ClipDescription.MIMETYPE_TEXT_PLAIN || mimeType == ClipDescription.MIMETYPE_TEXT_HTML) { - if (leftItem.text != rightItem.text || leftItem.htmlText != rightItem.htmlText) { - return false - } - } - } - return true - } - - fun setCaptureStarted(started: Boolean) { - _isCaptureStarted = started - } - - @Keep - fun rustEnableClientClipboard(enable: Boolean) { - Log.d(logTag, "rustEnableClientClipboard: enable: $enable") - isClientEnabled = enable - lastUpdatedClipData = null - } - - fun syncClipboard(isClient: Boolean) { - Log.d(logTag, "syncClipboard: isClient: $isClient, isClientEnabled: $isClientEnabled") - if (isClient && !isClientEnabled) { - return - } - checkPrimaryClip(isClient) - } - - @Keep - fun rustUpdateClipboard(clips: ByteArray) { - val clips = MultiClipboards.parseFrom(clips) - var mimeTypes = mutableListOf() - var text: String? = null - var html: String? = null - for (clip in clips.getClipboardsList()) { - when (clip.format) { - ClipboardFormat.Text -> { - mimeTypes.add(ClipDescription.MIMETYPE_TEXT_PLAIN) - text = String(clip.content.toByteArray(), Charsets.UTF_8) - } - ClipboardFormat.Html -> { - mimeTypes.add(ClipDescription.MIMETYPE_TEXT_HTML) - html = String(clip.content.toByteArray(), Charsets.UTF_8) - } - ClipboardFormat.ImageRgba -> { - } - ClipboardFormat.ImagePng -> { - } - else -> { - Log.e(logTag, "Unsupported clipboard format: ${clip.format}") - } - } - } - - val clipDescription = ClipDescription("clipboard", mimeTypes.toTypedArray()) - var item: ClipData.Item? = null - if (text == null) { - Log.e(logTag, "No text content in clipboard") - return - } else { - if (html == null) { - item = ClipData.Item(text) - } else { - item = ClipData.Item(text, html) - } - } - if (item == null) { - Log.e(logTag, "No item in clipboard") - return - } - val clipData = ClipData(clipDescription, item) - lastUpdatedClipData = clipData - clipboardManager.setPrimaryClip(clipData) - } -} diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/VolumeController.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/VolumeController.kt deleted file mode 100644 index be30b65..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/VolumeController.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.carriez.flutter_hbb - -// Inspired by https://github.com/yosemiteyss/flutter_volume_controller/blob/main/android/src/main/kotlin/com/yosemiteyss/flutter_volume_controller/VolumeController.kt - -import android.media.AudioManager -import android.os.Build -import android.util.Log - -class VolumeController(private val audioManager: AudioManager) { - private val logTag = "volume controller" - - fun getVolume(streamType: Int): Double { - val current = audioManager.getStreamVolume(streamType) - val max = audioManager.getStreamMaxVolume(streamType) - return current.toDouble() / max - } - - fun setVolume(volume: Double, showSystemUI: Boolean, streamType: Int) { - val max = audioManager.getStreamMaxVolume(streamType) - audioManager.setStreamVolume( - streamType, - (max * volume).toInt(), - if (showSystemUI) AudioManager.FLAG_SHOW_UI else 0 - ) - } - - fun raiseVolume(step: Double?, showSystemUI: Boolean, streamType: Int) { - if (step == null) { - audioManager.adjustStreamVolume( - streamType, - AudioManager.ADJUST_RAISE, - if (showSystemUI) AudioManager.FLAG_SHOW_UI else 0 - ) - } else { - val target = getVolume(streamType) + step - setVolume(target, showSystemUI, streamType) - } - } - - fun lowerVolume(step: Double?, showSystemUI: Boolean, streamType: Int) { - if (step == null) { - audioManager.adjustStreamVolume( - streamType, - AudioManager.ADJUST_LOWER, - if (showSystemUI) AudioManager.FLAG_SHOW_UI else 0 - ) - } else { - val target = getVolume(streamType) - step - setVolume(target, showSystemUI, streamType) - } - } - - fun getMute(streamType: Int): Boolean { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - audioManager.isStreamMute(streamType) - } else { - audioManager.getStreamVolume(streamType) == 0 - } - } - - private fun setMute(isMuted: Boolean, showSystemUI: Boolean, streamType: Int) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - audioManager.adjustStreamVolume( - streamType, - if (isMuted) AudioManager.ADJUST_MUTE else AudioManager.ADJUST_UNMUTE, - if (showSystemUI) AudioManager.FLAG_SHOW_UI else 0 - ) - } else { - audioManager.setStreamMute(streamType, isMuted) - } - } - - fun toggleMute(showSystemUI: Boolean, streamType: Int) { - val isMuted = getMute(streamType) - setMute(!isMuted, showSystemUI, streamType) - } -} - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/common.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/common.kt deleted file mode 100644 index 514d493..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/common.kt +++ /dev/null @@ -1,157 +0,0 @@ -package com.carriez.flutter_hbb - -import android.Manifest.permission.* -import android.annotation.SuppressLint -import android.content.Context -import android.content.Intent -import android.media.AudioRecord -import android.media.AudioRecord.READ_BLOCKING -import android.media.MediaCodecList -import android.media.MediaFormat -import android.net.Uri -import android.os.Build -import android.os.Handler -import android.os.Looper -import android.os.PowerManager -import android.provider.Settings -import android.provider.Settings.* -import android.util.DisplayMetrics -import android.util.Log -import android.view.WindowManager -import androidx.annotation.RequiresApi -import androidx.core.content.ContextCompat.getSystemService -import com.hjq.permissions.Permission -import com.hjq.permissions.XXPermissions -import ffi.FFI -import java.nio.ByteBuffer -import java.util.* - - -// intent action, extra -const val ACT_REQUEST_MEDIA_PROJECTION = "REQUEST_MEDIA_PROJECTION" -const val ACT_INIT_MEDIA_PROJECTION_AND_SERVICE = "INIT_MEDIA_PROJECTION_AND_SERVICE" -const val ACT_LOGIN_REQ_NOTIFY = "LOGIN_REQ_NOTIFY" -const val EXT_INIT_FROM_BOOT = "EXT_INIT_FROM_BOOT" -const val EXT_MEDIA_PROJECTION_RES_INTENT = "MEDIA_PROJECTION_RES_INTENT" -const val EXT_LOGIN_REQ_NOTIFY = "LOGIN_REQ_NOTIFY" - -// Activity requestCode -const val REQ_INVOKE_PERMISSION_ACTIVITY_MEDIA_PROJECTION = 101 -const val REQ_REQUEST_MEDIA_PROJECTION = 201 - -// Activity responseCode -const val RES_FAILED = -100 - -// Flutter channel -const val START_ACTION = "start_action" -const val GET_START_ON_BOOT_OPT = "get_start_on_boot_opt" -const val SET_START_ON_BOOT_OPT = "set_start_on_boot_opt" -const val SYNC_APP_DIR_CONFIG_PATH = "sync_app_dir" -const val GET_VALUE = "get_value" - -const val KEY_IS_SUPPORT_VOICE_CALL = "KEY_IS_SUPPORT_VOICE_CALL" - -const val KEY_SHARED_PREFERENCES = "KEY_SHARED_PREFERENCES" -const val KEY_START_ON_BOOT_OPT = "KEY_START_ON_BOOT_OPT" -const val KEY_APP_DIR_CONFIG_PATH = "KEY_APP_DIR_CONFIG_PATH" - -@SuppressLint("ConstantLocale") -val LOCAL_NAME = Locale.getDefault().toString() -val SCREEN_INFO = Info(0, 0, 1, 200) - -data class Info( - var width: Int, var height: Int, var scale: Int, var dpi: Int -) - -fun isSupportVoiceCall(): Boolean { - // https://developer.android.com/reference/android/media/MediaRecorder.AudioSource#VOICE_COMMUNICATION - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -} - -fun requestPermission(context: Context, type: String) { - XXPermissions.with(context) - .permission(type) - .request { _, all -> - if (all) { - Handler(Looper.getMainLooper()).post { - MainActivity.flutterMethodChannel?.invokeMethod( - "on_android_permission_result", - mapOf("type" to type, "result" to all) - ) - } - } - } -} - -fun startAction(context: Context, action: String) { - try { - context.startActivity(Intent(action).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - // don't pass package name when launch ACTION_ACCESSIBILITY_SETTINGS - if (ACTION_ACCESSIBILITY_SETTINGS != action) { - data = Uri.parse("package:" + context.packageName) - } - }) - } catch (e: Exception) { - e.printStackTrace() - } -} - -class AudioReader(val bufSize: Int, private val maxFrames: Int) { - private var currentPos = 0 - private val bufferPool: Array - - init { - if (maxFrames < 0 || maxFrames > 32) { - throw Exception("Out of bounds") - } - if (bufSize <= 0) { - throw Exception("Wrong bufSize") - } - bufferPool = Array(maxFrames) { - ByteBuffer.allocateDirect(bufSize) - } - } - - private fun next() { - currentPos++ - if (currentPos >= maxFrames) { - currentPos = 0 - } - } - - @RequiresApi(Build.VERSION_CODES.M) - fun readSync(audioRecord: AudioRecord): ByteBuffer? { - val buffer = bufferPool[currentPos] - val res = audioRecord.read(buffer, bufSize, READ_BLOCKING) - return if (res > 0) { - next() - buffer - } else { - null - } - } -} - - -fun getScreenSize(windowManager: WindowManager) : Pair{ - var w = 0 - var h = 0 - @Suppress("DEPRECATION") - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - val m = windowManager.maximumWindowMetrics - w = m.bounds.width() - h = m.bounds.height() - } else { - val dm = DisplayMetrics() - windowManager.defaultDisplay.getRealMetrics(dm) - w = dm.widthPixels - h = dm.heightPixels - } - return Pair(w, h) -} - - fun translate(input: String): String { - Log.d("common", "translate:$LOCAL_NAME") - return FFI.translateLocale(LOCAL_NAME, input) -} \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/ffi.kt b/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/ffi.kt deleted file mode 100644 index e3c9d98..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/kotlin/ffi.kt +++ /dev/null @@ -1,30 +0,0 @@ -// ffi.kt - -package ffi - -import android.content.Context -import java.nio.ByteBuffer - -import com.carriez.flutter_hbb.RdClipboardManager - -object FFI { - init { - System.loadLibrary("rustdesk") - } - - external fun init(ctx: Context) - external fun onAppStart(ctx: Context) - external fun setClipboardManager(clipboardManager: RdClipboardManager) - external fun startServer(app_dir: String, custom_client_config: String) - external fun startService() - external fun onVideoFrameUpdate(buf: ByteBuffer) - external fun onAudioFrameUpdate(buf: ByteBuffer) - external fun translateLocale(localeName: String, input: String): String - external fun refreshScreen() - external fun setFrameRawEnable(name: String, value: Boolean) - external fun setCodecInfo(info: String) - external fun getLocalOption(key: String): String - external fun getBuildinOption(key: String): String - external fun onClipboardUpdate(clips: ByteBuffer) - external fun isServiceClipboardEnabled(): Boolean -} diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable-v21/launch_background.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100644 index f74085f..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/check_blue.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/check_blue.xml deleted file mode 100644 index b06974b..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/check_blue.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/close_red.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/close_red.xml deleted file mode 100644 index 02ff2c8..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/close_red.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/floating_window.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/floating_window.xml deleted file mode 100644 index d22152d..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/floating_window.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/launch_background.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 65291b9..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 65291b9..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values-night/styles.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values-night/styles.xml deleted file mode 100644 index 449a9f9..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/colors.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/colors.xml deleted file mode 100644 index 2734689..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #FF0071FF - \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/ic_launcher_background.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/ic_launcher_background.xml deleted file mode 100644 index ab98328..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #ffffff - \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/strings.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 3e058a8..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - RustDesk - Allow other devices to control your phone using virtual touch, when RustDesk screen sharing is established - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/styles.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 146267c..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/xml/accessibility_service_config.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/xml/accessibility_service_config.xml deleted file mode 100644 index 90b57cd..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/main/res/xml/accessibility_service_config.xml +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/shelled/rustdesk-as-ref/flutter/android/app/src/profile/AndroidManifest.xml b/shelled/rustdesk-as-ref/flutter/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 64d68a5..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/shelled/rustdesk-as-ref/flutter/android/build.gradle b/shelled/rustdesk-as-ref/flutter/android/build.gradle deleted file mode 100644 index 401bea0..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -allprojects { - repositories { - google() - jcenter() - maven { url 'https://jitpack.io' } - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/shelled/rustdesk-as-ref/flutter/android/gradle.properties b/shelled/rustdesk-as-ref/flutter/android/gradle.properties deleted file mode 100644 index 804b29b..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -org.gradle.jvmargs=-Xmx1024M -android.useAndroidX=true -android.enableJetifier=true -org.gradle.daemon=false diff --git a/shelled/rustdesk-as-ref/flutter/android/gradle/wrapper/gradle-wrapper.properties b/shelled/rustdesk-as-ref/flutter/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index cb57630..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Fri Jun 23 08:50:38 CEST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-all.zip diff --git a/shelled/rustdesk-as-ref/flutter/android/settings.gradle b/shelled/rustdesk-as-ref/flutter/android/settings.gradle deleted file mode 100644 index ae32fa0..0000000 --- a/shelled/rustdesk-as-ref/flutter/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "7.3.1" apply false - id "org.jetbrains.kotlin.android" version "2.1.21" apply false -} - -include ":app" diff --git a/shelled/rustdesk-as-ref/flutter/assets/address_book.ttf b/shelled/rustdesk-as-ref/flutter/assets/address_book.ttf deleted file mode 100644 index 509fb63c09da8c63d47908d675ecfca1f703d948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1792 zcmd^9T~8cU7=F%~VL`wOmV%&JhL2q$g<064lvIR5Es*%ZM-eqK%CI}TP3gpOxr7Zp_lc_06u5-tRJ-hz%z5+^Ssadao+RJ z$v^;TK@|qZ7B9U%Z+(!s4u~nT>&ur?>FKVepQwLGeKS*Z%MXUX`hxmH&T_u6m;3q4 z)lUJVK>NdO&&>|r-guArKIh~%iN?FeP2z7j2e*siwI%|_{!Y`)r!~nVW#jm;FjO{N@sEvF~Z01Zy{{M^(ISQl%FIBk+%q5kvOn zw{C2{`_%LwXsP+$|N53XBWml>JrhQPY7?XmR+%K$&=Bd0ZRP_UMS5+gW{hD5@}-4W z)^VcXh9&fa`Oz}ev~D<<#S&I&9_SzF>pvk* zwRgmY)7SZeNY98f?Gv^T6O(6cab{vhq~qdLN31cDbWS!mRV9Unft zVXrtbQEGHnMh6^c(Q%By_(c5R6O|%yJ}Fbl^NEA&%hhgJ!+yhJ0O)z~24udzuy ztZ@VXQfZB2+6OWRCfH5HExg9 zsYS2k1@$zQtNC;o=B!-c7p(>6^9lvuDhK{$FB96^VOTzwN~wJmZ)f}>E+Bvh7a?U9 z7PhcQxq}RRl#q*L_=vtn?>w%cz{ubc>+$FfdIzY`Pvx{Q4x7Ke<6evODn*{htEu2B zcT2OzkQG^+0W%ee7Ib|cD=83L{D8`KnRznwwy_;Wm2nO!KK1j|{q5+SMfG#64fT(H X+>k;F1Fdd08+et<=$7yAD!0D?EMoMM diff --git a/shelled/rustdesk-as-ref/flutter/assets/device_group.ttf b/shelled/rustdesk-as-ref/flutter/assets/device_group.ttf deleted file mode 100644 index a6e42704f06e15332067635d9ce5521b90ce46ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2012 zcmd^ATW=dh6h1TSOJX}|ZO0C7op^1xPTDkf;#;bchCpeOA`rA`B8m`+>#Q%8?X{du zl^`B0kPxUyARa0q@x}{~2QDwD5)Tmq6;y;`~c4G z%=ykY=bV{2yR%D-h@8|UiN?0=q!9R_>)$@xTb^6+D$uwR3{oUi8UTw{q~yJ0HXM23ocR!oDqi4*V(FzEV|NcTEEk`xTw5 zqULjSk-kBE6LwcMw_ay%+Q9e&u;p5=s_cGe@R&rX6_L%F7OK$E@Dw{}?*VmU0{!2`WfWl8ECZ@?Gum#V zvO9C__UF4M&H$c3>x#6Ew=hj}v`iILGC9aX%ook1V+j_H*z7)c*cTRD*cbJseBnqe zoqdR$71v=1uzBAe~L| zFXU{5v#C(O{q7I_QHfpBXZfJt&R&?B(r@&5b~&wY-40E_C6to8`Ssv<5cfv|V?qr@ zgF{2XcSRR**dMk#p6PbEx=)IZ|2CKob&rnrM-ka?*S|aAlQ}zj=7c}k$JrSSI#@k4 z5teq4N52pp8$e371|xPLsJ|H;9uBfv@IaT#rJrfOPW?cl1PYo1Ru|?f+P~~m@GjCCj!F*k|K+_1?*^^HPvn$ooZ|R=-y1axubSa`?`l@* zJZ4K`jT%-YqcxDJ3N&M`Pr*tmz%m}77(0hNd3eXEWJJ~J2qkcJ_S5l?8~d!b|1#nY m6aSg}iNrXQn1y;!v-+B*H0mX_rg%Hnl3^|t$`yP(Ab$W9?kvs# diff --git a/shelled/rustdesk-as-ref/flutter/assets/gestures.ttf b/shelled/rustdesk-as-ref/flutter/assets/gestures.ttf deleted file mode 100644 index aabec8ac9e67bc0c79be3b4b15224c8c99ed5b16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8068 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 SGqS@yzjhhsItH@r=l?f2e3H@t diff --git a/shelled/rustdesk-as-ref/flutter/assets/more.ttf b/shelled/rustdesk-as-ref/flutter/assets/more.ttf deleted file mode 100644 index 3b01435df3ac47b3db64ea4196935c064dae987b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1620 zcmd^9Jx>%t7=C7VIc^U{0*N9T*$_k{&Y;3J8G+J1gSlAdFdt+kINCE|xQVKq^I~P&-2fmki=Xsy^W8Rsa8wdbRs6ofT z*u>Ns>)z3ufH*~V^72G~ZurQB&$RE;zMl8&%G%)T_q2a)SZ(PEl_xj(4VZjiTeT-thpD&^UW6|onc^taQteA{zc zo({jHpZQv;5>z9CDZ=flOUDqVhsc0AsV>wUF{>e2gxkfkrT|+(4dpuMXnUj7w~S?Ts7nKfc^zFhW&jS znp{w|#5MTEfxd(ilPdNSS((+xnY$%#pev4HYrv|x#r-FmcCrHq+5i78d*TB)td1c* zD|u41ldmA}d5rW2ylJgKThEBd9Wcd+=oCjpqi7b#YH88hVTvg+k#5iErrx;u$UKzM zvSvqXdh?d3k! zso#Vikv|(ccH|VSnI&sBANa+7hquqOVqQ-BY=-$ ztfL+FIHOCLhs(@xhxgy?X-0>rGEUaCFvy2(U`N&%qx?AX-)^c{;A%Pc7_lRZBV;9y zXjJv*uoIWq;s=zzIo8QDI*W3gRlyMY`K#}z9-oc(>B)yD5&8b@CYsQM4#NvV`G(>* D@=?y^ diff --git a/shelled/rustdesk-as-ref/flutter/assets/peer_searchbar.ttf b/shelled/rustdesk-as-ref/flutter/assets/peer_searchbar.ttf deleted file mode 100644 index 7f87e48ce40bbffe890bb21bcbbcab31e0004f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1940 zcmd^A&2Jk;6o0e3UI*Ja33Z&dNX}vr8>N+#SgsSb!3|Af%N61y4G|I%&c7T$@GxK}D z_j_;N%+9Wf5s{Z#B+^Lc!b|6r4+dW+V&h=vp1&|0pSYU+3igMv7xOi>QAvN_2m3Gd zcS_aO;tzcp=*4$o7s{Gicw*(7Poceyo-BiK?}%>$UqgSgTr)5E_#$tAVyoSv1=Cx?qy&Y$qp+?#6Bh$mU~b57Tibn z%zmdhL!>}1yBfIu+g>Qn6zImm*1;X?JV^YRT2SyB?>B)jXmy*%I@az^+BAFB(Z39q zD^6m@j=@X7gep-U34E0{PN6fy!*{^%g7bBwXDUkHSRcuGh_SU4JqMiOJmv1GhI*dGkIWw$JjB@>Zw zH;YEXa$tbDSP+wMO9J>SgQQX;Xm_WqihNT_Q^w@1%pH?kR9hY%Yc8`^ev z2Ubt1&~@ae_(?xTJO7^g5!n2m^RbJLI9MPzJ?>x;eAvMf@Q{OD_+rK#EQ7bcM9AZz z6Ex%SUSw?WH%WQ~o(R3^V20;=*}($&>8gW8@LxMv0{+p#E(+3b4wk{+b+Cu#*`p5j zQiSEF3{5q)g0i%#RPuVgsMpQTJgb$KtE$m4JM+9|G%I>t8I6r}sEk(Ej82;7N-1ud zMWtxyH6@LFTD7Vx4MV@E<;_^xG#jUfhxt03kLC3mO_4zwsbpd-kU~qeim^g@(y5MX z&PVehdlu>vEmIYd#zWr2(eqFn)P#;_Q)rZ8xMYV_8K~-(@^CdxTES{@)M26`1>HcV z8c^D)PeUbDURX5$xTf)@?}f-58n?m_y7O^ diff --git a/shelled/rustdesk-as-ref/flutter/assets/tabbar.ttf b/shelled/rustdesk-as-ref/flutter/assets/tabbar.ttf deleted file mode 100644 index a9220f348fb303a4c064717c2b0543a5a05a44ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2288 zcmd^BOK%%h6h3#xk9gcXoN?U5DPP zz2AA<^SbjeF(UF)l|&kwzqE8#xz>M`h&=`A;tQ8X6VtsHfZ6-tUrQHLr3*j3vq2=Z zK(?JNY_3$V&4!4?KOl?c)Kn&--S`u>4?t5n2)y^jcY(hK#d1Ys;}`(;{*LKbK~JaH zkHQ)3e*nItnA#|@AWcBu4PMbwMYZF`^lc(f5dO0zy<&WN^Vcj<%Nx+YPRL!XHmdZp z3oH?4Ud{gDwIq-}85@7))%NMX$Zy;JGWf+m+|XVd_go|ngKZ(f+0H$AX%KzkgG(h` zL=DbjaJ@uhbcTdy=N1;Jt&lP_3iBka!S(wwE9A2&__ud5=(v_a!pP%DT`poDk{jXP z6TXA&1AApVlwjB?klW4%s)xsmE9WzG$Ml#vs~;r(OjTI$9QKC510F_DA+A;JN!yIQ z>FnQtlzTdf6&--wMGN4MSlx1&UejluFf(SZf!-j8eH^Up!C>9yTs#RkYGx=1^)O!j z|9u>>8t{_S26V)9h##2gwTYjQ>9dL7Gv*1K`01D#oA{k-=4`S~le;`kIr@aYVZ=IZ znfS5r7M}W}6h;3deFMp$^U=hd=x1ZDU8gE{4#>E`$z50{y6>3nid`C?Yu!9T%5t zi^A>NLU%OUEqvJ%jrIuJwI$)!OtfcDXgz6-d*Us;bwrYB;PKv0!TS?zVlonlc1_p; zggdouVYv2vxW7Lvj9~tV;~8OS=4?0?6K0?tn&}Vk8GIfK&puPzh79I0r(fG_3vV}) zaq7`XU-CI|Rbi2TuSeL{>@4qUC*8L#fn|`@Wy~$$Y%E}ZuY*O%`yA{79&)f7_gKQg z9>|||utdXj-obu&ETIR?g*zL4c-z5@I_NV83wU#Ut{KhsqMBVRq{>aUxh|{aN?zBL@%UI%G_PuE zx#^~|o=q6Win3DHi^?4QsfB{Bl*;<5nl|D&!zi5|9p!PjJf7BzbdJiTQi=@B8B*vn zZDP(-nsm}=#hQ&r_=~X4(i#=8v;2tm;O=Eum#G3f?o*+0isN&2&}tr5nq_$~n+mNX zS^_y5$VdT|;i(8T=j5j%lLD}U1LV3@_({V$j@J#}Rl&2 - return 1 - esac - - echo "*** [$ANDROID_ABI][Start] Build and install vcpkg dependencies" - pushd "$SCRIPTDIR/.." - $VCPKG_ROOT/vcpkg install --triplet $VCPKG_TARGET --x-install-root="$VCPKG_ROOT/installed" - popd - head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-$VCPKG_TARGET-rel-out.log" || true - echo "*** [$ANDROID_ABI][Finished] Build and install vcpkg dependencies" - -if [ -d "$VCPKG_ROOT/installed/arm-neon-android" ]; then - echo "*** [Start] Move arm-neon-android to arm-android" - - mv "$VCPKG_ROOT/installed/arm-neon-android" "$VCPKG_ROOT/installed/arm-android" - - echo "*** [Finished] Move arm-neon-android to arm-android" -fi -} - -if [ ! -z "$ANDROID_ABI" ]; then - build "$ANDROID_ABI" -else - echo "Usage: build-android-deps.sh " >&2 - exit 1 -fi diff --git a/shelled/rustdesk-as-ref/flutter/build_fdroid.sh b/shelled/rustdesk-as-ref/flutter/build_fdroid.sh deleted file mode 100644 index d50a6a6..0000000 --- a/shelled/rustdesk-as-ref/flutter/build_fdroid.sh +++ /dev/null @@ -1,630 +0,0 @@ -#!/bin/bash - -# -# Script to build F-Droid release of RustDesk -# -# Copyright (C) 2024, The RustDesk Authors -# 2024, Vasyl Gello -# - -# The script is invoked by F-Droid builder system step-by-step. -# -# It accepts the following arguments: -# -# - versionName from https://github.com/rustdesk/rustdesk/releases/download/fdroid-version/rustdesk-version.txt -# - versionCode from https://github.com/rustdesk/rustdesk/releases/download/fdroid-version/rustdesk-version.txt -# - Android architecture to build APK for: armeabi-v7a arm64-v8av x86 x86_64 -# - The build step to execute: -# -# + prebuild: patch sources and do other stuff before the build -# + build: perform actual build of APK file -# - -# Start of functions - -# Install Flutter of version `VERSION` from Github repository -# into directory `FLUTTER_DIR` and apply patches if needed - -prepare_flutter() { - VERSION="${1}" - FLUTTER_DIR="${2}" - - if [ ! -f "${FLUTTER_DIR}/bin/flutter" ]; then - git clone https://github.com/flutter/flutter "${FLUTTER_DIR}" - fi - - pushd "${FLUTTER_DIR}" - - git restore . - git checkout "${VERSION}" - - # Patch flutter - - if dpkg --compare-versions "${VERSION}" ge "3.24.4"; then - git apply "${ROOTDIR}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff" - fi - - flutter config --no-analytics - - popd # ${FLUTTER_DIR} -} - -# Start of script - -set -x - -# Note current working directory as root dir for patches - -ROOTDIR="${PWD}" - -# Parse command-line arguments - -VERNAME="${1}" -VERCODE="${2}" -ANDROID_ABI="${3}" -BUILDSTEP="${4}" - -if [ -z "${VERNAME}" ] || [ -z "${VERCODE}" ] || [ -z "${ANDROID_ABI}" ] || - [ -z "${BUILDSTEP}" ]; then - echo "ERROR: Command-line arguments are all required to be non-empty!" >&2 - exit 1 -fi - -# Set various architecture-specific identifiers - -case "${ANDROID_ABI}" in -arm64-v8a) - FLUTTER_TARGET=android-arm64 - NDK_TARGET=aarch64-linux-android - RUST_TARGET=aarch64-linux-android - RUSTDESK_FEATURES='flutter,hwcodec' - ;; -armeabi-v7a) - FLUTTER_TARGET=android-arm - NDK_TARGET=arm-linux-androideabi - RUST_TARGET=armv7-linux-androideabi - RUSTDESK_FEATURES='flutter,hwcodec' - ;; -x86_64) - FLUTTER_TARGET=android-x64 - NDK_TARGET=x86_64-linux-android - RUST_TARGET=x86_64-linux-android - RUSTDESK_FEATURES='flutter' - ;; -x86) - FLUTTER_TARGET=android-x86 - NDK_TARGET=i686-linux-android - RUST_TARGET=i686-linux-android - RUSTDESK_FEATURES='flutter' - ;; -*) - echo "ERROR: Unknown Android ABI '${ANDROID_ABI}'!" >&2 - exit 1 - ;; -esac - -# Check ANDROID_SDK_ROOT and sdkmanager present on PATH - -if [ ! -d "${ANDROID_SDK_ROOT}" ] || ! command -v sdkmanager 1>/dev/null; then - echo "ERROR: Can not find Android SDK!" >&2 - exit 1 -fi - -# Export necessary variables - -export PATH="${PATH}:${HOME}/flutter/bin:${HOME}/depot_tools" - -export VCPKG_ROOT="${HOME}/vcpkg" - -# Now act depending on build step - -# NOTE: F-Droid maintainers require explicit declaration of dependencies -# as root via `Builds.sudo` F-Droid metadata directive: -# https://gitlab.com/fdroid/fdroiddata/-/merge_requests/15343#note_1988918695 - -case "${BUILDSTEP}" in -prebuild) - # prebuild: patch sources and do other stuff before the build - - # - # Extract required versions for NDK, Rust, Flutter from - # '.github/workflows/flutter-build.yml' - # - - CARGO_NDK_VERSION="$(yq -r \ - .env.CARGO_NDK_VERSION \ - .github/workflows/flutter-build.yml)" - - # Flutter used to compile main Rustdesk library - - FLUTTER_VERSION="$(yq -r \ - .env.ANDROID_FLUTTER_VERSION \ - .github/workflows/flutter-build.yml)" - - if [ -z "${FLUTTER_VERSION}" ]; then - FLUTTER_VERSION="$(yq -r \ - .env.FLUTTER_VERSION \ - .github/workflows/flutter-build.yml)" - fi - - # Flutter used to compile Flutter<->Rust bridge files - - CARGO_EXPAND_VERSION="$(yq -r \ - .env.CARGO_EXPAND_VERSION \ - .github/workflows/bridge.yml)" - - FLUTTER_BRIDGE_VERSION="$(yq -r \ - .env.FLUTTER_VERSION \ - .github/workflows/bridge.yml)" - - FLUTTER_RUST_BRIDGE_VERSION="$(yq -r \ - .env.FLUTTER_RUST_BRIDGE_VERSION \ - .github/workflows/bridge.yml)" - - NDK_VERSION="$(yq -r \ - .env.NDK_VERSION \ - .github/workflows/flutter-build.yml)" - - RUST_VERSION="$(yq -r \ - .env.RUST_VERSION \ - .github/workflows/flutter-build.yml)" - - VCPKG_COMMIT_ID="$(yq -r \ - .env.VCPKG_COMMIT_ID \ - .github/workflows/flutter-build.yml)" - - if [ -z "${CARGO_NDK_VERSION}" ] || [ -z "${FLUTTER_VERSION}" ] || - [ -z "${FLUTTER_BRIDGE_VERSION}" ] || - [ -z "${FLUTTER_RUST_BRIDGE_VERSION}" ] || - [ -z "${NDK_VERSION}" ] || [ -z "${RUST_VERSION}" ] || - [ -z "${VCPKG_COMMIT_ID}" ]; then - echo "ERROR: Can not identify all required versions!" >&2 - exit 1 - fi - - # Map NDK version to revision - NDK_VERSION="$(curl https://gitlab.com/fdroid/android-sdk-transparency-log/-/raw/master/signed/checksums.json | - jq -r ".\"https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip\"[0].\"source.properties\"" | - sed -n -E 's/.*Pkg.Revision = ([0-9.]+).*/\1/p')" - - if [ -z "${NDK_VERSION}" ]; then - echo "ERROR: Can not map Android NDK codename to revision!" >&2 - exit 1 - fi - - export ANDROID_NDK_HOME="${ANDROID_SDK_ROOT}/ndk/${NDK_VERSION}" - export ANDROID_NDK_ROOT="${ANDROID_SDK_ROOT}/ndk/${NDK_VERSION}" - - # - # Install the components - # - - set -e - - # Install Android NDK - - if [ ! -d "${ANDROID_NDK_ROOT}" ]; then - sdkmanager --install "ndk;${NDK_VERSION}" - fi - - # Install Rust - - if [ ! -f "${HOME}/rustup/rustup-init.sh" ]; then - pushd "${HOME}" - - git clone --depth 1 https://github.com/rust-lang/rustup - - popd # ${HOME} - fi - - pushd "${HOME}/rustup" - bash rustup-init.sh -y \ - --target "${RUST_TARGET}" \ - --default-toolchain "${RUST_VERSION}" - popd - - if ! command -v cargo 1>/dev/null 2>&1; then - . "${HOME}/.cargo/env" - fi - - # Install cargo-ndk - - cargo install \ - cargo-ndk \ - --version "${CARGO_NDK_VERSION}" \ - --locked - - # Install rust bridge generator - - cargo install \ - cargo-expand \ - --version "${CARGO_EXPAND_VERSION}" \ - --locked - cargo install flutter_rust_bridge_codegen \ - --version "${FLUTTER_RUST_BRIDGE_VERSION}" \ - --features "uuid" \ - --locked - - # Populate native vcpkg dependencies - - if [ ! -d "${VCPKG_ROOT}" ]; then - pushd "${HOME}" - - git clone \ - https://github.com/Microsoft/vcpkg.git - git clone \ - https://github.com/Microsoft/vcpkg-tool.git - - pushd vcpkg-tool - - mkdir build - - pushd build - - cmake \ - -DCMAKE_BUILD_TYPE=Release \ - -G 'Ninja' \ - -DVCPKG_DEVELOPMENT_WARNINGS=OFF \ - .. - - cmake --build . - - popd # build - - popd # vcpkg-tool - - pushd vcpkg - - git reset --hard "${VCPKG_COMMIT_ID}" - - cp -a ../vcpkg-tool/build/vcpkg vcpkg - - # disable telemetry - - touch "vcpkg.disable-metrics" - - popd # vcpkg - - popd # ${HOME} - fi - - # Install depot-tools for x86 - - if [ "${ANDROID_ABI}" = "x86" ]; then - if [ ! -d "${HOME}/depot_tools" ]; then - pushd "${HOME}" - - git clone \ - --depth 1 \ - https://chromium.googlesource.com/chromium/tools/depot_tools.git - - popd # ${HOME} - fi - fi - - # Patch the RustDesk sources - - git apply res/fdroid/patches/*.patch - - # If Flutter version used to generate bridge files differs from Flutter - # version used to compile Rustdesk library, generate bridge using the - # `FLUTTER_BRIDGE_VERSION` an restore the pubspec later - - if [ "${FLUTTER_VERSION}" != "${FLUTTER_BRIDGE_VERSION}" ]; then - # Find first libclang.so and set BRIDGE_LLVM_PATH - - BRIDGE_LLVM_PATH="$(find /usr/lib/ -name libclang.so | head -n1)" - - if [ -z "${BRIDGE_LLVM_PATH}" ]; then - echo 'ERROR: Can not find libclang.so for bridge generator!' >&2 - exit 1 - fi - - BRIDGE_LLVM_PATH="$(dirname "${BRIDGE_LLVM_PATH}")" - BRIDGE_LLVM_PATH="$(dirname "${BRIDGE_LLVM_PATH}")" - - # Install Flutter bridge version - - prepare_flutter "${FLUTTER_BRIDGE_VERSION}" "${HOME}/flutter" - - # Save changes - - git add . - - # Edit pubspec to make flutter bridge version work - - sed \ - -i \ - -e 's/extended_text: 14.0.0/extended_text: 13.0.0/g' \ - flutter/pubspec.yaml - - # Download Flutter dependencies - - pushd flutter - - flutter clean - flutter packages pub get - - popd # flutter - - # Generate FFI bindings - - flutter_rust_bridge_codegen \ - --rust-input ./src/flutter_ffi.rs \ - --dart-output ./flutter/lib/generated_bridge.dart \ - --llvm-path "${BRIDGE_LLVM_PATH}" - - # Add bridge files to save-list - - git add -f ./flutter/lib/generated_bridge.* ./src/bridge_generated.* - - # Restore everything - - git checkout '*' - git clean -dffx - git reset - - unset BRIDGE_LLVM_PATH - fi - - # Install Flutter version for RustDesk library build - - prepare_flutter "${FLUTTER_VERSION}" "${HOME}/flutter" - - # gms is not in these files now, but we still keep the following line for future reference(maybe). - - sed \ - -i \ - -e '/gms/d' \ - flutter/android/build.gradle \ - flutter/android/app/build.gradle - - # `firebase_analytics` is not in these files now, but we still keep the following lines. - - sed \ - -i \ - -e '/firebase_analytics/d' \ - flutter/pubspec.yaml - - sed \ - -i \ - -e '/ firebase/,/ version/d' \ - flutter/pubspec.lock - - sed \ - -i \ - -e '/firebase/Id' \ - flutter/lib/main.dart - - ;; -build) - # build: perform actual build of APK file - - set -e - - # - # Extract required versions for NDK, Rust, Flutter from - # '.github/workflows/flutter-build.yml' - # - - # Flutter used to compile main Rustdesk library - - FLUTTER_VERSION="$(yq -r \ - .env.ANDROID_FLUTTER_VERSION \ - .github/workflows/flutter-build.yml)" - - if [ -z "${FLUTTER_VERSION}" ]; then - FLUTTER_VERSION="$(yq -r \ - .env.FLUTTER_VERSION \ - .github/workflows/flutter-build.yml)" - fi - - NDK_VERSION="$(yq -r \ - .env.NDK_VERSION \ - .github/workflows/flutter-build.yml)" - - # Map NDK version to revision - NDK_VERSION="$(curl https://gitlab.com/fdroid/android-sdk-transparency-log/-/raw/master/signed/checksums.json | - jq -r ".\"https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip\"[0].\"source.properties\"" | - sed -n -E 's/.*Pkg.Revision = ([0-9.]+).*/\1/p')" - - if [ -z "${NDK_VERSION}" ]; then - echo "ERROR: Can not map Android NDK codename to revision!" >&2 - exit 1 - fi - - export ANDROID_NDK_HOME="${ANDROID_SDK_ROOT}/ndk/${NDK_VERSION}" - export ANDROID_NDK_ROOT="${ANDROID_SDK_ROOT}/ndk/${NDK_VERSION}" - - if ! command -v cargo 1>/dev/null 2>&1; then - . "${HOME}/.cargo/env" - fi - - # Download Flutter dependencies - - pushd flutter - - flutter clean - flutter packages pub get - - popd # flutter - - # Build host android deps - - bash flutter/build_android_deps.sh "${ANDROID_ABI}" - - # Build rustdesk lib - - cargo ndk \ - --platform 21 \ - --target "${RUST_TARGET}" \ - --bindgen \ - build \ - --release \ - --features "${RUSTDESK_FEATURES}" - - mkdir -p "flutter/android/app/src/main/jniLibs/${ANDROID_ABI}" - - cp "target/${RUST_TARGET}/release/liblibrustdesk.so" \ - "flutter/android/app/src/main/jniLibs/${ANDROID_ABI}/librustdesk.so" - - cp "${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/${NDK_TARGET}/libc++_shared.so" \ - "flutter/android/app/src/main/jniLibs/${ANDROID_ABI}/" - - "${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip" \ - "flutter/android/app/src/main/jniLibs/${ANDROID_ABI}"/* - - # Build flutter-jit-release for x86 - - if [ "${ANDROID_ABI}" = "x86" ]; then - pushd flutter-sdk - - echo "## Sync flutter engine sources" - echo "### We need fakeroot because chromium base image is unpacked with weird uid/gid ownership" - - sed -i "s/FLUTTER_VERSION_PLACEHOLDER/${FLUTTER_VERSION}/" .gclient - - export FAKEROOTDONTTRYCHOWN=1 - - fakeroot gclient sync - - unset FAKEROOTDONTTRYCHOWN - - pushd src - - echo "## Patch away Google Play dependencies" - - rm \ - flutter/shell/platform/android/io/flutter/app/FlutterPlayStoreSplitApplication.java \ - flutter/shell/platform/android/io/flutter/embedding/engine/deferredcomponents/PlayStoreDeferredComponentManager.java flutter/shell/platform/android/io/flutter/embedding/android/FlutterPlayStoreSplitApplication.java - - sed \ - -i \ - -e '/PlayStore/d' \ - flutter/tools/android_lint/project.xml \ - flutter/shell/platform/android/BUILD.gn - - sed \ - -i \ - -e '/com.google.android.play/d' \ - flutter/tools/androidx/files.json - - echo "## Configure android engine build" - - flutter/tools/gn \ - --android --android-cpu x86 --runtime-mode=jit_release \ - --no-goma --no-enable-unittests - - echo "## Perform android engine build" - - ninja -C out/android_jit_release_x86 - - echo "## Configure host engine build" - - flutter/tools/gn \ - --android-cpu x86 --runtime-mode=jit_release \ - --no-goma --no-enable-unittests - - echo "## Perform android engine build" - - ninja -C out/host_jit_release_x86 - - echo "## Rename host engine" - - mv out/host_jit_release_x86 out/host_jit_release - - echo "## Mimic jit_release engine to debug to use with flutter build apk" - - pushd out/android_jit_release_x86 - - sed \ - -e 's/jit_release/debug/' \ - flutter_embedding_jit_release.maven-metadata.xml \ - 1>flutter_embedding_debug.maven-metadata.xml - - sed \ - -e 's/jit_release/debug/' \ - flutter_embedding_jit_release.pom \ - 1>flutter_embedding_debug.pom - - sed \ - -e 's/jit_release/debug/' \ - x86_jit_release.maven-metadata.xml \ - 1>x86_debug.maven-metadata.xml - - sed \ - -e 's/jit_release/debug/' \ - x86_jit_release.pom \ - 1>x86_debug.pom - - cp -a \ - flutter_embedding_jit_release-sources.jar \ - flutter_embedding_debug-sources.jar - - cp -a \ - flutter_embedding_jit_release.jar \ - flutter_embedding_debug.jar - - cp -a \ - x86_jit_release.jar \ - x86_debug.jar - - popd # out/android_jit_release_x86 - - popd # src - - popd # flutter-sdk - - echo "# Clean up intermediate engine files and show free space" - - rm -rf \ - flutter-sdk/src/out/android_jit_release_x86/obj \ - flutter-sdk/src/out/host_jit_release/obj - - mv flutter-sdk/src/out flutter-out - - rm -rf flutter-sdk - - mkdir -p flutter-sdk/src/ - - mv flutter-out flutter-sdk/src/out - fi - - # Build the apk - - pushd flutter - - if [ "${ANDROID_ABI}" = "x86" ]; then - flutter build apk \ - --local-engine-src-path="$(readlink -mf "../flutter-sdk/src")" \ - --local-engine=android_jit_release_x86 \ - --debug \ - --build-number="${VERCODE}" \ - --build-name="${VERNAME}" \ - --target-platform "${FLUTTER_TARGET}" - else - flutter build apk \ - --release \ - --build-number="${VERCODE}" \ - --build-name="${VERNAME}" \ - --target-platform "${FLUTTER_TARGET}" - fi - - popd # flutter - - rm -rf flutter-sdk - - # Special step for fdroiddata CI builds to remove .gitconfig - - rm -f /home/vagrant/.gitconfig - - ;; -*) - echo "ERROR: Unknown build step '${BUILDSTEP}'!" >&2 - exit 1 - ;; -esac - -# Report success - -echo "All done!" diff --git a/shelled/rustdesk-as-ref/flutter/build_ios.sh b/shelled/rustdesk-as-ref/flutter/build_ios.sh deleted file mode 100644 index cd12626..0000000 --- a/shelled/rustdesk-as-ref/flutter/build_ios.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -# https://docs.flutter.dev/deployment/ios -# flutter build ipa --release --obfuscate --split-debug-info=./split-debug-info -# no obfuscate, because no easy to check errors -cd $(dirname $(dirname $(which flutter))) -git apply ~/rustdesk/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff -cd - -flutter build ipa --release diff --git a/shelled/rustdesk-as-ref/flutter/ios/.gitignore b/shelled/rustdesk-as-ref/flutter/ios/.gitignore deleted file mode 100644 index 151026b..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -*.mode1v3 -*.mode2v3 -*.moved-aside -*.pbxuser -*.perspectivev3 -**/*sync/ -.sconsign.dblite -.tags* -**/.vagrant/ -**/DerivedData/ -Icon? -**/Pods/ -**/.symlinks/ -profile -xcuserdata -**/.generated/ -Flutter/App.framework -Flutter/Flutter.framework -Flutter/Flutter.podspec -Flutter/Generated.xcconfig -Flutter/ephemeral/ -Flutter/app.flx -Flutter/app.zip -Flutter/flutter_assets/ -Flutter/flutter_export_environment.sh -ServiceDefinitions.json -Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!default.mode1v3 -!default.mode2v3 -!default.pbxuser -!default.perspectivev3 diff --git a/shelled/rustdesk-as-ref/flutter/ios/Flutter/AppFrameworkInfo.plist b/shelled/rustdesk-as-ref/flutter/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 1dc6cf7..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 13.0 - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Flutter/Debug.xcconfig b/shelled/rustdesk-as-ref/flutter/ios/Flutter/Debug.xcconfig deleted file mode 100644 index ec97fc6..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/shelled/rustdesk-as-ref/flutter/ios/Flutter/Release.xcconfig b/shelled/rustdesk-as-ref/flutter/ios/Flutter/Release.xcconfig deleted file mode 100644 index c4855bf..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/shelled/rustdesk-as-ref/flutter/ios/Podfile b/shelled/rustdesk-as-ref/flutter/ios/Podfile deleted file mode 100644 index b71c436..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Podfile +++ /dev/null @@ -1,45 +0,0 @@ -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -platform :ios, '13.0' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' - end - end -end - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Podfile.lock b/shelled/rustdesk-as-ref/flutter/ios/Podfile.lock deleted file mode 100644 index c9e9f9a..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Podfile.lock +++ /dev/null @@ -1,142 +0,0 @@ -PODS: - - device_info_plus (0.0.1): - - Flutter - - DKImagePickerController/Core (4.3.4): - - DKImagePickerController/ImageDataManager - - DKImagePickerController/Resource - - DKImagePickerController/ImageDataManager (4.3.4) - - DKImagePickerController/PhotoGallery (4.3.4): - - DKImagePickerController/Core - - DKPhotoGallery - - DKImagePickerController/Resource (4.3.4) - - DKPhotoGallery (0.0.17): - - DKPhotoGallery/Core (= 0.0.17) - - DKPhotoGallery/Model (= 0.0.17) - - DKPhotoGallery/Preview (= 0.0.17) - - DKPhotoGallery/Resource (= 0.0.17) - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Core (0.0.17): - - DKPhotoGallery/Model - - DKPhotoGallery/Preview - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Model (0.0.17): - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Preview (0.0.17): - - DKPhotoGallery/Model - - DKPhotoGallery/Resource - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Resource (0.0.17): - - SDWebImage - - SwiftyGif - - file_picker (0.0.1): - - DKImagePickerController/PhotoGallery - - Flutter - - Flutter (1.0.0) - - flutter_keyboard_visibility (0.0.1): - - Flutter - - image_picker_ios (0.0.1): - - Flutter - - MTBBarcodeScanner (5.0.11) - - package_info_plus (0.4.5): - - Flutter - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - qr_code_scanner (0.2.0): - - Flutter - - MTBBarcodeScanner - - SDWebImage (5.18.11): - - SDWebImage/Core (= 5.18.11) - - SDWebImage/Core (5.18.11) - - sqflite (0.0.3): - - Flutter - - FlutterMacOS - - SwiftyGif (5.4.4) - - uni_links (0.0.1): - - Flutter - - url_launcher_ios (0.0.1): - - Flutter - - video_player_avfoundation (0.0.1): - - Flutter - - FlutterMacOS - - wakelock_plus (0.0.1): - - Flutter - -DEPENDENCIES: - - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - - file_picker (from `.symlinks/plugins/file_picker/ios`) - - Flutter (from `Flutter`) - - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) - - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - - qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`) - - sqflite (from `.symlinks/plugins/sqflite/darwin`) - - uni_links (from `.symlinks/plugins/uni_links/ios`) - - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) - - wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`) - -SPEC REPOS: - trunk: - - DKImagePickerController - - DKPhotoGallery - - MTBBarcodeScanner - - SDWebImage - - SwiftyGif - -EXTERNAL SOURCES: - device_info_plus: - :path: ".symlinks/plugins/device_info_plus/ios" - file_picker: - :path: ".symlinks/plugins/file_picker/ios" - Flutter: - :path: Flutter - flutter_keyboard_visibility: - :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" - image_picker_ios: - :path: ".symlinks/plugins/image_picker_ios/ios" - package_info_plus: - :path: ".symlinks/plugins/package_info_plus/ios" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/darwin" - qr_code_scanner: - :path: ".symlinks/plugins/qr_code_scanner/ios" - sqflite: - :path: ".symlinks/plugins/sqflite/darwin" - uni_links: - :path: ".symlinks/plugins/uni_links/ios" - url_launcher_ios: - :path: ".symlinks/plugins/url_launcher_ios/ios" - video_player_avfoundation: - :path: ".symlinks/plugins/video_player_avfoundation/darwin" - wakelock_plus: - :path: ".symlinks/plugins/wakelock_plus/ios" - -SPEC CHECKSUMS: - device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 - DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac - DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 - file_picker: ce3938a0df3cc1ef404671531facef740d03f920 - Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 - image_picker_ios: 99dfe1854b4fa34d0364e74a78448a0151025425 - MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb - package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 - path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c - qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e - SDWebImage: a3ba0b8faac7228c3c8eadd1a55c9c9fe5e16457 - sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec - SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f - uni_links: d97da20c7701486ba192624d99bffaaffcfc298a - url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe - video_player_avfoundation: 02011213dab73ae3687df27ce441fbbcc82b5579 - wakelock_plus: 8b09852c8876491e4b6d179e17dfe2a0b5f60d47 - -PODFILE CHECKSUM: 83d1b0fb6fc8613d8312a03b8e1540d37cfc5d2c - -COCOAPODS: 1.15.2 diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.pbxproj b/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 36dc89e..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,756 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - C5678348E08E565F424B13A5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 25E069BDBEF2890938537ABB /* Pods_Runner.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 0A3A301029F021DD0095DDA5 /* liblibrustdesk.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblibrustdesk.a; path = "../../target/aarch64-apple-ios/release/liblibrustdesk.a"; sourceTree = ""; }; - 0A3A301329F0AB660095DDA5 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 25E069BDBEF2890938537ABB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 40E78CC6B4293A3E6DA85154 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 4151ACC476A12FDC49BC7860 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C66E40D850585BD073A0EF7D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - C5678348E08E565F424B13A5 /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - FC03317C0FF27D4E19FBA24E /* Pods */, - F213315C743C5EC601AD8123 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 0A3A301329F0AB660095DDA5 /* Runner.entitlements */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - ); - path = Runner; - sourceTree = ""; - }; - F213315C743C5EC601AD8123 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 0A3A301029F021DD0095DDA5 /* liblibrustdesk.a */, - 25E069BDBEF2890938537ABB /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - FC03317C0FF27D4E19FBA24E /* Pods */ = { - isa = PBXGroup; - children = ( - 40E78CC6B4293A3E6DA85154 /* Pods-Runner.debug.xcconfig */, - C66E40D850585BD073A0EF7D /* Pods-Runner.release.xcconfig */, - 4151ACC476A12FDC49BC7860 /* Pods-Runner.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 7EB62F3CF0939A56238651D9 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 649B29BA4C122652F1215682 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 1100; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 649B29BA4C122652F1215682 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 7EB62F3CF0939A56238651D9 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = HZF9JMC8YN; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"", - /usr/lib/swift, - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)/", - "$(SDKROOT)/usr/lib/swift", - "$(PROJECT_DIR)/../../target/aarch64-apple-ios/release/", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "$(PROJECT_DIR)/../../target/aarch64-apple-ios/release/liblibrustdesk.a", - "-ObjC", - "-l\"c++\"", - "-l\"sqlite3\"", - "-framework", - "\"AVFoundation\"", - "-framework", - "\"AVKit\"", - "-framework", - "\"DKImagePickerController\"", - "-framework", - "\"DKPhotoGallery\"", - "-framework", - "\"Foundation\"", - "-framework", - "\"ImageIO\"", - "-framework", - "\"MTBBarcodeScanner\"", - "-framework", - "\"Photos\"", - "-framework", - "\"QuartzCore\"", - "-framework", - "\"SDWebImage\"", - "-framework", - "\"SwiftyGif\"", - "-framework", - "\"UIKit\"", - "-framework", - "\"device_info_plus\"", - "-framework", - "\"file_picker\"", - "-framework", - "\"flutter_keyboard_visibility\"", - "-framework", - "\"image_picker_ios\"", - "-framework", - "\"package_info_plus\"", - "-framework", - "\"path_provider_foundation\"", - "-framework", - "\"qr_code_scanner\"", - "-framework", - "\"sqflite\"", - "-framework", - "\"uni_links\"", - "-framework", - "\"url_launcher_ios\"", - "-framework", - "\"video_player_avfoundation\"", - "-framework", - "\"wakelock_plus\"", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_STYLE = "non-global"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = HZF9JMC8YN; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"", - /usr/lib/swift, - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)/", - "$(SDKROOT)/usr/lib/swift", - "$(PROJECT_DIR)/../../target/aarch64-apple-ios/release/", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "$(PROJECT_DIR)/../../target/aarch64-apple-ios/release/liblibrustdesk.a", - "-ObjC", - "-l\"c++\"", - "-l\"sqlite3\"", - "-framework", - "\"AVFoundation\"", - "-framework", - "\"AVKit\"", - "-framework", - "\"DKImagePickerController\"", - "-framework", - "\"DKPhotoGallery\"", - "-framework", - "\"Foundation\"", - "-framework", - "\"ImageIO\"", - "-framework", - "\"MTBBarcodeScanner\"", - "-framework", - "\"Photos\"", - "-framework", - "\"QuartzCore\"", - "-framework", - "\"SDWebImage\"", - "-framework", - "\"SwiftyGif\"", - "-framework", - "\"UIKit\"", - "-framework", - "\"device_info_plus\"", - "-framework", - "\"file_picker\"", - "-framework", - "\"flutter_keyboard_visibility\"", - "-framework", - "\"image_picker_ios\"", - "-framework", - "\"package_info_plus\"", - "-framework", - "\"path_provider_foundation\"", - "-framework", - "\"qr_code_scanner\"", - "-framework", - "\"sqflite\"", - "-framework", - "\"uni_links\"", - "-framework", - "\"url_launcher_ios\"", - "-framework", - "\"video_player_avfoundation\"", - "-framework", - "\"wakelock_plus\"", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_STYLE = "non-global"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = HZF9JMC8YN; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"", - /usr/lib/swift, - "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)/", - "$(SDKROOT)/usr/lib/swift", - "$(PROJECT_DIR)/../../target/aarch64-apple-ios/release/", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "$(PROJECT_DIR)/../../target/aarch64-apple-ios/release/liblibrustdesk.a", - "-ObjC", - "-l\"c++\"", - "-l\"sqlite3\"", - "-framework", - "\"AVFoundation\"", - "-framework", - "\"AVKit\"", - "-framework", - "\"DKImagePickerController\"", - "-framework", - "\"DKPhotoGallery\"", - "-framework", - "\"Foundation\"", - "-framework", - "\"ImageIO\"", - "-framework", - "\"MTBBarcodeScanner\"", - "-framework", - "\"Photos\"", - "-framework", - "\"QuartzCore\"", - "-framework", - "\"SDWebImage\"", - "-framework", - "\"SwiftyGif\"", - "-framework", - "\"UIKit\"", - "-framework", - "\"device_info_plus\"", - "-framework", - "\"file_picker\"", - "-framework", - "\"flutter_keyboard_visibility\"", - "-framework", - "\"image_picker_ios\"", - "-framework", - "\"package_info_plus\"", - "-framework", - "\"path_provider_foundation\"", - "-framework", - "\"qr_code_scanner\"", - "-framework", - "\"sqflite\"", - "-framework", - "\"uni_links\"", - "-framework", - "\"url_launcher_ios\"", - "-framework", - "\"video_player_avfoundation\"", - "-framework", - "\"wakelock_plus\"", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_STYLE = "non-global"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 5e31d3d..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/contents.xcworkspacedata b/shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc1..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner/AppDelegate.swift b/shelled/rustdesk-as-ref/flutter/ios/Runner/AppDelegate.swift deleted file mode 100644 index d9333b7..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,19 +0,0 @@ -import UIKit -import Flutter - -@main -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - dummyMethodToEnforceBundling(); - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } - - public func dummyMethodToEnforceBundling() { - dummy_method_to_enforce_bundling(); - session_get_rgba(nil, 0); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 5361129..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images" : [ - { - "filename" : "Icon-App-20x20@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "Icon-App-20x20@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "Icon-App-29x29@1x.png", - "idiom" : "iphone", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "Icon-App-29x29@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "Icon-App-29x29@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "Icon-App-40x40@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "Icon-App-40x40@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "Icon-App-60x60@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "Icon-App-60x60@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "filename" : "Icon-App-20x20@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "filename" : "Icon-App-20x20@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "Icon-App-29x29@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "Icon-App-29x29@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "Icon-App-40x40@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "filename" : "Icon-App-40x40@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "Icon-App-76x76@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "filename" : "Icon-App-76x76@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "filename" : "Icon-App-83.5x83.5@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "filename" : "Icon-App-1024x1024@1x.png", - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json deleted file mode 100644 index 00cabce..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "LaunchImage.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "LaunchImage@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "LaunchImage@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard b/shelled/rustdesk-as-ref/flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner/Base.lproj/Main.storyboard b/shelled/rustdesk-as-ref/flutter/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index d68a3a7..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner/GoogleService-Info.plist b/shelled/rustdesk-as-ref/flutter/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index f392882..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - CLIENT_ID - 768133699366-k1rn3ls1u2n3nklmgd9t4cmpdob0c8bn.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.768133699366-k1rn3ls1u2n3nklmgd9t4cmpdob0c8bn - API_KEY - AIzaSyCf57HjCwSokt91CqFI0Mwf8D--ek0jvfc - GCM_SENDER_ID - 768133699366 - PLIST_VERSION - 1 - BUNDLE_ID - com.carriez.flutterHbb - PROJECT_ID - rustdesk - STORAGE_BUCKET - rustdesk.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:768133699366:ios:c33078a6181b9d507993e7 - DATABASE_URL - https://rustdesk.firebaseio.com - - \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner/Info.plist b/shelled/rustdesk-as-ref/flutter/ios/Runner/Info.plist deleted file mode 100644 index 9351dac..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner/Info.plist +++ /dev/null @@ -1,82 +0,0 @@ - - - - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - RustDesk - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - RustDesk - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLIconFile - - CFBundleURLName - com.carriez.rustdesk - CFBundleURLSchemes - - rustdesk - - - - LSRequiresIPhoneOS - - UIApplicationSupportsIndirectInputEvents - - UIFileSharingEnabled - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportsDocumentBrowser - - UIViewControllerBasedStatusBarAppearance - - ITSAppUsesNonExemptEncryption - - io.flutter.embedded_views_preview - - NSCameraUsageDescription - This app needs camera access to scan QR codes - NSPhotoLibraryUsageDescription - This app needs photo library access to get QR codes from image - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner/Runner-Bridging-Header.h b/shelled/rustdesk-as-ref/flutter/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index e930a39..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1,3 +0,0 @@ -#import "GeneratedPluginRegistrant.h" - -#import "bridge_generated.h" diff --git a/shelled/rustdesk-as-ref/flutter/ios/Runner/Runner.entitlements b/shelled/rustdesk-as-ref/flutter/ios/Runner/Runner.entitlements deleted file mode 100644 index 75e36a1..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/Runner/Runner.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - aps-environment - development - com.apple.developer.networking.wifi-info - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios/exportOptions.plist b/shelled/rustdesk-as-ref/flutter/ios/exportOptions.plist deleted file mode 100644 index 6ceb2ac..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios/exportOptions.plist +++ /dev/null @@ -1,15 +0,0 @@ - - - - - method - app-store - teamID - HZF9JMC8YN - provisioningProfiles - - com.carriez.flutterHbb - rustdesk-ios-prod-app-store - - - diff --git a/shelled/rustdesk-as-ref/flutter/ios_arm64.sh b/shelled/rustdesk-as-ref/flutter/ios_arm64.sh deleted file mode 100644 index 579baaa..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios_arm64.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -cargo build --features flutter,hwcodec --release --target aarch64-apple-ios --lib diff --git a/shelled/rustdesk-as-ref/flutter/ios_x64.sh b/shelled/rustdesk-as-ref/flutter/ios_x64.sh deleted file mode 100644 index 04b9993..0000000 --- a/shelled/rustdesk-as-ref/flutter/ios_x64.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -cargo build --features flutter --release --target x86_64-apple-ios --lib diff --git a/shelled/rustdesk-as-ref/flutter/lib/common.dart b/shelled/rustdesk-as-ref/flutter/lib/common.dart deleted file mode 100644 index ad3bbc9..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common.dart +++ /dev/null @@ -1,4161 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:math'; - -import 'package:back_button_interceptor/back_button_interceptor.dart'; -import 'package:desktop_multi_window/desktop_multi_window.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hbb/common/formatter/id_formatter.dart'; -import 'package:flutter_hbb/desktop/widgets/refresh_wrapper.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/main.dart'; -import 'package:flutter_hbb/models/peer_model.dart'; -import 'package:flutter_hbb/models/peer_tab_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:flutter_hbb/utils/multi_window_manager.dart'; -import 'package:flutter_hbb/utils/platform_channel.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; -import 'package:get/get_rx/src/rx_workers/utils/debouncer.dart'; -import 'package:provider/provider.dart'; -import 'package:uni_links/uni_links.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:uuid/uuid.dart'; -import 'package:wakelock_plus/wakelock_plus.dart'; -import 'package:window_manager/window_manager.dart'; -import 'package:window_size/window_size.dart' as window_size; - -import '../consts.dart'; -import 'common/widgets/overlay.dart'; -import 'mobile/pages/file_manager_page.dart'; -import 'mobile/pages/remote_page.dart'; -import 'mobile/pages/view_camera_page.dart'; -import 'mobile/pages/terminal_page.dart'; -import 'desktop/pages/remote_page.dart' as desktop_remote; -import 'desktop/pages/file_manager_page.dart' as desktop_file_manager; -import 'desktop/pages/view_camera_page.dart' as desktop_view_camera; -import 'package:flutter_hbb/desktop/widgets/remote_toolbar.dart'; -import 'models/model.dart'; -import 'models/platform_model.dart'; - -import 'package:flutter_hbb/native/win32.dart' - if (dart.library.html) 'package:flutter_hbb/web/win32.dart'; -import 'package:flutter_hbb/native/common.dart' - if (dart.library.html) 'package:flutter_hbb/web/common.dart'; -import 'package:flutter_hbb/utils/http_service.dart' as http; - -final globalKey = GlobalKey(); -final navigationBarKey = GlobalKey(); - -final isAndroid = isAndroid_; -final isIOS = isIOS_; -final isWindows = isWindows_; -final isMacOS = isMacOS_; -final isLinux = isLinux_; -final isDesktop = isDesktop_; -final isWeb = isWeb_; -final isWebDesktop = isWebDesktop_; -final isWebOnWindows = isWebOnWindows_; -final isWebOnLinux = isWebOnLinux_; -final isWebOnMacOs = isWebOnMacOS_; -var isMobile = isAndroid || isIOS; -var version = ''; -int androidVersion = 0; - -// Only used on Linux. -// `windowManager.setResizable(false)` will reset the window size to the default size on Linux. -// https://stackoverflow.com/questions/8193613/gtk-window-resize-disable-without-going-back-to-default -// So we need to use this flag to enable/disable resizable. -bool _linuxWindowResizable = true; - -// Only used on Windows(window manager). -bool _ignoreDevicePixelRatio = true; - -/// only available for Windows target -int windowsBuildNumber = 0; -DesktopType? desktopType; - -// Tolerance used for floating-point position comparisons to avoid precision errors. -const double _kPositionEpsilon = 1e-6; - -bool get isMainDesktopWindow => - desktopType == DesktopType.main || desktopType == DesktopType.cm; - -String get screenInfo => screenInfo_; - -/// Check if the app is running with single view mode. -bool isSingleViewApp() { - return desktopType == DesktopType.cm; -} - -/// * debug or test only, DO NOT enable in release build -bool isTest = false; - -typedef F = String Function(String); -typedef FMethod = String Function(String, dynamic); - -typedef StreamEventHandler = Future Function(Map); -typedef SessionID = UuidValue; -final iconHardDrive = MemoryImage(Uint8List.fromList(base64Decode( - 'iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAmVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjHWqVAAAAMnRSTlMAv0BmzLJNXlhiUu2fxXDgu7WuSUUe29LJvpqUjX53VTstD7ilNujCqTEk5IYH+vEoFjKvAagAAAPpSURBVHja7d0JbhpBEIXhB3jYzb5vBgzYgO04df/DJXGUKMwU9ECmZ6pQfSfw028LCXW3YYwxxhhjjDHGGGOM0eZ9VV1MckdKWLM1bRQ/35GW/WxHHu1me6ShuyHvNl34VhlTKsYVeDWj1EzgUZ1S1DrAk/UDparZgxd9Sl0BHnxSBhpI3jfKQG2FpLUpE69I2ILikv1nsvygjBwPSNKYMlNHggqUoSKS80AZCnwHqQ1zCRvW+CRegwRFeFAMKKrtM8gTPJlzSfwFgT9dJom3IDN4VGaSeAryAK8m0SSeghTg1ZYiql6CjBDhO8mzlyAVhKhIwgXxrh5NojGIhyRckEdwpCdhgpSQgiWTRGMQNonGIGySp0SDvMDBX5KWxiB8Eo1BgE00SYJBykhNnkmSWJAcLpGaJNMgfJKyxiDAK4WNEwryhMtkJsk8CJtEYxA+icYgQIfCcgkEqcJNXhIRQdgkGoPwSTQG+e8khdu/7JOVREwQIKCwF41B2CQljUH4JLcH6SI+OUlEBQHa0SQag/BJNAbhkjxqDMIn0RgEeI4muSlID9eSkERgEKAVTaIxCJ9EYxA2ydVB8hCASVLRGAQYR5NoDMIn0RgEyFHYSGMQPonGII4kziCNvBgNJonEk4u3GAk8Sprk6eYaqbMDY0oKvUm5jfC/viGiSypV7+M3i2iDsAGpNEDYjlTa3W8RdR/r544g50ilnA0RxoZIE2NIXqQbhkAkGyKNDZHGhkhjQ6SxIdLYEGlsiDQ2JGTVeD0264U9zipPh7XOooffpA6pfNCXjxl4/c3pUzlChwzor53zwYYVfpI5pOV6LWFF/2jiJ5FDSs5jdY/0rwUAkUMeXWdBqnSqD0DikBqdqCHsjTvELm9In0IOri/0pwAEDtlSyNaRjAIAAoesKWTtuusxByBwCJp0oomwBXcYUuCQgE50ENajE4OvZAKHLB1/68Br5NqiyCGYOY8YRd77kTkEb64n7lZN+mOIX4QOwb5FX0ZVx3uOxwW+SB0CbBubemWP8/rlaaeRX+M3uUOuZENsiA25zIbYkPsZElBIHwL13U/PTjJ/cyOOEoVM3I+hziDQlELm7pPxw3eI8/7gPh1fpLA6xGnEeDDgO0UcIAzzM35HxLPIq5SXe9BLzOsj9eUaQqyXzxS1QFSfWM2cCANiHcAISJ0AnCKpUwTuIkkA3EeSInAXSQKcs1V18e24wlllUmQp9v9zXKeHi+akRAMOPVKhAqdPBZeUmnnEsO6QcJ0+4qmOSbBxFfGVRiTUqITrdKcCbyYO3/K4wX4+aQ+FfNjXhu3JfAVjjDHGGGOMMcYYY4xIPwCgfqT6TbhCLAAAAABJRU5ErkJggg=='))); - -enum DesktopType { - main, - remote, - fileTransfer, - viewCamera, - terminal, - cm, - portForward, -} - -bool isDoubleEqual(double a, double b) { - return (a - b).abs() < _kPositionEpsilon; -} - -class IconFont { - static const _family1 = 'Tabbar'; - static const _family2 = 'PeerSearchbar'; - static const _family3 = 'AddressBook'; - static const _family4 = 'DeviceGroup'; - static const _family5 = 'More'; - - IconFont._(); - - static const IconData max = IconData(0xe606, fontFamily: _family1); - static const IconData restore = IconData(0xe607, fontFamily: _family1); - static const IconData close = IconData(0xe668, fontFamily: _family1); - static const IconData min = IconData(0xe609, fontFamily: _family1); - static const IconData add = IconData(0xe664, fontFamily: _family1); - static const IconData menu = IconData(0xe628, fontFamily: _family1); - static const IconData search = IconData(0xe6a4, fontFamily: _family2); - static const IconData roundClose = IconData(0xe6ed, fontFamily: _family2); - static const IconData addressBook = IconData(0xe602, fontFamily: _family3); - static const IconData deviceGroupOutline = - IconData(0xe623, fontFamily: _family4); - static const IconData deviceGroupFill = - IconData(0xe748, fontFamily: _family4); - static const IconData more = IconData(0xe609, fontFamily: _family5); -} - -class ColorThemeExtension extends ThemeExtension { - const ColorThemeExtension({ - required this.border, - required this.border2, - required this.border3, - required this.highlight, - required this.drag_indicator, - required this.shadow, - required this.errorBannerBg, - required this.me, - required this.toastBg, - required this.toastText, - required this.divider, - }); - - final Color? border; - final Color? border2; - final Color? border3; - final Color? highlight; - final Color? drag_indicator; - final Color? shadow; - final Color? errorBannerBg; - final Color? me; - final Color? toastBg; - final Color? toastText; - final Color? divider; - - static final light = ColorThemeExtension( - border: Color(0xFFCCCCCC), - border2: Color(0xFFBBBBBB), - border3: Colors.black26, - highlight: Color(0xFFE5E5E5), - drag_indicator: Colors.grey[800], - shadow: Colors.black, - errorBannerBg: Color(0xFFFDEEEB), - me: Colors.green, - toastBg: Colors.black.withOpacity(0.6), - toastText: Colors.white, - divider: Colors.black38, - ); - - static final dark = ColorThemeExtension( - border: Color(0xFF555555), - border2: Color(0xFFE5E5E5), - border3: Colors.white24, - highlight: Color(0xFF3F3F3F), - drag_indicator: Colors.grey, - shadow: Colors.grey, - errorBannerBg: Color(0xFF470F2D), - me: Colors.greenAccent, - toastBg: Colors.white.withOpacity(0.6), - toastText: Colors.black, - divider: Colors.white38, - ); - - @override - ThemeExtension copyWith({ - Color? border, - Color? border2, - Color? border3, - Color? highlight, - Color? drag_indicator, - Color? shadow, - Color? errorBannerBg, - Color? me, - Color? toastBg, - Color? toastText, - Color? divider, - }) { - return ColorThemeExtension( - border: border ?? this.border, - border2: border2 ?? this.border2, - border3: border3 ?? this.border3, - highlight: highlight ?? this.highlight, - drag_indicator: drag_indicator ?? this.drag_indicator, - shadow: shadow ?? this.shadow, - errorBannerBg: errorBannerBg ?? this.errorBannerBg, - me: me ?? this.me, - toastBg: toastBg ?? this.toastBg, - toastText: toastText ?? this.toastText, - divider: divider ?? this.divider, - ); - } - - @override - ThemeExtension lerp( - ThemeExtension? other, double t) { - if (other is! ColorThemeExtension) { - return this; - } - return ColorThemeExtension( - border: Color.lerp(border, other.border, t), - border2: Color.lerp(border2, other.border2, t), - border3: Color.lerp(border3, other.border3, t), - highlight: Color.lerp(highlight, other.highlight, t), - drag_indicator: Color.lerp(drag_indicator, other.drag_indicator, t), - shadow: Color.lerp(shadow, other.shadow, t), - errorBannerBg: Color.lerp(shadow, other.errorBannerBg, t), - me: Color.lerp(shadow, other.me, t), - toastBg: Color.lerp(shadow, other.toastBg, t), - toastText: Color.lerp(shadow, other.toastText, t), - divider: Color.lerp(shadow, other.divider, t), - ); - } -} - -class MyTheme { - MyTheme._(); - - static const Color grayBg = Color(0xFFEFEFF2); - static const Color accent = Color(0xFF0071FF); - static const Color accent50 = Color(0x770071FF); - static const Color accent80 = Color(0xAA0071FF); - static const Color canvasColor = Color(0xFF212121); - static const Color border = Color(0xFFCCCCCC); - static const Color idColor = Color(0xFF00B6F0); - static const Color darkGray = Color.fromARGB(255, 148, 148, 148); - static const Color cmIdColor = Color(0xFF21790B); - static const Color dark = Colors.black87; - static const Color button = Color(0xFF2C8CFF); - static const Color hoverBorder = Color(0xFF999999); - - // ListTile - static const ListTileThemeData listTileTheme = ListTileThemeData( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all( - Radius.circular(5), - ), - ), - ); - - static SwitchThemeData switchTheme() { - return SwitchThemeData( - splashRadius: (isDesktop || isWebDesktop) ? 0 : kRadialReactionRadius); - } - - static RadioThemeData radioTheme() { - return RadioThemeData( - splashRadius: (isDesktop || isWebDesktop) ? 0 : kRadialReactionRadius); - } - - // Checkbox - static const CheckboxThemeData checkboxTheme = CheckboxThemeData( - splashRadius: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all( - Radius.circular(5), - ), - ), - ); - - // TextButton - // Value is used to calculate "dialog.actionsPadding" - static const double mobileTextButtonPaddingLR = 20; - - // TextButton on mobile needs a fixed padding, otherwise small buttons - // like "OK" has a larger left/right padding. - static TextButtonThemeData mobileTextButtonTheme = TextButtonThemeData( - style: TextButton.styleFrom( - padding: EdgeInsets.symmetric(horizontal: mobileTextButtonPaddingLR), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8.0), - ), - ), - ); - - //tooltip - static TooltipThemeData tooltipTheme() { - return TooltipThemeData( - waitDuration: Duration(seconds: 1, milliseconds: 500), - ); - } - - // Dialogs - static const double dialogPadding = 24; - - // padding bottom depends on content (some dialogs has no content) - static EdgeInsets dialogTitlePadding({bool content = true}) { - final double p = dialogPadding; - - return EdgeInsets.fromLTRB(p, p, p, content ? 0 : p); - } - - // padding bottom depends on actions (mobile has dialogs without actions) - static EdgeInsets dialogContentPadding({bool actions = true}) { - final double p = dialogPadding; - - return (isDesktop || isWebDesktop) - ? EdgeInsets.fromLTRB(p, p, p, actions ? (p - 4) : p) - : EdgeInsets.fromLTRB(p, p, p, actions ? (p / 2) : p); - } - - static EdgeInsets dialogActionsPadding() { - final double p = dialogPadding; - - return (isDesktop || isWebDesktop) - ? EdgeInsets.fromLTRB(p, 0, p, (p - 4)) - : EdgeInsets.fromLTRB(p, 0, (p - mobileTextButtonPaddingLR), (p / 2)); - } - - static EdgeInsets dialogButtonPadding = (isDesktop || isWebDesktop) - ? EdgeInsets.only(left: dialogPadding) - : EdgeInsets.only(left: dialogPadding / 3); - - static ScrollbarThemeData scrollbarTheme = ScrollbarThemeData( - thickness: MaterialStateProperty.all(6), - thumbColor: MaterialStateProperty.resolveWith((states) { - if (states.contains(MaterialState.dragged)) { - return Colors.grey[900]; - } else if (states.contains(MaterialState.hovered)) { - return Colors.grey[700]; - } else { - return Colors.grey[500]; - } - }), - crossAxisMargin: 4, - ); - - static ScrollbarThemeData scrollbarThemeDark = scrollbarTheme.copyWith( - thumbColor: MaterialStateProperty.resolveWith((states) { - if (states.contains(MaterialState.dragged)) { - return Colors.grey[100]; - } else if (states.contains(MaterialState.hovered)) { - return Colors.grey[300]; - } else { - return Colors.grey[500]; - } - }), - ); - - static ThemeData lightTheme = ThemeData( - // https://stackoverflow.com/questions/77537315/after-upgrading-to-flutter-3-16-the-app-bar-background-color-button-size-and - useMaterial3: false, - brightness: Brightness.light, - hoverColor: Color.fromARGB(255, 224, 224, 224), - scaffoldBackgroundColor: Colors.white, - dialogBackgroundColor: Colors.white, - appBarTheme: AppBarTheme( - shadowColor: Colors.transparent, - ), - dialogTheme: DialogTheme( - elevation: 15, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(18.0), - side: BorderSide( - width: 1, - color: grayBg, - ), - ), - ), - scrollbarTheme: scrollbarTheme, - inputDecorationTheme: isDesktop - ? InputDecorationTheme( - fillColor: grayBg, - filled: true, - isDense: true, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - ) - : null, - textTheme: const TextTheme( - titleLarge: TextStyle(fontSize: 19, color: Colors.black87), - titleSmall: TextStyle(fontSize: 14, color: Colors.black87), - bodySmall: TextStyle(fontSize: 12, color: Colors.black87, height: 1.25), - bodyMedium: - TextStyle(fontSize: 14, color: Colors.black87, height: 1.25), - labelLarge: TextStyle(fontSize: 16.0, color: MyTheme.accent80)), - cardColor: grayBg, - hintColor: Color(0xFFAAAAAA), - visualDensity: VisualDensity.adaptivePlatformDensity, - tabBarTheme: const TabBarTheme( - labelColor: Colors.black87, - ), - tooltipTheme: tooltipTheme(), - splashColor: (isDesktop || isWebDesktop) ? Colors.transparent : null, - highlightColor: (isDesktop || isWebDesktop) ? Colors.transparent : null, - splashFactory: (isDesktop || isWebDesktop) ? NoSplash.splashFactory : null, - textButtonTheme: (isDesktop || isWebDesktop) - ? TextButtonThemeData( - style: TextButton.styleFrom( - splashFactory: NoSplash.splashFactory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(18.0), - ), - ), - ) - : mobileTextButtonTheme, - elevatedButtonTheme: ElevatedButtonThemeData( - style: ElevatedButton.styleFrom( - backgroundColor: MyTheme.accent, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8.0), - ), - ), - ), - outlinedButtonTheme: OutlinedButtonThemeData( - style: OutlinedButton.styleFrom( - backgroundColor: grayBg, - foregroundColor: Colors.black87, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8.0), - ), - ), - ), - switchTheme: switchTheme(), - radioTheme: radioTheme(), - checkboxTheme: checkboxTheme, - listTileTheme: listTileTheme, - menuBarTheme: MenuBarThemeData( - style: - MenuStyle(backgroundColor: MaterialStatePropertyAll(Colors.white))), - colorScheme: ColorScheme.light( - primary: Colors.blue, secondary: accent, background: grayBg), - popupMenuTheme: PopupMenuThemeData( - color: Colors.white, - shape: RoundedRectangleBorder( - side: BorderSide( - color: (isDesktop || isWebDesktop) - ? Color(0xFFECECEC) - : Colors.transparent), - borderRadius: BorderRadius.all(Radius.circular(8.0)), - )), - ).copyWith( - extensions: >[ - ColorThemeExtension.light, - TabbarTheme.light, - ], - ); - static ThemeData darkTheme = ThemeData( - useMaterial3: false, - brightness: Brightness.dark, - hoverColor: Color.fromARGB(255, 45, 46, 53), - scaffoldBackgroundColor: Color(0xFF18191E), - dialogBackgroundColor: Color(0xFF18191E), - appBarTheme: AppBarTheme( - shadowColor: Colors.transparent, - ), - dialogTheme: DialogTheme( - elevation: 15, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(18.0), - side: BorderSide( - width: 1, - color: Color(0xFF24252B), - ), - ), - ), - scrollbarTheme: scrollbarThemeDark, - inputDecorationTheme: (isDesktop || isWebDesktop) - ? InputDecorationTheme( - fillColor: Color(0xFF24252B), - filled: true, - isDense: true, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - ) - : null, - textTheme: const TextTheme( - titleLarge: TextStyle(fontSize: 19), - titleSmall: TextStyle(fontSize: 14), - bodySmall: TextStyle(fontSize: 12, height: 1.25), - bodyMedium: TextStyle(fontSize: 14, height: 1.25), - labelLarge: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold, - color: accent80, - ), - ), - cardColor: Color(0xFF24252B), - visualDensity: VisualDensity.adaptivePlatformDensity, - tabBarTheme: const TabBarTheme( - labelColor: Colors.white70, - ), - tooltipTheme: tooltipTheme(), - splashColor: (isDesktop || isWebDesktop) ? Colors.transparent : null, - highlightColor: (isDesktop || isWebDesktop) ? Colors.transparent : null, - splashFactory: (isDesktop || isWebDesktop) ? NoSplash.splashFactory : null, - textButtonTheme: (isDesktop || isWebDesktop) - ? TextButtonThemeData( - style: TextButton.styleFrom( - splashFactory: NoSplash.splashFactory, - disabledForegroundColor: Colors.white70, - foregroundColor: Colors.white70, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(18.0), - ), - ), - ) - : mobileTextButtonTheme, - elevatedButtonTheme: ElevatedButtonThemeData( - style: ElevatedButton.styleFrom( - backgroundColor: MyTheme.accent, - foregroundColor: Colors.white, - disabledForegroundColor: Colors.white70, - disabledBackgroundColor: Colors.white10, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8.0), - ), - ), - ), - outlinedButtonTheme: OutlinedButtonThemeData( - style: OutlinedButton.styleFrom( - backgroundColor: Color(0xFF24252B), - side: BorderSide(color: Colors.white12, width: 0.5), - disabledForegroundColor: Colors.white70, - foregroundColor: Colors.white70, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8.0), - ), - ), - ), - switchTheme: switchTheme(), - radioTheme: radioTheme(), - checkboxTheme: checkboxTheme, - listTileTheme: listTileTheme, - menuBarTheme: MenuBarThemeData( - style: MenuStyle( - backgroundColor: MaterialStatePropertyAll(Color(0xFF121212)))), - colorScheme: ColorScheme.dark( - primary: Colors.blue, - secondary: accent, - background: Color(0xFF24252B), - ), - popupMenuTheme: PopupMenuThemeData( - shape: RoundedRectangleBorder( - side: BorderSide(color: Colors.white24), - borderRadius: BorderRadius.all(Radius.circular(8.0)), - )), - ).copyWith( - extensions: >[ - ColorThemeExtension.dark, - TabbarTheme.dark, - ], - ); - - static ThemeMode getThemeModePreference() { - return themeModeFromString(bind.mainGetLocalOption(key: kCommConfKeyTheme)); - } - - static Future changeDarkMode(ThemeMode mode) async { - Get.changeThemeMode(mode); - if (desktopType == DesktopType.main || isAndroid || isIOS || isWeb) { - if (mode == ThemeMode.system) { - await bind.mainSetLocalOption( - key: kCommConfKeyTheme, value: defaultOptionTheme); - } else { - await bind.mainSetLocalOption( - key: kCommConfKeyTheme, value: mode.toShortString()); - } - if (!isWeb) await bind.mainChangeTheme(dark: mode.toShortString()); - // Synchronize the window theme of the system. - updateSystemWindowTheme(); - } - } - - static ThemeMode currentThemeMode() { - final preference = getThemeModePreference(); - if (preference == ThemeMode.system) { - if (WidgetsBinding.instance.platformDispatcher.platformBrightness == - Brightness.light) { - return ThemeMode.light; - } else { - return ThemeMode.dark; - } - } else { - return preference; - } - } - - static ColorThemeExtension color(BuildContext context) { - return Theme.of(context).extension()!; - } - - static TabbarTheme tabbar(BuildContext context) { - return Theme.of(context).extension()!; - } - - static ThemeMode themeModeFromString(String v) { - switch (v) { - case "light": - return ThemeMode.light; - case "dark": - return ThemeMode.dark; - default: - return ThemeMode.system; - } - } -} - -extension ParseToString on ThemeMode { - String toShortString() { - return toString().split('.').last; - } -} - -final ButtonStyle flatButtonStyle = TextButton.styleFrom( - minimumSize: Size(0, 36), - padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 10.0), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(2.0)), - ), -); - -List supportedLocales = const [ - Locale('en', 'US'), - Locale('zh', 'CN'), - Locale('zh', 'TW'), - Locale('zh', 'SG'), - Locale('fr'), - Locale('de'), - Locale('it'), - Locale('ja'), - Locale('cs'), - Locale('pl'), - Locale('ko'), - Locale('hu'), - Locale('pt'), - Locale('ru'), - Locale('sk'), - Locale('id'), - Locale('da'), - Locale('eo'), - Locale('tr'), - Locale('kz'), - Locale('es'), - Locale('nl'), - Locale('nb'), - Locale('et'), - Locale('eu'), - Locale('bg'), - Locale('be'), - Locale('vn'), - Locale('uk'), - Locale('fa'), - Locale('ca'), - Locale('el'), - Locale('sv'), - Locale('sq'), - Locale('sr'), - Locale('th'), - Locale('sl'), - Locale('ro'), - Locale('lt'), - Locale('lv'), - Locale('ar'), - Locale('he'), - Locale('hr'), -]; - -String formatDurationToTime(Duration duration) { - var totalTime = duration.inSeconds; - final secs = totalTime % 60; - totalTime = (totalTime - secs) ~/ 60; - final mins = totalTime % 60; - totalTime = (totalTime - mins) ~/ 60; - return "${totalTime.toString().padLeft(2, "0")}:${mins.toString().padLeft(2, "0")}:${secs.toString().padLeft(2, "0")}"; -} - -closeConnection({String? id}) { - if (isAndroid || isIOS) { - () async { - await SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, - overlays: SystemUiOverlay.values); - gFFI.chatModel.hideChatOverlay(); - Navigator.popUntil(globalKey.currentContext!, ModalRoute.withName("/")); - stateGlobal.isInMainPage = true; - }(); - } else { - if (isWeb) { - Navigator.popUntil(globalKey.currentContext!, ModalRoute.withName("/")); - stateGlobal.isInMainPage = true; - } else { - final controller = Get.find(); - controller.closeBy(id); - } - } -} - -Future windowOnTop(int? id) async { - if (!isDesktop) { - return; - } - print("Bring window '$id' on top"); - if (id == null) { - // main window - if (stateGlobal.isMinimized) { - await windowManager.restore(); - } - await windowManager.show(); - await windowManager.focus(); - await rustDeskWinManager.registerActiveWindow(kWindowMainId); - } else { - WindowController.fromWindowId(id) - ..focus() - ..show(); - rustDeskWinManager.call(WindowType.Main, kWindowEventShow, {"id": id}); - } -} - -typedef DialogBuilder = CustomAlertDialog Function( - StateSetter setState, void Function([dynamic]) close, BuildContext context); - -class Dialog { - OverlayEntry? entry; - Completer completer = Completer(); - - Dialog(); - - void complete(T? res) { - try { - if (!completer.isCompleted) { - completer.complete(res); - } - } catch (e) { - debugPrint("Dialog complete catch error: $e"); - } finally { - entry?.remove(); - } - } -} - -class OverlayKeyState { - final _overlayKey = GlobalKey(); - - /// use global overlay by default - OverlayState? get state => - _overlayKey.currentState ?? globalKey.currentState?.overlay; - - GlobalKey? get key => _overlayKey; -} - -class OverlayDialogManager { - final Map _dialogs = {}; - var _overlayKeyState = OverlayKeyState(); - int _tagCount = 0; - - OverlayEntry? _mobileActionsOverlayEntry; - RxBool mobileActionsOverlayVisible = true.obs; - - setMobileActionsOverlayVisible(bool v, {store = true}) { - if (store) { - bind.setLocalFlutterOption(k: kOptionShowMobileAction, v: v ? 'Y' : 'N'); - } - // No need to read the value from local storage after setting it. - // It better to toggle the value directly. - mobileActionsOverlayVisible.value = v; - } - - loadMobileActionsOverlayVisible() { - mobileActionsOverlayVisible.value = - bind.getLocalFlutterOption(k: kOptionShowMobileAction) != 'N'; - } - - void setOverlayState(OverlayKeyState overlayKeyState) { - _overlayKeyState = overlayKeyState; - } - - void dismissAll() { - _dialogs.forEach((key, value) { - value.complete(null); - BackButtonInterceptor.removeByName(key); - }); - _dialogs.clear(); - } - - void dismissByTag(String tag) { - _dialogs[tag]?.complete(null); - _dialogs.remove(tag); - BackButtonInterceptor.removeByName(tag); - } - - Future show(DialogBuilder builder, - {bool clickMaskDismiss = false, - bool backDismiss = false, - String? tag, - bool useAnimation = true, - bool forceGlobal = false}) { - final overlayState = - forceGlobal ? globalKey.currentState?.overlay : _overlayKeyState.state; - - if (overlayState == null) { - return Future.error( - "[OverlayDialogManager] Failed to show dialog, _overlayState is null, call [setOverlayState] first"); - } - - final String dialogTag; - if (tag != null) { - dialogTag = tag; - } else { - dialogTag = _tagCount.toString(); - _tagCount++; - } - - final dialog = Dialog(); - _dialogs[dialogTag] = dialog; - - close([res]) { - _dialogs.remove(dialogTag); - try { - dialog.complete(res); - } catch (e) { - debugPrint("Dialog complete catch error: $e"); - } - BackButtonInterceptor.removeByName(dialogTag); - } - - dialog.entry = OverlayEntry(builder: (context) { - bool innerClicked = false; - return Listener( - onPointerUp: (_) { - if (!innerClicked && clickMaskDismiss) { - close(); - } - innerClicked = false; - }, - child: Container( - color: Theme.of(context).brightness == Brightness.light - ? Colors.black12 - : Colors.black45, - child: StatefulBuilder(builder: (context, setState) { - return Listener( - onPointerUp: (_) => innerClicked = true, - child: builder(setState, close, overlayState.context), - ); - }))); - }); - overlayState.insert(dialog.entry!); - BackButtonInterceptor.add((stopDefaultButtonEvent, routeInfo) { - if (backDismiss) { - close(); - } - return true; - }, name: dialogTag); - return dialog.completer.future; - } - - String showLoading(String text, - {bool clickMaskDismiss = false, - bool showCancel = true, - VoidCallback? onCancel, - String? tag}) { - if (tag == null) { - tag = _tagCount.toString(); - _tagCount++; - } - show((setState, close, context) { - cancel() { - dismissAll(); - if (onCancel != null) { - onCancel(); - } - } - - return CustomAlertDialog( - content: Container( - constraints: const BoxConstraints(maxWidth: 240), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 30), - const Center(child: CircularProgressIndicator()), - const SizedBox(height: 20), - Center( - child: Text(translate(text), - style: const TextStyle(fontSize: 15))), - const SizedBox(height: 20), - Offstage( - offstage: !showCancel, - child: Center( - child: (isDesktop || isWebDesktop) - ? dialogButton('Cancel', onPressed: cancel) - : TextButton( - style: flatButtonStyle, - onPressed: cancel, - child: Text(translate('Cancel'), - style: const TextStyle( - color: MyTheme.accent))))) - ])), - onCancel: showCancel ? cancel : null, - ); - }, tag: tag); - return tag; - } - - void resetMobileActionsOverlay({FFI? ffi}) { - if (_mobileActionsOverlayEntry == null) return; - hideMobileActionsOverlay(); - showMobileActionsOverlay(ffi: ffi); - } - - void showMobileActionsOverlay({FFI? ffi}) { - if (_mobileActionsOverlayEntry != null) return; - final overlayState = _overlayKeyState.state; - if (overlayState == null) return; - - final overlay = makeMobileActionsOverlayEntry( - () => hideMobileActionsOverlay(), - ffi: ffi, - ); - overlayState.insert(overlay); - _mobileActionsOverlayEntry = overlay; - setMobileActionsOverlayVisible(true); - } - - void hideMobileActionsOverlay({store = true}) { - if (_mobileActionsOverlayEntry != null) { - _mobileActionsOverlayEntry!.remove(); - _mobileActionsOverlayEntry = null; - setMobileActionsOverlayVisible(false, store: store); - return; - } - } - - void toggleMobileActionsOverlay({FFI? ffi}) { - if (_mobileActionsOverlayEntry == null) { - showMobileActionsOverlay(ffi: ffi); - } else { - hideMobileActionsOverlay(); - } - } - - bool existing(String tag) { - return _dialogs.keys.contains(tag); - } -} - -makeMobileActionsOverlayEntry(VoidCallback? onHide, {FFI? ffi}) { - makeMobileActions(BuildContext context, double s) { - final scale = s < 0.85 ? 0.85 : s; - final session = ffi ?? gFFI; - const double overlayW = 200; - const double overlayH = 45; - computeOverlayPosition() { - final screenW = MediaQuery.of(context).size.width; - final screenH = MediaQuery.of(context).size.height; - final left = (screenW - overlayW * scale) / 2; - final top = screenH - (overlayH + 80) * scale; - return Offset(left, top); - } - - if (draggablePositions.mobileActions.isInvalid()) { - draggablePositions.mobileActions.update(computeOverlayPosition()); - } else { - draggablePositions.mobileActions.tryAdjust(overlayW, overlayH, scale); - } - return DraggableMobileActions( - scale: scale, - position: draggablePositions.mobileActions, - width: overlayW, - height: overlayH, - onBackPressed: session.inputModel.onMobileBack, - onHomePressed: session.inputModel.onMobileHome, - onRecentPressed: session.inputModel.onMobileApps, - onHidePressed: onHide, - ); - } - - return OverlayEntry(builder: (context) { - if (isDesktop) { - final c = Provider.of(context); - return makeMobileActions(context, c.scale * 2.0); - } else { - return makeMobileActions(globalKey.currentContext!, 1.0); - } - }); -} - -void showToast(String text, - {Duration timeout = const Duration(seconds: 3), - Alignment alignment = const Alignment(0.0, 0.8)}) { - final overlayState = globalKey.currentState?.overlay; - if (overlayState == null) return; - final entry = OverlayEntry(builder: (context) { - return IgnorePointer( - child: Align( - alignment: alignment, - child: Container( - decoration: BoxDecoration( - color: MyTheme.color(context).toastBg, - borderRadius: const BorderRadius.all( - Radius.circular(20), - ), - ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 5), - child: Text( - text, - textAlign: TextAlign.center, - style: TextStyle( - decoration: TextDecoration.none, - fontWeight: FontWeight.w300, - fontSize: 18, - color: MyTheme.color(context).toastText), - ), - ))); - }); - overlayState.insert(entry); - Future.delayed(timeout, () { - entry.remove(); - }); -} - -// TODO -// - Remove argument "contentPadding", no need for it, all should look the same. -// - Remove "required" for argument "content". See simple confirm dialog "delete peer", only title and actions are used. No need to "content: SizedBox.shrink()". -// - Make dead code alive, transform arguments "onSubmit" and "onCancel" into correspondenting buttons "ConfirmOkButton", "CancelButton". -class CustomAlertDialog extends StatelessWidget { - const CustomAlertDialog( - {Key? key, - this.title, - this.titlePadding, - required this.content, - this.actions, - this.contentPadding, - this.contentBoxConstraints = const BoxConstraints(maxWidth: 500), - this.onSubmit, - this.onCancel}) - : super(key: key); - - final Widget? title; - final EdgeInsetsGeometry? titlePadding; - final Widget content; - final List? actions; - final double? contentPadding; - final BoxConstraints contentBoxConstraints; - final Function()? onSubmit; - final Function()? onCancel; - - @override - Widget build(BuildContext context) { - // request focus - FocusScopeNode scopeNode = FocusScopeNode(); - Future.delayed(Duration.zero, () { - if (!scopeNode.hasFocus) scopeNode.requestFocus(); - }); - bool tabTapped = false; - if (isAndroid) gFFI.invokeMethod("enable_soft_keyboard", true); - - return FocusScope( - node: scopeNode, - autofocus: true, - onKey: (node, key) { - if (key.logicalKey == LogicalKeyboardKey.escape) { - if (key is RawKeyDownEvent) { - onCancel?.call(); - } - return KeyEventResult.handled; // avoid TextField exception on escape - } else if (!tabTapped && - onSubmit != null && - (key.logicalKey == LogicalKeyboardKey.enter || - key.logicalKey == LogicalKeyboardKey.numpadEnter)) { - if (key is RawKeyDownEvent) onSubmit?.call(); - return KeyEventResult.handled; - } else if (key.logicalKey == LogicalKeyboardKey.tab) { - if (key is RawKeyDownEvent) { - scopeNode.nextFocus(); - tabTapped = true; - } - return KeyEventResult.handled; - } - return KeyEventResult.ignored; - }, - child: AlertDialog( - scrollable: true, - title: title, - content: ConstrainedBox( - constraints: contentBoxConstraints, - child: content, - ), - actions: actions, - titlePadding: titlePadding ?? MyTheme.dialogTitlePadding(), - contentPadding: - MyTheme.dialogContentPadding(actions: actions is List), - actionsPadding: MyTheme.dialogActionsPadding(), - buttonPadding: MyTheme.dialogButtonPadding), - ); - } -} - -Widget createDialogContent(String text) { - final RegExp linkRegExp = RegExp(r'(https?://[^\s]+)'); - bool hasLink = linkRegExp.hasMatch(text); - - // Early return: no link, use default theme color - if (!hasLink) { - return SelectableText(text, style: const TextStyle(fontSize: 15)); - } - - final List spans = []; - int start = 0; - - linkRegExp.allMatches(text).forEach((match) { - if (match.start > start) { - spans.add(TextSpan(text: text.substring(start, match.start))); - } - spans.add(TextSpan( - text: match.group(0) ?? '', - style: const TextStyle( - color: Colors.blue, - decoration: TextDecoration.underline, - ), - recognizer: TapGestureRecognizer() - ..onTap = () { - String linkText = match.group(0) ?? ''; - linkText = linkText.replaceAll(RegExp(r'[.,;!?]+$'), ''); - launchUrl(Uri.parse(linkText)); - }, - )); - start = match.end; - }); - - if (start < text.length) { - spans.add(TextSpan(text: text.substring(start))); - } - - return SelectableText.rich( - TextSpan( - style: const TextStyle(fontSize: 15), - children: spans, - ), - ); -} - -void msgBox(SessionID sessionId, String type, String title, String text, - String link, OverlayDialogManager dialogManager, - {bool? hasCancel, - ReconnectHandle? reconnect, - int? reconnectTimeout, - VoidCallback? onSubmit, - int? submitTimeout}) { - dialogManager.dismissAll(); - List buttons = []; - bool hasOk = false; - submit() { - dialogManager.dismissAll(); - if (onSubmit != null) { - onSubmit.call(); - } else { - // https://github.com/rustdesk/rustdesk/blob/5e9a31340b899822090a3731769ae79c6bf5f3e5/src/ui/common.tis#L263 - if (!type.contains("custom") && desktopType != DesktopType.portForward) { - closeConnection(); - } - } - } - - cancel() { - dialogManager.dismissAll(); - } - - jumplink() { - if (link.startsWith('http')) { - launchUrl(Uri.parse(link)); - } - } - - if (type != "connecting" && type != "success" && !type.contains("nook")) { - hasOk = true; - late final Widget btn; - if (submitTimeout != null) { - btn = _CountDownButton( - text: 'OK', - second: submitTimeout, - onPressed: submit, - submitOnTimeout: true, - ); - } else { - btn = dialogButton('OK', onPressed: submit); - } - buttons.insert(0, btn); - } - hasCancel ??= !type.contains("error") && - !type.contains("nocancel") && - type != "restarting"; - if (hasCancel) { - buttons.insert( - 0, dialogButton('Cancel', onPressed: cancel, isOutline: true)); - } - if (type.contains("hasclose")) { - buttons.insert( - 0, - dialogButton('Close', onPressed: () { - dialogManager.dismissAll(); - })); - } - if (reconnect != null && - title == "Connection Error" && - reconnectTimeout != null) { - // `enabled` is used to disable the dialog button once the button is clicked. - final enabled = true.obs; - final button = Obx(() => _CountDownButton( - text: 'Reconnect', - second: reconnectTimeout, - onPressed: enabled.isTrue - ? () { - // Disable the button - enabled.value = false; - reconnect(dialogManager, sessionId, false); - } - : null, - )); - buttons.insert(0, button); - } - if (link.isNotEmpty) { - buttons.insert(0, dialogButton('JumpLink', onPressed: jumplink)); - } - dialogManager.show( - (setState, close, context) => CustomAlertDialog( - title: null, - content: SelectionArea(child: msgboxContent(type, title, text)), - actions: buttons, - onSubmit: hasOk ? submit : null, - onCancel: hasCancel == true ? cancel : null, - ), - tag: '$sessionId-$type-$title-$text-$link', - ); -} - -Color? _msgboxColor(String type) { - if (type == "input-password" || type == "custom-os-password") { - return Color(0xFFAD448E); - } - if (type.contains("success")) { - return Color(0xFF32bea6); - } - if (type.contains("error") || type == "re-input-password") { - return Color(0xFFE04F5F); - } - return Color(0xFF2C8CFF); -} - -Widget msgboxIcon(String type) { - IconData? iconData; - if (type.contains("error") || type == "re-input-password") { - iconData = Icons.cancel; - } - if (type.contains("success")) { - iconData = Icons.check_circle; - } - if (type == "wait-uac" || type == "wait-remote-accept-nook") { - iconData = Icons.hourglass_top; - } - if (type == 'on-uac' || type == 'on-foreground-elevated') { - iconData = Icons.admin_panel_settings; - } - if (type.contains('info')) { - iconData = Icons.info; - } - if (iconData != null) { - return Icon(iconData, size: 50, color: _msgboxColor(type)) - .marginOnly(right: 16); - } - - return Offstage(); -} - -// title should be null -Widget msgboxContent(String type, String title, String text) { - String translateText(String text) { - if (text.indexOf('Failed') == 0 && text.indexOf(': ') > 0) { - List words = text.split(': '); - for (var i = 0; i < words.length; ++i) { - words[i] = translate(words[i]); - } - text = words.join(': '); - } else { - List words = text.split(' '); - if (words.length > 1 && words[0].endsWith('_tip')) { - words[0] = translate(words[0]); - final rest = text.substring(words[0].length + 1); - text = '${words[0]} ${translate(rest)}'; - } else { - text = translate(text); - } - } - return text; - } - - return Row( - children: [ - msgboxIcon(type), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - translate(title), - style: TextStyle(fontSize: 21), - ).marginOnly(bottom: 10), - createDialogContent(translateText(text)), - ], - ), - ), - ], - ).marginOnly(bottom: 12); -} - -void msgBoxCommon(OverlayDialogManager dialogManager, String title, - Widget content, List buttons, - {bool hasCancel = true}) { - dialogManager.show((setState, close, context) => CustomAlertDialog( - title: Text( - translate(title), - style: TextStyle(fontSize: 21), - ), - content: content, - actions: buttons, - onCancel: hasCancel ? close : null, - )); -} - -Color str2color(String str, [alpha = 0xFF]) { - var hash = 160 << 16 + 114 << 8 + 91; - for (var i = 0; i < str.length; i += 1) { - hash = str.codeUnitAt(i) + ((hash << 5) - hash); - } - hash = hash % 16777216; - return Color((hash & 0xFF7FFF) | (alpha << 24)); -} - -Color str2color2(String str, {List existing = const []}) { - Map colorMap = { - "red": Colors.red, - "green": Colors.green, - "blue": Colors.blue, - "orange": Colors.orange, - "purple": Colors.purple, - "grey": Colors.grey, - "cyan": Colors.cyan, - "lime": Colors.lime, - "teal": Colors.teal, - "pink": Colors.pink[200]!, - "indigo": Colors.indigo, - "brown": Colors.brown, - }; - final color = colorMap[str.toLowerCase()]; - if (color != null) { - return color.withAlpha(0xFF); - } - if (str.toLowerCase() == 'yellow') { - return Colors.yellow.withAlpha(0xFF); - } - var hash = 0; - for (var i = 0; i < str.length; i++) { - hash += str.codeUnitAt(i); - } - List colorList = colorMap.values.toList(); - hash = hash % colorList.length; - var result = colorList[hash].withAlpha(0xFF); - if (existing.contains(result.value)) { - Color? notUsed = - colorList.firstWhereOrNull((e) => !existing.contains(e.value)); - if (notUsed != null) { - result = notUsed; - } - } - return result; -} - -const K = 1024; -const M = K * K; -const G = M * K; - -String readableFileSize(double size) { - if (size < K) { - return "${size.toStringAsFixed(2)} B"; - } else if (size < M) { - return "${(size / K).toStringAsFixed(2)} KB"; - } else if (size < G) { - return "${(size / M).toStringAsFixed(2)} MB"; - } else { - return "${(size / G).toStringAsFixed(2)} GB"; - } -} - -/// Flutter can't not catch PointerMoveEvent when size is 1 -/// This will happen in Android AccessibilityService Input -/// android can't init dispatching size yet ,see: https://stackoverflow.com/questions/59960451/android-accessibility-dispatchgesture-is-it-possible-to-specify-pressure-for-a -/// use this temporary solution until flutter or android fixes the bug -class AccessibilityListener extends StatelessWidget { - final Widget? child; - static final offset = 100; - - AccessibilityListener({this.child}); - - @override - Widget build(BuildContext context) { - return Listener( - onPointerDown: (evt) { - if (evt.size == 1) { - GestureBinding.instance.handlePointerEvent(PointerAddedEvent( - pointer: evt.pointer + offset, position: evt.position)); - GestureBinding.instance.handlePointerEvent(PointerDownEvent( - pointer: evt.pointer + offset, - size: 0.1, - position: evt.position)); - } - }, - onPointerUp: (evt) { - if (evt.size == 1) { - GestureBinding.instance.handlePointerEvent(PointerUpEvent( - pointer: evt.pointer + offset, - size: 0.1, - position: evt.position)); - GestureBinding.instance.handlePointerEvent(PointerRemovedEvent( - pointer: evt.pointer + offset, position: evt.position)); - } - }, - onPointerMove: (evt) { - if (evt.size == 1) { - GestureBinding.instance.handlePointerEvent(PointerMoveEvent( - pointer: evt.pointer + offset, - size: 0.1, - delta: evt.delta, - position: evt.position)); - } - }, - child: child); - } -} - -class AndroidPermissionManager { - static Completer? _completer; - static Timer? _timer; - static var _current = ""; - - static bool isWaitingFile() { - if (_completer != null) { - return !_completer!.isCompleted && _current == kManageExternalStorage; - } - return false; - } - - static Future check(String type) { - if (isDesktop || isWeb) { - return Future.value(true); - } - return gFFI.invokeMethod("check_permission", type); - } - - // startActivity goto Android Setting's page to request permission manually by user - static void startAction(String action) { - gFFI.invokeMethod(AndroidChannel.kStartAction, action); - } - - /// We use XXPermissions to request permissions, - /// for supported types, see https://github.com/getActivity/XXPermissions/blob/e46caea32a64ad7819df62d448fb1c825481cd28/library/src/main/java/com/hjq/permissions/Permission.java - static Future request(String type) { - if (isDesktop || isWeb) { - return Future.value(true); - } - - gFFI.invokeMethod("request_permission", type); - - // clear last task - if (_completer?.isCompleted == false) { - _completer?.complete(false); - } - _timer?.cancel(); - - _current = type; - _completer = Completer(); - - _timer = Timer(Duration(seconds: 120), () { - if (_completer == null) return; - if (!_completer!.isCompleted) { - _completer!.complete(false); - } - _completer = null; - _current = ""; - }); - return _completer!.future; - } - - static complete(String type, bool res) { - if (type != _current) { - res = false; - } - _timer?.cancel(); - _completer?.complete(res); - _current = ""; - } -} - -RadioListTile getRadio( - Widget title, T toValue, T curValue, ValueChanged? onChange, - {bool? dense}) { - return RadioListTile( - visualDensity: VisualDensity.compact, - controlAffinity: ListTileControlAffinity.trailing, - title: title, - value: toValue, - groupValue: curValue, - onChanged: onChange, - dense: dense, - ); -} - -/// find ffi, tag is Remote ID -/// for session specific usage -FFI ffi(String? tag) { - return Get.find(tag: tag); -} - -/// Global FFI object -late FFI _globalFFI; - -FFI get gFFI => _globalFFI; - -Future initGlobalFFI() async { - debugPrint("_globalFFI init"); - _globalFFI = FFI(null); - debugPrint("_globalFFI init end"); - // after `put`, can also be globally found by Get.find(); - Get.put(_globalFFI, permanent: true); -} - -String translate(String name) { - if (name.startsWith('Failed to') && name.contains(': ')) { - return name.split(': ').map((x) => translate(x)).join(': '); - } - return platformFFI.translate(name, localeName); -} - -// This function must be kept the same as the one in rust and sciter code. -// rust: libs/hbb_common/src/config.rs -> option2bool() -// sciter: Does not have the function, but it should be kept the same. -bool option2bool(String option, String value) { - bool res; - if (option.startsWith("enable-")) { - res = value != "N"; - } else if (option.startsWith("allow-") || - option == kOptionStopService || - option == kOptionDirectServer || - option == kOptionForceAlwaysRelay) { - res = value == "Y"; - } else { - // "" is true - res = value != "N"; - } - return res; -} - -String bool2option(String option, bool b) { - String res; - if (option.startsWith('enable-') && - option != kOptionEnableUdpPunch && - option != kOptionEnableIpv6Punch) { - res = b ? defaultOptionYes : 'N'; - } else if (option.startsWith('allow-') || - option == kOptionStopService || - option == kOptionDirectServer || - option == kOptionForceAlwaysRelay) { - res = b ? 'Y' : defaultOptionNo; - } else { - res = b ? 'Y' : 'N'; - } - return res; -} - -mainSetBoolOption(String key, bool value) async { - String v = bool2option(key, value); - await bind.mainSetOption(key: key, value: v); -} - -Future mainGetBoolOption(String key) async { - return option2bool(key, await bind.mainGetOption(key: key)); -} - -bool mainGetBoolOptionSync(String key) { - return option2bool(key, bind.mainGetOptionSync(key: key)); -} - -mainSetLocalBoolOption(String key, bool value) async { - String v = bool2option(key, value); - await bind.mainSetLocalOption(key: key, value: v); -} - -bool mainGetLocalBoolOptionSync(String key) { - return option2bool(key, bind.mainGetLocalOption(key: key)); -} - -bool mainGetPeerBoolOptionSync(String id, String key) { - return option2bool(key, bind.mainGetPeerOptionSync(id: id, key: key)); -} - -// Don't use `option2bool()` and `bool2option()` to convert the session option. -// Use `sessionGetToggleOption()` and `sessionToggleOption()` instead. -// Because all session options use `Y` and `` as values. - -Future matchPeer( - String searchText, Peer peer, PeerTabIndex peerTabIndex) async { - if (searchText.isEmpty) { - return true; - } - if (peer.id.toLowerCase().contains(searchText)) { - return true; - } - if (peer.hostname.toLowerCase().contains(searchText) || - peer.username.toLowerCase().contains(searchText)) { - return true; - } - if (peer.alias.toLowerCase().contains(searchText)) { - return true; - } - if (peerTabShowNote(peerTabIndex) && - peer.note.toLowerCase().contains(searchText)) { - return true; - } - return false; -} - -/// Get the image for the current [platform]. -Widget getPlatformImage(String platform, {double size = 50}) { - if (platform.isEmpty) { - return Container(width: size, height: size); - } - if (platform == kPeerPlatformMacOS) { - platform = 'mac'; - } else if (platform != kPeerPlatformLinux && - platform != kPeerPlatformAndroid) { - platform = 'win'; - } else { - platform = platform.toLowerCase(); - } - return SvgPicture.asset('assets/$platform.svg', height: size, width: size); -} - -class LastWindowPosition { - double? width; - double? height; - double? offsetWidth; - double? offsetHeight; - bool? isMaximized; - bool? isFullscreen; - - LastWindowPosition(this.width, this.height, this.offsetWidth, - this.offsetHeight, this.isMaximized, this.isFullscreen); - - bool equals(LastWindowPosition other) { - return ((width == other.width) && - (height == other.height) && - (offsetWidth == other.offsetWidth) && - (offsetHeight == other.offsetHeight) && - (isMaximized == other.isMaximized) && - (isFullscreen == other.isFullscreen)); - } - - Map toJson() { - return { - "width": width, - "height": height, - "offsetWidth": offsetWidth, - "offsetHeight": offsetHeight, - "isMaximized": isMaximized, - "isFullscreen": isFullscreen, - }; - } - - @override - String toString() { - return jsonEncode(toJson()); - } - - static LastWindowPosition? loadFromString(String content) { - if (content.isEmpty) { - return null; - } - try { - final m = jsonDecode(content); - return LastWindowPosition(m["width"], m["height"], m["offsetWidth"], - m["offsetHeight"], m["isMaximized"], m["isFullscreen"]); - } catch (e) { - debugPrintStack( - label: - 'Failed to load LastWindowPosition "$content" ${e.toString()}'); - return null; - } - } -} - -String get windowFramePrefix => - kWindowPrefix + - (bind.isIncomingOnly() - ? "incoming_" - : (bind.isOutgoingOnly() ? "outgoing_" : "")); - -typedef WindowKey = ({WindowType type, int? windowId}); - -LastWindowPosition? _lastWindowPosition = null; -final Debouncer _saveWindowDebounce = Debouncer(delay: Duration(seconds: 1)); - -/// Save window position and size on exit -/// Note that windowId must be provided if it's subwindow -Future saveWindowPosition(WindowType type, - {int? windowId, bool? flush}) async { - if (type != WindowType.Main && windowId == null) { - debugPrint( - "Error: windowId cannot be null when saving positions for sub window"); - } - - Offset? position; - Size? sz; - late bool isMaximized; - bool isFullscreen = stateGlobal.fullscreen.isTrue; - - setPreFrame() { - final pos = bind.getLocalFlutterOption(k: windowFramePrefix + type.name); - var lpos = LastWindowPosition.loadFromString(pos); - if (lpos != null) { - if (lpos.offsetWidth != null && lpos.offsetHeight != null) { - position = Offset(lpos.offsetWidth!, lpos.offsetHeight!); - } - if (lpos.width != null && lpos.height != null) { - sz = Size(lpos.width!, lpos.height!); - } - } - } - - switch (type) { - case WindowType.Main: - // Checking `bind.isIncomingOnly()` is a simple workaround for MacOS. - // `await windowManager.isMaximized()` will always return true - // if is not resizable. The reason is unknown. - // - // `setResizable(!bind.isIncomingOnly());` in main.dart - isMaximized = - bind.isIncomingOnly() ? false : await windowManager.isMaximized(); - if (isFullscreen || isMaximized) { - setPreFrame(); - } else { - position = await windowManager.getPosition( - ignoreDevicePixelRatio: _ignoreDevicePixelRatio); - sz = await windowManager.getSize( - ignoreDevicePixelRatio: _ignoreDevicePixelRatio); - } - break; - default: - final wc = WindowController.fromWindowId(windowId!); - isMaximized = await wc.isMaximized(); - if (isFullscreen || isMaximized) { - setPreFrame(); - } else { - final Rect frame; - try { - frame = await wc.getFrame(); - } catch (e) { - debugPrint( - "Failed to get frame of window $windowId, it may be hidden"); - return; - } - position = frame.topLeft; - sz = frame.size; - } - break; - } - if (isWindows && position != null) { - const kMinOffset = -10000; - const kMaxOffset = 10000; - if (position!.dx < kMinOffset || - position!.dy < kMinOffset || - position!.dx > kMaxOffset || - position!.dy > kMaxOffset) { - debugPrint("Invalid position: $position, ignore saving position"); - return; - } - } - - final pos = LastWindowPosition(sz?.width, sz?.height, position?.dx, - position?.dy, isMaximized, isFullscreen); - - final WindowKey key = (type: type, windowId: windowId); - - final bool haveNewWindowPosition = - (_lastWindowPosition == null) || !pos.equals(_lastWindowPosition!); - final bool isPreviousNewWindowPositionPending = _saveWindowDebounce.isRunning; - - if (haveNewWindowPosition || isPreviousNewWindowPositionPending) { - _lastWindowPosition = pos; - - if (flush ?? false) { - // If a previous update is pending, replace it. - _saveWindowDebounce.cancel(); - await _saveWindowPositionActual(key); - } else if (haveNewWindowPosition) { - _saveWindowDebounce.call(() => _saveWindowPositionActual(key)); - } - } -} - -Future _saveWindowPositionActual(WindowKey key) async { - LastWindowPosition? pos = _lastWindowPosition; - - if (pos != null) { - debugPrint( - "Saving frame: ${key.windowId}: ${pos.width}/${pos.height}, offset:${pos.offsetWidth}/${pos.offsetHeight}, isMaximized:${pos.isMaximized}, isFullscreen:${pos.isFullscreen}"); - - await bind.setLocalFlutterOption( - k: windowFramePrefix + key.type.name, v: pos.toString()); - - if ((key.type == WindowType.RemoteDesktop || - key.type == WindowType.ViewCamera) && - key.windowId != null) { - await _saveSessionWindowPosition(key.type, key.windowId!, - pos.isMaximized ?? false, pos.isFullscreen ?? false, pos); - } - } -} - -Future _saveSessionWindowPosition(WindowType windowType, int windowId, - bool isMaximized, bool isFullscreen, LastWindowPosition pos) async { - final remoteList = await DesktopMultiWindow.invokeMethod( - windowId, kWindowEventGetRemoteList, null); - getPeerPos(String peerId) { - if (isMaximized || isFullscreen) { - final peerPos = bind.mainGetPeerFlutterOptionSync( - id: peerId, k: windowFramePrefix + windowType.name); - var lpos = LastWindowPosition.loadFromString(peerPos); - return LastWindowPosition( - lpos?.width ?? pos.offsetWidth, - lpos?.height ?? pos.offsetHeight, - lpos?.offsetWidth ?? pos.offsetWidth, - lpos?.offsetHeight ?? pos.offsetHeight, - isMaximized, - isFullscreen) - .toString(); - } else { - return pos.toString(); - } - } - - if (remoteList != null) { - for (final peerId in remoteList.split(',')) { - bind.mainSetPeerFlutterOptionSync( - id: peerId, - k: windowFramePrefix + windowType.name, - v: getPeerPos(peerId)); - } - } -} - -Future _adjustRestoreMainWindowSize(double? width, double? height) async { - const double minWidth = 1; - const double minHeight = 1; - const double maxWidth = 6480; - const double maxHeight = 6480; - - final defaultWidth = - ((isDesktop || isWebDesktop) ? 1280 : kMobileDefaultDisplayWidth) - .toDouble(); - final defaultHeight = - ((isDesktop || isWebDesktop) ? 720 : kMobileDefaultDisplayHeight) - .toDouble(); - double restoreWidth = width ?? defaultWidth; - double restoreHeight = height ?? defaultHeight; - - if (restoreWidth < minWidth) { - restoreWidth = defaultWidth; - } - if (restoreHeight < minHeight) { - restoreHeight = defaultHeight; - } - if (restoreWidth > maxWidth) { - restoreWidth = defaultWidth; - } - if (restoreHeight > maxHeight) { - restoreHeight = defaultHeight; - } - return Size(restoreWidth, restoreHeight); -} - -// Consider using Rect.contains() instead, -// though the implementation is not exactly the same. -bool isPointInRect(Offset point, Rect rect) { - return point.dx >= rect.left && - point.dx <= rect.right && - point.dy >= rect.top && - point.dy <= rect.bottom; -} - -/// return null means center -Future _adjustRestoreMainWindowOffset( - double? left, - double? top, - double? width, - double? height, -) async { - if (left == null || top == null || width == null || height == null) { - return null; - } - - if (isDesktop || isWebDesktop) { - final screens = await window_size.getScreenList(); - if (screens.isNotEmpty) { - final windowRect = Rect.fromLTWH(left, top, width, height); - bool isVisible = false; - for (final screen in screens) { - final intersection = windowRect.intersect(screen.visibleFrame); - if (intersection.width >= 10.0 && intersection.height >= 10.0) { - isVisible = true; - break; - } - } - if (!isVisible) { - return null; - } - return Offset(left, top); - } - } - - double frameLeft = 0.0; - double frameTop = 0.0; - double frameRight = ((isDesktop || isWebDesktop) - ? kDesktopMaxDisplaySize - : kMobileMaxDisplaySize) - .toDouble(); - double frameBottom = ((isDesktop || isWebDesktop) - ? kDesktopMaxDisplaySize - : kMobileMaxDisplaySize) - .toDouble(); - - final minWidth = 10.0; - if ((left + minWidth) > frameRight || - (top + minWidth) > frameBottom || - (left + width - minWidth) < frameLeft || - top < frameTop) { - return null; - } else { - return Offset(left, top); - } -} - -/// Restore window position and size on start -/// Note that windowId must be provided if it's subwindow -// -// display is used to set the offset of the window in individual display mode. -Future restoreWindowPosition(WindowType type, - {int? windowId, String? peerId, int? display}) async { - if (bind - .mainGetEnv(key: "DISABLE_RUSTDESK_RESTORE_WINDOW_POSITION") - .isNotEmpty) { - return false; - } - if (type != WindowType.Main && windowId == null) { - debugPrint( - "Error: windowId cannot be null when saving positions for sub window"); - return false; - } - - bool isRemotePeerPos = false; - String? pos; - // No need to check mainGetLocalBoolOptionSync(kOptionOpenNewConnInTabs) - // Though "open in tabs" is true and the new window restore peer position, it's ok. - if ((type == WindowType.RemoteDesktop || type == WindowType.ViewCamera) && - windowId != null && - peerId != null) { - final peerPos = bind.mainGetPeerFlutterOptionSync( - id: peerId, k: windowFramePrefix + type.name); - if (peerPos.isNotEmpty) { - pos = peerPos; - } - isRemotePeerPos = pos != null; - } - pos ??= bind.getLocalFlutterOption(k: windowFramePrefix + type.name); - - var lpos = LastWindowPosition.loadFromString(pos); - if (lpos == null) { - debugPrint("No window position saved, trying to center the window."); - switch (type) { - case WindowType.Main: - // Center the main window only if no position is saved (on first run). - if (isWindows || isLinux) { - await windowManager.center(); - } - // For MacOS, the window is already centered by default. - // See https://github.com/rustdesk/rustdesk/blob/9b9276e7524523d7f667fefcd0694d981443df0e/flutter/macos/Runner/Base.lproj/MainMenu.xib#L333 - // If `` in `` is not set, the window will be centered. - break; - default: - // No need to change the position of a sub window if no position is saved, - // since the default position is already centered. - // https://github.com/rustdesk/rustdesk/blob/317639169359936f7f9f85ef445ec9774218772d/flutter/lib/utils/multi_window_manager.dart#L163 - break; - } - return true; - } - if (type == WindowType.RemoteDesktop || type == WindowType.ViewCamera) { - if (!isRemotePeerPos && windowId != null) { - if (lpos.offsetWidth != null) { - lpos.offsetWidth = lpos.offsetWidth! + windowId * kNewWindowOffset; - } - if (lpos.offsetHeight != null) { - lpos.offsetHeight = lpos.offsetHeight! + windowId * kNewWindowOffset; - } - } - if (display != null) { - if (lpos.offsetWidth != null) { - lpos.offsetWidth = lpos.offsetWidth! + display * kNewWindowOffset; - } - if (lpos.offsetHeight != null) { - lpos.offsetHeight = lpos.offsetHeight! + display * kNewWindowOffset; - } - } - } - - final size = await _adjustRestoreMainWindowSize(lpos.width, lpos.height); - final offsetLeftTop = await _adjustRestoreMainWindowOffset( - lpos.offsetWidth, - lpos.offsetHeight, - size.width, - size.height, - ); - debugPrint( - "restore lpos: ${size.width}/${size.height}, offset:${offsetLeftTop?.dx}/${offsetLeftTop?.dy}, isMaximized: ${lpos.isMaximized}, isFullscreen: ${lpos.isFullscreen}"); - - switch (type) { - case WindowType.Main: - restorePos() async { - if (offsetLeftTop == null) { - await windowManager.center(); - } else { - await windowManager.setPosition(offsetLeftTop, - ignoreDevicePixelRatio: _ignoreDevicePixelRatio); - } - } - if (lpos.isMaximized == true) { - await restorePos(); - if (!(bind.isIncomingOnly() || bind.isOutgoingOnly())) { - await windowManager.maximize(); - } - } else { - final storeSize = !bind.isIncomingOnly() || bind.isOutgoingOnly(); - if (isWindows) { - if (storeSize) { - // We need to set the window size first to avoid the incorrect size in some special cases. - // E.g. There are two monitors, the left one is 100% DPI and the right one is 175% DPI. - // The window belongs to the left monitor, but if it is moved a little to the right, it will belong to the right monitor. - // After restoring, the size will be incorrect. - // See known issue in https://github.com/rustdesk/rustdesk/pull/9840 - await windowManager.setSize(size, - ignoreDevicePixelRatio: _ignoreDevicePixelRatio); - } - await restorePos(); - if (storeSize) { - await windowManager.setSize(size, - ignoreDevicePixelRatio: _ignoreDevicePixelRatio); - } - } else { - if (storeSize) { - await windowManager.setSize(size, - ignoreDevicePixelRatio: _ignoreDevicePixelRatio); - } - await restorePos(); - } - } - return true; - default: - final wc = WindowController.fromWindowId(windowId!); - restoreFrame() async { - if (offsetLeftTop == null) { - await wc.center(); - } else { - final frame = Rect.fromLTWH( - offsetLeftTop.dx, offsetLeftTop.dy, size.width, size.height); - await wc.setFrame(frame); - } - } - if (lpos.isFullscreen == true) { - if (!isMacOS) { - await restoreFrame(); - } - // An duration is needed to avoid the window being restored after fullscreen. - Future.delayed(Duration(milliseconds: 300), () async { - if (kWindowId == windowId) { - stateGlobal.setFullscreen(true); - } else { - // If is not current window, we need to send a fullscreen message to `windowId` - DesktopMultiWindow.invokeMethod( - windowId, kWindowEventSetFullscreen, 'true'); - } - }); - } else if (lpos.isMaximized == true) { - await restoreFrame(); - // An duration is needed to avoid the window being restored after maximized. - Future.delayed(Duration(milliseconds: 300), () async { - await wc.maximize(); - }); - } else { - await restoreFrame(); - } - break; - } - return false; -} - -var webInitialLink = ""; - -/// Initialize uni links for macos/windows -/// -/// [Availability] -/// initUniLinks should only be used on macos/windows. -/// we use dbus for linux currently. -Future initUniLinks() async { - if (isLinux) { - return false; - } - // check cold boot - try { - final initialLink = await getInitialLink(); - print("initialLink: $initialLink"); - if (initialLink == null || initialLink.isEmpty) { - return false; - } - if (isWeb) { - webInitialLink = initialLink; - return false; - } else { - return handleUriLink(uriString: initialLink); - } - } catch (err) { - debugPrintStack(label: "$err"); - return false; - } -} - -/// Listen for uni links. -/// -/// * handleByFlutter: Should uni links be handled by Flutter. -/// -/// Returns a [StreamSubscription] which can listen the uni links. -StreamSubscription? listenUniLinks({handleByFlutter = true}) { - if (isLinux || isWeb) { - return null; - } - - final sub = uriLinkStream.listen((Uri? uri) { - debugPrint("A uri was received: $uri. handleByFlutter $handleByFlutter"); - if (uri != null) { - if (handleByFlutter) { - handleUriLink(uri: uri); - } else { - bind.sendUrlScheme(url: uri.toString()); - } - } else { - print("uni listen error: uri is empty."); - } - }, onError: (err) { - print("uni links error: $err"); - }); - return sub; -} - -enum UriLinkType { - remoteDesktop, - fileTransfer, - viewCamera, - portForward, - rdp, - terminal, -} - -setEnvTerminalAdmin() { - bind.mainSetEnv(key: 'IS_TERMINAL_ADMIN', value: 'Y'); -} - -// uri link handler -bool handleUriLink({List? cmdArgs, Uri? uri, String? uriString}) { - List? args; - if (cmdArgs != null && cmdArgs.isNotEmpty) { - args = cmdArgs; - // rustdesk - if (args[0].startsWith(bind.mainUriPrefixSync())) { - final uri = Uri.tryParse(args[0]); - if (uri != null) { - args = urlLinkToCmdArgs(uri); - } - } - } else if (uri != null) { - args = urlLinkToCmdArgs(uri); - } else if (uriString != null) { - final uri = Uri.tryParse(uriString); - if (uri != null) { - args = urlLinkToCmdArgs(uri); - } - } - if (args == null) { - return false; - } - - if (args.isEmpty) { - windowOnTop(null); - return true; - } - - UriLinkType? type; - String? id; - String? password; - String? switchUuid; - bool? forceRelay; - for (int i = 0; i < args.length; i++) { - switch (args[i]) { - case '--connect': - case '--play': - type = UriLinkType.remoteDesktop; - id = args[i + 1]; - i++; - break; - case '--file-transfer': - type = UriLinkType.fileTransfer; - id = args[i + 1]; - i++; - break; - case '--view-camera': - type = UriLinkType.viewCamera; - id = args[i + 1]; - i++; - break; - case '--port-forward': - type = UriLinkType.portForward; - id = args[i + 1]; - i++; - break; - case '--rdp': - type = UriLinkType.rdp; - id = args[i + 1]; - i++; - break; - case '--terminal': - type = UriLinkType.terminal; - id = args[i + 1]; - i++; - break; - case '--terminal-admin': - setEnvTerminalAdmin(); - type = UriLinkType.terminal; - id = args[i + 1]; - i++; - break; - case '--password': - password = args[i + 1]; - i++; - break; - case '--switch_uuid': - switchUuid = args[i + 1]; - i++; - break; - case '--relay': - forceRelay = true; - break; - default: - break; - } - } - if (type != null && id != null) { - switch (type) { - case UriLinkType.remoteDesktop: - Future.delayed(Duration.zero, () { - rustDeskWinManager.newRemoteDesktop(id!, - password: password, - switchUuid: switchUuid, - forceRelay: forceRelay); - }); - break; - case UriLinkType.fileTransfer: - Future.delayed(Duration.zero, () { - rustDeskWinManager.newFileTransfer(id!, - password: password, forceRelay: forceRelay); - }); - break; - case UriLinkType.viewCamera: - Future.delayed(Duration.zero, () { - rustDeskWinManager.newViewCamera(id!, - password: password, forceRelay: forceRelay); - }); - break; - case UriLinkType.portForward: - Future.delayed(Duration.zero, () { - rustDeskWinManager.newPortForward(id!, false, - password: password, forceRelay: forceRelay); - }); - break; - case UriLinkType.rdp: - Future.delayed(Duration.zero, () { - rustDeskWinManager.newPortForward(id!, true, - password: password, forceRelay: forceRelay); - }); - break; - case UriLinkType.terminal: - Future.delayed(Duration.zero, () { - rustDeskWinManager.newTerminal(id!, - password: password, forceRelay: forceRelay); - }); - break; - } - - return true; - } - - return false; -} - -List? urlLinkToCmdArgs(Uri uri) { - String? command; - String? id; - final options = [ - "connect", - "play", - "file-transfer", - "view-camera", - "port-forward", - "rdp", - "terminal", - "terminal-admin", - ]; - if (uri.authority.isEmpty && - uri.path.split('').every((char) => char == '/')) { - return []; - } else if (uri.authority == "connection" && uri.path.startsWith("/new/")) { - // For compatibility - command = '--connect'; - id = uri.path.substring("/new/".length); - } else if (uri.authority == "config") { - if (isAndroid || isIOS) { - final config = uri.path.substring("/".length); - // add a timer to make showToast work - Timer(Duration(seconds: 1), () { - importConfig(null, null, config); - }); - } - return null; - } else if (uri.authority == "password") { - if (isAndroid || isIOS) { - final password = uri.path.substring("/".length); - if (password.isNotEmpty) { - Timer(Duration(seconds: 1), () async { - final ok = - await bind.mainSetPermanentPasswordWithResult(password: password); - showToast(translate(ok ? 'Successful' : 'Failed')); - }); - } - } - } else if (options.contains(uri.authority)) { - command = '--${uri.authority}'; - if (uri.path.length > 1) { - id = uri.path.substring(1); - } - } else if (uri.authority.length > 2 && - (uri.path.length <= 1 || - (uri.path == '/r' || uri.path.startsWith('/r@')))) { - // rustdesk:// - // rustdesk:///r - // rustdesk:///r@ - command = '--connect'; - id = uri.authority; - if (uri.path.length > 1) { - id = id + uri.path; - } - } - - var queryParameters = - uri.queryParameters.map((k, v) => MapEntry(k.toLowerCase(), v)); - - var key = queryParameters["key"]; - if (id != null) { - if (key != null) { - id = "$id?key=$key"; - } - } - - if (isMobile && id != null) { - final forceRelay = queryParameters["relay"] != null; - final password = queryParameters["password"]; - - // Determine connection type based on command - if (command == '--file-transfer') { - connect(Get.context!, id, - isFileTransfer: true, forceRelay: forceRelay, password: password); - } else if (command == '--view-camera') { - connect(Get.context!, id, - isViewCamera: true, forceRelay: forceRelay, password: password); - } else if (command == '--terminal') { - connect(Get.context!, id, - isTerminal: true, forceRelay: forceRelay, password: password); - } else if (command == 'terminal-admin') { - setEnvTerminalAdmin(); - connect(Get.context!, id, - isTerminal: true, forceRelay: forceRelay, password: password); - } else { - // Default to remote desktop for '--connect', '--play', or direct connection - connect(Get.context!, id, forceRelay: forceRelay, password: password); - } - return null; - } - - List args = List.empty(growable: true); - if (command != null && id != null) { - args.add(command); - args.add(id); - var param = queryParameters; - String? password = param["password"]; - if (password != null) args.addAll(['--password', password]); - String? switch_uuid = param["switch_uuid"]; - if (switch_uuid != null) args.addAll(['--switch_uuid', switch_uuid]); - if (param["relay"] != null) args.add("--relay"); - return args; - } - - return null; -} - -connectMainDesktop(String id, - {required bool isFileTransfer, - required bool isViewCamera, - required bool isTerminal, - required bool isTcpTunneling, - required bool isRDP, - bool? forceRelay, - String? password, - String? connToken, - bool? isSharedPassword}) async { - if (isFileTransfer) { - await rustDeskWinManager.newFileTransfer(id, - password: password, - isSharedPassword: isSharedPassword, - connToken: connToken, - forceRelay: forceRelay); - } else if (isViewCamera) { - await rustDeskWinManager.newViewCamera(id, - password: password, - isSharedPassword: isSharedPassword, - connToken: connToken, - forceRelay: forceRelay); - } else if (isTcpTunneling || isRDP) { - await rustDeskWinManager.newPortForward(id, isRDP, - password: password, - isSharedPassword: isSharedPassword, - connToken: connToken, - forceRelay: forceRelay); - } else if (isTerminal) { - await rustDeskWinManager.newTerminal(id, - password: password, - isSharedPassword: isSharedPassword, - connToken: connToken, - forceRelay: forceRelay); - } else { - await rustDeskWinManager.newRemoteDesktop(id, - password: password, - isSharedPassword: isSharedPassword, - forceRelay: forceRelay); - } -} - -/// Connect to a peer with [id]. -/// If [isFileTransfer], starts a session only for file transfer. -/// If [isViewCamera], starts a session only for view camera. -/// If [isTcpTunneling], starts a session only for tcp tunneling. -/// If [isRDP], starts a session only for rdp. -connect(BuildContext context, String id, - {bool isFileTransfer = false, - bool isViewCamera = false, - bool isTerminal = false, - bool isTcpTunneling = false, - bool isRDP = false, - bool forceRelay = false, - String? password, - String? connToken, - bool? isSharedPassword}) async { - if (id == '') return; - if (!isDesktop || desktopType == DesktopType.main) { - try { - if (Get.isRegistered()) { - final idController = Get.find(); - idController.text = formatID(id); - } - if (Get.isRegistered()) { - final fieldTextEditingController = Get.find(); - fieldTextEditingController.text = formatID(id); - } - } catch (_) {} - } - id = id.replaceAll(' ', ''); - final oldId = id; - id = await bind.mainHandleRelayId(id: id); - forceRelay = id != oldId || forceRelay; - assert(!(isFileTransfer && isTcpTunneling && isRDP), - "more than one connect type"); - - if (isDesktop) { - if (desktopType == DesktopType.main) { - await connectMainDesktop( - id, - isFileTransfer: isFileTransfer, - isViewCamera: isViewCamera, - isTerminal: isTerminal, - isTcpTunneling: isTcpTunneling, - isRDP: isRDP, - password: password, - isSharedPassword: isSharedPassword, - forceRelay: forceRelay, - ); - } else { - await rustDeskWinManager.call(WindowType.Main, kWindowConnect, { - 'id': id, - 'isFileTransfer': isFileTransfer, - 'isViewCamera': isViewCamera, - 'isTerminal': isTerminal, - 'isTcpTunneling': isTcpTunneling, - 'isRDP': isRDP, - 'password': password, - 'isSharedPassword': isSharedPassword, - 'forceRelay': forceRelay, - 'connToken': connToken, - }); - } - } else { - if (isFileTransfer) { - if (isAndroid) { - if (!await AndroidPermissionManager.check(kManageExternalStorage)) { - if (!await AndroidPermissionManager.request(kManageExternalStorage)) { - return; - } - } - } - if (isWeb) { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => - desktop_file_manager.FileManagerPage( - id: id, - password: password, - isSharedPassword: isSharedPassword), - ), - ); - } else { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => FileManagerPage( - id: id, - password: password, - isSharedPassword: isSharedPassword, - forceRelay: forceRelay), - ), - ); - } - } else if (isViewCamera) { - if (isWeb) { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => - desktop_view_camera.ViewCameraPage( - key: ValueKey(id), - id: id, - toolbarState: ToolbarState(), - password: password, - isSharedPassword: isSharedPassword, - ), - ), - ); - } else { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => ViewCameraPage( - id: id, - password: password, - isSharedPassword: isSharedPassword, - forceRelay: forceRelay), - ), - ); - } - } else if (isTerminal) { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => TerminalPage( - id: id, - password: password, - isSharedPassword: isSharedPassword, - forceRelay: forceRelay, - ), - ), - ); - } else { - if (isWeb) { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => desktop_remote.RemotePage( - key: ValueKey(id), - id: id, - toolbarState: ToolbarState(), - password: password, - isSharedPassword: isSharedPassword, - ), - ), - ); - } else { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => RemotePage( - id: id, - password: password, - isSharedPassword: isSharedPassword, - forceRelay: forceRelay), - ), - ); - } - } - stateGlobal.isInMainPage = false; - } - - FocusScopeNode currentFocus = FocusScope.of(context); - if (!currentFocus.hasPrimaryFocus) { - currentFocus.unfocus(); - } -} - -Map getHttpHeaders() { - return { - 'Authorization': 'Bearer ${bind.mainGetLocalOption(key: 'access_token')}' - }; -} - -// Simple wrapper of built-in types for reference use. -class SimpleWrapper { - T value; - SimpleWrapper(this.value); -} - -/// Wakelock manager with reference counting for desktop. -/// Ensures wakelock is only disabled when all sessions are closed/minimized. -/// -/// Note: Each isolate has its own WakelockPlus instance with independent assertion. -/// As long as one isolate has wakelock enabled, the screen stays awake. -/// This manager handles multiple tabs within the same isolate. -class WakelockManager { - static final Set _enabledKeys = {}; - // Don't use WakelockPlus.enabled, it causes error on Android: - // Unhandled Exception: FormatException: Message corrupted - // - // On Linux, multiple enable() calls create only one inhibit, but each disable() - // only releases if _cookie != null. So we need our own _enabled state to avoid - // calling disable() when not enabled. - // See: https://github.com/fluttercommunity/wakelock_plus/blob/0c74e5bbc6aefac57b6c96bb7ef987705ed559ec/wakelock_plus/lib/src/wakelock_plus_linux_plugin.dart#L48 - static bool _enabled = false; - - static void enable(UniqueKey key, {bool isServer = false}) { - // Check if we should keep awake during outgoing sessions - if (!isServer) { - final keepAwake = - mainGetLocalBoolOptionSync(kOptionKeepAwakeDuringOutgoingSessions); - if (!keepAwake) { - return; // Don't enable wakelock if user disabled keep awake - } - } - if (isDesktop) { - _enabledKeys.add(key); - } - if (!_enabled) { - _enabled = true; - WakelockPlus.enable(); - } - } - - static void disable(UniqueKey key) { - if (isDesktop) { - _enabledKeys.remove(key); - if (_enabledKeys.isNotEmpty) { - return; - } - } - if (_enabled) { - WakelockPlus.disable(); - _enabled = false; - } - } -} - -/// call this to reload current window. -/// -/// [Note] -/// Must have [RefreshWrapper] on the top of widget tree. -void reloadCurrentWindow() { - if (Get.context != null) { - // reload self window - RefreshWrapper.of(Get.context!)?.rebuild(); - } else { - debugPrint( - "reload current window failed, global BuildContext does not exist"); - } -} - -/// call this to reload all windows, including main + all sub windows. -Future reloadAllWindows() async { - reloadCurrentWindow(); - try { - final ids = await DesktopMultiWindow.getAllSubWindowIds(); - for (final id in ids) { - DesktopMultiWindow.invokeMethod(id, kWindowActionRebuild); - } - } on AssertionError { - // ignore - } -} - -/// Indicate the flutter app is running in portable mode. -/// -/// [Note] -/// Portable build is only available on Windows. -bool isRunningInPortableMode() { - if (!isWindows) { - return false; - } - return bool.hasEnvironment(kEnvPortableExecutable); -} - -/// Window status callback -Future onActiveWindowChanged() async { - print( - "[MultiWindowHandler] active window changed: ${rustDeskWinManager.getActiveWindows()}"); - if (rustDeskWinManager.getActiveWindows().isEmpty) { - // close all sub windows - try { - if (isLinux) { - await Future.wait([ - saveWindowPosition(WindowType.Main), - rustDeskWinManager.closeAllSubWindows() - ]); - } else { - await rustDeskWinManager.closeAllSubWindows(); - } - } catch (err) { - debugPrintStack(label: "$err"); - } finally { - debugPrint("Start closing RustDesk..."); - await windowManager.setPreventClose(false); - await windowManager.close(); - if (isMacOS) { - // If we call without delay, `flutter/macos/Runner/MainFlutterWindow.swift` can handle the "terminate" event. - // But the app will not close. - // - // No idea why we need to delay here, `terminate()` itself is also an async function. - // - // A quick workaround, use `Timer.periodic` to avoid the app not closing. - // Because `await windowManager.close()` and `RdPlatformChannel.instance.terminate()` - // may not work since `Flutter 3.24.4`, see the following logs. - // A delay will allow the app to close. - // - //``` - // embedder.cc (2725): 'FlutterPlatformMessageCreateResponseHandle' returned 'kInvalidArguments'. Engine handle was invalid. - // 2024-11-11 11:41:11.546 RustDesk[90272:2567686] Failed to create a FlutterPlatformMessageResponseHandle (2) - // embedder.cc (2672): 'FlutterEngineSendPlatformMessage' returned 'kInvalidArguments'. Invalid engine handle. - // 2024-11-11 11:41:11.565 RustDesk[90272:2567686] Failed to send message to Flutter engine on channel 'flutter/lifecycle' (2). - // ``` - periodic_immediate( - Duration(milliseconds: 30), RdPlatformChannel.instance.terminate); - } - } - } -} - -Timer periodic_immediate(Duration duration, Future Function() callback) { - Future.delayed(Duration.zero, callback); - return Timer.periodic(duration, (timer) async { - await callback(); - }); -} - -/// return a human readable windows version -WindowsTarget getWindowsTarget(int buildNumber) { - if (!isWindows) { - return WindowsTarget.naw; - } - if (buildNumber >= 22000) { - return WindowsTarget.w11; - } else if (buildNumber >= 10240) { - return WindowsTarget.w10; - } else if (buildNumber >= 9600) { - return WindowsTarget.w8_1; - } else if (buildNumber >= 9200) { - return WindowsTarget.w8; - } else if (buildNumber >= 7601) { - return WindowsTarget.w7; - } else if (buildNumber >= 6002) { - return WindowsTarget.vista; - } else { - // minimum support - return WindowsTarget.xp; - } -} - -/// Get windows target build number. -/// -/// [Note] -/// Please use this function wrapped with `Platform.isWindows`. -int getWindowsTargetBuildNumber() { - return getWindowsTargetBuildNumber_(); -} - -/// Indicating we need to use compatible ui mode. -/// -/// [Conditions] -/// - Windows 7, window will overflow when we use frameless ui. -bool get kUseCompatibleUiMode => - isWindows && - const [WindowsTarget.w7].contains(windowsBuildNumber.windowsVersion); - -bool get isWin10 => windowsBuildNumber.windowsVersion == WindowsTarget.w10; - -class ServerConfig { - late String idServer; - late String relayServer; - late String apiServer; - late String key; - - ServerConfig( - {String? idServer, String? relayServer, String? apiServer, String? key}) { - this.idServer = idServer?.trim() ?? ''; - this.relayServer = relayServer?.trim() ?? ''; - this.apiServer = apiServer?.trim() ?? ''; - this.key = key?.trim() ?? ''; - } - - /// decode from shared string (from user shared or rustdesk-server generated) - /// also see [encode] - /// throw when decoding failure - ServerConfig.decode(String msg) { - var json = {}; - try { - // back compatible - json = jsonDecode(msg); - } catch (err) { - final input = msg.split('').reversed.join(''); - final bytes = base64Decode(base64.normalize(input)); - json = jsonDecode(utf8.decode(bytes, allowMalformed: true)); - } - idServer = json['host'] ?? ''; - relayServer = json['relay'] ?? ''; - apiServer = json['api'] ?? ''; - key = json['key'] ?? ''; - } - - /// encode to shared string - /// also see [ServerConfig.decode] - String encode() { - Map config = {}; - config['host'] = idServer.trim(); - config['relay'] = relayServer.trim(); - config['api'] = apiServer.trim(); - config['key'] = key.trim(); - return base64UrlEncode(Uint8List.fromList(jsonEncode(config).codeUnits)) - .split('') - .reversed - .join(); - } - - /// from local options - ServerConfig.fromOptions(Map options) - : idServer = options['custom-rendezvous-server'] ?? "", - relayServer = options['relay-server'] ?? "", - apiServer = options['api-server'] ?? "", - key = options['key'] ?? ""; -} - -Widget dialogButton(String text, - {required VoidCallback? onPressed, - bool isOutline = false, - Widget? icon, - TextStyle? style, - ButtonStyle? buttonStyle}) { - if (isDesktop || isWebDesktop) { - if (isOutline) { - return icon == null - ? OutlinedButton( - onPressed: onPressed, - child: Text(translate(text), style: style), - ) - : OutlinedButton.icon( - icon: icon, - onPressed: onPressed, - label: Text(translate(text), style: style), - ); - } else { - return icon == null - ? ElevatedButton( - style: ElevatedButton.styleFrom(elevation: 0).merge(buttonStyle), - onPressed: onPressed, - child: Text(translate(text), style: style), - ) - : ElevatedButton.icon( - icon: icon, - style: ElevatedButton.styleFrom(elevation: 0).merge(buttonStyle), - onPressed: onPressed, - label: Text(translate(text), style: style), - ); - } - } else { - return TextButton( - onPressed: onPressed, - child: Text( - translate(text), - style: style, - ), - ); - } -} - -int versionCmp(String v1, String v2) { - return bind.versionToNumber(v: v1) - bind.versionToNumber(v: v2); -} - -String getWindowName({WindowType? overrideType}) { - final name = bind.mainGetAppNameSync(); - switch (overrideType ?? kWindowType) { - case WindowType.Main: - return name; - case WindowType.FileTransfer: - return "File Transfer - $name"; - case WindowType.ViewCamera: - return "View Camera - $name"; - case WindowType.PortForward: - return "Port Forward - $name"; - case WindowType.RemoteDesktop: - return "Remote Desktop - $name"; - default: - break; - } - return name; -} - -String getWindowNameWithId(String id, {WindowType? overrideType}) { - return "${DesktopTab.tablabelGetter(id).value} - ${getWindowName(overrideType: overrideType)}"; -} - -Future updateSystemWindowTheme() async { - // Set system window theme for macOS. - final userPreference = MyTheme.getThemeModePreference(); - if (userPreference != ThemeMode.system) { - if (isMacOS) { - await RdPlatformChannel.instance.changeSystemWindowTheme( - userPreference == ThemeMode.light - ? SystemWindowTheme.light - : SystemWindowTheme.dark); - } - } -} - -/// macOS only -/// -/// Note: not found a general solution for rust based AVFoundation bingding. -/// [AVFoundation] crate has compile error. -const kMacOSPermChannel = MethodChannel("org.rustdesk.rustdesk/host"); - -enum PermissionAuthorizeType { - undetermined, - authorized, - denied, // and restricted -} - -Future osxCanRecordAudio() async { - int res = await kMacOSPermChannel.invokeMethod("canRecordAudio"); - print(res); - if (res > 0) { - return PermissionAuthorizeType.authorized; - } else if (res == 0) { - return PermissionAuthorizeType.undetermined; - } else { - return PermissionAuthorizeType.denied; - } -} - -Future osxRequestAudio() async { - return await kMacOSPermChannel.invokeMethod("requestRecordAudio"); -} - -Widget futureBuilder( - {required Future? future, required Widget Function(dynamic data) hasData}) { - return FutureBuilder( - future: future, - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - return hasData(snapshot.data!); - } else { - if (snapshot.hasError) { - debugPrint(snapshot.error.toString()); - } - return Container(); - } - }); -} - -void onCopyFingerprint(String value) { - if (value.isNotEmpty) { - Clipboard.setData(ClipboardData(text: value)); - showToast('$value\n${translate("Copied")}'); - } else { - showToast(translate("no fingerprints")); - } -} - -Future callMainCheckSuperUserPermission() async { - bool checked = await bind.mainCheckSuperUserPermission(); - if (isMacOS) { - await windowManager.show(); - } - return checked; -} - -Future start_service(bool is_start) async { - bool checked = !bind.mainIsInstalled() || - !isMacOS || - await callMainCheckSuperUserPermission(); - if (checked) { - mainSetBoolOption(kOptionStopService, !is_start); - } -} - -Future canBeBlocked() async { - if (isWeb) { - // Web can only act as a controller, never as a controlled side, - // so it should never be blocked by a remote session. - return false; - } - // First check control permission - final controlPermission = await bind.mainGetCommon( - key: "is-remote-modify-enabled-by-control-permissions"); - if (controlPermission == "true") { - return false; - } else if (controlPermission == "false") { - return true; - } - - // Check local settings - var accessMode = await bind.mainGetOption(key: kOptionAccessMode); - var isCustomAccessMode = accessMode != 'full' && accessMode != 'view'; - var option = option2bool(kOptionAllowRemoteConfigModification, - await bind.mainGetOption(key: kOptionAllowRemoteConfigModification)); - return accessMode == 'view' || (isCustomAccessMode && !option); -} - -// to-do: web not implemented -Future shouldBeBlocked(RxBool block, WhetherUseRemoteBlock? use) async { - if (use != null && !await use()) { - block.value = false; - return; - } - var time0 = DateTime.now().millisecondsSinceEpoch; - await bind.mainCheckMouseTime(); - Timer(const Duration(milliseconds: 120), () async { - var d = time0 - await bind.mainGetMouseTime(); - if (d < 120) { - block.value = true; - } else { - block.value = false; - } - }); -} - -typedef WhetherUseRemoteBlock = Future Function(); -Widget buildRemoteBlock( - {required Widget child, - required RxBool block, - required bool mask, - WhetherUseRemoteBlock? use}) { - return Obx(() => MouseRegion( - onEnter: (_) async { - await shouldBeBlocked(block, use); - }, - onExit: (event) => block.value = false, - child: Stack(children: [ - // scope block tab - preventMouseKeyBuilder(child: child, block: block.value), - // mask block click, cm not block click and still use check_click_time to avoid block local click - if (mask) - Offstage( - offstage: !block.value, - child: Container( - color: Colors.black.withOpacity(0.5), - )), - ]), - )); -} - -Widget preventMouseKeyBuilder({required Widget child, required bool block}) { - return ExcludeFocus( - excluding: block, child: AbsorbPointer(child: child, absorbing: block)); -} - -Widget unreadMessageCountBuilder(RxInt? count, - {double? size, double? fontSize}) { - return Obx(() => Offstage( - offstage: !((count?.value ?? 0) > 0), - child: Container( - width: size ?? 16, - height: size ?? 16, - decoration: BoxDecoration( - color: Colors.red, - shape: BoxShape.circle, - ), - child: Center( - child: Text("${count?.value ?? 0}", - maxLines: 1, - style: TextStyle(color: Colors.white, fontSize: fontSize ?? 10)), - ), - ))); -} - -Widget unreadTopRightBuilder(RxInt? count, {Widget? icon}) { - return Stack( - children: [ - icon ?? Icon(Icons.chat), - Positioned( - top: 0, - right: 0, - child: unreadMessageCountBuilder(count, size: 12, fontSize: 8)) - ], - ); -} - -String toCapitalized(String s) { - if (s.isEmpty) { - return s; - } - return s.substring(0, 1).toUpperCase() + s.substring(1); -} - -Widget buildErrorBanner(BuildContext context, - {required RxBool loading, - required RxString err, - required Function? retry, - required Function close}) { - return Obx(() => Offstage( - offstage: !(!loading.value && err.value.isNotEmpty), - child: Center( - child: Container( - color: MyTheme.color(context).errorBannerBg, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - FittedBox( - child: Icon( - Icons.info, - color: Color.fromARGB(255, 249, 81, 81), - ), - ).marginAll(4), - Flexible( - child: Align( - alignment: Alignment.centerLeft, - child: Tooltip( - message: translate(err.value), - child: SelectableText( - translate(err.value), - ), - )).marginSymmetric(vertical: 2), - ), - if (retry != null) - InkWell( - onTap: () { - retry.call(); - }, - child: Text( - translate("Retry"), - style: TextStyle(color: MyTheme.accent), - )).marginSymmetric(horizontal: 5), - FittedBox( - child: InkWell( - onTap: () { - close.call(); - }, - child: Icon(Icons.close).marginSymmetric(horizontal: 5), - ), - ).marginAll(4) - ], - ), - )).marginOnly(bottom: 14), - )); -} - -String getDesktopTabLabel(String peerId, String alias) { - String label = alias.isEmpty ? peerId : alias; - try { - String peer = bind.mainGetPeerSync(id: peerId); - Map config = jsonDecode(peer); - if (config['info']['hostname'] is String) { - String hostname = config['info']['hostname']; - if (hostname.isNotEmpty && - !label.toLowerCase().contains(hostname.toLowerCase())) { - label += "@$hostname"; - } - } - } catch (e) { - debugPrint("Failed to get hostname:$e"); - } - return label; -} - -sessionRefreshVideo(SessionID sessionId, PeerInfo pi) async { - if (pi.currentDisplay == kAllDisplayValue) { - for (int i = 0; i < pi.displays.length; i++) { - await bind.sessionRefresh(sessionId: sessionId, display: i); - } - } else { - await bind.sessionRefresh(sessionId: sessionId, display: pi.currentDisplay); - } -} - -Future> getScreenListWayland() async { - final screenRectList = []; - if (isMainDesktopWindow) { - for (var screen in await window_size.getScreenList()) { - final scale = kIgnoreDpi ? 1.0 : screen.scaleFactor; - double l = screen.frame.left; - double t = screen.frame.top; - double r = screen.frame.right; - double b = screen.frame.bottom; - final rect = Rect.fromLTRB(l / scale, t / scale, r / scale, b / scale); - screenRectList.add(rect); - } - } else { - final screenList = await rustDeskWinManager.call( - WindowType.Main, kWindowGetScreenList, ''); - try { - for (var screen in jsonDecode(screenList.result) as List) { - final scale = kIgnoreDpi ? 1.0 : screen['scaleFactor']; - double l = screen['frame']['l']; - double t = screen['frame']['t']; - double r = screen['frame']['r']; - double b = screen['frame']['b']; - final rect = Rect.fromLTRB(l / scale, t / scale, r / scale, b / scale); - screenRectList.add(rect); - } - } catch (e) { - debugPrint('Failed to parse screenList: $e'); - } - } - return screenRectList; -} - -Future> getScreenListNotWayland() async { - final screenRectList = []; - final displays = bind.mainGetDisplays(); - if (displays.isEmpty) { - return screenRectList; - } - try { - for (var display in jsonDecode(displays) as List) { - // to-do: scale factor ? - // final scale = kIgnoreDpi ? 1.0 : screen.scaleFactor; - double l = display['x'].toDouble(); - double t = display['y'].toDouble(); - double r = (display['x'] + display['w']).toDouble(); - double b = (display['y'] + display['h']).toDouble(); - screenRectList.add(Rect.fromLTRB(l, t, r, b)); - } - } catch (e) { - debugPrint('Failed to parse displays: $e'); - } - return screenRectList; -} - -Future> getScreenRectList() async { - return bind.mainCurrentIsWayland() - ? await getScreenListWayland() - : await getScreenListNotWayland(); -} - -openMonitorInTheSameTab(int i, FFI ffi, PeerInfo pi, - {bool updateCursorPos = true}) { - final displays = i == kAllDisplayValue - ? List.generate(pi.displays.length, (index) => index) - : [i]; - // Try clear image model before switching from all displays - // 1. The remote side has multiple displays. - // 2. Do not use texture render. - // 3. Connect to Display 1. - // 4. Switch to multi-displays `kAllDisplayValue` - // 5. Switch to Display 2. - // Then the remote page will display last picture of Display 1 at the beginning. - if (pi.forceTextureRender && i != kAllDisplayValue) { - ffi.imageModel.clearImage(); - } - bind.sessionSwitchDisplay( - isDesktop: isDesktop, - sessionId: ffi.sessionId, - value: Int32List.fromList(displays), - ); - ffi.ffiModel.switchToNewDisplay(i, ffi.sessionId, ffi.id, - updateCursorPos: updateCursorPos); -} - -// Open new tab or window to show this monitor. -// For now just open new window. -// -// screenRect is used to move the new window to the specified screen and set fullscreen. -openMonitorInNewTabOrWindow(int i, String peerId, PeerInfo pi, - {Rect? screenRect}) { - final args = { - 'window_id': stateGlobal.windowId, - 'peer_id': peerId, - 'display': i, - 'display_count': pi.displays.length, - 'window_type': (kWindowType ?? WindowType.RemoteDesktop).index, - }; - if (screenRect != null) { - args['screen_rect'] = { - 'l': screenRect.left, - 't': screenRect.top, - 'r': screenRect.right, - 'b': screenRect.bottom, - }; - } - DesktopMultiWindow.invokeMethod( - kMainWindowId, kWindowEventOpenMonitorSession, jsonEncode(args)); -} - -setNewConnectWindowFrame(int windowId, String peerId, int preSessionCount, - WindowType windowType, int? display, Rect? screenRect) async { - if (screenRect == null) { - // Do not restore window position to new connection if there's a pre-session. - // https://github.com/rustdesk/rustdesk/discussions/8825 - if (preSessionCount == 0) { - await restoreWindowPosition(windowType, - windowId: windowId, display: display, peerId: peerId); - } - } else { - await tryMoveToScreenAndSetFullscreen(screenRect); - } -} - -tryMoveToScreenAndSetFullscreen(Rect? screenRect) async { - if (screenRect == null) { - return; - } - final wc = WindowController.fromWindowId(stateGlobal.windowId); - final curFrame = await wc.getFrame(); - final frame = - Rect.fromLTWH(screenRect.left + 30, screenRect.top + 30, 600, 400); - if (stateGlobal.fullscreen.isTrue && - curFrame.left <= frame.left && - curFrame.top <= frame.top && - curFrame.width >= frame.width && - curFrame.height >= frame.height) { - return; - } - await wc.setFrame(frame); - // An duration is needed to avoid the window being restored after fullscreen. - Future.delayed(Duration(milliseconds: 300), () async { - stateGlobal.setFullscreen(true); - }); -} - -parseParamScreenRect(Map params) { - Rect? screenRect; - if (params['screen_rect'] != null) { - double l = params['screen_rect']['l']; - double t = params['screen_rect']['t']; - double r = params['screen_rect']['r']; - double b = params['screen_rect']['b']; - screenRect = Rect.fromLTRB(l, t, r, b); - } - return screenRect; -} - -get isInputSourceFlutter => stateGlobal.getInputSource() == "Input source 2"; - -class _CountDownButton extends StatefulWidget { - _CountDownButton({ - Key? key, - required this.text, - required this.second, - required this.onPressed, - this.submitOnTimeout = false, - }) : super(key: key); - final String text; - final VoidCallback? onPressed; - final int second; - final bool submitOnTimeout; - - @override - State<_CountDownButton> createState() => _CountDownButtonState(); -} - -class _CountDownButtonState extends State<_CountDownButton> { - late int _countdownSeconds = widget.second; - - Timer? _timer; - - @override - void initState() { - super.initState(); - _startCountdownTimer(); - } - - @override - void dispose() { - _timer?.cancel(); - super.dispose(); - } - - void _startCountdownTimer() { - _timer = Timer.periodic(Duration(seconds: 1), (timer) { - if (_countdownSeconds <= 0) { - timer.cancel(); - if (widget.submitOnTimeout) { - widget.onPressed?.call(); - } - } else { - setState(() { - _countdownSeconds--; - }); - } - }); - } - - @override - Widget build(BuildContext context) { - return dialogButton( - '${translate(widget.text)} (${_countdownSeconds}s)', - onPressed: widget.onPressed, - isOutline: true, - ); - } -} - -importConfig(List? controllers, List? errMsgs, - String? text) { - text = text?.trim(); - if (text != null && text.isNotEmpty) { - try { - final sc = ServerConfig.decode(text); - if (isWeb || isIOS) { - sc.relayServer = ''; - } - if (sc.idServer.isNotEmpty) { - Future success = setServerConfig(controllers, errMsgs, sc); - success.then((value) { - if (value) { - showToast(translate('Import server configuration successfully')); - } else { - showToast(translate('Invalid server configuration')); - } - }); - } else { - showToast(translate('Invalid server configuration')); - } - return sc; - } catch (e) { - showToast(translate('Invalid server configuration')); - } - } else { - showToast(translate('Clipboard is empty')); - } -} - -Future setServerConfig( - List? controllers, - List? errMsgs, - ServerConfig config, -) async { - String removeEndSlash(String input) { - if (input.endsWith('/')) { - return input.substring(0, input.length - 1); - } - return input; - } - - config.idServer = removeEndSlash(config.idServer.trim()); - config.relayServer = removeEndSlash(config.relayServer.trim()); - config.apiServer = removeEndSlash(config.apiServer.trim()); - config.key = config.key.trim(); - if (controllers != null) { - controllers[0].text = config.idServer; - controllers[1].text = config.relayServer; - controllers[2].text = config.apiServer; - controllers[3].text = config.key; - } - // id - if (config.idServer.isNotEmpty && errMsgs != null) { - errMsgs[0].value = translate(await bind.mainTestIfValidServer( - server: config.idServer, testWithProxy: true)); - if (errMsgs[0].isNotEmpty) { - return false; - } - } - // relay - if (config.relayServer.isNotEmpty && errMsgs != null) { - errMsgs[1].value = translate(await bind.mainTestIfValidServer( - server: config.relayServer, testWithProxy: true)); - if (errMsgs[1].isNotEmpty) { - return false; - } - } - // api - if (config.apiServer.isNotEmpty && errMsgs != null) { - if (!config.apiServer.startsWith('http://') && - !config.apiServer.startsWith('https://')) { - errMsgs[2].value = - '${translate("API Server")}: ${translate("invalid_http")}'; - return false; - } - } - final oldApiServer = await bind.mainGetApiServer(); - - // should set one by one - await bind.mainSetOption( - key: 'custom-rendezvous-server', value: config.idServer); - await bind.mainSetOption(key: 'relay-server', value: config.relayServer); - await bind.mainSetOption(key: 'api-server', value: config.apiServer); - await bind.mainSetOption(key: 'key', value: config.key); - final newApiServer = await bind.mainGetApiServer(); - if (oldApiServer.isNotEmpty && - oldApiServer != newApiServer && - gFFI.userModel.isLogin) { - gFFI.userModel.logOut(apiServer: oldApiServer); - } - return true; -} - -ColorFilter? svgColor(Color? color) { - if (color == null) { - return null; - } else { - return ColorFilter.mode(color, BlendMode.srcIn); - } -} - -// ignore: must_be_immutable -class ComboBox extends StatelessWidget { - late final List keys; - late final List values; - late final String initialKey; - late final Function(String key) onChanged; - late final bool enabled; - late String current; - - ComboBox({ - Key? key, - required this.keys, - required this.values, - required this.initialKey, - required this.onChanged, - this.enabled = true, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - var index = keys.indexOf(initialKey); - if (index < 0) { - index = 0; - } - var ref = values[index].obs; - current = keys[index]; - return Container( - decoration: BoxDecoration( - border: Border.all( - color: enabled - ? MyTheme.color(context).border2 ?? MyTheme.border - : MyTheme.border, - ), - borderRadius: - BorderRadius.circular(8), //border raiuds of dropdown button - ), - height: 42, // should be the height of a TextField - child: Obx(() => DropdownButton( - isExpanded: true, - value: ref.value, - elevation: 16, - underline: Container(), - style: TextStyle( - color: enabled - ? Theme.of(context).textTheme.titleMedium?.color - : disabledTextColor(context, enabled)), - icon: const Icon( - Icons.expand_more_sharp, - size: 20, - ).marginOnly(right: 15), - onChanged: enabled - ? (String? newValue) { - if (newValue != null && newValue != ref.value) { - ref.value = newValue; - current = newValue; - onChanged(keys[values.indexOf(newValue)]); - } - } - : null, - items: values.map>((String value) { - return DropdownMenuItem( - value: value, - child: Text( - value, - style: const TextStyle(fontSize: 15), - overflow: TextOverflow.ellipsis, - ).marginOnly(left: 15), - ); - }).toList(), - )), - ).marginOnly(bottom: 5); - } -} - -Color? disabledTextColor(BuildContext context, bool enabled) { - return enabled - ? null - : Theme.of(context).textTheme.titleLarge?.color?.withOpacity(0.6); -} - -Widget loadPowered(BuildContext context) { - if (bind.mainGetBuildinOption(key: "hide-powered-by-me") == 'Y') { - return SizedBox.shrink(); - } - return MouseRegion( - cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: () { - launchUrl(Uri.parse('https://rustdesk.com')); - }, - child: Opacity( - opacity: 0.5, - child: Text( - translate("powered_by_me"), - overflow: TextOverflow.clip, - style: Theme.of(context) - .textTheme - .bodySmall - ?.copyWith(fontSize: 9, decoration: TextDecoration.underline), - )), - ), - ).marginOnly(top: 6); -} - -// max 300 x 60 -Widget loadLogo() { - return FutureBuilder( - future: rootBundle.load('assets/logo.png'), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - final image = Image.asset( - 'assets/logo.png', - fit: BoxFit.contain, - errorBuilder: (ctx, error, stackTrace) { - return Container(); - }, - ); - return Container( - constraints: BoxConstraints(maxWidth: 300, maxHeight: 60), - child: image, - ).marginOnly(left: 12, right: 12, top: 12); - } - return const Offstage(); - }); -} - -Widget loadIcon(double size) { - return Image.asset('assets/icon.png', - width: size, - height: size, - errorBuilder: (ctx, error, stackTrace) => SvgPicture.asset( - 'assets/icon.svg', - width: size, - height: size, - )); -} - -var imcomingOnlyHomeSize = Size(280, 300); -Size getIncomingOnlyHomeSize() { - final magicWidth = isWindows ? 11.0 : 2.0; - final magicHeight = 10.0; - return imcomingOnlyHomeSize + - Offset(magicWidth, kDesktopRemoteTabBarHeight + magicHeight); -} - -Size getIncomingOnlySettingsSize() { - return Size(768, 600); -} - -bool isInHomePage() { - final controller = Get.find(); - return controller.state.value.selected == 0; -} - -Widget _buildPresetPasswordWarning() { - if (bind.mainGetBuildinOption(key: kOptionRemovePresetPasswordWarning) != - 'N') { - return SizedBox.shrink(); - } - return Container( - color: Colors.yellow, - child: Column( - children: [ - Align( - child: Text( - translate("Security Alert"), - style: TextStyle( - color: Colors.red, - fontSize: - 18, // https://github.com/rustdesk/rustdesk-server-pro/issues/261 - fontWeight: FontWeight.bold, - ), - )).paddingOnly(bottom: 8), - Text( - translate("preset_password_warning"), - style: TextStyle(color: Colors.red), - ) - ], - ).paddingAll(8), - ); // Show a warning message if the Future completed with true -} - -Widget buildPresetPasswordWarningMobile() { - if (bind.isPresetPasswordMobileOnly()) { - return _buildPresetPasswordWarning(); - } else { - return SizedBox.shrink(); - } -} - -Widget buildPresetPasswordWarning() { - return FutureBuilder( - future: bind.isPresetPassword(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return CircularProgressIndicator(); // Show a loading spinner while waiting for the Future to complete - } else if (snapshot.hasError) { - return Text( - 'Error: ${snapshot.error}'); // Show an error message if the Future completed with an error - } else if (snapshot.hasData && snapshot.data == true) { - return _buildPresetPasswordWarning(); - } else { - return SizedBox - .shrink(); // Show nothing if the Future completed with false or null - } - }, - ); -} - -// https://github.com/leanflutter/window_manager/blob/87dd7a50b4cb47a375b9fc697f05e56eea0a2ab3/lib/src/widgets/virtual_window_frame.dart#L44 -Widget buildVirtualWindowFrame(BuildContext context, Widget child) { - boxShadow() => isMainDesktopWindow - ? [ - if (stateGlobal.fullscreen.isFalse || stateGlobal.isMaximized.isFalse) - BoxShadow( - color: Colors.black.withOpacity(0.1), - offset: Offset( - 0.0, - stateGlobal.isFocused.isTrue - ? kFrameBoxShadowOffsetFocused - : kFrameBoxShadowOffsetUnfocused), - blurRadius: kFrameBoxShadowBlurRadius, - ), - ] - : null; - return Obx( - () => Container( - decoration: BoxDecoration( - color: isMainDesktopWindow - ? Colors.transparent - : Theme.of(context).colorScheme.background, - border: Border.all( - color: Theme.of(context).dividerColor, - width: stateGlobal.windowBorderWidth.value, - ), - borderRadius: BorderRadius.circular( - (stateGlobal.fullscreen.isTrue || stateGlobal.isMaximized.isTrue) - ? 0 - : kFrameBorderRadius, - ), - boxShadow: boxShadow(), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular( - (stateGlobal.fullscreen.isTrue || stateGlobal.isMaximized.isTrue) - ? 0 - : kFrameClipRRectBorderRadius, - ), - child: child, - ), - ), - ); -} - -get windowResizeEdgeSize => - isLinux && !_linuxWindowResizable ? 0.0 : kWindowResizeEdgeSize; - -// `windowManager.setResizable(false)` will reset the window size to the default size on Linux and then set unresizable. -// See _linuxWindowResizable for more details. -// So we use `setResizable()` instead of `windowManager.setResizable()`. -// -// We can only call `windowManager.setResizable(false)` if we need the default size on Linux. -setResizable(bool resizable) { - if (isLinux) { - _linuxWindowResizable = resizable; - stateGlobal.refreshResizeEdgeSize(); - } else { - windowManager.setResizable(resizable); - } -} - -isOptionFixed(String key) => bind.mainIsOptionFixed(key: key); - -bool isChangePermanentPasswordDisabled() => - bind.mainGetBuildinOption(key: kOptionDisableChangePermanentPassword) == - 'Y'; - -bool isChangeIdDisabled() => - bind.mainGetBuildinOption(key: kOptionDisableChangeId) == 'Y'; - -bool isUnlockPinDisabled() => - bind.mainGetBuildinOption(key: kOptionDisableUnlockPin) == 'Y'; - -bool? _isCustomClient; -bool get isCustomClient { - _isCustomClient ??= bind.isCustomClient(); - return _isCustomClient!; -} - -get defaultOptionLang => isCustomClient ? 'default' : ''; -get defaultOptionTheme => isCustomClient ? 'system' : ''; -get defaultOptionYes => isCustomClient ? 'Y' : ''; -get defaultOptionNo => isCustomClient ? 'N' : ''; -get defaultOptionWhitelist => isCustomClient ? ',' : ''; -get defaultOptionAccessMode => isCustomClient ? 'custom' : ''; -get defaultOptionApproveMode => isCustomClient ? 'password-click' : ''; - -bool whitelistNotEmpty() { - // https://rustdesk.com/docs/en/self-host/client-configuration/advanced-settings/#whitelist - final v = bind.mainGetOptionSync(key: kOptionWhitelist); - return v != '' && v != ','; -} - -// `setMovable()` is only supported on macOS. -// -// On macOS, the window can be dragged by the tab bar by default. -// We need to disable the movable feature to prevent the window from being dragged by the tabs in the tab bar. -// -// When we drag the blank tab bar (not the tab), the window will be dragged normally by adding the `onPanStart` handle. -// -// See the following code for more details: -// https://github.com/rustdesk/rustdesk/blob/ce1dac3b8613596b4d8ae981275f9335489eb935/flutter/lib/desktop/widgets/tabbar_widget.dart#L385 -// https://github.com/rustdesk/rustdesk/blob/ce1dac3b8613596b4d8ae981275f9335489eb935/flutter/lib/desktop/widgets/tabbar_widget.dart#L399 -// -// @platforms macos -disableWindowMovable(int? windowId) { - if (!isMacOS) { - return; - } - - if (windowId == null) { - windowManager.setMovable(false); - } else { - WindowController.fromWindowId(windowId).setMovable(false); - } -} - -Widget netWorkErrorWidget() { - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text(translate("network_error_tip")), - ElevatedButton( - onPressed: gFFI.userModel.refreshCurrentUser, - child: Text(translate("Retry"))) - .marginSymmetric(vertical: 16), - SelectableText(gFFI.userModel.networkError.value, - style: TextStyle(fontSize: 11, color: Colors.red)), - ], - )); -} - -List? get windowManagerEnableResizeEdges => isWindows - ? [ - ResizeEdge.topLeft, - ResizeEdge.top, - ResizeEdge.topRight, - ] - : null; - -List? get subWindowManagerEnableResizeEdges => isWindows - ? [ - SubWindowResizeEdge.topLeft, - SubWindowResizeEdge.top, - SubWindowResizeEdge.topRight, - ] - : null; - -void earlyAssert() { - assert('\1' == '1'); -} - -void checkUpdate() { - if (!isWeb) { - if (!bind.isCustomClient()) { - platformFFI.registerEventHandler( - kCheckSoftwareUpdateFinish, kCheckSoftwareUpdateFinish, - (Map evt) async { - if (evt['url'] is String) { - stateGlobal.updateUrl.value = evt['url']; - } - }); - Timer(const Duration(seconds: 1), () async { - bind.mainGetSoftwareUpdateUrl(); - }); - } - } -} - -// https://github.com/flutter/flutter/issues/153560#issuecomment-2497160535 -// For TextField, TextFormField -extension WorkaroundFreezeLinuxMint on Widget { - Widget workaroundFreezeLinuxMint() { - // No need to check if is Linux Mint, because this workaround is harmless on other platforms. - if (isLinux) { - return ExcludeSemantics(child: this); - } else { - return this; - } - } -} - -// Don't use `extension` here, the border looks weird if using `extension` in my test. -Widget workaroundWindowBorder(BuildContext context, Widget child) { - if (!isWin10) { - return child; - } - - final isLight = Theme.of(context).brightness == Brightness.light; - final borderColor = isLight ? Colors.black87 : Colors.grey; - final width = isLight ? 0.5 : 0.1; - - getBorderWidget(Widget child) { - return Obx(() => - (stateGlobal.isMaximized.isTrue || stateGlobal.fullscreen.isTrue) - ? Offstage() - : child); - } - - final List borders = [ - getBorderWidget(Container( - color: borderColor, - height: width + 0.1, - )) - ]; - if (kWindowType == WindowType.Main && !isLight) { - borders.addAll([ - getBorderWidget(Align( - alignment: Alignment.topLeft, - child: Container( - color: borderColor, - width: width, - ), - )), - getBorderWidget(Align( - alignment: Alignment.topRight, - child: Container( - color: borderColor, - width: width, - ), - )), - getBorderWidget(Align( - alignment: Alignment.bottomCenter, - child: Container( - color: borderColor, - height: width, - ), - )), - ]); - } - return Stack( - children: [ - child, - ...borders, - ], - ); -} - -void updateTextAndPreserveSelection( - TextEditingController controller, String text) { - // Only care about select all for now. - final isSelected = controller.selection.isValid && - controller.selection.end > controller.selection.start; - - // Set text will make the selection invalid. - controller.text = text; - - if (isSelected) { - controller.selection = TextSelection( - baseOffset: 0, extentOffset: controller.value.text.length); - } -} - -List getPrinterNames() { - final printerNamesJson = bind.mainGetPrinterNames(); - if (printerNamesJson.isEmpty) { - return []; - } - try { - final List printerNamesList = jsonDecode(printerNamesJson); - final appPrinterName = '$appName Printer'; - return printerNamesList - .map((e) => e.toString()) - .where((name) => name != appPrinterName) - .toList(); - } catch (e) { - debugPrint('failed to parse printer names, err: $e'); - return []; - } -} - -String _appName = ''; -String get appName { - if (_appName.isEmpty) { - _appName = bind.mainGetAppNameSync(); - } - return _appName; -} - -String getConnectionText(bool secure, bool direct, String streamType) { - String connectionText; - if (secure && direct) { - connectionText = translate("Direct and encrypted connection"); - } else if (secure && !direct) { - connectionText = translate("Relayed and encrypted connection"); - } else if (!secure && direct) { - connectionText = translate("Direct and unencrypted connection"); - } else { - connectionText = translate("Relayed and unencrypted connection"); - } - if (streamType == 'Relay') { - streamType = 'TCP'; - } - if (streamType.isEmpty) { - return connectionText; - } else { - return '$connectionText ($streamType)'; - } -} - -String decode_http_response(http.Response resp) { - try { - // https://github.com/rustdesk/rustdesk-server-pro/discussions/758 - return utf8.decode(resp.bodyBytes, allowMalformed: true); - } catch (e) { - debugPrint('Failed to decode response as UTF-8: $e'); - // Fallback to bodyString which handles encoding automatically - return resp.body; - } -} - -bool peerTabShowNote(PeerTabIndex peerTabIndex) { - return peerTabIndex == PeerTabIndex.ab || peerTabIndex == PeerTabIndex.group; -} - -// TODO: We should support individual bits combinations in the future. -// But for now, just keep it simple, because the old code only supports single button. -// No users have requested multi-button support yet. -String mouseButtonsToPeer(int buttons) { - switch (buttons) { - case kPrimaryMouseButton: - return 'left'; - case kSecondaryMouseButton: - return 'right'; - case kMiddleMouseButton: - return 'wheel'; - case kBackMouseButton: - return 'back'; - case kForwardMouseButton: - return 'forward'; - default: - return ''; - } -} - -/// Build an avatar widget from an avatar URL or data URI string. -/// Returns [fallback] if avatar is empty or cannot be decoded. -/// [borderRadius] defaults to [size]/2 (circle). -Widget? buildAvatarWidget({ - required String avatar, - required double size, - double? borderRadius, - Widget? fallback, -}) { - final trimmed = avatar.trim(); - if (trimmed.isEmpty) return fallback; - - ImageProvider? imageProvider; - if (trimmed.startsWith('data:image/')) { - final comma = trimmed.indexOf(','); - if (comma > 0) { - try { - imageProvider = MemoryImage(base64Decode(trimmed.substring(comma + 1))); - } catch (_) {} - } - } else if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) { - imageProvider = NetworkImage(trimmed); - } - - if (imageProvider == null) return fallback; - - final radius = borderRadius ?? size / 2; - return ClipRRect( - borderRadius: BorderRadius.circular(radius), - child: Image( - image: imageProvider, - width: size, - height: size, - fit: BoxFit.cover, - errorBuilder: (_, __, ___) => - fallback ?? SizedBox.shrink(), - ), - ); -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/formatter/id_formatter.dart b/shelled/rustdesk-as-ref/flutter/lib/common/formatter/id_formatter.dart deleted file mode 100644 index c2329d5..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/formatter/id_formatter.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -class IDTextEditingController extends TextEditingController { - IDTextEditingController({String? text}) : super(text: text); - - String get id => trimID(value.text); - - set id(String newID) => text = formatID(newID); -} - -class IDTextInputFormatter extends TextInputFormatter { - @override - TextEditingValue formatEditUpdate( - TextEditingValue oldValue, TextEditingValue newValue) { - if (newValue.text.isEmpty) { - return newValue.copyWith(text: ''); - } else if (newValue.text.compareTo(oldValue.text) == 0) { - return newValue; - } else { - int selectionIndexFromTheRight = - newValue.text.length - newValue.selection.extentOffset; - String newID = formatID(newValue.text); - return TextEditingValue( - text: newID, - selection: TextSelection.collapsed( - offset: newID.length - selectionIndexFromTheRight, - ), - // https://github.com/flutter/flutter/issues/78066#issuecomment-797869906 - composing: newValue.composing, - ); - } - } -} - -String formatID(String id) { - String id2 = id.replaceAll(' ', ''); - String suffix = ''; - if (id2.endsWith(r'\r') || id2.endsWith(r'/r')) { - suffix = id2.substring(id2.length - 2, id2.length); - id2 = id2.substring(0, id2.length - 2); - } - if (int.tryParse(id2) == null) return id; - String newID = ''; - if (id2.length <= 3) { - newID = id2; - } else { - var n = id2.length; - var a = n % 3 != 0 ? n % 3 : 3; - newID = id2.substring(0, a); - for (var i = a; i < n; i += 3) { - newID += " ${id2.substring(i, i + 3)}"; - } - } - return newID + suffix; -} - -String trimID(String id) { - return id.replaceAll(' ', ''); -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/hbbs/hbbs.dart b/shelled/rustdesk-as-ref/flutter/lib/common/hbbs/hbbs.dart deleted file mode 100644 index 0c729e4..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/hbbs/hbbs.dart +++ /dev/null @@ -1,302 +0,0 @@ -import 'dart:convert'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/consts.dart'; - -import 'package:flutter_hbb/models/peer_model.dart'; - -import '../../models/platform_model.dart'; - -class HttpType { - static const kAuthReqTypeAccount = "account"; - static const kAuthReqTypeMobile = "mobile"; - static const kAuthReqTypeSMSCode = "sms_code"; - static const kAuthReqTypeEmailCode = "email_code"; - static const kAuthReqTypeTfaCode = "tfa_code"; - - static const kAuthResTypeToken = "access_token"; - static const kAuthResTypeEmailCheck = "email_check"; - static const kAuthResTypeTfaCheck = "tfa_check"; -} - -enum UserStatus { kDisabled, kNormal, kUnverified } - -// to-do: The UserPayload does not contain all the fields of the user. -// Is all the fields of the user needed? -class UserPayload { - String name = ''; - String displayName = ''; - String avatar = ''; - String email = ''; - String note = ''; - String? verifier; - UserStatus status; - bool isAdmin = false; - - UserPayload.fromJson(Map json) - : name = json['name'] ?? '', - displayName = json['display_name'] ?? '', - avatar = json['avatar'] ?? '', - email = json['email'] ?? '', - note = json['note'] ?? '', - verifier = json['verifier'], - status = json['status'] == 0 - ? UserStatus.kDisabled - : json['status'] == -1 - ? UserStatus.kUnverified - : UserStatus.kNormal, - isAdmin = json['is_admin'] == true; - - Map toJson() { - final Map map = { - 'name': name, - 'display_name': displayName, - 'avatar': avatar, - 'status': status == UserStatus.kDisabled - ? 0 - : status == UserStatus.kUnverified - ? -1 - : 1, - }; - return map; - } - - Map toGroupCacheJson() { - final Map map = { - 'name': name, - 'display_name': displayName, - }; - return map; - } - - String get displayNameOrName { - return displayName.trim().isEmpty ? name : displayName; - } -} - -class PeerPayload { - String id = ''; - Map info = {}; - int? status; - String user = ''; - String user_name = ''; - String? device_group_name; - String note = ''; - - PeerPayload.fromJson(Map json) - : id = json['id'] ?? '', - info = (json['info'] is Map) ? json['info'] : {}, - status = json['status'], - user = json['user'] ?? '', - user_name = json['user_name'] ?? '', - device_group_name = json['device_group_name'] ?? '', - note = json['note'] ?? ''; - - static Peer toPeer(PeerPayload p) { - return Peer.fromJson({ - "id": p.id, - 'loginName': p.user_name, - "username": p.info['username'] ?? '', - "platform": _platform(p.info['os']), - "hostname": p.info['device_name'], - "device_group_name": p.device_group_name, - "note": p.note, - }); - } - - static String? _platform(dynamic field) { - if (field == null) { - return null; - } - final fieldStr = field.toString(); - List list = fieldStr.split(' / '); - if (list.isEmpty) return null; - final os = list[0]; - switch (os.toLowerCase()) { - case 'windows': - return kPeerPlatformWindows; - case 'linux': - return kPeerPlatformLinux; - case 'macos': - return kPeerPlatformMacOS; - case 'android': - return kPeerPlatformAndroid; - default: - if (fieldStr.toLowerCase().contains('linux')) { - return kPeerPlatformLinux; - } - return null; - } - } -} - -class LoginRequest { - String? username; - String? password; - String? id; - String? uuid; - bool? autoLogin; - String? type; - String? verificationCode; - String? tfaCode; - String? secret; - - LoginRequest( - {this.username, - this.password, - this.id, - this.uuid, - this.autoLogin, - this.type, - this.verificationCode, - this.tfaCode, - this.secret}); - - Map toJson() { - final Map data = {}; - if (username != null) data['username'] = username; - if (password != null) data['password'] = password; - if (id != null) data['id'] = id; - if (uuid != null) data['uuid'] = uuid; - if (autoLogin != null) data['autoLogin'] = autoLogin; - if (type != null) data['type'] = type; - if (verificationCode != null) { - data['verificationCode'] = verificationCode; - } - if (tfaCode != null) data['tfaCode'] = tfaCode; - if (secret != null) data['secret'] = secret; - - Map deviceInfo = {}; - try { - deviceInfo = jsonDecode(bind.mainGetLoginDeviceInfo()); - } catch (e) { - debugPrint('Failed to decode get device info: $e'); - } - data['deviceInfo'] = deviceInfo; - return data; - } -} - -class LoginResponse { - String? access_token; - String? type; - String? tfa_type; - String? secret; - UserPayload? user; - - LoginResponse( - {this.access_token, this.type, this.tfa_type, this.secret, this.user}); - - LoginResponse.fromJson(Map json) { - access_token = json['access_token']; - type = json['type']; - tfa_type = json['tfa_type']; - secret = json['secret']; - user = json['user'] != null ? UserPayload.fromJson(json['user']) : null; - } -} - -class RequestException implements Exception { - int statusCode; - String cause; - RequestException(this.statusCode, this.cause); - - @override - String toString() { - return "RequestException, statusCode: $statusCode, error: $cause"; - } -} - -enum ShareRule { - read(1), - readWrite(2), - fullControl(3); - - const ShareRule(this.value); - final int value; - - static String desc(int v) { - if (v == ShareRule.read.value) { - return translate('Read-only'); - } - if (v == ShareRule.readWrite.value) { - return translate('Read/Write'); - } - if (v == ShareRule.fullControl.value) { - return translate('Full Control'); - } - return v.toString(); - } - - static String shortDesc(int v) { - if (v == ShareRule.read.value) { - return 'R'; - } - if (v == ShareRule.readWrite.value) { - return 'RW'; - } - if (v == ShareRule.fullControl.value) { - return 'F'; - } - return v.toString(); - } - - static ShareRule? fromValue(int v) { - if (v == ShareRule.read.value) { - return ShareRule.read; - } - if (v == ShareRule.readWrite.value) { - return ShareRule.readWrite; - } - if (v == ShareRule.fullControl.value) { - return ShareRule.fullControl; - } - return null; - } -} - -class AbProfile { - String guid; - String name; - String owner; - String? note; - dynamic info; - int rule; - - AbProfile(this.guid, this.name, this.owner, this.note, this.rule, this.info); - - AbProfile.fromJson(Map json) - : guid = json['guid'] ?? '', - name = json['name'] ?? '', - owner = json['owner'] ?? '', - note = json['note'] ?? '', - info = json['info'], - rule = json['rule'] ?? 0; -} - -class AbTag { - String name; - int color; - - AbTag(this.name, this.color); - - AbTag.fromJson(Map json) - : name = json['name'] ?? '', - color = json['color'] ?? ''; -} - -class DeviceGroupPayload { - String name; - - DeviceGroupPayload(this.name); - - DeviceGroupPayload.fromJson(Map json) - : name = json['name'] ?? ''; - - Map toGroupCacheJson() { - final Map map = { - 'name': name, - }; - return map; - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/shared_state.dart b/shelled/rustdesk-as-ref/flutter/lib/common/shared_state.dart deleted file mode 100644 index 4f9373c..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/shared_state.dart +++ /dev/null @@ -1,368 +0,0 @@ -import 'package:flutter_hbb/common.dart'; -import 'package:get/get.dart'; - -import '../consts.dart'; - -// TODO: A lot of dup code. - -class PrivacyModeState { - static String tag(String id) => 'privacy_mode_$id'; - - static void init(String id) { - final key = tag(id); - if (!Get.isRegistered(tag: key)) { - final RxString state = ''.obs; - Get.put(state, tag: key); - } - } - - static void delete(String id) { - final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } else { - Get.find(tag: key).value = ''; - } - } - - static RxString find(String id) => Get.find(tag: tag(id)); -} - -class BlockInputState { - static String tag(String id) => 'block_input_$id'; - - static void init(String id) { - final key = tag(id); - if (!Get.isRegistered(tag: key)) { - final RxBool state = false.obs; - Get.put(state, tag: key); - } else { - Get.find(tag: key).value = false; - } - } - - static void delete(String id) { - final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static RxBool find(String id) => Get.find(tag: tag(id)); -} - -class CurrentDisplayState { - static String tag(String id) => 'current_display_$id'; - - static void init(String id) { - final key = tag(id); - if (!Get.isRegistered(tag: key)) { - final RxInt state = RxInt(0); - Get.put(state, tag: key); - } else { - Get.find(tag: key).value = 0; - } - } - - static void delete(String id) { - final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static RxInt find(String id) => Get.find(tag: tag(id)); -} - -class ConnectionType { - final Rx _secure = kInvalidValueStr.obs; - final Rx _direct = kInvalidValueStr.obs; - final Rx _stream_type = kInvalidValueStr.obs; - - Rx get secure => _secure; - Rx get direct => _direct; - Rx get stream_type => _stream_type; - - static String get strSecure => 'secure'; - static String get strInsecure => 'insecure'; - static String get strDirect => ''; - static String get strIndirect => '_relay'; - - void setSecure(bool v) { - _secure.value = v ? strSecure : strInsecure; - } - - void setDirect(bool v) { - _direct.value = v ? strDirect : strIndirect; - } - - void setStreamType(String v) { - _stream_type.value = v; - } - - bool isValid() { - return _secure.value != kInvalidValueStr && - _direct.value != kInvalidValueStr && - _stream_type.value != kInvalidValueStr; - } -} - -class ConnectionTypeState { - static String tag(String id) => 'connection_type_$id'; - - static void init(String id) { - final key = tag(id); - if (!Get.isRegistered(tag: key)) { - final ConnectionType collectionType = ConnectionType(); - Get.put(collectionType, tag: key); - } - } - - static void delete(String id) { - final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static ConnectionType find(String id) => - Get.find(tag: tag(id)); -} - -class FingerprintState { - static String tag(String id) => 'fingerprint_$id'; - - static void init(String id) { - final key = tag(id); - if (!Get.isRegistered(tag: key)) { - final RxString state = ''.obs; - Get.put(state, tag: key); - } else { - Get.find(tag: key).value = ''; - } - } - - static void delete(String id) { - final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static RxString find(String id) => Get.find(tag: tag(id)); -} - -class ShowRemoteCursorState { - static String tag(String id) => 'show_remote_cursor_$id'; - - static void init(String id) { - final key = tag(id); - if (!Get.isRegistered(tag: key)) { - final RxBool state = false.obs; - Get.put(state, tag: key); - } else { - Get.find(tag: key).value = false; - } - } - - static void delete(String id) { - final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static RxBool find(String id) => Get.find(tag: tag(id)); -} - -class ShowRemoteCursorLockState { - static String tag(String id) => 'show_remote_cursor_lock_$id'; - - static void init(String id) { - final key = tag(id); - if (!Get.isRegistered(tag: key)) { - final RxBool state = false.obs; - Get.put(state, tag: key); - } else { - Get.find(tag: key).value = false; - } - } - - static void delete(String id) { - final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static RxBool find(String id) => Get.find(tag: tag(id)); -} - -class KeyboardEnabledState { - static String tag(String id) => 'keyboard_enabled_$id'; - - static void init(String id) { - final key = tag(id); - if (!Get.isRegistered(tag: key)) { - // Server side, default true - final RxBool state = true.obs; - Get.put(state, tag: key); - } else { - Get.find(tag: key).value = true; - } - } - - static void delete(String id) { - final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static RxBool find(String id) => Get.find(tag: tag(id)); -} - -class RemoteCursorMovedState { - static String tag(String id) => 'remote_cursor_moved_$id'; - - static void init(String id) { - final key = tag(id); - if (!Get.isRegistered(tag: key)) { - final RxBool state = false.obs; - Get.put(state, tag: key); - } else { - Get.find(tag: key).value = false; - } - } - - static void delete(String id) { - final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static RxBool find(String id) => Get.find(tag: tag(id)); -} - -class RemoteCountState { - static String tag() => 'remote_count_'; - - static void init() { - final key = tag(); - if (!Get.isRegistered(tag: key)) { - final RxInt state = 1.obs; - Get.put(state, tag: key); - } else { - Get.find(tag: key).value = 1; - } - } - - static void delete() { - final key = tag(); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static RxInt find() => Get.find(tag: tag()); -} - -class PeerBoolOption { - static String tag(String id, String opt) => 'peer_{$opt}_$id'; - - static void init(String id, String opt, bool Function() init_getter) { - final key = tag(id, opt); - if (!Get.isRegistered(tag: key)) { - final RxBool value = RxBool(init_getter()); - Get.put(value, tag: key); - } else { - Get.find(tag: key).value = init_getter(); - } - } - - static void delete(String id, String opt) { - final key = tag(id, opt); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static RxBool find(String id, String opt) => - Get.find(tag: tag(id, opt)); -} - -class PeerStringOption { - static String tag(String id, String opt) => 'peer_{$opt}_$id'; - - static void init(String id, String opt, String Function() init_getter) { - final key = tag(id, opt); - if (!Get.isRegistered(tag: key)) { - final RxString value = RxString(init_getter()); - Get.put(value, tag: key); - } else { - Get.find(tag: key).value = init_getter(); - } - } - - static void delete(String id, String opt) { - final key = tag(id, opt); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static RxString find(String id, String opt) => - Get.find(tag: tag(id, opt)); -} - -class UnreadChatCountState { - static String tag(id) => 'unread_chat_count_$id'; - - static void init(String id) { - final key = tag(id); - if (!Get.isRegistered(tag: key)) { - final RxInt state = RxInt(0); - Get.put(state, tag: key); - } else { - Get.find(tag: key).value = 0; - } - } - - static void delete(String id) { - final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); - } - } - - static RxInt find(String id) => Get.find(tag: tag(id)); -} - -initSharedStates(String id) { - PrivacyModeState.init(id); - BlockInputState.init(id); - CurrentDisplayState.init(id); - KeyboardEnabledState.init(id); - ShowRemoteCursorState.init(id); - ShowRemoteCursorLockState.init(id); - RemoteCursorMovedState.init(id); - FingerprintState.init(id); - PeerBoolOption.init(id, kOptionZoomCursor, () => false); - UnreadChatCountState.init(id); - if (isMobile) ConnectionTypeState.init(id); // desktop in other places -} - -removeSharedStates(String id) { - PrivacyModeState.delete(id); - BlockInputState.delete(id); - CurrentDisplayState.delete(id); - ShowRemoteCursorState.delete(id); - ShowRemoteCursorLockState.delete(id); - KeyboardEnabledState.delete(id); - RemoteCursorMovedState.delete(id); - FingerprintState.delete(id); - PeerBoolOption.delete(id, kOptionZoomCursor); - UnreadChatCountState.delete(id); - if (isMobile) ConnectionTypeState.delete(id); -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/address_book.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/address_book.dart deleted file mode 100644 index 1a09d6f..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/address_book.dart +++ /dev/null @@ -1,899 +0,0 @@ -import 'dart:math'; - -import 'package:bot_toast/bot_toast.dart'; -import 'package:dropdown_button2/dropdown_button2.dart'; -import 'package:dynamic_layouts/dynamic_layouts.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common/formatter/id_formatter.dart'; -import 'package:flutter_hbb/common/hbbs/hbbs.dart'; -import 'package:flutter_hbb/common/widgets/peer_card.dart'; -import 'package:flutter_hbb/common/widgets/peers_view.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/desktop/widgets/popup_menu.dart'; -import 'package:flutter_hbb/models/ab_model.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:url_launcher/url_launcher_string.dart'; -import '../../desktop/widgets/material_mod_popup_menu.dart' as mod_menu; -import 'package:get/get.dart'; -import 'package:flex_color_picker/flex_color_picker.dart'; - -import '../../common.dart'; -import 'dialog.dart'; -import 'login.dart'; - -final hideAbTagsPanel = false.obs; - -class AddressBook extends StatefulWidget { - final EdgeInsets? menuPadding; - const AddressBook({Key? key, this.menuPadding}) : super(key: key); - - @override - State createState() { - return _AddressBookState(); - } -} - -class _AddressBookState extends State { - var menuPos = RelativeRect.fill; - - @override - Widget build(BuildContext context) => Obx(() { - if (!gFFI.userModel.isLogin) { - return Center( - child: ElevatedButton( - onPressed: loginDialog, child: Text(translate("Login")))); - } else if (gFFI.userModel.networkError.isNotEmpty) { - return netWorkErrorWidget(); - } else { - return Column( - children: [ - // NOT use Offstage to wrap LinearProgressIndicator - if (gFFI.abModel.currentAbLoading.value && - gFFI.abModel.currentAbEmpty) - const LinearProgressIndicator(), - buildErrorBanner(context, - loading: gFFI.abModel.currentAbLoading, - err: gFFI.abModel.currentAbPullError, - retry: null, - close: () => gFFI.abModel.currentAbPullError.value = ''), - buildErrorBanner(context, - loading: gFFI.abModel.currentAbLoading, - err: gFFI.abModel.currentAbPushError, - retry: null, // remove retry - close: () => gFFI.abModel.currentAbPushError.value = ''), - Expanded( - child: Obx(() => stateGlobal.isPortrait.isTrue - ? _buildAddressBookPortrait() - : _buildAddressBookLandscape()), - ), - ], - ); - } - }); - - Widget _buildAddressBookLandscape() { - return Row( - children: [ - Offstage( - offstage: hideAbTagsPanel.value, - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - border: Border.all( - color: Theme.of(context).colorScheme.background)), - child: Container( - width: 200, - height: double.infinity, - child: Column( - children: [ - _buildAbDropdown(), - _buildTagHeader().marginOnly( - left: 8.0, - right: gFFI.abModel.legacyMode.value ? 8.0 : 0, - top: gFFI.abModel.legacyMode.value ? 8.0 : 0), - Expanded( - child: Container( - width: double.infinity, - height: double.infinity, - child: _buildTags(), - ), - ), - _buildAbPermission(), - ], - ), - ), - ).marginOnly(right: 12.0)), - _buildPeersViews() - ], - ); - } - - Widget _buildAddressBookPortrait() { - const padding = 8.0; - return Column( - children: [ - Offstage( - offstage: hideAbTagsPanel.value, - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(6), - border: Border.all( - color: Theme.of(context).colorScheme.background)), - child: Container( - padding: - const EdgeInsets.fromLTRB(padding, 0, padding, padding), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - _buildAbDropdown(), - _buildTagHeader().marginOnly(left: 8.0, right: 0), - Container( - width: double.infinity, - child: _buildTags(), - ), - ], - ), - ), - ).marginOnly(bottom: 12.0)), - _buildPeersViews() - ], - ); - } - - Widget _buildAbPermission() { - icon(IconData data, String tooltip) { - return Tooltip( - message: translate(tooltip), - waitDuration: Duration.zero, - child: Icon(data, size: 12.0).marginSymmetric(horizontal: 2.0)); - } - - return Obx(() { - if (gFFI.abModel.legacyMode.value) return Offstage(); - if (gFFI.abModel.current.isPersonal()) { - return Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - icon(Icons.cloud_off, "Personal"), - ], - ); - } else { - List children = []; - final rule = gFFI.abModel.current.sharedProfile()?.rule; - if (rule == ShareRule.read.value) { - children.add( - icon(Icons.visibility, ShareRule.desc(ShareRule.read.value))); - } else if (rule == ShareRule.readWrite.value) { - children - .add(icon(Icons.edit, ShareRule.desc(ShareRule.readWrite.value))); - } else if (rule == ShareRule.fullControl.value) { - children.add(icon( - Icons.security, ShareRule.desc(ShareRule.fullControl.value))); - } - final owner = gFFI.abModel.current.sharedProfile()?.owner; - if (owner != null) { - children.add(icon(Icons.person, "${translate("Owner")}: $owner")); - } - return Row( - mainAxisAlignment: MainAxisAlignment.end, - children: children, - ); - } - }); - } - - Widget _buildAbDropdown() { - if (gFFI.abModel.legacyMode.value) { - return Offstage(); - } - final names = gFFI.abModel.addressBookNames(); - if (!names.contains(gFFI.abModel.currentName.value)) { - return Offstage(); - } - // order: personal, divider, character order - // https://pub.dev/packages/dropdown_button2#3-dropdownbutton2-with-items-of-different-heights-like-dividers - final personalAddressBookName = gFFI.abModel.personalAddressBookName(); - bool contains = names.remove(personalAddressBookName); - names.sort((a, b) => a.toLowerCase().compareTo(b.toLowerCase())); - if (contains) { - names.insert(0, personalAddressBookName); - } - - Row buildItem(String e, {bool button = false}) { - return Row( - children: [ - Expanded( - child: Tooltip( - waitDuration: Duration(milliseconds: 500), - message: gFFI.abModel.translatedName(e), - child: Text( - gFFI.abModel.translatedName(e), - style: button ? null : TextStyle(fontSize: 14.0), - maxLines: 1, - overflow: TextOverflow.ellipsis, - textAlign: button ? TextAlign.center : null, - )), - ), - ], - ); - } - - final items = names - .map((e) => DropdownMenuItem(value: e, child: buildItem(e))) - .toList(); - var menuItemStyleData = MenuItemStyleData(height: 36); - if (contains && items.length > 1) { - items.insert(1, DropdownMenuItem(enabled: false, child: Divider())); - List customHeights = List.filled(items.length, 36); - customHeights[1] = 4; - menuItemStyleData = MenuItemStyleData(customHeights: customHeights); - } - final TextEditingController textEditingController = TextEditingController(); - - final isOptFixed = isOptionFixed(kOptionCurrentAbName); - return DropdownButton2( - value: gFFI.abModel.currentName.value, - onChanged: isOptFixed - ? null - : (value) { - if (value != null) { - gFFI.abModel.setCurrentName(value); - bind.setLocalFlutterOption(k: kOptionCurrentAbName, v: value); - } - }, - customButton: Obx(() => Container( - height: stateGlobal.isPortrait.isFalse ? 48 : 40, - child: Row(children: [ - Expanded( - child: - buildItem(gFFI.abModel.currentName.value, button: true)), - Icon(Icons.arrow_drop_down), - ]), - )), - underline: Container( - height: 0.7, - color: Theme.of(context).dividerColor.withOpacity(0.1), - ), - menuItemStyleData: menuItemStyleData, - items: items, - isExpanded: true, - isDense: true, - dropdownSearchData: DropdownSearchData( - searchController: textEditingController, - searchInnerWidgetHeight: 50, - searchInnerWidget: Container( - height: 50, - padding: const EdgeInsets.only( - top: 8, - bottom: 4, - right: 8, - left: 8, - ), - child: TextFormField( - expands: true, - maxLines: null, - controller: textEditingController, - decoration: InputDecoration( - isDense: true, - contentPadding: const EdgeInsets.symmetric( - horizontal: 10, - vertical: 8, - ), - hintText: translate('Search'), - hintStyle: const TextStyle(fontSize: 12), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - ), - ).workaroundFreezeLinuxMint(), - ), - searchMatchFn: (item, searchValue) { - return item.value - .toString() - .toLowerCase() - .contains(searchValue.toLowerCase()); - }, - ), - ); - } - - Widget _buildTagHeader() { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(translate('Tags')), - Listener( - onPointerDown: (e) { - final x = e.position.dx; - final y = e.position.dy; - menuPos = RelativeRect.fromLTRB(x, y, x, y); - }, - onPointerUp: (_) => _showMenu(menuPos), - child: build_more(context, invert: true)), - ], - ); - } - - Widget _buildTags() { - return Obx(() { - List tags; - if (gFFI.abModel.sortTags.value) { - tags = gFFI.abModel.currentAbTags.toList(); - tags.sort(); - } else { - tags = gFFI.abModel.currentAbTags.toList(); - } - tags = [kUntagged, ...tags].toList(); - final editPermission = gFFI.abModel.current.canWrite(); - tagBuilder(String e) { - return AddressBookTag( - name: e, - tags: gFFI.abModel.selectedTags, - onTap: () { - if (gFFI.abModel.selectedTags.contains(e)) { - gFFI.abModel.selectedTags.remove(e); - } else { - gFFI.abModel.selectedTags.add(e); - } - }, - showActionMenu: editPermission); - } - - gridView(bool isPortrait) => DynamicGridView.builder( - shrinkWrap: isPortrait, - gridDelegate: SliverGridDelegateWithWrapping(), - itemCount: tags.length, - itemBuilder: (BuildContext context, int index) { - final e = tags[index]; - return tagBuilder(e); - }); - final maxHeight = max(MediaQuery.of(context).size.height / 6, 100.0); - return Obx(() => stateGlobal.isPortrait.isFalse - ? gridView(false) - : LimitedBox(maxHeight: maxHeight, child: gridView(true))); - }); - } - - Widget _buildPeersViews() { - return Expanded( - child: Align( - alignment: Alignment.topLeft, - child: AddressBookPeersView( - menuPadding: widget.menuPadding, - )), - ); - } - - @protected - MenuEntryBase syncMenuItem() { - final isOptFixed = isOptionFixed(syncAbOption); - return MenuEntrySwitch( - switchType: SwitchType.scheckbox, - text: translate('Sync with recent sessions'), - getter: () async { - return shouldSyncAb(); - }, - setter: (bool v) async { - gFFI.abModel.setShouldAsync(v); - }, - dismissOnClicked: true, - enabled: (!isOptFixed).obs, - ); - } - - @protected - MenuEntryBase sortMenuItem() { - final isOptFixed = isOptionFixed(sortAbTagsOption); - return MenuEntrySwitch( - switchType: SwitchType.scheckbox, - text: translate('Sort tags'), - getter: () async { - return shouldSortTags(); - }, - setter: (bool v) async { - bind.mainSetLocalOption( - key: sortAbTagsOption, value: v ? 'Y' : defaultOptionNo); - gFFI.abModel.sortTags.value = v; - }, - dismissOnClicked: true, - enabled: (!isOptFixed).obs, - ); - } - - @protected - MenuEntryBase filterMenuItem() { - final isOptFixed = isOptionFixed(filterAbTagOption); - return MenuEntrySwitch( - switchType: SwitchType.scheckbox, - text: translate('Filter by intersection'), - getter: () async { - return filterAbTagByIntersection(); - }, - setter: (bool v) async { - bind.mainSetLocalOption( - key: filterAbTagOption, value: v ? 'Y' : defaultOptionNo); - gFFI.abModel.filterByIntersection.value = v; - }, - dismissOnClicked: true, - enabled: (!isOptFixed).obs, - ); - } - - void _showMenu(RelativeRect pos) { - final canWrite = gFFI.abModel.current.canWrite(); - final items = [ - if (canWrite) getEntry(translate("Add ID"), addIdToCurrentAb), - if (canWrite) getEntry(translate("Add Tag"), abAddTag), - getEntry(translate("Unselect all tags"), gFFI.abModel.unsetSelectedTags), - if (gFFI.abModel.legacyMode.value) - sortMenuItem(), // It's already sorted after pulling down - if (canWrite) syncMenuItem(), - filterMenuItem(), - if (!gFFI.abModel.legacyMode.value && canWrite) - MenuEntryDivider(), - if (!gFFI.abModel.legacyMode.value && canWrite) - getEntry(translate("ab_web_console_tip"), () async { - final url = await bind.mainGetApiServer(); - if (await canLaunchUrlString(url)) { - launchUrlString(url); - } - }), - ]; - - mod_menu.showMenu( - context: context, - position: pos, - items: items - .map((e) => e.build( - context, - MenuConfig( - commonColor: CustomPopupMenuTheme.commonColor, - height: CustomPopupMenuTheme.height, - dividerHeight: CustomPopupMenuTheme.dividerHeight))) - .expand((i) => i) - .toList(), - elevation: 8, - ); - } - - void addIdToCurrentAb() async { - if (gFFI.abModel.isCurrentAbFull(true)) { - return; - } - var isInProgress = false; - var passwordVisible = false; - IDTextEditingController idController = IDTextEditingController(text: ''); - TextEditingController aliasController = TextEditingController(text: ''); - TextEditingController passwordController = TextEditingController(text: ''); - TextEditingController noteController = TextEditingController(text: ''); - final tags = List.of(gFFI.abModel.currentAbTags); - var selectedTag = List.empty(growable: true).obs; - final style = TextStyle(fontSize: 14.0); - String? errorMsg; - final isCurrentAbShared = !gFFI.abModel.current.isPersonal(); - - gFFI.dialogManager.show((setState, close, context) { - submit() async { - setState(() { - isInProgress = true; - errorMsg = null; - }); - String id = idController.id; - if (id.isEmpty) { - // pass - } else { - if (gFFI.abModel.idContainByCurrent(id)) { - setState(() { - isInProgress = false; - errorMsg = translate('ID already exists'); - }); - return; - } - var password = ''; - if (isCurrentAbShared) { - password = passwordController.text; - } - String? errMsg2 = await gFFI.abModel.addIdToCurrent( - id, - aliasController.text.trim(), - password, - selectedTag, - noteController.text); - if (errMsg2 != null) { - setState(() { - isInProgress = false; - errorMsg = errMsg2; - }); - return; - } - // final currentPeers - } - close(); - } - - double marginBottom = 4; - - row({required Widget label, required Widget input}) { - makeChild(bool isPortrait) => Row( - children: [ - !isPortrait - ? ConstrainedBox( - constraints: const BoxConstraints(minWidth: 100), - child: label.marginOnly(right: 10)) - : SizedBox.shrink(), - Expanded( - child: ConstrainedBox( - constraints: const BoxConstraints(minWidth: 200), - child: input), - ), - ], - ).marginOnly(bottom: !isPortrait ? 8 : 0); - return Obx(() => makeChild(stateGlobal.isPortrait.isTrue)); - } - - return CustomAlertDialog( - title: Text(translate("Add ID")), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - children: [ - row( - label: Row( - children: [ - Text( - '*', - style: TextStyle(color: Colors.red, fontSize: 14), - ), - Text( - 'ID', - style: style, - ), - ], - ), - input: Obx(() => TextField( - controller: idController, - inputFormatters: [IDTextInputFormatter()], - decoration: InputDecoration( - labelText: stateGlobal.isPortrait.isFalse - ? null - : translate('ID'), - errorText: errorMsg, - errorMaxLines: 5), - ).workaroundFreezeLinuxMint())), - row( - label: Text( - translate('Alias'), - style: style, - ), - input: Obx(() => TextField( - controller: aliasController, - decoration: InputDecoration( - labelText: stateGlobal.isPortrait.isFalse - ? null - : translate('Alias'), - ), - ).workaroundFreezeLinuxMint()), - ), - if (isCurrentAbShared) - row( - label: Text( - translate('Password'), - style: style, - ), - input: Obx( - () => TextField( - controller: passwordController, - obscureText: !passwordVisible, - decoration: InputDecoration( - labelText: stateGlobal.isPortrait.isFalse - ? null - : translate('Password'), - suffixIcon: IconButton( - icon: Icon( - passwordVisible - ? Icons.visibility - : Icons.visibility_off, - color: MyTheme.lightTheme.primaryColor), - onPressed: () { - setState(() { - passwordVisible = !passwordVisible; - }); - }, - ), - ), - ).workaroundFreezeLinuxMint(), - )), - row( - label: Text( - translate('Note'), - style: style, - ), - input: Obx( - () => TextField( - controller: noteController, - maxLines: 3, - minLines: 1, - maxLength: 300, - decoration: InputDecoration( - labelText: stateGlobal.isPortrait.isFalse - ? null - : translate('Note'), - ), - ).workaroundFreezeLinuxMint(), - )), - if (gFFI.abModel.currentAbTags.isNotEmpty) - Align( - alignment: Alignment.centerLeft, - child: Text( - translate('Tags'), - style: style, - ), - ).marginOnly(top: 8, bottom: marginBottom), - if (gFFI.abModel.currentAbTags.isNotEmpty) - Align( - alignment: Alignment.centerLeft, - child: Wrap( - children: tags - .map((e) => AddressBookTag( - name: e, - tags: selectedTag, - onTap: () { - if (selectedTag.contains(e)) { - selectedTag.remove(e); - } else { - selectedTag.add(e); - } - }, - showActionMenu: false)) - .toList(growable: false), - ), - ), - ], - ), - const SizedBox( - height: 4.0, - ), - if (!gFFI.abModel.current.isPersonal()) - Row(children: [ - Icon(Icons.info, color: Colors.amber).marginOnly(right: 4), - Text( - translate('share_warning_tip'), - style: TextStyle(fontSize: 12), - ) - ]).marginSymmetric(vertical: 10), - // NOT use Offstage to wrap LinearProgressIndicator - if (isInProgress) const LinearProgressIndicator(), - ], - ), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - dialogButton("OK", onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); - } - - void abAddTag() async { - var field = ""; - var msg = ""; - var isInProgress = false; - TextEditingController controller = TextEditingController(text: field); - gFFI.dialogManager.show((setState, close, context) { - submit() async { - setState(() { - msg = ""; - isInProgress = true; - }); - field = controller.text.trim(); - if (field.isEmpty) { - // pass - } else { - final tags = field.trim().split(RegExp(r"[\s,;\n]+")); - field = tags.join(','); - for (var t in [kUntagged, translate(kUntagged)]) { - if (tags.contains(t)) { - BotToast.showText( - contentColor: Colors.red, text: 'Tag name cannot be "$t"'); - isInProgress = false; - return; - } - } - gFFI.abModel.addTags(tags); - // final currentPeers - } - close(); - } - - return CustomAlertDialog( - title: Text(translate("Add Tag")), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(translate("whitelist_sep")), - const SizedBox( - height: 8.0, - ), - Row( - children: [ - Expanded( - child: TextField( - maxLines: null, - decoration: InputDecoration( - errorText: msg.isEmpty ? null : translate(msg), - ), - controller: controller, - autofocus: true, - ).workaroundFreezeLinuxMint(), - ), - ], - ), - const SizedBox( - height: 4.0, - ), - // NOT use Offstage to wrap LinearProgressIndicator - if (isInProgress) const LinearProgressIndicator(), - ], - ), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - dialogButton("OK", onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); - } -} - -class AddressBookTag extends StatelessWidget { - final String name; - final RxList tags; - final Function()? onTap; - final bool showActionMenu; - - const AddressBookTag( - {Key? key, - required this.name, - required this.tags, - this.onTap, - this.showActionMenu = true}) - : super(key: key); - - @override - Widget build(BuildContext context) { - var pos = RelativeRect.fill; - - void setPosition(TapDownDetails e) { - final x = e.globalPosition.dx; - final y = e.globalPosition.dy; - pos = RelativeRect.fromLTRB(x, y, x, y); - } - - const double radius = 8; - final isUnTagged = name == kUntagged; - final showAction = showActionMenu && !isUnTagged; - return GestureDetector( - onTap: onTap, - onTapDown: showAction ? setPosition : null, - onSecondaryTapDown: showAction ? setPosition : null, - onSecondaryTap: showAction ? () => _showMenu(context, pos) : null, - onLongPress: showAction ? () => _showMenu(context, pos) : null, - child: Obx(() => Container( - decoration: BoxDecoration( - color: tags.contains(name) - ? gFFI.abModel.getCurrentAbTagColor(name) - : Theme.of(context).colorScheme.background, - borderRadius: BorderRadius.circular(4)), - margin: const EdgeInsets.symmetric(horizontal: 4.0, vertical: 4.0), - padding: const EdgeInsets.symmetric(vertical: 2.0, horizontal: 6.0), - child: IntrinsicWidth( - child: Row( - children: [ - if (!isUnTagged) - Container( - width: radius, - height: radius, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: tags.contains(name) - ? Colors.white - : gFFI.abModel.getCurrentAbTagColor(name)), - ).marginOnly(right: radius / 2), - Expanded( - child: Text(isUnTagged ? translate(name) : name, - style: TextStyle( - overflow: TextOverflow.ellipsis, - color: tags.contains(name) ? Colors.white : null)), - ), - ], - ), - ), - )), - ); - } - - void _showMenu(BuildContext context, RelativeRect pos) { - final items = [ - getEntry(translate("Rename"), () { - renameDialog( - oldName: name, - validator: (String? newName) { - if (newName == null || newName.isEmpty) { - return translate('Can not be empty'); - } - if (newName != name && - gFFI.abModel.currentAbTags.contains(newName)) { - return translate('Already exists'); - } - return null; - }, - onSubmit: (String newName) { - if (name != newName) { - gFFI.abModel.renameTag(name, newName); - } - Future.delayed(Duration.zero, () => Get.back()); - }, - onCancel: () { - Future.delayed(Duration.zero, () => Get.back()); - }); - }), - getEntry(translate(translate('Change Color')), () async { - final model = gFFI.abModel; - Color oldColor = model.getCurrentAbTagColor(name); - Color newColor = await showColorPickerDialog( - context, - oldColor, - pickersEnabled: { - ColorPickerType.accent: false, - ColorPickerType.wheel: true, - }, - pickerTypeLabels: { - ColorPickerType.primary: translate("Primary Color"), - ColorPickerType.wheel: translate("HSV Color"), - }, - actionButtons: ColorPickerActionButtons( - dialogOkButtonLabel: translate("OK"), - dialogCancelButtonLabel: translate("Cancel")), - showColorCode: true, - ); - if (oldColor != newColor) { - model.setTagColor(name, newColor); - } - }), - getEntry(translate("Delete"), () { - gFFI.abModel.deleteTag(name); - Future.delayed(Duration.zero, () => Get.back()); - }), - ]; - - mod_menu.showMenu( - context: context, - position: pos, - items: items - .map((e) => e.build( - context, - MenuConfig( - commonColor: CustomPopupMenuTheme.commonColor, - height: CustomPopupMenuTheme.height, - dividerHeight: CustomPopupMenuTheme.dividerHeight))) - .expand((i) => i) - .toList(), - elevation: 8, - ); - } -} - -MenuEntryButton getEntry(String title, VoidCallback proc) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - title, - style: style, - ), - proc: proc, - dismissOnClicked: true, - ); -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/animated_rotation_widget.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/animated_rotation_widget.dart deleted file mode 100644 index 0efc715..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/animated_rotation_widget.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - -class AnimatedRotationWidget extends StatefulWidget { - final VoidCallback onPressed; - final ValueChanged? onHover; - final Widget child; - final RxBool? spinning; - const AnimatedRotationWidget( - {super.key, - required this.onPressed, - required this.child, - this.spinning, - this.onHover}); - - @override - State createState() => AnimatedRotationWidgetState(); -} - -class AnimatedRotationWidgetState extends State { - double turns = 0.0; - - @override - void initState() { - super.initState(); - widget.spinning?.listen((v) { - if (v && mounted) { - setState(() { - turns += 1; - }); - } - }); - } - - @override - Widget build(BuildContext context) { - return AnimatedRotation( - turns: turns, - duration: const Duration(milliseconds: 200), - onEnd: () { - if (widget.spinning?.value == true && mounted) { - setState(() => turns += 1.0); - } - }, - child: InkWell( - onTap: () { - if (mounted) setState(() => turns += 1.0); - widget.onPressed(); - }, - onHover: widget.onHover, - child: widget.child)); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/audio_input.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/audio_input.dart deleted file mode 100644 index 1f8f1a8..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/audio_input.dart +++ /dev/null @@ -1,81 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; - -const _kSystemSound = 'System Sound'; - -typedef AudioINputSetDevice = void Function(String device); -typedef AudioInputBuilder = Widget Function( - List devices, String currentDevice, AudioINputSetDevice setDevice); - -class AudioInput extends StatelessWidget { - final AudioInputBuilder builder; - final bool isCm; - final bool isVoiceCall; - - const AudioInput( - {Key? key, - required this.builder, - required this.isCm, - required this.isVoiceCall}) - : super(key: key); - - static String getDefault() { - if (bind.mainAudioSupportLoopback()) return translate(_kSystemSound); - return ''; - } - - static Future getAudioInput(bool isCm, bool isVoiceCall) { - if (isVoiceCall) { - return bind.getVoiceCallInputDevice(isCm: isCm); - } else { - return bind.mainGetOption(key: 'audio-input'); - } - } - - static Future getValue(bool isCm, bool isVoiceCall) async { - String device = await getAudioInput(isCm, isVoiceCall); - if (device.isNotEmpty) { - return device; - } else { - return getDefault(); - } - } - - static Future setDevice( - String device, bool isCm, bool isVoiceCall) async { - if (device == getDefault()) device = ''; - if (isVoiceCall) { - await bind.setVoiceCallInputDevice(isCm: isCm, device: device); - } else { - await bind.mainSetOption(key: 'audio-input', value: device); - } - } - - static Future> getDevicesInfo( - bool isCm, bool isVoiceCall) async { - List devices = (await bind.mainGetSoundInputs()).toList(); - if (bind.mainAudioSupportLoopback()) { - devices.insert(0, translate(_kSystemSound)); - } - String current = await getValue(isCm, isVoiceCall); - return {'devices': devices, 'current': current}; - } - - @override - Widget build(BuildContext context) { - return futureBuilder( - future: getDevicesInfo(isCm, isVoiceCall), - hasData: (data) { - String currentDevice = data['current']; - List devices = data['devices'] as List; - if (devices.isEmpty) { - return const Offstage(); - } - return builder(devices, currentDevice, (devices) { - setDevice(devices, isCm, isVoiceCall); - }); - }, - ); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/autocomplete.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/autocomplete.dart deleted file mode 100644 index ec64cca..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/autocomplete.dart +++ /dev/null @@ -1,257 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common/formatter/id_formatter.dart'; -import '../../../models/platform_model.dart'; -import 'package:flutter_hbb/models/peer_model.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/common/widgets/peer_card.dart'; - -class AllPeersLoader { - List peers = []; - - bool _isPeersLoading = false; - bool _isPeersLoaded = false; - - final String _listenerKey = 'AllPeersLoader'; - - late void Function(VoidCallback) setState; - - bool get needLoad => !_isPeersLoaded && !_isPeersLoading; - bool get isPeersLoaded => _isPeersLoaded; - - AllPeersLoader(); - - void init(void Function(VoidCallback) setState) { - this.setState = setState; - gFFI.recentPeersModel.addListener(_mergeAllPeers); - gFFI.lanPeersModel.addListener(_mergeAllPeers); - gFFI.abModel.addPeerUpdateListener(_listenerKey, _mergeAllPeers); - gFFI.groupModel.addPeerUpdateListener(_listenerKey, _mergeAllPeers); - } - - void clear() { - gFFI.recentPeersModel.removeListener(_mergeAllPeers); - gFFI.lanPeersModel.removeListener(_mergeAllPeers); - gFFI.abModel.removePeerUpdateListener(_listenerKey); - gFFI.groupModel.removePeerUpdateListener(_listenerKey); - } - - Future getAllPeers() async { - if (!needLoad) { - return; - } - _isPeersLoading = true; - - if (gFFI.recentPeersModel.peers.isEmpty) { - bind.mainLoadRecentPeers(); - } - if (gFFI.lanPeersModel.peers.isEmpty) { - bind.mainLoadLanPeers(); - } - // No need to care about peers from abModel, and group model. - // Because they will pull data in `refreshCurrentUser()` on startup. - - final startTime = DateTime.now(); - _mergeAllPeers(); - final diffTime = DateTime.now().difference(startTime).inMilliseconds; - if (diffTime < 100) { - await Future.delayed(Duration(milliseconds: diffTime)); - } - } - - void _mergeAllPeers() { - Map combinedPeers = {}; - for (var p in gFFI.abModel.allPeers()) { - if (!combinedPeers.containsKey(p.id)) { - combinedPeers[p.id] = p.toJson(); - } - } - for (var p in gFFI.groupModel.peers.map((e) => Peer.copy(e)).toList()) { - if (!combinedPeers.containsKey(p.id)) { - combinedPeers[p.id] = p.toJson(); - } - } - - List parsedPeers = []; - for (var peer in combinedPeers.values) { - parsedPeers.add(Peer.fromJson(peer)); - } - - Set peerIds = combinedPeers.keys.toSet(); - for (final peer in gFFI.lanPeersModel.peers) { - if (!peerIds.contains(peer.id)) { - parsedPeers.add(peer); - peerIds.add(peer.id); - } - } - - for (final peer in gFFI.recentPeersModel.peers) { - if (!peerIds.contains(peer.id)) { - parsedPeers.add(peer); - peerIds.add(peer.id); - } - } - for (final id in gFFI.recentPeersModel.restPeerIds) { - if (!peerIds.contains(id)) { - parsedPeers.add(Peer.fromJson({'id': id})); - peerIds.add(id); - } - } - - peers = parsedPeers; - setState(() { - _isPeersLoading = false; - _isPeersLoaded = true; - }); - } -} - -class AutocompletePeerTile extends StatefulWidget { - final VoidCallback onSelect; - final Peer peer; - - const AutocompletePeerTile({ - Key? key, - required this.onSelect, - required this.peer, - }) : super(key: key); - - @override - AutocompletePeerTileState createState() => AutocompletePeerTileState(); -} - -class AutocompletePeerTileState extends State { - List _frontN(List list, int n) { - if (list.length <= n) { - return list; - } else { - return list.sublist(0, n); - } - } - - @override - Widget build(BuildContext context) { - final double tileRadius = 5; - final name = - '${widget.peer.username}${widget.peer.username.isNotEmpty && widget.peer.hostname.isNotEmpty ? '@' : ''}${widget.peer.hostname}'; - final greyStyle = TextStyle( - fontSize: 11, - color: Theme.of(context).textTheme.titleLarge?.color?.withOpacity(0.6)); - final child = GestureDetector( - onTap: () => widget.onSelect(), - child: Padding( - padding: EdgeInsets.only(left: 5, right: 5), - child: Container( - height: 42, - margin: EdgeInsets.only(bottom: 5), - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - Container( - decoration: BoxDecoration( - color: str2color( - '${widget.peer.id}${widget.peer.platform}', 0x7f), - borderRadius: BorderRadius.only( - topLeft: Radius.circular(tileRadius), - bottomLeft: Radius.circular(tileRadius), - ), - ), - alignment: Alignment.center, - width: 42, - height: null, - child: Padding( - padding: EdgeInsets.all(6), - child: getPlatformImage(widget.peer.platform, - size: 30))), - Expanded( - child: Container( - padding: EdgeInsets.only(left: 10), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: BorderRadius.only( - topRight: Radius.circular(tileRadius), - bottomRight: Radius.circular(tileRadius), - ), - ), - child: Row( - children: [ - Expanded( - child: Container( - margin: EdgeInsets.only(top: 2), - child: Container( - margin: EdgeInsets.only(top: 2), - child: Column( - children: [ - Container( - margin: - EdgeInsets.only(top: 2), - child: Row(children: [ - getOnline( - 8, widget.peer.online), - Expanded( - child: Text( - widget.peer.alias.isEmpty - ? formatID( - widget.peer.id) - : widget.peer.alias, - overflow: - TextOverflow.ellipsis, - style: Theme.of(context) - .textTheme - .titleSmall, - )), - widget.peer.alias.isNotEmpty - ? Padding( - padding: - const EdgeInsets - .only( - left: 5, - right: 5), - child: Text( - "(${widget.peer.id})", - style: greyStyle, - overflow: - TextOverflow - .ellipsis, - )) - : Container(), - ])), - Align( - alignment: Alignment.centerLeft, - child: Text( - name, - style: greyStyle, - textAlign: TextAlign.start, - overflow: - TextOverflow.ellipsis, - ), - ), - ], - )))), - ], - )), - ) - ], - )))); - final colors = _frontN(widget.peer.tags, 25) - .map((e) => gFFI.abModel.getCurrentAbTagColor(e)) - .toList(); - return Tooltip( - message: !(isDesktop || isWebDesktop) - ? '' - : widget.peer.tags.isNotEmpty - ? '${translate('Tags')}: ${widget.peer.tags.join(', ')}' - : '', - child: Stack(children: [ - child, - if (colors.isNotEmpty) - Positioned( - top: 5, - right: 10, - child: CustomPaint( - painter: TagPainter(radius: 3, colors: colors), - ), - ) - ]), - ); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/chat_page.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/chat_page.dart deleted file mode 100644 index 4b0954d..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/chat_page.dart +++ /dev/null @@ -1,180 +0,0 @@ -import 'package:dash_chat_2/dash_chat_2.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/models/chat_model.dart'; -import 'package:get/get.dart'; -import 'package:provider/provider.dart'; - -import '../../mobile/pages/home_page.dart'; - -enum ChatPageType { - mobileMain, - desktopCM, -} - -class ChatPage extends StatelessWidget implements PageShape { - late final ChatModel chatModel; - final ChatPageType? type; - - ChatPage({ChatModel? chatModel, this.type}) { - this.chatModel = chatModel ?? gFFI.chatModel; - } - - @override - final title = translate("Chat"); - - @override - final icon = unreadTopRightBuilder(gFFI.chatModel.mobileUnreadSum); - - @override - final appBarActions = [ - PopupMenuButton( - tooltip: "", - icon: unreadTopRightBuilder(gFFI.chatModel.mobileUnreadSum, - icon: Icon(Icons.group)), - itemBuilder: (context) { - // only mobile need [appBarActions], just bind gFFI.chatModel - final chatModel = gFFI.chatModel; - return chatModel.messages.entries.map((entry) { - final key = entry.key; - final user = entry.value.chatUser; - final client = gFFI.serverModel.clients - .firstWhereOrNull((e) => e.id == key.connId); - final connected = - gFFI.serverModel.clients.any((e) => e.id == key.connId); - return PopupMenuItem( - child: Row( - children: [ - Icon( - key.isOut - ? Icons.call_made_rounded - : Icons.call_received_rounded, - color: MyTheme.accent) - .marginOnly(right: 6), - Text("${user.firstName} ${user.id}"), - if (connected) - Container( - width: 10, - height: 10, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Color.fromARGB(255, 46, 205, 139)), - ).marginSymmetric(horizontal: 2), - if (client != null) - unreadMessageCountBuilder(client.unreadChatMessageCount) - .marginOnly(left: 4) - ], - ), - value: key, - ); - }).toList(); - }, - onSelected: (key) { - gFFI.chatModel.changeCurrentKey(key); - }) - ]; - - @override - Widget build(BuildContext context) { - return ChangeNotifierProvider.value( - value: chatModel, - child: Container( - color: Theme.of(context).scaffoldBackgroundColor, - child: Consumer( - builder: (context, chatModel, child) { - final readOnly = type == ChatPageType.mobileMain && - (chatModel.currentKey.connId == ChatModel.clientModeID || - gFFI.serverModel.clients.every((e) => - e.id != chatModel.currentKey.connId || - chatModel.currentUser == null)) || - type == ChatPageType.desktopCM && - gFFI.serverModel.clients - .firstWhereOrNull( - (e) => e.id == chatModel.currentKey.connId) - ?.disconnected == - true; - return Stack( - children: [ - LayoutBuilder(builder: (context, constraints) { - final chat = DashChat( - onSend: chatModel.send, - currentUser: chatModel.me, - messages: chatModel - .messages[chatModel.currentKey]?.chatMessages ?? - [], - readOnly: readOnly, - inputOptions: InputOptions( - focusNode: chatModel.inputNode, - textController: chatModel.textController, - inputTextStyle: TextStyle( - fontSize: 14, - color: Theme.of(context).textTheme.titleLarge?.color), - inputDecoration: InputDecoration( - isDense: true, - hintText: translate('Write a message'), - filled: true, - fillColor: Theme.of(context).colorScheme.background, - contentPadding: EdgeInsets.all(10), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - borderSide: const BorderSide( - width: 1, - style: BorderStyle.solid, - ), - ), - ), - sendButtonBuilder: defaultSendButton( - padding: - EdgeInsets.symmetric(horizontal: 6, vertical: 0), - color: MyTheme.accent, - icon: Icons.send_rounded, - ), - ), - messageOptions: MessageOptions( - showOtherUsersAvatar: false, - showOtherUsersName: false, - textColor: Colors.white, - maxWidth: constraints.maxWidth * 0.7, - messageTextBuilder: (message, _, __) { - final isOwnMessage = message.user.id.isBlank!; - return Column( - crossAxisAlignment: isOwnMessage - ? CrossAxisAlignment.end - : CrossAxisAlignment.start, - children: [ - Text(message.text, - style: TextStyle(color: Colors.white)), - Text( - "${message.createdAt.hour}:${message.createdAt.minute.toString().padLeft(2, '0')}", - style: TextStyle( - color: Colors.white, - fontSize: 8, - ), - ).marginOnly(top: 3), - ], - ); - }, - messageDecorationBuilder: - (message, previousMessage, nextMessage) { - final isOwnMessage = message.user.id.isBlank!; - return defaultMessageDecoration( - color: - isOwnMessage ? MyTheme.accent : Colors.blueGrey, - borderTopLeft: 8, - borderTopRight: 8, - borderBottomRight: isOwnMessage ? 2 : 8, - borderBottomLeft: isOwnMessage ? 8 : 2, - ); - }, - ), - ).workaroundFreezeLinuxMint(); - return SelectionArea(child: chat); - }), - ], - ).paddingOnly(bottom: 8); - }, - ), - ), - ); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/connection_page_title.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/connection_page_title.dart deleted file mode 100644 index ba03c26..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/connection_page_title.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:auto_size_text/auto_size_text.dart'; -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - -import '../../common.dart'; - -Widget getConnectionPageTitle(BuildContext context, bool isWeb) { - return Row( - children: [ - Expanded( - child: Row( - children: [ - AutoSizeText( - translate('Control Remote Desktop'), - maxLines: 1, - style: Theme.of(context) - .textTheme - .titleLarge - ?.merge(TextStyle(height: 1)), - ).marginOnly(right: 4), - Tooltip( - waitDuration: Duration(milliseconds: 300), - message: translate(isWeb ? "web_id_input_tip" : "id_input_tip"), - child: Icon( - Icons.help_outline_outlined, - size: 16, - color: Theme.of(context) - .textTheme - .titleLarge - ?.color - ?.withOpacity(0.5), - ), - ), - ], - )), - ], - ); -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/custom_password.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/custom_password.dart deleted file mode 100644 index dafc23b..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/custom_password.dart +++ /dev/null @@ -1,129 +0,0 @@ -// https://github.com/rodrigobastosv/fancy_password_field -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:get/get.dart'; -import 'package:password_strength/password_strength.dart'; - -abstract class ValidationRule { - String get name; - bool validate(String value); -} - -class UppercaseValidationRule extends ValidationRule { - @override - String get name => translate('uppercase'); - @override - bool validate(String value) { - return value.runes.any((int rune) { - var character = String.fromCharCode(rune); - return character.toUpperCase() == character && - character.toLowerCase() != character; - }); - } -} - -class LowercaseValidationRule extends ValidationRule { - @override - String get name => translate('lowercase'); - - @override - bool validate(String value) { - return value.runes.any((int rune) { - var character = String.fromCharCode(rune); - return character.toLowerCase() == character && - character.toUpperCase() != character; - }); - } -} - -class DigitValidationRule extends ValidationRule { - @override - String get name => translate('digit'); - - @override - bool validate(String value) { - return value.contains(RegExp(r'[0-9]')); - } -} - -class SpecialCharacterValidationRule extends ValidationRule { - @override - String get name => translate('special character'); - - @override - bool validate(String value) { - return value.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]')); - } -} - -class MinCharactersValidationRule extends ValidationRule { - final int _numberOfCharacters; - MinCharactersValidationRule(this._numberOfCharacters); - - @override - String get name => translate('length>=$_numberOfCharacters'); - - @override - bool validate(String value) { - return value.length >= _numberOfCharacters; - } -} - -class PasswordStrengthIndicator extends StatelessWidget { - final RxString password; - final double weakMedium = 0.33; - final double mediumStrong = 0.67; - const PasswordStrengthIndicator({Key? key, required this.password}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return Obx(() { - var strength = estimatePasswordStrength(password.value); - return Row( - children: [ - Expanded( - child: _indicator( - password.isEmpty ? Colors.grey : _getColor(strength))), - Expanded( - child: _indicator(password.isEmpty || strength < weakMedium - ? Colors.grey - : _getColor(strength))), - Expanded( - child: _indicator(password.isEmpty || strength < mediumStrong - ? Colors.grey - : _getColor(strength))), - Text(password.isEmpty ? '' : translate(_getLabel(strength))) - .marginOnly(left: password.isEmpty ? 0 : 8), - ], - ); - }); - } - - Widget _indicator(Color color) { - return Container( - height: 8, - color: color, - ); - } - - String _getLabel(double strength) { - if (strength < weakMedium) { - return 'Weak'; - } else if (strength < mediumStrong) { - return 'Medium'; - } else { - return 'Strong'; - } - } - - Color _getColor(double strength) { - if (strength < weakMedium) { - return Colors.yellow; - } else if (strength < mediumStrong) { - return Colors.blue; - } else { - return Colors.green; - } - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/custom_scale_base.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/custom_scale_base.dart deleted file mode 100644 index 6eceef1..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/custom_scale_base.dart +++ /dev/null @@ -1,156 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:debounce_throttle/debounce_throttle.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/models/model.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:flutter_hbb/utils/scale.dart'; -import 'package:flutter_hbb/common.dart'; - -/// Base class providing shared custom scale control logic for both mobile and desktop widgets. -/// Implementations must provide [ffi] and [onScaleChanged] getters. -abstract class CustomScaleControls extends State { - /// FFI instance for session interaction - FFI get ffi; - - /// Callback invoked when scale value changes - ValueChanged? get onScaleChanged; - - late int _scaleValue; - late final Debouncer _debouncerScale; - // Normalized slider position in [0, 1]. We map it nonlinearly to percent. - double _scalePos = 0.0; - - int get scaleValue => _scaleValue; - double get scalePos => _scalePos; - - int mapPosToPercent(double p) => _mapPosToPercent(p); - - static const int minPercent = kScaleCustomMinPercent; - static const int pivotPercent = kScaleCustomPivotPercent; // 100% should be at 1/3 of track - static const int maxPercent = kScaleCustomMaxPercent; - static const double pivotPos = kScaleCustomPivotPos; // first 1/3 → up to 100% - static const double detentEpsilon = kScaleCustomDetentEpsilon; // snap range around pivot (~0.6%) - - // Clamp helper for local use - int _clampScale(int v) => clampCustomScalePercent(v); - - // Map normalized position [0,1] → percent [5,1000] with 100 at 1/3 width. - int _mapPosToPercent(double p) { - if (p <= 0.0) return minPercent; - if (p >= 1.0) return maxPercent; - if (p <= pivotPos) { - final q = p / pivotPos; // 0..1 - final v = minPercent + q * (pivotPercent - minPercent); - return _clampScale(v.round()); - } else { - final q = (p - pivotPos) / (1.0 - pivotPos); // 0..1 - final v = pivotPercent + q * (maxPercent - pivotPercent); - return _clampScale(v.round()); - } - } - - // Map percent [5,1000] → normalized position [0,1] - double _mapPercentToPos(int percent) { - final p = _clampScale(percent); - if (p <= pivotPercent) { - final q = (p - minPercent) / (pivotPercent - minPercent); - return q * pivotPos; - } else { - final q = (p - pivotPercent) / (maxPercent - pivotPercent); - return pivotPos + q * (1.0 - pivotPos); - } - } - - // Snap normalized position to the pivot when close to it - double _snapNormalizedPos(double p) { - if ((p - pivotPos).abs() <= detentEpsilon) return pivotPos; - if (p < 0.0) return 0.0; - if (p > 1.0) return 1.0; - return p; - } - - @override - void initState() { - super.initState(); - _scaleValue = 100; - _debouncerScale = Debouncer( - kDebounceCustomScaleDuration, - onChanged: (v) async { - await _applyScale(v); - }, - initialValue: _scaleValue, - ); - WidgetsBinding.instance.addPostFrameCallback((_) async { - try { - final v = await getSessionCustomScalePercent(ffi.sessionId); - if (mounted) { - setState(() { - _scaleValue = v; - _scalePos = _mapPercentToPos(v); - }); - } - } catch (e, st) { - debugPrint('[CustomScale] Failed to get initial value: $e'); - debugPrintStack(stackTrace: st); - } - }); - } - - Future _applyScale(int v) async { - v = clampCustomScalePercent(v); - setState(() { - _scaleValue = v; - }); - try { - await bind.sessionSetFlutterOption( - sessionId: ffi.sessionId, - k: kCustomScalePercentKey, - v: v.toString()); - final curStyle = await bind.sessionGetViewStyle(sessionId: ffi.sessionId); - if (curStyle != kRemoteViewStyleCustom) { - await bind.sessionSetViewStyle( - sessionId: ffi.sessionId, value: kRemoteViewStyleCustom); - } - await ffi.canvasModel.updateViewStyle(); - if (isMobile) { - HapticFeedback.selectionClick(); - } - onScaleChanged?.call(v); - } catch (e, st) { - debugPrint('[CustomScale] Apply failed: $e'); - debugPrintStack(stackTrace: st); - } - } - - void nudgeScale(int delta) { - final next = _clampScale(_scaleValue + delta); - setState(() { - _scaleValue = next; - _scalePos = _mapPercentToPos(next); - }); - onScaleChanged?.call(next); - _debouncerScale.value = next; - } - - @override - void dispose() { - _debouncerScale.cancel(); - super.dispose(); - } - - void onSliderChanged(double v) { - final snapped = _snapNormalizedPos(v); - final next = _mapPosToPercent(snapped); - if (next != _scaleValue || snapped != _scalePos) { - setState(() { - _scalePos = snapped; - _scaleValue = next; - }); - onScaleChanged?.call(next); - _debouncerScale.value = next; - } - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/dialog.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/dialog.dart deleted file mode 100644 index 7534fb2..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/dialog.dart +++ /dev/null @@ -1,2867 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:bot_toast/bot_toast.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hbb/common/shared_state.dart'; -import 'package:flutter_hbb/common/widgets/setting_widgets.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/models/peer_model.dart'; -import 'package:flutter_hbb/models/peer_tab_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:get/get.dart'; -import 'package:qr_flutter/qr_flutter.dart'; -import 'package:flutter_hbb/utils/http_service.dart' as http; - -import '../../common.dart'; -import '../../models/model.dart'; -import '../../models/platform_model.dart'; -import 'address_book.dart'; - -void clientClose(SessionID sessionId, FFI ffi) async { - if (allowAskForNoteAtEndOfConnection(ffi, true)) { - if (await showConnEndAuditDialogCloseCanceled(ffi: ffi)) { - return; - } - closeConnection(); - } else { - msgBox(sessionId, 'info', 'Close', 'Are you sure to close the connection?', - '', ffi.dialogManager); - } -} - -abstract class ValidationRule { - String get name; - bool validate(String value); -} - -class LengthRangeValidationRule extends ValidationRule { - final int _min; - final int _max; - - LengthRangeValidationRule(this._min, this._max); - - @override - String get name => translate('length %min% to %max%') - .replaceAll('%min%', _min.toString()) - .replaceAll('%max%', _max.toString()); - - @override - bool validate(String value) { - return value.length >= _min && value.length <= _max; - } -} - -class RegexValidationRule extends ValidationRule { - final String _name; - final RegExp _regex; - - RegexValidationRule(this._name, this._regex); - - @override - String get name => translate(_name); - - @override - bool validate(String value) { - return value.isNotEmpty ? value.contains(_regex) : false; - } -} - -void changeIdDialog() { - var newId = ""; - var msg = ""; - var isInProgress = false; - TextEditingController controller = TextEditingController(); - final RxString rxId = controller.text.trim().obs; - - final rules = [ - RegexValidationRule('starts with a letter', RegExp(r'^[a-zA-Z]')), - LengthRangeValidationRule(6, 16), - RegexValidationRule('allowed characters', RegExp(r'^[\w-]*$')) - ]; - - gFFI.dialogManager.show((setState, close, context) { - submit() async { - debugPrint("onSubmit"); - newId = controller.text.trim(); - - final Iterable violations = rules.where((r) => !r.validate(newId)); - if (violations.isNotEmpty) { - setState(() { - msg = (isDesktop || isWebDesktop) - ? '${translate('Prompt')}: ${violations.map((r) => r.name).join(', ')}' - : violations.map((r) => r.name).join(', '); - }); - return; - } - - setState(() { - msg = ""; - isInProgress = true; - bind.mainChangeId(newId: newId); - }); - - var status = await bind.mainGetAsyncStatus(); - while (status == " ") { - await Future.delayed(const Duration(milliseconds: 100)); - status = await bind.mainGetAsyncStatus(); - } - if (status.isEmpty) { - // ok - close(); - return; - } - setState(() { - isInProgress = false; - msg = (isDesktop || isWebDesktop) - ? '${translate('Prompt')}: ${translate(status)}' - : translate(status); - }); - } - - return CustomAlertDialog( - title: Text(translate("Change ID")), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(translate("id_change_tip")), - const SizedBox( - height: 12.0, - ), - TextField( - decoration: InputDecoration( - labelText: translate('Your new ID'), - errorText: msg.isEmpty ? null : translate(msg), - suffixText: '${rxId.value.length}/16', - suffixStyle: const TextStyle(fontSize: 12, color: Colors.grey)), - inputFormatters: [ - LengthLimitingTextInputFormatter(16), - // FilteringTextInputFormatter(RegExp(r"[a-zA-z][a-zA-z0-9\_]*"), allow: true) - ], - controller: controller, - autofocus: true, - onChanged: (value) { - setState(() { - rxId.value = value.trim(); - msg = ''; - }); - }, - ).workaroundFreezeLinuxMint(), - const SizedBox( - height: 8.0, - ), - (isDesktop || isWebDesktop) - ? Obx(() => Wrap( - runSpacing: 8, - spacing: 4, - children: rules.map((e) { - var checked = e.validate(rxId.value); - return Chip( - label: Text( - e.name, - style: TextStyle( - color: checked - ? const Color(0xFF0A9471) - : Color.fromARGB(255, 198, 86, 157)), - ), - backgroundColor: checked - ? const Color(0xFFD0F7ED) - : Color.fromARGB(255, 247, 205, 232)); - }).toList(), - )).marginOnly(bottom: 8) - : SizedBox.shrink(), - // NOT use Offstage to wrap LinearProgressIndicator - if (isInProgress) const LinearProgressIndicator(), - ], - ), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - dialogButton("OK", onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -void changeWhiteList({Function()? callback}) async { - final curWhiteList = await bind.mainGetOption(key: kOptionWhitelist); - var newWhiteListField = curWhiteList == defaultOptionWhitelist - ? '' - : curWhiteList.split(',').join('\n'); - var controller = TextEditingController(text: newWhiteListField); - var msg = ""; - var isInProgress = false; - final isOptFixed = isOptionFixed(kOptionWhitelist); - gFFI.dialogManager.show((setState, close, context) { - return CustomAlertDialog( - title: Text(translate("IP Whitelisting")), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(translate("whitelist_sep")), - const SizedBox( - height: 8.0, - ), - Row( - children: [ - Expanded( - child: TextField( - maxLines: null, - decoration: InputDecoration( - errorText: msg.isEmpty ? null : translate(msg), - ), - controller: controller, - enabled: !isOptFixed, - autofocus: true) - .workaroundFreezeLinuxMint(), - ), - ], - ), - const SizedBox( - height: 4.0, - ), - // NOT use Offstage to wrap LinearProgressIndicator - if (isInProgress) const LinearProgressIndicator(), - ], - ), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - if (!isOptFixed) - dialogButton("Clear", onPressed: () async { - await bind.mainSetOption( - key: kOptionWhitelist, value: defaultOptionWhitelist); - callback?.call(); - close(); - }, isOutline: true), - if (!isOptFixed) - dialogButton( - "OK", - onPressed: () async { - setState(() { - msg = ""; - isInProgress = true; - }); - newWhiteListField = controller.text.trim(); - var newWhiteList = ""; - if (newWhiteListField.isEmpty) { - // pass - } else { - final ips = - newWhiteListField.trim().split(RegExp(r"[\s,;\n]+")); - // test ip - final ipMatch = RegExp( - r"^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)(\/([1-9]|[1-2][0-9]|3[0-2])){0,1}$"); - final ipv6Match = RegExp( - r"^(((?:[0-9A-Fa-f]{1,4}))*((?::[0-9A-Fa-f]{1,4}))*::((?:[0-9A-Fa-f]{1,4}))*((?::[0-9A-Fa-f]{1,4}))*|((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4})){7})(\/([1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8])){0,1}$"); - for (final ip in ips) { - if (!ipMatch.hasMatch(ip) && !ipv6Match.hasMatch(ip)) { - msg = "${translate("Invalid IP")} $ip"; - setState(() { - isInProgress = false; - }); - return; - } - } - newWhiteList = ips.join(','); - } - if (newWhiteList.trim().isEmpty) { - newWhiteList = defaultOptionWhitelist; - } - await bind.mainSetOption( - key: kOptionWhitelist, value: newWhiteList); - callback?.call(); - close(); - }, - ), - ], - onCancel: close, - ); - }); -} - -Future changeDirectAccessPort( - String currentIP, String currentPort) async { - final controller = TextEditingController(text: currentPort); - await gFFI.dialogManager.show((setState, close, context) { - return CustomAlertDialog( - title: Text(translate("Change Local Port")), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 8.0), - Row( - children: [ - Expanded( - child: TextField( - maxLines: null, - keyboardType: TextInputType.number, - decoration: InputDecoration( - hintText: '21118', - isCollapsed: true, - prefix: Text('$currentIP : '), - suffix: IconButton( - padding: EdgeInsets.zero, - icon: const Icon(Icons.clear, size: 16), - onPressed: () => controller.clear())), - inputFormatters: [ - FilteringTextInputFormatter.allow(RegExp( - r'^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$')), - ], - controller: controller, - autofocus: true) - .workaroundFreezeLinuxMint(), - ), - ], - ), - ], - ), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - dialogButton("OK", onPressed: () async { - await bind.mainSetOption( - key: kOptionDirectAccessPort, value: controller.text); - close(); - }), - ], - onCancel: close, - ); - }); - return controller.text; -} - -Future changeAutoDisconnectTimeout(String old) async { - final controller = TextEditingController(text: old); - await gFFI.dialogManager.show((setState, close, context) { - return CustomAlertDialog( - title: Text(translate("Timeout in minutes")), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 8.0), - Row( - children: [ - Expanded( - child: TextField( - maxLines: null, - keyboardType: TextInputType.number, - decoration: InputDecoration( - hintText: '10', - isCollapsed: true, - suffix: IconButton( - padding: EdgeInsets.zero, - icon: const Icon(Icons.clear, size: 16), - onPressed: () => controller.clear())), - inputFormatters: [ - FilteringTextInputFormatter.allow(RegExp( - r'^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$')), - ], - controller: controller, - autofocus: true) - .workaroundFreezeLinuxMint(), - ), - ], - ), - ], - ), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - dialogButton("OK", onPressed: () async { - await bind.mainSetOption( - key: kOptionAutoDisconnectTimeout, value: controller.text); - close(); - }), - ], - onCancel: close, - ); - }); - return controller.text; -} - -class DialogTextField extends StatelessWidget { - final String title; - final String? hintText; - final bool obscureText; - final String? errorText; - final String? helperText; - final Widget? prefixIcon; - final Widget? suffixIcon; - final TextEditingController controller; - final FocusNode? focusNode; - final TextInputType? keyboardType; - final List? inputFormatters; - final int? maxLength; - - static const kUsernameTitle = 'Username'; - static const kUsernameIcon = Icon(Icons.account_circle_outlined); - static const kPasswordTitle = 'Password'; - static const kPasswordIcon = Icon(Icons.lock_outline); - - DialogTextField( - {Key? key, - this.focusNode, - this.obscureText = false, - this.errorText, - this.helperText, - this.prefixIcon, - this.suffixIcon, - this.hintText, - this.keyboardType, - this.inputFormatters, - this.maxLength, - required this.title, - required this.controller}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Column( - children: [ - TextField( - decoration: InputDecoration( - labelText: title, - hintText: hintText, - prefixIcon: prefixIcon, - suffixIcon: suffixIcon, - helperText: helperText, - helperMaxLines: 8, - ), - controller: controller, - focusNode: focusNode, - autofocus: true, - obscureText: obscureText, - keyboardType: keyboardType, - inputFormatters: inputFormatters, - maxLength: maxLength, - ), - if (errorText != null) - Align( - alignment: Alignment.centerLeft, - child: SelectableText( - errorText!, - style: TextStyle( - color: Theme.of(context).colorScheme.error, - fontSize: 12, - ), - textAlign: TextAlign.left, - ).paddingOnly(top: 8, left: 12), - ), - ], - ).workaroundFreezeLinuxMint(), - ), - ], - ).paddingSymmetric(vertical: 4.0); - } -} - -abstract class ValidationField extends StatelessWidget { - ValidationField({Key? key}) : super(key: key); - - String? validate(); - bool get isReady; -} - -class Dialog2FaField extends ValidationField { - Dialog2FaField({ - Key? key, - required this.controller, - this.autoFocus = true, - this.reRequestFocus = false, - this.title, - this.hintText, - this.errorText, - this.readyCallback, - this.onChanged, - }) : super(key: key); - - final TextEditingController controller; - final bool autoFocus; - final bool reRequestFocus; - final String? title; - final String? hintText; - final String? errorText; - final VoidCallback? readyCallback; - final VoidCallback? onChanged; - final errMsg = translate('2FA code must be 6 digits.'); - - @override - Widget build(BuildContext context) { - return DialogVerificationCodeField( - title: title ?? translate('2FA code'), - controller: controller, - errorText: errorText, - autoFocus: autoFocus, - reRequestFocus: reRequestFocus, - hintText: hintText, - readyCallback: readyCallback, - onChanged: _onChanged, - keyboardType: TextInputType.number, - inputFormatters: [ - FilteringTextInputFormatter.allow(RegExp(r'[0-9]')), - ], - ); - } - - String get text => controller.text; - bool get isAllDigits => text.codeUnits.every((e) => e >= 48 && e <= 57); - - @override - bool get isReady => text.length == 6 && isAllDigits; - - @override - String? validate() => isReady ? null : errMsg; - - _onChanged(StateSetter setState, SimpleWrapper errText) { - onChanged?.call(); - - if (text.length > 6) { - setState(() => errText.value = errMsg); - return; - } - - if (!isAllDigits) { - setState(() => errText.value = errMsg); - return; - } - - if (isReady) { - readyCallback?.call(); - return; - } - - if (errText.value != null) { - setState(() => errText.value = null); - } - } -} - -class DialogEmailCodeField extends ValidationField { - DialogEmailCodeField({ - Key? key, - required this.controller, - this.autoFocus = true, - this.reRequestFocus = false, - this.hintText, - this.errorText, - this.readyCallback, - this.onChanged, - }) : super(key: key); - - final TextEditingController controller; - final bool autoFocus; - final bool reRequestFocus; - final String? hintText; - final String? errorText; - final VoidCallback? readyCallback; - final VoidCallback? onChanged; - final errMsg = translate('Email verification code must be 6 characters.'); - - @override - Widget build(BuildContext context) { - return DialogVerificationCodeField( - title: translate('Verification code'), - controller: controller, - errorText: errorText, - autoFocus: autoFocus, - reRequestFocus: reRequestFocus, - hintText: hintText, - readyCallback: readyCallback, - helperText: translate('verification_tip'), - onChanged: _onChanged, - keyboardType: TextInputType.visiblePassword, - ); - } - - String get text => controller.text; - - @override - bool get isReady => text.length == 6; - - @override - String? validate() => isReady ? null : errMsg; - - _onChanged(StateSetter setState, SimpleWrapper errText) { - onChanged?.call(); - - if (text.length > 6) { - setState(() => errText.value = errMsg); - return; - } - - if (isReady) { - readyCallback?.call(); - return; - } - - if (errText.value != null) { - setState(() => errText.value = null); - } - } -} - -class DialogVerificationCodeField extends StatefulWidget { - DialogVerificationCodeField({ - Key? key, - required this.controller, - required this.title, - this.autoFocus = true, - this.reRequestFocus = false, - this.helperText, - this.hintText, - this.errorText, - this.textLength, - this.readyCallback, - this.onChanged, - this.keyboardType, - this.inputFormatters, - }) : super(key: key); - - final TextEditingController controller; - final bool autoFocus; - final bool reRequestFocus; - final String title; - final String? helperText; - final String? hintText; - final String? errorText; - final int? textLength; - final VoidCallback? readyCallback; - final Function(StateSetter setState, SimpleWrapper errText)? - onChanged; - final TextInputType? keyboardType; - final List? inputFormatters; - - @override - State createState() => - _DialogVerificationCodeField(); -} - -class _DialogVerificationCodeField extends State { - final _focusNode = FocusNode(); - Timer? _timer; - Timer? _timerReRequestFocus; - SimpleWrapper errorText = SimpleWrapper(null); - String _preText = ''; - - @override - void initState() { - super.initState(); - if (widget.autoFocus) { - _timer = - Timer(Duration(milliseconds: 50), () => _focusNode.requestFocus()); - - if (widget.onChanged != null) { - widget.controller.addListener(() { - final text = widget.controller.text.trim(); - if (text == _preText) return; - widget.onChanged!(setState, errorText); - _preText = text; - }); - } - } - - // software secure keyboard will take the focus since flutter 3.13 - // request focus again when android account password obtain focus - if (isAndroid && widget.reRequestFocus) { - _focusNode.addListener(() { - if (_focusNode.hasFocus) { - _timerReRequestFocus?.cancel(); - _timerReRequestFocus = Timer( - Duration(milliseconds: 100), () => _focusNode.requestFocus()); - } - }); - } - } - - @override - void dispose() { - _timer?.cancel(); - _timerReRequestFocus?.cancel(); - _focusNode.unfocus(); - _focusNode.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return DialogTextField( - title: widget.title, - controller: widget.controller, - errorText: widget.errorText ?? errorText.value, - focusNode: _focusNode, - helperText: widget.helperText, - keyboardType: widget.keyboardType, - inputFormatters: widget.inputFormatters, - ); - } -} - -class PasswordWidget extends StatefulWidget { - PasswordWidget({ - Key? key, - required this.controller, - this.autoFocus = true, - this.reRequestFocus = false, - this.hintText, - this.errorText, - this.title, - this.maxLength, - }) : super(key: key); - - final TextEditingController controller; - final bool autoFocus; - final bool reRequestFocus; - final String? hintText; - final String? errorText; - final String? title; - final int? maxLength; - - @override - State createState() => _PasswordWidgetState(); -} - -class _PasswordWidgetState extends State { - bool _passwordVisible = false; - final _focusNode = FocusNode(); - Timer? _timer; - Timer? _timerReRequestFocus; - - @override - void initState() { - super.initState(); - if (widget.autoFocus) { - _timer = - Timer(Duration(milliseconds: 50), () => _focusNode.requestFocus()); - } - // software secure keyboard will take the focus since flutter 3.13 - // request focus again when android account password obtain focus - if (isAndroid && widget.reRequestFocus) { - _focusNode.addListener(() { - if (_focusNode.hasFocus) { - _timerReRequestFocus?.cancel(); - _timerReRequestFocus = Timer( - Duration(milliseconds: 100), () => _focusNode.requestFocus()); - } - }); - } - } - - @override - void dispose() { - _timer?.cancel(); - _timerReRequestFocus?.cancel(); - _focusNode.unfocus(); - _focusNode.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return DialogTextField( - title: translate(widget.title ?? DialogTextField.kPasswordTitle), - hintText: translate(widget.hintText ?? 'Enter your password'), - controller: widget.controller, - prefixIcon: DialogTextField.kPasswordIcon, - suffixIcon: IconButton( - icon: Icon( - // Based on passwordVisible state choose the icon - _passwordVisible ? Icons.visibility : Icons.visibility_off, - color: MyTheme.lightTheme.primaryColor), - onPressed: () { - // Update the state i.e. toggle the state of passwordVisible variable - setState(() { - _passwordVisible = !_passwordVisible; - }); - }, - ), - obscureText: !_passwordVisible, - errorText: widget.errorText, - focusNode: _focusNode, - maxLength: widget.maxLength, - ); - } -} - -void wrongPasswordDialog(SessionID sessionId, - OverlayDialogManager dialogManager, type, title, text) { - dialogManager.dismissAll(); - dialogManager.show((setState, close, context) { - cancel() { - close(); - closeConnection(); - } - - submit() { - enterPasswordDialog(sessionId, dialogManager); - } - - return CustomAlertDialog( - title: null, - content: msgboxContent(type, title, text), - onSubmit: submit, - onCancel: cancel, - actions: [ - dialogButton( - 'Cancel', - onPressed: cancel, - isOutline: true, - ), - dialogButton( - 'Retry', - onPressed: submit, - ), - ]); - }); -} - -void enterPasswordDialog( - SessionID sessionId, OverlayDialogManager dialogManager) async { - await _connectDialog( - sessionId, - dialogManager, - passwordController: TextEditingController(), - ); -} - -void enterUserLoginDialog( - SessionID sessionId, - OverlayDialogManager dialogManager, - String osAccountDescTip, - bool canRememberAccount) async { - await _connectDialog( - sessionId, - dialogManager, - osUsernameController: TextEditingController(), - osPasswordController: TextEditingController(), - osAccountDescTip: osAccountDescTip, - canRememberAccount: canRememberAccount, - ); -} - -void enterUserLoginAndPasswordDialog( - SessionID sessionId, - OverlayDialogManager dialogManager, - String osAccountDescTip, - bool canRememberAccount) async { - await _connectDialog( - sessionId, - dialogManager, - osUsernameController: TextEditingController(), - osPasswordController: TextEditingController(), - passwordController: TextEditingController(), - osAccountDescTip: osAccountDescTip, - canRememberAccount: canRememberAccount, - ); -} - -_connectDialog( - SessionID sessionId, - OverlayDialogManager dialogManager, { - TextEditingController? osUsernameController, - TextEditingController? osPasswordController, - TextEditingController? passwordController, - String? osAccountDescTip, - bool canRememberAccount = true, -}) async { - final errUsername = ''.obs; - var rememberPassword = false; - if (passwordController != null) { - rememberPassword = - await bind.sessionGetRemember(sessionId: sessionId) ?? false; - } - var rememberAccount = false; - if (canRememberAccount && osUsernameController != null) { - rememberAccount = - await bind.sessionGetRemember(sessionId: sessionId) ?? false; - } - if (osUsernameController != null) { - osUsernameController.addListener(() { - if (errUsername.value.isNotEmpty) { - errUsername.value = ''; - } - }); - } - - dialogManager.dismissAll(); - dialogManager.show((setState, close, context) { - cancel() { - close(); - closeConnection(); - } - - submit() { - if (osUsernameController != null) { - if (osUsernameController.text.trim().isEmpty) { - errUsername.value = translate('Empty Username'); - setState(() {}); - return; - } - } - final osUsername = osUsernameController?.text.trim() ?? ''; - final osPassword = osPasswordController?.text.trim() ?? ''; - final password = passwordController?.text.trim() ?? ''; - if (passwordController != null && password.isEmpty) return; - if (rememberAccount) { - bind.sessionPeerOption( - sessionId: sessionId, name: 'os-username', value: osUsername); - bind.sessionPeerOption( - sessionId: sessionId, name: 'os-password', value: osPassword); - } - gFFI.login( - osUsername, - osPassword, - sessionId, - password, - rememberPassword, - ); - close(); - dialogManager.showLoading(translate('Logging in...'), - onCancel: closeConnection); - } - - descWidget(String text) { - return Column( - children: [ - Align( - alignment: Alignment.centerLeft, - child: Text( - text, - maxLines: 3, - softWrap: true, - overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 16), - ), - ), - Container( - height: 8, - ), - ], - ); - } - - rememberWidget( - String desc, - bool remember, - ValueChanged? onChanged, - ) { - return CheckboxListTile( - contentPadding: const EdgeInsets.all(0), - dense: true, - controlAffinity: ListTileControlAffinity.leading, - title: Text(desc), - value: remember, - onChanged: onChanged, - ); - } - - osAccountWidget() { - if (osUsernameController == null || osPasswordController == null) { - return Offstage(); - } - return Column( - children: [ - if (osAccountDescTip != null) descWidget(translate(osAccountDescTip)), - DialogTextField( - title: translate(DialogTextField.kUsernameTitle), - controller: osUsernameController, - prefixIcon: DialogTextField.kUsernameIcon, - errorText: null, - ), - if (errUsername.value.isNotEmpty) - Align( - alignment: Alignment.centerLeft, - child: SelectableText( - errUsername.value, - style: TextStyle( - color: Theme.of(context).colorScheme.error, - fontSize: 12, - ), - textAlign: TextAlign.left, - ).paddingOnly(left: 12, bottom: 2), - ), - PasswordWidget( - controller: osPasswordController, - autoFocus: false, - ), - if (canRememberAccount) - rememberWidget( - translate('remember_account_tip'), - rememberAccount, - (v) { - if (v != null) { - setState(() => rememberAccount = v); - } - }, - ), - ], - ); - } - - passwdWidget() { - if (passwordController == null) { - return Offstage(); - } - return Column( - children: [ - descWidget(translate('verify_rustdesk_password_tip')), - PasswordWidget( - controller: passwordController, - autoFocus: osUsernameController == null, - ), - rememberWidget( - translate('Remember password'), - rememberPassword, - (v) { - if (v != null) { - setState(() => rememberPassword = v); - } - }, - ), - ], - ); - } - - return CustomAlertDialog( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.password_rounded, color: MyTheme.accent), - Text(translate('Password Required')).paddingOnly(left: 10), - ], - ), - content: Column(mainAxisSize: MainAxisSize.min, children: [ - osAccountWidget(), - osUsernameController == null || passwordController == null - ? Offstage() - : Container(height: 12), - passwdWidget(), - ]), - actions: [ - dialogButton( - 'Cancel', - icon: Icon(Icons.close_rounded), - onPressed: cancel, - isOutline: true, - ), - dialogButton( - 'OK', - icon: Icon(Icons.done_rounded), - onPressed: submit, - ), - ], - onSubmit: submit, - onCancel: cancel, - ); - }); -} - -void showWaitUacDialog( - SessionID sessionId, OverlayDialogManager dialogManager, String type) { - dialogManager.dismissAll(); - dialogManager.show( - tag: '$sessionId-wait-uac', - (setState, close, context) => CustomAlertDialog( - title: null, - content: msgboxContent(type, 'Wait', 'wait_accept_uac_tip'), - actions: [ - dialogButton( - 'OK', - icon: Icon(Icons.done_rounded), - onPressed: close, - ), - ], - )); -} - -// Another username && password dialog? -void showRequestElevationDialog( - SessionID sessionId, OverlayDialogManager dialogManager) { - RxString groupValue = ''.obs; - RxString errUser = ''.obs; - RxString errPwd = ''.obs; - TextEditingController userController = TextEditingController(); - TextEditingController pwdController = TextEditingController(); - - void onRadioChanged(String? value) { - if (value != null) { - groupValue.value = value; - } - } - - // TODO get from theme - final double fontSizeNote = 13.00; - - Widget OptionRequestPermissions = Obx( - () => Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Radio( - visualDensity: VisualDensity(horizontal: -4, vertical: -4), - value: '', - groupValue: groupValue.value, - onChanged: onRadioChanged, - ).marginOnly(right: 10), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - InkWell( - hoverColor: Colors.transparent, - onTap: () => groupValue.value = '', - child: Text( - translate('Ask the remote user for authentication'), - ), - ).marginOnly(bottom: 10), - Text( - translate('Choose this if the remote account is administrator'), - style: TextStyle(fontSize: fontSizeNote), - ), - ], - ).marginOnly(top: 3), - ), - ], - ), - ); - - Widget OptionCredentials = Obx( - () => Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Radio( - visualDensity: VisualDensity(horizontal: -4, vertical: -4), - value: 'logon', - groupValue: groupValue.value, - onChanged: onRadioChanged, - ).marginOnly(right: 10), - Expanded( - child: InkWell( - hoverColor: Colors.transparent, - onTap: () => onRadioChanged('logon'), - child: Text( - translate('Transmit the username and password of administrator'), - ), - ).marginOnly(top: 4), - ), - ], - ), - ); - - Widget UacNote = Container( - padding: EdgeInsets.fromLTRB(10, 8, 8, 8), - decoration: BoxDecoration( - color: MyTheme.currentThemeMode() == ThemeMode.dark - ? Color.fromARGB(135, 87, 87, 90) - : Colors.grey[100], - borderRadius: BorderRadius.circular(8), - border: Border.all(color: Colors.grey), - ), - child: Row( - children: [ - Icon(Icons.info_outline_rounded, size: 20).marginOnly(right: 10), - Expanded( - child: Text( - translate('still_click_uac_tip'), - style: TextStyle( - fontSize: fontSizeNote, fontWeight: FontWeight.normal), - ), - ) - ], - ), - ); - - var content = Obx( - () => Column( - children: [ - OptionRequestPermissions.marginOnly(bottom: 15), - OptionCredentials, - Offstage( - offstage: 'logon' != groupValue.value, - child: Column( - children: [ - UacNote.marginOnly(bottom: 10), - DialogTextField( - controller: userController, - title: translate('Username'), - hintText: translate('elevation_username_tip'), - prefixIcon: DialogTextField.kUsernameIcon, - errorText: errUser.isEmpty ? null : errUser.value, - ), - PasswordWidget( - controller: pwdController, - autoFocus: false, - errorText: errPwd.isEmpty ? null : errPwd.value, - ), - ], - ).marginOnly(left: stateGlobal.isPortrait.isFalse ? 35 : 0), - ).marginOnly(top: 10), - ], - ), - ); - - dialogManager.dismissAll(); - dialogManager.show(tag: '$sessionId-request-elevation', - (setState, close, context) { - void submit() { - if (groupValue.value == 'logon') { - if (userController.text.isEmpty) { - errUser.value = translate('Empty Username'); - return; - } - if (pwdController.text.isEmpty) { - errPwd.value = translate('Empty Password'); - return; - } - bind.sessionElevateWithLogon( - sessionId: sessionId, - username: userController.text, - password: pwdController.text); - } else { - bind.sessionElevateDirect(sessionId: sessionId); - } - close(); - showWaitUacDialog(sessionId, dialogManager, "wait-uac"); - } - - return CustomAlertDialog( - title: Text(translate('Request Elevation')), - content: content, - actions: [ - dialogButton( - 'Cancel', - icon: Icon(Icons.close_rounded), - onPressed: close, - isOutline: true, - ), - dialogButton( - 'OK', - icon: Icon(Icons.done_rounded), - onPressed: submit, - ) - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -void showOnBlockDialog( - SessionID sessionId, - String type, - String title, - String text, - OverlayDialogManager dialogManager, -) { - if (dialogManager.existing('$sessionId-wait-uac') || - dialogManager.existing('$sessionId-request-elevation')) { - return; - } - dialogManager.show(tag: '$sessionId-$type', (setState, close, context) { - void submit() { - close(); - showRequestElevationDialog(sessionId, dialogManager); - } - - return CustomAlertDialog( - title: null, - content: msgboxContent(type, title, - "${translate(text)}${type.contains('uac') ? '\n' : '\n\n'}${translate('request_elevation_tip')}"), - actions: [ - dialogButton('Wait', onPressed: close, isOutline: true), - dialogButton('Request Elevation', onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -void showElevationError(SessionID sessionId, String type, String title, - String text, OverlayDialogManager dialogManager) { - dialogManager.show(tag: '$sessionId-$type', (setState, close, context) { - void submit() { - close(); - showRequestElevationDialog(sessionId, dialogManager); - } - - return CustomAlertDialog( - title: null, - content: msgboxContent(type, title, text), - actions: [ - dialogButton('Cancel', onPressed: () { - close(); - }, isOutline: true), - if (text != 'No permission') dialogButton('Retry', onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -void showWaitAcceptDialog(SessionID sessionId, String type, String title, - String text, OverlayDialogManager dialogManager) { - dialogManager.dismissAll(); - dialogManager.show((setState, close, context) { - onCancel() { - closeConnection(); - } - - return CustomAlertDialog( - title: null, - content: msgboxContent(type, title, text), - actions: [ - dialogButton('Cancel', onPressed: onCancel, isOutline: true), - ], - onCancel: onCancel, - ); - }); -} - -void showRestartRemoteDevice(PeerInfo pi, String id, SessionID sessionId, - OverlayDialogManager dialogManager) async { - final res = await dialogManager - .show((setState, close, context) => CustomAlertDialog( - title: Row(children: [ - Icon(Icons.warning_rounded, color: Colors.redAccent, size: 28), - Flexible( - child: Text(translate("Restart remote device")) - .paddingOnly(left: 10)), - ]), - content: Text( - "${translate('Are you sure you want to restart')} \n${pi.username}@${pi.hostname}($id) ?"), - actions: [ - dialogButton( - "Cancel", - icon: Icon(Icons.close_rounded), - onPressed: close, - isOutline: true, - ), - dialogButton( - "OK", - icon: Icon(Icons.done_rounded), - onPressed: () => close(true), - ), - ], - onCancel: close, - onSubmit: () => close(true), - )); - if (res == true) bind.sessionRestartRemoteDevice(sessionId: sessionId); -} - -showSetOSPassword( - SessionID sessionId, - bool login, - OverlayDialogManager dialogManager, - String? osPassword, - Function()? closeCallback, -) async { - final controller = TextEditingController(); - osPassword ??= - await bind.sessionGetOption(sessionId: sessionId, arg: 'os-password') ?? - ''; - var autoLogin = - await bind.sessionGetOption(sessionId: sessionId, arg: 'auto-login') != - ''; - controller.text = osPassword; - dialogManager.show((setState, close, context) { - closeWithCallback([dynamic]) { - close(); - if (closeCallback != null) closeCallback(); - } - - submit() { - var text = controller.text.trim(); - bind.sessionPeerOption( - sessionId: sessionId, name: 'os-password', value: text); - bind.sessionPeerOption( - sessionId: sessionId, - name: 'auto-login', - value: autoLogin ? 'Y' : ''); - if (text != '' && login) { - bind.sessionInputOsPassword(sessionId: sessionId, value: text); - } - closeWithCallback(); - } - - return CustomAlertDialog( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.password_rounded, color: MyTheme.accent), - Text(translate('OS Password')).paddingOnly(left: 10), - ], - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - PasswordWidget(controller: controller), - CheckboxListTile( - contentPadding: const EdgeInsets.all(0), - dense: true, - controlAffinity: ListTileControlAffinity.leading, - title: Text( - translate('Auto Login'), - ), - value: autoLogin, - onChanged: (v) { - if (v == null) return; - setState(() => autoLogin = v); - }, - ), - ], - ), - actions: [ - dialogButton( - "Cancel", - icon: Icon(Icons.close_rounded), - onPressed: closeWithCallback, - isOutline: true, - ), - dialogButton( - "OK", - icon: Icon(Icons.done_rounded), - onPressed: submit, - ), - ], - onSubmit: submit, - onCancel: closeWithCallback, - ); - }); -} - -showSetOSAccount( - SessionID sessionId, - OverlayDialogManager dialogManager, -) async { - final usernameController = TextEditingController(); - final passwdController = TextEditingController(); - var username = - await bind.sessionGetOption(sessionId: sessionId, arg: 'os-username') ?? - ''; - var password = - await bind.sessionGetOption(sessionId: sessionId, arg: 'os-password') ?? - ''; - usernameController.text = username; - passwdController.text = password; - dialogManager.show((setState, close, context) { - submit() { - final username = usernameController.text.trim(); - final password = usernameController.text.trim(); - bind.sessionPeerOption( - sessionId: sessionId, name: 'os-username', value: username); - bind.sessionPeerOption( - sessionId: sessionId, name: 'os-password', value: password); - close(); - } - - descWidget(String text) { - return Column( - children: [ - Align( - alignment: Alignment.centerLeft, - child: Text( - text, - maxLines: 3, - softWrap: true, - overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 16), - ), - ), - Container( - height: 8, - ), - ], - ); - } - - return CustomAlertDialog( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.password_rounded, color: MyTheme.accent), - Text(translate('OS Account')).paddingOnly(left: 10), - ], - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - descWidget(translate("os_account_desk_tip")), - DialogTextField( - title: translate(DialogTextField.kUsernameTitle), - controller: usernameController, - prefixIcon: DialogTextField.kUsernameIcon, - errorText: null, - ), - PasswordWidget(controller: passwdController), - ], - ), - actions: [ - dialogButton( - "Cancel", - icon: Icon(Icons.close_rounded), - onPressed: close, - isOutline: true, - ), - dialogButton( - "OK", - icon: Icon(Icons.done_rounded), - onPressed: submit, - ), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -Widget buildNoteTextField({ - required TextEditingController controller, - required VoidCallback onEscape, -}) { - final focusNode = FocusNode( - onKey: (FocusNode node, RawKeyEvent evt) { - if (evt.logicalKey.keyLabel == 'Enter') { - if (evt is RawKeyDownEvent) { - int pos = controller.selection.base.offset; - controller.text = - '${controller.text.substring(0, pos)}\n${controller.text.substring(pos)}'; - controller.selection = - TextSelection.fromPosition(TextPosition(offset: pos + 1)); - } - return KeyEventResult.handled; - } - if (evt.logicalKey.keyLabel == 'Esc') { - if (evt is RawKeyDownEvent) { - onEscape(); - } - return KeyEventResult.handled; - } else { - return KeyEventResult.ignored; - } - }, - ); - - return TextField( - autofocus: true, - keyboardType: TextInputType.multiline, - textInputAction: TextInputAction.newline, - decoration: InputDecoration( - hintText: translate('input note here'), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - contentPadding: EdgeInsets.all(12), - ), - minLines: 5, - maxLines: null, - maxLength: 256, - controller: controller, - focusNode: focusNode, - ).workaroundFreezeLinuxMint(); -} - -showAuditDialog(FFI ffi) async { - final controller = TextEditingController( - text: bind.sessionGetLastAuditNote(sessionId: ffi.sessionId)); - ffi.dialogManager.show((setState, close, context) { - submit() { - var text = controller.text; - bind.sessionSendNote(sessionId: ffi.sessionId, note: text); - close(); - } - - return CustomAlertDialog( - title: Text(translate('Note')), - content: SizedBox( - width: 250, - height: 120, - child: buildNoteTextField( - controller: controller, - onEscape: close, - )), - actions: [ - dialogButton('Cancel', onPressed: close, isOutline: true), - dialogButton('OK', onPressed: submit) - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -bool allowAskForNoteAtEndOfConnection(FFI? ffi, bool closedByControlling) { - if (ffi == null) { - return false; - } - return mainGetLocalBoolOptionSync(kOptionAllowAskForNoteAtEndOfConnection) && - bind - .sessionGetAuditServerSync(sessionId: ffi.sessionId, typ: "conn") - .isNotEmpty && - bind.sessionGetAuditGuid(sessionId: ffi.sessionId).isNotEmpty && - bind.sessionGetLastAuditNote(sessionId: ffi.sessionId).isEmpty && - (!closedByControlling || - bind.willSessionCloseCloseSession(sessionId: ffi.sessionId)); -} - -// return value: close canceled -// true: return -// false: go on -Future desktopTryShowTabAuditDialogCloseCancelled( - {required String id, required DesktopTabController tabController}) async { - try { - final page = - tabController.state.value.tabs.firstWhere((tab) => tab.key == id).page; - final ffi = (page as dynamic).ffi; - final res = await showConnEndAuditDialogCloseCanceled(ffi: ffi); - return res; - } catch (e) { - debugPrint('Failed to show audit dialog: $e'); - return false; - } -} - -// return value: -// true: return -// false: go on -Future showConnEndAuditDialogCloseCanceled( - {required FFI ffi, String? type, String? title, String? text}) async { - final res = await _showConnEndAuditDialogCloseCanceled( - ffi: ffi, type: type, title: title, text: text); - if (res == true) { - return true; - } - return false; -} - -// return value: -// true: return -// false / null: go on -Future _showConnEndAuditDialogCloseCanceled({ - required FFI ffi, - String? type, - String? title, - String? text, -}) async { - final closedByControlling = type == null; - final showDialog = allowAskForNoteAtEndOfConnection(ffi, closedByControlling); - if (!showDialog) { - return false; - } - ffi.dialogManager.dismissAll(); - - Future updateAuditNoteByGuid(String auditGuid, String note) async { - debugPrint('Updating audit note for GUID: $auditGuid, note: $note'); - try { - final apiServer = await bind.mainGetApiServer(); - if (apiServer.isEmpty) { - debugPrint('API server is empty, cannot update audit note'); - return; - } - final url = '$apiServer/api/audit'; - var headers = getHttpHeaders(); - headers['Content-Type'] = "application/json"; - final body = jsonEncode({ - 'guid': auditGuid, - 'note': note, - }); - - final response = await http.put( - Uri.parse(url), - headers: headers, - body: body, - ); - - if (response.statusCode == 200) { - debugPrint('Successfully updated audit note for GUID: $auditGuid'); - } else { - debugPrint( - 'Failed to update audit note. Status: ${response.statusCode}, Body: ${response.body}'); - } - } catch (e) { - debugPrint('Error updating audit note: $e'); - } - } - - final controller = TextEditingController(); - bool askForNote = - mainGetLocalBoolOptionSync(kOptionAllowAskForNoteAtEndOfConnection); - final isOptFixed = isOptionFixed(kOptionAllowAskForNoteAtEndOfConnection); - bool isInProgress = false; - - return await ffi.dialogManager.show((setState, close, context) { - cancel() { - close(true); - } - - set() async { - if (isInProgress) return; - setState(() { - isInProgress = true; - }); - var text = controller.text; - if (text.isNotEmpty) { - await updateAuditNoteByGuid( - bind.sessionGetAuditGuid(sessionId: ffi.sessionId), text) - .timeout(const Duration(seconds: 6), onTimeout: () { - debugPrint('updateAuditNoteByGuid timeout after 6s'); - }); - } - // Save the "ask for note" preference - if (!isOptFixed) { - await mainSetLocalBoolOption( - kOptionAllowAskForNoteAtEndOfConnection, askForNote); - } - } - - submit() async { - await set(); - close(false); - } - - final buttons = [ - dialogButton('OK', onPressed: isInProgress ? null : submit) - ]; - if (type == 'relay-hint' || type == 'relay-hint2') { - buttons.add(dialogButton('Retry', onPressed: () async { - await set(); - close(true); - ffi.ffiModel.reconnect(ffi.dialogManager, ffi.sessionId, false); - })); - if (type == 'relay-hint2') { - buttons.add(dialogButton('Connect via relay', onPressed: () async { - await set(); - close(true); - ffi.ffiModel.reconnect(ffi.dialogManager, ffi.sessionId, true); - })); - } - } - if (closedByControlling) { - buttons.add(dialogButton('Cancel', - onPressed: isInProgress ? null : cancel, isOutline: true)); - } - - Widget content; - if (closedByControlling) { - content = SelectionArea( - child: msgboxContent( - 'info', 'Close', 'Are you sure to close the connection?')); - } else { - content = - SelectionArea(child: msgboxContent(type, title ?? '', text ?? '')); - } - - return CustomAlertDialog( - title: null, - content: SizedBox( - width: 350, - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - content, - const SizedBox(height: 16), - SizedBox( - height: 120, - child: buildNoteTextField( - controller: controller, - onEscape: cancel, - ), - ), - if (!isOptFixed) ...[ - const SizedBox(height: 8), - InkWell( - onTap: () { - setState(() { - askForNote = !askForNote; - }); - }, - child: Row( - children: [ - Checkbox( - value: askForNote, - onChanged: (value) { - setState(() { - askForNote = value ?? false; - }); - }, - ), - Expanded( - child: Text( - translate('note-at-conn-end-tip'), - style: const TextStyle(fontSize: 13), - ), - ), - ], - ), - ), - ], - if (isInProgress) - const LinearProgressIndicator().marginOnly(top: 4), - ], - )), - actions: buttons, - onSubmit: submit, - onCancel: cancel, - ); - }); -} - -void showConfirmSwitchSidesDialog( - SessionID sessionId, String id, OverlayDialogManager dialogManager) async { - dialogManager.show((setState, close, context) { - submit() async { - await bind.sessionSwitchSides(sessionId: sessionId); - closeConnection(id: id); - } - - return CustomAlertDialog( - content: msgboxContent('info', 'Switch Sides', - 'Please confirm if you want to share your desktop?'), - actions: [ - dialogButton('Cancel', onPressed: close, isOutline: true), - dialogButton('OK', onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -customImageQualityDialog(SessionID sessionId, String id, FFI ffi) async { - double initQuality = kDefaultQuality; - double initFps = kDefaultFps; - bool qualitySet = false; - bool fpsSet = false; - - bool? direct; - try { - direct = - ConnectionTypeState.find(id).direct.value == ConnectionType.strDirect; - } catch (_) {} - bool hideFps = (await bind.mainIsUsingPublicServer() && direct != true) || - versionCmp(ffi.ffiModel.pi.version, '1.2.0') < 0; - bool hideMoreQuality = - (await bind.mainIsUsingPublicServer() && direct != true) || - versionCmp(ffi.ffiModel.pi.version, '1.2.2') < 0; - - setCustomValues({double? quality, double? fps}) async { - debugPrint("setCustomValues quality:$quality, fps:$fps"); - if (quality != null) { - qualitySet = true; - await bind.sessionSetCustomImageQuality( - sessionId: sessionId, value: quality.toInt()); - } - if (fps != null) { - fpsSet = true; - await bind.sessionSetCustomFps(sessionId: sessionId, fps: fps.toInt()); - } - if (!qualitySet) { - qualitySet = true; - await bind.sessionSetCustomImageQuality( - sessionId: sessionId, value: initQuality.toInt()); - } - if (!hideFps && !fpsSet) { - fpsSet = true; - await bind.sessionSetCustomFps( - sessionId: sessionId, fps: initFps.toInt()); - } - } - - final btnClose = dialogButton('Close', onPressed: () async { - await setCustomValues(); - ffi.dialogManager.dismissAll(); - }); - - // quality - final quality = await bind.sessionGetCustomImageQuality(sessionId: sessionId); - initQuality = quality != null && quality.isNotEmpty - ? quality[0].toDouble() - : kDefaultQuality; - if (initQuality < kMinQuality || - initQuality > (!hideMoreQuality ? kMaxMoreQuality : kMaxQuality)) { - initQuality = kDefaultQuality; - } - // fps - final fpsOption = - await bind.sessionGetOption(sessionId: sessionId, arg: 'custom-fps'); - initFps = fpsOption == null - ? kDefaultFps - : double.tryParse(fpsOption) ?? kDefaultFps; - if (initFps < kMinFps || initFps > kMaxFps) { - initFps = kDefaultFps; - } - - final content = customImageQualityWidget( - initQuality: initQuality, - initFps: initFps, - setQuality: (v) => setCustomValues(quality: v), - setFps: (v) => setCustomValues(fps: v), - showFps: !hideFps, - showMoreQuality: !hideMoreQuality); - msgBoxCommon(ffi.dialogManager, 'Custom Image Quality', content, [btnClose]); -} - -trackpadSpeedDialog(SessionID sessionId, FFI ffi) async { - int initSpeed = ffi.inputModel.trackpadSpeed; - final curSpeed = SimpleWrapper(initSpeed); - final btnClose = dialogButton('Close', onPressed: () async { - if (curSpeed.value <= kMaxTrackpadSpeed && - curSpeed.value >= kMinTrackpadSpeed && - curSpeed.value != initSpeed) { - await bind.sessionSetTrackpadSpeed( - sessionId: sessionId, value: curSpeed.value); - await ffi.inputModel.updateTrackpadSpeed(); - } - ffi.dialogManager.dismissAll(); - }); - msgBoxCommon( - ffi.dialogManager, - 'Trackpad speed', - TrackpadSpeedWidget( - value: curSpeed, - ), - [btnClose]); -} - -void deleteConfirmDialog(Function onSubmit, String title) async { - gFFI.dialogManager.show( - (setState, close, context) { - submit() async { - await onSubmit(); - close(); - } - - return CustomAlertDialog( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.delete_rounded, - color: Colors.red, - ), - Expanded( - child: Text(title, overflow: TextOverflow.ellipsis).paddingOnly( - left: 10, - ), - ), - ], - ), - content: SizedBox.shrink(), - actions: [ - dialogButton( - "Cancel", - icon: Icon(Icons.close_rounded), - onPressed: close, - isOutline: true, - ), - dialogButton( - "OK", - icon: Icon(Icons.done_rounded), - onPressed: submit, - ), - ], - onSubmit: submit, - onCancel: close, - ); - }, - ); -} - -void editAbTagDialog( - List currentTags, Function(List) onSubmit) { - var isInProgress = false; - - final tags = List.of(gFFI.abModel.currentAbTags); - var selectedTag = currentTags.obs; - - gFFI.dialogManager.show((setState, close, context) { - submit() async { - setState(() { - isInProgress = true; - }); - await onSubmit(selectedTag); - close(); - } - - return CustomAlertDialog( - title: Text(translate("Edit Tag")), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Wrap( - children: tags - .map((e) => AddressBookTag( - name: e, - tags: selectedTag, - onTap: () { - if (selectedTag.contains(e)) { - selectedTag.remove(e); - } else { - selectedTag.add(e); - } - }, - showActionMenu: false)) - .toList(growable: false), - ), - ), - // NOT use Offstage to wrap LinearProgressIndicator - if (isInProgress) const LinearProgressIndicator(), - ], - ), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - dialogButton("OK", onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -void editAbPeerNoteDialog(String id) { - var isInProgress = false; - final currentNote = gFFI.abModel.getPeerNote(id); - var controller = TextEditingController(text: currentNote); - - gFFI.dialogManager.show((setState, close, context) { - submit() async { - setState(() { - isInProgress = true; - }); - await gFFI.abModel.changeNote(id: id, note: controller.text); - close(); - } - - return CustomAlertDialog( - title: Text(translate("Edit note")), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextField( - controller: controller, - autofocus: true, - maxLines: 3, - minLines: 1, - maxLength: 300, - decoration: InputDecoration( - labelText: translate('Note'), - ), - ).workaroundFreezeLinuxMint(), - // NOT use Offstage to wrap LinearProgressIndicator - if (isInProgress) const LinearProgressIndicator(), - ], - ), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - dialogButton("OK", onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -void renameDialog( - {required String oldName, - FormFieldValidator? validator, - required ValueChanged onSubmit, - Function? onCancel}) async { - RxBool isInProgress = false.obs; - var controller = TextEditingController(text: oldName); - final formKey = GlobalKey(); - gFFI.dialogManager.show((setState, close, context) { - submit() async { - String text = controller.text.trim(); - if (validator != null && formKey.currentState?.validate() == false) { - return; - } - isInProgress.value = true; - onSubmit(text); - close(); - isInProgress.value = false; - } - - cancel() { - onCancel?.call(); - close(); - } - - return CustomAlertDialog( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.edit_rounded, color: MyTheme.accent), - Text(translate('Rename')).paddingOnly(left: 10), - ], - ), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: Form( - key: formKey, - child: TextFormField( - controller: controller, - autofocus: true, - decoration: InputDecoration(labelText: translate('Name')), - validator: validator, - ).workaroundFreezeLinuxMint(), - ), - ), - // NOT use Offstage to wrap LinearProgressIndicator - Obx(() => - isInProgress.value ? const LinearProgressIndicator() : Offstage()) - ], - ), - actions: [ - dialogButton( - "Cancel", - icon: Icon(Icons.close_rounded), - onPressed: cancel, - isOutline: true, - ), - dialogButton( - "OK", - icon: Icon(Icons.done_rounded), - onPressed: submit, - ), - ], - onSubmit: submit, - onCancel: cancel, - ); - }); -} - -void changeBot({Function()? callback}) async { - if (bind.mainHasValidBotSync()) { - await bind.mainSetOption(key: "bot", value: ""); - callback?.call(); - return; - } - String errorText = ''; - bool loading = false; - final controller = TextEditingController(); - gFFI.dialogManager.show((setState, close, context) { - onVerify() async { - final token = controller.text.trim(); - if (token == "") return; - loading = true; - errorText = ''; - setState(() {}); - final error = await bind.mainVerifyBot(token: token); - if (error == "") { - callback?.call(); - close(); - } else { - errorText = translate(error); - loading = false; - setState(() {}); - } - } - - final codeField = TextField( - autofocus: true, - controller: controller, - decoration: InputDecoration( - hintText: translate('Token'), - ), - ).workaroundFreezeLinuxMint(); - - return CustomAlertDialog( - title: Text(translate("Telegram bot")), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SelectableText(translate("enable-bot-desc"), - style: TextStyle(fontSize: 12)) - .marginOnly(bottom: 12), - Row(children: [Expanded(child: codeField)]), - if (errorText != '') - Text(errorText, style: TextStyle(color: Colors.red)) - .marginOnly(top: 12), - ], - ), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - loading - ? CircularProgressIndicator() - : dialogButton("OK", onPressed: onVerify), - ], - onCancel: close, - ); - }); -} - -void change2fa({Function()? callback}) async { - if (bind.mainHasValid2FaSync()) { - await bind.mainSetOption(key: "2fa", value: ""); - await bind.mainClearTrustedDevices(); - callback?.call(); - return; - } - var new2fa = (await bind.mainGenerate2Fa()); - final secretRegex = RegExp(r'secret=([^&]+)'); - final secret = secretRegex.firstMatch(new2fa)?.group(1); - String? errorText; - final controller = TextEditingController(); - gFFI.dialogManager.show((setState, close, context) { - onVerify() async { - if (await bind.mainVerify2Fa(code: controller.text.trim())) { - callback?.call(); - close(); - } else { - errorText = translate('wrong-2fa-code'); - } - } - - final codeField = Dialog2FaField( - controller: controller, - errorText: errorText, - onChanged: () => setState(() => errorText = null), - title: translate('Verification code'), - readyCallback: () { - onVerify(); - setState(() {}); - }, - ); - - getOnSubmit() => codeField.isReady ? onVerify : null; - - return CustomAlertDialog( - title: Text(translate("enable-2fa-title")), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SelectableText(translate("enable-2fa-desc"), - style: TextStyle(fontSize: 12)) - .marginOnly(bottom: 12), - SizedBox( - width: 160, - height: 160, - child: QrImageView( - backgroundColor: Colors.white, - data: new2fa, - version: QrVersions.auto, - size: 160, - gapless: false, - )).marginOnly(bottom: 6), - SelectableText(secret ?? '', style: TextStyle(fontSize: 12)) - .marginOnly(bottom: 12), - Row(children: [Expanded(child: codeField)]), - ], - ), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - dialogButton("OK", onPressed: getOnSubmit()), - ], - onCancel: close, - ); - }); -} - -void enter2FaDialog( - SessionID sessionId, OverlayDialogManager dialogManager) async { - final controller = TextEditingController(); - final RxBool submitReady = false.obs; - final RxBool trustThisDevice = false.obs; - - dialogManager.dismissAll(); - dialogManager.show((setState, close, context) { - cancel() { - close(); - closeConnection(); - } - - submit() { - gFFI.send2FA(sessionId, controller.text.trim(), trustThisDevice.value); - close(); - dialogManager.showLoading(translate('Logging in...'), - onCancel: closeConnection); - } - - late Dialog2FaField codeField; - - codeField = Dialog2FaField( - controller: controller, - title: translate('Verification code'), - onChanged: () => submitReady.value = codeField.isReady, - ); - - final trustField = Obx(() => CheckboxListTile( - contentPadding: const EdgeInsets.all(0), - dense: true, - controlAffinity: ListTileControlAffinity.leading, - title: Text(translate("Trust this device")), - value: trustThisDevice.value, - onChanged: (value) { - if (value == null) return; - trustThisDevice.value = value; - }, - )); - - return CustomAlertDialog( - title: Text(translate('enter-2fa-title')), - content: Column( - children: [ - codeField, - if (bind.sessionGetEnableTrustedDevices(sessionId: sessionId)) - trustField, - ], - ), - actions: [ - dialogButton('Cancel', - onPressed: cancel, - isOutline: true, - style: TextStyle( - color: Theme.of(context).textTheme.bodyMedium?.color)), - Obx(() => dialogButton( - 'OK', - onPressed: submitReady.isTrue ? submit : null, - )), - ], - onSubmit: submit, - onCancel: cancel); - }); -} - -// This dialog should not be dismissed, otherwise it will be black screen, have not reproduced this. -void showWindowsSessionsDialog( - String type, - String title, - String text, - OverlayDialogManager dialogManager, - SessionID sessionId, - String peerId, - String sessions) { - List sessionsList = []; - try { - sessionsList = json.decode(sessions); - } catch (e) { - print(e); - } - List sids = []; - List names = []; - for (var session in sessionsList) { - sids.add(session['sid']); - names.add(session['name']); - } - String selectedUserValue = sids.first; - dialogManager.dismissAll(); - dialogManager.show((setState, close, context) { - submit() { - bind.sessionSendSelectedSessionId( - sessionId: sessionId, sid: selectedUserValue); - close(); - } - - return CustomAlertDialog( - title: null, - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - msgboxContent(type, title, text).marginOnly(bottom: 12), - ComboBox( - keys: sids, - values: names, - initialKey: selectedUserValue, - onChanged: (value) { - selectedUserValue = value; - }), - ], - ), - actions: [ - dialogButton('Connect', onPressed: submit, isOutline: false), - ], - ); - }); -} - -void addPeersToAbDialog( - List peers, -) async { - Future addTo(String abname) async { - final mapList = peers.map((e) { - var json = e.toJson(); - // remove password when add to another address book to avoid re-share - json.remove('password'); - json.remove('hash'); - return json; - }).toList(); - final errMsg = await gFFI.abModel.addPeersTo(mapList, abname); - if (errMsg == null) { - showToast(translate('Successful')); - return true; - } else { - BotToast.showText(text: errMsg, contentColor: Colors.red); - return false; - } - } - - // if only one address book and it is personal, add to it directly - if (gFFI.abModel.addressbooks.length == 1 && - gFFI.abModel.current.isPersonal()) { - await addTo(gFFI.abModel.currentName.value); - return; - } - - RxBool isInProgress = false.obs; - final names = gFFI.abModel.addressBooksCanWrite(); - RxString currentName = gFFI.abModel.currentName.value.obs; - TextEditingController controller = TextEditingController(); - if (gFFI.peerTabModel.currentTab == PeerTabIndex.ab.index) { - names.remove(currentName.value); - } - if (names.isEmpty) { - debugPrint('no address book to add peers to, should not happen'); - return; - } - if (!names.contains(currentName.value)) { - currentName.value = names[0]; - } - gFFI.dialogManager.show((setState, close, context) { - submit() async { - if (controller.text != gFFI.abModel.translatedName(currentName.value)) { - BotToast.showText( - text: 'illegal address book name: ${controller.text}', - contentColor: Colors.red); - return; - } - isInProgress.value = true; - if (await addTo(currentName.value)) { - close(); - } - isInProgress.value = false; - } - - cancel() { - close(); - } - - return CustomAlertDialog( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(IconFont.addressBook, color: MyTheme.accent), - Text(translate('Add to address book')).paddingOnly(left: 10), - ], - ), - content: Obx(() => Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - // https://github.com/flutter/flutter/issues/145081 - DropdownMenu( - initialSelection: currentName.value, - onSelected: (value) { - if (value != null) { - currentName.value = value; - } - }, - dropdownMenuEntries: names - .map((e) => DropdownMenuEntry( - value: e, label: gFFI.abModel.translatedName(e))) - .toList(), - inputDecorationTheme: InputDecorationTheme( - isDense: true, border: UnderlineInputBorder()), - enableFilter: true, - controller: controller, - ), - // NOT use Offstage to wrap LinearProgressIndicator - isInProgress.value ? const LinearProgressIndicator() : Offstage() - ], - )), - actions: [ - dialogButton( - "Cancel", - icon: Icon(Icons.close_rounded), - onPressed: cancel, - isOutline: true, - ), - dialogButton( - "OK", - icon: Icon(Icons.done_rounded), - onPressed: submit, - ), - ], - onSubmit: submit, - onCancel: cancel, - ); - }); -} - -void setSharedAbPasswordDialog(String abName, Peer peer) { - TextEditingController controller = TextEditingController(text: ''); - RxBool isInProgress = false.obs; - RxBool isInputEmpty = true.obs; - bool passwordVisible = false; - controller.addListener(() { - isInputEmpty.value = controller.text.isEmpty; - }); - gFFI.dialogManager.show((setState, close, context) { - change(String password) async { - isInProgress.value = true; - bool res = - await gFFI.abModel.changeSharedPassword(abName, peer.id, password); - isInProgress.value = false; - if (res) { - showToast(translate('Successful')); - } - close(); - } - - cancel() { - close(); - } - - return CustomAlertDialog( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.key, color: MyTheme.accent), - Text(translate(peer.password.isEmpty - ? 'Set shared password' - : 'Change Password')) - .paddingOnly(left: 10), - ], - ), - content: Obx(() => Column(children: [ - TextField( - controller: controller, - autofocus: true, - obscureText: !passwordVisible, - decoration: InputDecoration( - suffixIcon: IconButton( - icon: Icon( - passwordVisible ? Icons.visibility : Icons.visibility_off, - color: MyTheme.lightTheme.primaryColor), - onPressed: () { - setState(() { - passwordVisible = !passwordVisible; - }); - }, - ), - ), - ).workaroundFreezeLinuxMint(), - if (!gFFI.abModel.current.isPersonal()) - Row(children: [ - Icon(Icons.info, color: Colors.amber).marginOnly(right: 4), - Text( - translate('share_warning_tip'), - style: TextStyle(fontSize: 12), - ) - ]).marginSymmetric(vertical: 10), - // NOT use Offstage to wrap LinearProgressIndicator - isInProgress.value ? const LinearProgressIndicator() : Offstage() - ])), - actions: [ - dialogButton( - "Cancel", - icon: Icon(Icons.close_rounded), - onPressed: cancel, - isOutline: true, - ), - if (peer.password.isNotEmpty) - dialogButton( - "Remove", - icon: Icon(Icons.delete_outline_rounded), - onPressed: () => change(''), - buttonStyle: ButtonStyle( - backgroundColor: MaterialStatePropertyAll(Colors.red)), - ), - Obx(() => dialogButton( - "OK", - icon: Icon(Icons.done_rounded), - onPressed: - isInputEmpty.value ? null : () => change(controller.text), - )), - ], - onSubmit: isInputEmpty.value ? null : () => change(controller.text), - onCancel: cancel, - ); - }); -} - -void CommonConfirmDialog(OverlayDialogManager dialogManager, String content, - VoidCallback onConfirm) { - dialogManager.show((setState, close, context) { - submit() { - close(); - onConfirm.call(); - } - - return CustomAlertDialog( - content: Row( - children: [ - Expanded( - child: Text(content, - style: const TextStyle(fontSize: 15), - textAlign: TextAlign.start), - ), - ], - ).marginOnly(bottom: 12), - actions: [ - dialogButton(translate("Cancel"), onPressed: close, isOutline: true), - dialogButton(translate("OK"), onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -void changeUnlockPinDialog(String oldPin, Function() callback) { - final pinController = TextEditingController(text: oldPin); - final confirmController = TextEditingController(text: oldPin); - String? pinErrorText; - String? confirmationErrorText; - final maxLength = bind.mainMaxEncryptLen(); - gFFI.dialogManager.show((setState, close, context) { - submit() async { - pinErrorText = null; - confirmationErrorText = null; - final pin = pinController.text.trim(); - final confirm = confirmController.text.trim(); - if (pin != confirm) { - setState(() { - confirmationErrorText = - translate('The confirmation is not identical.'); - }); - return; - } - final errorMsg = bind.mainSetUnlockPin(pin: pin); - if (errorMsg != '') { - setState(() { - pinErrorText = translate(errorMsg); - }); - return; - } - callback.call(); - close(); - } - - return CustomAlertDialog( - title: Text(translate("Set PIN")), - content: Column( - children: [ - DialogTextField( - title: 'PIN', - controller: pinController, - obscureText: true, - errorText: pinErrorText, - maxLength: maxLength, - ), - DialogTextField( - title: translate('Confirmation'), - controller: confirmController, - obscureText: true, - errorText: confirmationErrorText, - maxLength: maxLength, - ) - ], - ).marginOnly(bottom: 12), - actions: [ - dialogButton(translate("Cancel"), onPressed: close, isOutline: true), - dialogButton(translate("OK"), onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -void checkUnlockPinDialog(String correctPin, Function() passCallback) { - final controller = TextEditingController(); - String? errorText; - gFFI.dialogManager.show((setState, close, context) { - submit() async { - final pin = controller.text.trim(); - if (correctPin != pin) { - setState(() { - errorText = translate('Wrong PIN'); - }); - return; - } - passCallback.call(); - close(); - } - - return CustomAlertDialog( - content: Row( - children: [ - Expanded( - child: PasswordWidget( - title: 'PIN', - controller: controller, - errorText: errorText, - hintText: '', - )) - ], - ).marginOnly(bottom: 12), - actions: [ - dialogButton(translate("Cancel"), onPressed: close, isOutline: true), - dialogButton(translate("OK"), onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -void confrimDeleteTrustedDevicesDialog( - RxList trustedDevices, RxList selectedDevices) { - CommonConfirmDialog(gFFI.dialogManager, '${translate('Confirm Delete')}?', - () async { - if (selectedDevices.isEmpty) return; - if (selectedDevices.length == trustedDevices.length) { - await bind.mainClearTrustedDevices(); - trustedDevices.clear(); - selectedDevices.clear(); - } else { - final json = jsonEncode(selectedDevices.map((e) => e.toList()).toList()); - await bind.mainRemoveTrustedDevices(json: json); - trustedDevices.removeWhere((element) { - return selectedDevices.contains(element.hwid); - }); - selectedDevices.clear(); - } - }); -} - -void manageTrustedDeviceDialog() async { - RxList trustedDevices = (await TrustedDevice.get()).obs; - RxList selectedDevices = RxList.empty(); - gFFI.dialogManager.show((setState, close, context) { - return CustomAlertDialog( - title: Text(translate("Manage trusted devices")), - content: trustedDevicesTable(trustedDevices, selectedDevices), - actions: [ - Obx(() => dialogButton(translate("Delete"), - onPressed: selectedDevices.isEmpty - ? null - : () { - confrimDeleteTrustedDevicesDialog( - trustedDevices, - selectedDevices, - ); - }, - isOutline: false) - .marginOnly(top: 12)), - dialogButton(translate("Close"), onPressed: close, isOutline: true) - .marginOnly(top: 12), - ], - onCancel: close, - ); - }); -} - -class TrustedDevice { - late final Uint8List hwid; - late final int time; - late final String id; - late final String name; - late final String platform; - - TrustedDevice.fromJson(Map json) { - final hwidList = json['hwid'] as List; - hwid = Uint8List.fromList(hwidList.cast()); - time = json['time']; - id = json['id']; - name = json['name']; - platform = json['platform']; - } - - String daysRemaining() { - final expiry = time + 90 * 24 * 60 * 60 * 1000; - final remaining = expiry - DateTime.now().millisecondsSinceEpoch; - if (remaining < 0) { - return '0'; - } - return (remaining / (24 * 60 * 60 * 1000)).toStringAsFixed(0); - } - - static Future> get() async { - final List devices = List.empty(growable: true); - try { - final devicesJson = await bind.mainGetTrustedDevices(); - if (devicesJson.isNotEmpty) { - final devicesList = json.decode(devicesJson); - if (devicesList is List) { - for (var device in devicesList) { - devices.add(TrustedDevice.fromJson(device)); - } - } - } - } catch (e) { - print(e.toString()); - } - devices.sort((a, b) => b.time.compareTo(a.time)); - return devices; - } -} - -Widget trustedDevicesTable( - RxList devices, RxList selectedDevices) { - RxBool selectAll = false.obs; - setSelectAll() { - if (selectedDevices.isNotEmpty && - selectedDevices.length == devices.length) { - selectAll.value = true; - } else { - selectAll.value = false; - } - } - - devices.listen((_) { - setSelectAll(); - }); - selectedDevices.listen((_) { - setSelectAll(); - }); - return FittedBox( - child: Obx(() => DataTable( - columns: [ - DataColumn( - label: Checkbox( - value: selectAll.value, - onChanged: (value) { - if (value == true) { - selectedDevices.clear(); - selectedDevices.addAll(devices.map((e) => e.hwid)); - } else { - selectedDevices.clear(); - } - }, - )), - DataColumn(label: Text(translate('Platform'))), - DataColumn(label: Text(translate('ID'))), - DataColumn(label: Text(translate('Username'))), - DataColumn(label: Text(translate('Days remaining'))), - ], - rows: devices.map((device) { - return DataRow(cells: [ - DataCell(Checkbox( - value: selectedDevices.contains(device.hwid), - onChanged: (value) { - if (value == null) return; - if (value) { - selectedDevices.remove(device.hwid); - selectedDevices.add(device.hwid); - } else { - selectedDevices.remove(device.hwid); - } - }, - )), - DataCell(Text(device.platform)), - DataCell(Text(device.id)), - DataCell(Text(device.name)), - DataCell(Text(device.daysRemaining())), - ]); - }).toList(), - )), - ); -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/gestures.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/gestures.dart deleted file mode 100644 index 0501ca4..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/gestures.dart +++ /dev/null @@ -1,797 +0,0 @@ -import 'dart:async'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_hbb/common/widgets/remote_input.dart'; - -enum GestureState { - none, - oneFingerPan, - twoFingerScale, - threeFingerVerticalDrag -} - -class CustomTouchGestureRecognizer extends ScaleGestureRecognizer { - CustomTouchGestureRecognizer({ - Object? debugOwner, - Set? supportedDevices, - }) : super( - debugOwner: debugOwner, - supportedDevices: supportedDevices, - ) { - _init(); - } - - // oneFingerPan - GestureDragStartCallback? onOneFingerPanStart; - GestureDragUpdateCallback? onOneFingerPanUpdate; - GestureDragEndCallback? onOneFingerPanEnd; - GestureDragCancelCallback? onOneFingerPanCancel; - - // twoFingerScale : scale + pan event - GestureScaleStartCallback? onTwoFingerScaleStart; - GestureScaleUpdateCallback? onTwoFingerScaleUpdate; - GestureScaleEndCallback? onTwoFingerScaleEnd; - - // threeFingerVerticalDrag - GestureDragStartCallback? onThreeFingerVerticalDragStart; - GestureDragUpdateCallback? onThreeFingerVerticalDragUpdate; - GestureDragEndCallback? onThreeFingerVerticalDragEnd; - - var _currentState = GestureState.none; - Timer? _debounceTimer; - - void _init() { - debugPrint("CustomTouchGestureRecognizer init"); - // onStart = (d) {}; - onUpdate = (d) { - _debounceTimer?.cancel(); - if (d.pointerCount == 1 && _currentState != GestureState.oneFingerPan) { - onOneFingerStartDebounce(d); - } else if (d.pointerCount == 2 && - _currentState != GestureState.twoFingerScale) { - onTwoFingerStartDebounce(d); - } else if (d.pointerCount == 3 && - _currentState != GestureState.threeFingerVerticalDrag) { - _currentState = GestureState.threeFingerVerticalDrag; - if (onThreeFingerVerticalDragStart != null) { - onThreeFingerVerticalDragStart!( - DragStartDetails(globalPosition: d.localFocalPoint)); - } - debugPrint("start threeFingerScale"); - } - if (_currentState != GestureState.none) { - switch (_currentState) { - case GestureState.oneFingerPan: - if (onOneFingerPanUpdate != null) { - onOneFingerPanUpdate!(_getDragUpdateDetails(d)); - } - break; - case GestureState.twoFingerScale: - if (onTwoFingerScaleUpdate != null) { - onTwoFingerScaleUpdate!(d); - } - break; - case GestureState.threeFingerVerticalDrag: - if (onThreeFingerVerticalDragUpdate != null) { - onThreeFingerVerticalDragUpdate!(_getDragUpdateDetails(d)); - } - break; - default: - break; - } - return; - } - }; - onEnd = (d) { - debugPrint("ScaleGestureRecognizer onEnd"); - _debounceTimer?.cancel(); - // end - switch (_currentState) { - case GestureState.oneFingerPan: - debugPrint("OneFingerState.pan onEnd"); - if (onOneFingerPanEnd != null) { - onOneFingerPanEnd!(_getDragEndDetails(d)); - } - break; - case GestureState.twoFingerScale: - debugPrint("TwoFingerState.scale onEnd"); - if (onTwoFingerScaleEnd != null) { - onTwoFingerScaleEnd!(d); - } - if (isSpecialHoldDragActive) { - // If we are in special drag mode, we need to reset the state. - // Otherwise, the next `onTwoFingerScaleUpdate()` will handle a wrong `focalPoint`. - _currentState = GestureState.none; - return; - } - break; - case GestureState.threeFingerVerticalDrag: - debugPrint("ThreeFingerState.vertical onEnd"); - if (onThreeFingerVerticalDragEnd != null) { - onThreeFingerVerticalDragEnd!(_getDragEndDetails(d)); - } - break; - default: - break; - } - _debounceTimer = Timer(Duration(milliseconds: 200), () { - _currentState = GestureState.none; - }); - }; - } - - // FIXME: This debounce logic is not working properly. - // If we move our finger very fast, we won't be able to detect the "oneFingerPan" event sometimes. - void onOneFingerStartDebounce(ScaleUpdateDetails d) { - start(ScaleUpdateDetails d) { - _currentState = GestureState.oneFingerPan; - if (onOneFingerPanStart != null) { - onOneFingerPanStart!(DragStartDetails( - localPosition: d.localFocalPoint, globalPosition: d.focalPoint)); - } - } - - if (_currentState != GestureState.none) { - _debounceTimer = Timer(Duration(milliseconds: 200), () { - start(d); - debugPrint("debounce start oneFingerPan"); - }); - } else { - start(d); - debugPrint("start oneFingerPan"); - } - } - - void onTwoFingerStartDebounce(ScaleUpdateDetails d) { - start(ScaleUpdateDetails d) { - _currentState = GestureState.twoFingerScale; - if (onTwoFingerScaleStart != null) { - onTwoFingerScaleStart!(ScaleStartDetails( - localFocalPoint: d.localFocalPoint, focalPoint: d.focalPoint)); - } - } - - if (_currentState == GestureState.threeFingerVerticalDrag) { - _debounceTimer = Timer(Duration(milliseconds: 200), () { - start(d); - debugPrint("debounce start twoFingerScale"); - }); - } else { - start(d); - debugPrint("start twoFingerScale"); - } - } - - DragUpdateDetails _getDragUpdateDetails(ScaleUpdateDetails d) => - DragUpdateDetails( - globalPosition: d.focalPoint, - localPosition: d.localFocalPoint, - delta: d.focalPointDelta); - - DragEndDetails _getDragEndDetails(ScaleEndDetails d) => - DragEndDetails(velocity: d.velocity); - - @override - void rejectGesture(int pointer) { - super.rejectGesture(pointer); - switch (_currentState) { - case GestureState.oneFingerPan: - if (onOneFingerPanCancel != null) { - onOneFingerPanCancel!(); - } - break; - case GestureState.twoFingerScale: - // Reset scale state if needed, currently self-contained - break; - case GestureState.threeFingerVerticalDrag: - // Reset drag state if needed, currently self-contained - break; - default: - break; - } - _currentState = GestureState.none; - } -} - -class HoldTapMoveGestureRecognizer extends GestureRecognizer { - HoldTapMoveGestureRecognizer({ - Object? debugOwner, - Set? supportedDevices, - }) : super( - debugOwner: debugOwner, - supportedDevices: supportedDevices, - ); - - GestureDragStartCallback? onHoldDragStart; - GestureDragUpdateCallback? onHoldDragUpdate; - GestureDragDownCallback? onHoldDragDown; - GestureDragCancelCallback? onHoldDragCancel; - GestureDragEndCallback? onHoldDragEnd; - - bool _isStart = false; - - Timer? _firstTapUpTimer; - Timer? _secondTapDownTimer; - _TapTracker? _firstTap; - _TapTracker? _secondTap; - - PointerDownEvent? _lastPointerDownEvent; - - final Map _trackers = {}; - - @override - bool isPointerAllowed(PointerDownEvent event) { - if (_firstTap == null) { - switch (event.buttons) { - case kPrimaryButton: - if (onHoldDragStart == null && - onHoldDragUpdate == null && - onHoldDragCancel == null && - onHoldDragEnd == null) { - return false; - } - break; - default: - return false; - } - } - return super.isPointerAllowed(event); - } - - @override - void addAllowedPointer(PointerDownEvent event) { - if (_firstTap != null) { - if (!_firstTap!.isWithinGlobalTolerance(event, kDoubleTapSlop)) { - // Ignore out-of-bounds second taps. - return; - } else if (!_firstTap!.hasElapsedMinTime() || - !_firstTap!.hasSameButton(event)) { - // Restart when the second tap is too close to the first (touch screens - // often detect touches intermittently), or when buttons mismatch. - _reset(); - return _trackTap(event); - } else if (onHoldDragDown != null) { - invokeCallback( - 'onHoldDragDown', - () => onHoldDragDown!(DragDownDetails( - globalPosition: event.position, - localPosition: event.localPosition))); - } - } - _trackTap(event); - } - - void _trackTap(PointerDownEvent event) { - _stopFirstTapUpTimer(); - _stopSecondTapDownTimer(); - final _TapTracker tracker = _TapTracker( - event: event, - entry: GestureBinding.instance.gestureArena.add(event.pointer, this), - doubleTapMinTime: kDoubleTapMinTime, - gestureSettings: gestureSettings, - ); - _trackers[event.pointer] = tracker; - _lastPointerDownEvent = event; - tracker.startTrackingPointer(_handleEvent, event.transform); - } - - void _handleEvent(PointerEvent event) { - final _TapTracker tracker = _trackers[event.pointer]!; - if (event is PointerUpEvent) { - if (_firstTap == null && _secondTap == null) { - _registerFirstTap(tracker); - } else if (_secondTap != null) { - if (event.pointer == _secondTap!.pointer) { - if (onHoldDragEnd != null) { - onHoldDragEnd!(DragEndDetails()); - _secondTap = null; - _isStart = false; - } - } - } else { - _reject(tracker); - } - } else if (event is PointerDownEvent) { - if (_firstTap != null && _secondTap == null) { - _registerSecondTap(tracker); - } - } else if (event is PointerMoveEvent) { - if (!tracker.isWithinGlobalTolerance(event, kDoubleTapTouchSlop)) { - if (_firstTap != null && _firstTap!.pointer == event.pointer) { - // first tap move - _reject(tracker); - } else if (_secondTap != null && _secondTap!.pointer == event.pointer) { - // debugPrint("_secondTap move"); - // second tap move - if (!_isStart) { - _resolve(); - } - if (onHoldDragUpdate != null) { - onHoldDragUpdate!(DragUpdateDetails( - globalPosition: event.position, - localPosition: event.localPosition, - delta: event.delta)); - } - } - } - } else if (event is PointerCancelEvent) { - _reject(tracker); - } - } - - @override - void acceptGesture(int pointer) {} - - @override - void rejectGesture(int pointer) { - _TapTracker? tracker = _trackers[pointer]; - // If tracker isn't in the list, check if this is the first tap tracker - if (tracker == null && _firstTap != null && _firstTap!.pointer == pointer) { - tracker = _firstTap; - } - // If tracker is still null, we rejected ourselves already - if (tracker != null) { - _reject(tracker); - } - } - - void _resolve() { - _stopSecondTapDownTimer(); - _firstTap?.entry.resolve(GestureDisposition.accepted); - _secondTap?.entry.resolve(GestureDisposition.accepted); - _isStart = true; - // TODO start details - if (onHoldDragStart != null) { - onHoldDragStart!(DragStartDetails( - kind: _lastPointerDownEvent?.kind, - )); - } - } - - void _reject(_TapTracker tracker) { - try { - _checkCancel(); - _isStart = false; - _trackers.remove(tracker.pointer); - tracker.entry.resolve(GestureDisposition.rejected); - _freezeTracker(tracker); - _reset(); - } catch (e) { - debugPrint("Failed to _reject:$e"); - } - } - - @override - void dispose() { - _reset(); - super.dispose(); - } - - void _reset() { - _isStart = false; - // debugPrint("reset"); - _stopFirstTapUpTimer(); - _stopSecondTapDownTimer(); - if (_firstTap != null) { - if (_trackers.isNotEmpty) { - _checkCancel(); - } - // Note, order is important below in order for the resolve -> reject logic - // to work properly. - final _TapTracker tracker = _firstTap!; - _firstTap = null; - _reject(tracker); - GestureBinding.instance.gestureArena.release(tracker.pointer); - - if (_secondTap != null) { - final _TapTracker tracker = _secondTap!; - _secondTap = null; - _reject(tracker); - GestureBinding.instance.gestureArena.release(tracker.pointer); - } - } - _firstTap = null; - _secondTap = null; - _clearTrackers(); - } - - void _registerFirstTap(_TapTracker tracker) { - _startFirstTapUpTimer(); - GestureBinding.instance.gestureArena.hold(tracker.pointer); - // Note, order is important below in order for the clear -> reject logic to - // work properly. - _freezeTracker(tracker); - _trackers.remove(tracker.pointer); - _firstTap = tracker; - } - - void _registerSecondTap(_TapTracker tracker) { - if (_firstTap != null) { - _stopFirstTapUpTimer(); - _freezeTracker(_firstTap!); - _firstTap = null; - } - - _startSecondTapDownTimer(); - GestureBinding.instance.gestureArena.hold(tracker.pointer); - - _secondTap = tracker; - - // TODO - } - - void _clearTrackers() { - _trackers.values.toList().forEach(_reject); - assert(_trackers.isEmpty); - } - - void _freezeTracker(_TapTracker tracker) { - tracker.stopTrackingPointer(_handleEvent); - } - - void _startFirstTapUpTimer() { - _firstTapUpTimer ??= Timer(kDoubleTapTimeout, _reset); - } - - void _startSecondTapDownTimer() { - _secondTapDownTimer ??= Timer(kDoubleTapTimeout, _resolve); - } - - void _stopFirstTapUpTimer() { - if (_firstTapUpTimer != null) { - _firstTapUpTimer!.cancel(); - _firstTapUpTimer = null; - } - } - - void _stopSecondTapDownTimer() { - if (_secondTapDownTimer != null) { - _secondTapDownTimer!.cancel(); - _secondTapDownTimer = null; - } - } - - void _checkCancel() { - if (onHoldDragCancel != null) { - invokeCallback('onHoldDragCancel', onHoldDragCancel!); - } - } - - @override - String get debugDescription => 'double tap'; -} - -class DoubleFinerTapGestureRecognizer extends GestureRecognizer { - DoubleFinerTapGestureRecognizer({ - Object? debugOwner, - Set? supportedDevices, - }) : super( - debugOwner: debugOwner, - supportedDevices: supportedDevices, - ); - - GestureTapDownCallback? onDoubleFinerTapDown; - GestureTapDownCallback? onDoubleFinerTap; - GestureTapCancelCallback? onDoubleFinerTapCancel; - - Timer? _firstTapTimer; - _TapTracker? _firstTap; - - PointerDownEvent? _lastPointerDownEvent; - - var _isStart = false; - - final Set _upTap = {}; - - final Map _trackers = {}; - - @override - bool isPointerAllowed(PointerDownEvent event) { - if (_firstTap == null) { - switch (event.buttons) { - case kPrimaryButton: - if (onDoubleFinerTapDown == null && - onDoubleFinerTap == null && - onDoubleFinerTapCancel == null) { - return false; - } - break; - default: - return false; - } - } - return super.isPointerAllowed(event); - } - - @override - void addAllowedPointer(PointerDownEvent event) { - debugPrint("addAllowedPointer"); - if (_isStart) { - // second - if (onDoubleFinerTapDown != null) { - final TapDownDetails details = TapDownDetails( - globalPosition: event.position, - localPosition: event.localPosition, - kind: getKindForPointer(event.pointer), - ); - invokeCallback( - 'onDoubleFinerTapDown', () => onDoubleFinerTapDown!(details)); - } - } else { - // first tap - _isStart = true; - _lastPointerDownEvent = event; - _startFirstTapDownTimer(); - } - _trackTap(event); - } - - void _trackTap(PointerDownEvent event) { - final _TapTracker tracker = _TapTracker( - event: event, - entry: GestureBinding.instance.gestureArena.add(event.pointer, this), - doubleTapMinTime: kDoubleTapMinTime, - gestureSettings: gestureSettings, - ); - _trackers[event.pointer] = tracker; - // debugPrint("_trackers:$_trackers"); - tracker.startTrackingPointer(_handleEvent, event.transform); - - _registerTap(tracker); - } - - void _handleEvent(PointerEvent event) { - final _TapTracker tracker = _trackers[event.pointer]!; - if (event is PointerUpEvent) { - debugPrint("PointerUpEvent"); - _upTap.add(tracker.pointer); - } else if (event is PointerMoveEvent) { - if (!tracker.isWithinGlobalTolerance(event, kDoubleTapTouchSlop)) { - _reject(tracker); - } - } else if (event is PointerCancelEvent) { - _reject(tracker); - } - } - - @override - void acceptGesture(int pointer) {} - - @override - void rejectGesture(int pointer) { - _TapTracker? tracker = _trackers[pointer]; - // If tracker isn't in the list, check if this is the first tap tracker - if (tracker == null && _firstTap != null && _firstTap!.pointer == pointer) { - tracker = _firstTap; - } - // If tracker is still null, we rejected ourselves already - if (tracker != null) { - _reject(tracker); - } - } - - void _reject(_TapTracker tracker) { - _trackers.remove(tracker.pointer); - tracker.entry.resolve(GestureDisposition.rejected); - _freezeTracker(tracker); - if (_firstTap != null) { - if (tracker == _firstTap) { - _reset(); - } else { - _checkCancel(); - if (_trackers.isEmpty) { - _reset(); - } - } - } - } - - @override - void dispose() { - _reset(); - super.dispose(); - } - - void _reset() { - _stopFirstTapUpTimer(); - _firstTap = null; - _clearTrackers(); - } - - void _registerTap(_TapTracker tracker) { - GestureBinding.instance.gestureArena.hold(tracker.pointer); - // Note, order is important below in order for the clear -> reject logic to - // work properly. - } - - void _clearTrackers() { - _trackers.values.toList().forEach(_reject); - assert(_trackers.isEmpty); - } - - void _freezeTracker(_TapTracker tracker) { - tracker.stopTrackingPointer(_handleEvent); - } - - void _startFirstTapDownTimer() { - _firstTapTimer ??= Timer(kDoubleTapTimeout, _timeoutCheck); - } - - void _stopFirstTapUpTimer() { - if (_firstTapTimer != null) { - _firstTapTimer!.cancel(); - _firstTapTimer = null; - } - } - - void _timeoutCheck() { - _isStart = false; - if (_upTap.length == 2) { - _resolve(); - } else { - _reset(); - } - _upTap.clear(); - } - - void _resolve() { - // TODO tap down details - if (onDoubleFinerTap != null) { - onDoubleFinerTap!(TapDownDetails( - kind: _lastPointerDownEvent?.kind, - )); - } - _trackers.forEach((key, value) { - value.entry.resolve(GestureDisposition.accepted); - }); - _reset(); - } - - void _checkCancel() { - if (onDoubleFinerTapCancel != null) { - invokeCallback('onHoldDragCancel', onDoubleFinerTapCancel!); - } - } - - @override - String get debugDescription => 'double tap'; -} - -/// TapTracker helps track individual tap sequences as part of a -/// larger gesture. -class _TapTracker { - _TapTracker({ - required PointerDownEvent event, - required this.entry, - required Duration doubleTapMinTime, - required this.gestureSettings, - }) : pointer = event.pointer, - _initialGlobalPosition = event.position, - initialButtons = event.buttons, - _doubleTapMinTimeCountdown = - _CountdownZoned(duration: doubleTapMinTime); - - final DeviceGestureSettings? gestureSettings; - final int pointer; - final GestureArenaEntry entry; - final Offset _initialGlobalPosition; - final int initialButtons; - final _CountdownZoned _doubleTapMinTimeCountdown; - - bool _isTrackingPointer = false; - - void startTrackingPointer(PointerRoute route, Matrix4? transform) { - if (!_isTrackingPointer) { - _isTrackingPointer = true; - GestureBinding.instance.pointerRouter.addRoute(pointer, route, transform); - } - } - - void stopTrackingPointer(PointerRoute route) { - if (_isTrackingPointer) { - _isTrackingPointer = false; - GestureBinding.instance.pointerRouter.removeRoute(pointer, route); - } - } - - bool isWithinGlobalTolerance(PointerEvent event, double tolerance) { - final Offset offset = event.position - _initialGlobalPosition; - return offset.distance <= tolerance; - } - - bool hasElapsedMinTime() { - return _doubleTapMinTimeCountdown.timeout; - } - - bool hasSameButton(PointerDownEvent event) { - return event.buttons == initialButtons; - } -} - -/// CountdownZoned tracks whether the specified duration has elapsed since -/// creation, honoring [Zone]. -class _CountdownZoned { - _CountdownZoned({required Duration duration}) { - Timer(duration, _onTimeout); - } - - bool _timeout = false; - - bool get timeout => _timeout; - - void _onTimeout() { - _timeout = true; - } -} - -RawGestureDetector getMixinGestureDetector({ - Widget? child, - GestureTapUpCallback? onTapUp, - GestureTapDownCallback? onDoubleTapDown, - GestureDoubleTapCallback? onDoubleTap, - GestureLongPressDownCallback? onLongPressDown, - GestureLongPressCallback? onLongPress, - GestureDragStartCallback? onHoldDragStart, - GestureDragUpdateCallback? onHoldDragUpdate, - GestureDragCancelCallback? onHoldDragCancel, - GestureDragEndCallback? onHoldDragEnd, - GestureTapDownCallback? onDoubleFinerTap, - GestureDragStartCallback? onOneFingerPanStart, - GestureDragUpdateCallback? onOneFingerPanUpdate, - GestureDragEndCallback? onOneFingerPanEnd, - GestureDragCancelCallback? onOneFingerPanCancel, - GestureScaleUpdateCallback? onTwoFingerScaleUpdate, - GestureScaleEndCallback? onTwoFingerScaleEnd, - GestureDragUpdateCallback? onThreeFingerVerticalDragUpdate, -}) { - return RawGestureDetector( - child: child, - gestures: { - // Official - TapGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => TapGestureRecognizer(), (instance) { - instance.onTapUp = onTapUp; - }), - DoubleTapGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => DoubleTapGestureRecognizer(), (instance) { - instance - ..onDoubleTapDown = onDoubleTapDown - ..onDoubleTap = onDoubleTap; - }), - LongPressGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => LongPressGestureRecognizer(), (instance) { - instance - ..onLongPressDown = onLongPressDown - ..onLongPress = onLongPress; - }), - // Customized - HoldTapMoveGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => HoldTapMoveGestureRecognizer(), - (instance) => instance - ..onHoldDragStart = onHoldDragStart - ..onHoldDragUpdate = onHoldDragUpdate - ..onHoldDragCancel = onHoldDragCancel - ..onHoldDragEnd = onHoldDragEnd), - DoubleFinerTapGestureRecognizer: GestureRecognizerFactoryWithHandlers< - DoubleFinerTapGestureRecognizer>( - () => DoubleFinerTapGestureRecognizer(), (instance) { - instance.onDoubleFinerTap = onDoubleFinerTap; - }), - CustomTouchGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => CustomTouchGestureRecognizer(), (instance) { - instance - ..onOneFingerPanStart = onOneFingerPanStart - ..onOneFingerPanUpdate = onOneFingerPanUpdate - ..onOneFingerPanEnd = onOneFingerPanEnd - ..onOneFingerPanCancel = onOneFingerPanCancel - ..onTwoFingerScaleUpdate = onTwoFingerScaleUpdate - ..onTwoFingerScaleEnd = onTwoFingerScaleEnd - ..onThreeFingerVerticalDragUpdate = onThreeFingerVerticalDragUpdate; - }), - }); -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/login.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/login.dart deleted file mode 100644 index 62ade8e..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/login.dart +++ /dev/null @@ -1,751 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common/hbbs/hbbs.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:flutter_hbb/models/user_model.dart'; -import 'package:get/get.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../../common.dart'; -import './dialog.dart'; - -const kOpSvgList = [ - 'github', - 'gitlab', - 'google', - 'apple', - 'okta', - 'facebook', - 'azure', - 'auth0' -]; - -class _IconOP extends StatelessWidget { - final String op; - final String? icon; - final EdgeInsets margin; - const _IconOP( - {Key? key, - required this.op, - required this.icon, - this.margin = const EdgeInsets.symmetric(horizontal: 4.0)}) - : super(key: key); - - @override - Widget build(BuildContext context) { - final svgFile = - kOpSvgList.contains(op.toLowerCase()) ? op.toLowerCase() : 'default'; - return Container( - margin: margin, - child: icon == null - ? SvgPicture.asset( - 'assets/auth-$svgFile.svg', - width: 20, - ) - : SvgPicture.string( - icon!, - width: 20, - ), - ); - } -} - -class ButtonOP extends StatelessWidget { - final String op; - final RxString curOP; - final String? icon; - final Color primaryColor; - final double height; - final Function() onTap; - - const ButtonOP({ - Key? key, - required this.op, - required this.curOP, - required this.icon, - required this.primaryColor, - required this.height, - required this.onTap, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - final opLabel = { - 'github': 'GitHub', - 'gitlab': 'GitLab' - }[op.toLowerCase()] ?? - toCapitalized(op); - return Row(children: [ - Container( - height: height, - width: 200, - child: Obx(() => ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: curOP.value.isEmpty || curOP.value == op - ? primaryColor - : Colors.grey, - ).copyWith(elevation: ButtonStyleButton.allOrNull(0.0)), - onPressed: curOP.value.isEmpty || curOP.value == op ? onTap : null, - child: Row( - children: [ - SizedBox( - width: 30, - child: _IconOP( - op: op, - icon: icon, - margin: EdgeInsets.only(right: 5), - ), - ), - Expanded( - child: FittedBox( - fit: BoxFit.scaleDown, - child: Center( - child: Text(translate("Continue with {$opLabel}"))), - ), - ), - ], - ))), - ), - ]); - } -} - -class ConfigOP { - final String op; - final String? icon; - ConfigOP({required this.op, required this.icon}); -} - -class WidgetOP extends StatefulWidget { - final ConfigOP config; - final RxString curOP; - final Function(Map) cbLogin; - const WidgetOP({ - Key? key, - required this.config, - required this.curOP, - required this.cbLogin, - }) : super(key: key); - - @override - State createState() { - return _WidgetOPState(); - } -} - -class _WidgetOPState extends State { - Timer? _updateTimer; - String _stateMsg = ''; - String _failedMsg = ''; - String _url = ''; - - @override - void dispose() { - super.dispose(); - _updateTimer?.cancel(); - } - - _beginQueryState() { - _updateTimer = Timer.periodic(Duration(seconds: 1), (timer) { - _updateState(); - }); - } - - _updateState() { - bind.mainAccountAuthResult().then((result) { - if (result.isEmpty) { - return; - } - final resultMap = jsonDecode(result); - if (resultMap == null) { - return; - } - final String stateMsg = resultMap['state_msg']; - String failedMsg = resultMap['failed_msg']; - final String? url = resultMap['url']; - final bool urlLaunched = (resultMap['url_launched'] as bool?) ?? false; - final authBody = resultMap['auth_body']; - if (_stateMsg != stateMsg || _failedMsg != failedMsg) { - if (_url.isEmpty && url != null && url.isNotEmpty) { - if (!urlLaunched) { - launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication); - } - _url = url; - } - if (authBody != null) { - _updateTimer?.cancel(); - widget.curOP.value = ''; - widget.cbLogin(authBody as Map); - } - - setState(() { - _stateMsg = stateMsg; - _failedMsg = failedMsg; - if (failedMsg.isNotEmpty) { - widget.curOP.value = ''; - _updateTimer?.cancel(); - } - }); - } - }); - } - - _resetState() { - _stateMsg = ''; - _failedMsg = ''; - _url = ''; - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - ButtonOP( - op: widget.config.op, - curOP: widget.curOP, - icon: widget.config.icon, - primaryColor: str2color(widget.config.op, 0x7f), - height: 36, - onTap: () async { - _resetState(); - widget.curOP.value = widget.config.op; - await bind.mainAccountAuth(op: widget.config.op, rememberMe: true); - _beginQueryState(); - }, - ), - Obx(() { - if (widget.curOP.isNotEmpty && - widget.curOP.value != widget.config.op) { - _failedMsg = ''; - } - return Offstage( - offstage: - _failedMsg.isEmpty && widget.curOP.value != widget.config.op, - child: RichText( - text: TextSpan( - text: '$_stateMsg ', - style: - DefaultTextStyle.of(context).style.copyWith(fontSize: 12), - children: [ - TextSpan( - text: _failedMsg, - style: DefaultTextStyle.of(context).style.copyWith( - fontSize: 14, - color: Colors.red, - ), - ), - ], - ), - ), - ); - }), - Obx( - () => Offstage( - offstage: widget.curOP.value != widget.config.op, - child: const SizedBox( - height: 5.0, - ), - ), - ), - Obx( - () => Offstage( - offstage: widget.curOP.value != widget.config.op, - child: ConstrainedBox( - constraints: BoxConstraints(maxHeight: 20), - child: ElevatedButton( - onPressed: () { - widget.curOP.value = ''; - _updateTimer?.cancel(); - _resetState(); - bind.mainAccountAuthCancel(); - }, - child: Text( - translate('Cancel'), - style: TextStyle(fontSize: 15), - ), - ), - ), - ), - ), - ], - ); - } -} - -class LoginWidgetOP extends StatelessWidget { - final List ops; - final RxString curOP; - final Function(Map) cbLogin; - - LoginWidgetOP({ - Key? key, - required this.ops, - required this.curOP, - required this.cbLogin, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - var children = ops - .map((op) => [ - WidgetOP( - config: op, - curOP: curOP, - cbLogin: cbLogin, - ), - const Divider( - indent: 5, - endIndent: 5, - ) - ]) - .expand((i) => i) - .toList(); - if (children.isNotEmpty) { - children.removeLast(); - } - return SingleChildScrollView( - child: Container( - width: 200, - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: children, - ))); - } -} - -class LoginWidgetUserPass extends StatelessWidget { - final TextEditingController username; - final TextEditingController pass; - final String? usernameMsg; - final String? passMsg; - final bool isInProgress; - final RxString curOP; - final Function() onLogin; - final FocusNode? userFocusNode; - const LoginWidgetUserPass({ - Key? key, - this.userFocusNode, - required this.username, - required this.pass, - required this.usernameMsg, - required this.passMsg, - required this.isInProgress, - required this.curOP, - required this.onLogin, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Padding( - padding: EdgeInsets.all(0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const SizedBox(height: 8.0), - DialogTextField( - title: translate(DialogTextField.kUsernameTitle), - controller: username, - focusNode: userFocusNode, - prefixIcon: DialogTextField.kUsernameIcon, - errorText: usernameMsg), - PasswordWidget( - controller: pass, - autoFocus: false, - reRequestFocus: true, - errorText: passMsg, - ), - // NOT use Offstage to wrap LinearProgressIndicator - if (isInProgress) const LinearProgressIndicator(), - const SizedBox(height: 12.0), - FittedBox( - child: - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - Container( - height: 38, - width: 200, - child: Obx(() => ElevatedButton( - child: Text( - translate('Login'), - style: TextStyle(fontSize: 16), - ), - onPressed: - curOP.value.isEmpty || curOP.value == 'rustdesk' - ? () { - onLogin(); - } - : null, - )), - ), - ])), - ], - )); - } -} - -const kAuthReqTypeOidc = 'oidc/'; - -// call this directly -Future loginDialog() async { - var username = - TextEditingController(text: UserModel.getLocalUserInfo()?['name'] ?? ''); - var password = TextEditingController(); - final userFocusNode = FocusNode()..requestFocus(); - Timer(Duration(milliseconds: 100), () => userFocusNode..requestFocus()); - - String? usernameMsg; - String? passwordMsg; - var isInProgress = false; - final RxString curOP = ''.obs; - // Track hover state for the close icon - bool isCloseHovered = false; - - final loginOptions = [].obs; - Future.delayed(Duration.zero, () async { - loginOptions.value = await UserModel.queryOidcLoginOptions(); - }); - - final res = await gFFI.dialogManager.show((setState, close, context) { - username.addListener(() { - if (usernameMsg != null) { - setState(() => usernameMsg = null); - } - }); - - password.addListener(() { - if (passwordMsg != null) { - setState(() => passwordMsg = null); - } - }); - - onDialogCancel() { - isInProgress = false; - close(false); - } - - handleLoginResponse(LoginResponse resp, bool storeIfAccessToken, - void Function([dynamic])? close) async { - switch (resp.type) { - case HttpType.kAuthResTypeToken: - if (resp.access_token != null) { - if (storeIfAccessToken) { - await bind.mainSetLocalOption( - key: 'access_token', value: resp.access_token!); - await bind.mainSetLocalOption( - key: 'user_info', value: jsonEncode(resp.user ?? {})); - } - if (close != null) { - close(true); - } - return; - } - break; - case HttpType.kAuthResTypeEmailCheck: - bool? isEmailVerification; - if (resp.tfa_type == null || - resp.tfa_type == HttpType.kAuthResTypeEmailCheck) { - isEmailVerification = true; - } else if (resp.tfa_type == HttpType.kAuthResTypeTfaCheck) { - isEmailVerification = false; - } else { - passwordMsg = "Failed, bad tfa type from server"; - } - if (isEmailVerification != null) { - if (isMobile) { - if (close != null) close(null); - verificationCodeDialog( - resp.user, resp.secret, isEmailVerification); - } else { - setState(() => isInProgress = false); - // Workaround for web, close the dialog first, then show the verification code dialog. - // Otherwise, the text field will keep selecting the text and we can't input the code. - // Not sure why this happens. - if (isWeb && close != null) close(null); - final res = await verificationCodeDialog( - resp.user, resp.secret, isEmailVerification); - if (res == true) { - if (!isWeb && close != null) close(false); - return; - } - } - } - break; - default: - passwordMsg = "Failed, bad response from server"; - break; - } - } - - onLogin() async { - // validate - if (username.text.isEmpty) { - setState(() => usernameMsg = translate('Username missed')); - return; - } - if (password.text.isEmpty) { - setState(() => passwordMsg = translate('Password missed')); - return; - } - curOP.value = 'rustdesk'; - setState(() => isInProgress = true); - try { - final resp = await gFFI.userModel.login(LoginRequest( - username: username.text, - password: password.text, - id: await bind.mainGetMyId(), - uuid: await bind.mainGetUuid(), - autoLogin: true, - type: HttpType.kAuthReqTypeAccount)); - await handleLoginResponse(resp, true, close); - } on RequestException catch (err) { - passwordMsg = translate(err.cause); - } catch (err) { - passwordMsg = "Unknown Error: $err"; - } - curOP.value = ''; - setState(() => isInProgress = false); - } - - thirdAuthWidget() => Obx(() { - return Offstage( - offstage: loginOptions.isEmpty, - child: Column( - children: [ - const SizedBox( - height: 8.0, - ), - Center( - child: Text( - translate('or'), - style: TextStyle(fontSize: 16), - )), - const SizedBox( - height: 8.0, - ), - LoginWidgetOP( - ops: loginOptions - .map((e) => ConfigOP(op: e['name'], icon: e['icon'])) - .toList(), - curOP: curOP, - cbLogin: (Map authBody) async { - LoginResponse? resp; - try { - // access_token is already stored in the rust side. - resp = - gFFI.userModel.getLoginResponseFromAuthBody(authBody); - } catch (e) { - debugPrint( - 'Failed to parse oidc login body: "$authBody"'); - } - close(true); - - if (resp != null) { - handleLoginResponse(resp, false, null); - } - }, - ), - ], - ), - ); - }); - - final title = Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - translate('Login'), - ).marginOnly(top: MyTheme.dialogPadding), - MouseRegion( - onEnter: (_) => setState(() => isCloseHovered = true), - onExit: (_) => setState(() => isCloseHovered = false), - child: InkWell( - child: Icon( - Icons.close, - size: 25, - // No need to handle the branch of null. - // Because we can ensure the color is not null when debug. - color: isCloseHovered - ? Colors.white - : Theme.of(context) - .textTheme - .titleLarge - ?.color - ?.withOpacity(0.55), - ), - onTap: onDialogCancel, - hoverColor: Colors.red, - borderRadius: BorderRadius.circular(5), - ), - ).marginOnly(top: 10, right: 15), - ], - ); - final titlePadding = EdgeInsets.fromLTRB(MyTheme.dialogPadding, 0, 0, 0); - - return CustomAlertDialog( - title: title, - titlePadding: titlePadding, - contentBoxConstraints: BoxConstraints(minWidth: 400), - content: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const SizedBox( - height: 8.0, - ), - LoginWidgetUserPass( - username: username, - pass: password, - usernameMsg: usernameMsg, - passMsg: passwordMsg, - isInProgress: isInProgress, - curOP: curOP, - onLogin: onLogin, - userFocusNode: userFocusNode, - ), - thirdAuthWidget(), - ], - ), - onCancel: onDialogCancel, - onSubmit: onLogin, - ); - }); - - if (res != null) { - await UserModel.updateOtherModels(); - } - - return res; -} - -Future verificationCodeDialog( - UserPayload? user, String? secret, bool isEmailVerification) async { - var autoLogin = true; - var isInProgress = false; - String? errorText; - - final code = TextEditingController(); - - final res = await gFFI.dialogManager.show((setState, close, context) { - void onVerify() async { - setState(() => isInProgress = true); - - try { - final resp = await gFFI.userModel.login(LoginRequest( - verificationCode: code.text, - tfaCode: isEmailVerification ? null : code.text, - secret: secret, - username: user?.name, - id: await bind.mainGetMyId(), - uuid: await bind.mainGetUuid(), - autoLogin: autoLogin, - type: HttpType.kAuthReqTypeEmailCode)); - - switch (resp.type) { - case HttpType.kAuthResTypeToken: - if (resp.access_token != null) { - await bind.mainSetLocalOption( - key: 'access_token', value: resp.access_token!); - close(true); - return; - } - break; - default: - errorText = "Failed, bad response from server"; - break; - } - } on RequestException catch (err) { - errorText = translate(err.cause); - } catch (err) { - errorText = "Unknown Error: $err"; - } - - setState(() => isInProgress = false); - } - - final codeField = isEmailVerification - ? DialogEmailCodeField( - controller: code, - errorText: errorText, - readyCallback: onVerify, - onChanged: () => errorText = null, - ) - : Dialog2FaField( - controller: code, - errorText: errorText, - readyCallback: onVerify, - onChanged: () => errorText = null, - ); - - getOnSubmit() => codeField.isReady ? onVerify : null; - - return CustomAlertDialog( - title: Text(translate("Verification code")), - contentBoxConstraints: BoxConstraints(maxWidth: 300), - content: Column( - children: [ - Offstage( - offstage: !isEmailVerification || user?.email == null, - child: TextField( - decoration: InputDecoration( - labelText: "Email", prefixIcon: Icon(Icons.email)), - readOnly: true, - controller: TextEditingController(text: user?.email), - ).workaroundFreezeLinuxMint()), - isEmailVerification ? const SizedBox(height: 8) : const Offstage(), - codeField, - /* - CheckboxListTile( - contentPadding: const EdgeInsets.all(0), - dense: true, - controlAffinity: ListTileControlAffinity.leading, - title: Row(children: [ - Expanded(child: Text(translate("Trust this device"))) - ]), - value: trustThisDevice, - onChanged: (v) { - if (v == null) return; - setState(() => trustThisDevice = !trustThisDevice); - }, - ), - */ - // NOT use Offstage to wrap LinearProgressIndicator - if (isInProgress) const LinearProgressIndicator(), - ], - ), - onCancel: close, - onSubmit: getOnSubmit(), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - dialogButton("Verify", onPressed: getOnSubmit()), - ]); - }); - // For verification code, desktop update other models in login dialog, mobile need to close login dialog first, - // otherwise the soft keyboard will jump out on each key press, so mobile update in verification code dialog. - if (isMobile && res == true) { - await UserModel.updateOtherModels(); - } - - return res; -} - -void logOutConfirmDialog() { - gFFI.dialogManager.show((setState, close, context) { - submit() { - close(); - gFFI.userModel.logOut(); - } - - return CustomAlertDialog( - content: Text(translate("logout_tip")), - actions: [ - dialogButton(translate("Cancel"), onPressed: close, isOutline: true), - dialogButton(translate("OK"), onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/my_group.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/my_group.dart deleted file mode 100644 index 74ce34e..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/my_group.dart +++ /dev/null @@ -1,309 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common/hbbs/hbbs.dart'; -import 'package:flutter_hbb/common/widgets/login.dart'; -import 'package:flutter_hbb/common/widgets/peers_view.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:get/get.dart'; - -import '../../common.dart'; - -class MyGroup extends StatefulWidget { - final EdgeInsets? menuPadding; - const MyGroup({Key? key, this.menuPadding}) : super(key: key); - - @override - State createState() { - return _MyGroupState(); - } -} - -class _MyGroupState extends State { - RxBool get isSelectedDeviceGroup => gFFI.groupModel.isSelectedDeviceGroup; - RxString get selectedAccessibleItemName => - gFFI.groupModel.selectedAccessibleItemName; - RxString get searchAccessibleItemNameText => - gFFI.groupModel.searchAccessibleItemNameText; - static TextEditingController searchUserController = TextEditingController(); - - @override - Widget build(BuildContext context) { - return Obx(() { - if (!gFFI.userModel.isLogin) { - return Center( - child: ElevatedButton( - onPressed: loginDialog, child: Text(translate("Login")))); - } else if (gFFI.userModel.networkError.isNotEmpty) { - return netWorkErrorWidget(); - } else if (gFFI.groupModel.groupLoading.value && gFFI.groupModel.emtpy) { - return const Center( - child: CircularProgressIndicator(), - ); - } - return Column( - children: [ - buildErrorBanner(context, - loading: gFFI.groupModel.groupLoading, - err: gFFI.groupModel.groupLoadError, - retry: null, - close: () => gFFI.groupModel.groupLoadError.value = ''), - Expanded( - child: Obx(() => stateGlobal.isPortrait.isTrue - ? _buildPortrait() - : _buildLandscape())), - ], - ); - }); - } - - Widget _buildLandscape() { - return Row( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - border: - Border.all(color: Theme.of(context).colorScheme.background)), - child: Container( - width: 150, - height: double.infinity, - child: Column( - children: [ - _buildLeftHeader(), - Expanded( - child: Container( - width: double.infinity, - height: double.infinity, - child: _buildLeftList(), - ), - ) - ], - ), - ), - ).marginOnly(right: 12.0), - Expanded( - child: Align( - alignment: Alignment.topLeft, - child: MyGroupPeerView( - menuPadding: widget.menuPadding, - )), - ) - ], - ); - } - - Widget _buildPortrait() { - return Column( - children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(6), - border: - Border.all(color: Theme.of(context).colorScheme.background)), - child: Container( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - _buildLeftHeader(), - Container( - width: double.infinity, - child: _buildLeftList(), - ) - ], - ), - ), - ).marginOnly(bottom: 12.0), - Expanded( - child: Align( - alignment: Alignment.topLeft, - child: MyGroupPeerView( - menuPadding: widget.menuPadding, - )), - ) - ], - ); - } - - Widget _buildLeftHeader() { - final fontSize = 14.0; - return Row( - children: [ - Expanded( - child: TextField( - controller: searchUserController, - onChanged: (value) { - searchAccessibleItemNameText.value = value; - selectedAccessibleItemName.value = ''; - }, - textAlignVertical: TextAlignVertical.center, - style: TextStyle(fontSize: fontSize), - decoration: InputDecoration( - filled: false, - prefixIcon: Icon( - Icons.search_rounded, - color: Theme.of(context).hintColor, - ).paddingOnly(top: 2), - hintText: translate("Search"), - hintStyle: TextStyle(fontSize: fontSize), - border: InputBorder.none, - isDense: true, - ), - ).workaroundFreezeLinuxMint()), - ], - ); - } - - Widget _buildLeftList() { - return Obx(() { - final userItems = gFFI.groupModel.users.where((p0) { - if (searchAccessibleItemNameText.isNotEmpty) { - final search = searchAccessibleItemNameText.value.toLowerCase(); - return p0.name.toLowerCase().contains(search) || - p0.displayNameOrName.toLowerCase().contains(search); - } - return true; - }).toList(); - // Count occurrences of each displayNameOrName to detect duplicates - final displayNameCount = {}; - for (final u in userItems) { - final dn = u.displayNameOrName; - displayNameCount[dn] = (displayNameCount[dn] ?? 0) + 1; - } - final deviceGroupItems = gFFI.groupModel.deviceGroups.where((p0) { - if (searchAccessibleItemNameText.isNotEmpty) { - return p0.name - .toLowerCase() - .contains(searchAccessibleItemNameText.value.toLowerCase()); - } - return true; - }).toList(); - listView(bool isPortrait) => ListView.builder( - shrinkWrap: isPortrait, - itemCount: deviceGroupItems.length + userItems.length, - itemBuilder: (context, index) => index < deviceGroupItems.length - ? _buildDeviceGroupItem(deviceGroupItems[index]) - : _buildUserItem(userItems[index - deviceGroupItems.length], - displayNameCount)); - var maxHeight = max(MediaQuery.of(context).size.height / 6, 100.0); - return Obx(() => stateGlobal.isPortrait.isFalse - ? listView(false) - : LimitedBox(maxHeight: maxHeight, child: listView(true))); - }); - } - - Widget _buildUserItem(UserPayload user, Map displayNameCount) { - final username = user.name; - final dn = user.displayNameOrName; - final isDuplicate = (displayNameCount[dn] ?? 0) > 1; - final displayName = - isDuplicate && user.displayName.trim().isNotEmpty - ? '${user.displayName} (@$username)' - : dn; - return InkWell(onTap: () { - isSelectedDeviceGroup.value = false; - if (selectedAccessibleItemName.value != username) { - selectedAccessibleItemName.value = username; - } else { - selectedAccessibleItemName.value = ''; - } - }, child: Obx( - () { - bool selected = !isSelectedDeviceGroup.value && - selectedAccessibleItemName.value == username; - final isMe = username == gFFI.userModel.userName.value; - final colorMe = MyTheme.color(context).me!; - return Container( - decoration: BoxDecoration( - color: selected ? MyTheme.color(context).highlight : null, - border: Border( - bottom: BorderSide( - width: 0.7, - color: Theme.of(context).dividerColor.withOpacity(0.1))), - ), - child: Container( - child: Row( - children: [ - Container( - width: 20, - height: 20, - decoration: BoxDecoration( - color: str2color(username, 0xAF), - shape: BoxShape.circle, - ), - child: Align( - alignment: Alignment.center, - child: Center( - child: Text( - displayName.characters.first.toUpperCase(), - style: TextStyle(color: Colors.white), - textAlign: TextAlign.center, - ), - ), - ), - ).marginOnly(right: 4), - if (isMe) Flexible(child: Text(displayName)), - if (isMe) - Flexible( - child: Container( - margin: EdgeInsets.only(left: 5), - padding: EdgeInsets.symmetric(horizontal: 3, vertical: 1), - decoration: BoxDecoration( - color: colorMe.withAlpha(20), - borderRadius: BorderRadius.all(Radius.circular(2)), - border: Border.all(color: colorMe.withAlpha(100))), - child: Text( - translate('Me'), - style: TextStyle( - color: colorMe.withAlpha(200), fontSize: 12), - ), - ), - ), - if (!isMe) Expanded(child: Text(displayName)), - ], - ).paddingSymmetric(vertical: 4), - ), - ); - }, - )).marginSymmetric(horizontal: 12).marginOnly(bottom: 6); - } - - Widget _buildDeviceGroupItem(DeviceGroupPayload deviceGroup) { - final name = deviceGroup.name; - return InkWell(onTap: () { - isSelectedDeviceGroup.value = true; - if (selectedAccessibleItemName.value != name) { - selectedAccessibleItemName.value = name; - } else { - selectedAccessibleItemName.value = ''; - } - }, child: Obx( - () { - bool selected = isSelectedDeviceGroup.value && - selectedAccessibleItemName.value == name; - return Container( - decoration: BoxDecoration( - color: selected ? MyTheme.color(context).highlight : null, - border: Border( - bottom: BorderSide( - width: 0.7, - color: Theme.of(context).dividerColor.withOpacity(0.1))), - ), - child: Container( - child: Row( - children: [ - Container( - width: 20, - height: 20, - child: Icon(IconFont.deviceGroupOutline, - color: MyTheme.accent, size: 19), - ).marginOnly(right: 4), - Expanded(child: Text(name)), - ], - ).paddingSymmetric(vertical: 4), - ), - ); - }, - )).marginSymmetric(horizontal: 12).marginOnly(bottom: 6); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/overlay.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/overlay.dart deleted file mode 100644 index 3fb6361..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/overlay.dart +++ /dev/null @@ -1,674 +0,0 @@ -import 'package:auto_size_text/auto_size_text.dart'; -import 'package:debounce_throttle/debounce_throttle.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:get/get.dart'; -import 'package:provider/provider.dart'; - -import '../../consts.dart'; -import '../../desktop/widgets/tabbar_widget.dart'; -import '../../models/chat_model.dart'; -import '../../models/model.dart'; -import 'chat_page.dart'; - -class DraggableChatWindow extends StatelessWidget { - const DraggableChatWindow( - {Key? key, - this.position = Offset.zero, - required this.width, - required this.height, - required this.chatModel}) - : super(key: key); - - final Offset position; - final double width; - final double height; - final ChatModel chatModel; - - @override - Widget build(BuildContext context) { - if (draggablePositions.chatWindow.isInvalid()) { - draggablePositions.chatWindow.update(position); - } - return isIOS - ? IOSDraggable( - position: draggablePositions.chatWindow, - chatModel: chatModel, - width: width, - height: height, - builder: (context) { - return Column( - children: [ - _buildMobileAppBar(context), - Expanded( - child: ChatPage(chatModel: chatModel), - ), - ], - ); - }, - ) - : Draggable( - checkKeyboard: true, - checkScreenSize: true, - position: draggablePositions.chatWindow, - width: width, - height: height, - chatModel: chatModel, - builder: (context, onPanUpdate) { - final child = Scaffold( - resizeToAvoidBottomInset: false, - appBar: CustomAppBar( - onPanUpdate: onPanUpdate, - appBar: (isDesktop || isWebDesktop) - ? _buildDesktopAppBar(context) - : _buildMobileAppBar(context), - ), - body: ChatPage(chatModel: chatModel), - ); - return Container( - decoration: - BoxDecoration(border: Border.all(color: MyTheme.border)), - child: child); - }); - } - - Widget _buildMobileAppBar(BuildContext context) { - return Container( - color: Theme.of(context).colorScheme.primary, - height: 50, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 15), - child: Text( - translate("Chat"), - style: const TextStyle( - color: Colors.white, - fontFamily: 'WorkSans', - fontWeight: FontWeight.bold, - fontSize: 20), - )), - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - IconButton( - onPressed: () { - chatModel.hideChatWindowOverlay(); - }, - icon: const Icon( - Icons.keyboard_arrow_down, - color: Colors.white, - )), - IconButton( - onPressed: () { - chatModel.hideChatWindowOverlay(); - chatModel.hideChatIconOverlay(); - }, - icon: const Icon( - Icons.close, - color: Colors.white, - )) - ], - ) - ], - ), - ); - } - - Widget _buildDesktopAppBar(BuildContext context) { - return Container( - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Theme.of(context).hintColor.withOpacity(0.4)))), - height: 38, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), - child: Obx(() => Opacity( - opacity: chatModel.isWindowFocus.value ? 1.0 : 0.4, - child: Row(children: [ - Icon(Icons.chat_bubble_outline, - size: 20, color: Theme.of(context).colorScheme.primary), - SizedBox(width: 6), - Text(translate("Chat")) - ])))), - Padding( - padding: EdgeInsets.all(2), - child: ActionIcon( - message: 'Close', - icon: IconFont.close, - onTap: chatModel.hideChatWindowOverlay, - isClose: true, - boxSize: 32, - )) - ], - ), - ); - } -} - -class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { - final GestureDragUpdateCallback onPanUpdate; - final Widget appBar; - - const CustomAppBar( - {Key? key, required this.onPanUpdate, required this.appBar}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return GestureDetector(onPanUpdate: onPanUpdate, child: appBar); - } - - @override - Size get preferredSize => const Size.fromHeight(kToolbarHeight); -} - -/// floating buttons of back/home/recent actions for android -class DraggableMobileActions extends StatelessWidget { - DraggableMobileActions( - {this.onBackPressed, - this.onRecentPressed, - this.onHomePressed, - this.onHidePressed, - required this.position, - required this.width, - required this.height, - required this.scale}); - - final double scale; - final DraggableKeyPosition position; - final double width; - final double height; - final VoidCallback? onBackPressed; - final VoidCallback? onHomePressed; - final VoidCallback? onRecentPressed; - final VoidCallback? onHidePressed; - - @override - Widget build(BuildContext context) { - return Draggable( - position: position, - width: scale * width, - height: scale * height, - builder: (_, onPanUpdate) { - return GestureDetector( - onPanUpdate: onPanUpdate, - child: Card( - color: Colors.transparent, - shadowColor: Colors.transparent, - child: Container( - decoration: BoxDecoration( - color: MyTheme.accent.withOpacity(0.4), - borderRadius: - BorderRadius.all(Radius.circular(15 * scale))), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - IconButton( - color: Colors.white, - onPressed: onBackPressed, - splashRadius: kDesktopIconButtonSplashRadius, - icon: const Icon(Icons.arrow_back), - iconSize: 24 * scale), - IconButton( - color: Colors.white, - onPressed: onHomePressed, - splashRadius: kDesktopIconButtonSplashRadius, - icon: const Icon(Icons.home), - iconSize: 24 * scale), - IconButton( - color: Colors.white, - onPressed: onRecentPressed, - splashRadius: kDesktopIconButtonSplashRadius, - icon: const Icon(Icons.more_horiz), - iconSize: 24 * scale), - const VerticalDivider( - width: 0, - thickness: 2, - indent: 10, - endIndent: 10, - ), - IconButton( - color: Colors.white, - onPressed: onHidePressed, - splashRadius: kDesktopIconButtonSplashRadius, - icon: const Icon(Icons.keyboard_arrow_down), - iconSize: 24 * scale), - ], - ), - ))); - }); - } -} - -class DraggableKeyPosition { - final String key; - Offset _pos; - late Debouncer _debouncerStore; - DraggableKeyPosition(this.key) - : _pos = DraggablePositions.kInvalidDraggablePosition; - - get pos => _pos; - - _loadPosition(String k) { - final value = bind.getLocalFlutterOption(k: k); - if (value.isNotEmpty) { - final parts = value.split(','); - if (parts.length == 2) { - return Offset(double.parse(parts[0]), double.parse(parts[1])); - } - } - return DraggablePositions.kInvalidDraggablePosition; - } - - load() { - _pos = _loadPosition(key); - _debouncerStore = Debouncer(const Duration(milliseconds: 500), - onChanged: (v) => _store(), initialValue: 0); - } - - update(Offset pos) { - _pos = pos; - _triggerStore(); - } - - // Adjust position to keep it in the screen - // Only used for desktop and web desktop - tryAdjust(double w, double h, double scale) { - final size = MediaQuery.of(Get.context!).size; - w = w * scale; - h = h * scale; - double x = _pos.dx; - double y = _pos.dy; - if (x + w > size.width) { - x = size.width - w; - } - final tabBarHeight = isDesktop ? kDesktopRemoteTabBarHeight : 0; - if (y + h > (size.height - tabBarHeight)) { - y = size.height - tabBarHeight - h; - } - if (x < 0) { - x = 0; - } - if (y < 0) { - y = 0; - } - if (x != _pos.dx || y != _pos.dy) { - update(Offset(x, y)); - } - } - - isInvalid() { - return _pos == DraggablePositions.kInvalidDraggablePosition; - } - - _triggerStore() => _debouncerStore.value = _debouncerStore.value + 1; - _store() { - bind.setLocalFlutterOption(k: key, v: '${_pos.dx},${_pos.dy}'); - } -} - -class DraggablePositions { - static const kChatWindow = 'draggablePositionChat'; - static const kMobileActions = 'draggablePositionMobile'; - static const kIOSDraggable = 'draggablePositionIOS'; - - static const kInvalidDraggablePosition = Offset(-999999, -999999); - final chatWindow = DraggableKeyPosition(kChatWindow); - final mobileActions = DraggableKeyPosition(kMobileActions); - final iOSDraggable = DraggableKeyPosition(kIOSDraggable); - - load() { - chatWindow.load(); - mobileActions.load(); - iOSDraggable.load(); - } -} - -DraggablePositions draggablePositions = DraggablePositions(); - -class Draggable extends StatefulWidget { - Draggable( - {Key? key, - this.checkKeyboard = false, - this.checkScreenSize = false, - required this.position, - required this.width, - required this.height, - this.chatModel, - required this.builder}) - : super(key: key); - - final bool checkKeyboard; - final bool checkScreenSize; - final DraggableKeyPosition position; - final double width; - final double height; - final ChatModel? chatModel; - final Widget Function(BuildContext, GestureDragUpdateCallback) builder; - - @override - State createState() => _DraggableState(chatModel); -} - -class _DraggableState extends State { - late ChatModel? _chatModel; - bool _keyboardVisible = false; - double _saveHeight = 0; - double _lastBottomHeight = 0; - - _DraggableState(ChatModel? chatModel) { - _chatModel = chatModel; - } - - get position => widget.position.pos; - - void onPanUpdate(DragUpdateDetails d) { - final offset = d.delta; - final size = MediaQuery.of(context).size; - double x = 0; - double y = 0; - - if (position.dx + offset.dx + widget.width > size.width) { - x = size.width - widget.width; - } else if (position.dx + offset.dx < 0) { - x = 0; - } else { - x = position.dx + offset.dx; - } - - if (position.dy + offset.dy + widget.height > size.height) { - y = size.height - widget.height; - } else if (position.dy + offset.dy < 0) { - y = 0; - } else { - y = position.dy + offset.dy; - } - setState(() { - widget.position.update(Offset(x, y)); - }); - _chatModel?.setChatWindowPosition(position); - } - - checkScreenSize() { - // Ensure the draggable always stays within current screen bounds - widget.position.tryAdjust(widget.width, widget.height, 1); - } - - checkKeyboard() { - final bottomHeight = MediaQuery.of(context).viewInsets.bottom; - final currentVisible = bottomHeight != 0; - - // save - if (!_keyboardVisible && currentVisible) { - _saveHeight = position.dy; - } - - // reset - if (_lastBottomHeight > 0 && bottomHeight == 0) { - setState(() { - widget.position.update(Offset(position.dx, _saveHeight)); - }); - } - - // onKeyboardVisible - if (_keyboardVisible && currentVisible) { - final sumHeight = bottomHeight + widget.height; - final contextHeight = MediaQuery.of(context).size.height; - if (sumHeight + position.dy > contextHeight) { - final y = contextHeight - sumHeight; - setState(() { - widget.position.update(Offset(position.dx, y)); - }); - } - } - - _keyboardVisible = currentVisible; - _lastBottomHeight = bottomHeight; - } - - @override - Widget build(BuildContext context) { - if (widget.checkKeyboard) { - checkKeyboard(); - } - if (widget.checkScreenSize) { - checkScreenSize(); - } - return Stack(children: [ - Positioned( - top: position.dy, - left: position.dx, - width: widget.width, - height: widget.height, - child: widget.builder(context, onPanUpdate)) - ]); - } -} - -class IOSDraggable extends StatefulWidget { - const IOSDraggable( - {Key? key, - this.chatModel, - required this.position, - required this.width, - required this.height, - required this.builder}) - : super(key: key); - - final DraggableKeyPosition position; - final ChatModel? chatModel; - final double width; - final double height; - final Widget Function(BuildContext) builder; - - @override - IOSDraggableState createState() => - IOSDraggableState(chatModel, width, height); -} - -class IOSDraggableState extends State { - late ChatModel? _chatModel; - late double _width; - late double _height; - bool _keyboardVisible = false; - double _saveHeight = 0; - double _lastBottomHeight = 0; - - IOSDraggableState(ChatModel? chatModel, double w, double h) { - _chatModel = chatModel; - _width = w; - _height = h; - } - - DraggableKeyPosition get position => widget.position; - - checkKeyboard() { - final bottomHeight = MediaQuery.of(context).viewInsets.bottom; - final currentVisible = bottomHeight != 0; - - // save - if (!_keyboardVisible && currentVisible) { - _saveHeight = position.pos.dy; - } - - // reset - if (_lastBottomHeight > 0 && bottomHeight == 0) { - setState(() { - position.update(Offset(position.pos.dx, _saveHeight)); - }); - } - - // onKeyboardVisible - if (_keyboardVisible && currentVisible) { - final sumHeight = bottomHeight + _height; - final contextHeight = MediaQuery.of(context).size.height; - if (sumHeight + position.pos.dy > contextHeight) { - final y = contextHeight - sumHeight; - setState(() { - position.update(Offset(position.pos.dx, y)); - }); - } - } - - _keyboardVisible = currentVisible; - _lastBottomHeight = bottomHeight; - } - - @override - void initState() { - super.initState(); - position.tryAdjust(_width, _height, 1); - } - - @override - Widget build(BuildContext context) { - checkKeyboard(); - return Stack( - children: [ - Positioned( - left: position.pos.dx, - top: position.pos.dy, - child: GestureDetector( - onPanUpdate: (details) { - setState(() { - position.update(position.pos + details.delta); - }); - _chatModel?.setChatWindowPosition(position.pos); - }, - child: Material( - child: Container( - width: _width, - height: _height, - decoration: - BoxDecoration(border: Border.all(color: MyTheme.border)), - child: widget.builder(context), - ), - ), - ), - ), - ], - ); - } -} - -class QualityMonitor extends StatelessWidget { - final QualityMonitorModel qualityMonitorModel; - QualityMonitor(this.qualityMonitorModel); - - Widget _row(String info, String? value, {Color? rightColor}) { - return Row( - children: [ - Expanded( - flex: 8, - child: AutoSizeText(info, - style: TextStyle(color: Color.fromARGB(255, 210, 210, 210)), - textAlign: TextAlign.right, - maxLines: 1)), - Spacer(flex: 1), - Expanded( - flex: 8, - child: AutoSizeText(value ?? '', - style: TextStyle(color: rightColor ?? Colors.white), - maxLines: 1)), - ], - ); - } - - @override - Widget build(BuildContext context) => ChangeNotifierProvider.value( - value: qualityMonitorModel, - child: Consumer( - builder: (context, qualityMonitorModel, child) => qualityMonitorModel - .show - ? Container( - constraints: BoxConstraints(maxWidth: 200), - padding: const EdgeInsets.all(8), - color: MyTheme.canvasColor.withAlpha(150), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _row("Speed", qualityMonitorModel.data.speed ?? '-'), - _row("FPS", qualityMonitorModel.data.fps ?? '-'), - // let delay be 0 if fps is 0 - _row( - "Delay", - "${qualityMonitorModel.data.delay == null ? '-' : (qualityMonitorModel.data.fps ?? "").replaceAll(' ', '').replaceAll('0', '').isEmpty ? 0 : qualityMonitorModel.data.delay}ms", - rightColor: Colors.green), - _row("Target Bitrate", - "${qualityMonitorModel.data.targetBitrate ?? '-'}kb"), - _row( - "Codec", qualityMonitorModel.data.codecFormat ?? '-'), - _row("Chroma", qualityMonitorModel.data.chroma ?? '-'), - ], - ), - ) - : const SizedBox.shrink())); -} - -class BlockableOverlayState extends OverlayKeyState { - final _middleBlocked = false.obs; - - VoidCallback? onMiddleBlockedClick; // to-do use listener - - RxBool get middleBlocked => _middleBlocked; - - void addMiddleBlockedListener(void Function(bool) cb) { - _middleBlocked.listen(cb); - } - - void setMiddleBlocked(bool blocked) { - if (blocked != _middleBlocked.value) { - _middleBlocked.value = blocked; - } - } - - void applyFfi(FFI ffi) { - ffi.dialogManager.setOverlayState(this); - ffi.chatModel.setOverlayState(this); - // make remote page penetrable automatically, effective for chat over remote - onMiddleBlockedClick = () { - setMiddleBlocked(false); - }; - } -} - -class BlockableOverlay extends StatelessWidget { - final Widget underlying; - final List? upperLayer; - - final BlockableOverlayState state; - - BlockableOverlay( - {required this.underlying, required this.state, this.upperLayer}); - - @override - Widget build(BuildContext context) { - final initialEntries = [ - OverlayEntry(builder: (_) => underlying), - - /// middle layer - OverlayEntry( - builder: (context) => Obx(() => Listener( - onPointerDown: (_) { - state.onMiddleBlockedClick?.call(); - }, - child: Container( - color: - state.middleBlocked.value ? Colors.transparent : null)))), - ]; - - if (upperLayer != null) { - initialEntries.addAll(upperLayer!); - } - - /// set key - return Overlay(key: state.key, initialEntries: initialEntries); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/peer_card.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/peer_card.dart deleted file mode 100644 index 1f9f3ed..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/peer_card.dart +++ /dev/null @@ -1,1581 +0,0 @@ -import 'package:bot_toast/bot_toast.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hbb/common/widgets/dialog.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/models/peer_tab_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:get/get.dart'; -import 'package:provider/provider.dart'; - -import '../../common.dart'; -import '../../common/formatter/id_formatter.dart'; -import '../../models/peer_model.dart'; -import '../../models/platform_model.dart'; -import '../../desktop/widgets/material_mod_popup_menu.dart' as mod_menu; -import '../../desktop/widgets/popup_menu.dart'; -import 'dart:math' as math; - -typedef PopupMenuEntryBuilder = Future>> - Function(BuildContext); - -enum PeerUiType { grid, tile, list } - -final peerCardUiType = PeerUiType.grid.obs; - -bool? hideUsernameOnCard; - -class _PeerCard extends StatefulWidget { - final Peer peer; - final PeerTabIndex tab; - final Function(BuildContext, String) connect; - final PopupMenuEntryBuilder popupMenuEntryBuilder; - - const _PeerCard( - {required this.peer, - required this.tab, - required this.connect, - required this.popupMenuEntryBuilder, - Key? key}) - : super(key: key); - - @override - _PeerCardState createState() => _PeerCardState(); -} - -/// State for the connection page. -class _PeerCardState extends State<_PeerCard> - with AutomaticKeepAliveClientMixin { - var _menuPos = RelativeRect.fill; - final double _cardRadius = 16; - final double _tileRadius = 5; - final double _borderWidth = 2; - - @override - Widget build(BuildContext context) { - super.build(context); - return Obx(() => - stateGlobal.isPortrait.isTrue ? _buildPortrait() : _buildLandscape()); - } - - Widget gestureDetector({required Widget child}) { - final PeerTabModel peerTabModel = Provider.of(context); - final peer = super.widget.peer; - return GestureDetector( - onDoubleTap: peerTabModel.multiSelectionMode - ? null - : () => widget.connect(context, peer.id), - onTap: () { - if (peerTabModel.multiSelectionMode) { - peerTabModel.select(peer); - } else { - if (isMobile) { - widget.connect(context, peer.id); - } else { - peerTabModel.select(peer); - } - } - }, - onLongPress: () => peerTabModel.select(peer), - child: child); - } - - Widget _buildPortrait() { - final peer = super.widget.peer; - return Card( - margin: EdgeInsets.symmetric(horizontal: 2), - child: gestureDetector( - child: Container( - padding: EdgeInsets.only(left: 12, top: 8, bottom: 8), - child: _buildPeerTile(context, peer, null)), - )); - } - - Widget _buildLandscape() { - final peer = super.widget.peer; - var deco = Rx( - BoxDecoration( - border: Border.all(color: Colors.transparent, width: _borderWidth), - borderRadius: BorderRadius.circular( - peerCardUiType.value == PeerUiType.grid ? _cardRadius : _tileRadius, - ), - ), - ); - return MouseRegion( - onEnter: (evt) { - deco.value = BoxDecoration( - border: Border.all( - color: Theme.of(context).colorScheme.primary, - width: _borderWidth), - borderRadius: BorderRadius.circular( - peerCardUiType.value == PeerUiType.grid ? _cardRadius : _tileRadius, - ), - ); - }, - onExit: (evt) { - deco.value = BoxDecoration( - border: Border.all(color: Colors.transparent, width: _borderWidth), - borderRadius: BorderRadius.circular( - peerCardUiType.value == PeerUiType.grid ? _cardRadius : _tileRadius, - ), - ); - }, - child: gestureDetector( - child: Obx(() => peerCardUiType.value == PeerUiType.grid - ? _buildPeerCard(context, peer, deco) - : _buildPeerTile(context, peer, deco))), - ); - } - - bool _showNote(Peer peer) { - return peerTabShowNote(widget.tab) && peer.note.isNotEmpty; - } - - makeChild(bool isPortrait, Peer peer) { - final name = hideUsernameOnCard == true - ? peer.hostname - : '${peer.username}${peer.username.isNotEmpty && peer.hostname.isNotEmpty ? '@' : ''}${peer.hostname}'; - final greyStyle = TextStyle( - fontSize: 11, - color: Theme.of(context).textTheme.titleLarge?.color?.withOpacity(0.6)); - final showNote = _showNote(peer); - - return Row( - mainAxisSize: MainAxisSize.max, - children: [ - Container( - decoration: BoxDecoration( - color: str2color('${peer.id}${peer.platform}', 0x7f), - borderRadius: isPortrait - ? BorderRadius.circular(_tileRadius) - : BorderRadius.only( - topLeft: Radius.circular(_tileRadius), - bottomLeft: Radius.circular(_tileRadius), - ), - ), - alignment: Alignment.center, - width: isPortrait ? 50 : 42, - height: isPortrait ? 50 : null, - child: Stack( - children: [ - getPlatformImage(peer.platform, size: isPortrait ? 38 : 30) - .paddingAll(6), - if (_shouldBuildPasswordIcon(peer)) - Positioned( - top: 1, - left: 1, - child: Icon(Icons.key, size: 6, color: Colors.white), - ), - ], - )), - Expanded( - child: Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: BorderRadius.only( - topRight: Radius.circular(_tileRadius), - bottomRight: Radius.circular(_tileRadius), - ), - ), - child: Row( - children: [ - Expanded( - child: Column( - children: [ - Row(children: [ - getOnline(isPortrait ? 4 : 8, peer.online), - Expanded( - child: Text( - peer.alias.isEmpty ? formatID(peer.id) : peer.alias, - overflow: TextOverflow.ellipsis, - style: Theme.of(context).textTheme.titleSmall, - )), - ]).marginOnly(top: isPortrait ? 0 : 2), - Row( - children: [ - Flexible( - child: Tooltip( - message: name, - waitDuration: const Duration(seconds: 1), - child: Align( - alignment: Alignment.centerLeft, - child: Text( - name, - style: isPortrait ? null : greyStyle, - textAlign: TextAlign.start, - overflow: TextOverflow.ellipsis, - ), - ), - ), - ), - if (showNote) - Expanded( - child: Tooltip( - message: peer.note, - waitDuration: const Duration(seconds: 1), - child: Align( - alignment: Alignment.centerLeft, - child: Text( - peer.note, - style: isPortrait ? null : greyStyle, - textAlign: TextAlign.start, - overflow: TextOverflow.ellipsis, - ).marginOnly( - left: peerCardUiType.value == - PeerUiType.list - ? 32 - : 4), - ), - ), - ) - ], - ), - ], - ).marginOnly(top: 2), - ), - isPortrait - ? checkBoxOrActionMorePortrait(peer) - : checkBoxOrActionMoreLandscape(peer, isTile: true), - ], - ).paddingOnly(left: 10.0, top: 3.0), - ), - ) - ], - ); - } - - Widget _buildPeerTile( - BuildContext context, Peer peer, Rx? deco) { - hideUsernameOnCard ??= - bind.mainGetBuildinOption(key: kHideUsernameOnCard) == 'Y'; - final colors = _frontN(peer.tags, 25) - .map((e) => gFFI.abModel.getCurrentAbTagColor(e)) - .toList(); - return Tooltip( - message: !(isDesktop || isWebDesktop) - ? '' - : peer.tags.isNotEmpty - ? '${translate('Tags')}: ${peer.tags.join(', ')}' - : '', - child: Stack(children: [ - Obx( - () => deco == null - ? makeChild(stateGlobal.isPortrait.isTrue, peer) - : Container( - foregroundDecoration: deco.value, - child: makeChild(stateGlobal.isPortrait.isTrue, peer), - ), - ), - if (colors.isNotEmpty) - Obx(() => Positioned( - top: 2, - right: stateGlobal.isPortrait.isTrue ? 20 : 10, - child: CustomPaint( - painter: TagPainter(radius: 3, colors: colors), - ), - )) - ]), - ); - } - - Widget _buildPeerCard( - BuildContext context, Peer peer, Rx deco) { - hideUsernameOnCard ??= - bind.mainGetBuildinOption(key: kHideUsernameOnCard) == 'Y'; - final name = hideUsernameOnCard == true - ? peer.hostname - : '${peer.username}${peer.username.isNotEmpty && peer.hostname.isNotEmpty ? '@' : ''}${peer.hostname}'; - final child = Card( - color: Colors.transparent, - elevation: 0, - margin: EdgeInsets.zero, - // to-do: memory leak here, more investigation needed. - // Continious rebuilds of `Obx()` will cause memory leak here. - // The simple demo does not have this issue. - child: Obx( - () => Container( - foregroundDecoration: deco.value, - child: ClipRRect( - borderRadius: BorderRadius.circular(_cardRadius - _borderWidth), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Container( - color: str2color('${peer.id}${peer.platform}', 0x7f), - child: Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - padding: const EdgeInsets.all(6), - child: - getPlatformImage(peer.platform, size: 60), - ), - Row( - children: [ - Expanded( - child: Tooltip( - message: name, - waitDuration: const Duration(seconds: 1), - child: Text( - name, - style: const TextStyle( - color: Colors.white70, - fontSize: 12), - textAlign: TextAlign.center, - overflow: TextOverflow.ellipsis, - ), - ), - ), - ], - ), - if (_showNote(peer)) - Row( - children: [ - Expanded( - child: Tooltip( - message: peer.note, - waitDuration: const Duration(seconds: 1), - child: Text( - peer.note, - style: const TextStyle( - color: Colors.white38, - fontSize: 10), - textAlign: TextAlign.center, - overflow: TextOverflow.ellipsis, - ), - )) - ], - ), - ], - ).paddingOnly(top: 4.0, left: 4.0, right: 4.0), - ), - ], - ), - ), - ), - Container( - color: Theme.of(context).colorScheme.background, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Row(children: [ - getOnline(8, peer.online), - Expanded( - child: Text( - peer.alias.isEmpty ? formatID(peer.id) : peer.alias, - overflow: TextOverflow.ellipsis, - style: Theme.of(context).textTheme.titleSmall, - )), - ]).paddingSymmetric(vertical: 8)), - checkBoxOrActionMoreLandscape(peer, isTile: false), - ], - ).paddingSymmetric(horizontal: 12.0), - ) - ], - ), - ), - ), - ), - ); - - final colors = _frontN(peer.tags, 25) - .map((e) => gFFI.abModel.getCurrentAbTagColor(e)) - .toList(); - return Tooltip( - message: peer.tags.isNotEmpty - ? '${translate('Tags')}: ${peer.tags.join(', ')}' - : '', - child: Stack(children: [ - child, - if (_shouldBuildPasswordIcon(peer)) - Positioned( - top: 4, - left: 12, - child: Icon(Icons.key, size: 12, color: Colors.white), - ), - if (colors.isNotEmpty) - Positioned( - top: 4, - right: 12, - child: CustomPaint( - painter: TagPainter(radius: 4, colors: colors), - ), - ) - ]), - ); - } - - List _frontN(List list, int n) { - if (list.length <= n) { - return list; - } else { - return list.sublist(0, n); - } - } - - Widget checkBoxOrActionMorePortrait(Peer peer) { - final PeerTabModel peerTabModel = Provider.of(context); - final selected = peerTabModel.isPeerSelected(peer.id); - if (peerTabModel.multiSelectionMode) { - return Padding( - padding: const EdgeInsets.all(12), - child: selected - ? Icon( - Icons.check_box, - color: MyTheme.accent, - ) - : Icon(Icons.check_box_outline_blank), - ); - } else { - return InkWell( - child: const Padding( - padding: EdgeInsets.all(12), child: Icon(Icons.more_vert)), - onTapDown: (e) { - final x = e.globalPosition.dx; - final y = e.globalPosition.dy; - _menuPos = RelativeRect.fromLTRB(x, y, x, y); - }, - onTap: () { - _showPeerMenu(peer.id); - }); - } - } - - Widget checkBoxOrActionMoreLandscape(Peer peer, {required bool isTile}) { - final PeerTabModel peerTabModel = Provider.of(context); - final selected = peerTabModel.isPeerSelected(peer.id); - if (peerTabModel.multiSelectionMode) { - final icon = selected - ? Icon( - Icons.check_box, - color: MyTheme.accent, - ) - : Icon(Icons.check_box_outline_blank); - bool last = peerTabModel.isShiftDown && peer.id == peerTabModel.lastId; - double right = isTile ? 4 : 0; - if (last) { - return Container( - decoration: BoxDecoration( - border: Border.all(color: MyTheme.accent, width: 1)), - child: icon, - ).marginOnly(right: right); - } else { - return icon.marginOnly(right: right); - } - } else { - return _actionMore(peer); - } - } - - Widget _actionMore(Peer peer) => Listener( - onPointerDown: (e) { - final x = e.position.dx; - final y = e.position.dy; - _menuPos = RelativeRect.fromLTRB(x, y, x, y); - }, - onPointerUp: (_) => _showPeerMenu(peer.id), - child: build_more(context)); - - bool _shouldBuildPasswordIcon(Peer peer) { - if (gFFI.peerTabModel.currentTab != PeerTabIndex.ab.index) return false; - if (gFFI.abModel.current.isPersonal()) return false; - return peer.password.isNotEmpty; - } - - /// Show the peer menu and handle user's choice. - /// User might remove the peer or send a file to the peer. - void _showPeerMenu(String id) async { - await mod_menu.showMenu( - context: context, - position: _menuPos, - items: await super.widget.popupMenuEntryBuilder(context), - elevation: 8, - ); - } - - @override - bool get wantKeepAlive => true; -} - -abstract class BasePeerCard extends StatelessWidget { - final Peer peer; - final PeerTabIndex tab; - final EdgeInsets? menuPadding; - - BasePeerCard( - {required this.peer, required this.tab, this.menuPadding, Key? key}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return _PeerCard( - peer: peer, - tab: tab, - connect: (BuildContext context, String id) => - connectInPeerTab(context, peer, tab), - popupMenuEntryBuilder: _buildPopupMenuEntry, - ); - } - - Future>> _buildPopupMenuEntry( - BuildContext context) async => - (await _buildMenuItems(context)) - .map((e) => e.build( - context, - const MenuConfig( - commonColor: CustomPopupMenuTheme.commonColor, - height: CustomPopupMenuTheme.height, - dividerHeight: CustomPopupMenuTheme.dividerHeight))) - .expand((i) => i) - .toList(); - - @protected - Future>> _buildMenuItems(BuildContext context); - - MenuEntryBase _connectCommonAction( - BuildContext context, - String title, { - bool isFileTransfer = false, - bool isViewCamera = false, - bool isTcpTunneling = false, - bool isRDP = false, - bool isTerminal = false, - bool isTerminalRunAsAdmin = false, - }) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - title, - style: style, - ), - proc: () { - if (isTerminalRunAsAdmin) { - setEnvTerminalAdmin(); - } - connectInPeerTab( - context, - peer, - tab, - isFileTransfer: isFileTransfer, - isViewCamera: isViewCamera, - isTcpTunneling: isTcpTunneling, - isRDP: isRDP, - isTerminal: isTerminal || isTerminalRunAsAdmin, - ); - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - @protected - MenuEntryBase _connectAction(BuildContext context) { - return _connectCommonAction( - context, - (peer.alias.isEmpty - ? translate('Connect') - : '${translate('Connect')} ${peer.id}'), - ); - } - - @protected - MenuEntryBase _transferFileAction(BuildContext context) { - return _connectCommonAction( - context, - translate('Transfer file'), - isFileTransfer: true, - ); - } - - @protected - MenuEntryBase _viewCameraAction(BuildContext context) { - return _connectCommonAction( - context, - translate('View camera'), - isViewCamera: true, - ); - } - - @protected - MenuEntryBase _terminalAction(BuildContext context) { - return _connectCommonAction( - context, - '${translate('Terminal')} (beta)', - isTerminal: true, - ); - } - - @protected - MenuEntryBase _terminalRunAsAdminAction(BuildContext context) { - return _connectCommonAction( - context, - '${translate('Terminal (Run as administrator)')} (beta)', - isTerminalRunAsAdmin: true, - ); - } - - @protected - MenuEntryBase _tcpTunnelingAction(BuildContext context) { - return _connectCommonAction( - context, - translate('TCP tunneling'), - isTcpTunneling: true, - ); - } - - @protected - MenuEntryBase _rdpAction(BuildContext context, String id) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Container( - alignment: AlignmentDirectional.center, - height: CustomPopupMenuTheme.height, - child: Row( - children: [ - Text( - translate('RDP'), - style: style, - ), - Expanded( - child: Align( - alignment: Alignment.centerRight, - child: Transform.scale( - scale: 0.8, - child: IconButton( - icon: const Icon(Icons.edit), - padding: EdgeInsets.zero, - onPressed: () { - if (Navigator.canPop(context)) { - Navigator.pop(context); - } - _rdpDialog(id); - }, - )), - )) - ], - )), - proc: () { - connectInPeerTab(context, peer, tab, isRDP: true); - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - @protected - MenuEntryBase _wolAction(String id) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('WOL'), - style: style, - ), - proc: () { - bind.mainWol(id: id); - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - /// Only available on Windows. - @protected - MenuEntryBase _createShortCutAction(String id) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Create desktop shortcut'), - style: style, - ), - proc: () { - bind.mainCreateShortcut(id: id); - showToast(translate('Successful')); - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - Future> _openNewConnInAction( - String id, String label, String key) async { - return MenuEntrySwitch( - switchType: SwitchType.scheckbox, - text: translate(label), - getter: () async => mainGetPeerBoolOptionSync(id, key), - setter: (bool v) async { - await bind.mainSetPeerOption( - id: id, key: key, value: bool2option(key, v)); - showToast(translate('Successful')); - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - _openInTabsAction(String id) async => - await _openNewConnInAction(id, 'Open in New Tab', kOptionOpenInTabs); - - _openInWindowsAction(String id) async => await _openNewConnInAction( - id, 'Open in new window', kOptionOpenInWindows); - - // ignore: unused_element - _openNewConnInOptAction(String id) async => - mainGetLocalBoolOptionSync(kOptionOpenNewConnInTabs) - ? await _openInWindowsAction(id) - : await _openInTabsAction(id); - - @protected - Future _isForceAlwaysRelay(String id) async { - return option2bool(kOptionForceAlwaysRelay, - (await bind.mainGetPeerOption(id: id, key: kOptionForceAlwaysRelay))); - } - - @protected - Future> _forceAlwaysRelayAction(String id) async { - return MenuEntrySwitch( - switchType: SwitchType.scheckbox, - text: translate('Always connect via relay'), - getter: () async { - return await _isForceAlwaysRelay(id); - }, - setter: (bool v) async { - await bind.mainSetPeerOption( - id: id, - key: kOptionForceAlwaysRelay, - value: bool2option(kOptionForceAlwaysRelay, v)); - showToast(translate('Successful')); - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - @protected - MenuEntryBase _renameAction(String id) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Rename'), - style: style, - ), - proc: () async { - String oldName = await _getAlias(id); - renameDialog( - oldName: oldName, - onSubmit: (String newName) async { - if (newName != oldName) { - if (tab == PeerTabIndex.ab) { - await gFFI.abModel.changeAlias(id: id, alias: newName); - await bind.mainSetPeerAlias(id: id, alias: newName); - } else { - await bind.mainSetPeerAlias(id: id, alias: newName); - showToast(translate('Successful')); - _update(); - } - } - }); - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - @protected - MenuEntryBase _removeAction(String id) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Row( - children: [ - Text( - translate('Delete'), - style: style?.copyWith(color: Colors.red), - ), - Expanded( - child: Align( - alignment: Alignment.centerRight, - child: Transform.scale( - scale: 0.8, - child: Icon(Icons.delete_forever, color: Colors.red), - ), - ).marginOnly(right: 4)), - ], - ), - proc: () { - onSubmit() async { - switch (tab) { - case PeerTabIndex.recent: - await bind.mainRemovePeer(id: id); - bind.mainLoadRecentPeers(); - break; - case PeerTabIndex.fav: - final favs = (await bind.mainGetFav()).toList(); - if (favs.remove(id)) { - await bind.mainStoreFav(favs: favs); - bind.mainLoadFavPeers(); - } - break; - case PeerTabIndex.lan: - await bind.mainRemoveDiscovered(id: id); - bind.mainLoadLanPeers(); - break; - case PeerTabIndex.ab: - await gFFI.abModel.deletePeers([id]); - break; - case PeerTabIndex.group: - break; - } - if (tab != PeerTabIndex.ab) { - showToast(translate('Successful')); - } - } - - deleteConfirmDialog(onSubmit, - '${translate('Delete')} "${peer.alias.isEmpty ? formatID(peer.id) : peer.alias}"?'); - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - @protected - MenuEntryBase _unrememberPasswordAction(String id) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Forget Password'), - style: style, - ), - proc: () async { - bool succ = await gFFI.abModel.changePersonalHashPassword(id, ''); - await bind.mainForgetPassword(id: id); - if (succ) { - showToast(translate('Successful')); - } else { - if (tab.index == PeerTabIndex.ab.index) { - BotToast.showText( - contentColor: Colors.red, text: translate("Failed")); - } - } - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - @protected - MenuEntryBase _addFavAction(String id) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Row( - children: [ - Text( - translate('Add to Favorites'), - style: style, - ), - Expanded( - child: Align( - alignment: Alignment.centerRight, - child: Transform.scale( - scale: 0.8, - child: Icon(Icons.star_outline), - ), - ).marginOnly(right: 4)), - ], - ), - proc: () { - () async { - final favs = (await bind.mainGetFav()).toList(); - if (!favs.contains(id)) { - favs.add(id); - await bind.mainStoreFav(favs: favs); - } - showToast(translate('Successful')); - }(); - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - @protected - MenuEntryBase _rmFavAction( - String id, Future Function() reloadFunc) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Row( - children: [ - Text( - translate('Remove from Favorites'), - style: style, - ), - Expanded( - child: Align( - alignment: Alignment.centerRight, - child: Transform.scale( - scale: 0.8, - child: Icon(Icons.star), - ), - ).marginOnly(right: 4)), - ], - ), - proc: () { - () async { - final favs = (await bind.mainGetFav()).toList(); - if (favs.remove(id)) { - await bind.mainStoreFav(favs: favs); - await reloadFunc(); - } - showToast(translate('Successful')); - }(); - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - @protected - MenuEntryBase _addToAb(Peer peer) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Add to address book'), - style: style, - ), - proc: () { - () async { - addPeersToAbDialog([Peer.copy(peer)]); - }(); - }, - padding: menuPadding, - dismissOnClicked: true, - ); - } - - @protected - Future _getAlias(String id) async => - await bind.mainGetPeerOption(id: id, key: 'alias'); - - @protected - void _update(); -} - -class RecentPeerCard extends BasePeerCard { - RecentPeerCard({required Peer peer, EdgeInsets? menuPadding, Key? key}) - : super( - peer: peer, - tab: PeerTabIndex.recent, - menuPadding: menuPadding, - key: key); - - @override - Future>> _buildMenuItems( - BuildContext context) async { - final List> menuItems = [ - _connectAction(context), - _transferFileAction(context), - _viewCameraAction(context), - _terminalAction(context), - ]; - - if (peer.platform == kPeerPlatformWindows) { - menuItems.add(_terminalRunAsAdminAction(context)); - } - - final List favs = (await bind.mainGetFav()).toList(); - - if (isDesktop && peer.platform != kPeerPlatformAndroid) { - menuItems.add(_tcpTunnelingAction(context)); - } - // menuItems.add(await _openNewConnInOptAction(peer.id)); - if (!isWeb) { - menuItems.add(await _forceAlwaysRelayAction(peer.id)); - } - if (isWindows && peer.platform == kPeerPlatformWindows) { - menuItems.add(_rdpAction(context, peer.id)); - } - if (isWindows) { - menuItems.add(_createShortCutAction(peer.id)); - } - menuItems.add(MenuEntryDivider()); - if (isMobile || isDesktop || isWebDesktop) { - menuItems.add(_renameAction(peer.id)); - } - if (await bind.mainPeerHasPassword(id: peer.id)) { - menuItems.add(_unrememberPasswordAction(peer.id)); - } - - if (!favs.contains(peer.id)) { - menuItems.add(_addFavAction(peer.id)); - } else { - menuItems.add(_rmFavAction(peer.id, () async {})); - } - - if (gFFI.userModel.userName.isNotEmpty) { - menuItems.add(_addToAb(peer)); - } - - menuItems.add(MenuEntryDivider()); - menuItems.add(_removeAction(peer.id)); - return menuItems; - } - - @protected - @override - void _update() => bind.mainLoadRecentPeers(); -} - -class FavoritePeerCard extends BasePeerCard { - FavoritePeerCard({required Peer peer, EdgeInsets? menuPadding, Key? key}) - : super( - peer: peer, - tab: PeerTabIndex.fav, - menuPadding: menuPadding, - key: key); - - @override - Future>> _buildMenuItems( - BuildContext context) async { - final List> menuItems = [ - _connectAction(context), - _transferFileAction(context), - _viewCameraAction(context), - _terminalAction(context), - ]; - - if (peer.platform == kPeerPlatformWindows) { - menuItems.add(_terminalRunAsAdminAction(context)); - } - - if (isDesktop && peer.platform != kPeerPlatformAndroid) { - menuItems.add(_tcpTunnelingAction(context)); - } - // menuItems.add(await _openNewConnInOptAction(peer.id)); - if (!isWeb) { - menuItems.add(await _forceAlwaysRelayAction(peer.id)); - } - if (isWindows && peer.platform == kPeerPlatformWindows) { - menuItems.add(_rdpAction(context, peer.id)); - } - if (isWindows) { - menuItems.add(_createShortCutAction(peer.id)); - } - menuItems.add(MenuEntryDivider()); - if (isMobile || isDesktop || isWebDesktop) { - menuItems.add(_renameAction(peer.id)); - } - if (await bind.mainPeerHasPassword(id: peer.id)) { - menuItems.add(_unrememberPasswordAction(peer.id)); - } - menuItems.add(_rmFavAction(peer.id, () async { - await bind.mainLoadFavPeers(); - })); - - if (gFFI.userModel.userName.isNotEmpty) { - menuItems.add(_addToAb(peer)); - } - - menuItems.add(MenuEntryDivider()); - menuItems.add(_removeAction(peer.id)); - return menuItems; - } - - @protected - @override - void _update() => bind.mainLoadFavPeers(); -} - -class DiscoveredPeerCard extends BasePeerCard { - DiscoveredPeerCard({required Peer peer, EdgeInsets? menuPadding, Key? key}) - : super( - peer: peer, - tab: PeerTabIndex.lan, - menuPadding: menuPadding, - key: key); - - @override - Future>> _buildMenuItems( - BuildContext context) async { - final List> menuItems = [ - _connectAction(context), - _transferFileAction(context), - _viewCameraAction(context), - _terminalAction(context), - ]; - - if (peer.platform == kPeerPlatformWindows) { - menuItems.add(_terminalRunAsAdminAction(context)); - } - - final List favs = (await bind.mainGetFav()).toList(); - - if (isDesktop && peer.platform != kPeerPlatformAndroid) { - menuItems.add(_tcpTunnelingAction(context)); - } - // menuItems.add(await _openNewConnInOptAction(peer.id)); - if (!isWeb) { - menuItems.add(await _forceAlwaysRelayAction(peer.id)); - } - if (isWindows && peer.platform == kPeerPlatformWindows) { - menuItems.add(_rdpAction(context, peer.id)); - } - menuItems.add(_wolAction(peer.id)); - if (isWindows) { - menuItems.add(_createShortCutAction(peer.id)); - } - - if (!favs.contains(peer.id)) { - menuItems.add(_addFavAction(peer.id)); - } else { - menuItems.add(_rmFavAction(peer.id, () async {})); - } - - if (gFFI.userModel.userName.isNotEmpty) { - menuItems.add(_addToAb(peer)); - } - - menuItems.add(MenuEntryDivider()); - menuItems.add(_removeAction(peer.id)); - return menuItems; - } - - @protected - @override - void _update() => bind.mainLoadLanPeers(); -} - -class AddressBookPeerCard extends BasePeerCard { - AddressBookPeerCard({required Peer peer, EdgeInsets? menuPadding, Key? key}) - : super( - peer: peer, - tab: PeerTabIndex.ab, - menuPadding: menuPadding, - key: key); - - @override - Future>> _buildMenuItems( - BuildContext context) async { - final List> menuItems = [ - _connectAction(context), - _transferFileAction(context), - _viewCameraAction(context), - _terminalAction(context), - ]; - - if (peer.platform == kPeerPlatformWindows) { - menuItems.add(_terminalRunAsAdminAction(context)); - } - - if (isDesktop && peer.platform != kPeerPlatformAndroid) { - menuItems.add(_tcpTunnelingAction(context)); - } - // menuItems.add(await _openNewConnInOptAction(peer.id)); - if (!isWeb) { - menuItems.add(await _forceAlwaysRelayAction(peer.id)); - } - if (isWindows && peer.platform == kPeerPlatformWindows) { - menuItems.add(_rdpAction(context, peer.id)); - } - if (isWindows) { - menuItems.add(_createShortCutAction(peer.id)); - } - if (gFFI.abModel.current.canWrite()) { - menuItems.add(MenuEntryDivider()); - if (isMobile || isDesktop || isWebDesktop) { - menuItems.add(_renameAction(peer.id)); - } - if (gFFI.abModel.current.isPersonal() && peer.hash.isNotEmpty) { - menuItems.add(_unrememberPasswordAction(peer.id)); - } - if (!gFFI.abModel.current.isPersonal()) { - menuItems.add(_changeSharedAbPassword()); - } - if (gFFI.abModel.currentAbTags.isNotEmpty) { - menuItems.add(_editTagAction(peer.id)); - } - menuItems.add(_editNoteAction(peer.id)); - } - final addressbooks = gFFI.abModel.addressBooksCanWrite(); - if (gFFI.peerTabModel.currentTab == PeerTabIndex.ab.index) { - addressbooks.remove(gFFI.abModel.currentName.value); - } - if (addressbooks.isNotEmpty) { - menuItems.add(_addToAb(peer)); - } - menuItems.add(_existIn()); - if (gFFI.abModel.current.canWrite()) { - menuItems.add(MenuEntryDivider()); - menuItems.add(_removeAction(peer.id)); - } - return menuItems; - } - - // address book does not need to update - @protected - @override - void _update() => - {}; //gFFI.abModel.pullAb(force: ForcePullAb.current, quiet: true); - - @protected - MenuEntryBase _editTagAction(String id) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Edit Tag'), - style: style, - ), - proc: () { - editAbTagDialog(gFFI.abModel.getPeerTags(id), (selectedTag) async { - await gFFI.abModel.changeTagForPeers([id], selectedTag); - }); - }, - padding: super.menuPadding, - dismissOnClicked: true, - ); - } - - @protected - MenuEntryBase _editNoteAction(String id) { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Edit note'), - style: style, - ), - proc: () { - editAbPeerNoteDialog(id); - }, - padding: super.menuPadding, - dismissOnClicked: true, - ); - } - - @protected - @override - Future _getAlias(String id) async => - gFFI.abModel.find(id)?.alias ?? ''; - - MenuEntryBase _changeSharedAbPassword() { - return MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate( - peer.password.isEmpty ? 'Set shared password' : 'Change Password'), - style: style, - ), - proc: () { - setSharedAbPasswordDialog(gFFI.abModel.currentName.value, peer); - }, - padding: super.menuPadding, - dismissOnClicked: true, - ); - } - - MenuEntryBase _existIn() { - final names = gFFI.abModel.idExistIn(peer.id); - final text = names.join(', '); - return MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Exist in'), - style: style, - ), - proc: () { - gFFI.dialogManager.show((setState, close, context) { - return CustomAlertDialog( - title: Text(translate('Exist in')), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [Text(text)]), - actions: [ - dialogButton( - "OK", - icon: Icon(Icons.done_rounded), - onPressed: close, - ), - ], - onSubmit: close, - onCancel: close, - ); - }); - }, - padding: super.menuPadding, - dismissOnClicked: true, - ); - } -} - -class MyGroupPeerCard extends BasePeerCard { - MyGroupPeerCard({required Peer peer, EdgeInsets? menuPadding, Key? key}) - : super( - peer: peer, - tab: PeerTabIndex.group, - menuPadding: menuPadding, - key: key); - - @override - Future>> _buildMenuItems( - BuildContext context) async { - final List> menuItems = [ - _connectAction(context), - _transferFileAction(context), - _viewCameraAction(context), - _terminalAction(context), - ]; - - if (peer.platform == kPeerPlatformWindows) { - menuItems.add(_terminalRunAsAdminAction(context)); - } - - if (isDesktop && peer.platform != kPeerPlatformAndroid) { - menuItems.add(_tcpTunnelingAction(context)); - } - // menuItems.add(await _openNewConnInOptAction(peer.id)); - if (!isWeb) { - menuItems.add(await _forceAlwaysRelayAction(peer.id)); - } - if (isWindows && peer.platform == kPeerPlatformWindows) { - menuItems.add(_rdpAction(context, peer.id)); - } - if (isWindows) { - menuItems.add(_createShortCutAction(peer.id)); - } - // menuItems.add(MenuEntryDivider()); - // menuItems.add(_renameAction(peer.id)); - // if (await bind.mainPeerHasPassword(id: peer.id)) { - // menuItems.add(_unrememberPasswordAction(peer.id)); - // } - if (gFFI.userModel.userName.isNotEmpty) { - menuItems.add(_addToAb(peer)); - } - return menuItems; - } - - @protected - @override - void _update() => gFFI.groupModel.pull(); -} - -void _rdpDialog(String id) async { - final maxLength = bind.mainMaxEncryptLen(); - final port = await bind.mainGetPeerOption(id: id, key: 'rdp_port'); - final username = await bind.mainGetPeerOption(id: id, key: 'rdp_username'); - final portController = TextEditingController(text: port); - final userController = TextEditingController(text: username); - final passwordController = TextEditingController( - text: await bind.mainGetPeerOption(id: id, key: 'rdp_password')); - RxBool secure = true.obs; - - gFFI.dialogManager.show((setState, close, context) { - submit() async { - String port = portController.text.trim(); - String username = userController.text; - String password = passwordController.text; - await bind.mainSetPeerOption(id: id, key: 'rdp_port', value: port); - await bind.mainSetPeerOption( - id: id, key: 'rdp_username', value: username); - await bind.mainSetPeerOption( - id: id, key: 'rdp_password', value: password); - showToast(translate('Successful')); - close(); - } - - return CustomAlertDialog( - title: Text(translate('RDP Settings')), - content: ConstrainedBox( - constraints: const BoxConstraints(minWidth: 500), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - isDesktop - ? ConstrainedBox( - constraints: const BoxConstraints(minWidth: 140), - child: Text( - "${translate('Port')}:", - textAlign: TextAlign.right, - ).marginOnly(right: 10)) - : SizedBox.shrink(), - Expanded( - child: TextField( - inputFormatters: [ - FilteringTextInputFormatter.allow(RegExp( - r'^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$')) - ], - decoration: InputDecoration( - labelText: isDesktop ? null : translate('Port'), - hintText: '3389'), - controller: portController, - autofocus: true, - ).workaroundFreezeLinuxMint(), - ), - ], - ).marginOnly(bottom: isDesktop ? 8 : 0), - Obx(() => Row( - children: [ - stateGlobal.isPortrait.isFalse - ? ConstrainedBox( - constraints: const BoxConstraints(minWidth: 140), - child: Text( - "${translate('Username')}:", - textAlign: TextAlign.right, - ).marginOnly(right: 10)) - : SizedBox.shrink(), - Expanded( - child: TextField( - decoration: InputDecoration( - labelText: - isDesktop ? null : translate('Username')), - controller: userController, - ).workaroundFreezeLinuxMint(), - ), - ], - ).marginOnly(bottom: stateGlobal.isPortrait.isFalse ? 8 : 0)), - Obx(() => Row( - children: [ - stateGlobal.isPortrait.isFalse - ? ConstrainedBox( - constraints: const BoxConstraints(minWidth: 140), - child: Text( - "${translate('Password')}:", - textAlign: TextAlign.right, - ).marginOnly(right: 10)) - : SizedBox.shrink(), - Expanded( - child: Obx(() => TextField( - obscureText: secure.value, - maxLength: maxLength, - decoration: InputDecoration( - labelText: - isDesktop ? null : translate('Password'), - suffixIcon: IconButton( - onPressed: () => - secure.value = !secure.value, - icon: Icon(secure.value - ? Icons.visibility_off - : Icons.visibility))), - controller: passwordController, - ).workaroundFreezeLinuxMint()), - ), - ], - )) - ], - ), - ), - actions: [ - dialogButton("Cancel", onPressed: close, isOutline: true), - dialogButton("OK", onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -Widget getOnline(double rightPadding, bool online) { - return Tooltip( - message: translate(online ? 'Online' : 'Offline'), - waitDuration: const Duration(seconds: 1), - child: Padding( - padding: EdgeInsets.fromLTRB(0, 4, rightPadding, 4), - child: CircleAvatar( - radius: 3, backgroundColor: online ? Colors.green : kColorWarn))); -} - -Widget build_more(BuildContext context, {bool invert = false}) { - final RxBool hover = false.obs; - return InkWell( - borderRadius: BorderRadius.circular(14), - onTap: () {}, - onHover: (value) => hover.value = value, - child: Obx(() => CircleAvatar( - radius: 14, - backgroundColor: hover.value - ? (invert - ? Theme.of(context).colorScheme.background - : Theme.of(context).scaffoldBackgroundColor) - : (invert - ? Theme.of(context).scaffoldBackgroundColor - : Theme.of(context).colorScheme.background), - child: Icon(Icons.more_vert, - size: 18, - color: hover.value - ? Theme.of(context).textTheme.titleLarge?.color - : Theme.of(context) - .textTheme - .titleLarge - ?.color - ?.withOpacity(0.5))))); -} - -class TagPainter extends CustomPainter { - final double radius; - late final List colors; - - TagPainter({required this.radius, required List colors}) { - this.colors = colors.reversed.toList(); - } - - @override - void paint(Canvas canvas, Size size) { - double x = 0; - double y = radius; - for (int i = 0; i < colors.length; i++) { - Paint paint = Paint(); - paint.color = colors[i]; - x -= radius + 1; - if (i == colors.length - 1) { - canvas.drawCircle(Offset(x, y), radius, paint); - } else { - Path path = Path(); - path.addArc(Rect.fromCircle(center: Offset(x, y), radius: radius), - math.pi * 4 / 3, math.pi * 4 / 3); - path.addArc( - Rect.fromCircle(center: Offset(x - radius, y), radius: radius), - math.pi * 5 / 3, - math.pi * 2 / 3); - path.fillType = PathFillType.evenOdd; - canvas.drawPath(path, paint); - } - } - } - - @override - bool shouldRepaint(covariant CustomPainter oldDelegate) { - return true; - } -} - -void connectInPeerTab(BuildContext context, Peer peer, PeerTabIndex tab, - {bool isFileTransfer = false, - bool isViewCamera = false, - bool isTcpTunneling = false, - bool isRDP = false, - bool isTerminal = false}) async { - var password = ''; - bool isSharedPassword = false; - if (tab == PeerTabIndex.ab) { - // If recent peer's alias is empty, set it to ab's alias - // Because the platform is not set, it may not take effect, but it is more important not to display if the connection is not successful - if (peer.alias.isNotEmpty && - (await bind.mainGetPeerOption(id: peer.id, key: "alias")).isEmpty) { - await bind.mainSetPeerAlias( - id: peer.id, - alias: peer.alias, - ); - } - if (!gFFI.abModel.current.isPersonal()) { - if (peer.password.isNotEmpty) { - password = peer.password; - isSharedPassword = true; - } - if (password.isEmpty) { - final abPassword = gFFI.abModel.getdefaultSharedPassword(); - if (abPassword != null) { - password = abPassword; - isSharedPassword = true; - } - } - } - } - connect(context, peer.id, - password: password, - isSharedPassword: isSharedPassword, - isFileTransfer: isFileTransfer, - isTerminal: isTerminal, - isViewCamera: isViewCamera, - isTcpTunneling: isTcpTunneling, - isRDP: isRDP); -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/peer_tab_page.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/peer_tab_page.dart deleted file mode 100644 index 4849f27..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/peer_tab_page.dart +++ /dev/null @@ -1,1039 +0,0 @@ -import 'dart:ui' as ui; - -import 'package:bot_toast/bot_toast.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common/widgets/address_book.dart'; -import 'package:flutter_hbb/common/widgets/dialog.dart'; -import 'package:flutter_hbb/common/widgets/my_group.dart'; -import 'package:flutter_hbb/common/widgets/peers_view.dart'; -import 'package:flutter_hbb/common/widgets/peer_card.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/desktop/widgets/popup_menu.dart'; -import 'package:flutter_hbb/desktop/widgets/material_mod_popup_menu.dart' - as mod_menu; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/models/ab_model.dart'; -import 'package:flutter_hbb/models/peer_model.dart'; - -import 'package:flutter_hbb/models/peer_tab_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; -import 'package:provider/provider.dart'; -import 'package:pull_down_button/pull_down_button.dart'; - -import '../../common.dart'; -import '../../models/platform_model.dart'; - -class PeerTabPage extends StatefulWidget { - const PeerTabPage({Key? key}) : super(key: key); - @override - State createState() => _PeerTabPageState(); -} - -class _TabEntry { - final Widget widget; - final Function({dynamic hint})? load; - _TabEntry(this.widget, [this.load]); -} - -EdgeInsets? _menuPadding() { - return (isDesktop || isWebDesktop) ? kDesktopMenuPadding : null; -} - -class _PeerTabPageState extends State - with SingleTickerProviderStateMixin { - final List<_TabEntry> entries = [ - _TabEntry(RecentPeersView( - menuPadding: _menuPadding(), - )), - _TabEntry(FavoritePeersView( - menuPadding: _menuPadding(), - )), - _TabEntry(DiscoveredPeersView( - menuPadding: _menuPadding(), - )), - _TabEntry( - AddressBook( - menuPadding: _menuPadding(), - ), - ({dynamic hint}) => gFFI.abModel.pullAb( - force: hint == null ? ForcePullAb.listAndCurrent : null, - quiet: false)), - _TabEntry( - MyGroup( - menuPadding: _menuPadding(), - ), - ({dynamic hint}) => gFFI.groupModel.pull(force: hint == null), - ), - ]; - RelativeRect? mobileTabContextMenuPos; - - final isOptVisiableFixed = isOptionFixed(kOptionPeerTabVisible); - - _PeerTabPageState() { - _loadLocalOptions(); - } - - void _loadLocalOptions() { - final uiType = bind.getLocalFlutterOption(k: kOptionPeerCardUiType); - if (uiType != '') { - peerCardUiType.value = int.parse(uiType) == 0 - ? PeerUiType.grid - : int.parse(uiType) == 1 - ? PeerUiType.tile - : PeerUiType.list; - } - hideAbTagsPanel.value = - bind.mainGetLocalOption(key: kOptionHideAbTagsPanel) == 'Y'; - } - - Future handleTabSelection(int tabIndex) async { - if (tabIndex < entries.length) { - if (tabIndex != gFFI.peerTabModel.currentTab) { - gFFI.peerTabModel.setCurrentTabCachedPeers([]); - } - gFFI.peerTabModel.setCurrentTab(tabIndex); - entries[tabIndex].load?.call(hint: false); - } - } - - @override - Widget build(BuildContext context) { - final model = Provider.of(context); - Widget selectionWrap(Widget widget) { - return model.multiSelectionMode ? createMultiSelectionBar(model) : widget; - } - - return Column( - textBaseline: TextBaseline.ideographic, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Obx(() => SizedBox( - height: 32, - child: Container( - padding: stateGlobal.isPortrait.isTrue - ? EdgeInsets.symmetric(horizontal: 2) - : null, - child: selectionWrap(Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: visibleContextMenuListener( - _createSwitchBar(context))), - if (stateGlobal.isPortrait.isTrue) - ..._portraitRightActions(context) - else - ..._landscapeRightActions(context) - ], - )), - ), - ).paddingOnly(right: stateGlobal.isPortrait.isTrue ? 0 : 12)), - _createPeersView(), - ], - ); - } - - Widget _createSwitchBar(BuildContext context) { - final model = Provider.of(context); - var counter = -1; - return ReorderableListView( - buildDefaultDragHandles: false, - onReorder: model.reorder, - scrollDirection: Axis.horizontal, - physics: NeverScrollableScrollPhysics(), - children: model.visibleEnabledOrderedIndexs.map((t) { - final selected = model.currentTab == t; - final color = selected - ? MyTheme.tabbar(context).selectedTextColor - : MyTheme.tabbar(context).unSelectedTextColor - ?..withOpacity(0.5); - final hover = false.obs; - final deco = BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: BorderRadius.circular(6)); - final decoBorder = BoxDecoration( - border: Border( - bottom: BorderSide(width: 2, color: color!), - )); - counter += 1; - return ReorderableDragStartListener( - key: ValueKey(t), - index: counter, - child: Obx(() => Tooltip( - preferBelow: false, - message: model.tabTooltip(t), - onTriggered: isMobile ? mobileShowTabVisibilityMenu : null, - child: InkWell( - child: Container( - decoration: (hover.value - ? (selected ? decoBorder : deco) - : (selected ? decoBorder : null)), - child: Icon(model.tabIcon(t), color: color) - .paddingSymmetric(horizontal: 4), - ).paddingSymmetric(horizontal: 4), - onTap: isOptionFixed(kOptionPeerTabIndex) - ? null - : () async { - await handleTabSelection(t); - await bind.setLocalFlutterOption( - k: kOptionPeerTabIndex, v: t.toString()); - }, - onHover: (value) => hover.value = value, - ), - ))); - }).toList()); - } - - Widget _createPeersView() { - final model = Provider.of(context); - Widget child; - if (model.visibleEnabledOrderedIndexs.isEmpty) { - child = visibleContextMenuListener(Row( - children: [Expanded(child: InkWell())], - )); - } else { - if (model.visibleEnabledOrderedIndexs.contains(model.currentTab)) { - child = entries[model.currentTab].widget; - } else { - debugPrint("should not happen! currentTab not in visibleIndexs"); - Future.delayed(Duration.zero, () { - model.setCurrentTab(model.visibleEnabledOrderedIndexs[0]); - }); - child = entries[0].widget; - } - } - return Expanded( - child: child.marginSymmetric( - vertical: (isDesktop || isWebDesktop) ? 12.0 : 6.0)); - } - - Widget _createRefresh( - {required PeerTabIndex index, required RxBool loading}) { - final model = Provider.of(context); - final textColor = Theme.of(context).textTheme.titleLarge?.color; - return Offstage( - offstage: model.currentTab != index.index, - child: Tooltip( - message: translate('Refresh'), - child: RefreshWidget( - onPressed: () { - if (gFFI.peerTabModel.currentTab < entries.length) { - entries[gFFI.peerTabModel.currentTab].load?.call(); - } - }, - spinning: loading, - child: RotatedBox( - quarterTurns: 2, - child: Icon( - Icons.refresh, - size: 18, - color: textColor, - ))), - ), - ); - } - - Widget _createPeerViewTypeSwitch(BuildContext context) { - return PeerViewDropdown(); - } - - Widget _createMultiSelection() { - final textColor = Theme.of(context).textTheme.titleLarge?.color; - final model = Provider.of(context); - return _hoverAction( - toolTip: translate('Select'), - context: context, - onTap: () { - model.setMultiSelectionMode(true); - if (isMobile && Navigator.canPop(context)) { - Navigator.pop(context); - } - }, - child: SvgPicture.asset( - "assets/checkbox-outline.svg", - width: 18, - height: 18, - colorFilter: svgColor(textColor), - ), - ); - } - - void mobileShowTabVisibilityMenu() { - final model = gFFI.peerTabModel; - final items = List.empty(growable: true); - for (int i = 0; i < PeerTabModel.maxTabCount; i++) { - if (!model.isEnabled[i]) continue; - items.add(PopupMenuItem( - height: kMinInteractiveDimension * 0.8, - onTap: isOptVisiableFixed - ? null - : () => model.setTabVisible(i, !model.isVisibleEnabled[i]), - enabled: !isOptVisiableFixed, - child: Row( - children: [ - Checkbox( - value: model.isVisibleEnabled[i], - onChanged: isOptVisiableFixed - ? null - : (_) { - model.setTabVisible(i, !model.isVisibleEnabled[i]); - if (Navigator.canPop(context)) { - Navigator.pop(context); - } - }), - Expanded(child: Text(model.tabTooltip(i))), - ], - ), - )); - } - if (mobileTabContextMenuPos != null) { - showMenu( - context: context, position: mobileTabContextMenuPos!, items: items); - } - } - - Widget visibleContextMenuListener(Widget child) { - if (!(isDesktop || isWebDesktop)) { - return GestureDetector( - onLongPressDown: (e) { - final x = e.globalPosition.dx; - final y = e.globalPosition.dy; - mobileTabContextMenuPos = RelativeRect.fromLTRB(x, y, x, y); - }, - onLongPressUp: () { - mobileShowTabVisibilityMenu(); - }, - child: child, - ); - } else { - return Listener( - onPointerDown: (e) { - if (e.kind != ui.PointerDeviceKind.mouse) { - return; - } - if (e.buttons == 2) { - showRightMenu( - (CancelFunc cancelFunc) { - return visibleContextMenu(cancelFunc); - }, - target: e.position, - ); - } - }, - child: child); - } - } - - Widget visibleContextMenu(CancelFunc cancelFunc) { - final model = Provider.of(context); - final menu = List.empty(growable: true); - for (int i = 0; i < model.orders.length; i++) { - int tabIndex = model.orders[i]; - if (tabIndex < 0 || tabIndex >= PeerTabModel.maxTabCount) continue; - if (!model.isEnabled[tabIndex]) continue; - menu.add(MenuEntrySwitchSync( - switchType: SwitchType.scheckbox, - text: model.tabTooltip(tabIndex), - currentValue: model.isVisibleEnabled[tabIndex], - setter: (show) async { - model.setTabVisible(tabIndex, show); - // Do not hide the current menu (checkbox) - // cancelFunc(); - }, - enabled: (!isOptVisiableFixed).obs)); - } - return mod_menu.PopupMenu( - items: menu - .map((entry) => entry.build( - context, - const MenuConfig( - commonColor: MyTheme.accent, - height: 20.0, - dividerHeight: 12.0, - ))) - .expand((i) => i) - .toList()); - } - - Widget createMultiSelectionBar(PeerTabModel model) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Offstage( - offstage: model.selectedPeers.isEmpty, - child: Row( - children: [ - deleteSelection(), - addSelectionToFav(), - addSelectionToAb(), - editSelectionTags(), - ], - ), - ), - Row( - children: [ - selectionCount(model.selectedPeers.length), - selectAll(model), - closeSelection(), - ], - ) - ], - ); - } - - Widget deleteSelection() { - final model = Provider.of(context); - if (model.currentTab == PeerTabIndex.group.index) { - return Offstage(); - } - return _hoverAction( - context: context, - toolTip: translate('Delete'), - onTap: () { - onSubmit() async { - final peers = model.selectedPeers; - switch (model.currentTab) { - case 0: - for (var p in peers) { - await bind.mainRemovePeer(id: p.id); - } - bind.mainLoadRecentPeers(); - break; - case 1: - final favs = (await bind.mainGetFav()).toList(); - peers.map((p) { - favs.remove(p.id); - }).toList(); - await bind.mainStoreFav(favs: favs); - bind.mainLoadFavPeers(); - break; - case 2: - for (var p in peers) { - await bind.mainRemoveDiscovered(id: p.id); - } - bind.mainLoadLanPeers(); - break; - case 3: - await gFFI.abModel.deletePeers(peers.map((p) => p.id).toList()); - break; - default: - break; - } - gFFI.peerTabModel.setMultiSelectionMode(false); - if (model.currentTab != 3) showToast(translate('Successful')); - } - - deleteConfirmDialog(onSubmit, translate('Delete')); - }, - child: Icon(Icons.delete, color: Colors.red)); - } - - Widget addSelectionToFav() { - final model = Provider.of(context); - return Offstage( - offstage: - model.currentTab != PeerTabIndex.recent.index, // show based on recent - child: _hoverAction( - context: context, - toolTip: translate('Add to Favorites'), - onTap: () async { - final peers = model.selectedPeers; - final favs = (await bind.mainGetFav()).toList(); - for (var p in peers) { - if (!favs.contains(p.id)) { - favs.add(p.id); - } - } - await bind.mainStoreFav(favs: favs); - model.setMultiSelectionMode(false); - showToast(translate('Successful')); - }, - child: Icon(PeerTabModel.icons[PeerTabIndex.fav.index]), - ).marginOnly(left: !(isDesktop || isWebDesktop) ? 11 : 6), - ); - } - - Widget addSelectionToAb() { - final model = Provider.of(context); - final addressbooks = gFFI.abModel.addressBooksCanWrite(); - if (model.currentTab == PeerTabIndex.ab.index) { - addressbooks.remove(gFFI.abModel.currentName.value); - } - return Offstage( - offstage: !gFFI.userModel.isLogin || addressbooks.isEmpty, - child: _hoverAction( - context: context, - toolTip: translate('Add to address book'), - onTap: () { - final peers = model.selectedPeers.map((e) => Peer.copy(e)).toList(); - addPeersToAbDialog(peers); - model.setMultiSelectionMode(false); - }, - child: Icon(PeerTabModel.icons[PeerTabIndex.ab.index]), - ).marginOnly(left: !(isDesktop || isWebDesktop) ? 11 : 6), - ); - } - - Widget editSelectionTags() { - final model = Provider.of(context); - return Offstage( - offstage: !gFFI.userModel.isLogin || - model.currentTab != PeerTabIndex.ab.index || - gFFI.abModel.currentAbTags.isEmpty, - child: _hoverAction( - context: context, - toolTip: translate('Edit Tag'), - onTap: () { - editAbTagDialog(List.empty(), (selectedTags) async { - final peers = model.selectedPeers; - await gFFI.abModel.changeTagForPeers( - peers.map((p) => p.id).toList(), selectedTags); - model.setMultiSelectionMode(false); - showToast(translate('Successful')); - }); - }, - child: Icon(Icons.tag)) - .marginOnly(left: !(isDesktop || isWebDesktop) ? 11 : 6), - ); - } - - Widget selectionCount(int count) { - return Align( - alignment: Alignment.center, - child: Text('$count ${translate('Selected')}'), - ); - } - - Widget selectAll(PeerTabModel model) { - return Offstage( - offstage: - model.selectedPeers.length >= model.currentTabCachedPeers.length, - child: _hoverAction( - context: context, - toolTip: translate('Select All'), - onTap: () { - model.selectAll(); - }, - child: Icon(Icons.select_all), - ).marginOnly(left: 6), - ); - } - - Widget closeSelection() { - final model = Provider.of(context); - return _hoverAction( - context: context, - toolTip: translate('Close'), - onTap: () { - model.setMultiSelectionMode(false); - }, - child: Icon(Icons.clear)) - .marginOnly(left: 6); - } - - Widget _toggleTags() { - return _hoverAction( - context: context, - toolTip: translate('Toggle Tags'), - hoverableWhenfalse: hideAbTagsPanel, - child: Icon( - Icons.tag_rounded, - size: 18, - ), - onTap: () async { - await bind.mainSetLocalOption( - key: kOptionHideAbTagsPanel, - value: hideAbTagsPanel.value ? defaultOptionNo : "Y"); - hideAbTagsPanel.value = !hideAbTagsPanel.value; - }); - } - - List _landscapeRightActions(BuildContext context) { - final model = Provider.of(context); - return [ - const PeerSearchBar().marginOnly(right: 13), - _createRefresh( - index: PeerTabIndex.ab, loading: gFFI.abModel.currentAbLoading), - _createRefresh( - index: PeerTabIndex.group, loading: gFFI.groupModel.groupLoading), - Offstage( - offstage: model.currentTabCachedPeers.isEmpty, - child: _createMultiSelection(), - ), - _createPeerViewTypeSwitch(context), - Offstage( - offstage: model.currentTab == PeerTabIndex.recent.index, - child: PeerSortDropdown(), - ), - Offstage( - offstage: model.currentTab != PeerTabIndex.ab.index, - child: _toggleTags(), - ), - ]; - } - - List _portraitRightActions(BuildContext context) { - final model = Provider.of(context); - final screenWidth = MediaQuery.of(context).size.width; - final leftIconSize = Theme.of(context).iconTheme.size ?? 24; - final leftActionsSize = - (leftIconSize + (4 + 4) * 2) * model.visibleEnabledOrderedIndexs.length; - final availableWidth = screenWidth - 10 * 2 - leftActionsSize - 2 * 2; - final searchWidth = 120; - final otherActionWidth = 18 + 10; - - dropDown(List menus) { - final padding = 6.0; - final textColor = Theme.of(context).textTheme.titleLarge?.color; - return PullDownButton( - buttonBuilder: - (BuildContext context, Future Function() showMenu) { - return _hoverAction( - context: context, - toolTip: translate('More'), - child: SvgPicture.asset( - "assets/chevron_up_chevron_down.svg", - width: 18, - height: 18, - colorFilter: svgColor(textColor), - ), - onTap: showMenu, - ); - }, - routeTheme: PullDownMenuRouteTheme( - width: menus.length * (otherActionWidth + padding * 2) * 1.0), - itemBuilder: (context) => [ - PullDownMenuEntryImpl( - child: Row( - mainAxisSize: MainAxisSize.min, - children: menus - .map((e) => - Material(child: e.paddingSymmetric(horizontal: padding))) - .toList(), - ), - ) - ], - ); - } - - // Always show search, refresh - List actions = [ - const PeerSearchBar(), - if (model.currentTab == PeerTabIndex.ab.index) - _createRefresh( - index: PeerTabIndex.ab, loading: gFFI.abModel.currentAbLoading), - if (model.currentTab == PeerTabIndex.group.index) - _createRefresh( - index: PeerTabIndex.group, loading: gFFI.groupModel.groupLoading), - ]; - final List dynamicActions = [ - if (model.currentTabCachedPeers.isNotEmpty) _createMultiSelection(), - if (model.currentTab != PeerTabIndex.recent.index) PeerSortDropdown(), - if (model.currentTab == PeerTabIndex.ab.index) _toggleTags() - ]; - final rightWidth = availableWidth - - searchWidth - - (actions.length == 2 ? otherActionWidth : 0); - final availablePositions = rightWidth ~/ otherActionWidth; - - if (availablePositions < dynamicActions.length && - dynamicActions.length > 1) { - if (availablePositions < 2) { - actions.addAll([ - dropDown(dynamicActions), - ]); - } else { - actions.addAll([ - ...dynamicActions.sublist(0, availablePositions - 1), - dropDown(dynamicActions.sublist(availablePositions - 1)), - ]); - } - } else { - actions.addAll(dynamicActions); - } - return actions; - } -} - -class PeerSearchBar extends StatefulWidget { - const PeerSearchBar({Key? key}) : super(key: key); - - @override - State createState() => _PeerSearchBarState(); -} - -class _PeerSearchBarState extends State { - var drawer = false; - - @override - Widget build(BuildContext context) { - return drawer - ? _buildSearchBar() - : _hoverAction( - context: context, - toolTip: translate('Search'), - padding: const EdgeInsets.only(right: 2), - onTap: () { - setState(() { - drawer = true; - }); - }, - child: Icon( - Icons.search_rounded, - color: Theme.of(context).hintColor, - )); - } - - Widget _buildSearchBar() { - RxBool focused = false.obs; - FocusNode focusNode = FocusNode(); - focusNode.addListener(() { - focused.value = focusNode.hasFocus; - peerSearchTextController.selection = TextSelection( - baseOffset: 0, - extentOffset: peerSearchTextController.value.text.length); - }); - return Obx(() => Container( - width: stateGlobal.isPortrait.isTrue ? 120 : 140, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: BorderRadius.circular(6), - ), - child: Row( - children: [ - Expanded( - child: Row( - children: [ - Icon( - Icons.search_rounded, - color: Theme.of(context).hintColor, - ).marginSymmetric(horizontal: 4), - Expanded( - child: TextField( - autofocus: true, - controller: peerSearchTextController, - onChanged: (searchText) { - peerSearchText.value = searchText; - }, - focusNode: focusNode, - textAlign: TextAlign.start, - maxLines: 1, - cursorColor: Theme.of(context) - .textTheme - .titleLarge - ?.color - ?.withOpacity(0.5), - cursorHeight: 18, - cursorWidth: 1, - style: const TextStyle(fontSize: 14), - decoration: InputDecoration( - contentPadding: - const EdgeInsets.symmetric(vertical: 6), - hintText: - focused.value ? null : translate("Search ID"), - hintStyle: TextStyle( - fontSize: 14, color: Theme.of(context).hintColor), - border: InputBorder.none, - isDense: true, - ), - ).workaroundFreezeLinuxMint(), - ), - // Icon(Icons.close), - IconButton( - alignment: Alignment.centerRight, - padding: const EdgeInsets.only(right: 2), - onPressed: () { - setState(() { - peerSearchTextController.clear(); - peerSearchText.value = ""; - drawer = false; - }); - }, - icon: Tooltip( - message: translate('Close'), - child: Icon( - Icons.close, - color: Theme.of(context).hintColor, - )), - ), - ], - ), - ) - ], - ), - )); - } -} - -class PeerViewDropdown extends StatefulWidget { - const PeerViewDropdown({super.key}); - - @override - State createState() => _PeerViewDropdownState(); -} - -class _PeerViewDropdownState extends State { - @override - Widget build(BuildContext context) { - final List types = [ - PeerUiType.grid, - PeerUiType.tile, - PeerUiType.list - ]; - final style = TextStyle( - color: Theme.of(context).textTheme.titleLarge?.color, - fontSize: MenuConfig.fontSize, - fontWeight: FontWeight.normal); - List items = List.empty(growable: true); - items.add(PopupMenuItem( - height: 36, - enabled: false, - child: Text(translate("Change view"), style: style))); - for (var e in PeerUiType.values) { - items.add(PopupMenuItem( - height: 36, - child: Obx(() => Center( - child: SizedBox( - height: 36, - child: getRadio( - Tooltip( - message: translate(types.indexOf(e) == 0 - ? 'Big tiles' - : types.indexOf(e) == 1 - ? 'Small tiles' - : 'List'), - child: Icon( - e == PeerUiType.grid - ? Icons.grid_view_rounded - : e == PeerUiType.list - ? Icons.view_list_rounded - : Icons.view_agenda_rounded, - size: 18, - )), - e, - peerCardUiType.value, - dense: true, - isOptionFixed(kOptionPeerCardUiType) - ? null - : (PeerUiType? v) async { - if (v != null) { - peerCardUiType.value = v; - setState(() {}); - await bind.setLocalFlutterOption( - k: kOptionPeerCardUiType, - v: peerCardUiType.value.index.toString(), - ); - if (Navigator.canPop(context)) { - Navigator.pop(context); - } - } - }), - ), - )))); - } - - var menuPos = RelativeRect.fromLTRB(0, 0, 0, 0); - return _hoverAction( - context: context, - toolTip: translate('Change view'), - child: Icon( - peerCardUiType.value == PeerUiType.grid - ? Icons.grid_view_rounded - : peerCardUiType.value == PeerUiType.list - ? Icons.view_list_rounded - : Icons.view_agenda_rounded, - size: 18, - ), - onTapDown: (details) { - final x = details.globalPosition.dx; - final y = details.globalPosition.dy; - menuPos = RelativeRect.fromLTRB(x, y, x, y); - }, - onTap: () => showMenu( - context: context, - position: menuPos, - items: items, - elevation: 8, - )); - } -} - -class PeerSortDropdown extends StatefulWidget { - const PeerSortDropdown({super.key}); - - @override - State createState() => _PeerSortDropdownState(); -} - -class _PeerSortDropdownState extends State { - _PeerSortDropdownState() { - if (!PeerSortType.values.contains(peerSort.value)) { - _loadLocalOptions(); - } - } - - void _loadLocalOptions() { - peerSort.value = PeerSortType.remoteId; - bind.setLocalFlutterOption( - k: kOptionPeerSorting, - v: peerSort.value, - ); - } - - @override - Widget build(BuildContext context) { - final style = TextStyle( - color: Theme.of(context).textTheme.titleLarge?.color, - fontSize: MenuConfig.fontSize, - fontWeight: FontWeight.normal); - List items = List.empty(growable: true); - items.add(PopupMenuItem( - height: 36, - enabled: false, - child: Text(translate("Sort by"), style: style))); - for (var e in PeerSortType.values) { - items.add(PopupMenuItem( - height: 36, - child: Obx(() => Center( - child: SizedBox( - height: 36, - child: getRadio( - Text(translate(e), style: style), e, peerSort.value, - dense: true, (String? v) async { - if (v != null) { - peerSort.value = v; - await bind.setLocalFlutterOption( - k: kOptionPeerSorting, - v: peerSort.value, - ); - } - }), - ), - )))); - } - - var menuPos = RelativeRect.fromLTRB(0, 0, 0, 0); - return _hoverAction( - context: context, - toolTip: translate('Sort by'), - child: Icon( - Icons.sort_rounded, - size: 18, - ), - onTapDown: (details) { - final x = details.globalPosition.dx; - final y = details.globalPosition.dy; - menuPos = RelativeRect.fromLTRB(x, y, x, y); - }, - onTap: () => showMenu( - context: context, - position: menuPos, - items: items, - elevation: 8, - ), - ); - } -} - -class RefreshWidget extends StatefulWidget { - final VoidCallback onPressed; - final Widget child; - final RxBool? spinning; - const RefreshWidget( - {super.key, required this.onPressed, required this.child, this.spinning}); - - @override - State createState() => RefreshWidgetState(); -} - -class RefreshWidgetState extends State { - double turns = 0.0; - bool hover = false; - - @override - void initState() { - super.initState(); - widget.spinning?.listen((v) { - if (v && mounted) { - setState(() { - turns += 1; - }); - } - }); - } - - @override - Widget build(BuildContext context) { - final deco = BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: BorderRadius.circular(6), - ); - return AnimatedRotation( - turns: turns, - duration: const Duration(milliseconds: 200), - onEnd: () { - if (widget.spinning?.value == true && mounted) { - setState(() => turns += 1.0); - } - }, - child: Container( - padding: EdgeInsets.all(4.0), - margin: EdgeInsets.symmetric(horizontal: 1), - decoration: hover ? deco : null, - child: InkWell( - onTap: () { - if (mounted) setState(() => turns += 1.0); - widget.onPressed(); - }, - onHover: (value) { - if (mounted) { - setState(() { - hover = value; - }); - } - }, - child: widget.child), - )); - } -} - -Widget _hoverAction( - {required BuildContext context, - required Widget child, - required Function() onTap, - required String toolTip, - GestureTapDownCallback? onTapDown, - RxBool? hoverableWhenfalse, - EdgeInsetsGeometry padding = const EdgeInsets.all(4.0)}) { - final hover = false.obs; - final deco = BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: BorderRadius.circular(6), - ); - return Tooltip( - message: toolTip, - child: Obx( - () => Container( - margin: EdgeInsets.symmetric(horizontal: 1), - decoration: - (hover.value || hoverableWhenfalse?.value == false) ? deco : null, - child: InkWell( - onHover: (value) => hover.value = value, - onTap: onTap, - onTapDown: onTapDown, - child: Container(padding: padding, child: child))), - ), - ); -} - -class PullDownMenuEntryImpl extends StatelessWidget - implements PullDownMenuEntry { - final Widget child; - const PullDownMenuEntryImpl({super.key, required this.child}); - - @override - Widget build(BuildContext context) { - return child; - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/peers_view.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/peers_view.dart deleted file mode 100644 index 5be5af2..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/peers_view.dart +++ /dev/null @@ -1,598 +0,0 @@ -import 'dart:async'; -import 'dart:collection'; - -import 'package:dynamic_layouts/dynamic_layouts.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/models/ab_model.dart'; -import 'package:flutter_hbb/models/peer_tab_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:get/get.dart'; -import 'package:provider/provider.dart'; -import 'package:visibility_detector/visibility_detector.dart'; -import 'package:window_manager/window_manager.dart'; - -import '../../common.dart'; -import '../../models/peer_model.dart'; -import '../../models/platform_model.dart'; -import 'peer_card.dart'; - -typedef PeerFilter = bool Function(Peer peer); -typedef PeerCardBuilder = Widget Function(Peer peer); - -class PeerSortType { - static const String remoteId = 'Remote ID'; - static const String remoteHost = 'Remote Host'; - static const String username = 'Username'; - static const String status = 'Status'; - - static List values = [ - PeerSortType.remoteId, - PeerSortType.remoteHost, - PeerSortType.username, - PeerSortType.status - ]; -} - -class LoadEvent { - static const String recent = 'load_recent_peers'; - static const String favorite = 'load_fav_peers'; - static const String lan = 'load_lan_peers'; - static const String addressBook = 'load_address_book_peers'; - static const String group = 'load_group_peers'; -} - -class PeersModelName { - static const String recent = 'recent peer'; - static const String favorite = 'fav peer'; - static const String lan = 'discovered peer'; - static const String addressBook = 'address book peer'; - static const String group = 'group peer'; -} - -/// for peer search text, global obs value -final peerSearchText = "".obs; - -/// for peer sort, global obs value -RxString? _peerSort; -RxString get peerSort { - _peerSort ??= bind.getLocalFlutterOption(k: kOptionPeerSorting).obs; - return _peerSort!; -} - -// list for listener -RxList get obslist => [peerSearchText, peerSort].obs; - -final peerSearchTextController = - TextEditingController(text: peerSearchText.value); - -class _PeersView extends StatefulWidget { - final Peers peers; - final PeerFilter? peerFilter; - final PeerCardBuilder peerCardBuilder; - final PeerTabIndex peerTabIndex; - - const _PeersView( - {required this.peers, - required this.peerCardBuilder, - required this.peerTabIndex, - this.peerFilter, - Key? key}) - : super(key: key); - - @override - _PeersViewState createState() => _PeersViewState(); -} - -/// State for the peer widget. -class _PeersViewState extends State<_PeersView> - with WindowListener, WidgetsBindingObserver { - static const int _maxQueryCount = 3; - final HashMap _emptyMessages = HashMap.from({ - LoadEvent.recent: 'empty_recent_tip', - LoadEvent.favorite: 'empty_favorite_tip', - LoadEvent.lan: 'empty_lan_tip', - LoadEvent.addressBook: 'empty_address_book_tip', - }); - final space = (isDesktop || isWebDesktop) ? 12.0 : 8.0; - final _curPeers = {}; - var _lastChangeTime = DateTime.now(); - var _lastQueryPeers = {}; - var _lastQueryTime = DateTime.now(); - var _lastWindowRestoreTime = DateTime.now(); - var _queryCount = 0; - var _exit = false; - bool _isActive = true; - - final _scrollController = ScrollController(); - - _PeersViewState() { - _startCheckOnlines(); - } - - @override - void initState() { - windowManager.addListener(this); - WidgetsBinding.instance.addObserver(this); - super.initState(); - } - - @override - void dispose() { - windowManager.removeListener(this); - WidgetsBinding.instance.removeObserver(this); - _exit = true; - super.dispose(); - } - - @override - void onWindowFocus() { - _queryCount = 0; - _isActive = true; - } - - @override - void onWindowBlur() { - // We need this comparison because window restore (on Windows) also triggers `onWindowBlur()`. - // Maybe it's a bug of the window manager, but the source code seems to be correct. - // - // Although `onWindowRestore()` is called after `onWindowBlur()` in my test, - // we need the following comparison to ensure that `_isActive` is true in the end. - if (isWindows && - DateTime.now().difference(_lastWindowRestoreTime) < - const Duration(milliseconds: 300)) { - return; - } - _queryCount = _maxQueryCount; - _isActive = false; - } - - @override - void onWindowRestore() { - // Window restore (on MacOS and Linux) also triggers `onWindowFocus()`. - // But on Windows, it triggers `onWindowBlur()`, mybe it's a bug of the window manager. - if (!isWindows) return; - _queryCount = 0; - _isActive = true; - _lastWindowRestoreTime = DateTime.now(); - } - - @override - void onWindowMinimize() { - // Window minimize also triggers `onWindowBlur()`. - } - - // This function is required for mobile. - // `onWindowFocus` works fine for desktop. - @override - void didChangeAppLifecycleState(AppLifecycleState state) { - super.didChangeAppLifecycleState(state); - if (isDesktop || isWebDesktop) return; - if (state == AppLifecycleState.resumed) { - _isActive = true; - _queryCount = 0; - } else if (state == AppLifecycleState.inactive) { - _isActive = false; - } - } - - @override - Widget build(BuildContext context) { - // We should avoid too many rebuilds. MacOS(m1, 14.6.1) on Flutter 3.19.6. - // Continious rebuilds of `ChangeNotifierProvider` will cause memory leak. - // Simple demo can reproduce this issue. - return ChangeNotifierProvider.value( - value: widget.peers, - child: Consumer(builder: (context, peers, child) { - if (peers.peers.isEmpty) { - gFFI.peerTabModel.setCurrentTabCachedPeers([]); - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.sentiment_very_dissatisfied_rounded, - color: Theme.of(context).tabBarTheme.labelColor, - size: 40, - ).paddingOnly(bottom: 10), - Text( - translate( - _emptyMessages[widget.peers.loadEvent] ?? 'Empty', - ), - textAlign: TextAlign.center, - style: TextStyle( - color: Theme.of(context).tabBarTheme.labelColor, - ), - ), - ], - ), - ); - } else { - return _buildPeersView(peers); - } - }), - ); - } - - onVisibilityChanged(VisibilityInfo info) { - final peerId = _peerId((info.key as ValueKey).value); - if (info.visibleFraction > 0.00001) { - _curPeers.add(peerId); - } else { - _curPeers.remove(peerId); - } - _lastChangeTime = DateTime.now(); - } - - String _cardId(String id) => widget.peers.name + id; - String _peerId(String cardId) => cardId.replaceAll(widget.peers.name, ''); - - Widget _buildPeersView(Peers peers) { - final updateEvent = peers.event; - final body = ObxValue((filters) { - return FutureBuilder>( - builder: (context, snapshot) { - if (snapshot.hasData) { - var peers = snapshot.data!; - if (peers.length > 1000) peers = peers.sublist(0, 1000); - gFFI.peerTabModel.setCurrentTabCachedPeers(peers); - buildOnePeer(Peer peer, bool isPortrait) { - final visibilityChild = VisibilityDetector( - key: ValueKey(_cardId(peer.id)), - onVisibilityChanged: onVisibilityChanged, - child: widget.peerCardBuilder(peer), - ); - // `Provider.of(context)` will causes infinete loop. - // Because `gFFI.peerTabModel.setCurrentTabCachedPeers(peers)` will trigger `notifyListeners()`. - // - // No need to listen the currentTab change event. - // Because the currentTab change event will trigger the peers change event, - // and the peers change event will trigger _buildPeersView(). - return !isPortrait - ? Obx(() => peerCardUiType.value == PeerUiType.list - ? Container(height: 45, child: visibilityChild) - : peerCardUiType.value == PeerUiType.grid - ? SizedBox( - width: 220, height: 140, child: visibilityChild) - : SizedBox( - width: 220, height: 42, child: visibilityChild)) - : Container(child: visibilityChild); - } - - // We should avoid too many rebuilds. Win10(Some machines) on Flutter 3.19.6. - // Continious rebuilds of `ListView.builder` will cause memory leak. - // Simple demo can reproduce this issue. - final Widget child = Obx(() => stateGlobal.isPortrait.isTrue - ? ListView.builder( - itemCount: peers.length, - itemBuilder: (BuildContext context, int index) { - return buildOnePeer(peers[index], true).marginOnly( - top: index == 0 ? 0 : space / 2, bottom: space / 2); - }, - ) - : peerCardUiType.value == PeerUiType.list - ? ListView.builder( - controller: _scrollController, - itemCount: peers.length, - itemBuilder: (BuildContext context, int index) { - return buildOnePeer(peers[index], false).marginOnly( - right: space, - top: index == 0 ? 0 : space / 2, - bottom: space / 2); - }, - ) - : DynamicGridView.builder( - gridDelegate: SliverGridDelegateWithWrapping( - mainAxisSpacing: space / 2, - crossAxisSpacing: space), - itemCount: peers.length, - itemBuilder: (BuildContext context, int index) { - return buildOnePeer(peers[index], false); - })); - - if (updateEvent == UpdateEvent.load) { - _curPeers.clear(); - _curPeers.addAll(peers.map((e) => e.id)); - _queryOnlines(true); - } - return child; - } else { - return const Center( - child: CircularProgressIndicator(), - ); - } - }, - future: matchPeers(filters[0].value, filters[1].value, peers.peers), - ); - }, obslist); - - return body; - } - - var _queryInterval = const Duration(seconds: 20); - - void _startCheckOnlines() { - () async { - final p = await bind.mainIsUsingPublicServer(); - if (!p) { - _queryInterval = const Duration(seconds: 6); - } - while (!_exit) { - final now = DateTime.now(); - if (!setEquals(_curPeers, _lastQueryPeers)) { - if (now.difference(_lastChangeTime) > const Duration(seconds: 1)) { - _queryOnlines(false); - } - } else { - final skipIfIsWeb = - isWeb && !(stateGlobal.isWebVisible && stateGlobal.isInMainPage); - final skipIfMobile = - (isAndroid || isIOS) && !stateGlobal.isInMainPage; - final skipIfNotActive = skipIfIsWeb || skipIfMobile || !_isActive; - if (!skipIfNotActive && (_queryCount < _maxQueryCount || !p)) { - if (now.difference(_lastQueryTime) >= _queryInterval) { - if (_curPeers.isNotEmpty) { - bind.queryOnlines(ids: _curPeers.toList(growable: false)); - _lastQueryTime = DateTime.now(); - _queryCount += 1; - } - } - } - } - await Future.delayed(const Duration(milliseconds: 300)); - } - }(); - } - - _queryOnlines(bool isLoadEvent) { - if (_curPeers.isNotEmpty) { - bind.queryOnlines(ids: _curPeers.toList(growable: false)); - _queryCount = 0; - } - _lastQueryPeers = {..._curPeers}; - if (isLoadEvent) { - _lastChangeTime = DateTime.now(); - } else { - _lastQueryTime = DateTime.now().subtract(_queryInterval); - } - } - - Future>? matchPeers( - String searchText, String sortedBy, List peers) async { - if (widget.peerFilter != null) { - peers = peers.where((peer) => widget.peerFilter!(peer)).toList(); - } - - // fallback to id sorting - if (!PeerSortType.values.contains(sortedBy)) { - sortedBy = PeerSortType.remoteId; - bind.setLocalFlutterOption( - k: kOptionPeerSorting, - v: sortedBy, - ); - } - - if (widget.peers.loadEvent != LoadEvent.recent) { - switch (sortedBy) { - case PeerSortType.remoteId: - peers.sort((p1, p2) => p1.getId().compareTo(p2.getId())); - break; - case PeerSortType.remoteHost: - peers.sort((p1, p2) => - p1.hostname.toLowerCase().compareTo(p2.hostname.toLowerCase())); - break; - case PeerSortType.username: - peers.sort((p1, p2) => - p1.username.toLowerCase().compareTo(p2.username.toLowerCase())); - break; - case PeerSortType.status: - peers.sort((p1, p2) => p1.online ? -1 : 1); - break; - } - } - - searchText = searchText.trim(); - if (searchText.isEmpty) { - return peers; - } - searchText = searchText.toLowerCase(); - final matches = await Future.wait( - peers.map((peer) => matchPeer(searchText, peer, widget.peerTabIndex))); - final filteredList = List.empty(growable: true); - for (var i = 0; i < peers.length; i++) { - if (matches[i]) { - filteredList.add(peers[i]); - } - } - - return filteredList; - } -} - -abstract class BasePeersView extends StatelessWidget { - final PeerTabIndex peerTabIndex; - final PeerFilter? peerFilter; - final PeerCardBuilder peerCardBuilder; - - const BasePeersView({ - Key? key, - required this.peerTabIndex, - this.peerFilter, - required this.peerCardBuilder, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - Peers peers; - switch (peerTabIndex) { - case PeerTabIndex.recent: - peers = gFFI.recentPeersModel; - break; - case PeerTabIndex.fav: - peers = gFFI.favoritePeersModel; - break; - case PeerTabIndex.lan: - peers = gFFI.lanPeersModel; - break; - case PeerTabIndex.ab: - peers = gFFI.abModel.peersModel; - break; - case PeerTabIndex.group: - peers = gFFI.groupModel.peersModel; - break; - } - return _PeersView( - peers: peers, - peerFilter: peerFilter, - peerCardBuilder: peerCardBuilder, - peerTabIndex: peerTabIndex); - } -} - -class RecentPeersView extends BasePeersView { - RecentPeersView( - {Key? key, EdgeInsets? menuPadding, ScrollController? scrollController}) - : super( - key: key, - peerTabIndex: PeerTabIndex.recent, - peerCardBuilder: (Peer peer) => RecentPeerCard( - peer: peer, - menuPadding: menuPadding, - ), - ); - - @override - Widget build(BuildContext context) { - final widget = super.build(context); - bind.mainLoadRecentPeers(); - return widget; - } -} - -class FavoritePeersView extends BasePeersView { - FavoritePeersView( - {Key? key, EdgeInsets? menuPadding, ScrollController? scrollController}) - : super( - key: key, - peerTabIndex: PeerTabIndex.fav, - peerCardBuilder: (Peer peer) => FavoritePeerCard( - peer: peer, - menuPadding: menuPadding, - ), - ); - - @override - Widget build(BuildContext context) { - final widget = super.build(context); - bind.mainLoadFavPeers(); - return widget; - } -} - -class DiscoveredPeersView extends BasePeersView { - DiscoveredPeersView( - {Key? key, EdgeInsets? menuPadding, ScrollController? scrollController}) - : super( - key: key, - peerTabIndex: PeerTabIndex.lan, - peerCardBuilder: (Peer peer) => DiscoveredPeerCard( - peer: peer, - menuPadding: menuPadding, - ), - ); - - @override - Widget build(BuildContext context) { - final widget = super.build(context); - bind.mainLoadLanPeers(); - bind.mainDiscover(); - return widget; - } -} - -class AddressBookPeersView extends BasePeersView { - AddressBookPeersView( - {Key? key, EdgeInsets? menuPadding, ScrollController? scrollController}) - : super( - key: key, - peerTabIndex: PeerTabIndex.ab, - peerFilter: (Peer peer) => - _hitTag(gFFI.abModel.selectedTags, peer.tags), - peerCardBuilder: (Peer peer) => AddressBookPeerCard( - peer: peer, - menuPadding: menuPadding, - ), - ); - - static bool _hitTag(List selectedTags, List idents) { - if (selectedTags.isEmpty) { - return true; - } - // The result of a no-tag union with normal tags, still allows normal tags to perform union or intersection operations. - final selectedNormalTags = - selectedTags.where((tag) => tag != kUntagged).toList(); - if (selectedTags.contains(kUntagged)) { - if (idents.isEmpty) return true; - if (selectedNormalTags.isEmpty) return false; - } - if (gFFI.abModel.filterByIntersection.value) { - for (final tag in selectedNormalTags) { - if (!idents.contains(tag)) { - return false; - } - } - return true; - } else { - for (final tag in selectedNormalTags) { - if (idents.contains(tag)) { - return true; - } - } - return false; - } - } -} - -class MyGroupPeerView extends BasePeersView { - MyGroupPeerView( - {Key? key, EdgeInsets? menuPadding, ScrollController? scrollController}) - : super( - key: key, - peerTabIndex: PeerTabIndex.group, - peerFilter: filter, - peerCardBuilder: (Peer peer) => MyGroupPeerCard( - peer: peer, - menuPadding: menuPadding, - ), - ); - - static bool filter(Peer peer) { - final model = gFFI.groupModel; - if (model.searchAccessibleItemNameText.isNotEmpty) { - final text = model.searchAccessibleItemNameText.value.toLowerCase(); - final searchPeersOfUser = model.users.any((user) => - user.name == peer.loginName && - (user.name.toLowerCase().contains(text) || - user.displayNameOrName.toLowerCase().contains(text))); - final searchPeersOfDeviceGroup = - peer.device_group_name.toLowerCase().contains(text) && - model.deviceGroups.any((g) => g.name == peer.device_group_name); - if (!searchPeersOfUser && !searchPeersOfDeviceGroup) { - return false; - } - } - if (model.selectedAccessibleItemName.isNotEmpty) { - if (model.isSelectedDeviceGroup.value) { - if (model.selectedAccessibleItemName.value != peer.device_group_name) { - return false; - } - } else { - if (model.selectedAccessibleItemName.value != peer.loginName) { - return false; - } - } - } - return true; - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/remote_input.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/remote_input.dart deleted file mode 100644 index e35da64..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/remote_input.dart +++ /dev/null @@ -1,680 +0,0 @@ -import 'dart:convert'; -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter/gestures.dart'; - -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/models/model.dart'; -import 'package:flutter_hbb/models/input_model.dart'; - -import './gestures.dart'; - -class RawKeyFocusScope extends StatelessWidget { - final FocusNode? focusNode; - final ValueChanged? onFocusChange; - final InputModel inputModel; - final Widget child; - - RawKeyFocusScope({ - this.focusNode, - this.onFocusChange, - required this.inputModel, - required this.child, - }); - - @override - Widget build(BuildContext context) { - // https://github.com/flutter/flutter/issues/154053 - final useRawKeyEvents = isLinux && !isWeb; - // FIXME: On Windows, `AltGr` will generate `Alt` and `Control` key events, - // while `Alt` and `Control` are seperated key events for en-US input method. - return FocusScope( - autofocus: true, - child: Focus( - autofocus: true, - canRequestFocus: true, - focusNode: focusNode, - onFocusChange: onFocusChange, - onKey: useRawKeyEvents - ? (FocusNode data, RawKeyEvent event) => - inputModel.handleRawKeyEvent(event) - : null, - onKeyEvent: useRawKeyEvents - ? null - : (FocusNode node, KeyEvent event) => - inputModel.handleKeyEvent(event), - child: child)); - } -} - -// For virtual mouse when using the mouse mode on mobile. -// Special hold-drag mode: one finger holds a button (left/right button), another finger pans. -// This flag is to override the scale gesture to a pan gesture. -bool isSpecialHoldDragActive = false; -// Cache the last focal point to calculate deltas in special hold-drag mode. -Offset _lastSpecialHoldDragFocalPoint = Offset.zero; - -class RawTouchGestureDetectorRegion extends StatefulWidget { - final Widget child; - final FFI ffi; - final bool isCamera; - late final InputModel inputModel = ffi.inputModel; - late final FfiModel ffiModel = ffi.ffiModel; - - RawTouchGestureDetectorRegion({ - required this.child, - required this.ffi, - this.isCamera = false, - }); - - @override - State createState() => - _RawTouchGestureDetectorRegionState(); -} - -/// touchMode only: -/// LongPress -> right click -/// OneFingerPan -> start/end -> left down start/end -/// onDoubleTapDown -> move to -/// onLongPressDown => move to -/// -/// mouseMode only: -/// DoubleFiner -> right click -/// HoldDrag -> left drag -class _RawTouchGestureDetectorRegionState - extends State { - Offset _cacheLongPressPosition = Offset(0, 0); - // Timestamp of the last long press event. - int _cacheLongPressPositionTs = 0; - double _mouseScrollIntegral = 0; // mouse scroll speed controller - double _scale = 1; - - // Workaround tap down event when two fingers are used to scale(mobile) - TapDownDetails? _lastTapDownDetails; - - PointerDeviceKind? lastDeviceKind; - - // For touch mode, onDoubleTap - // `onDoubleTap()` does not provide the position of the tap event. - Offset _lastPosOfDoubleTapDown = Offset.zero; - bool _touchModePanStarted = false; - Offset _doubleFinerTapPosition = Offset.zero; - - // For mouse mode, we need to block the events when the cursor is in a blocked area. - // So we need to cache the last tap down position. - Offset? _lastTapDownPositionForMouseMode; - // Cache global position for onTap (which lacks position info). - Offset? _lastTapDownGlobalPosition; - - FFI get ffi => widget.ffi; - FfiModel get ffiModel => widget.ffiModel; - InputModel get inputModel => widget.inputModel; - bool get handleTouch => (isDesktop || isWebDesktop) || ffiModel.touchMode; - SessionID get sessionId => ffi.sessionId; - - @override - Widget build(BuildContext context) { - return RawGestureDetector( - child: widget.child, - gestures: makeGestures(context), - ); - } - - bool isNotTouchBasedDevice() { - return !kTouchBasedDeviceKinds.contains(lastDeviceKind); - } - - // Mobile, mouse mode. - // Check if should block the mouse tap event (`_lastTapDownPositionForMouseMode`). - bool shouldBlockMouseModeEvent() { - return _lastTapDownPositionForMouseMode != null && - ffi.cursorModel.shouldBlock(_lastTapDownPositionForMouseMode!.dx, - _lastTapDownPositionForMouseMode!.dy); - } - - onTapDown(TapDownDetails d) async { - lastDeviceKind = d.kind; - _lastTapDownGlobalPosition = d.globalPosition; - if (isNotTouchBasedDevice()) { - return; - } - if (handleTouch) { - _lastPosOfDoubleTapDown = d.localPosition; - // Desktop or mobile "Touch mode" - _lastTapDownDetails = d; - } else { - _lastTapDownPositionForMouseMode = d.localPosition; - } - } - - onTapUp(TapUpDetails d) async { - final TapDownDetails? lastTapDownDetails = _lastTapDownDetails; - _lastTapDownDetails = null; - if (isNotTouchBasedDevice()) { - return; - } - // Filter duplicate touch tap events on iOS (Magic Mouse issue). - if (inputModel.shouldIgnoreTouchTap(d.globalPosition)) { - return; - } - if (handleTouch) { - final isMoved = - await ffi.cursorModel.move(d.localPosition.dx, d.localPosition.dy); - if (isMoved) { - // If pan already handled 'down', don't send it again. - if (lastTapDownDetails != null && !_touchModePanStarted) { - await inputModel.tapDown(MouseButtons.left); - } - await inputModel.tapUp(MouseButtons.left); - } - } - } - - onTap() async { - if (isNotTouchBasedDevice()) { - return; - } - // Filter duplicate touch tap events on iOS (Magic Mouse issue). - final lastPos = _lastTapDownGlobalPosition; - if (lastPos != null && inputModel.shouldIgnoreTouchTap(lastPos)) { - return; - } - if (!handleTouch) { - // Cannot use `_lastTapDownDetails` because Flutter calls `onTapUp` before `onTap`, clearing the cached details. - // Using `_lastTapDownPositionForMouseMode` instead. - if (shouldBlockMouseModeEvent()) { - return; - } - // Mobile, "Mouse mode" - await inputModel.tap(MouseButtons.left); - } - } - - onDoubleTapDown(TapDownDetails d) async { - lastDeviceKind = d.kind; - if (isNotTouchBasedDevice()) { - return; - } - if (handleTouch) { - _lastPosOfDoubleTapDown = d.localPosition; - await ffi.cursorModel.move(d.localPosition.dx, d.localPosition.dy); - } else { - _lastTapDownPositionForMouseMode = d.localPosition; - } - } - - onDoubleTap() async { - if (isNotTouchBasedDevice()) { - return; - } - if (ffiModel.touchMode && ffi.cursorModel.lastIsBlocked) { - return; - } - if (handleTouch && - !ffi.cursorModel.isInRemoteRect(_lastPosOfDoubleTapDown)) { - return; - } - // Check if the position is in a blocked area when using the mouse mode. - if (!handleTouch) { - if (shouldBlockMouseModeEvent()) { - return; - } - } - await inputModel.tap(MouseButtons.left); - await inputModel.tap(MouseButtons.left); - } - - onLongPressDown(LongPressDownDetails d) async { - lastDeviceKind = d.kind; - if (isNotTouchBasedDevice()) { - return; - } - if (handleTouch) { - _lastPosOfDoubleTapDown = d.localPosition; - _cacheLongPressPosition = d.localPosition; - if (!ffi.cursorModel.isInRemoteRect(d.localPosition)) { - return; - } - _cacheLongPressPositionTs = DateTime.now().millisecondsSinceEpoch; - if (ffiModel.isPeerMobile) { - await ffi.cursorModel - .move(_cacheLongPressPosition.dx, _cacheLongPressPosition.dy); - await inputModel.tapDown(MouseButtons.left); - } - } else { - _lastTapDownPositionForMouseMode = d.localPosition; - } - } - - onLongPressUp() async { - if (isNotTouchBasedDevice()) { - return; - } - if (handleTouch) { - await inputModel.tapUp(MouseButtons.left); - } - } - - // for mobiles - onLongPress() async { - if (isNotTouchBasedDevice()) { - return; - } - if (!ffi.ffiModel.isPeerMobile) { - if (handleTouch) { - final isMoved = await ffi.cursorModel - .move(_cacheLongPressPosition.dx, _cacheLongPressPosition.dy); - if (!isMoved) { - return; - } - } else { - if (shouldBlockMouseModeEvent()) { - return; - } - } - await inputModel.tap(MouseButtons.right); - } else { - // It's better to send a message to tell the controlled device that the long press event is triggered. - // We're now using a `TimerTask` in `InputService.kt` to decide whether to trigger the long press event. - // It's not accurate and it's better to use the same detection logic in the controlling side. - } - } - - onLongPressMoveUpdate(LongPressMoveUpdateDetails d) async { - if (!ffiModel.isPeerMobile || isNotTouchBasedDevice()) { - return; - } - if (handleTouch) { - if (!ffi.cursorModel.isInRemoteRect(d.localPosition)) { - return; - } - await ffi.cursorModel.move(d.localPosition.dx, d.localPosition.dy); - } - } - - onDoubleFinerTapDown(TapDownDetails d) async { - lastDeviceKind = d.kind; - if (isNotTouchBasedDevice()) { - return; - } - _doubleFinerTapPosition = d.localPosition; - // ignore for desktop and mobile - } - - onDoubleFinerTap(TapDownDetails d) async { - lastDeviceKind = d.kind; - if (isNotTouchBasedDevice()) { - return; - } - - // mobile mouse mode or desktop touch screen - final isMobileMouseMode = isMobile && !ffiModel.touchMode; - // We can't use `d.localPosition` here because it's always (0, 0) on desktop. - final isDesktopInRemoteRect = (isDesktop || isWebDesktop) && - ffi.cursorModel.isInRemoteRect(_doubleFinerTapPosition); - if (isMobileMouseMode || isDesktopInRemoteRect) { - await inputModel.tap(MouseButtons.right); - } - } - - onHoldDragStart(DragStartDetails d) async { - lastDeviceKind = d.kind; - if (isNotTouchBasedDevice()) { - return; - } - if (!handleTouch) { - if (isSpecialHoldDragActive) return; - await inputModel.sendMouse('down', MouseButtons.left); - } - } - - onHoldDragUpdate(DragUpdateDetails d) async { - if (isNotTouchBasedDevice()) { - return; - } - if (!handleTouch) { - if (isSpecialHoldDragActive) return; - await ffi.cursorModel.updatePan(d.delta, d.localPosition, handleTouch); - } - } - - onHoldDragEnd(DragEndDetails d) async { - if (isNotTouchBasedDevice()) { - return; - } - if (!handleTouch) { - await inputModel.sendMouse('up', MouseButtons.left); - } - } - - onOneFingerPanStart(BuildContext context, DragStartDetails d) async { - final TapDownDetails? lastTapDownDetails = _lastTapDownDetails; - _lastTapDownDetails = null; - lastDeviceKind = d.kind ?? lastDeviceKind; - if (isNotTouchBasedDevice()) { - return; - } - if (handleTouch) { - if (lastTapDownDetails != null) { - await ffi.cursorModel.move(lastTapDownDetails.localPosition.dx, - lastTapDownDetails.localPosition.dy); - } - if (ffi.cursorModel.shouldBlock(d.localPosition.dx, d.localPosition.dy)) { - return; - } - if (!ffi.cursorModel.isInRemoteRect(d.localPosition)) { - return; - } - - _touchModePanStarted = true; - if (isDesktop || isWebDesktop) { - ffi.cursorModel.trySetRemoteWindowCoords(); - } - - // Workaround for the issue that the first pan event is sent a long time after the start event. - // If the time interval between the start event and the first pan event is less than 500ms, - // we consider to use the long press position as the start position. - // - // TODO: We should find a better way to send the first pan event as soon as possible. - if (DateTime.now().millisecondsSinceEpoch - _cacheLongPressPositionTs < - 500) { - await ffi.cursorModel - .move(_cacheLongPressPosition.dx, _cacheLongPressPosition.dy); - } - // In relative mouse mode, skip mouse down - only send movement via sendMobileRelativeMouseMove - if (!inputModel.relativeMouseMode.value) { - await inputModel.sendMouse('down', MouseButtons.left); - } - await ffi.cursorModel.move(d.localPosition.dx, d.localPosition.dy); - } else { - final offset = ffi.cursorModel.offset; - final cursorX = offset.dx; - final cursorY = offset.dy; - final visible = - ffi.cursorModel.getVisibleRect().inflate(1); // extend edges - final size = MediaQueryData.fromView(View.of(context)).size; - if (!visible.contains(Offset(cursorX, cursorY))) { - await ffi.cursorModel.move(size.width / 2, size.height / 2); - } - } - } - - onOneFingerPanUpdate(DragUpdateDetails d) async { - if (isNotTouchBasedDevice()) { - return; - } - if (ffi.cursorModel.shouldBlock(d.localPosition.dx, d.localPosition.dy)) { - return; - } - if (handleTouch && !_touchModePanStarted) { - return; - } - // In relative mouse mode, send delta directly without position tracking. - if (inputModel.relativeMouseMode.value) { - await inputModel.sendMobileRelativeMouseMove(d.delta.dx, d.delta.dy); - } else { - await ffi.cursorModel.updatePan(d.delta, d.localPosition, handleTouch); - } - } - - onOneFingerPanEnd(DragEndDetails d) async { - _touchModePanStarted = false; - if (isNotTouchBasedDevice()) { - return; - } - if (isDesktop || isWebDesktop) { - ffi.cursorModel.clearRemoteWindowCoords(); - } - if (handleTouch) { - // In relative mouse mode, skip mouse up - matches the skipped mouse down in onOneFingerPanStart - if (!inputModel.relativeMouseMode.value) { - await inputModel.sendMouse('up', MouseButtons.left); - } - } - } - - // Reset `_touchModePanStarted` if the one-finger pan gesture is cancelled - // or rejected by the gesture arena. Without this, the flag can remain - // stuck in the "started" state and cause issues such as the Magic Mouse - // double-click problem on iPad with magic mouse. - onOneFingerPanCancel() { - _touchModePanStarted = false; - } - - // scale + pan event - onTwoFingerScaleStart(ScaleStartDetails d) { - _lastTapDownDetails = null; - if (isNotTouchBasedDevice()) { - return; - } - if (isSpecialHoldDragActive) { - // Initialize the last focal point to calculate deltas manually. - _lastSpecialHoldDragFocalPoint = d.focalPoint; - } - } - - onTwoFingerScaleUpdate(ScaleUpdateDetails d) async { - if (isNotTouchBasedDevice()) { - return; - } - - // If in special drag mode, perform a pan instead of a scale. - if (isSpecialHoldDragActive) { - // Calculate delta manually to avoid the jumpy behavior. - final delta = d.focalPoint - _lastSpecialHoldDragFocalPoint; - _lastSpecialHoldDragFocalPoint = d.focalPoint; - await ffi.cursorModel.updatePan(delta * 2.0, d.focalPoint, handleTouch); - return; - } - - if ((isDesktop || isWebDesktop)) { - final scale = ((d.scale - _scale) * 1000).toInt(); - _scale = d.scale; - - if (scale != 0) { - if (widget.isCamera) return; - await bind.sessionSendPointer( - sessionId: sessionId, - msg: json.encode( - PointerEventToRust(kPointerEventKindTouch, 'scale', scale) - .toJson())); - } - } else { - // mobile - ffi.canvasModel.updateScale(d.scale / _scale, d.focalPoint); - _scale = d.scale; - ffi.canvasModel.panX(d.focalPointDelta.dx); - ffi.canvasModel.panY(d.focalPointDelta.dy); - } - } - - onTwoFingerScaleEnd(ScaleEndDetails d) async { - if (isNotTouchBasedDevice()) { - return; - } - if ((isDesktop || isWebDesktop)) { - if (widget.isCamera) return; - await bind.sessionSendPointer( - sessionId: sessionId, - msg: json.encode( - PointerEventToRust(kPointerEventKindTouch, 'scale', 0).toJson())); - } else { - // mobile - _scale = 1; - // No idea why we need to set the view style to "" here. - // bind.sessionSetViewStyle(sessionId: sessionId, value: ""); - } - if (!isSpecialHoldDragActive) { - await inputModel.sendMouse('up', MouseButtons.left); - } - } - - get onHoldDragCancel => null; - get onThreeFingerVerticalDragUpdate => ffi.ffiModel.isPeerAndroid - ? null - : (d) { - _mouseScrollIntegral += d.delta.dy / 4; - if (_mouseScrollIntegral > 1) { - inputModel.scroll(1); - _mouseScrollIntegral = 0; - } else if (_mouseScrollIntegral < -1) { - inputModel.scroll(-1); - _mouseScrollIntegral = 0; - } - }; - - makeGestures(BuildContext context) { - return { - // Official - TapGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => TapGestureRecognizer(), (instance) { - instance - ..onTapDown = onTapDown - ..onTapUp = onTapUp - ..onTap = onTap; - }), - DoubleTapGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => DoubleTapGestureRecognizer(), (instance) { - instance - ..onDoubleTapDown = onDoubleTapDown - ..onDoubleTap = onDoubleTap; - }), - LongPressGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => LongPressGestureRecognizer(), (instance) { - instance - ..onLongPressDown = onLongPressDown - ..onLongPressUp = onLongPressUp - ..onLongPress = onLongPress - ..onLongPressMoveUpdate = onLongPressMoveUpdate; - }), - // Customized - HoldTapMoveGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => HoldTapMoveGestureRecognizer(), - (instance) => instance - ..onHoldDragStart = onHoldDragStart - ..onHoldDragUpdate = onHoldDragUpdate - ..onHoldDragCancel = onHoldDragCancel - ..onHoldDragEnd = onHoldDragEnd), - DoubleFinerTapGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => DoubleFinerTapGestureRecognizer(), (instance) { - instance - ..onDoubleFinerTap = onDoubleFinerTap - ..onDoubleFinerTapDown = onDoubleFinerTapDown; - }), - CustomTouchGestureRecognizer: - GestureRecognizerFactoryWithHandlers( - () => CustomTouchGestureRecognizer(), (instance) { - instance.onOneFingerPanStart = - (DragStartDetails d) => onOneFingerPanStart(context, d); - instance - ..onOneFingerPanUpdate = onOneFingerPanUpdate - ..onOneFingerPanEnd = onOneFingerPanEnd - ..onOneFingerPanCancel = onOneFingerPanCancel - ..onTwoFingerScaleStart = onTwoFingerScaleStart - ..onTwoFingerScaleUpdate = onTwoFingerScaleUpdate - ..onTwoFingerScaleEnd = onTwoFingerScaleEnd - ..onThreeFingerVerticalDragUpdate = onThreeFingerVerticalDragUpdate; - }), - }; - } -} - -class RawPointerMouseRegion extends StatelessWidget { - final InputModel inputModel; - final Widget child; - final MouseCursor? cursor; - final PointerEnterEventListener? onEnter; - final PointerExitEventListener? onExit; - final PointerDownEventListener? onPointerDown; - final PointerUpEventListener? onPointerUp; - - RawPointerMouseRegion({ - this.onEnter, - this.onExit, - this.cursor, - this.onPointerDown, - this.onPointerUp, - required this.inputModel, - required this.child, - }); - - @override - Widget build(BuildContext context) { - return Listener( - onPointerHover: inputModel.onPointHoverImage, - onPointerDown: (evt) { - onPointerDown?.call(evt); - inputModel.onPointDownImage(evt); - }, - onPointerUp: (evt) { - onPointerUp?.call(evt); - inputModel.onPointUpImage(evt); - }, - onPointerMove: inputModel.onPointMoveImage, - onPointerSignal: inputModel.onPointerSignalImage, - onPointerPanZoomStart: inputModel.onPointerPanZoomStart, - onPointerPanZoomUpdate: inputModel.onPointerPanZoomUpdate, - onPointerPanZoomEnd: inputModel.onPointerPanZoomEnd, - child: MouseRegion( - cursor: inputModel.isViewOnly - ? MouseCursor.defer - : (cursor ?? MouseCursor.defer), - onEnter: onEnter, - onExit: onExit, - child: child, - ), - ); - } -} - -class CameraRawPointerMouseRegion extends StatelessWidget { - final InputModel inputModel; - final Widget child; - final PointerEnterEventListener? onEnter; - final PointerExitEventListener? onExit; - final PointerDownEventListener? onPointerDown; - final PointerUpEventListener? onPointerUp; - - CameraRawPointerMouseRegion({ - this.onEnter, - this.onExit, - this.onPointerDown, - this.onPointerUp, - required this.inputModel, - required this.child, - }); - - @override - Widget build(BuildContext context) { - return Listener( - onPointerHover: (evt) { - final offset = evt.position; - double x = offset.dx; - double y = max(0.0, offset.dy); - inputModel.handlePointerDevicePos( - kPointerEventKindMouse, x, y, true, kMouseEventTypeDefault); - }, - onPointerDown: (evt) { - onPointerDown?.call(evt); - }, - onPointerUp: (evt) { - onPointerUp?.call(evt); - }, - child: MouseRegion( - cursor: MouseCursor.defer, - onEnter: onEnter, - onExit: onExit, - child: child, - ), - ); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/setting_widgets.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/setting_widgets.dart deleted file mode 100644 index f3be770..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/setting_widgets.dart +++ /dev/null @@ -1,340 +0,0 @@ -import 'package:debounce_throttle/debounce_throttle.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:get/get.dart'; - -customImageQualityWidget( - {required double initQuality, - required double initFps, - required Function(double)? setQuality, - required Function(double)? setFps, - required bool showFps, - required bool showMoreQuality}) { - if (initQuality < kMinQuality || - initQuality > (showMoreQuality ? kMaxMoreQuality : kMaxQuality)) { - initQuality = kDefaultQuality; - } - if (initFps < kMinFps || initFps > kMaxFps) { - initFps = kDefaultFps; - } - final qualityValue = initQuality.obs; - final fpsValue = initFps.obs; - - final RxBool moreQualityChecked = RxBool(qualityValue.value > kMaxQuality); - final debouncerQuality = Debouncer( - Duration(milliseconds: 1000), - onChanged: setQuality, - initialValue: qualityValue.value, - ); - final debouncerFps = Debouncer( - Duration(milliseconds: 1000), - onChanged: setFps, - initialValue: fpsValue.value, - ); - - onMoreChanged(bool? value) { - if (value == null) return; - moreQualityChecked.value = value; - if (!value && qualityValue.value > 100) { - qualityValue.value = 100; - } - debouncerQuality.value = qualityValue.value; - } - - return Column( - children: [ - Obx(() => Row( - children: [ - Expanded( - flex: 3, - child: Slider( - value: qualityValue.value, - min: kMinQuality, - max: moreQualityChecked.value ? kMaxMoreQuality : kMaxQuality, - divisions: moreQualityChecked.value - ? ((kMaxMoreQuality - kMinQuality) / 10).round() - : ((kMaxQuality - kMinQuality) / 5).round(), - onChanged: setQuality == null - ? null - : (double value) async { - qualityValue.value = value; - debouncerQuality.value = value; - }, - ), - ), - Expanded( - flex: 1, - child: Text( - '${qualityValue.value.round()}%', - style: const TextStyle(fontSize: 15), - )), - Expanded( - flex: isMobile ? 2 : 1, - child: Text( - translate('Bitrate'), - style: const TextStyle(fontSize: 15), - )), - // mobile doesn't have enough space - if (showMoreQuality && !isMobile) - Expanded( - flex: 1, - child: Row( - children: [ - Checkbox( - value: moreQualityChecked.value, - onChanged: onMoreChanged, - ), - Expanded( - child: Text(translate('More')), - ) - ], - )) - ], - )), - if (showMoreQuality && isMobile) - Obx(() => Row( - children: [ - Expanded( - child: Align( - alignment: Alignment.centerRight, - child: Checkbox( - value: moreQualityChecked.value, - onChanged: onMoreChanged, - ), - ), - ), - Expanded( - child: Text(translate('More')), - ) - ], - )), - if (showFps) - Obx(() => Row( - children: [ - Expanded( - flex: 3, - child: Slider( - value: fpsValue.value, - min: kMinFps, - max: kMaxFps, - divisions: ((kMaxFps - kMinFps) / 5).round(), - onChanged: setFps == null - ? null - : (double value) async { - fpsValue.value = value; - debouncerFps.value = value; - }, - ), - ), - Expanded( - flex: 1, - child: Text( - '${fpsValue.value.round()}', - style: const TextStyle(fontSize: 15), - )), - Expanded( - flex: 2, - child: Text( - translate('FPS'), - style: const TextStyle(fontSize: 15), - )) - ], - )), - ], - ); -} - -customImageQualitySetting() { - final qualityKey = 'custom_image_quality'; - final fpsKey = 'custom-fps'; - - final initQuality = - (double.tryParse(bind.mainGetUserDefaultOption(key: qualityKey)) ?? - kDefaultQuality); - final isQuanlityFixed = isOptionFixed(qualityKey); - final initFps = - (double.tryParse(bind.mainGetUserDefaultOption(key: fpsKey)) ?? - kDefaultFps); - final isFpsFixed = isOptionFixed(fpsKey); - - return customImageQualityWidget( - initQuality: initQuality, - initFps: initFps, - setQuality: isQuanlityFixed - ? null - : (v) { - bind.mainSetUserDefaultOption( - key: qualityKey, value: v.toString()); - }, - setFps: isFpsFixed - ? null - : (v) { - bind.mainSetUserDefaultOption(key: fpsKey, value: v.toString()); - }, - showFps: true, - showMoreQuality: true); -} - -List ServerConfigImportExportWidgets( - List controllers, - List errMsgs, -) { - import() { - Clipboard.getData(Clipboard.kTextPlain).then((value) { - importConfig(controllers, errMsgs, value?.text); - }); - } - - export() { - final text = ServerConfig( - idServer: controllers[0].text.trim(), - relayServer: controllers[1].text.trim(), - apiServer: controllers[2].text.trim(), - key: controllers[3].text.trim()) - .encode(); - debugPrint("ServerConfig export: $text"); - Clipboard.setData(ClipboardData(text: text)); - showToast(translate('Export server configuration successfully')); - } - - return [ - Tooltip( - message: translate('Import server config'), - child: IconButton( - icon: Icon(Icons.paste, color: Colors.grey), onPressed: import), - ), - Tooltip( - message: translate('Export Server Config'), - child: IconButton( - icon: Icon(Icons.copy, color: Colors.grey), onPressed: export)) - ]; -} - -List<(String, String)> otherDefaultSettings() { - List<(String, String)> v = [ - ('View Mode', kOptionViewOnly), - if ((isDesktop || isWebDesktop)) - ('show_monitors_tip', kKeyShowMonitorsToolbar), - if ((isDesktop || isWebDesktop)) - ('Collapse toolbar', kOptionCollapseToolbar), - ('Show remote cursor', kOptionShowRemoteCursor), - ('Follow remote cursor', kOptionFollowRemoteCursor), - ('Follow remote window focus', kOptionFollowRemoteWindow), - if ((isDesktop || isWebDesktop)) ('Zoom cursor', kOptionZoomCursor), - ('Show quality monitor', kOptionShowQualityMonitor), - ('Mute', kOptionDisableAudio), - if (isDesktop) ('Enable file copy and paste', kOptionEnableFileCopyPaste), - ('Disable clipboard', kOptionDisableClipboard), - ('Lock after session end', kOptionLockAfterSessionEnd), - ('Privacy mode', kOptionPrivacyMode), - ('True color (4:4:4)', kOptionI444), - ('Reverse mouse wheel', kKeyReverseMouseWheel), - ('swap-left-right-mouse', kOptionSwapLeftRightMouse), - if (isDesktop) - ( - 'Show displays as individual windows', - kKeyShowDisplaysAsIndividualWindows - ), - if (isDesktop) - ( - 'Use all my displays for the remote session', - kKeyUseAllMyDisplaysForTheRemoteSession - ), - ('Keep terminal sessions on disconnect', kOptionTerminalPersistent), - ]; - - return v; -} - -class TrackpadSpeedWidget extends StatefulWidget { - final SimpleWrapper value; - // If null, no debouncer will be applied. - final Function(int)? onDebouncer; - - TrackpadSpeedWidget({Key? key, required this.value, this.onDebouncer}); - - @override - TrackpadSpeedWidgetState createState() => TrackpadSpeedWidgetState(); -} - -class TrackpadSpeedWidgetState extends State { - final TextEditingController _controller = TextEditingController(); - late final Debouncer debouncerSpeed; - - set value(int v) => widget.value.value = v; - int get value => widget.value.value; - - void updateValue(int newValue) { - setState(() { - value = newValue.clamp(kMinTrackpadSpeed, kMaxTrackpadSpeed); - // Scale the trackpad speed value to a percentage for display purposes. - _controller.text = value.toString(); - if (widget.onDebouncer != null) { - debouncerSpeed.setValue(value); - } - }); - } - - @override - void initState() { - super.initState(); - debouncerSpeed = Debouncer( - Duration(milliseconds: 1000), - onChanged: widget.onDebouncer, - initialValue: widget.value.value, - ); - } - - @override - Widget build(BuildContext context) { - if (_controller.text.isEmpty) { - _controller.text = value.toString(); - } - return Row( - children: [ - Expanded( - flex: 3, - child: Slider( - value: value.toDouble(), - min: kMinTrackpadSpeed.toDouble(), - max: kMaxTrackpadSpeed.toDouble(), - divisions: ((kMaxTrackpadSpeed - kMinTrackpadSpeed) / 10).round(), - onChanged: (double v) => updateValue(v.round()), - ), - ), - Expanded( - flex: 1, - child: Row( - children: [ - SizedBox( - width: 56, - child: TextField( - controller: _controller, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - onSubmitted: (text) { - int? v = int.tryParse(text); - if (v != null) { - updateValue(v); - } - }, - style: const TextStyle(fontSize: 13), - decoration: InputDecoration( - contentPadding: - EdgeInsets.symmetric(vertical: 8.0, horizontal: 12.0), - ), - ), - ).marginOnly(right: 8.0), - Text( - '%', - style: const TextStyle(fontSize: 15), - ) - ], - )), - ], - ); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/toolbar.dart b/shelled/rustdesk-as-ref/flutter/lib/common/widgets/toolbar.dart deleted file mode 100644 index a46ce54..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/common/widgets/toolbar.dart +++ /dev/null @@ -1,1024 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/common/shared_state.dart'; -import 'package:flutter_hbb/common/widgets/dialog.dart'; -import 'package:flutter_hbb/common/widgets/login.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/desktop/widgets/remote_toolbar.dart'; -import 'package:flutter_hbb/models/model.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:flutter_hbb/utils/multi_window_manager.dart'; -import 'package:get/get.dart'; - -bool isEditOsPassword = false; - -class TTextMenu { - final Widget child; - final VoidCallback? onPressed; - Widget? trailingIcon; - bool divider; - TTextMenu( - {required this.child, - required this.onPressed, - this.trailingIcon, - this.divider = false}); - - Widget getChild() { - if (trailingIcon != null) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - child, - trailingIcon!, - ], - ); - } else { - return child; - } - } -} - -class TRadioMenu { - final Widget child; - final T value; - final T groupValue; - final ValueChanged? onChanged; - - TRadioMenu( - {required this.child, - required this.value, - required this.groupValue, - required this.onChanged}); -} - -class TToggleMenu { - final Widget child; - final bool value; - final ValueChanged? onChanged; - TToggleMenu( - {required this.child, required this.value, required this.onChanged}); -} - -handleOsPasswordEditIcon( - SessionID sessionId, OverlayDialogManager dialogManager) { - isEditOsPassword = true; - showSetOSPassword( - sessionId, false, dialogManager, null, () => isEditOsPassword = false); -} - -handleOsPasswordAction( - SessionID sessionId, OverlayDialogManager dialogManager) async { - if (isEditOsPassword) { - isEditOsPassword = false; - return; - } - final password = - await bind.sessionGetOption(sessionId: sessionId, arg: 'os-password') ?? - ''; - if (password.isEmpty) { - showSetOSPassword(sessionId, true, dialogManager, password, - () => isEditOsPassword = false); - } else { - bind.sessionInputOsPassword(sessionId: sessionId, value: password); - } -} - -List toolbarControls(BuildContext context, String id, FFI ffi) { - final ffiModel = ffi.ffiModel; - final pi = ffiModel.pi; - final perms = ffiModel.permissions; - final sessionId = ffi.sessionId; - final isDefaultConn = ffi.connType == ConnType.defaultConn; - - List v = []; - // elevation - if (isDefaultConn && - perms['keyboard'] != false && - ffi.elevationModel.showRequestMenu) { - v.add( - TTextMenu( - child: Text(translate('Request Elevation')), - onPressed: () => - showRequestElevationDialog(sessionId, ffi.dialogManager)), - ); - } - // osAccount / osPassword - if (isDefaultConn && perms['keyboard'] != false) { - v.add( - TTextMenu( - child: Row(children: [ - Text(translate(pi.isHeadless ? 'OS Account' : 'OS Password')), - ]), - trailingIcon: Transform.scale( - scale: (isDesktop || isWebDesktop) ? 0.8 : 1, - child: IconButton( - onPressed: () { - if (isMobile && Navigator.canPop(context)) { - Navigator.pop(context); - } - if (pi.isHeadless) { - showSetOSAccount(sessionId, ffi.dialogManager); - } else { - handleOsPasswordEditIcon(sessionId, ffi.dialogManager); - } - }, - icon: Icon(Icons.edit, color: isMobile ? MyTheme.accent : null), - ), - ), - onPressed: () => pi.isHeadless - ? showSetOSAccount(sessionId, ffi.dialogManager) - : handleOsPasswordAction(sessionId, ffi.dialogManager), - ), - ); - } - // paste - if (isDefaultConn && - pi.platform != kPeerPlatformAndroid && - perms['keyboard'] != false) { - v.add(TTextMenu( - child: Text(translate('Send clipboard keystrokes')), - onPressed: () async { - ClipboardData? data = await Clipboard.getData(Clipboard.kTextPlain); - if (data != null && data.text != null) { - bind.sessionInputString( - sessionId: sessionId, value: data.text ?? ""); - } - })); - } - // reset canvas - if (isDefaultConn && isMobile) { - v.add(TTextMenu( - child: Text(translate('Reset canvas')), - onPressed: () => ffi.cursorModel.reset())); - } - - // https://github.com/rustdesk/rustdesk/pull/9731 - // Does not work for connection established by "accept". - connectWithToken( - {bool isFileTransfer = false, - bool isViewCamera = false, - bool isTcpTunneling = false, - bool isTerminal = false}) { - final connToken = bind.sessionGetConnToken(sessionId: ffi.sessionId); - connect(context, id, - isFileTransfer: isFileTransfer, - isViewCamera: isViewCamera, - isTerminal: isTerminal, - isTcpTunneling: isTcpTunneling, - connToken: connToken); - } - - if (isDefaultConn && isDesktop) { - v.add( - TTextMenu( - child: Text(translate('Transfer file')), - onPressed: () => connectWithToken(isFileTransfer: true)), - ); - v.add( - TTextMenu( - child: Text(translate('View camera')), - onPressed: () => connectWithToken(isViewCamera: true)), - ); - v.add( - TTextMenu( - child: Text('${translate('Terminal')} (beta)'), - onPressed: () => connectWithToken(isTerminal: true)), - ); - v.add( - TTextMenu( - child: Text(translate('TCP tunneling')), - onPressed: () => connectWithToken(isTcpTunneling: true)), - ); - } - // note - if (isDefaultConn && !bind.isDisableAccount()) { - v.add( - TTextMenu( - child: Text(translate('Note')), - onPressed: () async { - bool isLogin = - bind.mainGetLocalOption(key: 'access_token').isNotEmpty; - if (!isLogin) { - final res = await loginDialog(); - if (res != true) return; - // Desktop: send message to main window to refresh login status - // Web: login is required before connection, so no need to refresh - // Mobile: same isolate, no need to send message - if (isDesktop) { - rustDeskWinManager.call( - WindowType.Main, kWindowRefreshCurrentUser, ""); - } - } - showAuditDialog(ffi); - }), - ); - } - // divider - if (isDefaultConn && (isDesktop || isWebDesktop)) { - v.add(TTextMenu(child: Offstage(), onPressed: () {}, divider: true)); - } - // ctrlAltDel - if (isDefaultConn && - !ffiModel.viewOnly && - ffiModel.keyboard && - (pi.platform == kPeerPlatformLinux || pi.sasEnabled)) { - v.add( - TTextMenu( - child: Text('${translate("Insert Ctrl + Alt + Del")}'), - onPressed: () => bind.sessionCtrlAltDel(sessionId: sessionId)), - ); - } - // restart - if (isDefaultConn && - perms['restart'] != false && - (pi.platform == kPeerPlatformLinux || - pi.platform == kPeerPlatformWindows || - pi.platform == kPeerPlatformMacOS)) { - v.add( - TTextMenu( - child: Text(translate('Restart remote device')), - onPressed: () => - showRestartRemoteDevice(pi, id, sessionId, ffi.dialogManager)), - ); - } - // insertLock - if (isDefaultConn && !ffiModel.viewOnly && ffi.ffiModel.keyboard) { - v.add( - TTextMenu( - child: Text(translate('Insert Lock')), - onPressed: () => bind.sessionLockScreen(sessionId: sessionId)), - ); - } - // blockUserInput - if (isDefaultConn && - ffi.ffiModel.keyboard && - ffi.ffiModel.permissions['block_input'] != false && - pi.platform == kPeerPlatformWindows) // privacy-mode != true ?? - { - v.add(TTextMenu( - child: Obx(() => Text(translate( - '${BlockInputState.find(id).value ? 'Unb' : 'B'}lock user input'))), - onPressed: () { - RxBool blockInput = BlockInputState.find(id); - bind.sessionToggleOption( - sessionId: sessionId, - value: '${blockInput.value ? 'un' : ''}block-input'); - blockInput.value = !blockInput.value; - })); - } - // switchSides - if (isDefaultConn && - isDesktop && - ffiModel.keyboard && - pi.platform != kPeerPlatformAndroid && - pi.platform != kPeerPlatformMacOS && - versionCmp(pi.version, '1.2.0') >= 0 && - bind.peerGetSessionsCount(id: id, connType: ffi.connType.index) == 1) { - v.add(TTextMenu( - child: Text(translate('Switch Sides')), - onPressed: () => - showConfirmSwitchSidesDialog(sessionId, id, ffi.dialogManager))); - } - // refresh - if (pi.version.isNotEmpty) { - v.add(TTextMenu( - child: Text(translate('Refresh')), - onPressed: () => sessionRefreshVideo(sessionId, pi), - )); - } - // record - if (!(isDesktop || isWeb) && - (ffi.recordingModel.start || (perms["recording"] != false))) { - v.add(TTextMenu( - child: Row( - children: [ - Text(translate(ffi.recordingModel.start - ? 'Stop session recording' - : 'Start session recording')), - Padding( - padding: EdgeInsets.only(left: 12), - child: Icon( - ffi.recordingModel.start - ? Icons.pause_circle_filled - : Icons.videocam_outlined, - color: MyTheme.accent), - ) - ], - ), - onPressed: () => ffi.recordingModel.toggle())); - } - - // to-do: - // 1. Web desktop - // 2. Mobile, copy the image to the clipboard - if (isDesktop) { - final isScreenshotSupported = bind.sessionGetCommonSync( - sessionId: sessionId, key: 'is_screenshot_supported', param: ''); - if ('true' == isScreenshotSupported) { - v.add(TTextMenu( - child: Text(ffi.ffiModel.timerScreenshot != null - ? '${translate('Taking screenshot')} ...' - : translate('Take screenshot')), - onPressed: ffi.ffiModel.timerScreenshot != null - ? null - : () { - if (pi.currentDisplay == kAllDisplayValue) { - msgBox( - sessionId, - 'custom-nook-nocancel-hasclose-info', - 'Take screenshot', - 'screenshot-merged-screen-not-supported-tip', - '', - ffi.dialogManager); - } else { - bind.sessionTakeScreenshot( - sessionId: sessionId, display: pi.currentDisplay); - ffi.ffiModel.timerScreenshot = - Timer(Duration(seconds: 30), () { - ffi.ffiModel.timerScreenshot = null; - }); - } - }, - )); - } - } - // fingerprint - if (!(isDesktop || isWebDesktop)) { - v.add(TTextMenu( - child: Text(translate('Copy Fingerprint')), - onPressed: () => onCopyFingerprint(FingerprintState.find(id).value), - )); - } - return v; -} - -Future>> toolbarViewStyle( - BuildContext context, String id, FFI ffi) async { - final groupValue = - await bind.sessionGetViewStyle(sessionId: ffi.sessionId) ?? ''; - void onChanged(String? value) async { - if (value == null) return; - bind - .sessionSetViewStyle(sessionId: ffi.sessionId, value: value) - .then((_) => ffi.canvasModel.updateViewStyle()); - } - - return [ - TRadioMenu( - child: Text(translate('Scale original')), - value: kRemoteViewStyleOriginal, - groupValue: groupValue, - onChanged: onChanged), - TRadioMenu( - child: Text(translate('Scale adaptive')), - value: kRemoteViewStyleAdaptive, - groupValue: groupValue, - onChanged: onChanged), - TRadioMenu( - child: Text(translate('Scale custom')), - value: kRemoteViewStyleCustom, - groupValue: groupValue, - onChanged: onChanged) - ]; -} - -Future>> toolbarImageQuality( - BuildContext context, String id, FFI ffi) async { - final groupValue = - await bind.sessionGetImageQuality(sessionId: ffi.sessionId) ?? ''; - onChanged(String? value) async { - if (value == null) return; - await bind.sessionSetImageQuality(sessionId: ffi.sessionId, value: value); - } - - return [ - TRadioMenu( - child: Text(translate('Good image quality')), - value: kRemoteImageQualityBest, - groupValue: groupValue, - onChanged: onChanged), - TRadioMenu( - child: Text(translate('Balanced')), - value: kRemoteImageQualityBalanced, - groupValue: groupValue, - onChanged: onChanged), - TRadioMenu( - child: Text(translate('Optimize reaction time')), - value: kRemoteImageQualityLow, - groupValue: groupValue, - onChanged: onChanged), - TRadioMenu( - child: Text(translate('Custom')), - value: kRemoteImageQualityCustom, - groupValue: groupValue, - onChanged: (value) { - onChanged(value); - customImageQualityDialog(ffi.sessionId, id, ffi); - }, - ), - ]; -} - -Future>> toolbarCodec( - BuildContext context, String id, FFI ffi) async { - final sessionId = ffi.sessionId; - final alternativeCodecs = - await bind.sessionAlternativeCodecs(sessionId: sessionId); - final groupValue = await bind.sessionGetOption( - sessionId: sessionId, arg: kOptionCodecPreference) ?? - ''; - final List codecs = []; - try { - final Map codecsJson = jsonDecode(alternativeCodecs); - final vp8 = codecsJson['vp8'] ?? false; - final av1 = codecsJson['av1'] ?? false; - final h264 = codecsJson['h264'] ?? false; - final h265 = codecsJson['h265'] ?? false; - codecs.add(vp8); - codecs.add(av1); - codecs.add(h264); - codecs.add(h265); - } catch (e) { - debugPrint("Show Codec Preference err=$e"); - } - final visible = - codecs.length == 4 && (codecs[0] || codecs[1] || codecs[2] || codecs[3]); - if (!visible) return []; - onChanged(String? value) async { - if (value == null) return; - await bind.sessionPeerOption( - sessionId: sessionId, name: kOptionCodecPreference, value: value); - bind.sessionChangePreferCodec(sessionId: sessionId); - } - - TRadioMenu radio(String label, String value, bool enabled) { - return TRadioMenu( - child: Text(label), - value: value, - groupValue: groupValue, - onChanged: enabled ? onChanged : null); - } - - var autoLabel = translate('Auto'); - if (groupValue == 'auto' && - ffi.qualityMonitorModel.data.codecFormat != null) { - autoLabel = '$autoLabel (${ffi.qualityMonitorModel.data.codecFormat})'; - } - return [ - radio(autoLabel, 'auto', true), - if (codecs[0]) radio('VP8', 'vp8', codecs[0]), - radio('VP9', 'vp9', true), - if (codecs[1]) radio('AV1', 'av1', codecs[1]), - if (codecs[2]) radio('H264', 'h264', codecs[2]), - if (codecs[3]) radio('H265', 'h265', codecs[3]), - ]; -} - -Future> toolbarCursor( - BuildContext context, String id, FFI ffi) async { - List v = []; - final ffiModel = ffi.ffiModel; - final pi = ffiModel.pi; - final sessionId = ffi.sessionId; - - // show remote cursor - if (pi.platform != kPeerPlatformAndroid && - !ffi.canvasModel.cursorEmbedded && - !pi.isWayland) { - final state = ShowRemoteCursorState.find(id); - final lockState = ShowRemoteCursorLockState.find(id); - final enabled = !ffiModel.viewOnly; - final option = 'show-remote-cursor'; - if (pi.currentDisplay == kAllDisplayValue || - bind.sessionIsMultiUiSession(sessionId: sessionId)) { - lockState.value = false; - } - v.add(TToggleMenu( - child: Text(translate('Show remote cursor')), - value: state.value, - onChanged: enabled && !lockState.value - ? (value) async { - if (value == null) return; - await bind.sessionToggleOption( - sessionId: sessionId, value: option); - state.value = bind.sessionGetToggleOptionSync( - sessionId: sessionId, arg: option); - } - : null)); - } - // follow remote cursor - if (pi.platform != kPeerPlatformAndroid && - !ffi.canvasModel.cursorEmbedded && - !pi.isWayland && - versionCmp(pi.version, "1.2.4") >= 0 && - pi.displays.length > 1 && - pi.currentDisplay != kAllDisplayValue && - !bind.sessionIsMultiUiSession(sessionId: sessionId)) { - final option = 'follow-remote-cursor'; - final value = - bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); - final showCursorOption = 'show-remote-cursor'; - final showCursorState = ShowRemoteCursorState.find(id); - final showCursorLockState = ShowRemoteCursorLockState.find(id); - final showCursorEnabled = bind.sessionGetToggleOptionSync( - sessionId: sessionId, arg: showCursorOption); - showCursorLockState.value = value; - if (value && !showCursorEnabled) { - await bind.sessionToggleOption( - sessionId: sessionId, value: showCursorOption); - showCursorState.value = bind.sessionGetToggleOptionSync( - sessionId: sessionId, arg: showCursorOption); - } - v.add(TToggleMenu( - child: Text(translate('Follow remote cursor')), - value: value, - onChanged: (value) async { - if (value == null) return; - await bind.sessionToggleOption(sessionId: sessionId, value: option); - value = bind.sessionGetToggleOptionSync( - sessionId: sessionId, arg: option); - showCursorLockState.value = value; - if (!showCursorEnabled) { - await bind.sessionToggleOption( - sessionId: sessionId, value: showCursorOption); - showCursorState.value = bind.sessionGetToggleOptionSync( - sessionId: sessionId, arg: showCursorOption); - } - })); - } - // follow remote window focus - if (pi.platform != kPeerPlatformAndroid && - !ffi.canvasModel.cursorEmbedded && - !pi.isWayland && - versionCmp(pi.version, "1.2.4") >= 0 && - pi.displays.length > 1 && - pi.currentDisplay != kAllDisplayValue && - !bind.sessionIsMultiUiSession(sessionId: sessionId)) { - final option = 'follow-remote-window'; - final value = - bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); - v.add(TToggleMenu( - child: Text(translate('Follow remote window focus')), - value: value, - onChanged: (value) async { - if (value == null) return; - await bind.sessionToggleOption(sessionId: sessionId, value: option); - value = bind.sessionGetToggleOptionSync( - sessionId: sessionId, arg: option); - })); - } - // zoom cursor - final viewStyle = await bind.sessionGetViewStyle(sessionId: sessionId) ?? ''; - if (!isMobile && - pi.platform != kPeerPlatformAndroid && - viewStyle != kRemoteViewStyleOriginal) { - final option = 'zoom-cursor'; - final peerState = PeerBoolOption.find(id, option); - v.add(TToggleMenu( - child: Text(translate('Zoom cursor')), - value: peerState.value, - onChanged: (value) async { - if (value == null) return; - await bind.sessionToggleOption(sessionId: sessionId, value: option); - peerState.value = - bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); - }, - )); - } - return v; -} - -Future> toolbarDisplayToggle( - BuildContext context, String id, FFI ffi) async { - List v = []; - final ffiModel = ffi.ffiModel; - final pi = ffiModel.pi; - final perms = ffiModel.permissions; - final sessionId = ffi.sessionId; - final isDefaultConn = ffi.connType == ConnType.defaultConn; - - // show quality monitor - final option = 'show-quality-monitor'; - v.add(TToggleMenu( - value: bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option), - onChanged: (value) async { - if (value == null) return; - await bind.sessionToggleOption(sessionId: sessionId, value: option); - ffi.qualityMonitorModel.checkShowQualityMonitor(sessionId); - }, - child: Text(translate('Show quality monitor')))); - // mute - if (isDefaultConn && perms['audio'] != false) { - final option = 'disable-audio'; - final value = - bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); - v.add(TToggleMenu( - value: value, - onChanged: (value) { - if (value == null) return; - bind.sessionToggleOption(sessionId: sessionId, value: option); - }, - child: Text(translate('Mute')))); - } - // file copy and paste - // If the version is less than 1.2.4, file copy and paste is supported on Windows only. - final isSupportIfPeer_1_2_3 = versionCmp(pi.version, '1.2.4') < 0 && - isWindows && - pi.platform == kPeerPlatformWindows; - // If the version is 1.2.4 or later, file copy and paste is supported when kPlatformAdditionsHasFileClipboard is set. - final isSupportIfPeer_1_2_4 = versionCmp(pi.version, '1.2.4') >= 0 && - bind.mainHasFileClipboard() && - pi.platformAdditions.containsKey(kPlatformAdditionsHasFileClipboard); - if (isDefaultConn && - ffiModel.keyboard && - perms['file'] != false && - (isSupportIfPeer_1_2_3 || isSupportIfPeer_1_2_4)) { - final enabled = !ffiModel.viewOnly; - final value = bind.sessionGetToggleOptionSync( - sessionId: sessionId, arg: kOptionEnableFileCopyPaste); - v.add(TToggleMenu( - value: value, - onChanged: enabled - ? (value) { - if (value == null) return; - bind.sessionToggleOption( - sessionId: sessionId, value: kOptionEnableFileCopyPaste); - } - : null, - child: Text(translate('Enable file copy and paste')))); - } - // disable clipboard - if (isDefaultConn && ffiModel.keyboard && perms['clipboard'] != false) { - final enabled = !ffiModel.viewOnly; - final option = 'disable-clipboard'; - var value = - bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); - if (ffiModel.viewOnly) value = true; - v.add(TToggleMenu( - value: value, - onChanged: enabled - ? (value) { - if (value == null) return; - bind.sessionToggleOption(sessionId: sessionId, value: option); - } - : null, - child: Text(translate('Disable clipboard')))); - } - // lock after session end - if (isDefaultConn && ffiModel.keyboard && !ffiModel.isPeerAndroid) { - final enabled = !ffiModel.viewOnly; - final option = 'lock-after-session-end'; - final value = - bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); - v.add(TToggleMenu( - value: value, - onChanged: enabled - ? (value) { - if (value == null) return; - bind.sessionToggleOption(sessionId: sessionId, value: option); - } - : null, - child: Text(translate('Lock after session end')))); - } - - if (pi.isSupportMultiDisplay && - PrivacyModeState.find(id).isEmpty && - pi.displaysCount.value > 1 && - bind.mainGetUserDefaultOption(key: kKeyShowMonitorsToolbar) == 'Y') { - final value = - bind.sessionGetDisplaysAsIndividualWindows(sessionId: ffi.sessionId) == - 'Y'; - v.add(TToggleMenu( - value: value, - onChanged: (value) { - if (value == null) return; - bind.sessionSetDisplaysAsIndividualWindows( - sessionId: sessionId, value: value ? 'Y' : 'N'); - }, - child: Text(translate('Show displays as individual windows')))); - } - - final isMultiScreens = !isWeb && (await getScreenRectList()).length > 1; - if (pi.isSupportMultiDisplay && isMultiScreens) { - final value = bind.sessionGetUseAllMyDisplaysForTheRemoteSession( - sessionId: ffi.sessionId) == - 'Y'; - v.add(TToggleMenu( - value: value, - onChanged: (value) { - if (value == null) return; - bind.sessionSetUseAllMyDisplaysForTheRemoteSession( - sessionId: sessionId, value: value ? 'Y' : 'N'); - }, - child: Text(translate('Use all my displays for the remote session')))); - } - - // 444 - final codec_format = ffi.qualityMonitorModel.data.codecFormat; - if (versionCmp(pi.version, "1.2.4") >= 0 && - (codec_format == "AV1" || codec_format == "VP9")) { - final option = 'i444'; - final value = - bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); - v.add(TToggleMenu( - value: value, - onChanged: (value) async { - if (value == null) return; - await bind.sessionToggleOption(sessionId: sessionId, value: option); - bind.sessionChangePreferCodec(sessionId: sessionId); - }, - child: Text(translate('True color (4:4:4)')))); - } - - if (isDefaultConn && isMobile) { - v.addAll(toolbarKeyboardToggles(ffi)); - } - - // view mode (mobile only, desktop is in keyboard menu) - if (isDefaultConn && isMobile && versionCmp(pi.version, '1.2.0') >= 0) { - v.add(TToggleMenu( - value: ffiModel.viewOnly, - onChanged: (value) async { - if (value == null) return; - await bind.sessionToggleOption( - sessionId: ffi.sessionId, value: kOptionToggleViewOnly); - ffiModel.setViewOnly(id, value); - }, - child: Text(translate('View Mode')))); - } - return v; -} - -var togglePrivacyModeTime = DateTime.now().subtract(const Duration(hours: 1)); - -List toolbarPrivacyMode( - RxString privacyModeState, BuildContext context, String id, FFI ffi) { - final ffiModel = ffi.ffiModel; - final pi = ffiModel.pi; - final sessionId = ffi.sessionId; - - getDefaultMenu(Future Function(SessionID sid, String opt) toggleFunc) { - final enabled = !ffi.ffiModel.viewOnly; - return TToggleMenu( - value: privacyModeState.isNotEmpty, - onChanged: enabled - ? (value) { - if (value == null) return; - if (ffiModel.pi.currentDisplay != 0 && - ffiModel.pi.currentDisplay != kAllDisplayValue) { - msgBox( - sessionId, - 'custom-nook-nocancel-hasclose', - 'info', - 'Please switch to Display 1 first', - '', - ffi.dialogManager); - return; - } - final option = 'privacy-mode'; - toggleFunc(sessionId, option); - } - : null, - child: Text(translate('Privacy mode'))); - } - - final privacyModeImpls = - pi.platformAdditions[kPlatformAdditionsSupportedPrivacyModeImpl] - as List?; - if (privacyModeImpls == null) { - return [ - getDefaultMenu((sid, opt) async { - bind.sessionToggleOption(sessionId: sid, value: opt); - togglePrivacyModeTime = DateTime.now(); - }) - ]; - } - if (privacyModeImpls.isEmpty) { - return []; - } - - if (privacyModeImpls.length == 1) { - final implKey = (privacyModeImpls[0] as List)[0] as String; - return [ - getDefaultMenu((sid, opt) async { - bind.sessionTogglePrivacyMode( - sessionId: sid, implKey: implKey, on: privacyModeState.isEmpty); - togglePrivacyModeTime = DateTime.now(); - }) - ]; - } else { - return privacyModeImpls.map((e) { - final implKey = (e as List)[0] as String; - final implName = (e)[1] as String; - return TToggleMenu( - child: Text(translate(implName)), - value: privacyModeState.value == implKey, - onChanged: (value) { - if (value == null) return; - togglePrivacyModeTime = DateTime.now(); - bind.sessionTogglePrivacyMode( - sessionId: sessionId, implKey: implKey, on: value); - }); - }).toList(); - } -} - -List toolbarKeyboardToggles(FFI ffi) { - final ffiModel = ffi.ffiModel; - final pi = ffiModel.pi; - final sessionId = ffi.sessionId; - final isDefaultConn = ffi.connType == ConnType.defaultConn; - List v = []; - - // swap key - if (ffiModel.keyboard && - ((isMacOS && pi.platform != kPeerPlatformMacOS) || - (!isMacOS && pi.platform == kPeerPlatformMacOS))) { - final option = 'allow_swap_key'; - final value = - bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); - onChanged(bool? value) { - if (value == null) return; - bind.sessionToggleOption(sessionId: sessionId, value: option); - } - - final enabled = !ffi.ffiModel.viewOnly; - v.add(TToggleMenu( - value: value, - onChanged: enabled ? onChanged : null, - child: Text(translate('Swap control-command key')))); - } - - // Relative mouse mode (gaming mode). - // Only show when server supports MOUSE_TYPE_MOVE_RELATIVE (version >= 1.4.5) - // Note: This feature is only available in Flutter client. Sciter client does not support this. - // Web client is not supported yet due to Pointer Lock API integration complexity with Flutter's input system. - // Wayland is not supported due to cursor warping limitations. - // Mobile: This option is now in GestureHelp widget, shown only when joystick is visible. - final isWayland = isDesktop && isLinux && bind.mainCurrentIsWayland(); - if (isDesktop && - isDefaultConn && - !isWeb && - !isWayland && - ffiModel.keyboard && - !ffiModel.viewOnly && - ffi.inputModel.isRelativeMouseModeSupported) { - v.add(TToggleMenu( - value: ffi.inputModel.relativeMouseMode.value, - onChanged: (value) { - if (value == null) return; - final previousValue = ffi.inputModel.relativeMouseMode.value; - final success = ffi.inputModel.setRelativeMouseMode(value); - if (!success) { - // Revert the observable toggle to reflect the actual state - ffi.inputModel.relativeMouseMode.value = previousValue; - } - }, - child: Text(translate('Relative mouse mode')))); - } - - // reverse mouse wheel - if (ffiModel.keyboard) { - var optionValue = - bind.sessionGetReverseMouseWheelSync(sessionId: sessionId) ?? ''; - if (optionValue == '') { - optionValue = bind.mainGetUserDefaultOption(key: kKeyReverseMouseWheel); - } - onChanged(bool? value) async { - if (value == null) return; - await bind.sessionSetReverseMouseWheel( - sessionId: sessionId, value: value ? 'Y' : 'N'); - } - - final enabled = !ffi.ffiModel.viewOnly; - v.add(TToggleMenu( - value: optionValue == 'Y', - onChanged: enabled ? onChanged : null, - child: Text(translate('Reverse mouse wheel')))); - } - - // swap left right mouse - if (ffiModel.keyboard) { - final option = 'swap-left-right-mouse'; - final value = - bind.sessionGetToggleOptionSync(sessionId: sessionId, arg: option); - onChanged(bool? value) { - if (value == null) return; - bind.sessionToggleOption(sessionId: sessionId, value: option); - } - - final enabled = !ffi.ffiModel.viewOnly; - v.add(TToggleMenu( - value: value, - onChanged: enabled ? onChanged : null, - child: Text(translate('swap-left-right-mouse')))); - } - return v; -} - -bool showVirtualDisplayMenu(FFI ffi) { - if (ffi.ffiModel.pi.platform != kPeerPlatformWindows) { - return false; - } - if (!ffi.ffiModel.pi.isInstalled) { - return false; - } - if (ffi.ffiModel.pi.isRustDeskIdd || ffi.ffiModel.pi.isAmyuniIdd) { - return true; - } - return false; -} - -List getVirtualDisplayMenuChildren( - FFI ffi, String id, VoidCallback? clickCallBack) { - if (!showVirtualDisplayMenu(ffi)) { - return []; - } - final pi = ffi.ffiModel.pi; - final privacyModeState = PrivacyModeState.find(id); - if (pi.isRustDeskIdd) { - final virtualDisplays = ffi.ffiModel.pi.RustDeskVirtualDisplays; - final children = []; - for (var i = 0; i < kMaxVirtualDisplayCount; i++) { - children.add(Obx(() => CkbMenuButton( - value: virtualDisplays.contains(i + 1), - onChanged: privacyModeState.isNotEmpty - ? null - : (bool? value) async { - if (value != null) { - bind.sessionToggleVirtualDisplay( - sessionId: ffi.sessionId, index: i + 1, on: value); - clickCallBack?.call(); - } - }, - child: Text('${translate('Virtual display')} ${i + 1}'), - ffi: ffi, - ))); - } - children.add(Divider()); - children.add(Obx(() => MenuButton( - onPressed: privacyModeState.isNotEmpty - ? null - : () { - bind.sessionToggleVirtualDisplay( - sessionId: ffi.sessionId, - index: kAllVirtualDisplay, - on: false); - clickCallBack?.call(); - }, - ffi: ffi, - child: Text(translate('Plug out all')), - ))); - return children; - } - if (pi.isAmyuniIdd) { - final count = ffi.ffiModel.pi.amyuniVirtualDisplayCount; - final children = [ - Obx(() => Row( - children: [ - TextButton( - onPressed: privacyModeState.isNotEmpty || count == 0 - ? null - : () { - bind.sessionToggleVirtualDisplay( - sessionId: ffi.sessionId, index: 0, on: false); - clickCallBack?.call(); - }, - child: Icon(Icons.remove), - ), - Text(count.toString()), - TextButton( - onPressed: privacyModeState.isNotEmpty || count == 4 - ? null - : () { - bind.sessionToggleVirtualDisplay( - sessionId: ffi.sessionId, index: 0, on: true); - clickCallBack?.call(); - }, - child: Icon(Icons.add), - ), - ], - )), - Divider(), - Obx(() => MenuButton( - onPressed: privacyModeState.isNotEmpty || count == 0 - ? null - : () { - bind.sessionToggleVirtualDisplay( - sessionId: ffi.sessionId, - index: kAllVirtualDisplay, - on: false); - clickCallBack?.call(); - }, - ffi: ffi, - child: Text(translate('Plug out all')), - )), - ]; - return children; - } - return []; -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/consts.dart b/shelled/rustdesk-as-ref/flutter/lib/consts.dart deleted file mode 100644 index b1112dd..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/consts.dart +++ /dev/null @@ -1,685 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:get/get.dart'; - -const int kMaxVirtualDisplayCount = 4; -const int kAllVirtualDisplay = -1; - -const double kDesktopRemoteTabBarHeight = 28.0; -const int kInvalidWindowId = -1; -const int kMainWindowId = 0; - -const kAllDisplayValue = -1; - -const kKeyLegacyMode = 'legacy'; -const kKeyMapMode = 'map'; -const kKeyTranslateMode = 'translate'; - -const String kPlatformAdditionsIsWayland = "is_wayland"; -const String kPlatformAdditionsHeadless = "headless"; -const String kPlatformAdditionsIsInstalled = "is_installed"; -const String kPlatformAdditionsIddImpl = "idd_impl"; -const String kPlatformAdditionsRustDeskVirtualDisplays = - "rustdesk_virtual_displays"; -const String kPlatformAdditionsAmyuniVirtualDisplays = - "amyuni_virtual_displays"; -const String kPlatformAdditionsHasFileClipboard = "has_file_clipboard"; -const String kPlatformAdditionsSupportedPrivacyModeImpl = - "supported_privacy_mode_impl"; - -const String kPeerPlatformWindows = "Windows"; -const String kPeerPlatformLinux = "Linux"; -const String kPeerPlatformMacOS = "Mac OS"; -const String kPeerPlatformAndroid = "Android"; -const String kPeerPlatformWebDesktop = "WebDesktop"; - -const double kScrollbarThickness = 12.0; - -/// [kAppTypeMain] used by 'Desktop Main Page' , 'Mobile (Client and Server)', "Install Page" -const String kAppTypeMain = "main"; - -/// [kAppTypeConnectionManager] only for 'Desktop CM Page' -const String kAppTypeConnectionManager = "cm"; - -const String kAppTypeDesktopRemote = "remote"; -const String kAppTypeDesktopFileTransfer = "file transfer"; -const String kAppTypeDesktopViewCamera = "view camera"; -const String kAppTypeDesktopPortForward = "port forward"; -const String kAppTypeDesktopTerminal = "terminal"; - -const String kWindowMainWindowOnTop = "main_window_on_top"; -const String kWindowRefreshCurrentUser = "refresh_current_user"; -const String kWindowGetWindowInfo = "get_window_info"; -const String kWindowGetScreenList = "get_screen_list"; -// This method is not used, maybe it can be removed. -const String kWindowDisableGrabKeyboard = "disable_grab_keyboard"; -const String kWindowActionRebuild = "rebuild"; -const String kWindowEventHide = "hide"; -const String kWindowEventShow = "show"; -const String kWindowConnect = "connect"; -const String kWindowBumpMouse = "bump_mouse"; - -const String kWindowEventNewRemoteDesktop = "new_remote_desktop"; -const String kWindowEventNewFileTransfer = "new_file_transfer"; -const String kWindowEventNewViewCamera = "new_view_camera"; -const String kWindowEventNewPortForward = "new_port_forward"; -const String kWindowEventNewTerminal = "new_terminal"; -const String kWindowEventRestoreTerminalSessions = "restore_terminal_sessions"; -const String kWindowEventActiveSession = "active_session"; -const String kWindowEventActiveDisplaySession = "active_display_session"; -const String kWindowEventGetRemoteList = "get_remote_list"; -const String kWindowEventGetSessionIdList = "get_session_id_list"; -const String kWindowEventRemoteWindowCoords = "remote_window_coords"; -const String kWindowEventSetFullscreen = "set_fullscreen"; - -const String kWindowEventMoveTabToNewWindow = "move_tab_to_new_window"; -const String kWindowEventGetCachedSessionData = "get_cached_session_data"; -const String kWindowEventOpenMonitorSession = "open_monitor_session"; - -const String kOptionViewStyle = "view_style"; -const String kOptionScrollStyle = "scroll_style"; -const String kOptionEdgeScrollEdgeThickness = "edge-scroll-edge-thickness"; -const String kOptionImageQuality = "image_quality"; -const String kOptionOpenNewConnInTabs = "enable-open-new-connections-in-tabs"; -const String kOptionTextureRender = "use-texture-render"; -const String kOptionD3DRender = "allow-d3d-render"; -const String kOptionOpenInTabs = "allow-open-in-tabs"; -const String kOptionOpenInWindows = "allow-open-in-windows"; -const String kOptionForceAlwaysRelay = "force-always-relay"; -const String kOptionViewOnly = "view_only"; -const String kOptionEnableLanDiscovery = "enable-lan-discovery"; -const String kOptionWhitelist = "whitelist"; -const String kOptionEnableAbr = "enable-abr"; -const String kOptionEnableRecordSession = "enable-record-session"; -const String kOptionDirectServer = "direct-server"; -const String kOptionDirectAccessPort = "direct-access-port"; -const String kOptionAllowAutoDisconnect = "allow-auto-disconnect"; -const String kOptionAutoDisconnectTimeout = "auto-disconnect-timeout"; -const String kOptionEnableHwcodec = "enable-hwcodec"; -const String kOptionAllowAutoRecordIncoming = "allow-auto-record-incoming"; -const String kOptionAllowAutoRecordOutgoing = "allow-auto-record-outgoing"; -const String kOptionVideoSaveDirectory = "video-save-directory"; -const String kOptionAccessMode = "access-mode"; -const String kOptionEnableKeyboard = "enable-keyboard"; -// "Settings -> Security -> Permissions" -const String kOptionEnableRemotePrinter = "enable-remote-printer"; -const String kOptionEnableClipboard = "enable-clipboard"; -const String kOptionEnableFileTransfer = "enable-file-transfer"; -const String kOptionEnableAudio = "enable-audio"; -const String kOptionEnableCamera = "enable-camera"; -const String kOptionEnableTerminal = "enable-terminal"; -const String kOptionTerminalPersistent = "terminal-persistent"; -const String kOptionEnableTunnel = "enable-tunnel"; -const String kOptionEnableRemoteRestart = "enable-remote-restart"; -const String kOptionEnableBlockInput = "enable-block-input"; -const String kOptionAllowRemoteConfigModification = - "allow-remote-config-modification"; -const String kOptionVerificationMethod = "verification-method"; -const String kOptionApproveMode = "approve-mode"; -const String kOptionAllowNumericOneTimePassword = - "allow-numeric-one-time-password"; -const String kOptionCollapseToolbar = "collapse_toolbar"; -const String kOptionHideToolbar = "hide-toolbar"; -const String kOptionShowRemoteCursor = "show_remote_cursor"; -const String kOptionFollowRemoteCursor = "follow_remote_cursor"; -const String kOptionFollowRemoteWindow = "follow_remote_window"; -const String kOptionZoomCursor = "zoom-cursor"; -const String kOptionShowQualityMonitor = "show_quality_monitor"; -const String kOptionDisableAudio = "disable_audio"; -const String kOptionEnableFileCopyPaste = "enable-file-copy-paste"; -// "Settings -> Display -> Other default options" -const String kOptionDisableClipboard = "disable_clipboard"; -const String kOptionLockAfterSessionEnd = "lock_after_session_end"; -const String kOptionPrivacyMode = "privacy_mode"; -const String kOptionTouchMode = "touch-mode"; -const String kOptionI444 = "i444"; -const String kOptionSwapLeftRightMouse = "swap-left-right-mouse"; -const String kOptionCodecPreference = "codec-preference"; -const String kOptionRemoteMenubarDragLeft = "remote-menubar-drag-left"; -const String kOptionRemoteMenubarDragRight = "remote-menubar-drag-right"; -const String kOptionHideAbTagsPanel = "hideAbTagsPanel"; -const String kOptionRemoteMenubarState = "remoteMenubarState"; -const String kOptionPeerSorting = "peer-sorting"; -const String kOptionPeerTabIndex = "peer-tab-index"; -const String kOptionPeerTabOrder = "peer-tab-order"; -const String kOptionPeerTabVisible = "peer-tab-visible"; -const String kOptionPeerCardUiType = "peer-card-ui-type"; -const String kOptionCurrentAbName = "current-ab-name"; -const String kOptionEnableConfirmClosingTabs = "enable-confirm-closing-tabs"; -const String kOptionAllowAlwaysSoftwareRender = "allow-always-software-render"; -const String kOptionEnableCheckUpdate = "enable-check-update"; -const String kOptionAllowAutoUpdate = "allow-auto-update"; -const String kOptionAllowLinuxHeadless = "allow-linux-headless"; -const String kOptionAllowRemoveWallpaper = "allow-remove-wallpaper"; -const String kOptionStopService = "stop-service"; -const String kOptionDirectxCapture = "enable-directx-capture"; -const String kOptionAllowRemoteCmModification = "allow-remote-cm-modification"; -const String kOptionEnableUdpPunch = "enable-udp-punch"; -const String kOptionEnableIpv6Punch = "enable-ipv6-punch"; -const String kOptionEnableTrustedDevices = "enable-trusted-devices"; -const String kOptionShowVirtualMouse = "show-virtual-mouse"; -const String kOptionVirtualMouseScale = "virtual-mouse-scale"; -const String kOptionShowVirtualJoystick = "show-virtual-joystick"; -const String kOptionAllowAskForNoteAtEndOfConnection = "allow-ask-for-note"; -const String kOptionEnableShowTerminalExtraKeys = "enable-show-terminal-extra-keys"; - -// network options -const String kOptionAllowWebSocket = "allow-websocket"; -const String kOptionAllowInsecureTLSFallback = "allow-insecure-tls-fallback"; -const String kOptionDisableUdp = "disable-udp"; -const String kOptionEnableFlutterHttpOnRust = "enable-flutter-http-on-rust"; - -// builtin options -const String kOptionHideServerSetting = "hide-server-settings"; -const String kOptionHideProxySetting = "hide-proxy-settings"; -const String kOptionHideWebSocketSetting = "hide-websocket-settings"; -const String kOptionHideStopService = "hide-stop-service"; -const String kOptionHideRemotePrinterSetting = "hide-remote-printer-settings"; -const String kOptionHideSecuritySetting = "hide-security-settings"; -const String kOptionHideNetworkSetting = "hide-network-settings"; -const String kOptionRemovePresetPasswordWarning = - "remove-preset-password-warning"; -const String kOptionDisableChangePermanentPassword = - "disable-change-permanent-password"; -const String kOptionDisableChangeId = "disable-change-id"; -const String kOptionDisableUnlockPin = "disable-unlock-pin"; -const kHideUsernameOnCard = "hide-username-on-card"; -const String kOptionHideHelpCards = "hide-help-cards"; - -const String kOptionToggleViewOnly = "view-only"; -const String kOptionToggleShowMyCursor = "show-my-cursor"; - -const String kOptionDisableFloatingWindow = "disable-floating-window"; - -const String kOptionKeepScreenOn = "keep-screen-on"; - -const String kOptionKeepAwakeDuringIncomingSessions = "keep-awake-during-incoming-sessions"; -const String kOptionKeepAwakeDuringOutgoingSessions = "keep-awake-during-outgoing-sessions"; - -const String kOptionShowMobileAction = "showMobileActions"; - -const String kUrlActionClose = "close"; - -const String kTabLabelHomePage = "Home"; -const String kTabLabelSettingPage = "Settings"; - -const String kWindowPrefix = "wm_"; -const int kWindowMainId = 0; - -const String kPointerEventKindTouch = "touch"; -const String kPointerEventKindMouse = "mouse"; - -const String kMouseEventTypeDefault = ""; -const String kMouseEventTypePanStart = "pan_start"; -const String kMouseEventTypePanUpdate = "pan_update"; -const String kMouseEventTypePanEnd = "pan_end"; -const String kMouseEventTypeDown = "down"; -const String kMouseEventTypeUp = "up"; - -const String kKeyFlutterKey = "flutter_key"; - -const String kKeyShowDisplaysAsIndividualWindows = - 'displays_as_individual_windows'; -const String kKeyUseAllMyDisplaysForTheRemoteSession = - 'use_all_my_displays_for_the_remote_session'; -const String kKeyShowMonitorsToolbar = 'show_monitors_toolbar'; -const String kKeyReverseMouseWheel = "reverse_mouse_wheel"; - -const String kMsgboxTextWaitingForImage = 'Connected, waiting for image...'; - -// the executable name of the portable version -const String kEnvPortableExecutable = "RUSTDESK_APPNAME"; - -const Color kColorWarn = Color.fromARGB(255, 245, 133, 59); -const Color kColorCanvas = Colors.black; - -const int kMobileDefaultDisplayWidth = 720; -const int kMobileDefaultDisplayHeight = 1280; - -const int kDesktopDefaultDisplayWidth = 1080; -const int kDesktopDefaultDisplayHeight = 720; - -const int kMobileMaxDisplaySize = 1280; -const int kDesktopMaxDisplaySize = 3840; - -const double kDesktopFileTransferRowHeight = 30.0; -const double kDesktopFileTransferHeaderHeight = 25.0; - -const double kMinFps = 5; -const double kDefaultFps = 30; -const double kMaxFps = 120; - -const double kMinQuality = 10; -const double kDefaultQuality = 50; -const double kMaxQuality = 100; -const double kMaxMoreQuality = 2000; - -// trackpad speed -const String kKeyTrackpadSpeed = 'trackpad-speed'; -const int kMinTrackpadSpeed = 10; -const int kDefaultTrackpadSpeed = 100; -const int kMaxTrackpadSpeed = 1000; - -// relative mouse mode -/// Throttle duration (in milliseconds) for updating pointer lock center during -/// window move/resize events. Lower values provide more responsive updates but -/// may cause performance issues during rapid window operations. -const int kDefaultPointerLockCenterThrottleMs = 100; - -/// Minimum server version required for relative mouse mode (MOUSE_TYPE_MOVE_RELATIVE). -/// Servers older than this version will ignore relative mouse events. -/// -/// IMPORTANT: This value must be kept in sync with the Rust constant -/// `MIN_VERSION_RELATIVE_MOUSE_MODE` in `src/common.rs`. -const String kMinVersionForRelativeMouseMode = '1.4.5'; - -/// Maximum delta value for relative mouse movement. -/// Large values could cause issues with i32 overflow on server side, -/// and no reasonable mouse movement should exceed this bound. -/// -/// IMPORTANT: This value must be kept in sync with the Rust constant -/// `MAX_RELATIVE_MOUSE_DELTA` in `src/server/input_service.rs`. -const int kMaxRelativeMouseDelta = 10000; - -/// Debounce duration (in milliseconds) for relative mouse mode toggle. -/// This prevents double-toggle from race condition between Rust rdev grab loop -/// and Flutter keyboard handling. Value should be small enough to allow -/// intentional quick toggles but large enough to prevent accidental double-triggers. -const int kRelativeMouseModeToggleDebounceMs = 150; - -// incomming (should be incoming) is kept, because change it will break the previous setting. -const String kKeyPrinterIncomingJobAction = 'printer-incomming-job-action'; -const String kValuePrinterIncomingJobDismiss = 'dismiss'; -const String kValuePrinterIncomingJobDefault = ''; -const String kValuePrinterIncomingJobSelected = 'selected'; -const String kKeyPrinterSelected = 'printer-selected-name'; -const String kKeyPrinterSave = 'allow-printer-dialog-save'; -const String kKeyPrinterAllowAutoPrint = 'allow-printer-auto-print'; - -double kNewWindowOffset = isWindows - ? 56.0 - : isLinux - ? 50.0 - : isMacOS - ? 30.0 - : 50.0; - -EdgeInsets get kDragToResizeAreaPadding => !kUseCompatibleUiMode && isLinux - ? stateGlobal.fullscreen.isTrue || stateGlobal.isMaximized.value - ? EdgeInsets.zero - : EdgeInsets.all(5.0) - : EdgeInsets.zero; -// https://en.wikipedia.org/wiki/Non-breaking_space -const int $nbsp = 0x00A0; - -extension StringExtension on String { - String get nonBreaking => replaceAll(' ', String.fromCharCode($nbsp)); -} - -const Size kConnectionManagerWindowSizeClosedChat = Size(300, 490); -const Size kConnectionManagerWindowSizeOpenChat = Size(700, 490); -// Tabbar transition duration, now we remove the duration -const Duration kTabTransitionDuration = Duration.zero; -const double kEmptyMarginTop = 50; -const double kDesktopIconButtonSplashRadius = 20; - -/// [kMinCursorSize] indicates min cursor (w, h) -const int kMinCursorSize = 12; - -const kFullScreenEdgeSize = 0.0; -const kMaximizeEdgeSize = 0.0; -// Do not use kWindowResizeEdgeSize directly. Use `windowResizeEdgeSize` in `common.dart` instead. -const kWindowResizeEdgeSize = 5.0; -final kWindowBorderWidth = isWindows ? 0.0 : 1.0; -const kDesktopMenuPadding = EdgeInsets.only(left: 12.0, right: 3.0); -const kFrameBorderRadius = 12.0; -const kFrameClipRRectBorderRadius = 12.0; -const kFrameBoxShadowBlurRadius = 32.0; -const kFrameBoxShadowOffsetFocused = 4.0; -const kFrameBoxShadowOffsetUnfocused = 2.0; - -const kInvalidValueStr = 'InvalidValueStr'; - -// Config key shared by flutter and other ui. -const kCommConfKeyTheme = 'theme'; -const kCommConfKeyLang = 'lang'; - -const kMobilePageConstraints = BoxConstraints(maxWidth: 600); - -/// [kMouseControlDistance] indicates the distance that self-side move to get control of mouse. -const kMouseControlDistance = 12; - -/// [kMouseControlTimeoutMSec] indicates the timeout (in milliseconds) that self-side can get control of mouse. -const kMouseControlTimeoutMSec = 1000; - -/// [kRemoteViewStyleOriginal] Show remote image without scaling. -const kRemoteViewStyleOriginal = 'original'; - -/// [kRemoteViewStyleAdaptive] Show remote image scaling by ratio factor. -const kRemoteViewStyleAdaptive = 'adaptive'; - -/// [kRemoteViewStyleCustom] Show remote image at a user-defined scale percent. -const kRemoteViewStyleCustom = 'custom'; - -/// [kRemoteScrollStyleAuto] Scroll image auto by position. -const kRemoteScrollStyleAuto = 'scrollauto'; - -/// [kRemoteScrollStyleBar] Scroll image with scroll bar. -const kRemoteScrollStyleBar = 'scrollbar'; - -/// [kRemoteScrollStyleEdge] Scroll image auto at edges. -const kRemoteScrollStyleEdge = 'scrolledge'; - -/// [kScrollModeDefault] Mouse or touchpad, the default scroll mode. -const kScrollModeDefault = 'default'; - -/// [kScrollModeReverse] Mouse or touchpad, the reverse scroll mode. -const kScrollModeReverse = 'reverse'; - -/// [kRemoteImageQualityBest] Best image quality. -const kRemoteImageQualityBest = 'best'; - -/// [kRemoteImageQualityBalanced] Balanced image quality, mid performance. -const kRemoteImageQualityBalanced = 'balanced'; - -/// [kRemoteImageQualityLow] Low image quality, better performance. -const kRemoteImageQualityLow = 'low'; - -/// [kRemoteImageQualityCustom] Custom image quality. -const kRemoteImageQualityCustom = 'custom'; - -const kIgnoreDpi = true; - -const Set kTouchBasedDeviceKinds = { - PointerDeviceKind.touch, - PointerDeviceKind.stylus, - PointerDeviceKind.invertedStylus, -}; - -// Scale custom related constants -const String kCustomScalePercentKey = - 'custom_scale_percent'; // Flutter option key for storing custom scale percent (integer 5-1000) -const int kScaleCustomMinPercent = 5; -const int kScaleCustomPivotPercent = 100; // 100% should be at 1/3 of track -const int kScaleCustomMaxPercent = 1000; -const double kScaleCustomPivotPos = 1.0 / 3.0; // first 1/3 → up to 100% -const double kScaleCustomDetentEpsilon = - 0.006; // snap range around pivot (~0.6%) -const Duration kDebounceCustomScaleDuration = Duration(milliseconds: 300); - -// ================================ mobile ================================ - -// Magic numbers, maybe need to avoid it or use a better way to get them. -const kMobileDelaySoftKeyboard = Duration(milliseconds: 30); -const kMobileDelaySoftKeyboardFocus = Duration(milliseconds: 30); - -/// Android constants -const kActionApplicationDetailsSettings = - "android.settings.APPLICATION_DETAILS_SETTINGS"; -const kActionAccessibilitySettings = "android.settings.ACCESSIBILITY_SETTINGS"; - -const kRecordAudio = "android.permission.RECORD_AUDIO"; -const kManageExternalStorage = "android.permission.MANAGE_EXTERNAL_STORAGE"; -const kRequestIgnoreBatteryOptimizations = - "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"; -const kSystemAlertWindow = "android.permission.SYSTEM_ALERT_WINDOW"; -const kAndroid13Notification = "android.permission.POST_NOTIFICATIONS"; - -/// Android channel invoke type key -class AndroidChannel { - static final kStartAction = "start_action"; - static final kGetStartOnBootOpt = "get_start_on_boot_opt"; - static final kSetStartOnBootOpt = "set_start_on_boot_opt"; - static final kSyncAppDirConfigPath = "sync_app_dir"; -} - -/// flutter/packages/flutter/lib/src/services/keyboard_key.dart -> _keyLabels -/// see [LogicalKeyboardKey.keyLabel] -const Map logicalKeyMap = { - 0x00000000020: 'VK_SPACE', - 0x00000000022: 'VK_QUOTE', - 0x0000000002c: 'VK_COMMA', - 0x0000000002d: 'VK_MINUS', - 0x0000000002f: 'VK_SLASH', - 0x00000000030: 'VK_0', - 0x00000000031: 'VK_1', - 0x00000000032: 'VK_2', - 0x00000000033: 'VK_3', - 0x00000000034: 'VK_4', - 0x00000000035: 'VK_5', - 0x00000000036: 'VK_6', - 0x00000000037: 'VK_7', - 0x00000000038: 'VK_8', - 0x00000000039: 'VK_9', - 0x0000000003b: 'VK_SEMICOLON', - 0x0000000003d: 'VK_PLUS', // it is = - 0x0000000005b: 'VK_LBRACKET', - 0x0000000005c: 'VK_BACKSLASH', - 0x0000000005d: 'VK_RBRACKET', - 0x00000000061: 'VK_A', - 0x00000000062: 'VK_B', - 0x00000000063: 'VK_C', - 0x00000000064: 'VK_D', - 0x00000000065: 'VK_E', - 0x00000000066: 'VK_F', - 0x00000000067: 'VK_G', - 0x00000000068: 'VK_H', - 0x00000000069: 'VK_I', - 0x0000000006a: 'VK_J', - 0x0000000006b: 'VK_K', - 0x0000000006c: 'VK_L', - 0x0000000006d: 'VK_M', - 0x0000000006e: 'VK_N', - 0x0000000006f: 'VK_O', - 0x00000000070: 'VK_P', - 0x00000000071: 'VK_Q', - 0x00000000072: 'VK_R', - 0x00000000073: 'VK_S', - 0x00000000074: 'VK_T', - 0x00000000075: 'VK_U', - 0x00000000076: 'VK_V', - 0x00000000077: 'VK_W', - 0x00000000078: 'VK_X', - 0x00000000079: 'VK_Y', - 0x0000000007a: 'VK_Z', - 0x00100000008: 'VK_BACK', - 0x00100000009: 'VK_TAB', - 0x0010000000d: 'VK_ENTER', - 0x0010000001b: 'VK_ESCAPE', - 0x0010000007f: 'VK_DELETE', - 0x00100000104: 'VK_CAPITAL', - 0x00100000301: 'VK_DOWN', - 0x00100000302: 'VK_LEFT', - 0x00100000303: 'VK_RIGHT', - 0x00100000304: 'VK_UP', - 0x00100000305: 'VK_END', - 0x00100000306: 'VK_HOME', - 0x00100000307: 'VK_NEXT', - 0x00100000308: 'VK_PRIOR', - 0x00100000401: 'VK_CLEAR', - 0x00100000407: 'VK_INSERT', - 0x00100000504: 'VK_CANCEL', - 0x00100000506: 'VK_EXECUTE', - 0x00100000508: 'VK_HELP', - 0x00100000509: 'VK_PAUSE', - 0x0010000050c: 'VK_SELECT', - 0x00100000608: 'VK_PRINT', - 0x00100000705: 'VK_CONVERT', - 0x00100000706: 'VK_FINAL', - 0x00100000711: 'VK_HANGUL', - 0x00100000712: 'VK_HANJA', - 0x00100000713: 'VK_JUNJA', - 0x00100000718: 'VK_KANA', - 0x00100000719: 'VK_KANJI', - 0x00100000801: 'VK_F1', - 0x00100000802: 'VK_F2', - 0x00100000803: 'VK_F3', - 0x00100000804: 'VK_F4', - 0x00100000805: 'VK_F5', - 0x00100000806: 'VK_F6', - 0x00100000807: 'VK_F7', - 0x00100000808: 'VK_F8', - 0x00100000809: 'VK_F9', - 0x0010000080a: 'VK_F10', - 0x0010000080b: 'VK_F11', - 0x0010000080c: 'VK_F12', - 0x00100000d2b: 'Apps', - 0x00200000002: 'VK_SLEEP', - 0x00200000100: 'VK_CONTROL', - 0x00200000101: 'RControl', - 0x00200000102: 'VK_SHIFT', - 0x00200000103: 'RShift', - 0x00200000104: 'VK_MENU', - 0x00200000105: 'RAlt', - 0x002000001f0: 'VK_CONTROL', - 0x002000001f2: 'VK_SHIFT', - 0x002000001f4: 'VK_MENU', - 0x002000001f6: 'Meta', - 0x0020000022a: 'VK_MULTIPLY', - 0x0020000022b: 'VK_ADD', - 0x0020000022d: 'VK_SUBTRACT', - 0x0020000022e: 'VK_DECIMAL', - 0x0020000022f: 'VK_DIVIDE', - 0x00200000230: 'VK_NUMPAD0', - 0x00200000231: 'VK_NUMPAD1', - 0x00200000232: 'VK_NUMPAD2', - 0x00200000233: 'VK_NUMPAD3', - 0x00200000234: 'VK_NUMPAD4', - 0x00200000235: 'VK_NUMPAD5', - 0x00200000236: 'VK_NUMPAD6', - 0x00200000237: 'VK_NUMPAD7', - 0x00200000238: 'VK_NUMPAD8', - 0x00200000239: 'VK_NUMPAD9', -}; - -/// flutter/packages/flutter/lib/src/services/keyboard_key.dart -> _debugName -/// see [PhysicalKeyboardKey.debugName] -> _debugName -const Map physicalKeyMap = { - 0x00010082: 'VK_SLEEP', - 0x00070004: 'VK_A', - 0x00070005: 'VK_B', - 0x00070006: 'VK_C', - 0x00070007: 'VK_D', - 0x00070008: 'VK_E', - 0x00070009: 'VK_F', - 0x0007000a: 'VK_G', - 0x0007000b: 'VK_H', - 0x0007000c: 'VK_I', - 0x0007000d: 'VK_J', - 0x0007000e: 'VK_K', - 0x0007000f: 'VK_L', - 0x00070010: 'VK_M', - 0x00070011: 'VK_N', - 0x00070012: 'VK_O', - 0x00070013: 'VK_P', - 0x00070014: 'VK_Q', - 0x00070015: 'VK_R', - 0x00070016: 'VK_S', - 0x00070017: 'VK_T', - 0x00070018: 'VK_U', - 0x00070019: 'VK_V', - 0x0007001a: 'VK_W', - 0x0007001b: 'VK_X', - 0x0007001c: 'VK_Y', - 0x0007001d: 'VK_Z', - 0x0007001e: 'VK_1', - 0x0007001f: 'VK_2', - 0x00070020: 'VK_3', - 0x00070021: 'VK_4', - 0x00070022: 'VK_5', - 0x00070023: 'VK_6', - 0x00070024: 'VK_7', - 0x00070025: 'VK_8', - 0x00070026: 'VK_9', - 0x00070027: 'VK_0', - 0x00070028: 'VK_ENTER', - 0x00070029: 'VK_ESCAPE', - 0x0007002a: 'VK_BACK', - 0x0007002b: 'VK_TAB', - 0x0007002c: 'VK_SPACE', - 0x0007002d: 'VK_MINUS', - 0x0007002e: 'VK_PLUS', // it is = - 0x0007002f: 'VK_LBRACKET', - 0x00070030: 'VK_RBRACKET', - 0x00070033: 'VK_SEMICOLON', - 0x00070034: 'VK_QUOTE', - 0x00070036: 'VK_COMMA', - 0x00070038: 'VK_SLASH', - 0x00070039: 'VK_CAPITAL', - 0x0007003a: 'VK_F1', - 0x0007003b: 'VK_F2', - 0x0007003c: 'VK_F3', - 0x0007003d: 'VK_F4', - 0x0007003e: 'VK_F5', - 0x0007003f: 'VK_F6', - 0x00070040: 'VK_F7', - 0x00070041: 'VK_F8', - 0x00070042: 'VK_F9', - 0x00070043: 'VK_F10', - 0x00070044: 'VK_F11', - 0x00070045: 'VK_F12', - 0x00070049: 'VK_INSERT', - 0x0007004a: 'VK_HOME', - 0x0007004b: 'VK_PRIOR', // Page Up - 0x0007004c: 'VK_DELETE', - 0x0007004d: 'VK_END', - 0x0007004e: 'VK_NEXT', // Page Down - 0x0007004f: 'VK_RIGHT', - 0x00070050: 'VK_LEFT', - 0x00070051: 'VK_DOWN', - 0x00070052: 'VK_UP', - 0x00070053: 'Num Lock', // TODO rust not impl - 0x00070054: 'VK_DIVIDE', // numpad - 0x00070055: 'VK_MULTIPLY', - 0x00070056: 'VK_SUBTRACT', - 0x00070057: 'VK_ADD', - 0x00070058: 'VK_ENTER', // num enter - 0x00070059: 'VK_NUMPAD1', - 0x0007005a: 'VK_NUMPAD2', - 0x0007005b: 'VK_NUMPAD3', - 0x0007005c: 'VK_NUMPAD4', - 0x0007005d: 'VK_NUMPAD5', - 0x0007005e: 'VK_NUMPAD6', - 0x0007005f: 'VK_NUMPAD7', - 0x00070060: 'VK_NUMPAD8', - 0x00070061: 'VK_NUMPAD9', - 0x00070062: 'VK_NUMPAD0', - 0x00070063: 'VK_DECIMAL', - 0x00070075: 'VK_HELP', - 0x00070077: 'VK_SELECT', - 0x00070088: 'VK_KANA', - 0x0007008a: 'VK_CONVERT', - 0x000700e0: 'VK_CONTROL', - 0x000700e1: 'VK_SHIFT', - 0x000700e2: 'VK_MENU', - 0x000700e3: 'Meta', - 0x000700e4: 'RControl', - 0x000700e5: 'RShift', - 0x000700e6: 'RAlt', - 0x000700e7: 'RWin', - 0x000c00b1: 'VK_PAUSE', - 0x000c00cd: 'VK_PAUSE', - 0x000c019e: 'LOCK_SCREEN', - 0x000c0208: 'VK_PRINT', -}; - -/// The windows targets in the publish time order. -enum WindowsTarget { - naw, // not a windows target - xp, - vista, - w7, - w8, - w8_1, - w10, - w11 -} - -/// A convenient method to transform a build number to the corresponding windows version. -extension WindowsTargetExt on int { - WindowsTarget get windowsVersion => getWindowsTarget(this); -} - -const kCheckSoftwareUpdateFinish = 'check_software_update_finish'; diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/connection_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/connection_page.dart deleted file mode 100644 index bdf3829..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/connection_page.dart +++ /dev/null @@ -1,615 +0,0 @@ -// main window right pane - -import 'dart:async'; -import 'dart:convert'; -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common/widgets/connection_page_title.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/desktop/widgets/popup_menu.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:get/get.dart'; -import 'package:url_launcher/url_launcher_string.dart'; -import 'package:window_manager/window_manager.dart'; -import 'package:flutter_hbb/models/peer_model.dart'; - -import '../../common.dart'; -import '../../common/formatter/id_formatter.dart'; -import '../../common/widgets/peer_tab_page.dart'; -import '../../common/widgets/autocomplete.dart'; -import '../../models/platform_model.dart'; -import '../../desktop/widgets/material_mod_popup_menu.dart' as mod_menu; - -class OnlineStatusWidget extends StatefulWidget { - const OnlineStatusWidget({Key? key, this.onSvcStatusChanged}) - : super(key: key); - - final VoidCallback? onSvcStatusChanged; - - @override - State createState() => _OnlineStatusWidgetState(); -} - -/// State for the connection page. -class _OnlineStatusWidgetState extends State { - final _svcStopped = Get.find(tag: 'stop-service'); - final _svcIsUsingPublicServer = true.obs; - Timer? _updateTimer; - - double get em => 14.0; - double? get height => bind.isIncomingOnly() ? null : em * 3; - - void onUsePublicServerGuide() { - const url = "https://rustdesk.com/pricing"; - canLaunchUrlString(url).then((can) { - if (can) { - launchUrlString(url); - } - }); - } - - @override - void initState() { - super.initState(); - _updateTimer = periodic_immediate(Duration(seconds: 1), () async { - updateStatus(); - }); - } - - @override - void dispose() { - _updateTimer?.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final isIncomingOnly = bind.isIncomingOnly(); - startServiceWidget() => Offstage( - offstage: !_svcStopped.value, - child: InkWell( - onTap: () async { - await start_service(true); - }, - child: Text(translate("Start service"), - style: TextStyle( - decoration: TextDecoration.underline, fontSize: em))) - .marginOnly(left: em), - ); - - setupServerWidget() => Flexible( - child: Offstage( - offstage: !(!_svcStopped.value && - stateGlobal.svcStatus.value == SvcStatus.ready && - _svcIsUsingPublicServer.value), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text(', ', style: TextStyle(fontSize: em)), - Flexible( - child: InkWell( - onTap: onUsePublicServerGuide, - child: Row( - children: [ - Flexible( - child: Text( - translate('setup_server_tip'), - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: em), - ), - ), - ], - ), - ), - ) - ], - ), - ), - ); - - basicWidget() => Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - height: 8, - width: 8, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4), - color: _svcStopped.value || - stateGlobal.svcStatus.value == SvcStatus.connecting - ? kColorWarn - : (stateGlobal.svcStatus.value == SvcStatus.ready - ? Color.fromARGB(255, 50, 190, 166) - : Color.fromARGB(255, 224, 79, 95)), - ), - ).marginSymmetric(horizontal: em), - Container( - width: isIncomingOnly ? 226 : null, - child: _buildConnStatusMsg(), - ), - // stop - if (!isIncomingOnly) startServiceWidget(), - // ready && public - // No need to show the guide if is custom client. - if (!isIncomingOnly) setupServerWidget(), - ], - ); - - return Container( - height: height, - child: Obx(() => isIncomingOnly - ? Column( - children: [ - basicWidget(), - Align( - child: startServiceWidget(), - alignment: Alignment.centerLeft) - .marginOnly(top: 2.0, left: 22.0), - ], - ) - : basicWidget()), - ).paddingOnly(right: isIncomingOnly ? 8 : 0); - } - - _buildConnStatusMsg() { - widget.onSvcStatusChanged?.call(); - return Text( - _svcStopped.value - ? translate("Service is not running") - : stateGlobal.svcStatus.value == SvcStatus.connecting - ? translate("connecting_status") - : stateGlobal.svcStatus.value == SvcStatus.notReady - ? translate("not_ready_status") - : translate('Ready'), - style: TextStyle(fontSize: em), - ); - } - - updateStatus() async { - final status = - jsonDecode(await bind.mainGetConnectStatus()) as Map; - final statusNum = status['status_num'] as int; - if (statusNum == 0) { - stateGlobal.svcStatus.value = SvcStatus.connecting; - } else if (statusNum == -1) { - stateGlobal.svcStatus.value = SvcStatus.notReady; - } else if (statusNum == 1) { - stateGlobal.svcStatus.value = SvcStatus.ready; - } else { - stateGlobal.svcStatus.value = SvcStatus.notReady; - } - _svcIsUsingPublicServer.value = await bind.mainIsUsingPublicServer(); - try { - stateGlobal.videoConnCount.value = status['video_conn_count'] as int; - } catch (_) {} - } -} - -/// Connection page for connecting to a remote peer. -class ConnectionPage extends StatefulWidget { - const ConnectionPage({Key? key}) : super(key: key); - - @override - State createState() => _ConnectionPageState(); -} - -/// State for the connection page. -class _ConnectionPageState extends State - with SingleTickerProviderStateMixin, WindowListener { - /// Controller for the id input bar. - final _idController = IDTextEditingController(); - - final RxBool _idInputFocused = false.obs; - final FocusNode _idFocusNode = FocusNode(); - final TextEditingController _idEditingController = TextEditingController(); - - String selectedConnectionType = 'Connect'; - - bool isWindowMinimized = false; - - final AllPeersLoader _allPeersLoader = AllPeersLoader(); - - // https://github.com/flutter/flutter/issues/157244 - Iterable _autocompleteOpts = []; - - final _menuOpen = false.obs; - - @override - void initState() { - super.initState(); - _allPeersLoader.init(setState); - _idFocusNode.addListener(onFocusChanged); - if (_idController.text.isEmpty) { - WidgetsBinding.instance.addPostFrameCallback((_) async { - final lastRemoteId = await bind.mainGetLastRemoteId(); - if (lastRemoteId != _idController.id) { - setState(() { - _idController.id = lastRemoteId; - }); - } - }); - } - Get.put(_idEditingController); - Get.put(_idController); - windowManager.addListener(this); - } - - @override - void dispose() { - _idController.dispose(); - windowManager.removeListener(this); - _allPeersLoader.clear(); - _idFocusNode.removeListener(onFocusChanged); - _idFocusNode.dispose(); - _idEditingController.dispose(); - if (Get.isRegistered()) { - Get.delete(); - } - if (Get.isRegistered()) { - Get.delete(); - } - super.dispose(); - } - - @override - void onWindowEvent(String eventName) { - super.onWindowEvent(eventName); - if (eventName == 'minimize') { - isWindowMinimized = true; - } else if (eventName == 'maximize' || eventName == 'restore') { - if (isWindowMinimized && isWindows) { - // windows can't update when minimized. - Get.forceAppUpdate(); - } - isWindowMinimized = false; - } - } - - @override - void onWindowEnterFullScreen() { - // Remove edge border by setting the value to zero. - stateGlobal.resizeEdgeSize.value = 0; - } - - @override - void onWindowLeaveFullScreen() { - // Restore edge border to default edge size. - stateGlobal.resizeEdgeSize.value = stateGlobal.isMaximized.isTrue - ? kMaximizeEdgeSize - : windowResizeEdgeSize; - } - - @override - void onWindowClose() { - super.onWindowClose(); - bind.mainOnMainWindowClose(); - } - - void onFocusChanged() { - _idInputFocused.value = _idFocusNode.hasFocus; - if (_idFocusNode.hasFocus) { - if (_allPeersLoader.needLoad) { - _allPeersLoader.getAllPeers(); - } - - final textLength = _idEditingController.value.text.length; - // Select all to facilitate removing text, just following the behavior of address input of chrome. - _idEditingController.selection = - TextSelection(baseOffset: 0, extentOffset: textLength); - } - } - - @override - Widget build(BuildContext context) { - final isOutgoingOnly = bind.isOutgoingOnly(); - return Column( - children: [ - Expanded( - child: Column( - children: [ - Row( - children: [ - Flexible(child: _buildRemoteIDTextField(context)), - ], - ).marginOnly(top: 22), - SizedBox(height: 12), - Divider().paddingOnly(right: 12), - Expanded(child: PeerTabPage()), - ], - ).paddingOnly(left: 12.0)), - if (!isOutgoingOnly) const Divider(height: 1), - if (!isOutgoingOnly) OnlineStatusWidget() - ], - ); - } - - /// Callback for the connect button. - /// Connects to the selected peer. - void onConnect( - {bool isFileTransfer = false, - bool isViewCamera = false, - bool isTerminal = false}) { - var id = _idController.id; - connect(context, id, - isFileTransfer: isFileTransfer, - isViewCamera: isViewCamera, - isTerminal: isTerminal); - } - - /// UI for the remote ID TextField. - /// Search for a peer. - Widget _buildRemoteIDTextField(BuildContext context) { - var w = Container( - width: 320 + 20 * 2, - padding: const EdgeInsets.fromLTRB(20, 24, 20, 22), - decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(13)), - border: Border.all(color: Theme.of(context).colorScheme.background)), - child: Ink( - child: Column( - children: [ - getConnectionPageTitle(context, false).marginOnly(bottom: 15), - Row( - children: [ - Expanded( - child: RawAutocomplete( - optionsBuilder: (TextEditingValue textEditingValue) { - if (textEditingValue.text == '') { - _autocompleteOpts = const Iterable.empty(); - } else if (_allPeersLoader.peers.isEmpty && - !_allPeersLoader.isPeersLoaded) { - Peer emptyPeer = Peer( - id: '', - username: '', - hostname: '', - alias: '', - platform: '', - tags: [], - hash: '', - password: '', - forceAlwaysRelay: false, - rdpPort: '', - rdpUsername: '', - loginName: '', - device_group_name: '', - note: '', - ); - _autocompleteOpts = [emptyPeer]; - } else { - String textWithoutSpaces = - textEditingValue.text.replaceAll(" ", ""); - if (int.tryParse(textWithoutSpaces) != null) { - textEditingValue = TextEditingValue( - text: textWithoutSpaces, - selection: textEditingValue.selection, - ); - } - String textToFind = textEditingValue.text.toLowerCase(); - _autocompleteOpts = _allPeersLoader.peers - .where((peer) => - peer.id.toLowerCase().contains(textToFind) || - peer.username - .toLowerCase() - .contains(textToFind) || - peer.hostname - .toLowerCase() - .contains(textToFind) || - peer.alias.toLowerCase().contains(textToFind)) - .toList(); - } - return _autocompleteOpts; - }, - focusNode: _idFocusNode, - textEditingController: _idEditingController, - fieldViewBuilder: ( - BuildContext context, - TextEditingController fieldTextEditingController, - FocusNode fieldFocusNode, - VoidCallback onFieldSubmitted, - ) { - updateTextAndPreserveSelection( - fieldTextEditingController, _idController.text); - return Obx(() => TextField( - autocorrect: false, - enableSuggestions: false, - keyboardType: TextInputType.visiblePassword, - focusNode: fieldFocusNode, - style: const TextStyle( - fontFamily: 'WorkSans', - fontSize: 22, - height: 1.4, - ), - maxLines: 1, - cursorColor: - Theme.of(context).textTheme.titleLarge?.color, - decoration: InputDecoration( - filled: false, - counterText: '', - hintText: _idInputFocused.value - ? null - : translate('Enter Remote ID'), - contentPadding: const EdgeInsets.symmetric( - horizontal: 15, vertical: 13)), - controller: fieldTextEditingController, - inputFormatters: [IDTextInputFormatter()], - onChanged: (v) { - _idController.id = v; - }, - onSubmitted: (_) { - onConnect(); - }, - ).workaroundFreezeLinuxMint()); - }, - onSelected: (option) { - setState(() { - _idController.id = option.id; - FocusScope.of(context).unfocus(); - }); - }, - optionsViewBuilder: (BuildContext context, - AutocompleteOnSelected onSelected, - Iterable options) { - options = _autocompleteOpts; - double maxHeight = options.length * 50; - if (options.length == 1) { - maxHeight = 52; - } else if (options.length == 3) { - maxHeight = 146; - } else if (options.length == 4) { - maxHeight = 193; - } - maxHeight = maxHeight.clamp(0, 200); - - return Align( - alignment: Alignment.topLeft, - child: Container( - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.3), - blurRadius: 5, - spreadRadius: 1, - ), - ], - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(5), - child: Material( - elevation: 4, - child: ConstrainedBox( - constraints: BoxConstraints( - maxHeight: maxHeight, - maxWidth: 319, - ), - child: _allPeersLoader.peers.isEmpty && - !_allPeersLoader.isPeersLoaded - ? Container( - height: 80, - child: Center( - child: CircularProgressIndicator( - strokeWidth: 2, - ), - )) - : Padding( - padding: - const EdgeInsets.only(top: 5), - child: ListView( - children: options - .map((peer) => - AutocompletePeerTile( - onSelect: () => - onSelected(peer), - peer: peer)) - .toList(), - ), - ), - ), - ))), - ); - }, - )), - ], - ), - Padding( - padding: const EdgeInsets.only(top: 13.0), - child: Row(mainAxisAlignment: MainAxisAlignment.end, children: [ - SizedBox( - height: 28.0, - child: ElevatedButton( - onPressed: () { - onConnect(); - }, - child: Text(translate("Connect")), - ), - ), - const SizedBox(width: 8), - Container( - height: 28.0, - width: 28.0, - decoration: BoxDecoration( - border: Border.all(color: Theme.of(context).dividerColor), - borderRadius: BorderRadius.circular(8), - ), - child: Center( - child: StatefulBuilder( - builder: (context, setState) { - var offset = Offset(0, 0); - return Obx(() => InkWell( - child: _menuOpen.value - ? Transform.rotate( - angle: pi, - child: Icon(IconFont.more, size: 14), - ) - : Icon(IconFont.more, size: 14), - onTapDown: (e) { - offset = e.globalPosition; - }, - onTap: () async { - _menuOpen.value = true; - final x = offset.dx; - final y = offset.dy; - await mod_menu - .showMenu( - context: context, - position: RelativeRect.fromLTRB(x, y, x, y), - items: [ - ( - 'Transfer file', - () => onConnect(isFileTransfer: true) - ), - ( - 'View camera', - () => onConnect(isViewCamera: true) - ), - ( - '${translate('Terminal')} (beta)', - () => onConnect(isTerminal: true) - ), - ] - .map((e) => MenuEntryButton( - childBuilder: (TextStyle? style) => - Text( - translate(e.$1), - style: style, - ), - proc: () => e.$2(), - padding: EdgeInsets.symmetric( - horizontal: - kDesktopMenuPadding.left), - dismissOnClicked: true, - )) - .map((e) => e.build( - context, - const MenuConfig( - commonColor: CustomPopupMenuTheme - .commonColor, - height: - CustomPopupMenuTheme.height, - dividerHeight: - CustomPopupMenuTheme - .dividerHeight))) - .expand((i) => i) - .toList(), - elevation: 8, - ) - .then((_) { - _menuOpen.value = false; - }); - }, - )); - }, - ), - ), - ), - ]), - ), - ], - ), - ), - ); - return Container( - constraints: const BoxConstraints(maxWidth: 600), child: w); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_home_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_home_page.dart deleted file mode 100644 index 42ec100..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_home_page.dart +++ /dev/null @@ -1,1146 +0,0 @@ -import 'dart:async'; -import 'dart:io'; -import 'dart:convert'; - -import 'package:auto_size_text/auto_size_text.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/common/widgets/animated_rotation_widget.dart'; -import 'package:flutter_hbb/common/widgets/custom_password.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/desktop/pages/connection_page.dart'; -import 'package:flutter_hbb/desktop/pages/desktop_setting_page.dart'; -import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart'; -import 'package:flutter_hbb/desktop/widgets/update_progress.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:flutter_hbb/models/server_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:flutter_hbb/plugin/ui_manager.dart'; -import 'package:flutter_hbb/utils/multi_window_manager.dart'; -import 'package:flutter_hbb/utils/platform_channel.dart'; -import 'package:get/get.dart'; -import 'package:provider/provider.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:window_manager/window_manager.dart'; -import 'package:window_size/window_size.dart' as window_size; -import '../widgets/button.dart'; - -class DesktopHomePage extends StatefulWidget { - const DesktopHomePage({Key? key}) : super(key: key); - - @override - State createState() => _DesktopHomePageState(); -} - -const borderColor = Color(0xFF2F65BA); - -class _DesktopHomePageState extends State - with AutomaticKeepAliveClientMixin, WidgetsBindingObserver { - final _leftPaneScrollController = ScrollController(); - - @override - bool get wantKeepAlive => true; - var systemError = ''; - StreamSubscription? _uniLinksSubscription; - var svcStopped = false.obs; - var watchIsCanScreenRecording = false; - var watchIsProcessTrust = false; - var watchIsInputMonitoring = false; - var watchIsCanRecordAudio = false; - Timer? _updateTimer; - bool isCardClosed = false; - - final RxBool _editHover = false.obs; - final RxBool _block = false.obs; - - final GlobalKey _childKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - super.build(context); - final isIncomingOnly = bind.isIncomingOnly(); - return _buildBlock( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - buildLeftPane(context), - if (!isIncomingOnly) const VerticalDivider(width: 1), - if (!isIncomingOnly) Expanded(child: buildRightPane(context)), - ], - )); - } - - Widget _buildBlock({required Widget child}) { - return buildRemoteBlock( - block: _block, mask: true, use: canBeBlocked, child: child); - } - - Widget buildLeftPane(BuildContext context) { - final isIncomingOnly = bind.isIncomingOnly(); - final isOutgoingOnly = bind.isOutgoingOnly(); - final children = [ - if (!isOutgoingOnly) buildPresetPasswordWarning(), - if (bind.isCustomClient()) - Align( - alignment: Alignment.center, - child: loadPowered(context), - ), - Align( - alignment: Alignment.center, - child: loadLogo(), - ), - buildTip(context), - if (!isOutgoingOnly) buildIDBoard(context), - if (!isOutgoingOnly) buildPasswordBoard(context), - FutureBuilder( - future: Future.value( - Obx(() => buildHelpCards(stateGlobal.updateUrl.value))), - builder: (_, data) { - if (data.hasData) { - if (isIncomingOnly) { - if (isInHomePage()) { - Future.delayed(Duration(milliseconds: 300), () { - _updateWindowSize(); - }); - } - } - return data.data!; - } else { - return const Offstage(); - } - }, - ), - buildPluginEntry(), - ]; - if (isIncomingOnly) { - children.addAll([ - Divider(), - OnlineStatusWidget( - onSvcStatusChanged: () { - if (isInHomePage()) { - Future.delayed(Duration(milliseconds: 300), () { - _updateWindowSize(); - }); - } - }, - ).marginOnly(bottom: 6, right: 6) - ]); - } - final textColor = Theme.of(context).textTheme.titleLarge?.color; - return ChangeNotifierProvider.value( - value: gFFI.serverModel, - child: Container( - width: isIncomingOnly ? 280.0 : 200.0, - color: Theme.of(context).colorScheme.background, - child: Stack( - children: [ - Column( - children: [ - SingleChildScrollView( - controller: _leftPaneScrollController, - child: Column( - key: _childKey, - children: children, - ), - ), - Expanded(child: Container()) - ], - ), - if (isOutgoingOnly) - Positioned( - bottom: 6, - left: 12, - child: Align( - alignment: Alignment.centerLeft, - child: InkWell( - child: Obx( - () => Icon( - Icons.settings, - color: _editHover.value - ? textColor - : Colors.grey.withOpacity(0.5), - size: 22, - ), - ), - onTap: () => { - if (DesktopSettingPage.tabKeys.isNotEmpty) - { - DesktopSettingPage.switch2page( - DesktopSettingPage.tabKeys[0]) - } - }, - onHover: (value) => _editHover.value = value, - ), - ), - ) - ], - ), - ), - ); - } - - buildRightPane(BuildContext context) { - return Container( - color: Theme.of(context).scaffoldBackgroundColor, - child: ConnectionPage(), - ); - } - - buildIDBoard(BuildContext context) { - final model = gFFI.serverModel; - return Container( - margin: const EdgeInsets.only(left: 20, right: 11), - height: 57, - child: Row( - crossAxisAlignment: CrossAxisAlignment.baseline, - textBaseline: TextBaseline.alphabetic, - children: [ - Container( - width: 2, - decoration: const BoxDecoration(color: MyTheme.accent), - ).marginOnly(top: 5), - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 7), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - height: 25, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - translate("ID"), - style: TextStyle( - fontSize: 14, - color: Theme.of(context) - .textTheme - .titleLarge - ?.color - ?.withOpacity(0.5)), - ).marginOnly(top: 5), - buildPopupMenu(context) - ], - ), - ), - Flexible( - child: GestureDetector( - onDoubleTap: () { - Clipboard.setData( - ClipboardData(text: model.serverId.text)); - showToast(translate("Copied")); - }, - child: TextFormField( - controller: model.serverId, - readOnly: true, - decoration: InputDecoration( - border: InputBorder.none, - contentPadding: EdgeInsets.only(top: 10, bottom: 10), - ), - style: TextStyle( - fontSize: 22, - ), - ).workaroundFreezeLinuxMint(), - ), - ) - ], - ), - ), - ), - ], - ), - ); - } - - Widget buildPopupMenu(BuildContext context) { - final textColor = Theme.of(context).textTheme.titleLarge?.color; - RxBool hover = false.obs; - return InkWell( - onTap: DesktopTabPage.onAddSetting, - child: Tooltip( - message: translate('Settings'), - child: Obx( - () => CircleAvatar( - radius: 15, - backgroundColor: hover.value - ? Theme.of(context).scaffoldBackgroundColor - : Theme.of(context).colorScheme.background, - child: Icon( - Icons.more_vert_outlined, - size: 20, - color: hover.value ? textColor : textColor?.withOpacity(0.5), - ), - ), - ), - ), - onHover: (value) => hover.value = value, - ); - } - - buildPasswordBoard(BuildContext context) { - return ChangeNotifierProvider.value( - value: gFFI.serverModel, - child: Consumer( - builder: (context, model, child) { - return buildPasswordBoard2(context, model); - }, - )); - } - - buildPasswordBoard2(BuildContext context, ServerModel model) { - RxBool refreshHover = false.obs; - RxBool editHover = false.obs; - final textColor = Theme.of(context).textTheme.titleLarge?.color; - final showOneTime = model.approveMode != 'click' && - model.verificationMethod != kUsePermanentPassword; - return Container( - margin: EdgeInsets.only(left: 20.0, right: 16, top: 13, bottom: 13), - child: Row( - crossAxisAlignment: CrossAxisAlignment.baseline, - textBaseline: TextBaseline.alphabetic, - children: [ - Container( - width: 2, - height: 52, - decoration: BoxDecoration(color: MyTheme.accent), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 7), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AutoSizeText( - translate("One-time Password"), - style: TextStyle( - fontSize: 14, color: textColor?.withOpacity(0.5)), - maxLines: 1, - ), - Row( - children: [ - Expanded( - child: GestureDetector( - onDoubleTap: () { - if (showOneTime) { - Clipboard.setData( - ClipboardData(text: model.serverPasswd.text)); - showToast(translate("Copied")); - } - }, - child: TextFormField( - controller: model.serverPasswd, - readOnly: true, - decoration: InputDecoration( - border: InputBorder.none, - contentPadding: - EdgeInsets.only(top: 14, bottom: 10), - ), - style: TextStyle(fontSize: 15), - ).workaroundFreezeLinuxMint(), - ), - ), - if (showOneTime) - AnimatedRotationWidget( - onPressed: () => bind.mainUpdateTemporaryPassword(), - child: Tooltip( - message: translate('Refresh Password'), - child: Obx(() => RotatedBox( - quarterTurns: 2, - child: Icon( - Icons.refresh, - color: refreshHover.value - ? textColor - : Color(0xFFDDDDDD), - size: 22, - ))), - ), - onHover: (value) => refreshHover.value = value, - ).marginOnly(right: 8, top: 4), - if (!bind.isDisableSettings()) - InkWell( - child: Tooltip( - message: translate('Change Password'), - child: Obx( - () => Icon( - Icons.edit, - color: editHover.value - ? textColor - : Color(0xFFDDDDDD), - size: 22, - ).marginOnly(right: 8, top: 4), - ), - ), - onTap: () => DesktopSettingPage.switch2page( - SettingsTabKey.safety), - onHover: (value) => editHover.value = value, - ), - ], - ), - ], - ), - ), - ), - ], - ), - ); - } - - buildTip(BuildContext context) { - final isOutgoingOnly = bind.isOutgoingOnly(); - return Padding( - padding: - const EdgeInsets.only(left: 20.0, right: 16, top: 16.0, bottom: 5), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - children: [ - if (!isOutgoingOnly) - Align( - alignment: Alignment.centerLeft, - child: Text( - translate("Your Desktop"), - style: Theme.of(context).textTheme.titleLarge, - ), - ), - ], - ), - SizedBox( - height: 10.0, - ), - if (!isOutgoingOnly) - Text( - translate("desk_tip"), - overflow: TextOverflow.clip, - style: Theme.of(context).textTheme.bodySmall, - ), - if (isOutgoingOnly) - Text( - translate("outgoing_only_desk_tip"), - overflow: TextOverflow.clip, - style: Theme.of(context).textTheme.bodySmall, - ), - ], - ), - ); - } - - Widget buildHelpCards(String updateUrl) { - if (!bind.isCustomClient() && - updateUrl.isNotEmpty && - !isCardClosed && - bind.mainUriPrefixSync().contains('rustdesk')) { - final isToUpdate = (isWindows || isMacOS) && bind.mainIsInstalled(); - String btnText = isToUpdate ? 'Update' : 'Download'; - GestureTapCallback onPressed = () async { - final Uri url = Uri.parse('https://rustdesk.com/download'); - await launchUrl(url); - }; - if (isToUpdate) { - onPressed = () { - handleUpdate(updateUrl); - }; - } - return buildInstallCard( - "Status", - "${translate("new-version-of-{${bind.mainGetAppNameSync()}}-tip")} (${bind.mainGetNewVersion()}).", - btnText, - onPressed, - closeButton: true, - help: isToUpdate ? 'Changelog' : null, - link: isToUpdate - ? 'https://github.com/rustdesk/rustdesk/releases/tag/${bind.mainGetNewVersion()}' - : null); - } - if (systemError.isNotEmpty) { - return buildInstallCard("", systemError, "", () {}); - } - - if (isWindows && !bind.isDisableInstallation()) { - if (!bind.mainIsInstalled()) { - return buildInstallCard( - "", bind.isOutgoingOnly() ? "" : "install_tip", "Install", - () async { - await rustDeskWinManager.closeAllSubWindows(); - bind.mainGotoInstall(); - }); - } else if (bind.mainIsInstalledLowerVersion()) { - return buildInstallCard( - "Status", "Your installation is lower version.", "Click to upgrade", - () async { - await rustDeskWinManager.closeAllSubWindows(); - bind.mainUpdateMe(); - }); - } - } else if (isMacOS) { - final isOutgoingOnly = bind.isOutgoingOnly(); - if (!(isOutgoingOnly || bind.mainIsCanScreenRecording(prompt: false))) { - return buildInstallCard("Permissions", "config_screen", "Configure", - () async { - bind.mainIsCanScreenRecording(prompt: true); - watchIsCanScreenRecording = true; - }, help: 'Help', link: translate("doc_mac_permission")); - } else if (!isOutgoingOnly && !bind.mainIsProcessTrusted(prompt: false)) { - return buildInstallCard("Permissions", "config_acc", "Configure", - () async { - bind.mainIsProcessTrusted(prompt: true); - watchIsProcessTrust = true; - }, help: 'Help', link: translate("doc_mac_permission")); - } else if (!bind.mainIsCanInputMonitoring(prompt: false)) { - return buildInstallCard("Permissions", "config_input", "Configure", - () async { - bind.mainIsCanInputMonitoring(prompt: true); - watchIsInputMonitoring = true; - }, help: 'Help', link: translate("doc_mac_permission")); - } else if (!isOutgoingOnly && - !svcStopped.value && - bind.mainIsInstalled() && - !bind.mainIsInstalledDaemon(prompt: false)) { - return buildInstallCard("", "install_daemon_tip", "Install", () async { - bind.mainIsInstalledDaemon(prompt: true); - }); - } - //// Disable microphone configuration for macOS. We will request the permission when needed. - // else if ((await osxCanRecordAudio() != - // PermissionAuthorizeType.authorized)) { - // return buildInstallCard("Permissions", "config_microphone", "Configure", - // () async { - // osxRequestAudio(); - // watchIsCanRecordAudio = true; - // }); - // } - } else if (isLinux) { - if (bind.isOutgoingOnly()) { - return Container(); - } - final LinuxCards = []; - if (bind.isSelinuxEnforcing()) { - // Check is SELinux enforcing, but show user a tip of is SELinux enabled for simple. - final keyShowSelinuxHelpTip = "show-selinux-help-tip"; - if (bind.mainGetLocalOption(key: keyShowSelinuxHelpTip) != 'N') { - LinuxCards.add(buildInstallCard( - "Warning", - "selinux_tip", - "", - () async {}, - marginTop: LinuxCards.isEmpty ? 20.0 : 5.0, - help: 'Help', - link: - 'https://rustdesk.com/docs/en/client/linux/#permissions-issue', - closeButton: true, - closeOption: keyShowSelinuxHelpTip, - )); - } - } - if (bind.mainCurrentIsWayland()) { - LinuxCards.add(buildInstallCard( - "Warning", "wayland_experiment_tip", "", () async {}, - marginTop: LinuxCards.isEmpty ? 20.0 : 5.0, - help: 'Help', - link: 'https://rustdesk.com/docs/en/client/linux/#x11-required')); - } else if (bind.mainIsLoginWayland()) { - LinuxCards.add(buildInstallCard("Warning", - "Login screen using Wayland is not supported", "", () async {}, - marginTop: LinuxCards.isEmpty ? 20.0 : 5.0, - help: 'Help', - link: 'https://rustdesk.com/docs/en/client/linux/#login-screen')); - } - if (LinuxCards.isNotEmpty) { - return Column( - children: LinuxCards, - ); - } - } - if (bind.isIncomingOnly()) { - return Align( - alignment: Alignment.centerRight, - child: OutlinedButton( - onPressed: () { - SystemNavigator.pop(); // Close the application - // https://github.com/flutter/flutter/issues/66631 - if (isWindows) { - exit(0); - } - }, - child: Text(translate('Quit')), - ), - ).marginAll(14); - } - return Container(); - } - - Widget buildInstallCard(String title, String content, String btnText, - GestureTapCallback onPressed, - {double marginTop = 20.0, - String? help, - String? link, - bool? closeButton, - String? closeOption}) { - if (bind.mainGetBuildinOption(key: kOptionHideHelpCards) == 'Y' && - content != 'install_daemon_tip') { - return const SizedBox(); - } - void closeCard() async { - if (closeOption != null) { - await bind.mainSetLocalOption(key: closeOption, value: 'N'); - if (bind.mainGetLocalOption(key: closeOption) == 'N') { - setState(() { - isCardClosed = true; - }); - } - } else { - setState(() { - isCardClosed = true; - }); - } - } - - return Stack( - children: [ - Container( - margin: EdgeInsets.fromLTRB( - 0, marginTop, 0, bind.isIncomingOnly() ? marginTop : 0), - child: Container( - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.centerLeft, - end: Alignment.centerRight, - colors: [ - Color.fromARGB(255, 226, 66, 188), - Color.fromARGB(255, 244, 114, 124), - ], - )), - padding: EdgeInsets.all(20), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: (title.isNotEmpty - ? [ - Center( - child: Text( - translate(title), - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 15), - ).marginOnly(bottom: 6)), - ] - : []) + - [ - if (content.isNotEmpty) - Text( - translate(content), - style: TextStyle( - height: 1.5, - color: Colors.white, - fontWeight: FontWeight.normal, - fontSize: 13), - ).marginOnly(bottom: 20) - ] + - (btnText.isNotEmpty - ? [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FixedWidthButton( - width: 150, - padding: 8, - isOutline: true, - text: translate(btnText), - textColor: Colors.white, - borderColor: Colors.white, - textSize: 20, - radius: 10, - onTap: onPressed, - ) - ]) - ] - : []) + - (help != null - ? [ - Center( - child: InkWell( - onTap: () async => - await launchUrl(Uri.parse(link!)), - child: Text( - translate(help), - style: TextStyle( - decoration: - TextDecoration.underline, - color: Colors.white, - fontSize: 12), - )).marginOnly(top: 6)), - ] - : []))), - ), - if (closeButton != null && closeButton == true) - Positioned( - top: 18, - right: 0, - child: IconButton( - icon: Icon( - Icons.close, - color: Colors.white, - size: 20, - ), - onPressed: closeCard, - ), - ), - ], - ); - } - - @override - void initState() { - super.initState(); - _updateTimer = periodic_immediate(const Duration(seconds: 1), () async { - await gFFI.serverModel.fetchID(); - final error = await bind.mainGetError(); - if (systemError != error) { - systemError = error; - setState(() {}); - } - final v = await mainGetBoolOption(kOptionStopService); - if (v != svcStopped.value) { - svcStopped.value = v; - setState(() {}); - } - if (watchIsCanScreenRecording) { - if (bind.mainIsCanScreenRecording(prompt: false)) { - watchIsCanScreenRecording = false; - setState(() {}); - } - } - if (watchIsProcessTrust) { - if (bind.mainIsProcessTrusted(prompt: false)) { - watchIsProcessTrust = false; - setState(() {}); - } - } - if (watchIsInputMonitoring) { - if (bind.mainIsCanInputMonitoring(prompt: false)) { - watchIsInputMonitoring = false; - // Do not notify for now. - // Monitoring may not take effect until the process is restarted. - // rustDeskWinManager.call( - // WindowType.RemoteDesktop, kWindowDisableGrabKeyboard, ''); - setState(() {}); - } - } - if (watchIsCanRecordAudio) { - if (isMacOS) { - Future.microtask(() async { - if ((await osxCanRecordAudio() == - PermissionAuthorizeType.authorized)) { - watchIsCanRecordAudio = false; - setState(() {}); - } - }); - } else { - watchIsCanRecordAudio = false; - setState(() {}); - } - } - }); - Get.put(svcStopped, tag: 'stop-service'); - rustDeskWinManager.registerActiveWindowListener(onActiveWindowChanged); - - screenToMap(window_size.Screen screen) => { - 'frame': { - 'l': screen.frame.left, - 't': screen.frame.top, - 'r': screen.frame.right, - 'b': screen.frame.bottom, - }, - 'visibleFrame': { - 'l': screen.visibleFrame.left, - 't': screen.visibleFrame.top, - 'r': screen.visibleFrame.right, - 'b': screen.visibleFrame.bottom, - }, - 'scaleFactor': screen.scaleFactor, - }; - - bool isChattyMethod(String methodName) { - switch (methodName) { - case kWindowBumpMouse: return true; - } - - return false; - } - - rustDeskWinManager.setMethodHandler((call, fromWindowId) async { - if (!isChattyMethod(call.method)) { - debugPrint( - "[Main] call ${call.method} with args ${call.arguments} from window $fromWindowId"); - } - if (call.method == kWindowMainWindowOnTop) { - windowOnTop(null); - } else if (call.method == kWindowRefreshCurrentUser) { - gFFI.userModel.refreshCurrentUser(); - } else if (call.method == kWindowGetWindowInfo) { - final screen = (await window_size.getWindowInfo()).screen; - if (screen == null) { - return ''; - } else { - return jsonEncode(screenToMap(screen)); - } - } else if (call.method == kWindowGetScreenList) { - return jsonEncode( - (await window_size.getScreenList()).map(screenToMap).toList()); - } else if (call.method == kWindowActionRebuild) { - reloadCurrentWindow(); - } else if (call.method == kWindowEventShow) { - await rustDeskWinManager.registerActiveWindow(call.arguments["id"]); - } else if (call.method == kWindowEventHide) { - await rustDeskWinManager.unregisterActiveWindow(call.arguments['id']); - } else if (call.method == kWindowConnect) { - await connectMainDesktop( - call.arguments['id'], - isFileTransfer: call.arguments['isFileTransfer'], - isViewCamera: call.arguments['isViewCamera'], - isTerminal: call.arguments['isTerminal'], - isTcpTunneling: call.arguments['isTcpTunneling'], - isRDP: call.arguments['isRDP'], - password: call.arguments['password'], - forceRelay: call.arguments['forceRelay'], - connToken: call.arguments['connToken'], - ); - } else if (call.method == kWindowBumpMouse) { - return RdPlatformChannel.instance.bumpMouse( - dx: call.arguments['dx'], - dy: call.arguments['dy']); - } else if (call.method == kWindowEventMoveTabToNewWindow) { - final args = call.arguments.split(','); - int? windowId; - try { - windowId = int.parse(args[0]); - } catch (e) { - debugPrint("Failed to parse window id '${call.arguments}': $e"); - } - WindowType? windowType; - try { - windowType = WindowType.values.byName(args[3]); - } catch (e) { - debugPrint("Failed to parse window type '${call.arguments}': $e"); - } - if (windowId != null && windowType != null) { - await rustDeskWinManager.moveTabToNewWindow( - windowId, args[1], args[2], windowType); - } - } else if (call.method == kWindowEventOpenMonitorSession) { - final args = jsonDecode(call.arguments); - final windowId = args['window_id'] as int; - final peerId = args['peer_id'] as String; - final display = args['display'] as int; - final displayCount = args['display_count'] as int; - final windowType = args['window_type'] as int; - final screenRect = parseParamScreenRect(args); - await rustDeskWinManager.openMonitorSession( - windowId, peerId, display, displayCount, screenRect, windowType); - } else if (call.method == kWindowEventRemoteWindowCoords) { - final windowId = int.tryParse(call.arguments); - if (windowId != null) { - return jsonEncode( - await rustDeskWinManager.getOtherRemoteWindowCoords(windowId)); - } - } - }); - _uniLinksSubscription = listenUniLinks(); - - if (bind.isIncomingOnly()) { - WidgetsBinding.instance.addPostFrameCallback((_) { - _updateWindowSize(); - }); - } - WidgetsBinding.instance.addObserver(this); - } - - _updateWindowSize() { - RenderObject? renderObject = _childKey.currentContext?.findRenderObject(); - if (renderObject == null) { - return; - } - if (renderObject is RenderBox) { - final size = renderObject.size; - if (size != imcomingOnlyHomeSize) { - imcomingOnlyHomeSize = size; - windowManager.setSize(getIncomingOnlyHomeSize()); - } - } - } - - @override - void dispose() { - _uniLinksSubscription?.cancel(); - Get.delete(tag: 'stop-service'); - _updateTimer?.cancel(); - WidgetsBinding.instance.removeObserver(this); - super.dispose(); - } - - @override - void didChangeAppLifecycleState(AppLifecycleState state) { - super.didChangeAppLifecycleState(state); - if (state == AppLifecycleState.resumed) { - shouldBeBlocked(_block, canBeBlocked); - } - } - - Widget buildPluginEntry() { - final entries = PluginUiManager.instance.entries.entries; - return Offstage( - offstage: entries.isEmpty, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ...entries.map((entry) { - return entry.value; - }) - ], - ), - ); - } -} - -void setPasswordDialog({VoidCallback? notEmptyCallback}) async { - final p0 = TextEditingController(text: ""); - final p1 = TextEditingController(text: ""); - var errMsg0 = ""; - var errMsg1 = ""; - final localPasswordSet = - (await bind.mainGetCommon(key: "local-permanent-password-set")) == "true"; - final permanentPasswordSet = - (await bind.mainGetCommon(key: "permanent-password-set")) == "true"; - final presetPassword = permanentPasswordSet && !localPasswordSet; - var canSubmit = false; - final RxString rxPass = "".obs; - final rules = [ - DigitValidationRule(), - UppercaseValidationRule(), - LowercaseValidationRule(), - // SpecialCharacterValidationRule(), - MinCharactersValidationRule(8), - ]; - final maxLength = bind.mainMaxEncryptLen(); - final statusTip = localPasswordSet - ? translate('password-hidden-tip') - : (presetPassword ? translate('preset-password-in-use-tip') : ''); - final showStatusTipOnMobile = - statusTip.isNotEmpty && !isDesktop && !isWebDesktop; - - gFFI.dialogManager.show((setState, close, context) { - updateCanSubmit() { - canSubmit = p0.text.trim().isNotEmpty || p1.text.trim().isNotEmpty; - } - - submit() async { - if (!canSubmit) { - return; - } - setState(() { - errMsg0 = ""; - errMsg1 = ""; - }); - final pass = p0.text.trim(); - if (pass.isNotEmpty) { - final Iterable violations = rules.where((r) => !r.validate(pass)); - if (violations.isNotEmpty) { - setState(() { - errMsg0 = - '${translate('Prompt')}: ${violations.map((r) => r.name).join(', ')}'; - }); - return; - } - } - if (p1.text.trim() != pass) { - setState(() { - errMsg1 = - '${translate('Prompt')}: ${translate("The confirmation is not identical.")}'; - }); - return; - } - final ok = await bind.mainSetPermanentPasswordWithResult(password: pass); - if (!ok) { - setState(() { - errMsg0 = '${translate('Prompt')}: ${translate("Failed")}'; - }); - return; - } - if (pass.isNotEmpty) { - notEmptyCallback?.call(); - } - close(); - } - - return CustomAlertDialog( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.key, color: MyTheme.accent), - Text(translate("Set Password")).paddingOnly(left: 10), - ], - ), - content: ConstrainedBox( - constraints: const BoxConstraints(minWidth: 500), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: showStatusTipOnMobile ? 0.0 : 6.0, - ), - Row( - children: [ - Expanded( - child: TextField( - obscureText: true, - decoration: InputDecoration( - labelText: translate('Password'), - errorText: errMsg0.isNotEmpty ? errMsg0 : null), - controller: p0, - autofocus: true, - onChanged: (value) { - rxPass.value = value.trim(); - setState(() { - errMsg0 = ''; - updateCanSubmit(); - }); - }, - maxLength: maxLength, - ).workaroundFreezeLinuxMint(), - ), - ], - ), - Row( - children: [ - Expanded(child: PasswordStrengthIndicator(password: rxPass)), - ], - ).marginOnly(top: 2, bottom: showStatusTipOnMobile ? 2 : 8), - SizedBox( - height: showStatusTipOnMobile ? 0.0 : 8.0, - ), - Row( - children: [ - Expanded( - child: TextField( - obscureText: true, - decoration: InputDecoration( - labelText: translate('Confirmation'), - errorText: errMsg1.isNotEmpty ? errMsg1 : null), - controller: p1, - onChanged: (value) { - setState(() { - errMsg1 = ''; - updateCanSubmit(); - }); - }, - maxLength: maxLength, - ).workaroundFreezeLinuxMint(), - ), - ], - ), - if (statusTip.isNotEmpty) - Row( - children: [ - Icon(Icons.info, color: Colors.amber, size: 18) - .marginOnly(right: 6), - Expanded( - child: Text( - statusTip, - style: const TextStyle(fontSize: 13, height: 1.1), - )) - ], - ).marginOnly(top: 6, bottom: 2), - SizedBox( - height: showStatusTipOnMobile ? 0.0 : 8.0, - ), - Obx(() => Wrap( - runSpacing: showStatusTipOnMobile ? 2.0 : 8.0, - spacing: 4, - children: rules.map((e) { - var checked = e.validate(rxPass.value.trim()); - return Chip( - label: Text( - e.name, - style: TextStyle( - color: checked - ? const Color(0xFF0A9471) - : Color.fromARGB(255, 198, 86, 157)), - ), - backgroundColor: checked - ? const Color(0xFFD0F7ED) - : Color.fromARGB(255, 247, 205, 232)); - }).toList(), - )) - ], - ), - ), - actions: (() { - final cancelButton = dialogButton( - "Cancel", - icon: Icon(Icons.close_rounded), - onPressed: close, - isOutline: true, - ); - final removeButton = dialogButton( - "Remove", - icon: Icon(Icons.delete_outline_rounded), - onPressed: () async { - setState(() { - errMsg0 = ""; - errMsg1 = ""; - }); - final ok = - await bind.mainSetPermanentPasswordWithResult(password: ""); - if (!ok) { - setState(() { - errMsg0 = '${translate('Prompt')}: ${translate("Failed")}'; - }); - return; - } - close(); - }, - buttonStyle: ButtonStyle( - backgroundColor: MaterialStatePropertyAll(Colors.red)), - ); - final okButton = dialogButton( - "OK", - icon: Icon(Icons.done_rounded), - onPressed: canSubmit ? submit : null, - ); - if (!isDesktop && !isWebDesktop && localPasswordSet) { - return [ - Align( - alignment: Alignment.centerRight, - child: FittedBox( - fit: BoxFit.scaleDown, - alignment: Alignment.centerRight, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - cancelButton, - const SizedBox(width: 4), - removeButton, - const SizedBox(width: 4), - okButton, - ], - ), - ), - ), - ]; - } - return [ - cancelButton, - if (localPasswordSet) removeButton, - okButton, - ]; - })(), - onSubmit: canSubmit ? submit : null, - onCancel: close, - ); - }); -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_setting_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_setting_page.dart deleted file mode 100644 index d118b67..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_setting_page.dart +++ /dev/null @@ -1,3124 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; - -import 'package:file_picker/file_picker.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/common/widgets/audio_input.dart'; -import 'package:flutter_hbb/common/widgets/setting_widgets.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart'; -import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart'; -import 'package:flutter_hbb/desktop/widgets/remote_toolbar.dart'; -import 'package:flutter_hbb/mobile/widgets/dialog.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:flutter_hbb/models/printer_model.dart'; -import 'package:flutter_hbb/models/server_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:flutter_hbb/plugin/manager.dart'; -import 'package:flutter_hbb/plugin/widgets/desktop_settings.dart'; -import 'package:get/get.dart'; -import 'package:provider/provider.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - -import '../../common/widgets/dialog.dart'; -import '../../common/widgets/login.dart'; - -const double _kTabWidth = 200; -const double _kTabHeight = 42; -const double _kCardFixedWidth = 540; -const double _kCardLeftMargin = 15; -const double _kContentHMargin = 15; -const double _kContentHSubMargin = _kContentHMargin + 33; -const double _kCheckBoxLeftMargin = 10; -const double _kRadioLeftMargin = 10; -const double _kListViewBottomMargin = 15; -const double _kTitleFontSize = 20; -const double _kContentFontSize = 15; -const Color _accentColor = MyTheme.accent; -const String _kSettingPageControllerTag = 'settingPageController'; -const String _kSettingPageTabKeyTag = 'settingPageTabKey'; - -class _TabInfo { - late final SettingsTabKey key; - late final String label; - late final IconData unselected; - late final IconData selected; - _TabInfo(this.key, this.label, this.unselected, this.selected); -} - -enum SettingsTabKey { - general, - safety, - network, - display, - plugin, - account, - printer, - about, -} - -class DesktopSettingPage extends StatefulWidget { - final SettingsTabKey initialTabkey; - static final List tabKeys = [ - SettingsTabKey.general, - if (!isWeb && - !bind.isOutgoingOnly() && - !bind.isDisableSettings() && - bind.mainGetBuildinOption(key: kOptionHideSecuritySetting) != 'Y') - SettingsTabKey.safety, - if (!bind.isDisableSettings() && - bind.mainGetBuildinOption(key: kOptionHideNetworkSetting) != 'Y') - SettingsTabKey.network, - if (!bind.isIncomingOnly()) SettingsTabKey.display, - if (!isWeb && !bind.isIncomingOnly() && bind.pluginFeatureIsEnabled()) - SettingsTabKey.plugin, - if (!bind.isDisableAccount()) SettingsTabKey.account, - if (isWindows && - bind.mainGetBuildinOption(key: kOptionHideRemotePrinterSetting) != 'Y') - SettingsTabKey.printer, - SettingsTabKey.about, - ]; - - DesktopSettingPage({Key? key, required this.initialTabkey}) : super(key: key); - - @override - State createState() => - _DesktopSettingPageState(initialTabkey); - - static void switch2page(SettingsTabKey page) { - try { - int index = tabKeys.indexOf(page); - if (index == -1) { - return; - } - if (Get.isRegistered(tag: _kSettingPageControllerTag)) { - DesktopTabPage.onAddSetting(initialPage: page); - PageController controller = - Get.find(tag: _kSettingPageControllerTag); - Rx selected = - Get.find>(tag: _kSettingPageTabKeyTag); - selected.value = page; - controller.jumpToPage(index); - } else { - DesktopTabPage.onAddSetting(initialPage: page); - } - } catch (e) { - debugPrintStack(label: '$e'); - } - } -} - -class _DesktopSettingPageState extends State - with - TickerProviderStateMixin, - AutomaticKeepAliveClientMixin, - WidgetsBindingObserver { - late PageController controller; - late Rx selectedTab; - - @override - bool get wantKeepAlive => true; - - final RxBool _block = false.obs; - final RxBool _canBeBlocked = false.obs; - Timer? _videoConnTimer; - - _DesktopSettingPageState(SettingsTabKey initialTabkey) { - var initialIndex = DesktopSettingPage.tabKeys.indexOf(initialTabkey); - if (initialIndex == -1) { - initialIndex = 0; - } - selectedTab = DesktopSettingPage.tabKeys[initialIndex].obs; - Get.put>(selectedTab, tag: _kSettingPageTabKeyTag); - controller = PageController(initialPage: initialIndex); - Get.put(controller, tag: _kSettingPageControllerTag); - controller.addListener(() { - if (controller.page != null) { - int page = controller.page!.toInt(); - if (page < DesktopSettingPage.tabKeys.length) { - selectedTab.value = DesktopSettingPage.tabKeys[page]; - } - } - }); - } - - @override - void didChangeAppLifecycleState(AppLifecycleState state) { - super.didChangeAppLifecycleState(state); - if (state == AppLifecycleState.resumed) { - shouldBeBlocked(_block, canBeBlocked); - } - } - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addObserver(this); - _videoConnTimer = - periodic_immediate(Duration(milliseconds: 1000), () async { - if (!mounted) { - return; - } - _canBeBlocked.value = await canBeBlocked(); - }); - } - - @override - void dispose() { - super.dispose(); - Get.delete(tag: _kSettingPageControllerTag); - Get.delete(tag: _kSettingPageTabKeyTag); - WidgetsBinding.instance.removeObserver(this); - _videoConnTimer?.cancel(); - } - - List<_TabInfo> _settingTabs() { - final List<_TabInfo> settingTabs = <_TabInfo>[]; - for (final tab in DesktopSettingPage.tabKeys) { - switch (tab) { - case SettingsTabKey.general: - settingTabs.add(_TabInfo( - tab, 'General', Icons.settings_outlined, Icons.settings)); - break; - case SettingsTabKey.safety: - settingTabs.add(_TabInfo(tab, 'Security', - Icons.enhanced_encryption_outlined, Icons.enhanced_encryption)); - break; - case SettingsTabKey.network: - settingTabs - .add(_TabInfo(tab, 'Network', Icons.link_outlined, Icons.link)); - break; - case SettingsTabKey.display: - settingTabs.add(_TabInfo(tab, 'Display', - Icons.desktop_windows_outlined, Icons.desktop_windows)); - break; - case SettingsTabKey.plugin: - settingTabs.add(_TabInfo( - tab, 'Plugin', Icons.extension_outlined, Icons.extension)); - break; - case SettingsTabKey.account: - settingTabs.add( - _TabInfo(tab, 'Account', Icons.person_outline, Icons.person)); - break; - case SettingsTabKey.printer: - settingTabs - .add(_TabInfo(tab, 'Printer', Icons.print_outlined, Icons.print)); - break; - case SettingsTabKey.about: - settingTabs - .add(_TabInfo(tab, 'About', Icons.info_outline, Icons.info)); - break; - } - } - return settingTabs; - } - - List _children() { - final children = List.empty(growable: true); - for (final tab in DesktopSettingPage.tabKeys) { - switch (tab) { - case SettingsTabKey.general: - children.add(const _General()); - break; - case SettingsTabKey.safety: - children.add(const _Safety()); - break; - case SettingsTabKey.network: - children.add(const _Network()); - break; - case SettingsTabKey.display: - children.add(const _Display()); - break; - case SettingsTabKey.plugin: - children.add(const _Plugin()); - break; - case SettingsTabKey.account: - children.add(const _Account()); - break; - case SettingsTabKey.printer: - children.add(const _Printer()); - break; - case SettingsTabKey.about: - children.add(const _About()); - break; - } - } - return children; - } - - Widget _buildBlock({required List children}) { - // check both mouseMoveTime and videoConnCount - return Obx(() { - final videoConnBlock = - _canBeBlocked.value && stateGlobal.videoConnCount > 0; - return Stack(children: [ - buildRemoteBlock( - block: _block, - mask: false, - use: canBeBlocked, - child: preventMouseKeyBuilder( - child: Row(children: children), - block: videoConnBlock, - ), - ), - if (videoConnBlock) - Container( - color: Colors.black.withOpacity(0.5), - ) - ]); - }); - } - - @override - Widget build(BuildContext context) { - super.build(context); - return Scaffold( - backgroundColor: Theme.of(context).colorScheme.background, - body: _buildBlock( - children: [ - SizedBox( - width: _kTabWidth, - child: Column( - children: [ - _header(context), - Flexible(child: _listView(tabs: _settingTabs())), - ], - ), - ), - const VerticalDivider(width: 1), - Expanded( - child: Container( - color: Theme.of(context).scaffoldBackgroundColor, - child: PageView( - controller: controller, - physics: NeverScrollableScrollPhysics(), - children: _children(), - ), - ), - ) - ], - ), - ); - } - - Widget _header(BuildContext context) { - final settingsText = Text( - translate('Settings'), - textAlign: TextAlign.left, - style: const TextStyle( - color: _accentColor, - fontSize: _kTitleFontSize, - fontWeight: FontWeight.w400, - ), - ); - return Row( - children: [ - if (isWeb) - IconButton( - onPressed: () { - if (Navigator.canPop(context)) { - Navigator.pop(context); - } - }, - icon: Icon(Icons.arrow_back), - ).marginOnly(left: 5), - if (isWeb) - SizedBox( - height: 62, - child: Align( - alignment: Alignment.center, - child: settingsText, - ), - ).marginOnly(left: 20), - if (!isWeb) - SizedBox( - height: 62, - child: settingsText, - ).marginOnly(left: 20, top: 10), - const Spacer(), - ], - ); - } - - Widget _listView({required List<_TabInfo> tabs}) { - final scrollController = ScrollController(); - return ListView( - controller: scrollController, - children: tabs.map((tab) => _listItem(tab: tab)).toList(), - ); - } - - Widget _listItem({required _TabInfo tab}) { - return Obx(() { - bool selected = tab.key == selectedTab.value; - return SizedBox( - width: _kTabWidth, - height: _kTabHeight, - child: InkWell( - onTap: () { - if (selectedTab.value != tab.key) { - int index = DesktopSettingPage.tabKeys.indexOf(tab.key); - if (index == -1) { - return; - } - controller.jumpToPage(index); - } - selectedTab.value = tab.key; - }, - child: Row(children: [ - Container( - width: 4, - height: _kTabHeight * 0.7, - color: selected ? _accentColor : null, - ), - Icon( - selected ? tab.selected : tab.unselected, - color: selected ? _accentColor : null, - size: 20, - ).marginOnly(left: 13, right: 10), - Text( - translate(tab.label), - style: TextStyle( - color: selected ? _accentColor : null, - fontWeight: FontWeight.w400, - fontSize: _kContentFontSize), - ), - ]), - ), - ); - }); - } -} - -//#region pages - -class _General extends StatefulWidget { - const _General({Key? key}) : super(key: key); - - @override - State<_General> createState() => _GeneralState(); -} - -class _GeneralState extends State<_General> { - final RxBool serviceStop = - isWeb ? RxBool(false) : Get.find(tag: 'stop-service'); - RxBool serviceBtnEnabled = true.obs; - - @override - Widget build(BuildContext context) { - final scrollController = ScrollController(); - return ListView( - controller: scrollController, - children: [ - if (!isWeb) service(), - theme(), - _Card(title: 'Language', children: [language()]), - if (!isWeb) hwcodec(), - if (!isWeb) audio(context), - if (!isWeb) record(context), - if (!isWeb) WaylandCard(), - other() - ], - ).marginOnly(bottom: _kListViewBottomMargin); - } - - Widget theme() { - final current = MyTheme.getThemeModePreference().toShortString(); - onChanged(String value) async { - await MyTheme.changeDarkMode(MyTheme.themeModeFromString(value)); - setState(() {}); - } - - final isOptFixed = isOptionFixed(kCommConfKeyTheme); - return _Card(title: 'Theme', children: [ - _Radio(context, - value: 'light', - groupValue: current, - label: 'Light', - onChanged: isOptFixed ? null : onChanged), - _Radio(context, - value: 'dark', - groupValue: current, - label: 'Dark', - onChanged: isOptFixed ? null : onChanged), - _Radio(context, - value: 'system', - groupValue: current, - label: 'Follow System', - onChanged: isOptFixed ? null : onChanged), - ]); - } - - Widget service() { - if (bind.isOutgoingOnly()) { - return const Offstage(); - } - - final hideStopService = - bind.mainGetBuildinOption(key: kOptionHideStopService) == 'Y'; - - return Obx(() { - if (hideStopService && !serviceStop.value) { - return const Offstage(); - } - - return _Card(title: 'Service', children: [ - _Button(serviceStop.value ? 'Start' : 'Stop', () { - () async { - serviceBtnEnabled.value = false; - await start_service(serviceStop.value); - // enable the button after 1 second - Future.delayed(const Duration(seconds: 1), () { - serviceBtnEnabled.value = true; - }); - }(); - }, enabled: serviceBtnEnabled.value) - ]); - }); - } - - Widget other() { - final showAutoUpdate = isWindows && bind.mainIsInstalled(); - final children = [ - if (!isWeb && !bind.isIncomingOnly()) - _OptionCheckBox(context, 'Confirm before closing multiple tabs', - kOptionEnableConfirmClosingTabs, - isServer: false), - _OptionCheckBox(context, 'Adaptive bitrate', kOptionEnableAbr), - if (!isWeb) wallpaper(), - if (!isWeb && !bind.isIncomingOnly()) ...[ - _OptionCheckBox( - context, - 'Open connection in new tab', - kOptionOpenNewConnInTabs, - isServer: false, - ), - // though this is related to GUI, but opengl problem affects all users, so put in config rather than local - if (isLinux) - Tooltip( - message: translate('software_render_tip'), - child: _OptionCheckBox( - context, - "Always use software rendering", - kOptionAllowAlwaysSoftwareRender, - ), - ), - if (!isWeb) - Tooltip( - message: translate('texture_render_tip'), - child: _OptionCheckBox( - context, - "Use texture rendering", - kOptionTextureRender, - optGetter: bind.mainGetUseTextureRender, - optSetter: (k, v) async => - await bind.mainSetLocalOption(key: k, value: v ? 'Y' : 'N'), - ), - ), - if (isWindows) - Tooltip( - message: translate('d3d_render_tip'), - child: _OptionCheckBox( - context, - "Use D3D rendering", - kOptionD3DRender, - isServer: false, - ), - ), - if (!isWeb && !bind.isCustomClient()) - _OptionCheckBox( - context, - 'Check for software update on startup', - kOptionEnableCheckUpdate, - isServer: false, - ), - if (showAutoUpdate) - _OptionCheckBox( - context, - 'Auto update', - kOptionAllowAutoUpdate, - isServer: true, - ), - if (isWindows && !bind.isOutgoingOnly()) - _OptionCheckBox( - context, - 'Capture screen using DirectX', - kOptionDirectxCapture, - ), - if (!bind.isIncomingOnly()) ...[ - _OptionCheckBox( - context, - 'Enable UDP hole punching', - kOptionEnableUdpPunch, - isServer: false, - ), - _OptionCheckBox( - context, - 'Enable IPv6 P2P connection', - kOptionEnableIpv6Punch, - isServer: false, - ), - ], - ], - ]; - - // Add client-side wakelock option for desktop platforms - if (!bind.isIncomingOnly()) { - children.add(_OptionCheckBox( - context, - 'keep-awake-during-outgoing-sessions-label', - kOptionKeepAwakeDuringOutgoingSessions, - isServer: false, - )); - } - - if (!isWeb && bind.mainShowOption(key: kOptionAllowLinuxHeadless)) { - children.add(_OptionCheckBox( - context, 'Allow linux headless', kOptionAllowLinuxHeadless)); - } - if (!bind.isDisableAccount()) { - children.add(_OptionCheckBox( - context, - 'note-at-conn-end-tip', - kOptionAllowAskForNoteAtEndOfConnection, - isServer: false, - optSetter: (key, value) async { - if (value && !gFFI.userModel.isLogin) { - final res = await loginDialog(); - if (res != true) return; - } - await mainSetLocalBoolOption(key, value); - }, - )); - } - return _Card(title: 'Other', children: children); - } - - Widget wallpaper() { - if (bind.isOutgoingOnly()) { - return const Offstage(); - } - - return futureBuilder(future: () async { - final support = await bind.mainSupportRemoveWallpaper(); - return support; - }(), hasData: (data) { - if (data is bool && data == true) { - bool value = mainGetBoolOptionSync(kOptionAllowRemoveWallpaper); - return Row( - children: [ - Flexible( - child: _OptionCheckBox( - context, - 'Remove wallpaper during incoming sessions', - kOptionAllowRemoveWallpaper, - update: (bool v) { - setState(() {}); - }, - ), - ), - if (value) - _CountDownButton( - text: 'Test', - second: 5, - onPressed: () { - bind.mainTestWallpaper(second: 5); - }, - ) - ], - ); - } - - return Offstage(); - }); - } - - Widget hwcodec() { - final hwcodec = bind.mainHasHwcodec(); - final vram = bind.mainHasVram(); - return Offstage( - offstage: !(hwcodec || vram), - child: _Card(title: 'Hardware Codec', children: [ - _OptionCheckBox( - context, - 'Enable hardware codec', - kOptionEnableHwcodec, - update: (bool v) { - if (v) { - bind.mainCheckHwcodec(); - } - }, - ) - ]), - ); - } - - Widget audio(BuildContext context) { - if (bind.isOutgoingOnly()) { - return const Offstage(); - } - - builder(devices, currentDevice, setDevice) { - final child = ComboBox( - keys: devices, - values: devices, - initialKey: currentDevice, - onChanged: (key) async { - setDevice(key); - setState(() {}); - }, - ).marginOnly(left: _kContentHMargin); - return _Card(title: 'Audio Input Device', children: [child]); - } - - return AudioInput(builder: builder, isCm: false, isVoiceCall: false); - } - - Widget record(BuildContext context) { - final showRootDir = isWindows && bind.mainIsInstalled(); - return futureBuilder(future: () async { - String user_dir = bind.mainVideoSaveDirectory(root: false); - String root_dir = - showRootDir ? bind.mainVideoSaveDirectory(root: true) : ''; - bool user_dir_exists = await Directory(user_dir).exists(); - bool root_dir_exists = - showRootDir ? await Directory(root_dir).exists() : false; - return { - 'user_dir': user_dir, - 'root_dir': root_dir, - 'user_dir_exists': user_dir_exists, - 'root_dir_exists': root_dir_exists, - }; - }(), hasData: (data) { - Map map = data as Map; - String user_dir = map['user_dir']!; - String root_dir = map['root_dir']!; - bool root_dir_exists = map['root_dir_exists']!; - bool user_dir_exists = map['user_dir_exists']!; - return _Card(title: 'Recording', children: [ - if (!bind.isOutgoingOnly()) - _OptionCheckBox(context, 'Automatically record incoming sessions', - kOptionAllowAutoRecordIncoming), - if (!bind.isIncomingOnly()) - _OptionCheckBox(context, 'Automatically record outgoing sessions', - kOptionAllowAutoRecordOutgoing, - isServer: false), - if (showRootDir && !bind.isOutgoingOnly()) - Row( - children: [ - Text( - '${translate(bind.isIncomingOnly() ? "Directory" : "Incoming")}:'), - Expanded( - child: GestureDetector( - onTap: root_dir_exists - ? () => launchUrl(Uri.file(root_dir)) - : null, - child: Text( - root_dir, - softWrap: true, - style: root_dir_exists - ? const TextStyle( - decoration: TextDecoration.underline) - : null, - )).marginOnly(left: 10), - ), - ], - ).marginOnly(left: _kContentHMargin), - if (!(showRootDir && bind.isIncomingOnly())) - Row( - children: [ - Text( - '${translate((showRootDir && !bind.isOutgoingOnly()) ? "Outgoing" : "Directory")}:'), - Expanded( - child: GestureDetector( - onTap: user_dir_exists - ? () => launchUrl(Uri.file(user_dir)) - : null, - child: Text( - user_dir, - softWrap: true, - style: user_dir_exists - ? const TextStyle( - decoration: TextDecoration.underline) - : null, - )).marginOnly(left: 10), - ), - ElevatedButton( - onPressed: isOptionFixed(kOptionVideoSaveDirectory) - ? null - : () async { - String? initialDirectory; - if (await Directory.fromUri( - Uri.directory(user_dir)) - .exists()) { - initialDirectory = user_dir; - } - String? selectedDirectory = - await FilePicker.platform.getDirectoryPath( - initialDirectory: initialDirectory); - if (selectedDirectory != null) { - await bind.mainSetLocalOption( - key: kOptionVideoSaveDirectory, - value: selectedDirectory); - setState(() {}); - } - }, - child: Text(translate('Change'))) - .marginOnly(left: 5), - ], - ).marginOnly(left: _kContentHMargin), - ]); - }); - } - - Widget language() { - return futureBuilder(future: () async { - String langs = await bind.mainGetLangs(); - return {'langs': langs}; - }(), hasData: (res) { - Map data = res as Map; - List langsList = jsonDecode(data['langs']!); - Map langsMap = {for (var v in langsList) v[0]: v[1]}; - List keys = langsMap.keys.toList(); - List values = langsMap.values.toList(); - keys.insert(0, defaultOptionLang); - values.insert(0, translate('Default')); - String currentKey = bind.mainGetLocalOption(key: kCommConfKeyLang); - if (!keys.contains(currentKey)) { - currentKey = defaultOptionLang; - } - final isOptFixed = isOptionFixed(kCommConfKeyLang); - return ComboBox( - keys: keys, - values: values, - initialKey: currentKey, - onChanged: (key) async { - await bind.mainSetLocalOption(key: kCommConfKeyLang, value: key); - if (isWeb) reloadCurrentWindow(); - if (!isWeb) reloadAllWindows(); - if (!isWeb) bind.mainChangeLanguage(lang: key); - }, - enabled: !isOptFixed, - ).marginOnly(left: _kContentHMargin); - }); - } -} - -enum _AccessMode { - custom, - full, - view, -} - -class _Safety extends StatefulWidget { - const _Safety({Key? key}) : super(key: key); - - @override - State<_Safety> createState() => _SafetyState(); -} - -class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin { - @override - bool get wantKeepAlive => true; - bool locked = bind.mainIsInstalled(); - final scrollController = ScrollController(); - - @override - Widget build(BuildContext context) { - super.build(context); - return SingleChildScrollView( - controller: scrollController, - child: Column( - children: [ - _lock(locked, 'Unlock Security Settings', () { - locked = false; - setState(() => {}); - }), - preventMouseKeyBuilder( - block: locked, - child: Column(children: [ - permissions(context), - password(context), - _Card(title: '2FA', children: [tfa()]), - if (!isChangeIdDisabled()) - _Card(title: 'ID', children: [changeId()]), - more(context), - ]), - ), - ], - )).marginOnly(bottom: _kListViewBottomMargin); - } - - Widget tfa() { - bool enabled = !locked; - // Simple temp wrapper for PR check - tmpWrapper() { - RxBool has2fa = bind.mainHasValid2FaSync().obs; - RxBool hasBot = bind.mainHasValidBotSync().obs; - update() async { - has2fa.value = bind.mainHasValid2FaSync(); - setState(() {}); - } - - onChanged(bool? checked) async { - if (checked == false) { - CommonConfirmDialog( - gFFI.dialogManager, translate('cancel-2fa-confirm-tip'), () { - change2fa(callback: update); - }); - } else { - change2fa(callback: update); - } - } - - final tfa = GestureDetector( - child: InkWell( - child: Obx(() => Row( - children: [ - Checkbox( - value: has2fa.value, - onChanged: enabled ? onChanged : null) - .marginOnly(right: 5), - Expanded( - child: Text( - translate('enable-2fa-title'), - style: - TextStyle(color: disabledTextColor(context, enabled)), - )) - ], - )), - ), - onTap: () { - onChanged(!has2fa.value); - }, - ).marginOnly(left: _kCheckBoxLeftMargin); - if (!has2fa.value) { - return tfa; - } - updateBot() async { - hasBot.value = bind.mainHasValidBotSync(); - setState(() {}); - } - - onChangedBot(bool? checked) async { - if (checked == false) { - CommonConfirmDialog( - gFFI.dialogManager, translate('cancel-bot-confirm-tip'), () { - changeBot(callback: updateBot); - }); - } else { - changeBot(callback: updateBot); - } - } - - final bot = GestureDetector( - child: Tooltip( - waitDuration: Duration(milliseconds: 300), - message: translate("enable-bot-tip"), - child: InkWell( - child: Obx(() => Row( - children: [ - Checkbox( - value: hasBot.value, - onChanged: enabled ? onChangedBot : null) - .marginOnly(right: 5), - Expanded( - child: Text( - translate('Telegram bot'), - style: TextStyle( - color: disabledTextColor(context, enabled)), - )) - ], - ))), - ), - onTap: () { - onChangedBot(!hasBot.value); - }, - ).marginOnly(left: _kCheckBoxLeftMargin + 30); - - final trust = Row( - children: [ - Flexible( - child: Tooltip( - waitDuration: Duration(milliseconds: 300), - message: translate("enable-trusted-devices-tip"), - child: _OptionCheckBox(context, "Enable trusted devices", - kOptionEnableTrustedDevices, - enabled: !locked, update: (v) { - setState(() {}); - }), - ), - ), - if (mainGetBoolOptionSync(kOptionEnableTrustedDevices)) - ElevatedButton( - onPressed: locked - ? null - : () { - manageTrustedDeviceDialog(); - }, - child: Text(translate('Manage trusted devices'))) - ], - ).marginOnly(left: 30); - - return Column( - children: [tfa, bot, trust], - ); - } - - return tmpWrapper(); - } - - Widget changeId() { - return ChangeNotifierProvider.value( - value: gFFI.serverModel, - child: Consumer(builder: ((context, model, child) { - return _Button('Change ID', changeIdDialog, - enabled: !locked && model.connectStatus > 0); - }))); - } - - Widget permissions(context) { - bool enabled = !locked; - // Simple temp wrapper for PR check - tmpWrapper() { - String accessMode = bind.mainGetOptionSync(key: kOptionAccessMode); - _AccessMode mode; - if (accessMode == 'full') { - mode = _AccessMode.full; - } else if (accessMode == 'view') { - mode = _AccessMode.view; - } else { - mode = _AccessMode.custom; - } - String initialKey; - bool? fakeValue; - switch (mode) { - case _AccessMode.custom: - initialKey = ''; - fakeValue = null; - break; - case _AccessMode.full: - initialKey = 'full'; - fakeValue = true; - break; - case _AccessMode.view: - initialKey = 'view'; - fakeValue = false; - break; - } - - return _Card(title: 'Permissions', children: [ - ComboBox( - keys: [ - defaultOptionAccessMode, - 'full', - 'view', - ], - values: [ - translate('Custom'), - translate('Full Access'), - translate('Screen Share'), - ], - enabled: enabled && !isOptionFixed(kOptionAccessMode), - initialKey: initialKey, - onChanged: (mode) async { - await bind.mainSetOption(key: kOptionAccessMode, value: mode); - setState(() {}); - }).marginOnly(left: _kContentHMargin), - Column( - children: [ - _OptionCheckBox( - context, 'Enable keyboard/mouse', kOptionEnableKeyboard, - enabled: enabled, fakeValue: fakeValue), - if (isWindows) - _OptionCheckBox( - context, 'Enable remote printer', kOptionEnableRemotePrinter, - enabled: enabled, fakeValue: fakeValue), - _OptionCheckBox(context, 'Enable clipboard', kOptionEnableClipboard, - enabled: enabled, fakeValue: fakeValue), - _OptionCheckBox( - context, 'Enable file transfer', kOptionEnableFileTransfer, - enabled: enabled, fakeValue: fakeValue), - _OptionCheckBox(context, 'Enable audio', kOptionEnableAudio, - enabled: enabled, fakeValue: fakeValue), - _OptionCheckBox(context, 'Enable camera', kOptionEnableCamera, - enabled: enabled, fakeValue: fakeValue), - _OptionCheckBox(context, 'Enable terminal', kOptionEnableTerminal, - enabled: enabled, fakeValue: fakeValue), - _OptionCheckBox( - context, 'Enable TCP tunneling', kOptionEnableTunnel, - enabled: enabled, fakeValue: fakeValue), - _OptionCheckBox( - context, 'Enable remote restart', kOptionEnableRemoteRestart, - enabled: enabled, fakeValue: fakeValue), - _OptionCheckBox( - context, 'Enable recording session', kOptionEnableRecordSession, - enabled: enabled, fakeValue: fakeValue), - if (isWindows) - _OptionCheckBox(context, 'Enable blocking user input', - kOptionEnableBlockInput, - enabled: enabled, fakeValue: fakeValue), - _OptionCheckBox(context, 'Enable remote configuration modification', - kOptionAllowRemoteConfigModification, - enabled: enabled, fakeValue: fakeValue), - ], - ), - ]); - } - - return tmpWrapper(); - } - - Widget password(BuildContext context) { - return ChangeNotifierProvider.value( - value: gFFI.serverModel, - child: Consumer(builder: ((context, model, child) { - List passwordKeys = [ - kUseTemporaryPassword, - kUsePermanentPassword, - kUseBothPasswords, - ]; - List passwordValues = [ - translate('Use one-time password'), - translate('Use permanent password'), - translate('Use both passwords'), - ]; - bool tmpEnabled = model.verificationMethod != kUsePermanentPassword; - bool permEnabled = model.verificationMethod != kUseTemporaryPassword; - String currentValue = - passwordValues[passwordKeys.indexOf(model.verificationMethod)]; - List radios = passwordValues - .map((value) => _Radio( - context, - value: value, - groupValue: currentValue, - label: value, - onChanged: locked - ? null - : ((value) async { - callback() async { - await model.setVerificationMethod( - passwordKeys[passwordValues.indexOf(value)]); - await model.updatePasswordModel(); - } - - if (value == - passwordValues[passwordKeys - .indexOf(kUsePermanentPassword)] && - (await bind.mainGetCommon( - key: "permanent-password-set")) != - "true") { - if (isChangePermanentPasswordDisabled()) { - await callback(); - return; - } - setPasswordDialog(notEmptyCallback: callback); - } else { - await callback(); - } - }), - )) - .toList(); - - var onChanged = tmpEnabled && !locked - ? (value) { - if (value != null) { - () async { - await model.setTemporaryPasswordLength(value.toString()); - await model.updatePasswordModel(); - }(); - } - } - : null; - List lengthRadios = ['6', '8', '10'] - .map((value) => GestureDetector( - child: Row( - children: [ - Radio( - value: value, - groupValue: model.temporaryPasswordLength, - onChanged: onChanged), - Text( - value, - style: TextStyle( - color: disabledTextColor( - context, onChanged != null)), - ), - ], - ).paddingOnly(right: 10), - onTap: () => onChanged?.call(value), - )) - .toList(); - - final isOptFixedNumOTP = - isOptionFixed(kOptionAllowNumericOneTimePassword); - final isNumOPTChangable = !isOptFixedNumOTP && tmpEnabled && !locked; - final numericOneTimePassword = GestureDetector( - child: InkWell( - child: Row( - children: [ - Checkbox( - value: model.allowNumericOneTimePassword, - onChanged: isNumOPTChangable - ? (bool? v) { - model.switchAllowNumericOneTimePassword(); - } - : null) - .marginOnly(right: 5), - Expanded( - child: Text( - translate('Numeric one-time password'), - style: TextStyle( - color: disabledTextColor(context, isNumOPTChangable)), - )) - ], - )), - onTap: isNumOPTChangable - ? () => model.switchAllowNumericOneTimePassword() - : null, - ).marginOnly(left: _kContentHSubMargin - 5); - - final modeKeys = [ - 'password', - 'click', - defaultOptionApproveMode - ]; - final modeValues = [ - translate('Accept sessions via password'), - translate('Accept sessions via click'), - translate('Accept sessions via both'), - ]; - var modeInitialKey = model.approveMode; - if (!modeKeys.contains(modeInitialKey)) { - modeInitialKey = defaultOptionApproveMode; - } - final usePassword = model.approveMode != 'click'; - - final isApproveModeFixed = isOptionFixed(kOptionApproveMode); - return _Card(title: 'Password', children: [ - ComboBox( - enabled: !locked && !isApproveModeFixed, - keys: modeKeys, - values: modeValues, - initialKey: modeInitialKey, - onChanged: (key) => model.setApproveMode(key), - ).marginOnly(left: _kContentHMargin), - if (usePassword) radios[0], - if (usePassword) - _SubLabeledWidget( - context, - 'One-time password length', - Row( - children: [ - ...lengthRadios, - ], - ), - enabled: tmpEnabled && !locked), - if (usePassword) numericOneTimePassword, - if (usePassword) radios[1], - if (usePassword && !isChangePermanentPasswordDisabled()) - _SubButton('Set permanent password', setPasswordDialog, - permEnabled && !locked), - // if (usePassword) - // hide_cm(!locked).marginOnly(left: _kContentHSubMargin - 6), - if (usePassword) radios[2], - ]); - }))); - } - - Widget more(BuildContext context) { - bool enabled = !locked; - return _Card(title: 'Security', children: [ - shareRdp(context, enabled), - _OptionCheckBox(context, 'Deny LAN discovery', 'enable-lan-discovery', - reverse: true, enabled: enabled), - ...directIp(context), - whitelist(), - ...autoDisconnect(context), - _OptionCheckBox(context, 'keep-awake-during-incoming-sessions-label', - kOptionKeepAwakeDuringIncomingSessions, - reverse: false, enabled: enabled), - if (bind.mainIsInstalled()) - _OptionCheckBox(context, 'allow-only-conn-window-open-tip', - 'allow-only-conn-window-open', - reverse: false, enabled: enabled), - if (bind.mainIsInstalled() && !isUnlockPinDisabled()) unlockPin() - ]); - } - - shareRdp(BuildContext context, bool enabled) { - onChanged(bool b) async { - await bind.mainSetShareRdp(enable: b); - setState(() {}); - } - - bool value = bind.mainIsShareRdp(); - return Offstage( - offstage: !(isWindows && bind.mainIsInstalled()), - child: GestureDetector( - child: Row( - children: [ - Checkbox( - value: value, - onChanged: enabled ? (_) => onChanged(!value) : null) - .marginOnly(right: 5), - Expanded( - child: Text(translate('Enable RDP session sharing'), - style: - TextStyle(color: disabledTextColor(context, enabled))), - ) - ], - ).marginOnly(left: _kCheckBoxLeftMargin), - onTap: enabled ? () => onChanged(!value) : null), - ); - } - - List directIp(BuildContext context) { - TextEditingController controller = TextEditingController(); - update(bool v) => setState(() {}); - RxBool applyEnabled = false.obs; - return [ - _OptionCheckBox(context, 'Enable direct IP access', kOptionDirectServer, - update: update, enabled: !locked), - () { - // Simple temp wrapper for PR check - tmpWrapper() { - bool enabled = option2bool(kOptionDirectServer, - bind.mainGetOptionSync(key: kOptionDirectServer)); - if (!enabled) applyEnabled.value = false; - controller.text = - bind.mainGetOptionSync(key: kOptionDirectAccessPort); - final isOptFixed = isOptionFixed(kOptionDirectAccessPort); - return Offstage( - offstage: !enabled, - child: _SubLabeledWidget( - context, - 'Port', - Row(children: [ - SizedBox( - width: 95, - child: TextField( - controller: controller, - enabled: enabled && !locked && !isOptFixed, - onChanged: (_) => applyEnabled.value = true, - inputFormatters: [ - FilteringTextInputFormatter.allow(RegExp( - r'^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$')), - ], - decoration: const InputDecoration( - hintText: '21118', - contentPadding: - EdgeInsets.symmetric(vertical: 12, horizontal: 12), - ), - ).workaroundFreezeLinuxMint().marginOnly(right: 15), - ), - Obx(() => ElevatedButton( - onPressed: applyEnabled.value && - enabled && - !locked && - !isOptFixed - ? () async { - applyEnabled.value = false; - await bind.mainSetOption( - key: kOptionDirectAccessPort, - value: controller.text); - } - : null, - child: Text( - translate('Apply'), - ), - )) - ]), - enabled: enabled && !locked && !isOptFixed, - ), - ); - } - - return tmpWrapper(); - }(), - ]; - } - - Widget whitelist() { - bool enabled = !locked; - // Simple temp wrapper for PR check - tmpWrapper() { - RxBool hasWhitelist = whitelistNotEmpty().obs; - update() async { - hasWhitelist.value = whitelistNotEmpty(); - } - - onChanged(bool? checked) async { - changeWhiteList(callback: update); - } - - final isOptFixed = isOptionFixed(kOptionWhitelist); - return GestureDetector( - child: Tooltip( - message: translate('whitelist_tip'), - child: Obx(() => Row( - children: [ - Checkbox( - value: hasWhitelist.value, - onChanged: enabled && !isOptFixed ? onChanged : null) - .marginOnly(right: 5), - Offstage( - offstage: !hasWhitelist.value, - child: MouseRegion( - child: const Icon(Icons.warning_amber_rounded, - color: Color.fromARGB(255, 255, 204, 0)) - .marginOnly(right: 5), - cursor: SystemMouseCursors.click, - ), - ), - Expanded( - child: Text( - translate('Use IP Whitelisting'), - style: - TextStyle(color: disabledTextColor(context, enabled)), - )) - ], - )), - ), - onTap: enabled - ? () { - onChanged(!hasWhitelist.value); - } - : null, - ).marginOnly(left: _kCheckBoxLeftMargin); - } - - return tmpWrapper(); - } - - Widget hide_cm(bool enabled) { - return ChangeNotifierProvider.value( - value: gFFI.serverModel, - child: Consumer(builder: (context, model, child) { - final enableHideCm = model.approveMode == 'password' && - model.verificationMethod == kUsePermanentPassword; - onHideCmChanged(bool? b) { - if (b != null) { - bind.mainSetOption( - key: 'allow-hide-cm', value: bool2option('allow-hide-cm', b)); - } - } - - return Tooltip( - message: enableHideCm ? "" : translate('hide_cm_tip'), - child: GestureDetector( - onTap: - enableHideCm ? () => onHideCmChanged(!model.hideCm) : null, - child: Row( - children: [ - Checkbox( - value: model.hideCm, - onChanged: enabled && enableHideCm - ? onHideCmChanged - : null) - .marginOnly(right: 5), - Expanded( - child: Text( - translate('Hide connection management window'), - style: TextStyle( - color: disabledTextColor( - context, enabled && enableHideCm)), - ), - ), - ], - ), - )); - })); - } - - List autoDisconnect(BuildContext context) { - TextEditingController controller = TextEditingController(); - update(bool v) => setState(() {}); - RxBool applyEnabled = false.obs; - return [ - _OptionCheckBox( - context, 'auto_disconnect_option_tip', kOptionAllowAutoDisconnect, - update: update, enabled: !locked), - () { - bool enabled = option2bool(kOptionAllowAutoDisconnect, - bind.mainGetOptionSync(key: kOptionAllowAutoDisconnect)); - if (!enabled) applyEnabled.value = false; - controller.text = - bind.mainGetOptionSync(key: kOptionAutoDisconnectTimeout); - final isOptFixed = isOptionFixed(kOptionAutoDisconnectTimeout); - return Offstage( - offstage: !enabled, - child: _SubLabeledWidget( - context, - 'Timeout in minutes', - Row(children: [ - SizedBox( - width: 95, - child: TextField( - controller: controller, - enabled: enabled && !locked && !isOptFixed, - onChanged: (_) => applyEnabled.value = true, - inputFormatters: [ - FilteringTextInputFormatter.allow(RegExp( - r'^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$')), - ], - decoration: const InputDecoration( - hintText: '10', - contentPadding: - EdgeInsets.symmetric(vertical: 12, horizontal: 12), - ), - ).workaroundFreezeLinuxMint().marginOnly(right: 15), - ), - Obx(() => ElevatedButton( - onPressed: - applyEnabled.value && enabled && !locked && !isOptFixed - ? () async { - applyEnabled.value = false; - await bind.mainSetOption( - key: kOptionAutoDisconnectTimeout, - value: controller.text); - } - : null, - child: Text( - translate('Apply'), - ), - )) - ]), - enabled: enabled && !locked && !isOptFixed, - ), - ); - }(), - ]; - } - - Widget unlockPin() { - bool enabled = !locked; - RxString unlockPin = bind.mainGetUnlockPin().obs; - update() async { - unlockPin.value = bind.mainGetUnlockPin(); - } - - onChanged(bool? checked) async { - changeUnlockPinDialog(unlockPin.value, update); - } - - final isOptFixed = isOptionFixed(kOptionWhitelist); - return GestureDetector( - child: Obx(() => Row( - children: [ - Checkbox( - value: unlockPin.isNotEmpty, - onChanged: enabled && !isOptFixed ? onChanged : null) - .marginOnly(right: 5), - Expanded( - child: Text( - translate('Unlock with PIN'), - style: TextStyle(color: disabledTextColor(context, enabled)), - )) - ], - )), - onTap: enabled - ? () { - onChanged(!unlockPin.isNotEmpty); - } - : null, - ).marginOnly(left: _kCheckBoxLeftMargin); - } -} - -class _Network extends StatefulWidget { - const _Network({Key? key}) : super(key: key); - - @override - State<_Network> createState() => _NetworkState(); -} - -class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin { - @override - bool get wantKeepAlive => true; - bool locked = !isWeb && bind.mainIsInstalled(); - - final scrollController = ScrollController(); - - @override - Widget build(BuildContext context) { - super.build(context); - return ListView(controller: scrollController, children: [ - _lock(locked, 'Unlock Network Settings', () { - locked = false; - setState(() => {}); - }), - preventMouseKeyBuilder( - block: locked, - child: Column(children: [ - network(context), - ]), - ), - ]).marginOnly(bottom: _kListViewBottomMargin); - } - - Widget network(BuildContext context) { - final hideServer = - bind.mainGetBuildinOption(key: kOptionHideServerSetting) == 'Y'; - final hideProxy = - isWeb || bind.mainGetBuildinOption(key: kOptionHideProxySetting) == 'Y'; - final hideWebSocket = isWeb || - bind.mainGetBuildinOption(key: kOptionHideWebSocketSetting) == 'Y'; - - if (hideServer && hideProxy && hideWebSocket) { - return Offstage(); - } - - // Helper function to create network setting ListTiles - Widget listTile({ - required IconData icon, - required String title, - VoidCallback? onTap, - Widget? trailing, - bool showTooltip = false, - String tooltipMessage = '', - }) { - final titleWidget = showTooltip - ? Row( - children: [ - Tooltip( - waitDuration: Duration(milliseconds: 1000), - message: translate(tooltipMessage), - child: Row( - children: [ - Text( - translate(title), - style: TextStyle(fontSize: _kContentFontSize), - ), - SizedBox(width: 5), - Icon( - Icons.help_outline, - size: 14, - color: Theme.of(context) - .textTheme - .titleLarge - ?.color - ?.withOpacity(0.7), - ), - ], - ), - ), - ], - ) - : Text( - translate(title), - style: TextStyle(fontSize: _kContentFontSize), - ); - - return ListTile( - leading: Icon(icon, color: _accentColor), - title: titleWidget, - enabled: !locked, - onTap: onTap, - trailing: trailing, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - contentPadding: EdgeInsets.symmetric(horizontal: 16), - minLeadingWidth: 0, - horizontalTitleGap: 10, - ); - } - - Widget switchWidget(IconData icon, String title, String tooltipMessage, - String optionKey) => - listTile( - icon: icon, - title: title, - showTooltip: true, - tooltipMessage: tooltipMessage, - trailing: Switch( - value: mainGetBoolOptionSync(optionKey), - onChanged: locked || isOptionFixed(optionKey) - ? null - : (value) { - mainSetBoolOption(optionKey, value); - setState(() {}); - }, - ), - ); - - final outgoingOnly = bind.isOutgoingOnly(); - - final divider = const Divider(height: 1, indent: 16, endIndent: 16); - return _Card( - title: 'Network', - children: [ - Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (!hideServer) - listTile( - icon: Icons.dns_outlined, - title: 'ID/Relay Server', - onTap: () => showServerSettings(gFFI.dialogManager, setState), - ), - if (!hideProxy && !hideServer) divider, - if (!hideProxy) - listTile( - icon: Icons.network_ping_outlined, - title: 'Socks5/Http(s) Proxy', - onTap: changeSocks5Proxy, - ), - if (!hideWebSocket && (!hideServer || !hideProxy)) divider, - if (!hideWebSocket) - switchWidget( - Icons.web_asset_outlined, - 'Use WebSocket', - '${translate('websocket_tip')}\n\n${translate('server-oss-not-support-tip')}', - kOptionAllowWebSocket), - if (!isWeb) - futureBuilder( - future: bind.mainIsUsingPublicServer(), - hasData: (isUsingPublicServer) { - if (isUsingPublicServer) { - return Offstage(); - } else { - return Column( - children: [ - if (!hideServer || !hideProxy || !hideWebSocket) - divider, - switchWidget( - Icons.no_encryption_outlined, - 'Allow insecure TLS fallback', - 'allow-insecure-tls-fallback-tip', - kOptionAllowInsecureTLSFallback), - if (!outgoingOnly) divider, - if (!outgoingOnly) - listTile( - icon: Icons.lan_outlined, - title: 'Disable UDP', - showTooltip: true, - tooltipMessage: - '${translate('disable-udp-tip')}\n\n${translate('server-oss-not-support-tip')}', - trailing: Switch( - value: bind.mainGetOptionSync( - key: kOptionDisableUdp) == - 'Y', - onChanged: - locked || isOptionFixed(kOptionDisableUdp) - ? null - : (value) async { - await bind.mainSetOption( - key: kOptionDisableUdp, - value: value ? 'Y' : 'N'); - setState(() {}); - }, - ), - ), - ], - ); - } - }, - ), - ], - ), - ), - ], - ); - } -} - -class _Display extends StatefulWidget { - const _Display({Key? key}) : super(key: key); - - @override - State<_Display> createState() => _DisplayState(); -} - -class _DisplayState extends State<_Display> { - @override - Widget build(BuildContext context) { - final scrollController = ScrollController(); - return ListView(controller: scrollController, children: [ - viewStyle(context), - scrollStyle(context), - imageQuality(context), - codec(context), - if (isDesktop) trackpadSpeed(context), - if (!isWeb) privacyModeImpl(context), - other(context), - ]).marginOnly(bottom: _kListViewBottomMargin); - } - - Widget viewStyle(BuildContext context) { - final isOptFixed = isOptionFixed(kOptionViewStyle); - onChanged(String value) async { - await bind.mainSetUserDefaultOption(key: kOptionViewStyle, value: value); - setState(() {}); - } - - final groupValue = bind.mainGetUserDefaultOption(key: kOptionViewStyle); - return _Card(title: 'Default View Style', children: [ - _Radio(context, - value: kRemoteViewStyleOriginal, - groupValue: groupValue, - label: 'Scale original', - onChanged: isOptFixed ? null : onChanged), - _Radio(context, - value: kRemoteViewStyleAdaptive, - groupValue: groupValue, - label: 'Scale adaptive', - onChanged: isOptFixed ? null : onChanged), - ]); - } - - Widget scrollStyle(BuildContext context) { - final isOptFixed = isOptionFixed(kOptionScrollStyle); - onChanged(String value) async { - await bind.mainSetUserDefaultOption( - key: kOptionScrollStyle, value: value); - setState(() {}); - } - - final groupValue = bind.mainGetUserDefaultOption(key: kOptionScrollStyle); - - onEdgeScrollEdgeThicknessChanged(double value) async { - await bind.mainSetUserDefaultOption( - key: kOptionEdgeScrollEdgeThickness, value: value.round().toString()); - setState(() {}); - } - - return _Card(title: 'Default Scroll Style', children: [ - _Radio(context, - value: kRemoteScrollStyleAuto, - groupValue: groupValue, - label: 'ScrollAuto', - onChanged: isOptFixed ? null : onChanged), - _Radio(context, - value: kRemoteScrollStyleBar, - groupValue: groupValue, - label: 'Scrollbar', - onChanged: isOptFixed ? null : onChanged), - if (!isWeb) ...[ - _Radio(context, - value: kRemoteScrollStyleEdge, - groupValue: groupValue, - label: 'ScrollEdge', - onChanged: isOptFixed ? null : onChanged), - Offstage( - offstage: groupValue != kRemoteScrollStyleEdge, - child: EdgeThicknessControl( - value: double.tryParse(bind.mainGetUserDefaultOption( - key: kOptionEdgeScrollEdgeThickness)) ?? - 100.0, - onChanged: isOptionFixed(kOptionEdgeScrollEdgeThickness) - ? null - : onEdgeScrollEdgeThicknessChanged, - )), - ], - ]); - } - - Widget imageQuality(BuildContext context) { - onChanged(String value) async { - await bind.mainSetUserDefaultOption( - key: kOptionImageQuality, value: value); - setState(() {}); - } - - final isOptFixed = isOptionFixed(kOptionImageQuality); - final groupValue = bind.mainGetUserDefaultOption(key: kOptionImageQuality); - return _Card(title: 'Default Image Quality', children: [ - _Radio(context, - value: kRemoteImageQualityBest, - groupValue: groupValue, - label: 'Good image quality', - onChanged: isOptFixed ? null : onChanged), - _Radio(context, - value: kRemoteImageQualityBalanced, - groupValue: groupValue, - label: 'Balanced', - onChanged: isOptFixed ? null : onChanged), - _Radio(context, - value: kRemoteImageQualityLow, - groupValue: groupValue, - label: 'Optimize reaction time', - onChanged: isOptFixed ? null : onChanged), - _Radio(context, - value: kRemoteImageQualityCustom, - groupValue: groupValue, - label: 'Custom', - onChanged: isOptFixed ? null : onChanged), - Offstage( - offstage: groupValue != kRemoteImageQualityCustom, - child: customImageQualitySetting(), - ) - ]); - } - - Widget trackpadSpeed(BuildContext context) { - final initSpeed = - (int.tryParse(bind.mainGetUserDefaultOption(key: kKeyTrackpadSpeed)) ?? - kDefaultTrackpadSpeed); - final curSpeed = SimpleWrapper(initSpeed); - void onDebouncer(int v) { - bind.mainSetUserDefaultOption( - key: kKeyTrackpadSpeed, value: v.toString()); - // It's better to notify all sessions that the default speed is changed. - // But it may also be ok to take effect in the next connection. - } - - return _Card(title: 'Default trackpad speed', children: [ - TrackpadSpeedWidget( - value: curSpeed, - onDebouncer: onDebouncer, - ), - ]); - } - - Widget codec(BuildContext context) { - onChanged(String value) async { - await bind.mainSetUserDefaultOption( - key: kOptionCodecPreference, value: value); - setState(() {}); - } - - final groupValue = - bind.mainGetUserDefaultOption(key: kOptionCodecPreference); - var hwRadios = []; - final isOptFixed = isOptionFixed(kOptionCodecPreference); - try { - final Map codecsJson = jsonDecode(bind.mainSupportedHwdecodings()); - final h264 = codecsJson['h264'] ?? false; - final h265 = codecsJson['h265'] ?? false; - if (h264) { - hwRadios.add(_Radio(context, - value: 'h264', - groupValue: groupValue, - label: 'H264', - onChanged: isOptFixed ? null : onChanged)); - } - if (h265) { - hwRadios.add(_Radio(context, - value: 'h265', - groupValue: groupValue, - label: 'H265', - onChanged: isOptFixed ? null : onChanged)); - } - } catch (e) { - debugPrint("failed to parse supported hwdecodings, err=$e"); - } - return _Card(title: 'Default Codec', children: [ - _Radio(context, - value: 'auto', - groupValue: groupValue, - label: 'Auto', - onChanged: isOptFixed ? null : onChanged), - _Radio(context, - value: 'vp8', - groupValue: groupValue, - label: 'VP8', - onChanged: isOptFixed ? null : onChanged), - _Radio(context, - value: 'vp9', - groupValue: groupValue, - label: 'VP9', - onChanged: isOptFixed ? null : onChanged), - _Radio(context, - value: 'av1', - groupValue: groupValue, - label: 'AV1', - onChanged: isOptFixed ? null : onChanged), - ...hwRadios, - ]); - } - - Widget privacyModeImpl(BuildContext context) { - final supportedPrivacyModeImpls = bind.mainSupportedPrivacyModeImpls(); - late final List privacyModeImpls; - try { - privacyModeImpls = jsonDecode(supportedPrivacyModeImpls); - } catch (e) { - debugPrint('failed to parse supported privacy mode impls, err=$e'); - return Offstage(); - } - if (privacyModeImpls.length < 2) { - return Offstage(); - } - - final key = 'privacy-mode-impl-key'; - onChanged(String value) async { - await bind.mainSetOption(key: key, value: value); - setState(() {}); - } - - String groupValue = bind.mainGetOptionSync(key: key); - if (groupValue.isEmpty) { - groupValue = bind.mainDefaultPrivacyModeImpl(); - } - return _Card( - title: 'Privacy mode', - children: privacyModeImpls.map((impl) { - final d = impl as List; - return _Radio(context, - value: d[0] as String, - groupValue: groupValue, - label: d[1] as String, - onChanged: onChanged); - }).toList(), - ); - } - - Widget otherRow(String label, String key) { - final value = bind.mainGetUserDefaultOption(key: key) == 'Y'; - final isOptFixed = isOptionFixed(key); - onChanged(bool b) async { - await bind.mainSetUserDefaultOption( - key: key, - value: b - ? 'Y' - : (key == kOptionEnableFileCopyPaste ? 'N' : defaultOptionNo)); - setState(() {}); - } - - return GestureDetector( - child: Row( - children: [ - Checkbox( - value: value, - onChanged: isOptFixed ? null : (_) => onChanged(!value)) - .marginOnly(right: 5), - Expanded( - child: Text(translate(label)), - ) - ], - ).marginOnly(left: _kCheckBoxLeftMargin), - onTap: isOptFixed ? null : () => onChanged(!value)); - } - - Widget other(BuildContext context) { - final children = - otherDefaultSettings().map((e) => otherRow(e.$1, e.$2)).toList(); - return _Card(title: 'Other Default Options', children: children); - } -} - -class _Account extends StatefulWidget { - const _Account({Key? key}) : super(key: key); - - @override - State<_Account> createState() => _AccountState(); -} - -class _AccountState extends State<_Account> { - @override - Widget build(BuildContext context) { - final scrollController = ScrollController(); - return ListView( - controller: scrollController, - children: [ - _Card(title: 'Account', children: [accountAction(), useInfo()]), - ], - ).marginOnly(bottom: _kListViewBottomMargin); - } - - Widget accountAction() { - return Obx(() => _Button( - gFFI.userModel.userName.value.isEmpty - ? 'Login' - : '${translate('Logout')} (${gFFI.userModel.accountLabelWithHandle})', - () => { - gFFI.userModel.userName.value.isEmpty - ? loginDialog() - : logOutConfirmDialog() - })); - } - - Widget useInfo() { - return Obx(() => Offstage( - offstage: gFFI.userModel.userName.value.isEmpty, - child: Container( - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surfaceContainerHighest, - borderRadius: BorderRadius.circular(10), - ), - child: Builder(builder: (context) { - final avatarWidget = _buildUserAvatar(); - return Row( - children: [ - if (avatarWidget != null) avatarWidget, - const SizedBox(width: 12), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - gFFI.userModel.displayNameOrUserName, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - ), - ), - const SizedBox(height: 2), - SelectionArea( - child: Text( - '@${gFFI.userModel.userName.value}', - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 13, - color: - Theme.of(context).textTheme.bodySmall?.color, - ), - ), - ), - ], - ), - ), - ], - ); - }), - ), - )).marginOnly(left: 18, top: 16); - } - - Widget? _buildUserAvatar() { - // Resolve relative avatar path at display time - final avatar = - bind.mainResolveAvatarUrl(avatar: gFFI.userModel.avatar.value); - return buildAvatarWidget( - avatar: avatar, - size: 44, - ); - } -} - -class _Checkbox extends StatefulWidget { - final String label; - final bool Function() getValue; - final Future Function(bool) setValue; - - const _Checkbox( - {Key? key, - required this.label, - required this.getValue, - required this.setValue}) - : super(key: key); - - @override - State<_Checkbox> createState() => _CheckboxState(); -} - -class _CheckboxState extends State<_Checkbox> { - var value = false; - - @override - initState() { - super.initState(); - value = widget.getValue(); - } - - @override - Widget build(BuildContext context) { - onChanged(bool b) async { - await widget.setValue(b); - setState(() { - value = widget.getValue(); - }); - } - - return GestureDetector( - child: Row( - children: [ - Checkbox( - value: value, - onChanged: (_) => onChanged(!value), - ).marginOnly(right: 5), - Expanded( - child: Text(translate(widget.label)), - ) - ], - ).marginOnly(left: _kCheckBoxLeftMargin), - onTap: () => onChanged(!value), - ); - } -} - -class _Plugin extends StatefulWidget { - const _Plugin({Key? key}) : super(key: key); - - @override - State<_Plugin> createState() => _PluginState(); -} - -class _PluginState extends State<_Plugin> { - @override - Widget build(BuildContext context) { - bind.pluginListReload(); - final scrollController = ScrollController(); - return ChangeNotifierProvider.value( - value: pluginManager, - child: Consumer(builder: (context, model, child) { - return ListView( - controller: scrollController, - children: model.plugins.map((entry) => pluginCard(entry)).toList(), - ).marginOnly(bottom: _kListViewBottomMargin); - }), - ); - } - - Widget pluginCard(PluginInfo plugin) { - return ChangeNotifierProvider.value( - value: plugin, - child: Consumer( - builder: (context, model, child) => DesktopSettingsCard(plugin: model), - ), - ); - } - - Widget accountAction() { - return Obx(() => _Button( - gFFI.userModel.userName.value.isEmpty - ? 'Login' - : '${translate('Logout')} (${gFFI.userModel.accountLabelWithHandle})', - () => { - gFFI.userModel.userName.value.isEmpty - ? loginDialog() - : logOutConfirmDialog() - })); - } -} - -class _Printer extends StatefulWidget { - const _Printer({super.key}); - - @override - State<_Printer> createState() => __PrinterState(); -} - -class __PrinterState extends State<_Printer> { - @override - Widget build(BuildContext context) { - final scrollController = ScrollController(); - return ListView(controller: scrollController, children: [ - outgoing(context), - incoming(context), - ]).marginOnly(bottom: _kListViewBottomMargin); - } - - Widget outgoing(BuildContext context) { - final isSupportPrinterDriver = - bind.mainGetCommonSync(key: 'is-support-printer-driver') == 'true'; - - Widget tipOsNotSupported() { - return Align( - alignment: Alignment.topLeft, - child: Text(translate('printer-os-requirement-tip')), - ).marginOnly(left: _kCardLeftMargin); - } - - Widget tipClientNotInstalled() { - return Align( - alignment: Alignment.topLeft, - child: - Text(translate('printer-requires-installed-{$appName}-client-tip')), - ).marginOnly(left: _kCardLeftMargin); - } - - Widget tipPrinterNotInstalled() { - final failedMsg = ''.obs; - platformFFI.registerEventHandler( - 'install-printer-res', 'install-printer-res', (evt) async { - if (evt['success'] as bool) { - setState(() {}); - } else { - failedMsg.value = evt['msg'] as String; - } - }, replace: true); - return Column(children: [ - Obx( - () => failedMsg.value.isNotEmpty - ? Offstage() - : Align( - alignment: Alignment.topLeft, - child: Text(translate('printer-{$appName}-not-installed-tip')) - .marginOnly(bottom: 10.0), - ), - ), - Obx( - () => failedMsg.value.isEmpty - ? Offstage() - : Align( - alignment: Alignment.topLeft, - child: Text(failedMsg.value, - style: DefaultTextStyle.of(context) - .style - .copyWith(color: Colors.red)) - .marginOnly(bottom: 10.0)), - ), - _Button('Install {$appName} Printer', () { - failedMsg.value = ''; - bind.mainSetCommon(key: 'install-printer', value: ''); - }) - ]).marginOnly(left: _kCardLeftMargin, bottom: 2.0); - } - - Widget tipReady() { - return Align( - alignment: Alignment.topLeft, - child: Text(translate('printer-{$appName}-ready-tip')), - ).marginOnly(left: _kCardLeftMargin); - } - - final installed = bind.mainIsInstalled(); - // `is-printer-installed` may fail, but it's rare case. - // Add additional error message here if it's really needed. - final isPrinterInstalled = - bind.mainGetCommonSync(key: 'is-printer-installed') == 'true'; - - final List children = []; - if (!isSupportPrinterDriver) { - children.add(tipOsNotSupported()); - } else { - children.addAll([ - if (!installed) tipClientNotInstalled(), - if (installed && !isPrinterInstalled) tipPrinterNotInstalled(), - if (installed && isPrinterInstalled) tipReady() - ]); - } - return _Card(title: 'Outgoing Print Jobs', children: children); - } - - Widget incoming(BuildContext context) { - onRadioChanged(String value) async { - await bind.mainSetLocalOption( - key: kKeyPrinterIncomingJobAction, value: value); - setState(() {}); - } - - PrinterOptions printerOptions = PrinterOptions.load(); - return _Card(title: 'Incoming Print Jobs', children: [ - _Radio(context, - value: kValuePrinterIncomingJobDismiss, - groupValue: printerOptions.action, - label: 'Dismiss', - onChanged: onRadioChanged), - _Radio(context, - value: kValuePrinterIncomingJobDefault, - groupValue: printerOptions.action, - label: 'use-the-default-printer-tip', - onChanged: onRadioChanged), - _Radio(context, - value: kValuePrinterIncomingJobSelected, - groupValue: printerOptions.action, - label: 'use-the-selected-printer-tip', - onChanged: onRadioChanged), - if (printerOptions.printerNames.isNotEmpty) - ComboBox( - initialKey: printerOptions.printerName, - keys: printerOptions.printerNames, - values: printerOptions.printerNames, - enabled: printerOptions.action == kValuePrinterIncomingJobSelected, - onChanged: (value) async { - await bind.mainSetLocalOption( - key: kKeyPrinterSelected, value: value); - setState(() {}); - }, - ).marginOnly(left: 10), - _OptionCheckBox( - context, - 'auto-print-tip', - kKeyPrinterAllowAutoPrint, - isServer: false, - enabled: printerOptions.action != kValuePrinterIncomingJobDismiss, - ) - ]); - } -} - -class _About extends StatefulWidget { - const _About({Key? key}) : super(key: key); - - @override - State<_About> createState() => _AboutState(); -} - -class _AboutState extends State<_About> { - @override - Widget build(BuildContext context) { - return futureBuilder(future: () async { - final license = await bind.mainGetLicense(); - final version = await bind.mainGetVersion(); - final buildDate = await bind.mainGetBuildDate(); - final fingerprint = await bind.mainGetFingerprint(); - return { - 'license': license, - 'version': version, - 'buildDate': buildDate, - 'fingerprint': fingerprint - }; - }(), hasData: (data) { - final license = data['license'].toString(); - final version = data['version'].toString(); - final buildDate = data['buildDate'].toString(); - final fingerprint = data['fingerprint'].toString(); - const linkStyle = TextStyle(decoration: TextDecoration.underline); - final scrollController = ScrollController(); - return SingleChildScrollView( - controller: scrollController, - child: _Card(title: translate('About RustDesk'), children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox( - height: 8.0, - ), - SelectionArea( - child: Text('${translate('Version')}: $version') - .marginSymmetric(vertical: 4.0)), - SelectionArea( - child: Text('${translate('Build Date')}: $buildDate') - .marginSymmetric(vertical: 4.0)), - if (!isWeb) - SelectionArea( - child: Text('${translate('Fingerprint')}: $fingerprint') - .marginSymmetric(vertical: 4.0)), - InkWell( - onTap: () { - launchUrlString('https://rustdesk.com/privacy.html'); - }, - child: Text( - translate('Privacy Statement'), - style: linkStyle, - ).marginSymmetric(vertical: 4.0)), - InkWell( - onTap: () { - launchUrlString('https://rustdesk.com'); - }, - child: Text( - translate('Website'), - style: linkStyle, - ).marginSymmetric(vertical: 4.0)), - Container( - decoration: const BoxDecoration(color: Color(0xFF2c8cff)), - padding: - const EdgeInsets.symmetric(vertical: 24, horizontal: 8), - child: SelectionArea( - child: Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Copyright © ${DateTime.now().toString().substring(0, 4)} Purslane Ltd.\n$license', - style: const TextStyle(color: Colors.white), - ), - Text( - translate('Slogan_tip'), - style: TextStyle( - fontWeight: FontWeight.w800, - color: Colors.white), - ) - ], - ), - ), - ], - )), - ).marginSymmetric(vertical: 4.0) - ], - ).marginOnly(left: _kContentHMargin) - ]), - ); - }); - } -} - -//#endregion - -//#region components - -// ignore: non_constant_identifier_names -Widget _Card( - {required String title, - required List children, - List? title_suffix}) { - return Row( - children: [ - Flexible( - child: SizedBox( - width: _kCardFixedWidth, - child: Card( - child: Column( - children: [ - Row( - children: [ - Expanded( - child: Text( - translate(title), - textAlign: TextAlign.start, - style: const TextStyle( - fontSize: _kTitleFontSize, - ), - )), - ...?title_suffix - ], - ).marginOnly(left: _kContentHMargin, top: 10, bottom: 10), - ...children - .map((e) => e.marginOnly(top: 4, right: _kContentHMargin)), - ], - ).marginOnly(bottom: 10), - ).marginOnly(left: _kCardLeftMargin, top: 15), - ), - ), - ], - ); -} - -// ignore: non_constant_identifier_names -Widget _OptionCheckBox( - BuildContext context, - String label, - String key, { - Function(bool)? update, - bool reverse = false, - bool enabled = true, - Icon? checkedIcon, - bool? fakeValue, - bool isServer = true, - bool Function()? optGetter, - Future Function(String, bool)? optSetter, -}) { - getOpt() => optGetter != null - ? optGetter() - : (isServer - ? mainGetBoolOptionSync(key) - : mainGetLocalBoolOptionSync(key)); - bool value = getOpt(); - final isOptFixed = isOptionFixed(key); - if (reverse) value = !value; - var ref = value.obs; - onChanged(option) async { - if (option != null) { - if (reverse) option = !option; - final setter = - optSetter ?? (isServer ? mainSetBoolOption : mainSetLocalBoolOption); - await setter(key, option); - final readOption = getOpt(); - if (reverse) { - ref.value = !readOption; - } else { - ref.value = readOption; - } - update?.call(readOption); - } - } - - if (fakeValue != null) { - ref.value = fakeValue; - enabled = false; - } - - return GestureDetector( - child: Obx( - () => Row( - children: [ - Checkbox( - value: ref.value, - onChanged: enabled && !isOptFixed ? onChanged : null) - .marginOnly(right: 5), - Offstage( - offstage: !ref.value || checkedIcon == null, - child: checkedIcon?.marginOnly(right: 5), - ), - Expanded( - child: Text( - translate(label), - style: TextStyle(color: disabledTextColor(context, enabled)), - )) - ], - ), - ).marginOnly(left: _kCheckBoxLeftMargin), - onTap: enabled && !isOptFixed - ? () { - onChanged(!ref.value); - } - : null, - ); -} - -// ignore: non_constant_identifier_names -Widget _Radio(BuildContext context, - {required T value, - required T groupValue, - required String label, - required Function(T value)? onChanged, - bool autoNewLine = true}) { - final onChange2 = onChanged != null - ? (T? value) { - if (value != null) { - onChanged(value); - } - } - : null; - return GestureDetector( - child: Row( - children: [ - Radio(value: value, groupValue: groupValue, onChanged: onChange2), - Expanded( - child: Text(translate(label), - overflow: autoNewLine ? null : TextOverflow.ellipsis, - style: TextStyle( - fontSize: _kContentFontSize, - color: disabledTextColor(context, onChange2 != null))) - .marginOnly(left: 5), - ), - ], - ).marginOnly(left: _kRadioLeftMargin), - onTap: () => onChange2?.call(value), - ); -} - -class WaylandCard extends StatefulWidget { - const WaylandCard({Key? key}) : super(key: key); - - @override - State createState() => _WaylandCardState(); -} - -class _WaylandCardState extends State { - final restoreTokenKey = 'wayland-restore-token'; - static const _kClearShortcutsInhibitorEventKey = - 'clear-gnome-shortcuts-inhibitor-permission-res'; - final _clearShortcutsInhibitorFailedMsg = ''.obs; - // Don't show the shortcuts permission reset button for now. - // Users can change it manually: - // "Settings" -> "Apps" -> "RustDesk" -> "Permissions" -> "Inhibit Shortcuts". - // For resetting(clearing) the permission from the portal permission store, you can - // use (replace with the RustDesk desktop file ID): - // busctl --user call org.freedesktop.impl.portal.PermissionStore \ - // /org/freedesktop/impl/portal/PermissionStore org.freedesktop.impl.portal.PermissionStore \ - // DeletePermission sss "gnome" "shortcuts-inhibitor" "" - // On a native install this is typically "rustdesk.desktop"; on Flatpak it is usually - // the exported desktop ID derived from the Flatpak app-id (e.g. "com.rustdesk.RustDesk.desktop"). - // - // We may add it back in the future if needed. - final showResetInhibitorPermission = false; - - @override - void initState() { - super.initState(); - if (showResetInhibitorPermission) { - platformFFI.registerEventHandler( - _kClearShortcutsInhibitorEventKey, _kClearShortcutsInhibitorEventKey, - (evt) async { - if (!mounted) return; - if (evt['success'] == true) { - setState(() {}); - } else { - _clearShortcutsInhibitorFailedMsg.value = - evt['msg'] as String? ?? 'Unknown error'; - } - }); - } - } - - @override - void dispose() { - if (showResetInhibitorPermission) { - platformFFI.unregisterEventHandler( - _kClearShortcutsInhibitorEventKey, _kClearShortcutsInhibitorEventKey); - } - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return futureBuilder( - future: bind.mainHandleWaylandScreencastRestoreToken( - key: restoreTokenKey, value: "get"), - hasData: (restoreToken) { - final hasShortcutsPermission = showResetInhibitorPermission && - bind.mainGetCommonSync( - key: "has-gnome-shortcuts-inhibitor-permission") == - "true"; - - final children = [ - if (restoreToken.isNotEmpty) - _buildClearScreenSelection(context, restoreToken), - if (hasShortcutsPermission) - _buildClearShortcutsInhibitorPermission(context), - ]; - return Offstage( - offstage: children.isEmpty, - child: _Card(title: 'Wayland', children: children), - ); - }, - ); - } - - Widget _buildClearScreenSelection(BuildContext context, String restoreToken) { - onConfirm() async { - final msg = await bind.mainHandleWaylandScreencastRestoreToken( - key: restoreTokenKey, value: "clear"); - gFFI.dialogManager.dismissAll(); - if (msg.isNotEmpty) { - msgBox(gFFI.sessionId, 'custom-nocancel', 'Error', msg, '', - gFFI.dialogManager); - } else { - setState(() {}); - } - } - - showConfirmMsgBox() => msgBoxCommon( - gFFI.dialogManager, - 'Confirmation', - Text( - translate('confirm_clear_Wayland_screen_selection_tip'), - ), - [ - dialogButton('OK', onPressed: onConfirm), - dialogButton('Cancel', - onPressed: () => gFFI.dialogManager.dismissAll()) - ]); - - return _Button( - 'Clear Wayland screen selection', - showConfirmMsgBox, - tip: 'clear_Wayland_screen_selection_tip', - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - Theme.of(context).colorScheme.error.withOpacity(0.75)), - ), - ); - } - - Widget _buildClearShortcutsInhibitorPermission(BuildContext context) { - onConfirm() { - _clearShortcutsInhibitorFailedMsg.value = ''; - bind.mainSetCommon( - key: "clear-gnome-shortcuts-inhibitor-permission", value: ""); - gFFI.dialogManager.dismissAll(); - } - - showConfirmMsgBox() => msgBoxCommon( - gFFI.dialogManager, - 'Confirmation', - Text( - translate('confirm-clear-shortcuts-inhibitor-permission-tip'), - ), - [ - dialogButton('OK', onPressed: onConfirm), - dialogButton('Cancel', - onPressed: () => gFFI.dialogManager.dismissAll()) - ]); - - return Column(children: [ - Obx( - () => _clearShortcutsInhibitorFailedMsg.value.isEmpty - ? Offstage() - : Align( - alignment: Alignment.topLeft, - child: Text(_clearShortcutsInhibitorFailedMsg.value, - style: DefaultTextStyle.of(context) - .style - .copyWith(color: Colors.red)) - .marginOnly(bottom: 10.0)), - ), - _Button( - 'Reset keyboard shortcuts permission', - showConfirmMsgBox, - tip: 'clear-shortcuts-inhibitor-permission-tip', - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - Theme.of(context).colorScheme.error.withOpacity(0.75)), - ), - ), - ]); - } -} - -// ignore: non_constant_identifier_names -Widget _Button(String label, Function() onPressed, - {bool enabled = true, String? tip, ButtonStyle? style}) { - var button = ElevatedButton( - onPressed: enabled ? onPressed : null, - child: Text( - translate(label), - ).marginSymmetric(horizontal: 15), - style: style, - ); - StatefulWidget child; - if (tip == null) { - child = button; - } else { - child = Tooltip(message: translate(tip), child: button); - } - return Row(children: [ - child, - ]).marginOnly(left: _kContentHMargin); -} - -// ignore: non_constant_identifier_names -Widget _SubButton(String label, Function() onPressed, [bool enabled = true]) { - return Row( - children: [ - ElevatedButton( - onPressed: enabled ? onPressed : null, - child: Text( - translate(label), - ).marginSymmetric(horizontal: 15), - ), - ], - ).marginOnly(left: _kContentHSubMargin); -} - -// ignore: non_constant_identifier_names -Widget _SubLabeledWidget(BuildContext context, String label, Widget child, - {bool enabled = true}) { - return Row( - children: [ - Text( - '${translate(label)}: ', - style: TextStyle(color: disabledTextColor(context, enabled)), - ), - SizedBox( - width: 10, - ), - child, - ], - ).marginOnly(left: _kContentHSubMargin); -} - -Widget _lock( - bool locked, - String label, - Function() onUnlock, -) { - return Offstage( - offstage: !locked, - child: Row( - children: [ - Flexible( - child: SizedBox( - width: _kCardFixedWidth, - child: Card( - child: ElevatedButton( - child: SizedBox( - height: 25, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Icon( - Icons.security_sharp, - size: 20, - ), - Text(translate(label)).marginOnly(left: 5), - ]).marginSymmetric(vertical: 2)), - onPressed: () async { - final unlockPin = bind.mainGetUnlockPin(); - if (unlockPin.isEmpty || isUnlockPinDisabled()) { - bool checked = await callMainCheckSuperUserPermission(); - if (checked) { - onUnlock(); - } - } else { - checkUnlockPinDialog(unlockPin, onUnlock); - } - }, - ).marginSymmetric(horizontal: 2, vertical: 4), - ).marginOnly(left: _kCardLeftMargin), - ).marginOnly(top: 10), - ), - ], - )); -} - -_LabeledTextField( - BuildContext context, - String label, - TextEditingController controller, - String errorText, - bool enabled, - bool secure) { - return Table( - columnWidths: const { - 0: FixedColumnWidth(150), - 1: FlexColumnWidth(), - }, - defaultVerticalAlignment: TableCellVerticalAlignment.middle, - children: [ - TableRow( - children: [ - Padding( - padding: const EdgeInsets.only(right: 10), - child: Text( - '${translate(label)}:', - textAlign: TextAlign.right, - style: TextStyle( - fontSize: 16, - color: disabledTextColor(context, enabled), - ), - ), - ), - TextField( - controller: controller, - enabled: enabled, - obscureText: secure, - autocorrect: false, - decoration: InputDecoration( - errorText: errorText.isNotEmpty ? errorText : null, - ), - style: TextStyle( - color: disabledTextColor(context, enabled), - ), - ).workaroundFreezeLinuxMint(), - ], - ), - ], - ).marginOnly(bottom: 8); -} - -class _CountDownButton extends StatefulWidget { - _CountDownButton({ - Key? key, - required this.text, - required this.second, - required this.onPressed, - }) : super(key: key); - final String text; - final VoidCallback? onPressed; - final int second; - - @override - State<_CountDownButton> createState() => _CountDownButtonState(); -} - -class _CountDownButtonState extends State<_CountDownButton> { - bool _isButtonDisabled = false; - - late int _countdownSeconds = widget.second; - - Timer? _timer; - - @override - void dispose() { - _timer?.cancel(); - super.dispose(); - } - - void _startCountdownTimer() { - _timer = Timer.periodic(Duration(seconds: 1), (timer) { - if (_countdownSeconds <= 0) { - setState(() { - _isButtonDisabled = false; - }); - timer.cancel(); - } else { - setState(() { - _countdownSeconds--; - }); - } - }); - } - - @override - Widget build(BuildContext context) { - return ElevatedButton( - onPressed: _isButtonDisabled - ? null - : () { - widget.onPressed?.call(); - setState(() { - _isButtonDisabled = true; - _countdownSeconds = widget.second; - }); - _startCountdownTimer(); - }, - child: Text( - _isButtonDisabled ? '$_countdownSeconds s' : translate(widget.text), - ), - ); - } -} - -//#endregion - -//#region dialogs - -void changeSocks5Proxy() async { - var socks = await bind.mainGetSocks(); - - String proxy = ''; - String proxyMsg = ''; - String username = ''; - String password = ''; - if (socks.length == 3) { - proxy = socks[0]; - username = socks[1]; - password = socks[2]; - } - var proxyController = TextEditingController(text: proxy); - var userController = TextEditingController(text: username); - var pwdController = TextEditingController(text: password); - RxBool obscure = true.obs; - - // proxy settings - // The following option is a not real key, it is just used for custom client advanced settings. - const String optionProxyUrl = "proxy-url"; - final isOptFixed = isOptionFixed(optionProxyUrl); - - var isInProgress = false; - gFFI.dialogManager.show((setState, close, context) { - submit() async { - setState(() { - proxyMsg = ''; - isInProgress = true; - }); - cancel() { - setState(() { - isInProgress = false; - }); - } - - proxy = proxyController.text.trim(); - username = userController.text.trim(); - password = pwdController.text.trim(); - - if (proxy.isNotEmpty) { - String domainPort = proxy; - if (domainPort.contains('://')) { - domainPort = domainPort.split('://')[1]; - } - proxyMsg = translate(await bind.mainTestIfValidServer( - server: domainPort, testWithProxy: false)); - if (proxyMsg.isEmpty) { - // ignore - } else { - cancel(); - return; - } - } - await bind.mainSetSocks( - proxy: proxy, username: username, password: password); - close(); - } - - return CustomAlertDialog( - title: Text(translate('Socks5/Http(s) Proxy')), - content: ConstrainedBox( - constraints: const BoxConstraints(minWidth: 500), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - if (!isMobile) - ConstrainedBox( - constraints: const BoxConstraints(minWidth: 140), - child: Align( - alignment: Alignment.centerRight, - child: Row( - children: [ - Text( - translate('Server'), - ).marginOnly(right: 4), - Tooltip( - waitDuration: Duration(milliseconds: 0), - message: translate("default_proxy_tip"), - child: Icon( - Icons.help_outline_outlined, - size: 16, - color: Theme.of(context) - .textTheme - .titleLarge - ?.color - ?.withOpacity(0.5), - ), - ), - ], - )).marginOnly(right: 10), - ), - Expanded( - child: TextField( - decoration: InputDecoration( - errorText: proxyMsg.isNotEmpty ? proxyMsg : null, - labelText: isMobile ? translate('Server') : null, - helperText: - isMobile ? translate("default_proxy_tip") : null, - helperMaxLines: isMobile ? 3 : null, - ), - controller: proxyController, - autofocus: true, - enabled: !isOptFixed, - ).workaroundFreezeLinuxMint(), - ), - ], - ).marginOnly(bottom: 8), - Row( - children: [ - if (!isMobile) - ConstrainedBox( - constraints: const BoxConstraints(minWidth: 140), - child: Text( - '${translate("Username")}:', - textAlign: TextAlign.right, - ).marginOnly(right: 10)), - Expanded( - child: TextField( - controller: userController, - decoration: InputDecoration( - labelText: isMobile ? translate('Username') : null, - ), - enabled: !isOptFixed, - ).workaroundFreezeLinuxMint(), - ), - ], - ).marginOnly(bottom: 8), - Row( - children: [ - if (!isMobile) - ConstrainedBox( - constraints: const BoxConstraints(minWidth: 140), - child: Text( - '${translate("Password")}:', - textAlign: TextAlign.right, - ).marginOnly(right: 10)), - Expanded( - child: Obx(() => TextField( - obscureText: obscure.value, - decoration: InputDecoration( - labelText: isMobile ? translate('Password') : null, - suffixIcon: IconButton( - onPressed: () => obscure.value = !obscure.value, - icon: Icon(obscure.value - ? Icons.visibility_off - : Icons.visibility))), - controller: pwdController, - enabled: !isOptFixed, - maxLength: bind.mainMaxEncryptLen(), - ).workaroundFreezeLinuxMint()), - ), - ], - ), - // NOT use Offstage to wrap LinearProgressIndicator - if (isInProgress) - const LinearProgressIndicator().marginOnly(top: 8), - ], - ), - ), - actions: [ - dialogButton('Cancel', onPressed: close, isOutline: true), - if (!isOptFixed) dialogButton('OK', onPressed: submit), - ], - onSubmit: submit, - onCancel: close, - ); - }); -} - -//#endregion diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_tab_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_tab_page.dart deleted file mode 100644 index 6440e55..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/desktop_tab_page.dart +++ /dev/null @@ -1,119 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart'; -import 'package:flutter_hbb/desktop/pages/desktop_setting_page.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:get/get.dart'; -import 'package:window_manager/window_manager.dart'; -// import 'package:flutter/services.dart'; - -import '../../common/shared_state.dart'; - -class DesktopTabPage extends StatefulWidget { - const DesktopTabPage({Key? key}) : super(key: key); - - @override - State createState() => _DesktopTabPageState(); - - static void onAddSetting( - {SettingsTabKey initialPage = SettingsTabKey.general}) { - try { - DesktopTabController tabController = Get.find(); - tabController.add(TabInfo( - key: kTabLabelSettingPage, - label: kTabLabelSettingPage, - selectedIcon: Icons.build_sharp, - unselectedIcon: Icons.build_outlined, - page: DesktopSettingPage( - key: const ValueKey(kTabLabelSettingPage), - initialTabkey: initialPage, - ))); - } catch (e) { - debugPrintStack(label: '$e'); - } - } -} - -class _DesktopTabPageState extends State { - final tabController = DesktopTabController(tabType: DesktopTabType.main); - - _DesktopTabPageState() { - RemoteCountState.init(); - Get.put(tabController); - tabController.add(TabInfo( - key: kTabLabelHomePage, - label: kTabLabelHomePage, - selectedIcon: Icons.home_sharp, - unselectedIcon: Icons.home_outlined, - closable: false, - page: DesktopHomePage( - key: const ValueKey(kTabLabelHomePage), - ))); - if (bind.isIncomingOnly()) { - tabController.onSelected = (key) { - if (key == kTabLabelHomePage) { - windowManager.setSize(getIncomingOnlyHomeSize()); - setResizable(false); - } else { - windowManager.setSize(getIncomingOnlySettingsSize()); - setResizable(true); - } - }; - } - } - - @override - void initState() { - super.initState(); - // HardwareKeyboard.instance.addHandler(_handleKeyEvent); - } - - /* - bool _handleKeyEvent(KeyEvent event) { - if (!mouseIn && event is KeyDownEvent) { - print('key down: ${event.logicalKey}'); - shouldBeBlocked(_block, canBeBlocked); - } - return false; // allow it to propagate - } - */ - - @override - void dispose() { - // HardwareKeyboard.instance.removeHandler(_handleKeyEvent); - Get.delete(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final tabWidget = Container( - child: Scaffold( - backgroundColor: Theme.of(context).colorScheme.background, - body: DesktopTab( - controller: tabController, - tail: Offstage( - offstage: bind.isIncomingOnly() || bind.isDisableSettings(), - child: ActionIcon( - message: 'Settings', - icon: IconFont.menu, - onTap: DesktopTabPage.onAddSetting, - isClose: false, - ), - ), - ))); - return isMacOS || kUseCompatibleUiMode - ? tabWidget - : Obx( - () => DragToResizeArea( - resizeEdgeSize: stateGlobal.resizeEdgeSize.value, - enableResizeEdges: windowManagerEnableResizeEdges, - child: tabWidget, - ), - ); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/file_manager_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/file_manager_page.dart deleted file mode 100644 index cf97351..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/file_manager_page.dart +++ /dev/null @@ -1,1694 +0,0 @@ -import 'dart:async'; -import 'dart:io'; -import 'dart:math'; - -import 'package:extended_text/extended_text.dart'; -import 'package:flutter_hbb/common/widgets/dialog.dart'; -import 'package:flutter_hbb/desktop/widgets/dragable_divider.dart'; -import 'package:percent_indicator/percent_indicator.dart'; -import 'package:desktop_drop/desktop_drop.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_breadcrumb/flutter_breadcrumb.dart'; -import 'package:flutter_hbb/desktop/widgets/list_search_action_listener.dart'; -import 'package:flutter_hbb/desktop/widgets/menu_button.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/models/file_model.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; -import 'package:flutter_hbb/web/dummy.dart' - if (dart.library.html) 'package:flutter_hbb/web/web_unique.dart'; - -import '../../consts.dart'; -import '../../desktop/widgets/material_mod_popup_menu.dart' as mod_menu; -import '../../common.dart'; -import '../../models/model.dart'; -import '../../models/platform_model.dart'; -import '../widgets/popup_menu.dart'; - -/// status of location bar -enum LocationStatus { - /// normal bread crumb bar - bread, - - /// show path text field - pathLocation, - - /// show file search bar text field - fileSearchBar -} - -/// The status of currently focused scope of the mouse -enum MouseFocusScope { - /// Mouse is in local field. - local, - - /// Mouse is in remote field. - remote, - - /// Mouse is not in local field, remote neither. - none -} - -class FileManagerPage extends StatefulWidget { - FileManagerPage( - {Key? key, - required this.id, - required this.password, - required this.isSharedPassword, - this.tabController, - this.connToken, - this.forceRelay}) - : super(key: key); - final String id; - final String? password; - final bool? isSharedPassword; - final bool? forceRelay; - final String? connToken; - final DesktopTabController? tabController; - final SimpleWrapper?> _lastState = SimpleWrapper(null); - - FFI get ffi => (_lastState.value! as _FileManagerPageState)._ffi; - - @override - State createState() { - final state = _FileManagerPageState(); - _lastState.value = state; - return state; - } -} - -class _FileManagerPageState extends State - with AutomaticKeepAliveClientMixin, WidgetsBindingObserver { - final _mouseFocusScope = Rx(MouseFocusScope.none); - - final _dropMaskVisible = false.obs; // TODO impl drop mask - final _overlayKeyState = OverlayKeyState(); - final _uniqueKey = UniqueKey(); - - late FFI _ffi; - - FileModel get model => _ffi.fileModel; - JobController get jobController => model.jobController; - - @override - void initState() { - super.initState(); - _ffi = FFI(null); - _ffi.start(widget.id, - isFileTransfer: true, - password: widget.password, - isSharedPassword: widget.isSharedPassword, - connToken: widget.connToken, - forceRelay: widget.forceRelay); - WidgetsBinding.instance.addPostFrameCallback((_) { - _ffi.dialogManager - .showLoading(translate('Connecting...'), onCancel: closeConnection); - }); - Get.put(_ffi, tag: 'ft_${widget.id}'); - WakelockManager.enable(_uniqueKey); - if (isWeb) { - _ffi.ffiModel.updateEventListener(_ffi.sessionId, widget.id); - } - debugPrint("File manager page init success with id ${widget.id}"); - _ffi.dialogManager.setOverlayState(_overlayKeyState); - // Call onSelected in post frame callback, since we cannot guarantee that the callback will not call setState. - WidgetsBinding.instance.addPostFrameCallback((_) { - widget.tabController?.onSelected?.call(widget.id); - }); - WidgetsBinding.instance.addObserver(this); - } - - @override - void dispose() { - model.close().whenComplete(() { - _ffi.close(); - _ffi.dialogManager.dismissAll(); - WakelockManager.disable(_uniqueKey); - Get.delete(tag: 'ft_${widget.id}'); - }); - WidgetsBinding.instance.removeObserver(this); - super.dispose(); - } - - @override - bool get wantKeepAlive => true; - - @override - void didChangeAppLifecycleState(AppLifecycleState state) { - super.didChangeAppLifecycleState(state); - if (state == AppLifecycleState.resumed) { - jobController.jobTable.refresh(); - } - } - - Widget willPopScope(Widget child) { - if (isWeb) { - return WillPopScope( - onWillPop: () async { - clientClose(_ffi.sessionId, _ffi); - return false; - }, - child: child, - ); - } else { - return child; - } - } - - @override - Widget build(BuildContext context) { - super.build(context); - return Overlay(key: _overlayKeyState.key, initialEntries: [ - OverlayEntry(builder: (_) { - return willPopScope(Scaffold( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - body: Row( - children: [ - if (!isWeb) - Flexible( - flex: 3, - child: dropArea(FileManagerView( - model.localController, _ffi, _mouseFocusScope))), - Flexible( - flex: 3, - child: dropArea(FileManagerView( - model.remoteController, _ffi, _mouseFocusScope))), - Flexible(flex: 2, child: statusList()) - ], - ), - )); - }) - ]); - } - - Widget dropArea(FileManagerView fileView) { - return DropTarget( - onDragDone: (detail) => - handleDragDone(detail, fileView.controller.isLocal), - onDragEntered: (enter) { - _dropMaskVisible.value = true; - }, - onDragExited: (exit) { - _dropMaskVisible.value = false; - }, - child: fileView); - } - - Widget generateCard(Widget child) { - return Container( - decoration: BoxDecoration( - color: Theme.of(context).cardColor, - borderRadius: BorderRadius.all( - Radius.circular(15.0), - ), - ), - child: child, - ); - } - - /// transfer status list - /// watch transfer status - Widget statusList() { - Widget getIcon(JobProgress job) { - final color = Theme.of(context).tabBarTheme.labelColor; - switch (job.type) { - case JobType.deleteDir: - case JobType.deleteFile: - return Icon(Icons.delete_outline, color: color); - default: - return Transform.rotate( - angle: isWeb - ? job.isRemoteToLocal - ? pi / 2 - : pi / 2 * 3 - : job.isRemoteToLocal - ? pi - : 0, - child: Icon(Icons.arrow_forward_ios, color: color), - ); - } - } - - statusListView(List jobs) => ListView.builder( - controller: ScrollController(), - itemBuilder: (BuildContext context, int index) { - final item = jobs[index]; - final status = item.getStatus(); - return Padding( - padding: const EdgeInsets.only(bottom: 5), - child: generateCard( - Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - getIcon(item) - .marginSymmetric(horizontal: 10, vertical: 12), - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Tooltip( - waitDuration: Duration(milliseconds: 500), - message: item.jobName, - child: ExtendedText( - item.jobName, - maxLines: 1, - overflow: TextOverflow.ellipsis, - overflowWidget: TextOverflowWidget( - child: Text("..."), - position: TextOverflowPosition.start), - ), - ), - Tooltip( - waitDuration: Duration(milliseconds: 500), - message: status, - child: Text(status, - style: TextStyle( - fontSize: 12, - color: MyTheme.darkGray, - )).marginOnly(top: 6), - ), - Offstage( - offstage: item.type != JobType.transfer || - item.state != JobState.inProgress, - child: LinearPercentIndicator( - animateFromLastPercent: true, - center: Text(item.percentText), - barRadius: Radius.circular(15), - percent: item.percent, - progressColor: MyTheme.accent, - backgroundColor: Theme.of(context).hoverColor, - lineHeight: kDesktopFileTransferRowHeight, - ).paddingSymmetric(vertical: 8), - ), - ], - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Offstage( - offstage: item.state != JobState.paused, - child: MenuButton( - tooltip: translate("Resume"), - onPressed: () { - jobController.resumeJob(item.id); - }, - child: SvgPicture.asset( - "assets/refresh.svg", - colorFilter: svgColor(Colors.white), - ), - color: MyTheme.accent, - hoverColor: MyTheme.accent80, - ), - ), - MenuButton( - tooltip: translate("Delete"), - child: SvgPicture.asset( - "assets/close.svg", - colorFilter: svgColor(Colors.white), - ), - onPressed: () { - jobController.jobTable.removeAt(index); - jobController.cancelJob(item.id); - }, - color: MyTheme.accent, - hoverColor: MyTheme.accent80, - ), - ], - ).marginAll(12), - ], - ), - ], - ), - ), - ); - }, - itemCount: jobController.jobTable.length, - ); - - return PreferredSize( - preferredSize: const Size(200, double.infinity), - child: Container( - margin: const EdgeInsets.only(top: 16.0, bottom: 16.0, right: 16.0), - padding: const EdgeInsets.all(8.0), - child: Obx( - () => jobController.jobTable.isEmpty - ? generateCard( - Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset( - "assets/transfer.svg", - colorFilter: svgColor( - Theme.of(context).tabBarTheme.labelColor), - height: 40, - ).paddingOnly(bottom: 10), - Text( - translate("No transfers in progress"), - textAlign: TextAlign.center, - textScaler: TextScaler.linear(1.20), - style: TextStyle( - color: - Theme.of(context).tabBarTheme.labelColor), - ), - ], - ), - ), - ) - : statusListView(jobController.jobTable), - )), - ); - } - - void handleDragDone(DropDoneDetails details, bool isLocal) { - if (isLocal) { - // ignore local - return; - } - final items = SelectedItems(isLocal: false); - for (var file in details.files) { - final f = File(file.path); - items.add(Entry() - ..path = file.path - ..name = file.name - ..size = FileSystemEntity.isDirectorySync(f.path) ? 0 : f.lengthSync()); - } - final otherSideData = model.localController.directoryData(); - model.remoteController.sendFiles(items, otherSideData); - } -} - -class FileManagerView extends StatefulWidget { - final FileController controller; - final FFI _ffi; - final Rx _mouseFocusScope; - - FileManagerView(this.controller, this._ffi, this._mouseFocusScope); - - @override - State createState() => _FileManagerViewState(); -} - -class _FileManagerViewState extends State { - final _locationStatus = LocationStatus.bread.obs; - final _locationNode = FocusNode(); - final _locationBarKey = GlobalKey(); - final _searchText = "".obs; - final _breadCrumbScroller = ScrollController(); - final _keyboardNode = FocusNode(); - final _listSearchBuffer = TimeoutStringBuffer(); - final _nameColWidth = 0.0.obs; - final _modifiedColWidth = 0.0.obs; - final _sizeColWidth = 0.0.obs; - final _fileListScrollController = ScrollController(); - final _globalHeaderKey = GlobalKey(); - - /// [_lastClickTime], [_lastClickEntry] help to handle double click - var _lastClickTime = - DateTime.now().millisecondsSinceEpoch - bind.getDoubleClickTime() - 1000; - Entry? _lastClickEntry; - - double? _windowWidthPrev; - double _fileTransferMinimumWidth = 0.0; - - FileController get controller => widget.controller; - bool get isLocal => widget.controller.isLocal; - FFI get _ffi => widget._ffi; - SelectedItems get selectedItems => controller.selectedItems; - - @override - void initState() { - super.initState(); - // register location listener - _locationNode.addListener(onLocationFocusChanged); - controller.directory.listen((e) => breadCrumbScrollToEnd()); - } - - @override - void dispose() { - _locationNode.removeListener(onLocationFocusChanged); - _locationNode.dispose(); - _keyboardNode.dispose(); - _breadCrumbScroller.dispose(); - _fileListScrollController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - _handleColumnPorportions(); - return Container( - margin: const EdgeInsets.all(16.0), - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - headTools(), - Expanded( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: MouseRegion( - onEnter: (evt) { - widget._mouseFocusScope.value = isLocal - ? MouseFocusScope.local - : MouseFocusScope.remote; - _keyboardNode.requestFocus(); - }, - onExit: (evt) => - widget._mouseFocusScope.value = MouseFocusScope.none, - child: _buildFileList(context, _fileListScrollController), - )) - ], - ), - ), - ], - ), - ); - } - - void _handleColumnPorportions() { - final windowWidthNow = MediaQuery.of(context).size.width; - if (_windowWidthPrev == null) { - _windowWidthPrev = windowWidthNow; - final defaultColumnWidth = windowWidthNow * 0.115; - _fileTransferMinimumWidth = defaultColumnWidth / 3; - _nameColWidth.value = defaultColumnWidth; - _modifiedColWidth.value = defaultColumnWidth; - _sizeColWidth.value = defaultColumnWidth; - } - - if (_windowWidthPrev != windowWidthNow) { - final difference = windowWidthNow / _windowWidthPrev!; - _windowWidthPrev = windowWidthNow; - _fileTransferMinimumWidth *= difference; - _nameColWidth.value *= difference; - _modifiedColWidth.value *= difference; - _sizeColWidth.value *= difference; - } - } - - void onLocationFocusChanged() { - debugPrint("focus changed on local"); - if (_locationNode.hasFocus) { - // ignore - } else { - // lost focus, change to bread - if (_locationStatus.value != LocationStatus.fileSearchBar) { - _locationStatus.value = LocationStatus.bread; - } - } - } - - Widget headTools() { - var uploadButtonTapPosition = RelativeRect.fill; - RxBool isUploadFolder = - (bind.mainGetLocalOption(key: 'upload-folder-button') == 'Y').obs; - return Container( - child: Column( - children: [ - // symbols - PreferredSize( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: 50, - height: 50, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(8)), - color: MyTheme.accent, - ), - padding: EdgeInsets.all(8.0), - child: FutureBuilder( - future: bind.sessionGetPlatform( - sessionId: _ffi.sessionId, - isRemote: !isLocal), - builder: (context, snapshot) { - if (snapshot.hasData && - snapshot.data!.isNotEmpty) { - return getPlatformImage('${snapshot.data}'); - } else { - return CircularProgressIndicator( - color: Theme.of(context) - .tabBarTheme - .labelColor, - ); - } - })), - Text(isLocal - ? translate("Local Computer") - : translate("Remote Computer")) - .marginOnly(left: 8.0) - ], - ), - preferredSize: Size(double.infinity, 70)) - .paddingOnly(bottom: 15), - // buttons - Row( - children: [ - Row( - children: [ - MenuButton( - tooltip: translate('Back'), - padding: EdgeInsets.only( - right: 3, - ), - child: RotatedBox( - quarterTurns: 2, - child: SvgPicture.asset( - "assets/arrow.svg", - colorFilter: - svgColor(Theme.of(context).tabBarTheme.labelColor), - ), - ), - color: Theme.of(context).cardColor, - hoverColor: Theme.of(context).hoverColor, - onPressed: () { - selectedItems.clear(); - controller.goBack(); - }, - ), - MenuButton( - tooltip: translate('Parent directory'), - child: RotatedBox( - quarterTurns: 3, - child: SvgPicture.asset( - "assets/arrow.svg", - colorFilter: - svgColor(Theme.of(context).tabBarTheme.labelColor), - ), - ), - color: Theme.of(context).cardColor, - hoverColor: Theme.of(context).hoverColor, - onPressed: () { - selectedItems.clear(); - controller.goToParentDirectory(); - }, - ), - ], - ), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 3.0), - child: Container( - decoration: BoxDecoration( - color: Theme.of(context).cardColor, - borderRadius: BorderRadius.all( - Radius.circular(8.0), - ), - ), - child: Padding( - padding: EdgeInsets.symmetric(vertical: 2.5), - child: GestureDetector( - onTap: () { - _locationStatus.value = - _locationStatus.value == LocationStatus.bread - ? LocationStatus.pathLocation - : LocationStatus.bread; - Future.delayed(Duration.zero, () { - if (_locationStatus.value == - LocationStatus.pathLocation) { - _locationNode.requestFocus(); - } - }); - }, - child: Obx( - () => Container( - child: Row( - children: [ - Expanded( - child: _locationStatus.value == - LocationStatus.bread - ? buildBread() - : buildPathLocation()), - ], - ), - ), - ), - ), - ), - ), - ), - ), - Obx(() { - switch (_locationStatus.value) { - case LocationStatus.bread: - return MenuButton( - tooltip: translate('Search'), - onPressed: () { - _locationStatus.value = LocationStatus.fileSearchBar; - Future.delayed( - Duration.zero, () => _locationNode.requestFocus()); - }, - child: SvgPicture.asset( - "assets/search.svg", - colorFilter: - svgColor(Theme.of(context).tabBarTheme.labelColor), - ), - color: Theme.of(context).cardColor, - hoverColor: Theme.of(context).hoverColor, - ); - case LocationStatus.pathLocation: - return MenuButton( - onPressed: null, - child: SvgPicture.asset( - "assets/close.svg", - colorFilter: - svgColor(Theme.of(context).tabBarTheme.labelColor), - ), - color: Theme.of(context).disabledColor, - hoverColor: Theme.of(context).hoverColor, - ); - case LocationStatus.fileSearchBar: - return MenuButton( - tooltip: translate('Clear'), - onPressed: () { - onSearchText("", isLocal); - _locationStatus.value = LocationStatus.bread; - }, - child: SvgPicture.asset( - "assets/close.svg", - colorFilter: - svgColor(Theme.of(context).tabBarTheme.labelColor), - ), - color: Theme.of(context).cardColor, - hoverColor: Theme.of(context).hoverColor, - ); - } - }), - MenuButton( - tooltip: translate('Refresh File'), - padding: EdgeInsets.only( - left: 3, - ), - onPressed: () { - controller.refresh(); - }, - child: SvgPicture.asset( - "assets/refresh.svg", - colorFilter: - svgColor(Theme.of(context).tabBarTheme.labelColor), - ), - color: Theme.of(context).cardColor, - hoverColor: Theme.of(context).hoverColor, - ), - ], - ), - Row( - textDirection: isLocal ? TextDirection.ltr : TextDirection.rtl, - children: [ - Expanded( - child: Row( - mainAxisAlignment: - isLocal ? MainAxisAlignment.start : MainAxisAlignment.end, - children: [ - MenuButton( - tooltip: translate('Home'), - padding: EdgeInsets.only( - right: 3, - ), - onPressed: () { - controller.goToHomeDirectory(); - }, - child: SvgPicture.asset( - "assets/home.svg", - colorFilter: - svgColor(Theme.of(context).tabBarTheme.labelColor), - ), - color: Theme.of(context).cardColor, - hoverColor: Theme.of(context).hoverColor, - ), - MenuButton( - tooltip: translate('Create Folder'), - onPressed: () { - final name = TextEditingController(); - String? errorText; - _ffi.dialogManager.show((setState, close, context) { - name.addListener(() { - if (errorText != null) { - setState(() { - errorText = null; - }); - } - }); - submit() { - if (name.value.text.isNotEmpty) { - if (!PathUtil.validName(name.value.text, - controller.options.value.isWindows)) { - setState(() { - errorText = translate("Invalid folder name"); - }); - return; - } - controller.createDir(PathUtil.join( - controller.directory.value.path, - name.value.text, - controller.options.value.isWindows, - )); - close(); - } - } - - cancel() => close(false); - return CustomAlertDialog( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset("assets/folder_new.svg", - colorFilter: svgColor(MyTheme.accent)), - Text( - translate("Create Folder"), - ).paddingOnly( - left: 10, - ), - ], - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextFormField( - decoration: InputDecoration( - labelText: translate( - "Please enter the folder name", - ), - errorText: errorText, - ), - controller: name, - autofocus: true, - ).workaroundFreezeLinuxMint(), - ], - ), - actions: [ - dialogButton( - "Cancel", - icon: Icon(Icons.close_rounded), - onPressed: cancel, - isOutline: true, - ), - dialogButton( - "Ok", - icon: Icon(Icons.done_rounded), - onPressed: submit, - ), - ], - onSubmit: submit, - onCancel: cancel, - ); - }); - }, - child: SvgPicture.asset( - "assets/folder_new.svg", - colorFilter: - svgColor(Theme.of(context).tabBarTheme.labelColor), - ), - color: Theme.of(context).cardColor, - hoverColor: Theme.of(context).hoverColor, - ), - Obx(() => MenuButton( - tooltip: translate('Delete'), - onPressed: SelectedItems.valid(selectedItems.items) - ? () async { - await (controller - .removeAction(selectedItems)); - selectedItems.clear(); - } - : null, - child: SvgPicture.asset( - "assets/trash.svg", - colorFilter: svgColor( - Theme.of(context).tabBarTheme.labelColor), - ), - color: Theme.of(context).cardColor, - hoverColor: Theme.of(context).hoverColor, - )), - menu(isLocal: isLocal), - ], - ), - ), - if (isWeb) - Obx(() => ElevatedButton.icon( - style: ButtonStyle( - padding: MaterialStateProperty.all( - isLocal - ? EdgeInsets.only(left: 10) - : EdgeInsets.only(right: 10)), - backgroundColor: MaterialStateProperty.all( - selectedItems.items.isEmpty - ? MyTheme.accent80 - : MyTheme.accent, - ), - ), - onPressed: () => - {webselectFiles(is_folder: isUploadFolder.value)}, - label: InkWell( - hoverColor: Colors.transparent, - splashColor: Colors.transparent, - highlightColor: Colors.transparent, - focusColor: Colors.transparent, - onTapDown: (e) { - final x = e.globalPosition.dx; - final y = e.globalPosition.dy; - uploadButtonTapPosition = - RelativeRect.fromLTRB(x, y, x, y); - }, - onTap: () async { - final value = await showMenu( - context: context, - position: uploadButtonTapPosition, - items: [ - PopupMenuItem( - value: false, - child: Text(translate('Upload files')), - ), - PopupMenuItem( - value: true, - child: Text(translate('Upload folder')), - ), - ]); - if (value != null) { - isUploadFolder.value = value; - bind.mainSetLocalOption( - key: 'upload-folder-button', - value: value ? 'Y' : ''); - webselectFiles(is_folder: value); - } - }, - child: Icon(Icons.arrow_drop_down), - ), - icon: Text( - translate(isUploadFolder.isTrue - ? 'Upload folder' - : 'Upload files'), - textAlign: TextAlign.right, - style: TextStyle( - color: Colors.white, - ), - ).marginOnly(left: 8), - )).marginOnly(left: 16), - Obx(() => ElevatedButton.icon( - style: ButtonStyle( - padding: MaterialStateProperty.all( - isLocal - ? EdgeInsets.only(left: 10) - : EdgeInsets.only(right: 10)), - backgroundColor: MaterialStateProperty.all( - selectedItems.items.isEmpty - ? MyTheme.accent80 - : MyTheme.accent, - ), - ), - onPressed: SelectedItems.valid(selectedItems.items) - ? () { - final otherSideData = - controller.getOtherSideDirectoryData(); - controller.sendFiles(selectedItems, otherSideData); - selectedItems.clear(); - } - : null, - icon: isLocal - ? Text( - translate('Send'), - textAlign: TextAlign.right, - style: TextStyle( - color: selectedItems.items.isEmpty - ? Theme.of(context).brightness == - Brightness.light - ? MyTheme.grayBg - : MyTheme.darkGray - : Colors.white, - ), - ) - : isWeb - ? Offstage() - : RotatedBox( - quarterTurns: 2, - child: SvgPicture.asset( - "assets/arrow.svg", - colorFilter: svgColor( - selectedItems.items.isEmpty - ? Theme.of(context).brightness == - Brightness.light - ? MyTheme.grayBg - : MyTheme.darkGray - : Colors.white), - alignment: Alignment.bottomRight, - ), - ), - label: isLocal - ? SvgPicture.asset( - "assets/arrow.svg", - colorFilter: svgColor(selectedItems.items.isEmpty - ? Theme.of(context).brightness == - Brightness.light - ? MyTheme.grayBg - : MyTheme.darkGray - : Colors.white), - ) - : Text( - translate(isWeb ? 'Download' : 'Receive'), - style: TextStyle( - color: selectedItems.items.isEmpty - ? Theme.of(context).brightness == - Brightness.light - ? MyTheme.grayBg - : MyTheme.darkGray - : Colors.white, - ), - ), - )), - ], - ).marginOnly(top: 8.0) - ], - ), - ); - } - - Widget menu({bool isLocal = false}) { - var menuPos = RelativeRect.fill; - - final List> items = [ - MenuEntrySwitch( - switchType: SwitchType.scheckbox, - text: translate("Show Hidden Files"), - getter: () async { - return controller.options.value.showHidden; - }, - setter: (bool v) async { - controller.toggleShowHidden(); - }, - padding: kDesktopMenuPadding, - dismissOnClicked: true, - ), - MenuEntryButton( - childBuilder: (style) => Text(translate("Select All"), style: style), - proc: () => setState(() => - selectedItems.selectAll(controller.directory.value.entries)), - padding: kDesktopMenuPadding, - dismissOnClicked: true), - MenuEntryButton( - childBuilder: (style) => - Text(translate("Unselect All"), style: style), - proc: () => selectedItems.clear(), - padding: kDesktopMenuPadding, - dismissOnClicked: true) - ]; - - return Listener( - onPointerDown: (e) { - final x = e.position.dx; - final y = e.position.dy; - menuPos = RelativeRect.fromLTRB(x, y, x, y); - }, - child: MenuButton( - tooltip: translate('More'), - onPressed: () => mod_menu.showMenu( - context: context, - position: menuPos, - items: items - .map( - (e) => e.build( - context, - MenuConfig( - commonColor: CustomPopupMenuTheme.commonColor, - height: CustomPopupMenuTheme.height, - dividerHeight: CustomPopupMenuTheme.dividerHeight), - ), - ) - .expand((i) => i) - .toList(), - elevation: 8, - ), - child: SvgPicture.asset( - "assets/dots.svg", - colorFilter: svgColor(Theme.of(context).tabBarTheme.labelColor), - ), - color: Theme.of(context).cardColor, - hoverColor: Theme.of(context).hoverColor, - ), - ); - } - - Widget _buildFileList( - BuildContext context, ScrollController scrollController) { - final fd = controller.directory.value; - final entries = fd.entries; - Rx rightClickEntry = Rx(null); - - return ListSearchActionListener( - node: _keyboardNode, - buffer: _listSearchBuffer, - onNext: (buffer) { - debugPrint("searching next for $buffer"); - assert(buffer.length == 1); - assert(selectedItems.items.length <= 1); - var skipCount = 0; - if (selectedItems.items.isNotEmpty) { - final index = entries.indexOf(selectedItems.items.first); - if (index < 0) { - return; - } - skipCount = index + 1; - } - var searchResult = entries - .skip(skipCount) - .where((element) => element.name.toLowerCase().startsWith(buffer)); - if (searchResult.isEmpty) { - // cannot find next, lets restart search from head - debugPrint("restart search from head"); - searchResult = entries.where( - (element) => element.name.toLowerCase().startsWith(buffer)); - } - if (searchResult.isEmpty) { - selectedItems.clear(); - return; - } - _jumpToEntry(isLocal, searchResult.first, scrollController, - kDesktopFileTransferRowHeight); - }, - onSearch: (buffer) { - debugPrint("searching for $buffer"); - final selectedEntries = selectedItems; - final searchResult = entries - .where((element) => element.name.toLowerCase().startsWith(buffer)); - selectedEntries.clear(); - if (searchResult.isEmpty) { - selectedItems.clear(); - return; - } - _jumpToEntry(isLocal, searchResult.first, scrollController, - kDesktopFileTransferRowHeight); - }, - child: Obx(() { - final entries = controller.directory.value.entries; - final filteredEntries = _searchText.isNotEmpty - ? entries.where((element) { - return element.name.contains(_searchText.value); - }).toList(growable: false) - : entries; - final rows = filteredEntries.map((entry) { - final sizeStr = - entry.isFile ? readableFileSize(entry.size.toDouble()) : ""; - final lastModifiedStr = entry.isDrive - ? " " - : "${entry.lastModified().toString().replaceAll(".000", "")} "; - var secondaryPosition = RelativeRect.fromLTRB(0, 0, 0, 0); - onTap() { - final items = selectedItems; - // handle double click - if (_checkDoubleClick(entry)) { - controller.openDirectory(entry.path); - items.clear(); - return; - } - _onSelectedChanged(items, filteredEntries, entry, isLocal); - } - - onSecondaryTap() { - final items = [ - if (!entry.isDrive && - versionCmp(_ffi.ffiModel.pi.version, "1.3.0") >= 0) - mod_menu.PopupMenuItem( - child: Text(translate("Rename")), - height: CustomPopupMenuTheme.height, - onTap: () { - controller.renameAction(entry, isLocal); - }, - ) - ]; - if (items.isNotEmpty) { - rightClickEntry.value = entry; - final future = mod_menu.showMenu( - context: context, - position: secondaryPosition, - items: items, - ); - future.then((value) { - rightClickEntry.value = null; - }); - future.onError((error, stackTrace) { - rightClickEntry.value = null; - }); - } - } - - onSecondaryTapDown(details) { - secondaryPosition = RelativeRect.fromLTRB( - details.globalPosition.dx, - details.globalPosition.dy, - details.globalPosition.dx, - details.globalPosition.dy); - } - - return Padding( - padding: EdgeInsets.symmetric(vertical: 1), - child: Obx(() => Container( - decoration: BoxDecoration( - color: selectedItems.items.contains(entry) - ? MyTheme.button - : Theme.of(context).cardColor, - borderRadius: BorderRadius.all( - Radius.circular(5.0), - ), - border: rightClickEntry.value == entry - ? Border.all( - color: MyTheme.button, - width: 1.0, - ) - : null, - ), - key: ValueKey(entry.name), - height: kDesktopFileTransferRowHeight, - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Expanded( - child: InkWell( - child: Row( - children: [ - GestureDetector( - child: Obx( - () => Container( - width: _nameColWidth.value, - child: Tooltip( - waitDuration: Duration(milliseconds: 500), - message: entry.name, - child: Row(children: [ - entry.isDrive - ? Image( - image: iconHardDrive, - fit: BoxFit.scaleDown, - color: Theme.of(context) - .iconTheme - .color - ?.withOpacity(0.7)) - .paddingAll(4) - : SvgPicture.asset( - entry.isFile - ? "assets/file.svg" - : "assets/folder.svg", - colorFilter: svgColor( - Theme.of(context) - .tabBarTheme - .labelColor), - ), - Expanded( - child: Text(entry.name.nonBreaking, - style: TextStyle( - color: selectedItems.items - .contains(entry) - ? Colors.white - : null), - overflow: - TextOverflow.ellipsis)) - ]), - )), - ), - onTap: onTap, - onSecondaryTap: onSecondaryTap, - onSecondaryTapDown: onSecondaryTapDown, - ), - SizedBox( - width: 2.0, - ), - GestureDetector( - child: Obx( - () => SizedBox( - width: _modifiedColWidth.value, - child: Tooltip( - waitDuration: Duration(milliseconds: 500), - message: lastModifiedStr, - child: Text( - lastModifiedStr, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 12, - color: selectedItems.items - .contains(entry) - ? Colors.white70 - : MyTheme.darkGray, - ), - )), - ), - ), - onTap: onTap, - onSecondaryTap: onSecondaryTap, - onSecondaryTapDown: onSecondaryTapDown, - ), - // Divider from header. - SizedBox( - width: 2.0, - ), - Expanded( - // width: 100, - child: GestureDetector( - child: Tooltip( - waitDuration: Duration(milliseconds: 500), - message: sizeStr, - child: Text( - sizeStr, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 10, - color: - selectedItems.items.contains(entry) - ? Colors.white70 - : MyTheme.darkGray), - ), - ), - onTap: onTap, - onSecondaryTap: onSecondaryTap, - onSecondaryTapDown: onSecondaryTapDown, - ), - ), - ], - ), - ), - ), - ], - ))), - ); - }).toList(growable: false); - - return Column( - children: [ - // Header - Row( - children: [ - Expanded(child: _buildFileBrowserHeader(context)), - ], - ), - // Body - Expanded( - child: ListView.builder( - controller: scrollController, - itemExtent: kDesktopFileTransferRowHeight, - itemBuilder: (context, index) { - return rows[index]; - }, - itemCount: rows.length, - ), - ), - ], - ); - }), - ); - } - - onSearchText(String searchText, bool isLocal) { - selectedItems.clear(); - _searchText.value = searchText; - } - - void _jumpToEntry(bool isLocal, Entry entry, - ScrollController scrollController, double rowHeight) { - final entries = controller.directory.value.entries; - final index = entries.indexOf(entry); - if (index == -1) { - debugPrint("entry is not valid: ${entry.path}"); - } - final selectedEntries = selectedItems; - final searchResult = entries.where((element) => element == entry); - selectedEntries.clear(); - if (searchResult.isEmpty) { - return; - } - final offset = min( - max(scrollController.position.minScrollExtent, - entries.indexOf(searchResult.first) * rowHeight), - scrollController.position.maxScrollExtent); - scrollController.jumpTo(offset); - selectedEntries.add(searchResult.first); - debugPrint("focused on ${searchResult.first.name}"); - } - - void _onSelectedChanged(SelectedItems selectedItems, List entries, - Entry entry, bool isLocal) { - final isCtrlDown = RawKeyboard.instance.keysPressed - .contains(LogicalKeyboardKey.controlLeft) || - RawKeyboard.instance.keysPressed - .contains(LogicalKeyboardKey.controlRight); - final isShiftDown = RawKeyboard.instance.keysPressed - .contains(LogicalKeyboardKey.shiftLeft) || - RawKeyboard.instance.keysPressed - .contains(LogicalKeyboardKey.shiftRight); - if (isCtrlDown) { - if (selectedItems.items.contains(entry)) { - selectedItems.remove(entry); - } else { - selectedItems.add(entry); - } - } else if (isShiftDown) { - final List indexGroup = []; - for (var selected in selectedItems.items) { - indexGroup.add(entries.indexOf(selected)); - } - indexGroup.add(entries.indexOf(entry)); - indexGroup.removeWhere((e) => e == -1); - final maxIndex = indexGroup.reduce(max); - final minIndex = indexGroup.reduce(min); - selectedItems.clear(); - entries - .getRange(minIndex, maxIndex + 1) - .forEach((e) => selectedItems.add(e)); - } else { - selectedItems.clear(); - selectedItems.add(entry); - } - setState(() {}); - } - - bool _checkDoubleClick(Entry entry) { - final current = DateTime.now().millisecondsSinceEpoch; - final elapsed = current - _lastClickTime; - _lastClickTime = current; - if (_lastClickEntry == entry) { - if (elapsed < bind.getDoubleClickTime()) { - return true; - } - } else { - _lastClickEntry = entry; - } - return false; - } - - void _onDrag(double dx, RxDouble column1, RxDouble column2) { - if (column1.value + dx <= _fileTransferMinimumWidth || - column2.value - dx <= _fileTransferMinimumWidth) { - return; - } - column1.value += dx; - column2.value -= dx; - column1.value = max(_fileTransferMinimumWidth, column1.value); - column2.value = max(_fileTransferMinimumWidth, column2.value); - } - - Widget _buildFileBrowserHeader(BuildContext context) { - final padding = EdgeInsets.all(1.0); - return SizedBox( - key: _globalHeaderKey, - height: kDesktopFileTransferHeaderHeight, - child: Row( - children: [ - Obx( - () => headerItemFunc( - _nameColWidth.value, SortBy.name, translate("Name")), - ), - DraggableDivider( - axis: Axis.vertical, - onPointerMove: (dx) => - _onDrag(dx, _nameColWidth, _modifiedColWidth), - padding: padding, - ), - Obx( - () => headerItemFunc(_modifiedColWidth.value, SortBy.modified, - translate("Modified")), - ), - DraggableDivider( - axis: Axis.vertical, - onPointerMove: (dx) => - _onDrag(dx, _modifiedColWidth, _sizeColWidth), - padding: padding), - Expanded( - child: headerItemFunc( - _sizeColWidth.value, SortBy.size, translate("Size"))) - ], - ), - ); - } - - Widget headerItemFunc(double? width, SortBy sortBy, String name) { - final headerTextStyle = - Theme.of(context).dataTableTheme.headingTextStyle ?? TextStyle(); - return ObxValue>( - (ascending) => InkWell( - onTap: () { - if (ascending.value == null) { - ascending.value = true; - } else { - ascending.value = !ascending.value!; - } - controller.changeSortStyle(sortBy, - isLocal: isLocal, ascending: ascending.value!); - }, - child: SizedBox( - width: width, - height: kDesktopFileTransferHeaderHeight, - child: Row( - children: [ - Expanded( - child: Text( - name, - style: headerTextStyle, - overflow: TextOverflow.ellipsis, - ).marginOnly(left: 4), - ), - ascending.value != null - ? Icon( - ascending.value! - ? Icons.keyboard_arrow_up_rounded - : Icons.keyboard_arrow_down_rounded, - ) - : SizedBox() - ], - ), - ), - ), () { - if (controller.sortBy.value == sortBy) { - return controller.sortAscending.obs; - } else { - return Rx(null); - } - }()); - } - - Widget buildBread() { - final items = getPathBreadCrumbItems(isLocal, (list) { - var path = ""; - for (var item in list) { - path = PathUtil.join(path, item, controller.options.value.isWindows); - } - controller.openDirectory(path); - }); - - return items.isEmpty - ? Offstage() - : Row( - key: _locationBarKey, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Listener( - // handle mouse wheel - onPointerSignal: (e) { - if (e is PointerScrollEvent) { - final sc = _breadCrumbScroller; - final scale = isWindows ? 2 : 4; - sc.jumpTo(sc.offset + e.scrollDelta.dy / scale); - } - }, - child: BreadCrumb( - items: items, - divider: const Icon(Icons.keyboard_arrow_right_rounded), - overflow: ScrollableOverflow( - controller: _breadCrumbScroller, - ), - ), - ), - ), - ActionIcon( - message: "", - icon: Icons.keyboard_arrow_down_rounded, - onTap: () async { - final renderBox = _locationBarKey.currentContext - ?.findRenderObject() as RenderBox; - _locationBarKey.currentContext?.size; - - final size = renderBox.size; - final offset = renderBox.localToGlobal(Offset.zero); - - final x = offset.dx; - final y = offset.dy + size.height + 1; - - final isPeerWindows = controller.options.value.isWindows; - final List menuItems = [ - MenuEntryButton( - childBuilder: (TextStyle? style) => isPeerWindows - ? buildWindowsThisPC(context, style) - : Text( - '/', - style: style, - ), - proc: () { - controller.openDirectory('/'); - }, - dismissOnClicked: true), - MenuEntryDivider() - ]; - if (isPeerWindows) { - var loadingTag = ""; - if (!isLocal) { - loadingTag = _ffi.dialogManager.showLoading("Waiting"); - } - try { - final showHidden = controller.options.value.showHidden; - final fd = await controller.fileFetcher - .fetchDirectory("/", isLocal, showHidden); - for (var entry in fd.entries) { - menuItems.add(MenuEntryButton( - childBuilder: (TextStyle? style) => - Row(children: [ - Image( - image: iconHardDrive, - fit: BoxFit.scaleDown, - color: Theme.of(context) - .iconTheme - .color - ?.withOpacity(0.7)), - SizedBox(width: 10), - Text( - entry.name, - style: style, - ) - ]), - proc: () { - controller.openDirectory('${entry.name}\\'); - }, - dismissOnClicked: true)); - } - menuItems.add(MenuEntryDivider()); - } catch (e) { - debugPrint("buildBread fetchDirectory err=$e"); - } finally { - if (!isLocal) { - _ffi.dialogManager.dismissByTag(loadingTag); - } - } - } - mod_menu.showMenu( - context: context, - position: RelativeRect.fromLTRB(x, y, x, y), - elevation: 4, - items: menuItems - .map((e) => e.build( - context, - MenuConfig( - commonColor: - CustomPopupMenuTheme.commonColor, - height: CustomPopupMenuTheme.height, - dividerHeight: - CustomPopupMenuTheme.dividerHeight, - boxWidth: size.width))) - .expand((i) => i) - .toList()); - }, - iconSize: 20, - ) - ]); - } - - List getPathBreadCrumbItems( - bool isLocal, void Function(List) onPressed) { - final path = controller.directory.value.path; - final breadCrumbList = List.empty(growable: true); - final isWindows = controller.options.value.isWindows; - if (isWindows && path == '/') { - breadCrumbList.add(BreadCrumbItem( - content: TextButton( - child: buildWindowsThisPC(context), - style: ButtonStyle( - minimumSize: MaterialStateProperty.all(Size(0, 0))), - onPressed: () => onPressed(['/'])) - .marginSymmetric(horizontal: 4))); - } else { - final list = PathUtil.split(path, isWindows); - breadCrumbList.addAll( - list.asMap().entries.map( - (e) => BreadCrumbItem( - content: TextButton( - child: Text(e.value), - style: ButtonStyle( - minimumSize: MaterialStateProperty.all( - Size(0, 0), - ), - ), - onPressed: () => onPressed( - list.sublist(0, e.key + 1), - ), - ).marginSymmetric(horizontal: 4), - ), - ), - ); - } - return breadCrumbList; - } - - breadCrumbScrollToEnd() { - Future.delayed(Duration(milliseconds: 200), () { - if (_breadCrumbScroller.hasClients) { - _breadCrumbScroller.animateTo( - _breadCrumbScroller.position.maxScrollExtent, - duration: Duration(milliseconds: 200), - curve: Curves.fastLinearToSlowEaseIn); - } - }); - } - - Widget buildPathLocation() { - final text = _locationStatus.value == LocationStatus.pathLocation - ? controller.directory.value.path - : _searchText.value; - final textController = TextEditingController(text: text) - ..selection = TextSelection.collapsed(offset: text.length); - return Row( - children: [ - SvgPicture.asset( - _locationStatus.value == LocationStatus.pathLocation - ? "assets/folder.svg" - : "assets/search.svg", - colorFilter: svgColor(Theme.of(context).tabBarTheme.labelColor), - ), - Expanded( - child: TextField( - focusNode: _locationNode, - decoration: InputDecoration( - border: InputBorder.none, - isDense: true, - prefix: Padding( - padding: EdgeInsets.only(left: 4.0), - ), - ), - controller: textController, - onSubmitted: (path) { - controller.openDirectory(path); - }, - onChanged: _locationStatus.value == LocationStatus.fileSearchBar - ? (searchText) => onSearchText(searchText, isLocal) - : null, - ).workaroundFreezeLinuxMint(), - ) - ], - ); - } - - // openDirectory(String path, {bool isLocal = false}) { - // model.openDirectory(path, isLocal: isLocal); - // } -} - -Widget buildWindowsThisPC(BuildContext context, [TextStyle? textStyle]) { - final color = Theme.of(context).iconTheme.color?.withOpacity(0.7); - return Row(children: [ - Icon(Icons.computer, size: 20, color: color), - SizedBox(width: 10), - Text(translate('This PC'), style: textStyle) - ]); -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/file_manager_tab_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/file_manager_tab_page.dart deleted file mode 100644 index ed3e968..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/file_manager_tab_page.dart +++ /dev/null @@ -1,177 +0,0 @@ -import 'dart:convert'; - -import 'package:desktop_multi_window/desktop_multi_window.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/common/widgets/dialog.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:flutter_hbb/desktop/pages/file_manager_page.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/utils/multi_window_manager.dart'; -import 'package:get/get.dart'; - -import '../../models/platform_model.dart'; - -/// File Transfer for multi tabs -class FileManagerTabPage extends StatefulWidget { - final Map params; - - const FileManagerTabPage({Key? key, required this.params}) : super(key: key); - - @override - State createState() => _FileManagerTabPageState(params); -} - -class _FileManagerTabPageState extends State { - DesktopTabController get tabController => Get.find(); - - static const IconData selectedIcon = Icons.file_copy_sharp; - static const IconData unselectedIcon = Icons.file_copy_outlined; - - _FileManagerTabPageState(Map params) { - Get.put(DesktopTabController(tabType: DesktopTabType.fileTransfer)); - tabController.onSelected = (id) { - WindowController.fromWindowId(windowId()) - .setTitle(getWindowNameWithId(id)); - }; - tabController.onRemoved = (_, id) => onRemoveId(id); - tabController.add(TabInfo( - key: params['id'], - label: params['id'], - selectedIcon: selectedIcon, - unselectedIcon: unselectedIcon, - onTabCloseButton: () async { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: params['id'], - tabController: tabController, - )) { - return; - } - tabController.closeBy(params['id']); - }, - page: FileManagerPage( - key: ValueKey(params['id']), - id: params['id'], - password: params['password'], - isSharedPassword: params['isSharedPassword'], - tabController: tabController, - forceRelay: params['forceRelay'], - connToken: params['connToken'], - ))); - } - - @override - void initState() { - super.initState(); - - rustDeskWinManager.setMethodHandler((call, fromWindowId) async { - debugPrint( - "[FileTransfer] call ${call.method} with args ${call.arguments} from window $fromWindowId to ${windowId()}"); - // for simplify, just replace connectionId - if (call.method == kWindowEventNewFileTransfer) { - final args = jsonDecode(call.arguments); - final id = args['id']; - windowOnTop(windowId()); - tabController.add(TabInfo( - key: id, - label: id, - selectedIcon: selectedIcon, - unselectedIcon: unselectedIcon, - onTabCloseButton: () async { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: id, - tabController: tabController, - )) { - return; - } - tabController.closeBy(id); - }, - page: FileManagerPage( - key: ValueKey(id), - id: id, - password: args['password'], - isSharedPassword: args['isSharedPassword'], - tabController: tabController, - forceRelay: args['forceRelay'], - connToken: args['connToken'], - ))); - } else if (call.method == "onDestroy") { - tabController.clear(); - } else if (call.method == kWindowActionRebuild) { - reloadCurrentWindow(); - } - }); - Future.delayed(Duration.zero, () { - restoreWindowPosition(WindowType.FileTransfer, windowId: windowId()); - }); - } - - @override - Widget build(BuildContext context) { - final child = Scaffold( - backgroundColor: Theme.of(context).cardColor, - body: DesktopTab( - controller: tabController, - onWindowCloseButton: handleWindowCloseButton, - tail: const AddButton(), - selectedBorderColor: MyTheme.accent, - labelGetter: DesktopTab.tablabelGetter, - )); - final tabWidget = isLinux - ? buildVirtualWindowFrame(context, child) - : workaroundWindowBorder( - context, - Container( - decoration: BoxDecoration( - border: Border.all(color: MyTheme.color(context).border!)), - child: child, - )); - return isMacOS || kUseCompatibleUiMode - ? tabWidget - : SubWindowDragToResizeArea( - child: tabWidget, - resizeEdgeSize: stateGlobal.resizeEdgeSize.value, - enableResizeEdges: subWindowManagerEnableResizeEdges, - windowId: stateGlobal.windowId, - ); - } - - void onRemoveId(String id) { - if (tabController.state.value.tabs.isEmpty) { - WindowController.fromWindowId(windowId()).close(); - } - } - - int windowId() { - return widget.params["windowId"]; - } - - Future handleWindowCloseButton() async { - final connLength = tabController.state.value.tabs.length; - if (connLength == 1) { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: tabController.state.value.tabs[0].key, - tabController: tabController, - )) { - return false; - } - } - if (connLength <= 1) { - tabController.clear(); - return true; - } else { - final bool res; - if (!option2bool(kOptionEnableConfirmClosingTabs, - bind.mainGetLocalOption(key: kOptionEnableConfirmClosingTabs))) { - res = true; - } else { - res = await closeConfirmDialog(); - } - if (res) { - tabController.clear(); - } - return res; - } - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/install_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/install_page.dart deleted file mode 100644 index 5bf6baf..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/install_page.dart +++ /dev/null @@ -1,274 +0,0 @@ -import 'dart:convert'; - -import 'package:file_picker/file_picker.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:get/get.dart'; -import 'package:path/path.dart'; -import 'package:url_launcher/url_launcher_string.dart'; -import 'package:window_manager/window_manager.dart'; - -class InstallPage extends StatefulWidget { - const InstallPage({Key? key}) : super(key: key); - - @override - State createState() => _InstallPageState(); -} - -class _InstallPageState extends State { - final tabController = DesktopTabController(tabType: DesktopTabType.main); - - _InstallPageState() { - Get.put(tabController); - const label = "install"; - tabController.add(TabInfo( - key: label, - label: label, - closable: false, - page: _InstallPageBody( - key: const ValueKey(label), - ))); - } - - @override - void dispose() { - super.dispose(); - Get.delete(); - } - - @override - Widget build(BuildContext context) { - return DragToResizeArea( - resizeEdgeSize: stateGlobal.resizeEdgeSize.value, - enableResizeEdges: windowManagerEnableResizeEdges, - child: Container( - child: Scaffold( - backgroundColor: Theme.of(context).colorScheme.background, - body: DesktopTab(controller: tabController)), - ), - ); - } -} - -class _InstallPageBody extends StatefulWidget { - const _InstallPageBody({Key? key}) : super(key: key); - - @override - State<_InstallPageBody> createState() => _InstallPageBodyState(); -} - -class _InstallPageBodyState extends State<_InstallPageBody> - with WindowListener { - late final TextEditingController controller; - final RxBool startmenu = true.obs; - final RxBool desktopicon = true.obs; - final RxBool printer = true.obs; - final RxBool showProgress = false.obs; - final RxBool btnEnabled = true.obs; - - // todo move to theme. - final buttonStyle = OutlinedButton.styleFrom( - textStyle: TextStyle(fontSize: 14, fontWeight: FontWeight.normal), - padding: EdgeInsets.symmetric(vertical: 15, horizontal: 12), - ); - - _InstallPageBodyState() { - controller = TextEditingController(text: bind.installInstallPath()); - final installOptions = jsonDecode(bind.installInstallOptions()); - startmenu.value = installOptions['STARTMENUSHORTCUTS'] != '0'; - desktopicon.value = installOptions['DESKTOPSHORTCUTS'] != '0'; - printer.value = installOptions['PRINTER'] != '0'; - } - - @override - void initState() { - windowManager.addListener(this); - super.initState(); - } - - @override - void dispose() { - windowManager.removeListener(this); - super.dispose(); - } - - @override - void onWindowClose() { - gFFI.close(); - super.onWindowClose(); - windowManager.setPreventClose(false); - windowManager.close(); - } - - InkWell Option(RxBool option, {String label = ''}) { - return InkWell( - // todo mouseCursor: "SystemMouseCursors.forbidden" or no cursor on btnEnabled == false - borderRadius: BorderRadius.circular(6), - onTap: () => btnEnabled.value ? option.value = !option.value : null, - child: Row( - children: [ - Obx( - () => Checkbox( - visualDensity: VisualDensity(horizontal: -4, vertical: -4), - value: option.value, - onChanged: (v) => - btnEnabled.value ? option.value = !option.value : null, - ).marginOnly(right: 8), - ), - Expanded( - child: Text(translate(label)), - ), - ], - ), - ); - } - - @override - Widget build(BuildContext context) { - final double em = 13; - final isDarkTheme = MyTheme.currentThemeMode() == ThemeMode.dark; - return Scaffold( - backgroundColor: null, - body: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(translate('Installation'), - style: Theme.of(context).textTheme.headlineMedium), - Row( - children: [ - Text('${translate('Installation Path')}:') - .marginOnly(right: 10), - Expanded( - child: TextField( - controller: controller, - readOnly: true, - decoration: InputDecoration( - contentPadding: EdgeInsets.all(0.75 * em), - ), - ).workaroundFreezeLinuxMint().marginOnly(right: 10), - ), - Obx( - () => OutlinedButton.icon( - icon: Icon(Icons.folder_outlined, size: 16), - onPressed: btnEnabled.value ? selectInstallPath : null, - style: buttonStyle, - label: Text(translate('Change Path')), - ), - ) - ], - ).marginSymmetric(vertical: 2 * em), - Option(startmenu, label: 'Create start menu shortcuts') - .marginOnly(bottom: 7), - Option(desktopicon, label: 'Create desktop icon') - .marginOnly(bottom: 7), - Option(printer, label: 'Install {$appName} Printer'), - Container( - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: isDarkTheme - ? Color.fromARGB(135, 87, 87, 90) - : Colors.grey[100], - borderRadius: BorderRadius.circular(8), - border: Border.all(color: Colors.grey), - ), - child: Row( - children: [ - Icon(Icons.info_outline_rounded, size: 32) - .marginOnly(right: 16), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(translate('agreement_tip')) - .marginOnly(bottom: em), - InkWell( - hoverColor: Colors.transparent, - onTap: () => launchUrlString( - 'https://rustdesk.com/privacy.html'), - child: Tooltip( - message: 'https://rustdesk.com/privacy.html', - child: Row(children: [ - Icon(Icons.launch_outlined, size: 16) - .marginOnly(right: 5), - Text( - translate('End-user license agreement'), - style: const TextStyle( - decoration: TextDecoration.underline), - ) - ]), - ), - ), - ], - ) - ], - )).marginSymmetric(vertical: 2 * em), - Row( - children: [ - Expanded( - // NOT use Offstage to wrap LinearProgressIndicator - child: Obx(() => showProgress.value - ? LinearProgressIndicator().marginOnly(right: 10) - : Offstage()), - ), - Obx( - () => OutlinedButton.icon( - icon: Icon(Icons.close_rounded, size: 16), - label: Text(translate('Cancel')), - onPressed: - btnEnabled.value ? () => windowManager.close() : null, - style: buttonStyle, - ).marginOnly(right: 10), - ), - Obx( - () => ElevatedButton.icon( - icon: Icon(Icons.done_rounded, size: 16), - label: Text(translate('Accept and Install')), - onPressed: btnEnabled.value ? install : null, - style: buttonStyle, - ), - ), - Offstage( - offstage: bind.installShowRunWithoutInstall(), - child: Obx( - () => OutlinedButton.icon( - icon: Icon(Icons.screen_share_outlined, size: 16), - label: Text(translate('Run without install')), - onPressed: btnEnabled.value - ? () => bind.installRunWithoutInstall() - : null, - style: buttonStyle, - ).marginOnly(left: 10), - ), - ), - ], - ) - ], - ).paddingSymmetric(horizontal: 4 * em, vertical: 3 * em), - )); - } - - void install() { - do_install() { - btnEnabled.value = false; - showProgress.value = true; - String args = ''; - if (startmenu.value) args += ' startmenu'; - if (desktopicon.value) args += ' desktopicon'; - if (printer.value) args += ' printer'; - bind.installInstallMe(options: args, path: controller.text); - } - - do_install(); - } - - void selectInstallPath() async { - String? install_path = await FilePicker.platform - .getDirectoryPath(initialDirectory: controller.text); - if (install_path != null) { - controller.text = join(install_path, await bind.mainGetAppName()); - } - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/port_forward_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/port_forward_page.dart deleted file mode 100644 index 13dca0e..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/port_forward_page.dart +++ /dev/null @@ -1,357 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/models/model.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:get/get.dart'; - -const double _kColumn1Width = 30; -const double _kColumn4Width = 100; -const double _kRowHeight = 60; -const double _kTextLeftMargin = 20; - -class _PortForward { - int localPort; - String remoteHost; - int remotePort; - - _PortForward.fromJson(List json) - : localPort = json[0] as int, - remoteHost = json[1] as String, - remotePort = json[2] as int; -} - -class PortForwardPage extends StatefulWidget { - PortForwardPage({ - Key? key, - required this.id, - required this.password, - required this.tabController, - required this.isRDP, - required this.isSharedPassword, - this.forceRelay, - this.connToken, - }) : super(key: key); - final String id; - final String? password; - final DesktopTabController tabController; - final bool isRDP; - final bool? forceRelay; - final bool? isSharedPassword; - final String? connToken; - final SimpleWrapper?> _lastState = SimpleWrapper(null); - - FFI get ffi => (_lastState.value! as _PortForwardPageState)._ffi; - - @override - State createState() { - final state = _PortForwardPageState(); - _lastState.value = state; - return state; - } -} - -class _PortForwardPageState extends State - with AutomaticKeepAliveClientMixin { - final TextEditingController localPortController = TextEditingController(); - final TextEditingController remoteHostController = TextEditingController(); - final TextEditingController remotePortController = TextEditingController(); - RxList<_PortForward> pfs = RxList.empty(growable: true); - late FFI _ffi; - - @override - void initState() { - super.initState(); - _ffi = FFI(null); - _ffi.start(widget.id, - isPortForward: true, - password: widget.password, - isSharedPassword: widget.isSharedPassword, - forceRelay: widget.forceRelay, - connToken: widget.connToken, - isRdp: widget.isRDP); - Get.put(_ffi, tag: 'pf_${widget.id}'); - debugPrint("Port forward page init success with id ${widget.id}"); - // Call onSelected in post frame callback, since we cannot guarantee that the callback will not call setState. - WidgetsBinding.instance.addPostFrameCallback((_) { - widget.tabController.onSelected?.call(widget.id); - }); - } - - @override - void dispose() { - _ffi.close(); - _ffi.dialogManager.dismissAll(); - Get.delete(tag: 'pf_${widget.id}'); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - super.build(context); - return Scaffold( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - body: FutureBuilder(future: () async { - if (!widget.isRDP) { - refreshTunnelConfig(); - } - }(), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - return Container( - decoration: BoxDecoration( - border: Border.all( - width: 20, - color: Theme.of(context).scaffoldBackgroundColor)), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - buildPrompt(context), - Flexible( - child: Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - border: Border.all(width: 1, color: MyTheme.border)), - child: - widget.isRDP ? buildRdp(context) : buildTunnel(context), - ), - ), - ], - ), - ); - } - return const Offstage(); - }), - ); - } - - buildPrompt(BuildContext context) { - return Obx(() => Offstage( - offstage: pfs.isEmpty && !widget.isRDP, - child: Container( - height: 45, - color: const Color(0xFF007F00), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - translate('Listening ...'), - style: const TextStyle(fontSize: 16, color: Colors.white), - ), - Text( - translate('not_close_tcp_tip'), - style: const TextStyle( - fontSize: 10, color: Color(0xFFDDDDDD), height: 1.2), - ) - ])).marginOnly(bottom: 8), - )); - } - - buildTunnel(BuildContext context) { - text(String label) => Expanded( - child: Text(translate(label)).marginOnly(left: _kTextLeftMargin)); - - return Theme( - data: Theme.of(context).copyWith( - colorScheme: Theme.of(context).colorScheme, - ), - child: Obx(() => ListView.builder( - controller: ScrollController(), - itemCount: pfs.length + 2, - itemBuilder: ((context, index) { - if (index == 0) { - return Container( - height: 25, - color: Theme.of(context).scaffoldBackgroundColor, - child: Row(children: [ - text('Local Port'), - const SizedBox(width: _kColumn1Width), - text('Remote Host'), - text('Remote Port'), - SizedBox( - width: _kColumn4Width, child: Text(translate('Action'))) - ]), - ); - } else if (index == 1) { - return buildTunnelAddRow(context); - } else { - return buildTunnelDataRow(context, pfs[index - 2], index - 2); - } - }))), - ); - } - - buildTunnelAddRow(BuildContext context) { - var portInputFormatter = [ - FilteringTextInputFormatter.allow(RegExp( - r'^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$')) - ]; - - return Container( - height: _kRowHeight, - decoration: - BoxDecoration(color: Theme.of(context).colorScheme.background), - child: Row(children: [ - buildTunnelInputCell(context, - controller: localPortController, - inputFormatters: portInputFormatter), - const SizedBox( - width: _kColumn1Width, child: Icon(Icons.arrow_forward_sharp)), - buildTunnelInputCell(context, - controller: remoteHostController, hint: 'localhost'), - buildTunnelInputCell(context, - controller: remotePortController, - inputFormatters: portInputFormatter), - ElevatedButton( - onPressed: () async { - int? localPort = int.tryParse(localPortController.text); - int? remotePort = int.tryParse(remotePortController.text); - if (localPort != null && - remotePort != null && - (remoteHostController.text.isEmpty || - remoteHostController.text.trim().isNotEmpty)) { - await bind.sessionAddPortForward( - sessionId: _ffi.sessionId, - localPort: localPort, - remoteHost: remoteHostController.text.trim().isEmpty - ? 'localhost' - : remoteHostController.text.trim(), - remotePort: remotePort); - localPortController.clear(); - remoteHostController.clear(); - remotePortController.clear(); - refreshTunnelConfig(); - } - }, - child: Text( - translate('Add'), - ), - ).marginSymmetric(horizontal: 10), - ]), - ); - } - - buildTunnelInputCell(BuildContext context, - {required TextEditingController controller, - List? inputFormatters, - String? hint}) { - return Expanded( - child: Padding( - padding: const EdgeInsets.all(10.0), - child: TextField( - controller: controller, - inputFormatters: inputFormatters, - decoration: InputDecoration( - hintText: hint, - )).workaroundFreezeLinuxMint()), - ); - } - - Widget buildTunnelDataRow(BuildContext context, _PortForward pf, int index) { - text(String label) => Expanded( - child: Text(label, style: const TextStyle(fontSize: 20)) - .marginOnly(left: _kTextLeftMargin)); - - return Container( - height: _kRowHeight, - decoration: BoxDecoration( - color: index % 2 == 0 - ? MyTheme.currentThemeMode() == ThemeMode.dark - ? const Color(0xFF202020) - : const Color(0xFFF4F5F6) - : Theme.of(context).colorScheme.background), - child: Row(children: [ - text(pf.localPort.toString()), - const SizedBox(width: _kColumn1Width), - text(pf.remoteHost), - text(pf.remotePort.toString()), - SizedBox( - width: _kColumn4Width, - child: IconButton( - icon: const Icon(Icons.close), - onPressed: () async { - await bind.sessionRemovePortForward( - sessionId: _ffi.sessionId, localPort: pf.localPort); - refreshTunnelConfig(); - }, - ), - ), - ]), - ); - } - - void refreshTunnelConfig() async { - String peer = bind.mainGetPeerSync(id: widget.id); - Map config = jsonDecode(peer); - List infos = config['port_forwards'] as List; - List<_PortForward> result = List.empty(growable: true); - for (var e in infos) { - result.add(_PortForward.fromJson(e)); - } - pfs.value = result; - } - - buildRdp(BuildContext context) { - text1(String label) => Expanded( - child: Text(translate(label)).marginOnly(left: _kTextLeftMargin)); - text2(String label) => Expanded( - child: Text( - label, - style: const TextStyle(fontSize: 20), - ).marginOnly(left: _kTextLeftMargin)); - return Theme( - data: Theme.of(context) - .copyWith(colorScheme: Theme.of(context).colorScheme), - child: ListView.builder( - controller: ScrollController(), - itemCount: 2, - itemBuilder: ((context, index) { - if (index == 0) { - return Container( - height: 25, - color: Theme.of(context).scaffoldBackgroundColor, - child: Row(children: [ - text1('Local Port'), - const SizedBox(width: _kColumn1Width), - text1('Remote Host'), - text1('Remote Port'), - ]), - ); - } else { - return Container( - height: _kRowHeight, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background), - child: Row(children: [ - Expanded( - child: Align( - alignment: Alignment.centerLeft, - child: SizedBox( - width: 120, - child: ElevatedButton( - onPressed: () => - bind.sessionNewRdp(sessionId: _ffi.sessionId), - child: Text( - translate('New RDP'), - ), - ).marginSymmetric(vertical: 10), - ).marginOnly(left: 20), - ), - ), - const SizedBox( - width: _kColumn1Width, - child: Icon(Icons.arrow_forward_sharp)), - text2('localhost'), - text2('RDP'), - ]), - ); - } - })), - ); - } - - @override - bool get wantKeepAlive => true; -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/port_forward_tab_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/port_forward_tab_page.dart deleted file mode 100644 index 9d366bc..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/port_forward_tab_page.dart +++ /dev/null @@ -1,149 +0,0 @@ -import 'dart:convert'; - -import 'package:desktop_multi_window/desktop_multi_window.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:flutter_hbb/desktop/pages/port_forward_page.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/utils/multi_window_manager.dart'; -import 'package:get/get.dart'; - -class PortForwardTabPage extends StatefulWidget { - final Map params; - - const PortForwardTabPage({Key? key, required this.params}) : super(key: key); - - @override - State createState() => _PortForwardTabPageState(params); -} - -class _PortForwardTabPageState extends State { - late final DesktopTabController tabController; - late final bool isRDP; - - static const IconData selectedIcon = Icons.forward_sharp; - static const IconData unselectedIcon = Icons.forward_outlined; - - _PortForwardTabPageState(Map params) { - isRDP = params['isRDP']; - tabController = - Get.put(DesktopTabController(tabType: DesktopTabType.portForward)); - tabController.onSelected = (id) { - WindowController.fromWindowId(windowId()) - .setTitle(getWindowNameWithId(id)); - }; - tabController.onRemoved = (_, id) => onRemoveId(id); - tabController.add(TabInfo( - key: params['id'], - label: params['id'], - selectedIcon: selectedIcon, - unselectedIcon: unselectedIcon, - page: PortForwardPage( - key: ValueKey(params['id']), - id: params['id'], - password: params['password'], - isSharedPassword: params['isSharedPassword'], - tabController: tabController, - isRDP: isRDP, - forceRelay: params['forceRelay'], - connToken: params['connToken'], - ))); - } - - @override - void initState() { - super.initState(); - - rustDeskWinManager.setMethodHandler((call, fromWindowId) async { - debugPrint( - "[Port Forward] call ${call.method} with args ${call.arguments} from window $fromWindowId"); - // for simplify, just replace connectionId - if (call.method == kWindowEventNewPortForward) { - final args = jsonDecode(call.arguments); - final id = args['id']; - final isRDP = args['isRDP']; - windowOnTop(windowId()); - if (tabController.state.value.tabs.indexWhere((e) => e.key == id) >= - 0) { - debugPrint("port forward $id exists"); - return; - } - tabController.add(TabInfo( - key: id, - label: id, - selectedIcon: selectedIcon, - unselectedIcon: unselectedIcon, - page: PortForwardPage( - key: ValueKey(args['id']), - id: id, - password: args['password'], - isSharedPassword: args['isSharedPassword'], - isRDP: isRDP, - tabController: tabController, - forceRelay: args['forceRelay'], - connToken: args['connToken'], - ))); - } else if (call.method == "onDestroy") { - tabController.clear(); - } else if (call.method == kWindowActionRebuild) { - reloadCurrentWindow(); - } - }); - Future.delayed(Duration.zero, () { - restoreWindowPosition(WindowType.PortForward, windowId: windowId()); - }); - } - - @override - Widget build(BuildContext context) { - final child = Scaffold( - backgroundColor: Theme.of(context).colorScheme.background, - body: DesktopTab( - controller: tabController, - onWindowCloseButton: () async { - tabController.clear(); - return true; - }, - tail: AddButton(), - selectedBorderColor: MyTheme.accent, - labelGetter: DesktopTab.tablabelGetter, - ), - ); - final tabWidget = isLinux - ? buildVirtualWindowFrame( - context, - Scaffold( - backgroundColor: Theme.of(context).colorScheme.background, - body: child), - ) - : workaroundWindowBorder( - context, - Container( - decoration: BoxDecoration( - border: Border.all(color: MyTheme.color(context).border!)), - child: child, - )); - return isMacOS || kUseCompatibleUiMode - ? tabWidget - : Obx( - () => SubWindowDragToResizeArea( - child: tabWidget, - resizeEdgeSize: stateGlobal.resizeEdgeSize.value, - enableResizeEdges: subWindowManagerEnableResizeEdges, - windowId: stateGlobal.windowId, - ), - ); - } - - void onRemoveId(String id) { - if (tabController.state.value.tabs.isEmpty) { - WindowController.fromWindowId(windowId()).close(); - } - } - - int windowId() { - return widget.params["windowId"]; - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/remote_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/remote_page.dart deleted file mode 100644 index 29e710b..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/remote_page.dart +++ /dev/null @@ -1,1054 +0,0 @@ -import 'dart:async'; - -import 'package:desktop_multi_window/desktop_multi_window.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:get/get.dart'; -import 'package:provider/provider.dart'; -import 'package:flutter_hbb/models/state_model.dart'; - -import '../../consts.dart'; -import '../../common/widgets/overlay.dart'; -import '../../common/widgets/remote_input.dart'; -import '../../common.dart'; -import '../../common/widgets/dialog.dart'; -import '../../common/widgets/toolbar.dart'; -import '../../models/model.dart'; -import '../../models/input_model.dart'; -import '../../models/platform_model.dart'; -import '../../common/shared_state.dart'; -import '../../utils/image.dart'; -import '../widgets/remote_toolbar.dart'; -import '../widgets/kb_layout_type_chooser.dart'; -import '../widgets/tabbar_widget.dart'; - -import 'package:flutter_hbb/native/custom_cursor.dart' - if (dart.library.html) 'package:flutter_hbb/web/custom_cursor.dart'; - -final SimpleWrapper _firstEnterImage = SimpleWrapper(false); - -// Used to skip session close if "move to new window" is clicked. -final Map closeSessionOnDispose = {}; - -class RemotePage extends StatefulWidget { - RemotePage({ - Key? key, - required this.id, - required this.toolbarState, - this.sessionId, - this.tabWindowId, - this.password, - this.display, - this.displays, - this.tabController, - this.switchUuid, - this.forceRelay, - this.isSharedPassword, - }) : super(key: key) { - initSharedStates(id); - } - - final String id; - final SessionID? sessionId; - final int? tabWindowId; - final int? display; - final List? displays; - final String? password; - final ToolbarState toolbarState; - final String? switchUuid; - final bool? forceRelay; - final bool? isSharedPassword; - final SimpleWrapper?> _lastState = SimpleWrapper(null); - final DesktopTabController? tabController; - - FFI get ffi => (_lastState.value! as _RemotePageState)._ffi; - - @override - State createState() { - final state = _RemotePageState(id); - _lastState.value = state; - return state; - } -} - -class _RemotePageState extends State - with - AutomaticKeepAliveClientMixin, - MultiWindowListener, - TickerProviderStateMixin { - Timer? _timer; - String keyboardMode = "legacy"; - bool _isWindowBlur = false; - final _cursorOverImage = false.obs; - late RxBool _showRemoteCursor; - late RxBool _zoomCursor; - late RxBool _remoteCursorMoved; - late RxBool _keyboardEnabled; - final _uniqueKey = UniqueKey(); - - var _blockableOverlayState = BlockableOverlayState(); - - final FocusNode _rawKeyFocusNode = FocusNode(debugLabel: "rawkeyFocusNode"); - - // Debounce timer for pointer lock center updates during window events. - // Uses kDefaultPointerLockCenterThrottleMs from consts.dart for the duration. - Timer? _pointerLockCenterDebounceTimer; - - // We need `_instanceIdOnEnterOrLeaveImage4Toolbar` together with `_onEnterOrLeaveImage4Toolbar` - // to identify the toolbar instance and its callback function. - int? _instanceIdOnEnterOrLeaveImage4Toolbar; - Function(bool)? _onEnterOrLeaveImage4Toolbar; - - late FFI _ffi; - - SessionID get sessionId => _ffi.sessionId; - - _RemotePageState(String id) { - _initStates(id); - } - - void _initStates(String id) { - _zoomCursor = PeerBoolOption.find(id, kOptionZoomCursor); - _showRemoteCursor = ShowRemoteCursorState.find(id); - _keyboardEnabled = KeyboardEnabledState.find(id); - _remoteCursorMoved = RemoteCursorMovedState.find(id); - } - - @override - void initState() { - super.initState(); - _ffi = FFI(widget.sessionId); - Get.put(_ffi, tag: widget.id); - _ffi.imageModel.addCallbackOnFirstImage((String peerId) { - _ffi.canvasModel.activateLocalCursor(); - showKBLayoutTypeChooserIfNeeded( - _ffi.ffiModel.pi.platform, _ffi.dialogManager); - _ffi.recordingModel - .updateStatus(bind.sessionGetIsRecording(sessionId: _ffi.sessionId)); - }); - _ffi.canvasModel.initializeEdgeScrollFallback(this); - _ffi.start( - widget.id, - password: widget.password, - isSharedPassword: widget.isSharedPassword, - switchUuid: widget.switchUuid, - forceRelay: widget.forceRelay, - tabWindowId: widget.tabWindowId, - display: widget.display, - displays: widget.displays, - ); - WidgetsBinding.instance.addPostFrameCallback((_) { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []); - _ffi.dialogManager - .showLoading(translate('Connecting...'), onCancel: closeConnection); - }); - WakelockManager.enable(_uniqueKey); - - _ffi.ffiModel.updateEventListener(sessionId, widget.id); - if (!isWeb) bind.pluginSyncUi(syncTo: kAppTypeDesktopRemote); - _ffi.qualityMonitorModel.checkShowQualityMonitor(sessionId); - _ffi.dialogManager.loadMobileActionsOverlayVisible(); - WidgetsBinding.instance.addPostFrameCallback((_) { - // Session option should be set after models.dart/FFI.start - _showRemoteCursor.value = bind.sessionGetToggleOptionSync( - sessionId: sessionId, arg: 'show-remote-cursor'); - _zoomCursor.value = bind.sessionGetToggleOptionSync( - sessionId: sessionId, arg: kOptionZoomCursor); - }); - DesktopMultiWindow.addListener(this); - // if (!_isCustomCursorInited) { - // customCursorController.registerNeedUpdateCursorCallback( - // (String? lastKey, String? currentKey) async { - // if (_firstEnterImage.value) { - // _firstEnterImage.value = false; - // return true; - // } - // return lastKey == null || lastKey != currentKey; - // }); - // _isCustomCursorInited = true; - // } - - _blockableOverlayState.applyFfi(_ffi); - // Call onSelected in post frame callback, since we cannot guarantee that the callback will not call setState. - WidgetsBinding.instance.addPostFrameCallback((_) { - widget.tabController?.onSelected?.call(widget.id); - }); - - // Register callback to cancel debounce timer when relative mouse mode is disabled - _ffi.inputModel.onRelativeMouseModeDisabled = - _cancelPointerLockCenterDebounceTimer; - } - - /// Cancel the pointer lock center debounce timer - void _cancelPointerLockCenterDebounceTimer() { - _pointerLockCenterDebounceTimer?.cancel(); - _pointerLockCenterDebounceTimer = null; - } - - @override - void onWindowBlur() { - super.onWindowBlur(); - // On windows, we use `focus` way to handle keyboard better. - // Now on Linux, there's some rdev issues which will break the input. - // We disable the `focus` way for non-Windows temporarily. - if (isWindows) { - _isWindowBlur = true; - // unfocus the primary-focus when the whole window is lost focus, - // and let OS to handle events instead. - _rawKeyFocusNode.unfocus(); - } - stateGlobal.isFocused.value = false; - - // When window loses focus, temporarily release relative mouse mode constraints - // to allow user to interact with other applications normally. - // The cursor will be re-hidden and re-centered when window regains focus. - if (_ffi.inputModel.relativeMouseMode.value) { - _ffi.inputModel.onWindowBlur(); - } - } - - @override - void onWindowFocus() { - super.onWindowFocus(); - // See [onWindowBlur]. - if (isWindows) { - _isWindowBlur = false; - } - stateGlobal.isFocused.value = true; - - // Restore relative mouse mode constraints when window regains focus. - if (_ffi.inputModel.relativeMouseMode.value) { - _rawKeyFocusNode.requestFocus(); - _ffi.inputModel.onWindowFocus(); - } - } - - @override - void onWindowRestore() { - super.onWindowRestore(); - // On windows, we use `onWindowRestore` way to handle window restore from - // a minimized state. - if (isWindows) { - _isWindowBlur = false; - } - WakelockManager.enable(_uniqueKey); - // Update pointer lock center when window is restored - _updatePointerLockCenterIfNeeded(); - } - - // When the window is unminimized, onWindowMaximize or onWindowRestore can be called when the old state was maximized or not. - @override - void onWindowMaximize() { - super.onWindowMaximize(); - WakelockManager.enable(_uniqueKey); - // Update pointer lock center when window is maximized - _updatePointerLockCenterIfNeeded(); - } - - @override - void onWindowResize() { - super.onWindowResize(); - // Update pointer lock center when window is resized - _updatePointerLockCenterIfNeeded(); - } - - @override - void onWindowMove() { - super.onWindowMove(); - // Update pointer lock center when window is moved - _updatePointerLockCenterIfNeeded(); - } - - /// Update pointer lock center with debouncing to avoid excessive updates - /// during rapid window move/resize events. - void _updatePointerLockCenterIfNeeded() { - if (!_ffi.inputModel.relativeMouseMode.value) return; - - // Cancel any pending update and schedule a new one (debounce pattern) - _pointerLockCenterDebounceTimer?.cancel(); - _pointerLockCenterDebounceTimer = Timer( - const Duration(milliseconds: kDefaultPointerLockCenterThrottleMs), - () { - if (!mounted) return; - if (_ffi.inputModel.relativeMouseMode.value) { - _ffi.inputModel.updatePointerLockCenter(); - } - }, - ); - } - - @override - void onWindowMinimize() { - super.onWindowMinimize(); - WakelockManager.disable(_uniqueKey); - // Release cursor constraints when minimized - if (_ffi.inputModel.relativeMouseMode.value) { - _ffi.inputModel.onWindowBlur(); - } - } - - @override - void onWindowEnterFullScreen() { - super.onWindowEnterFullScreen(); - if (isMacOS) { - stateGlobal.setFullscreen(true); - } - } - - @override - void onWindowLeaveFullScreen() { - super.onWindowLeaveFullScreen(); - if (isMacOS) { - stateGlobal.setFullscreen(false); - } - } - - @override - Future dispose() async { - final closeSession = closeSessionOnDispose.remove(widget.id) ?? true; - - // https://github.com/flutter/flutter/issues/64935 - super.dispose(); - debugPrint("REMOTE PAGE dispose session $sessionId ${widget.id}"); - - // Defensive cleanup: ensure host system-key propagation is reset even if - // MouseRegion.onExit never fired (e.g., tab closed while cursor inside). - if (!isWeb) bind.hostStopSystemKeyPropagate(stopped: true); - - _pointerLockCenterDebounceTimer?.cancel(); - _pointerLockCenterDebounceTimer = null; - // Clear callback reference to prevent memory leaks and stale references - _ffi.inputModel.onRelativeMouseModeDisabled = null; - // Relative mouse mode cleanup is centralized in FFI.close(closeSession: ...). - _ffi.textureModel.onRemotePageDispose(closeSession); - if (closeSession) { - // ensure we leave this session, this is a double check - _ffi.inputModel.enterOrLeave(false); - } - DesktopMultiWindow.removeListener(this); - _ffi.dialogManager.hideMobileActionsOverlay(); - _ffi.imageModel.disposeImage(); - _ffi.cursorModel.disposeImages(); - _rawKeyFocusNode.dispose(); - await _ffi.close(closeSession: closeSession); - _timer?.cancel(); - _ffi.dialogManager.dismissAll(); - if (closeSession) { - await SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, - overlays: SystemUiOverlay.values); - } - WakelockManager.disable(_uniqueKey); - await Get.delete(tag: widget.id); - removeSharedStates(widget.id); - } - - Widget emptyOverlay() => BlockableOverlay( - /// the Overlay key will be set with _blockableOverlayState in BlockableOverlay - /// see override build() in [BlockableOverlay] - state: _blockableOverlayState, - underlying: Container( - color: Colors.transparent, - ), - ); - - Widget buildBody(BuildContext context) { - remoteToolbar(BuildContext context) => RemoteToolbar( - id: widget.id, - ffi: _ffi, - state: widget.toolbarState, - onEnterOrLeaveImageSetter: (id, func) { - _instanceIdOnEnterOrLeaveImage4Toolbar = id; - _onEnterOrLeaveImage4Toolbar = func; - }, - onEnterOrLeaveImageCleaner: (id) { - // If _instanceIdOnEnterOrLeaveImage4Toolbar != id - // it means `_onEnterOrLeaveImage4Toolbar` is not set or it has been changed to another toolbar. - if (_instanceIdOnEnterOrLeaveImage4Toolbar == id) { - _instanceIdOnEnterOrLeaveImage4Toolbar = null; - _onEnterOrLeaveImage4Toolbar = null; - } - }, - setRemoteState: setState, - ); - - bodyWidget() { - return Stack( - children: [ - Container( - color: kColorCanvas, - child: RawKeyFocusScope( - focusNode: _rawKeyFocusNode, - onFocusChange: (bool imageFocused) { - debugPrint( - "onFocusChange(window active:${!_isWindowBlur}) $imageFocused"); - // See [onWindowBlur]. - if (isWindows) { - if (_isWindowBlur) { - imageFocused = false; - Future.delayed(Duration.zero, () { - _rawKeyFocusNode.unfocus(); - }); - } - if (imageFocused) { - _ffi.inputModel.enterOrLeave(true); - } else { - _ffi.inputModel.enterOrLeave(false); - } - } - }, - inputModel: _ffi.inputModel, - child: getBodyForDesktop(context))), - Stack( - children: [ - _ffi.ffiModel.pi.isSet.isTrue && - _ffi.ffiModel.waitForFirstImage.isTrue - ? emptyOverlay() - : () { - if (!_ffi.ffiModel.isPeerAndroid) { - return Offstage(); - } else { - return Obx(() => Offstage( - offstage: _ffi.dialogManager - .mobileActionsOverlayVisible.isFalse, - child: Overlay(initialEntries: [ - makeMobileActionsOverlayEntry( - () => _ffi.dialogManager - .setMobileActionsOverlayVisible(false), - ffi: _ffi, - ) - ]), - )); - } - }(), - // Use Overlay to enable rebuild every time on menu button click. - // Hide toolbar when relative mouse mode is active to prevent - // cursor from escaping to toolbar area. - Obx(() => _ffi.inputModel.relativeMouseMode.value - ? const Offstage() - : _ffi.ffiModel.pi.isSet.isTrue - ? Overlay(initialEntries: [ - OverlayEntry(builder: remoteToolbar) - ]) - : remoteToolbar(context)), - _ffi.ffiModel.pi.isSet.isFalse ? emptyOverlay() : Offstage(), - ], - ), - ], - ); - } - - return Scaffold( - backgroundColor: Theme.of(context).colorScheme.background, - body: Obx(() { - final imageReady = _ffi.ffiModel.pi.isSet.isTrue && - _ffi.ffiModel.waitForFirstImage.isFalse; - if (imageReady) { - // If the privacy mode(disable physical displays) is switched, - // we should not dismiss the dialog immediately. - if (DateTime.now().difference(togglePrivacyModeTime) > - const Duration(milliseconds: 3000)) { - // `dismissAll()` is to ensure that the state is clean. - // It's ok to call dismissAll() here. - _ffi.dialogManager.dismissAll(); - // Recreate the block state to refresh the state. - _blockableOverlayState = BlockableOverlayState(); - _blockableOverlayState.applyFfi(_ffi); - } - // Block the whole `bodyWidget()` when dialog shows. - return BlockableOverlay( - underlying: bodyWidget(), - state: _blockableOverlayState, - ); - } else { - // `_blockableOverlayState` is not recreated here. - // The toolbar's block state won't work properly when reconnecting, but that's okay. - return bodyWidget(); - } - }), - ); - } - - @override - Widget build(BuildContext context) { - super.build(context); - return WillPopScope( - onWillPop: () async { - clientClose(sessionId, _ffi); - return false; - }, - child: MultiProvider(providers: [ - ChangeNotifierProvider.value(value: _ffi.ffiModel), - ChangeNotifierProvider.value(value: _ffi.imageModel), - ChangeNotifierProvider.value(value: _ffi.cursorModel), - ChangeNotifierProvider.value(value: _ffi.canvasModel), - ChangeNotifierProvider.value(value: _ffi.recordingModel), - ], child: buildBody(context))); - } - - void enterView(PointerEnterEvent evt) { - _ffi.canvasModel.rearmEdgeScroll(); - - _cursorOverImage.value = true; - _firstEnterImage.value = true; - if (_onEnterOrLeaveImage4Toolbar != null) { - try { - _onEnterOrLeaveImage4Toolbar!(true); - } catch (e) { - // - } - } - - // See [onWindowBlur]. - if (!isWindows) { - if (!_rawKeyFocusNode.hasFocus) { - _rawKeyFocusNode.requestFocus(); - } - _ffi.inputModel.enterOrLeave(true); - } - } - - void leaveView(PointerExitEvent evt) { - _ffi.canvasModel.disableEdgeScroll(); - - if (_ffi.ffiModel.keyboard) { - _ffi.inputModel.tryMoveEdgeOnExit(evt.position); - } - - _cursorOverImage.value = false; - _firstEnterImage.value = false; - if (_onEnterOrLeaveImage4Toolbar != null) { - try { - _onEnterOrLeaveImage4Toolbar!(false); - } catch (e) { - // - } - } - - // See [onWindowBlur]. - if (!isWindows) { - _ffi.inputModel.enterOrLeave(false); - } - } - - Widget _buildRawTouchAndPointerRegion( - Widget child, - PointerEnterEventListener? onEnter, - PointerExitEventListener? onExit, - ) { - return RawTouchGestureDetectorRegion( - child: _buildRawPointerMouseRegion(child, onEnter, onExit), - ffi: _ffi, - ); - } - - Widget _buildRawPointerMouseRegion( - Widget child, - PointerEnterEventListener? onEnter, - PointerExitEventListener? onExit, - ) { - return RawPointerMouseRegion( - onEnter: onEnter, - onExit: onExit, - onPointerDown: (event) { - // A double check for blur status. - // Note: If there's an `onPointerDown` event is triggered, `_isWindowBlur` is expected being false. - // Sometimes the system does not send the necessary focus event to flutter. We should manually - // handle this inconsistent status by setting `_isWindowBlur` to false. So we can - // ensure the grab-key thread is running when our users are clicking the remote canvas. - if (_isWindowBlur) { - debugPrint( - "Unexpected status: onPointerDown is triggered while the remote window is in blur status"); - _isWindowBlur = false; - } - if (!_rawKeyFocusNode.hasFocus) { - _rawKeyFocusNode.requestFocus(); - } - }, - inputModel: _ffi.inputModel, - child: child, - ); - } - - Widget getBodyForDesktop(BuildContext context) { - var paints = [ - MouseRegion( - onEnter: (evt) { - if (!isWeb) bind.hostStopSystemKeyPropagate(stopped: false); - }, - onExit: (evt) { - if (!isWeb) bind.hostStopSystemKeyPropagate(stopped: true); - }, - child: _ViewStyleUpdater( - canvasModel: _ffi.canvasModel, - inputModel: _ffi.inputModel, - child: Builder(builder: (context) { - final peerDisplay = CurrentDisplayState.find(widget.id); - return Obx( - () => _ffi.ffiModel.pi.isSet.isFalse - ? Container(color: Colors.transparent) - : Obx(() { - _ffi.textureModel.updateCurrentDisplay(peerDisplay.value); - return ImagePaint( - id: widget.id, - zoomCursor: _zoomCursor, - cursorOverImage: _cursorOverImage, - keyboardEnabled: _keyboardEnabled, - remoteCursorMoved: _remoteCursorMoved, - listenerBuilder: (child) => - _buildRawTouchAndPointerRegion( - child, enterView, leaveView), - ffi: _ffi, - ); - }), - ); - }), - ), - ) - ]; - - if (!_ffi.canvasModel.cursorEmbedded) { - paints - .add(Obx(() => _showRemoteCursor.isFalse || _remoteCursorMoved.isFalse - ? Offstage() - : CursorPaint( - id: widget.id, - zoomCursor: _zoomCursor, - ))); - } - paints.add( - Positioned( - top: 10, - right: 10, - child: _buildRawTouchAndPointerRegion( - QualityMonitor(_ffi.qualityMonitorModel), null, null), - ), - ); - return Stack( - children: paints, - ); - } - - @override - bool get wantKeepAlive => true; -} - -/// A widget that tracks the view size and updates CanvasModel.updateViewStyle() -/// and InputModel.updateImageWidgetSize() only when size actually changes. -/// This avoids scheduling post-frame callbacks on every LayoutBuilder rebuild. -class _ViewStyleUpdater extends StatefulWidget { - final CanvasModel canvasModel; - final InputModel inputModel; - final Widget child; - - const _ViewStyleUpdater({ - Key? key, - required this.canvasModel, - required this.inputModel, - required this.child, - }) : super(key: key); - - @override - State<_ViewStyleUpdater> createState() => _ViewStyleUpdaterState(); -} - -class _ViewStyleUpdaterState extends State<_ViewStyleUpdater> { - Size? _lastSize; - bool _callbackScheduled = false; - - @override - Widget build(BuildContext context) { - return LayoutBuilder( - builder: (context, constraints) { - final maxWidth = constraints.maxWidth; - final maxHeight = constraints.maxHeight; - // Guard against infinite constraints (e.g., unconstrained ancestor). - if (!maxWidth.isFinite || !maxHeight.isFinite) { - return widget.child; - } - final newSize = Size(maxWidth, maxHeight); - if (_lastSize != newSize) { - _lastSize = newSize; - // Schedule the update for after the current frame to avoid setState during build. - // Use _callbackScheduled flag to prevent accumulating multiple callbacks - // when size changes rapidly before any callback executes. - if (!_callbackScheduled) { - _callbackScheduled = true; - SchedulerBinding.instance.addPostFrameCallback((_) { - _callbackScheduled = false; - final currentSize = _lastSize; - if (mounted && currentSize != null) { - widget.canvasModel.updateViewStyle(); - widget.inputModel.updateImageWidgetSize(currentSize); - } - }); - } - } - return widget.child; - }, - ); - } -} - -class ImagePaint extends StatefulWidget { - final FFI ffi; - final String id; - final RxBool zoomCursor; - final RxBool cursorOverImage; - final RxBool keyboardEnabled; - final RxBool remoteCursorMoved; - final Widget Function(Widget)? listenerBuilder; - - ImagePaint( - {Key? key, - required this.ffi, - required this.id, - required this.zoomCursor, - required this.cursorOverImage, - required this.keyboardEnabled, - required this.remoteCursorMoved, - this.listenerBuilder}) - : super(key: key); - - @override - State createState() => _ImagePaintState(); -} - -class _ImagePaintState extends State { - bool _lastRemoteCursorMoved = false; - - String get id => widget.id; - RxBool get zoomCursor => widget.zoomCursor; - RxBool get cursorOverImage => widget.cursorOverImage; - RxBool get keyboardEnabled => widget.keyboardEnabled; - RxBool get remoteCursorMoved => widget.remoteCursorMoved; - Widget Function(Widget)? get listenerBuilder => widget.listenerBuilder; - - @override - Widget build(BuildContext context) { - final m = Provider.of(context); - var c = Provider.of(context); - final s = c.scale; - - bool isViewAdaptive() => c.viewStyle.style == kRemoteViewStyleAdaptive; - bool isViewOriginal() => c.viewStyle.style == kRemoteViewStyleOriginal; - - mouseRegion({child}) => Obx(() { - double getCursorScale() { - var c = Provider.of(context); - var cursorScale = 1.0; - if (isWindows) { - // debug win10 - if (zoomCursor.value && isViewAdaptive()) { - cursorScale = s * c.devicePixelRatio; - } - } else { - if (zoomCursor.value || isViewOriginal()) { - cursorScale = s; - } - } - return cursorScale; - } - - return MouseRegion( - cursor: cursorOverImage.isTrue - ? c.cursorEmbedded - ? SystemMouseCursors.none - // Hide cursor when relative mouse mode is active - : widget.ffi.inputModel.relativeMouseMode.value - ? SystemMouseCursors.none - : keyboardEnabled.isTrue - ? (() { - if (remoteCursorMoved.isTrue) { - _lastRemoteCursorMoved = true; - return SystemMouseCursors.none; - } else { - if (_lastRemoteCursorMoved) { - _lastRemoteCursorMoved = false; - _firstEnterImage.value = true; - } - return _buildCustomCursor( - context, getCursorScale()); - } - }()) - : _buildDisabledCursor(context, getCursorScale()) - : MouseCursor.defer, - onHover: (evt) {}, - child: child); - }); - if (c.imageOverflow.isTrue && c.scrollStyle != ScrollStyle.scrollauto) { - final paintWidth = c.getDisplayWidth() * s; - final paintHeight = c.getDisplayHeight() * s; - final paintSize = Size(paintWidth, paintHeight); - final paintWidget = - m.useTextureRender || widget.ffi.ffiModel.pi.forceTextureRender - ? _BuildPaintTextureRender( - c, s, Offset.zero, paintSize, isViewOriginal()) - : _buildScrollbarNonTextureRender(m, paintSize, s); - return NotificationListener( - onNotification: (notification) { - c.updateScrollPercent(); - return false; - }, - child: mouseRegion( - child: Obx(() => _buildCrossScrollbarFromLayout( - context, - _buildListener(paintWidget), - c.size, - paintSize, - c.scrollHorizontal, - c.scrollVertical, - )), - )); - } else { - if (c.size.width > 0 && c.size.height > 0) { - final paintWidget = - m.useTextureRender || widget.ffi.ffiModel.pi.forceTextureRender - ? _BuildPaintTextureRender( - c, - s, - Offset( - isLinux ? c.x.toInt().toDouble() : c.x, - isLinux ? c.y.toInt().toDouble() : c.y, - ), - c.size, - isViewOriginal()) - : _buildScrollAutoNonTextureRender(m, c, s); - return mouseRegion(child: _buildListener(paintWidget)); - } else { - return Container(); - } - } - } - - Widget _buildScrollbarNonTextureRender( - ImageModel m, Size imageSize, double s) { - return CustomPaint( - size: imageSize, - painter: ImagePainter(image: m.image, x: 0, y: 0, scale: s), - ); - } - - Widget _buildScrollAutoNonTextureRender( - ImageModel m, CanvasModel c, double s) { - double sizeScale = s; - if (widget.ffi.ffiModel.isPeerLinux) { - final displays = widget.ffi.ffiModel.pi.getCurDisplays(); - if (displays.isNotEmpty) { - sizeScale = s / displays[0].scale; - } - } - return CustomPaint( - size: Size(c.size.width, c.size.height), - painter: ImagePainter( - image: m.image, - x: c.x / sizeScale, - y: c.y / sizeScale, - scale: sizeScale), - ); - } - - Widget _BuildPaintTextureRender( - CanvasModel c, double s, Offset offset, Size size, bool isViewOriginal) { - final ffiModel = c.parent.target!.ffiModel; - final displays = ffiModel.pi.getCurDisplays(); - final children = []; - final rect = ffiModel.rect; - if (rect == null) { - return Container(); - } - final isPeerLinux = ffiModel.isPeerLinux; - final curDisplay = ffiModel.pi.currentDisplay; - for (var i = 0; i < displays.length; i++) { - final textureId = widget.ffi.textureModel - .getTextureId(curDisplay == kAllDisplayValue ? i : curDisplay); - if (true) { - // both "textureId.value != -1" and "true" seems ok - final sizeScale = isPeerLinux ? s / displays[i].scale : s; - children.add(Positioned( - left: (displays[i].x - rect.left) * s + offset.dx, - top: (displays[i].y - rect.top) * s + offset.dy, - width: displays[i].width * sizeScale, - height: displays[i].height * sizeScale, - child: Obx(() => Texture( - textureId: textureId.value, - filterQuality: - isViewOriginal ? FilterQuality.none : FilterQuality.low, - )), - )); - } - } - return SizedBox( - width: size.width, - height: size.height, - child: Stack(children: children), - ); - } - - MouseCursor _buildCustomCursor(BuildContext context, double scale) { - final cursor = Provider.of(context); - final cache = cursor.cache ?? preDefaultCursor.cache; - return buildCursorOfCache(cursor, scale, cache); - } - - MouseCursor _buildDisabledCursor(BuildContext context, double scale) { - final cursor = Provider.of(context); - final cache = preForbiddenCursor.cache; - return buildCursorOfCache(cursor, scale, cache); - } - - Widget _buildCrossScrollbarFromLayout( - BuildContext context, - Widget child, - Size layoutSize, - Size size, - ScrollController horizontal, - ScrollController vertical, - ) { - var widget = child; - if (layoutSize.width < size.width) { - widget = ScrollConfiguration( - behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false), - child: SingleChildScrollView( - controller: horizontal, - scrollDirection: Axis.horizontal, - physics: cursorOverImage.isTrue - ? const NeverScrollableScrollPhysics() - : null, - child: widget, - ), - ); - } else { - widget = Row( - children: [ - Container( - width: ((layoutSize.width - size.width) ~/ 2).toDouble(), - ), - widget, - ], - ); - } - if (layoutSize.height < size.height) { - widget = ScrollConfiguration( - behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false), - child: SingleChildScrollView( - controller: vertical, - physics: cursorOverImage.isTrue - ? const NeverScrollableScrollPhysics() - : null, - child: widget, - ), - ); - } else { - widget = Column( - children: [ - Container( - height: ((layoutSize.height - size.height) ~/ 2).toDouble(), - ), - widget, - ], - ); - } - if (layoutSize.width < size.width) { - widget = RawScrollbar( - thickness: kScrollbarThickness, - thumbColor: Colors.grey, - controller: horizontal, - thumbVisibility: false, - trackVisibility: false, - notificationPredicate: layoutSize.height < size.height - ? (notification) => notification.depth == 1 - : defaultScrollNotificationPredicate, - child: widget, - ); - } - if (layoutSize.height < size.height) { - widget = RawScrollbar( - thickness: kScrollbarThickness, - thumbColor: Colors.grey, - controller: vertical, - thumbVisibility: false, - trackVisibility: false, - child: widget, - ); - } - - return Container( - child: widget, - width: layoutSize.width, - height: layoutSize.height, - ); - } - - Widget _buildListener(Widget child) { - if (listenerBuilder != null) { - return listenerBuilder!(child); - } else { - return child; - } - } -} - -class CursorPaint extends StatelessWidget { - final String id; - final RxBool zoomCursor; - - const CursorPaint({ - Key? key, - required this.id, - required this.zoomCursor, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - final m = Provider.of(context); - final c = Provider.of(context); - double hotx = m.hotx; - double hoty = m.hoty; - if (m.image == null) { - if (preDefaultCursor.image != null) { - hotx = preDefaultCursor.image!.width / 2; - hoty = preDefaultCursor.image!.height / 2; - } - } - - double cx = c.x; - double cy = c.y; - if (c.viewStyle.style == kRemoteViewStyleOriginal && - c.scrollStyle == ScrollStyle.scrollbar) { - final rect = c.parent.target!.ffiModel.rect; - if (rect == null) { - // unreachable! - debugPrint('unreachable! The displays rect is null.'); - return Container(); - } - if (cx < 0) { - final imageWidth = rect.width * c.scale; - cx = -imageWidth * c.scrollX; - } - if (cy < 0) { - final imageHeight = rect.height * c.scale; - cy = -imageHeight * c.scrollY; - } - } - - double x = (m.x - hotx) * c.scale + cx; - double y = (m.y - hoty) * c.scale + cy; - double scale = 1.0; - final isViewOriginal = c.viewStyle.style == kRemoteViewStyleOriginal; - if (zoomCursor.value || isViewOriginal) { - x = m.x - hotx + cx / c.scale; - y = m.y - hoty + cy / c.scale; - scale = c.scale; - } - - return CustomPaint( - painter: ImagePainter( - image: m.image ?? preDefaultCursor.image, - x: x, - y: y, - scale: scale, - ), - ); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/remote_tab_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/remote_tab_page.dart deleted file mode 100644 index ccd5935..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/remote_tab_page.dart +++ /dev/null @@ -1,624 +0,0 @@ -import 'dart:convert'; -import 'dart:async'; -import 'dart:ui' as ui; - -import 'package:desktop_multi_window/desktop_multi_window.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/common/shared_state.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/models/input_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:flutter_hbb/desktop/pages/remote_page.dart'; -import 'package:flutter_hbb/desktop/widgets/remote_toolbar.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/desktop/widgets/material_mod_popup_menu.dart' - as mod_menu; -import 'package:flutter_hbb/desktop/widgets/popup_menu.dart'; -import 'package:flutter_hbb/utils/multi_window_manager.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; -import 'package:bot_toast/bot_toast.dart'; - -import '../../common/widgets/dialog.dart'; -import '../../models/platform_model.dart'; - -class _MenuTheme { - static const Color blueColor = MyTheme.button; - // kMinInteractiveDimension - static const double height = 20.0; - static const double dividerHeight = 12.0; -} - -class ConnectionTabPage extends StatefulWidget { - final Map params; - - const ConnectionTabPage({Key? key, required this.params}) : super(key: key); - - @override - State createState() => _ConnectionTabPageState(params); -} - -class _ConnectionTabPageState extends State { - final tabController = - Get.put(DesktopTabController(tabType: DesktopTabType.remoteScreen)); - final contentKey = UniqueKey(); - static const IconData selectedIcon = Icons.desktop_windows_sharp; - static const IconData unselectedIcon = Icons.desktop_windows_outlined; - - String? peerId; - bool _isScreenRectSet = false; - int? _display; - - var connectionMap = RxList.empty(growable: true); - - _ConnectionTabPageState(Map params) { - RemoteCountState.init(); - peerId = params['id']; - final sessionId = params['session_id']; - final tabWindowId = params['tab_window_id']; - final display = params['display']; - final displays = params['displays']; - final screenRect = parseParamScreenRect(params); - _isScreenRectSet = screenRect != null; - _display = display as int?; - tryMoveToScreenAndSetFullscreen(screenRect); - if (peerId != null) { - ConnectionTypeState.init(peerId!); - tabController.onSelected = (id) { - final remotePage = tabController.widget(id); - if (remotePage is RemotePage) { - final ffi = remotePage.ffi; - bind.setCurSessionId(sessionId: ffi.sessionId); - } - WindowController.fromWindowId(params['windowId']) - .setTitle(getWindowNameWithId(id)); - UnreadChatCountState.find(id).value = 0; - }; - tabController.add(TabInfo( - key: peerId!, - label: peerId!, - selectedIcon: selectedIcon, - unselectedIcon: unselectedIcon, - onTabCloseButton: () async { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: peerId!, - tabController: tabController, - )) { - return; - } - tabController.closeBy(peerId!); - }, - page: RemotePage( - key: ValueKey(peerId), - id: peerId!, - sessionId: sessionId == null ? null : SessionID(sessionId), - tabWindowId: tabWindowId, - display: display, - displays: displays?.cast(), - password: params['password'], - toolbarState: ToolbarState(), - tabController: tabController, - switchUuid: params['switch_uuid'], - forceRelay: params['forceRelay'], - isSharedPassword: params['isSharedPassword'], - ), - )); - _update_remote_count(); - } - tabController.onRemoved = (_, id) => onRemoveId(id); - rustDeskWinManager.setMethodHandler(_remoteMethodHandler); - } - - @override - void initState() { - super.initState(); - - if (!_isScreenRectSet) { - Future.delayed(Duration.zero, () { - restoreWindowPosition( - WindowType.RemoteDesktop, - windowId: windowId(), - peerId: tabController.state.value.tabs.isEmpty - ? null - : tabController.state.value.tabs[0].key, - display: _display, - ); - }); - } - } - - @override - Widget build(BuildContext context) { - final child = Scaffold( - backgroundColor: Theme.of(context).colorScheme.background, - body: DesktopTab( - controller: tabController, - onWindowCloseButton: handleWindowCloseButton, - tail: Row( - mainAxisSize: MainAxisSize.min, - children: [ - _RelativeMouseModeHint(tabController: tabController), - const AddButton(), - ], - ), - selectedBorderColor: MyTheme.accent, - pageViewBuilder: (pageView) => pageView, - labelGetter: DesktopTab.tablabelGetter, - tabBuilder: (key, icon, label, themeConf) => Obx(() { - final connectionType = ConnectionTypeState.find(key); - if (!connectionType.isValid()) { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - icon, - label, - ], - ); - } else { - bool secure = - connectionType.secure.value == ConnectionType.strSecure; - bool direct = - connectionType.direct.value == ConnectionType.strDirect; - String msgConn = getConnectionText( - secure, direct, connectionType.stream_type.value); - var msgFingerprint = '${translate('Fingerprint')}:\n'; - var fingerprint = FingerprintState.find(key).value; - if (fingerprint.isEmpty) { - fingerprint = 'N/A'; - } - if (fingerprint.length > 5 * 8) { - var first = fingerprint.substring(0, 39); - var second = fingerprint.substring(40); - msgFingerprint += '$first\n$second'; - } else { - msgFingerprint += fingerprint; - } - - final tab = Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - icon, - Tooltip( - message: '$msgConn\n$msgFingerprint', - child: SvgPicture.asset( - 'assets/${connectionType.secure.value}${connectionType.direct.value}.svg', - width: themeConf.iconSize, - height: themeConf.iconSize, - ).paddingOnly(right: 5), - ), - label, - unreadMessageCountBuilder(UnreadChatCountState.find(key)) - .marginOnly(left: 4), - ], - ); - - return Listener( - onPointerDown: (e) { - if (e.kind != ui.PointerDeviceKind.mouse) { - return; - } - final remotePage = tabController.state.value.tabs - .firstWhere((tab) => tab.key == key) - .page as RemotePage; - if (remotePage.ffi.ffiModel.pi.isSet.isTrue && e.buttons == 2) { - showRightMenu( - (CancelFunc cancelFunc) { - return _tabMenuBuilder(key, cancelFunc); - }, - target: e.position, - ); - } - }, - child: tab, - ); - } - }), - ), - ); - final tabWidget = isLinux - ? buildVirtualWindowFrame(context, child) - : workaroundWindowBorder( - context, - Obx(() => Container( - decoration: BoxDecoration( - border: Border.all( - color: MyTheme.color(context).border!, - width: stateGlobal.windowBorderWidth.value), - ), - child: child, - ))); - return isMacOS || kUseCompatibleUiMode - ? tabWidget - : Obx(() => SubWindowDragToResizeArea( - key: contentKey, - child: tabWidget, - // Specially configured for a better resize area and remote control. - childPadding: kDragToResizeAreaPadding, - resizeEdgeSize: stateGlobal.resizeEdgeSize.value, - enableResizeEdges: subWindowManagerEnableResizeEdges, - windowId: stateGlobal.windowId, - )); - } - - // Note: Some dup code to ../widgets/remote_toolbar - Widget _tabMenuBuilder(String key, CancelFunc cancelFunc) { - final List> menu = []; - const EdgeInsets padding = EdgeInsets.only(left: 8.0, right: 5.0); - final remotePage = tabController.state.value.tabs - .firstWhere((tab) => tab.key == key) - .page as RemotePage; - final ffi = remotePage.ffi; - final pi = ffi.ffiModel.pi; - final perms = ffi.ffiModel.permissions; - final sessionId = ffi.sessionId; - final toolbarState = remotePage.toolbarState; - menu.addAll([ - MenuEntryButton( - childBuilder: (TextStyle? style) => Obx(() => Text( - translate( - toolbarState.hide.isTrue ? 'Show Toolbar' : 'Hide Toolbar'), - style: style, - )), - proc: () { - toolbarState.switchHide(sessionId); - cancelFunc(); - }, - padding: padding, - ), - ]); - - if (tabController.state.value.tabs.length > 1) { - final splitAction = MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Move tab to new window'), - style: style, - ), - proc: () async { - await DesktopMultiWindow.invokeMethod( - kMainWindowId, - kWindowEventMoveTabToNewWindow, - '${windowId()},$key,$sessionId,RemoteDesktop'); - cancelFunc(); - }, - padding: padding, - ); - menu.insert(1, splitAction); - } - - if (perms['restart'] != false && - (pi.platform == kPeerPlatformLinux || - pi.platform == kPeerPlatformWindows || - pi.platform == kPeerPlatformMacOS)) { - menu.add(MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Restart remote device'), - style: style, - ), - proc: () => showRestartRemoteDevice( - pi, peerId ?? '', sessionId, ffi.dialogManager), - padding: padding, - dismissOnClicked: true, - dismissCallback: cancelFunc, - )); - } - - if (perms['keyboard'] != false && !ffi.ffiModel.viewOnly) { - menu.add(RemoteMenuEntry.insertLock(sessionId, padding, - dismissFunc: cancelFunc)); - - if (pi.platform == kPeerPlatformLinux || pi.sasEnabled) { - menu.add(RemoteMenuEntry.insertCtrlAltDel(sessionId, padding, - dismissFunc: cancelFunc)); - } - } - - menu.addAll([ - MenuEntryDivider(), - MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Copy Fingerprint'), - style: style, - ), - proc: () => onCopyFingerprint(FingerprintState.find(key).value), - padding: padding, - dismissOnClicked: true, - dismissCallback: cancelFunc, - ), - MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Close'), - style: style, - ), - proc: () async { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: key, - tabController: tabController, - )) { - return; - } - tabController.closeBy(key); - cancelFunc(); - }, - padding: padding, - ) - ]); - - return mod_menu.PopupMenu( - items: menu - .map((entry) => entry.build( - context, - const MenuConfig( - commonColor: _MenuTheme.blueColor, - height: _MenuTheme.height, - dividerHeight: _MenuTheme.dividerHeight, - ))) - .expand((i) => i) - .toList(), - ); - } - - void onRemoveId(String id) async { - if (tabController.state.value.tabs.isEmpty) { - // Keep calling until the window status is hidden. - // - // Workaround for Windows: - // If you click other buttons and close in msgbox within a very short period of time, the close may fail. - // `await WindowController.fromWindowId(windowId()).close();`. - Future loopCloseWindow() async { - int c = 0; - final windowController = WindowController.fromWindowId(windowId()); - while (c < 20 && - tabController.state.value.tabs.isEmpty && - (!await windowController.isHidden())) { - await windowController.close(); - await Future.delayed(Duration(milliseconds: 100)); - c++; - } - } - - loopCloseWindow(); - } - ConnectionTypeState.delete(id); - // Clean up relative mouse mode state for this peer. - stateGlobal.relativeMouseModeState.remove(id); - _update_remote_count(); - } - - int windowId() { - return widget.params["windowId"]; - } - - Future handleWindowCloseButton() async { - final connLength = tabController.length; - if (connLength == 1) { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: tabController.state.value.tabs[0].key, - tabController: tabController, - )) { - return false; - } - } - if (connLength <= 1) { - tabController.clear(); - return true; - } else { - final bool res; - if (!option2bool(kOptionEnableConfirmClosingTabs, - bind.mainGetLocalOption(key: kOptionEnableConfirmClosingTabs))) { - res = true; - } else { - res = await closeConfirmDialog(); - } - if (res) { - tabController.clear(); - } - return res; - } - } - - _update_remote_count() => - RemoteCountState.find().value = tabController.length; - - Future _remoteMethodHandler(call, fromWindowId) async { - debugPrint( - "[Remote Page] call ${call.method} with args ${call.arguments} from window $fromWindowId"); - - dynamic returnValue; - // for simplify, just replace connectionId - if (call.method == kWindowEventNewRemoteDesktop) { - final args = jsonDecode(call.arguments); - final id = args['id']; - final switchUuid = args['switch_uuid']; - final sessionId = args['session_id']; - final tabWindowId = args['tab_window_id']; - final display = args['display']; - final displays = args['displays']; - final screenRect = parseParamScreenRect(args); - final prePeerCount = tabController.length; - Future.delayed(Duration.zero, () async { - if (stateGlobal.fullscreen.isTrue) { - await WindowController.fromWindowId(windowId()).setFullscreen(false); - stateGlobal.setFullscreen(false, procWnd: false); - } - await setNewConnectWindowFrame(windowId(), id!, prePeerCount, - WindowType.RemoteDesktop, display, screenRect); - Future.delayed(Duration(milliseconds: isWindows ? 100 : 0), () async { - await windowOnTop(windowId()); - }); - }); - ConnectionTypeState.init(id); - tabController.add(TabInfo( - key: id, - label: id, - selectedIcon: selectedIcon, - unselectedIcon: unselectedIcon, - onTabCloseButton: () async { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: id, - tabController: tabController, - )) { - return; - } - tabController.closeBy(id); - }, - page: RemotePage( - key: ValueKey(id), - id: id, - sessionId: sessionId == null ? null : SessionID(sessionId), - tabWindowId: tabWindowId, - display: display, - displays: displays?.cast(), - password: args['password'], - toolbarState: ToolbarState(), - tabController: tabController, - switchUuid: switchUuid, - forceRelay: args['forceRelay'], - isSharedPassword: args['isSharedPassword'], - ), - )); - } else if (call.method == kWindowDisableGrabKeyboard) { - // ??? - } else if (call.method == "onDestroy") { - tabController.clear(); - } else if (call.method == kWindowActionRebuild) { - reloadCurrentWindow(); - } else if (call.method == kWindowEventActiveSession) { - final jumpOk = tabController.jumpToByKey(call.arguments); - if (jumpOk) { - windowOnTop(windowId()); - } - return jumpOk; - } else if (call.method == kWindowEventActiveDisplaySession) { - final args = jsonDecode(call.arguments); - final id = args['id']; - final display = args['display']; - final jumpOk = tabController.jumpToByKeyAndDisplay(id, display); - if (jumpOk) { - windowOnTop(windowId()); - } - return jumpOk; - } else if (call.method == kWindowEventGetRemoteList) { - return tabController.state.value.tabs - .map((e) => e.key) - .toList() - .join(','); - } else if (call.method == kWindowEventGetSessionIdList) { - return tabController.state.value.tabs - .map((e) => '${e.key},${(e.page as RemotePage).ffi.sessionId}') - .toList() - .join(';'); - } else if (call.method == kWindowEventGetCachedSessionData) { - // Ready to show new window and close old tab. - final args = jsonDecode(call.arguments); - final id = args['id']; - final close = args['close']; - try { - final remotePage = tabController.state.value.tabs - .firstWhere((tab) => tab.key == id) - .page as RemotePage; - returnValue = remotePage.ffi.ffiModel.cachedPeerData.toString(); - } catch (e) { - debugPrint('Failed to get cached session data: $e'); - } - if (close && returnValue != null) { - closeSessionOnDispose[id] = false; - tabController.closeBy(id); - } - } else if (call.method == kWindowEventRemoteWindowCoords) { - final remotePage = - tabController.state.value.selectedTabInfo.page as RemotePage; - final ffi = remotePage.ffi; - final displayRect = ffi.ffiModel.displaysRect(); - if (displayRect != null) { - final wc = WindowController.fromWindowId(windowId()); - Rect? frame; - try { - frame = await wc.getFrame(); - } catch (e) { - debugPrint( - "Failed to get frame of window $windowId, it may be hidden"); - } - if (frame != null) { - ffi.cursorModel.moveLocal(0, 0); - final coords = RemoteWindowCoords( - frame, - CanvasCoords.fromCanvasModel(ffi.canvasModel), - CursorCoords.fromCursorModel(ffi.cursorModel), - displayRect); - returnValue = jsonEncode(coords.toJson()); - } - } - } else if (call.method == kWindowEventSetFullscreen) { - stateGlobal.setFullscreen(call.arguments == 'true'); - } - _update_remote_count(); - return returnValue; - } -} - -/// A widget that displays a hint in the tab bar when relative mouse mode is active. -/// This helps users remember how to exit relative mouse mode. -class _RelativeMouseModeHint extends StatelessWidget { - final DesktopTabController tabController; - - const _RelativeMouseModeHint({Key? key, required this.tabController}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return Obx(() { - // Check if there are any tabs - if (tabController.state.value.tabs.isEmpty) { - return const SizedBox.shrink(); - } - - // Get current selected tab's RemotePage - final selectedTabInfo = tabController.state.value.selectedTabInfo; - if (selectedTabInfo.page is! RemotePage) { - return const SizedBox.shrink(); - } - - final remotePage = selectedTabInfo.page as RemotePage; - final String peerId = remotePage.id; - - // Use global state to check relative mouse mode (synced from InputModel). - // This avoids timing issues with FFI registration. - final isRelativeMouseMode = - stateGlobal.relativeMouseModeState[peerId] ?? false; - - if (!isRelativeMouseMode) { - return const SizedBox.shrink(); - } - - return Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - margin: const EdgeInsets.only(right: 8), - decoration: BoxDecoration( - color: Colors.orange.withOpacity(0.2), - borderRadius: BorderRadius.circular(4), - border: Border.all(color: Colors.orange.withOpacity(0.5)), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - Icons.mouse, - size: 14, - color: Colors.orange[700], - ), - const SizedBox(width: 4), - Text( - translate( - 'rel-mouse-exit-{${isMacOS ? "Cmd+G" : "Ctrl+Alt"}}-tip'), - style: TextStyle( - fontSize: 11, - color: Colors.orange[700], - ), - ), - ], - ), - ); - }); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/server_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/server_page.dart deleted file mode 100644 index 7d48452..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/server_page.dart +++ /dev/null @@ -1,1415 +0,0 @@ -// original cm window in Sciter version. - -import 'dart:async'; -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common/widgets/audio_input.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/models/chat_model.dart'; -import 'package:flutter_hbb/models/cm_file_model.dart'; -import 'package:flutter_hbb/utils/platform_channel.dart'; -import 'package:get/get.dart'; -import 'package:percent_indicator/linear_percent_indicator.dart'; -import 'package:provider/provider.dart'; -import 'package:window_manager/window_manager.dart'; -import 'package:flutter_svg/flutter_svg.dart'; - -import '../../common.dart'; -import '../../common/widgets/chat_page.dart'; -import '../../models/file_model.dart'; -import '../../models/platform_model.dart'; -import '../../models/server_model.dart'; - -class DesktopServerPage extends StatefulWidget { - const DesktopServerPage({Key? key}) : super(key: key); - - @override - State createState() => _DesktopServerPageState(); -} - -class _DesktopServerPageState extends State - with WindowListener, AutomaticKeepAliveClientMixin { - final tabController = gFFI.serverModel.tabController; - - _DesktopServerPageState() { - gFFI.ffiModel.updateEventListener(gFFI.sessionId, ""); - Get.put(tabController); - tabController.onRemoved = (_, id) { - onRemoveId(id); - }; - } - - @override - void initState() { - windowManager.addListener(this); - super.initState(); - } - - @override - void dispose() { - windowManager.removeListener(this); - super.dispose(); - } - - @override - void onWindowClose() { - Future.wait([gFFI.serverModel.closeAll(), gFFI.close()]).then((_) { - if (isMacOS) { - RdPlatformChannel.instance.terminate(); - } else { - windowManager.setPreventClose(false); - windowManager.close(); - } - }); - super.onWindowClose(); - } - - void onRemoveId(String id) { - if (tabController.state.value.tabs.isEmpty) { - windowManager.close(); - } - } - - @override - Widget build(BuildContext context) { - super.build(context); - return MultiProvider( - providers: [ - ChangeNotifierProvider.value(value: gFFI.serverModel), - ChangeNotifierProvider.value(value: gFFI.chatModel), - ], - child: Consumer( - builder: (context, serverModel, child) { - final body = Scaffold( - backgroundColor: Theme.of(context).colorScheme.background, - body: ConnectionManager(), - ); - return isLinux - ? buildVirtualWindowFrame(context, body) - : workaroundWindowBorder( - context, - Container( - decoration: BoxDecoration( - border: - Border.all(color: MyTheme.color(context).border!)), - child: body, - )); - }, - ), - ); - } - - @override - bool get wantKeepAlive => true; -} - -class ConnectionManager extends StatefulWidget { - @override - State createState() => ConnectionManagerState(); -} - -class ConnectionManagerState extends State - with WidgetsBindingObserver { - final RxBool _controlPageBlock = false.obs; - final RxBool _sidePageBlock = false.obs; - - ConnectionManagerState() { - gFFI.serverModel.tabController.onSelected = (client_id_str) { - final client_id = int.tryParse(client_id_str); - if (client_id != null) { - final client = - gFFI.serverModel.clients.firstWhereOrNull((e) => e.id == client_id); - if (client != null) { - gFFI.chatModel.changeCurrentKey(MessageKey(client.peerId, client.id)); - if (client.unreadChatMessageCount.value > 0) { - WidgetsBinding.instance.addPostFrameCallback((_) { - client.unreadChatMessageCount.value = 0; - gFFI.chatModel.showChatPage(MessageKey(client.peerId, client.id)); - }); - } - windowManager.setTitle(getWindowNameWithId(client.peerId)); - gFFI.cmFileModel.updateCurrentClientId(client.id); - } - } - }; - gFFI.chatModel.isConnManager = true; - } - - @override - void didChangeAppLifecycleState(AppLifecycleState state) { - super.didChangeAppLifecycleState(state); - if (state == AppLifecycleState.resumed) { - if (!allowRemoteCMModification()) { - shouldBeBlocked(_controlPageBlock, null); - shouldBeBlocked(_sidePageBlock, null); - } - } - } - - @override - void initState() { - gFFI.serverModel.updateClientState(); - WidgetsBinding.instance.addObserver(this); - super.initState(); - } - - @override - void dispose() { - WidgetsBinding.instance.removeObserver(this); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final serverModel = Provider.of(context); - pointerHandler(PointerEvent e) { - if (serverModel.cmHiddenTimer != null) { - serverModel.cmHiddenTimer!.cancel(); - serverModel.cmHiddenTimer = null; - debugPrint("CM hidden timer has been canceled"); - } - } - - return serverModel.clients.isEmpty - ? Column( - children: [ - buildTitleBar(), - Expanded( - child: Center( - child: Text(translate("Waiting")), - ), - ), - ], - ) - : Listener( - onPointerDown: pointerHandler, - onPointerMove: pointerHandler, - child: DesktopTab( - showTitle: false, - showMaximize: false, - showMinimize: true, - showClose: true, - onWindowCloseButton: handleWindowCloseButton, - controller: serverModel.tabController, - selectedBorderColor: MyTheme.accent, - maxLabelWidth: 100, - tail: null, //buildScrollJumper(), - tabBuilder: (key, icon, label, themeConf) { - final client = serverModel.clients - .firstWhereOrNull((client) => client.id.toString() == key); - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Tooltip( - message: key, - waitDuration: Duration(seconds: 1), - child: label), - unreadMessageCountBuilder(client?.unreadChatMessageCount) - .marginOnly(left: 4), - ], - ); - }, - pageViewBuilder: (pageView) => LayoutBuilder( - builder: (context, constrains) { - var borderWidth = 0.0; - if (constrains.maxWidth > - kConnectionManagerWindowSizeClosedChat.width) { - borderWidth = kConnectionManagerWindowSizeOpenChat.width - - constrains.maxWidth; - } else { - borderWidth = kConnectionManagerWindowSizeClosedChat.width - - constrains.maxWidth; - } - if (borderWidth < 0 || borderWidth > 50) { - borderWidth = 0; - } - final realClosedWidth = - kConnectionManagerWindowSizeClosedChat.width - - borderWidth; - final realChatPageWidth = - constrains.maxWidth - realClosedWidth; - final row = Row(children: [ - if (constrains.maxWidth > - kConnectionManagerWindowSizeClosedChat.width) - Consumer( - builder: (_, model, child) => SizedBox( - width: realChatPageWidth, - child: allowRemoteCMModification() - ? buildSidePage() - : buildRemoteBlock( - child: buildSidePage(), - block: _sidePageBlock, - mask: true), - )), - SizedBox( - width: realClosedWidth, - child: SizedBox( - width: realClosedWidth, - child: allowRemoteCMModification() - ? pageView - : buildRemoteBlock( - child: _buildKeyEventBlock(pageView), - block: _controlPageBlock, - mask: false, - ))), - ]); - return Container( - color: Theme.of(context).scaffoldBackgroundColor, - child: row, - ); - }, - ), - ), - ); - } - - Widget buildSidePage() { - final selected = gFFI.serverModel.tabController.state.value.selected; - if (selected < 0 || selected >= gFFI.serverModel.clients.length) { - return Offstage(); - } - final clientType = gFFI.serverModel.clients[selected].type_(); - if (clientType == ClientType.file) { - return _FileTransferLogPage(); - } else { - return ChatPage(type: ChatPageType.desktopCM); - } - } - - Widget _buildKeyEventBlock(Widget child) { - return ExcludeFocus(child: child, excluding: true); - } - - Widget buildTitleBar() { - return SizedBox( - height: kDesktopRemoteTabBarHeight, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const _AppIcon(), - Expanded( - child: GestureDetector( - onPanStart: (d) { - windowManager.startDragging(); - }, - child: Container( - color: Theme.of(context).colorScheme.background, - ), - ), - ), - const SizedBox( - width: 4.0, - ), - const _CloseButton() - ], - ), - ); - } - - Widget buildScrollJumper() { - final offstage = gFFI.serverModel.clients.length < 2; - final sc = gFFI.serverModel.tabController.state.value.scrollController; - return Offstage( - offstage: offstage, - child: Row( - children: [ - ActionIcon( - icon: Icons.arrow_left, iconSize: 22, onTap: sc.backward), - ActionIcon( - icon: Icons.arrow_right, iconSize: 22, onTap: sc.forward), - ], - )); - } - - Future handleWindowCloseButton() async { - var tabController = gFFI.serverModel.tabController; - final connLength = tabController.length; - if (connLength <= 1) { - windowManager.close(); - return true; - } else { - final bool res; - if (!option2bool(kOptionEnableConfirmClosingTabs, - bind.mainGetLocalOption(key: kOptionEnableConfirmClosingTabs))) { - res = true; - } else { - res = await closeConfirmDialog(); - } - if (res) { - windowManager.close(); - } - return res; - } - } -} - -Widget buildConnectionCard(Client client) { - return Consumer( - builder: (context, value, child) => Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - key: ValueKey(client.id), - children: [ - _CmHeader(client: client), - client.type_() == ClientType.file || - client.type_() == ClientType.portForward || - client.type_() == ClientType.terminal || - client.disconnected - ? Offstage() - : _PrivilegeBoard(client: client), - Expanded( - child: Align( - alignment: Alignment.bottomCenter, - child: _CmControlPanel(client: client), - ), - ) - ], - ).paddingSymmetric(vertical: 4.0, horizontal: 8.0), - ); -} - -class _AppIcon extends StatelessWidget { - const _AppIcon({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - margin: EdgeInsets.symmetric(horizontal: 4.0), - child: loadIcon(30), - ); - } -} - -class _CloseButton extends StatelessWidget { - const _CloseButton({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return IconButton( - onPressed: () { - windowManager.close(); - }, - icon: const Icon( - IconFont.close, - size: 18, - ), - splashColor: Colors.transparent, - hoverColor: Colors.transparent, - ); - } -} - -class _CmHeader extends StatefulWidget { - final Client client; - - const _CmHeader({Key? key, required this.client}) : super(key: key); - - @override - State<_CmHeader> createState() => _CmHeaderState(); -} - -class _CmHeaderState extends State<_CmHeader> - with AutomaticKeepAliveClientMixin { - Client get client => widget.client; - - final _time = 0.obs; - Timer? _timer; - - @override - void initState() { - super.initState(); - _timer = Timer.periodic(Duration(seconds: 1), (_) { - if (client.authorized && !client.disconnected) { - _time.value = _time.value + 1; - } - }); - // Call onSelected in post frame callback, since we cannot guarantee that the callback will not call setState. - WidgetsBinding.instance.addPostFrameCallback((_) { - gFFI.serverModel.tabController.onSelected?.call(client.id.toString()); - }); - } - - @override - void dispose() { - _timer?.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - super.build(context); - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.0), - gradient: LinearGradient( - begin: Alignment.topRight, - end: Alignment.bottomLeft, - colors: [ - Color(0xff00bfe1), - Color(0xff0071ff), - ], - ), - ), - margin: EdgeInsets.symmetric(horizontal: 5.0, vertical: 10.0), - padding: EdgeInsets.only( - top: 10.0, - bottom: 10.0, - left: 10.0, - right: 5.0, - ), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildClientAvatar().marginOnly(right: 10.0), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - FittedBox( - child: Text( - client.name, - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 20, - overflow: TextOverflow.ellipsis, - ), - maxLines: 1, - )), - FittedBox( - child: Text( - "(${client.peerId})", - style: TextStyle(color: Colors.white, fontSize: 14), - ), - ), - if (client.type_() == ClientType.terminal) - FittedBox( - child: Text( - translate("Terminal"), - style: TextStyle(color: Colors.white70, fontSize: 12), - ), - ), - if (client.type_() == ClientType.file) - FittedBox( - child: Text( - translate("File Transfer"), - style: TextStyle(color: Colors.white70, fontSize: 12), - ), - ), - if (client.type_() == ClientType.camera) - FittedBox( - child: Text( - translate("View Camera"), - style: TextStyle(color: Colors.white70, fontSize: 12), - ), - ), - if (client.portForward.isNotEmpty) - FittedBox( - child: Text( - "Port Forward: ${client.portForward}", - style: TextStyle(color: Colors.white70, fontSize: 12), - ), - ), - SizedBox(height: 10.0), - FittedBox( - child: Row( - children: [ - Text( - client.authorized - ? client.disconnected - ? translate("Disconnected") - : translate("Connected") - : "${translate("Request access to your device")}...", - style: TextStyle(color: Colors.white), - ).marginOnly(right: 8.0), - if (client.authorized) - Obx( - () => Text( - formatDurationToTime( - Duration(seconds: _time.value), - ), - style: TextStyle(color: Colors.white), - ), - ) - ], - )) - ], - ), - ), - Offstage( - offstage: !client.authorized || - (client.type_() != ClientType.remote && - client.type_() != ClientType.file && - client.type_() != ClientType.camera), - child: IconButton( - onPressed: () => checkClickTime(client.id, () { - if (client.type_() == ClientType.file) { - gFFI.chatModel.toggleCMFilePage(); - } else { - gFFI.chatModel - .toggleCMChatPage(MessageKey(client.peerId, client.id)); - } - }), - icon: SvgPicture.asset(client.type_() == ClientType.file - ? 'assets/file_transfer.svg' - : 'assets/chat2.svg'), - splashRadius: kDesktopIconButtonSplashRadius, - ), - ) - ], - ), - ); - } - - @override - bool get wantKeepAlive => true; - - Widget _buildClientAvatar() { - return buildAvatarWidget( - avatar: client.avatar, - size: 70, - borderRadius: 15, - fallback: _buildInitialAvatar(), - ) ?? - _buildInitialAvatar(); - } - - Widget _buildInitialAvatar() { - return Container( - width: 70, - height: 70, - alignment: Alignment.center, - decoration: BoxDecoration( - color: str2color(client.name), - borderRadius: BorderRadius.circular(15.0), - ), - child: Text( - client.name.isNotEmpty ? client.name[0] : '?', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.white, - fontSize: 55, - ), - ), - ); - } -} - -class _PrivilegeBoard extends StatefulWidget { - final Client client; - - const _PrivilegeBoard({Key? key, required this.client}) : super(key: key); - - @override - State createState() => _PrivilegeBoardState(); -} - -class _PrivilegeBoardState extends State<_PrivilegeBoard> { - late final client = widget.client; - Widget buildPermissionIcon(bool enabled, IconData iconData, - Function(bool)? onTap, String tooltipText) { - return Tooltip( - message: "$tooltipText: ${enabled ? "ON" : "OFF"}", - waitDuration: Duration.zero, - child: Container( - decoration: BoxDecoration( - color: enabled ? MyTheme.accent : Colors.grey[700], - borderRadius: BorderRadius.circular(10.0), - ), - padding: EdgeInsets.all(8.0), - child: InkWell( - onTap: () => - checkClickTime(widget.client.id, () => onTap?.call(!enabled)), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Expanded( - child: Icon( - iconData, - color: Colors.white, - ), - ), - ], - ), - ), - ), - ); - } - - @override - Widget build(BuildContext context) { - final crossAxisCount = 4; - final spacing = 10.0; - return Container( - width: double.infinity, - height: 160.0, - margin: EdgeInsets.all(5.0), - padding: EdgeInsets.all(5.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.0), - color: Theme.of(context).colorScheme.background, - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.2), - spreadRadius: 1, - blurRadius: 1, - offset: Offset(0, 1.5), - ), - ], - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - translate("Permissions"), - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - textAlign: TextAlign.center, - ).marginOnly(left: 4.0, bottom: 8.0), - Expanded( - child: GridView.count( - crossAxisCount: crossAxisCount, - padding: EdgeInsets.symmetric(horizontal: spacing), - mainAxisSpacing: spacing, - crossAxisSpacing: spacing, - children: client.type_() == ClientType.camera - ? [ - buildPermissionIcon( - client.audio, - Icons.volume_up_rounded, - (enabled) { - bind.cmSwitchPermission( - connId: client.id, - name: "audio", - enabled: enabled); - setState(() { - client.audio = enabled; - }); - }, - translate('Enable audio'), - ), - buildPermissionIcon( - client.recording, - Icons.videocam_rounded, - (enabled) { - bind.cmSwitchPermission( - connId: client.id, - name: "recording", - enabled: enabled); - setState(() { - client.recording = enabled; - }); - }, - translate('Enable recording session'), - ), - ] - : [ - buildPermissionIcon( - client.keyboard, - Icons.keyboard, - (enabled) { - bind.cmSwitchPermission( - connId: client.id, - name: "keyboard", - enabled: enabled); - setState(() { - client.keyboard = enabled; - }); - }, - translate('Enable keyboard/mouse'), - ), - buildPermissionIcon( - client.clipboard, - Icons.assignment_rounded, - (enabled) { - bind.cmSwitchPermission( - connId: client.id, - name: "clipboard", - enabled: enabled); - setState(() { - client.clipboard = enabled; - }); - }, - translate('Enable clipboard'), - ), - buildPermissionIcon( - client.audio, - Icons.volume_up_rounded, - (enabled) { - bind.cmSwitchPermission( - connId: client.id, - name: "audio", - enabled: enabled); - setState(() { - client.audio = enabled; - }); - }, - translate('Enable audio'), - ), - buildPermissionIcon( - client.file, - Icons.upload_file_rounded, - (enabled) { - bind.cmSwitchPermission( - connId: client.id, - name: "file", - enabled: enabled); - setState(() { - client.file = enabled; - }); - }, - translate('Enable file copy and paste'), - ), - buildPermissionIcon( - client.restart, - Icons.restart_alt_rounded, - (enabled) { - bind.cmSwitchPermission( - connId: client.id, - name: "restart", - enabled: enabled); - setState(() { - client.restart = enabled; - }); - }, - translate('Enable remote restart'), - ), - buildPermissionIcon( - client.recording, - Icons.videocam_rounded, - (enabled) { - bind.cmSwitchPermission( - connId: client.id, - name: "recording", - enabled: enabled); - setState(() { - client.recording = enabled; - }); - }, - translate('Enable recording session'), - ), - // only windows support block input - if (isWindows) - buildPermissionIcon( - client.blockInput, - Icons.block, - (enabled) { - bind.cmSwitchPermission( - connId: client.id, - name: "block_input", - enabled: enabled); - setState(() { - client.blockInput = enabled; - }); - }, - translate('Enable blocking user input'), - ) - ], - ), - ), - ], - ), - ); - } -} - -const double buttonBottomMargin = 8; - -class _CmControlPanel extends StatelessWidget { - final Client client; - - const _CmControlPanel({Key? key, required this.client}) : super(key: key); - - @override - Widget build(BuildContext context) { - return client.authorized - ? client.disconnected - ? buildDisconnected(context) - : buildAuthorized(context) - : buildUnAuthorized(context); - } - - buildAuthorized(BuildContext context) { - final bool canElevate = bind.cmCanElevate(); - final model = Provider.of(context); - final showElevation = canElevate && - model.showElevation && - client.type_() == ClientType.remote; - return Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Offstage( - offstage: !client.inVoiceCall, - child: Row( - children: [ - Expanded( - child: buildButton(context, - color: MyTheme.accent, - onClick: null, onTapDown: (details) async { - final devicesInfo = - await AudioInput.getDevicesInfo(true, true); - List devices = devicesInfo['devices'] as List; - if (devices.isEmpty) { - msgBox( - gFFI.sessionId, - 'custom-nocancel-info', - 'Prompt', - 'no_audio_input_device_tip', - '', - gFFI.dialogManager, - ); - return; - } - - String currentDevice = devicesInfo['current'] as String; - final x = details.globalPosition.dx; - final y = details.globalPosition.dy; - final position = RelativeRect.fromLTRB(x, y, x, y); - showMenu( - context: context, - position: position, - items: devices - .map((d) => PopupMenuItem( - value: d, - height: 18, - padding: EdgeInsets.zero, - onTap: () => AudioInput.setDevice(d, true, true), - child: IgnorePointer( - child: RadioMenuButton( - value: d, - groupValue: currentDevice, - onChanged: (v) { - if (v != null) - AudioInput.setDevice(v, true, true); - }, - child: Container( - child: Text( - d, - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - constraints: BoxConstraints( - maxWidth: - kConnectionManagerWindowSizeClosedChat - .width - - 80), - ), - )), - )) - .toList(), - ); - }, - icon: Icon( - Icons.call_rounded, - color: Colors.white, - size: 14, - ), - text: "Audio input", - textColor: Colors.white), - ), - Expanded( - child: buildButton( - context, - color: Colors.red, - onClick: () => closeVoiceCall(), - icon: Icon( - Icons.call_end_rounded, - color: Colors.white, - size: 14, - ), - text: "Stop voice call", - textColor: Colors.white, - ), - ) - ], - ), - ), - Offstage( - offstage: !client.incomingVoiceCall, - child: Row( - children: [ - Expanded( - child: buildButton(context, - color: MyTheme.accent, - onClick: () => handleVoiceCall(true), - icon: Icon( - Icons.call_rounded, - color: Colors.white, - size: 14, - ), - text: "Accept", - textColor: Colors.white), - ), - Expanded( - child: buildButton( - context, - color: Colors.red, - onClick: () => handleVoiceCall(false), - icon: Icon( - Icons.phone_disabled_rounded, - color: Colors.white, - size: 14, - ), - text: "Dismiss", - textColor: Colors.white, - ), - ) - ], - ), - ), - Offstage( - offstage: !client.fromSwitch, - child: buildButton(context, - color: Colors.purple, - onClick: () => handleSwitchBack(context), - icon: Icon(Icons.reply, color: Colors.white), - text: "Switch Sides", - textColor: Colors.white), - ), - Offstage( - offstage: !showElevation, - child: buildButton( - context, - color: MyTheme.accent, - onClick: () { - handleElevate(context); - windowManager.minimize(); - }, - icon: Icon( - Icons.security_rounded, - color: Colors.white, - size: 14, - ), - text: 'Elevate', - textColor: Colors.white, - ), - ), - Row( - children: [ - Expanded( - child: buildButton(context, - color: Colors.redAccent, - onClick: handleDisconnect, - text: 'Disconnect', - icon: Icon( - Icons.link_off_rounded, - color: Colors.white, - size: 14, - ), - textColor: Colors.white), - ), - ], - ) - ], - ).marginOnly(bottom: buttonBottomMargin); - } - - buildDisconnected(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: buildButton(context, - color: MyTheme.accent, - onClick: handleClose, - text: 'Close', - textColor: Colors.white)), - ], - ).marginOnly(bottom: buttonBottomMargin); - } - - buildUnAuthorized(BuildContext context) { - final bool canElevate = bind.cmCanElevate(); - final model = Provider.of(context); - final showElevation = canElevate && - model.showElevation && - client.type_() == ClientType.remote; - final showAccept = model.approveMode != 'password'; - return Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Offstage( - offstage: !showElevation || !showAccept, - child: buildButton(context, color: Colors.green[700], onClick: () { - handleAccept(context); - handleElevate(context); - windowManager.minimize(); - }, - text: 'Accept and Elevate', - icon: Icon( - Icons.security_rounded, - color: Colors.white, - size: 14, - ), - textColor: Colors.white, - tooltip: 'accept_and_elevate_btn_tooltip'), - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - if (showAccept) - Expanded( - child: Column( - children: [ - buildButton( - context, - color: MyTheme.accent, - onClick: () { - handleAccept(context); - windowManager.minimize(); - }, - text: 'Accept', - textColor: Colors.white, - ), - ], - ), - ), - Expanded( - child: buildButton( - context, - color: Colors.transparent, - border: Border.all(color: Colors.grey), - onClick: handleDisconnect, - text: 'Cancel', - textColor: null, - ), - ), - ], - ), - ], - ).marginOnly(bottom: buttonBottomMargin); - } - - Widget buildButton(BuildContext context, - {required Color? color, - GestureTapCallback? onClick, - Widget? icon, - BoxBorder? border, - required String text, - required Color? textColor, - String? tooltip, - GestureTapDownCallback? onTapDown}) { - assert(!(onClick == null && onTapDown == null)); - Widget textWidget; - if (icon != null) { - textWidget = Text( - translate(text), - style: TextStyle(color: textColor), - textAlign: TextAlign.center, - ); - } else { - textWidget = Expanded( - child: Text( - translate(text), - style: TextStyle(color: textColor), - textAlign: TextAlign.center, - ), - ); - } - final borderRadius = BorderRadius.circular(10.0); - final btn = Container( - height: 28, - decoration: BoxDecoration( - color: color, borderRadius: borderRadius, border: border), - child: InkWell( - borderRadius: borderRadius, - onTap: () { - if (onClick == null) return; - checkClickTime(client.id, onClick); - }, - onTapDown: (details) { - if (onTapDown == null) return; - checkClickTime(client.id, () { - onTapDown.call(details); - }); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Offstage(offstage: icon == null, child: icon).marginOnly(right: 5), - textWidget, - ], - ), - ), - ); - return (tooltip != null - ? Tooltip( - message: translate(tooltip), - child: btn, - ) - : btn) - .marginAll(4); - } - - void handleDisconnect() { - bind.cmCloseConnection(connId: client.id); - } - - void handleAccept(BuildContext context) { - final model = Provider.of(context, listen: false); - model.sendLoginResponse(client, true); - } - - void handleElevate(BuildContext context) { - final model = Provider.of(context, listen: false); - model.setShowElevation(false); - bind.cmElevatePortable(connId: client.id); - } - - void handleClose() async { - await bind.cmRemoveDisconnectedConnection(connId: client.id); - if (await bind.cmGetClientsLength() == 0) { - windowManager.close(); - } - } - - void handleSwitchBack(BuildContext context) { - bind.cmSwitchBack(connId: client.id); - } - - void handleVoiceCall(bool accept) { - bind.cmHandleIncomingVoiceCall(id: client.id, accept: accept); - } - - void closeVoiceCall() { - bind.cmCloseVoiceCall(id: client.id); - } -} - -void checkClickTime(int id, Function() callback) async { - if (allowRemoteCMModification()) { - callback(); - return; - } - var clickCallbackTime = DateTime.now().millisecondsSinceEpoch; - await bind.cmCheckClickTime(connId: id); - Timer(const Duration(milliseconds: 120), () async { - var d = clickCallbackTime - await bind.cmGetClickTime(); - if (d > 120) callback(); - }); -} - -bool allowRemoteCMModification() { - return option2bool(kOptionAllowRemoteCmModification, - bind.mainGetLocalOption(key: kOptionAllowRemoteCmModification)); -} - -class _FileTransferLogPage extends StatefulWidget { - _FileTransferLogPage({Key? key}) : super(key: key); - - @override - State<_FileTransferLogPage> createState() => __FileTransferLogPageState(); -} - -class __FileTransferLogPageState extends State<_FileTransferLogPage> { - @override - Widget build(BuildContext context) { - return statusList(); - } - - Widget generateCard(Widget child) { - return Container( - decoration: BoxDecoration( - color: Theme.of(context).cardColor, - borderRadius: BorderRadius.all( - Radius.circular(15.0), - ), - ), - child: child, - ); - } - - iconLabel(CmFileLog item) { - switch (item.action) { - case CmFileAction.none: - return Container(); - case CmFileAction.localToRemote: - case CmFileAction.remoteToLocal: - return Column( - children: [ - Transform.rotate( - angle: item.action == CmFileAction.remoteToLocal ? 0 : pi, - child: SvgPicture.asset( - "assets/arrow.svg", - colorFilter: svgColor(Theme.of(context).tabBarTheme.labelColor), - ), - ), - Text(item.action == CmFileAction.remoteToLocal - ? translate('Send') - : translate('Receive')) - ], - ); - case CmFileAction.remove: - return Column( - children: [ - Icon( - Icons.delete, - color: Theme.of(context).tabBarTheme.labelColor, - ), - Text(translate('Delete')) - ], - ); - case CmFileAction.createDir: - return Column( - children: [ - Icon( - Icons.create_new_folder, - color: Theme.of(context).tabBarTheme.labelColor, - ), - Text(translate('Create Folder')) - ], - ); - case CmFileAction.rename: - return Column( - children: [ - Icon( - Icons.drive_file_move_outlined, - color: Theme.of(context).tabBarTheme.labelColor, - ), - Text(translate('Rename')) - ], - ); - } - } - - Widget statusList() { - return PreferredSize( - preferredSize: const Size(200, double.infinity), - child: Container( - padding: const EdgeInsets.all(12.0), - child: Obx( - () { - final jobTable = gFFI.cmFileModel.currentJobTable; - statusListView(List jobs) => ListView.builder( - controller: ScrollController(), - itemBuilder: (BuildContext context, int index) { - final item = jobs[index]; - return Padding( - padding: const EdgeInsets.only(bottom: 5), - child: generateCard( - Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - width: 50, - child: iconLabel(item), - ).paddingOnly(left: 15), - const SizedBox( - width: 16.0, - ), - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - item.fileName, - ).paddingSymmetric(vertical: 10), - if (item.totalSize > 0) - Text( - '${translate("Total")} ${readableFileSize(item.totalSize.toDouble())}', - style: TextStyle( - fontSize: 12, - color: MyTheme.darkGray, - ), - ), - if (item.totalSize > 0) - Offstage( - offstage: item.state != - JobState.inProgress, - child: Text( - '${translate("Speed")} ${readableFileSize(item.speed)}/s', - style: TextStyle( - fontSize: 12, - color: MyTheme.darkGray, - ), - ), - ), - Offstage( - offstage: !(item.isTransfer() && - item.state != - JobState.inProgress), - child: Text( - translate( - item.display(), - ), - style: TextStyle( - fontSize: 12, - color: MyTheme.darkGray, - ), - ), - ), - if (item.totalSize > 0) - Offstage( - offstage: item.state != - JobState.inProgress, - child: LinearPercentIndicator( - padding: - EdgeInsets.only(right: 15), - animateFromLastPercent: true, - center: Text( - '${(item.finishedSize / item.totalSize * 100).toStringAsFixed(0)}%', - ), - barRadius: Radius.circular(15), - percent: item.finishedSize / - item.totalSize, - progressColor: MyTheme.accent, - backgroundColor: - Theme.of(context).hoverColor, - lineHeight: - kDesktopFileTransferRowHeight, - ).paddingSymmetric(vertical: 15), - ), - ], - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [], - ), - ], - ), - ], - ).paddingSymmetric(vertical: 10), - ), - ); - }, - itemCount: jobTable.length, - ); - - return jobTable.isEmpty - ? generateCard( - Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset( - "assets/transfer.svg", - colorFilter: svgColor( - Theme.of(context).tabBarTheme.labelColor), - height: 40, - ).paddingOnly(bottom: 10), - Text( - translate("No transfers in progress"), - textAlign: TextAlign.center, - textScaler: TextScaler.linear(1.20), - style: TextStyle( - color: - Theme.of(context).tabBarTheme.labelColor), - ), - ], - ), - ), - ) - : statusListView(jobTable); - }, - )), - ); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_connection_manager.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_connection_manager.dart deleted file mode 100644 index 91b8baa..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_connection_manager.dart +++ /dev/null @@ -1,98 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:get/get.dart'; -import '../../models/model.dart'; - -/// Manages terminal connections to ensure one FFI instance per peer -class TerminalConnectionManager { - static final Map _connections = {}; - static final Map _connectionRefCount = {}; - - // Track service IDs per peer - static final Map _serviceIds = {}; - - /// Get or create an FFI instance for a peer - static FFI getConnection({ - required String peerId, - required String? password, - required bool? isSharedPassword, - required bool? forceRelay, - required String? connToken, - }) { - final existingFfi = _connections[peerId]; - if (existingFfi != null && !existingFfi.closed) { - // Increment reference count - _connectionRefCount[peerId] = (_connectionRefCount[peerId] ?? 0) + 1; - debugPrint('[TerminalConnectionManager] Reusing existing connection for peer $peerId. Reference count: ${_connectionRefCount[peerId]}'); - return existingFfi; - } - - // Create new FFI instance for first terminal - debugPrint('[TerminalConnectionManager] Creating new terminal connection for peer $peerId'); - final ffi = FFI(null); - ffi.start( - peerId, - password: password, - isSharedPassword: isSharedPassword, - forceRelay: forceRelay, - connToken: connToken, - isTerminal: true, - ); - - _connections[peerId] = ffi; - _connectionRefCount[peerId] = 1; - - // Register the FFI instance with Get for dependency injection - Get.put(ffi, tag: 'terminal_$peerId'); - - debugPrint('[TerminalConnectionManager] New connection created. Total connections: ${_connections.length}'); - return ffi; - } - - /// Release a connection reference - static void releaseConnection(String peerId) { - final refCount = _connectionRefCount[peerId] ?? 0; - debugPrint('[TerminalConnectionManager] Releasing connection for peer $peerId. Current ref count: $refCount'); - - if (refCount <= 1) { - // Last reference, close the connection - final ffi = _connections[peerId]; - if (ffi != null) { - debugPrint('[TerminalConnectionManager] Closing connection for peer $peerId (last reference)'); - ffi.close(); - _connections.remove(peerId); - _connectionRefCount.remove(peerId); - Get.delete(tag: 'terminal_$peerId'); - } - } else { - // Decrement reference count - _connectionRefCount[peerId] = refCount - 1; - debugPrint('[TerminalConnectionManager] Connection still in use. New ref count: ${_connectionRefCount[peerId]}'); - } - } - - /// Check if a connection exists for a peer - static bool hasConnection(String peerId) { - final ffi = _connections[peerId]; - return ffi != null && !ffi.closed; - } - - /// Get existing connection without creating new one - static FFI? getExistingConnection(String peerId) { - return _connections[peerId]; - } - - /// Get connection count for debugging - static int getConnectionCount() => _connections.length; - - /// Get terminal count for a peer - static int getTerminalCount(String peerId) => _connectionRefCount[peerId] ?? 0; - - /// Get service ID for a peer - static String? getServiceId(String peerId) => _serviceIds[peerId]; - - /// Set service ID for a peer - static void setServiceId(String peerId, String serviceId) { - _serviceIds[peerId] = serviceId; - debugPrint('[TerminalConnectionManager] Service ID for $peerId: $serviceId'); - } -} \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_page.dart deleted file mode 100644 index 0070cd7..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_page.dart +++ /dev/null @@ -1,205 +0,0 @@ -import 'dart:async'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/models/model.dart'; -import 'package:flutter_hbb/models/terminal_model.dart'; -import 'package:xterm/xterm.dart'; -import 'terminal_connection_manager.dart'; - -class TerminalPage extends StatefulWidget { - TerminalPage({ - Key? key, - required this.id, - required this.password, - required this.tabController, - required this.isSharedPassword, - required this.terminalId, - required this.tabKey, - this.forceRelay, - this.connToken, - }) : super(key: key); - final String id; - final String? password; - final DesktopTabController tabController; - final bool? forceRelay; - final bool? isSharedPassword; - final String? connToken; - final int terminalId; - /// Tab key for focus management, passed from parent to avoid duplicate construction - final String tabKey; - final SimpleWrapper?> _lastState = SimpleWrapper(null); - - FFI get ffi => (_lastState.value! as _TerminalPageState)._ffi; - - @override - State createState() { - final state = _TerminalPageState(); - _lastState.value = state; - return state; - } -} - -class _TerminalPageState extends State - with AutomaticKeepAliveClientMixin { - late FFI _ffi; - late TerminalModel _terminalModel; - double? _cellHeight; - final FocusNode _terminalFocusNode = FocusNode(canRequestFocus: false); - StreamSubscription? _tabStateSubscription; - - @override - void initState() { - super.initState(); - - // Listen for tab selection changes to request focus - _tabStateSubscription = widget.tabController.state.listen(_onTabStateChanged); - - // Use shared FFI instance from connection manager - _ffi = TerminalConnectionManager.getConnection( - peerId: widget.id, - password: widget.password, - isSharedPassword: widget.isSharedPassword, - forceRelay: widget.forceRelay, - connToken: widget.connToken, - ); - - // Create terminal model with specific terminal ID - _terminalModel = TerminalModel(_ffi, widget.terminalId); - debugPrint( - '[TerminalPage] Terminal model created for terminal ${widget.terminalId}'); - - _terminalModel.onResizeExternal = (w, h, pw, ph) { - _cellHeight = ph * 1.0; - - // Enable focus once terminal has valid dimensions (first valid resize) - if (!_terminalFocusNode.canRequestFocus && w > 0 && h > 0) { - _terminalFocusNode.canRequestFocus = true; - // Auto-focus if this tab is currently selected - _requestFocusIfSelected(); - } - - // Schedule the setState for the next frame - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - setState(() {}); - } - }); - }; - - // Register this terminal model with FFI for event routing - _ffi.registerTerminalModel(widget.terminalId, _terminalModel); - - // Initialize terminal connection - WidgetsBinding.instance.addPostFrameCallback((_) { - widget.tabController.onSelected?.call(widget.id); - - // Check if this is a new connection or additional terminal - // Note: When a connection exists, the ref count will be > 1 after this terminal is added - final isExistingConnection = - TerminalConnectionManager.hasConnection(widget.id) && - TerminalConnectionManager.getTerminalCount(widget.id) > 1; - - if (!isExistingConnection) { - // First terminal - show loading dialog, wait for onReady - _ffi.dialogManager - .showLoading(translate('Connecting...'), onCancel: closeConnection); - } else { - // Additional terminal - connection already established - // Open the terminal directly - _terminalModel.openTerminal(); - } - }); - } - - @override - void dispose() { - // Cancel tab state subscription to prevent memory leak - _tabStateSubscription?.cancel(); - // Unregister terminal model from FFI - _ffi.unregisterTerminalModel(widget.terminalId); - _terminalModel.dispose(); - _terminalFocusNode.dispose(); - // Release connection reference instead of closing directly - TerminalConnectionManager.releaseConnection(widget.id); - super.dispose(); - } - - void _onTabStateChanged(DesktopTabState state) { - // Check if this tab is now selected and request focus - if (state.selected >= 0 && state.selected < state.tabs.length) { - final selectedTab = state.tabs[state.selected]; - if (selectedTab.key == widget.tabKey && mounted) { - _requestFocusIfSelected(); - } - } - } - - void _requestFocusIfSelected() { - if (!mounted || !_terminalFocusNode.canRequestFocus) return; - // Use post-frame callback to ensure widget is fully laid out in focus tree - WidgetsBinding.instance.addPostFrameCallback((_) { - // Re-check conditions after frame: mounted, focusable, still selected, not already focused - if (!mounted || !_terminalFocusNode.canRequestFocus || _terminalFocusNode.hasFocus) return; - final state = widget.tabController.state.value; - if (state.selected >= 0 && state.selected < state.tabs.length) { - if (state.tabs[state.selected].key == widget.tabKey) { - _terminalFocusNode.requestFocus(); - } - } - }); - } - - // This method ensures that the number of visible rows is an integer by computing the - // extra space left after dividing the available height by the height of a single - // terminal row (`_cellHeight`) and distributing it evenly as top and bottom padding. - EdgeInsets _calculatePadding(double heightPx) { - if (_cellHeight == null) { - return const EdgeInsets.symmetric(horizontal: 5.0, vertical: 2.0); - } - final rows = (heightPx / _cellHeight!).floor(); - final extraSpace = heightPx - rows * _cellHeight!; - final topBottom = extraSpace / 2.0; - return EdgeInsets.symmetric(horizontal: 5.0, vertical: topBottom); - } - - @override - Widget build(BuildContext context) { - super.build(context); - return Scaffold( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - body: LayoutBuilder( - builder: (context, constraints) { - final heightPx = constraints.maxHeight; - return TerminalView( - _terminalModel.terminal, - controller: _terminalModel.terminalController, - focusNode: _terminalFocusNode, - // Note: autofocus is not used here because focus is managed manually - // via _onTabStateChanged() to handle tab switching properly. - backgroundOpacity: 0.7, - padding: _calculatePadding(heightPx), - onSecondaryTapDown: (details, offset) async { - final selection = _terminalModel.terminalController.selection; - if (selection != null) { - final text = _terminalModel.terminal.buffer.getText(selection); - _terminalModel.terminalController.clearSelection(); - await Clipboard.setData(ClipboardData(text: text)); - } else { - final data = await Clipboard.getData('text/plain'); - final text = data?.text; - if (text != null) { - _terminalModel.terminal.paste(text); - } - } - }, - ); - }, - ), - ); - } - - @override - bool get wantKeepAlive => true; -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_tab_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_tab_page.dart deleted file mode 100644 index 28e59fb..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/terminal_tab_page.dart +++ /dev/null @@ -1,591 +0,0 @@ -import 'dart:convert'; - -import 'package:desktop_multi_window/desktop_multi_window.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/common/widgets/dialog.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/utils/multi_window_manager.dart'; -import 'package:flutter_hbb/models/model.dart'; -import 'package:get/get.dart'; - -import '../../models/platform_model.dart'; -import 'terminal_page.dart'; -import 'terminal_connection_manager.dart'; -import '../widgets/material_mod_popup_menu.dart' as mod_menu; -import '../widgets/popup_menu.dart'; -import 'package:bot_toast/bot_toast.dart'; - -class TerminalTabPage extends StatefulWidget { - final Map params; - - const TerminalTabPage({Key? key, required this.params}) : super(key: key); - - @override - State createState() => _TerminalTabPageState(params); -} - -class _TerminalTabPageState extends State { - DesktopTabController get tabController => Get.find(); - - static const IconData selectedIcon = Icons.terminal; - static const IconData unselectedIcon = Icons.terminal_outlined; - int _nextTerminalId = 1; - // Lightweight idempotency guard for async close operations - final Set _closingTabs = {}; - // When true, all session cleanup should persist (window-level close in progress) - bool _windowClosing = false; - - _TerminalTabPageState(Map params) { - Get.put(DesktopTabController(tabType: DesktopTabType.terminal)); - tabController.onSelected = (id) { - WindowController.fromWindowId(windowId()) - .setTitle(getWindowNameWithId(id)); - }; - tabController.onRemoved = (_, id) => onRemoveId(id); - final terminalId = params['terminalId'] ?? _nextTerminalId++; - tabController.add(_createTerminalTab( - peerId: params['id'], - terminalId: terminalId, - password: params['password'], - isSharedPassword: params['isSharedPassword'], - forceRelay: params['forceRelay'], - connToken: params['connToken'], - )); - } - - TabInfo _createTerminalTab({ - required String peerId, - required int terminalId, - String? password, - bool? isSharedPassword, - bool? forceRelay, - String? connToken, - }) { - final tabKey = '${peerId}_$terminalId'; - final alias = bind.mainGetPeerOptionSync(id: peerId, key: 'alias'); - final tabLabel = - alias.isNotEmpty ? '$alias #$terminalId' : '$peerId #$terminalId'; - return TabInfo( - key: tabKey, - label: tabLabel, - selectedIcon: selectedIcon, - unselectedIcon: unselectedIcon, - onTabCloseButton: () => _closeTab(tabKey), - page: TerminalPage( - key: ValueKey(tabKey), - id: peerId, - terminalId: terminalId, - tabKey: tabKey, - password: password, - isSharedPassword: isSharedPassword, - tabController: tabController, - forceRelay: forceRelay, - connToken: connToken, - ), - ); - } - - /// Unified tab close handler for all close paths (button, shortcut, programmatic). - /// Shows audit dialog, cleans up session if not persistent, then removes the UI tab. - Future _closeTab(String tabKey) async { - // Idempotency guard: skip if already closing this tab - if (_closingTabs.contains(tabKey)) return; - _closingTabs.add(tabKey); - - try { - // Snapshot peerTabCount BEFORE any await to avoid race with concurrent - // _closeAllTabs clearing tabController (which would make the live count - // drop to 0 and incorrectly trigger session persistence). - // Note: the snapshot may become stale if other individual tabs are closed - // during the audit dialog, but this is an acceptable trade-off. - int? snapshotPeerTabCount; - final parsed = _parseTabKey(tabKey); - if (parsed != null) { - final (peerId, _) = parsed; - snapshotPeerTabCount = tabController.state.value.tabs.where((t) { - final p = _parseTabKey(t.key); - return p != null && p.$1 == peerId; - }).length; - } - - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: tabKey, - tabController: tabController, - )) { - return; - } - - // Close terminal session if not in persistent mode. - // Wrapped separately so session cleanup failure never blocks UI tab removal. - try { - await _closeTerminalSessionIfNeeded(tabKey, - peerTabCount: snapshotPeerTabCount); - } catch (e) { - debugPrint('[TerminalTabPage] Session cleanup failed for $tabKey: $e'); - } - // Always close the tab from UI, regardless of session cleanup result - tabController.closeBy(tabKey); - } catch (e) { - debugPrint('[TerminalTabPage] Error closing tab $tabKey: $e'); - } finally { - _closingTabs.remove(tabKey); - } - } - - /// Close all tabs with session cleanup. - /// Used for window-level close operations (onDestroy, handleWindowCloseButton). - /// UI tabs are removed immediately; session cleanup runs in parallel with a - /// bounded timeout so window close is not blocked indefinitely. - Future _closeAllTabs() async { - _windowClosing = true; - final tabKeys = tabController.state.value.tabs.map((t) => t.key).toList(); - // Remove all UI tabs immediately (same instant behavior as the old tabController.clear()) - tabController.clear(); - // Run session cleanup in parallel with bounded timeout (closeTerminal() has internal 3s timeout). - // Skip tabs already being closed by a concurrent _closeTab() to avoid duplicate FFI calls. - final futures = tabKeys - .where((tabKey) => !_closingTabs.contains(tabKey)) - .map((tabKey) async { - try { - await _closeTerminalSessionIfNeeded(tabKey, persistAll: true); - } catch (e) { - debugPrint('[TerminalTabPage] Session cleanup failed for $tabKey: $e'); - } - }).toList(); - if (futures.isNotEmpty) { - await Future.wait(futures).timeout( - const Duration(seconds: 4), - onTimeout: () { - debugPrint( - '[TerminalTabPage] Session cleanup timed out for batch close'); - return []; - }, - ); - } - } - - /// Close the terminal session on server side based on persistent mode. - /// - /// [persistAll] controls behavior when persistent mode is enabled: - /// - `true` (window close): persist all sessions, don't close any. - /// - `false` (tab close): only persist the last session for the peer, - /// close others so only the most recent disconnected session survives. - /// - /// Note: if [_windowClosing] is true, persistAll is forced to true so that - /// in-flight _closeTab() calls don't accidentally close sessions that the - /// window-close flow intends to preserve. - Future _closeTerminalSessionIfNeeded(String tabKey, - {bool persistAll = false, int? peerTabCount}) async { - // If window close is in progress, override to persist all sessions - // even if this call originated from an individual tab close. - if (_windowClosing) { - persistAll = true; - } - final parsed = _parseTabKey(tabKey); - if (parsed == null) return; - final (peerId, terminalId) = parsed; - - final ffi = TerminalConnectionManager.getExistingConnection(peerId); - if (ffi == null) return; - - final isPersistent = bind.sessionGetToggleOptionSync( - sessionId: ffi.sessionId, - arg: kOptionTerminalPersistent, - ); - - if (isPersistent) { - if (persistAll) { - // Window close: persist all sessions - return; - } - // Tab close: only persist if this is the last tab for this peer. - // Use the snapshot value if provided (avoids race with concurrent tab removal). - final effectivePeerTabCount = peerTabCount ?? - tabController.state.value.tabs.where((t) { - final p = _parseTabKey(t.key); - return p != null && p.$1 == peerId; - }).length; - if (effectivePeerTabCount <= 1) { - // Last tab for this peer — persist the session - return; - } - // Not the last tab — fall through to close the session - } - - final terminalModel = ffi.terminalModels[terminalId]; - if (terminalModel != null) { - // closeTerminal() has internal 3s timeout, no need for external timeout - await terminalModel.closeTerminal(); - } - } - - /// Parse tabKey (format: "peerId_terminalId") into its components. - /// Note: peerId may contain underscores, so we use lastIndexOf('_'). - /// Returns null if tabKey format is invalid. - (String peerId, int terminalId)? _parseTabKey(String tabKey) { - final lastUnderscore = tabKey.lastIndexOf('_'); - if (lastUnderscore <= 0) { - debugPrint('[TerminalTabPage] Invalid tabKey format: $tabKey'); - return null; - } - final terminalIdStr = tabKey.substring(lastUnderscore + 1); - final terminalId = int.tryParse(terminalIdStr); - if (terminalId == null) { - debugPrint('[TerminalTabPage] Invalid terminalId in tabKey: $tabKey'); - return null; - } - final peerId = tabKey.substring(0, lastUnderscore); - return (peerId, terminalId); - } - - Widget _tabMenuBuilder(String peerId, CancelFunc cancelFunc) { - final List> menu = []; - const EdgeInsets padding = EdgeInsets.only(left: 8.0, right: 5.0); - - // New tab menu item - menu.add(MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('New tab'), - style: style, - ), - proc: () { - _addNewTerminal(peerId); - cancelFunc(); - // Also try to close any BotToast overlays - BotToast.cleanAll(); - }, - padding: padding, - )); - - menu.add(MenuEntryDivider()); - - menu.add(MenuEntrySwitch( - switchType: SwitchType.scheckbox, - text: translate('Keep terminal sessions on disconnect'), - getter: () async { - final ffi = Get.find(tag: 'terminal_$peerId'); - return bind.sessionGetToggleOptionSync( - sessionId: ffi.sessionId, - arg: kOptionTerminalPersistent, - ); - }, - setter: (bool v) async { - final ffi = Get.find(tag: 'terminal_$peerId'); - await bind.sessionToggleOption( - sessionId: ffi.sessionId, - value: kOptionTerminalPersistent, - ); - }, - padding: padding, - )); - - return mod_menu.PopupMenu( - items: menu - .map((e) => e.build( - context, - const MenuConfig( - commonColor: CustomPopupMenuTheme.commonColor, - height: CustomPopupMenuTheme.height, - dividerHeight: CustomPopupMenuTheme.dividerHeight, - ), - )) - .expand((i) => i) - .toList(), - ); - } - - @override - void initState() { - super.initState(); - - // Add keyboard shortcut handler - HardwareKeyboard.instance.addHandler(_handleKeyEvent); - - rustDeskWinManager.setMethodHandler((call, fromWindowId) async { - print( - "[Remote Terminal] call ${call.method} with args ${call.arguments} from window $fromWindowId"); - if (call.method == kWindowEventNewTerminal) { - final args = jsonDecode(call.arguments); - final id = args['id']; - windowOnTop(windowId()); - // Allow multiple terminals for the same connection - final terminalId = args['terminalId'] ?? _nextTerminalId++; - tabController.add(_createTerminalTab( - peerId: id, - terminalId: terminalId, - password: args['password'], - isSharedPassword: args['isSharedPassword'], - forceRelay: args['forceRelay'], - connToken: args['connToken'], - )); - } else if (call.method == kWindowEventRestoreTerminalSessions) { - _restoreSessions(call.arguments); - } else if (call.method == "onDestroy") { - // Clean up sessions before window destruction (bounded wait) - await _closeAllTabs(); - } else if (call.method == kWindowActionRebuild) { - reloadCurrentWindow(); - } else if (call.method == kWindowEventActiveSession) { - if (tabController.state.value.tabs.isEmpty) { - return false; - } - final currentTab = tabController.state.value.selectedTabInfo; - assert(call.arguments is String, - "Expected String arguments for kWindowEventActiveSession, got ${call.arguments.runtimeType}"); - // Use lastIndexOf to handle peerIds containing underscores - final lastUnderscore = currentTab.key.lastIndexOf('_'); - if (lastUnderscore > 0 && - currentTab.key.substring(0, lastUnderscore) == call.arguments) { - windowOnTop(windowId()); - return true; - } - return false; - } - }); - Future.delayed(Duration.zero, () { - restoreWindowPosition(WindowType.Terminal, windowId: windowId()); - }); - } - - @override - void dispose() { - HardwareKeyboard.instance.removeHandler(_handleKeyEvent); - super.dispose(); - } - - Future _restoreSessions(String arguments) async { - Map? args; - try { - args = jsonDecode(arguments) as Map; - } catch (e) { - debugPrint("Error parsing JSON arguments in _restoreSessions: $e"); - return; - } - final persistentSessions = - args['persistent_sessions'] as List? ?? []; - final sortedSessions = persistentSessions.whereType().toList()..sort(); - for (final terminalId in sortedSessions) { - _addNewTerminalForCurrentPeer(terminalId: terminalId); - // A delay is required to ensure the UI has sufficient time to update - // before adding the next terminal. Without this delay, `_TerminalPageState::dispose()` - // may be called prematurely while the tab widget is still in the tab controller. - // This behavior is likely due to a race condition between the UI rendering lifecycle - // and the addition of new tabs. Attempts to use `_TerminalPageState::addPostFrameCallback()` - // to wait for the previous page to be ready were unsuccessful, as the observed call sequence is: - // `initState() 2 -> dispose() 2 -> postFrameCallback() 2`, followed by `initState() 3`. - // The `Future.delayed` approach mitigates this issue by introducing a buffer period, - // allowing the UI to stabilize before proceeding. - await Future.delayed(const Duration(milliseconds: 300)); - } - } - - bool _handleKeyEvent(KeyEvent event) { - if (event is KeyDownEvent) { - // Use Cmd+T on macOS, Ctrl+Shift+T on other platforms - if (event.logicalKey == LogicalKeyboardKey.keyT) { - if (isMacOS && - HardwareKeyboard.instance.isMetaPressed && - !HardwareKeyboard.instance.isShiftPressed) { - // macOS: Cmd+T (standard for new tab) - _addNewTerminalForCurrentPeer(); - return true; - } else if (!isMacOS && - HardwareKeyboard.instance.isControlPressed && - HardwareKeyboard.instance.isShiftPressed) { - // Other platforms: Ctrl+Shift+T (to avoid conflict with Ctrl+T in terminal) - _addNewTerminalForCurrentPeer(); - return true; - } - } - - // Use Cmd+W on macOS, Ctrl+Shift+W on other platforms - if (event.logicalKey == LogicalKeyboardKey.keyW) { - if (isMacOS && - HardwareKeyboard.instance.isMetaPressed && - !HardwareKeyboard.instance.isShiftPressed) { - // macOS: Cmd+W (standard for close tab) - final currentTab = tabController.state.value.selectedTabInfo; - if (tabController.state.value.tabs.length > 1) { - _closeTab(currentTab.key); - return true; - } - } else if (!isMacOS && - HardwareKeyboard.instance.isControlPressed && - HardwareKeyboard.instance.isShiftPressed) { - // Other platforms: Ctrl+Shift+W (to avoid conflict with Ctrl+W word delete) - final currentTab = tabController.state.value.selectedTabInfo; - if (tabController.state.value.tabs.length > 1) { - _closeTab(currentTab.key); - return true; - } - } - } - - // Use Alt+Left/Right for tab navigation (avoids conflicts) - if (HardwareKeyboard.instance.isAltPressed) { - if (event.logicalKey == LogicalKeyboardKey.arrowLeft) { - // Previous tab - final currentIndex = tabController.state.value.selected; - if (currentIndex > 0) { - tabController.jumpTo(currentIndex - 1); - } - return true; - } else if (event.logicalKey == LogicalKeyboardKey.arrowRight) { - // Next tab - final currentIndex = tabController.state.value.selected; - if (currentIndex < tabController.length - 1) { - tabController.jumpTo(currentIndex + 1); - } - return true; - } - } - - // Check for Cmd/Ctrl + Number (switch to specific tab) - final numberKeys = [ - LogicalKeyboardKey.digit1, - LogicalKeyboardKey.digit2, - LogicalKeyboardKey.digit3, - LogicalKeyboardKey.digit4, - LogicalKeyboardKey.digit5, - LogicalKeyboardKey.digit6, - LogicalKeyboardKey.digit7, - LogicalKeyboardKey.digit8, - LogicalKeyboardKey.digit9, - ]; - - for (int i = 0; i < numberKeys.length; i++) { - if (event.logicalKey == numberKeys[i] && - ((isMacOS && HardwareKeyboard.instance.isMetaPressed) || - (!isMacOS && HardwareKeyboard.instance.isControlPressed))) { - if (i < tabController.length) { - tabController.jumpTo(i); - return true; - } - } - } - } - return false; - } - - void _addNewTerminal(String peerId, {int? terminalId}) { - // Find first tab for this peer to get connection parameters - final firstTab = tabController.state.value.tabs.firstWhere( - (tab) { - final last = tab.key.lastIndexOf('_'); - return last > 0 && tab.key.substring(0, last) == peerId; - }, - ); - if (firstTab.page is TerminalPage) { - final page = firstTab.page as TerminalPage; - final newTerminalId = terminalId ?? _nextTerminalId++; - if (terminalId != null && terminalId >= _nextTerminalId) { - _nextTerminalId = terminalId + 1; - } - tabController.add(_createTerminalTab( - peerId: peerId, - terminalId: newTerminalId, - password: page.password, - isSharedPassword: page.isSharedPassword, - forceRelay: page.forceRelay, - connToken: page.connToken, - )); - } - } - - void _addNewTerminalForCurrentPeer({int? terminalId}) { - final currentTab = tabController.state.value.selectedTabInfo; - final parsed = _parseTabKey(currentTab.key); - if (parsed == null) return; - final (peerId, _) = parsed; - _addNewTerminal(peerId, terminalId: terminalId); - } - - @override - Widget build(BuildContext context) { - final child = Scaffold( - backgroundColor: Theme.of(context).cardColor, - body: DesktopTab( - controller: tabController, - onWindowCloseButton: handleWindowCloseButton, - tail: _buildAddButton(), - selectedBorderColor: MyTheme.accent, - labelGetter: DesktopTab.tablabelGetter, - tabMenuBuilder: (key) { - final parsed = _parseTabKey(key); - if (parsed == null) return Container(); - final (peerId, _) = parsed; - return _tabMenuBuilder(peerId, () {}); - }, - )); - final tabWidget = isLinux - ? buildVirtualWindowFrame(context, child) - : workaroundWindowBorder( - context, - Container( - decoration: BoxDecoration( - border: Border.all(color: MyTheme.color(context).border!)), - child: child, - )); - return isMacOS || kUseCompatibleUiMode - ? tabWidget - : SubWindowDragToResizeArea( - child: tabWidget, - resizeEdgeSize: stateGlobal.resizeEdgeSize.value, - enableResizeEdges: subWindowManagerEnableResizeEdges, - windowId: stateGlobal.windowId, - ); - } - - void onRemoveId(String id) { - if (tabController.state.value.tabs.isEmpty) { - WindowController.fromWindowId(windowId()).close(); - } - } - - int windowId() { - return widget.params["windowId"]; - } - - Widget _buildAddButton() { - return ActionIcon( - message: 'New tab', - icon: IconFont.add, - onTap: () { - _addNewTerminalForCurrentPeer(); - }, - isClose: false, - ); - } - - Future handleWindowCloseButton() async { - final connLength = tabController.state.value.tabs.length; - if (connLength == 1) { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: tabController.state.value.tabs[0].key, - tabController: tabController, - )) { - return false; - } - } - if (connLength <= 1) { - await _closeAllTabs(); - return true; - } else { - final bool res; - if (!option2bool(kOptionEnableConfirmClosingTabs, - bind.mainGetLocalOption(key: kOptionEnableConfirmClosingTabs))) { - res = true; - } else { - res = await closeConfirmDialog(); - } - if (res) { - await _closeAllTabs(); - } - return res; - } - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/view_camera_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/view_camera_page.dart deleted file mode 100644 index c45ec4d..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/view_camera_page.dart +++ /dev/null @@ -1,717 +0,0 @@ -import 'dart:async'; - -import 'package:desktop_multi_window/desktop_multi_window.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_hbb/common/widgets/remote_input.dart'; -import 'package:get/get.dart'; -import 'package:provider/provider.dart'; -import 'package:flutter_hbb/models/state_model.dart'; - -import '../../consts.dart'; -import '../../common/widgets/overlay.dart'; -import '../../common.dart'; -import '../../common/widgets/dialog.dart'; -import '../../common/widgets/toolbar.dart'; -import '../../models/model.dart'; -import '../../models/platform_model.dart'; -import '../../common/shared_state.dart'; -import '../../utils/image.dart'; -import '../widgets/remote_toolbar.dart'; -import '../widgets/kb_layout_type_chooser.dart'; -import '../widgets/tabbar_widget.dart'; - -import 'package:flutter_hbb/native/custom_cursor.dart' - if (dart.library.html) 'package:flutter_hbb/web/custom_cursor.dart'; - -final SimpleWrapper _firstEnterImage = SimpleWrapper(false); - -// Used to skip session close if "move to new window" is clicked. -final Map closeSessionOnDispose = {}; - -class ViewCameraPage extends StatefulWidget { - ViewCameraPage({ - Key? key, - required this.id, - required this.toolbarState, - this.sessionId, - this.tabWindowId, - this.password, - this.display, - this.displays, - this.tabController, - this.connToken, - this.forceRelay, - this.isSharedPassword, - }) : super(key: key) { - initSharedStates(id); - } - - final String id; - final SessionID? sessionId; - final int? tabWindowId; - final int? display; - final List? displays; - final String? password; - final ToolbarState toolbarState; - final bool? forceRelay; - final bool? isSharedPassword; - final String? connToken; - final SimpleWrapper?> _lastState = SimpleWrapper(null); - final DesktopTabController? tabController; - - FFI get ffi => (_lastState.value! as _ViewCameraPageState)._ffi; - - @override - State createState() { - final state = _ViewCameraPageState(id); - _lastState.value = state; - return state; - } -} - -class _ViewCameraPageState extends State - with AutomaticKeepAliveClientMixin, MultiWindowListener { - Timer? _timer; - String keyboardMode = "legacy"; - bool _isWindowBlur = false; - final _cursorOverImage = false.obs; - final _uniqueKey = UniqueKey(); - - var _blockableOverlayState = BlockableOverlayState(); - - final FocusNode _rawKeyFocusNode = FocusNode(debugLabel: "rawkeyFocusNode"); - - // We need `_instanceIdOnEnterOrLeaveImage4Toolbar` together with `_onEnterOrLeaveImage4Toolbar` - // to identify the toolbar instance and its callback function. - int? _instanceIdOnEnterOrLeaveImage4Toolbar; - Function(bool)? _onEnterOrLeaveImage4Toolbar; - - late FFI _ffi; - - SessionID get sessionId => _ffi.sessionId; - - _ViewCameraPageState(String id) { - _initStates(id); - } - - void _initStates(String id) {} - - @override - void initState() { - super.initState(); - _ffi = FFI(widget.sessionId); - Get.put(_ffi, tag: widget.id); - _ffi.imageModel.addCallbackOnFirstImage((String peerId) { - showKBLayoutTypeChooserIfNeeded( - _ffi.ffiModel.pi.platform, _ffi.dialogManager); - _ffi.recordingModel - .updateStatus(bind.sessionGetIsRecording(sessionId: _ffi.sessionId)); - }); - _ffi.start( - widget.id, - isViewCamera: true, - password: widget.password, - isSharedPassword: widget.isSharedPassword, - forceRelay: widget.forceRelay, - tabWindowId: widget.tabWindowId, - display: widget.display, - displays: widget.displays, - connToken: widget.connToken, - ); - WidgetsBinding.instance.addPostFrameCallback((_) { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []); - _ffi.dialogManager - .showLoading(translate('Connecting...'), onCancel: closeConnection); - }); - WakelockManager.enable(_uniqueKey); - - _ffi.ffiModel.updateEventListener(sessionId, widget.id); - if (!isWeb) bind.pluginSyncUi(syncTo: kAppTypeDesktopRemote); - _ffi.qualityMonitorModel.checkShowQualityMonitor(sessionId); - _ffi.dialogManager.loadMobileActionsOverlayVisible(); - DesktopMultiWindow.addListener(this); - // if (!_isCustomCursorInited) { - // customCursorController.registerNeedUpdateCursorCallback( - // (String? lastKey, String? currentKey) async { - // if (_firstEnterImage.value) { - // _firstEnterImage.value = false; - // return true; - // } - // return lastKey == null || lastKey != currentKey; - // }); - // _isCustomCursorInited = true; - // } - - _blockableOverlayState.applyFfi(_ffi); - // Call onSelected in post frame callback, since we cannot guarantee that the callback will not call setState. - WidgetsBinding.instance.addPostFrameCallback((_) { - widget.tabController?.onSelected?.call(widget.id); - }); - } - - @override - void onWindowBlur() { - super.onWindowBlur(); - // On windows, we use `focus` way to handle keyboard better. - // Now on Linux, there's some rdev issues which will break the input. - // We disable the `focus` way for non-Windows temporarily. - if (isWindows) { - _isWindowBlur = true; - // unfocus the primary-focus when the whole window is lost focus, - // and let OS to handle events instead. - _rawKeyFocusNode.unfocus(); - } - stateGlobal.isFocused.value = false; - } - - @override - void onWindowFocus() { - super.onWindowFocus(); - // See [onWindowBlur]. - if (isWindows) { - _isWindowBlur = false; - } - stateGlobal.isFocused.value = true; - } - - @override - void onWindowRestore() { - super.onWindowRestore(); - // On windows, we use `onWindowRestore` way to handle window restore from - // a minimized state. - if (isWindows) { - _isWindowBlur = false; - } - WakelockManager.enable(_uniqueKey); - } - - // When the window is unminimized, onWindowMaximize or onWindowRestore can be called when the old state was maximized or not. - @override - void onWindowMaximize() { - super.onWindowMaximize(); - WakelockManager.enable(_uniqueKey); - } - - @override - void onWindowMinimize() { - super.onWindowMinimize(); - WakelockManager.disable(_uniqueKey); - } - - @override - void onWindowEnterFullScreen() { - super.onWindowEnterFullScreen(); - if (isMacOS) { - stateGlobal.setFullscreen(true); - } - } - - @override - void onWindowLeaveFullScreen() { - super.onWindowLeaveFullScreen(); - if (isMacOS) { - stateGlobal.setFullscreen(false); - } - } - - @override - Future dispose() async { - final closeSession = closeSessionOnDispose.remove(widget.id) ?? true; - - // https://github.com/flutter/flutter/issues/64935 - super.dispose(); - debugPrint("VIEW CAMERA PAGE dispose session $sessionId ${widget.id}"); - _ffi.textureModel.onViewCameraPageDispose(closeSession); - if (closeSession) { - // ensure we leave this session, this is a double check - _ffi.inputModel.enterOrLeave(false); - } - DesktopMultiWindow.removeListener(this); - _ffi.dialogManager.hideMobileActionsOverlay(); - _ffi.imageModel.disposeImage(); - _ffi.cursorModel.disposeImages(); - _rawKeyFocusNode.dispose(); - await _ffi.close(closeSession: closeSession); - _timer?.cancel(); - _ffi.dialogManager.dismissAll(); - if (closeSession) { - await SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, - overlays: SystemUiOverlay.values); - } - WakelockManager.disable(_uniqueKey); - await Get.delete(tag: widget.id); - removeSharedStates(widget.id); - } - - Widget emptyOverlay() => BlockableOverlay( - /// the Overlay key will be set with _blockableOverlayState in BlockableOverlay - /// see override build() in [BlockableOverlay] - state: _blockableOverlayState, - underlying: Container( - color: Colors.transparent, - ), - ); - - Widget buildBody(BuildContext context) { - remoteToolbar(BuildContext context) => RemoteToolbar( - id: widget.id, - ffi: _ffi, - state: widget.toolbarState, - onEnterOrLeaveImageSetter: (id, func) { - _instanceIdOnEnterOrLeaveImage4Toolbar = id; - _onEnterOrLeaveImage4Toolbar = func; - }, - onEnterOrLeaveImageCleaner: (id) { - // If _instanceIdOnEnterOrLeaveImage4Toolbar != id - // it means `_onEnterOrLeaveImage4Toolbar` is not set or it has been changed to another toolbar. - if (_instanceIdOnEnterOrLeaveImage4Toolbar == id) { - _instanceIdOnEnterOrLeaveImage4Toolbar = null; - _onEnterOrLeaveImage4Toolbar = null; - } - }, - setRemoteState: setState, - ); - - bodyWidget() { - return Stack( - children: [ - Container( - color: kColorCanvas, - child: getBodyForDesktop(context), - ), - Stack( - children: [ - _ffi.ffiModel.pi.isSet.isTrue && - _ffi.ffiModel.waitForFirstImage.isTrue - ? emptyOverlay() - : () { - if (!_ffi.ffiModel.isPeerAndroid) { - return Offstage(); - } else { - return Obx(() => Offstage( - offstage: _ffi.dialogManager - .mobileActionsOverlayVisible.isFalse, - child: Overlay(initialEntries: [ - makeMobileActionsOverlayEntry( - () => _ffi.dialogManager - .setMobileActionsOverlayVisible(false), - ffi: _ffi, - ) - ]), - )); - } - }(), - // Use Overlay to enable rebuild every time on menu button click. - _ffi.ffiModel.pi.isSet.isTrue - ? Overlay( - initialEntries: [OverlayEntry(builder: remoteToolbar)]) - : remoteToolbar(context), - _ffi.ffiModel.pi.isSet.isFalse ? emptyOverlay() : Offstage(), - ], - ), - ], - ); - } - - return Scaffold( - backgroundColor: Theme.of(context).colorScheme.background, - body: Obx(() { - final imageReady = _ffi.ffiModel.pi.isSet.isTrue && - _ffi.ffiModel.waitForFirstImage.isFalse; - if (imageReady) { - // If the privacy mode(disable physical displays) is switched, - // we should not dismiss the dialog immediately. - if (DateTime.now().difference(togglePrivacyModeTime) > - const Duration(milliseconds: 3000)) { - // `dismissAll()` is to ensure that the state is clean. - // It's ok to call dismissAll() here. - _ffi.dialogManager.dismissAll(); - // Recreate the block state to refresh the state. - _blockableOverlayState = BlockableOverlayState(); - _blockableOverlayState.applyFfi(_ffi); - } - // Block the whole `bodyWidget()` when dialog shows. - return BlockableOverlay( - underlying: bodyWidget(), - state: _blockableOverlayState, - ); - } else { - // `_blockableOverlayState` is not recreated here. - // The toolbar's block state won't work properly when reconnecting, but that's okay. - return bodyWidget(); - } - }), - ); - } - - @override - Widget build(BuildContext context) { - super.build(context); - return WillPopScope( - onWillPop: () async { - clientClose(sessionId, _ffi); - return false; - }, - child: MultiProvider(providers: [ - ChangeNotifierProvider.value(value: _ffi.ffiModel), - ChangeNotifierProvider.value(value: _ffi.imageModel), - ChangeNotifierProvider.value(value: _ffi.cursorModel), - ChangeNotifierProvider.value(value: _ffi.canvasModel), - ChangeNotifierProvider.value(value: _ffi.recordingModel), - ], child: buildBody(context))); - } - - void enterView(PointerEnterEvent evt) { - _cursorOverImage.value = true; - _firstEnterImage.value = true; - if (_onEnterOrLeaveImage4Toolbar != null) { - try { - _onEnterOrLeaveImage4Toolbar!(true); - } catch (e) { - // - } - } - // See [onWindowBlur]. - if (!isWindows) { - if (!_rawKeyFocusNode.hasFocus) { - _rawKeyFocusNode.requestFocus(); - } - _ffi.inputModel.enterOrLeave(true); - } - } - - void leaveView(PointerExitEvent evt) { - if (_ffi.ffiModel.keyboard) { - _ffi.inputModel.tryMoveEdgeOnExit(evt.position); - } - - _cursorOverImage.value = false; - _firstEnterImage.value = false; - if (_onEnterOrLeaveImage4Toolbar != null) { - try { - _onEnterOrLeaveImage4Toolbar!(false); - } catch (e) { - // - } - } - // See [onWindowBlur]. - if (!isWindows) { - _ffi.inputModel.enterOrLeave(false); - } - } - - Widget _buildRawTouchAndPointerRegion( - Widget child, - PointerEnterEventListener? onEnter, - PointerExitEventListener? onExit, - ) { - return RawTouchGestureDetectorRegion( - child: _buildRawPointerMouseRegion(child, onEnter, onExit), - ffi: _ffi, - isCamera: true, - ); - } - - Widget _buildRawPointerMouseRegion( - Widget child, - PointerEnterEventListener? onEnter, - PointerExitEventListener? onExit, - ) { - return CameraRawPointerMouseRegion( - onEnter: onEnter, - onExit: onExit, - onPointerDown: (event) { - // A double check for blur status. - // Note: If there's an `onPointerDown` event is triggered, `_isWindowBlur` is expected being false. - // Sometimes the system does not send the necessary focus event to flutter. We should manually - // handle this inconsistent status by setting `_isWindowBlur` to false. So we can - // ensure the grab-key thread is running when our users are clicking the remote canvas. - if (_isWindowBlur) { - debugPrint( - "Unexpected status: onPointerDown is triggered while the remote window is in blur status"); - _isWindowBlur = false; - } - if (!_rawKeyFocusNode.hasFocus) { - _rawKeyFocusNode.requestFocus(); - } - }, - inputModel: _ffi.inputModel, - child: child, - ); - } - - Widget getBodyForDesktop(BuildContext context) { - var paints = [ - MouseRegion(onEnter: (evt) { - if (!isWeb) bind.hostStopSystemKeyPropagate(stopped: false); - }, onExit: (evt) { - if (!isWeb) bind.hostStopSystemKeyPropagate(stopped: true); - }, child: LayoutBuilder(builder: (context, constraints) { - final c = Provider.of(context, listen: false); - Future.delayed(Duration.zero, () => c.updateViewStyle()); - final peerDisplay = CurrentDisplayState.find(widget.id); - return Obx( - () => _ffi.ffiModel.pi.isSet.isFalse - ? Container(color: Colors.transparent) - : Obx(() { - _ffi.textureModel.updateCurrentDisplay(peerDisplay.value); - return ImagePaint( - id: widget.id, - cursorOverImage: _cursorOverImage, - listenerBuilder: (child) => _buildRawTouchAndPointerRegion( - child, enterView, leaveView), - ffi: _ffi, - ); - }), - ); - })) - ]; - - paints.add( - Positioned( - top: 10, - right: 10, - child: _buildRawTouchAndPointerRegion( - QualityMonitor(_ffi.qualityMonitorModel), null, null), - ), - ); - return Stack( - children: paints, - ); - } - - @override - bool get wantKeepAlive => true; -} - -class ImagePaint extends StatefulWidget { - final FFI ffi; - final String id; - final RxBool cursorOverImage; - final Widget Function(Widget)? listenerBuilder; - - ImagePaint( - {Key? key, - required this.ffi, - required this.id, - required this.cursorOverImage, - this.listenerBuilder}) - : super(key: key); - - @override - State createState() => _ImagePaintState(); -} - -class _ImagePaintState extends State { - String get id => widget.id; - RxBool get cursorOverImage => widget.cursorOverImage; - Widget Function(Widget)? get listenerBuilder => widget.listenerBuilder; - - @override - Widget build(BuildContext context) { - final m = Provider.of(context); - var c = Provider.of(context); - final s = c.scale; - - bool isViewOriginal() => c.viewStyle.style == kRemoteViewStyleOriginal; - - if (c.imageOverflow.isTrue && c.scrollStyle != ScrollStyle.scrollauto) { - final paintWidth = c.getDisplayWidth() * s; - final paintHeight = c.getDisplayHeight() * s; - final paintSize = Size(paintWidth, paintHeight); - final paintWidget = - m.useTextureRender || widget.ffi.ffiModel.pi.forceTextureRender - ? _BuildPaintTextureRender( - c, s, Offset.zero, paintSize, isViewOriginal()) - : _buildScrollbarNonTextureRender(m, paintSize, s); - return NotificationListener( - onNotification: (notification) { - c.updateScrollPercent(); - return false; - }, - child: Container( - child: _buildCrossScrollbarFromLayout( - context, - _buildListener(paintWidget), - c.size, - paintSize, - c.scrollHorizontal, - c.scrollVertical, - )), - ); - } else { - if (c.size.width > 0 && c.size.height > 0) { - final paintWidget = - m.useTextureRender || widget.ffi.ffiModel.pi.forceTextureRender - ? _BuildPaintTextureRender( - c, - s, - Offset( - isLinux ? c.x.toInt().toDouble() : c.x, - isLinux ? c.y.toInt().toDouble() : c.y, - ), - c.size, - isViewOriginal()) - : _buildScrollAutoNonTextureRender(m, c, s); - return Container(child: _buildListener(paintWidget)); - } else { - return Container(); - } - } - } - - Widget _buildScrollbarNonTextureRender( - ImageModel m, Size imageSize, double s) { - return CustomPaint( - size: imageSize, - painter: ImagePainter(image: m.image, x: 0, y: 0, scale: s), - ); - } - - Widget _buildScrollAutoNonTextureRender( - ImageModel m, CanvasModel c, double s) { - return CustomPaint( - size: Size(c.size.width, c.size.height), - painter: ImagePainter(image: m.image, x: c.x / s, y: c.y / s, scale: s), - ); - } - - Widget _BuildPaintTextureRender( - CanvasModel c, double s, Offset offset, Size size, bool isViewOriginal) { - final ffiModel = c.parent.target!.ffiModel; - final displays = ffiModel.pi.getCurDisplays(); - final children = []; - final rect = ffiModel.rect; - if (rect == null) { - return Container(); - } - final curDisplay = ffiModel.pi.currentDisplay; - for (var i = 0; i < displays.length; i++) { - final textureId = widget.ffi.textureModel - .getTextureId(curDisplay == kAllDisplayValue ? i : curDisplay); - if (true) { - // both "textureId.value != -1" and "true" seems ok - children.add(Positioned( - left: (displays[i].x - rect.left) * s + offset.dx, - top: (displays[i].y - rect.top) * s + offset.dy, - width: displays[i].width * s, - height: displays[i].height * s, - child: Obx(() => Texture( - textureId: textureId.value, - filterQuality: - isViewOriginal ? FilterQuality.none : FilterQuality.low, - )), - )); - } - } - return SizedBox( - width: size.width, - height: size.height, - child: Stack(children: children), - ); - } - - MouseCursor _buildCustomCursor(BuildContext context, double scale) { - final cursor = Provider.of(context); - final cache = cursor.cache ?? preDefaultCursor.cache; - return buildCursorOfCache(cursor, scale, cache); - } - - MouseCursor _buildDisabledCursor(BuildContext context, double scale) { - final cursor = Provider.of(context); - final cache = preForbiddenCursor.cache; - return buildCursorOfCache(cursor, scale, cache); - } - - Widget _buildCrossScrollbarFromLayout( - BuildContext context, - Widget child, - Size layoutSize, - Size size, - ScrollController horizontal, - ScrollController vertical, - ) { - var widget = child; - if (layoutSize.width < size.width) { - widget = ScrollConfiguration( - behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false), - child: SingleChildScrollView( - controller: horizontal, - scrollDirection: Axis.horizontal, - physics: cursorOverImage.isTrue - ? const NeverScrollableScrollPhysics() - : null, - child: widget, - ), - ); - } else { - widget = Row( - children: [ - Container( - width: ((layoutSize.width - size.width) ~/ 2).toDouble(), - ), - widget, - ], - ); - } - if (layoutSize.height < size.height) { - widget = ScrollConfiguration( - behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false), - child: SingleChildScrollView( - controller: vertical, - physics: cursorOverImage.isTrue - ? const NeverScrollableScrollPhysics() - : null, - child: widget, - ), - ); - } else { - widget = Column( - children: [ - Container( - height: ((layoutSize.height - size.height) ~/ 2).toDouble(), - ), - widget, - ], - ); - } - if (layoutSize.width < size.width) { - widget = RawScrollbar( - thickness: kScrollbarThickness, - thumbColor: Colors.grey, - controller: horizontal, - thumbVisibility: false, - trackVisibility: false, - notificationPredicate: layoutSize.height < size.height - ? (notification) => notification.depth == 1 - : defaultScrollNotificationPredicate, - child: widget, - ); - } - if (layoutSize.height < size.height) { - widget = RawScrollbar( - thickness: kScrollbarThickness, - thumbColor: Colors.grey, - controller: vertical, - thumbVisibility: false, - trackVisibility: false, - child: widget, - ); - } - - return Container( - child: widget, - width: layoutSize.width, - height: layoutSize.height, - ); - } - - Widget _buildListener(Widget child) { - if (listenerBuilder != null) { - return listenerBuilder!(child); - } else { - return child; - } - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/view_camera_tab_page.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/view_camera_tab_page.dart deleted file mode 100644 index 36fa623..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/pages/view_camera_tab_page.dart +++ /dev/null @@ -1,522 +0,0 @@ -import 'dart:convert'; -import 'dart:async'; -import 'dart:ui' as ui; - -import 'package:desktop_multi_window/desktop_multi_window.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/common/shared_state.dart'; -import 'package:flutter_hbb/common/widgets/dialog.dart'; -import 'package:flutter_hbb/consts.dart'; -import 'package:flutter_hbb/models/input_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:flutter_hbb/desktop/pages/view_camera_page.dart'; -import 'package:flutter_hbb/desktop/widgets/remote_toolbar.dart'; -import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; -import 'package:flutter_hbb/desktop/widgets/material_mod_popup_menu.dart' - as mod_menu; -import 'package:flutter_hbb/desktop/widgets/popup_menu.dart'; -import 'package:flutter_hbb/utils/multi_window_manager.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; -import 'package:bot_toast/bot_toast.dart'; - -import '../../models/platform_model.dart'; - -class _MenuTheme { - static const Color blueColor = MyTheme.button; - // kMinInteractiveDimension - static const double height = 20.0; - static const double dividerHeight = 12.0; -} - -class ViewCameraTabPage extends StatefulWidget { - final Map params; - - const ViewCameraTabPage({Key? key, required this.params}) : super(key: key); - - @override - State createState() => _ViewCameraTabPageState(params); -} - -class _ViewCameraTabPageState extends State { - final tabController = - Get.put(DesktopTabController(tabType: DesktopTabType.viewCamera)); - final contentKey = UniqueKey(); - static const IconData selectedIcon = Icons.desktop_windows_sharp; - static const IconData unselectedIcon = Icons.desktop_windows_outlined; - - String? peerId; - bool _isScreenRectSet = false; - int? _display; - - var connectionMap = RxList.empty(growable: true); - - _ViewCameraTabPageState(Map params) { - RemoteCountState.init(); - peerId = params['id']; - final sessionId = params['session_id']; - final tabWindowId = params['tab_window_id']; - final display = params['display']; - final displays = params['displays']; - final screenRect = parseParamScreenRect(params); - _isScreenRectSet = screenRect != null; - _display = display as int?; - tryMoveToScreenAndSetFullscreen(screenRect); - if (peerId != null) { - ConnectionTypeState.init(peerId!); - tabController.onSelected = (id) { - final viewCameraPage = tabController.widget(id); - if (viewCameraPage is ViewCameraPage) { - final ffi = viewCameraPage.ffi; - bind.setCurSessionId(sessionId: ffi.sessionId); - } - WindowController.fromWindowId(params['windowId']) - .setTitle(getWindowNameWithId(id)); - UnreadChatCountState.find(id).value = 0; - }; - tabController.add(TabInfo( - key: peerId!, - label: peerId!, - selectedIcon: selectedIcon, - unselectedIcon: unselectedIcon, - onTabCloseButton: () async { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: peerId!, - tabController: tabController, - )) { - return; - } - tabController.closeBy(peerId!); - }, - page: ViewCameraPage( - key: ValueKey(peerId), - id: peerId!, - sessionId: sessionId == null ? null : SessionID(sessionId), - tabWindowId: tabWindowId, - display: display, - displays: displays?.cast(), - password: params['password'], - toolbarState: ToolbarState(), - tabController: tabController, - connToken: params['connToken'], - forceRelay: params['forceRelay'], - isSharedPassword: params['isSharedPassword'], - ), - )); - _update_remote_count(); - } - tabController.onRemoved = (_, id) => onRemoveId(id); - rustDeskWinManager.setMethodHandler(_remoteMethodHandler); - } - - @override - void initState() { - super.initState(); - - if (!_isScreenRectSet) { - Future.delayed(Duration.zero, () { - restoreWindowPosition( - WindowType.ViewCamera, - windowId: windowId(), - peerId: tabController.state.value.tabs.isEmpty - ? null - : tabController.state.value.tabs[0].key, - display: _display, - ); - }); - } - } - - @override - Widget build(BuildContext context) { - final child = Scaffold( - backgroundColor: Theme.of(context).colorScheme.background, - body: DesktopTab( - controller: tabController, - onWindowCloseButton: handleWindowCloseButton, - tail: const AddButton(), - selectedBorderColor: MyTheme.accent, - pageViewBuilder: (pageView) => pageView, - labelGetter: DesktopTab.tablabelGetter, - tabBuilder: (key, icon, label, themeConf) => Obx(() { - final connectionType = ConnectionTypeState.find(key); - if (!connectionType.isValid()) { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - icon, - label, - ], - ); - } else { - bool secure = - connectionType.secure.value == ConnectionType.strSecure; - bool direct = - connectionType.direct.value == ConnectionType.strDirect; - String msgConn = getConnectionText( - secure, direct, connectionType.stream_type.value); - var msgFingerprint = '${translate('Fingerprint')}:\n'; - var fingerprint = FingerprintState.find(key).value; - if (fingerprint.isEmpty) { - fingerprint = 'N/A'; - } - if (fingerprint.length > 5 * 8) { - var first = fingerprint.substring(0, 39); - var second = fingerprint.substring(40); - msgFingerprint += '$first\n$second'; - } else { - msgFingerprint += fingerprint; - } - - final tab = Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - icon, - Tooltip( - message: '$msgConn\n$msgFingerprint', - child: SvgPicture.asset( - 'assets/${connectionType.secure.value}${connectionType.direct.value}.svg', - width: themeConf.iconSize, - height: themeConf.iconSize, - ).paddingOnly(right: 5), - ), - label, - unreadMessageCountBuilder(UnreadChatCountState.find(key)) - .marginOnly(left: 4), - ], - ); - - return Listener( - onPointerDown: (e) { - if (e.kind != ui.PointerDeviceKind.mouse) { - return; - } - final viewCameraPage = tabController.state.value.tabs - .firstWhere((tab) => tab.key == key) - .page as ViewCameraPage; - if (viewCameraPage.ffi.ffiModel.pi.isSet.isTrue && - e.buttons == 2) { - showRightMenu( - (CancelFunc cancelFunc) { - return _tabMenuBuilder(key, cancelFunc); - }, - target: e.position, - ); - } - }, - child: tab, - ); - } - }), - ), - ); - final tabWidget = isLinux - ? buildVirtualWindowFrame(context, child) - : workaroundWindowBorder( - context, - Obx(() => Container( - decoration: BoxDecoration( - border: Border.all( - color: MyTheme.color(context).border!, - width: stateGlobal.windowBorderWidth.value), - ), - child: child, - ))); - return isMacOS || kUseCompatibleUiMode - ? tabWidget - : Obx(() => SubWindowDragToResizeArea( - key: contentKey, - child: tabWidget, - // Specially configured for a better resize area and remote control. - childPadding: kDragToResizeAreaPadding, - resizeEdgeSize: stateGlobal.resizeEdgeSize.value, - enableResizeEdges: subWindowManagerEnableResizeEdges, - windowId: stateGlobal.windowId, - )); - } - - // Note: Some dup code to ../widgets/remote_toolbar - Widget _tabMenuBuilder(String key, CancelFunc cancelFunc) { - final List> menu = []; - const EdgeInsets padding = EdgeInsets.only(left: 8.0, right: 5.0); - final viewCameraPage = tabController.state.value.tabs - .firstWhere((tab) => tab.key == key) - .page as ViewCameraPage; - final ffi = viewCameraPage.ffi; - final sessionId = ffi.sessionId; - final toolbarState = viewCameraPage.toolbarState; - menu.addAll([ - MenuEntryButton( - childBuilder: (TextStyle? style) => Obx(() => Text( - translate( - toolbarState.hide.isTrue ? 'Show Toolbar' : 'Hide Toolbar'), - style: style, - )), - proc: () { - toolbarState.switchHide(sessionId); - cancelFunc(); - }, - padding: padding, - ), - ]); - - if (tabController.state.value.tabs.length > 1) { - final splitAction = MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Move tab to new window'), - style: style, - ), - proc: () async { - await DesktopMultiWindow.invokeMethod( - kMainWindowId, - kWindowEventMoveTabToNewWindow, - '${windowId()},$key,$sessionId,ViewCamera'); - cancelFunc(); - }, - padding: padding, - ); - menu.insert(1, splitAction); - } - - menu.addAll([ - MenuEntryDivider(), - MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Copy Fingerprint'), - style: style, - ), - proc: () => onCopyFingerprint(FingerprintState.find(key).value), - padding: padding, - dismissOnClicked: true, - dismissCallback: cancelFunc, - ), - MenuEntryButton( - childBuilder: (TextStyle? style) => Text( - translate('Close'), - style: style, - ), - proc: () async { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: key, - tabController: tabController, - )) { - return; - } - tabController.closeBy(key); - cancelFunc(); - }, - padding: padding, - ) - ]); - - return mod_menu.PopupMenu( - items: menu - .map((entry) => entry.build( - context, - const MenuConfig( - commonColor: _MenuTheme.blueColor, - height: _MenuTheme.height, - dividerHeight: _MenuTheme.dividerHeight, - ))) - .expand((i) => i) - .toList(), - ); - } - - void onRemoveId(String id) async { - if (tabController.state.value.tabs.isEmpty) { - // Keep calling until the window status is hidden. - // - // Workaround for Windows: - // If you click other buttons and close in msgbox within a very short period of time, the close may fail. - // `await WindowController.fromWindowId(windowId()).close();`. - Future loopCloseWindow() async { - int c = 0; - final windowController = WindowController.fromWindowId(windowId()); - while (c < 20 && - tabController.state.value.tabs.isEmpty && - (!await windowController.isHidden())) { - await windowController.close(); - await Future.delayed(Duration(milliseconds: 100)); - c++; - } - } - - loopCloseWindow(); - } - ConnectionTypeState.delete(id); - _update_remote_count(); - } - - int windowId() { - return widget.params["windowId"]; - } - - Future handleWindowCloseButton() async { - final connLength = tabController.length; - if (connLength == 1) { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: tabController.state.value.tabs[0].key, - tabController: tabController, - )) { - return false; - } - } - if (connLength <= 1) { - tabController.clear(); - return true; - } else { - final bool res; - if (!option2bool(kOptionEnableConfirmClosingTabs, - bind.mainGetLocalOption(key: kOptionEnableConfirmClosingTabs))) { - res = true; - } else { - res = await closeConfirmDialog(); - } - if (res) { - tabController.clear(); - } - return res; - } - } - - _update_remote_count() => - RemoteCountState.find().value = tabController.length; - - Future _remoteMethodHandler(call, fromWindowId) async { - debugPrint( - "[View Camera Page] call ${call.method} with args ${call.arguments} from window $fromWindowId"); - - dynamic returnValue; - // for simplify, just replace connectionId - if (call.method == kWindowEventNewViewCamera) { - final args = jsonDecode(call.arguments); - final id = args['id']; - final sessionId = args['session_id']; - final tabWindowId = args['tab_window_id']; - final display = args['display']; - final displays = args['displays']; - final screenRect = parseParamScreenRect(args); - final prePeerCount = tabController.length; - Future.delayed(Duration.zero, () async { - if (stateGlobal.fullscreen.isTrue) { - await WindowController.fromWindowId(windowId()).setFullscreen(false); - stateGlobal.setFullscreen(false, procWnd: false); - } - await setNewConnectWindowFrame(windowId(), id!, prePeerCount, - WindowType.ViewCamera, display, screenRect); - Future.delayed(Duration(milliseconds: isWindows ? 100 : 0), () async { - await windowOnTop(windowId()); - }); - }); - ConnectionTypeState.init(id); - tabController.add(TabInfo( - key: id, - label: id, - selectedIcon: selectedIcon, - unselectedIcon: unselectedIcon, - onTabCloseButton: () async { - if (await desktopTryShowTabAuditDialogCloseCancelled( - id: id, - tabController: tabController, - )) { - return; - } - tabController.closeBy(id); - }, - page: ViewCameraPage( - key: ValueKey(id), - id: id, - sessionId: sessionId == null ? null : SessionID(sessionId), - tabWindowId: tabWindowId, - display: display, - displays: displays?.cast(), - password: args['password'], - toolbarState: ToolbarState(), - tabController: tabController, - connToken: args['connToken'], - forceRelay: args['forceRelay'], - isSharedPassword: args['isSharedPassword'], - ), - )); - } else if (call.method == kWindowDisableGrabKeyboard) { - // ??? - } else if (call.method == "onDestroy") { - tabController.clear(); - } else if (call.method == kWindowActionRebuild) { - reloadCurrentWindow(); - } else if (call.method == kWindowEventActiveSession) { - final jumpOk = tabController.jumpToByKey(call.arguments); - if (jumpOk) { - windowOnTop(windowId()); - } - return jumpOk; - } else if (call.method == kWindowEventActiveDisplaySession) { - final args = jsonDecode(call.arguments); - final id = args['id']; - final display = args['display']; - final jumpOk = - tabController.jumpToByKeyAndDisplay(id, display, isCamera: true); - if (jumpOk) { - windowOnTop(windowId()); - } - return jumpOk; - } else if (call.method == kWindowEventGetRemoteList) { - return tabController.state.value.tabs - .map((e) => e.key) - .toList() - .join(','); - } else if (call.method == kWindowEventGetSessionIdList) { - return tabController.state.value.tabs - .map((e) => '${e.key},${(e.page as ViewCameraPage).ffi.sessionId}') - .toList() - .join(';'); - } else if (call.method == kWindowEventGetCachedSessionData) { - // Ready to show new window and close old tab. - final args = jsonDecode(call.arguments); - final id = args['id']; - final close = args['close']; - try { - final viewCameraPage = tabController.state.value.tabs - .firstWhere((tab) => tab.key == id) - .page as ViewCameraPage; - returnValue = viewCameraPage.ffi.ffiModel.cachedPeerData.toString(); - } catch (e) { - debugPrint('Failed to get cached session data: $e'); - } - if (close && returnValue != null) { - closeSessionOnDispose[id] = false; - tabController.closeBy(id); - } - } else if (call.method == kWindowEventRemoteWindowCoords) { - final viewCameraPage = - tabController.state.value.selectedTabInfo.page as ViewCameraPage; - final ffi = viewCameraPage.ffi; - final displayRect = ffi.ffiModel.displaysRect(); - if (displayRect != null) { - final wc = WindowController.fromWindowId(windowId()); - Rect? frame; - try { - frame = await wc.getFrame(); - } catch (e) { - debugPrint( - "Failed to get frame of window $windowId, it may be hidden"); - } - if (frame != null) { - ffi.cursorModel.moveLocal(0, 0); - final coords = RemoteWindowCoords( - frame, - CanvasCoords.fromCanvasModel(ffi.canvasModel), - CursorCoords.fromCursorModel(ffi.cursorModel), - displayRect); - returnValue = jsonEncode(coords.toJson()); - } - } - } else if (call.method == kWindowEventSetFullscreen) { - stateGlobal.setFullscreen(call.arguments == 'true'); - } - _update_remote_count(); - return returnValue; - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_file_transfer_screen.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_file_transfer_screen.dart deleted file mode 100644 index f766033..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_file_transfer_screen.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/desktop/pages/file_manager_tab_page.dart'; -import 'package:provider/provider.dart'; - -/// multi-tab file transfer remote screen -class DesktopFileTransferScreen extends StatelessWidget { - final Map params; - - const DesktopFileTransferScreen({Key? key, required this.params}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return MultiProvider( - providers: [ - ChangeNotifierProvider.value(value: gFFI.ffiModel), - ChangeNotifierProvider.value(value: gFFI.imageModel), - ChangeNotifierProvider.value(value: gFFI.cursorModel), - ChangeNotifierProvider.value(value: gFFI.canvasModel), - ], - child: Scaffold( - backgroundColor: isLinux ? Colors.transparent : null, - body: FileManagerTabPage( - params: params, - ), - ), - ); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_port_forward_screen.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_port_forward_screen.dart deleted file mode 100644 index c586a58..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_port_forward_screen.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/desktop/pages/port_forward_tab_page.dart'; -import 'package:provider/provider.dart'; - -/// multi-tab file port forward screen -class DesktopPortForwardScreen extends StatelessWidget { - final Map params; - - const DesktopPortForwardScreen({Key? key, required this.params}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return MultiProvider( - providers: [ - ChangeNotifierProvider.value(value: gFFI.ffiModel), - ], - child: Scaffold( - backgroundColor: isLinux ? Colors.transparent : null, - body: PortForwardTabPage( - params: params, - ), - ), - ); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_remote_screen.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_remote_screen.dart deleted file mode 100644 index e88078e..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_remote_screen.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/desktop/pages/remote_tab_page.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:provider/provider.dart'; - -/// multi-tab desktop remote screen -class DesktopRemoteScreen extends StatelessWidget { - final Map params; - - DesktopRemoteScreen({Key? key, required this.params}) : super(key: key) { - bind.mainInitInputSource(); - stateGlobal.getInputSource(force: true); - } - - @override - Widget build(BuildContext context) { - return MultiProvider( - providers: [ - ChangeNotifierProvider.value(value: gFFI.ffiModel), - ChangeNotifierProvider.value(value: gFFI.imageModel), - ChangeNotifierProvider.value(value: gFFI.cursorModel), - ChangeNotifierProvider.value(value: gFFI.canvasModel), - ], - child: Scaffold( - // Set transparent background for padding the resize area out of the flutter view. - // This allows the wallpaper goes through our resize area. (Linux only now). - backgroundColor: isLinux ? Colors.transparent : null, - body: ConnectionTabPage( - params: params, - ), - )); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_terminal_screen.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_terminal_screen.dart deleted file mode 100644 index 301489c..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_terminal_screen.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:provider/provider.dart'; - -import 'package:flutter_hbb/desktop/pages/terminal_tab_page.dart'; - -class DesktopTerminalScreen extends StatelessWidget { - final Map params; - - const DesktopTerminalScreen({Key? key, required this.params}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return MultiProvider( - providers: [ - ChangeNotifierProvider.value(value: gFFI.ffiModel), - ], - child: Scaffold( - backgroundColor: isLinux ? Colors.transparent : null, - body: TerminalTabPage( - params: params, - ), - ), - ); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_view_camera_screen.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_view_camera_screen.dart deleted file mode 100644 index a845b89..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/screen/desktop_view_camera_screen.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_hbb/common.dart'; -import 'package:flutter_hbb/desktop/pages/view_camera_tab_page.dart'; -import 'package:flutter_hbb/models/platform_model.dart'; -import 'package:flutter_hbb/models/state_model.dart'; -import 'package:provider/provider.dart'; - -/// multi-tab desktop remote screen -class DesktopViewCameraScreen extends StatelessWidget { - final Map params; - - DesktopViewCameraScreen({Key? key, required this.params}) : super(key: key) { - bind.mainInitInputSource(); - stateGlobal.getInputSource(force: true); - } - - @override - Widget build(BuildContext context) { - return MultiProvider( - providers: [ - ChangeNotifierProvider.value(value: gFFI.ffiModel), - ChangeNotifierProvider.value(value: gFFI.imageModel), - ChangeNotifierProvider.value(value: gFFI.cursorModel), - ChangeNotifierProvider.value(value: gFFI.canvasModel), - ], - child: Scaffold( - // Set transparent background for padding the resize area out of the flutter view. - // This allows the wallpaper goes through our resize area. (Linux only now). - backgroundColor: isLinux ? Colors.transparent : null, - body: ViewCameraTabPage( - params: params, - ), - )); - } -} diff --git a/shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/button.dart b/shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/button.dart deleted file mode 100644 index 0c09f7c..0000000 --- a/shelled/rustdesk-as-ref/flutter/lib/desktop/widgets/button.dart +++ /dev/null @@ -1,171 +0,0 @@ -import 'package:auto_size_text/auto_size_text.dart'; -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - -import '../../common.dart'; - -class Button extends StatefulWidget { - final GestureTapCallback onTap; - final String text; - final double? textSize; - final double? minWidth; - final bool isOutline; - final double? padding; - final Color? textColor; - final double? radius; - final Color? borderColor; - - Button({ - Key? key, - this.minWidth, - this.isOutline = false, - this.textSize, - this.padding, - this.textColor, - this.radius, - this.borderColor, - required this.onTap, - required this.text, - }) : super(key: key); - - @override - State : "" } - {auth && !disconnected && show_elevation_btn ? : "" } -
- {!auth && show_accept_btn ? : "" } - {!auth ? : "" } -
- {auth && !disconnected ? : "" } - {auth && disconnected ? : "" } - - {c.is_file_transfer || c.is_terminal || c.port_forward ? "" :
{svg_chat}
} - -
- {c.is_file_transfer || c.is_terminal || c.port_forward ? "" : } -
- ; - } - - function sendMsg(text) { - if (!text) return; - var { cid, connection } = this; - checkClickTime(function() { - connection.msgs.push({ name: "me", text: text, time: getNowStr()}); - handler.send_msg(cid, text); - body.update(); - }); - } - - event click $(icon.keyboard) (e) { - var { cid, connection } = this; - checkClickTime(function() { - connection.keyboard = !connection.keyboard; - body.update(); - handler.switch_permission(cid, "keyboard", connection.keyboard); - }); - } - - event click $(icon.clipboard) { - var { cid, connection } = this; - checkClickTime(function() { - connection.clipboard = !connection.clipboard; - body.update(); - handler.switch_permission(cid, "clipboard", connection.clipboard); - }); - } - - event click $(icon.audio) { - var { cid, connection } = this; - checkClickTime(function() { - connection.audio = !connection.audio; - body.update(); - handler.switch_permission(cid, "audio", connection.audio); - }); - } - - event click $(icon.file) { - var { cid, connection } = this; - checkClickTime(function() { - connection.file = !connection.file; - body.update(); - handler.switch_permission(cid, "file", connection.file); - }); - } - - event click $(icon.restart) { - var { cid, connection } = this; - checkClickTime(function() { - connection.restart = !connection.restart; - body.update(); - handler.switch_permission(cid, "restart", connection.restart); - }); - } - - event click $(icon.recording) { - var { cid, connection } = this; - checkClickTime(function() { - connection.recording = !connection.recording; - body.update(); - handler.switch_permission(cid, "recording", connection.recording); - }); - } - - event click $(icon.block_input) { - var { cid, connection } = this; - checkClickTime(function() { - connection.block_input = !connection.block_input; - body.update(); - handler.switch_permission(cid, "block_input", connection.block_input); - }); - } - - event click $(button#accept) { - var { cid, connection } = this; - checkClickTime(function() { - connection.authorized = true; - body.update(); - handler.authorize(cid); - self.timer(30ms, function() { - setWindowState(View.WINDOW_MINIMIZED); - }); - }); - } - - event click $(button#elevate_accept) { - var { cid, connection } = this; - checkClickTime(function() { - connection.authorized = true; - show_elevation = false; - body.update(); - handler.elevate_portable(cid); - handler.authorize(cid); - self.timer(30ms, function() { - setWindowState(View.WINDOW_MINIMIZED); - }); - }); - } - - event click $(button#elevate) { - var { cid, connection } = this; - checkClickTime(function() { - show_elevation = false; - body.update(); - handler.elevate_portable(cid); - self.timer(30ms, function() { - setWindowState(View.WINDOW_MINIMIZED); - }); - }); - } - - event click $(button#dismiss) { - var cid = this.cid; - checkClickTime(function() { - handler.close(cid); - }); - } - - event click $(button#disconnect) { - var cid = this.cid; - checkClickTime(function() { - handler.close(cid); - }); - } - - event click $(button#close) { - var cid = this.cid; - if (this.cur >= 0 && this.cur < connections.length){ - handler.remove_disconnected_connection(cid); - connections.splice(this.cur, 1); - if (connections.length > 0) { - if (this.cur > 0) - this.cur -= 1; - else - this.cur = connections.length - 1; - header.update(); - body.update(); - } else { - handler.quit(); - } - } - - } -} - -$(body).content(); - -var header; - -class Header: Reactor.Component -{ - function this() { - header = this; - } - - function render() { - var me = this; - var conn = connections[body.cur]; - if (conn && conn.unreaded > 0) {; - var el = me.select("#unreaded" + conn.id); - if (el) el.style.set { - display: "inline-block", - }; - self.timer(300ms, function() { - conn.unreaded = 0; - var el = me.select("#unreaded" + conn.id); - if (el) el.style.set { - display: "none", - }; - }); - } - var tabs = connections.map(function(c, i) { return me.renderTab(c, i) }); - return
- {tabs} -
-
- < - > -
-
; - } - - function renderTab(c, i) { - var cur = body.cur; - return
- {c.name} - {c.unreaded > 0 ? {c.unreaded} : ""} -
; - } - - function update_cur(idx) { - checkClickTime(function() { - body.cur = idx; - update(); - self.timer(1ms, adjustHeader); - }); - } - - event click $(div.tab) (_, me) { - var idx = me.index; - if (idx == body.cur) return; - this.update_cur(idx); - } - - event click $(span#left-arrow) { - var cur = body.cur; - if (cur == 0) return; - this.update_cur(cur - 1); - } - - event click $(span#right-arrow) { - var cur = body.cur; - if (cur == connections.length - 1) return; - this.update_cur(cur + 1); - } -} - -if (is_osx) { - $(header).content(
); - $(header).attributes["role"] = "window-caption"; -} else { - $(div.window-toolbar).content(
); - setWindowButontsAndIcon(true); -} - -event click $(div.chaticon) { - checkClickTime(function() { - show_chat = !show_chat; - adaptSizeForChat(); - if (show_chat) { - view.focus = $(.outline-focus); - } - }); -} - -function checkClickTime(callback) { - var click_callback_time = getTime(); - handler.check_click_time(body.cid); - self.timer(120ms, function() { - var d = click_callback_time - handler.get_click_time(); - if (d > 120) - callback(); - }); -} - -function adaptSizeForChat() { - $(div.right-panel).style.set { - display: show_chat ? "block" : "none", - }; - var (x, y, w, h) = view.box(#rectw, #border, #screen); - if (show_chat && w < scaleIt(600)) { - view.move(x - (scaleIt(600) - w), y, scaleIt(600), h); - } else if (!show_chat && w > scaleIt(450)) { - view.move(x + (w - scaleIt(300)), y, scaleIt(300), h); - } -} - -function update() { - header.update(); - body.update(); -} - -function bring_to_top(idx=-1) { - if (view.windowState == View.WINDOW_HIDDEN || view.windowState == View.WINDOW_MINIMIZED) { - if (is_linux) { - view.focus = self; - } else { - setWindowState(View.WINDOW_SHOWN); - } - if (idx >= 0) body.cur = idx; - } else { - view.windowTopmost = true; - view.windowTopmost = false; - } -} - -handler.addConnection = function(id, is_file_transfer, is_view_camera, is_terminal, port_forward, peer_id, name, avatar, authorized, keyboard, clipboard, audio, file, restart, recording, block_input) { - stdout.println("new connection #" + id + ": " + peer_id); - var conn; - connections.map(function(c) { - if (c.id == id) conn = c; - }); - if (conn) { - conn.authorized = authorized; - update(); - return; - } - var idx = -1; - connections.map(function(c, i) { - if (c.disconnected && c.peer_id == peer_id) idx = i; - }); - if (!name) name = "NA"; - conn = { - id: id, is_file_transfer: is_file_transfer, is_view_camera: is_view_camera, is_terminal: is_terminal, peer_id: peer_id, - port_forward: port_forward, - avatar: avatar, - name: name, authorized: authorized, time: new Date(), now: new Date(), - keyboard: keyboard, clipboard: clipboard, msgs: [], unreaded: 0, - audio: audio, file: file, restart: restart, recording: recording, - block_input:block_input, - disconnected: false - }; - if (idx < 0) { - connections.push(conn); - body.cur = connections.length - 1; - } else { - connections[idx] = conn; - body.cur = idx; - } - bring_to_top(); - update(); - self.timer(1ms, adjustHeader); - if (authorized) { - self.timer(3s, function() { - setWindowState(View.WINDOW_MINIMIZED); - }); - } -} - -handler.removeConnection = function(id, close) { - var i = -1; - connections.map(function(c, idx) { - if (c.id == id) i = idx; - }); - if (i < 0) return; - if (close) { - connections.splice(i, 1); - } else { - var conn = connections[i]; - conn.disconnected = true; - } - if (connections.length > 0) { - if (body.cur >= i && body.cur > 0 && close) body.cur -= 1; - update(); - } -} - -handler.newMessage = function(id, text) { - var idx = -1; - connections.map(function(c, i) { - if (c.id == id) idx = i; - }); - var conn = connections[idx]; - if (!conn) return; - conn.msgs.push({name: conn.name, text: text, time: getNowStr()}); - bring_to_top(idx); - if (idx == body.cur) { - var shouldAdapt = !show_chat; - show_chat = true; - if (shouldAdapt) adaptSizeForChat(); - } - conn.unreaded += 1; - update(); -} - -handler.showElevation = function(show) { - if (show != show_elevation) { - show_elevation = show; - update(); - } -} - -view << event statechange { - adjustBorder(); -} - -function self.ready() { - adjustBorder(); - var (sw, sh) = view.screenBox(#workarea, #dimension); - var w = scaleIt(300); - var h = scaleIt(400); - view.move(sw - w, 0, w, h); -} - -function getElapsed(time, now) { - var seconds = Date.diff(time, now, #seconds); - var hours = seconds / 3600; - var days = hours / 24; - hours = hours % 24; - var minutes = seconds % 3600 / 60; - seconds = seconds % 60; - var out = String.printf("%02d:%02d:%02d", hours, minutes, seconds); - if (days > 0) { - out = String.printf("%d day%s %s", days, days > 1 ? "s" : "", out); - } - return out; -} - -var ui_status_cache = [""]; -function check_update_ui() { - self.timer(1s, function() { - var approve_mode = handler.get_option('approve-mode'); - var changed = false; - if (ui_status_cache[0] != approve_mode) { - ui_status_cache[0] = approve_mode; - changed = true; - } - if (changed) update(); - check_update_ui(); - }); -} -check_update_ui(); - -function updateTime() { - self.timer(1s, function() { - var now = new Date(); - connections.map(function(c) { - if (!c.authorized) c.time = now; - if (!c.disconnected) c.now = now; - }); - var el = $(#time); - if (el) { - var c = connections[body.cur]; - if (c && c.authorized && !c.disconnected) { - el.text = getElapsed(c.time, c.now); - } - } - updateTime(); - }); -} - -updateTime(); - -var tm0 = getTime(); - -function self.closing() { - if (connections.length == 0 && getTime() - tm0 > 30000) return true; - setWindowState(View.WINDOW_HIDDEN); - return false; -} - - -function adjustHeader() { - var hw = $(header).box(#width) / scaleFactor; - var tabswrapper = $(div.tabs-wrapper); - var tabs = $(div.tabs); - var arrows = $(div.tab-arrows); - if (!arrows) return; - var n = connections.length; - var wtab = 80; - var max = hw - 98; - var need_width = n * wtab + scaleIt(2); // include border of active tab - if (need_width < max) { - arrows.style.set { - display: "none", - }; - tabs.style.set { - width: need_width, - margin-left: 0, - }; - tabswrapper.style.set { - width: need_width, - }; - } else { - var margin = (body.cur + 1) * wtab - max + 30; - if (margin < 0) margin = 0; - arrows.style.set { - display: "block", - }; - tabs.style.set { - width: (max - 20 + margin) + 'px', - margin-left: -margin + 'px' - }; - tabswrapper.style.set { - width: (max + 10) + 'px', - }; - } -} - -view.on("size", adjustHeader); - -// handler.addConnection(0, false, false, 0, "", "test1", true, false, false, true, true); -// handler.addConnection(1, false, false, 0, "", "test2--------", true, false, false, false, false); -// handler.addConnection(2, false, false, 0, "", "test3", true, false, false, false, false); -// handler.newMessage(0, 'h'); diff --git a/shelled/rustdesk-as-ref/src/ui/common.css b/shelled/rustdesk-as-ref/src/ui/common.css deleted file mode 100644 index 16dd6ca..0000000 --- a/shelled/rustdesk-as-ref/src/ui/common.css +++ /dev/null @@ -1,492 +0,0 @@ -html { - var(accent): #0071ff; - var(button): #2C8CFF; - var(gray-bg): #eee; - var(bg): white; - var(border): #ccc; - var(hover-border): #999; - var(text): #222; - var(placeholder): #aaa; - var(lighter-text): #888; - var(light-text): #666; - var(menu-hover): #D7E4F2; - var(dark-red): #A72145; - var(dark-yellow): #FBC732; - var(dark-blue): #2E2459; - var(green-blue): #197260; - var(gray-blue): #2B3439; - var(blue-green): #4299bf; - var(light-green): #D4EAB7; - var(dark-green): #5CB85C; - var(blood-red): #F82600; - var(gray-bg-osx): rgba(238, 238, 238, 0.75); -} - -html.darktheme { - var(bg): #252525; - var(gray-bg): #141414; - var(menu-hover): #2D3033; - var(border): #555; - - var(text): white; - var(light-text): #999; - var(lighter-text): #777; - var(placeholder): #555; - var(gray-bg-osx): rgba(37, 37, 37, 0.75); -} - -body { - margin: 0; - color: color(text); -} - -button.button { - height: 2em; - border-radius: 0.5em; - background: color(button); - color: color(bg); - border-color: color(button); - min-width: 40px; -} - -button[type=checkbox], button[type=checkbox]:active { - background: none; - border: none; - color: unset; - height: 1.4em; -} - -button.outline { - border: color(border) solid 1px; - background: transparent; - color: color(text); -} - -button.button:active, button.active { - background: color(accent); - color: color(bg); - border-color: color(accent); -} - -button.button:hover, button.outline:hover { - border-color: color(hover-border); -} - -button:disabled, -button:disabled:hover { - opacity: 0.3; -} - -button.link { - background: none !important; - border: none; - padding: 0 !important; - color: color(button); - text-decoration: underline; - cursor: pointer; -} - -input[type=text], input[type=password], input[type=number] { - width: *; - font-size: 1.5em; - border-color: color(border); - border-radius: 0; - color: color(text); - padding-left: 0.5em; - background: color(bg); -} - -input:empty { - color: color(placeholder); -} - -input.outline-focus:focus { - outline: color(button) solid 3px; -} - -textarea { - background: color(bg); - color: color(text); -} - -textarea:empty { - color: color(placeholder); -} - -@set my-scrollbar -{ - .prev { display:none; } - .next { display:none; } - .base, .next-page, .prev-page { background: white;} - .slider { background: #bbb; border: white solid 4px; } - .base:disabled { background: transparent; } - .slider:hover { background: grey; } - .slider:active { background: grey; } - .base { size: 16px; } - .corner { background: white; } -} - -@mixin ELLIPSIS { - text-overflow: ellipsis; - white-space: nowrap; - overflow-x: hidden; -} - -.ellipsis { - @ELLIPSIS; -} - -div.password svg:not(.checkmark) { - padding-left: 1em; - size: 16px; - color: #ddd; - background: none; - padding-top: 4px!important; -} - -div.password input { - font-family: Consolas, Menlo, Monaco, 'Courier New'; - font-size: 1.2em; -} - -div.username input { - font-size: 1.2em; -} - -svg { - background: none; -} - -header { - border-bottom: color(border) solid 1px; - height: 22px; - flow: horizontal; - overflow-x: hidden; - position: relative; -} - -@media platform == "OSX" { - header { - background: linear-gradient(top,#E4E4E4,#D1D1D1); - } -} - -header div.window-icon { - size: 22px; -} - -@media platform != "OSX" { -header { - background: white; - height: 30px; -} - -header div.window-icon { - size: 30px; -} -} - -header div.window-icon icon { - display: block; - margin: *; - size: 16px; - background-size: cover; - background-repeat: no-repeat; -} - -header caption { - size: *; -} - -@media platform != "OSX" { - button.window { - top: 0; - padding: 0 10px; - width: 22px; - position: absolute; - color: black; - border: none; - background: none; - border-radius: 0; - } - button.window div { - size: 10px; - margin: *; - background-size: cover; - background-repeat: no-repeat; - } - button.window:hover { - background: color(gray-bg); - } - button.window#minimize { - right: 84px; - } - button.window#maximize { - right: 42px; - } - button.window#close { - right: 0px; - } - button.window#minimize div { - height: 3px; - border-bottom: black solid 1px; - width: 12px; - } - button.window#maximize div { - border: black solid 1px; - } - button.window#close:hover { - background: #F82600; - } - button.window#close:hover div { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMBAMAAACkW0HUAAAAD1BMVEUAAAD///////////////+PQt5oAAAABXRSTlMAO+hBqp3RzLsAAAAuSURBVAjXY3BkAAIRBiEDBgZGZRACMkEYxAJyQRwgV5EBSsEEoUqgGqDaoYYBALKmBEEnAGy8AAAAAElFTkSuQmCC'); - } - button.window#close div { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMBAMAAACkW0HUAAAAD1BMVEUAAAAAAAAAAAAAAAAAAABPDueNAAAABXRSTlMAO+hBqp3RzLsAAAAuSURBVAjXY3BkAAIRBiEDBgZGZRACMkEYxAJyQRwgV5EBSsEEoUqgGqDaoYYBALKmBEEnAGy8AAAAAElFTkSuQmCC'); - size: 12px; - } - button.window#maximize.restore div { - border: none; - size: 12px; - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMAQMAAABsu86kAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAB1JREFUCNdjsP/AoCDA8P8CQ0MABipgaHBg+H8AAMfSC36WAZteAAAAAElFTkSuQmCC'); -} -} - -div.chatbox { - size: *; -} - -div.chatbox div.send svg { - size: 16px; -} - -div.chatbox div.send span:active { - opacity: 0.5; -} - -div.chatbox div.send span { - display: inline-block; - padding: 6px; -} - -div.chatbox .msgs { - border: none; - size: *; - border-bottom: color(border) 1px solid; - overflow-x: hidden; - overflow-y: scroll-indicator; - border-spacing: 1em; - padding: 1em; -} - -div.chatbox div.send { - flow: horizontal; - height: 30px; - padding: 5px; -} - -div.chatbox div.send input { - height: 20px !important; -} - -div.chatbox div.name { - color: color(dark-green); -} - -div.chatbox div.right-side div { - text-align: right; -} - -div.chatbox div.text { - margin-top: 0.5em; -} - -@media platform != "OSX" { -header .window-toolbar { - width: max-content; - background: transparent; - position: absolute; - bottom: 4px; - height: 24px; -} -} - -header svg, menu svg { - size: 14px; -} - -header span, menu span { - padding: 4px 8px; - margin: * 0.5em; - color: color(light-text); -} - -progress { - display: inline-block; - aspect: Progress; - border: none; - margin-right: 1em; - height: 0.25em; - background: transparent; -} - -menu { - background: color(bg); -} - -menu div.separator { - height: 1px; - width: *; - margin: 5px 0; - background: color(gray-bg); - border: none; -} - -menu li { - color: color(text); - position: relative; -} - -menu li span { - display: none; -} - -menu li.selected span:nth-child(1) { - display: inline-block; - position: absolute; - left: -10px; - top: 2px; -} - -.link { - cursor: pointer; - text-decoration: underline; -} - -.link:active { - opacity: 0.5; -} - -menu li:hover { - background: color(menu-hover); - color: color(text); -} - -menu li.line-through, menu li.line-through :hover { - text-decoration-line: line-through; - color: red; -} - -#tags { - size: *; - padding: 0.5em; - overflow-y: scroll-indicator; - border-spacing: 0.5em; - flow: horizontal-flow; -} - -#tags span { - background: color(gray-bg); - display: inline-block; - border-radius: 6px; - padding: 3px 0.5em; - word-wrap: normal; -} - -#tags span.active { - background: color(button); - border-color: color(button); - color: white; -} - -#tags span:hover { - border-color: color(hover-border); -} - -div#msgbox .msgbox-icon svg { - size: 80px; - background: white; - -} - -div#msgbox .form { - border-spacing: 0.5em; -} - -div#msgbox .caption { - @ELLIPSIS; - height: 2em; - line-height: 2em; - text-align: center; - color: color(bg); - font-weight: bold; -} - -div#msgbox .form .text { - @ELLIPSIS; -} - -div#msgbox button.button { - margin-left: 1.6em; -} - -div#msgbox div.password { - position: relative; -} - -div#msgbox div.password svg { - position: absolute; - right: 0.25em; - top: 0.25em; - padding: 0.5em; - color: color(text); -} - -div#msgbox div.set-password > div { - flow: horizontal; -} - -div#msgbox div.set-password > div > span { - width: 30%; - line-height: 2em; -} - -div#msgbox div.set-password div.password { - width: *; -} - -div#msgbox div.set-password div > input { - width: *; -} - -div#msgbox div.set-password input { - font-size: 1em; -} - -.wrap-text { - width: *; - word-wrap: break-word; - overflow-wrap: break-word; - white-space: normal; - height: auto; - overflow: hidden; -} - -div#msgbox #error { - color: red; -} - -div.user-session .title { - font-size: 1.2em; - margin-bottom: 2em; -} - -div.user-session select { - width: 98%; - height: 2em; - border-radius: 0.5em; - border: color(border) solid 1px; - background: color(bg); - color: color(text); - padding-left: 0.5em; -} diff --git a/shelled/rustdesk-as-ref/src/ui/common.tis b/shelled/rustdesk-as-ref/src/ui/common.tis deleted file mode 100644 index 2407990..0000000 --- a/shelled/rustdesk-as-ref/src/ui/common.tis +++ /dev/null @@ -1,482 +0,0 @@ -include "sciter:reactor.tis"; - -var handler = $(#handler) || view; -try { view.windowIcon = self.url(handler.get_icon()); } catch(e) {} -var OS = view.mediaVar("platform"); -var is_osx = OS == "OSX"; -var is_win = OS == "Windows"; -var is_linux = OS == "Linux"; -var is_file_transfer; -var is_xfce = false; -try { is_xfce = handler.is_xfce(); } catch(e) {} - -function isEnterKey(evt) { - return (evt.keyCode == Event.VK_ENTER || - (is_osx && evt.keyCode == 0x4C) || - (is_linux && evt.keyCode == 65421)); -} - -function getScaleFactor() { - if (!is_win) return 1; - var s = self.toPixels(10000dip) / 10000.; - return s < 0.000001 ? 1 : s; -} -var scaleFactor = getScaleFactor(); -view << event resolutionchange { - scaleFactor = getScaleFactor(); -} -function scaleIt(x) { - return (x * scaleFactor).toInteger(); -} -stdout.println("scaleFactor", scaleFactor); - -function translate(name) { - try { - return handler.t(name); - } catch(_) { - return name; - } -} - -function hashCode(str) { - var hash = 160 << 16 + 114 << 8 + 91; - for (var i = 0; i < str.length; i += 1) { - hash = str.charCodeAt(i) + ((hash << 5) - hash); - } - return hash % 16777216; -} - -function intToRGB(i, a = 1) { - return 'rgba(' + ((i >> 16) & 0xFF) + ', ' + ((i >> 8) & 0x7F) - + ',' + (i & 0xFF) + ',' + a + ')'; -} - -function string2RGB(s, a = 1) { - return intToRGB(hashCode(s), a); -} - -function getTime() { - var now = new Date(); - return now.valueOf(); -} - -function platformSvg(platform, color) { - platform = (platform || "").toLowerCase(); - if (platform == "linux") { - return - - - - - ; - } - if (platform == "mac os") { - return - - ; - } - if (platform == "android") { - return ; - } - return - - ; -} - -function centerize(w, h) { - var (sx, sy, sw, sh) = view.screenBox(#workarea, #rectw); - if (w > sw) w = sw; - if (h > sh) h = sh; - var x = (sx + sw - w) / 2; - var y = (sy + sh - h) / 2; - view.move(x, y, w, h); -} - -function setWindowButontsAndIcon(only_min=false) { - if (only_min) { - $(div.window-buttons).content(
-
-
); - } else { - $(div.window-buttons).content(
-
-
-
-
); - } - $(div.window-icon>icon).style.set { - "background-image": "url('" + handler.get_icon() + "')", - }; -} - -function adjustBorder() { - if (is_osx) { - if (view.windowState == View.WINDOW_FULL_SCREEN) { - $(header).style.set { - display: "none", - }; - } else { - $(header).style.set { - display: "block", - padding: "0", - }; - } - return; - } - if (view.windowState == view.WINDOW_MAXIMIZED) { - self.style.set { - border: "window-frame-width solid transparent", - }; - } else if (view.windowState == view.WINDOW_FULL_SCREEN) { - self.style.set { - border: "none", - }; - } else { - self.style.set { - border: "black solid 1px", - }; - } - var el = $(button#maximize); - if (el) el.attributes.toggleClass("restore", view.windowState == View.WINDOW_MAXIMIZED); - el = $(span#fullscreen); - if (el) el.attributes.toggleClass("active", view.windowState == View.WINDOW_FULL_SCREEN); -} - -var svg_checkmark = ; -var svg_edit = - -; -var svg_eye = - - -; -var svg_send = - -; -var svg_chat = - -; -var svg_keyboard = ; - -function scrollToBottom(el) { - var y = el.box(#height, #content) - el.box(#height, #client); - el.scrollTo(0, y); -} - -function getNowStr() { - var now = new Date(); - return String.printf("%02d:%02d:%02d", now.hour, now.minute, now.second); -} - -/******************** start of chatbox ****************************************/ -class ChatBox: Reactor.Component { - this var msgs = []; - this var callback; - - function this(params) { - if (params) { - this.msgs = params.msgs || []; - this.callback = params.callback; - } - } - - function renderMsg(msg) { - var cls = msg.name == "me" ? "right-side msg" : "left-side msg"; - return
- {msg.name == "me" ? -
{msg.time + " "} me
: -
{msg.name} {" " + msg.time}
- } -
{msg.text}
-
; - } - - function render() { - var me = this; - var msgs = this.msgs.map(function(msg) { return me.renderMsg(msg); }); - self.timer(1ms, function() { - scrollToBottom(me.msgs); - }); - return
- - {msgs} - -
- - {svg_send} -
-
; - } - - function send() { - var el = this.$(input); - var value = (el.value || "").trim(); - el.value = ""; - if (!value) return; - if (this.callback) this.callback(value); - } - - event keydown $(input) (evt) { - if (!evt.shortcutKey) { - if (isEnterKey(evt)) { - this.send(); - } - } - } - - event click $(div.send span) { - this.send(); - view.focus = $(input); - } -} -/******************** end of chatbox ****************************************/ - -/******************** start of msgbox ****************************************/ -var remember_password = false; -var last_msgbox_tag = ""; -function msgbox(type, title, content, link="", callback=null, height=180, width=500, hasRetry=false, contentStyle="") { - $(body).scrollTo(0, 0); - if (!type) { - closeMsgbox(); - return; - } - var remember = false; - try { remember = handler.get_remember(); } catch(e) {} - var autoLogin = false; - try { autoLogin = handler.get_option("auto-login") != ''; } catch(e) {} - width += is_xfce ? 50 : 0; - height += is_xfce ? 50 : 0; - - if (type.indexOf("input-password") >= 0) { - callback = function (res) { - if (!res) { - view.close(); - return; - } - handler.login("", "", res.password, res.remember); - if (!is_port_forward) { - // Specially handling file transfer for no permission hanging issue (including 60ms - // timer in setPermission. - // For wrong password input hanging issue, we can not use handler.msgbox. - // But how about wrong password for file transfer? - if (is_file_transfer) handler.msgbox("connecting", "Connecting...", "Logging in..."); - else msgbox("connecting", "Connecting...", "Logging in..."); - } - }; - } else if (type.indexOf("input-2fa") >= 0) { - callback = function (res) { - if (!res) { - view.close(); - return; - } - handler.send2fa(res.code, res.trust_this_device || false); - msgbox("connecting", "Connecting...", "Logging in..."); - }; - } else if (type == "session-login" || type == "session-re-login") { - callback = function (res) { - if (!res) { - view.close(); - return; - } - handler.login(res.osusername, res.ospassword, "", false); - if (!is_port_forward) { - if (is_file_transfer) handler.msgbox("connecting", "Connecting...", "Logging in..."); - else msgbox("connecting", "Connecting...", "Logging in..."); - } - }; - } else if (type.indexOf("session-login") >= 0) { - callback = function (res) { - if (!res) { - view.close(); - return; - } - handler.login(res.osusername, res.ospassword, res.password, res.remember); - if (!is_port_forward) { - if (is_file_transfer) handler.msgbox("connecting", "Connecting...", "Logging in..."); - else msgbox("connecting", "Connecting...", "Logging in..."); - } - }; - } else if (type.indexOf("custom") < 0 && !is_port_forward && !callback) { - callback = function() { view.close(); } - } else if (type == 'wait-remote-accept-nook') { - callback = function (res) { - if (!res) { - view.close(); - return; - } - }; - } - last_msgbox_tag = type + "-" + title + "-" + content + "-" + link; - $(#msgbox).content(); -} - -function connecting() { - handler.msgbox("connecting", "Connecting...", "Connection in progress. Please wait."); -} - -handler.msgbox = function(type, title, text, link = "", hasRetry=false) { - // crash somehow (when input wrong password), even with small time, for example, 1ms - self.timer(60ms, function() { msgbox(type, title, text, link, null, 180, 500, hasRetry); }); -} - -handler.cancel_msgbox = function(tag) { - if (last_msgbox_tag == tag) { - closeMsgbox(); - } -} - -var reconnectTimeout = 1000; -handler.msgbox_retry = function(type, title, text, link, hasRetry) { - handler.msgbox(type, title, text, link, hasRetry); - if (hasRetry) { - self.timer(0, retryConnect); - self.timer(reconnectTimeout, retryConnect); - reconnectTimeout *= 2; - } else { - reconnectTimeout = 1000; - } -} - -function retryConnect(cancelTimer=false) { - if (cancelTimer) self.timer(0, retryConnect); - if (!is_port_forward) connecting(); - handler.reconnect(false); -} -/******************** end of msgbox ****************************************/ - -function Progress() -{ - var _val; - var pos = -0.25; - - function step() { - if( _val !== undefined ) { this.refresh(); return false; } - pos += 0.02; - if( pos > 1.25) - pos = -0.25; - this.refresh(); - return true; - } - - function paintNoValue(gfx) - { - var (w,h) = this.box(#dimension,#inner); - var x = pos * w; - w = w * 0.25; - gfx.fillColor( this.style#color ) - .pushLayer(#inner-box) - .rectangle(x,0,w,h) - .popLayer(); - return true; - } - - this[#value] = property(v) { - get return _val; - set { - _val = undefined; - pos = -0.25; - this.paintContent = paintNoValue; - this.animate(step); - this.refresh(); - } - } - - this.value = ""; -} - -var svg_eye_cross = - - -; - -class PasswordComponent: Reactor.Component { - this var visible = false; - this var value = ''; - this var name = 'password'; - - function this(params) { - if (params && params.value) { - this.value = params.value; - } - if (params && params.name) { - this.name = params.name; - } - } - - function render() { - return
- - {this.visible ? svg_eye_cross : svg_eye} -
; - } - - event click $(svg) { - var el = this.$(input); - var value = el.value; - var start = el.xcall(#selectionStart) || 0; - var end = el.xcall(#selectionEnd); - this.update({ visible: !this.visible }); - var me = this; - self.timer(30ms, function() { - var el = me.$(input); - view.focus = el; - el.value = value; - el.xcall(#setSelection, start, end); - }); - } -} - -// type: #post, #get, #delete, #put -function httpRequest(url, type, params, _onSuccess, _onError, headers="") { - if (type != #post) { - stderr.println("only post ok"); - } - handler.post_request(url, JSON.stringify(params), headers); - function check_status() { - var status = handler.get_async_job_status(); - if (status == " ") self.timer(0.1s, check_status); - else { - try { - var data = JSON.parse(status || "{}"); - _onSuccess(data); - } catch (e) { - _onError(status, 0); - } - } - } - check_status(); -} - -function isReasonableSize(r) { - var x = r[0]; - var y = r[1]; - var n = scaleIt(3200); - return !(x < -n || x > n || y < -n || y > n); -} - -function awake() { - view.windowState = View.WINDOW_SHOWN; - view.focus = self; -} - -class MultipleSessionComponent extends Reactor.Component { - this var sessions = []; - this var messageText = translate("Please select the session you want to connect to"); - - function this(params) { - if (params && params.sessions) { - this.sessions = params.sessions; - } - } - - function render() { - return
-
{this.messageText}
- -
; - } -} \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/src/ui/file_transfer.css b/shelled/rustdesk-as-ref/src/ui/file_transfer.css deleted file mode 100644 index 7fd4ac7..0000000 --- a/shelled/rustdesk-as-ref/src/ui/file_transfer.css +++ /dev/null @@ -1,269 +0,0 @@ -div#file-transfer-wrapper { - size:*; - display: none; -} - -div#file-transfer { - size: *; - margin: 0; - flow: horizontal; - background: color(gray-bg); - padding: 0.5em; -} - -table -{ - font: system; - border: 1px solid color(border); - flow: table-fixed; - prototype: Grid; - size: *; - padding:0; - border-spacing: 0; - overflow-x: auto; - overflow-y: hidden; -} - -table > thead { - behavior: column-resizer; - border-bottom: color(border) solid 1px; -} - -table > tbody { - behavior: select-multiple; - overflow-y: scroll-indicator; - size: *; - background: white; -} - -table th { - background-color: color(gray-bg); -} - -table th -{ - padding: 4px; - foreground-repeat: no-repeat; - foreground-position: 50% 3px auto auto; - border-left: color(border) solid 1px; -} - -table th.sortable[sort=asc] -{ - foreground-image: url(stock:arrow-down); -} - -table th.sortable[sort=desc] -{ - foreground-image: url(stock:arrow-up); -} - -table th:nth-child(1) { - width: 32px; -} - -table th:nth-child(2) { - width: *; -} - -table th:nth-child(3) { - width: *; -} - -table th:nth-child(4) { - width: 45px; -} - -table.has_current thead th:current { - font-weight: bold; -} - -table tr:nth-child(odd) { background-color: white; } /* each odd row */ -table tr:nth-child(even) { background-color: #F4F5F6; } /* each even row */ - -table.has_current tr:current /* current row */ -{ - background-color: color(accent); -} - -table.has_current tbody tr:checked -{ - background-color: color(accent); -} - -table.has_current tbody tr:checked td { - color: highlighttext; -} - -table td -{ - padding: 4px; - text-align: left; - font-size: 1em; - height: 1.4em; - @ELLIPSIS; -} - -table.folder-view td:nth-child(1) { - behavior:shell-icon; -} - -table td:nth-child(3), table td:nth-child(4) { - color: color(lighter-text); - font-size: 0.9em; -} - -table.has_current tr:current td { - color: white; -} - -table td:nth-child(4) { - text-align: right; -} - -section { - size: *; - margin: 1em; - border-spacing: 0.5em; -} - -table td:nth-child(1) { - foreground-repeat: no-repeat; - foreground-position: 50% 50% -} - -div.toolbar { - flow: horizontal; -} - -div.toolbar svg { - size: 16px; -} - -div.toolbar .spacer { - width: *; -} - -div.toolbar > div.button { - padding: 4px 8px; - opacity: 0.66; -} - -div.toolbar > div.button:active { - opacity: 1; - background-color: #ddd; -} - -div.toolbar > div.button:hover { - opacity: 1; -} - -div.toolbar > div.send { - flow: horizontal; - border-spacing: 0.5em; -} - -div.remote > div.send svg { - transform: scale(-1, 1); -} - -div.navbar { - border: color(border) solid 1px; - padding: 4px 0; -} - -select.select-dir { - width: *; - padding: 0 4px; -} - -div.title { - flow: horizontal; - border-spacing: 1em; - position: relative; -} - -div.title svg.computer { - size: 48px; -} - -div.title div { - margin: * 0; - color: color(light-text); -} - -div.title div.platform { - position: absolute; - left: 12px; - top: 7px; -} - -div.title div.platform svg { - size: 24px; -} - -table.job-table tr td { - width: *; - padding: 0.5em 1em; - border-bottom: color(border) 1px solid; - flow: horizontal; - border-spacing: 1em; - height: 3em; - overflow-x: hidden; -} - -table.job-table tr svg { - size: 16px; -} - -table.job-table tr.is_remote svg { - transform: scale(-1, 1); -} - -table.job-table tr.is_remote div.svg_continue svg { - transform: scale(1, 1); -} - -table.job-table tr td div.text { - width: *; - overflow-x: hidden; -} - -table.job-table tr td div.path { - width: *; - color: color(light-text); - @ELLIPSIS; -} - -table.job-table tr:current td div.path { - color: white; -} - -table#port-forward thead tr th { - padding-left: 1em; - size: *; -} - -table#port-forward tr td { - height: 3em; - text-align: left; -} - -table#port-forward input[type=text], table#port-forward input[type=number] { - font-size: 1.2em; -} - -table#port-forward td.right-arrow svg { - size: 1.2em; - transform: rotate(180deg); -} - -table#port-forward td.remove svg { - size: 0.8em; -} - -table#port-forward tr.value td { - padding-left: 1em; - font-size: 1.5em; - color: black; -} diff --git a/shelled/rustdesk-as-ref/src/ui/file_transfer.tis b/shelled/rustdesk-as-ref/src/ui/file_transfer.tis deleted file mode 100644 index 1090c01..0000000 --- a/shelled/rustdesk-as-ref/src/ui/file_transfer.tis +++ /dev/null @@ -1,819 +0,0 @@ -var remote_home_dir; - -var svg_add_folder = - - -; -var svg_trash = - - - -; -var svg_arrow = - -; -var svg_home = - -; -var svg_refresh = - -; -var svg_cancel = ; -var svg_continue = ; -var svg_computer = - - - -; - -function getSize(type, size) { - if (!size) { - if (type <= 3) return ""; - return "0B"; - } - size = size.toFloat(); - var toFixed = function(size) { - size = (size * 100).toInteger(); - var a = (size / 100).toInteger(); - if (size % 100 == 0) return a; - if (size % 10 == 0) return a + '.' + (size % 10); - var b = size % 100; - if (b < 10) b = '0' + b; - return a + '.' + b; - } - if (size < 1024) return size.toInteger() + "B"; - if (size < 1024 * 1024) return toFixed(size / 1024) + "K"; - if (size < 1024 * 1024 * 1024) return toFixed(size / (1024 * 1024)) + "M"; - return toFixed(size / (1024 * 1024 * 1024)) + "G"; -} - -function getParentPath(is_remote, path) { - var sep = handler.get_path_sep(is_remote); - var res = path.lastIndexOf(sep); - if (res <= 0) return "/"; - return path.substr(0, res); -} - -function getFileName(is_remote, path) { - var sep = handler.get_path_sep(is_remote); - var res = path.lastIndexOf(sep); - return path.substr(res + 1); -} - -function getExt(name) { - if (name.indexOf(".") == 0) { - return ""; - } - var i = name.lastIndexOf("."); - if (i > 0) return name.substr(i + 1); - return ""; -} - -class JobTable: Reactor.Component { - this var jobs = []; - this var job_map = {}; - - function render() { - var me = this; - var rows = this.jobs.map(function(job, i) { return me.renderRow(job, i); }); - return
- - {rows} - -
; - } - - event click $(svg.cancel) (_, me) { - var job = this.jobs[me.parent.parent.index]; - var id = job.id; - handler.cancel_job(id); - delete this.job_map[id]; - var i = -1; - this.jobs.map(function(job, idx) { - if (job.id == id) i = idx; - }); - this.jobs.splice(i, 1); - this.update(); - var is_remote = job.is_remote; - if (job.type != "del-dir") is_remote = !is_remote; - refreshDir(is_remote); - } - - event click $(svg.continue) (_, me) { - var job = this.jobs[me.parent.parent.parent.index]; - var id = job.id; - this.continueJob(id); - this.update(); - } - - function clearAllJobs() { - this.jobs = []; - this.job_map = {}; - this.update(); - } - - function send(path, is_remote) { - var to; - var show_hidden; - if (is_remote) { - to = file_transfer.local_folder_view.fd.path; - show_hidden = file_transfer.remote_folder_view.show_hidden; - } else { - to = file_transfer.remote_folder_view.fd.path; - show_hidden = file_transfer.local_folder_view.show_hidden; - } - if (!to) return; - to += handler.get_path_sep(!is_remote) + getFileName(is_remote, path); - var id = handler.get_next_job_id(); - this.jobs.push({ type: "transfer", - id: id, path: path, to: to, - include_hidden: show_hidden, - is_remote: is_remote, - is_last: false - }); - this.job_map[id] = this.jobs[this.jobs.length - 1]; - handler.send_files(id, 0, path, to, 0, show_hidden, is_remote); - var self = this; - self.timer(30ms, function() { self.update(); }); - } - - function addJob(id, path, to, file_num, show_hidden, is_remote, auto_start) { - var job = { type: "transfer", - id: id, path: path, to: to, - include_hidden: show_hidden, - is_remote: is_remote, is_last: true, file_num: file_num }; - this.jobs.push(job); - this.job_map[id] = this.jobs[this.jobs.length - 1]; - handler.update_next_job_id(id + 1); - handler.add_job(id, 0, path, to, file_num, show_hidden, is_remote); - if (auto_start) { - this.continueJob(id); - this.update(); - } - stdout.println(JSON.stringify(job)); - } - - function continueJob(id) { - var job = this.job_map[id]; - if (job == null || !job.is_last){ - return; - } - job.is_last = false; - handler.resume_job(job.id, job.is_remote); - } - - function addDelDir(path, is_remote) { - var id = handler.get_next_job_id(); - this.jobs.push({ type: "del-dir", id: id, path: path, is_remote: is_remote }); - this.job_map[id] = this.jobs[this.jobs.length - 1]; - this.update(); - } - - function addDelFile(path, is_remote) { - var id = handler.get_next_job_id(); - this.jobs.push({ type: "del-file", id: id, path: path, is_remote: is_remote }); - this.job_map[id] = this.jobs[this.jobs.length - 1]; - this.update(); - } - - function confirmDeletePolling(is_remote) { - for(var i=0;i n) i = n; - var res = i + ' / ' + n + " " + translate("files"); - if (job.total_size > 0) { - var s = getSize(0, job.finished_size); - if (s) s += " / "; - res += ", " + s + getSize(0, job.total_size); - } - // below has problem if some file skipped - var percent = job.total_size == 0 ? 100 : (100. * job.finished_size / job.total_size).toInteger(); // (100. * i / (n || 1)).toInteger(); - if (job.finished) percent = '100'; - if (percent) res += ", " + percent + "%"; - if (job.finished) { - if (job.err == "skipped") { - res = translate("Skipped") + " " + res; - } else { - res = translate("Finished") + " " + res; - } - } - if (job.speed) res += ", " + getSize(0, job.speed) + "/s"; - return res; - } - - function updateJob(job) { - var el = this.select("div[id=s" + job.id + "]"); - if (el) el.text = this.getStatus(job); - } - - function updateJobStatus(id, file_num = -1, err = null, speed = null, finished_size = 0) { - var job = this.job_map[id]; - if (job.type == "del-file"){ - job.finished = true; - job.err = err; - refreshDir(job.is_remote); - this.updateJob(job); - return; - } - if (!job) return; - if (file_num < job.file_num) return; - job.file_num = file_num; - var n = job.num_entries || job.entries.length; - job.finished = job.file_num >= n - 1 || err == "cancel" || err == "skipped"; - job.finished_size = finished_size; - job.speed = speed || 0; - job.err = err; - this.updateJob(job); - if (job.type == "del-dir") { - if (job.finished) { - if (!err) { - handler.remove_dir(job.id, job.path, job.is_remote); - refreshDir(job.is_remote); - // Use the job's is_remote; local variable `is_remote` is undefined in this scope. - if (job.is_remote) file_transfer.remote_folder_view.table.resetCurrent(); - else file_transfer.local_folder_view.table.resetCurrent(); - } - } else if (!job.no_confirm) { - handler.confirm_delete_files(id, job.file_num + 1); - } - } else if (job.finished || file_num == -1) { - refreshDir(!job.is_remote); - } - } - - function renderRow(job, i) { - var svg = this.getSvg(job); - return - {svg} -
-
{job.path}
-
{this.getStatus(job)}
-
-
- {svg_continue} -
- {svg_cancel} - ; - } -} - -class FolderView : Reactor.Component { - this var fd = {}; - this var history = []; - this var show_hidden = false; - - function sep() { - return handler.get_path_sep(this.is_remote); - } - - function this(params) { - this.is_remote = params.is_remote; - if (this.is_remote) { - this.show_hidden = !!handler.get_option("remote_show_hidden"); - } else { - this.show_hidden = !!handler.get_option("local_show_hidden"); - } - if (!this.is_remote) { - var dir = handler.get_option("local_dir"); - if (dir) { - this.fd = handler.read_dir(dir, this.show_hidden); - if (this.fd) return; - } - this.fd = handler.read_dir(handler.get_home_dir(), this.show_hidden); - } - } - - // sort predicate - function foldersFirst(a, b) { - if (a.type <= 3 && b.type > 3) return -1; - if (a.type > 3 && b.type <= 3) return +1; - if (a.name == b.name) return 0; - return a.name.toLowerCase().lexicalCompare(b.name.toLowerCase()); - } - - function render() - { - return
- {this.renderTitle()} - {this.renderNavBar()} - {this.renderOpBar()} - {this.renderTable()} -
; - } - - function renderTitle() { - return
- {svg_computer} -
{platformSvg(handler.get_platform(this.is_remote), "white")}
-
{translate(this.is_remote ? "Remote Computer" : "Local Computer")}
-
- } - - function renderNavBar() { - return
-
{svg_home}
-
{svg_arrow}
-
{svg_arrow}
- {this.renderSelect()} -
{svg_refresh}
-
; - } - - function renderSelect() { - return ; - } - - function renderOpBar() { - if (this.is_remote) { - return
-
{svg_send}{translate('Receive')}
-
-
{svg_add_folder}
-
{svg_trash}
-
; - } - return
-
{svg_add_folder}
-
{svg_trash}
-
-
{translate('Send')}{svg_send}
-
; - } - - function get_updated() { - this.table.sortRows(false); - if (this.fd && this.fd.path) this.select_dir.value = this.fd.path; - } - - function renderTable() { - var fd = this.fd; - var entries = fd.entries || []; - var table = this.table; - if (!table || !table.sortBy) { - entries.sort(this.foldersFirst); - } - var me = this; - var path = fd.path; - if (path != "/" && path) { - entries = [{ name: "..", type: 1 }].concat(entries); - } - var rows = entries.map(function(e) { return me.renderRow(e); }); - var id = (this.is_remote ? "remote" : "local") + "-folder-view"; - return - - - - - {rows} - - - -
  • {svg_checkmark}{translate('Show Hidden Files')}
  • - -
    -
    {translate('Name')}{translate('Modified')}{translate('Size')}
    ; - } - - function joinPath(name) { - var path = this.fd.path; - if (path == "/") { - if (this.sep() == "/") return this.sep() + name; - else return name; - } - return path + (path[path.length - 1] == this.sep() ? "" : this.sep()) + name; - } - - function attached() { - var me = this; - this.table.onRowDoubleClick = function (row) { - var type = row[0].attributes["type"]; - if (type > 3) return; - var name = row[1].text; - var path = name == ".." ? getParentPath(me.is_remote, me.fd.path) : me.joinPath(name); - me.table.resetCurrent(); - me.goto(path, true); - } - this.get_updated(); - } - - function goto(path, push) { - if (!path) return; - if (this.sep() == "\\" && path.length == 2) { // windows drive - path += "\\"; - } - if (push) this.pushHistory(); - if (this.is_remote) { - handler.read_remote_dir(path, this.show_hidden); - } else { - var fd = handler.read_dir(path, this.show_hidden); - this.refresh({ fd: fd }); - } - } - - function refresh(data) { - if (!data.fd || !data.fd.path) return; - if (this.is_remote && !remote_home_dir) { - remote_home_dir = data.fd.path; - } - this.update(data); - var me = this; - self.timer(1ms, function() { me.get_updated(); }); - } - - function renderRow(entry) { - var path; - if (this.is_remote) { - path = handler.get_icon_path(entry.type, getExt(entry.name)); - } else { - path = this.joinPath(entry.name); - } - var tm = entry.time ? new Date(entry.time.toFloat() * 1000.).toLocaleString() : 0; - return - - {entry.name} - {tm || ""} - {getSize(entry.type, entry.size)} - ; - } - - event click $(#switch-hidden) { - this.show_hidden = !this.show_hidden; - this.refreshDir(); - } - - event click $(.goup) () { - var path = this.fd.path; - if (!path || path == "/") return; - path = getParentPath(this.is_remote, path); - this.goto(path, true); - } - - event click $(.goback) () { - var path = this.history.pop(); - if (!path) return; - this.goto(path, false); - } - - event click $(.trash) () { - var rows = this.getCurrentRows(); - if (!rows || rows.length == 0) return; - - var delete_dirs = new Array(); - - for (var i = 0; i < rows.length; ++i) { - var row = rows[i]; - - var path = row[0]; - var type = row[1]; - - var new_history = []; - for (var j = 0; j < this.history.length; ++j) { - var h = this.history[j]; - if ((h + this.sep()).indexOf(path + this.sep()) == -1) new_history.push(h); - } - this.history = new_history; - if (type == 1) { - file_transfer.job_table.addDelDir(path, this.is_remote); - } else { - file_transfer.job_table.addDelFile(path, this.is_remote); - } - } - file_transfer.job_table.confirmDeletePolling(this.is_remote); - } - - event click $(.add-folder) () { - var me = this; - msgbox("custom", translate("Create Folder"), "
    \ -
    " + translate("Please enter the folder name") + ":
    \ -
    \ -
    ", "", function(res=null) { - if (!res) return; - if (!res.name) return; - var name = res.name.trim(); - if (!name) return; - if (name.indexOf(me.sep()) >= 0) { - handler.msgbox("custom-error", "Create Folder", "Invalid folder name"); - return; - } - var path = me.joinPath(name); - var id = handler.get_next_job_id(); - handler.create_dir(id, path, me.is_remote); - create_dir_jobs[id] = { is_remote: me.is_remote, path: path }; - }); - } - - function refreshDir() { - this.goto(this.fd.path, false); - } - - event click $(.refresh) () { - this.refreshDir(); - } - - event click $(.home) () { - var path = this.is_remote ? remote_home_dir : handler.get_home_dir(); - if (!path) return; - if (path == this.fd.path) return; - this.goto(path, true); - } - - function getCurrentRow() { - var row = this.table.getCurrentRow(); - if (!row) return; - var name = row[1].text; - if (!name || name == "..") return; - var type = row[0].attributes["type"]; - return [this.joinPath(name), type]; - } - - function getCurrentRows() { - var rows = this.table.getCurrentRows(); - if (!rows || rows.length== 0) return; - - var records = new Array(); - - for (var i = 0; i < rows.length; ++i) { - var name = rows[i][1].text; - if (!name || name == "..") continue; - - var type = rows[i][0].attributes["type"]; - records.push([this.joinPath(name), type]); - } - return records; - } - - event click $(.send) () { - var rows = this.getCurrentRows(); - if (!rows || rows.length == 0) return; - for (var i = 0; i < rows.length; ++i) { - file_transfer.job_table.send(rows[i][0], this.is_remote); - } - } - - event change $(.select-dir) (_, el) { - var x = getTime() - last_key_time; - if (x < 1000) return; - if (this.fd.path != el.value) { - this.goto(el.value, true); - } - } - - event keydown $(.select-dir) (evt, me) { - if (isEnterKey(evt)) { - this.goto(me.value, true); - } - } - - function pushHistory() { - var path = this.fd.path; - if (!path) return; - if (path != this.history[this.history.length - 1]) this.history.push(path); - } -} - -var file_transfer; - -class FileTransfer: Reactor.Component { - function this() { - file_transfer = this; - } - - function render() { - return
    - - - -
    ; - } -} - -function initializeFileTransfer() -{ - $(#file-transfer-wrapper).content(); - $(#video-wrapper).style.set { visibility: "hidden", position: "absolute" }; - $(#file-transfer-wrapper).style.set { display: "block" }; -} - -handler.updateFolderFiles = function(fd) { - // stdout.println("update folder files: " + JSON.stringify(fd)); - fd.entries = fd.entries || []; - if (fd.id > 0) { - var jt = file_transfer.job_table; - var job = jt.job_map[fd.id]; - if (job) { - job.file_num = -1; - job.total_size = fd.total_size; - job.entries = fd.entries; - job.num_entries = fd.num_entries; - file_transfer.job_table.updateJobStatus(job.id); - } - } else { - file_transfer.remote_folder_view.refresh({ fd: fd }); - } -} - -handler.jobProgress = function(id, file_num, speed, finished_size) { - file_transfer.job_table.updateJobStatus(id, file_num, null, speed, finished_size); -} - -handler.jobDone = function(id, file_num = -1) { - var job = create_dir_jobs[id]; - if (job) { - refreshDir(job.is_remote); - return; - } - file_transfer.job_table.updateJobStatus(id, file_num); -} - -handler.jobError = function(id, err, file_num = -1) { - var job = deleting_single_file_jobs[id]; - if (job) { - msgbox("custom-error", "Delete File", err); - return; - } - job = create_dir_jobs[id]; - if (job) { - msgbox("custom-error", "Create Folder", err); - return; - } - if (file_num < 0) { - handler.msgbox("custom-error", "Failed", err); - } - file_transfer.job_table.updateJobStatus(id, file_num, err); -} - -handler.clearAllJobs = function() { - file_transfer.job_table.clearAllJobs(); -} - -handler.addJob = function (id, path, to, file_num, show_hidden, is_remote, auto_start) { // load last job - // stdout.println("restore job: " + is_remote); - file_transfer.job_table.addJob(id,path,to,file_num,show_hidden,is_remote,auto_start); -} - -handler.updateTransferList = function () { - file_transfer.job_table.update(); -} - -function refreshDir(is_remote) { - if (is_remote) file_transfer.remote_folder_view.refreshDir(); - else file_transfer.local_folder_view.refreshDir(); -} - -var deleting_single_file_jobs = {}; -var create_dir_jobs = {} - -function confirmDelete(id ,path, is_remote) { - msgbox("custom-skip", "Confirm Delete", "
    \ -
    " + translate('Are you sure you want to delete this file?') + "
    \ - " + path + "
    \ -
    ", "", function(res=null) { - if (!res) { - file_transfer.job_table.updateJobStatus(id, -1, "cancel"); - file_transfer.job_table.cancelDeletePolling(); - } else if (res.skip) { - file_transfer.job_table.updateJobStatus(id, -1, "cancel"); - file_transfer.job_table.confirmDeletePolling(is_remote); - } else { - handler.remove_file(id, path, 0, is_remote); - if (is_remote) file_transfer.remote_folder_view.table.resetCurrent(); - else file_transfer.local_folder_view.table.resetCurrent(); - deleting_single_file_jobs[id] = { is_remote: is_remote, path: path }; - file_transfer.job_table.confirmDeletePolling(is_remote); - } - }); -} - -handler.confirmDeleteFiles = function(id, i, name) { - var jt = file_transfer.job_table; - var job = jt.job_map[id]; - if (!job) return; - var n = job.num_entries; - if (i >= n) return; - var file_path = job.path; - if (name) file_path += handler.get_path_sep(job.is_remote) + name; - msgbox("custom-skip", "Confirm Delete", "
    \ -
    " + translate('Deleting') + " #" + (i + 1) + " / " + n + " " + translate('files') + ".
    \ -
    " + translate('Are you sure you want to delete this file?') + "
    \ - " + file_path + "
    \ -
    " + translate('Do this for all conflicts') + "
    \ -
    ", "", function(res=null) { - if (!res) { - jt.updateJobStatus(id, i - 1, "cancel"); - file_transfer.job_table.cancelDeletePolling(); - } else if (res.skip) { - if (res.remember){ - jt.updateJobStatus(id, i, "cancel"); - } else{ - handler.jobDone(id, i); - } - file_transfer.job_table.confirmDeletePolling(job.is_remote); - } else { - job.no_confirm = res.remember; - if (job.no_confirm){ - handler.set_no_confirm(id); - file_transfer.job_table.confirmDeletePolling(job.is_remote); - } - handler.remove_file(id, file_path, i, job.is_remote); - } - if(i+1 >= n){ - file_transfer.job_table.confirmDeletePolling(job.is_remote); - } - }); -} - -handler.overrideFileConfirm = function(id, file_num, to, is_upload, is_identical) { - var jt = file_transfer.job_table; - var identical_msg = is_identical ? translate("identical_file_tip"): ""; - msgbox("custom-skip", "Confirm Write Strategy", "
    \ -
    " + translate('Overwrite') + " " + translate('files') + ".
    \ -
    " + translate('This file exists, skip or overwrite this file?') + "
    \ - " + to + "
    \ -
    " + identical_msg + "
    \ -
    " + translate('Do this for all conflicts') + "
    \ -
    ", "", function(res=null) { - if (!res) { - jt.updateJobStatus(id, -1, "cancel"); - handler.cancel_job(id); - } else if (res.skip) { - if (res.remember){ - handler.set_write_override(id,file_num,false,true, is_upload); // - } else { - handler.set_write_override(id,file_num,false,false,is_upload); // - } - } else { - if (res.remember){ - handler.set_write_override(id,file_num,true,true,is_upload); // - } else { - handler.set_write_override(id,file_num,true,false,is_upload); // - } - } - }); -} - -function save_file_transfer_close_state() { - var local_dir = file_transfer.local_folder_view.fd.path || ""; - var local_show_hidden = file_transfer.local_folder_view.show_hidden ? "Y" : ""; - var remote_dir = file_transfer.remote_folder_view.fd.path || ""; - var remote_show_hidden = file_transfer.remote_folder_view.show_hidden ? "Y" : ""; - handler.save_close_state("local_dir", local_dir); - handler.save_close_state("local_show_hidden", local_show_hidden); - handler.save_close_state("remote_dir", remote_dir); - handler.save_close_state("remote_show_hidden", remote_show_hidden); -} diff --git a/shelled/rustdesk-as-ref/src/ui/grid.tis b/shelled/rustdesk-as-ref/src/ui/grid.tis deleted file mode 100644 index 6560521..0000000 --- a/shelled/rustdesk-as-ref/src/ui/grid.tis +++ /dev/null @@ -1,258 +0,0 @@ -var last_key_time = 0; -var keymap = {}; -for (var (k, v) in Event) { - k = k + "" - if (k[0] == "V" && k[1] == "K") { - keymap[v] = k; - } -} - -class Grid: Behavior { - const TABLE_HEADER_CLICK = 0x81; - const TABLE_ROW_CLICK = 0x82; - const TABLE_ROW_DBL_CLICK = 0x83; - function onHeaderClick(headerCell) - { - this.postEvent(TABLE_HEADER_CLICK, headerCell.index, headerCell); - return true; - } - - function onRowClick(row , reason) - { - this.postEvent(TABLE_ROW_CLICK, row.index, row); - return true; - } - - function onRowDoubleClick(row) - { - this.postEvent(TABLE_ROW_DBL_CLICK, row.index, row); - return true; - } - - function getCurrentRow() - { - return this.$(tbody>tr:current); - } - - function getCurrentRows() - { - return this.$$(tbody>tr:checked); - } - - function getCurrentColumn() - { - return this.$(thead>:current); // return current cell in header row - } - - function resetCurrent() { - var rows = this.getCurrentRows(); - for (var i = 0; i < rows.length; ++i) { - var row = rows[i]; - row.state.current = false; - row.state.checked = false; - } - } - - function setCurrentRow(row, reason = #by_code, doubleClick = false) - { - if (!row) return; - // get previously selected row: - var prev = this.getCurrentRow(); - if (prev) - { - if (prev === row && !doubleClick) return; // already here, nothing to do. - prev.state.current = false; // drop state flag - prev.state.checked = false; // drop state flag - } - row.state.current = true; - row.state.checked = true; - row.scrollToView(); - - if (doubleClick) - this.onRowDoubleClick(row,reason); - else - this.onRowClick(row,reason); - } - - function setCurrentColumn(col) - { - // get previously selected column: - var prev = this.getCurrentColumn(); - if (prev) - { - if (prev === col) return; // already here, nothing to do. - prev.state.current = false; // drop state flag - } - col.state.current = true; // set state flag - col.scrollToView(); - this.onHeaderClick(col); - } - - function sortRows(sortClicked) - { - var col = this.sortBy; - if (!col) return; - var byColumn = col.index; - var nowDesc = (col.attributes["sort"] || "desc") == "desc"; - if (sortClicked) (this.$(thead [sort]) || col).attributes["sort"] = undefined; // drop any other sort order. - var getValue = function(x) { - var value = x.attributes["value"]; - if (value == undefined) return x.text.toLowerCase(); - return value.toFloat(); - } - var sort = function(r1, r2, asc) { - if (r1[1].text == "..") { - return -1; - } - if (r2[1].text == "..") { - return 1; - } - if (!asc) - return getValue(r1[byColumn]) < getValue(r2[byColumn]) ? -1 : 1; - else - return getValue(r1[byColumn]) > getValue(r2[byColumn]) ? -1 : 1; - } - if (nowDesc) - { - if (sortClicked) col.attributes["sort"] = "asc"; - this.body.sort(:r1, r2: sort(r1, r2, sortClicked ? true : false)); - } else { - if (sortClicked) col.attributes["sort"] = "desc"; - this.body.sort(:r1, r2: sort(r1, r2, sortClicked ? false : true)); - } - } - - function attached() - { - assert this.tag == "table" : "wrong element type for grid, table expected"; - this.body = this.$(:root>tbody); - assert this.body : "Grid require element"; - } - - function onMouse(evt) - { - if ((evt.type != Event.MOUSE_DOWN) && (evt.type != Event.MOUSE_DCLICK)) - return false; - - if (!evt.mainButton) - return false; - - // auxiliary function, returns row this target element belongs to - function targetRow(target) { return target.$p(tbody>tr); } - - // auxiliary function, returns row this target element belongs to - function targetHeaderCell(target) { return target.$p(thead>tr>th); } - - if (var row = targetRow(evt.target)) // click on the row - this.setCurrentRow(row, #by_mouse, evt.type == Event.MOUSE_DCLICK); - else if (var headerCell = targetHeaderCell(evt.target)) - { - this.setCurrentColumn(headerCell); // click on the header cell - if (evt.type != Event.MOUSE_DCLICK && headerCell.$is(.sortable)) { - this.sortBy = headerCell; - this.sortRows(true); - } - } - - //return true; // as it is always ours then stop event bubbling - } - - function onFocus(evt) - { - return (evt.type == Event.GOT_FOCUS || evt.type == Event.LOST_FOCUS); - } - - function onKey(evt) - { - last_key_time = getTime(); - if (evt.type != Event.KEY_DOWN) - return false; - - switch(evt.keyCode) - { - case Event.VK_DOWN: - { - var crow = this.getCurrentRow(); - var idx = crow? crow.index + 1 : 0; - if (idx < this.body.length) this.setCurrentRow(this.body[idx],#by_key); - } - return true; - - case Event.VK_UP: - { - var crow = this.getCurrentRow(); - var idx = crow? crow.index - 1 : this.length - 1; - if (idx >= 0) this.setCurrentRow(this.body[idx],#by_key); - } - return true; - - case Event.VK_PRIOR: - { - var y = this.body.scroll(#top) - this.body.scroll(#height); - var r; - for(var i = this.body.length - 1; i >= 0; --i) - { - var pr = r; r = this.body[i]; - if (r.box(#top, #inner, #content) < y) - { - // this row is further than scroll pos - height of scroll area - this.setCurrentRow(pr? pr: r,#by_key); // to last fully visible - return true; - } - } - this.setCurrentRow(r,#by_key); // just in case - } - return true; - case Event.VK_NEXT: - { - var y = this.body.scroll(#top) + 2 * this.body.scroll(#height); - var lastScrollable = this.body.length - 1; - var r; - for(var i = 0; i <= lastScrollable; ++i) - { - var pr = r; r = this.body[i]; - if (r.box(#bottom, #inner, #content) > y) - { - // this row is further than scroll pos - height of scroll area - this.setCurrentRow(pr? pr: r,#by_key); // to last fully visible - return true; - } - } - this.setCurrentRow(r,#by_key); // just in case - } - return true; - - case Event.VK_HOME: - { - if (this.body.length) - this.setCurrentRow(this.body.first,#by_key); - } - return true; - - case Event.VK_END: - { - if (this.body.length) - this.setCurrentRow(this.body.last,#by_key); - } - return true; - } - var char = handler.get_char(keymap[evt.keyCode] || "", evt.keyCode); - if (char) { - var crow = this.getCurrentRow(); - var idx = crow? crow.index + 1 : 0; - while (idx < this.body.length) { - var el = this.body[idx]; - var text = el[1].text; - if (text && text[0].toLowerCase() == char) { - this.setCurrentRow(el, #by_key); - return true; - } - idx += 1; - } - } - if (isEnterKey(evt)) { - this.onRowDoubleClick(this.getCurrentRow()); - } - return false; - } -} diff --git a/shelled/rustdesk-as-ref/src/ui/header.css b/shelled/rustdesk-as-ref/src/ui/header.css deleted file mode 100644 index 8fe4086..0000000 --- a/shelled/rustdesk-as-ref/src/ui/header.css +++ /dev/null @@ -1,97 +0,0 @@ -header div { - word-wrap: normal; -} - -header #screens { - background: white; - border: #A9A9A9 1px solid; - height: 22px; - border-radius: 4px; - flow: horizontal; - border-spacing: 0.5em; - padding-right: 1em; - position: relative; -} - -header #screen { - text-align: center; - margin: 3px 0; - width: 18px; - height: 14px; - border: color(border) solid 1px; - font-size: 11px; - color: color(light-text); -} - -@media platform == "OSX" { - header #screen { - line-height: 11px; - } -} - -header #secure { - position: absolute; - left: -10px; - top: -2px; -} - -header #secure svg { - size: 18px; -} - -header .remote-id { - width: 80px; - @ELLIPSIS; - padding-left: 30px; - padding-right: 4em; - margin: * 0; -} - -header span:hover { - background: #f7f7f7; -} - -@media platform != "OSX" { -header span:hover { - background: #d9d9d9; -} -} - -header #screen:hover { - background: #d9d9d9; -} - -header #secure:hover { - background: unset; -} - -header span:active, header #screen:active { - color: black; - background: color(gray-bg); -} - -div#global-screens { - position: relative; - margin: 2px 0; -} - -div#global-screens > div { - position: absolute; - border: color(border) solid 1px; - text-align: center; - color: color(light-text); -} - -header #screen.current, div#global-screens > div.current { - background: #666; - color: white; -} - -span#fullscreen.active { - border: color(border) solid 1px; -} - -button:disabled { - opacity: 0.3; -} - diff --git a/shelled/rustdesk-as-ref/src/ui/header.tis b/shelled/rustdesk-as-ref/src/ui/header.tis deleted file mode 100644 index 17efe69..0000000 --- a/shelled/rustdesk-as-ref/src/ui/header.tis +++ /dev/null @@ -1,716 +0,0 @@ -var pi = handler.get_default_pi(); // peer information -var chat_msgs = []; - -var svg_fullscreen = - -; -var svg_action = ; -var svg_display = - -; -var svg_secure = - -; -var svg_insecure = ; -var svg_insecure_relay = ; -var svg_secure_relay = ; -var svg_recording_off = ; -var svg_recording_on = ; - -var cur_window_state = view.windowState; -function check_state_change() { - if (view.windowState != cur_window_state) { - stateChanged(); - } - self.timer(30ms, check_state_change); -} - -if (is_linux) { - check_state_change(); -} else { - view << event statechange { - stateChanged(); - } -} - -function get_id() { - return handler.get_option('alias') || handler.get_id() -} - -function stateChanged() { - stdout.println('state changed from ' + cur_window_state + ' -> ' + view.windowState); - cur_window_state = view.windowState; - adjustBorder(); - adaptDisplay(); - if (cur_window_state != View.WINDOW_MINIMIZED) { - view.focus = handler; // to make focus away from restore/maximize button, so that enter key work - } - var fs = view.windowState == View.WINDOW_FULL_SCREEN; - var el = $(#fullscreen); - if (el) el.attributes.toggleClass("active", fs); - el = $(#maximize); - if (el) { - el.state.disabled = fs; - } - if (fs) { - $(header).style.set { - display: "none", - }; - } -} - -var header; -var old_window_state = View.WINDOW_SHOWN; - -var is_edit_os_password; -class EditOsPassword: Reactor.Component { - function render() { - return {svg_edit}; - } - - function onMouse(evt) { - if (evt.type == Event.MOUSE_DOWN) { - is_edit_os_password = true; - editOSPassword(); - } - } -} - -function editOSPassword(login=false) { - var p0 = handler.get_option('os-password'); - msgbox("custom-os-password", 'OS Password', p0, "", function(res=null) { - if (!res) return; - var a0 = handler.get_option('auto-login') != ''; - var p = (res.password || '').trim(); - var a = res.autoLogin || false; - if (p == p0 && a == a0) return; - if (p != p0) handler.set_option('os-password', p); - if (a != a0) handler.set_option('auto-login', a ? 'Y' : ''); - if (p && login) { - handler.input_os_password(p, true); - } - }); -} - -var recording = false; - -class Header: Reactor.Component { - this var conn_note = ""; - - function this() { - header = this; - } - - function render() { - var icon_conn; - var title_conn; - if (this.secure_connection && this.direct_connection) { - icon_conn = svg_secure; - title_conn = translate("Direct and encrypted connection"); - } else if (this.secure_connection && !this.direct_connection) { - icon_conn = svg_secure_relay; - title_conn = translate("Relayed and encrypted connection"); - } else if (!this.secure_connection && this.direct_connection) { - icon_conn = svg_insecure; - title_conn = translate("Direct and unencrypted connection"); - } else { - icon_conn = svg_insecure_relay; - title_conn = translate("Relayed and unencrypted connection"); - } - var stream_type = this.stream_type; - if (stream_type == "Relay") { - stream_type = "TCP"; - } - if (stream_type) { - title_conn += " (" + stream_type + ")"; - } - var title = get_id(); - if (pi.hostname) title += "(" + pi.username + "@" + pi.hostname + ")"; - if ((pi.displays || []).length == 0) { - return
    {title}
    ; - } - var screens = pi.displays.map(function(d, i) { - return
    - {i+1} -
    ; - }); - updateWindowToolbarPosition(); - var style = "flow:horizontal;"; - if (is_osx) style += "margin:*"; - self.timer(1ms, updatePrivacyMode); - self.timer(1ms, toggleMenuState); - return
    - {is_osx || is_xfce ? "" : {svg_fullscreen}} -
    - {icon_conn} -
    {get_id()}
    -
    {screens}
    - {this.renderGlobalScreens()} -
    - {svg_chat} - {svg_action} - {svg_display} - {svg_keyboard} - {recording_enabled ? {recording ? svg_recording_on : svg_recording_off} : ""} - {this.renderKeyboardPop()} - {this.renderDisplayPop()} - {this.renderActionPop()} -
    ; - } - - function renderKeyboardPop(){ - const is_map_mode_supported = handler.is_keyboard_mode_supported("map"); - const is_translate_mode_supported = handler.is_keyboard_mode_supported("translate"); - return - -
  • {svg_checkmark}{translate('Legacy mode')}
  • - { is_map_mode_supported &&
  • {svg_checkmark}{translate('Map mode')}
  • } - { is_translate_mode_supported &&
  • {svg_checkmark}{translate('Translate mode')}
  • } - -
    ; - } - - function renderDisplayPop() { - var codecs = handler.alternative_codecs(); - var show_codec = codecs[0] || codecs[1] || codecs[2] || codecs[3]; - - var cursor_embedded = false; - if ((pi.displays || []).length > 0) { - if (pi.displays.length > pi.current_display) { - cursor_embedded = pi.displays[pi.current_display].cursor_embedded; - } - } - - var is_file_copy_paste_supported = false; - if (handler.version_cmp(pi.version, '1.2.4') < 0) { - is_file_copy_paste_supported = is_win && pi.platform == "Windows"; - } else { - is_file_copy_paste_supported = handler.has_file_clipboard() && pi.platform_additions?.has_file_clipboard; - } - - return - -
  • {translate('Adjust Window')}
  • -
    -
  • {svg_checkmark}{translate('Original')}
  • -
  • {svg_checkmark}{translate('Shrink')}
  • -
  • {svg_checkmark}{translate('Stretch')}
  • -
    -
  • {svg_checkmark}{translate('Good image quality')}
  • -
  • {svg_checkmark}{translate('Balanced')}
  • -
  • {svg_checkmark}{translate('Optimize reaction time')}
  • -
  • {svg_checkmark}{translate('Custom')}
  • - {show_codec ?
    -
    -
  • {svg_checkmark}Auto
  • - {codecs[0] ?
  • {svg_checkmark}VP8
  • : ""} -
  • {svg_checkmark}VP9
  • - {codecs[1] ?
  • {svg_checkmark}AV1
  • : ""} - {codecs[2] ?
  • {svg_checkmark}H264
  • : ""} - {codecs[3] ?
  • {svg_checkmark}H265
  • : ""} -
    : ""} -
    - {!cursor_embedded &&
  • {svg_checkmark}{translate('Show remote cursor')}
  • } - {
  • {svg_checkmark}{translate('Follow remote cursor')}
  • } - {
  • {svg_checkmark}{translate('Follow remote window focus')}
  • } -
  • {svg_checkmark}{translate('Show quality monitor')}
  • - {audio_enabled ?
  • {svg_checkmark}{translate('Mute')}
  • : ""} - {is_file_copy_paste_supported && file_enabled ?
  • {svg_checkmark}{translate('Enable file copy and paste')}
  • : ""} - {keyboard_enabled && clipboard_enabled ?
  • {svg_checkmark}{translate('Disable clipboard')}
  • : ""} - {keyboard_enabled ?
  • {svg_checkmark}{translate('Lock after session end')}
  • : ""} - {keyboard_enabled && pi.platform == "Windows" ?
  • {svg_checkmark}{translate('Privacy mode')}
  • : ""} - {keyboard_enabled && ((is_osx && pi.platform != "Mac OS") || (!is_osx && pi.platform == "Mac OS")) ?
  • {svg_checkmark}{translate('Swap control-command key')}
  • : ""} - {handler.version_cmp(pi.version, '1.2.4') >= 0 ?
  • {svg_checkmark}{translate('True color (4:4:4)')}
  • : ""} - - ; - } - - function renderActionPop() { - return - - {keyboard_enabled ?
  • {translate('OS Password')}
  • : ""} -
  • {translate('Transfer file')}
  • -
  • {translate('TCP tunneling')}
  • - {handler.get_audit_server("conn") &&
  • {translate('Note')}
  • } -
    - {keyboard_enabled && (pi.platform == "Linux" || pi.sas_enabled) ?
  • {translate('Insert')} Ctrl + Alt + Del
  • : ""} - {restart_enabled && (pi.platform == "Linux" || pi.platform == "Windows" || pi.platform == "Mac OS") ?
  • {translate('Restart remote device')}
  • : ""} - {keyboard_enabled ?
  • {translate('Insert Lock')}
  • : ""} - {keyboard_enabled && pi.platform == "Windows" && pi.sas_enabled ?
  • {translate("Block user input")}
  • : ""} - {handler.is_screenshot_supported() ?
  • {translate('Take screenshot')}
  • : "" } -
  • {translate('Refresh')}
  • - - ; - } - - function renderGlobalScreens() { - if (pi.displays.length < 3) return ""; - var x0 = 9999999; - var y0 = 9999999; - var x = -9999999; - var y = -9999999; - pi.displays.map(function(d, i) { - if (d.x < x0) x0 = d.x; - if (d.y < y0) y0 = d.y; - var dx = d.x + d.width; - if (dx > x) x = dx; - var dy = d.y + d.height; - if (dy > y) y = dy; - }); - var w = x - x0; - var h = y - y0; - var scale = 16. / h; - var screens = pi.displays.map(function(d, i) { - var min_wh = d.width > d.height ? d.height : d.width; - var fs = min_wh * 0.9 * scale; - var style = "width:" + (d.width * scale) + "px;" + - "height:" + (d.height * scale) + "px;" + - "left:" + ((d.x - x0) * scale) + "px;" + - "top:" + ((d.y - y0) * scale) + "px;" + - "font-size:" + fs + "px;"; - if (is_osx) { - style += "line-height:" + fs + "px;"; - } - return
    {i+1}
    ; - }); - - var style = "width:" + (w * scale) + "px; height:" + (h * scale) + "px;"; - return
    - {screens} -
    ; - } - - event click $(#fullscreen) (_, el) { - if (view.windowState == View.WINDOW_FULL_SCREEN) { - if (old_window_state == View.WINDOW_MAXIMIZED) { - view.windowState = View.WINDOW_SHOWN; - } - view.windowState = old_window_state; - } else { - old_window_state = view.windowState; - if (view.windowState == View.WINDOW_MAXIMIZED) { - view.windowState = View.WINDOW_SHOWN; - } - view.windowState = View.WINDOW_FULL_SCREEN; - if (is_linux) { self.timer(150ms, function() { view.windowState = View.WINDOW_FULL_SCREEN; }); } - } - } - - event click $(#chat) { - startChat(); - } - - event click $(#action) (_, me) { - var menu = $(menu#action-options); - me.popup(menu); - } - - event click $(#display) (_, me) { - var menu = $(menu#display-options); - me.popup(menu); - } - - event click $(#keyboard) (_, me) { - var menu = $(menu#keyboard-options); - me.popup(menu); - } - - event click $(span#recording) (_, me) { - header.update(); - handler.record_screen(!recording) - } - - event click $(#screen) (_, me) { - if (pi.current_display == me.index) return; - handler.switch_display(me.index); - } - - event keyup (evt) { - if((pi.displays || []).length > 0 && evt.keyCode == 220) - { - if (pi.displays.length > pi.current_display) - handler.switch_display(pi.current_display + 1); - else - handler.switch_display(1); - } - } - - event click $(#transfer-file) { - handler.transfer_file(); - } - - event click $(#os-password) (evt) { - if (is_edit_os_password) { - is_edit_os_password = false; - return; - } - var p = handler.get_option('os-password'); - if (!p) editOSPassword(true); - else handler.input_os_password(p, true); - } - - event click $(#tunnel) { - handler.tunnel(); - } - - event click $(#note) { - var self = this; - msgbox("custom", "Note",
    - -
    , "", function(res=null) { - if (!res) return; - if (res.text == null || res.text == undefined) return; - self.conn_note = res.text ?? ""; - handler.send_note(res.text); - }, 280); - } - - event click $(#ctrl-alt-del) { - handler.ctrl_alt_del(); - } - - event click $(#restart_remote_device) { - msgbox( - "restart-confirmation", - translate("Restart remote device"), - translate("Are you sure you want to restart") + " " + pi.username + "@" + pi.hostname + "(" + get_id() + ") ?", - "", - function(res=null) { - if (res != null) handler.restart_remote_device(); - } - ); - } - - event click $(#lock-screen) { - handler.lock_screen(); - } - - event click $(#take-screenshot) { - handler.take_screenshot(pi.current_display, ""); - } - - event click $(#refresh) { - // 0 is just a dummy value. It will be ignored by the handler. - handler.refresh_video(0); - } - - event click $(#block-input) { - if (!input_blocked) { - handler.toggle_option("block-input"); - input_blocked = true; - $(#block-input).text = translate("Unblock user input"); - } else { - handler.toggle_option("unblock-input"); - input_blocked = false; - $(#block-input).text = translate("Block user input"); - } - } - - event click $(menu#display-options li) (_, me) { - if (me.id == "custom") { - handle_custom_image_quality(); - } else if (me.id == "privacy-mode") { - togglePrivacyMode(me.id); - } else if (me.id == "show-quality-monitor") { - toggleQualityMonitor(me.id); - } else if (me.id == "i444") { - toggleI444(me.id); - } else if (me.attributes.hasClass("toggle-option")) { - handler.toggle_option(me.id); - toggleMenuState(); - } else if (!me.attributes.hasClass("selected")) { - var type = me.attributes["type"]; - if (type == "image-quality") { - handler.save_image_quality(me.id); - } else if (type == "view-style") { - handler.save_view_style(me.id); - adaptDisplay(); - } else if (type == "codec-preference") { - handler.set_option("codec-preference", me.id); - handler.update_supported_decodings(); - } - toggleMenuState(); - } - } - - event click $(menu#keyboard-options>li) (_, me) { - if (me.id == "legacy") { - handler.save_keyboard_mode("legacy"); - } else if (me.id == "map") { - handler.save_keyboard_mode("map"); - } else if (me.id == "translate") { - handler.save_keyboard_mode("translate"); - } - toggleMenuState() - } -} - -function handle_custom_image_quality() { - var tmp = handler.get_custom_image_quality(); - var bitrate = (tmp[0] || 50); - var extendedBitrate = bitrate > 100; - var maxRate = extendedBitrate ? 2000 : 100; - msgbox("custom-image-quality", "Custom Image Quality", "
    \ -
    x% Bitrate More
    \ -
    ", "", function(res=null) { - if (!res) return; - if (res.id === "extended-slider") { - var slider = res.parent.$(#bitrate-slider) - slider.slider.max = res.checked ? 2000 : 100; - if (slider.value > slider.slider.max) { - slider.value = slider.slider.max; - } - var buddy = res.parent.$(#bitrate-buddy); - buddy.value = slider.value; - return; - } - if (!res.bitrate) return; - handler.save_custom_image_quality(res.bitrate); - toggleMenuState(); - }); -} - -function toggleMenuState() { - var values = []; - var q = handler.get_image_quality(); - if (!q) q = "balanced"; - values.push(q); - var s = handler.get_view_style(); - if (!s) s = "original"; - values.push(s); - var k = handler.get_keyboard_mode(); - values.push(k); - var c = handler.get_option("codec-preference"); - if (!c) c = "auto"; - values.push(c); - for (var el in $$(menu#display-options li)) { - el.attributes.toggleClass("selected", values.indexOf(el.id) >= 0); - } - for (var el in $$(menu#keyboard-options>li)) { - el.attributes.toggleClass("selected", values.indexOf(el.id) >= 0); - } - for (var id in ["show-remote-cursor", "follow-remote-cursor", "follow-remote-window", "show-quality-monitor", "disable-audio", "enable-file-copy-paste", "disable-clipboard", "lock-after-session-end", "allow_swap_key", "i444"]) { - var el = self.select('#' + id); - if (el) { - var value = handler.get_toggle_option(id); - el.attributes.toggleClass("selected", value); - } - } -} - -if (is_osx) { - $(header).content(
    ); - $(header).attributes["role"] = "window-caption"; -} else { - if (is_file_transfer || is_port_forward) { - $(caption).content(
    ); - } else { - $(div.window-toolbar).content(
    ); - } - setWindowButontsAndIcon(); -} - -if (!(is_file_transfer || is_port_forward)) { - $(header).style.set { - height: "32px", - }; - if (!is_osx) { - $(div.window-icon).style.set { - size: "32px", - }; - } -} - -handler.updatePi = function(v) { - pi = v; - recording = handler.is_recording(); - header.update(); - if (is_port_forward) { - view.windowState = View.WINDOW_MINIMIZED; - } -} - -handler.updateDisplays = function(v) { - pi.displays = v; - header.update(); - if (is_port_forward) { - view.windowState = View.WINDOW_MINIMIZED; - } -} - -handler.setMultipleWindowsSession = function(sessions) { - // It will be covered by other message box if the timer is not used, - self.timer(1000ms, function() { - msgbox("multiple-sessions-nocancel", translate("Multiple Windows sessions found"), , "", function(res) { - if (res && res.sid) { - handler.set_selected_windows_session_id("" + res.sid); - } - }, 230); - }); -} - -handler.setCurrentDisplay = function(v) { - pi.current_display = v; - handler.switch_display(v); - header.update(); - if (is_port_forward) { - view.windowState = View.WINDOW_MINIMIZED; - } -} - -handler.screenshot = function(msg) { - if (msg) { - msgbox( - "custom-nocancel-nook-hasclose-error", - translate("Take screenshot"), - msg, - "", - function() {} - ); - } else { - msgbox( - "custom-take-screenshot-nocancel-nook", - translate("Take screenshot"), - translate("screenshot-action-tip"), - "", - function() {} - ); - } -} - -function updatePrivacyMode() { - var el = $(li#privacy-mode); - if (el) { - var supported = handler.is_privacy_mode_supported(); - if (!supported) { - // el.attributes.toggleClass("line-through", true); - el.style["display"]="none"; - } else { - var value = handler.get_toggle_option("privacy-mode"); - el.attributes.toggleClass("selected", value); - var el = $(li#block-input); - if (el) { - el.state.disabled = value; - } - } - } -} -handler.updatePrivacyMode = updatePrivacyMode; - -function togglePrivacyMode(privacy_id) { - var supported = handler.is_privacy_mode_supported(); - if (!supported) { - msgbox("nocancel", translate("Privacy mode"), translate("Unsupported"), "", function() { }); - } else { - handler.toggle_option(privacy_id); - } -} - -function toggleQualityMonitor(name) { - var show = handler.get_toggle_option(name); - if (show) { - $(#quality-monitor).style.set{ display: "none" }; - } else { - $(#quality-monitor).style.set{ display: "block" }; - } - handler.toggle_option(name); - toggleMenuState(); -} - -function toggleI444(name) { - handler.toggle_option(name); - handler.update_supported_decodings(); - toggleMenuState(); -} - -handler.updateBlockInputState = function(input_blocked) { - if (!input_blocked) { - handler.toggle_option("block-input"); - input_blocked = true; - $(#block-input).text = translate("Unblock user input"); - } else { - handler.toggle_option("unblock-input"); - input_blocked = false; - $(#block-input).text = translate("Block user input"); - } -} - -handler.switchDisplay = function(i) { - pi.current_display = i; - header.update(); -} - -function updateWindowToolbarPosition() { - if (is_osx) return; - self.timer(1ms, function() { - var el = $(div.window-toolbar); - var w1 = el.box(#width, #border); - var w2 = $(header).box(#width, #border); - var x = (w2 - w1) / 2 / scaleFactor; - el.style.set { - left: x + "px", - display: "block", - }; - }); -} - -view.on("size", function() { - // ensure size is done, so add timer - self.timer(1ms, function() { - updateWindowToolbarPosition(); - adaptDisplay(); - }); -}); - -handler.newMessage = function(text) { - chat_msgs.push({text: text, name: pi.username || "", time: getNowStr()}); - startChat(); -} - -function sendMsg(text) { - chat_msgs.push({text: text, name: "me", time: getNowStr()}); - handler.send_chat(text); - if (chatbox) chatbox.refresh(); -} - -var chatbox; -function startChat() { - if (chatbox) { - chatbox.windowState = View.WINDOW_SHOWN; - chatbox.refresh(); - return; - } - var icon = handler.get_icon(); - var (sx, sy, sw, sh) = view.screenBox(#workarea, #rectw); - var w = scaleIt(300); - var h = scaleIt(400); - var x = (sx + sw - w) / 2; - var y = sy + scaleIt(80); - var params = { - type: View.FRAME_WINDOW, - x: x, - y: y, - width: w, - height: h, - client: true, - parameters: { msgs: chat_msgs, callback: sendMsg, icon: icon }, - caption: get_id(), - }; - var html = handler.get_chatbox(); - if (html) params.html = html; - else params.url = self.url("chatbox.html"); - chatbox = view.window(params); -} - -handler.setConnectionType = function(secured, direct, stream_type) { - header.update({ - secure_connection: secured, - direct_connection: direct, - stream_type: stream_type, - }); -} - -handler.updateRecordStatus = function(status) { - recording = status; - header.update(); -} \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/src/ui/index.css b/shelled/rustdesk-as-ref/src/ui/index.css deleted file mode 100644 index d23e4f0..0000000 --- a/shelled/rustdesk-as-ref/src/ui/index.css +++ /dev/null @@ -1,441 +0,0 @@ -html { - background-color: transparent; -} - -body { - overflow: hidden; -} - -@media platform != "OSX" { - body { - border-top: color(border) solid 1px; - } -} - -.title { - font-size: 1.4em; -} - -.app { - flow: horizontal; - size: *; -} - -.lighter-text { - color: color(lighter-text); - font-size: 0.9em; -} - -.left-pane { - width: 200px; - height: *; - background: color(bg); - border-right: color(border) 1px solid; - position: relative; -} - -#ab .left-pane { - border-radius: 1em; - padding: 1em; -} - -#ab .right-pane { - background: none; -} - -#ab .right-content { - overflow: unset; -} - -.left-pane > div:nth-child(1) { - border-spacing: 1em; - padding: 20px; - padding-bottom: 60px; /* reserve space for bottom connect-status */ -} - -.left-pane > div.connect-status { - position: absolute; - bottom: 0; - left: 0; - right: 0; -} - -.left-pane div { - word-wrap: break-word; -} - -div.sessions-bar { - color: color(light-text); - padding-top: 0.5em; - border-top: color(border) solid 1px; - margin-bottom: 1em; - position: relative; - flow: horizontal; -} - -div.sessions-tab span { - display: inline-block; - padding: 6px 8px; - cursor: pointer; - @ELLIPSIS; -} - -div.sessions-tab svg { - size: 14px; -} - -div.sessions-tab span.active { - cursor: default; - border-radius: 3px; - background: color(bg); - color: color(text); -} - -div.search-id { - width: 120px; - padding: 0; - position: relative; - display: inline-block; -} - -div.search-id input { - font-size: 1em; - height: 20px; - border: none; - padding-left: 26px; -} - -div.search-id span { - position: absolute; - top: 0px; - padding: 6px; - color: color(border); -} - -div.search-id svg { - size: 14px; -} - -span.search-icon { - left: 0px; -} - -span.clear-input { - display: none; - right: 0px; -} - -div.search-id:hover span.clear-input { - display: inline-block; -} - -span.clear-input:hover { - color: black; -} - -.your-desktop { - border-spacing: 0.5em; - border-left: color(accent) solid 2px; - padding-left: 0.5em; -} - -.your-desktop input[type=text] { - padding: 0; - border: none; - height: 1.5em; -} - -.your-desktop > div { - color: color(light-text); -} - -.right-pane { - size: *; - background: color(gray-bg); -} - -.right-content { - overflow: scroll-indicator; - padding: 1.6em; - border-spacing: 1.6em; - size: *; - flow: vertical; -} - -@media platform == "OSX" { - .right-pane { - background: color(gray-bg-osx); - } -} - -@mixin CARD { - padding: 1.6em; - border-spacing: 1em; - background: color(bg); - border-radius: 1em; -} - -.card-connect { - @CARD; - width: 320px; -} - -.right-buttons { - text-align: right; -} - -.right-buttons>button { - margin-left: 1.6em; -} - -div.connect-status { - left: 240px; - border-top: color(border) solid 1px; - width: 100%; - padding: 1em; -} - -div.connect-status > span.connect-status-icon { - border-radius: 4px; - width: 8px; - height: 8px; - display: inline-block; - margin-right: 1em; -} - -div.connect-status > span.link { - margin-left: 1em; - display: inline-block; -} - -span.connect-status-1 { - background: #e04f5f; -} - -span.connect-status1 { - background: #32bea6; -} - -span.connect-status0 { - background: #F5853B; -} - -div.recent-sessions-content { - border-spacing: 1em; - flow: horizontal-flow; -} - -div.remote-session { - border-radius: 1em; - height: 140px; - width: 220px; - padding: 0; - position: relative; - border: none; -} - -div.remote-session:hover, div.remote-session-list:hover { - outline: color(button) solid 2px -2px; -} - -div.remote-session .platform { - width: *; - height: 120px; - padding: *; - position: relative; -} - -div.remote-session .platform .username{ - left: 0; - color: #eee; - position: absolute; - bottom: 38px; - font-size: 0.8em; - width: 220px; - text-align: center; -} - -div.remote-session .platform svg { - width: 60px; - height: 60px; - background: none; -} - -div.remote-session-list { - background: color(bg); - width: 220px; - flow: horizontal; -} - -div.remote-session-list .platform { - size: 42px; -} - -div.remote-session-list .platform svg { - width: 30px; - height: 30px; - background: none; - padding: 6px; -} - -div.remote-session-list .name { - size: *; - padding-left: 1em; -} - -div.remote-session-list .name >div { - margin-top: *; - margin-bottom: *; - width: *; -} - -div.remote-session-list .name .username { - margin-top: 3px; - font-size: 0.8em; - color: color(lighter-text); -} - -div.remote-session .text { - background: color(bg); - position: absolute; - height: 3em; - width: 100%; - border-radius: 0 0 1em 1em; - bottom: 0; - flow: horizontal; -} - -div.remote-session .text > div { - padding-top: 1em; - padding-left: 1em; - width: *; -} - -svg#menu { - size: 1em; - background: none; - padding: 0.5em; - margin: 0.5em; - color: color(light-text); -} - -.remote-session-list svg#menu { - margin-right: 0; -} - -svg#menu:hover { - color: color(text); - border-radius: 1em; - background: color(gray-bg); -} - -svg#edit:hover { - color: color(text); -} - -svg#edit { - display: inline-block; -} - -div.install-me, div.trust-me { - margin-top: 0.5em; - padding: 20px; - color: white; - background: linear-gradient(left,#e242bc,#f4727c); -} - -div.trust-me > div:nth-child(1), -div.install-me > div:nth-child(1) { - font-size: 1.2em; - font-weight: bold; - text-align: center; - margin-bottom: 0.5em; -} - -div.install-me > div:nth-child(2) { - line-height: 1.4em; -} - -#install-me.link { - margin-top: 0.5em; -} - -div.trust-me > div:nth-child(2) { - font-size: 0.9em; - margin-bottom: 1em; -} - -div.install-me > div:nth-child(3), -div.trust-me > div:nth-child(3) { - text-align: center; - font-size: 1.5em; - font-weight: bold; -} - -div.trust-me > div:nth-child(4), -div.trust-me > div:nth-child(5) { - margin-top: 0.5em; - text-align: center; -} - -div#myid, div#tags-label { - position: relative; -} - -div#myid svg#menu, div#tags-label svg#menu { - position: absolute; - right: -1em; -} - -div#tags-label svg#menu:hover { - background-color: #ddd; -} - -div.remote-session svg#menu { - position: absolute; - right: 0; - top: 0; -} - -.install-me .button { - height: 2em; - line-height: 2em; - text-align: center; - font-weight: bold; - font-size: 1em; - margin-top: 1em; - border-color: white; - border: 1px; - background: none; - color: white; -} - -svg#refresh-password { - display: inline-block; - stroke:#ddd; -} - -svg#refresh-password:hover { - stroke:color(text); -} - -li:disabled, li:disabled:hover { - color: color(lighter-text); - background: color(menu); - opacity: 0.8; -} - -.grey-text { - color: #888 !important; -} - -input.grey-text, -textarea.grey-text { - color: #888 !important; -} - -@media platform == "OSX" { - div.eye-area > input { - font-size: 1em; - } -} \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/src/ui/index.html b/shelled/rustdesk-as-ref/src/ui/index.html deleted file mode 100644 index 88c1722..0000000 --- a/shelled/rustdesk-as-ref/src/ui/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - diff --git a/shelled/rustdesk-as-ref/src/ui/index.tis b/shelled/rustdesk-as-ref/src/ui/index.tis deleted file mode 100644 index be82652..0000000 --- a/shelled/rustdesk-as-ref/src/ui/index.tis +++ /dev/null @@ -1,1680 +0,0 @@ -if (is_osx) view.windowBlurbehind = #light; -stdout.println("current platform:", OS); -stdout.println("is_xfce: ", is_xfce); - -// See default height in common.tis `msgbox()`. -const msgbox_default_height = 180; -const incoming_only_width = 180; - -const outgoing_only = handler.is_outgoing_only(); -const incoming_only = handler.is_incoming_only(); -const disable_installation = handler.is_disable_installation(); -const disable_account = handler.is_disable_account(); -const disable_settings = handler.is_disable_settings(); -const is_custom_client = handler.is_custom_client(); -const disable_ab = handler.is_disable_ab(); -const hide_server_settings = handler.get_builtin_option("hide-server-settings") == "Y"; -const hide_proxy_settings = handler.get_builtin_option("hide-proxy-settings") == "Y"; -const hide_websocket_settings = handler.get_builtin_option("hide-websocket-settings") == "Y"; -const hide_stop_service = handler.get_builtin_option("hide-stop-service") == "Y"; -const disable_change_permanent_password = handler.get_builtin_option("disable-change-permanent-password") == "Y"; -const disable_change_id = handler.get_builtin_option("disable-change-id") == "Y"; - -// html min-width, min-height not working on mac, below works for all -if (incoming_only) { - view.windowMinSize = (scaleIt(incoming_only_width), scaleIt((handler.is_installed() || disable_installation) ? 300 : 390)); -} else { - view.windowMinSize = (scaleIt(560), scaleIt(300)); -} - -var app; -var tmp = handler.get_connect_status(); -var connect_status = tmp[0]; -var service_stopped = handler.get_option("stop-service") == "Y"; -var disable_udp = handler.get_option("disable-udp") == "Y"; -var using_public_server = handler.using_public_server(); -var software_update_url = ""; -var key_confirmed = tmp[1]; -var system_error = ""; - -const default_option_lang = is_custom_client ? 'default' : ''; -const default_option_yes = is_custom_client ? 'Y' : ''; -const default_option_no = is_custom_client ? 'N' : ''; -const default_option_whitelist = is_custom_client ? ',' : ''; -const default_option_approve_mode = is_custom_client ? 'password-click' : ''; - -const grey_text_style = "color:#888;"; - -var svg_menu = - - - -; -var svg_refresh_password = ; - -var my_id = handler.get_id(); -function get_id() { - my_id = handler.get_id(); - return my_id; -} - -function get_msgbox_width(width=500) { - if (incoming_only) { - var maxw = scaleIt(incoming_only_width); - if (width > maxw) width = maxw; - } - return width; -} - -class ConnectStatus: Reactor.Component { - function render() { - return -
    - - {this.getConnectStatusStr()} - {service_stopped ? {translate('Start service')} : ""} -
    ; - } - - function getConnectStatusStr() { - if (service_stopped) { - return translate("Service is not running"); - } else if (connect_status == -1) { - return translate('not_ready_status'); - } else if (connect_status == 0) { - return translate('connecting_status'); - } - if (!handler.using_public_server()) return translate('Ready'); - return {translate("Ready")}, {translate("setup_server_tip")}; - } - - event click $(#start-service) () { - handler.set_option("stop-service", ""); - } - - event click $(#setup-server) () { - handler.open_url("https://rustdesk.com/blog/id-relay-set/"); - } -} - -function createNewConnect(id, type) { - id = id.replace(/\s/g, ""); - app.remote_id.value = formatId(id); - if (!id) return; - var old_id = id; - id = handler.handle_relay_id(id); - var force_relay = old_id != id; - if (id == my_id) { - msgbox("custom-error", "Error", "You cannot connect to your own computer"); - return; - } - handler.set_remote_id(id); - handler.new_remote(id, type, force_relay); -} - -class ShareRdp: Reactor.Component { - function render() { - var rdp_shared_string = translate("Enable RDP session sharing"); - var cls = handler.is_share_rdp() ? "selected" : "line-through"; - return
  • {svg_checkmark}{rdp_shared_string}
  • ; - } - - function onClick() { - handler.set_share_rdp(!handler.is_share_rdp()); - this.update(); - } -} - -var direct_server; -class DirectServer: Reactor.Component { - function this() { - direct_server = this; - } - - function render() { - var text = translate("Enable direct IP access"); - var enabled = handler.get_option("direct-server") == "Y"; - var cls = enabled ? "selected" : "line-through"; - return
  • {svg_checkmark}{text}{enabled && }
  • ; - } - - function onClick() { - if (is_edit_rdp_port) { - is_edit_rdp_port = false; - return; - } - handler.set_option("direct-server", handler.get_option("direct-server") == "Y" ? default_option_no : "Y"); - this.update(); - } -} - -var myIdMenu; -var audioInputMenu; -class AudioInputs: Reactor.Component { - function this() { - audioInputMenu = this; - } - - function render() { - if (!this.show) return
  • ; - var inputs = handler.get_sound_inputs(); - if (is_win) inputs = ["System Sound"].concat(inputs); - if (!inputs.length) return
  • ; - var me = this; - self.timer(1ms, function() { me.toggleMenuState() }); - return
  • {translate('Audio Input')} - -
  • {svg_checkmark}{translate("Mute")}
  • -
    - {inputs.map(function(name) { - return
  • {svg_checkmark}{translate(name)}
  • ; - })} -
    -
  • ; - } - - function get_default() { - if (is_win) return "System Sound"; - return ""; - } - - function get_value() { - return handler.get_option("audio-input") || this.get_default(); - } - - function toggleMenuState() { - var el = this.$(li#enable-audio); - var enabled = handler.get_option(el.id) != "N"; - el.attributes.toggleClass("selected", !enabled); - var is_opt_fixed = handler.is_option_fixed("enable-audio"); - if (disable_settings || is_opt_fixed) { - el.state.disabled = true; - } - var v = this.get_value(); - for (var el in this.$$(menu#audio-input>li)) { - if (el.id == 'enable-audio') continue; - var selected = el.id == v; - el.attributes.toggleClass("selected", selected); - } - } - - event click $(menu#audio-input>li) (_, me) { - if (me.state.disabled) return; - var v = me.id; - if (v == 'enable-audio') { - handler.set_option(v, handler.get_option(v) != 'N' ? 'N' : default_option_yes); - } else { - if (v == this.get_value()) return; - if (v == this.get_default()) v = ""; - handler.set_option("audio-input", v); - } - this.toggleMenuState(); - } -}; - -class Languages: Reactor.Component { - function render() { - var langs = JSON.parse(handler.get_langs()); - var me = this; - self.timer(1ms, function() { me.toggleMenuState() }); - return
  • {translate('Language')} - -
  • {svg_checkmark}Default
  • -
    - {langs.map(function(lang) { - return
  • {svg_checkmark}{lang[1]}
  • ; - })} -
    -
  • ; - } - - - function toggleMenuState() { - var cur = handler.get_local_option("lang") || "default"; - var is_opt_fixed = handler.is_option_fixed("lang"); - for (var el in this.$$(menu#languages>li)) { - var selected = cur == el.id; - el.attributes.toggleClass("selected", selected); - if (is_opt_fixed) { - el.state.disabled = true; - } - } - } - - event click $(menu#languages>li) (_, me) { - if (me.state.disabled) return; - var v = me.id; - if (v == "default") v = default_option_lang; - handler.set_local_option("lang", v); - app.update(); - this.toggleMenuState(); - } -} - -var enhancementsMenu; -class Enhancements: Reactor.Component { - function this() { - enhancementsMenu = this; - } - - function render() { - var has_hwcodec = handler.has_hwcodec(); - var has_vram = handler.has_vram(); - var support_remove_wallpaper = handler.support_remove_wallpaper(); - var me = this; - self.timer(1ms, function() { me.toggleMenuState() }); - return
  • {translate('Enhancements')} - - {(has_hwcodec || has_vram) ?
  • {svg_checkmark}{translate("Enable hardware codec")}
  • : ""} -
  • {svg_checkmark}{translate("Adaptive bitrate")} (beta)
  • -
  • {translate("Recording")}
  • - {support_remove_wallpaper ?
  • {svg_checkmark}{translate("Remove wallpaper during incoming sessions")}
  • : ""} -
  • {svg_checkmark}{translate("keep-awake-during-incoming-sessions-label")}
  • -
    -
  • ; - } - - function toggleMenuState() { - for (var el in $$(menu#enhancements-menu>li)) { - if (el.id && el.id.indexOf("enable-") == 0) { - var enabled = handler.get_option(el.id) != "N"; - el.attributes.toggleClass("selected", enabled); - var is_opt_fixed = handler.is_option_fixed(el.id); - if (is_opt_fixed) { - el.state.disabled = true; - } - } else if (el.id && el.id.indexOf("allow-") == 0) { - var enabled = handler.get_option(el.id) == "Y"; - el.attributes.toggleClass("selected", enabled); - var is_opt_fixed = handler.is_option_fixed(el.id); - if (is_opt_fixed) { - el.state.disabled = true; - } - } else if (el.id == "keep-awake-during-incoming-sessions") { - var enabled = handler.get_option(el.id) != "N"; - el.attributes.toggleClass("selected", enabled); - var is_opt_fixed = handler.is_option_fixed(el.id); - if (is_opt_fixed) { - el.state.disabled = true; - } - } - } - - } - - event click $(menu#enhancements-menu>li) (_, me) { - if (me.state.disabled) return; - var v = me.id; - if (v.indexOf("enable-") == 0) { - var set_value = handler.get_option(v) != 'N' ? 'N' : default_option_yes; - handler.set_option(v, set_value); - if (v == "enable-hwcodec" && set_value != 'N') { - handler.check_hwcodec(); - } - } else if (v.indexOf("allow-") == 0) { - handler.set_option(v, handler.get_option(v) == 'Y' ? default_option_no : 'Y'); - } else if (v == 'keep-awake-during-incoming-sessions') { - handler.set_option(v, handler.get_option(v) != 'N' ? 'N' : default_option_yes); - } else if (v == 'screen-recording') { - var show_root_dir = is_win && handler.is_installed(); - var user_dir = handler.video_save_directory(false); - var root_dir = show_root_dir ? handler.video_save_directory(true) : ""; - var ts0 = handler.get_option("enable-record-session") != 'N' ? { checked: true } : {}; - var ts1 = handler.get_option("allow-auto-record-incoming") == 'Y' ? { checked: true } : {}; - var ts2 = handler.get_local_option("allow-auto-record-outgoing") == 'Y' ? { checked: true } : {}; - var is_opt_fixed_enable_record = handler.is_option_fixed("enable-record-session"); - var is_opt_fixed_auto_incoming = handler.is_option_fixed("allow-auto-record-incoming"); - var is_opt_fixed_auto_outgoing = handler.is_option_fixed("allow-auto-record-outgoing"); - var is_opt_fixed_video_dir = handler.is_option_fixed("video-save-directory"); - if (is_opt_fixed_enable_record) { ts0.disabled = true; ts0.style = grey_text_style; } - if (is_opt_fixed_auto_incoming) { ts1.disabled = true; ts1.style = grey_text_style; } - if (is_opt_fixed_auto_outgoing) { ts2.disabled = true; ts2.style = grey_text_style; } - msgbox("custom-recording", translate('Recording'), -
    -
    {translate('Enable recording session')}
    -
    {translate('Automatically record incoming sessions')}
    -
    {translate('Automatically record outgoing sessions')}
    -
    - {show_root_dir ?
    {translate("Incoming")}:  {root_dir}
    : ""} -
    {translate(show_root_dir ? "Outgoing" : "Directory")}:  {user_dir}
    - {is_opt_fixed_video_dir ? "" :
    } -
    -
    - , "", function(res=null) { - if (!res) return; - if (!is_opt_fixed_enable_record) handler.set_option("enable-record-session", res.enable_record_session ? default_option_yes : 'N'); - if (!is_opt_fixed_auto_incoming) handler.set_option("allow-auto-record-incoming", res.auto_record_incoming ? 'Y' : default_option_no); - if (!is_opt_fixed_auto_outgoing) handler.set_local_option("allow-auto-record-outgoing", res.auto_record_outgoing ? 'Y' : default_option_no); - if (!is_opt_fixed_video_dir) handler.set_local_option("video-save-directory", $(#folderPath).text); - }, msgbox_default_height, get_msgbox_width()); - } - this.toggleMenuState(); - } -} - -function getUserName() { - try { - return JSON.parse(handler.get_local_option("user_info")).name; - } catch(e) {} - return ''; -} - -function getAccountLabelWithHandle() { - try { - var user = JSON.parse(handler.get_local_option("user_info")); - var username = (user.name || '').trim(); - if (!username) { - return ''; - } - var displayName = (user.display_name || '').trim(); - if (!displayName || displayName == username) { - return username; - } - return displayName + " (@" + username + ")"; - } catch(e) {} - return ''; -} - -// Shared dialog functions -function open_custom_server_dialog() { - var configOptions = handler.get_options(); - var old_relay = configOptions["relay-server"] || ""; - var old_api = configOptions["api-server"] || ""; - var old_id = configOptions["custom-rendezvous-server"] || ""; - var old_key = configOptions["key"] || ""; - msgbox("custom-server", "ID/Relay Server", "
    \ -
    " + translate("ID Server") + ":
    \ -
    " + translate("Relay Server") + ":
    \ -
    " + translate("API Server") + ":
    \ -
    " + translate("Key") + ":
    \ -
    \ - ", "", function(res=null, show_progress) { - if (!res) return; - if (typeof show_progress === 'function') show_progress(); - var id = (res.id || "").trim(); - var relay = (res.relay || "").trim(); - var api = (res.api || "").trim().toLowerCase(); - var key = (res.key || "").trim(); - if (id == old_id && relay == old_relay && key == old_key && api == old_api) return; - if (id) { - var err = handler.test_if_valid_server(id, true); - if (err) { if (typeof show_progress === 'function') show_progress(false, translate("ID Server") + ": " + err); return; } - } - if (relay) { - var err = handler.test_if_valid_server(relay, true); - if (err) { if (typeof show_progress === 'function') show_progress(false, translate("Relay Server") + ": " + err); return; } - } - if (api) { - if (0 != api.indexOf("https://") && 0 != api.indexOf("http://")) { - if (typeof show_progress === 'function') show_progress(false, translate("API Server") + ": " + translate("invalid_http")); - return; - } - } - configOptions["custom-rendezvous-server"] = id; - configOptions["relay-server"] = relay; - configOptions["api-server"] = api; - configOptions["key"] = key; - handler.set_options(configOptions); - if (typeof show_progress === 'function') show_progress(-1); - }, 260, get_msgbox_width()); -} - -function open_whitelist_dialog() { - var is_opt_fixed = handler.is_option_fixed("whitelist"); - var v = handler.get_option("whitelist"); - var old_value = v == default_option_whitelist ? '' : v.split(",").join("\n"); - var type_str = is_opt_fixed ? "custom-whitelist-nook" : "custom-whitelist"; - var readonly_attr = is_opt_fixed ? " readonly=\"readonly\"" : ""; - var grey_class = is_opt_fixed ? " class=\"grey-text\"" : ""; - msgbox(type_str, translate("IP Whitelisting"), "
    \ - " + translate("whitelist_sep") + "
    \ - \ -
    \ - ", "", function(res=null, show_progress) { - if (!res) return; - if (typeof show_progress === 'function') show_progress(); - var value = (res.text || "").trim(); - if (value) { - var values = value.split(/[\s,;\n]+/g); - for (var ip in values) { - if (!ip.match(/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)(\/([1-9]|[1-2][0-9]|3[0-2])){0,1}$/) - && !ip.match(/^(((?:[0-9A-Fa-f]{1,4}))*((?::[0-9A-Fa-f]{1,4}))*::((?:[0-9A-Fa-f]{1,4}))*((?::[0-9A-Fa-f]{1,4}))*|((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4})){7})(\/([1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8])){0,1}$/)) { - if (typeof show_progress === 'function') show_progress(false, translate("Invalid IP") + ": " + ip); - return; - } - } - value = values.join("\n"); - } - if (value == old_value) return; - if (!value) value = default_option_whitelist; - handler.set_option("whitelist", value.replace("\n", ",")); - if (typeof show_progress === 'function') show_progress(-1); - }, 300, get_msgbox_width()); -} - -function open_proxy_dialog() { - var is_opt_fixed = handler.is_option_fixed("proxy-url"); - var socks5 = handler.get_socks() || {}; - var old_proxy = socks5[0] || ""; - var old_username = socks5[1] || ""; - var old_password = socks5[2] || ""; - var type_str = is_opt_fixed ? "custom-server-nook" : "custom-server"; - var greyStyle = is_opt_fixed ? grey_text_style : ""; - msgbox(type_str, "Socks5/Http(s) Proxy",
    -
    {translate("Server")}:
    -
    {translate("Username")}:
    -
    {translate("Password")}:{ is_opt_fixed ? : }
    -
    - , "", function(res=null, show_progress) { - if (!res) return; - if (typeof show_progress === 'function') show_progress(); - var proxy = (res.proxy || "").trim(); - var username = (res.username || "").trim(); - var password = (res.password || "").trim(); - if (proxy == old_proxy && username == old_username && password == old_password) return; - if (proxy) { - var domain_port = proxy; - var protocol_index = domain_port.indexOf('://'); - if (protocol_index !== -1) { - domain_port = domain_port.substring(protocol_index + 3); - } - var err = handler.test_if_valid_server(domain_port, false); - if (err) { if (typeof show_progress === 'function') show_progress(false, translate("Server") + ": " + err); return; } - } - handler.set_socks(proxy, username, password); - if (typeof show_progress === 'function') show_progress(-1); - }, 240, get_msgbox_width()); -} - -function updateTheme() { - var root_element = self; - if (handler.get_option("allow-darktheme") == "Y") { - // enable dark theme - root_element.attributes.toggleClass("darktheme", true); - } else { - // disable dark theme - root_element.attributes.toggleClass("darktheme", false); - } -} - -class MyIdMenu: Reactor.Component { - function this() { - myIdMenu = this; - } - - function render() { - return
    - {this.renderPop()} - ID{svg_menu} -
    ; - } - - function renderPop() { - var accountLabel = handler.get_local_option("access_token") ? getAccountLabelWithHandle() : ''; - return - - {!disable_settings &&
  • {svg_checkmark}{translate('Enable keyboard/mouse')}
  • } - {!disable_settings &&
  • {svg_checkmark}{translate('Enable clipboard')}
  • } - {!disable_settings &&
  • {svg_checkmark}{translate('Enable file transfer')}
  • } - {!disable_settings &&
  • {svg_checkmark}{translate('Enable camera')}
  • } - {!disable_settings &&
  • {svg_checkmark}{translate('Enable terminal')}
  • } - {!disable_settings &&
  • {svg_checkmark}{translate('Enable remote restart')}
  • } - {!disable_settings &&
  • {svg_checkmark}{translate('Enable TCP tunneling')}
  • } - {!disable_settings && is_win ?
  • {svg_checkmark}{translate('Enable blocking user input')}
  • : ""} - {!disable_settings &&
  • {svg_checkmark}{translate('Enable LAN discovery')}
  • } - - - {!disable_settings &&
  • {svg_checkmark}{translate('Enable remote configuration modification')}
  • } - {!disable_settings &&
    } - {!disable_settings && !hide_server_settings &&
  • {translate('ID/Relay Server')}
  • } - {!disable_settings &&
  • {translate('IP Whitelisting')}
  • } - {!disable_settings && !hide_proxy_settings &&
  • {translate('Socks5/Http(s) Proxy')}
  • } - {!disable_settings && !hide_websocket_settings &&
  • {svg_checkmark}{translate('Use WebSocket')}
  • } - {!disable_settings && !using_public_server && !outgoing_only &&
  • {svg_checkmark}{translate('Disable UDP')}
  • } - {!disable_settings && !using_public_server &&
  • {svg_checkmark}{translate('Allow insecure TLS fallback')}
  • } -
    - {(!hide_stop_service || service_stopped) &&
  • {svg_checkmark}{translate("Enable service")}
  • } - {!disable_settings && is_win && handler.is_installed() ? : ""} - {!disable_settings && } - {!disable_settings && false && handler.using_public_server() &&
  • {svg_checkmark}{translate('Always connect via relay')}
  • } - {!disable_change_id && handler.is_ok_change_id() ?
    : ""} - {!disable_account && (accountLabel ? -
  • {translate('Logout')} ({accountLabel})
  • : -
  • {translate('Login')}
  • )} - {!disable_change_id && !disable_settings && handler.is_ok_change_id() && key_confirmed && connect_status > 0 ?
  • {translate('Change ID')}
  • : ""} -
    -
  • {svg_checkmark}{translate('Dark Theme')}
  • - - {disable_installation ? "" :
  • {svg_checkmark}{translate('Auto update')}
  • } -
  • {translate('About')} {" "}{handler.get_app_name()}
  • - - ; - } - - event click $(svg#menu) (_, me) { - this.showSettingMenu(); - } - - function showSettingMenu() { - audioInputMenu.update({ show: true }); - this.toggleMenuState(); - if (direct_server) direct_server.update(); - var menu = this.$(menu#config-options); - this.$(svg#menu).popup(menu); - } - - event click $(li#login) () { - login(); - } - - event click $(li#logout) () { - logout(); - } - - function toggleMenuState() { - for (var el in $$(menu#config-options>li)) { - var id = el.id; - if (!id) continue; - var is_opt_fixed = handler.is_option_fixed(id); - if (id.indexOf("enable-") == 0) { - var enabled = handler.get_option(id) != "N"; - el.attributes.toggleClass("selected", enabled); - el.attributes.toggleClass("line-through", !enabled); - } else if (id.indexOf("allow-") == 0) { - var enabled = handler.get_option(id) == "Y"; - el.attributes.toggleClass("selected", enabled); - el.attributes.toggleClass("line-through", !enabled); - } else if (id == "whitelist") { - // whitelist should be clickable even when fixed (to view the content) - // The dialog will show readonly textarea and no OK button when fixed - continue; - } - if (is_opt_fixed) { - el.state.disabled = true; - } - } - } - - function showAbout() { - var name = handler.get_app_name(); - msgbox("custom-nocancel-nook-hasclose", translate("About") + " " + name, "
    \ -
    Version: " + handler.get_version() + " \ -
    Fingerprint: " + handler.get_fingerprint() + " \ -
    " + translate("Privacy Statement") + "
    \ -
    " + translate("Website") + "
    \ -
    Copyright © 2025 Purslane Ltd.\ -
    " + handler.get_license() + " \ -

    " + translate("Slogan_tip") + "

    \ -
    \ -
    ", "", function(el) { - if (el && el.attributes) { - handler.open_url(el.attributes['url']); - }; - }, 400, get_msgbox_width()); - } - - event click $(menu#config-options>li) (_, me) { - if (me.state.disabled) return; - if (me.id && me.id.indexOf("enable-") == 0) { - handler.set_option(me.id, handler.get_option(me.id) == "N" ? default_option_yes : "N"); - } - if (me.id && me.id.indexOf("allow-") == 0) { - handler.set_option(me.id, handler.get_option(me.id) == "Y" ? default_option_no : "Y"); - } - if (me.id == "whitelist") { - open_whitelist_dialog(); - } else if (me.id == "custom-server") { - open_custom_server_dialog(); - } else if (me.id == "socks5-server") { - open_proxy_dialog(); - } else if (me.id == "disable-udp") { - handler.set_option("disable-udp", handler.get_option("disable-udp") == "Y" ? "N" : "Y"); - } else if (me.id == "stop-service") { - handler.set_option("stop-service", service_stopped ? default_option_no : "Y"); - } else if (me.id == "change-id") { - var id_label_width = incoming_only ? "50px" : "100px"; - var input_width = incoming_only ? (incoming_only_width - 20) + "px" : "250px"; - msgbox("custom-id", translate("Change ID"), "
    \ -
    " + translate('id_change_tip') + "
    \ -
    ID:
    \ -
    \ - ", "", function(res=null, show_progress) { - if (!res) return; - show_progress(); - var id = (res.id || "").trim(); - if (!id) return; - if (id == my_id) return; - handler.change_id(id); - function check_status() { - var status = handler.get_async_job_status(); - if (status == " ") self.timer(0.1s, check_status); - else { - if (status) show_progress(false, translate(status)); - else show_progress(-1); - } - } - check_status(); - return " "; - }, msgbox_default_height, get_msgbox_width()); - } else if (me.id == "allow-darktheme") { - updateTheme(); - } else if (me.id == "about") { - this.showAbout() - } - } -} - -var is_edit_direct_access_port; -class EditDirectAccessPort: Reactor.Component { - function render() { - return {svg_edit}; - } - - function onMouse(evt) { - if (evt.type == Event.MOUSE_DOWN) { - is_edit_direct_access_port = true; - editDirectAccessPort(); - } - } -} - -function editDirectAccessPort() { - var is_opt_fixed = handler.is_option_fixed("direct-access-port"); - var p0 = handler.get_option('direct-access-port'); - var greyStyle = is_opt_fixed ? grey_text_style : ""; - var port = p0 ? : - ; - var type_str = is_opt_fixed ? "custom-direct-access-port-nook" : "custom-direct-access-port"; - msgbox(type_str, translate('Direct IP Access Settings'),
    -
    {translate('Port')}:{port}
    -
    , "", function(res=null) { - if (!res) return; - var p = (res.port || '').trim(); - if (p) { - p = p.toInteger(); - if (!(p > 0)) { - return translate("Invalid port"); - } - p = p + ''; - } - if (p != p0) handler.set_option('direct-access-port', p); - }, msgbox_default_height, get_msgbox_width()); -} - -class App: Reactor.Component -{ - function this() { - app = this; - } - - function render() { - var is_can_screen_recording = handler.is_can_screen_recording(false); - return -
    -
    -
    - {is_custom_client && handler.get_builtin_option("hide-powered-by-me") != "Y" ?
    {translate('powered_by_me')}
    : ""} -
    - {translate('Your Desktop')} - {outgoing_only ? {svg_menu} : ""} -
    -
    {outgoing_only ? translate('outgoing_only_desk_tip') : translate('desk_tip')}
    - {outgoing_only ?
    : ""} - {!outgoing_only &&
    - - {key_confirmed ? : translate("Generating ...")} -
    } - {!outgoing_only && } -
    - {(!is_win || handler.is_installed() || disable_installation) ? "" : } - {software_update_url && !disable_installation ? : ""} - {is_win && handler.is_installed() && !software_update_url && handler.is_installed_lower_version() && !disable_installation ? : ""} - {is_can_screen_recording ? "": } - {is_can_screen_recording && !handler.is_process_trusted(false) ? : ""} - {!service_stopped && is_can_screen_recording && handler.is_process_trusted(false) && handler.is_installed() && !handler.is_installed_daemon(false) ? : ""} - {system_error ? : ""} - {!system_error && handler.is_login_wayland() && !handler.current_is_wayland() ? : ""} - {!system_error && handler.current_is_wayland() ? : ""} - {incoming_only ? : ""} -
    - {!incoming_only &&
    -
    -
    -
    {translate('Control Remote Desktop')}
    - -
    - - -
    -
    - -
    - {!outgoing_only ? : ""} -
    } -
    -
    ; - } - - event click $(button#connect) { - this.newRemote("connect"); - } - - event click $(button#file-transfer) { - this.newRemote("file-transfer"); - } - - function newRemote(type) { - createNewConnect(this.remote_id.value, type); - } -} - -class InstallMe: Reactor.Component { - function render() { - return
    - -
    {translate('install_tip')}
    -
    -
    ; - } - - event click $(#install-me) { - handler.goto_install(); - } -} - -function download(from, to, args..) { - var rqp = { type:#get, url: from, toFile: to }; - var fn = 0; - var on = 0; - for( var p in args ) { - if( p instanceof Function ) { - switch(++fn) { - case 1: rqp.success = p; break; - case 2: rqp.error = p; break; - case 3: rqp.progress = p; break; - } - } else if( p instanceof Object ) { - switch(++on) { - case 1: rqp.params = p; break; - case 2: rqp.headers = p; break; - } - } - } - view.request(rqp); -} - -// current running version is higher than installed -class UpgradeMe: Reactor.Component { - function render() { - var update_or_download = is_osx ? "download" : "update"; - return
    -
    {translate('Status')}
    -
    {translate('Your installation is lower version.')}
    -
    {translate('Click to upgrade')}
    -
    ; - } - - event click $(#install-me) { - handler.update_me(""); - } -} - -class UpdateMe: Reactor.Component { - function render() { - var update_or_download = "download"; // !is_win ? "download" : "update"; - return
    -
    {translate('Status')}
    -
    There is a newer version of {handler.get_app_name()} ({handler.get_new_version()}) available.
    - {is_custom_client - ?
    {translate('Enable \"Auto update\" or contact your administrator for the latest version.')}
    - :
    {translate('Click to ' + update_or_download)}
    } -
    -
    ; - } - - event click $(#install-me) { - handler.open_url("https://rustdesk.com/download"); - return; - if (!is_win) { - handler.open_url("https://rustdesk.com"); - return; - } - var url = software_update_url + '.' + handler.get_software_ext(); - var path = handler.get_software_store_path(); - var onsuccess = function(md5) { - $(#download-percent).content(translate("Installing ...")); - handler.update_me(path); - }; - var onerror = function(err) { - msgbox("custom-error", "Download Error", "Failed to download"); - }; - var onprogress = function(loaded, total) { - if (!total) total = 5 * 1024 * 1024; - var el = $(#download-percent); - el.style.set{display: "block"}; - el.content("Downloading %" + (loaded * 100 / total)); - }; - stdout.println("Downloading " + url + " to " + path); - download( - url, - self.url(path), - onsuccess, onerror, onprogress); - } -} - -class SystemError: Reactor.Component { - function render() { - return
    -
    {system_error}
    -
    ; - } -} - -class TrustMe: Reactor.Component { - function render() { - return
    -
    {translate('Permissions')}
    -
    {translate('config_acc')}
    -
    {translate('Configure')}
    -
    {translate('Help')}
    -
    ; - } - - event click $(#trust-me) { - handler.is_process_trusted(true); - watch_trust(); - } - - event click $(#help-me) { - handler.open_url(translate("doc_mac_permission")); - } -} - -class CanScreenRecording: Reactor.Component { - function render() { - return
    -
    {translate('Permissions')}
    -
    {translate('config_screen')}
    -
    {translate('Configure')}
    -
    {translate('Help')}
    -
    ; - } - - event click $(#screen-recording) { - handler.is_can_screen_recording(true); - watch_screen_recording(); - } - - event click $(#help-me) { - handler.open_url(translate("doc_mac_permission")); - } -} - -class InstallDaemon: Reactor.Component { - function render() { - return
    - -
    {translate('install_daemon_tip')}
    -
    {translate('Install')}
    -
    ; - } - - event click $(#install-me) { - handler.is_installed_daemon(true); - } -} - -class FixWayland: Reactor.Component { - function render() { - return
    -
    {translate('Warning')}
    -
    {translate('Login screen using Wayland is not supported')}
    -
    {translate('Help')}
    -
    ; - } - - event click $(#help-me) { - handler.open_url(translate("doc_fix_wayland")); - } -} - -class ModifyDefaultLogin: Reactor.Component { - function render() { - return
    -
    {translate('Warning')}
    -
    {translate('wayland_experiment_tip')}
    -
    {translate('Help')}
    -
    ; - } - - event click $(#help-me) { - handler.open_url(translate("doc_fix_wayland")); - } -} - -function watch_trust() { - // not use TrustMe::update, because it is buggy - var trusted = handler.is_process_trusted(false); - var el = $(div#trust-me-box); - if (el) { - el.style.set { - display: trusted ? "none" : "block", - }; - } - if (trusted) { - app.update(); - return; - } - self.timer(1s, watch_trust); -} - -function watch_screen_recording() { - var trusted = handler.is_can_screen_recording(false); - var el = $(div#screen-recording-box); - if (el) { - el.style.set { - display: trusted ? "none" : "block", - }; - } - if (trusted) { - app.update(); - return; - } - self.timer(1s, watch_screen_recording); -} - -class PasswordEyeArea : Reactor.Component { - render() { - var method = handler.get_option('verification-method'); - var mode= handler.get_option('approve-mode'); - var hide_one_time = mode == 'click' || method == 'use-permanent-password'; - var value = hide_one_time ? "-" : password_cache[0]; - return -
    - - {hide_one_time ? "" : svg_refresh_password} -
    ; - } - - event click $(svg#refresh-password) (_, me) { - handler.update_temporary_password(); - this.update(); - } -} - -var temporaryPasswordLengthMenu; -class TemporaryPasswordLengthMenu: Reactor.Component { - function this() { - temporaryPasswordLengthMenu = this; - } - - function render() { - if (!this.show) return
  • ; - var me = this; - var method = handler.get_option('verification-method'); - self.timer(1ms, function() { me.toggleMenuState() }); - return
  • {translate("One-time password length")} - -
  • {svg_checkmark}6
  • -
  • {svg_checkmark}8
  • -
  • {svg_checkmark}10
  • -
    -
  • ; - } - - function toggleMenuState() { - var is_opt_fixed = handler.is_option_fixed('temporary-password-length'); - var length = handler.get_option("temporary-password-length"); - var index = ['6', '8', '10'].indexOf(length); - if (index < 0) index = 0; - for (var (i, el) in this.$$(menu#temporary-password-length>li)) { - el.attributes.toggleClass("selected", i == index); - if (is_opt_fixed) { - el.state.disabled = true; - } - } - } - - event click $(menu#temporary-password-length>li) (_, me) { - if (me.state.disabled) return; - var length = me.id.substring('temporary-password-length-'.length); - var old_length = handler.get_option('temporary-password-length'); - if (length != old_length) { - handler.set_option('temporary-password-length', length); - handler.update_temporary_password(); - this.toggleMenuState(); - passwordArea.update(); - } - } -} - -var passwordArea; -class PasswordArea: Reactor.Component { - function this() { - passwordArea = this; - } - - function render() { - var me = this; - self.timer(1ms, function() { me.toggleMenuState() }); - return -
    -
    {translate('One-time Password')}
    -
    - {this.renderPop()} - - {!disable_settings && svg_edit} -
    -
    ; - } - - function renderPop() { - var method = handler.get_option('verification-method'); - var approve_mode= handler.get_option('approve-mode'); - var show_password = approve_mode != 'click'; - var has_local_password = handler.is_local_permanent_password_set(); - return -
  • {svg_checkmark}{translate('Accept sessions via password')}
  • -
  • {svg_checkmark}{translate('Accept sessions via click')}
  • -
  • {svg_checkmark}{translate('Accept sessions via both')}
  • - { !show_password ? '' :
    } - { !show_password ? '' :
  • {svg_checkmark}{translate('Use one-time password')}
  • } - { !show_password ? '' :
  • {svg_checkmark}{translate('Use permanent password')}
  • } - { !show_password ? '' :
  • {svg_checkmark}{translate('Use both passwords')}
  • } - { !show_password ? '' :
    } - { !show_password || disable_change_permanent_password ? '' :
  • {translate('Set permanent password')}
  • } - { !show_password || disable_change_permanent_password ? '' :
  • {translate('Clear permanent password')}
  • } - { !show_password ? '' : } -
    -
  • {svg_checkmark}{translate('enable-2fa-title')}
  • - ; - } - - function toggleMenuState() { - var mode= handler.get_option('approve-mode'); - var mode_id; - if (mode == 'password') - mode_id = 'approve-mode-password'; - else if (mode == 'click') - mode_id = 'approve-mode-click'; - else - mode_id = 'approve-mode-both'; - var pwd_id = handler.get_option('verification-method'); - if (pwd_id != 'use-temporary-password' && pwd_id != 'use-permanent-password') - pwd_id = 'use-both-passwords'; - var has_valid_2fa = handler.has_valid_2fa(); - for (var el in this.$$(menu#edit-password-context>li)) { - if (el.id.indexOf("approve-mode-") == 0) { - el.attributes.toggleClass("selected", el.id == mode_id); - if (handler.is_option_fixed('approve-mode')) { - el.state.disabled = true; - } - } - if (el.id.indexOf("use-") == 0) { - el.attributes.toggleClass("selected", el.id == pwd_id); - if (handler.is_option_fixed('verification-method')) { - el.state.disabled = true; - } - } - if (el.id == "clear-password") { - var has_local_password = handler.is_local_permanent_password_set(); - el.state.disabled = !has_local_password; - } - if (el.id == "tfa") - el.attributes.toggleClass("selected", has_valid_2fa); - } - } - - event click $(svg#edit) (_, me) { - var approve_mode= handler.get_option('approve-mode'); - var show_password = approve_mode != 'click'; - if(show_password && temporaryPasswordLengthMenu) temporaryPasswordLengthMenu.update({show: true }); - var menu = $(menu#edit-password-context); - me.popup(menu); - } - - event click $(li#set-password) { - var me = this; - var has_local_password = handler.is_local_permanent_password_set(); - var permanent_password_set = handler.is_permanent_password_set(); - var password_hidden_tip = translate('password-hidden-tip'); - var preset_password_tip = translate('preset-password-in-use-tip'); - var password_tip = ""; - if (has_local_password) { - password_tip = "
    [!] " + password_hidden_tip + "
    "; - } else if (permanent_password_set) { - password_tip = "
    [!] " + preset_password_tip + "
    "; - } - msgbox("custom-password", translate("Set Password"), "
    \ -
    " + translate('Password') + ":
    \ -
    " + translate('Confirmation') + ":
    \ - " + password_tip + " \ -
    \ - ", "", function(res=null) { - if (!res) return; - var p0 = (res.password || "").trim(); - var p1 = (res.confirmation || "").trim(); - if (p0.length == 0 && p1.length == 0) { - return " "; - } - if (p0.length < 6 && p0.length != 0) { - return translate("Too short, at least 6 characters."); - } - if (p0 != p1) { - return translate("The confirmation is not identical."); - } - handler.set_permanent_password(p0); - me.update(); - }, msgbox_default_height, get_msgbox_width()); - self.timer(30ms, function() { - updateSetPasswordSubmitState(); - }); - } - - event click $(li#clear-password) { - if (this.$(li#clear-password).state.disabled) return; - handler.set_permanent_password(""); - this.update(); - } - - event click $(menu#edit-password-context>li) (_, me) { - if (me.state.disabled) return; - if (me.id.indexOf('use-') == 0) { - handler.set_option('verification-method', me.id); - this.toggleMenuState(); - passwordArea.update(); - } else if (me.id.indexOf('approve-mode') == 0) { - var approve_mode; - if (me.id == 'approve-mode-password') - approve_mode = 'password'; - else if (me.id == 'approve-mode-click') - approve_mode = 'click'; - else - approve_mode = default_option_approve_mode; - handler.set_option('approve-mode', approve_mode); - this.toggleMenuState(); - passwordArea.update(); - } - } - - event click $(li#tfa) { - var me = this; - var has_valid_2fa = handler.has_valid_2fa(); - if (has_valid_2fa) { - handler.set_option('2fa', ''); - me.update(); - } else { - var new2fa = handler.generate2fa(); - var src = handler.generate_2fa_img_src(new2fa); - msgbox("custom-2fa-setting", translate('enable-2fa-title'), -
    -
    {translate('enable-2fa-desc')}
    - -
    -
    - , "", function(res=null) { - if (!res) return; - if (!res.code) return; - if (!handler.verify2fa(res.code)) { - return translate('wrong-2fa-code'); - } - me.update(); - }, 400, get_msgbox_width()); - } - } -} - -var password_cache = ["","","",""]; -function updatePasswordArea() { - self.timer(1s, function() { - var temporary_password = handler.temporary_password(); - var verification_method = handler.get_option('verification-method'); - var temporary_password_length = handler.get_option('temporary-password-length'); - var approve_mode = handler.get_option('approve-mode'); - var update = false; - if (password_cache[0] != temporary_password) { - password_cache[0] = temporary_password; - update = true; - } - if (password_cache[1] != verification_method) { - password_cache[1] = verification_method; - update = true; - } - if (password_cache[2] != temporary_password_length) { - password_cache[2] = temporary_password_length; - update = true; - } - if (password_cache[3] != approve_mode) { - password_cache[3] = approve_mode; - update = true; - } - if (update && passwordArea) passwordArea.update(); - updatePasswordArea(); - }); -} -if (!outgoing_only) updatePasswordArea(); - -function updateSetPasswordSubmitState() { - var dialog = $(#msgbox); - if (!dialog) return; - var password = dialog.$(input[name='password']); - var confirmation = dialog.$(input[name='confirmation']); - var submit = dialog.$(button#submit); - if (!password || !confirmation || !submit) return; - var can_submit = (password.value || "").trim().length > 0 || - (confirmation.value || "").trim().length > 0; - submit.state.disabled = !can_submit; -} - -class ID: Reactor.Component { - function render() { - return ; - } - - // https://github.com/c-smile/sciter-sdk/blob/master/doc/content/sciter/Event.htm - event change { - var fid = formatId(this.value); - var d = this.value.length - (this.old_value || "").length; - this.old_value = this.value; - var start = this.xcall(#selectionStart) || 0; - var end = this.xcall(#selectionEnd); - if (fid == this.value || d <= 0 || start != end) { - return; - } - // fix Caret position - this.value = fid; - var text_after_caret = this.old_value.substr(start); - var n = fid.length - formatId(text_after_caret).length; - this.xcall(#setSelection, n, n); - } -} - -var reg = /^\d+$/; -function formatId(id) { - id = id.replace(/\s/g, ""); - if (reg.test(id) && id.length > 3) { - var n = id.length; - var a = n % 3 || 3; - var new_id = id.substr(0, a); - for (var i = a; i < n; i += 3) { - new_id += " " + id.substr(i, 3); - } - return new_id; - } - return id; -} - -event keydown (evt) { - if (view.focus && view.focus.id != 'remote_id') { - return; - } - if (!evt.shortcutKey) { - if (isEnterKey(evt)) { - var el = $(button#connect); - view.focus = el; - el.sendEvent("click"); - // simulate button click effect, windows does not have this issue - el.attributes.toggleClass("active", true); - self.timer(0.3s, function() { - el.attributes.toggleClass("active", false); - }); - } - } -} - -event keyup $(#msgbox input[name='password']) { - updateSetPasswordSubmitState(); -} - -event keyup $(#msgbox input[name='confirmation']) { - updateSetPasswordSubmitState(); -} - -event change $(#msgbox input[name='password']) { - updateSetPasswordSubmitState(); -} - -event change $(#msgbox input[name='confirmation']) { - updateSetPasswordSubmitState(); -} - -$(body).content(
    ); - -event click $(#powered-by) { - handler.open_url("https://rustdesk.com"); -} - -event click $(#open-settings) (_, me) { - showSettings(); -} - -// Event handlers for outgoing_only mode (when menu items are in main UI, not in MyIdMenu) -event click $(li#custom-server) (_, me) { - if (!outgoing_only) return; - open_custom_server_dialog(); -} - -event click $(li#whitelist) (_, me) { - if (!outgoing_only) return; - open_whitelist_dialog(); -} - -event click $(li#socks5-server) (_, me) { - if (!outgoing_only) return; - open_proxy_dialog(); -} - -event click $(li#login) (_, me) { - if (!outgoing_only) return; - login(); -} - -function self.closing() { - var (x, y, w, h) = view.box(#rectw, #border, #screen); - handler.closing(x, y, w, h); - return true; -} - -function self.ready() { - var r = handler.get_size(); - if (isReasonableSize(r) && r[2] > 0) { - var (sx, sy, sw, sh) = view.screenBox(#workarea, #rectw); - if (r[2] >= sw && r[3] >= sh) { - self.timer(1ms, function() { view.windowState = View.WINDOW_MAXIMIZED; }); - } else { - view.move(r[0], r[1], incoming_only ? scaleIt(incoming_only_width) : r[2], r[3]); - } - } else { - centerize(scaleIt(incoming_only ? incoming_only_width : 800), scaleIt(incoming_only ? 390 : 600)); - } - if (!handler.get_remote_id()) { - view.focus = $(#remote_id); - } - refreshCurrentUser(); - updateTheme(); -} - -function showAbout() { - myIdMenu.showAbout(); -} - -function showSettings() { - if ($(#overlay).style#display == 'block') return; - var menu = myIdMenu.$(menu#config-options); - var anchor = $(#open-settings); - if (!anchor) anchor = myIdMenu.$(svg#menu); - // show immediately at button, then update menu state asynchronously - anchor.popup(menu); - self.timer(1ms, function() { - audioInputMenu.update({ show: true }); - myIdMenu.toggleMenuState(); - if (direct_server) direct_server.update(); - }); -} - -function checkConnectStatus() { - handler.check_mouse_time(); // trigger connection status updater - self.timer(1s, function() { - var tmp = handler.get_option("stop-service") == "Y"; - if (tmp != service_stopped) { - service_stopped = tmp; - app.update(); - } - tmp = handler.using_public_server(); - if (tmp != using_public_server) { - using_public_server = tmp; - app.connect_status.update(); - } - tmp = handler.get_connect_status(); - if (tmp[0] != connect_status) { - connect_status = tmp[0]; - app.connect_status.update(); - myIdMenu.update(); - } - if (tmp[1] != key_confirmed) { - key_confirmed = tmp[1]; - app.update(); - } - if (tmp[2] && tmp[2] != my_id) { - stdout.println("id updated"); - app.update(); - } - tmp = handler.get_error(); - if (system_error != tmp) { - system_error = tmp; - app.update(); - } - tmp = handler.get_software_update_url(); - if (tmp != software_update_url) { - software_update_url = tmp; - app.update(); - } - if (handler.recent_sessions_updated()) { - stdout.println("recent sessions updated"); - updateAbPeer(); - app.update(); - } - tmp = handler.get_option("disable-udp") == "Y"; - if (tmp != disable_udp) { - disable_udp = tmp; - app.update(); - } - check_if_overlay(); - checkConnectStatus(); - }); -} - -var enter = false; -function self.onMouse(evt) { - switch(evt.type) { - case Event.MOUSE_ENTER: - enter = true; - check_if_overlay(); - break; - case Event.MOUSE_LEAVE: - $(#overlay).style#display = 'none'; - enter = false; - break; - } -} - -function check_if_overlay() { - var enabled; - var is_enabled_by_control_permissions = handler.is_remote_modify_enabled_by_control_permissions(); - if (is_enabled_by_control_permissions == "true") { - enabled = true; - } else if (is_enabled_by_control_permissions == "false") { - enabled = false; - } else { - enabled = handler.get_option('allow-remote-config-modification') == 'Y'; - } - if (!enabled) { - var time0 = getTime(); - handler.check_mouse_time(); - self.timer(120ms, function() { - if (!enter) return; - var d = time0 - handler.get_mouse_time(); - if (d < 120) $(#overlay).style#display = 'block'; - }); - } -} - -checkConnectStatus(); - -function set_local_user_info(user) { - var user_info = {name: user.name}; - if (user.display_name) { - user_info.display_name = user.display_name; - } - if (user.avatar) { - user_info.avatar = user.avatar; - } - if (user.status) { - user_info.status = user.status; - } - handler.set_local_option("user_info", JSON.stringify(user_info)); -} - -function login() { - var name0 = getUserName(); - var pass0 = ''; - msgbox("custom-login", translate('Login'),
    -
    {translate('Username')}:
    -
    {translate('Password')}:
    -
    , "", function(res=null, show_progress) { - if (!res) return; - show_progress(); - var name = (res.username || '').trim(); - if (!name) { - show_progress(false, translate("Username missed")); - return " "; - } - var pass = (res.password || '').trim(); - if (!pass) { - show_progress(false, translate("Password missed")); - return " "; - } - abLoading = true; - var url = handler.get_api_server(); - httpRequest(url + "/api/login", #post, {username: name, password: pass, id: my_id, uuid: handler.get_uuid(), type: 'account', deviceInfo: getDeviceInfo()}, function(data) { - if (data.error) { - abLoading = false; - var err = translate(data.error); - show_progress(false, err); - return; - } - if (data.type == 'email_check') { - abLoading = false; - show_progress(-1); - on_2fa_check(data); - return; - } - handler.set_local_option("access_token", data.access_token); - set_local_user_info(data.user); - show_progress(-1); - myIdMenu.update(); - getAb(); - }, function(err, status) { - abLoading = false; - err = translate(err); - if (url.indexOf('rustdesk') < 0) err = url + ', ' + err; - show_progress(false, err); - }); - return " "; - }, msgbox_default_height, get_msgbox_width()); -} - -function on_2fa_check(last_msg) { - const isEmailCheck = !last_msg.tfa_type || last_msg.tfa_type == 'email_check'; - const secret = last_msg.secret; - const emailHint = last_msg.user.email; - - msgbox("custom-2fa-verification-code", translate('Verification code'),
    - { isEmailCheck &&
    {translate('Email')}:{emailHint}
    } -
    {translate(isEmailCheck ? 'Verification code' : '2FA code')}:
    - { isEmailCheck &&
    {translate('verification_tip')}
    } -
    , "", - function(res=null, show_progress) { - if (!res) return; - show_progress(); - var code = (res.verification_code || '').trim(); - if (!code || code.length < 6) { - show_progress(false, translate("Too short, at least 6 characters.")); - return " "; - } - abLoading = true; - var url = handler.get_api_server(); - const loginData = { - username: last_msg.user.name, - id: my_id, - uuid: handler.get_uuid(), - type: 'email_code', - verificationCode: code, - tfaCode: isEmailCheck ? '' : code, - secret: secret, - deviceInfo: getDeviceInfo() - }; - httpRequest(url + "/api/login", #post, loginData, - function(data) { - if (data.error) { - abLoading = false; - show_progress(false, data.error); - return; - } - handler.set_local_option("access_token", data.access_token); - set_local_user_info(data.user); - show_progress(-1); - myIdMenu.update(); - getAb(); - }, - function(err, status) { - abLoading = false; - err = translate(err); - if (url.indexOf('rustdesk') < 0) err = url + ', ' + err; - show_progress(false, err); - } - ); - return " "; - }, - msgbox_default_height, - get_msgbox_width() - ); -} - -function reset_token() { - handler.set_local_option("access_token", ""); - handler.set_local_option("user_info", ""); - handler.set_local_option("selected-tags", ""); - myIdMenu.update(); - resetAb(); - if (abComponent) { - abComponent.update(); - } -} - -function logout() { - var url = handler.get_api_server(); - httpRequest(url + "/api/logout", #post, {id: my_id, uuid: handler.get_uuid()}, function(data) { - }, function(err, status) { - msgbox("custom-error", translate('Error'), err); - }, getHttpHeaders()); - reset_token(); -} - -function refreshCurrentUser() { - var token = handler.get_local_option("access_token"); - if (!token) { return; } - abLoading = true; - abError = ""; - app.update(); - httpRequest(handler.get_api_server() + "/api/currentUser", #post, {id: my_id, uuid: handler.get_uuid()}, function(data) { - if (data.error) { - if (data.error == 'Invalid token') { - reset_token(); - } - handleAbError(data.error); - return; - } - if (!handler.verify_login(data.verifier, token)) { - handleAbError("Please update your self-hosting server Pro to latest version"); - return; - } - set_local_user_info(data); - myIdMenu.update(); - getAb(); - }, function(err, status) { - if (status == 401 || status == 400) { - reset_token(); - } - handleAbError(err); - }, getHttpHeaders()); -} - -function getHttpHeaders() { - return "Authorization: Bearer " + handler.get_local_option("access_token"); -} - -function getDeviceInfo() { - return JSON.parse(handler.get_login_device_info()); -} diff --git a/shelled/rustdesk-as-ref/src/ui/install.html b/shelled/rustdesk-as-ref/src/ui/install.html deleted file mode 100644 index bd9653e..0000000 --- a/shelled/rustdesk-as-ref/src/ui/install.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/shelled/rustdesk-as-ref/src/ui/install.tis b/shelled/rustdesk-as-ref/src/ui/install.tis deleted file mode 100644 index fad4071..0000000 --- a/shelled/rustdesk-as-ref/src/ui/install.tis +++ /dev/null @@ -1,70 +0,0 @@ -function self.ready() { - centerize(scaleIt(800), scaleIt(600)); -} - -var install_path = ""; - -class Install: Reactor.Component { - function render() { - const install_options = JSON.parse(view.install_options()); - const desktop_icon = { checked: install_options?.DESKTOPSHORTCUTS == '0' ? false : true }; - const startmenu_shortcuts = { checked: install_options?.STARTMENUSHORTCUTS == '0' ? false : true }; - return
    -
    {translate('Installation')}
    -
    {translate('Installation Path')} {": "} - -
    -
    {translate('Create start menu shortcuts')}
    -
    {translate('Create desktop icon')}
    -
    {translate('End-user license agreement')}
    -
    {translate('agreement_tip')}
    -
    -
    - - - - {handler.show_run_without_install() && } -
    -
    ; - } - - event click $(#cancel) { - view.close(); - } - - event click $(#run-without-install) { - handler.run_without_install(); - } - - event click $(#path) { - install_path = view.selectFolder() || ""; - if (install_path) { - install_path = install_path.urlUnescape(); - install_path = install_path.replace("file://", "").replace("/", "\\"); - if (install_path[install_path.length - 1] != "\\") install_path += "\\"; - install_path += handler.get_app_name(); - $(#path_input).value = install_path; - } - } - - event click $(#agreement) { - view.open_url("http://rustdesk.com/privacy"); - } - - event click $(#submit) { - for (var el in $$(button)) el.state.disabled = true; - $(progress).style.set{ display: "inline-block" }; - var args = ""; - if ($(#startmenu).value) { - args += "startmenu "; - } - if ($(#desktopicon).value) { - args += "desktopicon "; - } - view.install_me(args, install_path); - } -} - -$(body).content(); diff --git a/shelled/rustdesk-as-ref/src/ui/msgbox.tis b/shelled/rustdesk-as-ref/src/ui/msgbox.tis deleted file mode 100644 index 6e6b6a6..0000000 --- a/shelled/rustdesk-as-ref/src/ui/msgbox.tis +++ /dev/null @@ -1,390 +0,0 @@ -function translate_text(text) { - if (text.indexOf('Failed') == 0 && text.indexOf(': ') > 0) { - var fds = text.split(': '); - for (var i = 0; i < fds.length; ++i) { - fds[i] = translate(fds[i]); - } - text = fds.join(': '); - } else { - var fds = text.split(' '); - if (fds.length > 1 && fds[0].slice(-4) === '_tip') { - fds[0] = translate(fds[0]); - var rest = text.substring(fds[0].length + 1); - text = fds[0] + ' ' + translate(rest); - } else { - text = translate(text); - } - } - return text; -} - -var msgboxTimerFunc = function() {} -function closeMsgbox() { - self.timer(0, msgboxTimerFunc); - $(#msgbox).content(); -} - -class MsgboxComponent: Reactor.Component { - function this(params) { - this.width = params.width; - this.height = params.height; - this.type = params.type; - this.title = params.title; - this.content = params.content; - this.link = params.link; - this.remember = params.remember; - this.callback = params.callback; - this.hasRetry = params.hasRetry; - this.autoLogin = params.autoLogin; - this.contentStyle = params.contentStyle; - try { this.content = translate_text(this.content); } catch (e) {} - } - - function getIcon(color) { - if (this.type == "input-password" || this.type == "session-login" || this.type == "session-login-password" || this.type == "input-2fa") { - return ; - } - if (this.type == "connecting") { - return ; - } - if (this.type == "success") { - return ; - } - if (this.type.indexOf("error") >= 0 || this.type == "re-input-password" || this.type == "input-2fa" || this.type == "session-re-login" || this.type == "session-login-re-password") { - return ; - } - return null; - } - - function getInputPasswordContent() { - var ts = this.remember ? { checked: true } : {}; - return
    -
    {translate('Please enter your password')}
    - -
    {translate('Remember password')}
    -
    ; - } - - function get2faContent() { - var enable_trusted_devices = handler.get_enable_trusted_devices(); - return
    -
    {translate('enter-2fa-title')}
    -
    - {enable_trusted_devices ?
    {translate('Trust this device')}
    : ""} -
    ; - } - - function getInputUserPasswordContent() { - return
    -
    {translate("OS Username")}
    -
    -
    {translate("OS Password")}
    - -
    -
    ; - } - - function getXsessionPasswordContent() { - return
    -
    {translate("OS Username")}
    -
    -
    {translate("OS Password")}
    - -
    {translate('Please enter your password')}
    - -
    {translate('Remember password')}
    -
    ; - } - - function getContent() { - if (this.type == "input-password") { - return this.getInputPasswordContent(); - } else if (this.type == "input-2fa") { - return this.get2faContent(); - } else if (this.type == "session-login") { - return this.getInputUserPasswordContent(); - } else if (this.type == "session-login-password") { - return this.getXsessionPasswordContent(); - } else if (this.type == "custom-os-password") { - var ts = this.autoLogin ? { checked: true } : {}; - return
    - -
    {translate('Auto Login')}
    -
    ; - } - return this.content; - } - - function getColor() { - if (this.type == "input-password" || this.type == "input-2fa" || this.type == "custom-os-password" || this.type == "session-login" || this.type == "session-login-password") { - return "#AD448E"; - } - if (this.type == "success") { - return "#32bea6"; - } - if (this.type.indexOf("error") >= 0 || this.type == "re-input-password" || this.type == "session-re-login" || this.type == "session-login-re-password") { - return "#e04f5f"; - } - return "#2C8CFF"; - } - - function hasSkip() { - return this.type.indexOf("skip") >= 0; - } - - function getScreenshotButtons() { - var isScreenshot = this.type.indexOf("take-screenshot") >= 0; - return isScreenshot - ?
    - - - -
    - : ""; - } - - function render() { - this.set_outline_focus(); - var color = this.getColor(); - var icon = this.getIcon(color); - var content = this.getContent(); - var hasCancel = this.type.indexOf("error") < 0 && this.type.indexOf("nocancel") < 0 && this.type != "restarting"; - var hasOk = this.type != "connecting" && this.type != "success" && this.type.indexOf("nook") < 0; - var hasLink = this.link != ""; - var hasClose = this.type.indexOf("hasclose") >= 0; - var show_progress = this.type == "connecting"; - var me = this; - self.timer(0, msgboxTimerFunc); - msgboxTimerFunc = function() { - if (typeof content == "string") - me.$(#content).html = translate(content); - else - me.$(#content).content(content); - }; - self.timer(3ms, msgboxTimerFunc); - return (
    -
    -
    -
    - {translate(this.title)} -
    -
    -
    - {icon &&
    {icon}
    } -
    -
    -
    - - - {hasCancel || this.hasRetry ? : ""} - {this.hasSkip() ? : ""} - {hasOk || this.hasRetry ? : ""} - {hasLink ? : ""} - {hasClose ? : ""} - {this.getScreenshotButtons()} -
    -
    -
    -
    ); - } - - event click $(.custom-event) (_, me) { - if (this.callback) this.callback(me); - } - - function submit() { - var submit_btn = this.$(button#submit); - if (submit_btn) { - if (submit_btn.state.disabled) return; - submit_btn.sendEvent("click"); - } - } - - function cancel() { - if (this.$(button#cancel)) { - this.$(button#cancel).sendEvent("click"); - } - } - - event click $(button#cancel) { - this.close(); - if (this.callback) this.callback(null); - } - - event click $(button#skip) { - var values = this.getValues(); - values.skip = true; - if (this.callback) this.callback(values); - if (this.close) this.close(); - } - - event click $(button#jumplink) { - if (this.link.indexOf("http") == 0) { - Sciter.launch(this.link); - } - } - - event click $(button#submit) { - if (this.type == "error") { - if (this.hasRetry) { - retryConnect(true); - return; - } - } - if (this.type == "re-input-password") { - this.type = "input-password"; - this.update(); - return; - } - if (this.type == "session-re-login") { - this.type = "session-login"; - this.update(); - return; - } - if (this.type == "session-login-re-password") { - this.type = "session-login-password"; - this.update(); - return; - } - var values = this.getValues(); - if (this.callback) { - var self = this; - var err = this.callback(values, function(a=1, b='') { self.show_progress(a, b); }); - if (!err) { - if (this.close) this.close(); - return; - } - if (err && err.trim()) this.show_progress(false, err); - } else { - this.close(); - } - } - - event click $(button#screenshotSaveAs) { - this.close(); - - handler.leave(handler.get_keyboard_mode()); - const filter = "Png file (*.png)"; - const defaultExt = "png"; - const initialPath = System.path(#USER_DOCUMENTS, "screenshot"); - const caption = "Save as"; - var url = view.selectFile(#save, filter, defaultExt, initialPath, caption); - handler.enter(handler.get_keyboard_mode()); - if(url) { - var res = handler.handle_screenshot("0:" + URL.toPath(url)); - if (res) { - msgbox("custom-error-nocancel-nook-hasclose", "Take screenshot", res, "", function() {}); - } - } else { - handler.handle_screenshot("2"); - } - } - - event click $(button#screenshotCopyToClip) { - this.close(); - var res = handler.handle_screenshot("1"); - if (res) { - msgbox("custom-error-nocancel-nook-hasclose", "Take screenshot", res, "", function() {}); - } - } - - event click $(button#screenshotCancel) { - this.close(); - handler.handle_screenshot("2"); - } - - event keydown (evt) { - if (!evt.shortcutKey) { - if (isEnterKey(evt)) { - this.submit(); - } - if (evt.keyCode == Event.VK_ESCAPE) { - this.cancel(); - } - } - } - - event click $(button#select_directory) { - var folder = view.selectFolder(translate("Change"), $(#folderPath).text); - if (folder) { - if (folder.indexOf("file://") == 0) folder = folder.substring(7); - $(#folderPath).text = folder; - } - } - - function show_progress(show=1, err="") { - if (show == -1) { - this.close() - return; - } - this.$(#progress).style.set { - display: show ? "inline-block" : "none" - }; - this.$(#error).text = err; - } - - function getValues() { - var values = { type: this.type }; - for (var el in this.$$(.form input)) { - values[el.attributes["name"]] = el.value; - } - for (var el in this.$$(.form textarea)) { - values[el.attributes["name"]] = el.value; - } - for (var el in this.$$(.form button)) { - values[el.attributes["name"]] = el.value; - } - if (this.type == "input-password") { - values.password = (values.password || "").trim(); - if (!values.password) { - return; - } - } - if (this.type == "input-2fa") { - values.code = (values.code || "").trim(); - if (!values.code) { - return; - } - } - if (this.type == "session-login") { - values.osusername = (values.osusername || "").trim(); - values.ospassword = (values.ospassword || "").trim(); - if (!values.osusername || !values.ospassword) { - return; - } - } - if (this.type == "session-login-password") { - values.password = (values.password || "").trim(); - values.osusername = (values.osusername || "").trim(); - values.ospassword = (values.ospassword || "").trim(); - if (!values.osusername || !values.ospassword || !values.password) { - return; - } - } - if (this.type == "multiple-sessions-nocancel") { - values.sid = (this.$$(select))[0].value; - } - if (this.type == "remote-printer-selector") { - values.name = (this.$$(select))[0].value; - } - return values; - } - - function set_outline_focus() { - var me = this; - self.timer(30ms, function() { - var el = me.$(.outline-focus); - if (el) view.focus = el; - else { - el = me.$(#submit); - if (el) { - view.focus = el; - } - } - }); - } - - function close() { - closeMsgbox(); - } -} diff --git a/shelled/rustdesk-as-ref/src/ui/port_forward.tis b/shelled/rustdesk-as-ref/src/ui/port_forward.tis deleted file mode 100644 index a30f698..0000000 --- a/shelled/rustdesk-as-ref/src/ui/port_forward.tis +++ /dev/null @@ -1,77 +0,0 @@ -class PortForward: Reactor.Component { - function render() { - var args = handler.get_args(); - var is_rdp = handler.is_rdp(); - if (is_rdp) { - this.pfs = [["", "", "RDP"]]; - args = ["rdp"]; - } else if (args.length) { - this.pfs = [args]; - } else { - this.pfs = handler.get_port_forwards(); - } - var pfs = this.pfs.map(function(pf, i) { - return - {is_rdp ? : pf[0]} - {args.length ? svg_arrow : ""} - {pf[1] || "localhost"} - {pf[2]} - {args.length ? "" : {svg_cancel}} - ; - }); - return
    - {pfs.length ?
    - {translate('Listening ...')}
    - {translate('not_close_tcp_tip')} -
    : ""} - - - - - - - {args.length ? "" : } - - - - {args.length ? "" : - - - - - - - - } - {pfs} - -
    {translate('Local Port')} - {translate('Remote Host')}{translate('Remote Port')}{translate('Action')}
    {svg_arrow}
    ; - } - - event click $(#add) () { - var port = ($(#port).value || "").toInteger() || 0; - var remote_host = $(#remote-host).value || ""; - var remote_port = ($(#remote-port).value || "").toInteger() || 0; - if (port <= 0 || remote_port <= 0) return; - handler.add_port_forward(port, remote_host, remote_port); - this.update(); - } - - event click $(#new-rdp) { - handler.new_rdp(); - } - - event click $(.remove svg) (_, me) { - var pf = this.pfs[me.parent.parent.index - 1]; - handler.remove_port_forward(pf[0]); - this.update(); - } -} - -function initializePortForward() -{ - $(#file-transfer-wrapper).content(); - $(#video-wrapper).style.set { visibility: "hidden", position: "absolute" }; - $(#file-transfer-wrapper).style.set { display: "block" }; -} diff --git a/shelled/rustdesk-as-ref/src/ui/printer.tis b/shelled/rustdesk-as-ref/src/ui/printer.tis deleted file mode 100644 index c284826..0000000 --- a/shelled/rustdesk-as-ref/src/ui/printer.tis +++ /dev/null @@ -1,41 +0,0 @@ -include "sciter:reactor.tis"; - -handler.printerRequest = function(id, path) { - show_printer_selector(id, path); -}; - -function show_printer_selector(id, path) -{ - var names = handler.get_printer_names(); - msgbox("remote-printer-selector", "Incoming Print Job", , "", function(res=null) { - if (res && res.name) { - handler.on_printer_selected(id, path, res.name); - } - }, 180); -} - -class PrinterComponent extends Reactor.Component { - this var names = []; - this var jobTip = translate("print-incoming-job-confirm-tip"); - - function this(params) { - if (params && params.names) { - this.names = params.names; - } - } - - function render() { - return
    -
    {translate("print-incoming-job-confirm-tip")}
    -
    -
    - -
    -
    -
    ; - } -} diff --git a/shelled/rustdesk-as-ref/src/ui/remote.css b/shelled/rustdesk-as-ref/src/ui/remote.css deleted file mode 100644 index 71b2c16..0000000 --- a/shelled/rustdesk-as-ref/src/ui/remote.css +++ /dev/null @@ -1,46 +0,0 @@ -body { - margin: 0; - color: black; - overflow: scroll-indicator; -} - -div#video-wrapper { - size: *; - background: #212121; -} - -div#quality-monitor { - top: 20px; - right: 20px; - background: #7571719c; - padding: 5px; - min-width: 150px; - color: azure; - border: 0.5px solid azure; -} - -video#handler { - behavior: native-remote video; - size: *; - margin: *; - foreground-size: contain; -} - -img#cursor { - position: absolute; - display: none; - //opacity: 0.66, - //transform: scale(0.8); -} - -.goup { - transform: rotate(90deg); -} - -table#remote-folder-view { - context-menu: selector(menu#remote-folder-view); -} - -table#local-folder-view { - context-menu: selector(menu#local-folder-view); -} \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/src/ui/remote.html b/shelled/rustdesk-as-ref/src/ui/remote.html deleted file mode 100644 index 70e909d..0000000 --- a/shelled/rustdesk-as-ref/src/ui/remote.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - -
    - - -
    - - - -
    - - -
    -
    - - - \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/src/ui/remote.rs b/shelled/rustdesk-as-ref/src/ui/remote.rs deleted file mode 100644 index a575cf3..0000000 --- a/shelled/rustdesk-as-ref/src/ui/remote.rs +++ /dev/null @@ -1,918 +0,0 @@ -use std::{ - collections::HashMap, - ops::{Deref, DerefMut}, - sync::{atomic::AtomicUsize, Arc, Mutex, RwLock}, -}; - -use sciter::{ - dom::{ - event::{EventReason, BEHAVIOR_EVENTS, EVENT_GROUPS, PHASE_MASK}, - Element, HELEMENT, - }, - make_args, - video::{video_destination, AssetPtr, COLOR_SPACE}, - Value, -}; - -use hbb_common::{ - allow_err, fs::TransferJobMeta, log, message_proto::*, rendezvous_proto::ConnType, -}; - -use crate::{ - client::*, - ui_session_interface::{InvokeUiSession, Session}, -}; - -type Video = AssetPtr; - -lazy_static::lazy_static! { - static ref VIDEO: Arc>> = Default::default(); -} - -/// SciterHandler -/// * element -/// * close_state for file path when close -#[derive(Clone, Default)] -pub struct SciterHandler { - element: Arc>>, - close_state: HashMap, -} - -impl SciterHandler { - #[inline] - fn call(&self, func: &str, args: &[Value]) { - if let Some(ref e) = self.element.lock().unwrap().as_ref() { - allow_err!(e.call_method(func, args)); - } - } - - #[inline] - fn call2(&self, func: &str, args: &[Value]) { - if let Some(ref e) = self.element.lock().unwrap().as_ref() { - allow_err!(e.call_method(func, &super::value_crash_workaround(args)[..])); - } - } - - fn make_displays_array(displays: &Vec) -> Value { - let mut displays_value = Value::array(0); - for d in displays.iter() { - let mut display = Value::map(); - display.set_item("x", d.x); - display.set_item("y", d.y); - display.set_item("width", d.width); - display.set_item("height", d.height); - display.set_item("cursor_embedded", d.cursor_embedded); - displays_value.push(display); - } - displays_value - } - - fn make_platform_additions(data: &str) -> Option { - if let Ok(v2) = serde_json::from_str::>(data) { - let mut value = Value::map(); - for (k, v) in v2 { - match v { - serde_json::Value::String(s) => { - value.set_item(k, s); - } - serde_json::Value::Number(n) => { - if let Some(n) = n.as_i64() { - value.set_item(k, n as i32); - } else if let Some(n) = n.as_f64() { - value.set_item(k, n); - } - } - serde_json::Value::Bool(b) => { - value.set_item(k, b); - } - _ => { - // ignore for now - } - } - } - if value.len() > 0 { - return Some(value); - } else { - None - } - } else { - None - } - } -} - -impl InvokeUiSession for SciterHandler { - fn set_cursor_data(&self, cd: CursorData) { - let mut colors = hbb_common::compress::decompress(&cd.colors); - if colors.iter().filter(|x| **x != 0).next().is_none() { - log::info!("Fix transparent"); - // somehow all 0 images shows black rect, here is a workaround - colors[3] = 1; - } - let mut png = Vec::new(); - if let Ok(()) = repng::encode(&mut png, cd.width as _, cd.height as _, &colors) { - self.call( - "setCursorData", - &make_args!( - cd.id.to_string(), - cd.hotx, - cd.hoty, - cd.width, - cd.height, - &png[..] - ), - ); - } - } - - fn set_display(&self, x: i32, y: i32, w: i32, h: i32, cursor_embedded: bool, scale: f64) { - let scale = if scale <= 0.0 { 1.0 } else { scale }; - self.call("setDisplay", &make_args!(x, y, w, h, cursor_embedded, scale)); - // https://sciter.com/forums/topic/color_spaceiyuv-crash - // Nothing spectacular in decoder – done on CPU side. - // So if you can do BGRA translation on your side – the better. - // BGRA is used as internal image format so it will not require additional transformations. - VIDEO.lock().unwrap().as_mut().map(|v| { - v.stop_streaming().ok(); - let ok = v.start_streaming((w, h), COLOR_SPACE::Rgb32, None); - log::info!("[video] reinitialized: {:?}", ok); - }); - } - - fn update_privacy_mode(&self) { - self.call("updatePrivacyMode", &[]); - } - - fn set_permission(&self, name: &str, value: bool) { - self.call2("setPermission", &make_args!(name, value)); - } - - fn close_success(&self) { - self.call2("closeSuccess", &make_args!()); - } - - fn update_quality_status(&self, status: QualityStatus) { - self.call2( - "updateQualityStatus", - &make_args!( - status.speed.map_or(Value::null(), |it| it.into()), - status - .fps - .iter() - .next() - .map_or(Value::null(), |(_, v)| (*v).into()), - status.delay.map_or(Value::null(), |it| it.into()), - status.target_bitrate.map_or(Value::null(), |it| it.into()), - status - .codec_format - .map_or(Value::null(), |it| it.to_string().into()), - status.chroma.map_or(Value::null(), |it| it.into()) - ), - ); - } - - fn set_cursor_id(&self, id: String) { - self.call("setCursorId", &make_args!(id)); - } - - fn set_cursor_position(&self, cp: CursorPosition) { - self.call("setCursorPosition", &make_args!(cp.x, cp.y)); - } - - fn set_connection_type(&self, is_secured: bool, direct: bool, stream_type: &str) { - self.call( - "setConnectionType", - &make_args!(is_secured, direct, stream_type.to_string()), - ); - } - - fn set_fingerprint(&self, _fingerprint: String) {} - - fn job_error(&self, id: i32, err: String, file_num: i32) { - self.call("jobError", &make_args!(id, err, file_num)); - } - - fn job_done(&self, id: i32, file_num: i32) { - self.call("jobDone", &make_args!(id, file_num)); - } - - fn clear_all_jobs(&self) { - self.call("clearAllJobs", &make_args!()); - } - - fn load_last_job(&self, cnt: i32, job_json: &str, auto_start: bool) { - let job: Result = serde_json::from_str(job_json); - if let Ok(job) = job { - let path; - let to; - if job.is_remote { - path = job.remote.clone(); - to = job.to.clone(); - } else { - path = job.to.clone(); - to = job.remote.clone(); - } - self.call( - "addJob", - &make_args!( - cnt, - path, - to, - job.file_num, - job.show_hidden, - job.is_remote, - auto_start - ), - ); - } - } - - fn update_folder_files( - &self, - id: i32, - entries: &Vec, - path: String, - _is_local: bool, - only_count: bool, - ) { - let mut m = make_fd(id, entries, only_count); - m.set_item("path", path); - self.call("updateFolderFiles", &make_args!(m)); - } - - fn update_transfer_list(&self) { - self.call("updateTransferList", &make_args!()); - } - - fn confirm_delete_files(&self, id: i32, i: i32, name: String) { - self.call("confirmDeleteFiles", &make_args!(id, i, name)); - } - - fn override_file_confirm( - &self, - id: i32, - file_num: i32, - to: String, - is_upload: bool, - is_identical: bool, - ) { - self.call( - "overrideFileConfirm", - &make_args!(id, file_num, to, is_upload, is_identical), - ); - } - - fn job_progress(&self, id: i32, file_num: i32, speed: f64, finished_size: f64) { - self.call( - "jobProgress", - &make_args!(id, file_num, speed, finished_size), - ); - } - - fn adapt_size(&self) { - self.call("adaptSize", &make_args!()); - } - - fn on_rgba(&self, _display: usize, rgba: &mut scrap::ImageRgb) { - VIDEO - .lock() - .unwrap() - .as_mut() - .map(|v| v.render_frame(&rgba.raw).ok()); - } - - fn set_peer_info(&self, pi: &PeerInfo) { - let mut pi_sciter = Value::map(); - pi_sciter.set_item("username", pi.username.clone()); - pi_sciter.set_item("hostname", pi.hostname.clone()); - pi_sciter.set_item("platform", pi.platform.clone()); - pi_sciter.set_item("sas_enabled", pi.sas_enabled); - pi_sciter.set_item("displays", Self::make_displays_array(&pi.displays)); - pi_sciter.set_item("current_display", pi.current_display); - pi_sciter.set_item("version", pi.version.clone()); - if let Some(v) = Self::make_platform_additions(&pi.platform_additions) { - pi_sciter.set_item("platform_additions", v); - } - self.call("updatePi", &make_args!(pi_sciter)); - } - - fn set_displays(&self, displays: &Vec) { - self.call( - "updateDisplays", - &make_args!(Self::make_displays_array(displays)), - ); - } - - fn set_platform_additions(&self, _data: &str) { - // Ignore for sciter version. - } - - fn set_current_display(&self, _disp_idx: i32) { - self.call("setCurrentDisplay", &make_args!(_disp_idx)); - } - - fn set_multiple_windows_session(&self, sessions: Vec) { - let mut v = Value::array(0); - let mut sessions = sessions; - for s in sessions.drain(..) { - let mut obj = Value::map(); - obj.set_item("sid", s.sid.to_string()); - obj.set_item("name", s.name); - v.push(obj); - } - self.call("setMultipleWindowsSession", &make_args!(v)); - } - - fn on_connected(&self, conn_type: ConnType) { - match conn_type { - ConnType::DEFAULT_CONN => { - crate::keyboard::client::start_grab_loop(); - } - _ => {} - } - } - - fn msgbox(&self, msgtype: &str, title: &str, text: &str, link: &str, retry: bool) { - self.call2( - "msgbox_retry", - &make_args!(msgtype, title, text, link, retry), - ); - } - - fn cancel_msgbox(&self, tag: &str) { - self.call("cancel_msgbox", &make_args!(tag)); - } - - fn new_message(&self, msg: String) { - self.call("newMessage", &make_args!(msg)); - } - - fn switch_display(&self, display: &SwitchDisplay) { - self.call("switchDisplay", &make_args!(display.display)); - } - - fn update_block_input_state(&self, on: bool) { - self.call("updateBlockInputState", &make_args!(on)); - } - - fn switch_back(&self, _id: &str) {} - - fn portable_service_running(&self, _running: bool) {} - - fn on_voice_call_started(&self) { - self.call("onVoiceCallStart", &make_args!()); - } - - fn on_voice_call_closed(&self, reason: &str) { - self.call("onVoiceCallClosed", &make_args!(reason)); - } - - fn on_voice_call_waiting(&self) { - self.call("onVoiceCallWaiting", &make_args!()); - } - - fn on_voice_call_incoming(&self) { - self.call("onVoiceCallIncoming", &make_args!()); - } - - /// RGBA is directly rendered by [on_rgba]. No need to store the rgba for the sciter ui. - fn get_rgba(&self, _display: usize) -> *const u8 { - std::ptr::null() - } - - fn next_rgba(&self, _display: usize) {} - - fn update_record_status(&self, start: bool) { - self.call("updateRecordStatus", &make_args!(start)); - } - - fn printer_request(&self, id: i32, path: String) { - self.call("printerRequest", &make_args!(id, path)); - } - - fn handle_screenshot_resp(&self, _sid: String, msg: String) { - self.call("screenshot", &make_args!(msg)); - } - - fn handle_terminal_response(&self, _response: TerminalResponse) { - // Terminal support is not implemented for Sciter UI - // This is a stub implementation to satisfy the trait requirements - } -} - -pub struct SciterSession(Session); - -impl Deref for SciterSession { - type Target = Session; - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl DerefMut for SciterSession { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } -} - -impl sciter::EventHandler for SciterSession { - fn get_subscription(&mut self) -> Option { - Some(EVENT_GROUPS::HANDLE_BEHAVIOR_EVENT) - } - - fn attached(&mut self, root: HELEMENT) { - *self.element.lock().unwrap() = Some(Element::from(root)); - } - - fn detached(&mut self, _root: HELEMENT) { - *self.element.lock().unwrap() = None; - self.sender.write().unwrap().take().map(|sender| { - sender.send(Data::Close).ok(); - }); - } - - // https://github.com/sciter-sdk/rust-sciter/blob/master/examples/video.rs - fn on_event( - &mut self, - _root: HELEMENT, - source: HELEMENT, - _target: HELEMENT, - code: BEHAVIOR_EVENTS, - phase: PHASE_MASK, - reason: EventReason, - ) -> bool { - if phase != PHASE_MASK::BUBBLING { - return false; - } - match code { - BEHAVIOR_EVENTS::VIDEO_BIND_RQ => { - let source = Element::from(source); - log::debug!("[video] {:?} {} ({:?})", code, source, reason); - if let EventReason::VideoBind(ptr) = reason { - if ptr.is_null() { - return true; - } - let site = AssetPtr::adopt(ptr as *mut video_destination); - log::debug!("[video] start video"); - *VIDEO.lock().unwrap() = Some(site); - self.reconnect(false); - } - } - BEHAVIOR_EVENTS::VIDEO_INITIALIZED => { - log::debug!("[video] {:?}", code); - } - BEHAVIOR_EVENTS::VIDEO_STARTED => { - log::debug!("[video] {:?}", code); - let source = Element::from(source); - use sciter::dom::ELEMENT_AREAS; - let flags = ELEMENT_AREAS::CONTENT_BOX as u32 | ELEMENT_AREAS::SELF_RELATIVE as u32; - let rc = source.get_location(flags).unwrap_or_default(); - log::debug!( - "[video] start video thread on <{}> which is about {:?} pixels", - source, - rc.size() - ); - } - BEHAVIOR_EVENTS::VIDEO_STOPPED => { - log::debug!("[video] {:?}", code); - } - _ => return false, - }; - return true; - } - - sciter::dispatch_script_call! { - fn get_audit_server(String); - fn send_note(String); - fn is_xfce(); - fn get_id(); - fn get_default_pi(); - fn get_option(String); - fn t(String); - fn set_option(String, String); - fn input_os_password(String, bool); - fn save_close_state(String, String); - fn is_file_transfer(); - fn is_port_forward(); - fn is_rdp(); - fn login(String, String, String, bool); - fn send2fa(String, bool); - fn get_enable_trusted_devices(); - fn new_rdp(); - fn send_mouse(i32, i32, i32, bool, bool, bool, bool); - fn enter(String); - fn leave(String); - fn ctrl_alt_del(); - fn transfer_file(); - fn tunnel(); - fn lock_screen(); - fn reconnect(bool); - fn get_chatbox(); - fn get_icon(); - fn get_home_dir(); - fn get_next_job_id(); - fn update_next_job_id(i32); - fn read_dir(String, bool); - fn remove_dir(i32, String, bool); - fn create_dir(i32, String, bool); - fn remove_file(i32, String, i32, bool); - fn read_remote_dir(String, bool); - fn send_chat(String); - fn switch_display(i32); - fn remove_dir_all(i32, String, bool, bool); - fn confirm_delete_files(i32, i32); - fn set_no_confirm(i32); - fn cancel_job(i32); - fn send_files(i32, i32, String, String, i32, bool, bool); - fn add_job(i32, i32, String, String, i32, bool, bool); - fn resume_job(i32, bool); - fn get_platform(bool); - fn get_path_sep(bool); - fn get_icon_path(i32, String); - fn get_char(String, i32); - fn get_size(); - fn get_port_forwards(); - fn remove_port_forward(i32); - fn get_args(); - fn add_port_forward(i32, String, i32); - fn save_size(i32, i32, i32, i32); - fn get_view_style(); - fn get_image_quality(); - fn get_custom_image_quality(); - fn save_view_style(String); - fn save_image_quality(String); - fn save_custom_image_quality(i32); - fn refresh_video(i32); - fn record_screen(bool); - fn is_screenshot_supported(); - fn take_screenshot(i32, String); - fn handle_screenshot(String); - fn get_toggle_option(String); - fn is_privacy_mode_supported(); - fn toggle_option(String); - fn get_remember(); - fn peer_platform(); - fn set_write_override(i32, i32, bool, bool, bool); - fn get_keyboard_mode(); - fn is_keyboard_mode_supported(String); - fn save_keyboard_mode(String); - fn alternative_codecs(); - fn update_supported_decodings(); - fn restart_remote_device(); - fn request_voice_call(); - fn close_voice_call(); - fn version_cmp(String, String); - fn set_selected_windows_session_id(String); - fn is_recording(); - fn has_file_clipboard(); - fn get_printer_names(); - fn on_printer_selected(i32, String, String); - } -} - -impl SciterSession { - pub fn new(cmd: String, id: String, password: String, args: Vec) -> Self { - let force_relay = args.contains(&"--relay".to_string()); - let session: Session = Session { - password: password.clone(), - args, - server_keyboard_enabled: Arc::new(RwLock::new(true)), - server_file_transfer_enabled: Arc::new(RwLock::new(true)), - server_clipboard_enabled: Arc::new(RwLock::new(true)), - reconnect_count: Arc::new(AtomicUsize::new(0)), - ..Default::default() - }; - - let conn_type = if cmd.eq("--file-transfer") { - ConnType::FILE_TRANSFER - } else if cmd.eq("--view-camera") { - ConnType::VIEW_CAMERA - } else if cmd.eq("--port-forward") { - ConnType::PORT_FORWARD - } else if cmd.eq("--rdp") { - ConnType::RDP - } else { - ConnType::DEFAULT_CONN - }; - - session - .lc - .write() - .unwrap() - .initialize(id, conn_type, None, force_relay, None, None, None); - - Self(session) - } - - pub fn inner(&self) -> Session { - self.0.clone() - } - - fn get_custom_image_quality(&mut self) -> Value { - let mut v = Value::array(0); - for x in self.lc.read().unwrap().custom_image_quality.iter() { - v.push(x); - } - v - } - - pub fn t(&self, name: String) -> String { - crate::client::translate(name) - } - - pub fn get_icon(&self) -> String { - super::get_icon() - } - - fn alternative_codecs(&self) -> Value { - let (vp8, av1, h264, h265) = self.0.alternative_codecs(); - let mut v = Value::array(0); - v.push(vp8); - v.push(av1); - v.push(h264); - v.push(h265); - v - } - - fn save_size(&mut self, x: i32, y: i32, w: i32, h: i32) { - let size = (x, y, w, h); - let mut config = self.load_config(); - if self.is_file_transfer() { - let close_state = self.close_state.clone(); - let mut has_change = false; - for (k, mut v) in close_state { - if k == "remote_dir" { - v = self.lc.read().unwrap().get_all_remote_dir(v); - } - let v2 = if v.is_empty() { None } else { Some(&v) }; - if v2 != config.options.get(&k) { - has_change = true; - if v2.is_none() { - config.options.remove(&k); - } else { - config.options.insert(k, v); - } - } - } - if size == config.size_ft && !has_change { - return; - } - config.size_ft = size; - } else if self.is_port_forward() { - if size == config.size_pf { - return; - } - config.size_pf = size; - } else { - if size == config.size { - return; - } - config.size = size; - } - self.save_config(config); - log::info!("size saved"); - } - - fn set_selected_windows_session_id(&mut self, u_sid: String) { - self.send_selected_session_id(u_sid); - } - - fn has_file_clipboard(&self) -> bool { - cfg!(any(target_os = "windows", feature = "unix-file-copy-paste")) - } - - fn get_port_forwards(&mut self) -> Value { - let port_forwards = self.lc.read().unwrap().port_forwards.clone(); - let mut v = Value::array(0); - for (port, remote_host, remote_port) in port_forwards { - let mut v2 = Value::array(0); - v2.push(port); - v2.push(remote_host); - v2.push(remote_port); - v.push(v2); - } - v - } - - fn get_args(&mut self) -> Value { - let mut v = Value::array(0); - for x in self.args.iter() { - v.push(x); - } - v - } - - fn get_size(&mut self) -> Value { - let s = if self.is_file_transfer() { - self.lc.read().unwrap().size_ft - } else if self.is_port_forward() { - self.lc.read().unwrap().size_pf - } else { - self.lc.read().unwrap().size - }; - let mut v = Value::array(0); - v.push(s.0); - v.push(s.1); - v.push(s.2); - v.push(s.3); - v - } - - fn get_default_pi(&mut self) -> Value { - let mut pi = Value::map(); - let info = self.lc.read().unwrap().info.clone(); - pi.set_item("username", info.username.clone()); - pi.set_item("hostname", info.hostname.clone()); - pi.set_item("platform", info.platform.clone()); - pi - } - - fn save_close_state(&mut self, k: String, v: String) { - self.close_state.insert(k, v); - } - - fn get_key_event(&self, down_or_up: i32, name: &str, code: i32) -> Option { - let mut key_event = KeyEvent::new(); - if down_or_up == 2 { - /* windows send both keyup/keydown and keychar, so here we avoid keychar - for <= 0xFF, best practice should only avoid those not on keyboard, but - for now, we have no way to test, so avoid <= 0xFF totally - */ - if code <= 0xFF { - return None; - } - key_event.set_unicode(code.clone() as _); - } else if let Some(key) = KEY_MAP.get(name) { - match key { - Key::Chr(chr) => { - key_event.set_chr(chr.clone()); - } - Key::ControlKey(key) => { - key_event.set_control_key(key.clone()); - } - _ => {} - } - } else { - if cfg!(target_os = "macos") { - match code { - 0x4C => key_event.set_control_key(ControlKey::NumpadEnter), // numpad enter - 0x69 => key_event.set_control_key(ControlKey::Snapshot), - 0x72 => key_event.set_control_key(ControlKey::Help), - 0x6E => key_event.set_control_key(ControlKey::Apps), - 0x47 => { - key_event.set_control_key(if self.peer_platform() == "Mac OS" { - ControlKey::Clear - } else { - ControlKey::NumLock - }); - } - 0x51 => key_event.set_control_key(ControlKey::Equals), - 0x2F => key_event.set_chr('.' as _), - 0x32 => key_event.set_chr('`' as _), - _ => { - log::error!("Unknown key code {}", code); - return None; - } - } - } else if cfg!(windows) { - match code { - 0x2C => key_event.set_control_key(ControlKey::Snapshot), - 0x91 => key_event.set_control_key(ControlKey::Scroll), - 0x90 => key_event.set_control_key(ControlKey::NumLock), - 0x5C => key_event.set_control_key(ControlKey::RWin), - 0x5B => key_event.set_control_key(ControlKey::Meta), - 0x5D => key_event.set_control_key(ControlKey::Apps), - 0xBE => key_event.set_chr('.' as _), - 0xC0 => key_event.set_chr('`' as _), - _ => { - log::error!("Unknown key code {}", code); - return None; - } - } - } else if cfg!(target_os = "linux") { - match code { - 65300 => key_event.set_control_key(ControlKey::Scroll), - 65421 => key_event.set_control_key(ControlKey::NumpadEnter), // numpad enter - 65407 => key_event.set_control_key(ControlKey::NumLock), - 65515 => key_event.set_control_key(ControlKey::Meta), - 65516 => key_event.set_control_key(ControlKey::RWin), - 65513 => key_event.set_control_key(ControlKey::Alt), - 65514 => key_event.set_control_key(ControlKey::RAlt), - 65508 => key_event.set_control_key(ControlKey::RControl), - 65506 => key_event.set_control_key(ControlKey::RShift), - 96 => key_event.set_chr('`' as _), - 46 => key_event.set_chr('.' as _), - 126 => key_event.set_chr('`' as _), - 33 => key_event.set_chr('1' as _), - 64 => key_event.set_chr('2' as _), - 35 => key_event.set_chr('3' as _), - 36 => key_event.set_chr('4' as _), - 37 => key_event.set_chr('5' as _), - 94 => key_event.set_chr('6' as _), - 38 => key_event.set_chr('7' as _), - 42 => key_event.set_chr('8' as _), - 40 => key_event.set_chr('9' as _), - 41 => key_event.set_chr('0' as _), - 95 => key_event.set_chr('-' as _), - 43 => key_event.set_chr('=' as _), - 123 => key_event.set_chr('[' as _), - 125 => key_event.set_chr(']' as _), - 124 => key_event.set_chr('\\' as _), - 58 => key_event.set_chr(';' as _), - 34 => key_event.set_chr('\'' as _), - 60 => key_event.set_chr(',' as _), - 62 => key_event.set_chr('.' as _), - 63 => key_event.set_chr('/' as _), - _ => { - log::error!("Unknown key code {}", code); - return None; - } - } - } else { - log::error!("Unknown key code {}", code); - return None; - } - } - Some(key_event) - } - - fn get_char(&mut self, name: String, code: i32) -> String { - if let Some(key_event) = self.get_key_event(1, &name, code) { - match key_event.union { - Some(key_event::Union::Chr(chr)) => { - if let Some(chr) = std::char::from_u32(chr as _) { - return chr.to_string(); - } - } - _ => {} - } - } - "".to_owned() - } - - fn transfer_file(&mut self) { - let id = self.get_id(); - let args = vec!["--file-transfer", &id, &self.password]; - if let Err(err) = crate::run_me(args) { - log::error!("Failed to spawn file transfer: {}", err); - } - } - - fn tunnel(&mut self) { - let id = self.get_id(); - let args = vec!["--port-forward", &id, &self.password]; - if let Err(err) = crate::run_me(args) { - log::error!("Failed to spawn IP tunneling: {}", err); - } - } - - fn version_cmp(&self, v1: String, v2: String) -> i32 { - (hbb_common::get_version_number(&v1) - hbb_common::get_version_number(&v2)) as i32 - } - - fn get_printer_names(&self) -> Value { - #[cfg(target_os = "windows")] - let printer_names = crate::platform::windows::get_printer_names().unwrap_or_default(); - #[cfg(not(target_os = "windows"))] - let printer_names: Vec = vec![]; - let mut v = Value::array(0); - for name in printer_names { - v.push(name); - } - v - } - - fn on_printer_selected(&self, id: i32, path: String, printer_name: String) { - self.printer_response(id, path, printer_name); - } - - fn handle_screenshot(&self, action: String) -> String { - crate::client::screenshot::handle_screenshot(action) - } -} - -pub fn make_fd(id: i32, entries: &Vec, only_count: bool) -> Value { - let mut m = Value::map(); - m.set_item("id", id); - let mut a = Value::array(0); - let mut n: u64 = 0; - for entry in entries { - n += entry.size; - if only_count { - continue; - } - let mut e = Value::map(); - e.set_item("name", entry.name.to_owned()); - let tmp = entry.entry_type.value(); - e.set_item("type", if tmp == 0 { 1 } else { tmp }); - e.set_item("time", entry.modified_time as f64); - e.set_item("size", entry.size as f64); - a.push(e); - } - if !only_count { - m.set_item("entries", a); - } - m.set_item("num_entries", entries.len() as i32); - m.set_item("total_size", n as f64); - m -} diff --git a/shelled/rustdesk-as-ref/src/ui/remote.tis b/shelled/rustdesk-as-ref/src/ui/remote.tis deleted file mode 100644 index 7602432..0000000 --- a/shelled/rustdesk-as-ref/src/ui/remote.tis +++ /dev/null @@ -1,599 +0,0 @@ -var cursor_img = $(img#cursor); -is_file_transfer = handler.is_file_transfer(); -var is_port_forward = handler.is_port_forward(); -var input_blocked = false; -var display_width = 0; -var display_height = 0; -var display_remote_scale = 1; -var display_origin_x = 0; -var display_origin_y = 0; -var display_cursor_embedded = false; -var display_scale = 1; -// the scale factor is different from `display_scale` if peer platform is Linux (Wayland). -var cursor_scale = 1; -var keyboard_enabled = true; // server side -var clipboard_enabled = true; // server side -var audio_enabled = true; // server side -var file_enabled = true; // server side -var restart_enabled = true; // server side -var recording_enabled = true; // server side -var scroll_body = $(body); -var peer_platform = ""; - -handler.setDisplay = function(x, y, w, h, cursor_embedded, scale) { - display_width = w; - display_height = h; - display_origin_x = x; - display_origin_y = y; - display_cursor_embedded = cursor_embedded; - display_remote_scale = scale; - adaptDisplay(); - if (recording) handler.record_screen(true, 0, w, h); -} - -// in case toolbar not shown correctly -view.windowMinSize = (scaleIt(500), scaleIt(300)); - -function get_peer_platform() { - if (peer_platform == "") { - peer_platform = handler.peer_platform(); - } - return peer_platform; -} - -function isRemoteLinux() { - return get_peer_platform() == "Linux"; -} - -function adaptDisplay() { - var w = display_width; - var h = display_height; - if (!w || !h) return; - var style = handler.get_view_style(); - display_scale = 1.; - cursor_scale = 1.; - var (sx, sy, sw, sh) = view.screenBox(view.windowState == View.WINDOW_FULL_SCREEN ? #frame : #workarea, #rectw); - if (sw >= w && sh > h) { - var hh = $(header).box(#height, #border); - var el = $(div#adjust-window); - if (sh > h + hh && el) { - el.style.set{ display: "block" }; - el = $(li#adjust-window); - el.style.set{ display: "block" }; - el.onClick = function() { - view.windowState == View.WINDOW_SHOWN; - var (x, y) = view.box(#position, #border, #screen); - // extra for border - var extra = is_win ? 4 : 2; - view.move(x, y, (w + extra).toInteger(), (h + hh + extra).toInteger()); - } - } - } - if (style != "original") { - var bw = $(body).box(#width, #border); - var bh = $(body).box(#height, #border); - if (view.windowState == View.WINDOW_FULL_SCREEN) { - bw = sw; - bh = sh; - } - if (bw > 0 && bh > 0) { - var scale_x = bw.toFloat() / w; - var scale_y = bh.toFloat() / h; - var scale = scale_x < scale_y ? scale_x : scale_y; - if ((scale > 1 && style == "stretch") || - (scale < 1 && style == "shrink")) { - display_scale = scale; - w = w * scale; - h = h * scale; - } - } - } - if (isRemoteLinux()) { - cursor_scale = display_scale * display_remote_scale; - } else { - cursor_scale = display_scale; - } - if (cursor_scale <= 0.0001) cursor_scale = 1.; - refreshCursor(); - handler.style.set { - width: w / scaleFactor + "px", - height: h / scaleFactor + "px", - }; -} - -// https://sciter.com/event-handling/ -// https://sciter.com/docs/content/sciter/Event.htm - -var entered = false; -if (!is_file_transfer && !is_port_forward) { - self.onKey = function(evt) { - if (!entered) return false; - // so that arrow key not move scrollbar - return true; - } -} - -var wait_window_toolbar = false; -var last_mouse_mask; -var is_left_down = false; -var acc_wheel_delta_x = 0; -var acc_wheel_delta_y = 0; -var last_wheel_time = 0; -var inertia_velocity_x = 0; -var inertia_velocity_y = 0; -var acc_wheel_delta_x0 = 0; -var acc_wheel_delta_y0 = 0; -var total_wheel_time = 0; -var wheeling = false; -var dragging = false; -var is_mouse_event_triggered = false; - -// https://stackoverflow.com/questions/5833399/calculating-scroll-inertia-momentum -function resetWheel() { - acc_wheel_delta_x = 0; - acc_wheel_delta_y = 0; - last_wheel_time = 0; - inertia_velocity_x = 0; - inertia_velocity_y = 0; - acc_wheel_delta_x0 = 0; - acc_wheel_delta_y0 = 0; - total_wheel_time = 0; - wheeling = false; -} - -var INERTIA_ACCELERATION = 30; -var WHEEL_ACCEL_VELOCITY_THRESHOLD = 5000; -var WHEEL_ACCEL_DT_FAST = 0.04; -var WHEEL_ACCEL_DT_MEDIUM = 0.08; -var WHEEL_ACCEL_VALUE_FAST = 3; -var WHEEL_ACCEL_VALUE_MEDIUM = 2; -// Wheel burst acceleration (empirical tuning). -// Applies only on fast, non-smooth wheel bursts to keep single-step scroll unchanged. -// Sciter uses seconds for dt, so velocity is in delta/sec. - -// not good, precision not enough to simulate acceleration effect, -// seems have to use pixel based rather line based delta -function accWheel(v, is_x) { - if (wheeling) return; - var abs_v = Math.abs(v); - var max_t = abs_v / INERTIA_ACCELERATION; - for (var t = 0.1; t < max_t; t += 0.1) { - var d = Math.round((abs_v - t * INERTIA_ACCELERATION / 2) * t).toInteger(); - if (d >= 1) { - abs_v -= t * INERTIA_ACCELERATION; - if (v < 0) { - d = -d; - v = -abs_v; - } else { - v = abs_v; - } - handler.send_mouse(3, is_x ? d : 0, !is_x ? d : 0, false, false, false, false); - accWheel(v, is_x); - break; - } - } -} - -function handler.onMouse(evt) -{ - is_mouse_event_triggered = true; - if (is_file_transfer || is_port_forward) return false; - if (view.windowState == View.WINDOW_FULL_SCREEN && !dragging) { - var dy = evt.y - scroll_body.scroll(#top); - if (dy <= 1) { - if (!wait_window_toolbar) { - wait_window_toolbar = true; - self.timer(300ms, function() { - if (!wait_window_toolbar) return; - var extra = 0; - // workaround for stupid Sciter, without this, click - // event not triggered on top part of buttons on toolbar - if (is_osx) extra = 10; - if (view.windowState == View.WINDOW_FULL_SCREEN) { - $(header).style.set { - display: "block", - padding: (2 * workarea_offset + extra) + "px 0 0 0", - }; - } - wait_window_toolbar = false; - }); - } - } else { - wait_window_toolbar = false; - var h = $(header).style; - if (dy > 20 && h#display != "none") { - h.set { - display: "none", - }; - } - } - } - if (!got_mouse_control) { - if (Math.abs(evt.x - cur_local_x) > 12 || Math.abs(evt.y - cur_local_y) > 12) { - got_mouse_control = true; - } else { - return; - } - } - var mask = 0; - var wheel_delta_x; - var wheel_delta_y; - switch(evt.type) { - case Event.MOUSE_DOWN: - mask = 1; - dragging = true; - break; - case Event.MOUSE_UP: - mask = 2; - dragging = false; - break; - case Event.MOUSE_MOVE: - if (display_cursor_embedded) { - break; - } - if (cursor_img.style#display != "none" && keyboard_enabled) { - cursor_img.style#display = "none"; - } - if (!keyboard_enabled && !useSystemCursor) { - updateCursor(true); - } - if (keyboard_enabled && useSystemCursor) { - updateCursor(); - } - break; - case Event.MOUSE_WHEEL: - // mouseWheelDistance = 8 * [currentUserDefs floatForKey:@"com.apple.scrollwheel.scaling"]; - mask = 3; - { - var now = getTime(); - var dt = last_wheel_time > 0 ? (now - last_wheel_time) / 1000 : 0; - var (raw_dx, raw_dy) = evt.wheelDeltas; - var dx = 0; - var dy = 0; - var abs_dx = Math.abs(raw_dx); - var abs_dy = Math.abs(raw_dy); - var dominant = abs_dx > abs_dy ? abs_dx : abs_dy; - var is_smooth = dominant < 1; - var accel = 1; - if (!is_smooth && dt > 0 && (is_win || is_linux) && get_peer_platform() == "Mac OS") { - var velocity = dominant / dt; - if (velocity >= WHEEL_ACCEL_VELOCITY_THRESHOLD) { - if (dt < WHEEL_ACCEL_DT_FAST) accel = WHEEL_ACCEL_VALUE_FAST; - else if (dt < WHEEL_ACCEL_DT_MEDIUM) accel = WHEEL_ACCEL_VALUE_MEDIUM; - } - } - if (raw_dx > 0) dx = accel; - else if (raw_dx < 0) dx = -accel; - if (raw_dy > 0) dy = accel; - else if (raw_dy < 0) dy = -accel; - if (abs_dx > abs_dy) { - dy = 0; - } else { - dx = 0; - } - acc_wheel_delta_x += dx; - acc_wheel_delta_y += dy; - wheel_delta_x = acc_wheel_delta_x.toInteger(); - wheel_delta_y = acc_wheel_delta_y.toInteger(); - acc_wheel_delta_x -= wheel_delta_x; - acc_wheel_delta_y -= wheel_delta_y; - if (dt > 0) { - var vx = dx / dt; - var vy = dy / dt; - if (vx != 0 || vy != 0) { - inertia_velocity_x = vx; - inertia_velocity_y = vy; - } - } - acc_wheel_delta_x0 += dx; - acc_wheel_delta_y0 += dy; - total_wheel_time += dt; - if (dx == 0 && dy == 0) { - wheeling = false; - if (dt < 0.1 && total_wheel_time > 0) { - var v2 = (acc_wheel_delta_y0 / total_wheel_time) * inertia_velocity_y; - if (v2 > 0) { - v2 = Math.sqrt(v2); - inertia_velocity_y = inertia_velocity_y < 0 ? -v2 : v2; - accWheel(inertia_velocity_y, false); - } - v2 = (acc_wheel_delta_x0 / total_wheel_time) * inertia_velocity_x; - if (v2 > 0) { - v2 = Math.sqrt(v2); - inertia_velocity_x = inertia_velocity_x < 0 ? -v2 : v2; - accWheel(inertia_velocity_x, true); - } - } - resetWheel(); - } else { - wheeling = true; - } - last_wheel_time = now; - if (wheel_delta_x == 0 && wheel_delta_y == 0) return keyboard_enabled; - } - break; - case Event.MOUSE_DCLICK: // seq: down, up, dclick, up - mask = 1; - break; - case Event.MOUSE_ENTER: - entered = true; - stdout.println("enter"); - handler.enter(handler.get_keyboard_mode()); - last_wheel_time = 0; - return keyboard_enabled; - case Event.MOUSE_LEAVE: - entered = false; - stdout.println("leave"); - handler.leave(handler.get_keyboard_mode()); - last_wheel_time = 0; - if (is_left_down && get_peer_platform() == "Android") { - is_left_down = false; - handler.send_mouse((1 << 3) | 2, 0, 0, evt.altKey, - evt.ctrlKey, evt.shiftKey, evt.commandKey); - } - return keyboard_enabled; - default: - return false; - } - var x = evt.x; - var y = evt.y; - if (mask != 0) { - // to gain control of the mouse, user must move mouse - if (cur_x != x || cur_y != y) { - return keyboard_enabled; - } - } else { - cur_local_x = cur_x = x; - cur_local_y = cur_y = y; - } - if (mask != 3) { - resetWheel(); - } - if (!keyboard_enabled) return false; - x = (x / cursor_scale).toInteger(); - y = (y / cursor_scale).toInteger(); - // insert down between two up, osx has this behavior for triple click - if (last_mouse_mask == 2 && mask == 2) { - handler.send_mouse((evt.buttons << 3) | 1, 0, 0, evt.altKey, - evt.ctrlKey, evt.shiftKey, evt.commandKey); - } - last_mouse_mask = mask; - if (evt.buttons == 1) { - if (mask == 1) { - is_left_down = true; - } else if (mask == 2) { - is_left_down = false; - } - } - // to-do: altKey, ctrlKey etc - handler.send_mouse((evt.buttons << 3) | mask, - mask == 3 ? wheel_delta_x : (mask == 0 ? x + display_origin_x : 0), - mask == 3 ? wheel_delta_y : (mask == 0 ? y + display_origin_y : 0), - evt.altKey, - evt.ctrlKey, evt.shiftKey, evt.commandKey); - return true; -}; - -var cur_id = -1; -var cur_hotx = 0; -var cur_hoty = 0; -var cur_img = null; -var cur_x = 0; -var cur_y = 0; -var cur_local_x = 0; -var cur_local_y = 0; -var cursors = {}; -var image_binded; - -function scaleCursorImage(img) { - var factor = cursor_scale; - if (cursor_img.style#display != 'none') { - factor /= scaleFactor; - } - var w = (img.width * factor).toInteger(); - var h = (img.height * factor).toInteger(); - cursor_img.style.set { - width: w + "px", - height: h + "px", - }; - self.bindImage("in-memory:cursor", img); - if (factor == 1) return img; - function paint(gfx) { - gfx.drawImage(img, 0, 0, w, h); - } - return new Image(w, h, paint); -} - -var useSystemCursor = true; -function updateCursor(system=false) { - stdout.println("Update cursor, system: " + system); - useSystemCursor = system; - if (system) { - handler.style#cursor = undefined; - } else if (cur_img) { - handler.style.cursor(cur_img, (cur_hotx * cursor_scale).toInteger(), (cur_hoty * cursor_scale).toInteger()); - } -} - -function refreshCursor() { - if (display_cursor_embedded) { - cursor_img.style#display = "none"; - return; - } - if (cur_id != -1) { - handler.setCursorId(cur_id); - } -} - -handler.setCursorData = function(id, hotx, hoty, width, height, colors) { - cur_hotx = hotx; - cur_hoty = hoty; - var img = Image.fromBytes(colors); - if (img) { - image_binded = true; - cursors[id] = [img, hotx, hoty, width, height]; - cur_id = id; - img = scaleCursorImage(img); - if (!first_mouse_event_triggered || cursor_img.style#display == 'none') { - self.timer(1ms, updateCursor); - } - cur_img = img; - } -} - -handler.setCursorId = function(id) { - var img = cursors[id]; - if (img) { - cur_id = id; - image_binded = true; - cur_hotx = img[1]; - cur_hoty = img[2]; - img = scaleCursorImage(img[0]); - if (!first_mouse_event_triggered || cursor_img.style#display == 'none') { - self.timer(1ms, updateCursor); - } - cur_img = img; - } -} - -var got_mouse_control = true; -handler.setCursorPosition = function(x, y) { - if (!image_binded) return; - got_mouse_control = false; - cur_x = x - display_origin_x; - cur_y = y - display_origin_y; - var x = cur_x - cur_hotx; - var y = cur_y - cur_hoty; - x *= cursor_scale / scaleFactor; - y *= cursor_scale / scaleFactor; - cursor_img.style.set { - left: x + "px", - top: y + "px", - }; - if (cursor_img.style#display == 'none') { - cursor_img.style#display = "block"; - refreshCursor(); - } -} - -function self.ready() { - var w = scaleIt(960); - var h = scaleIt(640); - if (is_file_transfer || is_port_forward) { - var r = handler.get_size(); - if (isReasonableSize(r) && r[2] > 0) { - view.move(r[0], r[1], r[2], r[3]); - } else { - centerize(w, h); - } - } else { - centerize(w, h); - } - if (!is_port_forward) connecting(); - if (is_file_transfer) initializeFileTransfer(); - if (is_port_forward) initializePortForward(); -} - -var workarea_offset = 0; -var size_adapted; -handler.adaptSize = function() { - if (size_adapted) return; - size_adapted = true; - var (sx, sy, sw, sh) = view.screenBox(#workarea, #rectw); - var (fx, fy, fw, fh) = view.screenBox(#frame, #rectw); - if (is_osx) workarea_offset = sy; - var r = handler.get_size(); - if (isReasonableSize(r) && r[2] > 0) { - if (r[2] >= fw && r[3] >= fh && !is_linux) { - view.windowState = View.WINDOW_FULL_SCREEN; - stdout.println("Initialize to full screen"); - } else if (r[2] >= sw && r[3] >= sh) { - view.windowState = View.WINDOW_MAXIMIZED; - stdout.println("Initialize to full screen"); - } else { - view.move(r[0], r[1], r[2], r[3]); - } - } else { - var w = handler.box(#width, #border) - var h = handler.box(#height, #border) - if (w >= sw || h >= sh) { - view.windowState = View.WINDOW_MAXIMIZED; - return; - } - // extra for border - var extra = 2; - centerize(w + extra, handler.box(#height, #border) + h + extra); - } -} - -function self.closing() { - var (x, y, w, h) = view.box(#rectw, #border, #screen); - if (is_file_transfer) save_file_transfer_close_state(); - if (is_file_transfer || is_port_forward || size_adapted) handler.save_size(x, y, w, h); - if (recording) handler.record_screen(false, 0, display_width, display_height); -} - -var qualityMonitor; -var qualityMonitorData = []; - -class QualityMonitor: Reactor.Component -{ - function this() { - qualityMonitor = this; - if (handler.get_toggle_option("show-quality-monitor")) { - $(#quality-monitor).style.set{ display: "block" }; - } - } - - function render() { - return
    -
    - Speed: {qualityMonitorData[0]} -
    -
    - FPS: {qualityMonitorData[1]} -
    -
    - Delay: {qualityMonitorData[2]} ms -
    -
    - Target Bitrate: {qualityMonitorData[3]}kb -
    -
    - Codec: {qualityMonitorData[4]} -
    -
    - Chroma: {qualityMonitorData[5]} -
    -
    ; - } -} - -$(#quality-monitor).content(); -handler.updateQualityStatus = function(speed, fps, delay, bitrate, codec_format, chroma) { - if (speed !== null) qualityMonitorData[0] = speed; - if (fps !== null) qualityMonitorData[1] = fps; - if (delay !== null) qualityMonitorData[2] = qualityMonitorData[1] === 0 ? 0 : delay; - if (bitrate !== null) qualityMonitorData[3] = bitrate; - if (codec_format !== null) qualityMonitorData[4] = codec_format; - if (chroma !== null) qualityMonitorData[5] = chroma; - qualityMonitor.update(); -} - -handler.setPermission = function(name, enabled) { - self.timer(60ms, function() { - if (name == "keyboard") keyboard_enabled = enabled; - if (name == "audio") audio_enabled = enabled; - if (name == "file") file_enabled = enabled; - if (name == "clipboard") clipboard_enabled = enabled; - if (name == "restart") restart_enabled = enabled; - if (name == "recording") recording_enabled = enabled; - input_blocked = false; - header.update(); - }); -} - -handler.closeSuccess = function() { - // handler.msgbox("success", "Successful", "Ready to go."); - handler.msgbox("", "", ""); -} diff --git a/shelled/rustdesk-as-ref/src/ui_cm_interface.rs b/shelled/rustdesk-as-ref/src/ui_cm_interface.rs deleted file mode 100644 index 75e7240..0000000 --- a/shelled/rustdesk-as-ref/src/ui_cm_interface.rs +++ /dev/null @@ -1,1853 +0,0 @@ -#[cfg(not(any(target_os = "android", target_os = "ios")))] -use crate::ipc::Connection; -#[cfg(not(any(target_os = "ios")))] -use crate::ipc::{self, Data}; -#[cfg(target_os = "windows")] -use crate::{clipboard::ClipboardSide, ipc::ClipboardNonFile}; -#[cfg(target_os = "windows")] -use clipboard::ContextSend; -#[cfg(not(any(target_os = "ios")))] -use hbb_common::fs::serialize_transfer_job; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -use hbb_common::tokio::sync::mpsc::unbounded_channel; -use hbb_common::{ - allow_err, bail, - config::{keys::OPTION_FILE_TRANSFER_MAX_FILES, Config}, - fs::{self, get_string, is_write_need_confirmation, new_send_confirm, DigestCheckResult}, - log, - message_proto::*, - protobuf::Message as _, - tokio::{ - self, - sync::mpsc::{self, UnboundedSender}, - task::spawn_blocking, - }, - ResultType, -}; -#[cfg(target_os = "windows")] -use hbb_common::{ - config::{keys::*, option2bool}, - tokio::sync::Mutex as TokioMutex, -}; -use serde_derive::Serialize; -#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] -use std::iter::FromIterator; -#[cfg(not(any(target_os = "ios")))] -use std::path::PathBuf; -#[cfg(target_os = "windows")] -use std::sync::Arc; -use std::{ - collections::HashMap, - ops::{Deref, DerefMut}, - sync::{ - atomic::{AtomicI64, Ordering}, - RwLock, - }, -}; - -/// Default maximum number of files allowed per transfer request. -/// Unit: number of files (not bytes). -#[cfg(not(any(target_os = "ios")))] -const DEFAULT_MAX_VALIDATED_FILES: usize = 10_000; - -/// Maximum number of files allowed in a single file transfer request. -/// -/// This limit prevents excessive I/O and memory usage when dealing with -/// large directories. It applies to: -/// - CM-side read jobs (server to client file transfers on Windows) -/// - `AllFiles` recursive directory listing operations -/// - Connection-side read jobs (non-Windows platforms) -/// -/// Unit: number of files (not bytes). -/// Default: 10,000 files. -/// Configured via: `OPTION_FILE_TRANSFER_MAX_FILES` ("file-transfer-max-files") -#[cfg(not(any(target_os = "ios")))] -static MAX_VALIDATED_FILES: std::sync::OnceLock = std::sync::OnceLock::new(); - -/// Get the maximum number of files allowed per transfer request. -/// -/// Initializes the value from configuration (`OPTION_FILE_TRANSFER_MAX_FILES`) -/// on first call. Semantics: -/// - If the option is set to `0`, `DEFAULT_MAX_VALIDATED_FILES` (10,000) is used as a safe upper bound. -/// - If the option is unset, negative, or non-integer, -/// `usize::MAX` is used to represent "no limit" for backward compatibility with older versions -/// that did not enforce any file‑count restriction. -/// (Note: negative values are not valid for `usize` and will cause parsing to fail.) -/// -/// Unit: number of files. -#[cfg(not(any(target_os = "ios")))] -#[inline] -pub fn get_max_validated_files() -> usize { - // If `OPTION_FILE_TRANSFER_MAX_FILES` unset, negative, or non-integer, use - // `usize::MAX` to represent "no limit", maintaining backward compatibility - // with versions that had no file transfer restrictions. - const NO_LIMIT_FILE_COUNT: usize = usize::MAX; - *MAX_VALIDATED_FILES.get_or_init(|| { - let c = crate::get_builtin_option(OPTION_FILE_TRANSFER_MAX_FILES) - .trim() - .parse::() - .unwrap_or(NO_LIMIT_FILE_COUNT); - if c == 0 { - DEFAULT_MAX_VALIDATED_FILES - } else { - c - } - }) -} - -/// Check if file count exceeds the maximum allowed limit. -/// -/// This check is enforced in: -/// - `start_read_job()` for CM-side read jobs -/// - `read_all_files()` for recursive directory listings -/// - `Connection::on_message()` for connection-side read jobs -/// -/// # Arguments -/// * `file_count` - Number of files in the transfer request -/// -/// # Returns -/// * `Ok(())` if within limit -/// * `Err(String)` with error message if limit exceeded -#[cfg(not(any(target_os = "ios")))] -pub fn check_file_count_limit(file_count: usize) -> Result<(), String> { - let max_files = get_max_validated_files(); - if file_count > max_files { - let msg = format!( - "file transfer rejected: too many files ({} files exceeds limit of {}). \ - Adjust '{}' option to increase limit.", - file_count, max_files, OPTION_FILE_TRANSFER_MAX_FILES - ); - log::warn!("{}", msg); - Err(msg) - } else { - Ok(()) - } -} - -#[derive(Serialize, Clone)] -pub struct Client { - pub id: i32, - pub authorized: bool, - pub disconnected: bool, - pub is_file_transfer: bool, - pub is_view_camera: bool, - pub is_terminal: bool, - pub port_forward: String, - pub name: String, - pub avatar: String, - pub peer_id: String, - pub keyboard: bool, - pub clipboard: bool, - pub audio: bool, - pub file: bool, - pub restart: bool, - pub recording: bool, - pub block_input: bool, - pub from_switch: bool, - pub in_voice_call: bool, - pub incoming_voice_call: bool, - #[serde(skip)] - #[cfg(not(any(target_os = "ios")))] - tx: UnboundedSender, -} - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -struct IpcTaskRunner { - stream: Connection, - cm: ConnectionManager, - tx: mpsc::UnboundedSender, - rx: mpsc::UnboundedReceiver, - close: bool, - running: bool, - conn_id: i32, - #[cfg(target_os = "windows")] - file_transfer_enabled: bool, - #[cfg(target_os = "windows")] - file_transfer_enabled_peer: bool, - /// Read jobs for CM-side file reading (server to client transfers) - read_jobs: Vec, -} - -lazy_static::lazy_static! { - static ref CLIENTS: RwLock> = Default::default(); -} - -static CLICK_TIME: AtomicI64 = AtomicI64::new(0); - -#[derive(Clone)] -pub struct ConnectionManager { - pub ui_handler: T, -} - -pub trait InvokeUiCM: Send + Clone + 'static + Sized { - fn add_connection(&self, client: &Client); - - fn remove_connection(&self, id: i32, close: bool); - - fn new_message(&self, id: i32, text: String); - - fn change_theme(&self, dark: String); - - fn change_language(&self); - - fn show_elevation(&self, show: bool); - - fn update_voice_call_state(&self, client: &Client); - - fn file_transfer_log(&self, action: &str, log: &str); -} - -impl Deref for ConnectionManager { - type Target = T; - - fn deref(&self) -> &Self::Target { - &self.ui_handler - } -} - -impl DerefMut for ConnectionManager { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.ui_handler - } -} - -impl ConnectionManager { - fn add_connection( - &self, - id: i32, - is_file_transfer: bool, - is_view_camera: bool, - is_terminal: bool, - port_forward: String, - peer_id: String, - name: String, - avatar: String, - authorized: bool, - keyboard: bool, - clipboard: bool, - audio: bool, - file: bool, - restart: bool, - recording: bool, - block_input: bool, - from_switch: bool, - #[cfg(not(any(target_os = "ios")))] tx: mpsc::UnboundedSender, - ) { - let client = Client { - id, - authorized, - disconnected: false, - is_file_transfer, - is_view_camera, - is_terminal, - port_forward, - name: name.clone(), - avatar, - peer_id: peer_id.clone(), - keyboard, - clipboard, - audio, - file, - restart, - recording, - block_input, - from_switch, - #[cfg(not(any(target_os = "ios")))] - tx, - in_voice_call: false, - incoming_voice_call: false, - }; - CLIENTS - .write() - .unwrap() - .retain(|_, c| !(c.disconnected && c.peer_id == client.peer_id)); - CLIENTS.write().unwrap().insert(id, client.clone()); - self.ui_handler.add_connection(&client); - } - - #[inline] - #[cfg(target_os = "windows")] - fn is_authorized(&self, id: i32) -> bool { - CLIENTS - .read() - .unwrap() - .get(&id) - .map(|c| c.authorized) - .unwrap_or(false) - } - - fn remove_connection(&self, id: i32, close: bool) { - if close { - CLIENTS.write().unwrap().remove(&id); - } else { - CLIENTS - .write() - .unwrap() - .get_mut(&id) - .map(|c| c.disconnected = true); - } - - #[cfg(target_os = "windows")] - { - crate::clipboard::try_empty_clipboard_files(ClipboardSide::Host, id); - } - - #[cfg(any(target_os = "android"))] - if CLIENTS - .read() - .unwrap() - .iter() - .filter(|(_k, v)| !v.is_file_transfer && !v.is_terminal) - .next() - .is_none() - { - if let Err(e) = - scrap::android::call_main_service_set_by_name("stop_capture", None, None) - { - log::debug!("stop_capture err:{}", e); - } - } - - self.ui_handler.remove_connection(id, close); - } - - #[cfg(not(any(target_os = "android", target_os = "ios")))] - fn show_elevation(&self, show: bool) { - self.ui_handler.show_elevation(show); - } - - #[cfg(not(target_os = "ios"))] - fn voice_call_started(&self, id: i32) { - if let Some(client) = CLIENTS.write().unwrap().get_mut(&id) { - client.incoming_voice_call = false; - client.in_voice_call = true; - self.ui_handler.update_voice_call_state(client); - } - } - - #[cfg(not(target_os = "ios"))] - fn voice_call_incoming(&self, id: i32) { - if let Some(client) = CLIENTS.write().unwrap().get_mut(&id) { - client.incoming_voice_call = true; - client.in_voice_call = false; - self.ui_handler.update_voice_call_state(client); - } - } - - #[cfg(not(target_os = "ios"))] - fn voice_call_closed(&self, id: i32, _reason: &str) { - if let Some(client) = CLIENTS.write().unwrap().get_mut(&id) { - client.incoming_voice_call = false; - client.in_voice_call = false; - self.ui_handler.update_voice_call_state(client); - } - } -} - -#[inline] -#[cfg(not(any(target_os = "ios")))] -pub fn check_click_time(id: i32) { - if let Some(client) = CLIENTS.read().unwrap().get(&id) { - allow_err!(client.tx.send(Data::ClickTime(0))); - }; -} - -#[inline] -pub fn get_click_time() -> i64 { - CLICK_TIME.load(Ordering::SeqCst) -} - -#[inline] -#[cfg(not(any(target_os = "ios")))] -pub fn authorize(id: i32) { - if let Some(client) = CLIENTS.write().unwrap().get_mut(&id) { - client.authorized = true; - allow_err!(client.tx.send(Data::Authorize)); - }; -} - -#[inline] -#[cfg(not(any(target_os = "ios")))] -pub fn close(id: i32) { - if let Some(client) = CLIENTS.read().unwrap().get(&id) { - allow_err!(client.tx.send(Data::Close)); - }; -} - -#[inline] -pub fn remove(id: i32) { - CLIENTS.write().unwrap().remove(&id); -} - -// server mode send chat to peer -#[inline] -#[cfg(not(any(target_os = "ios")))] -pub fn send_chat(id: i32, text: String) { - let clients = CLIENTS.read().unwrap(); - if let Some(client) = clients.get(&id) { - allow_err!(client.tx.send(Data::ChatMessage { text })); - } -} - -#[inline] -#[cfg(not(any(target_os = "ios")))] -pub fn switch_permission(id: i32, name: String, enabled: bool) { - if let Some(client) = CLIENTS.read().unwrap().get(&id) { - allow_err!(client.tx.send(Data::SwitchPermission { name, enabled })); - }; -} - -#[inline] -#[cfg(target_os = "android")] -pub fn switch_permission_all(name: String, enabled: bool) { - for (_, client) in CLIENTS.read().unwrap().iter() { - allow_err!(client.tx.send(Data::SwitchPermission { - name: name.clone(), - enabled - })); - } -} - -#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] -#[inline] -pub fn get_clients_state() -> String { - let clients = CLIENTS.read().unwrap(); - let res = Vec::from_iter(clients.values().cloned()); - serde_json::to_string(&res).unwrap_or("".into()) -} - -#[inline] -pub fn get_clients_length() -> usize { - let clients = CLIENTS.read().unwrap(); - clients.len() -} - -#[inline] -#[cfg(feature = "flutter")] -#[cfg(not(any(target_os = "ios")))] -pub fn switch_back(id: i32) { - if let Some(client) = CLIENTS.read().unwrap().get(&id) { - allow_err!(client.tx.send(Data::SwitchSidesBack)); - }; -} - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -impl IpcTaskRunner { - async fn run(&mut self) { - use hbb_common::config::LocalConfig; - use hbb_common::tokio::time::{self, Duration, Instant}; - - const MILLI5: Duration = Duration::from_millis(5); - const SEC30: Duration = Duration::from_secs(30); - - // for tmp use, without real conn id - let mut write_jobs: Vec = Vec::new(); - // File timer for processing read_jobs - let mut file_timer = - crate::rustdesk_interval(time::interval_at(Instant::now() + SEC30, SEC30)); - - #[cfg(target_os = "windows")] - let is_authorized = self.cm.is_authorized(self.conn_id); - - #[cfg(target_os = "windows")] - let rx_clip_holder; - let mut rx_clip; - let _tx_clip; - #[cfg(target_os = "windows")] - if self.conn_id > 0 && is_authorized { - log::debug!("Clipboard is enabled from client peer: type 1"); - let conn_id = self.conn_id; - rx_clip_holder = ( - clipboard::get_rx_cliprdr_server(conn_id), - Some(crate::SimpleCallOnReturn { - b: true, - f: Box::new(move || { - clipboard::remove_channel_by_conn_id(conn_id); - }), - }), - ); - rx_clip = rx_clip_holder.0.lock().await; - } else { - log::debug!("Clipboard is enabled from client peer, actually useless: type 2"); - let rx_clip2; - (_tx_clip, rx_clip2) = unbounded_channel::(); - rx_clip_holder = (Arc::new(TokioMutex::new(rx_clip2)), None); - rx_clip = rx_clip_holder.0.lock().await; - } - #[cfg(not(target_os = "windows"))] - { - (_tx_clip, rx_clip) = unbounded_channel::(); - } - - #[cfg(target_os = "windows")] - { - if ContextSend::is_enabled() { - log::debug!("Clipboard is enabled"); - allow_err!( - self.stream - .send(&Data::ClipboardFile(clipboard::ClipboardFile::MonitorReady)) - .await - ); - } - } - let (tx_log, mut rx_log) = mpsc::unbounded_channel::(); - - self.running = false; - loop { - tokio::select! { - res = self.stream.next() => { - match res { - Err(err) => { - log::info!("cm ipc connection closed: {}", err); - break; - } - Ok(Some(data)) => { - match data { - Data::Login{id, is_file_transfer, is_view_camera, is_terminal, port_forward, peer_id, name, avatar, authorized, keyboard, clipboard, audio, file, file_transfer_enabled: _file_transfer_enabled, restart, recording, block_input, from_switch} => { - log::debug!("conn_id: {}", id); - self.cm.add_connection(id, is_file_transfer, is_view_camera, is_terminal, port_forward, peer_id, name, avatar, authorized, keyboard, clipboard, audio, file, restart, recording, block_input, from_switch, self.tx.clone()); - self.conn_id = id; - #[cfg(target_os = "windows")] - { - self.file_transfer_enabled = _file_transfer_enabled; - } - self.running = true; - break; - } - Data::Close => { - log::info!("cm ipc connection closed from connection request"); - break; - } - Data::Disconnected => { - self.close = false; - log::info!("cm ipc connection disconnect"); - break; - } - Data::PrivacyModeState((_id, _, _)) => { - #[cfg(windows)] - cm_inner_send(_id, data); - } - Data::ClickTime(ms) => { - CLICK_TIME.store(ms, Ordering::SeqCst); - } - Data::ChatMessage { text } => { - self.cm.new_message(self.conn_id, text); - } - Data::FS(mut fs) => { - if let ipc::FS::WriteBlock { id, file_num, data: _, compressed } = fs { - if let Ok(bytes) = self.stream.next_raw().await { - fs = ipc::FS::WriteBlock{id, file_num, data:bytes.into(), compressed}; - handle_fs(fs, &mut write_jobs, &mut self.read_jobs, &self.tx, Some(&tx_log), self.conn_id).await; - } - } else { - handle_fs(fs, &mut write_jobs, &mut self.read_jobs, &self.tx, Some(&tx_log), self.conn_id).await; - } - // Activate fast timer immediately when read jobs exist. - // This ensures new jobs start processing without waiting for the slow 30s timer. - // Deactivation (back to 30s) happens in tick handler when jobs are exhausted. - if !self.read_jobs.is_empty() { - file_timer = crate::rustdesk_interval(time::interval(MILLI5)); - } - let log = fs::serialize_transfer_jobs(&write_jobs); - self.cm.ui_handler.file_transfer_log("transfer", &log); - } - Data::FileTransferLog((action, log)) => { - self.cm.ui_handler.file_transfer_log(&action, &log); - } - #[cfg(target_os = "windows")] - Data::ClipboardFile(_clip) => { - let is_stopping_allowed = _clip.is_beginning_message(); - let is_clipboard_enabled = ContextSend::is_enabled(); - let file_transfer_enabled = self.file_transfer_enabled; - let stop = !is_stopping_allowed && !(is_clipboard_enabled && file_transfer_enabled); - log::debug!( - "Process clipboard message from client peer, stop: {}, is_stopping_allowed: {}, is_clipboard_enabled: {}, file_transfer_enabled: {}", - stop, is_stopping_allowed, is_clipboard_enabled, file_transfer_enabled); - if stop { - ContextSend::set_is_stopped(); - } else { - if !is_authorized { - log::debug!("Clipboard message from client peer, but not authorized"); - continue; - } - let conn_id = self.conn_id; - let _ = ContextSend::proc(|context| -> ResultType<()> { - context.server_clip_file(conn_id, _clip) - .map_err(|e| e.into()) - }); - } - } - Data::ClipboardFileEnabled(_enabled) => { - #[cfg(target_os = "windows")] - { - self.file_transfer_enabled_peer = _enabled; - } - } - Data::Theme(dark) => { - self.cm.change_theme(dark); - } - Data::Language(lang) => { - LocalConfig::set_option("lang".to_owned(), lang); - self.cm.change_language(); - } - Data::DataPortableService(ipc::DataPortableService::CmShowElevation(show)) => { - self.cm.show_elevation(show); - } - Data::StartVoiceCall => { - self.cm.voice_call_started(self.conn_id); - } - Data::VoiceCallIncoming => { - self.cm.voice_call_incoming(self.conn_id); - } - Data::CloseVoiceCall(reason) => { - self.cm.voice_call_closed(self.conn_id, reason.as_str()); - } - #[cfg(target_os = "windows")] - Data::ClipboardNonFile(_) => { - match crate::clipboard::check_clipboard_cm() { - Ok(multi_clipoards) => { - let mut raw_contents = bytes::BytesMut::new(); - let mut main_data = vec![]; - for c in multi_clipoards.clipboards.into_iter() { - let content_len = c.content.len(); - let (content, next_raw) = { - // TODO: find out a better threshold - if content_len > 1024 * 3 { - raw_contents.extend(c.content); - (bytes::Bytes::new(), true) - } else { - (c.content, false) - } - }; - main_data.push(ClipboardNonFile { - compress: c.compress, - content, - content_len, - next_raw, - width: c.width, - height: c.height, - format: c.format.value(), - special_name: c.special_name, - }); - } - allow_err!(self.stream.send(&Data::ClipboardNonFile(Some(("".to_owned(), main_data)))).await); - if !raw_contents.is_empty() { - allow_err!(self.stream.send_raw(raw_contents.into()).await); - } - } - Err(e) => { - log::debug!("Failed to get clipboard content. {}", e); - allow_err!(self.stream.send(&Data::ClipboardNonFile(Some((format!("{}", e), vec![])))).await); - } - } - } - _ => { - - } - } - } - _ => {} - } - } - Some(data) = self.rx.recv() => { - // For FileBlockFromCM, data is sent separately via send_raw (data field has #[serde(skip)]). - // This avoids JSON encoding overhead for large binary data. - // This mirrors the WriteBlock pattern in start_ipc (see rx_to_cm handler). - // - // Note: Empty data (for empty files) is correctly handled. BytesCodec with raw=false - // (the default for IPC connections) adds a length prefix, so send_raw(Bytes::new()) - // sends a 1-byte frame that next_raw() can correctly receive as empty data. - if let Data::FileBlockFromCM { id, file_num, ref data, compressed, conn_id } = data { - // Send metadata first (data field is skipped by serde), then raw data bytes - if let Err(e) = self.stream.send(&Data::FileBlockFromCM { - id, - file_num, - data: bytes::Bytes::new(), // placeholder, skipped by serde - compressed, - conn_id, - }).await { - log::error!("error sending FileBlockFromCM metadata: {}", e); - break; - } - if let Err(e) = self.stream.send_raw(data.clone()).await { - log::error!("error sending FileBlockFromCM data: {}", e); - break; - } - continue; - } - if let Err(e) = self.stream.send(&data).await { - log::error!("error encountered in IPC task, quitting: {}", e); - break; - } - match &data { - Data::SwitchPermission{name: _name, enabled: _enabled} => { - #[cfg(target_os = "windows")] - if _name == "file" { - self.file_transfer_enabled = *_enabled; - } - } - Data::Authorize => { - self.running = true; - break; - } - _ => { - } - } - }, - clip_file = rx_clip.recv() => match clip_file { - Some(_clip) => { - #[cfg(target_os = "windows")] - { - let is_stopping_allowed = _clip.is_stopping_allowed(); - let is_clipboard_enabled = ContextSend::is_enabled(); - let file_transfer_enabled = self.file_transfer_enabled; - let file_transfer_enabled_peer = self.file_transfer_enabled_peer; - let stop = is_stopping_allowed && !(is_clipboard_enabled && file_transfer_enabled && file_transfer_enabled_peer); - log::debug!( - "Process clipboard message from clip, stop: {}, is_stopping_allowed: {}, is_clipboard_enabled: {}, file_transfer_enabled: {}, file_transfer_enabled_peer: {}", - stop, is_stopping_allowed, is_clipboard_enabled, file_transfer_enabled, file_transfer_enabled_peer); - if stop { - ContextSend::set_is_stopped(); - } else { - if _clip.is_beginning_message() && crate::get_builtin_option(OPTION_ONE_WAY_FILE_TRANSFER) == "Y" { - // If one way file transfer is enabled, don't send clipboard file to client - // Don't call `ContextSend::set_is_stopped()`, because it will stop bidirectional file copy&paste. - } else { - allow_err!(self.tx.send(Data::ClipboardFile(_clip))); - } - } - } - } - None => { - // - } - }, - Some(job_log) = rx_log.recv() => { - self.cm.ui_handler.file_transfer_log("transfer", &job_log); - } - _ = file_timer.tick() => { - if !self.read_jobs.is_empty() { - let conn_id = self.conn_id; - if let Err(e) = handle_read_jobs_tick(&mut self.read_jobs, &self.tx, conn_id).await { - log::error!("Error processing read jobs: {}", e); - } - let log = fs::serialize_transfer_jobs(&self.read_jobs); - self.cm.ui_handler.file_transfer_log("transfer", &log); - } else { - file_timer = crate::rustdesk_interval(time::interval_at(Instant::now() + SEC30, SEC30)); - } - } - } - } - } - - async fn ipc_task(stream: Connection, cm: ConnectionManager) { - log::debug!("ipc task begin"); - let (tx, rx) = mpsc::unbounded_channel::(); - let mut task_runner = Self { - stream, - cm, - tx, - rx, - close: true, - running: true, - conn_id: 0, - #[cfg(target_os = "windows")] - file_transfer_enabled: false, - #[cfg(target_os = "windows")] - file_transfer_enabled_peer: false, - read_jobs: Vec::new(), - }; - - while task_runner.running { - task_runner.run().await; - } - if task_runner.conn_id > 0 { - task_runner - .cm - .remove_connection(task_runner.conn_id, task_runner.close); - } - log::debug!("ipc task end"); - } -} - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -#[tokio::main(flavor = "current_thread")] -pub async fn start_ipc(cm: ConnectionManager) { - #[cfg(target_os = "windows")] - { - let enabled = crate::Connection::is_permission_enabled_locally(OPTION_ENABLE_FILE_TRANSFER); - let mut lock = crate::ui_interface::IS_FILE_TRANSFER_ENABLED - .lock() - .unwrap(); - ContextSend::enable(enabled); - *lock = Some(enabled); - } - match ipc::new_listener("_cm").await { - Ok(mut incoming) => { - while let Some(result) = incoming.next().await { - match result { - Ok(stream) => { - log::debug!("Got new connection"); - tokio::spawn(IpcTaskRunner::::ipc_task( - Connection::new(stream), - cm.clone(), - )); - } - Err(err) => { - log::error!("Couldn't get cm client: {:?}", err); - } - } - } - } - Err(err) => { - log::error!("Failed to start cm ipc server: {}", err); - } - } - quit_cm(); -} - -#[cfg(target_os = "android")] -#[tokio::main(flavor = "current_thread")] -pub async fn start_listen( - cm: ConnectionManager, - mut rx: mpsc::UnboundedReceiver, - tx: mpsc::UnboundedSender, -) { - let mut current_id = 0; - let mut write_jobs: Vec = Vec::new(); - loop { - match rx.recv().await { - Some(Data::Login { - id, - is_file_transfer, - is_view_camera, - is_terminal, - port_forward, - peer_id, - name, - avatar, - authorized, - keyboard, - clipboard, - audio, - file, - restart, - recording, - block_input, - from_switch, - .. - }) => { - current_id = id; - cm.add_connection( - id, - is_file_transfer, - is_view_camera, - is_terminal, - port_forward, - peer_id, - name, - avatar, - authorized, - keyboard, - clipboard, - audio, - file, - restart, - recording, - block_input, - from_switch, - tx.clone(), - ); - } - Some(Data::ChatMessage { text }) => { - cm.new_message(current_id, text); - } - Some(Data::FS(fs)) => { - // Android doesn't need CM-side file reading (no need_validate_file_read_access) - let mut read_jobs_placeholder: Vec = Vec::new(); - handle_fs( - fs, - &mut write_jobs, - &mut read_jobs_placeholder, - &tx, - None, - current_id, - ) - .await; - } - Some(Data::Close) => { - break; - } - Some(Data::StartVoiceCall) => { - cm.voice_call_started(current_id); - } - Some(Data::VoiceCallIncoming) => { - cm.voice_call_incoming(current_id); - } - Some(Data::CloseVoiceCall(reason)) => { - cm.voice_call_closed(current_id, reason.as_str()); - } - None => { - break; - } - _ => {} - } - } - cm.remove_connection(current_id, true); -} - -#[cfg(not(any(target_os = "ios")))] -async fn handle_fs( - fs: ipc::FS, - write_jobs: &mut Vec, - read_jobs: &mut Vec, - tx: &UnboundedSender, - tx_log: Option<&UnboundedSender>, - _conn_id: i32, -) { - match fs { - ipc::FS::ReadEmptyDirs { - dir, - include_hidden, - } => { - read_empty_dirs(&dir, include_hidden, tx).await; - } - ipc::FS::ReadDir { - dir, - include_hidden, - } => { - read_dir(&dir, include_hidden, tx).await; - } - ipc::FS::RemoveDir { - path, - id, - recursive, - } => { - remove_dir(path, id, recursive, tx).await; - } - ipc::FS::RemoveFile { path, id, file_num } => { - remove_file(path, id, file_num, tx).await; - } - ipc::FS::CreateDir { path, id } => { - create_dir(path, id, tx).await; - } - ipc::FS::NewWrite { - path, - id, - file_num, - mut files, - overwrite_detection, - total_size, - conn_id, - } => { - // Validate file names to prevent path traversal attacks. - // This must be done BEFORE any path operations to ensure attackers cannot - // escape the target directory using names like "../../malicious.txt" - if let Err(e) = validate_transfer_file_names(&files) { - log::warn!("Path traversal attempt detected for {}: {}", path, e); - send_raw(fs::new_error(id, e, file_num), tx); - return; - } - - // Convert files to FileEntry - let file_entries: Vec = files - .drain(..) - .map(|f| FileEntry { - name: f.0, - modified_time: f.1, - ..Default::default() - }) - .collect(); - - // cm has no show_hidden context - // dummy remote, show_hidden, is_remote - let mut job = fs::TransferJob::new_write( - id, - fs::JobType::Generic, - "".to_string(), - fs::DataSource::FilePath(PathBuf::from(&path)), - file_num, - false, - false, - file_entries, - overwrite_detection, - ); - job.total_size = total_size; - job.conn_id = conn_id; - write_jobs.push(job); - } - ipc::FS::CancelWrite { id } => { - if let Some(job) = fs::remove_job(id, write_jobs) { - job.remove_download_file(); - if let Some(tx) = tx_log { - if let Err(e) = tx.send(serialize_transfer_job(&job, false, true, "")) { - log::error!("error sending transfer job log via IPC: {}", e); - } - } - } - } - ipc::FS::WriteDone { id, file_num } => { - if let Some(job) = fs::remove_job(id, write_jobs) { - job.modify_time(); - send_raw(fs::new_done(id, file_num), tx); - tx_log.map(|tx| tx.send(serialize_transfer_job(&job, true, false, ""))); - } - } - ipc::FS::WriteError { id, file_num, err } => { - if let Some(job) = fs::remove_job(id, write_jobs) { - tx_log.map(|tx| tx.send(serialize_transfer_job(&job, false, false, &err))); - send_raw(fs::new_error(job.id(), err, file_num), tx); - } - } - ipc::FS::WriteBlock { - id, - file_num, - data, - compressed, - } => { - if let Some(job) = fs::get_job(id, write_jobs) { - if let Err(err) = job - .write(FileTransferBlock { - id, - file_num, - data, - compressed, - ..Default::default() - }) - .await - { - send_raw(fs::new_error(id, err, file_num), &tx); - } - } - } - ipc::FS::CheckDigest { - id, - file_num, - file_size, - last_modified, - is_upload, - is_resume, - } => { - if let Some(job) = fs::get_job(id, write_jobs) { - let mut req = FileTransferSendConfirmRequest { - id, - file_num, - union: Some(file_transfer_send_confirm_request::Union::OffsetBlk(0)), - ..Default::default() - }; - let digest = FileTransferDigest { - id, - file_num, - last_modified, - file_size, - ..Default::default() - }; - if let Some(file) = job.files().get(file_num as usize) { - if let fs::DataSource::FilePath(p) = &job.data_source { - let path = get_string(&fs::TransferJob::join(p, &file.name)); - match is_write_need_confirmation(is_resume, &path, &digest) { - Ok(digest_result) => { - job.set_digest(file_size, last_modified); - match digest_result { - DigestCheckResult::IsSame => { - req.set_skip(true); - let msg_out = new_send_confirm(req); - send_raw(msg_out, &tx); - } - DigestCheckResult::NeedConfirm(mut digest) => { - // upload to server, but server has the same file, request - digest.is_upload = is_upload; - let mut msg_out = Message::new(); - let mut fr = FileResponse::new(); - fr.set_digest(digest); - msg_out.set_file_response(fr); - send_raw(msg_out, &tx); - } - DigestCheckResult::NoSuchFile => { - let msg_out = new_send_confirm(req); - send_raw(msg_out, &tx); - } - } - } - Err(err) => { - send_raw(fs::new_error(id, err, file_num), &tx); - } - } - } - } - } - } - ipc::FS::SendConfirm(bytes) => { - if let Ok(r) = FileTransferSendConfirmRequest::parse_from_bytes(&bytes) { - if let Some(job) = fs::get_job(r.id, write_jobs) { - job.confirm(&r).await; - } - } - } - ipc::FS::Rename { id, path, new_name } => { - rename_file(path, new_name, id, tx).await; - } - ipc::FS::ReadFile { - path, - id, - file_num, - include_hidden, - conn_id, - overwrite_detection, - } => { - start_read_job( - path, - file_num, - include_hidden, - id, - conn_id, - overwrite_detection, - read_jobs, - tx, - ) - .await; - } - // Cancel an ongoing read job (file transfer from server to client). - // Note: This only cancels jobs in `read_jobs`. It does NOT cancel `ReadAllFiles` - // operations, which are one-shot directory scans that complete quickly and don't - // have persistent job tracking. - ipc::FS::CancelRead { id, conn_id: _ } => { - if let Some(job) = fs::remove_job(id, read_jobs) { - if let Some(tx) = tx_log { - if let Err(e) = tx.send(serialize_transfer_job(&job, false, true, "")) { - log::error!("error sending transfer job log via IPC: {}", e); - } - } - } - } - ipc::FS::SendConfirmForRead { - id, - file_num: _, - skip, - offset_blk, - conn_id: _, - } => { - if let Some(job) = fs::get_job(id, read_jobs) { - let req = FileTransferSendConfirmRequest { - id, - file_num: job.file_num(), - union: if skip { - Some(file_transfer_send_confirm_request::Union::Skip(true)) - } else { - Some(file_transfer_send_confirm_request::Union::OffsetBlk( - offset_blk, - )) - }, - ..Default::default() - }; - job.confirm(&req).await; - } - } - // Recursively list all files in a directory. - // This is a one-shot operation that cannot be cancelled via CancelRead. - // The operation typically completes quickly as it only reads directory metadata, - // not file contents. File count is limited by `check_file_count_limit()`. - ipc::FS::ReadAllFiles { - path, - id, - include_hidden, - conn_id, - } => { - read_all_files(path, include_hidden, id, conn_id, tx).await; - } - _ => {} - } -} - -/// Validates that a file name does not contain path traversal sequences. -/// This prevents attackers from escaping the base directory by using names like -/// "../../../etc/passwd" or "..\\..\\Windows\\System32\\malicious.dll". -#[cfg(not(any(target_os = "ios")))] -fn validate_file_name_no_traversal(name: &str) -> ResultType<()> { - // Check for null bytes which could cause path truncation in some APIs - if name.bytes().any(|b| b == 0) { - bail!("file name contains null bytes"); - } - - // Check for path traversal patterns - // We check for both Unix and Windows path separators - if name - .split(|c| c == '/' || c == '\\') - .filter(|s| !s.is_empty()) - .any(|component| component == "..") - { - bail!("path traversal detected in file name"); - } - - // On Windows, also check for drive letters (e.g., "C:") - #[cfg(windows)] - { - if name.len() >= 2 { - let bytes = name.as_bytes(); - if bytes[0].is_ascii_alphabetic() && bytes[1] == b':' { - bail!("absolute path detected in file name"); - } - } - } - - // Check for names starting with path separator: - // - Unix absolute paths (e.g., "/etc/passwd") - // - Windows UNC paths (e.g., "\\server\share") - if name.starts_with('/') || name.starts_with('\\') { - bail!("absolute path detected in file name"); - } - - Ok(()) -} - -#[inline] -fn is_single_file_with_empty_name(files: &[(String, u64)]) -> bool { - files.len() == 1 && files.first().map_or(false, |f| f.0.is_empty()) -} - -/// Validates all file names in a transfer request to prevent path traversal attacks. -/// Returns an error if any file name contains dangerous path components. -#[cfg(not(any(target_os = "ios")))] -fn validate_transfer_file_names(files: &[(String, u64)]) -> ResultType<()> { - if is_single_file_with_empty_name(files) { - // Allow empty name for single file. - // The full path is provided in the `path` parameter for single file transfers. - return Ok(()); - } - - for (name, _) in files { - // In multi-file transfers, empty names are not allowed. - // Each file must have a valid name to construct the destination path. - if name.is_empty() { - bail!("empty file name in multi-file transfer"); - } - validate_file_name_no_traversal(name)?; - } - Ok(()) -} - -/// Start a read job in CM for file transfer from server to client (Windows only). -/// -/// This creates a `TransferJob` using `new_read()`, validates it, and sends the -/// initial file list back to Connection via IPC. -/// -/// NOTE: This is the CM-side equivalent of `create_and_start_read_job()` in -/// `src/server/connection.rs`. On non-Windows platforms, Connection handles -/// read jobs directly. Both use `TransferJob::new_read()` with similar logic. -/// When modifying job creation or validation, ensure both paths stay in sync. -#[cfg(not(any(target_os = "ios")))] -async fn start_read_job( - path: String, - file_num: i32, - include_hidden: bool, - id: i32, - conn_id: i32, - overwrite_detection: bool, - read_jobs: &mut Vec, - tx: &UnboundedSender, -) { - let path_clone = path.clone(); - let result = spawn_blocking(move || -> ResultType { - let data_source = fs::DataSource::FilePath(PathBuf::from(&path)); - fs::TransferJob::new_read( - id, - fs::JobType::Generic, - "".to_string(), - data_source, - file_num, - include_hidden, - true, - overwrite_detection, - ) - }) - .await; - - match result { - Ok(Ok(mut job)) => { - // Optional: enforce file count limit for CM-side jobs to avoid - // excessive I/O. This is applied on the job's file list produced - // by `new_read`, similar to how AllFiles uses the same helper. - if let Err(msg) = check_file_count_limit(job.files().len()) { - if let Err(e) = tx.send(Data::ReadJobInitResult { - id, - file_num, - include_hidden, - conn_id, - result: Err(msg), - }) { - log::error!("error sending ReadJobInitResult via IPC: {}", e); - } - return; - } - - // Build FileDirectory from the job's file list and serialize - let files = job.files().to_owned(); - let mut dir = FileDirectory::new(); - dir.id = id; - dir.path = path_clone.clone(); - dir.entries = files.clone().into(); - - let dir_bytes = match dir.write_to_bytes() { - Ok(bytes) => bytes, - Err(e) => { - if let Err(e) = tx.send(Data::ReadJobInitResult { - id, - file_num, - include_hidden, - conn_id, - result: Err(format!("serialize failed: {}", e)), - }) { - log::error!("error sending ReadJobInitResult via IPC: {}", e); - } - return; - } - }; - - if let Err(e) = tx.send(Data::ReadJobInitResult { - id, - file_num, - include_hidden, - conn_id, - result: Ok(dir_bytes), - }) { - log::error!("error sending ReadJobInitResult via IPC: {}", e); - } - - // Attach connection id so CM can route read blocks back correctly - job.conn_id = conn_id; - read_jobs.push(job); - } - Ok(Err(e)) => { - if let Err(e) = tx.send(Data::ReadJobInitResult { - id, - file_num, - include_hidden, - conn_id, - result: Err(format!("validation failed: {}", e)), - }) { - log::error!("error sending ReadJobInitResult via IPC: {}", e); - } - } - Err(e) => { - if let Err(e) = tx.send(Data::ReadJobInitResult { - id, - file_num, - include_hidden, - conn_id, - result: Err(format!("validation task failed: {}", e)), - }) { - log::error!("error sending ReadJobInitResult via IPC: {}", e); - } - } - } -} - -/// Process read jobs periodically, reading file blocks and sending them via IPC. -/// -/// NOTE: This is the CM-side equivalent of `handle_read_jobs()` in -/// `libs/hbb_common/src/fs.rs`. The logic mirrors that implementation -/// but communicates via IPC instead of direct network stream. -/// When modifying job processing logic, ensure both implementations stay in sync. -#[cfg(not(any(target_os = "ios")))] -async fn handle_read_jobs_tick( - jobs: &mut Vec, - tx: &UnboundedSender, - conn_id: i32, -) -> ResultType<()> { - let mut finished = Vec::new(); - - for job in jobs.iter_mut() { - if job.is_last_job { - continue; - } - - // Initialize data stream if needed (opens file, sends digest for overwrite detection) - if let Err(err) = init_read_job_for_cm(job, tx, conn_id).await { - if let Err(e) = tx.send(Data::FileReadError { - id: job.id, - file_num: job.file_num(), - err: format!("{}", err), - conn_id, - }) { - log::error!("error sending FileReadError via IPC: {}", e); - } - finished.push(job.id); - continue; - } - - // Read a block from the file - match job.read().await { - Err(err) => { - if let Err(e) = tx.send(Data::FileReadError { - id: job.id, - file_num: job.file_num(), - err: format!("{}", err), - conn_id, - }) { - log::error!("error sending FileReadError via IPC: {}", e); - } - // Mark job as finished to prevent infinite retries. - // Connection side will have already removed cm_read_job_ids - // after receiving FileReadError, so continuing would be pointless. - finished.push(job.id); - } - Ok(Some(block)) => { - if let Err(e) = tx.send(Data::FileBlockFromCM { - id: block.id, - file_num: block.file_num, - data: block.data, - compressed: block.compressed, - conn_id, - }) { - log::error!("error sending FileBlockFromCM via IPC: {}", e); - } - } - Ok(None) => { - if job.job_completed() { - finished.push(job.id); - match job.job_error() { - Some(err) => { - if let Err(e) = tx.send(Data::FileReadError { - id: job.id, - file_num: job.file_num(), - err, - conn_id, - }) { - log::error!("error sending FileReadError via IPC: {}", e); - } - } - None => { - if let Err(e) = tx.send(Data::FileReadDone { - id: job.id, - file_num: job.file_num(), - conn_id, - }) { - log::error!("error sending FileReadDone via IPC: {}", e); - } - } - } - } - // else: waiting for confirmation from peer - } - } - // Break to handle jobs one by one. - break; - } - - for id in finished { - let _ = fs::remove_job(id, jobs); - } - - Ok(()) -} - -/// Initialize a read job's data stream and handle digest sending for overwrite detection. -/// -/// NOTE: This is the CM-side equivalent of `TransferJob::init_data_stream()` in -/// `libs/hbb_common/src/fs.rs`. It calls `init_data_stream_for_cm()` and sends -/// digest via IPC instead of direct network stream. -/// When modifying initialization or digest logic, ensure both paths stay in sync. -#[cfg(not(any(target_os = "ios")))] -async fn init_read_job_for_cm( - job: &mut fs::TransferJob, - tx: &UnboundedSender, - conn_id: i32, -) -> ResultType<()> { - // Initialize data stream and get digest info if overwrite detection is needed - match job.init_data_stream_for_cm().await? { - Some((last_modified, file_size)) => { - // Send digest via IPC for overwrite detection - if let Err(e) = tx.send(Data::FileDigestFromCM { - id: job.id, - file_num: job.file_num(), - last_modified, - file_size, - is_resume: job.is_resume, - conn_id, - }) { - log::error!("error sending FileDigestFromCM via IPC: {}", e); - } - } - None => { - // Job done or already initialized, nothing to do - } - } - Ok(()) -} - -#[cfg(not(any(target_os = "ios")))] -async fn read_all_files( - path: String, - include_hidden: bool, - id: i32, - conn_id: i32, - tx: &UnboundedSender, -) { - let path_clone = path.clone(); - let result = spawn_blocking(move || fs::get_recursive_files(&path, include_hidden)).await; - - let result = match result { - Ok(Ok(files)) => { - // Check file count limit to prevent excessive I/O and resource usage - if let Err(msg) = check_file_count_limit(files.len()) { - Err(msg) - } else { - // Serialize FileDirectory to protobuf bytes - let mut fd = FileDirectory::new(); - fd.id = id; - fd.path = path_clone.clone(); - fd.entries = files.into(); - match fd.write_to_bytes() { - Ok(bytes) => Ok(bytes), - Err(e) => Err(format!("serialize failed: {}", e)), - } - } - } - Ok(Err(e)) => Err(format!("{}", e)), - Err(e) => Err(format!("task failed: {}", e)), - }; - - if let Err(e) = tx.send(Data::AllFilesResult { - id, - conn_id, - path: path_clone, - result, - }) { - log::error!("error sending AllFilesResult via IPC: {}", e); - } -} - -#[cfg(not(any(target_os = "ios")))] -async fn read_empty_dirs(dir: &str, include_hidden: bool, tx: &UnboundedSender) { - let path = dir.to_owned(); - let path_clone = dir.to_owned(); - - if let Ok(Ok(fds)) = - spawn_blocking(move || fs::get_empty_dirs_recursive(&path, include_hidden)).await - { - let mut msg_out = Message::new(); - let mut file_response = FileResponse::new(); - file_response.set_empty_dirs(ReadEmptyDirsResponse { - path: path_clone, - empty_dirs: fds, - ..Default::default() - }); - msg_out.set_file_response(file_response); - send_raw(msg_out, tx); - } -} - -#[cfg(not(any(target_os = "ios")))] -async fn read_dir(dir: &str, include_hidden: bool, tx: &UnboundedSender) { - let path = { - if dir.is_empty() { - Config::get_home() - } else { - fs::get_path(dir) - } - }; - if let Ok(Ok(fd)) = spawn_blocking(move || fs::read_dir(&path, include_hidden)).await { - let mut msg_out = Message::new(); - let mut file_response = FileResponse::new(); - file_response.set_dir(fd); - msg_out.set_file_response(file_response); - send_raw(msg_out, tx); - } -} - -#[cfg(not(any(target_os = "ios")))] -async fn handle_result( - res: std::result::Result, S>, - id: i32, - file_num: i32, - tx: &UnboundedSender, -) { - match res { - Err(err) => { - send_raw(fs::new_error(id, err, file_num), tx); - } - Ok(Err(err)) => { - send_raw(fs::new_error(id, err, file_num), tx); - } - Ok(Ok(())) => { - send_raw(fs::new_done(id, file_num), tx); - } - } -} - -#[cfg(not(any(target_os = "ios")))] -async fn remove_file(path: String, id: i32, file_num: i32, tx: &UnboundedSender) { - handle_result( - spawn_blocking(move || fs::remove_file(&path)).await, - id, - file_num, - tx, - ) - .await; -} - -#[cfg(not(any(target_os = "ios")))] -async fn create_dir(path: String, id: i32, tx: &UnboundedSender) { - handle_result( - spawn_blocking(move || fs::create_dir(&path)).await, - id, - 0, - tx, - ) - .await; -} - -#[cfg(not(any(target_os = "ios")))] -async fn rename_file(path: String, new_name: String, id: i32, tx: &UnboundedSender) { - handle_result( - spawn_blocking(move || { - // Rename target must not be empty - if new_name.is_empty() { - bail!("new file name cannot be empty"); - } - // Validate that new_name doesn't contain path traversal - validate_file_name_no_traversal(&new_name)?; - fs::rename_file(&path, &new_name) - }) - .await, - id, - 0, - tx, - ) - .await; -} - -#[cfg(not(any(target_os = "ios")))] -async fn remove_dir(path: String, id: i32, recursive: bool, tx: &UnboundedSender) { - let path = fs::get_path(&path); - handle_result( - spawn_blocking(move || { - if recursive { - fs::remove_all_empty_dir(&path) - } else { - std::fs::remove_dir(&path).map_err(|err| err.into()) - } - }) - .await, - id, - 0, - tx, - ) - .await; -} - -#[cfg(not(any(target_os = "ios")))] -fn send_raw(msg: Message, tx: &UnboundedSender) { - match msg.write_to_bytes() { - Ok(bytes) => { - allow_err!(tx.send(Data::RawMessage(bytes))); - } - err => allow_err!(err), - } -} - -#[cfg(windows)] -fn cm_inner_send(id: i32, data: Data) { - let lock = CLIENTS.read().unwrap(); - if id != 0 { - if let Some(s) = lock.get(&id) { - allow_err!(s.tx.send(data)); - } - } else { - for s in lock.values() { - allow_err!(s.tx.send(data.clone())); - } - } -} - -pub fn can_elevate() -> bool { - #[cfg(windows)] - return !crate::platform::is_installed(); - #[cfg(not(windows))] - return false; -} - -pub fn elevate_portable(_id: i32) { - #[cfg(windows)] - { - let lock = CLIENTS.read().unwrap(); - if let Some(s) = lock.get(&_id) { - allow_err!(s.tx.send(ipc::Data::DataPortableService( - ipc::DataPortableService::RequestStart - ))); - } - } -} - -#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] -#[inline] -pub fn handle_incoming_voice_call(id: i32, accept: bool) { - if let Some(client) = CLIENTS.read().unwrap().get(&id) { - // Not handled in iOS yet. - #[cfg(not(any(target_os = "ios")))] - allow_err!(client.tx.send(Data::VoiceCallResponse(accept))); - }; -} - -#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] -#[inline] -pub fn close_voice_call(id: i32) { - if let Some(client) = CLIENTS.read().unwrap().get(&id) { - // Not handled in iOS yet. - #[cfg(not(any(target_os = "ios")))] - allow_err!(client.tx.send(Data::CloseVoiceCall("".to_owned()))); - }; -} - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub fn quit_cm() { - // in case of std::process::exit not work - log::info!("quit cm"); - CLIENTS.write().unwrap().clear(); - crate::platform::quit_gui(); -} - -#[cfg(test)] -mod tests { - use super::*; - - use crate::ipc::Data; - use hbb_common::{ - message_proto::{FileDirectory, Message}, - tokio::{runtime::Runtime, sync::mpsc::unbounded_channel}, - }; - use std::fs; - - #[test] - #[cfg(not(any(target_os = "ios")))] - fn read_all_files_success() { - let rt = Runtime::new().unwrap(); - rt.block_on(async { - let (tx, mut rx) = unbounded_channel(); - let dir = std::env::temp_dir().join("rustdesk_read_all_test"); - let _ = fs::remove_dir_all(&dir); - fs::create_dir_all(&dir).unwrap(); - fs::write(dir.join("test.txt"), b"hello").unwrap(); - - let path_str = dir.to_string_lossy().to_string(); - super::read_all_files(path_str.clone(), false, 1, 2, &tx).await; - - match rx.recv().await.unwrap() { - Data::AllFilesResult { result, .. } => { - let bytes = result.unwrap(); - let fd = FileDirectory::parse_from_bytes(&bytes).unwrap(); - assert!(!fd.entries.is_empty()); - } - _ => panic!("unexpected data"), - } - let _ = fs::remove_dir_all(&dir); - }); - } - - #[test] - #[cfg(not(any(target_os = "ios")))] - fn read_dir_success() { - let rt = Runtime::new().unwrap(); - rt.block_on(async { - let (tx, mut rx) = unbounded_channel(); - let dir = std::env::temp_dir().join("rustdesk_read_dir_test"); - let _ = fs::remove_dir_all(&dir); - fs::create_dir_all(&dir).unwrap(); - - super::read_dir(&dir.to_string_lossy(), false, &tx).await; - - match rx.recv().await.unwrap() { - Data::RawMessage(bytes) => { - let mut msg = Message::new(); - msg.merge_from_bytes(&bytes).unwrap(); - assert!(msg - .file_response() - .dir() - .path - .contains("rustdesk_read_dir_test")); - } - _ => panic!("unexpected data"), - } - let _ = fs::remove_dir_all(&dir); - }); - } - - #[test] - #[cfg(not(any(target_os = "ios")))] - fn validate_file_name_security() { - // Null byte injection - assert!(super::validate_file_name_no_traversal("file\0.txt").is_err()); - assert!(super::validate_file_name_no_traversal("test\0").is_err()); - - // Path traversal - assert!(super::validate_file_name_no_traversal("../etc/passwd").is_err()); - assert!(super::validate_file_name_no_traversal("foo/../bar").is_err()); - assert!(super::validate_file_name_no_traversal("..").is_err()); - - // Absolute paths - assert!(super::validate_file_name_no_traversal("/etc/passwd").is_err()); - assert!(super::validate_file_name_no_traversal("\\Windows").is_err()); - #[cfg(windows)] - assert!(super::validate_file_name_no_traversal("C:\\Windows").is_err()); - - // Valid paths - assert!(super::validate_file_name_no_traversal("file.txt").is_ok()); - assert!(super::validate_file_name_no_traversal("subdir/file.txt").is_ok()); - assert!(super::validate_file_name_no_traversal("").is_ok()); - } - - #[test] - #[cfg(not(any(target_os = "ios")))] - fn validate_transfer_file_names_security() { - assert!(super::validate_transfer_file_names(&[("file.txt".into(), 100)]).is_ok()); - assert!(super::validate_transfer_file_names(&[("".into(), 100)]).is_ok()); - assert!( - super::validate_transfer_file_names(&[("".into(), 100), ("file.txt".into(), 100)]) - .is_err() - ); - assert!(super::validate_transfer_file_names(&[("../passwd".into(), 100)]).is_err()); - } - - /// Tests that symlink creation works on this platform. - /// This is a helper to verify the test environment supports symlinks. - #[test] - #[cfg(not(any(target_os = "ios")))] - fn test_symlink_creation_works() { - let base_dir = std::env::temp_dir().join("rustdesk_symlink_test"); - let _ = fs::remove_dir_all(&base_dir); - fs::create_dir_all(&base_dir).unwrap(); - - // Create target file in a subdirectory - let target_dir = base_dir.join("target_dir"); - fs::create_dir_all(&target_dir).unwrap(); - let target_file = target_dir.join("target.txt"); - fs::write(&target_file, b"content").unwrap(); - - // Create symlink in a different directory - let link_dir = base_dir.join("link_dir"); - fs::create_dir_all(&link_dir).unwrap(); - let link_path = link_dir.join("link.txt"); - - #[cfg(unix)] - { - use std::os::unix::fs::symlink; - if symlink(&target_file, &link_path).is_err() { - let _ = fs::remove_dir_all(&base_dir); - return; - } - } - - #[cfg(windows)] - { - use std::os::windows::fs::symlink_file; - if symlink_file(&target_file, &link_path).is_err() { - // Skip if no permission (needs admin or dev mode on Windows) - let _ = fs::remove_dir_all(&base_dir); - return; - } - } - - let _ = fs::remove_dir_all(&base_dir); - } -} diff --git a/shelled/rustdesk-as-ref/src/ui_interface.rs b/shelled/rustdesk-as-ref/src/ui_interface.rs deleted file mode 100644 index 1645b24..0000000 --- a/shelled/rustdesk-as-ref/src/ui_interface.rs +++ /dev/null @@ -1,1611 +0,0 @@ -#[cfg(any(target_os = "android", target_os = "ios"))] -use hbb_common::password_security; -use hbb_common::{ - allow_err, - bytes::Bytes, - config::{self, keys::*, Config, LocalConfig, PeerConfig, CONNECT_TIMEOUT, RENDEZVOUS_PORT}, - directories_next, - futures::future::join_all, - log, - rendezvous_proto::*, - tokio, -}; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -use hbb_common::{ - sleep, - tokio::{sync::mpsc, time}, -}; -use serde_derive::Serialize; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -use std::process::Child; -use std::{ - collections::HashMap, - sync::{Arc, Mutex}, -}; - -use crate::common::SOFTWARE_UPDATE_URL; -#[cfg(feature = "flutter")] -use crate::hbbs_http::account; -#[cfg(not(any(target_os = "ios")))] -use crate::ipc; - -type Message = RendezvousMessage; - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub type Children = Arc)>>; - -#[derive(Clone, Debug, Serialize)] -pub struct UiStatus { - pub status_num: i32, - #[cfg(not(feature = "flutter"))] - pub key_confirmed: bool, - #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub mouse_time: i64, - #[cfg(not(feature = "flutter"))] - pub id: String, - #[cfg(feature = "flutter")] - pub video_conn_count: usize, -} - -#[derive(Debug, Clone, Serialize)] -pub struct LoginDeviceInfo { - pub os: String, - pub r#type: String, - pub name: String, -} - -lazy_static::lazy_static! { - static ref UI_STATUS : Arc> = Arc::new(Mutex::new(UiStatus{ - status_num: 0, - #[cfg(not(feature = "flutter"))] - key_confirmed: false, - #[cfg(not(any(target_os = "android", target_os = "ios")))] - mouse_time: 0, - #[cfg(not(feature = "flutter"))] - id: "".to_owned(), - #[cfg(feature = "flutter")] - video_conn_count: 0, - })); - static ref ASYNC_JOB_STATUS : Arc> = Default::default(); - static ref ASYNC_HTTP_STATUS : Arc>> = Arc::new(Mutex::new(HashMap::new())); - static ref TEMPORARY_PASSWD : Arc> = Arc::new(Mutex::new("".to_owned())); - static ref IS_REMOTE_MODIFY_ENABLED_BY_CONTROL_PERMISSIONS : Arc>> = Arc::new(Mutex::new(None)); -} - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -lazy_static::lazy_static! { - static ref OPTION_SYNCED: Arc> = Default::default(); - static ref OPTIONS : Arc>> = Arc::new(Mutex::new(Config::get_options())); - pub static ref SENDER : Mutex> = Mutex::new(check_connect_status(true)); - static ref CHILDREN : Children = Default::default(); -} - -#[cfg(target_os = "windows")] -lazy_static::lazy_static! { - pub static ref IS_FILE_TRANSFER_ENABLED: Arc>> = Arc::new(Mutex::new(None)); -} - -const INIT_ASYNC_JOB_STATUS: &str = " "; - -#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] -#[inline] -pub fn get_id() -> String { - #[cfg(any(target_os = "android", target_os = "ios"))] - return Config::get_id(); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - return ipc::get_id(); -} - -#[inline] -pub fn goto_install() { - allow_err!(crate::run_me(vec!["--install"])); - std::process::exit(0); -} - -#[inline] -pub fn install_me(_options: String, _path: String, _silent: bool, _debug: bool) { - #[cfg(windows)] - std::thread::spawn(move || { - allow_err!(crate::platform::windows::install_me( - &_options, _path, _silent, _debug - )); - std::process::exit(0); - }); -} - -#[inline] -pub fn update_me(_path: String) { - goto_install(); -} - -#[inline] -pub fn run_without_install() { - crate::run_me(vec!["--noinstall"]).ok(); - std::process::exit(0); -} - -#[inline] -pub fn show_run_without_install() -> bool { - let mut it = std::env::args(); - if let Some(tmp) = it.next() { - if crate::is_setup(&tmp) { - return it.next() == None; - } - } - false -} - -#[inline] -pub fn get_license() -> String { - #[cfg(windows)] - if let Ok(lic) = crate::platform::windows::get_license_from_exe_name() { - #[cfg(feature = "flutter")] - return format!("Key: {}\nHost: {}\nAPI: {}", lic.key, lic.host, lic.api); - // default license format is html formed (sciter) - #[cfg(not(feature = "flutter"))] - return format!( - "
    Key: {}
    Host: {} API: {}", - lic.key, lic.host, lic.api - ); - } - Default::default() -} - -#[inline] -pub fn refresh_options() { - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - *OPTIONS.lock().unwrap() = Config::get_options(); - } -} - -#[inline] -pub fn get_option>(key: T) -> String { - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - let map = OPTIONS.lock().unwrap(); - if let Some(v) = map.get(key.as_ref()) { - v.to_owned() - } else { - "".to_owned() - } - } - #[cfg(any(target_os = "android", target_os = "ios"))] - { - Config::get_option(key.as_ref()) - } -} - -#[inline] -pub fn use_texture_render() -> bool { - #[cfg(target_os = "android")] - return false; - #[cfg(target_os = "ios")] - return false; - - #[cfg(target_os = "macos")] - return cfg!(feature = "flutter") - && LocalConfig::get_option(config::keys::OPTION_TEXTURE_RENDER) == "Y"; - - #[cfg(target_os = "linux")] - return cfg!(feature = "flutter") - && LocalConfig::get_option(config::keys::OPTION_TEXTURE_RENDER) != "N"; - - #[cfg(target_os = "windows")] - { - if !cfg!(feature = "flutter") { - return false; - } - // https://learn.microsoft.com/en-us/windows/win32/sysinfo/targeting-your-application-at-windows-8-1 - #[cfg(debug_assertions)] - let default_texture = true; - #[cfg(not(debug_assertions))] - let default_texture = crate::platform::is_win_10_or_greater(); - if default_texture { - LocalConfig::get_option(config::keys::OPTION_TEXTURE_RENDER) != "N" - } else { - return LocalConfig::get_option(config::keys::OPTION_TEXTURE_RENDER) == "Y"; - } - } -} - -#[inline] -pub fn is_option_fixed(key: &str) -> bool { - config::OVERWRITE_DISPLAY_SETTINGS - .read() - .unwrap() - .contains_key(key) - || config::OVERWRITE_LOCAL_SETTINGS - .read() - .unwrap() - .contains_key(key) - || config::OVERWRITE_SETTINGS.read().unwrap().contains_key(key) -} - -#[inline] -pub fn get_local_option(key: String) -> String { - crate::get_local_option(&key) -} - -#[inline] -#[cfg(feature = "flutter")] -pub fn get_hard_option(key: String) -> String { - config::HARD_SETTINGS - .read() - .unwrap() - .get(&key) - .cloned() - .unwrap_or_default() -} - -#[inline] -pub fn get_builtin_option(key: &str) -> String { - crate::get_builtin_option(key) -} - -#[inline] -pub fn set_local_option(key: String, value: String) { - LocalConfig::set_option(key.clone(), value); -} - -/// Resolve relative avatar path (e.g. "/avatar/xxx") to absolute URL -/// by prepending the API server address. -pub fn resolve_avatar_url(avatar: String) -> String { - let avatar = avatar.trim().to_owned(); - if avatar.starts_with('/') { - let api_server = get_api_server(); - if !api_server.is_empty() { - return format!("{}{}", api_server.trim_end_matches('/'), avatar); - } - } - avatar -} - -#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] -#[inline] -pub fn get_local_flutter_option(key: String) -> String { - LocalConfig::get_flutter_option(&key) -} - -#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] -#[inline] -pub fn set_local_flutter_option(key: String, value: String) { - LocalConfig::set_flutter_option(key, value); -} - -#[cfg(feature = "flutter")] -#[inline] -pub fn get_kb_layout_type() -> String { - LocalConfig::get_kb_layout_type() -} - -#[cfg(feature = "flutter")] -#[inline] -pub fn set_kb_layout_type(kb_layout_type: String) { - LocalConfig::set_kb_layout_type(kb_layout_type); -} - -#[inline] -pub fn peer_has_password(id: String) -> bool { - !PeerConfig::load(&id).password.is_empty() -} - -#[inline] -pub fn forget_password(id: String) { - let mut c = PeerConfig::load(&id); - c.password.clear(); - c.store(&id); -} - -#[inline] -pub fn get_peer_option(id: String, name: String) -> String { - let c = PeerConfig::load(&id); - c.options.get(&name).unwrap_or(&"".to_owned()).to_owned() -} - -#[inline] -#[cfg(feature = "flutter")] -pub fn get_peer_flutter_option(id: String, name: String) -> String { - let c = PeerConfig::load(&id); - c.ui_flutter.get(&name).unwrap_or(&"".to_owned()).to_owned() -} - -#[inline] -#[cfg(feature = "flutter")] -pub fn set_peer_flutter_option(id: String, name: String, value: String) { - let mut c = PeerConfig::load(&id); - if value.is_empty() { - c.ui_flutter.remove(&name); - } else { - c.ui_flutter.insert(name, value); - } - c.store(&id); -} - -#[inline] -pub fn set_peer_option(id: String, name: String, value: String) { - let mut c = PeerConfig::load(&id); - if value.is_empty() { - c.options.remove(&name); - } else { - c.options.insert(name, value); - } - c.store(&id); -} - -#[inline] -pub fn get_options() -> String { - let options = { - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - OPTIONS.lock().unwrap() - } - #[cfg(any(target_os = "android", target_os = "ios"))] - { - Config::get_options() - } - }; - let mut m = serde_json::Map::new(); - for (k, v) in options.iter() { - m.insert(k.into(), v.to_owned().into()); - } - serde_json::to_string(&m).unwrap_or_default() -} - -#[inline] -pub fn test_if_valid_server(host: String, test_with_proxy: bool) -> String { - hbb_common::socket_client::test_if_valid_server(&host, test_with_proxy) -} - -#[inline] -#[cfg(feature = "flutter")] -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub fn get_sound_inputs() -> Vec { - let mut a = Vec::new(); - #[cfg(not(target_os = "linux"))] - { - fn get_sound_inputs_() -> Vec { - let mut out = Vec::new(); - use cpal::traits::{DeviceTrait, HostTrait}; - // Do not use `cpal::host_from_id(cpal::HostId::ScreenCaptureKit)` for feature = "screencapturekit" - // Because we explicitly handle the "System Sound" device. - let host = cpal::default_host(); - if let Ok(devices) = host.devices() { - for device in devices { - if device.default_input_config().is_err() { - continue; - } - if let Ok(name) = device.name() { - out.push(name); - } - } - } - out - } - - let inputs = Arc::new(Mutex::new(Vec::new())); - let cloned = inputs.clone(); - // can not call below in UI thread, because conflict with sciter sound com initialization - std::thread::spawn(move || *cloned.lock().unwrap() = get_sound_inputs_()) - .join() - .ok(); - for name in inputs.lock().unwrap().drain(..) { - a.push(name); - } - } - #[cfg(target_os = "linux")] - { - let inputs: Vec = crate::platform::linux::get_pa_sources() - .drain(..) - .map(|x| x.1) - .collect(); - - for name in inputs { - a.push(name); - } - } - a -} - -#[inline] -pub fn set_options(m: HashMap) { - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - *OPTIONS.lock().unwrap() = m.clone(); - ipc::set_options(m).ok(); - } - #[cfg(any(target_os = "android", target_os = "ios"))] - Config::set_options(m); -} - -#[inline] -pub fn set_option(key: String, value: String) { - if &key == "stop-service" { - #[cfg(target_os = "macos")] - { - let is_stop = value == "Y"; - if is_stop && crate::platform::uninstall_service(true, false) { - return; - } - } - #[cfg(any(target_os = "windows", target_os = "linux"))] - { - if crate::platform::is_installed() { - if value == "Y" { - if crate::platform::uninstall_service(true, false) { - return; - } - } else { - if crate::platform::install_service() { - return; - } - } - return; - } - } - } else if &key == "audio-input" { - #[cfg(not(target_os = "ios"))] - crate::audio_service::restart(); - } - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - let mut options = OPTIONS.lock().unwrap(); - if value.is_empty() { - options.remove(&key); - } else { - options.insert(key.clone(), value.clone()); - } - ipc::set_options(options.clone()).ok(); - } - #[cfg(any(target_os = "android", target_os = "ios"))] - { - let _nat = crate::CheckTestNatType::new(); - Config::set_option(key, value); - } -} - -#[inline] -pub fn install_path() -> String { - #[cfg(windows)] - return crate::platform::windows::get_install_info().1; - #[cfg(not(windows))] - return "".to_owned(); -} - -#[inline] -pub fn install_options() -> String { - #[cfg(windows)] - return crate::platform::windows::get_install_options(); - #[cfg(not(windows))] - return "{}".to_owned(); -} - -#[inline] -pub fn get_socks() -> Vec { - #[cfg(not(any(target_os = "android", target_os = "ios")))] - let s = ipc::get_socks(); - #[cfg(any(target_os = "android", target_os = "ios"))] - let s = Config::get_socks(); - match s { - None => Vec::new(), - Some(s) => { - let mut v = Vec::new(); - v.push(s.proxy); - v.push(s.username); - v.push(s.password); - v - } - } -} - -#[inline] -pub fn set_socks(proxy: String, username: String, password: String) { - let socks = config::Socks5Server { - proxy, - username, - password, - }; - #[cfg(not(any(target_os = "android", target_os = "ios")))] - ipc::set_socks(socks).ok(); - #[cfg(any(target_os = "android", target_os = "ios"))] - { - let _nat = crate::CheckTestNatType::new(); - if socks.proxy.is_empty() { - Config::set_socks(None); - } else { - Config::set_socks(Some(socks)); - } - log::info!("socks updated"); - } - #[cfg(target_os = "android")] - { - crate::RendezvousMediator::restart(); - } -} - -#[inline] -#[cfg(feature = "flutter")] -pub fn get_proxy_status() -> bool { - #[cfg(not(any(target_os = "android", target_os = "ios")))] - return ipc::get_proxy_status(); - - // Currently, only the desktop version has proxy settings. - #[cfg(any(target_os = "android", target_os = "ios"))] - return false; -} - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -#[inline] -pub fn is_installed() -> bool { - crate::platform::is_installed() -} - -#[cfg(any(target_os = "android", target_os = "ios"))] -#[inline] -pub fn is_installed() -> bool { - false -} - -#[inline] -pub fn is_share_rdp() -> bool { - #[cfg(windows)] - return crate::platform::windows::is_share_rdp(); - #[cfg(not(windows))] - return false; -} - -#[inline] -pub fn set_share_rdp(_enable: bool) { - #[cfg(windows)] - crate::platform::windows::set_share_rdp(_enable); -} - -#[inline] -pub fn is_installed_lower_version() -> bool { - #[cfg(not(windows))] - return false; - #[cfg(windows)] - { - let b = crate::platform::windows::get_reg("BuildDate"); - return crate::BUILD_DATE.cmp(&b).is_gt(); - } -} - -#[inline] -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub fn get_mouse_time() -> f64 { - UI_STATUS.lock().unwrap().mouse_time as f64 -} - -#[inline] -pub fn check_mouse_time() { - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - let sender = SENDER.lock().unwrap(); - allow_err!(sender.send(ipc::Data::MouseMoveTime(0))); - } -} - -#[inline] -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub fn get_connect_status() -> UiStatus { - UI_STATUS.lock().unwrap().clone() -} - -#[inline] -pub fn temporary_password() -> String { - #[cfg(any(target_os = "android", target_os = "ios"))] - return password_security::temporary_password(); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - return TEMPORARY_PASSWD.lock().unwrap().clone(); -} - -#[inline] -pub fn update_temporary_password() { - #[cfg(any(target_os = "android", target_os = "ios"))] - password_security::update_temporary_password(); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - allow_err!(ipc::update_temporary_password()); -} - -#[inline] -pub fn is_permanent_password_set() -> bool { - #[cfg(any(target_os = "android", target_os = "ios"))] - return Config::has_permanent_password(); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - let daemon_is_set = ipc::is_permanent_password_set(); - // `daemon_is_set` is authoritative for the return value. Local storage is only used to - // decide whether we should attempt a sync to clear stale user-side state. - let local_storage_is_empty = if daemon_is_set { - true - } else { - let (storage, _) = Config::get_local_permanent_password_storage_and_salt(); - storage.is_empty() - }; - if daemon_is_set || !local_storage_is_empty { - allow_err!(ipc::sync_permanent_password_storage_from_daemon()); - } - daemon_is_set - } -} - -#[inline] -pub fn is_local_permanent_password_set() -> bool { - #[cfg(any(target_os = "android", target_os = "ios"))] - return Config::has_local_permanent_password(); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - allow_err!(ipc::sync_permanent_password_storage_from_daemon()); - Config::has_local_permanent_password() - } -} - -pub fn set_permanent_password_with_result(password: String) -> bool { - if config::Config::is_disable_change_permanent_password() { - return false; - } - #[cfg(any(target_os = "android", target_os = "ios"))] - { - config::Config::set_permanent_password(&password); - return true; - } - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - match crate::ipc::set_permanent_password_with_ack(password) { - Ok(ok) => ok, - Err(err) => { - log::warn!("Failed to set permanent password via IPC: {err}"); - false - } - } - } -} - -#[inline] -pub fn get_peer(id: String) -> PeerConfig { - PeerConfig::load(&id) -} - -#[inline] -pub fn get_fav() -> Vec { - LocalConfig::get_fav() -} - -#[inline] -pub fn store_fav(fav: Vec) { - LocalConfig::set_fav(fav); -} - -#[inline] -pub fn is_process_trusted(_prompt: bool) -> bool { - #[cfg(target_os = "macos")] - return crate::platform::macos::is_process_trusted(_prompt); - #[cfg(not(target_os = "macos"))] - return true; -} - -#[inline] -pub fn is_can_screen_recording(_prompt: bool) -> bool { - #[cfg(target_os = "macos")] - return crate::platform::macos::is_can_screen_recording(_prompt); - #[cfg(not(target_os = "macos"))] - return true; -} - -#[inline] -pub fn is_installed_daemon(_prompt: bool) -> bool { - #[cfg(target_os = "macos")] - return crate::platform::macos::is_installed_daemon(_prompt); - #[cfg(not(target_os = "macos"))] - return true; -} - -#[inline] -#[cfg(feature = "flutter")] -pub fn is_can_input_monitoring(_prompt: bool) -> bool { - #[cfg(target_os = "macos")] - return crate::platform::macos::is_can_input_monitoring(_prompt); - #[cfg(not(target_os = "macos"))] - return true; -} - -#[inline] -pub fn get_error() -> String { - #[cfg(not(any(feature = "cli")))] - #[cfg(target_os = "linux")] - { - let dtype = crate::platform::linux::get_display_server(); - if crate::platform::linux::DISPLAY_SERVER_WAYLAND == dtype { - return crate::server::wayland::common_get_error(); - } - if dtype != crate::platform::linux::DISPLAY_SERVER_X11 { - return format!( - "{} {}, {}", - crate::client::translate("Unsupported display server".to_owned()), - dtype, - crate::client::translate("x11 expected".to_owned()), - ); - } - } - return "".to_owned(); -} - -#[inline] -pub fn is_login_wayland() -> bool { - #[cfg(target_os = "linux")] - return crate::platform::linux::is_login_wayland(); - #[cfg(not(target_os = "linux"))] - return false; -} - -#[inline] -pub fn current_is_wayland() -> bool { - #[cfg(target_os = "linux")] - return crate::platform::linux::current_is_wayland(); - #[cfg(not(target_os = "linux"))] - return false; -} - -#[inline] -pub fn get_new_version() -> String { - (*SOFTWARE_UPDATE_URL - .lock() - .unwrap() - .rsplit('/') - .next() - .unwrap_or("")) - .to_string() -} - -#[inline] -pub fn get_version() -> String { - crate::VERSION.to_owned() -} - -#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] -#[inline] -pub fn get_app_name() -> String { - crate::get_app_name() -} - -#[cfg(windows)] -#[inline] -pub fn create_shortcut(_id: String) { - crate::platform::windows::create_shortcut(&_id).ok(); -} - -#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] -#[inline] -pub fn discover() { - std::thread::spawn(move || { - allow_err!(crate::lan::discover()); - }); -} - -#[cfg(feature = "flutter")] -pub fn peer_to_map(id: String, p: PeerConfig) -> HashMap<&'static str, String> { - use hbb_common::sodiumoxide::base64; - HashMap::<&str, String>::from_iter([ - ("id", id), - ("username", p.info.username.clone()), - ("hostname", p.info.hostname.clone()), - ("platform", p.info.platform.clone()), - ( - "alias", - p.options.get("alias").unwrap_or(&"".to_owned()).to_owned(), - ), - ( - "hash", - base64::encode(p.password, base64::Variant::Original), - ), - ]) -} - -#[cfg(feature = "flutter")] -pub fn peer_exists(id: &str) -> bool { - PeerConfig::exists(id) -} - -#[inline] -pub fn get_lan_peers() -> Vec> { - config::LanPeers::load() - .peers - .iter() - .map(|peer| { - HashMap::<&str, String>::from_iter([ - ("id", peer.id.clone()), - ("username", peer.username.clone()), - ("hostname", peer.hostname.clone()), - ("platform", peer.platform.clone()), - ]) - }) - .collect() -} - -#[inline] -pub fn remove_discovered(id: String) { - let mut peers = config::LanPeers::load().peers; - peers.retain(|x| x.id != id); - config::LanPeers::store(&peers); -} - -#[inline] -pub fn get_uuid() -> String { - crate::encode64(hbb_common::get_uuid()) -} - -#[inline] -pub fn get_init_async_job_status() -> String { - INIT_ASYNC_JOB_STATUS.to_string() -} - -#[inline] -pub fn reset_async_job_status() { - *ASYNC_JOB_STATUS.lock().unwrap() = get_init_async_job_status(); -} - -#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] -#[inline] -pub fn change_id(id: String) { - reset_async_job_status(); - let old_id = get_id(); - std::thread::spawn(move || { - change_id_shared(id, old_id); - }); -} - -#[inline] -pub fn http_request(url: String, method: String, body: Option, header: String) { - // Respond to concurrent requests for resources - let current_request = ASYNC_HTTP_STATUS.clone(); - current_request - .lock() - .unwrap() - .insert(url.clone(), " ".to_owned()); - std::thread::spawn(move || { - let res = match crate::http_request_sync(url.clone(), method, body, header) { - Err(err) => { - log::error!("{}", err); - err.to_string() - } - Ok(text) => text, - }; - current_request.lock().unwrap().insert(url, res); - }); -} - -#[inline] -pub fn get_async_http_status(url: String) -> Option { - match ASYNC_HTTP_STATUS.lock().unwrap().get(&url) { - None => None, - Some(_str) => Some(_str.to_string()), - } -} - -#[inline] -#[cfg(not(feature = "flutter"))] -pub fn post_request(url: String, body: String, header: String) { - *ASYNC_JOB_STATUS.lock().unwrap() = " ".to_owned(); - std::thread::spawn(move || { - *ASYNC_JOB_STATUS.lock().unwrap() = match crate::post_request_sync(url, body, &header) { - Err(err) => err.to_string(), - Ok(text) => text, - }; - }); -} - -#[inline] -pub fn get_async_job_status() -> String { - ASYNC_JOB_STATUS.lock().unwrap().clone() -} - -#[inline] -pub fn get_langs() -> String { - use serde_json::json; - let mut x: Vec<(&str, String)> = crate::lang::LANGS - .iter() - .map(|a| (a.0, format!("{} ({})", a.1, a.0))) - .collect(); - x.sort_by(|a, b| a.0.cmp(b.0)); - json!(x).to_string() -} - -#[inline] -pub fn video_save_directory(root: bool) -> String { - let appname = crate::get_app_name(); - // ui process can show it correctly Once vidoe process created it. - let try_create = |path: &std::path::Path| { - if !path.exists() { - std::fs::create_dir_all(path).ok(); - } - if path.exists() { - path.to_string_lossy().to_string() - } else { - "".to_string() - } - }; - - if root { - // Currently, only installed windows run as root - #[cfg(windows)] - { - let drive = std::env::var("SystemDrive").unwrap_or("C:".to_owned()); - let dir = - std::path::PathBuf::from(format!("{drive}\\ProgramData\\{appname}\\recording",)); - return dir.to_string_lossy().to_string(); - } - } - // Get directory from config file otherwise --server will use the old value from global var. - #[cfg(any(target_os = "linux", target_os = "macos"))] - let dir = LocalConfig::get_option_from_file(OPTION_VIDEO_SAVE_DIRECTORY); - #[cfg(not(any(target_os = "linux", target_os = "macos")))] - let dir = LocalConfig::get_option(OPTION_VIDEO_SAVE_DIRECTORY); - if !dir.is_empty() { - return dir; - } - #[cfg(any(target_os = "android", target_os = "ios"))] - if let Ok(home) = config::APP_HOME_DIR.read() { - let mut path = home.to_owned(); - path.push_str(format!("/{appname}/ScreenRecord").as_str()); - let dir = try_create(&std::path::Path::new(&path)); - if !dir.is_empty() { - return dir; - } - } - - if let Some(user) = directories_next::UserDirs::new() { - if let Some(video_dir) = user.video_dir() { - let dir = try_create(&video_dir.join(&appname)); - if !dir.is_empty() { - return dir; - } - if video_dir.exists() { - return video_dir.to_string_lossy().to_string(); - } - } - if let Some(desktop_dir) = user.desktop_dir() { - if desktop_dir.exists() { - return desktop_dir.to_string_lossy().to_string(); - } - } - let home = user.home_dir(); - if home.exists() { - return home.to_string_lossy().to_string(); - } - } - - // same order as above - #[cfg(not(any(target_os = "android", target_os = "ios")))] - if let Some(home) = crate::platform::get_active_user_home() { - let name = if cfg!(target_os = "macos") { - "Movies" - } else { - "Videos" - }; - let video_dir = home.join(name); - let dir = try_create(&video_dir.join(&appname)); - if !dir.is_empty() { - return dir; - } - if video_dir.exists() { - return video_dir.to_string_lossy().to_string(); - } - let desktop_dir = home.join("Desktop"); - if desktop_dir.exists() { - return desktop_dir.to_string_lossy().to_string(); - } - if home.exists() { - return home.to_string_lossy().to_string(); - } - } - - if let Ok(exe) = std::env::current_exe() { - if let Some(parent) = exe.parent() { - let dir = try_create(&parent.join("videos")); - if !dir.is_empty() { - return dir; - } - // basically exist - return parent.to_string_lossy().to_string(); - } - } - Default::default() -} - -#[inline] -pub fn get_api_server() -> String { - crate::get_api_server( - get_option("api-server"), - get_option("custom-rendezvous-server"), - ) -} - -#[inline] -pub fn has_hwcodec() -> bool { - // Has real hardware codec using gpu - (cfg!(feature = "hwcodec") && cfg!(not(target_os = "ios"))) || cfg!(feature = "mediacodec") -} - -#[inline] -pub fn has_vram() -> bool { - cfg!(feature = "vram") -} - -#[cfg(feature = "flutter")] -#[inline] -pub fn supported_hwdecodings() -> (bool, bool) { - let decoding = - scrap::codec::Decoder::supported_decodings(None, use_texture_render(), None, &vec![]); - #[allow(unused_mut)] - let (mut h264, mut h265) = (decoding.ability_h264 > 0, decoding.ability_h265 > 0); - #[cfg(feature = "vram")] - { - // supported_decodings check runtime luid - let vram = scrap::vram::VRamDecoder::possible_available_without_check(); - if vram.0 { - h264 = true; - } - if vram.1 { - h265 = true; - } - } - (h264, h265) -} - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -#[inline] -pub fn is_root() -> bool { - crate::platform::is_root() -} - -#[cfg(any(target_os = "android", target_os = "ios"))] -#[inline] -pub fn is_root() -> bool { - false -} - -#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))] -#[inline] -pub fn check_super_user_permission() -> bool { - #[cfg(any(windows, target_os = "linux", target_os = "macos"))] - return crate::platform::check_super_user_permission().unwrap_or(false); - #[cfg(not(any(windows, target_os = "linux", target_os = "macos")))] - return true; -} - -#[cfg(not(any(target_os = "android", target_os = "ios", feature = "flutter")))] -pub fn check_zombie() { - let mut deads = Vec::new(); - loop { - let mut lock = CHILDREN.lock().unwrap(); - let mut n = 0; - for (id, c) in lock.1.iter_mut() { - if let Ok(Some(_)) = c.try_wait() { - deads.push(id.clone()); - n += 1; - } - } - for ref id in deads.drain(..) { - lock.1.remove(id); - } - if n > 0 { - lock.0 = true; - } - drop(lock); - std::thread::sleep(std::time::Duration::from_millis(100)); - } -} - -#[inline] -#[cfg(not(any(target_os = "android", target_os = "ios", feature = "flutter")))] -pub fn recent_sessions_updated() -> bool { - let mut children = CHILDREN.lock().unwrap(); - if children.0 { - children.0 = false; - true - } else { - false - } -} - -#[cfg(not(any(target_os = "android", target_os = "ios", feature = "flutter")))] -pub fn new_remote(id: String, remote_type: String, force_relay: bool) { - let mut lock = CHILDREN.lock().unwrap(); - let mut args = vec![format!("--{}", remote_type), id.clone()]; - if force_relay { - args.push("".to_string()); // password - args.push("--relay".to_string()); - } - let key = (id.clone(), remote_type.clone()); - if let Some(c) = lock.1.get_mut(&key) { - if let Ok(Some(_)) = c.try_wait() { - lock.1.remove(&key); - } else { - if remote_type == "rdp" { - allow_err!(c.kill()); - std::thread::sleep(std::time::Duration::from_millis(30)); - c.try_wait().ok(); - lock.1.remove(&key); - } else { - return; - } - } - } - match crate::run_me(args) { - Ok(child) => { - lock.1.insert(key, child); - } - Err(err) => { - log::error!("Failed to spawn remote: {}", err); - } - } -} - -// Make sure `SENDER` is inited here. -#[inline] -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub fn start_option_status_sync() { - let _sender = SENDER.lock().unwrap(); -} - -// not call directly -#[cfg(not(any(target_os = "android", target_os = "ios")))] -fn check_connect_status(reconnect: bool) -> mpsc::UnboundedSender { - let (tx, rx) = mpsc::unbounded_channel::(); - std::thread::spawn(move || check_connect_status_(reconnect, rx)); - tx -} - -#[cfg(feature = "flutter")] -pub fn account_auth(op: String, id: String, uuid: String, remember_me: bool) { - account::OidcSession::account_auth(get_api_server(), op, id, uuid, remember_me); -} - -#[cfg(feature = "flutter")] -pub fn account_auth_cancel() { - account::OidcSession::auth_cancel(); -} - -#[cfg(feature = "flutter")] -pub fn account_auth_result() -> String { - serde_json::to_string(&account::OidcSession::get_result()).unwrap_or_default() -} - -#[cfg(feature = "flutter")] -pub fn set_user_default_option(key: String, value: String) { - use hbb_common::config::UserDefaultConfig; - UserDefaultConfig::load().set(key, value); -} - -#[cfg(feature = "flutter")] -pub fn get_user_default_option(key: String) -> String { - use hbb_common::config::UserDefaultConfig; - UserDefaultConfig::load().get(&key) -} - -pub fn get_fingerprint() -> String { - #[cfg(any(target_os = "android", target_os = "ios"))] - if Config::get_key_confirmed() { - return crate::common::pk_to_fingerprint(Config::get_key_pair().1); - } else { - return "".to_owned(); - } - #[cfg(not(any(target_os = "android", target_os = "ios")))] - return ipc::get_fingerprint(); -} - -#[inline] -pub fn get_login_device_info() -> LoginDeviceInfo { - LoginDeviceInfo { - // std::env::consts::OS is better than whoami::platform() here. - os: std::env::consts::OS.to_owned(), - r#type: "client".to_owned(), - name: crate::common::hostname(), - } -} - -#[inline] -pub fn get_login_device_info_json() -> String { - serde_json::to_string(&get_login_device_info()).unwrap_or("{}".to_string()) -} - -// notice: avoiding create ipc connection repeatedly, -// because windows named pipe has serious memory leak issue. -#[cfg(not(any(target_os = "android", target_os = "ios")))] -#[tokio::main(flavor = "current_thread")] -async fn check_connect_status_(reconnect: bool, rx: mpsc::UnboundedReceiver) { - #[cfg(not(feature = "flutter"))] - let mut key_confirmed = false; - let mut rx = rx; - let mut mouse_time = 0; - #[cfg(feature = "flutter")] - let mut video_conn_count = 0; - #[cfg(not(feature = "flutter"))] - let mut id = "".to_owned(); - let is_cm = crate::common::is_cm(); - - loop { - if let Ok(mut c) = ipc::connect(1000, "").await { - let mut timer = crate::rustdesk_interval(time::interval(time::Duration::from_secs(1))); - loop { - tokio::select! { - res = c.next() => { - match res { - Err(err) => { - log::error!("ipc connection closed: {}", err); - if is_cm { - crate::ui_cm_interface::quit_cm(); - } - break; - } - #[cfg(not(any(target_os = "android", target_os = "ios")))] - Ok(Some(ipc::Data::MouseMoveTime(v))) => { - mouse_time = v; - UI_STATUS.lock().unwrap().mouse_time = v; - } - Ok(Some(ipc::Data::Options(Some(v)))) => { - *OPTIONS.lock().unwrap() = v; - *OPTION_SYNCED.lock().unwrap() = true; - } - Ok(Some(ipc::Data::Config((name, Some(value))))) => { - if name == "id" { - #[cfg(not(feature = "flutter"))] - { - id = value; - } - } else if name == "temporary-password" { - *TEMPORARY_PASSWD.lock().unwrap() = value; - } - } - #[cfg(feature = "flutter")] - Ok(Some(ipc::Data::VideoConnCount(Some(n)))) => { - video_conn_count = n; - } - Ok(Some(ipc::Data::OnlineStatus(Some((mut x, _c))))) => { - if x > 0 { - x = 1 - } - #[cfg(not(feature = "flutter"))] - { - key_confirmed = _c; - } - *UI_STATUS.lock().unwrap() = UiStatus { - status_num: x as _, - #[cfg(not(feature = "flutter"))] - key_confirmed: _c, - #[cfg(not(any(target_os = "android", target_os = "ios")))] - mouse_time, - #[cfg(not(feature = "flutter"))] - id: id.clone(), - #[cfg(feature = "flutter")] - video_conn_count, - }; - } - Ok(Some(ipc::Data::ControlPermissionsRemoteModify(v))) => { - *IS_REMOTE_MODIFY_ENABLED_BY_CONTROL_PERMISSIONS.lock().unwrap() = v; - } - #[cfg(target_os = "windows")] - Ok(Some(ipc::Data::FileTransferEnabledState(v))) => { - if let Some(enabled) = v { - let mut lock = IS_FILE_TRANSFER_ENABLED.lock().unwrap(); - if *lock != v { - clipboard::ContextSend::enable(enabled); - *lock = v; - } - } - } - _ => {} - } - } - Some(data) = rx.recv() => { - allow_err!(c.send(&data).await); - } - _ = timer.tick() => { - c.send(&ipc::Data::OnlineStatus(None)).await.ok(); - c.send(&ipc::Data::Options(None)).await.ok(); - c.send(&ipc::Data::Config(("id".to_owned(), None))).await.ok(); - c.send(&ipc::Data::Config(("temporary-password".to_owned(), None))).await.ok(); - #[cfg(feature = "flutter")] - c.send(&ipc::Data::VideoConnCount(None)).await.ok(); - c.send(&ipc::Data::ControlPermissionsRemoteModify(None)).await.ok(); - #[cfg(target_os = "windows")] - c.send(&ipc::Data::FileTransferEnabledState(None)).await.ok(); - } - } - } - } - if !reconnect { - OPTIONS - .lock() - .unwrap() - .insert("ipc-closed".to_owned(), "Y".to_owned()); - break; - } - *UI_STATUS.lock().unwrap() = UiStatus { - status_num: -1, - #[cfg(not(feature = "flutter"))] - key_confirmed, - #[cfg(not(any(target_os = "android", target_os = "ios")))] - mouse_time, - #[cfg(not(feature = "flutter"))] - id: id.clone(), - #[cfg(feature = "flutter")] - video_conn_count, - }; - sleep(1.).await; - } -} - -#[allow(dead_code)] -pub fn option_synced() -> bool { - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - OPTION_SYNCED.lock().unwrap().clone() - } - #[cfg(any(target_os = "android", target_os = "ios"))] - { - true - } -} - -#[cfg(any(target_os = "android", feature = "flutter"))] -#[cfg(not(any(target_os = "ios")))] -#[tokio::main(flavor = "current_thread")] -pub(crate) async fn send_to_cm(data: &ipc::Data) { - if let Ok(mut c) = ipc::connect(1000, "_cm").await { - c.send(data).await.ok(); - } -} - -const INVALID_FORMAT: &'static str = "Invalid format"; -const UNKNOWN_ERROR: &'static str = "Unknown error"; - -#[inline] -#[tokio::main(flavor = "current_thread")] -pub async fn change_id_shared(id: String, old_id: String) -> String { - let res = change_id_shared_(id, old_id).await.to_owned(); - *ASYNC_JOB_STATUS.lock().unwrap() = res.clone(); - res -} - -pub async fn change_id_shared_(id: String, old_id: String) -> &'static str { - if !hbb_common::is_valid_custom_id(&id) { - log::debug!( - "debugging invalid id: \"{id}\", len: {}, base64: \"{}\"", - id.len(), - crate::encode64(&id) - ); - let bom = id.trim_start_matches('\u{FEFF}'); - log::debug!("bom: {}", hbb_common::is_valid_custom_id(&bom)); - return INVALID_FORMAT; - } - - #[cfg(not(any(target_os = "android", target_os = "ios")))] - let uuid = Bytes::from( - hbb_common::machine_uid::get() - .unwrap_or("".to_owned()) - .as_bytes() - .to_vec(), - ); - #[cfg(any(target_os = "android", target_os = "ios"))] - let uuid = Bytes::from(hbb_common::get_uuid()); - - if uuid.is_empty() { - log::error!("Failed to change id, uuid is_empty"); - return UNKNOWN_ERROR; - } - - #[cfg(not(any(target_os = "android", target_os = "ios")))] - let rendezvous_servers = crate::ipc::get_rendezvous_servers(1_000).await; - #[cfg(any(target_os = "android", target_os = "ios"))] - let rendezvous_servers = Config::get_rendezvous_servers(); - - let mut futs = Vec::new(); - let err: Arc> = Default::default(); - for rendezvous_server in rendezvous_servers { - let err = err.clone(); - let id = id.to_owned(); - let uuid = uuid.clone(); - let old_id = old_id.clone(); - futs.push(tokio::spawn(async move { - let tmp = check_id(rendezvous_server, old_id, id, uuid).await; - if !tmp.is_empty() { - *err.lock().unwrap() = tmp; - } - })); - } - join_all(futs).await; - let err = *err.lock().unwrap(); - if err.is_empty() { - #[cfg(not(any(target_os = "android", target_os = "ios")))] - crate::ipc::set_config_async("id", id.to_owned()).await.ok(); - #[cfg(any(target_os = "android", target_os = "ios"))] - { - Config::set_key_confirmed(false); - Config::set_id(&id); - } - } - err -} - -async fn check_id( - rendezvous_server: String, - old_id: String, - id: String, - uuid: Bytes, -) -> &'static str { - if let Ok(mut socket) = hbb_common::socket_client::connect_tcp( - crate::check_port(rendezvous_server, RENDEZVOUS_PORT), - CONNECT_TIMEOUT, - ) - .await - { - let mut msg_out = Message::new(); - msg_out.set_register_pk(RegisterPk { - old_id, - id, - uuid, - ..Default::default() - }); - let mut ok = false; - if socket.send(&msg_out).await.is_ok() { - if let Some(msg_in) = - crate::common::get_next_nonkeyexchange_msg(&mut socket, None).await - { - match msg_in.union { - Some(rendezvous_message::Union::RegisterPkResponse(rpr)) => { - match rpr.result.enum_value() { - Ok(register_pk_response::Result::OK) => { - ok = true; - } - Ok(register_pk_response::Result::ID_EXISTS) => { - return "Not available"; - } - Ok(register_pk_response::Result::TOO_FREQUENT) => { - return "Too frequent"; - } - Ok(register_pk_response::Result::NOT_SUPPORT) => { - return "server_not_support"; - } - Ok(register_pk_response::Result::SERVER_ERROR) => { - return "Server error"; - } - Ok(register_pk_response::Result::INVALID_ID_FORMAT) => { - return INVALID_FORMAT; - } - _ => {} - } - } - _ => {} - } - } - } - if !ok { - return UNKNOWN_ERROR; - } - } else { - return "Failed to connect to rendezvous server"; - } - "" -} - -// if it's relay id, return id processed, otherwise return original id -pub fn handle_relay_id(id: &str) -> &str { - if id.ends_with(r"\r") || id.ends_with(r"/r") { - &id[0..id.len() - 2] - } else { - id - } -} - -pub fn support_remove_wallpaper() -> bool { - #[cfg(any(target_os = "windows", target_os = "linux"))] - return crate::platform::WallPaperRemover::support(); - #[cfg(not(any(target_os = "windows", target_os = "linux")))] - return false; -} - -pub fn has_valid_2fa() -> bool { - let raw = get_option("2fa"); - crate::auth_2fa::get_2fa(Some(raw)).is_some() -} - -pub fn generate2fa() -> String { - crate::auth_2fa::generate2fa() -} - -pub fn verify2fa(code: String) -> bool { - let res = crate::auth_2fa::verify2fa(code); - if res { - refresh_options(); - } - res -} - -pub fn has_valid_bot() -> bool { - crate::auth_2fa::TelegramBot::get().map_or(false, |bot| bot.is_some()) -} - -pub fn verify_bot(token: String) -> String { - match crate::auth_2fa::get_chatid_telegram(&token) { - Err(err) => err.to_string(), - Ok(None) => { - "To activate the bot, simply send a message beginning with a forward slash (\"/\") like \"/hello\" to its chat.".to_owned() - } - _ => "".to_owned(), - } -} - -pub fn check_hwcodec() { - #[cfg(feature = "hwcodec")] - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - use std::sync::Once; - static ONCE: Once = Once::new(); - - ONCE.call_once(|| { - if crate::platform::is_installed() { - ipc::notify_server_to_check_hwcodec().ok(); - ipc::client_get_hwcodec_config_thread(3); - } else { - scrap::hwcodec::start_check_process(); - } - }) - } -} - -#[cfg(feature = "flutter")] -pub fn get_unlock_pin() -> String { - #[cfg(any(target_os = "android", target_os = "ios"))] - return String::default(); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - return ipc::get_unlock_pin(); -} - -#[cfg(feature = "flutter")] -pub fn set_unlock_pin(pin: String) -> String { - #[cfg(any(target_os = "android", target_os = "ios"))] - return String::default(); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - match ipc::set_unlock_pin(pin, true) { - Ok(_) => String::default(), - Err(err) => err.to_string(), - } -} - -#[cfg(feature = "flutter")] -pub fn get_trusted_devices() -> String { - #[cfg(any(target_os = "android", target_os = "ios"))] - return Config::get_trusted_devices_json(); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - return ipc::get_trusted_devices(); -} - -#[cfg(feature = "flutter")] -pub fn remove_trusted_devices(json: &str) { - let hwids = serde_json::from_str::>(json).unwrap_or_default(); - #[cfg(any(target_os = "android", target_os = "ios"))] - Config::remove_trusted_devices(&hwids); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - ipc::remove_trusted_devices(hwids); -} - -#[cfg(feature = "flutter")] -pub fn clear_trusted_devices() { - #[cfg(any(target_os = "android", target_os = "ios"))] - Config::clear_trusted_devices(); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - ipc::clear_trusted_devices(); -} - -#[cfg(feature = "flutter")] -pub fn max_encrypt_len() -> usize { - hbb_common::config::ENCRYPT_MAX_LEN -} - -pub fn is_remote_modify_enabled_by_control_permissions() -> Option { - *IS_REMOTE_MODIFY_ENABLED_BY_CONTROL_PERMISSIONS - .lock() - .unwrap() -} diff --git a/shelled/rustdesk-as-ref/src/ui_session_interface.rs b/shelled/rustdesk-as-ref/src/ui_session_interface.rs deleted file mode 100644 index be1895e..0000000 --- a/shelled/rustdesk-as-ref/src/ui_session_interface.rs +++ /dev/null @@ -1,2055 +0,0 @@ -use crate::{ - common::{get_supported_keyboard_modes, is_keyboard_mode_supported}, - input::{ - MOUSE_BUTTON_LEFT, MOUSE_BUTTON_RIGHT, MOUSE_TYPE_DOWN, MOUSE_TYPE_MASK, - MOUSE_TYPE_TRACKPAD, MOUSE_TYPE_UP, MOUSE_TYPE_WHEEL, - }, - ui_interface::use_texture_render, -}; -use async_trait::async_trait; -use bytes::Bytes; -#[cfg(all(target_os = "windows", not(feature = "flutter")))] -use hbb_common::config::keys; -#[cfg(not(feature = "flutter"))] -use hbb_common::fs; -use hbb_common::{ - allow_err, - config::{Config, LocalConfig, PeerConfig}, - get_version_number, log, - message_proto::*, - rendezvous_proto::ConnType, - tokio::{ - self, - sync::mpsc, - time::{Duration as TokioDuration, Instant}, - }, - whoami, Stream, -}; -use rdev::{Event, EventType::*, KeyCode}; -#[cfg(all(feature = "vram", feature = "flutter"))] -use std::ffi::c_void; -use std::{ - collections::HashMap, - ops::{Deref, DerefMut}, - str::FromStr, - sync::{ - atomic::{AtomicUsize, Ordering}, - Arc, Mutex, RwLock, - }, - time::SystemTime, -}; -use uuid::Uuid; - -use crate::client::io_loop::Remote; -use crate::client::{ - check_if_retry, handle_hash, handle_login_error, handle_login_from_ui, handle_test_delay, - input_os_password, send_mouse, send_pointer_device_event, FileManager, Key, LoginConfigHandler, - QualityStatus, KEY_MAP, -}; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -use crate::common::GrabState; -use crate::keyboard; -use crate::{client::Data, client::Interface}; - -const CHANGE_RESOLUTION_VALID_TIMEOUT_SECS: u64 = 15; - -#[derive(Clone, Default)] -pub struct Session { - pub password: String, - pub args: Vec, - pub lc: Arc>, - pub sender: Arc>>>, - pub thread: Arc>>>, - pub ui_handler: T, - pub server_keyboard_enabled: Arc>, - pub server_file_transfer_enabled: Arc>, - pub server_clipboard_enabled: Arc>, - pub last_change_display: Arc>, - pub connection_round_state: Arc>, - pub printer_names: Arc>>, - // Indicate whether the session is reconnected. - // Used to auto start file transfer after reconnection. - pub reconnect_count: Arc, - pub last_audit_note: Arc>, - pub audit_guid: Arc>, -} - -#[derive(Clone)] -pub struct SessionPermissionConfig { - pub lc: Arc>, - pub server_keyboard_enabled: Arc>, - pub server_file_transfer_enabled: Arc>, - pub server_clipboard_enabled: Arc>, -} - -pub struct ChangeDisplayRecord { - time: Instant, - display: i32, - width: i32, - height: i32, -} - -enum ConnectionState { - Connecting, - Connected, - Disconnected, -} - -/// ConnectionRoundState is used to control the reconnecting logic. -pub struct ConnectionRoundState { - round: u32, - state: ConnectionState, -} - -impl ConnectionRoundState { - pub fn new_round(&mut self) -> u32 { - self.round += 1; - self.state = ConnectionState::Connecting; - self.round - } - - pub fn set_connected(&mut self) { - self.state = ConnectionState::Connected; - } - - pub fn is_round_gt(&self, round: u32) -> bool { - if round == u32::MAX && self.round == 0 { - true - } else { - round < self.round - } - } - - pub fn set_disconnected(&mut self, round: u32) -> bool { - if self.is_round_gt(round) { - false - } else { - self.state = ConnectionState::Disconnected; - true - } - } -} - -impl Default for ConnectionRoundState { - fn default() -> Self { - Self { - round: 0, - state: ConnectionState::Connecting, - } - } -} - -impl Default for ChangeDisplayRecord { - fn default() -> Self { - Self { - time: Instant::now() - - TokioDuration::from_secs(CHANGE_RESOLUTION_VALID_TIMEOUT_SECS + 1), - display: 0, - width: 0, - height: 0, - } - } -} - -impl ChangeDisplayRecord { - fn new(display: i32, width: i32, height: i32) -> Self { - Self { - time: Instant::now(), - display, - width, - height, - } - } - - pub fn is_the_same_record(&self, display: i32, width: i32, height: i32) -> bool { - self.time.elapsed().as_secs() < CHANGE_RESOLUTION_VALID_TIMEOUT_SECS - && self.display == display - && self.width == width - && self.height == height - } -} - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -impl SessionPermissionConfig { - pub fn is_text_clipboard_required(&self) -> bool { - *self.server_clipboard_enabled.read().unwrap() - && *self.server_keyboard_enabled.read().unwrap() - && !self.lc.read().unwrap().disable_clipboard.v - } - - #[cfg(feature = "unix-file-copy-paste")] - pub fn is_file_clipboard_required(&self) -> bool { - *self.server_keyboard_enabled.read().unwrap() - && *self.server_file_transfer_enabled.read().unwrap() - && self.lc.read().unwrap().enable_file_copy_paste.v - } -} - -impl Session { - #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn get_permission_config(&self) -> SessionPermissionConfig { - SessionPermissionConfig { - lc: self.lc.clone(), - server_keyboard_enabled: self.server_keyboard_enabled.clone(), - server_file_transfer_enabled: self.server_file_transfer_enabled.clone(), - server_clipboard_enabled: self.server_clipboard_enabled.clone(), - } - } - - pub fn is_file_transfer(&self) -> bool { - self.lc - .read() - .unwrap() - .conn_type - .eq(&ConnType::FILE_TRANSFER) - } - - pub fn is_default(&self) -> bool { - self.lc - .read() - .unwrap() - .conn_type - .eq(&ConnType::DEFAULT_CONN) - } - - pub fn is_view_camera(&self) -> bool { - self.lc.read().unwrap().conn_type.eq(&ConnType::VIEW_CAMERA) - } - - pub fn is_terminal(&self) -> bool { - self.lc.read().unwrap().conn_type.eq(&ConnType::TERMINAL) - } - - pub fn is_port_forward(&self) -> bool { - let conn_type = self.lc.read().unwrap().conn_type; - conn_type == ConnType::PORT_FORWARD || conn_type == ConnType::RDP - } - - #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn is_rdp(&self) -> bool { - self.lc.read().unwrap().conn_type.eq(&ConnType::RDP) - } - - #[cfg(feature = "flutter")] - pub fn is_multi_ui_session(&self) -> bool { - self.ui_handler.is_multi_ui_session() - } - - pub fn get_view_style(&self) -> String { - self.lc.read().unwrap().view_style.clone() - } - - pub fn get_scroll_style(&self) -> String { - self.lc.read().unwrap().scroll_style.clone() - } - - pub fn get_edge_scroll_edge_thickness(&self) -> i32 { - self.lc.read().unwrap().edge_scroll_edge_thickness - } - - pub fn get_image_quality(&self) -> String { - self.lc.read().unwrap().image_quality.clone() - } - - pub fn get_custom_image_quality(&self) -> Vec { - self.lc.read().unwrap().custom_image_quality.clone() - } - - pub fn get_peer_version(&self) -> i64 { - self.lc.read().unwrap().version.clone() - } - - pub fn get_trackpad_speed(&self) -> i32 { - self.lc.read().unwrap().trackpad_speed - } - - pub fn fallback_keyboard_mode(&self) -> String { - let peer_version = self.get_peer_version(); - let platform = self.peer_platform(); - - let supported_modes = get_supported_keyboard_modes(peer_version, &platform); - if let Some(mode) = supported_modes.first() { - return mode.to_string(); - } else { - if self.get_peer_version() >= get_version_number("1.2.0") { - return KeyboardMode::Map.to_string(); - } else { - return KeyboardMode::Legacy.to_string(); - } - } - } - - // Caution: This function must be called after peer info is received. - pub fn get_keyboard_mode(&self) -> String { - let mode = self.lc.read().unwrap().keyboard_mode.clone(); - let keyboard_mode = KeyboardMode::from_str(&mode); - - // Note: peer_version is 0 before peer info is received. - let peer_version = self.get_peer_version(); - let platform = self.peer_platform(); - - // Saved keyboard mode still exists in this version. - if let Ok(mode) = keyboard_mode { - if is_keyboard_mode_supported(&mode, peer_version, &platform) { - return mode.to_string(); - } - } - self.fallback_keyboard_mode() - } - - pub fn is_keyboard_mode_supported(&self, mode: String) -> bool { - if let Ok(mode) = KeyboardMode::from_str(&mode[..]) { - crate::common::is_keyboard_mode_supported( - &mode, - self.get_peer_version(), - &self.peer_platform(), - ) - } else { - false - } - } - - pub fn save_keyboard_mode(&self, value: String) { - self.lc.write().unwrap().save_keyboard_mode(value); - } - - pub fn get_reverse_mouse_wheel(&self) -> String { - self.lc.read().unwrap().reverse_mouse_wheel.clone() - } - - pub fn get_displays_as_individual_windows(&self) -> String { - self.lc - .read() - .unwrap() - .displays_as_individual_windows - .clone() - } - - pub fn get_use_all_my_displays_for_the_remote_session(&self) -> String { - self.lc - .read() - .unwrap() - .use_all_my_displays_for_the_remote_session - .clone() - } - - pub fn save_reverse_mouse_wheel(&self, value: String) { - self.lc.write().unwrap().save_reverse_mouse_wheel(value); - } - - pub fn save_displays_as_individual_windows(&self, value: String) { - self.lc - .write() - .unwrap() - .save_displays_as_individual_windows(value); - } - - pub fn save_use_all_my_displays_for_the_remote_session(&self, value: String) { - self.lc - .write() - .unwrap() - .save_use_all_my_displays_for_the_remote_session(value); - } - - pub fn save_view_style(&self, value: String) { - self.lc.write().unwrap().save_view_style(value); - } - - pub fn save_scroll_style(&self, value: String) { - self.lc.write().unwrap().save_scroll_style(value); - } - - pub fn save_edge_scroll_edge_thickness(&self, value: i32) { - self.lc - .write() - .unwrap() - .save_edge_scroll_edge_thickness(value); - } - - pub fn save_flutter_option(&self, k: String, v: String) { - self.lc.write().unwrap().save_ui_flutter(k, v); - } - - pub fn get_flutter_option(&self, k: String) -> String { - self.lc.read().unwrap().get_ui_flutter(&k) - } - - pub fn toggle_option(&self, name: String) { - let msg = self.lc.write().unwrap().toggle_option(name.clone()); - #[cfg(all(target_os = "windows", not(feature = "flutter")))] - if name == keys::OPTION_ENABLE_FILE_COPY_PASTE { - self.send(Data::ToggleClipboardFile); - } - if let Some(msg) = msg { - self.send(Data::Message(msg)); - } - } - - pub fn toggle_privacy_mode(&self, impl_key: String, on: bool) { - let mut misc = Misc::new(); - misc.set_toggle_privacy_mode(TogglePrivacyMode { - impl_key, - on, - ..Default::default() - }); - let mut msg_out = Message::new(); - msg_out.set_misc(misc); - self.send(Data::Message(msg_out)); - } - - pub fn get_toggle_option(&self, name: String) -> bool { - self.lc.read().unwrap().get_toggle_option(&name) - } - - #[cfg(not(feature = "flutter"))] - pub fn is_privacy_mode_supported(&self) -> bool { - self.lc.read().unwrap().is_privacy_mode_supported() - } - - #[cfg(not(target_os = "ios"))] - pub fn is_text_clipboard_required(&self) -> bool { - *self.server_clipboard_enabled.read().unwrap() - && *self.server_keyboard_enabled.read().unwrap() - && !self.lc.read().unwrap().disable_clipboard.v - } - - #[cfg(any(target_os = "windows", feature = "unix-file-copy-paste"))] - pub fn is_file_clipboard_required(&self) -> bool { - *self.server_keyboard_enabled.read().unwrap() - && *self.server_file_transfer_enabled.read().unwrap() - && self.lc.read().unwrap().enable_file_copy_paste.v - } - - #[cfg(feature = "flutter")] - pub fn refresh_video(&self, display: i32) { - if crate::common::is_support_multi_ui_session_num(self.lc.read().unwrap().version) { - self.send(Data::Message(LoginConfigHandler::refresh_display( - display as _, - ))); - } else { - self.send(Data::Message(LoginConfigHandler::refresh())); - } - } - - pub fn toggle_virtual_display(&self, index: i32, on: bool) { - let mut misc = Misc::new(); - misc.set_toggle_virtual_display(ToggleVirtualDisplay { - display: index, - on, - ..Default::default() - }); - let mut msg_out = Message::new(); - msg_out.set_misc(misc); - self.send(Data::Message(msg_out)); - } - - #[cfg(not(feature = "flutter"))] - pub fn refresh_video(&self, _display: i32) { - self.send(Data::Message(LoginConfigHandler::refresh())); - } - - pub fn record_screen(&self, start: bool) { - self.send(Data::RecordScreen(start)); - } - - pub fn is_screenshot_supported(&self) -> bool { - crate::common::is_support_screenshot_num(self.lc.read().unwrap().version) - } - - pub fn take_screenshot(&self, display: i32, sid: String) { - self.send(Data::TakeScreenshot((display, sid))); - } - - pub fn is_recording(&self) -> bool { - self.lc.read().unwrap().record_state - } - - pub fn save_custom_image_quality(&self, custom_image_quality: i32) { - let msg = self - .lc - .write() - .unwrap() - .save_custom_image_quality(custom_image_quality); - self.send(Data::Message(msg)); - } - - pub fn save_image_quality(&self, value: String) { - let msg = self.lc.write().unwrap().save_image_quality(value.clone()); - if let Some(msg) = msg { - self.send(Data::Message(msg)); - } - if value != "custom" { - let last_auto_fps = self.lc.read().unwrap().last_auto_fps; - if last_auto_fps.unwrap_or(usize::MAX) >= 30 { - // non custom quality use 30 fps - let msg = self.lc.write().unwrap().set_custom_fps(30, false); - self.send(Data::Message(msg)); - } - } - } - - pub fn save_trackpad_speed(&self, trackpad_speed: i32) { - self.lc.write().unwrap().save_trackpad_speed(trackpad_speed); - } - - pub fn set_custom_fps(&self, custom_fps: i32) { - let msg = self.lc.write().unwrap().set_custom_fps(custom_fps, true); - self.send(Data::Message(msg)); - } - - pub fn get_remember(&self) -> bool { - self.lc.read().unwrap().remember - } - - #[cfg(not(feature = "flutter"))] - pub fn set_write_override( - &mut self, - job_id: i32, - file_num: i32, - is_override: bool, - remember: bool, - is_upload: bool, - ) -> bool { - self.send(Data::SetConfirmOverrideFile(( - job_id, - file_num, - is_override, - remember, - is_upload, - ))); - true - } - - pub fn alternative_codecs(&self) -> (bool, bool, bool, bool) { - let luid = self.lc.read().unwrap().adapter_luid; - let mark_unsupported = self.lc.read().unwrap().mark_unsupported.clone(); - let decoder = scrap::codec::Decoder::supported_decodings( - None, - use_texture_render(), - luid, - &mark_unsupported, - ); - let mut vp8 = decoder.ability_vp8 > 0; - let mut av1 = decoder.ability_av1 > 0; - let mut h264 = decoder.ability_h264 > 0; - let mut h265 = decoder.ability_h265 > 0; - let enc = &self.lc.read().unwrap().supported_encoding; - vp8 = vp8 && enc.vp8; - av1 = av1 && enc.av1; - h264 = h264 && enc.h264; - h265 = h265 && enc.h265; - (vp8, av1, h264, h265) - } - - pub fn update_supported_decodings(&self) { - let msg = self.lc.write().unwrap().update_supported_decodings(); - self.send(Data::Message(msg)); - } - - pub fn use_texture_render_changed(&self) { - self.send(Data::ResetDecoder(None)); - self.update_supported_decodings(); - self.send(Data::Message(LoginConfigHandler::refresh())); - } - - pub fn restart_remote_device(&self) { - let mut lc = self.lc.write().unwrap(); - lc.restarting_remote_device = true; - let msg = lc.restart_remote_device(); - self.send(Data::Message(msg)); - } - - #[cfg(all(feature = "flutter", feature = "plugin_framework"))] - #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn send_plugin_request(&self, request: PluginRequest) { - let mut misc = Misc::new(); - misc.set_plugin_request(request); - let mut msg_out = Message::new(); - msg_out.set_misc(misc); - self.send(Data::Message(msg_out)); - } - - pub fn get_audit_server(&self, typ: String) -> String { - if LocalConfig::get_option("access_token").is_empty() { - return "".to_owned(); - } - crate::get_audit_server( - Config::get_option("api-server"), - Config::get_option("custom-rendezvous-server"), - typ, - ) - } - - pub fn send_note(&self, note: String) { - let url = self.get_audit_server("conn".to_string()); - let id = self.get_id(); - let session_id = self.lc.read().unwrap().session_id; - *self.last_audit_note.lock().unwrap() = note.clone(); - std::thread::spawn(move || { - send_note(url, id, session_id, note); - }); - } - - #[cfg(not(feature = "flutter"))] - #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn is_xfce(&self) -> bool { - crate::platform::is_xfce() - } - - pub fn remove_port_forward(&self, port: i32) { - let mut config = self.load_config(); - config.port_forwards = config - .port_forwards - .drain(..) - .filter(|x| x.0 != port) - .collect(); - self.save_config(config); - self.send(Data::RemovePortForward(port)); - } - - pub fn add_port_forward(&self, port: i32, remote_host: String, remote_port: i32) { - let mut config = self.load_config(); - if config - .port_forwards - .iter() - .filter(|x| x.0 == port) - .next() - .is_some() - { - return; - } - let pf = (port, remote_host, remote_port); - config.port_forwards.push(pf.clone()); - self.save_config(config); - self.send(Data::AddPortForward(pf)); - } - - pub fn get_option(&self, k: String) -> String { - if k.eq("remote_dir") { - return self.lc.read().unwrap().get_remote_dir(); - } - self.lc.read().unwrap().get_option(&k) - } - - pub fn set_option(&self, k: String, mut v: String) { - let mut lc = self.lc.write().unwrap(); - if k.eq("remote_dir") { - v = lc.get_all_remote_dir(v); - } - lc.set_option(k, v); - } - - #[inline] - pub fn load_config(&self) -> PeerConfig { - self.lc.read().unwrap().load_config() - } - - #[inline] - pub(super) fn save_config(&self, config: PeerConfig) { - self.lc.write().unwrap().save_config(config); - } - - pub fn is_restarting_remote_device(&self) -> bool { - self.lc.read().unwrap().restarting_remote_device - } - - #[inline] - pub fn peer_platform(&self) -> String { - self.lc.read().unwrap().info.platform.clone() - } - - pub fn get_platform(&self, is_remote: bool) -> String { - if is_remote { - self.peer_platform() - } else { - whoami::platform().to_string() - } - } - - pub fn get_path_sep(&self, is_remote: bool) -> &'static str { - let p = self.get_platform(is_remote); - if &p == crate::PLATFORM_WINDOWS { - return "\\"; - } else { - return "/"; - } - } - - pub fn input_os_password(&self, pass: String, activate: bool) { - input_os_password(pass, activate, self.clone()); - } - - #[cfg(not(feature = "flutter"))] - pub fn get_chatbox(&self) -> String { - #[cfg(feature = "inline")] - return crate::ui::inline::get_chatbox(); - #[cfg(not(feature = "inline"))] - return "".to_owned(); - } - - pub fn swap_modifier_key(&self, msg: &mut KeyEvent) { - let allow_swap_key = self.get_toggle_option("allow_swap_key".to_string()); - if allow_swap_key { - if let Some(key_event::Union::ControlKey(ck)) = msg.union { - let ck = ck.enum_value_or_default(); - let ck = match ck { - ControlKey::Control => ControlKey::Meta, - ControlKey::Meta => ControlKey::Control, - ControlKey::RControl => ControlKey::Meta, - ControlKey::RWin => ControlKey::Control, - _ => ck, - }; - msg.set_control_key(ck); - } - msg.modifiers = msg - .modifiers - .iter() - .map(|ck| { - let ck = ck.enum_value_or_default(); - let ck = match ck { - ControlKey::Control => ControlKey::Meta, - ControlKey::Meta => ControlKey::Control, - ControlKey::RControl => ControlKey::Meta, - ControlKey::RWin => ControlKey::Control, - _ => ck, - }; - hbb_common::protobuf::EnumOrUnknown::new(ck) - }) - .collect(); - - let code = msg.chr(); - if code != 0 { - let mut peer = self.peer_platform().to_lowercase(); - peer.retain(|c| !c.is_whitespace()); - - let key = match peer.as_str() { - "windows" => { - let key = rdev::win_key_from_scancode(code); - let key = match key { - rdev::Key::ControlLeft => rdev::Key::MetaLeft, - rdev::Key::MetaLeft => rdev::Key::ControlLeft, - rdev::Key::ControlRight => rdev::Key::MetaLeft, - rdev::Key::MetaRight => rdev::Key::ControlLeft, - _ => key, - }; - rdev::win_scancode_from_key(key).unwrap_or_default() - } - "macos" => { - let key = rdev::macos_key_from_code(code as _); - let key = match key { - rdev::Key::ControlLeft => rdev::Key::MetaLeft, - rdev::Key::MetaLeft => rdev::Key::ControlLeft, - rdev::Key::ControlRight => rdev::Key::MetaLeft, - rdev::Key::MetaRight => rdev::Key::ControlLeft, - _ => key, - }; - rdev::macos_keycode_from_key(key).unwrap_or_default() as _ - } - _ => { - let key = rdev::linux_key_from_code(code); - let key = match key { - rdev::Key::ControlLeft => rdev::Key::MetaLeft, - rdev::Key::MetaLeft => rdev::Key::ControlLeft, - rdev::Key::ControlRight => rdev::Key::MetaLeft, - rdev::Key::MetaRight => rdev::Key::ControlLeft, - _ => key, - }; - rdev::linux_keycode_from_key(key).unwrap_or_default() - } - }; - msg.set_chr(key); - } - } - } - - pub fn send_key_event(&self, evt: &KeyEvent) { - // mode: legacy(0), map(1), translate(2), auto(3) - - let mut msg = evt.clone(); - self.swap_modifier_key(&mut msg); - let mut msg_out = Message::new(); - msg_out.set_key_event(msg); - self.send(Data::Message(msg_out)); - } - - pub fn send_chat(&self, text: String) { - let mut misc = Misc::new(); - misc.set_chat_message(ChatMessage { - text, - ..Default::default() - }); - let mut msg_out = Message::new(); - msg_out.set_misc(misc); - self.send(Data::Message(msg_out)); - } - - // Terminal methods - pub fn open_terminal(&self, terminal_id: i32, rows: u32, cols: u32) { - let mut action = TerminalAction::new(); - action.set_open(OpenTerminal { - terminal_id, - rows, - cols, - ..Default::default() - }); - let mut msg_out = Message::new(); - msg_out.set_terminal_action(action); - self.send(Data::Message(msg_out)); - } - - pub fn send_terminal_input(&self, terminal_id: i32, data: String) { - let mut action = TerminalAction::new(); - action.set_data(TerminalData { - terminal_id, - data: bytes::Bytes::from(data.into_bytes()), - ..Default::default() - }); - let mut msg_out = Message::new(); - msg_out.set_terminal_action(action); - self.send(Data::Message(msg_out)); - } - - pub fn resize_terminal(&self, terminal_id: i32, rows: u32, cols: u32) { - let mut action = TerminalAction::new(); - action.set_resize(ResizeTerminal { - terminal_id, - rows, - cols, - ..Default::default() - }); - let mut msg_out = Message::new(); - msg_out.set_terminal_action(action); - self.send(Data::Message(msg_out)); - } - - pub fn close_terminal(&self, terminal_id: i32) { - let mut action = TerminalAction::new(); - action.set_close(CloseTerminal { - terminal_id, - ..Default::default() - }); - let mut msg_out = Message::new(); - msg_out.set_terminal_action(action); - self.send(Data::Message(msg_out)); - } - - pub fn capture_displays(&self, add: Vec, sub: Vec, set: Vec) { - let mut misc = Misc::new(); - misc.set_capture_displays(CaptureDisplays { - add, - sub, - set, - ..Default::default() - }); - let mut msg_out = Message::new(); - msg_out.set_misc(misc); - self.send(Data::Message(msg_out)); - } - - pub fn switch_display(&self, display: i32) { - let (w, h) = match self.lc.read().unwrap().get_custom_resolution(display) { - Some((w, h)) => (w, h), - None => (0, 0), - }; - - let mut misc = Misc::new(); - misc.set_switch_display(SwitchDisplay { - display, - width: w, - height: h, - ..Default::default() - }); - let mut msg_out = Message::new(); - msg_out.set_misc(misc); - self.send(Data::Message(msg_out)); - - if !use_texture_render() { - self.capture_displays(vec![], vec![], vec![display]); - } - } - - #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn enter(&self, keyboard_mode: String) { - keyboard::client::change_grab_status(GrabState::Run, &keyboard_mode); - } - - #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn leave(&self, keyboard_mode: String) { - keyboard::client::change_grab_status(GrabState::Wait, &keyboard_mode); - } - - // flutter only TODO new input - pub fn input_key( - &self, - name: &str, - down: bool, - press: bool, - alt: bool, - ctrl: bool, - shift: bool, - command: bool, - ) { - let chars: Vec = name.chars().collect(); - if chars.len() == 1 { - let key = Key::_Raw(chars[0] as _); - self._input_key(key, down, press, alt, ctrl, shift, command); - } else { - if let Some(key) = KEY_MAP.get(name) { - self._input_key(key.clone(), down, press, alt, ctrl, shift, command); - } - } - } - - pub fn input_string(&self, value: &str) { - let mut key_event = KeyEvent::new(); - key_event.set_seq(value.to_owned()); - let mut msg_out = Message::new(); - msg_out.set_key_event(key_event); - self.send(Data::Message(msg_out)); - } - - #[cfg(any(target_os = "ios"))] - pub fn handle_flutter_raw_key_event( - &self, - _keyboard_mode: &str, - _name: &str, - _platform_code: i32, - _position_code: i32, - _lock_modes: i32, - _down_or_up: bool, - ) { - } - - #[cfg(not(any(target_os = "ios")))] - pub fn handle_flutter_raw_key_event( - &self, - keyboard_mode: &str, - name: &str, - platform_code: i32, - position_code: i32, - lock_modes: i32, - down_or_up: bool, - ) { - if name == "flutter_key" { - self._handle_key_flutter_simulation(keyboard_mode, platform_code, down_or_up); - } else { - self._handle_raw_key_non_flutter_simulation( - keyboard_mode, - platform_code, - position_code, - lock_modes, - down_or_up, - ); - } - } - - #[cfg(not(any(target_os = "ios")))] - fn _handle_raw_key_non_flutter_simulation( - &self, - keyboard_mode: &str, - platform_code: i32, - position_code: i32, - lock_modes: i32, - down_or_up: bool, - ) { - if position_code < 0 || platform_code < 0 { - return; - } - let platform_code: u32 = platform_code as _; - let position_code: KeyCode = position_code as _; - - #[cfg(not(target_os = "windows"))] - let key = rdev::key_from_code(position_code) as rdev::Key; - // Windows requires special handling - #[cfg(target_os = "windows")] - let key = rdev::get_win_key(platform_code, position_code); - - let event_type = if down_or_up { - KeyPress(key) - } else { - KeyRelease(key) - }; - let event = Event { - time: SystemTime::now(), - unicode: None, - platform_code, - position_code: position_code as _, - event_type, - usb_hid: 0, - #[cfg(any(target_os = "windows", target_os = "macos"))] - extra_data: 0, - }; - keyboard::client::process_event_with_session(keyboard_mode, &event, Some(lock_modes), self); - } - - pub fn handle_flutter_key_event( - &self, - keyboard_mode: &str, - character: &str, - usb_hid: i32, - lock_modes: i32, - down_or_up: bool, - ) { - if character == "flutter_key" { - self._handle_key_flutter_simulation(keyboard_mode, usb_hid, down_or_up); - } else { - self._handle_key_non_flutter_simulation( - keyboard_mode, - character, - usb_hid, - lock_modes, - down_or_up, - ); - } - } - - fn _handle_key_flutter_simulation( - &self, - _keyboard_mode: &str, - platform_code: i32, - down_or_up: bool, - ) { - // https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/services/keyboard_key.g.dart#L4356 - let ctrl_key = match platform_code { - 0x007f => Some(ControlKey::VolumeMute), - 0x0080 => Some(ControlKey::VolumeUp), - 0x0081 => Some(ControlKey::VolumeDown), - 0x0066 => Some(ControlKey::Power), - _ => None, - }; - let Some(ctrl_key) = ctrl_key else { return }; - let mut key_event = KeyEvent { - mode: KeyboardMode::Translate.into(), - down: down_or_up, - ..Default::default() - }; - key_event.set_control_key(ctrl_key); - self.send_key_event(&key_event); - } - - fn _handle_key_non_flutter_simulation( - &self, - keyboard_mode: &str, - character: &str, - usb_hid: i32, - lock_modes: i32, - down_or_up: bool, - ) { - let key = rdev::usb_hid_key_from_code(usb_hid as _); - - #[cfg(any(target_os = "android", target_os = "ios"))] - let position_code: KeyCode = 0; - #[cfg(any(target_os = "android", target_os = "ios"))] - let platform_code: KeyCode = 0; - - #[cfg(target_os = "windows")] - let platform_code: u32 = rdev::win_code_from_key(key).unwrap_or(0); - #[cfg(target_os = "windows")] - let position_code: KeyCode = rdev::win_scancode_from_key(key).unwrap_or(0) as _; - - #[cfg(not(any(target_os = "windows", target_os = "android", target_os = "ios")))] - let position_code: KeyCode = rdev::code_from_key(key).unwrap_or(0) as _; - #[cfg(not(any( - target_os = "windows", - target_os = "android", - target_os = "ios", - target_os = "linux" - )))] - let platform_code: u32 = position_code as _; - // For translate mode. - // We need to set the platform code (keysym) if is AltGr. - // https://github.com/rustdesk/rustdesk/blob/07cf1b4db5ef2f925efd3b16b87c33ce03c94809/src/keyboard.rs#L1029 - // https://github.com/flutter/flutter/issues/153811 - #[cfg(target_os = "linux")] - let platform_code: u32 = position_code as _; - - let event_type = if down_or_up { - KeyPress(key) - } else { - KeyRelease(key) - }; - let event = Event { - time: SystemTime::now(), - unicode: if character.is_empty() { - None - } else { - Some(rdev::UnicodeInfo { - name: Some(character.to_string()), - unicode: character.encode_utf16().collect(), - // is_dead: is not correct here, because flutter cannot detect deadcode for now. - is_dead: false, - }) - }, - platform_code, - position_code: position_code as _, - event_type, - #[cfg(any(target_os = "android", target_os = "ios"))] - usb_hid: usb_hid as _, - #[cfg(not(any(target_os = "android", target_os = "ios")))] - usb_hid: 0, - #[cfg(any(target_os = "windows", target_os = "macos"))] - extra_data: 0, - }; - keyboard::client::process_event_with_session(keyboard_mode, &event, Some(lock_modes), self); - } - - // flutter only TODO new input - fn _input_key( - &self, - key: Key, - down: bool, - press: bool, - alt: bool, - ctrl: bool, - shift: bool, - command: bool, - ) { - let v = if press { - 3 - } else if down { - 1 - } else { - 0 - }; - let mut key_event = KeyEvent::new(); - match key { - Key::Chr(chr) => { - key_event.set_chr(chr); - } - Key::ControlKey(key) => { - key_event.set_control_key(key.clone()); - } - Key::_Raw(raw) => { - key_event.set_chr(raw); - } - } - - if v == 1 { - key_event.down = true; - } else if v == 3 { - key_event.press = true; - } - keyboard::client::legacy_modifiers(&mut key_event, alt, ctrl, shift, command); - key_event.mode = KeyboardMode::Legacy.into(); - - self.send_key_event(&key_event); - } - - pub fn send_touch_scale(&self, scale: i32, alt: bool, ctrl: bool, shift: bool, command: bool) { - let scale_evt = TouchScaleUpdate { - scale, - ..Default::default() - }; - let mut touch_evt = TouchEvent::new(); - touch_evt.set_scale_update(scale_evt); - let mut evt = PointerDeviceEvent::new(); - evt.set_touch_event(touch_evt); - send_pointer_device_event(evt, alt, ctrl, shift, command, self); - } - - pub fn send_touch_pan_event( - &self, - event: &str, - x: i32, - y: i32, - alt: bool, - ctrl: bool, - shift: bool, - command: bool, - ) { - let mut touch_evt = TouchEvent::new(); - match event { - "pan_start" => { - touch_evt.set_pan_start(TouchPanStart { - x, - y, - ..Default::default() - }); - } - "pan_update" => { - let (x, y) = self.get_scroll_xy((x, y)); - touch_evt.set_pan_update(TouchPanUpdate { - x, - y, - ..Default::default() - }); - } - "pan_end" => { - touch_evt.set_pan_end(TouchPanEnd { - x, - y, - ..Default::default() - }); - } - _ => { - log::warn!("unknown touch pan event: {}", event); - return; - } - }; - let mut evt = PointerDeviceEvent::new(); - evt.set_touch_event(touch_evt); - send_pointer_device_event(evt, alt, ctrl, shift, command, self); - } - - #[inline] - #[cfg(not(any(target_os = "android", target_os = "ios")))] - fn is_scroll_reverse_mode(&self) -> bool { - self.lc.read().unwrap().reverse_mouse_wheel.eq("Y") - } - - #[inline] - fn get_scroll_xy(&self, xy: (i32, i32)) -> (i32, i32) { - #[cfg(not(any(target_os = "android", target_os = "ios")))] - if self.is_scroll_reverse_mode() { - return (-xy.0, -xy.1); - } - xy - } - - pub fn send_mouse( - &self, - mut mask: i32, - x: i32, - y: i32, - alt: bool, - ctrl: bool, - shift: bool, - command: bool, - ) { - #[allow(unused_mut)] - let mut command = command; - #[cfg(windows)] - { - if !command && crate::platform::windows::get_win_key_state() { - command = true; - } - } - - // Compute event type once using MOUSE_TYPE_MASK for reuse - let event_type = mask & MOUSE_TYPE_MASK; - let (x, y) = if event_type == MOUSE_TYPE_WHEEL || event_type == MOUSE_TYPE_TRACKPAD { - self.get_scroll_xy((x, y)) - } else { - (x, y) - }; - - // #[cfg(not(any(target_os = "android", target_os = "ios")))] - let (alt, ctrl, shift, command) = - keyboard::client::get_modifiers_state(alt, ctrl, shift, command); - let is_left = (mask & (MOUSE_BUTTON_LEFT << 3)) > 0; - let is_right = (mask & (MOUSE_BUTTON_RIGHT << 3)) > 0; - if is_left ^ is_right { - let swap_lr = self.get_toggle_option("swap-left-right-mouse".to_string()); - if swap_lr { - if is_left { - mask = (mask & (!(MOUSE_BUTTON_LEFT << 3))) | (MOUSE_BUTTON_RIGHT << 3); - } else { - mask = (mask & (!(MOUSE_BUTTON_RIGHT << 3))) | (MOUSE_BUTTON_LEFT << 3); - } - } - } - - send_mouse(mask, x, y, alt, ctrl, shift, command, self); - // on macos, ctrl + left button down = right button down, up won't emit, so we need to - // emit up myself if peer is not macos - // to-do: how about ctrl + left from win to macos - if cfg!(target_os = "macos") { - let buttons = mask >> 3; - if buttons == MOUSE_BUTTON_LEFT - && event_type == MOUSE_TYPE_DOWN - && ctrl - && self.peer_platform() != "Mac OS" - { - self.send_mouse( - (MOUSE_BUTTON_LEFT << 3 | MOUSE_TYPE_UP) as _, - x, - y, - alt, - ctrl, - shift, - command, - ); - } - } - } - - pub fn reconnect(&self, force_relay: bool) { - // 1. If current session is connecting, do not reconnect. - // 2. If the connection is established, send `Data::Close`. - // 3. If the connection is disconnected, do nothing. - let mut connection_round_state_lock = self.connection_round_state.lock().unwrap(); - if self.thread.lock().unwrap().is_some() { - match connection_round_state_lock.state { - ConnectionState::Connecting => return, - ConnectionState::Connected => self.send(Data::Close), - ConnectionState::Disconnected => {} - } - } - let round = connection_round_state_lock.new_round(); - drop(connection_round_state_lock); - - let cloned = self.clone(); - - // override only if true - if true == force_relay { - self.lc.write().unwrap().force_relay = true; - } - self.lc.write().unwrap().peer_info = None; - self.reconnect_count.fetch_add(1, Ordering::SeqCst); - let mut lock = self.thread.lock().unwrap(); - // No need to join the previous thread, because it will exit automatically. - // And the previous thread will not change important states. - *lock = Some(std::thread::spawn(move || { - io_loop(cloned, round); - })); - } - - #[cfg(not(feature = "flutter"))] - pub fn get_icon_path(&self, file_type: i32, ext: String) -> String { - let mut path = Config::icon_path(); - if file_type == FileType::DirLink as i32 { - let new_path = path.join("dir_link"); - if !std::fs::metadata(&new_path).is_ok() { - #[cfg(windows)] - allow_err!(std::os::windows::fs::symlink_file(&path, &new_path)); - #[cfg(not(windows))] - allow_err!(std::os::unix::fs::symlink(&path, &new_path)); - } - path = new_path; - } else if file_type == FileType::File as i32 { - if !ext.is_empty() { - path = path.join(format!("file.{}", ext)); - } else { - path = path.join("file"); - } - if !std::fs::metadata(&path).is_ok() { - allow_err!(std::fs::File::create(&path)); - } - } else if file_type == FileType::FileLink as i32 { - let new_path = path.join("file_link"); - if !std::fs::metadata(&new_path).is_ok() { - path = path.join("file"); - if !std::fs::metadata(&path).is_ok() { - allow_err!(std::fs::File::create(&path)); - } - #[cfg(windows)] - allow_err!(std::os::windows::fs::symlink_file(&path, &new_path)); - #[cfg(not(windows))] - allow_err!(std::os::unix::fs::symlink(&path, &new_path)); - } - path = new_path; - } else if file_type == FileType::DirDrive as i32 { - if cfg!(windows) { - path = fs::get_path("C:"); - } else if cfg!(target_os = "macos") { - if let Ok(entries) = fs::get_path("/Volumes/").read_dir() { - for entry in entries { - if let Ok(entry) = entry { - path = entry.path(); - break; - } - } - } - } - } - fs::get_string(&path) - } - - pub fn login( - &self, - os_username: String, - os_password: String, - password: String, - remember: bool, - ) { - self.send(Data::Login((os_username, os_password, password, remember))); - } - - pub fn send2fa(&self, code: String, trust_this_device: bool) { - let mut msg_out = Message::new(); - let hwid = if trust_this_device { - crate::get_hwid() - } else { - Bytes::new() - }; - self.lc.write().unwrap().set_option( - "trust-this-device".to_string(), - if trust_this_device { "Y" } else { "" }.to_string(), - ); - msg_out.set_auth_2fa(Auth2FA { - code, - hwid, - ..Default::default() - }); - self.send(Data::Message(msg_out)); - } - - pub fn get_enable_trusted_devices(&self) -> bool { - self.lc.read().unwrap().enable_trusted_devices - } - - pub fn new_rdp(&self) { - self.send(Data::NewRDP); - } - - pub fn close(&self) { - self.send(Data::Close); - } - - fn try_auto_start_job_str(is_reconnected: bool, job_str: &str) -> Option { - if is_reconnected { - let job_str = job_str.trim(); - if let Some(stripped) = job_str.strip_suffix('}') { - format!(r#"{},"auto_start": true}}"#, stripped).into() - } else { - // unreachable in normal cases - log::warn!( - "The last character is not '}}': {}, auto start is ignored on flutter", - job_str - ); - Some(job_str.to_owned()) - } - } else { - None - } - } - - pub fn load_last_jobs(&self) { - self.clear_all_jobs(); - let pc = self.load_config(); - if pc.transfer.write_jobs.is_empty() && pc.transfer.read_jobs.is_empty() { - // no last jobs - return; - } - let reconnect_count_thr = if cfg!(feature = "flutter") { 0 } else { 1 }; - let is_reconnected = self.reconnect_count.load(Ordering::SeqCst) > reconnect_count_thr; - // TODO: can add a confirm dialog - let mut cnt = 1; - for job_str in pc.transfer.read_jobs.iter() { - if !job_str.is_empty() { - self.load_last_job( - cnt, - Self::try_auto_start_job_str(is_reconnected, job_str) - .as_deref() - .unwrap_or(job_str), - is_reconnected, - ); - cnt += 1; - log::info!("restore read_job: {:?}", job_str); - } - } - for job_str in pc.transfer.write_jobs.iter() { - if !job_str.is_empty() { - self.load_last_job( - cnt, - Self::try_auto_start_job_str(is_reconnected, job_str) - .as_deref() - .unwrap_or(job_str), - is_reconnected, - ); - cnt += 1; - log::info!("restore write_job: {:?}", job_str); - } - } - self.update_transfer_list(); - } - - pub fn elevate_direct(&self) { - self.send(Data::ElevateDirect); - } - - pub fn elevate_with_logon(&self, username: String, password: String) { - self.send(Data::ElevateWithLogon(username, password)); - } - - #[cfg(any(target_os = "ios"))] - pub fn switch_sides(&self) {} - - #[cfg(not(any(target_os = "ios")))] - #[tokio::main(flavor = "current_thread")] - pub async fn switch_sides(&self) { - match crate::ipc::connect(1000, "").await { - Ok(mut conn) => { - if conn - .send(&crate::ipc::Data::SwitchSidesRequest(self.get_id())) - .await - .is_ok() - { - if let Ok(Some(data)) = conn.next_timeout(1000).await { - match data { - crate::ipc::Data::SwitchSidesRequest(str_uuid) => { - if let Ok(uuid) = Uuid::from_str(&str_uuid) { - let mut misc = Misc::new(); - misc.set_switch_sides_request(SwitchSidesRequest { - uuid: Bytes::from(uuid.as_bytes().to_vec()), - ..Default::default() - }); - let mut msg_out = Message::new(); - msg_out.set_misc(misc); - self.send(Data::Message(msg_out)); - } - } - _ => {} - } - } - } - } - Err(err) => { - log::info!("server not started (will try to start): {}", err); - } - } - } - - fn set_custom_resolution(&self, display: &SwitchDisplay) { - if display.width == display.original_resolution.width - && display.height == display.original_resolution.height - { - self.lc - .write() - .unwrap() - .set_custom_resolution(display.display, None); - } else { - let last_change_display = self.last_change_display.lock().unwrap(); - if last_change_display.display == display.display { - let wh = if last_change_display.is_the_same_record( - display.display, - display.width, - display.height, - ) { - Some((display.width, display.height)) - } else { - // display origin is changed, or some other events. - None - }; - self.lc - .write() - .unwrap() - .set_custom_resolution(display.display, wh); - } - } - } - - #[inline] - pub fn handle_peer_switch_display(&self, display: &SwitchDisplay) { - self.ui_handler.switch_display(display); - self.set_custom_resolution(display); - } - - #[inline] - pub fn change_resolution(&self, display: i32, width: i32, height: i32) { - *self.last_change_display.lock().unwrap() = - ChangeDisplayRecord::new(display, width, height); - self.do_change_resolution(display, width, height); - } - - #[inline] - fn try_change_init_resolution(&self, display: i32) { - let Some((w, h)) = self.lc.read().unwrap().get_custom_resolution(display) else { - return; - }; - self.change_resolution(display, w, h); - } - - fn do_change_resolution(&self, display: i32, width: i32, height: i32) { - let mut misc = Misc::new(); - let resolution = Resolution { - width, - height, - ..Default::default() - }; - if crate::common::is_support_multi_ui_session_num(self.lc.read().unwrap().version) { - misc.set_change_display_resolution(DisplayResolution { - display, - resolution: Some(resolution).into(), - ..Default::default() - }); - } else { - misc.set_change_resolution(resolution); - } - let mut msg = Message::new(); - msg.set_misc(misc); - self.send(Data::Message(msg)); - } - - #[inline] - pub fn request_voice_call(&self) { - #[cfg(target_os = "linux")] - std::thread::spawn(crate::ipc::start_pa); - self.send(Data::NewVoiceCall); - } - - #[inline] - pub fn close_voice_call(&self) { - self.send(Data::CloseVoiceCall); - } - - pub fn send_selected_session_id(&self, sid: String) { - if let Ok(sid) = sid.parse::() { - self.lc.write().unwrap().selected_windows_session_id = Some(sid); - let mut misc = Misc::new(); - misc.set_selected_sid(sid); - let mut msg = Message::new(); - msg.set_misc(misc); - self.send(Data::Message(msg)); - let pi = self.lc.read().unwrap().peer_info.clone(); - if let Some(pi) = pi { - if pi.windows_sessions.current_sid == sid { - if self.is_file_transfer() { - if pi.username.is_empty() { - self.on_error( - "No active console user logged on, please connect and logon first.", - ); - } else { - #[cfg(not(feature = "flutter"))] - { - let remote_dir = self.get_option("remote_dir".to_string()); - let show_hidden = - !self.get_option("remote_show_hidden".to_string()).is_empty(); - self.read_remote_dir(remote_dir, show_hidden); - } - } - } else if !self.is_terminal() { - self.msgbox( - "success", - "Successful", - "Connected, waiting for image...", - "", - ); - } - } - } - } else { - log::error!("selected invalid sid: {}", sid); - } - } - - #[inline] - pub fn request_init_msgs(&self, display: usize) { - self.send_message_query(display); - } - - fn send_message_query(&self, display: usize) { - let mut misc = Misc::new(); - misc.set_message_query(MessageQuery { - switch_display: display as _, - ..Default::default() - }); - let mut msg = Message::new(); - msg.set_misc(misc); - self.send(Data::Message(msg)); - } - - pub fn get_conn_token(&self) -> Option { - self.lc.read().unwrap().get_conn_token() - } - - pub fn printer_response(&self, id: i32, path: String, printer_name: String) { - self.printer_names.write().unwrap().insert(id, printer_name); - let to = std::env::temp_dir().join(format!("rustdesk_printer_{id}")); - self.send(Data::SendFiles(( - id, - hbb_common::fs::JobType::Printer, - path, - to.to_string_lossy().to_string(), - 0, - false, - true, - ))); - } -} - -pub trait InvokeUiSession: Send + Sync + Clone + 'static + Sized + Default { - fn set_cursor_data(&self, cd: CursorData); - fn set_cursor_id(&self, id: String); - fn set_cursor_position(&self, cp: CursorPosition); - fn set_display(&self, x: i32, y: i32, w: i32, h: i32, cursor_embedded: bool, scale: f64); - fn switch_display(&self, display: &SwitchDisplay); - fn set_peer_info(&self, peer_info: &PeerInfo); // flutter - fn set_displays(&self, displays: &Vec); - fn set_platform_additions(&self, data: &str); - fn on_connected(&self, conn_type: ConnType); - fn update_privacy_mode(&self); - fn set_permission(&self, name: &str, value: bool); - fn close_success(&self); - fn update_quality_status(&self, qs: QualityStatus); - fn set_connection_type(&self, is_secured: bool, direct: bool, stream_type: &str); - fn set_fingerprint(&self, fingerprint: String); - fn job_error(&self, id: i32, err: String, file_num: i32); - fn job_done(&self, id: i32, file_num: i32); - fn clear_all_jobs(&self); - fn new_message(&self, msg: String); - fn update_transfer_list(&self); - fn load_last_job(&self, cnt: i32, job_json: &str, auto_start: bool); - fn update_folder_files( - &self, - id: i32, - entries: &Vec, - path: String, - is_local: bool, - only_count: bool, - ); - fn confirm_delete_files(&self, id: i32, i: i32, name: String); - fn override_file_confirm( - &self, - id: i32, - file_num: i32, - to: String, - is_upload: bool, - is_identical: bool, - ); - fn update_block_input_state(&self, on: bool); - fn job_progress(&self, id: i32, file_num: i32, speed: f64, finished_size: f64); - fn adapt_size(&self); - fn on_rgba(&self, display: usize, rgba: &mut scrap::ImageRgb); - fn msgbox(&self, msgtype: &str, title: &str, text: &str, link: &str, retry: bool); - #[cfg(any(target_os = "android", target_os = "ios"))] - fn clipboard(&self, content: String); - fn cancel_msgbox(&self, tag: &str); - fn switch_back(&self, id: &str); - fn portable_service_running(&self, running: bool); - fn on_voice_call_started(&self); - fn on_voice_call_closed(&self, reason: &str); - fn on_voice_call_waiting(&self); - fn on_voice_call_incoming(&self); - fn get_rgba(&self, display: usize) -> *const u8; - fn next_rgba(&self, display: usize); - #[cfg(all(feature = "vram", feature = "flutter"))] - fn on_texture(&self, display: usize, texture: *mut c_void); - fn set_multiple_windows_session(&self, sessions: Vec); - fn set_current_display(&self, disp_idx: i32); - #[cfg(feature = "flutter")] - fn is_multi_ui_session(&self) -> bool; - fn update_record_status(&self, start: bool); - fn update_empty_dirs(&self, _res: ReadEmptyDirsResponse) {} - fn printer_request(&self, id: i32, path: String); - fn handle_screenshot_resp(&self, sid: String, msg: String); - fn handle_terminal_response(&self, response: TerminalResponse); -} - -impl Deref for Session { - type Target = T; - - fn deref(&self) -> &Self::Target { - &self.ui_handler - } -} - -impl DerefMut for Session { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.ui_handler - } -} - -impl FileManager for Session {} - -#[async_trait] -impl Interface for Session { - fn get_lch(&self) -> Arc> { - return self.lc.clone(); - } - - fn send(&self, data: Data) { - if let Some(sender) = self.sender.read().unwrap().as_ref() { - sender.send(data).ok(); - } - } - - fn msgbox(&self, msgtype: &str, title: &str, text: &str, link: &str) { - let direct = self.lc.read().unwrap().direct; - let received = self.lc.read().unwrap().received; - let retry_for_relay = direct == Some(true) && !received; - let retry = check_if_retry(msgtype, title, text, retry_for_relay); - self.ui_handler.msgbox(msgtype, title, text, link, retry); - } - - fn handle_login_error(&self, err: &str) -> bool { - handle_login_error(self.lc.clone(), err, self) - } - - fn set_multiple_windows_session(&self, sessions: Vec) { - self.ui_handler.set_multiple_windows_session(sessions); - } - - fn handle_peer_info(&self, mut pi: PeerInfo) { - log::debug!("handle_peer_info :{:?}", pi); - self.lc.write().unwrap().peer_info = Some(pi.clone()); - if pi.current_display as usize >= pi.displays.len() { - pi.current_display = 0; - } - if get_version_number(&pi.version) < get_version_number("1.1.10") { - self.set_permission("restart", false); - } - if self.is_file_transfer() { - if pi.username.is_empty() && pi.windows_sessions.sessions.is_empty() { - self.on_error("No active console user logged on, please connect and logon first."); - return; - } - } else if !self.is_port_forward() && !self.is_terminal() { - if pi.displays.is_empty() { - self.lc.write().unwrap().handle_peer_info(&pi); - self.update_privacy_mode(); - let msg = if self.is_view_camera() { - "No cameras" - } else { - "No displays" - }; - self.msgbox("error", "Error", msg, ""); - return; - } - self.try_change_init_resolution(pi.current_display); - let p = self.lc.read().unwrap().should_auto_login(); - if !p.is_empty() { - input_os_password(p, true, self.clone()); - } - let current = &pi.displays[pi.current_display as usize]; - self.set_display( - current.x, - current.y, - current.width, - current.height, - current.cursor_embedded, - current.scale, - ); - } - self.update_privacy_mode(); - // Clear audit_guid when connection is established successfully - *self.audit_guid.lock().unwrap() = String::new(); - *self.last_audit_note.lock().unwrap() = String::new(); - // Save recent peers, then push event to flutter. So flutter can refresh peer page. - self.lc.write().unwrap().handle_peer_info(&pi); - self.set_peer_info(&pi); - if self.is_file_transfer() { - self.close_success(); - } else if !self.is_port_forward() && !self.is_terminal() { - self.msgbox( - "success", - "Successful", - "Connected, waiting for image...", - "", - ); - } - self.on_connected(self.lc.read().unwrap().conn_type); - #[cfg(windows)] - { - let mut path = std::env::temp_dir(); - path.push(self.get_id()); - let path = path.with_extension(crate::get_app_name().to_lowercase()); - std::fs::File::create(&path).ok(); - if let Some(path) = path.to_str() { - crate::platform::windows::add_recent_document(&path); - } - } - if !pi.windows_sessions.sessions.is_empty() { - let selected = self - .lc - .read() - .unwrap() - .selected_windows_session_id - .to_owned(); - if selected == Some(pi.windows_sessions.current_sid) { - self.send_selected_session_id(pi.windows_sessions.current_sid.to_string()); - } else { - self.set_multiple_windows_session(pi.windows_sessions.sessions.clone()); - } - } - } - - async fn handle_hash(&self, pass: &str, hash: Hash, peer: &mut Stream) { - handle_hash(self.lc.clone(), pass, hash, self, peer).await; - } - - async fn handle_login_from_ui( - &self, - os_username: String, - os_password: String, - password: String, - remember: bool, - peer: &mut Stream, - ) { - handle_login_from_ui( - self.lc.clone(), - os_username, - os_password, - password, - remember, - peer, - ) - .await; - } - - async fn handle_test_delay(&self, t: TestDelay, peer: &mut Stream) { - if !t.from_client { - self.update_quality_status(QualityStatus { - delay: Some(t.last_delay as _), - target_bitrate: Some(t.target_bitrate as _), - ..Default::default() - }); - handle_test_delay(t, peer).await; - } - } - - fn swap_modifier_mouse(&self, msg: &mut hbb_common::protos::message::MouseEvent) { - let allow_swap_key = self.get_toggle_option("allow_swap_key".to_string()); - if allow_swap_key { - msg.modifiers = msg - .modifiers - .iter() - .map(|ck| { - let ck = ck.enum_value_or_default(); - let ck = match ck { - ControlKey::Control => ControlKey::Meta, - ControlKey::Meta => ControlKey::Control, - ControlKey::RControl => ControlKey::Meta, - ControlKey::RWin => ControlKey::Control, - _ => ck, - }; - hbb_common::protobuf::EnumOrUnknown::new(ck) - }) - .collect(); - }; - } -} - -impl Session { - pub fn lock_screen(&self) { - self.send_key_event(&crate::keyboard::client::event_lock_screen()); - } - pub fn ctrl_alt_del(&self) { - self.send_key_event(&crate::keyboard::client::event_ctrl_alt_del()); - } -} - -#[tokio::main(flavor = "current_thread")] -pub async fn io_loop(handler: Session, round: u32) { - #[cfg(any(target_os = "android", target_os = "ios"))] - let (sender, receiver) = mpsc::unbounded_channel::(); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - let (sender, mut receiver) = mpsc::unbounded_channel::(); - *handler.sender.write().unwrap() = Some(sender.clone()); - let token = LocalConfig::get_option("access_token"); - let key = crate::get_key(false).await; - #[cfg(not(any(target_os = "android", target_os = "ios")))] - if handler.is_port_forward() { - if handler.is_rdp() { - let port = handler - .get_option("rdp_port".to_owned()) - .parse::() - .unwrap_or(3389); - std::env::set_var( - "rdp_username", - handler.get_option("rdp_username".to_owned()), - ); - std::env::set_var( - "rdp_password", - handler.get_option("rdp_password".to_owned()), - ); - log::info!("Remote rdp port: {}", port); - start_one_port_forward(handler, 0, "".to_owned(), port, receiver, &key, &token).await; - } else if handler.args.len() == 0 { - let pfs = handler.lc.read().unwrap().port_forwards.clone(); - let mut queues = HashMap::>::new(); - for d in pfs { - sender.send(Data::AddPortForward(d)).ok(); - } - loop { - match receiver.recv().await { - Some(Data::AddPortForward((port, remote_host, remote_port))) => { - if port <= 0 || remote_port <= 0 { - continue; - } - let (sender, receiver) = mpsc::unbounded_channel::(); - queues.insert(port, sender); - let handler = handler.clone(); - let key = key.clone(); - let token = token.clone(); - tokio::spawn(async move { - start_one_port_forward( - handler, - port, - remote_host, - remote_port, - receiver, - &key, - &token, - ) - .await; - }); - } - Some(Data::RemovePortForward(port)) => { - if let Some(s) = queues.remove(&port) { - s.send(Data::Close).ok(); - } - } - Some(Data::Close) => { - break; - } - Some(d) => { - for (_, s) in queues.iter() { - s.send(d.clone()).ok(); - } - } - _ => {} - } - } - } else { - let port = handler.args[0].parse::().unwrap_or(0); - if handler.args.len() != 3 - || handler.args[2].parse::().unwrap_or(0) <= 0 - || port <= 0 - { - handler.on_error("Invalid arguments, usage:

    rustdesk --port-forward remote-id listen-port remote-host remote-port"); - } - let remote_host = handler.args[1].clone(); - let remote_port = handler.args[2].parse::().unwrap_or(0); - start_one_port_forward( - handler, - port, - remote_host, - remote_port, - receiver, - &key, - &token, - ) - .await; - } - return; - } - let mut remote = Remote::new(handler, receiver, sender); - remote.io_loop(&key, &token, round).await; - let _ = remote.sync_jobs_status_to_local().await; -} - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -async fn start_one_port_forward( - handler: Session, - port: i32, - remote_host: String, - remote_port: i32, - receiver: mpsc::UnboundedReceiver, - key: &str, - token: &str, -) { - if let Err(err) = crate::port_forward::listen( - handler.get_id(), - handler.password.clone(), - port, - handler.clone(), - receiver, - key, - token, - handler.lc.clone(), - remote_host, - remote_port, - ) - .await - { - handler.on_error(&format!("Failed to listen on {}: {}", port, err)); - } - log::info!("port forward (:{}) exit", port); -} - -#[tokio::main(flavor = "current_thread")] -async fn send_note(url: String, id: String, sid: u64, note: String) { - let body = serde_json::json!({ "id": id, "session_id": sid, "note": note }); - allow_err!(crate::post_request(url, body.to_string(), "").await); -} diff --git a/shelled/rustdesk-as-ref/src/updater.rs b/shelled/rustdesk-as-ref/src/updater.rs deleted file mode 100644 index 357f111..0000000 --- a/shelled/rustdesk-as-ref/src/updater.rs +++ /dev/null @@ -1,290 +0,0 @@ -use crate::{common::do_check_software_update, hbbs_http::create_http_client_with_url}; -use hbb_common::{bail, config, log, ResultType}; -use std::{ - io::Write, - path::PathBuf, - sync::{ - atomic::{AtomicUsize, Ordering}, - mpsc::{channel, Receiver, Sender}, - Mutex, - }, - time::{Duration, Instant}, -}; - -enum UpdateMsg { - CheckUpdate, - Exit, -} - -lazy_static::lazy_static! { - static ref TX_MSG : Mutex> = Mutex::new(start_auto_update_check()); -} - -static CONTROLLING_SESSION_COUNT: AtomicUsize = AtomicUsize::new(0); - -const DUR_ONE_DAY: Duration = Duration::from_secs(60 * 60 * 24); - -pub fn update_controlling_session_count(count: usize) { - CONTROLLING_SESSION_COUNT.store(count, Ordering::SeqCst); -} - -#[allow(dead_code)] -pub fn start_auto_update() { - let _sender = TX_MSG.lock().unwrap(); -} - -#[allow(dead_code)] -pub fn manually_check_update() -> ResultType<()> { - let sender = TX_MSG.lock().unwrap(); - sender.send(UpdateMsg::CheckUpdate)?; - Ok(()) -} - -#[allow(dead_code)] -pub fn stop_auto_update() { - let sender = TX_MSG.lock().unwrap(); - sender.send(UpdateMsg::Exit).unwrap_or_default(); -} - -#[inline] -fn has_no_active_conns() -> bool { - let conns = crate::Connection::alive_conns(); - conns.is_empty() && has_no_controlling_conns() -} - -#[cfg(any(not(target_os = "windows"), feature = "flutter"))] -fn has_no_controlling_conns() -> bool { - CONTROLLING_SESSION_COUNT.load(Ordering::SeqCst) == 0 -} - -#[cfg(not(any(not(target_os = "windows"), feature = "flutter")))] -fn has_no_controlling_conns() -> bool { - let app_exe = format!("{}.exe", crate::get_app_name().to_lowercase()); - for arg in [ - "--connect", - "--play", - "--file-transfer", - "--view-camera", - "--port-forward", - "--rdp", - ] { - if !crate::platform::get_pids_of_process_with_first_arg(&app_exe, arg).is_empty() { - return false; - } - } - true -} - -fn start_auto_update_check() -> Sender { - let (tx, rx) = channel(); - std::thread::spawn(move || start_auto_update_check_(rx)); - return tx; -} - -fn start_auto_update_check_(rx_msg: Receiver) { - std::thread::sleep(Duration::from_secs(30)); - if let Err(e) = check_update(false) { - log::error!("Error checking for updates: {}", e); - } - - const MIN_INTERVAL: Duration = Duration::from_secs(60 * 10); - const RETRY_INTERVAL: Duration = Duration::from_secs(60 * 30); - let mut last_check_time = Instant::now(); - let mut check_interval = DUR_ONE_DAY; - loop { - let recv_res = rx_msg.recv_timeout(check_interval); - match &recv_res { - Ok(UpdateMsg::CheckUpdate) | Err(_) => { - if last_check_time.elapsed() < MIN_INTERVAL { - // log::debug!("Update check skipped due to minimum interval."); - continue; - } - // Don't check update if there are alive connections. - if !has_no_active_conns() { - check_interval = RETRY_INTERVAL; - continue; - } - if let Err(e) = check_update(matches!(recv_res, Ok(UpdateMsg::CheckUpdate))) { - log::error!("Error checking for updates: {}", e); - check_interval = RETRY_INTERVAL; - } else { - last_check_time = Instant::now(); - check_interval = DUR_ONE_DAY; - } - } - Ok(UpdateMsg::Exit) => break, - } - } -} - -fn check_update(manually: bool) -> ResultType<()> { - #[cfg(target_os = "windows")] - let update_msi = crate::platform::is_msi_installed()? && !crate::is_custom_client(); - if !(manually || config::Config::get_bool_option(config::keys::OPTION_ALLOW_AUTO_UPDATE)) { - return Ok(()); - } - if do_check_software_update().is_err() { - // ignore - return Ok(()); - } - - let update_url = crate::common::SOFTWARE_UPDATE_URL.lock().unwrap().clone(); - if update_url.is_empty() { - log::debug!("No update available."); - } else { - let download_url = update_url.replace("tag", "download"); - let version = download_url.split('/').last().unwrap_or_default(); - #[cfg(target_os = "windows")] - let download_url = if cfg!(feature = "flutter") { - format!( - "{}/rustdesk-{}-x86_64.{}", - download_url, - version, - if update_msi { "msi" } else { "exe" } - ) - } else { - format!("{}/rustdesk-{}-x86-sciter.exe", download_url, version) - }; - log::debug!("New version available: {}", &version); - let client = create_http_client_with_url(&download_url); - let Some(file_path) = get_download_file_from_url(&download_url) else { - bail!("Failed to get the file path from the URL: {}", download_url); - }; - let mut is_file_exists = false; - if file_path.exists() { - // Check if the file size is the same as the server file size - // If the file size is the same, we don't need to download it again. - let file_size = std::fs::metadata(&file_path)?.len(); - let response = client.head(&download_url).send()?; - if !response.status().is_success() { - bail!("Failed to get the file size: {}", response.status()); - } - let total_size = response - .headers() - .get(reqwest::header::CONTENT_LENGTH) - .and_then(|ct_len| ct_len.to_str().ok()) - .and_then(|ct_len| ct_len.parse::().ok()); - let Some(total_size) = total_size else { - bail!("Failed to get content length"); - }; - if file_size == total_size { - is_file_exists = true; - } else { - std::fs::remove_file(&file_path)?; - } - } - if !is_file_exists { - let response = client.get(&download_url).send()?; - if !response.status().is_success() { - bail!( - "Failed to download the new version file: {}", - response.status() - ); - } - let file_data = response.bytes()?; - let mut file = std::fs::File::create(&file_path)?; - file.write_all(&file_data)?; - } - // We have checked if the `conns` is empty before, but we need to check again. - // No need to care about the downloaded file here, because it's rare case that the `conns` are empty - // before the download, but not empty after the download. - if has_no_active_conns() { - #[cfg(target_os = "windows")] - update_new_version(update_msi, &version, &file_path); - } - } - Ok(()) -} - -#[cfg(target_os = "windows")] -fn update_new_version(update_msi: bool, version: &str, file_path: &PathBuf) { - log::debug!( - "New version is downloaded, update begin, update msi: {update_msi}, version: {version}, file: {:?}", - file_path.to_str() - ); - if let Some(p) = file_path.to_str() { - if let Some(session_id) = crate::platform::get_current_process_session_id() { - if update_msi { - match crate::platform::update_me_msi(p, true) { - Ok(_) => { - log::debug!("New version \"{}\" updated.", version); - } - Err(e) => { - log::error!( - "Failed to install the new msi version \"{}\": {}", - version, - e - ); - std::fs::remove_file(&file_path).ok(); - } - } - } else { - let custom_client_staging_dir = if crate::is_custom_client() { - let custom_client_staging_dir = - crate::platform::get_custom_client_staging_dir(); - if let Err(e) = crate::platform::handle_custom_client_staging_dir_before_update( - &custom_client_staging_dir, - ) { - log::error!( - "Failed to handle custom client staging dir before update: {}", - e - ); - std::fs::remove_file(&file_path).ok(); - return; - } - Some(custom_client_staging_dir) - } else { - // Clean up any residual staging directory from previous custom client - let staging_dir = crate::platform::get_custom_client_staging_dir(); - hbb_common::allow_err!(crate::platform::remove_custom_client_staging_dir( - &staging_dir - )); - None - }; - let update_launched = match crate::platform::launch_privileged_process( - session_id, - &format!("{} --update", p), - ) { - Ok(h) => { - if h.is_null() { - log::error!("Failed to update to the new version: {}", version); - false - } else { - log::debug!("New version \"{}\" is launched.", version); - true - } - } - Err(e) => { - log::error!("Failed to run the new version: {}", e); - false - } - }; - if !update_launched { - if let Some(dir) = custom_client_staging_dir { - hbb_common::allow_err!(crate::platform::remove_custom_client_staging_dir( - &dir - )); - } - std::fs::remove_file(&file_path).ok(); - } - } - } else { - log::error!( - "Failed to get the current process session id, Error {}", - std::io::Error::last_os_error() - ); - std::fs::remove_file(&file_path).ok(); - } - } else { - // unreachable!() - log::error!( - "Failed to convert the file path to string: {}", - file_path.display() - ); - } -} - -pub fn get_download_file_from_url(url: &str) -> Option { - let filename = url.split('/').last()?; - Some(std::env::temp_dir().join(filename)) -} diff --git a/shelled/rustdesk-as-ref/src/virtual_display_manager.rs b/shelled/rustdesk-as-ref/src/virtual_display_manager.rs deleted file mode 100644 index f0645e4..0000000 --- a/shelled/rustdesk-as-ref/src/virtual_display_manager.rs +++ /dev/null @@ -1,925 +0,0 @@ -use hbb_common::{bail, platform::windows::is_windows_version_or_greater, ResultType}; - -// This string is defined here. -// https://github.com/rustdesk-org/RustDeskIddDriver/blob/b370aad3f50028b039aad211df60c8051c4a64d6/RustDeskIddDriver/RustDeskIddDriver.inf#LL73C1-L73C40 -pub const RUSTDESK_IDD_DEVICE_STRING: &'static str = "RustDeskIddDriver Device\0"; -pub const AMYUNI_IDD_DEVICE_STRING: &'static str = "USB Mobile Monitor Virtual Display\0"; - -const IDD_IMPL: &str = IDD_IMPL_AMYUNI; -const IDD_IMPL_RUSTDESK: &str = "rustdesk_idd"; -const IDD_IMPL_AMYUNI: &str = "amyuni_idd"; -const IDD_PLUG_OUT_ALL_INDEX: i32 = -1; - -pub fn is_amyuni_idd() -> bool { - IDD_IMPL == IDD_IMPL_AMYUNI -} - -pub fn get_cur_device_string() -> &'static str { - match IDD_IMPL { - IDD_IMPL_RUSTDESK => RUSTDESK_IDD_DEVICE_STRING, - IDD_IMPL_AMYUNI => AMYUNI_IDD_DEVICE_STRING, - _ => "", - } -} - -pub fn is_virtual_display_supported() -> bool { - #[cfg(target_os = "windows")] - { - is_windows_version_or_greater(10, 0, 19041, 0, 0) - } - #[cfg(not(target_os = "windows"))] - { - false - } -} - -pub fn plug_in_headless() -> ResultType<()> { - match IDD_IMPL { - IDD_IMPL_RUSTDESK => rustdesk_idd::plug_in_headless(), - IDD_IMPL_AMYUNI => amyuni_idd::plug_in_headless(), - _ => bail!("Unsupported virtual display implementation."), - } -} - -pub fn get_platform_additions() -> serde_json::Map { - let mut map = serde_json::Map::new(); - if !crate::platform::windows::is_self_service_running() { - return map; - } - map.insert("idd_impl".into(), serde_json::json!(IDD_IMPL)); - match IDD_IMPL { - IDD_IMPL_RUSTDESK => { - let virtual_displays = rustdesk_idd::get_virtual_displays(); - if !virtual_displays.is_empty() { - map.insert( - "rustdesk_virtual_displays".into(), - serde_json::json!(virtual_displays), - ); - } - } - IDD_IMPL_AMYUNI => { - let c = amyuni_idd::get_monitor_count(); - if c > 0 { - map.insert("amyuni_virtual_displays".into(), serde_json::json!(c)); - } - } - _ => {} - } - map -} - -#[inline] -pub fn plug_in_monitor(idx: u32, modes: Vec) -> ResultType<()> { - match IDD_IMPL { - IDD_IMPL_RUSTDESK => rustdesk_idd::plug_in_index_modes(idx, modes), - IDD_IMPL_AMYUNI => amyuni_idd::plug_in_monitor(), - _ => bail!("Unsupported virtual display implementation."), - } -} - -pub fn plug_out_monitor(index: i32, force_all: bool, force_one: bool) -> ResultType<()> { - match IDD_IMPL { - IDD_IMPL_RUSTDESK => { - let indices = if index == IDD_PLUG_OUT_ALL_INDEX { - rustdesk_idd::get_virtual_displays() - } else { - vec![index as _] - }; - rustdesk_idd::plug_out_peer_request(&indices) - } - IDD_IMPL_AMYUNI => amyuni_idd::plug_out_monitor(index, force_all, force_one), - _ => bail!("Unsupported virtual display implementation."), - } -} - -pub fn plug_in_peer_request(modes: Vec>) -> ResultType> { - match IDD_IMPL { - IDD_IMPL_RUSTDESK => rustdesk_idd::plug_in_peer_request(modes), - IDD_IMPL_AMYUNI => { - amyuni_idd::plug_in_monitor()?; - Ok(vec![0]) - } - _ => bail!("Unsupported virtual display implementation."), - } -} - -pub fn plug_out_monitor_indices( - indices: &[u32], - force_all: bool, - force_one: bool, -) -> ResultType<()> { - match IDD_IMPL { - IDD_IMPL_RUSTDESK => rustdesk_idd::plug_out_peer_request(indices), - IDD_IMPL_AMYUNI => { - for _idx in indices.iter() { - amyuni_idd::plug_out_monitor(0, force_all, force_one)?; - } - Ok(()) - } - _ => bail!("Unsupported virtual display implementation."), - } -} - -pub fn reset_all() -> ResultType<()> { - match IDD_IMPL { - IDD_IMPL_RUSTDESK => rustdesk_idd::reset_all(), - IDD_IMPL_AMYUNI => amyuni_idd::reset_all(), - _ => bail!("Unsupported virtual display implementation."), - } -} - -pub mod rustdesk_idd { - use super::windows; - use hbb_common::{allow_err, bail, lazy_static, log, ResultType}; - use std::{ - collections::{HashMap, HashSet}, - sync::{Arc, Mutex}, - }; - - // virtual display index range: 0 - 2 are reserved for headless and other special uses. - const VIRTUAL_DISPLAY_INDEX_FOR_HEADLESS: u32 = 0; - const VIRTUAL_DISPLAY_START_FOR_PEER: u32 = 1; - const VIRTUAL_DISPLAY_MAX_COUNT: u32 = 5; - - lazy_static::lazy_static! { - static ref VIRTUAL_DISPLAY_MANAGER: Arc> = - Arc::new(Mutex::new(VirtualDisplayManager::default())); - } - - #[derive(Default)] - struct VirtualDisplayManager { - headless_index_name: Option<(u32, String)>, - peer_index_name: HashMap, - is_driver_installed: bool, - } - - impl VirtualDisplayManager { - fn prepare_driver(&mut self) -> ResultType<()> { - if !self.is_driver_installed { - self.install_update_driver()?; - } - Ok(()) - } - - fn install_update_driver(&mut self) -> ResultType<()> { - if let Err(e) = virtual_display::create_device() { - if !e.to_string().contains("Device is already created") { - bail!("Create device failed {}", e); - } - } - // Reboot is not required for this case. - let mut _reboot_required = false; - virtual_display::install_update_driver(&mut _reboot_required)?; - self.is_driver_installed = true; - Ok(()) - } - - fn plug_in_monitor(index: u32, modes: &[virtual_display::MonitorMode]) -> ResultType<()> { - if let Err(e) = virtual_display::plug_in_monitor(index) { - bail!("Plug in monitor failed {}", e); - } - if let Err(e) = virtual_display::update_monitor_modes(index, &modes) { - log::error!("Update monitor modes failed {}", e); - } - Ok(()) - } - } - - pub fn install_update_driver() -> ResultType<()> { - VIRTUAL_DISPLAY_MANAGER - .lock() - .unwrap() - .install_update_driver() - } - - #[inline] - fn get_device_names() -> Vec { - windows::get_device_names(Some(super::RUSTDESK_IDD_DEVICE_STRING)) - } - - pub fn plug_in_headless() -> ResultType<()> { - let mut manager = VIRTUAL_DISPLAY_MANAGER.lock().unwrap(); - manager.prepare_driver()?; - let modes = [virtual_display::MonitorMode { - width: 1920, - height: 1080, - sync: 60, - }]; - let device_names = get_device_names().into_iter().collect(); - VirtualDisplayManager::plug_in_monitor(VIRTUAL_DISPLAY_INDEX_FOR_HEADLESS, &modes)?; - let device_name = get_new_device_name(&device_names); - manager.headless_index_name = Some((VIRTUAL_DISPLAY_INDEX_FOR_HEADLESS, device_name)); - Ok(()) - } - - pub fn plug_out_headless() -> bool { - let mut manager = VIRTUAL_DISPLAY_MANAGER.lock().unwrap(); - if let Some((index, _)) = manager.headless_index_name.take() { - if let Err(e) = virtual_display::plug_out_monitor(index) { - log::error!("Plug out monitor failed {}", e); - } - true - } else { - false - } - } - - fn get_new_device_name(device_names: &HashSet) -> String { - for _ in 0..3 { - let device_names_af: HashSet = get_device_names().into_iter().collect(); - let diff_names: Vec<_> = device_names_af.difference(&device_names).collect(); - if diff_names.len() == 1 { - return diff_names[0].clone(); - } else if diff_names.len() > 1 { - log::error!( - "Failed to get diff device names after plugin virtual display, more than one diff names: {:?}", - &diff_names - ); - return "".to_string(); - } - // Sleep is needed here to wait for the virtual display to be ready. - std::thread::sleep(std::time::Duration::from_millis(50)); - } - log::error!("Failed to get diff device names after plugin virtual display",); - "".to_string() - } - - pub fn get_virtual_displays() -> Vec { - VIRTUAL_DISPLAY_MANAGER - .lock() - .unwrap() - .peer_index_name - .keys() - .cloned() - .collect() - } - - pub fn plug_in_index_modes( - idx: u32, - mut modes: Vec, - ) -> ResultType<()> { - let mut manager = VIRTUAL_DISPLAY_MANAGER.lock().unwrap(); - manager.prepare_driver()?; - if !manager.peer_index_name.contains_key(&idx) { - let device_names = get_device_names().into_iter().collect(); - if modes.is_empty() { - modes.push(virtual_display::MonitorMode { - width: 1920, - height: 1080, - sync: 60, - }); - } - match VirtualDisplayManager::plug_in_monitor(idx, modes.as_slice()) { - Ok(_) => { - let device_name = get_new_device_name(&device_names); - manager.peer_index_name.insert(idx, device_name); - } - Err(e) => { - log::error!("Plug in monitor failed {}", e); - } - } - } - Ok(()) - } - - pub fn reset_all() -> ResultType<()> { - if super::is_virtual_display_supported() { - return Ok(()); - } - - if let Err(e) = plug_out_peer_request(&get_virtual_displays()) { - log::error!("Failed to plug out virtual displays: {}", e); - } - let _ = plug_out_headless(); - Ok(()) - } - - pub fn plug_in_peer_request( - modes: Vec>, - ) -> ResultType> { - let mut manager = VIRTUAL_DISPLAY_MANAGER.lock().unwrap(); - manager.prepare_driver()?; - - let mut indices: Vec = Vec::new(); - for m in modes.iter() { - for idx in VIRTUAL_DISPLAY_START_FOR_PEER..VIRTUAL_DISPLAY_MAX_COUNT { - if !manager.peer_index_name.contains_key(&idx) { - let device_names = get_device_names().into_iter().collect(); - match VirtualDisplayManager::plug_in_monitor(idx, m) { - Ok(_) => { - let device_name = get_new_device_name(&device_names); - manager.peer_index_name.insert(idx, device_name); - indices.push(idx); - } - Err(e) => { - log::error!("Plug in monitor failed {}", e); - } - } - break; - } - } - } - - Ok(indices) - } - - pub fn plug_out_peer_request(indices: &[u32]) -> ResultType<()> { - let mut manager = VIRTUAL_DISPLAY_MANAGER.lock().unwrap(); - for idx in indices.iter() { - if manager.peer_index_name.contains_key(idx) { - allow_err!(virtual_display::plug_out_monitor(*idx)); - manager.peer_index_name.remove(idx); - } - } - Ok(()) - } - - pub fn is_virtual_display(name: &str) -> bool { - let lock = VIRTUAL_DISPLAY_MANAGER.lock().unwrap(); - if let Some((_, device_name)) = &lock.headless_index_name { - if windows::is_device_name(device_name, name) { - return true; - } - } - for (_, v) in lock.peer_index_name.iter() { - if windows::is_device_name(v, name) { - return true; - } - } - false - } - - fn change_resolution(index: u32, w: u32, h: u32) -> bool { - let modes = [virtual_display::MonitorMode { - width: w, - height: h, - sync: 60, - }]; - match virtual_display::update_monitor_modes(index, &modes) { - Ok(_) => true, - Err(e) => { - log::error!("Update monitor {} modes {:?} failed: {}", index, &modes, e); - false - } - } - } - - pub fn change_resolution_if_is_virtual_display(name: &str, w: u32, h: u32) -> Option { - let lock = VIRTUAL_DISPLAY_MANAGER.lock().unwrap(); - if let Some((index, device_name)) = &lock.headless_index_name { - if windows::is_device_name(device_name, name) { - return Some(change_resolution(*index, w, h)); - } - } - - for (k, v) in lock.peer_index_name.iter() { - if windows::is_device_name(v, name) { - return Some(change_resolution(*k, w, h)); - } - } - None - } -} - -pub mod amyuni_idd { - use super::windows; - use crate::platform::{reg_display_settings, win_device}; - use hbb_common::{bail, lazy_static, log, tokio::time::Instant, ResultType}; - use std::{ - ptr::null_mut, - sync::{atomic, Arc, Mutex}, - time::Duration, - }; - use winapi::{ - shared::{guiddef::GUID, winerror::ERROR_NO_MORE_ITEMS}, - um::shellapi::ShellExecuteA, - }; - - const INF_PATH: &str = r#"usbmmidd_v2\usbmmIdd.inf"#; - const INTERFACE_GUID: GUID = GUID { - Data1: 0xb5ffd75f, - Data2: 0xda40, - Data3: 0x4353, - Data4: [0x8f, 0xf8, 0xb6, 0xda, 0xf6, 0xf1, 0xd8, 0xca], - }; - const HARDWARE_ID: &str = "usbmmidd"; - const PLUG_MONITOR_IO_CONTROL_CDOE: u32 = 2307084; - const INSTALLER_EXE_FILE: &str = "deviceinstaller64.exe"; - - lazy_static::lazy_static! { - static ref LOCK: Arc> = Default::default(); - static ref LAST_PLUG_IN_HEADLESS_TIME: Arc>> = Arc::new(Mutex::new(None)); - } - const VIRTUAL_DISPLAY_MAX_COUNT: usize = 4; - // The count of virtual displays plugged in. - // This count is not accurate, because: - // 1. The virtual display driver may also be controlled by other processes. - // 2. RustDesk may crash and restart, but the virtual displays are kept. - // - // to-do: Maybe a better way is to add an option asking the user if plug out all virtual displays on disconnect. - static VIRTUAL_DISPLAY_COUNT: atomic::AtomicUsize = atomic::AtomicUsize::new(0); - - fn get_deviceinstaller64_work_dir() -> ResultType>> { - let cur_exe = std::env::current_exe()?; - let Some(cur_dir) = cur_exe.parent() else { - bail!("Cannot get parent of current exe file."); - }; - let work_dir = cur_dir.join("usbmmidd_v2"); - if !work_dir.exists() { - return Ok(None); - } - let exe_path = work_dir.join(INSTALLER_EXE_FILE); - if !exe_path.exists() { - return Ok(None); - } - - let Some(work_dir) = work_dir.to_str() else { - bail!("Cannot convert work_dir to string."); - }; - let mut work_dir2 = work_dir.as_bytes().to_vec(); - work_dir2.push(0); - Ok(Some(work_dir2)) - } - - pub fn uninstall_driver() -> ResultType<()> { - if let Ok(Some(work_dir)) = get_deviceinstaller64_work_dir() { - if crate::platform::windows::is_x64() { - log::info!("Uninstalling driver by deviceinstaller64.exe"); - install_if_x86_on_x64(&work_dir, "remove usbmmidd")?; - // Sleep some time to wait for the driver to be uninstalled. - std::thread::sleep(Duration::from_secs(2)); - return Ok(()); - } - } - - log::info!("Uninstalling driver by SetupAPI"); - let mut reboot_required = false; - let _ = unsafe { win_device::uninstall_driver(HARDWARE_ID, &mut reboot_required)? }; - Ok(()) - } - - // SetupDiCallClassInstaller() will always fail if current_exe() is built as x86 and running on x64. - // So we need to call another x64 version exe to install and uninstall the driver. - fn install_if_x86_on_x64(work_dir: &[u8], args: &str) -> ResultType<()> { - const SW_HIDE: i32 = 0; - let mut args = args.bytes().collect::>(); - args.push(0); - let mut exe_file = INSTALLER_EXE_FILE.bytes().collect::>(); - exe_file.push(0); - let hi = unsafe { - ShellExecuteA( - null_mut(), - "open\0".as_ptr() as _, - exe_file.as_ptr() as _, - args.as_ptr() as _, - work_dir.as_ptr() as _, - SW_HIDE, - ) as i32 - }; - if hi <= 32 { - log::error!("Failed to run deviceinstaller: {}", hi); - bail!("Failed to run deviceinstaller.") - } - Ok(()) - } - - // If the driver is installed by "deviceinstaller64.exe", the driver will be installed asynchronously. - // The caller must wait some time before using the driver. - fn check_install_driver(is_async: &mut bool) -> ResultType<()> { - let _l = LOCK.lock().unwrap(); - let drivers = windows::get_display_drivers(); - if drivers - .iter() - .any(|(s, c)| s == super::AMYUNI_IDD_DEVICE_STRING && *c == 0) - { - *is_async = false; - return Ok(()); - } - - if let Ok(Some(work_dir)) = get_deviceinstaller64_work_dir() { - if crate::platform::windows::is_x64() { - log::info!("Installing driver by deviceinstaller64.exe"); - install_if_x86_on_x64(&work_dir, "install usbmmidd.inf usbmmidd")?; - *is_async = true; - return Ok(()); - } - } - - let exe_file = std::env::current_exe()?; - let Some(cur_dir) = exe_file.parent() else { - bail!("Cannot get parent of current exe file"); - }; - let inf_path = cur_dir.join(INF_PATH); - if !inf_path.exists() { - bail!("Driver inf file not found."); - } - let inf_path = inf_path.to_string_lossy().to_string(); - - log::info!("Installing driver by SetupAPI"); - let mut reboot_required = false; - let _ = - unsafe { win_device::install_driver(&inf_path, HARDWARE_ID, &mut reboot_required)? }; - *is_async = false; - Ok(()) - } - - pub fn reset_all() -> ResultType<()> { - let _ = crate::privacy_mode::turn_off_privacy(0, None); - let _ = plug_out_monitor(super::IDD_PLUG_OUT_ALL_INDEX, true, false); - *LAST_PLUG_IN_HEADLESS_TIME.lock().unwrap() = None; - Ok(()) - } - - #[inline] - fn plug_monitor_( - add: bool, - wait_timeout: Option, - ) -> Result<(), win_device::DeviceError> { - let cmd = if add { 0x10 } else { 0x00 }; - let cmd = [cmd, 0x00, 0x00, 0x00]; - let now = Instant::now(); - let c1 = get_monitor_count(); - unsafe { - win_device::device_io_control(&INTERFACE_GUID, PLUG_MONITOR_IO_CONTROL_CDOE, &cmd, 0)?; - } - if let Some(wait_timeout) = wait_timeout { - while now.elapsed() < wait_timeout { - if get_monitor_count() != c1 { - break; - } - std::thread::sleep(Duration::from_millis(30)); - } - } - // No need to consider concurrency here. - if add { - // If the monitor is plugged in, increase the count. - // Though there's already a check of `VIRTUAL_DISPLAY_MAX_COUNT`, it's still better to check here for double ensure. - if VIRTUAL_DISPLAY_COUNT.load(atomic::Ordering::SeqCst) < VIRTUAL_DISPLAY_MAX_COUNT { - VIRTUAL_DISPLAY_COUNT.fetch_add(1, atomic::Ordering::SeqCst); - } - } else { - if VIRTUAL_DISPLAY_COUNT.load(atomic::Ordering::SeqCst) > 0 { - VIRTUAL_DISPLAY_COUNT.fetch_sub(1, atomic::Ordering::SeqCst); - } - } - Ok(()) - } - - // `std::thread::sleep()` with a timeout is acceptable here. - // Because user can wait for a while to plug in a monitor. - fn plug_in_monitor_( - add: bool, - is_driver_async_installed: bool, - wait_timeout: Option, - ) -> ResultType<()> { - let timeout = Duration::from_secs(3); - let now = Instant::now(); - let reg_connectivity_old = reg_display_settings::read_reg_connectivity(); - loop { - match plug_monitor_(add, wait_timeout) { - Ok(_) => { - break; - } - Err(e) => { - if is_driver_async_installed { - if let win_device::DeviceError::WinApiLastErr(_, e2) = &e { - if e2.raw_os_error() == Some(ERROR_NO_MORE_ITEMS as _) { - if now.elapsed() < timeout { - std::thread::sleep(Duration::from_millis(100)); - continue; - } - } - } - } - return Err(e.into()); - } - } - } - // Workaround for the issue that we can't set the default the resolution. - if let Ok(old_connectivity_old) = reg_connectivity_old { - std::thread::spawn(move || { - try_reset_resolution_on_first_plug_in(old_connectivity_old.len(), 1920, 1080); - }); - } - - Ok(()) - } - - fn try_reset_resolution_on_first_plug_in( - old_connectivity_len: usize, - width: usize, - height: usize, - ) { - for _ in 0..10 { - std::thread::sleep(Duration::from_millis(300)); - if let Ok(reg_connectivity_new) = reg_display_settings::read_reg_connectivity() { - if reg_connectivity_new.len() != old_connectivity_len { - for name in - windows::get_device_names(Some(super::AMYUNI_IDD_DEVICE_STRING)).iter() - { - crate::platform::change_resolution(&name, width, height).ok(); - } - break; - } - } - } - } - - pub fn plug_in_headless() -> ResultType<()> { - let mut tm = LAST_PLUG_IN_HEADLESS_TIME.lock().unwrap(); - if let Some(tm) = &mut *tm { - if tm.elapsed() < Duration::from_secs(3) { - bail!("Plugging in too frequently."); - } - } - *tm = Some(Instant::now()); - drop(tm); - - let mut is_async = false; - if let Err(e) = check_install_driver(&mut is_async) { - log::error!("Failed to install driver: {}", e); - bail!("Failed to install driver."); - } - - plug_in_monitor_(true, is_async, Some(Duration::from_millis(3_000))) - } - - pub fn plug_in_monitor() -> ResultType<()> { - let mut is_async = false; - if let Err(e) = check_install_driver(&mut is_async) { - log::error!("Failed to install driver: {}", e); - bail!("Failed to install driver."); - } - - if get_monitor_count() == VIRTUAL_DISPLAY_MAX_COUNT { - bail!("There are already {VIRTUAL_DISPLAY_MAX_COUNT} monitors plugged in."); - } - - plug_in_monitor_(true, is_async, None) - } - - // `index` the display index to plug out. -1 means plug out all. - // `force_all` is used to forcibly plug out all virtual displays. - // `force_one` is used to forcibly plug out one virtual display managed by other processes - // if there're no virtual displays managed by RustDesk. - pub fn plug_out_monitor(index: i32, force_all: bool, force_one: bool) -> ResultType<()> { - let plug_out_all = index == super::IDD_PLUG_OUT_ALL_INDEX; - // If `plug_out_all and force_all` is true, forcibly plug out all virtual displays. - // Though the driver may be controlled by other processes, - // we still forcibly plug out all virtual displays. - // - // 1. RustDesk plug in 2 virtual displays. (RustDesk) - // 2. Other process plug out all virtual displays. (User manually) - // 3. Other process plug in 1 virtual display. (User manually) - // 4. RustDesk plug out all virtual displays in this call. (RustDesk disconnect) - // - // This is not a normal scenario, RustDesk will plug out virtual display unexpectedly. - let mut plug_in_count = VIRTUAL_DISPLAY_COUNT.load(atomic::Ordering::Relaxed); - let amyuni_count = get_monitor_count(); - if !plug_out_all { - if plug_in_count == 0 && amyuni_count > 0 { - if force_one { - plug_in_count = 1; - } else { - bail!("The virtual display is managed by other processes."); - } - } - } else { - // Ignore the message if trying to plug out all virtual displays. - } - - let all_count = windows::get_device_names(None).len(); - let mut to_plug_out_count = match all_count { - 0 => return Ok(()), - 1 => { - if plug_in_count == 0 { - bail!("No virtual displays to plug out.") - } else { - if force_all { - 1 - } else { - bail!("This only virtual display cannot be plugged out.") - } - } - } - _ => { - if all_count == plug_in_count { - if force_all { - all_count - } else { - all_count - 1 - } - } else { - plug_in_count - } - } - }; - if to_plug_out_count != 0 && !plug_out_all { - to_plug_out_count = 1; - } - - for _i in 0..to_plug_out_count { - let _ = plug_monitor_(false, None); - } - Ok(()) - } - - #[inline] - pub fn get_monitor_count() -> usize { - windows::get_device_names(Some(super::AMYUNI_IDD_DEVICE_STRING)).len() - } - - #[inline] - pub fn is_my_display(name: &str) -> bool { - windows::get_device_names(Some(super::AMYUNI_IDD_DEVICE_STRING)) - .iter() - .any(|s| windows::is_device_name(s, name)) - } -} - -mod windows { - use std::ptr::null_mut; - use winapi::{ - shared::{ - devguid::GUID_DEVCLASS_DISPLAY, - minwindef::{DWORD, FALSE}, - ntdef::ULONG, - }, - um::{ - cfgmgr32::{CM_Get_DevNode_Status, CR_SUCCESS}, - cguid::GUID_NULL, - setupapi::{ - SetupDiEnumDeviceInfo, SetupDiGetClassDevsW, SetupDiGetDeviceRegistryPropertyW, - SP_DEVINFO_DATA, - }, - wingdi::{ - DEVMODEW, DISPLAY_DEVICEW, DISPLAY_DEVICE_ACTIVE, DISPLAY_DEVICE_MIRRORING_DRIVER, - }, - winnt::HANDLE, - winuser::{EnumDisplayDevicesW, EnumDisplaySettingsExW, ENUM_CURRENT_SETTINGS}, - }, - }; - - const DIGCF_PRESENT: DWORD = 0x00000002; - const SPDRP_DEVICEDESC: DWORD = 0x00000000; - const INVALID_HANDLE_VALUE: HANDLE = -1isize as HANDLE; - - #[inline] - pub(super) fn is_device_name(device_name: &str, name: &str) -> bool { - if name.len() == device_name.len() { - name == device_name - } else if name.len() > device_name.len() { - false - } else { - &device_name[..name.len()] == name && device_name.as_bytes()[name.len() as usize] == 0 - } - } - - pub(super) fn get_device_names(device_string: Option<&str>) -> Vec { - let mut device_names = Vec::new(); - let mut dd: DISPLAY_DEVICEW = unsafe { std::mem::zeroed() }; - dd.cb = std::mem::size_of::() as DWORD; - let mut i_dev_num = 0; - loop { - let result = unsafe { EnumDisplayDevicesW(null_mut(), i_dev_num, &mut dd, 0) }; - if result == 0 { - break; - } - i_dev_num += 1; - - if 0 == (dd.StateFlags & DISPLAY_DEVICE_ACTIVE) - || (dd.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) > 0 - { - continue; - } - - let mut dm: DEVMODEW = unsafe { std::mem::zeroed() }; - dm.dmSize = std::mem::size_of::() as _; - dm.dmDriverExtra = 0; - let ok = unsafe { - EnumDisplaySettingsExW( - dd.DeviceName.as_ptr(), - ENUM_CURRENT_SETTINGS, - &mut dm as _, - 0, - ) - }; - if ok == FALSE { - continue; - } - if dm.dmPelsHeight == 0 || dm.dmPelsWidth == 0 { - continue; - } - - if let (Ok(device_name), Ok(ds)) = ( - String::from_utf16(&dd.DeviceName), - String::from_utf16(&dd.DeviceString), - ) { - if let Some(s) = device_string { - if ds.len() >= s.len() && &ds[..s.len()] == s { - device_names.push(device_name); - } - } else { - device_names.push(device_name); - } - } - } - device_names - } - - pub(super) fn get_display_drivers() -> Vec<(String, u32)> { - let mut display_drivers: Vec<(String, u32)> = Vec::new(); - - let device_info_set = unsafe { - SetupDiGetClassDevsW( - &GUID_DEVCLASS_DISPLAY, - null_mut(), - null_mut(), - DIGCF_PRESENT, - ) - }; - - if device_info_set == INVALID_HANDLE_VALUE { - println!( - "Failed to get device information set. Error: {}", - std::io::Error::last_os_error() - ); - return display_drivers; - } - - let mut device_info_data = SP_DEVINFO_DATA { - cbSize: std::mem::size_of::() as u32, - ClassGuid: GUID_NULL, - DevInst: 0, - Reserved: 0, - }; - - let mut device_index = 0; - loop { - let result = unsafe { - SetupDiEnumDeviceInfo(device_info_set, device_index, &mut device_info_data) - }; - if result == 0 { - break; - } - - let mut data_type: DWORD = 0; - let mut required_size: DWORD = 0; - - // Get the required buffer size for the driver description - let mut buffer; - unsafe { - SetupDiGetDeviceRegistryPropertyW( - device_info_set, - &mut device_info_data, - SPDRP_DEVICEDESC, - &mut data_type, - null_mut(), - 0, - &mut required_size, - ); - - buffer = vec![0; required_size as usize / 2]; - SetupDiGetDeviceRegistryPropertyW( - device_info_set, - &mut device_info_data, - SPDRP_DEVICEDESC, - &mut data_type, - buffer.as_mut_ptr() as *mut u8, - required_size, - null_mut(), - ); - } - - let Ok(driver_description) = String::from_utf16(&buffer) else { - println!("Failed to convert driver description to string"); - device_index += 1; - continue; - }; - - let mut status: ULONG = 0; - let mut problem_number: ULONG = 0; - // Get the device status and problem number - let config_ret = unsafe { - CM_Get_DevNode_Status( - &mut status, - &mut problem_number, - device_info_data.DevInst, - 0, - ) - }; - if config_ret != CR_SUCCESS { - println!( - "Failed to get device status. Error: {}", - std::io::Error::last_os_error() - ); - device_index += 1; - continue; - } - display_drivers.push((driver_description, problem_number)); - device_index += 1; - } - - display_drivers - } -} diff --git a/shelled/rustdesk-as-ref/src/whiteboard/client.rs b/shelled/rustdesk-as-ref/src/whiteboard/client.rs deleted file mode 100644 index 0d816ba..0000000 --- a/shelled/rustdesk-as-ref/src/whiteboard/client.rs +++ /dev/null @@ -1,258 +0,0 @@ -use super::{Cursor, CustomEvent}; -use crate::{ - ipc::{self, Data}, - CHILD_PROCESS, -}; -use hbb_common::{ - allow_err, - anyhow::anyhow, - bail, log, sleep, - tokio::{ - self, - sync::mpsc::{unbounded_channel, UnboundedSender}, - time::interval_at, - }, - ResultType, -}; -use lazy_static::lazy_static; -use std::{collections::HashMap, sync::RwLock, time::Instant}; - -lazy_static! { - static ref TX_WHITEBOARD: RwLock>> = - RwLock::new(None); - static ref CONNS: RwLock> = Default::default(); -} - -struct Conn { - last_cursor_pos: (f32, f32), // For click ripple - last_cursor_evt: LastCursorEvent, -} - -struct LastCursorEvent { - evt: Option, - tm: Instant, - c: usize, -} - -#[inline] -pub fn get_key_cursor(conn_id: i32) -> String { - format!("{}-cursor", conn_id) -} - -pub fn register_whiteboard(k: String) { - std::thread::spawn(|| { - allow_err!(start_whiteboard_()); - }); - let mut conns = CONNS.write().unwrap(); - if !conns.contains_key(&k) { - conns.insert( - k, - Conn { - last_cursor_pos: (0.0, 0.0), - last_cursor_evt: LastCursorEvent { - evt: None, - tm: Instant::now(), - c: 0, - }, - }, - ); - } -} - -pub fn unregister_whiteboard(k: String) { - let mut conns = CONNS.write().unwrap(); - conns.remove(&k); - let is_conns_empty = conns.is_empty(); - drop(conns); - - TX_WHITEBOARD.read().unwrap().as_ref().map(|tx| { - allow_err!(tx.send((k, CustomEvent::Clear))); - }); - if is_conns_empty { - std::thread::spawn(|| { - let mut whiteboard = TX_WHITEBOARD.write().unwrap(); - whiteboard.as_ref().map(|tx| { - allow_err!(tx.send(("".to_string(), CustomEvent::Exit))); - // Simple sleep to wait the whiteboard process exiting. - std::thread::sleep(std::time::Duration::from_millis(3_00)); - }); - whiteboard.take(); - }); - } -} - -pub fn update_whiteboard(k: String, e: CustomEvent) { - let mut conns = CONNS.write().unwrap(); - let Some(conn) = conns.get_mut(&k) else { - return; - }; - match &e { - CustomEvent::Cursor(cursor) => { - conn.last_cursor_evt.c += 1; - conn.last_cursor_evt.tm = Instant::now(); - if cursor.btns == 0 { - // Send one movement event every 4. - if conn.last_cursor_evt.c > 3 { - conn.last_cursor_evt.c = 0; - conn.last_cursor_evt.evt = None; - tx_send_event(conn, k, e); - } else { - conn.last_cursor_evt.evt = Some(e); - } - } else { - if let Some(evt) = conn.last_cursor_evt.evt.take() { - tx_send_event(conn, k.clone(), evt); - conn.last_cursor_evt.c = 0; - } - let click_evt = CustomEvent::Cursor(Cursor { - x: conn.last_cursor_pos.0, - y: conn.last_cursor_pos.1, - argb: cursor.argb, - btns: cursor.btns, - text: cursor.text.clone(), - }); - tx_send_event(conn, k, click_evt); - } - } - _ => { - tx_send_event(conn, k, e); - } - } -} - -#[inline] -fn tx_send_event(conn: &mut Conn, k: String, event: CustomEvent) { - if let CustomEvent::Cursor(cursor) = &event { - if cursor.btns == 0 { - conn.last_cursor_pos = (cursor.x, cursor.y); - } - } - - TX_WHITEBOARD.read().unwrap().as_ref().map(|tx| { - allow_err!(tx.send((k, event))); - }); -} - -#[tokio::main(flavor = "current_thread")] -async fn start_whiteboard_() -> ResultType<()> { - let mut tx_whiteboard = TX_WHITEBOARD.write().unwrap(); - if tx_whiteboard.is_some() { - log::warn!("Whiteboard already started"); - return Ok(()); - } - - loop { - if !crate::platform::is_prelogin() { - break; - } - sleep(1.).await; - } - let mut stream = None; - if let Ok(s) = ipc::connect(1000, "_whiteboard").await { - stream = Some(s); - } else { - #[allow(unused_mut)] - #[allow(unused_assignments)] - let mut args = vec!["--whiteboard"]; - #[allow(unused_mut)] - #[cfg(target_os = "linux")] - let mut user = None; - - let run_done; - if crate::platform::is_root() { - let mut res = Ok(None); - for _ in 0..10 { - #[cfg(not(any(target_os = "linux")))] - { - log::debug!("Start whiteboard"); - res = crate::platform::run_as_user(args.clone()); - } - #[cfg(target_os = "linux")] - { - log::debug!("Start whiteboard"); - res = crate::platform::run_as_user( - args.clone(), - user.clone(), - None::<(&str, &str)>, - ); - } - if res.is_ok() { - break; - } - log::error!("Failed to run whiteboard: {res:?}"); - sleep(1.).await; - } - if let Some(task) = res? { - CHILD_PROCESS.lock().unwrap().push(task); - } - run_done = true; - } else { - run_done = false; - } - if !run_done { - log::debug!("Start whiteboard"); - CHILD_PROCESS.lock().unwrap().push(crate::run_me(args)?); - } - for _ in 0..20 { - sleep(0.3).await; - if let Ok(s) = ipc::connect(1000, "_whiteboard").await { - stream = Some(s); - break; - } - } - if stream.is_none() { - bail!("Failed to connect to connection manager"); - } - } - - let mut stream = stream.ok_or(anyhow!("none stream"))?; - let (tx, mut rx) = unbounded_channel(); - tx_whiteboard.replace(tx); - drop(tx_whiteboard); - let _call_on_ret = crate::common::SimpleCallOnReturn { - b: true, - f: Box::new(move || { - let _ = TX_WHITEBOARD.write().unwrap().take(); - }), - }; - - let dur = tokio::time::Duration::from_millis(300); - let mut timer = interval_at(tokio::time::Instant::now() + dur, dur); - timer.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); - loop { - tokio::select! { - res = rx.recv() => { - match res { - Some(data) => { - if matches!(data.1, CustomEvent::Exit) { - break; - } else { - allow_err!(stream.send(&Data::Whiteboard(data)).await); - timer.reset(); - } - } - None => { - bail!("expected"); - } - } - }, - _ = timer.tick() => { - let mut conns = CONNS.write().unwrap(); - for (k, conn) in conns.iter_mut() { - if conn.last_cursor_evt.tm.elapsed().as_millis() > 300 { - if let Some(evt) = conn.last_cursor_evt.evt.take() { - allow_err!(stream.send(&Data::Whiteboard((k.clone(), evt))).await); - conn.last_cursor_evt.c = 0; - } - } - } - } - } - } - allow_err!( - stream - .send(&Data::Whiteboard(("".to_string(), CustomEvent::Exit))) - .await - ); - Ok(()) -} diff --git a/shelled/rustdesk-as-ref/src/whiteboard/linux.rs b/shelled/rustdesk-as-ref/src/whiteboard/linux.rs deleted file mode 100644 index 686a0d0..0000000 --- a/shelled/rustdesk-as-ref/src/whiteboard/linux.rs +++ /dev/null @@ -1,463 +0,0 @@ -use super::{ - server::{Ripple, EVENT_PROXY}, - win_linux::{create_font_face, draw_text}, - Cursor, CustomEvent, -}; -use hbb_common::{bail, log, tokio::sync::mpsc::unbounded_channel, ResultType}; -use softbuffer::{Context, Surface}; -use std::{ - collections::HashMap, - ffi::{c_int, c_short, c_ulong, c_ushort}, - num::NonZeroU32, - sync::Arc, - time::Instant, -}; -use tiny_skia::{Color, FillRule, Paint, PathBuilder, PixmapMut, Stroke, Transform}; -use ttf_parser::Face; -use winit::raw_window_handle::{ - DisplayHandle, HasDisplayHandle, HasWindowHandle, RawDisplayHandle, RawWindowHandle, -}; -use winit::{ - application::ApplicationHandler, - dpi::{PhysicalPosition, PhysicalSize}, - event::WindowEvent, - event_loop::{ActiveEventLoop, EventLoop}, - platform::x11::{WindowAttributesExtX11, WindowType}, - window::{Window, WindowId, WindowLevel}, -}; - -enum _XDisplay {} -type Display = _XDisplay; - -type XID = c_ulong; -type XserverRegion = XID; - -#[derive(Debug, Clone, Copy, PartialEq)] -#[repr(C)] -pub struct XRectangle { - pub x: c_short, - pub y: c_short, - pub width: c_ushort, - pub height: c_ushort, -} - -#[link(name = "Xfixes")] -extern "C" { - fn XFixesCreateRegion( - dpy: *mut Display, - rectangles: *mut XRectangle, - nrectangles: c_int, - ) -> XserverRegion; - fn XFixesDestroyRegion(dpy: *mut Display, region: XserverRegion) -> (); - fn XFixesSetWindowShapeRegion( - dpy: *mut Display, - win: XID, - shape_kind: c_int, - x_off: c_int, - y_off: c_int, - region: XserverRegion, - ) -> (); -} - -const SHAPE_INPUT: std::ffi::c_int = 2; - -fn get_display_from_xwayland() -> Option { - if let Ok(output) = crate::platform::run_cmds("pgrep -a Xwayland") { - // 1410 /usr/bin/Xwayland :1 -auth /run/user/1000/xauth_RoDZey -listenfd 8 -listenfd 9 -displayfd 76 -wm 78 -rootless -enable-ei-portal - if output.contains("Xwayland") { - if let Some(display) = output.split_whitespace().nth(2) { - if display.starts_with(':') { - return Some(display.to_string()); - } - } - } - } - None -} - -fn preset_env() -> bool { - if crate::platform::is_x11() { - return true; - } - if let Some(display) = get_display_from_xwayland() { - // https://github.com/rust-windowing/winit/blob/f6893a4390dfe6118ce4b33458d458fd3efd3025/src/event_loop.rs#L99 - // It is acceptable to modify global environment variables here because this process is an isolated, - // dedicated "whiteboard" process. - std::env::set_var("DISPLAY", display); - std::env::remove_var("WAYLAND_DISPLAY"); - return true; - } - false -} - -pub fn is_supported() -> bool { - crate::platform::is_x11() || get_display_from_xwayland().is_some() -} - -pub fn run() { - if !preset_env() { - return; - } - - let event_loop = match EventLoop::<(String, CustomEvent)>::with_user_event().build() { - Ok(el) => el, - Err(e) => { - log::error!("Failed to create event loop: {}", e); - return; - } - }; - - let event_loop_proxy = event_loop.create_proxy(); - EVENT_PROXY.write().unwrap().replace(event_loop_proxy); - - let (tx_exit, rx_exit) = unbounded_channel(); - std::thread::spawn(move || { - super::server::start_ipc(rx_exit); - }); - - let mut app = match WhiteboardApplication::new(&event_loop) { - Ok(app) => app, - Err(e) => { - log::error!("Failed to create whiteboard application: {}", e); - tx_exit.send(()).ok(); - return; - } - }; - - if let Err(e) = event_loop.run_app(&mut app) { - log::error!("Failed to run app: {}", e); - tx_exit.send(()).ok(); - return; - } -} - -struct WindowState { - window: Arc, - // NOTE: This surface must be dropped before the `Window`. - surface: Surface, Arc>, - ripples: Vec, - last_cursors: HashMap, -} - -struct WhiteboardApplication { - windows: Vec, - // Drawing context. - // - // With OpenGL it could be EGLDisplay. - context: Option>>, - face: Option>, - close_requested: bool, -} - -impl WhiteboardApplication { - fn new(event_loop: &EventLoop) -> ResultType { - // https://github.com/rust-windowing/winit/blob/f6893a4390dfe6118ce4b33458d458fd3efd3025/examples/window.rs#L91 - // SAFETY: we drop the context right before the event loop is stopped, thus making it safe. - let context = match Context::new(unsafe { - std::mem::transmute::, DisplayHandle<'static>>( - event_loop.display_handle()?, - ) - }) { - Ok(ctx) => Some(ctx), - Err(e) => { - bail!("Failed to create context: {}", e); - } - }; - let face = match create_font_face() { - Ok(face) => Some(face), - Err(err) => { - log::error!("Failed to create font face: {}", err); - None - } - }; - Ok(Self { - windows: Vec::new(), - context, - face, - close_requested: false, - }) - } -} - -impl ApplicationHandler<(String, CustomEvent)> for WhiteboardApplication { - fn user_event(&mut self, _event_loop: &ActiveEventLoop, (k, evt): (String, CustomEvent)) { - match evt { - CustomEvent::Cursor(cursor) => { - if let Some(state) = self.windows.first_mut() { - if cursor.btns != 0 { - state.ripples.push(Ripple { - x: cursor.x, - y: cursor.y, - start_time: Instant::now(), - }); - } - state.last_cursors.insert(k, cursor); - state.window.request_redraw(); - } - } - CustomEvent::Exit => { - self.close_requested = true; - } - _ => {} - } - } - - fn resumed(&mut self, event_loop: &ActiveEventLoop) { - let (x, y, w, h) = match super::server::get_displays_rect() { - Ok(r) => r, - Err(err) => { - log::error!("Failed to get displays rect: {}", err); - self.close_requested = true; - return; - } - }; - - let window_attributes = Window::default_attributes() - .with_title("RustDesk whiteboard") - .with_inner_size(PhysicalSize::new(w, h)) - .with_position(PhysicalPosition::new(x, y)) - .with_decorations(false) - .with_transparent(true) - .with_window_level(WindowLevel::AlwaysOnTop) - .with_x11_window_type(vec![WindowType::Dock]) - .with_override_redirect(true); - - let window = match event_loop.create_window(window_attributes) { - Ok(window) => Arc::new(window), - Err(e) => { - log::error!("Failed to create window: {}", e); - self.close_requested = true; - return; - } - }; - - let display = match window.display_handle() { - Ok(d) => d, - Err(e) => { - log::error!("Failed to get display handle: {}", e); - self.close_requested = true; - return; - } - }; - let rwh = match window.window_handle() { - Ok(w) => w, - Err(e) => { - log::error!("Failed to get window handle: {}", e); - self.close_requested = true; - return; - } - }; - - // Both the following block and `window.set_cursor_hittest(false)` in `draw()` are necessary to ensure cursor events are properly passed through the window. - // These issues may be related to winit X11 handling. - // https://github.com/rust-windowing/winit/issues/3509 - // https://github.com/rust-windowing/winit/issues/4120 - // If either block is removed, cursor events may not be passed through as expected. - // If you update winit, please revisit this workaround. - match (rwh.as_raw(), display.as_raw()) { - (RawWindowHandle::Xlib(xlib_window), RawDisplayHandle::Xlib(xlib_display)) => { - unsafe { - let xwindow = xlib_window.window; - if let Some(display_ptr) = xlib_display.display { - let xdisplay = display_ptr.as_ptr() as *mut Display; - // Mouse event passthrough - let empty_region = XFixesCreateRegion(xdisplay, std::ptr::null_mut(), 0); - if empty_region == 0 { - log::error!("XFixesCreateRegion failed: returned null region"); - } else { - XFixesSetWindowShapeRegion( - xdisplay, - xwindow, - SHAPE_INPUT, - 0, - 0, - empty_region, - ); - XFixesDestroyRegion(xdisplay, empty_region); - } - } - } - } - _ => { - log::error!("Unsupported windowing system for shape extension"); - self.close_requested = true; - return; - } - } - - let Some(ctx) = self.context.as_ref() else { - // unreachable - self.close_requested = true; - return; - }; - - let surface = match Surface::new(ctx, window.clone()) { - Ok(s) => s, - Err(e) => { - log::error!("Failed to create surface: {}", e); - self.close_requested = true; - return; - } - }; - - let state = WindowState { - window, - surface, - ripples: Vec::new(), - last_cursors: HashMap::new(), - }; - - self.windows.push(state); - } - - fn window_event( - &mut self, - _event_loop: &ActiveEventLoop, - window_id: WindowId, - event: WindowEvent, - ) { - match event { - WindowEvent::CloseRequested => { - self.close_requested = true; - } - WindowEvent::RedrawRequested => { - let Some(state) = self.windows.iter_mut().find(|w| w.window.id() == window_id) - else { - log::error!("No window found for id: {:?}", window_id); - return; - }; - if let Err(err) = state.draw(&self.face) { - log::error!("Failed to draw window: {}", err); - } - } - _ => (), - } - } - - fn about_to_wait(&mut self, event_loop: &ActiveEventLoop) { - if !self.close_requested { - for state in self.windows.iter() { - state.window.request_redraw(); - } - } else { - event_loop.exit(); - } - } - - fn exiting(&mut self, _event_loop: &ActiveEventLoop) { - // We must drop the context here. - self.context = None; - } -} - -impl WindowState { - fn draw(&mut self, face: &Option>) -> ResultType<()> { - let (width, height) = { - let size = self.window.inner_size(); - (size.width, size.height) - }; - - let (Some(width), Some(height)) = (NonZeroU32::new(width), NonZeroU32::new(height)) else { - bail!("Invalid window size, {width}x{height}") - }; - if let Err(e) = self.surface.resize(width, height) { - bail!("Failed to resize surface: {}", e); - } - - let mut buffer = match self.surface.buffer_mut() { - Ok(buf) => buf, - Err(e) => { - bail!("Failed to get buffer: {}", e); - } - }; - - let Some(mut pixmap) = PixmapMut::from_bytes( - bytemuck::cast_slice_mut(&mut buffer), - width.get(), - height.get(), - ) else { - bail!("Failed to create pixmap from buffer"); - }; - pixmap.fill(Color::TRANSPARENT); - - Ripple::retain_active(&mut self.ripples); - for ripple in &self.ripples { - let (radius, alpha) = ripple.get_radius_alpha(); - - let mut ripple_paint = Paint::default(); - // Note: The real color is bgra here. - ripple_paint.set_color_rgba8(64, 64, 255, (alpha * 128.0) as u8); - ripple_paint.anti_alias = true; - - let mut ripple_pb = PathBuilder::new(); - ripple_pb.push_circle(ripple.x, ripple.y, radius); - if let Some(path) = ripple_pb.finish() { - pixmap.fill_path( - &path, - &ripple_paint, - FillRule::Winding, - Transform::identity(), - None, - ); - } - } - - for cursor in self.last_cursors.values() { - let (x, y) = (cursor.x, cursor.y); - let size = 1.5f32; - - let mut pb = PathBuilder::new(); - pb.move_to(x, y); - pb.line_to(x, y + 16.0 * size); - pb.line_to(x + 4.0 * size, y + 13.0 * size); - pb.line_to(x + 7.0 * size, y + 20.0 * size); - pb.line_to(x + 9.0 * size, y + 19.0 * size); - pb.line_to(x + 6.0 * size, y + 12.0 * size); - pb.line_to(x + 11.0 * size, y + 12.0 * size); - pb.close(); - - if let Some(path) = pb.finish() { - let mut arrow_paint = Paint::default(); - let rgba = super::argb_to_rgba(cursor.argb); - arrow_paint.set_color_rgba8(rgba.2, rgba.1, rgba.0, rgba.3); - arrow_paint.anti_alias = true; - pixmap.fill_path( - &path, - &arrow_paint, - FillRule::Winding, - Transform::identity(), - None, - ); - - let mut black_paint = Paint::default(); - black_paint.set_color_rgba8(0, 0, 0, 255); - black_paint.anti_alias = true; - let mut stroke = Stroke::default(); - stroke.width = 1.0f32; - pixmap.stroke_path(&path, &black_paint, &stroke, Transform::identity(), None); - - face.as_ref().map(|face| { - draw_text( - &mut pixmap, - face, - &cursor.text, - x + 24.0 * size, - y + 24.0 * size, - &arrow_paint, - 14.0f32, - ); - }); - } - } - - self.window.pre_present_notify(); - - if let Err(e) = buffer.present() { - log::error!("Failed to present buffer: {}", e); - } - - self.window.set_cursor_hittest(false).ok(); - - Ok(()) - } -} diff --git a/shelled/rustdesk-as-ref/src/whiteboard/macos.rs b/shelled/rustdesk-as-ref/src/whiteboard/macos.rs deleted file mode 100644 index d1c28b5..0000000 --- a/shelled/rustdesk-as-ref/src/whiteboard/macos.rs +++ /dev/null @@ -1,323 +0,0 @@ -use super::{server::EVENT_PROXY, Cursor, CustomEvent, Ripple}; -use core_graphics::context::CGContextRef; -use foreign_types::ForeignTypeRef; -use hbb_common::{bail, log, ResultType}; -use objc::{class, msg_send, runtime::Object, sel, sel_impl}; -use piet::{ - kurbo::{BezPath, Point}, - FontFamily, RenderContext, Text, TextLayout, TextLayoutBuilder, -}; -use piet_coregraphics::{CoreGraphicsContext, CoreGraphicsTextLayout}; -use std::{collections::HashMap, sync::Arc, time::Instant}; -use tao::{ - dpi::{LogicalSize, PhysicalPosition}, - event::{Event, StartCause, WindowEvent}, - event_loop::{ControlFlow, EventLoop, EventLoopBuilder}, - platform::macos::MonitorHandleExtMacOS, - rwh_06::{HasWindowHandle, RawWindowHandle}, - window::{Window, WindowBuilder, WindowId}, -}; - -const MAXIMUM_WINDOW_LEVEL: i64 = 2147483647; -const CURSOR_TEXT_FONT_SIZE: f64 = 14.0; -const CURSOR_TEXT_OFFSET: f64 = 20.0; - -struct WindowState { - window: Arc, - logical_size: LogicalSize, - outer_position: PhysicalPosition, - // A simple workaround to the (logical) cursor position. - display_origin: (f64, f64), -} - -struct CursorInfo { - window_id: WindowId, - text_key: (String, u32), - cursor: Cursor, -} - -fn set_window_properties(window: &Arc) -> ResultType<()> { - let handle = window.window_handle()?; - if let RawWindowHandle::AppKit(appkit_handle) = handle.as_raw() { - unsafe { - let ns_view = appkit_handle.ns_view.as_ptr() as *mut Object; - if ns_view.is_null() { - bail!("Ns view of the window handle is null."); - } - let ns_window: *mut Object = msg_send![ns_view, window]; - if ns_window.is_null() { - bail!("Ns window of the ns view is null."); - } - let _: () = msg_send![ns_window, setOpaque: false]; - let _: () = msg_send![ns_window, setLevel: MAXIMUM_WINDOW_LEVEL]; - // NSWindowCollectionBehaviorCanJoinAllSpaces | NSWindowCollectionBehaviorIgnoresCycle - let _: () = msg_send![ns_window, setCollectionBehavior: 5]; - let current_style_mask: u64 = msg_send![ns_window, styleMask]; - // NSWindowStyleMaskNonactivatingPanel - let new_style_mask = current_style_mask | (1 << 7); - let _: () = msg_send![ns_window, setStyleMask: new_style_mask]; - let _: () = msg_send![ns_window, setIgnoresMouseEvents: true]; - } - } - Ok(()) -} - -fn create_windows(event_loop: &EventLoop<(String, CustomEvent)>) -> ResultType> { - let mut windows = Vec::new(); - let map_display_origins: HashMap<_, _> = crate::server::display_service::try_get_displays()? - .into_iter() - .map(|display| (display.name(), display.origin())) - .collect(); - // We can't use `crate::server::display_service::try_get_displays()` here. - // Because the `display` returned by `crate::server::display_service::try_get_displays()`: - // 1. `display.origin()` is the logic position. - // 2. `display.width()` and `display.height()` are the physical size. - for monitor in event_loop.available_monitors() { - let Some(origin) = map_display_origins.get(&monitor.native_id().to_string()) else { - // unreachable! - bail!( - "Failed to find display origin for monitor: {}", - monitor.native_id() - ); - }; - - let window_builder = WindowBuilder::new() - .with_title("RustDesk whiteboard") - .with_transparent(true) - .with_decorations(false) - .with_position(monitor.position()) - .with_inner_size(monitor.size()); - - let window = Arc::new(window_builder.build::<(String, CustomEvent)>(event_loop)?); - set_window_properties(&window)?; - - let mut scale_factor = window.scale_factor(); - if scale_factor == 0.0 { - scale_factor = 1.0; - } - let physical_size = window.inner_size(); - let logical_size = physical_size.to_logical::(scale_factor); - let inner_position = window.inner_position()?; - let outer_position = inner_position; - windows.push(WindowState { - window, - logical_size, - outer_position, - display_origin: (origin.0 as f64, origin.1 as f64), - }); - } - Ok(windows) -} - -fn draw_cursors( - windows: &Vec, - window_id: WindowId, - window_ripples: &mut HashMap>, - last_cursors: &HashMap, - map_cursor_text: &mut HashMap<(String, u32), CoreGraphicsTextLayout>, -) { - for window in windows.iter() { - if window.window.id() != window_id { - continue; - } - - if let Ok(handle) = window.window.window_handle() { - if let RawWindowHandle::AppKit(appkit_handle) = handle.as_raw() { - unsafe { - let ns_view = appkit_handle.ns_view.as_ptr() as *mut Object; - let current_context: *mut Object = - msg_send![class!(NSGraphicsContext), currentContext]; - if !current_context.is_null() { - let cg_context_ptr: *mut std::ffi::c_void = - msg_send![current_context, CGContext]; - if !cg_context_ptr.is_null() { - let cg_context_ref = - CGContextRef::from_ptr_mut(cg_context_ptr as *mut _); - let mut context = CoreGraphicsContext::new_y_up( - cg_context_ref, - window.logical_size.height, - None, - ); - context.clear(None, piet::Color::TRANSPARENT); - - if let Some(ripples) = window_ripples.get_mut(&window_id) { - Ripple::retain_active(ripples); - for ripple in ripples.iter() { - let (radius, alpha) = ripple.get_radius_alpha(); - let color = piet::Color::rgba(1.0, 0.25, 0.25, alpha * 0.5); - let circle = - piet::kurbo::Circle::new((ripple.x, ripple.y), radius); - context.stroke(circle, &color, 2.0); - } - } - - for info in last_cursors.values() { - if info.window_id != window.window.id() { - continue; - } - let cursor = &info.cursor; - - let (x, y) = (cursor.x as f64, cursor.y as f64); - let size = 1.0; - - let mut pb = BezPath::new(); - pb.move_to((x, y)); - pb.line_to((x, y + 16.0 * size)); - pb.line_to((x + 4.0 * size, y + 13.0 * size)); - pb.line_to((x + 7.0 * size, y + 20.0 * size)); - pb.line_to((x + 9.0 * size, y + 19.0 * size)); - pb.line_to((x + 6.0 * size, y + 12.0 * size)); - pb.line_to((x + 11.0 * size, y + 12.0 * size)); - - let rgba = super::argb_to_rgba(cursor.argb); - let color = piet::Color::rgba8(rgba.0, rgba.1, rgba.2, rgba.3); - context.fill(pb, &color); - - let pos = - (x + CURSOR_TEXT_OFFSET * size, y + CURSOR_TEXT_OFFSET * size); - let get_rounded_rect = |layout: &CoreGraphicsTextLayout| { - let text_pos = Point::new(pos.0, pos.1); - let padded_bounds = (layout.image_bounds() - + text_pos.to_vec2()) - .inflate(3.0, 3.0); - padded_bounds.to_rounded_rect(5.0) - }; - - if let Some(layout) = map_cursor_text.get(&info.text_key) { - context.fill(get_rounded_rect(layout), &piet::Color::WHITE); - context.draw_text(layout, pos); - } else { - let text = context.text(); - let color = piet::Color::rgba8(0, 0, 0, 255); - if let Ok(layout) = text - .new_text_layout(cursor.text.clone()) - .font(FontFamily::SYSTEM_UI, CURSOR_TEXT_FONT_SIZE) - .text_color(color) - .build() - { - context - .fill(get_rounded_rect(&layout), &piet::Color::WHITE); - context.draw_text(&layout, pos); - map_cursor_text.insert(info.text_key.clone(), layout); - } - } - } - if let Err(e) = context.finish() { - log::error!("Failed to draw cursor: {}", e); - } - } else { - log::warn!("CGContext is null"); - } - } - let _: () = msg_send![ns_view, setNeedsDisplay:true]; - } - } - } - } -} - -pub(super) fn create_event_loop() -> ResultType<()> { - crate::platform::hide_dock(); - let event_loop = EventLoopBuilder::<(String, CustomEvent)>::with_user_event().build(); - - let windows = create_windows(&event_loop)?; - - let proxy = event_loop.create_proxy(); - EVENT_PROXY.write().unwrap().replace(proxy); - let _call_on_ret = crate::common::SimpleCallOnReturn { - b: true, - f: Box::new(move || { - let _ = EVENT_PROXY.write().unwrap().take(); - }), - }; - - let mut window_ripples: HashMap> = HashMap::new(); - let mut last_cursors: HashMap = HashMap::new(); - let mut map_cursor_text: HashMap<(String, u32), CoreGraphicsTextLayout> = HashMap::new(); - - event_loop.run(move |event, _, control_flow| { - *control_flow = ControlFlow::Poll; - - match event { - Event::NewEvents(StartCause::Init) => { - for window in windows.iter() { - window.window.set_outer_position(window.outer_position); - window.window.request_redraw(); - } - crate::platform::hide_dock(); - } - Event::WindowEvent { event, .. } => match event { - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => {} - }, - Event::RedrawRequested(window_id) => { - draw_cursors( - &windows, - window_id, - &mut window_ripples, - &last_cursors, - &mut map_cursor_text, - ); - } - Event::MainEventsCleared => { - for window in windows.iter() { - window.window.request_redraw(); - } - } - Event::UserEvent((k, evt)) => match evt { - CustomEvent::Cursor(cursor) => { - for window in windows.iter() { - let (l, t, r, b) = ( - window.display_origin.0, - window.display_origin.1, - window.display_origin.0 + window.logical_size.width, - window.display_origin.1 + window.logical_size.height, - ); - if (cursor.x as f64) < l - || (cursor.x as f64) > r - || (cursor.y as f64) < t - || (cursor.y as f64) > b - { - continue; - } - - if cursor.btns != 0 { - let window_id = window.window.id(); - let ripple = Ripple { - x: (cursor.x as f64 - window.display_origin.0), - y: (cursor.y as f64 - window.display_origin.1), - start_time: Instant::now(), - }; - if let Some(ripples) = window_ripples.get_mut(&window_id) { - ripples.push(ripple); - } else { - window_ripples.insert(window_id, vec![ripple]); - } - } - last_cursors.insert( - k, - CursorInfo { - window_id: window.window.id(), - text_key: (cursor.text.clone(), cursor.argb), - cursor: Cursor { - x: (cursor.x - window.display_origin.0 as f32), - y: (cursor.y - window.display_origin.1 as f32), - ..cursor - }, - }, - ); - window.window.request_redraw(); - break; - } - } - CustomEvent::Exit => { - *control_flow = ControlFlow::Exit; - } - _ => {} - }, - _ => (), - } - }); -} diff --git a/shelled/rustdesk-as-ref/src/whiteboard/mod.rs b/shelled/rustdesk-as-ref/src/whiteboard/mod.rs deleted file mode 100644 index 42befe8..0000000 --- a/shelled/rustdesk-as-ref/src/whiteboard/mod.rs +++ /dev/null @@ -1,41 +0,0 @@ -use serde_derive::{Deserialize, Serialize}; - -mod client; -mod server; - -#[cfg(target_os = "windows")] -mod windows; -#[cfg(target_os = "linux")] -mod linux; -#[cfg(target_os = "macos")] -mod macos; -#[cfg(any(target_os = "windows", target_os = "linux"))] -mod win_linux; - -#[cfg(target_os = "windows")] -use windows::create_event_loop; -#[cfg(target_os = "macos")] -use macos::create_event_loop; -#[cfg(target_os = "linux")] -pub use linux::is_supported; - -pub use client::*; -pub use server::*; - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(tag = "t", content = "c")] -pub enum CustomEvent { - Cursor(Cursor), - Clear, - Exit, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(tag = "t")] -pub struct Cursor { - pub x: f32, - pub y: f32, - pub argb: u32, - pub btns: i32, - pub text: String, -} diff --git a/shelled/rustdesk-as-ref/src/whiteboard/server.rs b/shelled/rustdesk-as-ref/src/whiteboard/server.rs deleted file mode 100644 index 0401105..0000000 --- a/shelled/rustdesk-as-ref/src/whiteboard/server.rs +++ /dev/null @@ -1,171 +0,0 @@ -use super::CustomEvent; -use crate::ipc::{new_listener, Connection, Data}; -#[cfg(any(target_os = "windows", target_os = "macos"))] -use hbb_common::tokio::sync::mpsc::unbounded_channel; -#[cfg(any(target_os = "windows", target_os = "linux"))] -use hbb_common::ResultType; -use hbb_common::{ - allow_err, log, - tokio::{self, sync::mpsc::UnboundedReceiver}, -}; -use lazy_static::lazy_static; -use std::sync::RwLock; -use std::time::{Duration, Instant}; - -#[cfg(any(target_os = "windows", target_os = "macos"))] -use tao::event_loop::EventLoopProxy; -#[cfg(target_os = "linux")] -use winit::event_loop::EventLoopProxy; - -lazy_static! { - pub(super) static ref EVENT_PROXY: RwLock>> = - RwLock::new(None); -} - -const RIPPLE_DURATION: Duration = Duration::from_millis(500); -#[cfg(target_os = "macos")] -type RippleFloat = f64; -#[cfg(any(target_os = "windows", target_os = "linux"))] -type RippleFloat = f32; - -#[cfg(target_os = "linux")] -pub use super::linux::run; - -#[cfg(any(target_os = "windows", target_os = "macos"))] -pub fn run() { - let (tx_exit, rx_exit) = unbounded_channel(); - std::thread::spawn(move || { - start_ipc(rx_exit); - }); - if let Err(e) = super::create_event_loop() { - log::error!("Failed to create event loop: {}", e); - tx_exit.send(()).ok(); - return; - } -} - -#[tokio::main(flavor = "current_thread")] -pub(super) async fn start_ipc(mut rx_exit: UnboundedReceiver<()>) { - match new_listener("_whiteboard").await { - Ok(mut incoming) => loop { - tokio::select! { - _ = rx_exit.recv() => { - log::info!("Exiting IPC"); - break; - } - res = incoming.next() => match res { - Some(result) => match result { - Ok(stream) => { - log::debug!("Got new connection"); - tokio::spawn(handle_new_stream(Connection::new(stream))); - } - Err(err) => { - log::error!("Couldn't get whiteboard client: {:?}", err); - } - }, - None => { - log::error!("Failed to get whiteboard client"); - } - } - } - }, - Err(err) => { - log::error!("Failed to start whiteboard ipc server: {}", err); - } - } -} - -async fn handle_new_stream(mut conn: Connection) { - loop { - tokio::select! { - res = conn.next() => { - match res { - Err(err) => { - log::info!("whiteboard ipc connection closed: {}", err); - break; - } - Ok(Some(data)) => { - match data { - Data::Whiteboard((k, evt)) => { - if matches!(evt, CustomEvent::Exit) { - log::info!("whiteboard ipc connection closed"); - break; - } else { - EVENT_PROXY.read().unwrap().as_ref().map(|ep| { - allow_err!(ep.send_event((k, evt))); - }); - } - } - _ => {} - } - } - Ok(None) => { - log::info!("whiteboard ipc connection closed"); - break; - } - } - } - } - } - EVENT_PROXY.read().unwrap().as_ref().map(|ep| { - allow_err!(ep.send_event(("".to_string(), CustomEvent::Exit))); - }); -} - -#[cfg(any(target_os = "windows", target_os = "linux"))] -pub(super) fn get_displays_rect() -> ResultType<(i32, i32, u32, u32)> { - let displays = crate::server::display_service::try_get_displays()?; - let mut min_x = i32::MAX; - let mut min_y = i32::MAX; - let mut max_x = i32::MIN; - let mut max_y = i32::MIN; - - for display in displays { - let (x, y) = (display.origin().0 as i32, display.origin().1 as i32); - let (w, h) = (display.width() as i32, display.height() as i32); - min_x = min_x.min(x); - min_y = min_y.min(y); - max_x = max_x.max(x + w); - max_y = max_y.max(y + h); - } - let (x, y) = (min_x, min_y); - let (w, h) = ((max_x - min_x) as u32, (max_y - min_y) as u32); - Ok((x, y, w, h)) -} - -#[inline] -pub(super) fn argb_to_rgba(argb: u32) -> (u8, u8, u8, u8) { - ( - (argb >> 16 & 0xFF) as u8, - (argb >> 8 & 0xFF) as u8, - (argb & 0xFF) as u8, - (argb >> 24 & 0xFF) as u8, - ) -} - -pub(super) struct Ripple { - pub x: RippleFloat, - pub y: RippleFloat, - pub start_time: Instant, -} - -impl Ripple { - #[inline] - pub fn retain_active(ripples: &mut Vec) { - ripples.retain(|r| r.start_time.elapsed() < RIPPLE_DURATION); - } - - pub fn get_radius_alpha(&self) -> (RippleFloat, RippleFloat) { - let elapsed = self.start_time.elapsed(); - #[cfg(target_os = "macos")] - let progress = (elapsed.as_secs_f64() / RIPPLE_DURATION.as_secs_f64()).min(1.0); - #[cfg(any(target_os = "windows", target_os = "linux"))] - let progress = (elapsed.as_secs_f32() / RIPPLE_DURATION.as_secs_f32()).min(1.0); - #[cfg(target_os = "macos")] - let radius = 25.0 * progress; - #[cfg(any(target_os = "windows", target_os = "linux"))] - let radius = 45.0 * progress; - let alpha = 1.0 - progress; - (radius, alpha) - } -} diff --git a/shelled/rustdesk-as-ref/src/whiteboard/win_linux.rs b/shelled/rustdesk-as-ref/src/whiteboard/win_linux.rs deleted file mode 100644 index 9e4722f..0000000 --- a/shelled/rustdesk-as-ref/src/whiteboard/win_linux.rs +++ /dev/null @@ -1,180 +0,0 @@ -use hbb_common::{bail, ResultType}; -use tiny_skia::{FillRule, Paint, PathBuilder, PixmapMut, Point, Rect, Transform}; -use ttf_parser::Face; -// A helper struct to bridge `ttf-parser` and `tiny-skia`. -struct PathBuilderWrapper<'a> { - path_builder: &'a mut PathBuilder, - transform: Transform, -} - -impl ttf_parser::OutlineBuilder for PathBuilderWrapper<'_> { - fn move_to(&mut self, x: f32, y: f32) { - let mut pt = Point::from_xy(x, y); - self.transform.map_point(&mut pt); - self.path_builder.move_to(pt.x, pt.y); - } - - fn line_to(&mut self, x: f32, y: f32) { - let mut pt = Point::from_xy(x, y); - self.transform.map_point(&mut pt); - self.path_builder.line_to(pt.x, pt.y); - } - - fn quad_to(&mut self, x1: f32, y1: f32, x: f32, y: f32) { - let mut pt1 = Point::from_xy(x1, y1); - self.transform.map_point(&mut pt1); - let mut pt = Point::from_xy(x, y); - self.transform.map_point(&mut pt); - self.path_builder.quad_to(pt1.x, pt1.y, pt.x, pt.y); - } - - fn curve_to(&mut self, x1: f32, y1: f32, x2: f32, y2: f32, x: f32, y: f32) { - let mut pt1 = Point::from_xy(x1, y1); - self.transform.map_point(&mut pt1); - let mut pt2 = Point::from_xy(x2, y2); - self.transform.map_point(&mut pt2); - let mut pt = Point::from_xy(x, y); - self.transform.map_point(&mut pt); - self.path_builder - .cubic_to(pt1.x, pt1.y, pt2.x, pt2.y, pt.x, pt.y); - } - - fn close(&mut self) { - self.path_builder.close(); - } -} - -// Draws a string of text with the white background rectangle onto the pixmap. -pub(super) fn draw_text( - pixmap: &mut PixmapMut, - face: &Face, - text: &str, - x: f32, - y: f32, - paint: &Paint, - font_size: f32, -) { - let units_per_em = face.units_per_em() as f32; - let scale = font_size / units_per_em; - - // --- 1. Calculate text dimensions for the background --- - let mut total_width = 0.0; - for ch in text.chars() { - let glyph_id = face.glyph_index(ch).unwrap_or_default(); - if let Some(h_advance) = face.glyph_hor_advance(glyph_id) { - total_width += h_advance as f32 * scale; - } - } - - // Use font metrics for a consistent background height. - let font_height = (face.ascender() - face.descender()) as f32 * scale; - let ascent = face.ascender() as f32 * scale; - // Add some padding around the text - let padding = 3.0; - - let mut bg_filled = false; - // --- 2. Draw the white background rectangle --- - if let Some(bg_rect) = Rect::from_xywh( - x - padding, - y - ascent - padding, - total_width + 2.0 * padding, - font_height + 2.0 * padding, - ) { - // Corner radius - let radius = 5.0; - let path = { - let mut pb = PathBuilder::new(); - let r_x = bg_rect.x(); - let r_y = bg_rect.y(); - let r_w = bg_rect.width(); - let r_h = bg_rect.height(); - pb.move_to(r_x + radius, r_y); - pb.line_to(r_x + r_w - radius, r_y); - pb.quad_to(r_x + r_w, r_y, r_x + r_w, r_y + radius); - pb.line_to(r_x + r_w, r_y + r_h - radius); - pb.quad_to(r_x + r_w, r_y + r_h, r_x + r_w - radius, r_y + r_h); - pb.line_to(r_x + radius, r_y + r_h); - pb.quad_to(r_x, r_y + r_h, r_x, r_y + r_h - radius); - pb.line_to(r_x, r_y + radius); - pb.quad_to(r_x, r_y, r_x + radius, r_y); - pb.close(); - pb.finish() - }; - - if let Some(path) = path { - let mut bg_paint = Paint::default(); - bg_paint.set_color_rgba8(255, 255, 255, 255); - bg_paint.anti_alias = true; - pixmap.fill_path( - &path, - &bg_paint, - FillRule::Winding, - Transform::identity(), - None, - ); - bg_filled = true; - } - } - - // --- 3. Draw the text --- - let transform = Transform::from_translate(x, y).pre_scale(scale, -scale); - let mut path_builder = PathBuilder::new(); - let mut current_x = 0.0; - - for ch in text.chars() { - let glyph_id = face.glyph_index(ch).unwrap_or_default(); - - let mut builder = PathBuilderWrapper { - path_builder: &mut path_builder, - transform: transform.post_translate(current_x, 0.0), - }; - - face.outline_glyph(glyph_id, &mut builder); - - if let Some(h_advance) = face.glyph_hor_advance(glyph_id) { - current_x += h_advance as f32 * scale; - } - } - - if let Some(path) = path_builder.finish() { - if bg_filled { - let mut text_paint = Paint::default(); - text_paint.set_color_rgba8(0, 0, 0, 255); - text_paint.anti_alias = true; - pixmap.fill_path( - &path, - &text_paint, - FillRule::Winding, - Transform::identity(), - None, - ); - } else { - pixmap.fill_path(&path, paint, FillRule::Winding, Transform::identity(), None); - } - } -} - -pub(super) fn create_font_face() -> ResultType> { - let mut font_db = fontdb::Database::new(); - font_db.load_system_fonts(); - let query = fontdb::Query { - families: &[fontdb::Family::Monospace, fontdb::Family::SansSerif], - ..fontdb::Query::default() - }; - let Some(font_id) = font_db.query(&query) else { - bail!("No monospace or sans-serif font found!"); - }; - let Some((font_source, face_index)) = font_db.face_source(font_id) else { - bail!("No face found for font!"); - }; - // Load the font data into a static slice to satisfy `ttf-parser`'s lifetime requirements. - // We use `Box::leak` to leak the memory, which is acceptable here since the font data - // is needed for the entire lifetime of the application. - let font_data: &'static [u8] = Box::leak(match font_source { - fontdb::Source::File(path) => std::fs::read(path)?.into_boxed_slice(), - fontdb::Source::Binary(data) => data.as_ref().as_ref().to_vec().into_boxed_slice(), - fontdb::Source::SharedFile(path, _) => std::fs::read(path)?.into_boxed_slice(), - }); - let face = Face::parse(font_data, face_index)?; - Ok(face) -} diff --git a/shelled/rustdesk-as-ref/src/whiteboard/windows.rs b/shelled/rustdesk-as-ref/src/whiteboard/windows.rs deleted file mode 100644 index dc6a8c3..0000000 --- a/shelled/rustdesk-as-ref/src/whiteboard/windows.rs +++ /dev/null @@ -1,230 +0,0 @@ -use super::{ - server::{Ripple, EVENT_PROXY}, - win_linux::{create_font_face, draw_text}, - Cursor, CustomEvent, -}; -use hbb_common::{anyhow::anyhow, log, ResultType}; -use softbuffer::{Context, Surface}; -use std::{collections::HashMap, num::NonZeroU32, sync::Arc, time::Instant}; -use tao::{ - dpi::{PhysicalPosition, PhysicalSize}, - event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoopBuilder}, - platform::windows::WindowBuilderExtWindows, - window::WindowBuilder, -}; -use tiny_skia::{Color, FillRule, Paint, PathBuilder, PixmapMut, Stroke, Transform}; - -pub(super) fn create_event_loop() -> ResultType<()> { - let face = match create_font_face() { - Ok(face) => Some(face), - Err(err) => { - log::error!("Failed to create font face: {}", err); - None - } - }; - - let event_loop = EventLoopBuilder::<(String, CustomEvent)>::with_user_event().build(); - let mut window_builder = WindowBuilder::new() - .with_title("RustDesk whiteboard") - .with_transparent(true) - .with_always_on_top(true) - .with_skip_taskbar(true) - .with_decorations(false); - - let mut final_size = None; - if let Ok((x, y, w, h)) = super::server::get_displays_rect() { - if w > 0 && h > 0 { - final_size = Some(PhysicalSize::new(w, h)); - window_builder = window_builder - .with_position(PhysicalPosition::new(x, y)) - .with_inner_size(PhysicalSize::new(1, 1)); - } else { - window_builder = - window_builder.with_fullscreen(Some(tao::window::Fullscreen::Borderless(None))); - } - } else { - window_builder = - window_builder.with_fullscreen(Some(tao::window::Fullscreen::Borderless(None))); - } - - let window = Arc::new(window_builder.build::<(String, CustomEvent)>(&event_loop)?); - window.set_ignore_cursor_events(true)?; - - let context = Context::new(window.clone()).map_err(|e| { - log::error!("Failed to create context: {}", e); - anyhow!(e.to_string()) - })?; - let mut surface = Surface::new(&context, window.clone()).map_err(|e| { - log::error!("Failed to create surface: {}", e); - anyhow!(e.to_string()) - })?; - - let proxy = event_loop.create_proxy(); - EVENT_PROXY.write().unwrap().replace(proxy); - let _call_on_ret = crate::common::SimpleCallOnReturn { - b: true, - f: Box::new(move || { - let _ = EVENT_PROXY.write().unwrap().take(); - }), - }; - - let mut ripples: Vec = Vec::new(); - let mut last_cursors: HashMap = HashMap::new(); - let mut resized = final_size.is_none(); - - event_loop.run(move |event, _, control_flow| { - *control_flow = ControlFlow::Poll; - - match event { - Event::WindowEvent { event, .. } => match event { - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => {} - }, - Event::RedrawRequested(_) => { - if !resized { - if let Some(size) = final_size.take() { - window.set_inner_size(size); - } - resized = true; - return; - } - - let (width, height) = { - let size = window.inner_size(); - (size.width, size.height) - }; - - let (Some(width), Some(height)) = (NonZeroU32::new(width), NonZeroU32::new(height)) - else { - return; - }; - if let Err(e) = surface.resize(width, height) { - log::error!("Failed to resize surface: {}", e); - return; - } - - let mut buffer = match surface.buffer_mut() { - Ok(buf) => buf, - Err(e) => { - log::error!("Failed to get buffer: {}", e); - return; - } - }; - let Some(mut pixmap) = PixmapMut::from_bytes( - bytemuck::cast_slice_mut(&mut buffer), - width.get(), - height.get(), - ) else { - log::error!("Failed to create pixmap from buffer"); - return; - }; - pixmap.fill(Color::TRANSPARENT); - - Ripple::retain_active(&mut ripples); - for ripple in &ripples { - let (radius, alpha) = ripple.get_radius_alpha(); - - let mut ripple_paint = Paint::default(); - // Note: The real color is bgra here. - ripple_paint.set_color_rgba8(64, 64, 255, (alpha * 128.0) as u8); - ripple_paint.anti_alias = true; - - let mut ripple_pb = PathBuilder::new(); - ripple_pb.push_circle(ripple.x, ripple.y, radius); - if let Some(path) = ripple_pb.finish() { - pixmap.fill_path( - &path, - &ripple_paint, - FillRule::Winding, - Transform::identity(), - None, - ); - } - } - - for cursor in last_cursors.values() { - let (x, y) = (cursor.x, cursor.y); - let size = 1.5f32; - - let mut pb = PathBuilder::new(); - pb.move_to(x, y); - pb.line_to(x, y + 16.0 * size); - pb.line_to(x + 4.0 * size, y + 13.0 * size); - pb.line_to(x + 7.0 * size, y + 20.0 * size); - pb.line_to(x + 9.0 * size, y + 19.0 * size); - pb.line_to(x + 6.0 * size, y + 12.0 * size); - pb.line_to(x + 11.0 * size, y + 12.0 * size); - pb.close(); - - if let Some(path) = pb.finish() { - let rgba = super::argb_to_rgba(cursor.argb); - let mut arrow_paint = Paint::default(); - // Note: The real color is bgra here. - arrow_paint.set_color_rgba8(rgba.2, rgba.1, rgba.0, rgba.3); - arrow_paint.anti_alias = true; - pixmap.fill_path( - &path, - &arrow_paint, - FillRule::Winding, - Transform::identity(), - None, - ); - - let mut black_paint = Paint::default(); - black_paint.set_color_rgba8(0, 0, 0, 255); - black_paint.anti_alias = true; - let mut stroke = Stroke::default(); - stroke.width = 1.0f32; - pixmap.stroke_path( - &path, - &black_paint, - &stroke, - Transform::identity(), - None, - ); - - face.as_ref().map(|face| { - draw_text( - &mut pixmap, - face, - &cursor.text, - x + 24.0 * size, - y + 24.0 * size, - &arrow_paint, - 14.0f32, - ); - }); - } - } - - if let Err(e) = buffer.present() { - log::error!("Failed to present surface: {}", e); - return; - } - } - Event::MainEventsCleared => { - window.request_redraw(); - } - Event::UserEvent((k, evt)) => match evt { - CustomEvent::Cursor(cursor) => { - if cursor.btns != 0 { - ripples.push(Ripple { - x: cursor.x, - y: cursor.y, - start_time: Instant::now(), - }); - } - last_cursors.insert(k, cursor); - } - CustomEvent::Exit => { - *control_flow = ControlFlow::Exit; - } - _ => {} - }, - _ => (), - } - }); -} diff --git a/shelled/rustdesk-as-ref/vcpkg.json b/shelled/rustdesk-as-ref/vcpkg.json deleted file mode 100644 index d41b91c..0000000 --- a/shelled/rustdesk-as-ref/vcpkg.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "dependencies": [ - { - "name": "aom", - "host": true - }, - { - "name": "aom", - "host": false - }, - { - "name": "cpu-features", - "platform": "android" - }, - { - "name": "libjpeg-turbo", - "host": true - }, - { - "name": "libjpeg-turbo", - "host": false - }, - { - "name": "oboe", - "platform": "android" - }, - { - "name": "opus", - "host": true - }, - { - "name": "opus", - "host": false - }, - { - "name": "libvpx", - "host": true - }, - { - "name": "libvpx", - "host": false - }, - { - "name": "libyuv", - "host": true - }, - { - "name": "libyuv", - "host": false - }, - { - "name": "mfx-dispatch", - "host": true, - "platform": "((x86 | x64) & (android | linux)) | (windows & !uwp)" - }, - { - "name": "mfx-dispatch", - "host": false, - "platform": "((x86 | x64) & (android | linux)) | (windows & !uwp)" - }, - { - "name": "ffmpeg", - "host": true, - "features": [ - { - "name": "amf", - "platform": "((windows | linux) & static)" - }, - { - "name": "nvcodec", - "platform": "((windows | linux) & static)" - }, - { - "name": "qsv", - "platform": "(windows & static)" - } - ], - "platform": "((windows | (linux & !arm32) | osx) & static)" - }, - { - "name": "ffmpeg", - "host": false, - "platform": "((android | ios | (linux & arm32)) & static)" - } - ], - "vcpkg-configuration": { - "default-registry": { - "kind": "builtin", - "baseline": "120deac3062162151622ca4860575a33844ba10b" - }, - "overlay-ports": [ - "./res/vcpkg" - ] - }, - "overrides": [ - { - "name": "ffnvcodec", - "version": "12.1.14.0" - }, - { - "name": "amd-amf", - "version": "1.4.35" - } - ] -} diff --git a/shelled/rustdesk-as-ref/web_deps.tar.gz b/shelled/rustdesk-as-ref/web_deps.tar.gz deleted file mode 100644 index 9fd50ad8103c161a5074d1b369b3d82313b79c5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1864351 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νN`Dy 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ÌNB?PON)>NUNlcr5NWMU)t2U9Pxp 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≦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 z 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­6-jd_l7<_hSt@=uS$;+c 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

    U7svX#; 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

    >jUES;5)K&|7{ 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

    N-V8{WTfyjElMAE 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

    9@8&A%z;xQ>hB!A52!ldd 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

    xpR@|)~8MkTyftD$c7VelT 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 R#&WV{U>-O_%?as?{txAm!_WW# diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.js deleted file mode 100644 index 60c4306..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.js +++ /dev/null @@ -1,40 +0,0 @@ - -var OGVDecoderAudioVorbisW = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderAudioVorbisW) { - OGVDecoderAudioVorbisW = OGVDecoderAudioVorbisW || {}; - - -var b;b||(b=typeof OGVDecoderAudioVorbisW !== 'undefined' ? OGVDecoderAudioVorbisW : {});var g=Object.assign,h,m;b.ready=new Promise(function(a,c){h=a;m=c});var n=b,p=g({},b),q=(a,c)=>{throw c;},r="object"===typeof window,t="function"===typeof importScripts,u="",v,w,x,fs,y,z; -if("object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node)u=t?require("path").dirname(u)+"/":__dirname+"/",z=function(){y||(fs=require("fs"),y=require("path"))},v=function(a,c){z();a=y.normalize(a);return fs.readFileSync(a,c?null:"utf8")},x=function(a){a=v(a,!0);a.buffer||(a=new Uint8Array(a));return a},w=function(a,c,e){z();a=y.normalize(a);fs.readFile(a,function(d,f){d?e(d):c(f.buffer)})},1{if(noExitRuntime||0=T.length&&(T.length=a+1),T[a]=c=K.get(a));return c} -var ha={a:function(a,c,e){I.copyWithin(a,c,c+e)},b:function(a){var c=I.length;a>>>=0;if(2147483648=e;e*=2){var d=c*(1+.2/e);d=Math.min(d,a+100663296);d=Math.max(a,d);0>>16);J();var f=1;break a}catch(k){}f=void 0}if(f)return!0}return!1},c:function(a){if(!(noExitRuntime||0=a)return W;W&&b._free(W);X=a;return W=b._malloc(X)}var Y;"undefined"===typeof performance||"undefined"===typeof performance.now?Y=Date.now:Y=performance.now.bind(performance);function Z(a){var c=Y();a=a();b.cpuTime+=Y()-c;return a}b.loadedMetadata=!!n.audioFormat;b.audioFormat=n.audioFormat||null;b.audioBuffer=null;b.cpuTime=0; -Object.defineProperty(b,"processing",{get:function(){return!1}});b.init=function(a){Z(function(){b._ogv_audio_decoder_init()});a()};b.processHeader=function(a,c){var e=Z(function(){var d=a.byteLength,f=ja(d);(new Uint8Array(F.buffer,f,d)).set(new Uint8Array(a));return b._ogv_audio_decoder_process_header(f,d)});c(e)};b.processAudio=function(a,c){var e=Z(function(){var d=a.byteLength,f=ja(d);(new Uint8Array(F.buffer,f,d)).set(new Uint8Array(a));return b._ogv_audio_decoder_process_audio(f,d)});c(e)}; -b.close=function(){}; - - - return OGVDecoderAudioVorbisW.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = OGVDecoderAudioVorbisW; -else if (typeof define === 'function' && define['amd']) - define([], function() { return OGVDecoderAudioVorbisW; }); -else if (typeof exports === 'object') - exports["OGVDecoderAudioVorbisW"] = OGVDecoderAudioVorbisW; diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.wasm b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.wasm deleted file mode 100755 index 5a492b033eae3e8c032e8c2f7e581e0535440664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155787 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 z 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 TjJDL)%E36P@V_G*SeyR~&oF>@ diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.js deleted file mode 100644 index b0ca206..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.js +++ /dev/null @@ -1,21 +0,0 @@ - -var OGVDecoderVideoAV1MTW = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoAV1MTW) { - OGVDecoderVideoAV1MTW = OGVDecoderVideoAV1MTW || {}; - -function GROWABLE_HEAP_U8(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPU8}function GROWABLE_HEAP_I32(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAP32}function GROWABLE_HEAP_F64(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPF64}var Module=typeof OGVDecoderVideoAV1MTW!=="undefined"?OGVDecoderVideoAV1MTW:{};var objAssign=Object.assign;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var options=Module;var moduleOverrides=objAssign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=function(){if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=function readAsync(filename,onload,onerror){requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("unhandledRejection",function(reason){throw reason});quit_=((status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)});Module["inspect"]=function(){return"[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=require("worker_threads")}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}global.Worker=nodeWorkerThreads.Worker}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!ENVIRONMENT_IS_NODE){read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=(title=>document.title=title)}else{}if(ENVIRONMENT_IS_NODE){if(typeof performance==="undefined"){global.performance=require("perf_hooks").performance}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){requireNodeFS();defaultPrint=(str=>fs.writeSync(1,str+"\n"));defaultPrintErr=(str=>fs.writeSync(2,str+"\n"))}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;objAssign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function TextDecoderWrapper(encoding){var textDecoder=new TextDecoder(encoding);this.decode=(data=>{if(data.buffer instanceof SharedArrayBuffer){data=new Uint8Array(data)}return textDecoder.decode.call(textDecoder,data)})}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf-16le"):undefined;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":1073741824/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATINIT__)}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;PThread.terminateAllThreads();runtimeExited=true}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="ogv-decoder-video-av1-mt-wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTlsInit(Module["asm"]["H"]);wasmTable=Module["asm"]["F"];addOnInit(Module["asm"]["y"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var ASM_CONSTS={};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function killThread(pthread_ptr){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var pthread=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];pthread.worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker),1);pthread.worker.pthread=undefined}function cancelThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];pthread.worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];if(pthread){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var worker=pthread.worker;PThread.returnWorkerToPool(worker)}}function _exit(status){exit(status)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],initMainThread:function(){var pthreadPoolSize=1;for(var i=0;i>2]=0;try{func()}finally{GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls>>2]=1}},receiveObjectTransfer:function(data){},threadInit:function(){for(var i in PThread.tlsInitFunctions){PThread.tlsInitFunctions[i]()}},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=function(e){var d=e["data"];var cmd=d["cmd"];if(worker.pthread)PThread.currentProxiedOperationCallerThread=worker.pthread.threadInfoStruct;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var thread=PThread.pthreads[d.targetThread];if(thread){thread.worker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processQueuedMainThreadWork"){_emscripten_main_thread_process_queued_calls()}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="detachedExit"){PThread.returnWorkerToPool(worker)}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else{err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=function(e){var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data})});worker.on("error",function(e){worker.onerror(e)});worker.on("detachedExit",function(){})}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("ogv-decoder-video-av1-mt-wasm.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=GROWABLE_HEAP_I32()[pthread_ptr+44>>2];var stackSize=GROWABLE_HEAP_I32()[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function invokeEntryPoint(ptr,arg){return getWasmTableEntry(ptr)(arg)}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTlsInit(tlsInitFunc,moduleExports,metadata){PThread.tlsInitFunctions.push(tlsInitFunc)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=(()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6})}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=(()=>performance.now()-Module["__performance_now_clock_drift"])}else _emscripten_get_now=(()=>performance.now());function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInit()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,threadInfoStruct:threadParams.pthread_ptr};worker.pthread=pthread;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"threadInfoStruct":threadParams.pthread_ptr};worker.runPthread=function(){msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}function ___pthread_create_js(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer==="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return _emscripten_sync_run_in_main_thread_4(687865856,pthread_ptr,attr,start_routine,arg)}if(error)return error;var threadParams={startRoutine:start_routine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function ___pthread_detached_exit(){postMessage({"cmd":"detachedExit"})}function __emscripten_default_pthread_stack_size(){return 2097152}function __emscripten_futex_wait_non_blocking(addr,val,timeout){var tNow=performance.now();var tEnd=tNow+timeout;var lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr);while(1){tNow=performance.now();if(tNow>tEnd){lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);return-73}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);if(lastAddr==0){break}_emscripten_main_thread_process_queued_calls();if(Atomics.load(GROWABLE_HEAP_I32(),addr>>2)!=val){return-6}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr)}return 0}function __emscripten_notify_thread_queue(targetThreadId,mainThreadId){if(targetThreadId==mainThreadId){postMessage({"cmd":"processQueuedMainThreadWork"})}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processThreadQueue"})}else{var pthread=PThread.pthreads[targetThreadId];var worker=pthread&&pthread.worker;if(!worker){return}worker.postMessage({"cmd":"processThreadQueue"})}return 1}function _abort(){abort("")}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}function _emscripten_memcpy_big(dest,src,num){GROWABLE_HEAP_U8().copyWithin(dest,src,src+num)}function _emscripten_num_logical_cores(){if(ENVIRONMENT_IS_NODE)return require("os").cpus().length;return navigator["hardwareConcurrency"]}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(function(){var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=GROWABLE_HEAP_U8().length;requestedSize=requestedSize>>>0;if(requestedSize<=oldSize){return false}var maxHeapSize=1073741824;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence>2]=eventTypeId;GROWABLE_HEAP_I32()[varargs+4>>2]=eventData;GROWABLE_HEAP_I32()[varargs+8>>2]=userData;_emscripten_dispatch_to_thread_(targetThread,637534208,eventHandlerFunc,eventData,varargs)})},getTargetThreadForEventCallback:function(targetThread){switch(targetThread){case 1:return 0;case 2:return PThread.currentProxiedOperationCallerThread;default:return targetThread}},getNodeNameForTarget:function(target){if(!target)return"";if(target==window)return"#window";if(target==screen)return"#screen";return target&&target.nodeName?target.nodeName:""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height){withStackSave(function(){var varargs=stackAlloc(12);var targetCanvasPtr=0;if(targetCanvas){targetCanvasPtr=stringToNewUTF8(targetCanvas)}GROWABLE_HEAP_I32()[varargs>>2]=targetCanvasPtr;GROWABLE_HEAP_I32()[varargs+4>>2]=width;GROWABLE_HEAP_I32()[varargs+8>>2]=height;_emscripten_dispatch_to_thread_(targetThread,657457152,0,targetCanvasPtr,varargs)})}function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread,targetCanvas,width,height){targetCanvas=targetCanvas?UTF8ToString(targetCanvas):"";_emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height)}function maybeCStringToJsString(cString){return cString>2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!=="undefined"?document:0,typeof window!=="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!=="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_set_canvas_element_size_calling_thread(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;if(canvas.canvasSharedPtr){GROWABLE_HEAP_I32()[canvas.canvasSharedPtr>>2]=width;GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+4>>2]=height}if(canvas.offscreenCanvas||!canvas.controlTransferredOffscreen){if(canvas.offscreenCanvas)canvas=canvas.offscreenCanvas;var autoResizeViewport=false;if(canvas.GLctxObject&&canvas.GLctxObject.GLctx){var prevViewport=canvas.GLctxObject.GLctx.getParameter(2978);autoResizeViewport=prevViewport[0]===0&&prevViewport[1]===0&&prevViewport[2]===canvas.width&&prevViewport[3]===canvas.height}canvas.width=width;canvas.height=height;if(autoResizeViewport){canvas.GLctxObject.GLctx.viewport(0,0,width,height)}}else if(canvas.canvasSharedPtr){var targetThread=GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+8>>2];_emscripten_set_offscreencanvas_size_on_target_thread(targetThread,target,width,height);return 1}else{return-4}return 0}function _emscripten_set_canvas_element_size_main_thread(target,width,height){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,1,target,width,height);return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(canvas){return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}else{return _emscripten_set_canvas_element_size_main_thread(target,width,height)}}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)};return 1}}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>2]:-1;source+=UTF8ToString(GROWABLE_HEAP_I32()[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;canvas.getContext=function(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}}var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=_malloc(8);GROWABLE_HEAP_I32()[handle+4>>2]=_pthread_self();var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;_free(GL.contexts[contextHandle].handle);GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=GROWABLE_HEAP_I32()[a+(24>>2)];var contextAttributes={"alpha":!!GROWABLE_HEAP_I32()[a+(0>>2)],"depth":!!GROWABLE_HEAP_I32()[a+(4>>2)],"stencil":!!GROWABLE_HEAP_I32()[a+(8>>2)],"antialias":!!GROWABLE_HEAP_I32()[a+(12>>2)],"premultipliedAlpha":!!GROWABLE_HEAP_I32()[a+(16>>2)],"preserveDrawingBuffer":!!GROWABLE_HEAP_I32()[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!GROWABLE_HEAP_I32()[a+(28>>2)],majorVersion:GROWABLE_HEAP_I32()[a+(32>>2)],minorVersion:GROWABLE_HEAP_I32()[a+(36>>2)],enableExtensionsByDefault:GROWABLE_HEAP_I32()[a+(40>>2)],explicitSwapControl:GROWABLE_HEAP_I32()[a+(44>>2)],proxyContextToMainThread:GROWABLE_HEAP_I32()[a+(48>>2)],renderViaOffscreenBackBuffer:GROWABLE_HEAP_I32()[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=GROWABLE_HEAP_I32()[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,fd);return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(4,1,fd,offset_low,offset_high,whence,newOffset)}function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(5,1,fd,iov,iovcnt,pnum);var num=0;for(var i=0;i>2];var len=GROWABLE_HEAP_I32()[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}function _ogvjs_callback_async_complete(ret,cpuTime){var callback=Module.callbacks.shift();Module["cpuTime"]+=cpuTime;callback(ret);return}function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight,picWidth,picHeight,picX,picY,displayWidth,displayHeight){var heap=wasmMemory.buffer;var format=Module["videoFormat"];function copyAndTrim(arr,buffer,stride,height,picX,picY,picWidth,picHeight,fill){arr.set(new Uint8Array(heap,buffer,stride*height));var x,y,ptr;for(ptr=0,y=0;y0){var next=recycled.shift(),format=next["format"];if(format["width"]===width&&format["height"]===height&&format["chromaWidth"]===chromaWidth&&format["chromaHeight"]===chromaHeight&&format["cropLeft"]===picX&&format["cropTop"]===picY&&format["cropWidth"]===picWidth&&format["cropHeight"]===picHeight&&format["displayWidth"]===displayWidth&&format["displayHeight"]===displayHeight&&next["y"]["bytes"].length===lenY&&next["u"]["bytes"].length===lenCb&&next["v"]["bytes"].length===lenCr){frame=next;break}}if(!frame){frame={"format":{"width":width,"height":height,"chromaWidth":chromaWidth,"chromaHeight":chromaHeight,"cropLeft":picX,"cropTop":picY,"cropWidth":picWidth,"cropHeight":picHeight,"displayWidth":displayWidth,"displayHeight":displayHeight},"y":{"bytes":new Uint8Array(lenY),"stride":strideY},"u":{"bytes":new Uint8Array(lenCb),"stride":strideCb},"v":{"bytes":new Uint8Array(lenCr),"stride":strideCr}}}copyAndTrim(frame["y"]["bytes"],bufferY,strideY,height,picX,picY,picWidth,picHeight,0);copyAndTrim(frame["u"]["bytes"],bufferCb,strideCb,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);copyAndTrim(frame["v"]["bytes"],bufferCr,strideCr,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);Module["frameBuffer"]=frame}if(!ENVIRONMENT_IS_PTHREAD)PThread.initMainThread();var GLctx;var proxiedFunctionTable=[null,exitOnMainThread,_emscripten_set_canvas_element_size_main_thread,_fd_close,_fd_seek,_fd_write];var asmLibraryArg={"v":___emscripten_init_main_thread_js,"q":___emscripten_thread_cleanup,"c":___pthread_create_js,"t":___pthread_detached_exit,"u":__emscripten_default_pthread_stack_size,"j":__emscripten_futex_wait_non_blocking,"i":__emscripten_notify_thread_queue,"f":_abort,"e":_emscripten_check_blocking_allowed,"b":_emscripten_get_now,"n":_emscripten_memcpy_big,"x":_emscripten_num_logical_cores,"w":_emscripten_receive_on_main_thread_js,"o":_emscripten_resize_heap,"g":_emscripten_set_canvas_element_size,"r":_emscripten_unwind_to_js_event_loop,"h":_emscripten_webgl_create_context,"s":_exit,"p":_fd_close,"m":_fd_seek,"d":_fd_write,"a":wasmMemory||Module["wasmMemory"],"k":_ogvjs_callback_async_complete,"l":_ogvjs_callback_frame};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["y"]).apply(null,arguments)};var _ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=function(){return(_ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=Module["asm"]["z"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["A"]).apply(null,arguments)};var _ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=function(){return(_ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=Module["asm"]["B"]).apply(null,arguments)};var _ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=function(){return(_ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=Module["asm"]["C"]).apply(null,arguments)};var _ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=function(){return(_ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=Module["asm"]["D"]).apply(null,arguments)};var _ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=function(){return(_ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=Module["asm"]["E"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["G"]).apply(null,arguments)};var _emscripten_tls_init=Module["_emscripten_tls_init"]=function(){return(_emscripten_tls_init=Module["_emscripten_tls_init"]=Module["asm"]["H"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["I"]).apply(null,arguments)};var _emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=function(){return(_emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=Module["asm"]["J"]).apply(null,arguments)};var _emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=function(){return(_emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=Module["asm"]["K"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return(_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["L"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["M"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["N"]).apply(null,arguments)};var _emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=function(){return(_emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=Module["asm"]["O"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["P"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["Q"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["R"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["S"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["T"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["U"]).apply(null,arguments)};var __emscripten_main_thread_futex=Module["__emscripten_main_thread_futex"]=375956;var __emscripten_allow_main_runtime_queued_calls=Module["__emscripten_allow_main_runtime_queued_calls"]=108308;Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["PThread"]=PThread;Module["PThread"]=PThread;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){readyPromiseResolve(Module);initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}if(keepRuntimeAlive()){}else{exitRuntime()}procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}if(ENVIRONMENT_IS_PTHREAD){noExitRuntime=false;PThread.initWorker()}run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module["_free"](inputBuffer)}inputBufferSize=size;inputBuffer=Module["_malloc"](inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance==="undefined"||typeof performance.now==="undefined"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module["cpuTime"]+=getTimestamp()-start;return ret}Module["loadedMetadata"]=!!options["videoFormat"];Module["videoFormat"]=options["videoFormat"]||null;Module["frameBuffer"]=null;Module["cpuTime"]=0;Object.defineProperty(Module,"processing",{get:function getProcessing(){return false}});Module["init"]=function(callback){time(function(){Module["_ogv_video_decoder_init"]()});callback()};Module["processHeader"]=function(data,callback){var ret=time(function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_header"](buffer,len)});callback(ret)};Module.callbacks=[];Module["processFrame"]=function(data,callback){var isAsync=Module["_ogv_video_decoder_async"]();var len=data.byteLength;var buffer=Module["_malloc"](len);function callbackWrapper(ret){Module["_free"](buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time(function(){var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_frame"](buffer,len)});if(!isAsync){callbackWrapper(ret)}};Module["close"]=function(){};Module["sync"]=function(){var isAsync=Module["_ogv_video_decoder_async"]();if(isAsync){Module.callbacks.push(function(){});time(function(){Module["_ogv_video_decoder_process_frame"](0,0)})}};Module["recycledFrames"]=[];Module["recycleFrame"]=function(frame){var arr=Module["recycledFrames"];arr.push(frame);if(arr.length>16){arr.shift()}}; - - - return OGVDecoderVideoAV1MTW.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = OGVDecoderVideoAV1MTW; -else if (typeof define === 'function' && define['amd']) - define([], function() { return OGVDecoderVideoAV1MTW; }); -else if (typeof exports === 'object') - exports["OGVDecoderVideoAV1MTW"] = OGVDecoderVideoAV1MTW; diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.wasm b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.wasm deleted file mode 100755 index c0e8abe04c73213c74af35bd7f3788a517e0cd2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418335 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§@8u+zPYm&6PRe=w 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¥_#0s*;46I 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¬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 W*zeoX`X>=Zv$)W@F5!Pf)Bgu5n*`ec diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.worker.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.worker.js deleted file mode 100644 index d8c3fd4..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.worker.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";var Module={};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){var nodeWorkerThreads=require("worker_threads");var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(nodeFS.readFileSync(f,"utf8"))},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);receiveInstance(instance);Module["wasmModule"]=null;return instance.exports};self.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}OGVDecoderVideoAV1MTW(Module).then(function(instance){Module=instance})}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0,1);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInit();try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(Module["keepRuntimeAlive"]()){Module["PThread"].setExitStatus(result)}else{Module["__emscripten_thread_exit"](result)}}catch(ex){if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["keepRuntimeAlive"]()){}else{Module["__emscripten_thread_exit"](ex.status)}}else{throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}}; diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.js deleted file mode 100644 index 325a521..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.js +++ /dev/null @@ -1,21 +0,0 @@ - -var OGVDecoderVideoAV1SIMDMTW = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoAV1SIMDMTW) { - OGVDecoderVideoAV1SIMDMTW = OGVDecoderVideoAV1SIMDMTW || {}; - -function GROWABLE_HEAP_U8(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPU8}function GROWABLE_HEAP_I32(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAP32}function GROWABLE_HEAP_F64(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPF64}var Module=typeof OGVDecoderVideoAV1SIMDMTW!=="undefined"?OGVDecoderVideoAV1SIMDMTW:{};var objAssign=Object.assign;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var options=Module;var moduleOverrides=objAssign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=function(){if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=function readAsync(filename,onload,onerror){requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("unhandledRejection",function(reason){throw reason});quit_=((status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)});Module["inspect"]=function(){return"[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=require("worker_threads")}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}global.Worker=nodeWorkerThreads.Worker}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!ENVIRONMENT_IS_NODE){read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=(title=>document.title=title)}else{}if(ENVIRONMENT_IS_NODE){if(typeof performance==="undefined"){global.performance=require("perf_hooks").performance}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){requireNodeFS();defaultPrint=(str=>fs.writeSync(1,str+"\n"));defaultPrintErr=(str=>fs.writeSync(2,str+"\n"))}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;objAssign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function TextDecoderWrapper(encoding){var textDecoder=new TextDecoder(encoding);this.decode=(data=>{if(data.buffer instanceof SharedArrayBuffer){data=new Uint8Array(data)}return textDecoder.decode.call(textDecoder,data)})}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf-16le"):undefined;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":1073741824/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATINIT__)}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;PThread.terminateAllThreads();runtimeExited=true}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="ogv-decoder-video-av1-simd-mt-wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTlsInit(Module["asm"]["H"]);wasmTable=Module["asm"]["F"];addOnInit(Module["asm"]["y"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var ASM_CONSTS={};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function killThread(pthread_ptr){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var pthread=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];pthread.worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker),1);pthread.worker.pthread=undefined}function cancelThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];pthread.worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];if(pthread){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var worker=pthread.worker;PThread.returnWorkerToPool(worker)}}function _exit(status){exit(status)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],initMainThread:function(){var pthreadPoolSize=1;for(var i=0;i>2]=0;try{func()}finally{GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls>>2]=1}},receiveObjectTransfer:function(data){},threadInit:function(){for(var i in PThread.tlsInitFunctions){PThread.tlsInitFunctions[i]()}},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=function(e){var d=e["data"];var cmd=d["cmd"];if(worker.pthread)PThread.currentProxiedOperationCallerThread=worker.pthread.threadInfoStruct;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var thread=PThread.pthreads[d.targetThread];if(thread){thread.worker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processQueuedMainThreadWork"){_emscripten_main_thread_process_queued_calls()}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="detachedExit"){PThread.returnWorkerToPool(worker)}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else{err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=function(e){var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data})});worker.on("error",function(e){worker.onerror(e)});worker.on("detachedExit",function(){})}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("ogv-decoder-video-av1-simd-mt-wasm.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=GROWABLE_HEAP_I32()[pthread_ptr+44>>2];var stackSize=GROWABLE_HEAP_I32()[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function invokeEntryPoint(ptr,arg){return getWasmTableEntry(ptr)(arg)}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTlsInit(tlsInitFunc,moduleExports,metadata){PThread.tlsInitFunctions.push(tlsInitFunc)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=(()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6})}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=(()=>performance.now()-Module["__performance_now_clock_drift"])}else _emscripten_get_now=(()=>performance.now());function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInit()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,threadInfoStruct:threadParams.pthread_ptr};worker.pthread=pthread;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"threadInfoStruct":threadParams.pthread_ptr};worker.runPthread=function(){msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}function ___pthread_create_js(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer==="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return _emscripten_sync_run_in_main_thread_4(687865856,pthread_ptr,attr,start_routine,arg)}if(error)return error;var threadParams={startRoutine:start_routine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function ___pthread_detached_exit(){postMessage({"cmd":"detachedExit"})}function __emscripten_default_pthread_stack_size(){return 2097152}function __emscripten_futex_wait_non_blocking(addr,val,timeout){var tNow=performance.now();var tEnd=tNow+timeout;var lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr);while(1){tNow=performance.now();if(tNow>tEnd){lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);return-73}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);if(lastAddr==0){break}_emscripten_main_thread_process_queued_calls();if(Atomics.load(GROWABLE_HEAP_I32(),addr>>2)!=val){return-6}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr)}return 0}function __emscripten_notify_thread_queue(targetThreadId,mainThreadId){if(targetThreadId==mainThreadId){postMessage({"cmd":"processQueuedMainThreadWork"})}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processThreadQueue"})}else{var pthread=PThread.pthreads[targetThreadId];var worker=pthread&&pthread.worker;if(!worker){return}worker.postMessage({"cmd":"processThreadQueue"})}return 1}function _abort(){abort("")}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}function _emscripten_memcpy_big(dest,src,num){GROWABLE_HEAP_U8().copyWithin(dest,src,src+num)}function _emscripten_num_logical_cores(){if(ENVIRONMENT_IS_NODE)return require("os").cpus().length;return navigator["hardwareConcurrency"]}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(function(){var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=GROWABLE_HEAP_U8().length;requestedSize=requestedSize>>>0;if(requestedSize<=oldSize){return false}var maxHeapSize=1073741824;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence>2]=eventTypeId;GROWABLE_HEAP_I32()[varargs+4>>2]=eventData;GROWABLE_HEAP_I32()[varargs+8>>2]=userData;_emscripten_dispatch_to_thread_(targetThread,637534208,eventHandlerFunc,eventData,varargs)})},getTargetThreadForEventCallback:function(targetThread){switch(targetThread){case 1:return 0;case 2:return PThread.currentProxiedOperationCallerThread;default:return targetThread}},getNodeNameForTarget:function(target){if(!target)return"";if(target==window)return"#window";if(target==screen)return"#screen";return target&&target.nodeName?target.nodeName:""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height){withStackSave(function(){var varargs=stackAlloc(12);var targetCanvasPtr=0;if(targetCanvas){targetCanvasPtr=stringToNewUTF8(targetCanvas)}GROWABLE_HEAP_I32()[varargs>>2]=targetCanvasPtr;GROWABLE_HEAP_I32()[varargs+4>>2]=width;GROWABLE_HEAP_I32()[varargs+8>>2]=height;_emscripten_dispatch_to_thread_(targetThread,657457152,0,targetCanvasPtr,varargs)})}function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread,targetCanvas,width,height){targetCanvas=targetCanvas?UTF8ToString(targetCanvas):"";_emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height)}function maybeCStringToJsString(cString){return cString>2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!=="undefined"?document:0,typeof window!=="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!=="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_set_canvas_element_size_calling_thread(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;if(canvas.canvasSharedPtr){GROWABLE_HEAP_I32()[canvas.canvasSharedPtr>>2]=width;GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+4>>2]=height}if(canvas.offscreenCanvas||!canvas.controlTransferredOffscreen){if(canvas.offscreenCanvas)canvas=canvas.offscreenCanvas;var autoResizeViewport=false;if(canvas.GLctxObject&&canvas.GLctxObject.GLctx){var prevViewport=canvas.GLctxObject.GLctx.getParameter(2978);autoResizeViewport=prevViewport[0]===0&&prevViewport[1]===0&&prevViewport[2]===canvas.width&&prevViewport[3]===canvas.height}canvas.width=width;canvas.height=height;if(autoResizeViewport){canvas.GLctxObject.GLctx.viewport(0,0,width,height)}}else if(canvas.canvasSharedPtr){var targetThread=GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+8>>2];_emscripten_set_offscreencanvas_size_on_target_thread(targetThread,target,width,height);return 1}else{return-4}return 0}function _emscripten_set_canvas_element_size_main_thread(target,width,height){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,1,target,width,height);return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(canvas){return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}else{return _emscripten_set_canvas_element_size_main_thread(target,width,height)}}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)};return 1}}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>2]:-1;source+=UTF8ToString(GROWABLE_HEAP_I32()[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;canvas.getContext=function(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}}var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=_malloc(8);GROWABLE_HEAP_I32()[handle+4>>2]=_pthread_self();var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;_free(GL.contexts[contextHandle].handle);GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=GROWABLE_HEAP_I32()[a+(24>>2)];var contextAttributes={"alpha":!!GROWABLE_HEAP_I32()[a+(0>>2)],"depth":!!GROWABLE_HEAP_I32()[a+(4>>2)],"stencil":!!GROWABLE_HEAP_I32()[a+(8>>2)],"antialias":!!GROWABLE_HEAP_I32()[a+(12>>2)],"premultipliedAlpha":!!GROWABLE_HEAP_I32()[a+(16>>2)],"preserveDrawingBuffer":!!GROWABLE_HEAP_I32()[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!GROWABLE_HEAP_I32()[a+(28>>2)],majorVersion:GROWABLE_HEAP_I32()[a+(32>>2)],minorVersion:GROWABLE_HEAP_I32()[a+(36>>2)],enableExtensionsByDefault:GROWABLE_HEAP_I32()[a+(40>>2)],explicitSwapControl:GROWABLE_HEAP_I32()[a+(44>>2)],proxyContextToMainThread:GROWABLE_HEAP_I32()[a+(48>>2)],renderViaOffscreenBackBuffer:GROWABLE_HEAP_I32()[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=GROWABLE_HEAP_I32()[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,fd);return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(4,1,fd,offset_low,offset_high,whence,newOffset)}function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(5,1,fd,iov,iovcnt,pnum);var num=0;for(var i=0;i>2];var len=GROWABLE_HEAP_I32()[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}function _ogvjs_callback_async_complete(ret,cpuTime){var callback=Module.callbacks.shift();Module["cpuTime"]+=cpuTime;callback(ret);return}function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight,picWidth,picHeight,picX,picY,displayWidth,displayHeight){var heap=wasmMemory.buffer;var format=Module["videoFormat"];function copyAndTrim(arr,buffer,stride,height,picX,picY,picWidth,picHeight,fill){arr.set(new Uint8Array(heap,buffer,stride*height));var x,y,ptr;for(ptr=0,y=0;y0){var next=recycled.shift(),format=next["format"];if(format["width"]===width&&format["height"]===height&&format["chromaWidth"]===chromaWidth&&format["chromaHeight"]===chromaHeight&&format["cropLeft"]===picX&&format["cropTop"]===picY&&format["cropWidth"]===picWidth&&format["cropHeight"]===picHeight&&format["displayWidth"]===displayWidth&&format["displayHeight"]===displayHeight&&next["y"]["bytes"].length===lenY&&next["u"]["bytes"].length===lenCb&&next["v"]["bytes"].length===lenCr){frame=next;break}}if(!frame){frame={"format":{"width":width,"height":height,"chromaWidth":chromaWidth,"chromaHeight":chromaHeight,"cropLeft":picX,"cropTop":picY,"cropWidth":picWidth,"cropHeight":picHeight,"displayWidth":displayWidth,"displayHeight":displayHeight},"y":{"bytes":new Uint8Array(lenY),"stride":strideY},"u":{"bytes":new Uint8Array(lenCb),"stride":strideCb},"v":{"bytes":new Uint8Array(lenCr),"stride":strideCr}}}copyAndTrim(frame["y"]["bytes"],bufferY,strideY,height,picX,picY,picWidth,picHeight,0);copyAndTrim(frame["u"]["bytes"],bufferCb,strideCb,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);copyAndTrim(frame["v"]["bytes"],bufferCr,strideCr,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);Module["frameBuffer"]=frame}if(!ENVIRONMENT_IS_PTHREAD)PThread.initMainThread();var GLctx;var proxiedFunctionTable=[null,exitOnMainThread,_emscripten_set_canvas_element_size_main_thread,_fd_close,_fd_seek,_fd_write];var asmLibraryArg={"v":___emscripten_init_main_thread_js,"q":___emscripten_thread_cleanup,"d":___pthread_create_js,"t":___pthread_detached_exit,"u":__emscripten_default_pthread_stack_size,"j":__emscripten_futex_wait_non_blocking,"i":__emscripten_notify_thread_queue,"c":_abort,"f":_emscripten_check_blocking_allowed,"b":_emscripten_get_now,"n":_emscripten_memcpy_big,"x":_emscripten_num_logical_cores,"w":_emscripten_receive_on_main_thread_js,"o":_emscripten_resize_heap,"g":_emscripten_set_canvas_element_size,"r":_emscripten_unwind_to_js_event_loop,"h":_emscripten_webgl_create_context,"s":_exit,"p":_fd_close,"m":_fd_seek,"e":_fd_write,"a":wasmMemory||Module["wasmMemory"],"k":_ogvjs_callback_async_complete,"l":_ogvjs_callback_frame};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["y"]).apply(null,arguments)};var _ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=function(){return(_ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=Module["asm"]["z"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["A"]).apply(null,arguments)};var _ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=function(){return(_ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=Module["asm"]["B"]).apply(null,arguments)};var _ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=function(){return(_ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=Module["asm"]["C"]).apply(null,arguments)};var _ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=function(){return(_ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=Module["asm"]["D"]).apply(null,arguments)};var _ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=function(){return(_ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=Module["asm"]["E"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["G"]).apply(null,arguments)};var _emscripten_tls_init=Module["_emscripten_tls_init"]=function(){return(_emscripten_tls_init=Module["_emscripten_tls_init"]=Module["asm"]["H"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["I"]).apply(null,arguments)};var _emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=function(){return(_emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=Module["asm"]["J"]).apply(null,arguments)};var _emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=function(){return(_emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=Module["asm"]["K"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return(_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["L"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["M"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["N"]).apply(null,arguments)};var _emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=function(){return(_emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=Module["asm"]["O"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["P"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["Q"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["R"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["S"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["T"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["U"]).apply(null,arguments)};var __emscripten_main_thread_futex=Module["__emscripten_main_thread_futex"]=375988;var __emscripten_allow_main_runtime_queued_calls=Module["__emscripten_allow_main_runtime_queued_calls"]=108356;Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["PThread"]=PThread;Module["PThread"]=PThread;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){readyPromiseResolve(Module);initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}if(keepRuntimeAlive()){}else{exitRuntime()}procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}if(ENVIRONMENT_IS_PTHREAD){noExitRuntime=false;PThread.initWorker()}run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module["_free"](inputBuffer)}inputBufferSize=size;inputBuffer=Module["_malloc"](inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance==="undefined"||typeof performance.now==="undefined"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module["cpuTime"]+=getTimestamp()-start;return ret}Module["loadedMetadata"]=!!options["videoFormat"];Module["videoFormat"]=options["videoFormat"]||null;Module["frameBuffer"]=null;Module["cpuTime"]=0;Object.defineProperty(Module,"processing",{get:function getProcessing(){return false}});Module["init"]=function(callback){time(function(){Module["_ogv_video_decoder_init"]()});callback()};Module["processHeader"]=function(data,callback){var ret=time(function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_header"](buffer,len)});callback(ret)};Module.callbacks=[];Module["processFrame"]=function(data,callback){var isAsync=Module["_ogv_video_decoder_async"]();var len=data.byteLength;var buffer=Module["_malloc"](len);function callbackWrapper(ret){Module["_free"](buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time(function(){var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_frame"](buffer,len)});if(!isAsync){callbackWrapper(ret)}};Module["close"]=function(){};Module["sync"]=function(){var isAsync=Module["_ogv_video_decoder_async"]();if(isAsync){Module.callbacks.push(function(){});time(function(){Module["_ogv_video_decoder_process_frame"](0,0)})}};Module["recycledFrames"]=[];Module["recycleFrame"]=function(frame){var arr=Module["recycledFrames"];arr.push(frame);if(arr.length>16){arr.shift()}}; - - - return OGVDecoderVideoAV1SIMDMTW.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = OGVDecoderVideoAV1SIMDMTW; -else if (typeof define === 'function' && define['amd']) - define([], function() { return OGVDecoderVideoAV1SIMDMTW; }); -else if (typeof exports === 'object') - exports["OGVDecoderVideoAV1SIMDMTW"] = OGVDecoderVideoAV1SIMDMTW; diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.wasm b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.wasm deleted file mode 100755 index be718ad829bc6456f19f40df51d717e5bba18731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 495935 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 G37>+Q4<~#|X2&~4Ge4N{ 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 n7--r9ZP#75oxREbIJ^0`6#v-9*$J8F=DoXlW { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoAV1SIMDW) { - OGVDecoderVideoAV1SIMDW = OGVDecoderVideoAV1SIMDW || {}; - - -var a;a||(a=typeof OGVDecoderVideoAV1SIMDW !== 'undefined' ? OGVDecoderVideoAV1SIMDW : {});var aa=Object.assign,ba,q;a.ready=new Promise(function(b,c){ba=b;q=c});var ca=a,da=aa({},a),ea="object"===typeof window,r="function"===typeof importScripts,A="",fa,F,G,fs,I,ha; -if("object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node)A=r?require("path").dirname(A)+"/":__dirname+"/",ha=function(){I||(fs=require("fs"),I=require("path"))},fa=function(b,c){ha();b=I.normalize(b);return fs.readFileSync(b,c?null:"utf8")},G=function(b){b=fa(b,!0);b.buffer||(b=new Uint8Array(b));return b},F=function(b,c,e){ha();b=I.normalize(b);fs.readFile(b,function(d,f){d?e(d):c(f.buffer)})},1=T.length&&(T.length=b+1),T[b]=c=na.get(b));return c} -var Ka=[null,[],[]],La={b:function(){M("")},d:function(b,c,e){O.copyWithin(b,c,c+e)},e:function(b){var c=O.length;b>>>=0;if(2147483648=e;e*=2){var d=c*(1+.2/e);d=Math.min(d,b+100663296);d=Math.max(b,d);0>>16);ma();var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},f:function(){return 0},c:function(){},a:function(b,c,e,d){for(var f=0,g=0;g>2],u=P[c+4>>2];c+=8;for(var y= -0;y=t);)++v;if(16h?t+=String.fromCharCode(h):(h-=65536,t+=String.fromCharCode(55296|h>>10,56320|h&1023))}}else t+=String.fromCharCode(h)}l=t}n(l);w.length= -0}else w.push(n)}f+=u}P[d>>2]=f;return 0},g:function(b,c,e,d,f,g,x,u,y,n,w,l,p,t,v,h){function B(H,k,C,ya,za,Aa,Na,Oa,V){H.set(new Uint8Array(U,k,C*ya));var D,z;for(D=z=0;D=d||(X&&a._free(X),Qa=d,X=a._malloc(Qa));var f=X;(new Uint8Array(N.buffer,f,d)).set(new Uint8Array(b));return a._ogv_video_decoder_process_header(f,d)});c(e)};a.A=[]; -a.processFrame=function(b,c){function e(u){a._free(g);c(u)}var d=a._ogv_video_decoder_async(),f=b.byteLength,g=a._malloc(f);d&&a.A.push(e);var x=Z(function(){(new Uint8Array(N.buffer,g,f)).set(new Uint8Array(b));return a._ogv_video_decoder_process_frame(g,f)});d||e(x)};a.close=function(){};a.sync=function(){a._ogv_video_decoder_async()&&(a.A.push(function(){}),Z(function(){a._ogv_video_decoder_process_frame(0,0)}))};a.recycledFrames=[]; -a.recycleFrame=function(b){var c=a.recycledFrames;c.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�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�e7L-vEXK9g;Vp=m)m#G!9l459* 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 { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoAV1W) { - OGVDecoderVideoAV1W = OGVDecoderVideoAV1W || {}; - - -var a;a||(a=typeof OGVDecoderVideoAV1W !== 'undefined' ? OGVDecoderVideoAV1W : {});var aa=Object.assign,ba,q;a.ready=new Promise(function(b,c){ba=b;q=c});var ca=a,da=aa({},a),ea="object"===typeof window,r="function"===typeof importScripts,A="",fa,F,G,fs,I,ha; -if("object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node)A=r?require("path").dirname(A)+"/":__dirname+"/",ha=function(){I||(fs=require("fs"),I=require("path"))},fa=function(b,c){ha();b=I.normalize(b);return fs.readFileSync(b,c?null:"utf8")},G=function(b){b=fa(b,!0);b.buffer||(b=new Uint8Array(b));return b},F=function(b,c,e){ha();b=I.normalize(b);fs.readFile(b,function(d,f){d?e(d):c(f.buffer)})},1=T.length&&(T.length=b+1),T[b]=c=na.get(b));return c} -var Ka=[null,[],[]],La={f:function(){M("")},c:function(b,c,e){O.copyWithin(b,c,c+e)},d:function(b){var c=O.length;b>>>=0;if(2147483648=e;e*=2){var d=c*(1+.2/e);d=Math.min(d,b+100663296);d=Math.max(b,d);0>>16);ma();var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},e:function(){return 0},b:function(){},a:function(b,c,e,d){for(var f=0,g=0;g>2],u=P[c+4>>2];c+=8;for(var y= -0;y=t);)++v;if(16h?t+=String.fromCharCode(h):(h-=65536,t+=String.fromCharCode(55296|h>>10,56320|h&1023))}}else t+=String.fromCharCode(h)}l=t}n(l);w.length= -0}else w.push(n)}f+=u}P[d>>2]=f;return 0},g:function(b,c,e,d,f,g,x,u,y,n,w,l,p,t,v,h){function B(H,k,C,ya,za,Aa,Na,Oa,V){H.set(new Uint8Array(U,k,C*ya));var D,z;for(D=z=0;D=d||(X&&a._free(X),Qa=d,X=a._malloc(Qa));var f=X;(new Uint8Array(N.buffer,f,d)).set(new Uint8Array(b));return a._ogv_video_decoder_process_header(f,d)});c(e)};a.A=[]; -a.processFrame=function(b,c){function e(u){a._free(g);c(u)}var d=a._ogv_video_decoder_async(),f=b.byteLength,g=a._malloc(f);d&&a.A.push(e);var x=Z(function(){(new Uint8Array(N.buffer,g,f)).set(new Uint8Array(b));return a._ogv_video_decoder_process_frame(g,f)});d||e(x)};a.close=function(){};a.sync=function(){a._ogv_video_decoder_async()&&(a.A.push(function(){}),Z(function(){a._ogv_video_decoder_process_frame(0,0)}))};a.recycledFrames=[]; -a.recycleFrame=function(b){var c=a.recycledFrames;c.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 { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoTheoraW) { - OGVDecoderVideoTheoraW = OGVDecoderVideoTheoraW || {}; - - -var a;a||(a=typeof OGVDecoderVideoTheoraW !== 'undefined' ? OGVDecoderVideoTheoraW : {});var ca=Object.assign,da,l;a.ready=new Promise(function(b,c){da=b;l=c});var ea=a,fa=ca({},a),ha="object"===typeof window,m="function"===typeof importScripts,t="",y,B,C,fs,D,E; -if("object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node)t=m?require("path").dirname(t)+"/":__dirname+"/",E=function(){D||(fs=require("fs"),D=require("path"))},y=function(b,c){E();b=D.normalize(b);return fs.readFileSync(b,c?null:"utf8")},C=function(b){b=y(b,!0);b.buffer||(b=new Uint8Array(b));return b},B=function(b,c,e){E();b=D.normalize(b);fs.readFile(b,function(d,f){d?e(d):c(f.buffer)})},1=U.length&&(U.length=b+1),U[b]=c=la.get(b));return c} -var Ga={a:function(b,c,e){L.copyWithin(b,c,c+e)},b:function(b){var c=L.length;b>>>=0;if(2147483648=e;e*=2){var d=c*(1+.2/e);d=Math.min(d,b+100663296);d=Math.max(b,d);0>>16);ka();var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},c:function(b,c,e,d,f,g,q,n,z,p,u,F,M,N,Z,aa){function ba(A,h,v,va,wa,xa,Ia,Ja,O){A.set(new Uint8Array(Ka,h,v*va));var w,r;for(w=r=0;w=d||(W&&a._free(W),Ma=d,W=a._malloc(Ma));var f=W;(new Uint8Array(K.buffer,f,d)).set(new Uint8Array(b));return a._ogv_video_decoder_process_header(f,d)});c(e)};a.s=[]; -a.processFrame=function(b,c){function e(n){a._free(g);c(n)}var d=a._ogv_video_decoder_async(),f=b.byteLength,g=a._malloc(f);d&&a.s.push(e);var q=Y(function(){(new Uint8Array(K.buffer,g,f)).set(new Uint8Array(b));return a._ogv_video_decoder_process_frame(g,f)});d||e(q)};a.close=function(){};a.sync=function(){a._ogv_video_decoder_async()&&(a.s.push(function(){}),Y(function(){a._ogv_video_decoder_process_frame(0,0)}))};a.recycledFrames=[]; -a.recycleFrame=function(b){var c=a.recycledFrames;c.push(b);16vD+T`7ET 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 { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoVP8MTW) { - OGVDecoderVideoVP8MTW = OGVDecoderVideoVP8MTW || {}; - -function GROWABLE_HEAP_U8(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPU8}function GROWABLE_HEAP_I32(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAP32}function GROWABLE_HEAP_F64(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPF64}var Module=typeof OGVDecoderVideoVP8MTW!=="undefined"?OGVDecoderVideoVP8MTW:{};var objAssign=Object.assign;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var options=Module;var moduleOverrides=objAssign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=function(){if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=function readAsync(filename,onload,onerror){requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("unhandledRejection",function(reason){throw reason});quit_=((status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)});Module["inspect"]=function(){return"[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=require("worker_threads")}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}global.Worker=nodeWorkerThreads.Worker}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!ENVIRONMENT_IS_NODE){read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=(title=>document.title=title)}else{}if(ENVIRONMENT_IS_NODE){if(typeof performance==="undefined"){global.performance=require("perf_hooks").performance}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){requireNodeFS();defaultPrint=(str=>fs.writeSync(1,str+"\n"));defaultPrintErr=(str=>fs.writeSync(2,str+"\n"))}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;objAssign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var getTempRet0=function(){return tempRet0};var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function TextDecoderWrapper(encoding){var textDecoder=new TextDecoder(encoding);this.decode=(data=>{if(data.buffer instanceof SharedArrayBuffer){data=new Uint8Array(data)}return textDecoder.decode.call(textDecoder,data)})}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf-16le"):undefined;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":1073741824/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATINIT__)}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;PThread.terminateAllThreads();runtimeExited=true}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="ogv-decoder-video-vp8-mt-wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTlsInit(Module["asm"]["R"]);wasmTable=Module["asm"]["O"];addOnInit(Module["asm"]["I"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var ASM_CONSTS={};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function killThread(pthread_ptr){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var pthread=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];pthread.worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker),1);pthread.worker.pthread=undefined}function cancelThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];pthread.worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];if(pthread){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var worker=pthread.worker;PThread.returnWorkerToPool(worker)}}function _exit(status){exit(status)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],initMainThread:function(){var pthreadPoolSize=1;for(var i=0;i>2]=0;try{func()}finally{GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls>>2]=1}},receiveObjectTransfer:function(data){},threadInit:function(){for(var i in PThread.tlsInitFunctions){PThread.tlsInitFunctions[i]()}},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=function(e){var d=e["data"];var cmd=d["cmd"];if(worker.pthread)PThread.currentProxiedOperationCallerThread=worker.pthread.threadInfoStruct;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var thread=PThread.pthreads[d.targetThread];if(thread){thread.worker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processQueuedMainThreadWork"){_emscripten_main_thread_process_queued_calls()}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="detachedExit"){PThread.returnWorkerToPool(worker)}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else{err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=function(e){var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data})});worker.on("error",function(e){worker.onerror(e)});worker.on("detachedExit",function(){})}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("ogv-decoder-video-vp8-mt-wasm.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=GROWABLE_HEAP_I32()[pthread_ptr+44>>2];var stackSize=GROWABLE_HEAP_I32()[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function invokeEntryPoint(ptr,arg){return getWasmTableEntry(ptr)(arg)}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTlsInit(tlsInitFunc,moduleExports,metadata){PThread.tlsInitFunctions.push(tlsInitFunc)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=(()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6})}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=(()=>performance.now()-Module["__performance_now_clock_drift"])}else _emscripten_get_now=(()=>performance.now());function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInit()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,threadInfoStruct:threadParams.pthread_ptr};worker.pthread=pthread;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"threadInfoStruct":threadParams.pthread_ptr};worker.runPthread=function(){msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}function ___pthread_create_js(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer==="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return _emscripten_sync_run_in_main_thread_4(687865856,pthread_ptr,attr,start_routine,arg)}if(error)return error;var threadParams={startRoutine:start_routine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function ___pthread_detached_exit(){postMessage({"cmd":"detachedExit"})}function __emscripten_default_pthread_stack_size(){return 2097152}function __emscripten_futex_wait_non_blocking(addr,val,timeout){var tNow=performance.now();var tEnd=tNow+timeout;var lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr);while(1){tNow=performance.now();if(tNow>tEnd){lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);return-73}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);if(lastAddr==0){break}_emscripten_main_thread_process_queued_calls();if(Atomics.load(GROWABLE_HEAP_I32(),addr>>2)!=val){return-6}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr)}return 0}function __emscripten_notify_thread_queue(targetThreadId,mainThreadId){if(targetThreadId==mainThreadId){postMessage({"cmd":"processQueuedMainThreadWork"})}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processThreadQueue"})}else{var pthread=PThread.pthreads[targetThreadId];var worker=pthread&&pthread.worker;if(!worker){return}worker.postMessage({"cmd":"processThreadQueue"})}return 1}function __emscripten_throw_longjmp(){throw"longjmp"}function _abort(){abort("")}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}function _emscripten_get_heap_max(){return 1073741824}function _emscripten_memcpy_big(dest,src,num){GROWABLE_HEAP_U8().copyWithin(dest,src,src+num)}function _emscripten_num_logical_cores(){if(ENVIRONMENT_IS_NODE)return require("os").cpus().length;return navigator["hardwareConcurrency"]}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(function(){var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=GROWABLE_HEAP_U8().length;requestedSize=requestedSize>>>0;if(requestedSize<=oldSize){return false}var maxHeapSize=1073741824;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence>2]=eventTypeId;GROWABLE_HEAP_I32()[varargs+4>>2]=eventData;GROWABLE_HEAP_I32()[varargs+8>>2]=userData;_emscripten_dispatch_to_thread_(targetThread,637534208,eventHandlerFunc,eventData,varargs)})},getTargetThreadForEventCallback:function(targetThread){switch(targetThread){case 1:return 0;case 2:return PThread.currentProxiedOperationCallerThread;default:return targetThread}},getNodeNameForTarget:function(target){if(!target)return"";if(target==window)return"#window";if(target==screen)return"#screen";return target&&target.nodeName?target.nodeName:""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height){withStackSave(function(){var varargs=stackAlloc(12);var targetCanvasPtr=0;if(targetCanvas){targetCanvasPtr=stringToNewUTF8(targetCanvas)}GROWABLE_HEAP_I32()[varargs>>2]=targetCanvasPtr;GROWABLE_HEAP_I32()[varargs+4>>2]=width;GROWABLE_HEAP_I32()[varargs+8>>2]=height;_emscripten_dispatch_to_thread_(targetThread,657457152,0,targetCanvasPtr,varargs)})}function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread,targetCanvas,width,height){targetCanvas=targetCanvas?UTF8ToString(targetCanvas):"";_emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height)}function maybeCStringToJsString(cString){return cString>2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!=="undefined"?document:0,typeof window!=="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!=="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_set_canvas_element_size_calling_thread(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;if(canvas.canvasSharedPtr){GROWABLE_HEAP_I32()[canvas.canvasSharedPtr>>2]=width;GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+4>>2]=height}if(canvas.offscreenCanvas||!canvas.controlTransferredOffscreen){if(canvas.offscreenCanvas)canvas=canvas.offscreenCanvas;var autoResizeViewport=false;if(canvas.GLctxObject&&canvas.GLctxObject.GLctx){var prevViewport=canvas.GLctxObject.GLctx.getParameter(2978);autoResizeViewport=prevViewport[0]===0&&prevViewport[1]===0&&prevViewport[2]===canvas.width&&prevViewport[3]===canvas.height}canvas.width=width;canvas.height=height;if(autoResizeViewport){canvas.GLctxObject.GLctx.viewport(0,0,width,height)}}else if(canvas.canvasSharedPtr){var targetThread=GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+8>>2];_emscripten_set_offscreencanvas_size_on_target_thread(targetThread,target,width,height);return 1}else{return-4}return 0}function _emscripten_set_canvas_element_size_main_thread(target,width,height){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,1,target,width,height);return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(canvas){return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}else{return _emscripten_set_canvas_element_size_main_thread(target,width,height)}}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)};return 1}}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>2]:-1;source+=UTF8ToString(GROWABLE_HEAP_I32()[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;canvas.getContext=function(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}}var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=_malloc(8);GROWABLE_HEAP_I32()[handle+4>>2]=_pthread_self();var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;_free(GL.contexts[contextHandle].handle);GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=GROWABLE_HEAP_I32()[a+(24>>2)];var contextAttributes={"alpha":!!GROWABLE_HEAP_I32()[a+(0>>2)],"depth":!!GROWABLE_HEAP_I32()[a+(4>>2)],"stencil":!!GROWABLE_HEAP_I32()[a+(8>>2)],"antialias":!!GROWABLE_HEAP_I32()[a+(12>>2)],"premultipliedAlpha":!!GROWABLE_HEAP_I32()[a+(16>>2)],"preserveDrawingBuffer":!!GROWABLE_HEAP_I32()[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!GROWABLE_HEAP_I32()[a+(28>>2)],majorVersion:GROWABLE_HEAP_I32()[a+(32>>2)],minorVersion:GROWABLE_HEAP_I32()[a+(36>>2)],enableExtensionsByDefault:GROWABLE_HEAP_I32()[a+(40>>2)],explicitSwapControl:GROWABLE_HEAP_I32()[a+(44>>2)],proxyContextToMainThread:GROWABLE_HEAP_I32()[a+(48>>2)],renderViaOffscreenBackBuffer:GROWABLE_HEAP_I32()[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=GROWABLE_HEAP_I32()[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,fd,iov,iovcnt,pnum);var num=0;for(var i=0;i>2];var len=GROWABLE_HEAP_I32()[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}function _getTempRet0(){return getTempRet0()}function _ogvjs_callback_async_complete(ret,cpuTime){var callback=Module.callbacks.shift();Module["cpuTime"]+=cpuTime;callback(ret);return}function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight,picWidth,picHeight,picX,picY,displayWidth,displayHeight){var heap=wasmMemory.buffer;var format=Module["videoFormat"];function copyAndTrim(arr,buffer,stride,height,picX,picY,picWidth,picHeight,fill){arr.set(new Uint8Array(heap,buffer,stride*height));var x,y,ptr;for(ptr=0,y=0;y0){var next=recycled.shift(),format=next["format"];if(format["width"]===width&&format["height"]===height&&format["chromaWidth"]===chromaWidth&&format["chromaHeight"]===chromaHeight&&format["cropLeft"]===picX&&format["cropTop"]===picY&&format["cropWidth"]===picWidth&&format["cropHeight"]===picHeight&&format["displayWidth"]===displayWidth&&format["displayHeight"]===displayHeight&&next["y"]["bytes"].length===lenY&&next["u"]["bytes"].length===lenCb&&next["v"]["bytes"].length===lenCr){frame=next;break}}if(!frame){frame={"format":{"width":width,"height":height,"chromaWidth":chromaWidth,"chromaHeight":chromaHeight,"cropLeft":picX,"cropTop":picY,"cropWidth":picWidth,"cropHeight":picHeight,"displayWidth":displayWidth,"displayHeight":displayHeight},"y":{"bytes":new Uint8Array(lenY),"stride":strideY},"u":{"bytes":new Uint8Array(lenCb),"stride":strideCb},"v":{"bytes":new Uint8Array(lenCr),"stride":strideCr}}}copyAndTrim(frame["y"]["bytes"],bufferY,strideY,height,picX,picY,picWidth,picHeight,0);copyAndTrim(frame["u"]["bytes"],bufferCb,strideCb,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);copyAndTrim(frame["v"]["bytes"],bufferCr,strideCr,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);Module["frameBuffer"]=frame}function _setTempRet0(val){setTempRet0(val)}if(!ENVIRONMENT_IS_PTHREAD)PThread.initMainThread();var GLctx;var proxiedFunctionTable=[null,exitOnMainThread,_emscripten_set_canvas_element_size_main_thread,_fd_write];var asmLibraryArg={"z":___emscripten_init_main_thread_js,"u":___emscripten_thread_cleanup,"l":___pthread_create_js,"x":___pthread_detached_exit,"y":__emscripten_default_pthread_stack_size,"E":__emscripten_futex_wait_non_blocking,"D":__emscripten_notify_thread_queue,"s":__emscripten_throw_longjmp,"H":_abort,"k":_emscripten_check_blocking_allowed,"t":_emscripten_get_heap_max,"d":_emscripten_get_now,"p":_emscripten_memcpy_big,"m":_emscripten_num_logical_cores,"A":_emscripten_receive_on_main_thread_js,"r":_emscripten_resize_heap,"B":_emscripten_set_canvas_element_size,"v":_emscripten_unwind_to_js_event_loop,"C":_emscripten_webgl_create_context,"w":_exit,"j":_fd_write,"b":_getTempRet0,"F":invoke_i,"h":invoke_ii,"i":invoke_iii,"G":invoke_iiii,"o":invoke_iiiij,"e":invoke_vi,"f":invoke_viii,"g":invoke_viiii,"a":wasmMemory||Module["wasmMemory"],"n":_ogvjs_callback_async_complete,"q":_ogvjs_callback_frame,"c":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["I"]).apply(null,arguments)};var _ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=function(){return(_ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=Module["asm"]["J"]).apply(null,arguments)};var _ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=function(){return(_ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=Module["asm"]["K"]).apply(null,arguments)};var _ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=function(){return(_ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=Module["asm"]["L"]).apply(null,arguments)};var _ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=function(){return(_ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=Module["asm"]["M"]).apply(null,arguments)};var _ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=function(){return(_ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=Module["asm"]["N"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["P"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["Q"]).apply(null,arguments)};var _emscripten_tls_init=Module["_emscripten_tls_init"]=function(){return(_emscripten_tls_init=Module["_emscripten_tls_init"]=Module["asm"]["R"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["S"]).apply(null,arguments)};var _emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=function(){return(_emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=Module["asm"]["T"]).apply(null,arguments)};var _emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=function(){return(_emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=Module["asm"]["U"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return(_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["V"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["W"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["X"]).apply(null,arguments)};var _emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=function(){return(_emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=Module["asm"]["Y"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["Z"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["_"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["$"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["aa"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["ba"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["ca"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["da"]).apply(null,arguments)};var dynCall_iiiij=Module["dynCall_iiiij"]=function(){return(dynCall_iiiij=Module["dynCall_iiiij"]=Module["asm"]["ea"]).apply(null,arguments)};var __emscripten_main_thread_futex=Module["__emscripten_main_thread_futex"]=10092;var __emscripten_allow_main_runtime_queued_calls=Module["__emscripten_allow_main_runtime_queued_calls"]=8592;function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_i(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiij(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_iiiij(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["PThread"]=PThread;Module["PThread"]=PThread;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){readyPromiseResolve(Module);initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}if(keepRuntimeAlive()){}else{exitRuntime()}procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}if(ENVIRONMENT_IS_PTHREAD){noExitRuntime=false;PThread.initWorker()}run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module["_free"](inputBuffer)}inputBufferSize=size;inputBuffer=Module["_malloc"](inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance==="undefined"||typeof performance.now==="undefined"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module["cpuTime"]+=getTimestamp()-start;return ret}Module["loadedMetadata"]=!!options["videoFormat"];Module["videoFormat"]=options["videoFormat"]||null;Module["frameBuffer"]=null;Module["cpuTime"]=0;Object.defineProperty(Module,"processing",{get:function getProcessing(){return false}});Module["init"]=function(callback){time(function(){Module["_ogv_video_decoder_init"]()});callback()};Module["processHeader"]=function(data,callback){var ret=time(function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_header"](buffer,len)});callback(ret)};Module.callbacks=[];Module["processFrame"]=function(data,callback){var isAsync=Module["_ogv_video_decoder_async"]();var len=data.byteLength;var buffer=Module["_malloc"](len);function callbackWrapper(ret){Module["_free"](buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time(function(){var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_frame"](buffer,len)});if(!isAsync){callbackWrapper(ret)}};Module["close"]=function(){};Module["sync"]=function(){var isAsync=Module["_ogv_video_decoder_async"]();if(isAsync){Module.callbacks.push(function(){});time(function(){Module["_ogv_video_decoder_process_frame"](0,0)})}};Module["recycledFrames"]=[];Module["recycleFrame"]=function(frame){var arr=Module["recycledFrames"];arr.push(frame);if(arr.length>16){arr.shift()}}; - - - return OGVDecoderVideoVP8MTW.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = OGVDecoderVideoVP8MTW; -else if (typeof define === 'function' && define['amd']) - define([], function() { return OGVDecoderVideoVP8MTW; }); -else if (typeof exports === 'object') - exports["OGVDecoderVideoVP8MTW"] = OGVDecoderVideoVP8MTW; diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp8-mt-wasm.wasm b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp8-mt-wasm.wasm deleted file mode 100755 index cbe08a027ef01fe8c251ba4257e0bfb3adfc21d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139143 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 { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoVP8W) { - OGVDecoderVideoVP8W = OGVDecoderVideoVP8W || {}; - - -var a;a||(a=typeof OGVDecoderVideoVP8W !== 'undefined' ? OGVDecoderVideoVP8W : {});var aa=Object.assign,ba,n;a.ready=new Promise(function(b,c){ba=b;n=c});var ca=a,ha=aa({},a),ia="object"===typeof window,p="function"===typeof importScripts,t="",x,y,A,fs,B,C; -if("object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node)t=p?require("path").dirname(t)+"/":__dirname+"/",C=function(){B||(fs=require("fs"),B=require("path"))},x=function(b,c){C();b=B.normalize(b);return fs.readFileSync(b,c?null:"utf8")},A=function(b){b=x(b,!0);b.buffer||(b=new Uint8Array(b));return b},y=function(b,c,e){C();b=B.normalize(b);fs.readFile(b,function(d,f){d?e(d):c(f.buffer)})},1=O.length&&(O.length=b+1),O[b]=c=oa.get(b));return c} -var Pa={g:function(){throw"longjmp";},e:function(b,c,e){ma.copyWithin(b,c,c+e)},f:function(b){var c=ma.length;b>>>=0;if(2147483648=e;e*=2){var d=c*(1+.2/e);d=Math.min(d,b+100663296);d=Math.max(b,d);0>>16);na();var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},a:function(){return ja},d:Ka,i:La,j:Ma,h:Na,c:Oa,k:function(b,c,e,d,f,g,l,m,P,q,H,I,Q,R,da,ea){function fa(z,h,u,za,Aa,Ba, -Sa,Ta,S){z.set(new Uint8Array(Ua,h,u*za));var v,r;for(v=r=0;v=d||(X&&a._free(X),Wa=d,X=a._malloc(Wa));var f=X;(new Uint8Array(G.buffer,f,d)).set(new Uint8Array(b));return a._ogv_video_decoder_process_header(f,d)});c(e)};a.B=[]; -a.processFrame=function(b,c){function e(m){a._free(g);c(m)}var d=a._ogv_video_decoder_async(),f=b.byteLength,g=a._malloc(f);d&&a.B.push(e);var l=Z(function(){(new Uint8Array(G.buffer,g,f)).set(new Uint8Array(b));return a._ogv_video_decoder_process_frame(g,f)});d||e(l)};a.close=function(){};a.sync=function(){a._ogv_video_decoder_async()&&(a.B.push(function(){}),Z(function(){a._ogv_video_decoder_process_frame(0,0)}))};a.recycledFrames=[]; -a.recycleFrame=function(b){var c=a.recycledFrames;c.push(b);16E9xvbt23r{i|HQw?K?hvm!?t)}Av18VVrOC2J>1Q%RJbW)a~8S2$Z zXS~40^ZEYvKIfiu?|n~_BRiB8CwlknbM~L#{_WrX?ccw>cl4c~_*fi8QT#-_^wIh$ z{);}^)Q=vLQ>WrnAB}mck+w(v@HYBr7*9N%~~^Q zbrzbfMl!V+$7JEZMl)$Ql4Pz0jwb$BOUSB!{Ou%l3g`cI>oc`(v)-I-)f@50mkjg6$)iBH9Dw@#PRn=r{YgWkHmi?`u@({apdCe?RWJaKJtO@`x~G9-jffV_{940 z@A>YJ9eeQ4J@6g>&7c41U-;I0|MZ{zwxjod@WX%RBj0|{hwl4Re{JyB*Z$I9`ODvR z=YehCwEsK5@$Q>`F#dt~Q}NV)`1$7d{d>@H>RplRt!3?fky}oq{mFEe=qJ*jdKRx` zHCH>4H3w_`hF-P%E&VKI_4=wFmeV+GyY3*1)0%7O-_ez{J|9KhG;tgJS0AKF+HleR zS$(BnOIFi*+Pw4l42`DA8g20@t*>PDyJvip{YGsyjjxZQelv~u8V|C@p`@P1JoVK` zd(f|?%``cYw$=eAacxyozkep`b}3OiluYx}I+U~ltT)&fb^j9sbSi#?wv#*6N*W)I z^pgzeT)gI!iK`vWKY{_hRBN^Hx#p50W2?wmBS*b>-?8`fCt7p0<5`{R0sGDPxck%( zJlZ~%#fLy^4RqAk+{5-gvC?{7cUGDL0^EM;);GNXR5wjCKI2X`V>y=n&yxS?`JZVr z_d@2xEfr78#nbM*DnWnTEw5*FQ0P+C8-MnWPcdq}M;Pu}S_kDCj-ID)`mv|pp#&P$*QGk|XqNb*(RCuG-YN&yYzMJ~X3Yuyzgl z*lA?Q2aWMrJr~j#&Z8x?DZQ4}?=8I=!6Y?a9~q_FQ*t;;)XMcy?QjHzRa?oSsnN#f zVv#_^RCZ|?6L-iUKZ8)-bmx#DkG>jUBhu~Totcx0IALIwfHM^A*?QeiP{v6HXmEJVf zLBWC$9=4J6X6>7@y%~o&LV4Z;0N=%?zF3Rvfg3mXMN9~Wx=wk|05ph>N7$$FI3PPi zmt%6q?w82=IPjCD4fv;dbdft9_olPhojR0!ko4^$PD_1QU3LE?Cg%ZrJgvuXRf~tC zHWgo>;yM-A)zXVG9Y4cVt5M~C^{k%O_w)Kt@Fb_z^oCeH#pJfAZ}%T(5u*5>fAZayR{Aox zmY5R*@_0f9=XVAC)bzRzzhsTlN|M;Ta#42$+5nSkVSn;1y=^o|?_Q4>n(jZFiT5z4 zQiKcO;?J?$c(61Se?y#**6PN0CI^2=i^fPdm2Q&Ox=R`k&mYolpPo{Biu9CEPb)o5 zdfKOFm7XO%>(gNJhPX$%=hF*HFOXjF=_RF?NH6*HcBQwI-tN<^H#fw~q!CL552L^z z(ySs%Lmm7fz1yevD7}aD9!Md95v0+#tl>WW-z9o8$Y>fE zG9UyM8B)x)f$N>%Q%0u_#_gl&TGq*PPTP>pr&C4#CR27;^HjQ$?pi|- z4g^x6tJ$K^Tsl`OG@I^C_pD`ed7%>NEqDyhfEfOPm>D5PfBaBbM`JM9wV@EV31mC$ zaN3~DbzhO>X#P=ALlx8Kl9pl||awxvr&57Qm#_B@eeW_P+Xe^txr2DGMWdQJYm823ST*_de< zW~7egG*iYqI-N)HCZr%i!lo}3_zu??3;r<{HI0S-RA{Ea%qH`^mPV}P;^g{)-Rg&R zML$vZH&Dw@A%#T@C-}`^6;KsIJFQM2X+VMFlZ9n*lPr?;EDI{$CRw0fp9NapBn#Rd zi$-Soq%3|7sw>4+!U*yYx{=(=V?Kw6Be+SH@(6B{r96U??)XPTks8t;5ooPD&wEKq zXhIUic6PguT_1OYnBA3FKk0wu|8jg^ebqgBM4}m@8*jP;_sQe>J-UKiP&=6=Ct1yE z$EhB%`V&r?fTU#1C9ykq#0zyYSI~$g<~FKY?4CISAtB>YH9YN+wD!G{gH7d?q|b_( zCMct@Yo?i1RYT-NSQ9BSGm!~htT)rswzwI9Q}@mANqV$nK|KKy==R#W>N;^eq>h`0 z1pLz{UGKODzH!pE`JN`q8mT+UNlXG+RHWmRE*VM3MLP60DtfC=5#OlWTi$qhj4_E{gLOUQ`9&or&02F~f65%4P@T zcGlhwbh_k(JNHdSI5y6ZTWd{X}PaHQ#pe12Sm6UvB*8H-W`=-9nirLwWqPC#cqkg&>V;iV1hxr4 zg{)&dOy`(y#0=iGnjri>Po$Gd)jsAL?1uy zUjFf4`|-vn)beY$`>vc1zZ+>6O_0d~5-^gnsHCm?W;*UU)h!Q!J7-UHS!-AAz8Q=N zY5m?A_`vzwk@2AXnYt!==uwR#&)?pUpfRXgmBcb1$A%-A|GhX^^bF6^%y3ap3gxN0 zW|&I-CS6dGnqTN*EzD5nnucfqh_$ujgMJf3jDTz~b^pk-lEwshn;ID4l`RB#Rf?vl z=mRtHbW3%#*HSuMRDxMfuo%!D+PlOhnKcRXMIefC+&D;^m{C3Q$&G5XCeY$F7*&7= zsH46$68BczDdW;<6Uf7BvNzXyE4!xaphCU>z)Si3~agm1Cm_^(~l?6811`fRdX7NLZ7`|%es17 z8qUUWI6Y=0OGE8hGPr97GgLm1*mnIAltuK8X75`OzkA%zH{-hQh1*j}5RiwTgijrj zVKZ`1AMqru=L?=LYr;69Q%!OSQ%WM2)^i@8<%K=M_34C5WmMDjYP$WBG(Jg}UF$ed z#7rNa7xHbrZD$oa6IC^B!rNe4$1I6jdUe$m&*N+B6KkJR00pj z-db0U4O&E5vlbggiymCS@;pHJ27fG7>I8Tznr=*Jnt`(AJdH7;7dWJKXehDS<;TeX z1y?o@k?1T8NDTM|{E{*9Icc06zN0y5r4UJ3;EGuZ=Zd;oCp;UZuMD>DEchJ9EgUK5 zln~}8aR_=$Bmon!7FOoYAZyED&y71bD6?S??90>GrK%A*wze8S%#A{mp5l+F2A zYaToxt-%w@S#8auLalie)!M0^vcj+u=Z)`%_PxYowOYUZAjUH>vY8jphUyC4X}O+T zN?TORxU7VgFE)`hmiu*CU6GGx)%QbYU=Xlu{Wjs1v^psJum8XZi_bCCk}W-2>h2K~ zq&n+gKI0M%mQ7;mlNu2g)ZtL{arOqijg>i#5SMaIfObq1@E%5nvD?>tf;wd5=4V>X z_#eYOY;~`)n9%848kafYG!fKrSu$s>By(ya4`oitS3n`JM;o&USdGGnpwz4e@wnzY z;er##~OvPdg28I}2fj2d|vm0VDdMAbCTYLYon8WOEi5i)2WOiAVx zx5DptoQbW`i;ZAZJ2pNkLku5&b&n$9O|1K>vrlPf?(1ZhGseiXo>m6#26!MN)qwg@ z!V|Y5%1GRcw_leS%EaI7vCTU^$Qc%mEgfN*;QKPd7Wjx9^oqzze!~OKRneyTRYi?L z5_+|8=7~{~djr#JA^CxK@Egdn{*{p z8MR*~N2y36M{);pwAy>r4r(Ar^eB%a;Z6LToXCfsNNf60APD$d_7to+E^KyD(M%s6x^P3j*9&9GBdq+!(=WIp|2^+?e(z za$_K>xj7>*c!D&IpteBhBy4RD>n#jt#C{{wv)76ktzfm0)mYVG+4)MiwT;fi>4Bgk zZcRI3UZ71~wRs^nIdNWu*;q`ESb`PfV^brsr3X%(q#c_Y2!R?gFjkv1Cs?JUeyg^c zwiF>@EV^c*vgU*q3}ewTtV?qOvh8Ipv1lV&!Y6Q&Ypkntg2t$wpQWX73>lYnDAO%sK}-> z?*lp72MGuEVMva$HB`t^Liq?eB7p>Iq{wQZ_N0;twO#aTMWv-t_wOXZ?*S?hKM%&s8FK?i^)XAyPmH%o z6paOw1yGg_s0zK=qM-C-u{-w8Vt4Gx$L@HQ8_+<`AD0pq{Dne5Ul<@t3H0+--c_fJ(E*iEPT#TvN-qEwONNthy3v| z_Nzuwg)n$E>@`yH8nSGIO1pi{cA%ezROD4Ifr2$JfPz+7fC4{1ktu|cZc&4Rx^M-% zvo{NTp$Ic>i{@wgO|cR{O)dedMQs|WEdT)6#?h=Rf@*;QnPi12K`iZU1jdfxL{k(l zhDAWcZsan=kfa)}#zXnNZC{ zGSMt!BuB}F>0H3VOfN{6_ZA@xL5obfM8h59-&(sh7chO zbzj_o>FW8eC(v>7m@sF+sV7iuqEoQ9K&Qm>l<5OudFqO%3+(AFO&24OHqcxj!P!e- zY%yH`Fd)TG8OMY#b661v0sJfoSISG$t~mUO^{gw^;KI%3C4`|wScWDe$K+pMc$u&N?PV z&0VxrPh62)mvN5R{;r{mM3XU$~(#)29exKiu|p?7`2kty_J+sQbbTA83MAnBKh$S z0*?VeQMJNLtG$%fRF+!d7pwz1Xfh=UUli(kglEL8qzM$m)|N`vvS*OYGH)Wr^NUs< z=Z%-tAlcGnCAE+Nuu!#*Fhr(;;;rK`~uT)$LhUA7$urU>zVDNBTT z`(PUo_@FT-h(YjUp;oZHGz`HCt;NAUr2+NoH%LI4;Hv_OnLS`7l*Vdf_FrN?OtWZs z`-RNcnAoMV3{C6=V_6HsdTU|CXXMKDUcun#q@fUvp{nF7RaJ%YeY~nNh@!s~`iqSI zJS8b)Vkf zQ*^9EQ;jlB(ZxVhbZR0^@!n_(g4O)WX-cFqMlj4CbA#jY%qdJmyA_SWjl%3V=SUHq z6BQPD80koCj<*<^MFcjDMIIGTBqI@*pJ{>Sf5Z^xWa8mNZXwStJ+LvNfq<=K0TusG zld@eN5rZHDw=s+bsSjg8>coO5?1JXwvZY5XNXTNhPi_H)A?Sa>D329b!i(wWyn-dP zf~iN8Phpv4j8&V(2NYnGXRDL~M<6#@d}8#?SQdA)_(Zb!B;E>2Zsmf_n8gRDiw_Sn z79|8}*O#}Pz#l!L_%Zp3`egL6x3-l73%)mmT9JTSmSTLVPsw(v6%rS48evyw!Tv8X zk#a1yvBWxIB|fp%@3?cf3gnu5-hP{au1?Cx0HfcCKf(IwmLIa9N<~l-EM-df)bN{7 zZ11|mcWZ+K5xj{{Z2~e?+4S&ZHbWfhv4LeFGF9pp%lMjU!;Bd5#psDXbrR2j;wtI~ zB9@(p{9B-s$%OSZ<-HkMW(Jl&e4*=F$B+>SDE5nM_e1Q|aIf7$XQ3BN02T0(C}iZ~&yBM>gg{6T* zunYZBX>`ZbM%K7v>XGmNjJt7NU`KaA=5PL!_#+TP11J-drW&8osxd4nl9~GMtmdYU zt%ZV#>)b1kpa{sy#ND56viO^P?ph~6aIWz%PGX73j1|KQ!i;7m)21e|r+GAMNi{}- zS_?5gl5be&L;^DK7B&_n7nV0kUlM_&CQtKBJi1O>f@{0#vL`5rU{Zh66Lw zR>z|X0X`}Z0aKLNuv{kI90#zX%^`?KAYfi;i!Fn3NmNt;i7$*jk(|=*^6obhB9u6=F`z zoVs2Mw%NeovPI))e9~KO)KN|XB=obMEwPu?8UTcvhYfD+K`Ji1WP1k0zTQSYNxSv?gXtYyEBZoUlG_ zA0Y--fH7i#3WVip`lnrEdbS0QzJgz1(Hm`h1FoHVp0X~0VWS6)##BD?yYf$ZYX#e3 z@Uj*Aw4UvrOcXisXj!K$+PmeKcrr#8>7rg`*ObT12ArWxw_EmWtdwukK85D(*+W^- zMY?3w`~f7xvmifyPht&hSMc{)j!8_*0UXGWLLth(A*m@rPYkhC{~g zGR2>6Rs8W2p(6hLb|ROI!oJ-ja@gjj!EF_HggG;kk1 zE)MySIb{5MY(WoY9gYh)mdTO@U9{QfevECG3foUs)x@`CH8q%~_1>Kb2nY;^lDqjq zhW(bbh9+_frCJgy(AcJKw*Ddzc}@(wu`x9=^Emvnv z;x(j-UuHnyIbRekfTG|Nw>aeM?&qiCh8M=XFr|eS5s-b;Y=O5;P-&w#jVPqxJs32g zu{1zR_8Rd6PR=)N49Q<&*-&^CQV|96mtV{IH7s2=g#@C}Hvd3K#TzJdU*8CH34%o# zk?9s$$)pSzfjR7;#xkYqwFsCf5K(_t$}87AFLO%$6Q5Ifq?0;MAauNV1FKt0C59;j z>Kb~gLTl|*3$6L~8rusPIbkP*qM%6N6yiy1z9WPZ5`34PaA)|K{G65Q$J9Q4tlC zFNImVJiNl(kb+AD2YRVKc{hNqT4X6H%y|4+$E2M}rInIA%`*k@Hn6ZItNahaRJ8$* zyi6rvOh+4o#Xyl76Fh}AGtA53Uvq_yCa=Tw`9u!4C!ptf^D4%}(0VWGc4 zZQm3R3kWh*7+7$(h5;{+hoK`FHssO21Q19kTOtCLXatDPrGS{qftWHNl1n>ogO6%c zO!O*IC@c^t)cq+4gWX+QBLpK+i8wc|0(H(^Id!7pdmy?($a&H8B}OF#7i@|U)b{eI zNO4=2ouMOBLolse0y9-|O>@)A=F|3487GU(GI5gL~Sres5 z&OJZ`$jj(^(Q!C9i`~!t^aEJBP zZ5-kM=6`@1b7yX+mnRDCmhBE!9_bvfqch1a9uPsyFdI{b__H;?;SZ(vz8QiPEMQw|n{EE#yMh&!4clW+ z2bF1$Ij0FU)}6d#;13Cp&S0IhWJ|kl^1TPV?m6|NHT2(Fl)9H7*>Z-DX;OV2GF&$1 zC{{2#)6;Kr|z7ga6cMx$i!%OC6czrVzgP9Hk+C0{1osCR8YW+pNBy5Ao+gEi`@MLEQD)F121(~B_3 zJn_mRGh4jVy%-(qHyJr7%P${w5>$ohTO@@Gka_T;LK+*8OhfTJ zbfkMR;nYN{FOiOdgX7FKL_`aMFCL@^4t~c1UhZ#ug?}-a?OVaP+Zi$2Dtcf9@IZZkOPrfgk#Iv$>MBor>h5SqP^8(JwWQ0uy}xy}4+x z?F28xj?~vgdPi{atY@>i4~I>=bHUR-Z5R+^6UR)uDIW^gyxH7mht3~Z^U5*Dc^<8Y zOxW>2%UQF{%KFN@^G03}96D~HT);aqbOs%pQ^`>F_UOzv73h=;;v=avf#MYyF+}EFaOX%O|#U z$H4mrS3n=s4P$AaF3Ru-0P^gcvM@W`OZn#5=^#JH67Je!)6(PPwxlw3Z;E@c?^ z)9Exl?+6^Bn!@|ktC9?^plpwC%a6mz=jBQ5go%;UEevT5s0nwq!ui}7p*|h+XO%TX zP`;V0JAwNA`1hHs=}v|b;QD)c79~!PQzE{F+zmNOiQdyHy12&54hd^F=`AP`C!b|l zDF|y1>DkRGQ3vXY689Db;1F6s=0%C~ff9dxE?zX}LET07utu{$+>FACbb7NbNSdg; zi+VG9XCj1GXNm5FOHz}G?>czfj!h=-aBbJe6x( zwu8KFk9k-&kNBF7TyaeXR~k!5x*0)$K70^A7&-@`!yl7LnZDs+>CZy|JWoUYnt@1! z{YCxs*a*I=vlRu%eArjN)}Q57eB8JZ!lEpC{W;5Ld)jJXxo&ZyWP9W|@zdcAC}93+ zmUJ=DYJ}u#O=n4HhM8Fw>$W_1A&1|lp3Vj53^~cwmk^~GB18m!=2+O->yBp{+ewJAh}D>8a!Ci67AuKiItVvlTs2*%&>6gBf}bJx!JADbYFGU?}ZCPcy1k zwpKq@txIZz^kdLKT%xCtW>cu>DcORaHUq7I zdI;kd^fU_Nke-e}Pe3-Lr^TF}X4jai5YnT zX;$>47`jW*(>%llpVmwl!|^U*Pfy}J%+8#i$SICA&Yw_g3VLe$SvFPTPi1j{L!p0P~`Nvll6ln`TT=ZtByhv6VKJvc^4+C4v3%aD+KR-g$Aofy;X zkdQ#JXG}JHEkI`|3dYnBv8#5k+g%=vLt$OUJEb=V^w5X?c8}-?-R4E z9I%nNw;-M3v<7OJd<^qJDY-FUNj^bX(eUg3N|O;w|}Z9F*~A)9AC0+>t)^nVDFmb*~*o zn8wGjL;UAA|Im);qlNAOy_`c~;7{J1h8m^|Gh~=xZv%f^WWG&{wOfqb#oOF#hXuhC zx4HN5+dZ?C%o8=MQ|UPYsj*L@EyX{`K)!##Y-+e$2K@!bCQerU|3pVR0sv5_*X}X! zrnOQM{QkkLljlo2EY(?C7Dg3g@xgYQHO;-|x1TlLyNP{I~7%qrTYeq>vo+)*Oy(+dVU&jsaAlTC8*bAtKY+?iPbCK0qrs zuDL1g(@?E$A2gAM*OqtD)wGRAzF-{-1r+psh7OP^%DOIHBf4g?}xLz(s(% z`#Zl}*QO7;qfWqJtrLV1uEYP;NM1hW!U=V!Trh}L&&NGsL z-?i>DQKS211V?`{>2BkEM1NFWLxz{$w{UPeS4I#_OR>JJMPP(uD6#TVB~;)Jf@Hk% z8sbvtKuA&yM&7wvF(L_8m(k8~5K*~v2&q6GI!1@M5M{hWFeGhVwLT?zpIR^t(b{akz7+nOU7Bmo&dx41l};M9rKQeNytGtT zXDRwG$lRJ;>MoHdVm`WGW#>g_dJ)38uC_`f=Tq|>r6=$Ua6Aw_@rv1YL_mLiSEI?A z$LOu5Tpbfl?<^;DJdJ&M=KZy3dPknZWH!A$PoPmwbBDvQhNV1Vg@C5zi1l^tdsi5F zyjAPq>~(^d`Uv1` zzoVv_J65x{0{dFET^!qsIASbOq;)r)5smn2?}+}4c*-5bl74@-9m0Yuh$uw=O}Ej* zJ!o%!RBzmm&GU)(@avhCE`+l^UFhxZb1di_Ga5JM-77N+1s1JAlyeXnqm#Gvr(viq z{w=T;NQ7$HLCWd&4;z56)B-%z;!}ZvV=hp&SsM-+eW2g-1Yv_lm;S$PX}pqkvL+WY zXtQKwrg;WJI^vx;VB`c2C4mvf>+_+Y8J>FDH3En}JEghD$Jq3o=YFR?!Jz04Db9G^ z;P;dAcg(?B5ctWfsyP}{tBza(YBz6rmo;bE1cCCvZs;TKHyDOatVCZBdD&c_f=RG# zS1135M{VSdW@hX}QVkK*%&=)ru)3$>y&QZwXCo=Gf>qWK{Y|*yc)~m{9=&R({=%(< zZzdBEax_fDF$=c0()?we-W@Dl(cKxOgEa-#xki^*Vdy_ZhT0yhYC-#9-jjs-VtO+%#~MMt9dL(_!Rntl&+vZI(2L|IA%j0rF@M77c$ls^?_!VDr+Vx5$272K(lv$FZ8h&VMH3Gikk z5n*?k;p(Hv>8>3yuZ@km(5DwuEJTr>k%xMgDa|t(ju}3U-?RdL8ENgL(qUeaj*#Z) z^M)=PLK>XzK9X>`-Xm%B(^>6~n;-j(dvlI$TKxS${bBFujnn8`qVV5$YWp}EQF!s% zH~$F2*w^n*$ zv~bwqU1q>uTxKW`Qcf?U-`ShbFMHjM+OCf{K>k;kWw{kwL)1N};ZsAUPY3|OF1h$k z@tefy5$8s^i1tV_Xt%{1oUWuH7bW1x#Zh!aj0@-@a{!&P0h`{a3&?guz< zsP1suWLy^$Wr>_PvHN#(XoUXpM|_4peiN%xpZ}$Q_ioxM-aV?5i&RC;m-`}BgvY1& zG%WnQ3Kzxx_DHec85aAoO0l1>6hrH&wD#(-*wd9_FI0;C-H~FyH!Sw!m14hGDfa1+ zVqY2-d!|zC#Y(ZiH&X2PhsFMvO0i$66gxdq?6qOBvz1~OD#df2LCGw}!>KFU65Nf0#8A$;&-^*zJK~ zxU+}dUj06OSQ`$|We>Z)eor5EnSLKT?B1o{jl*uAexEz+-mTwrhuyXMede(HI{iL* z*zMQvdK`u+4_(}~@qhuwRX{_?Gks|h)m`&PG2zhAo5ZP)Lsx4Iqr{o<{T3k%^i zx4NDBedSiSOTRDQs*^J#_tLG7YYfq>Z*|w`_xxeUfnxBq_lc#gN@%B1ZC^4S-kq^W zueZZ@;B@=u(cw&Y{|H4~+w5AAixDkU7FNm=4{<*U71i|KS7b-Q6ITIiQ4tP2Nas6I zAMxV!t=iK8XY2m!24~0%6m!6{#>%P;t5s}XLaM$hQA{iM+H5n9_%D_yPk^lCG=DCb zdupA?O_6yXt(_8){$}Tgh}IJ>(AKSna)x1L1fO+S#5L2q(9~kRij{_ zvY;IMSUS97dGCRG^OnD_974HKJuncn0}OkZT>qN^h{#=Sid2A|=fn|$v6W5JWwj2lmASf2WtDK?va z)LxB=9}O^=tQh?S*!Bk4w#w1{QwE(n1|gSF^`11;KKd!{y{D*m(zoubwc_?EuH2@3 z#OP_)A+g9Db&6fd;_SSV!L=OnE%VA2N!&A#Wdc6U8iMJ^4x329FWb@a;X#RDTj8RL zT}2^FoEAyl$X%OfS!ZGDxYyBRbk6~1$NRGyH?>e9uCqI3V)2JjIJ6giPHPIOTE>)I zd`NYY0|AsGFJdUUw?{Nqw_ANV#gU`*LRMzx8*1oyU#(J^g(NT`QRviLDzLy-DY-ND zLY)J2mS)+0HR}0`8s-bVz?}k?>ghD6tq>cF4KX1c_ry9HXaY;+0e8Av=D}oxlzlBm znSE(LDN8LtQ3qyF^Rw9b_cdFkfi3{$TaZRJ>|QyL#lF zB2_DLK4z&r=a*;&?Aw_($f(w4UMG$wTFi64VeRL2K4$>;V*q=Oeudt?NWa44s|Ft6 zLg51chk|m$dlh0c6e4c#LlAq3#8rqSP z^+f^g`4Se!ZOPPwdVl|1t+{_9Nm`m!a@=b0~9@|W|>=l$0_^K+IwlV?6>$qRYrr~KDE z^BGHSNyd_`EGoSNc^UP;0xshjn+LHe|&-{e{nrD98k{25R=1*Jl7xT<-7?oe_ zhOe(%@_e58HB0`hJo82WHP8HtCC}uUU$W#2dFJQ+*F5uiOK#+upS9#K;v``8@N6CI62+^J_N!&gYrGWXUsm<}X_E`8@MW{%fB3 zf+aWd%r98-=kms~bPV#r=im%U*d{u54nMMAbK`n{r zZa^krMEer%RvP;V&NGBBbs*JB=}uuoHV7rVk>!AvGMyH|j}EnGS>(=p(18`a`)Zdx z2YP7{GYR!*V@raE3k`}D9-ors$5N|2v2tivE~X{zoAPHA`E4$g)Nx%D;(}6SgK#?$ zuctHAwGUvtFKu%f9#lyNe>kE+OI}rKl_kZlmf}P{yMi#l31g(Hha=X= zgox!2+^kiy>TFJADU3cn6_uA$ix2)joE+9a8sCjoJM3yv8wxxy7!U{X_?NCF3g?I7 zwkREr7-?6FiAETmWTcW08(~{bN-wcv{dC|adGOToeksHJLt54+9ge6E=G*eaQL_U# z?Knh}OC(+U3t=?wewPY99J;~aW7Lqg49+DN(j%!y49TR^Hr4atX`2YwR{gNje4H=i zv`wq3IBj!6RS-}PB6n`#MECThy@T2&B{gRP{g?&?RWJk-=m$q`rMoifP*LTyO(Q6) zeM^F}(>8UwYL-AycG_m1LW>9lrA^xj$_ccWe?&x;IV~KgIzmv9&@YItl%VKXiJ4PQO(L+Oh%8Nh%<%mUCp+9BzyAs~ z%Z}B~FR_52O^TOmRMy+Jd6Fdb>9kFLq{h&+el*3yX`9BzWjGVSW?-bvM!vo_hc1_{BCY9bpuYcnp++GLD?2bKg4RnFS188NAW z;SM;O@@V1*G--35-F&QRJbcDMWA3rhJ4U=bm%4o4x*K5kf~mlqX? z$Nyzw<1o`x`1^mB3t&X{%4NIj7$SE&A7UapVhxyUo+QLd@f|La=az!2d_Q0NfF94* zK4jePwTb16>W3B9sn8C? zG)Kg#2C+-(6V(W8T)odFk;Zxae>Butn_Y<7ovC(55jRtvDV`cl;)zDWsi+OydG3uOmfjIN{r<*qabR%-fCZ)c<`pIF%=k)AC#ZKe*)}mXjEF|r|X}%eCC$@fbvS}0F zQ2jLCgvDV+-F34y(0RPeK4#667_=^O>eq0Z#{lu-Km2FE6ET_`p;hx)%}g|PjDt-< zG!vYt$z+W~4Q+6|od&dOrOsphj%q$6-8;TXOG)HL)9ZFtb$-%*mabOaNn*zu2T?QQNy#yQ=uogAe zd)ux~jiINU<4Tb62+-g3mYP7etN;yzQ_W`{^k{kfJ4&6{e|1{OYjn4Q>ekh%Gp$QU zcsfA+`U=pW{jF%Amj#`13f(teoz~p*@)09@zi=4x91gU5`c~d+J$U+7?|Z#U?S+}r zyXorG*9CBmGDhU*gOga4m1^6%J;34ETgR?!TZZrKKJ~dIxzoaOG*`~7XfEteo_Wxe zgcts8BwMBwoT<>&?<>0Z#6T>vR3WCHGqdE#&5HTks8KCkK@=^>?|L zySG$OtR^e7f;!X6~)=$8c=EL7%e06Jaaucp1n?i`%K0N--1*rJ@npd9k?F( zzH2Ys)9=Ykx@Ql1W38>~t5i|I#B%_MF^+AUKd%B%yh`kqtAM5>jy0=B!1I8~m@Rk? zC8t-Y>FMhM(Qxh_*R_AV0)5%dLa)zeC<>p>THi|_o(vz(QAW=F{1eMX0@s7l^9B0ndeK@#A*K71=N`zMeY^g))6gm*^$XP z;1gC@MK$v?{#z$xZa8-O={oXM0U91(i6QDKLzIS))-fP|1Ei)?7#NWqMGDzf_ovvf zWrqxN>ZA3O%Fc>dAWd9f+!JcK`iE2{*KerQ|NR>f&e=VZi5R`6`)@@^zqIE%q&rLh zEu~)=e*Z7Ze}0($&q_a=r&H`xsrxJzpwrj6GwenZurK~ATO*8=p7qZ)HFZ|co=`0v z9g2RJ8;~L6=(p|naP)b8Sze-FwVRR89VD_76Ur$vy=;+y>e~T4bk{TO4ssgP4SaSt z^5W}x@jhPML;x+`D17yw-YMVmq2w|BqVhbdUpz}2{1Q^|pyVKre8C1eJ@X*=5nVk& z<7yFb4<#@7#2ePUY!0Wnm(khY_k5l!^NaSKX-{_dNkqq{d&OQ6MD*l#Qm2{zY%gc_ zbLfhnp89+K!QO2)xfA!~wtRA*39KT9ipg{Cpr)~VGQ4fsXjYE+X7Uu@5z_2T(n z&uxAn>jAh)`M7alsY39?1D+q{kep>Y#5(w|o_6kIwc-pmu1qLF;bNpo<~!pu3XKkp zEubN&n{hR0sDtZ!o_Ih#6`uOi@G4NTM{|f54s;>vS($}uJAF-8%n3(Xk8hcl7Jq2^ zym;>v?*t{BL%dwL5>nIlVd7a08M@aPebV2Z2$TV528`kui0bzpq8>Zl|A_|}T&sKp zeMC160TnQekil!Cqf4L!oe+l-t>H7^aBUM~CA=MuJ|~bAjb8$ZD~REo8b%KigR~|f zg=6ZmtKJyO`B9{`M_}P>3W20E!PG5-<|zBM>clL zhQS_Zqa|J!WIqA2c^f1T*?bs0LB@MQ#vbWNOa1(bbmuy-k+_$zhIs~nh$nU@G}C1Z z^@a=V#Ju6Be|4x?tU)n*@(O;I&s)PL7!mo+>m)1Pygtu{e)1chs-*8RD0J%y@dpyq zQ{C|o-C_*@WWvs2GWISmt7;W+QkvO$UG-2GHK?v`N)-DbTXuE%1pKHQI3~Mx-J_mb za`r^HT7Q{w62R3?`^lb_=H1&(LdJ#uD=OX>F?o>nan?FJ|TGZnwdXvTEZkB?yf35J6~+Q?tuMpsO)Y4V%Ym3-8f< zMkg8vBk)55!$1mP*!nuQ=$Gcv7~k9O+h^B}=XWYpfh+SYgKU2Mk0J?aKK8neH}eh<30h9 z`a4MuVI{7jBDus$eDw&Dt!O*f(`7q)cPpI4Rh*1TP&&aB;f~v9kd(DxN>SZgPzxhY!EIHM!-;B)w!uV8&-0NI7d#Lcv@i=f2U3mQUlM*zqr zclYQG11W_9ZAAP7og=boKFdu5%4O40UWXP`h$&;7Mz#%;+XJT=5tCDCURNUfnc-(l zaM%ihK-)O~Jg*Z3T$H*stMh{RMCtR&Aqccxg`j;2+PpneHvd-Wh--D*>g<(d?`WNsq5cIDA@T3Wu9KQWM#lHy|5xmLS7O zjj^?8gslbf%_8M>A(m&gM>Eqx#bd?uF_ILF*DM8xqu-pMX^+Ar_Uwf#9l6L?gDJsI z!hX02!_t^4Xbj(5BLqs>;)7*bEZ4+a7a>ZD!b@GEEq22uckg|pf` zSmHdb;gFfA?UzMiDM;KjSCzO^6S$)Z0(Ykb21ipE!3YfAo0>n?|E=g{XAS@+l_~%| zxUe?Uk4yYC6vS=J0VQ#p_gB6KOIjG?$+j$OyPI@I^)uT9XybvlFoOn;c2`9iYWB{DQQe^;Fu5V9N@h&9> zvk<+_8h`r|Lg-b6V4}uff5$X_uWy(5P$wN7&NP=VvgYr9nzR0Zc!EGVeDVnLHt z-QT?w3&N1KH48Fd*%%9wQd&092@tIiDB6XU+rO(jM9JLB9avDs#b*X=E1Da%5y4em zp_tq8o!)Ne1yD|u2IwG-dK0&dWnHc3o_qVB%}{j%z>yw zCLrNDy)qeTl61uR<(o=JK}Sb4S;bngeN1AMBs*d(2rE!$2eSN~}ve#JX_Mak^kJF51eXQ@Sit#h+YBE9!uvtsp_H&2;+<76Kvz zR9n#j#PchJg_2pF!yf4lT?=J&z`3qDRk5F2puv=0q-{-t8Nx@JnWvs@@Q_ zJ?kt_>Hs+Fx^INO9(Y z5fub5LZku=sxXNeyWoH-o9!imB+_)yys2om7~zdksp*mv;_Au4z%fz!P2WjfV4_8= zcL{Oms^VaxMeI_-$kl_uSf7OsGZnTnkk-FS?qs_6w5UIl4rcF6^cFp3i_QHVHA zr&u`+ico(}#yrz+#$*m4Akz>&m}JR1l}8r|g=ddS*Be0~Oc^G(39#nyZ2PIG7$ahD zgE)?^rYo{#BO+5p^n@W8q*YTDz1+-1vq|Hye63gJC}E!+dw#So#6#`S2RJc5i1|FK zyw&AlE5tB}rnh3a6Kx$8LutC_3XEH*(Vs|6J@=L|CGo#P<8}t>-H?=G3xfh+zAh-j zhkZgAHhg38X(FF;TpyF+aj4l%()9cR^DqpL!yv@p(6l zGaMl$T12Rw437v~7GTMVVlN1V9v2hzpE39(0ksKeE$ch6L_~|+E^{lIL6z$&MA)5I zSIitdiRk%Ih7@j~6YiKFOx4_7NnL8C>3&;PHQi7C3cTjuC}39ywAE7u67#)X9q@YE z1J>;$jBUF?ulUJ4pv}&J-8G!3Cee*3Yq^5Dy--jULMlKb>_HNoEeiJ>BB^`EhR$9?~HjJCed81k5My6Sv ze(BKaVmYxnHWoKCX2mCN#>Xm-ThY1DG1m0gc1dZI0Fa|-&fWHF(%xnrk4-NJm0AOxY0NNY{^>zbb zrnCMEbha>hmSzl!S6r$A??g5{$4-V|P_T2n#4ZOJw_+&1 z26jne+SxrduuKwriCWbc&YspLRClJyl{lQaVP>T^dz(@MdH1Pu?PB2UG0ap7mDg>< z)dfR~mES6XwCxQ6*^GEAJS`U-l=kf2;_dDHb_8tnaYB+!D?f@F5>g+>yj zcZZ|TXoa|da%6l%t6ZZjO2AMS{DLSX+J)M-MSvPjutx&yN-SQeLXKoV1W_=-NODNc z2?XPm*Mjv#;8={JL5GM6>U67AB~qBirZki@9tuE`$;yB*5q}hMU|UxRRk4KaOOQibus;6>nWuWfxKd{2>=lHWdQIN8t?U&zIu(fO(nW2J&#fU``$-($q_)8 zsg8hd^AoL`YE~Hms1P|;RA{TNQKU$K_Y_x-*x(2Nbq@g4==nvejrt{8j49(;2iy$q-(8nk zWobQ~f`N*0(BLRkm*5s+i|mkO6427+GY!Dk76>u5|LPb=aPdMl3v&J1uxY4x{}nI} z%m-Dn^^BuEfoz8WAmm;i06H18AlAv8YYYI-JgyP|=xdh(V2pKMWd_3BH6C&qTzmo# z5f{G<9#T*PJY?d;g@+Uj2`HX{7(+A$^3-Go z60C)u#e$yU{z!N);>KHBXU8yu$Z@rX2-IB0d>MlPIYX=MRT>7zRE0PLGx6B7?;5>##mSVs!4s9M~q_tct&wGgs;nC6xRGW zqu`cd8LrTW5i{cTw7u@-Cu0{s`Zad(HFohec46xK*Vu(@I$N@fAA4);VyiWb2$qVD z&%yNG%F;%IuQ!H@lP#)Js!Guo-T)Oe$FkICIzZcp1WjRoueO2Rqy$nh9vF}3#yzws z=|h5|t|+ge;)ry^&Gfi3(Fn%?sVK2!P$mkXH1<|x3#6N`vT%`N0{W^77rm=y&|nPY zKD>l{$JWoPO4z0pn+qn0SNVnm(PO?5K{_e#C+ehxnIhdR8{u6!9CZ_PuLc~KM~q{L z(5BC;gos#S_6R1}LcoaJ|69rao2f;9CHK`+8ot5A@gmD5+MdFmp@L1R#OQRRKNy6=&;v{42%|c}@?qd$@an6qM7g?Jw z#n@0PJRyOeukkdQ3`bmovd6s@g(>|SPx~5A^Ddk}Sv>6*Ci65-B2GqlTGTb~2`r|} zg?!Y#mNOr9KP~CUqVAb#_`CYMOte}gw83rc(Xrh);E14e8wB|h2p-u{Zv6#vDZ1ZS zT`8u)d#^Ggnk#-cF3vXADOV9f7~3N)@@dqiBm@75H;IUa;Lu|ESj(2YLknRqxDqBs zP%GII5KQp3=x=Os*;E-O)@^)u7iqP zJOqG~gf0&Nww+!I0HmcV0FuSzHX8>3|6RZUce#}S*ut+zq|&7T;3~8#0FuQdYmEbt z@4b{O2U)Bbf=y*H^KR{ht}kOGSY)bj$h#%UVjPa#ixpf-1st1MrU8Ix!Yf9E-+*#e z5YbNenjnU=PlDKGpks_KbU4mrx=>h}Tz#6%!`Z2)1$YY*;Nm*$BR=6k@rs?hp}>9^ z%YwwQg>+dv3Sc~qlv84l_mR8$yV6Lz40sBm1+QzvbkjZWk3*aa+NJcfHx@$sFnA2Kr(2Oe|D2m8w-pON#YFliwoGQ*ps-F#aeiEy)!{ChrHM%AJFL%3HLo`TX1I z!oYD;)Paa2ahQCH@Bwo2N(GDD!@4SlFd^$NSKx98C(sb%3$dO%b&NAKHNyxAt>Gf$ z%c9?v#j7qoqhGUit{R9KRmFp|>ui5=q`$}=29WonZltgA!$rj~EYSg5j+KeC?M3a2 zq5-Nt?nxjn>gN31O5J&}o2^*vtB-y4v9I2)>InI`V?v?bHkG&rQBBcz+k>{~ej_^O zxC@Q`bqJiYMV%A-;*&N~YBe7zNPc9b=v8T?yzDe-q-5-zC_MSO!RS~-65<-Ri(GVq z^>QY!A1Sd(8>xUUXd4=3vl|oyW%WLwkJdfUpkN0;7S&c6QCI>SBOtyX`l=Hju}lNU zb#Rl2&&G@SE_dpc%y)#g>U{T{Ix2B$h>g_`E;+)j!E}g&(VSO+Sak&0Q==K}88%l4 zFZb=Rk;9SN1XNr(CHnAY)Cdkg#+STk3yZFI@3nPg#L6070CgajWD_sCNBC{!$XxKZuCG8FX|HHmUrL_DT;~*k2TV$`L z*DSQUvxLkWmj`2uy5Y(0ZppuhIm~NAVLjbT&UX{p*wR)_<0y)Av_tNh$;3DA5&(?g zZ80Z}>WN!(NHo)Tcj5MSeNp5Re>riNut#yV1psTgUyRn^ESyxU#0!zQNfwb%4a_Tv z`kObL#Ved~PF}UmZS6Xe@i@Yi?zG{?ty5`3i==g-&W)S`g>Hf_?jRp@$;XmE(0a%r zqx0JD-Lo{iC>nj;nvpIDUv_u-g770K<1GMV^u=zYyRwD>#rzAXJ$SZu6b&aK4 zhz(Fh0uKH`H~0=m5ln`DgGp&%(z8x7J>ky2Ppy14RZELnmud-;fNL3C^0TBrpvmK3 ziQTZxUD5jziZvqj=2jr4YIETicPq2X}gd~hm3OB(6?|jyWZ3E!ljtP zLP66Aabe4nhLHEtG3-V*s|#r4%Pot|B`8e0obsZoNRFJ|;27YzBuz87Oir6gW65j< zDdmz;4ufv6DPTa;ktPV*OJroAEO=0uZVTOeF%!(mDiSk+914PHKtQb_bp`1T-?TEkL5DH(2RuT9ZgMLv?i*b^BR!FcNS0f0 z+-o;U0uz$d1WN)Ztsc)fFQbMmls3dSAz&?tK%-pJr(yS;P$#8hDqWD$q3+dCc~pp7 z&@)!eQb_<%+KAt8%&@dcaiw%EZ%Ius*#wqO2C@2=)Y?*dz*HRcIbCpD=%*bit)OOq zayKjXwAm8!!H_g)Lm})r$|)y3Il-Me8LNlRqHNtjChBMD;gCMCi+okZu5cUOlSU=n zf?8ej$2Bj$P6Um%)|Yx>28^)mA^F)bh3k6!VhMiy`h_V02yE%}OD115nATh<@`kOi z`f&e@+EbCbD2gY^CoPBBB&swj6;%LN8wH=XXfmuLjavRmjam_FiXwH9FGd32Xp2Un zVrWKqwU=eZx&bM05=fzTdOt5jF~Srex{B2!*QG1U92b(5!$D;Fm~4K}=O)Ois?ufv zF};&(n!9Sp^hFiCpO?m8`u!ZPSVVVg;7)r}JnqPY*H-!JL9~Fl*c`iwMupAB44; zVA_xL`^GXf-$lMOGI>MQMV5k)F=OYIZBu32(kWFVmOWx}Ce0Nq*ts(yU9|-Kzs~X0 z^BnuLkH*|f7_3>k`IMW!F){U~bsG|`J!^)J)64z$3NG&aTG^lM>%Twcr-#_VJ5GaI z=Ijmfewf38n!2YI+|&Ja?2sE3A3johma5K>EnlzZ?ytXlnZ>aDDZGm zU?VO{e7lw4TC-sjkA|QTi6WE&&_?1C6J%=*7l>)r|$`N`aS)<{6zOykVOg;u5(%yx3#?sdmIbe)X8-3Np4&r zuIKI*qH3pBGLARWX;=5~^w~S!jDPTsPyN87kDWeqej|P)JIY0bRQDRC!{h5*)~3DF zG1YFKpG)I^SpPoDQ32y#~^c=ay zK%7MrQGfQ8zAX*E9og*L`?>HQZS){C*1th?7o2%`?wF~kn4j%zPFMA0%ka}~Hrt;u z5_1&4pEB%|qxM8F(9X*shZ~W*5ObGJR;6>MsPfS9}?1hoT#^uEn=Q_hLacO(g zeaEuxI)9C|0x{xQy`E2bvr})l&48o>Gzxliea7y1v{A9xYHA$ z2{)WSS`55=+$gQF?7$tPcsq#;-U_lM2SirMOI#%=S)gvUzr0<~YSd;ZWS+dlVJ-6G zbq^)4C@&Cl6X`YX0s)vENsrXDuG>iyrWaRL`cAyC+y^{paXE|qWXb1@I>_ajnuK9C z(OV`J)6MtYTIO-*{$x5o=km-3=Um=v2P>jB^tUN5P1p&7&o3hgsO-*uhYnjUp#eyP zY58j}>8O?i%-aTk225I5N@vis>3mPd+~A9@MAwadFV78hjhph=DJ?r(OmnDLW{hdN zfB!N9;|}T762&;(z+c#g@Rytv^XQ~IQr!nmjV+YoLAIO3K=U?>Xi>{^wnz2vPVI+z zJP^}jZQTYF*OwUDP@Dv!U|&unm=ZT@h<_tEszd+w3mlce^gj@x67xr0im9CI9<4jP zRd>LSSZumYm8#^h2!skh(1D!G8J#JY0+;TWDYc_g3P(t2D6;e1mNVJM1utLn#*o9) z-Q&eVW7vCXZBMnBTKiRs87>MK3CK7QA@B&sGgj=nP)yscX%sSaFH!8eN^4dObgI~S zE7q?T(+Lv4MzMaS7^-d2+C?jNZ79ZqOirPgTKjd1d2$kQv+_sj zwP`=SF5LqG?0_tG4Z?qS5+1-^SSX48>yp(V_(9G(zs?giuymQtwtR8l=(3*%&n$}) z35k%0k>6*-v^XE8#f2T%BYFSQj{a`_KDVRa;Q)>v%gsKUqMDB3DjOQN<;~*%)L9W@ zLy9ZFk$|v#Lj5pH-HB|Ee}fH(&mn;U%|63>!y9>siqEz18CD!VPnSQVhg)elbND<{ z{)~CSKEtTPXHFU%Rt`6_&+zR4tSrz4D(58xJdbS+ppBkz>Z^W-wp%)mW* z*xOM_xTg-A={1Wv`IS-Yq|D9K5};Aq+I2qeoYGH8X6E;77>wsM7zf~x=$Kl^``gA) zZy_``?m5EiWgKfk^J$M%OlHS?+GEj9W3>VDXw!n`zk58@9qYAy_lV&@<&f6lh4{PF zUHh)!K&4r=Ev*4pnswXK8eyebxh<_BRhs3*($gW$>TPKan!dAsTUw)}G%L8J=io=% zz@{wPjX>0+!?59pfyO>kG!T1_wP5VT@f?j`>S$C8Avx4`Y5^N+UdQw^7S)=_QnxF8U?v)e5n#Nb}? zk9%m4=$|Qi={DZ1As(!PaBQ4?!SUKM%jy&H8vVtH zQ8Ra1>DMQeeq%yu%*uPLWY%|!52d=?ejD}B%;G}>gNW6FE78~84{hu|4n{QXSneO< zUD^-7yEJP1xqx~;Htl>@+F|sig4k1ALm#u0AQXs#GQQfoR*?@m;%i_3cwi&0juEyf zKbBI}jlkR-!F}seCVVpan0djQH^fhF7jLQLLZirY9Y=}q6pGAv0t=)OxkwyKB&?Ps zrcbCF+b`tOI1bD5`O!Xgstg%$D1`i$#ElU0M=r)UK;yNCj!Ck8NNkQP$!(@dPDOOK zXW&L2-v#+%P!&K0Ws7aJMAqB%X9rA%1|Jhm0}XVmx4T$ihwr5d>_{7d*6ZmGNSmAu z+AiLS+~59p)pS7fTC-C0>ch-V$(_5L5UA9XT5&<}G?sb?w+6W`jkV)`h%xQNA<7t+RgYj=kBL}zD`;Ye z`-7fk%9MYP{&0lI!FU!a7W-^{tQ3AH&;t{OwFMGH|HGb-|NWwbiv-b@AsR3ahT&zAmWF>e?}^ zi?vIHx?~7Sx3ShJxJR$%JbviEydg)<;L6bz96z;Bje_gym`km%H=+vxI1o zq5r$B|1IBt#9!;bJ_lUx@)OP$ugSQy1&cp9F1Pu*)M2fa#*qBD;KAVN3b)M=CsLEp zv@B<|X&BlBP)8C#oRBtKEYw>3G2q$apRB5j1oGk;Cad&a5%iv#2@g;2fW-IE#O`C+ zeqqUmM)rJfiI6XK*)qfg3n|xoJh_{kOaob;47363k>XRx28K^Wg5Abz4QJWcBY+_- zTq`ps5<-sh*m`|!kPwj628@dr5&{p+>iuhJqb|&6?^7*>pHvkE)|y>w73KcbIK7sN zmVHGL#kKmwmA^g+CWyCs#OEDLg71CWtwD6rkf-GM-IvK}vdTl`Pwb1*yrIeGQd zJ>}9x(_U;=H$+}%Lup2~Uk4A@s{j3>;hdm7N3ItAjfF4|Qf`0oMT6{}H*BQ~x~`Uf zIWJAg{f6|hM*SonqCE!QA71p0#wz4zY|+nr&NfPORyXZ5D0g~MOGxwoZ|_{-?5e8! zf6lpgX6~Ikk2{msWG29wOA->234uT!@|qJuLO?KBB53P_MB;W6iMU# z&`XOA4IN(9y#KEbvs4`&E~9s}$yPJ29@bAm${5;=%PX&6XroI;^RPC%6!x0zs=I@2 zG%N8xBD)W@*JSt6_5s=bN&El0?5-VFlieGJ4an||!v;=mC^VOVRKSE4!12&Jw7@pY|20r^;3}0j43`)TnH7);qv| zGflW*gwq5^-5@!T$Bi-kzJ19l)dV7LtLA%`d7U2IAAkSozP{(Pr(^i<_61M$z9dvDQu z3-20Z=li1Gi@X=zJL{5<@Y{LU5=h{ji^UJ`9K4`+c0}>RJJY{LZL_pRWO zx1^+$0c{cJ@bDBsysfWB1**wpb^Xjy40%? zmAc-qNPlAQ`K2g*pc932pi%D5g67r&Y zz+PM(h+Z-|L?N{Y+O0QY>5;Pv)G2SsVC#BQ;o8DfR7;!M(k5L- zgu}X-onj8fmJMlJpN@SAdPAQHA7`x8`5qD0xyc>P>!>uOlRH2RifM>b8KHIch(hZT zG=~EwCVS|5+N6-y!KWYFI!jP9Gh`o&rJ9@~yhtZ$1XELnsh3OV9H!v)Vrp`jwrTyY zLzQ`*s8B&BkXSgXVQh~98ueXR_d$V5md(L*=FzPW$UJ&&v*56lt>eN{$oGz|C9!o} z4QGHDba*%}W-HQIMGMi=Ws|D7nyZMy6c~Vsv+|?WpG>&6g zM|YjW6m!=w)zx6CQo{}@R7rBGOX$~Jp7CN_B<{wjV(z|HRO5`Fz9WZ0IED=%l+oh> zoTBd4bx6!@YQb3@a zT;yaa;bsT51&2WIb+5J}kxN_|oF>T|;-!PE?D8Tip(iWs{h4pex*P#pJEA-(vJi5l z%J9gr2ZFkLSZ_u#v1?nkhD|HptpWAWD8-7)i@aG|JWAP@mEu#q7PT~hRuhB6G!WuB za1G_MvV$IwkNg2JfoltBBsm)Pnnl+{zlBj8%tusB^b)4NgM&(X4od4Qh6X8A4KWAJ zq|i(X%{Xe+MH8L-AoBk=eWoZ{CU2_JAvsElC^RBouZ!6Z(KWza#>3_-7rN#MEwTv1 zN#truID`F79bs#6hKha?*ixL%lGG^BITT&Cr>v=1;(3H_QEm#y>YnIEJ=pWss%I-W zcyxe_I4$5N`TM6p4$CyPwPKRcLkf&c@eM!}V^^~3vFZD*Q=A@k#d*1EF#U(@i+%+f z{Rc{jGt9JckX(Ti(Y~3{4DZdNj&WVi#b9eO_b(yxlD{6;__n594Pd?35pfu7}*MHuk@<$np#YAg3HkhVr=4a zcDtF9OO9>Hnd;k3?=l<6z3X3L%^0_oqhvNNy+zV-H(T=1J(uo+ORVmj+?{9#X*R%? zRpps{u}z6)k?-iyd}OqamHo^Zd8L2_r5F)Eq(R0?eVhAKO>ZV{-RR`b_BbfIgY86Y ze_-MGLmn4uhF+^^qPfC9)=+t|n`UjKp(T^`e70L2&6_f!Z1xmvo|TC=BWLp4C>D48_X^7;>^d^@atR$Cr^mKD%mdkI-ZXJyvL#g~}1ToEDfS{FtZ6LP%1!0ip z4@TJy$pj2WUc%y$r2I4ZNg3DHmz6IgUq(K7pdWm`eD-6cdC79^{XA*fMs=(A+F_T~3O(8bTCxXI zWyanJ+6N~J-}h53_)nA?J(4K9Pbt-k=MVRrzza)+=(VXAjS5DY>_kR3r{3gte^>5HU3pLq$xD z#844sB&?l_nz?2jqkuzOGti=Z`;S;l=m8_v5_-Uhdl8DI+<*G29mtXI1^^Bav6j#S zVyq?ffD!j16iW@EOn_<T#Bi0gnz=*Ykx`-Z0<49V^vEg+|X9{;G z<1|NlUhTkYD(x zz|YgRr`gSHxax~;8$Dxg#0L2|;tI1Iu(C(>UANkxkY%GJUWvOaw8Sm$7?c9-f-Gfp zQ2-?*KL0^`{!18Pjv5t|b2{0;q+3puSC0N=&4kv?30jRnd_@p|+Yt@mK7cm*6`)+g z9;hf-?b2#uZiHd|n$QesaGflXN_-N7R+qT6M0FDnszp#SWvRhy@?qbuE(MCfXrdx8 zdr$X9^O?+j1u=}T9L&>fp?0G>GW^2kz;CQ}l5F%b1NV%xHa?kh)<)vR;DiCjTpL^R znJsb9v z#hRpIIzPlT%~+N)&~(!8Rw68;(N146)?-U3d1c_&bxlhJQz4TO)F?k_ajbc~TDw4m zE0l91oW|8qm#CU$#>ICk8o+ecFpyT719VU5^G?gMRYod2kV@C+m9fhN120_!Tc4x6 z7^j#u5_LRamlQ9|#IOV`nkbBWDY|_W6z&ZCoR#ASxCC$NT{*6!IwqYLW+e<37#D0s6x|r{3U0Yrx{Ro{@Rtm1v4li|cD!^*q;y-W zys`pX@3@ol${48oq{J!sh&;t0R5w*T(=^8lr;u8VC6$VcT5M!!CRY{BGHC#jPpL^X zur}KmB|x>=RyJdKXvPw;p=@z6N`z&+WtoaoQtf1mg;}zbnb9aG3n`ryc;lxD5fYv5 zX+LVBbgOk1mZ;?66c2rlg{Du%#ozdT-Bl{A878i+1k0kS@Va7Y1=*v-z?7I%vR)8i zY^o}fDZY@aF41yoS1yfm#OJ8XIaNfMHAWXsQPS8L;&N-5s&ZMi4mnQ^mx)FiVfvM5 zWNawxQB&^Ci15AgZ;zm`(J~y{8mAqeD{NY@Y)WEgDJYqgtl(u>ED`IvogsZEpj!ri_`K1@7TmD`W-T&Rwc0C^k-}ods&?%iMbyFkYBmQ%DZHEy>aX&zj5f_; zzFm{)n`UufUQira$}k-tZJq@$%4J)>k?EDLvXUvPl&OaFJHLw@lsN*_eowP;N6J4( zkI*h5P!a8Se-VRM8!_{0B5KVs-CXFm)pF6jNv1p&wBI`*WB2VlV^>?ou8uQi)RX&t zWQ>SpZ2u9{j13hr&Den=4$jz?Bx761R5lUTR?Cy!=@XITSY8ojt`Etw6t+8tB?P)7Vx#*L`tFCmVnW{oMxRz4Gb&J} z?Ez!qX}AP3PGG^Fd4&44G_`%(2_1c z8a@C<9pgoTgC!pjsr4;tuQNJrVVioe8>&Vq(kfX=+R@8BR2Twy(eLn5`^)=0UKueh zI-a$7I6rZ$xb>L#H+dF7I zLDyb){kl!twp`81A>q1XP>`B#byvA#)G}kes5~oTZIKuBa>WTN_Q-MZ7#-Q+f?;5U z&JGH~H1Z8CXpVL%9$oUXz0xSIeUiqkpvLVEB$_}A?ylmOe}TQ|nxLL7X!+*oXQqBmkpk0%vsfLd6+|mM)X&&r zW8`ZIUU`!;TL~L3#1BDp1?(AZ8&N2 zRbeD97?q&GX!uoOw7v!76jg(<%&!Wg2`U(EeuL4Pt-_idjN@|*MysI;V>OJvqm67Z z)_7K7MF-E1np;jxL1+9&!3ThEcpDka36q1cM zrs;J0x;=`3$xFL&LIZ{gb{UBn7R0bp6{Zd%$!b%p`)+I%rgpx;>SNgWD$I)oWO)+e86{hPIEWMT(Hl+&FUNnOhW7yOxjP|mFwa2idsxXa> z*muKY*wIy3V*(o)!=_hZ+L>;9Rsmi%lr}C||V*^?O+a8sV}C6r5U%fP5%93@;^V)mQ`v zQ|V8wMQRZoOr<}CS*~Rf989G@g{2n3!BqNFSZWa*Or<}Cr53@#RQgj`Y7rbvr9XvX z5wwp9F(f4>JGjKq6-dgAcBz#Zm2t&`0#w38YNK_G&y^92U}XeYdljZKVlXQsz=l_0 zDkBE7G6HO56{a#`FzC1RI;t?05rbJ7;k(W%Ol8DiRz`s7w0pDWIzKsvSs4L#a22L9 z!mb7J1b`J3o&yX)46}j)Y=9w%VOCIp4KM^T%nAyy0fr!kSwR6dz!1bRD=5GQ7=jpP z1qIjuLlDEPpa2_S2s3p@5F#o46CsQbRQgZ#>TK3YhaqM@5aZl8f&1w zw=s1>46CsQRx0$};W4bn8qkn+-%XBTHP*mNjJ}%^!)mMnMY$%EQ{xD|RZ*vzJSv9G zuENqx9v#ExRAFf*r^m3lRalzInKA5?DlE<9n_}3hRalzI<6_vGtFSbaC&aKbsxXaZ zIlJ~ywrbbjXz2{HYq`O8EwyT|vL!Ic%At`MK#7CrAS-9Eq$M!O${8$a2@JAw1~V%M z&OuhrU`b10kd-r7(h?YC|q&1~2$Y9{kX;hXbc;S`?f3)sgr2Xuc zZ!lPu<%C9cRkfOnOC9aWw$q@ysNJU-t~271WmmcOqITQ$!#V&lrzq`uXq=vh4vFUB zv4fI_Pp#`K3OznWY0@LxJz5W)kj%qpBWAtc*g2#(+OYb7H9rdEI1U94(<9&tm72P% zRdpAmb>J->6xMbEJT?=m&JSerNiQi{ONBbaaU6j0QFapuGen>ZO4?!)S178a{1Brb zga;*|VP+{|@SgK6lduwtjuO9y@$}U&#Yok}eU(=j+k+kc68TH~8tKzl82o@w;~4I% zE`{mV5u-|{jU;|oHDmELkpXf}OIBRnG_s$#>ctQZwF<(~X*7nm6Te0$g{@W53W~-d z;W4(R+GxsUMttx|k7&C3#3f4qF!8%=)e=Ze$k28IXY#5huG-=;fsKkbDvh=e0Caur?1{5ZF{8fGQa{`X3j~=4e z%NZVxlo}p6iXe}AN*j-CH!@R?7(T20OXo}dp~#Denp9$RvjhmWrc;t+w9UMzsg+R4 z-^!>YERQi<9;w`tQmaY*(o&I8+)zJ^Q4w}Zmxf$4NMm%;V5dzwPn|W74=_zgMIa_9 zn46787>MqFO@1iX$`7(ve#p1-W0?$GCOtCQ5HS?o?USQwzF@D*RIhgNp&!su_H~uH z%Y!^R!;lSKz0yT_$~G<_-xh|H$yZaHuV&>-Kje$BQ*1<8R&sE@(mo0q;xGWqP=juF zqI2>~MlmGGE%kk+79^R7Py-inma$chWRgdYO!BBFlRUD>jz`U)MvLphAU3u!_LT|} z9HpAEGZP#g0a-i=(>&Z3=R9Ua%vLJXX$ETrXBm{>0%4C4TLLjwSdk!$v6>c`i8ZW+ zm~BmBn|@#$VNwTdt-~r-JM1x5Gg*$Z7%LO1E*&O6p!EP)VVT3K!5iVQ?wmsw)5^t! z39=X~Q;G-1+LT~5djwXq3BsC9IKZ{94l8E^I}cUifw3|i<7m}@ks~qY09*JIWHDAw zTXG?}p|CPoy#XYkYx5-~9CnUH}NpN2{6mBe`;T~SaeRM7EriAXv z3GO#1xG|as<_R^O;VxEjPp!pWOmI(4a4$%3FCPlGPDGI`o2s}c*W%{pX2<5E6WnJd zxK|B@n-K)VovY%WP>Y*JtHV7r!F^7G`?8^MYsazZ&Q@`ct;Ibi!F^nU`%eit&rXl|ef(*9a|H0;? zSPxHdk4 z4TW1nNbz*14dUAJ`a;~$YjLDT%fyH1DCLYDuJbOw%S_~$oEj=JI;sasOZAFJkCh{Pip?6pjMf`KqYrw! z)kR~?pQZyD*T0x6ZqUapv(J2~B`ec|=jkNsyrWaJHgH$`avW<{{)JPmmamu|l$q3F zB?_xF!8$#-o{Z>ulb+mQeM9_Q%X9YCT*q6S5v)@fA1&ozpV+&cLn>o0mrvh;SG?S) zAky6wgZ@O9TW{72&wCY#Wk+lDY~s>ug-bSkuvLDZ_vuMWS4YW!_N@JvScQertZ zV91C&yuTi)Xw}X$bj=-NnH&P1)}pq?`P@)rY~nR9PK*(Tx@Kk1MS?cN0-c6MLtK7A zqKdXn%4#3DO={dEIVP$z z#GLdiWpHYsyuz;^`lUK0n!+d$V+1p9KL9s%6#!t8Z=371h>Ub7icoV!hWi}BFa|a| zFH2&HYdZwAk)A%kmydL+H{L9REah^Jf;rsL@TjO#SayZ%fj9e4DTG@n2#-ro;OWzT zD#=Jej|VJzFJ?@>gJoC`&I8C0i-XCp$`Ff(3^OWa?A}oEP_A5-f9QADY2_IY5+wsa zM91PX@i>YtZKD9cOFsAh9Pe8=2uwJdS%+X|xIu@TF@Q^8$H^23-Z?Ctc^@%V3~G>_ z)AW(loB#}*HaqOP@`WO`j;PkzI?mca7^i6*Dg&Eoj! z!S*g*Ti{aUoeFbX!ZxLl=sbh2QA2c#4hP&ADki?b7|J+;xttXmDg@+6j$=249Boinu@vCs4Ynbsl*3s zi)9gG!0OyM5wS6de);+{RZS(%Qnnsl(@En9(A5g}vnm>W``Uvj=fVw+DX{DQ7q8sdB(^Rfz|4QFDZ#t8o)*NnC4h zC3F>_dL6Eq=ri*WFgDg_ne3eDsZRgXaBFQ&*0!>i7bKwoaW*tjrPBeaFPYm#qxo9v z#N(q78zNRYTgqXx#Q?10#i5flFezqTVw5JORN6s42I>gcSC&*mwDk$LK(!}_Q>ub~ zJd?02V)R?dh1rdzVYhSda=7;PV*YjNRn-cKfAg@c5xX+9%9iTYUJ(o&Dp*bYDzg*U zK~IB4CP>Ahu{auwAFBCK$0>(;WjdwU;}yEaT5n>o)t_Np#`^$XCh8+Av0h=F@B3OG zpmH4L_&N}Co2cM2ls&88G1qAo7l?^X3P|cVym9@8FRtG(oa)N(Q&Ye3A)P4&T069+ zdLuy&yrp9ERl9jz-Q+D($aok)5$8;-kDz^-+2Z8TFOGl>#SyG;*ed#?TayDBZ;cOR z-1~^eXk!v*V;o0_J20Y=A8pDOr*MoZ{s0!hG^#&=i!845)pUNwcP!h=Q_UGO{KHFu zh+=PTKuvb9fhGhrfwsVO;@_*yE8IjtGToE|nCu!&YQl5#XSqoIxGh83DNH95G|1Gn zcVyUEsEQ^62({(cO87ZLO*;x~1q5FGM8X58`Y76F$6Ts-dWBO>z$s=$bCFacS)^Y) zOleU21;xW6Zyr<5(t&w20Q*%XS|Des3)O7#nzh!_42RG)4Csiswd+Zv-}dwP2|+Zg z`MR5CVNf_}KO{p*d_1ZMVEd0dD^<-<-Zr{7w|}F+!j^2|uQP7F6cfJc7{vs!1q#Z> zFnZ1-WH!mzcl315b~fM4>5lf}sPE~tNIZ1$)NWz1*>uh3&;@b((RigZMZY!Po;E$8 zOR7)QP2v-EoQM`MY4vJPs<3DA3KxdG~Gk1gdtEUHNA>qIsCvO5E%W5@H z&Y+2VboFOH8#nhBf)BO{}r2qhMV_lnRbT5|Hvx8o9$D(F19~aBCDQ&9&{+>2&{}9y=zDv&RMP)?b-YR1Y*6zwO;32A8SndS&Y_VO+eM2j%%WIu`UCXrw^}N=* z*D?(T^$8o?>$-Lpw(**?*9pPqDMjv@oe(@aOiyLzQC6Ahxp|6vZg1mxJxxpQ4?bqB{lefII$j$_9l_DrvV+kYj?Xnl(YtJmy(oHE6J=L5O1V9bqD?b3 zQGSlJOa=IAMHkU@8UB_#AWpBWaw?pjJ8?W)U~(6s!zP^X~;&cs)QvcCiu2^Yf71J zb&mY#>X*5%D;I6?+)!zb6()CG*Ih4M)}xX3GgN<9so^?`&=y9<`|g5YTIt``mgTj6 zh4|$}&+k>&uK9Xl7Gq*x?8vlVNTj^la~s)V}5hkI%KS zu-Cu22U!t$KbEPMZgm6Wvt}FV|uxLAPT`EH7bKu)_>p8k zGgMDekNax7rSIxTD`t0N#98h%<-Ak6EFpS@2XQZoK29)iif-xltI-PGO%O1ZxufVI z#>X1l|>)@bKH-1`~(X3>KWMz_@F zhhm*ImJ#OUU%5Up<~Fqa)_I@&hLTV{N*jc#D>ajlSJY9UJFMU22rH|O;8JJXteAu>8_XX9S{|AnaEo`JehGVa(lA1xN_l$ zE^xJ5kBA0V$aR9jrC~dI3N~wk6p*k<0?JQE2z;$LRK(qxsFAdlN-1x{)-aL=J-rV` zNgAR??yM5e#VI)9_|nzK^OxRSh0R-`{R5~#j4;ag!Nw>X-KybB)G*}G7}n_C&kYLs zD1R|?vKq*F=#W0tTuJAdpv`mbPd;iurAS?gDqL+2#scVb6inqrVtd#gHY_W#0YP7! ztN~IDp4QK0lpVp0z(Pc+<9UjTdd%^yq$+M9{%+fe zNpVR$+fO8it#iBLa9+h5`WA#K1L%eBs2UDyhY59$I!YZkv;D!pSsnaF$j(EsMC*qg z>qGxsA~Z6hbl$vJHeo6rcRfSDml=aN1 z1ik;%6{SX&P;$RkbX9a^h@WXqEx*eFV5;SPR;%XWg-nD5+(HG4S};w4^0q{c%bPtT zhHc^$2u83`(xs*Ra-zWp6*&#!rP{~3(7Nc|E23|Eb5TOA4{ah-+~*1R>8oHFbo8S# z+C=eaGSg>~(00a5_ZP3g=xd(L?Z#R)M0@nBvCRHbeb=dI6lqWpO0>x#vIYK#2Ik(4 z3iu!+*ATY!o!V?xoe-#S#kWS!WtF*b8Y!|4nNtN0f)~Oz3skdlZDXNqDjSiE#>$P>`RO&g2 zsa(!d@lnO`A13)xy$AYSKPI9+%J;)RS)*LoOnWxporCV2%z0yRjER>iA?ZpzbyIQ4 z>COJ2e7SHbuk?tc!Blpr%iiQMD=+CHHJDxBN0qESNf`WQY?v%seb}x!6)$>;f)7|4 zD{)XcSuzP32wZ7Xj`o|jOQs1kk2|FcWIX#wAx;t_$a!l~{#0d}$~Gf2({xYU|TXa4Y`gh8xs6~94hDo-~Tmtc7 zu3sprjqY*HD$kqRO9KveXp{<5D}ABZqx*y<%{9+E56#M8EqE~BMmFoBDcVw1$I(&U z4KN^1+hUrPayANOXu~LSXC2lg%(zhqNvhsjtF|~KPLx_DAPNdVO2HDbHHDA^Sq*0# zSa5~1Nk!sTu^ER@g_Vmhb1@7J?u)!wec+}A@4q3fX7na)-w*SJ+p5Q(1gvgYGb?&j za}o5Ts16yl({Q`aj)6td<3-hgn%ZWOfER7kE1f91uHK51BTtj=3|eSPIa)hQ>nb3L zcO(=5;`d5 zI_Dm9pG+oGKO3dj8%!LJqh(b{>Af+D&{oI5TPa*or7CrE>{(CNa$6G#l_QD01`~|7x3TqmEdD+yruUv82y5;M>*n8!j ztEbF;_uVIde8IxEp7N>p&U{njhM#=3t$E!I^BTu*c;tpsXMbngXD5GiMB`nTcP#j3 z=LwU07v4E##;~>PyZ?FKiNkaK{SP(ee|F}C!h61S)51+Sa$=}{|%0FCi z&8II3Pg^j1@$KiIdcuTf%M*{uf8m9XcINsnd`nZ;k1J=lHJm!B^TzqN9XaaL(fEtj zPdoaMmF2VN%$wXlt@SITj+of8>`V8IX#2<6J);+Y>#L*MN1k)epZ)paQ+l>OIO*Jb zE?qeO&@Uc;*fIB?-8o{?GaF`>rd`;-_@H;5-Zwq$oaUc7>5#+5EZp#>zkSDfy`_<> z{&`es(rxqSj9xObcf;7H`b)z`EM9Y8@y%D9(0<0d7tT6r>a=exI`nV;^^&(wx#YN; z4%ztF(<9n1S-#@*gb&e zj(L0ef)$H;PJ7GykC;|IbAvytt#01pS;tH~a^;AiadG9gQT5}yn=hX=ztdkhvGJsj zoWATGNAxc`sMxr$yl89ZtoFvmiytWspLFT)*0G;0&+$7ya>&>XUAK*&{BI|n{ieTr z>&nh!zj)%Y@7R3oZSS0a^MnZ_R(<^8(qVVcnliGZ>`!kScSLLPp3;*?_S`e2t^1z( z^IF4uqHzAoG38O^2Pb6mE2nK~uYdCFaru?Up58m+hzn;-{z-oNG1vU8_Z@Q|oG@`z z=d9_omfu@9ar|wM99-)B;JQ_f;dQ5lP1Cki)=!#t*sx=s=iOp! za_C8m7tZ*~!kHsRU2^P$J>#~_7(e%l`HTJ1d5e#qH?DNdAunz@`M7!G=f7{vPsh#a zDVO{s3NLLqp>5dQ8yC(vVeV+rXJXjbRt6K*}~kPqMd!O@5QWZHWtUwiHQ52^p_w@v8% z&`sNV?kSJ#Y`gaPn_K*c|EQ^X`j*O^BgXU;NBnW`PaFJi%^Y#qr;hu`sKt*g>|D68 zTn=yC&|YXb@rDiA?C%flYP|7t8=5-HUt4hK`I{G9IlX7$l}DVtY1+i$;iA*Zf4cg{ zRpo^^9~(a6v&)Ay9skYp)NF?reZIA@AgE;b)aROZH}2fAtL2sA_LsdNTVL6; zd)F?W9v)9Ib_Y54*4VUb=Z;r4-!j^Bf9jqjP9Z*{(Z#}wB&eRC0M~%a;Bq*{&+Ean zk!QfOz_Y-!iD!mqGfy=Id3aY4sg9@b6}=Xot+*nHiagtJ?YLnK{4aqE+79b1z!T+p0^#bC)i?M4B?33Nhy5aMXN3h&n5MXmoHsJ z9#eW#HuWzeyNi~cALl;}ckEkv`Lgr*`hrFKV%T|?T(UI0V3EN6WXC(n@q6JG zR9y6b770|#|AYYsyWrea=Xz&EXL$3^nCqRr=)BXz1^t&S5!>IkU}iWcM!x#UDKn=W zIV25J2c#o8@00aY!ZR)j&%1opqLr|8@ha$>;!Rj~>C&YW(XlK}dMKTiK1-LS$I@Xr z>9F)yx|`}Le(7jcPd#rq?{XtzHiBMNCT-%BHV1;NjSClPR7l}&BL97n~ysccN*@^u{)jT8MwFL7U0gry%qOI zxU+Bzac{$&jXMYTcHAH1-idoR?mf8ka2Mbf;TGdA#4W)s#Vx}v$Mxe@;a21R5AF)w zmAEqQ8r&M(b-1;-kKnGyeH`}*+)cQ@z}<}dG%kzVpZpIbduN}jGEZck$oaL(_|?ew zwaQj0UAWKV{vP*b+*fhmzGvu4$rp6Dxc$AdTjM?M?{{hFvwJlDV}Dg}rSkhU^f$Xx@19EP zt!z)dJ8MD{R6MJnk$1$%i}e#8J|i$rlHB{!oi8E+_g0m~b5-w7sb`Eh^+0YCHXzMvU=6$)SQ~fWp|vsolldZPQXy`yiUmDQkX3f3zL%rdbm=->z}v1^4!nN`}ZIG^`0l5t=vrL z8P|RHXF2bFE`ogZ~9NuxO zw!Zi@yd#SLz@ExWF2cX8-%5u6B{=@{^?y$_;Zf9@u5%N{=_Yn zC(HgPU#L8>&B(d;qtEXC>Eo4u0@<18|NU<_eeIR+67FC9%$h9+o`3oGcYNpD zmG2T^)E|HLw|D--%imXo`+r|~)+KrI7hb6R@+Cty`I_(SesGI<{WZVY`PjpizvZ)c zt$k|ePrhcMBQN;eOJDhnrRIO>mC7@}0$eU%@$nZbKY!M|ho1iTJHPRR%7eW4pN7A` zw9hX8=&veI{oK4g=ij&Un?J5>Qv`o!B;{*HM-&-SQ(RP*$CH#yispF5m#a-|cwhS6})1@WYtj(__4%YOs%+b({3*AM=+@;T5Q zcKR*PY~1|P7YOx_e*E{}{-;+S$9u)8Uw`qQZ|ryiZ^yiA9=rL@7r&$kUwZ15$DTK_ zeDcqKw(HRcD^lh$OYi*cJ^#4pNkusG7rP$#p2_0v9{y{qy) zy#7zOR~~%?Pq}=@-M`=Us|We0Ts~sezgB+mL-YEVKezjbKQiw}&w6CncfM-{^6&-g zpTFhHPGPD{{aw}j>#DbmtyoS6{XJetlW{7|%3gjK@b(@;)i76+FZ$_`h0Xqs%KPay zsjDA&FIAS(mDygQwdK8Bc_-bH9fW7R=PRdsr}LX3d`IOdx&bc}?h|t?&Ha}u0pXQO zllOj$FH0p1a%#-C;M54$vk&(nTrX}GP7Pf(erMv!xCr+*I5kAexDrl{#QSh%+!!1^ zzvwg53O-|~pPyF91i3~p`o^@vReq4k*3~!U@{NV2=9bn!TigDmUt01B{~_Q1;^jVm ze(~pWSy2Xk1LJ#swl0@%Y7R2>4UL7CR=vxwF!w$j{~A~ddvxJye>we$Rk+J> zSK&aD6CPn{0PS5jUGHuB)b$_oHh=n~*Inc7+4JHrwtoIEum9jRR~u1uI~%>xqetsS zy&eAY`cV(Z{ziLkjleUF4KO%g=m1_1u;A6}8+{o)bxfgK%(g%9H7m4P0?sQqFG;j` z(Wj;t{3b8DeR^TUFh#YWe3N~}FQ7+=Q3M|`S_#hT$IBNj2ETwlKBM5bgK9?M;5G%@ zPhQeCnd1=)Iy*bP==(DYEy;_)^ImlA%z{50EHeuuMk&mG^1}_xFQBgyW26^-XJ+BB p5el}Sy!vp~YsWM7$fKqmea!S3GiOD!PnvV`TrYZIW+4a{{67>B9?$>) diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.js deleted file mode 100644 index 7392d0e..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.js +++ /dev/null @@ -1,21 +0,0 @@ - -var OGVDecoderVideoVP9MTW = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoVP9MTW) { - OGVDecoderVideoVP9MTW = OGVDecoderVideoVP9MTW || {}; - -function GROWABLE_HEAP_U8(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPU8}function GROWABLE_HEAP_I32(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAP32}function GROWABLE_HEAP_F64(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPF64}var Module=typeof OGVDecoderVideoVP9MTW!=="undefined"?OGVDecoderVideoVP9MTW:{};var objAssign=Object.assign;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var options=Module;var moduleOverrides=objAssign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=function(){if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=function readAsync(filename,onload,onerror){requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("unhandledRejection",function(reason){throw reason});quit_=((status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)});Module["inspect"]=function(){return"[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=require("worker_threads")}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}global.Worker=nodeWorkerThreads.Worker}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!ENVIRONMENT_IS_NODE){read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=(title=>document.title=title)}else{}if(ENVIRONMENT_IS_NODE){if(typeof performance==="undefined"){global.performance=require("perf_hooks").performance}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){requireNodeFS();defaultPrint=(str=>fs.writeSync(1,str+"\n"));defaultPrintErr=(str=>fs.writeSync(2,str+"\n"))}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;objAssign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var getTempRet0=function(){return tempRet0};var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function TextDecoderWrapper(encoding){var textDecoder=new TextDecoder(encoding);this.decode=(data=>{if(data.buffer instanceof SharedArrayBuffer){data=new Uint8Array(data)}return textDecoder.decode.call(textDecoder,data)})}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf-16le"):undefined;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":1073741824/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATINIT__)}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;PThread.terminateAllThreads();runtimeExited=true}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="ogv-decoder-video-vp9-mt-wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTlsInit(Module["asm"]["T"]);wasmTable=Module["asm"]["Q"];addOnInit(Module["asm"]["K"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var ASM_CONSTS={};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function killThread(pthread_ptr){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var pthread=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];pthread.worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker),1);pthread.worker.pthread=undefined}function cancelThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];pthread.worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];if(pthread){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var worker=pthread.worker;PThread.returnWorkerToPool(worker)}}function _exit(status){exit(status)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],initMainThread:function(){var pthreadPoolSize=1;for(var i=0;i>2]=0;try{func()}finally{GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls>>2]=1}},receiveObjectTransfer:function(data){},threadInit:function(){for(var i in PThread.tlsInitFunctions){PThread.tlsInitFunctions[i]()}},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=function(e){var d=e["data"];var cmd=d["cmd"];if(worker.pthread)PThread.currentProxiedOperationCallerThread=worker.pthread.threadInfoStruct;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var thread=PThread.pthreads[d.targetThread];if(thread){thread.worker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processQueuedMainThreadWork"){_emscripten_main_thread_process_queued_calls()}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="detachedExit"){PThread.returnWorkerToPool(worker)}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else{err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=function(e){var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data})});worker.on("error",function(e){worker.onerror(e)});worker.on("detachedExit",function(){})}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("ogv-decoder-video-vp9-mt-wasm.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=GROWABLE_HEAP_I32()[pthread_ptr+44>>2];var stackSize=GROWABLE_HEAP_I32()[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function invokeEntryPoint(ptr,arg){return getWasmTableEntry(ptr)(arg)}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTlsInit(tlsInitFunc,moduleExports,metadata){PThread.tlsInitFunctions.push(tlsInitFunc)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=(()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6})}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=(()=>performance.now()-Module["__performance_now_clock_drift"])}else _emscripten_get_now=(()=>performance.now());function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInit()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,threadInfoStruct:threadParams.pthread_ptr};worker.pthread=pthread;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"threadInfoStruct":threadParams.pthread_ptr};worker.runPthread=function(){msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}function ___pthread_create_js(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer==="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return _emscripten_sync_run_in_main_thread_4(687865856,pthread_ptr,attr,start_routine,arg)}if(error)return error;var threadParams={startRoutine:start_routine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function ___pthread_detached_exit(){postMessage({"cmd":"detachedExit"})}function __emscripten_default_pthread_stack_size(){return 2097152}function __emscripten_futex_wait_non_blocking(addr,val,timeout){var tNow=performance.now();var tEnd=tNow+timeout;var lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr);while(1){tNow=performance.now();if(tNow>tEnd){lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);return-73}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);if(lastAddr==0){break}_emscripten_main_thread_process_queued_calls();if(Atomics.load(GROWABLE_HEAP_I32(),addr>>2)!=val){return-6}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr)}return 0}function __emscripten_notify_thread_queue(targetThreadId,mainThreadId){if(targetThreadId==mainThreadId){postMessage({"cmd":"processQueuedMainThreadWork"})}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processThreadQueue"})}else{var pthread=PThread.pthreads[targetThreadId];var worker=pthread&&pthread.worker;if(!worker){return}worker.postMessage({"cmd":"processThreadQueue"})}return 1}function __emscripten_throw_longjmp(){throw"longjmp"}function _abort(){abort("")}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}function _emscripten_memcpy_big(dest,src,num){GROWABLE_HEAP_U8().copyWithin(dest,src,src+num)}function _emscripten_num_logical_cores(){if(ENVIRONMENT_IS_NODE)return require("os").cpus().length;return navigator["hardwareConcurrency"]}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(function(){var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=GROWABLE_HEAP_U8().length;requestedSize=requestedSize>>>0;if(requestedSize<=oldSize){return false}var maxHeapSize=1073741824;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence>2]=eventTypeId;GROWABLE_HEAP_I32()[varargs+4>>2]=eventData;GROWABLE_HEAP_I32()[varargs+8>>2]=userData;_emscripten_dispatch_to_thread_(targetThread,637534208,eventHandlerFunc,eventData,varargs)})},getTargetThreadForEventCallback:function(targetThread){switch(targetThread){case 1:return 0;case 2:return PThread.currentProxiedOperationCallerThread;default:return targetThread}},getNodeNameForTarget:function(target){if(!target)return"";if(target==window)return"#window";if(target==screen)return"#screen";return target&&target.nodeName?target.nodeName:""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height){withStackSave(function(){var varargs=stackAlloc(12);var targetCanvasPtr=0;if(targetCanvas){targetCanvasPtr=stringToNewUTF8(targetCanvas)}GROWABLE_HEAP_I32()[varargs>>2]=targetCanvasPtr;GROWABLE_HEAP_I32()[varargs+4>>2]=width;GROWABLE_HEAP_I32()[varargs+8>>2]=height;_emscripten_dispatch_to_thread_(targetThread,657457152,0,targetCanvasPtr,varargs)})}function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread,targetCanvas,width,height){targetCanvas=targetCanvas?UTF8ToString(targetCanvas):"";_emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height)}function maybeCStringToJsString(cString){return cString>2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!=="undefined"?document:0,typeof window!=="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!=="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_set_canvas_element_size_calling_thread(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;if(canvas.canvasSharedPtr){GROWABLE_HEAP_I32()[canvas.canvasSharedPtr>>2]=width;GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+4>>2]=height}if(canvas.offscreenCanvas||!canvas.controlTransferredOffscreen){if(canvas.offscreenCanvas)canvas=canvas.offscreenCanvas;var autoResizeViewport=false;if(canvas.GLctxObject&&canvas.GLctxObject.GLctx){var prevViewport=canvas.GLctxObject.GLctx.getParameter(2978);autoResizeViewport=prevViewport[0]===0&&prevViewport[1]===0&&prevViewport[2]===canvas.width&&prevViewport[3]===canvas.height}canvas.width=width;canvas.height=height;if(autoResizeViewport){canvas.GLctxObject.GLctx.viewport(0,0,width,height)}}else if(canvas.canvasSharedPtr){var targetThread=GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+8>>2];_emscripten_set_offscreencanvas_size_on_target_thread(targetThread,target,width,height);return 1}else{return-4}return 0}function _emscripten_set_canvas_element_size_main_thread(target,width,height){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,1,target,width,height);return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(canvas){return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}else{return _emscripten_set_canvas_element_size_main_thread(target,width,height)}}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)};return 1}}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>2]:-1;source+=UTF8ToString(GROWABLE_HEAP_I32()[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;canvas.getContext=function(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}}var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=_malloc(8);GROWABLE_HEAP_I32()[handle+4>>2]=_pthread_self();var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;_free(GL.contexts[contextHandle].handle);GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=GROWABLE_HEAP_I32()[a+(24>>2)];var contextAttributes={"alpha":!!GROWABLE_HEAP_I32()[a+(0>>2)],"depth":!!GROWABLE_HEAP_I32()[a+(4>>2)],"stencil":!!GROWABLE_HEAP_I32()[a+(8>>2)],"antialias":!!GROWABLE_HEAP_I32()[a+(12>>2)],"premultipliedAlpha":!!GROWABLE_HEAP_I32()[a+(16>>2)],"preserveDrawingBuffer":!!GROWABLE_HEAP_I32()[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!GROWABLE_HEAP_I32()[a+(28>>2)],majorVersion:GROWABLE_HEAP_I32()[a+(32>>2)],minorVersion:GROWABLE_HEAP_I32()[a+(36>>2)],enableExtensionsByDefault:GROWABLE_HEAP_I32()[a+(40>>2)],explicitSwapControl:GROWABLE_HEAP_I32()[a+(44>>2)],proxyContextToMainThread:GROWABLE_HEAP_I32()[a+(48>>2)],renderViaOffscreenBackBuffer:GROWABLE_HEAP_I32()[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=GROWABLE_HEAP_I32()[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,fd,iov,iovcnt,pnum);var num=0;for(var i=0;i>2];var len=GROWABLE_HEAP_I32()[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}function _getTempRet0(){return getTempRet0()}function _ogvjs_callback_async_complete(ret,cpuTime){var callback=Module.callbacks.shift();Module["cpuTime"]+=cpuTime;callback(ret);return}function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight,picWidth,picHeight,picX,picY,displayWidth,displayHeight){var heap=wasmMemory.buffer;var format=Module["videoFormat"];function copyAndTrim(arr,buffer,stride,height,picX,picY,picWidth,picHeight,fill){arr.set(new Uint8Array(heap,buffer,stride*height));var x,y,ptr;for(ptr=0,y=0;y0){var next=recycled.shift(),format=next["format"];if(format["width"]===width&&format["height"]===height&&format["chromaWidth"]===chromaWidth&&format["chromaHeight"]===chromaHeight&&format["cropLeft"]===picX&&format["cropTop"]===picY&&format["cropWidth"]===picWidth&&format["cropHeight"]===picHeight&&format["displayWidth"]===displayWidth&&format["displayHeight"]===displayHeight&&next["y"]["bytes"].length===lenY&&next["u"]["bytes"].length===lenCb&&next["v"]["bytes"].length===lenCr){frame=next;break}}if(!frame){frame={"format":{"width":width,"height":height,"chromaWidth":chromaWidth,"chromaHeight":chromaHeight,"cropLeft":picX,"cropTop":picY,"cropWidth":picWidth,"cropHeight":picHeight,"displayWidth":displayWidth,"displayHeight":displayHeight},"y":{"bytes":new Uint8Array(lenY),"stride":strideY},"u":{"bytes":new Uint8Array(lenCb),"stride":strideCb},"v":{"bytes":new Uint8Array(lenCr),"stride":strideCr}}}copyAndTrim(frame["y"]["bytes"],bufferY,strideY,height,picX,picY,picWidth,picHeight,0);copyAndTrim(frame["u"]["bytes"],bufferCb,strideCb,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);copyAndTrim(frame["v"]["bytes"],bufferCr,strideCr,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);Module["frameBuffer"]=frame}function _setTempRet0(val){setTempRet0(val)}if(!ENVIRONMENT_IS_PTHREAD)PThread.initMainThread();var GLctx;var proxiedFunctionTable=[null,exitOnMainThread,_emscripten_set_canvas_element_size_main_thread,_fd_write];var asmLibraryArg={"B":___emscripten_init_main_thread_js,"v":___emscripten_thread_cleanup,"o":___pthread_create_js,"z":___pthread_detached_exit,"A":__emscripten_default_pthread_stack_size,"G":__emscripten_futex_wait_non_blocking,"F":__emscripten_notify_thread_queue,"u":__emscripten_throw_longjmp,"J":_abort,"n":_emscripten_check_blocking_allowed,"d":_emscripten_get_now,"s":_emscripten_memcpy_big,"I":_emscripten_num_logical_cores,"C":_emscripten_receive_on_main_thread_js,"t":_emscripten_resize_heap,"D":_emscripten_set_canvas_element_size,"x":_emscripten_unwind_to_js_event_loop,"E":_emscripten_webgl_create_context,"y":_exit,"m":_fd_write,"b":_getTempRet0,"g":invoke_ii,"f":invoke_iii,"i":invoke_iiii,"l":invoke_iiiii,"p":invoke_iiiiii,"h":invoke_vi,"k":invoke_vii,"e":invoke_viiii,"j":invoke_viiiii,"H":invoke_viiiiii,"q":invoke_viiiiiiii,"a":wasmMemory||Module["wasmMemory"],"r":_ogvjs_callback_async_complete,"w":_ogvjs_callback_frame,"c":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["K"]).apply(null,arguments)};var _ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=function(){return(_ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=Module["asm"]["L"]).apply(null,arguments)};var _ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=function(){return(_ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=Module["asm"]["M"]).apply(null,arguments)};var _ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=function(){return(_ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=Module["asm"]["N"]).apply(null,arguments)};var _ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=function(){return(_ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=Module["asm"]["O"]).apply(null,arguments)};var _ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=function(){return(_ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=Module["asm"]["P"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["R"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["S"]).apply(null,arguments)};var _emscripten_tls_init=Module["_emscripten_tls_init"]=function(){return(_emscripten_tls_init=Module["_emscripten_tls_init"]=Module["asm"]["T"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["U"]).apply(null,arguments)};var _emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=function(){return(_emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=Module["asm"]["V"]).apply(null,arguments)};var _emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=function(){return(_emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=Module["asm"]["W"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return(_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["X"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["Y"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["Z"]).apply(null,arguments)};var _emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=function(){return(_emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=Module["asm"]["_"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["$"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["aa"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["ba"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["ca"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["da"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["ea"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["fa"]).apply(null,arguments)};var __emscripten_main_thread_futex=Module["__emscripten_main_thread_futex"]=35704;var __emscripten_allow_main_runtime_queued_calls=Module["__emscripten_allow_main_runtime_queued_calls"]=34124;function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["PThread"]=PThread;Module["PThread"]=PThread;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){readyPromiseResolve(Module);initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}if(keepRuntimeAlive()){}else{exitRuntime()}procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}if(ENVIRONMENT_IS_PTHREAD){noExitRuntime=false;PThread.initWorker()}run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module["_free"](inputBuffer)}inputBufferSize=size;inputBuffer=Module["_malloc"](inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance==="undefined"||typeof performance.now==="undefined"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module["cpuTime"]+=getTimestamp()-start;return ret}Module["loadedMetadata"]=!!options["videoFormat"];Module["videoFormat"]=options["videoFormat"]||null;Module["frameBuffer"]=null;Module["cpuTime"]=0;Object.defineProperty(Module,"processing",{get:function getProcessing(){return false}});Module["init"]=function(callback){time(function(){Module["_ogv_video_decoder_init"]()});callback()};Module["processHeader"]=function(data,callback){var ret=time(function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_header"](buffer,len)});callback(ret)};Module.callbacks=[];Module["processFrame"]=function(data,callback){var isAsync=Module["_ogv_video_decoder_async"]();var len=data.byteLength;var buffer=Module["_malloc"](len);function callbackWrapper(ret){Module["_free"](buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time(function(){var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_frame"](buffer,len)});if(!isAsync){callbackWrapper(ret)}};Module["close"]=function(){};Module["sync"]=function(){var isAsync=Module["_ogv_video_decoder_async"]();if(isAsync){Module.callbacks.push(function(){});time(function(){Module["_ogv_video_decoder_process_frame"](0,0)})}};Module["recycledFrames"]=[];Module["recycleFrame"]=function(frame){var arr=Module["recycledFrames"];arr.push(frame);if(arr.length>16){arr.shift()}}; - - - return OGVDecoderVideoVP9MTW.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = OGVDecoderVideoVP9MTW; -else if (typeof define === 'function' && define['amd']) - define([], function() { return OGVDecoderVideoVP9MTW; }); -else if (typeof exports === 'object') - exports["OGVDecoderVideoVP9MTW"] = OGVDecoderVideoVP9MTW; diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.wasm b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.wasm deleted file mode 100755 index 6169abb8366df95a6aa40dc08c31ebe49ff82309..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259095 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 GoYMk@EhRE+of``0hYXI>VG$KTP}x?Z#`d|P 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 diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.worker.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.worker.js deleted file mode 100644 index 3d7de95..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-mt-wasm.worker.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";var Module={};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){var nodeWorkerThreads=require("worker_threads");var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(nodeFS.readFileSync(f,"utf8"))},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);receiveInstance(instance);Module["wasmModule"]=null;return instance.exports};self.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}OGVDecoderVideoVP9MTW(Module).then(function(instance){Module=instance})}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0,1);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInit();try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(Module["keepRuntimeAlive"]()){Module["PThread"].setExitStatus(result)}else{Module["__emscripten_thread_exit"](result)}}catch(ex){if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["keepRuntimeAlive"]()){}else{Module["__emscripten_thread_exit"](ex.status)}}else{throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}}; diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.js deleted file mode 100644 index 4aa3aa4..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.js +++ /dev/null @@ -1,21 +0,0 @@ - -var OGVDecoderVideoVP9SIMDMTW = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoVP9SIMDMTW) { - OGVDecoderVideoVP9SIMDMTW = OGVDecoderVideoVP9SIMDMTW || {}; - -function GROWABLE_HEAP_U8(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPU8}function GROWABLE_HEAP_I32(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAP32}function GROWABLE_HEAP_F64(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPF64}var Module=typeof OGVDecoderVideoVP9SIMDMTW!=="undefined"?OGVDecoderVideoVP9SIMDMTW:{};var objAssign=Object.assign;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var options=Module;var moduleOverrides=objAssign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=function(){if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=function readAsync(filename,onload,onerror){requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("unhandledRejection",function(reason){throw reason});quit_=((status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)});Module["inspect"]=function(){return"[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=require("worker_threads")}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}global.Worker=nodeWorkerThreads.Worker}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!ENVIRONMENT_IS_NODE){read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=(title=>document.title=title)}else{}if(ENVIRONMENT_IS_NODE){if(typeof performance==="undefined"){global.performance=require("perf_hooks").performance}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){requireNodeFS();defaultPrint=(str=>fs.writeSync(1,str+"\n"));defaultPrintErr=(str=>fs.writeSync(2,str+"\n"))}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;objAssign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var getTempRet0=function(){return tempRet0};var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function TextDecoderWrapper(encoding){var textDecoder=new TextDecoder(encoding);this.decode=(data=>{if(data.buffer instanceof SharedArrayBuffer){data=new Uint8Array(data)}return textDecoder.decode.call(textDecoder,data)})}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf-16le"):undefined;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":1073741824/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATINIT__)}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;PThread.terminateAllThreads();runtimeExited=true}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="ogv-decoder-video-vp9-simd-mt-wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTlsInit(Module["asm"]["T"]);wasmTable=Module["asm"]["Q"];addOnInit(Module["asm"]["K"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var ASM_CONSTS={};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function killThread(pthread_ptr){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var pthread=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];pthread.worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker),1);pthread.worker.pthread=undefined}function cancelThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];pthread.worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];if(pthread){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var worker=pthread.worker;PThread.returnWorkerToPool(worker)}}function _exit(status){exit(status)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],initMainThread:function(){var pthreadPoolSize=1;for(var i=0;i>2]=0;try{func()}finally{GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls>>2]=1}},receiveObjectTransfer:function(data){},threadInit:function(){for(var i in PThread.tlsInitFunctions){PThread.tlsInitFunctions[i]()}},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=function(e){var d=e["data"];var cmd=d["cmd"];if(worker.pthread)PThread.currentProxiedOperationCallerThread=worker.pthread.threadInfoStruct;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var thread=PThread.pthreads[d.targetThread];if(thread){thread.worker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processQueuedMainThreadWork"){_emscripten_main_thread_process_queued_calls()}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="detachedExit"){PThread.returnWorkerToPool(worker)}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else{err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=function(e){var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data})});worker.on("error",function(e){worker.onerror(e)});worker.on("detachedExit",function(){})}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("ogv-decoder-video-vp9-simd-mt-wasm.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=GROWABLE_HEAP_I32()[pthread_ptr+44>>2];var stackSize=GROWABLE_HEAP_I32()[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function invokeEntryPoint(ptr,arg){return getWasmTableEntry(ptr)(arg)}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTlsInit(tlsInitFunc,moduleExports,metadata){PThread.tlsInitFunctions.push(tlsInitFunc)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=(()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6})}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=(()=>performance.now()-Module["__performance_now_clock_drift"])}else _emscripten_get_now=(()=>performance.now());function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInit()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,threadInfoStruct:threadParams.pthread_ptr};worker.pthread=pthread;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"threadInfoStruct":threadParams.pthread_ptr};worker.runPthread=function(){msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}function ___pthread_create_js(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer==="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return _emscripten_sync_run_in_main_thread_4(687865856,pthread_ptr,attr,start_routine,arg)}if(error)return error;var threadParams={startRoutine:start_routine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function ___pthread_detached_exit(){postMessage({"cmd":"detachedExit"})}function __emscripten_default_pthread_stack_size(){return 2097152}function __emscripten_futex_wait_non_blocking(addr,val,timeout){var tNow=performance.now();var tEnd=tNow+timeout;var lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr);while(1){tNow=performance.now();if(tNow>tEnd){lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);return-73}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);if(lastAddr==0){break}_emscripten_main_thread_process_queued_calls();if(Atomics.load(GROWABLE_HEAP_I32(),addr>>2)!=val){return-6}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr)}return 0}function __emscripten_notify_thread_queue(targetThreadId,mainThreadId){if(targetThreadId==mainThreadId){postMessage({"cmd":"processQueuedMainThreadWork"})}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processThreadQueue"})}else{var pthread=PThread.pthreads[targetThreadId];var worker=pthread&&pthread.worker;if(!worker){return}worker.postMessage({"cmd":"processThreadQueue"})}return 1}function __emscripten_throw_longjmp(){throw"longjmp"}function _abort(){abort("")}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}function _emscripten_memcpy_big(dest,src,num){GROWABLE_HEAP_U8().copyWithin(dest,src,src+num)}function _emscripten_num_logical_cores(){if(ENVIRONMENT_IS_NODE)return require("os").cpus().length;return navigator["hardwareConcurrency"]}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(function(){var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=GROWABLE_HEAP_U8().length;requestedSize=requestedSize>>>0;if(requestedSize<=oldSize){return false}var maxHeapSize=1073741824;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence>2]=eventTypeId;GROWABLE_HEAP_I32()[varargs+4>>2]=eventData;GROWABLE_HEAP_I32()[varargs+8>>2]=userData;_emscripten_dispatch_to_thread_(targetThread,637534208,eventHandlerFunc,eventData,varargs)})},getTargetThreadForEventCallback:function(targetThread){switch(targetThread){case 1:return 0;case 2:return PThread.currentProxiedOperationCallerThread;default:return targetThread}},getNodeNameForTarget:function(target){if(!target)return"";if(target==window)return"#window";if(target==screen)return"#screen";return target&&target.nodeName?target.nodeName:""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height){withStackSave(function(){var varargs=stackAlloc(12);var targetCanvasPtr=0;if(targetCanvas){targetCanvasPtr=stringToNewUTF8(targetCanvas)}GROWABLE_HEAP_I32()[varargs>>2]=targetCanvasPtr;GROWABLE_HEAP_I32()[varargs+4>>2]=width;GROWABLE_HEAP_I32()[varargs+8>>2]=height;_emscripten_dispatch_to_thread_(targetThread,657457152,0,targetCanvasPtr,varargs)})}function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread,targetCanvas,width,height){targetCanvas=targetCanvas?UTF8ToString(targetCanvas):"";_emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height)}function maybeCStringToJsString(cString){return cString>2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!=="undefined"?document:0,typeof window!=="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!=="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_set_canvas_element_size_calling_thread(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;if(canvas.canvasSharedPtr){GROWABLE_HEAP_I32()[canvas.canvasSharedPtr>>2]=width;GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+4>>2]=height}if(canvas.offscreenCanvas||!canvas.controlTransferredOffscreen){if(canvas.offscreenCanvas)canvas=canvas.offscreenCanvas;var autoResizeViewport=false;if(canvas.GLctxObject&&canvas.GLctxObject.GLctx){var prevViewport=canvas.GLctxObject.GLctx.getParameter(2978);autoResizeViewport=prevViewport[0]===0&&prevViewport[1]===0&&prevViewport[2]===canvas.width&&prevViewport[3]===canvas.height}canvas.width=width;canvas.height=height;if(autoResizeViewport){canvas.GLctxObject.GLctx.viewport(0,0,width,height)}}else if(canvas.canvasSharedPtr){var targetThread=GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+8>>2];_emscripten_set_offscreencanvas_size_on_target_thread(targetThread,target,width,height);return 1}else{return-4}return 0}function _emscripten_set_canvas_element_size_main_thread(target,width,height){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,1,target,width,height);return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(canvas){return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}else{return _emscripten_set_canvas_element_size_main_thread(target,width,height)}}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)};return 1}}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>2]:-1;source+=UTF8ToString(GROWABLE_HEAP_I32()[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;canvas.getContext=function(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}}var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=_malloc(8);GROWABLE_HEAP_I32()[handle+4>>2]=_pthread_self();var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;_free(GL.contexts[contextHandle].handle);GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=GROWABLE_HEAP_I32()[a+(24>>2)];var contextAttributes={"alpha":!!GROWABLE_HEAP_I32()[a+(0>>2)],"depth":!!GROWABLE_HEAP_I32()[a+(4>>2)],"stencil":!!GROWABLE_HEAP_I32()[a+(8>>2)],"antialias":!!GROWABLE_HEAP_I32()[a+(12>>2)],"premultipliedAlpha":!!GROWABLE_HEAP_I32()[a+(16>>2)],"preserveDrawingBuffer":!!GROWABLE_HEAP_I32()[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!GROWABLE_HEAP_I32()[a+(28>>2)],majorVersion:GROWABLE_HEAP_I32()[a+(32>>2)],minorVersion:GROWABLE_HEAP_I32()[a+(36>>2)],enableExtensionsByDefault:GROWABLE_HEAP_I32()[a+(40>>2)],explicitSwapControl:GROWABLE_HEAP_I32()[a+(44>>2)],proxyContextToMainThread:GROWABLE_HEAP_I32()[a+(48>>2)],renderViaOffscreenBackBuffer:GROWABLE_HEAP_I32()[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=GROWABLE_HEAP_I32()[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,fd,iov,iovcnt,pnum);var num=0;for(var i=0;i>2];var len=GROWABLE_HEAP_I32()[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}function _getTempRet0(){return getTempRet0()}function _ogvjs_callback_async_complete(ret,cpuTime){var callback=Module.callbacks.shift();Module["cpuTime"]+=cpuTime;callback(ret);return}function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight,picWidth,picHeight,picX,picY,displayWidth,displayHeight){var heap=wasmMemory.buffer;var format=Module["videoFormat"];function copyAndTrim(arr,buffer,stride,height,picX,picY,picWidth,picHeight,fill){arr.set(new Uint8Array(heap,buffer,stride*height));var x,y,ptr;for(ptr=0,y=0;y0){var next=recycled.shift(),format=next["format"];if(format["width"]===width&&format["height"]===height&&format["chromaWidth"]===chromaWidth&&format["chromaHeight"]===chromaHeight&&format["cropLeft"]===picX&&format["cropTop"]===picY&&format["cropWidth"]===picWidth&&format["cropHeight"]===picHeight&&format["displayWidth"]===displayWidth&&format["displayHeight"]===displayHeight&&next["y"]["bytes"].length===lenY&&next["u"]["bytes"].length===lenCb&&next["v"]["bytes"].length===lenCr){frame=next;break}}if(!frame){frame={"format":{"width":width,"height":height,"chromaWidth":chromaWidth,"chromaHeight":chromaHeight,"cropLeft":picX,"cropTop":picY,"cropWidth":picWidth,"cropHeight":picHeight,"displayWidth":displayWidth,"displayHeight":displayHeight},"y":{"bytes":new Uint8Array(lenY),"stride":strideY},"u":{"bytes":new Uint8Array(lenCb),"stride":strideCb},"v":{"bytes":new Uint8Array(lenCr),"stride":strideCr}}}copyAndTrim(frame["y"]["bytes"],bufferY,strideY,height,picX,picY,picWidth,picHeight,0);copyAndTrim(frame["u"]["bytes"],bufferCb,strideCb,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);copyAndTrim(frame["v"]["bytes"],bufferCr,strideCr,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);Module["frameBuffer"]=frame}function _setTempRet0(val){setTempRet0(val)}if(!ENVIRONMENT_IS_PTHREAD)PThread.initMainThread();var GLctx;var proxiedFunctionTable=[null,exitOnMainThread,_emscripten_set_canvas_element_size_main_thread,_fd_write];var asmLibraryArg={"B":___emscripten_init_main_thread_js,"v":___emscripten_thread_cleanup,"o":___pthread_create_js,"z":___pthread_detached_exit,"A":__emscripten_default_pthread_stack_size,"G":__emscripten_futex_wait_non_blocking,"F":__emscripten_notify_thread_queue,"u":__emscripten_throw_longjmp,"J":_abort,"n":_emscripten_check_blocking_allowed,"d":_emscripten_get_now,"s":_emscripten_memcpy_big,"I":_emscripten_num_logical_cores,"C":_emscripten_receive_on_main_thread_js,"t":_emscripten_resize_heap,"D":_emscripten_set_canvas_element_size,"x":_emscripten_unwind_to_js_event_loop,"E":_emscripten_webgl_create_context,"y":_exit,"m":_fd_write,"b":_getTempRet0,"g":invoke_ii,"f":invoke_iii,"i":invoke_iiii,"l":invoke_iiiii,"p":invoke_iiiiii,"h":invoke_vi,"k":invoke_vii,"e":invoke_viiii,"j":invoke_viiiii,"H":invoke_viiiiii,"q":invoke_viiiiiiii,"a":wasmMemory||Module["wasmMemory"],"r":_ogvjs_callback_async_complete,"w":_ogvjs_callback_frame,"c":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["K"]).apply(null,arguments)};var _ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=function(){return(_ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=Module["asm"]["L"]).apply(null,arguments)};var _ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=function(){return(_ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=Module["asm"]["M"]).apply(null,arguments)};var _ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=function(){return(_ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=Module["asm"]["N"]).apply(null,arguments)};var _ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=function(){return(_ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=Module["asm"]["O"]).apply(null,arguments)};var _ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=function(){return(_ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=Module["asm"]["P"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["R"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["S"]).apply(null,arguments)};var _emscripten_tls_init=Module["_emscripten_tls_init"]=function(){return(_emscripten_tls_init=Module["_emscripten_tls_init"]=Module["asm"]["T"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["U"]).apply(null,arguments)};var _emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=function(){return(_emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=Module["asm"]["V"]).apply(null,arguments)};var _emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=function(){return(_emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=Module["asm"]["W"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return(_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["X"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["Y"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["Z"]).apply(null,arguments)};var _emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=function(){return(_emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=Module["asm"]["_"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["$"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["aa"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["ba"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["ca"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["da"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["ea"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["fa"]).apply(null,arguments)};var __emscripten_main_thread_futex=Module["__emscripten_main_thread_futex"]=35704;var __emscripten_allow_main_runtime_queued_calls=Module["__emscripten_allow_main_runtime_queued_calls"]=34124;function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["PThread"]=PThread;Module["PThread"]=PThread;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){readyPromiseResolve(Module);initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}if(keepRuntimeAlive()){}else{exitRuntime()}procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}if(ENVIRONMENT_IS_PTHREAD){noExitRuntime=false;PThread.initWorker()}run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module["_free"](inputBuffer)}inputBufferSize=size;inputBuffer=Module["_malloc"](inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance==="undefined"||typeof performance.now==="undefined"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module["cpuTime"]+=getTimestamp()-start;return ret}Module["loadedMetadata"]=!!options["videoFormat"];Module["videoFormat"]=options["videoFormat"]||null;Module["frameBuffer"]=null;Module["cpuTime"]=0;Object.defineProperty(Module,"processing",{get:function getProcessing(){return false}});Module["init"]=function(callback){time(function(){Module["_ogv_video_decoder_init"]()});callback()};Module["processHeader"]=function(data,callback){var ret=time(function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_header"](buffer,len)});callback(ret)};Module.callbacks=[];Module["processFrame"]=function(data,callback){var isAsync=Module["_ogv_video_decoder_async"]();var len=data.byteLength;var buffer=Module["_malloc"](len);function callbackWrapper(ret){Module["_free"](buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time(function(){var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_frame"](buffer,len)});if(!isAsync){callbackWrapper(ret)}};Module["close"]=function(){};Module["sync"]=function(){var isAsync=Module["_ogv_video_decoder_async"]();if(isAsync){Module.callbacks.push(function(){});time(function(){Module["_ogv_video_decoder_process_frame"](0,0)})}};Module["recycledFrames"]=[];Module["recycleFrame"]=function(frame){var arr=Module["recycledFrames"];arr.push(frame);if(arr.length>16){arr.shift()}}; - - - return OGVDecoderVideoVP9SIMDMTW.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = OGVDecoderVideoVP9SIMDMTW; -else if (typeof define === 'function' && define['amd']) - define([], function() { return OGVDecoderVideoVP9SIMDMTW; }); -else if (typeof exports === 'object') - exports["OGVDecoderVideoVP9SIMDMTW"] = OGVDecoderVideoVP9SIMDMTW; diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.wasm b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.wasm deleted file mode 100755 index 71951fe6eae2abed844aef45ddf803034e4f2819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277701 zcmeFa3!G(FRp)>9KKE7k+*@_4ySlr&tJ8h%NfR2KL2Y;N zC=2Ixv{pWA>vt$GZ+`vts{0OJ?uc&b3`#6s3do7RQ>nL2#;a}3VW0}UW1Z4~fO0|1 z>&Fv-9K!wU`H9!<_x1X%@U92HJgWNQIcPM+#_IrZXF#>P!~cOh;BIvb@$9`TaLhi{D-}%Wprb@_RCB^ZP0be|6O0{j2T$HBpE6 zm1v&d)o3@rw^?axQHA&0E#)bD|C(qIA+NQNuQeFH&far_>X?Q6t7wTd&$kk;Hh7NP z?={hO!mo{*{GPD%*IC|MeZ1i}HeCEO{(V07u2T1rt5o7R^3`gkHpjCTRVwwmkE5u* zP}x2=U#qtER+|^hI{mB0QKd%mTI}_&v4gM~SF6pn+qIc$qn=b1+ML~2t2Mo!brA_? zYqN9J8U3q7ji^4{Wdmry`9bb*(N_|^vwpOcEi+{elEv{7>l}g1Y z42g*BDki+^dzXInuSSZCTXjH><9fWao%qPN>xbHvq{SQcG@4D4HN1=JG5;FYn)Cdj z)heq|sk_&>`}wc-)cU&1@BhJH@Cnao>!14T7TxvHe{t@H=sUf;G5YV$-4y+{b1#Vg zt8+I;zv0{$xyZdRI^zDX=vnTIqi^)?OQJt_?nTiLJNKp0*L(Nk=oRkEqDP&3Np!b& zUlG00y93c1yubC<=ziy4dTaC#&cE!|=`K{4kI{%7WqlcY;<*m_QxQ72dKlATt zdG3<$bARjp*uBla-M`6ygTKpf_%rU)?yueda-VX4=Kj?EPxndpC+-vO`+f8_p$ zd&vEv`vdp;?qlw^+<$Yw>E7%<>h5*l?!LqQj{9A{R^P&_0)EeZ*!`OORrf3Icl}5G z@A&`b|DFFY{#X2m{eSiU!N1r4NB@)lr=Yo?_CMo)$$!ZIvi}YLLH~>XKl_jP2mLSj z5BOjAKkgs!KjHtq|5^Wj|DXJ?`k(VZ?@#+*^WW$1_uub-z`xV~u>TSNqyGQ(@9;n9 zf5`usf0uu^e~-Vif!Ui{=mN8;V8-~{j7S_H;5p~S{5Dk z5$|5_m80agaw>U!E#Ghf2EU#b0K@=56^(9Hk4WWP^|ds*UhuUX6^?*V>nGjHGzj$p z2$i&M)dmoF_X5FB)E=d^6P4vW>ejacq*4GvlWrVEL*5`yC5`%BQcR(uHUdX&1Qom+ zD#oy|Rn;X9sAatBO1H6fFI4-gBJ@Iaq-x%$Q9#RUX(iCWpbNn3Xctr`tM}xI(rQ5j zLh1++oNx8j$E$v3vU&%NMCr`t)mQpu+be5B`cv1})5dCATTQF0(9+g~SN1n(5#d$F z2@fKM@I+G+v_B-gNQ5__{Y?oEx-qg_+?wp7#4m>tK<@)c-s#o_N*H{@p|A<>w-RDl!NgF9+foY(&+O2;^Vwd|2NdlQ1d4sAmpFbGgR9Q!^ zaBCD+9TkQF>2XCddSqM>4Wd~6e3?THIQnU|hYXeE%l#z3|8B1p1cH@AGIO?=V3DB8 zn1phNNDIg}06N?tXYt@p^?B%hrS13Vc`B_?UX&0l`3}hqsq{9>mqsVrk)@SDHz=TM zi;5yE3l7pF&L>w!QIdSnySgoz8eyT-((0&_#R4Q=>yl6sGV}C7zmQc0=0U%RR2b!Z zds$4~!e#ZuQd*sNl-$wEsRB?g@4g_UMut4dn#r-oBDBGpXycLk%BtQ^zOuGT-7zWR+j{`x!DZJ=JoFT^u~F$sbWDlp^)ra=rmVU| zJKWW2b%omFE^EUiB_gdZWk7n}Fp#)df@gyQts_{yiDYY3=2TZDZ-9ifdQ%%T(L1au zB$3r5Z1W#jqTaaQJL)^hcUE0({lX~k^s~kRB6GxI@Si#*_QFHXYlWc^AN4H~-cL`X z7@)3SBk5ZmMMZ#e)Zfc%9_9DCM-s)ZAN4ozxR2Zi!spE-b@}%>(jKzcd-eLos`JXI zLD3%(5m7XYo1^~2YRCPKuAb$v+bH(zx?IRDUg0 z}il}yO3@=3y^nz-nD}XHOLK6r5wRv;{+3AM-D^@@? zs~r!#iaMfl9c?=5kMQKNH+9FN%VT=&pg#o91v8*f^g%#}YI6o;=dG^o_7F6I7egYr zNg$Rwqf>npDdU0pdbB50Ks{;QdZnmN536pWNU@Md;skstE3M7bl~s{QRfwa^M{|&F zge~$lqg!oaq=Z%G78jB zgOL@V>Sd-6sh|u(>gK_4u5J*TQy)52 z$dA{0RFYM$ZaYe=92e|maD{SW%7QC2zPDEy<<5sTrZg`J54Ogsutns{bP6w)ykA{z9KI)H(() z%t-?$UV*-86ewHC9q3TxLgoxObpwlfhy;{XMZaR<9eRd=n7c>!`H#NMLz}9s3!>?h z(3zdE3a{iJ6b)QcU{(x^hC-9fDAaht+Dg9vb_1in5&%uBKu{5x-XLC(uZKDevixIj zW7um%=TsZAi4qN^wX1<5x@kpJ+qng7CXaa65LHBU3P@4Qq<@R@rp7ge&?qAtz>b)o zhj=T~81WF<^)#{bWuUWZ2oi?|>1uSGe?02Cc$s<(WzyaVbwV5%soJL#w;tvT%KC+*BN85w z?}bNr8^c!HQ&gMFm*BdoYY*|mxAh%OWaj^oXTvWUc)B|8^o>Q;9lR zTaPH4?d5m>sXsZWE9qr(y^IlXiQAXW=l{871^H}S{u7T)6tq)`X0z@2Km1VuYg@LE z|J&b~NVTh%Eh^#8Y)AfM&#}^)+3x%=AD&2upmd3=WlQ?8rw9zZpC ztEU~_kdz?pDn)v&Ja|?oims(I`5%50Ft$WQV<5)qY})QmRMg9i?&i{Y3JZj{Gu_4e z=9HIiCn^dx>`nLZ(VnVjwwEQq&*YErg|hlAAT`o8BY=*+wZ8K--xO z!9v0t6Nyx$6HQ?#3!QWXm_gVE&a|1%@{A{NBI#)EC36!dx>oylkBAWz?6$>j0yEYIuQtc;_YV5C|`Z*8=@8HN0%N zx8N@2@VX2UaB_HU@4*kUIhA(>W4Yi-jqEAYJn14OT4YR@Jn3MzbDAeH_>Gku$rekV z)XAPY&65tQv^3kTN0jZE!1q!w3j=>%@wIGU{_Bqh9&sgn>EqkRJN{`(bWyfHzyHG} zBT4g5eqw^%JiV7)tb{wWZvMyrDtBLSb2UMgC8}J(2L)O7-0A%KRNQE6p>wJ~hdxuj*yb>1AKo%bp8eJ{M}dAf4;e z&HM8EUM0RMY>tie3)21h+ujZnNDYZ&ar?wLyZPIHj_Ax#Hx|7=y)gf?yNEj=gpEa| zy{y~Ivh;BN@E4y6Q6g zH3>vQ#8?!3;L=`pq?bK|#-}uXE`0_=QS--q`dr=u%eE<`J~f4iW!n@|nVv%GV%e=Q zh0IJ%A(B!xh18~}kQS_|$J%yp%Hp%80e2+L;4_`{3)9PZ?wz3jc_7zH1+57D$+C@e z;Tj1pAwku+jOHcyF-_CF#Nvk{y$!#nvHbe<_-m#uHclUe!5Ht~4xfK8YfN!w0BQseKN%y3?Cz$I+%)Y&BXD{0Y z9q*&uPN?;1>C^dGoUZ$+X`1dQYIopO&rA>Tv1giDiN~ZDrU!_f4{iK{^e7+urdkS% zNiQKLG8TDN`fT3!PxD9!9yXKFInSXZVzvdDOPJ&}r%X=iGuCTEv26-T7pIq|hl%N0A3rC(ocBZ1eSBdrI{+wG0Lm<&WHXF>>+PkfxpS5Q zZc&G(DuWkqqm+v%WhYbuJuC+Fck*BU&h_!3w-d?A2x8B4r*tG1?h9z1&+q=q@tjNq zA!`2=?itT}dYOhq1`KVZbBPKx2a1|$q;!RS}Y`Tj#NkKs#l2lkQ2jrX< zaMdT^X~IUfPoeFi^eHB!n&hz)7A9HGn*Y>vFCQiZj?34+`w39ynjskoWEDkxwgHp|haKE^`r)u=h#yVL01cOFac zd1u>^*k3PA8uQUfR=1yi?4KU1qvc=`ne;l(Vwuak=Uuv1meze!7NoYAW~rW<_7UX@ zw2_=?p&|CH?8%eA?>>JxigJ&7Du4fdzH`Vbk)~8CVN>T&oeE{q?w85N+T7FxEV{L< zj?LsELq{3s-|}{87)}sMjlHh)VfR{)R2VGDO)bv)ya9fsyJAL(*YbC~-S>{OJXS%i z%%N<`A3;IEABE+2rj@UeDzF9Y&2^CsAn$(e0{UN0(Sxx_Js+bxGC@a@8omKg}zQ;4DsYE(6 zNJ`2;G?4km+r9omi~OKPwY-xrq%~=k;^RxbBK_4;2{00mN;9uorE#`aqmEaaMQi$k zy4^?vB~uY0^(Sf*H36jv+Se$*`|YUA1c$V{cY;e+GW4xOQ7M&n+_P9^glW70)D-z0 z{TtCd2X#n`QqA9L4NwR1CT(<--$T3jqg^Ru%c>a`KIr~-EGVRxLK9xRs6(p-eW*yn zLy=0!-{wUQ;U&8WlWMyG%0ONKzXf>_a~ARf|1jrI8irKyny$7eukG;V~_s-u)fGYd+iVVhDK z;YMi?vIbsBX(E>?DjJS>Xuc#ojnuQ!9&D{(4w1M5q#L*b9lKue0Y(>;zLr6hfj!h1sekUNfNVZz;L6+#~!QOJ{|j38HKZV^*l6cr}D;1 zMok`my7AC{3#qJR9{V>`GaDNSsHE{LS!FGsJ7r*?ch)u+T3K+E@90U}zRG@@G@t0O zwN)`-4qZ5g{wufvERcq*Wp!&890I0Mw|2o=HE3fS?;4#Eiq+i|#110A`;RZJ1*Qb= zf^j*KSj7g!@wQ;U;8d5AwO^_-9ja1PN6?qZ(iv^30{D)$O~g?2DV*_Ws6NVTWQI`0 ze+#8|L8x{M$x@)Vk>vL=VELn9)V3K~=QLUZ^kg`>Xr|HZa`B!d`8nreQfSsm)o94t zbz^?%z04>-V&@=&U~KQk1_Lx|+m(G8wrS2WZfsjM5SL0g=x+|&T)rEDjbiTtKn)~q z(VF&I#7>~nD|cGaWJLg~Xv)Mo)CyjZF)8Mpsqb7z2GxzO2GURX_ko6NQrQ~_I~z26 z)Hqee5Y*5X+O@R9V;!n*7GE;m6Os_)bCLjg?SS z!9=n--uj8^S&$8?pBbs1_vz}9VzC;TF(P;zBp~aAPQVa??eR$(n1G_R6crL4mj<+s z2v9t3SByg;gS9bA_^hCqNt$Mz0|kv$ zd8?PN)Z4;Q^dXwGxssNeDu{Dh1_*B%!s)dMQ;f`qAP{qt_Ma zrC1Dh0y+bFozUxs=pFk8y~VdJ-L=ROF==Q>;(&!SPBiiQWsw6m2AY$2v#oH6n1hsb zH#?SC@@CNzxqty_LDQ~nv$GpbfUJVD21^m7Ypw9=6l>Ee+nieA5r||m6u~3WXDN?> zOC^^GZd=m^3ONLnC{iMJl*E81Nt?bJBrH~iU5c~h5|W@=VHw#mVrHh`dRP=u;9ikt zvErkB0IoG3U92vR!Xc4mmU|&7U}>n)uh>heW)uN@Q!&F_ zX^_qcU&w4ZZxIV+1Q6BoIWcj~Stv=6pbL6sAsUSiPAVZy5iR*3&@W6X&~LHmvf51! z--L`sVqsyt-kL^XpP{ zh~Lq;*J7|y5;@E72zrqK;h{YKTi0j4;jxXO0Ixxa?V`A z7%!buum;|+BNQ|;Ni|7v%k{a~0mEl>eLlqw08;EslN*nb^*KPRk652uRmH*_iS*pY zENYR_F_sAwH}w^FRO~COvLI4Ds>=_0zpC-m{GZd z#khe0PZb#|DLKl?FEG%qo&Bno4BbS>por~8kOo_USSI8h?0HQ`gP>t*IeG_Dp+^jqMjeL?9!eg%2iNgGFF^k9l8 zCT_hahL(RyO7=Z@)VUfqvwj?Y9Cv;G$pUD}!>~rPbxvKMu9D528eqyK#^;UXV81p@ zZ1E=T!AcF`iG^KT;%nmsN3l@?Tn$24dpPXfN)QS}vFlNENnceta5X3&1}iwNUHYl? zj)Nt~@bSy^Dc}puM<5X4c32?WC}ml$fEAoXDA@tVb*|3WZASn|#riFns(rt6^&T-q zap3i9Oa@4`1hX%?h0O~6f#lqHi~1<7buq;kR#7g6{t4+J;u1}OW?07v^lEw)+;>CJ z#j?Vq6&j!6AvzFA(hm}r4))k}5lEH{5Fna@aD-;f1Nj365vKZ(0`Fog!jJwdskt&u zC9ogx$p*jGUeX6u6=H1`sow!-Ns~D{D;nnL)FMFtD7Dz2h4L)eRB)Jp|Gsf z*F!)naANhAmL9ea1TpVmIjF<7Lec}g2QCkH(o~UZjcP;F=WI74bb$_xhye&2{~m8k z8MaMg6t)rIgonE{0l}2tuu_XN^&e>^i7w#z)wCfKrS4Svqc7KV2AhsTi4~cum!aZXCvP=)CX? z>a44R8E)t&Q3O;P+M#)RzycU@Vga#OKbS40<_Kd(Sy9gM%LX_0X$At44ua_V!m`J8BL6jWb=>yf;P0<#a78AvSVz|?% z;igJj0Zlglkz;HfI3n|f`Ok8U3VPNN+Ue7ZFDwOvXkF~|Nf}h^^bL}ls7K#uTDF}& zl&D}0k*|>O1o`N?PdhhiJH03DPVMw1R#R(vLJ}5%M6gnV`4k0nSVs zt`s|bQksPcoQbboXcqlqI*QMDlLhEfQ$`|2sE?4>!vkm=Qb$OLLw8&VaZu{H32}fw zD#RgIJ-hp3emS_^^TB^Z8 zrUW_%7jOf0N32=f1UgC%0-b~u33Si{dIkw}h}~Mhqjk1UL_`f(;-RhU$6>EnaG07$ z`>ZCQ6jB+c|HbNlQ}#-&wfw1=#Rk5~yWW<1`K2&O`VCEU4{c$bvp>TMGym9q{%PK} z!;JIUdqbhb>G0BKQ%yOikYo`}3Ydv)o*ZOx5uA zfdUDn(E>2+C3tJ{3`#-m|AG60Jj2RsK%VfTb0W{$aY=q*|8IgkS&|myNe75LnR|>p z+1d=q;-Nt-KBx7D5iL`U5Q-*)w1J|FVUMD;p6!0XT&gxCiveh=bgWGQx7KKO{Ki}L>d#xNo=weL zwQA5#wZqWRdA1Hp&S*z^<`f#yiXLL2JS6k+KyN5n0NoX2!Qnml?;PRToQN~|hS;@> zV+9;AGc!Bv!YjyRQ^$YknoAtMmGp>MoQzu-Vg)y&m>Me2(z3sqHK&bbp-0)ex6A^T zR~ep99b9TdTG-;r3>n>~49*(CAhbDc5L(BS+6;@$sCLYLkTroUA5E!b=8W1@m`P`` ztka+<>@q7;rhwYwu1;9{ak@stDVyjB(oSTGIDrFMQ_BRc!gAGw@6C>PG)VwsDXa>a z-+1%M&4C4_VjPP-rl6QKdaxUy2X>38e_GtQ+(+SU(F|1-*123WnvE@lQ~0n}g2`p1 z<12rI<5;gw_3@FR+JM98h~LNF#<1z!IEXM}NPey27PJ=?pX_#WFx2nP^Y!|Z-EI0p zoWahr%b7*vR{iddSOZ$-8rW{aVu$|`j6QW%F&qlP;4j;$ckL3x7a{S-+_l=76w{2Z zTjB|k63OTO+revEy)9!DD^K-$h+Bnl@M@O=wBJ6G?!;=g*k7Snn|9KzfX=uEy&u}c4A zW$IKtf1%7-b;wj1h!f&1Z5|xWYS>=(Pt?Lud6D%22sljn6LgK-v4@HJz2B`pvQ7*2 zh#k@A)F_1eyl!jtSB9c8;*Rk59vsRpT&g!CkBogfya0IhFuc_%uQ(dIVBJRAD zIfh}GBhp~6BRFI(Nj}a^O1cqnER|8aBb<|Ifu$^44NJxDZRb|v7kUXS)}c(|z^62A zm2luQJ{+aw(;~s^z$ZhE`G>~PDxClocg8B>>P)9VW15H69D*nqiqQn*OV@zhc&SYv zk<8K*DeTCnB9-d+5_#9jtp>+=LisrZ-P(>EO{^NrL5py-myxfts^E%oev2@nwJsyn z>+GubI1DqD&Pyp$crXNnS)2y6Xpm)+tY;_I%|=GS>LB4}JOg_X3q=N&?-E@=DVfEN z(u(lMDqRu4V`q<{7Xhc>6266A=cVBHP&c9q0YNG5a70%It70@g;WRES1u5(e7YW(K zr$Hi-EQU($bU6xE;Vqolwez|L4>(SQB~*Qn?xGvQY2bQiS-?+Kro*@<@K(?zt4VA% z9$&Jg0#hYQPf(obRcGf>IMEvb1e}CccGhx70Z9VcYTiEr>hT^)j(QYHfLx5MBsYg5Umw)rXDc&3 zYng{5RskyTD+|MSAw$#zIoLCFo^|V^&(c|GjdW(s0xiDtGD{1h0=FPjyi6-7qI08Y zglVvdvPti1(NKY^IM7+}i4ka+NsSsJ23kIdxQTqTwOCM&CJQ|5al0R}2J`GT@ zO!_oH8Wrmmc;?ff3i7mzEoqenHLEDz1}+(FqejaXrDrFoL;}uNY)G-%Wj7b`j+(Al zOVkWnr=QaO17n1`q;Rw{%*cT^WE9Fsy}UID29jAf3x=4t0Sweh^YQW`6;g7{a>!h@O0b}9*g~ko9KB#uks#vlI(CLt;u~we22|F9k8v82Y3rdsLGGJjrlxQx zm=%)vVpp59_k1#vb&8BSS@Ps}7oRcmv0pC#ORKY$$oUwKuJ!ug|Id(zeXu{ZHwu7C ziFsf624m56=?uYu)=XkFg&-09-$nVr=f@33g}6(DfCKlR_Kqt;f;6S zbMO79H}E8Lo=w2^Gp#)>j*dkyOzYt}*@TuTm{qiNX&DGt6W*-)Ggd}tUNg9?UNn6QRz$yWeA$P|L)?~}^G7KE&KyUJocEs*jZGeR6M#&iNd3d&1 zGh6A-HXSBW2c>doL2?|5z)6Ic5zWbZ^7W1>Mis17*7KKFFRa+?1abJzeu&pUKeB%h zufMb#=U2Q(MFdMUW>ZP4=`8&e*tZ8d<3A^mkVE~I3<@OAoW?B*!fbak| z?^m*pI3m;@Bb&9arMG6UO=mhk?l5v?B>q_#??H44-x(GdQ8v#{w}oUrkLV`?YUS;d z`9pts?pGhyofG+YBnT2yyRgB>%?L5R)(gh1gCC@=vcZGFC}*>%8%S_3vj z8$&v#h-yez=yfbNVKWx0=G+waD0!vaL5yv#4NB3OQPrlF-vm*F^3kkNPEkJ6(6CmR zXFcFTaOml0rD3OmLF?MFkyNaKO?;Zfa_V(d1_w$iq#+?p`v1^`GK7B$vDrHVg_C(oVB4N#BigT>*C91CaIMt0+@vYXT zs$_<9tmA~H)yW1ipvKX)NhP&mCG>cKxH4nF-3Y!r)I)cPc^Yjn@MUEKYcNHb9@^&M zVdD?|D!g`1*2e^K@U)PssL0%FeMbXD8OULvVxItqB?0Sm*zCxE1fu!rKr3(^gapTl zQnoS>Ui8D-95o3Y3+v~};8enir9X2*MZu=_Xa(iUgd!koqVt$X=OLZR8#Wjv%PfI)Ez;9ms&zpLkxPn^akC0-c(4m-;2V4i8#)O6fjpYz;K}R8ZXT`JUDYP2s1JxV)DNAL$Lj6eSq*m(6$ffW=X*FOOcv}cs4UH)p9Zb253h2?% z{~nhL2HF&(f*ExWRDc<$a9i)C_1j7+s9#U3fe`RkOnb&FX@Y|6NirCyz@A7l$f{cq zLXw<`C3*RLBdoE+g*)?mB+nyqnW_i+xed7qnE>7)3Cg5{!mZ`Vd(`#uG8|AdpTq^N zy1QcP(4F>oq&H!%*S4uxbd012r#fvuK$&LpW%id@1%@)1MI@b28mm8Mr|^b6V_yGE zxx>t-*iO)c@wQN$-b5Xvoji-(Yo`;H4*gad!VbterNtgR>JNsuLvn;@VQjS>32&Dj z^_PXWD~|dr!rOC>di+`78`WC2EFHP5dxBvyHg;psqp%1VFd1JBO*Hc2+}6(E%f_L; zF^iKtTLw*F61ZT*>Oy-%L#KUI!s07oT;sJA&wsP$$1VgFu=;ggTu+ zkgm?M(;hG(bwFGcg3PnVCK@T!>l3EF*eo#8-wPTtSie)dg zx|(Z)p3QezmI?vkZ~|-)7z$ekf;(TX7S;=MIcYt^9x*kLi)~^$X|oaoaBO6mRfKIN zGZunXnubRxHJHAt)WWVQluA=+ehIZ&uxTAq4+NtNHCT;M&$3~z7MMMQYALc-h7Bfd zWU840IM7cQ)WR7aQHR;y4xm(@pv_o;2h?87de(Uo)Od$=IKaLkC9Dj#MAD4Ii%C2^-%(OOgiJhq7~v}OP(vOq`ZX_*dZo4E%Ess z*aNaZA&;vJyLd%w=+|O{B&n0X6H6Rk_V{8&feBk-UoYxh4^!qEEJE%=_f;tRY*pU* zVo;2@6FN?cPiYg<=vZ?js~&6K`TBR}M|6;p5UE_h&%Fq(WEJkA=0E9_L_k-^FZZ} z&MOLK#lz357H?m+oOF((=Ft9(dY9_UH0zz?>X-r~HKocJ5G=Npko@kf+an$FX^bw_ zDW7 zVi5flH4vg=gvb1-AWiM&fmAjZV_gH6X((E) zW>S4vnBc=pWlU?abCW8W;{&LYRk?6f$v+vs;88+Jk*J!hfn6|PqM*xqpxfpTn~Q_~ zT`I?pn=_pZ3as{S@78hXMf+idHQ?x~OwzxXee>WSKt&c+=A>tqh9ly^$`*0>YPnya z%D5w20J#0P6LeqCFSF)}P>ba*P1d@&1I^`)0DqvIG~-xRo+@~c9<*w$yO(F{WPbX0 zz>q2wL3S_TH79KK6^&cklyIwofvb3y0YAY)|*m zs#Km0I2SKO`|EYu4yOcm=0%2<2}NrI7K;thMWyq6b_j%@^a5ap4g`9) zLnT%em=XZY5}g+^w8bHeOC+jXxTsmS8y*!S24Id?+F7Nz-*k%(zmnVCppVFNy0c8lC{Rk zfM|kJae^v9{wHTf#tFMjVVumZ87K|>+G(uhX-dd;J#2_9@GOUj#(@nH zj2**(*v*R#kv;Kp7!sl-sEwq|wsR%b(O06n-5M@?G+eN)8w{6Lx+pSa6KX()TKA(< z9Vf%N0U4IjMuz3bSBgN&kFOGilpp^_#A1f=HOP$y`5TSQ=0tS0lIWzESSW~&_aV_K zVtYY!yc^N6H_<~;Ruy6)K%+gwawF{wX>T+{G!E@S=%T%Herg-Vu|ktdJAW&aPY{Ky zmlyJGKmS9diugpZe9hmRiETh8OGv+(l<*qdx!WblTei8DRKoXu2mxjL0V!=hh!U4G zq{;v%oMXM5A1c2W(l){RfiGiTxtsWpF(KP*eS9hZC@&%B4j4|@F>rz2nMo^MoLC?9 zAM)K@=`2QUUG|~5YQcAxa2<`x5zo~JxkWKYo7C4*r?BQp7oX|C>AUVcHha%I(V=%pMG(M+Aj*}` z!6G#Y7Sip=-d!qS>4JKehi>s9umfoWrM0S0zG1)Mx1xkwxa#f-$;u{67!Hk|Q|wOb zJFpw|IV6p%6$~q>fewubjQeXy-T<|`NB4q;+cA5Rz^OMR37@j0uh@?5+zL{LqmkX+ z#e~s;s*yzz&lyr|Ver_-!&V&Hn|A$^=}xvZFrtuacy0A6Xcu#OuZt~(Uru+EM{Ul{ z9lbCg!vm2e&9I4f_Oa573C42+rb+Ncl@;!2OhY0)*_&V=3GzH!s17^PXZoc1CwxQO2^Q*@%kR9->VSu-j))FKEJvB8 zc^N(~lb>^L1Y1N9Q(?X+7XH~Zt3|WM3p?kAGA1UnmdH7urdzY;#`>;3+IL&D6FFy- z?wcEQpQHQ4u!51NVF{ud_MmJRiy{!;tp`WbhL*HPJFz|1iHtxd#9=2wZGj%ko}3E+ z3`nmbNWeF*}k>eKO@a%>&SMJ6(h`FbS!7VS^vz^z930>R# zj0yESn7t85;0mzPJwZS@uR;U?LXeJ{{7@WjYAJOE8Ei~aXsJ^WTh%uj4A`!E4YI<2 z7oDryLm0D6yVueZyvMMueJ#tPA9q=E!t9~uQTmDTVuQ#+oN`!jPnbOrGG+F_EQk@~ zO^oa?X;Msc%I1MBTkeOtsXPTDiBCcG&P|{+DXkr}_g@5ycWNAklx!N364-}!4rZxf zWimiVQg&`GzJe)3_zDHri#Qob$f)7wf%Mvx0F5Yhjb?Z>B13ZqS~qIW&=yk$&lBbh z3T7waIlj6czfOH1eWp%Wj2*8S|6svfyZy|(=@}x%3M$Amt!UyOB3=}onLpF+pw64G z*6Q14n#uO|?A)36xarhq-bdhL6fydD=BHG0JE}CsO5dus$`eu>_0xdP{I>071GlQb z@r2aBRc);&q&8Yx{wrD?+Fzjq7kBSj+Izvi{b!O$RJ%o=cb*WqwyJI6390Se`+V^U zseh~1?tMaPJI6lP?F_6sTo6^G;EI8*!Z^=Rb+Yi?m}ia1x;M@@kRB>IA)UZrF*ywnDVtl z92y0_P8VONLfmYK!yAO+im$H=adRQ=ju2OT-AQkXFglm8JdFG@{by5MEXQE1! zaX?8!GKzd0MU`q4)#?$uxo3WiHS?KwF>|C5ENSE~n_-s8YZgcF*uOM7^M9k~O+MS1 zsX1NknRa6)ikk4p7JPJe?(9I8Af~vzAA^vOGwlj9PIbr5T{XCFU0nBkrcJQLq}f?m z+*=lW=3n!cf>l%;S_BHQoov%KoDZVQHcYqR|8z9h2WU>8MDr6z&9woVk35OyCj`wb zk4(mA?Qjxxl$7l<95pV^bgHF-EeMFnQN-msSTL|>EUX+^tE2if=S`(;QTWnaKF>vZu&sN!lxoPC`xz6e!Zy@<1~)5RB|ifa^c_Qgbw zF!ZG0V#30cf(tYBlY+~Wf=en%jlWX1`e&98pA=lceev%J6vLksTuLNAQLCMQCc$M= zVCmN4Wxp(K!E^QV9Q|CWpDXlpR6m#L=b8FBq92qam%2mxdAfcM>gOW;9MDgupHx5l z^nQyw&|y%pIQB|Cce})^@DlKrLLwQEJ!bPY|WrcSUvkc zDSfJ|2R1L3 z729i0r}ndLmK7Jb92xFEI7qfl(TGFx@G_Enp~$_n$j#NkR6MWTTqmyNdlZ9|b%|RX z&A7M7xKGhom+i2OW@uIgVnR3|O;HGB96#&J^c0gi(~!x@5U=GqU~R2o96>CqHR;OW za+Yr3dM0SnNXH%)H{OyMcN02!5pu-j;1AuK?#APFq-4%$XPo!IPLjg0AecpoH$!^< zNI#?W`YCI`L`7~7n>ytsFPer#HN#$KXvP+bK6*Gu(TArl&Jd^`Ys;23p)8bDM_Y%q zvADOyZNTDBrgZ{KKLISciY_&ef=!Ngbht}N2cF_aT7V&#{P@<`h~D(XfdDi$B^hP26H1#2Q3rOQ&H2 zSalN1rR`bi2cy)J9E1mnH2Lw`s$(@38~&VeV(4tyhqN?TtO#jXGIseafYi2uqlS{= zp^bA$hig9-3hf%CXCWYiPozwhk3;C^P_NPMIix#J_~@f8*vmM{LR!{dPhC;81#)dboJ^ZB{G+*`5^f;_?;-w7UaXQL@W@tRlOXy=z=G>p9*YXQ$F@3kL<&^nc~ap`6Ezu zmU_NLk+~aj&p9v0w!}=U<16L~R zlF!xFu`4Lt=(|09ogKc;>DAitmdUbJGJTUI_c`+bdC)&cPGS%GE6}L%xGZq016|D! z;!5&HgqBc;$WMmHhs6BgXY{XKAPQ`a+p!AL7g6w>+k577O7lN#PC+jxfyLcoabHCV zYKg_2c4g%IoyC6870?+3;*}slvpix4LywXU`cHnN%WAi)N^TtFzxs7{4+KcT7w za0hXSYjuM+6_V@Y6}WyVs{+79Ss$k?XJt`=3Q$=saxi64nZ>AJ{!~^YdDwFYs=1cr zkcAa($H_HOQz)mE^a*x!oSAy%!owbtvpK3{(X4U?3G0J|vOJUj$xy(Ih11hG=8n0g zU9yXL_Rn$l*Ekuxec4?(eK}a6dQScHgI5R6s4F+ZPVh9w15W`t;$w+0D!4-)DM zHWDs`hb~m-i+LvJd<$_Hzgq*CqSqZ=4R4E58f5z9jfh1Ff_w>1Q$#Jt

    XY^6qq*n&7H0=>RPZv22zB~| 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%0D((yV!rKoI4 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 diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.worker.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.worker.js deleted file mode 100644 index 66d9cfc..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-mt-wasm.worker.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";var Module={};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){var nodeWorkerThreads=require("worker_threads");var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(nodeFS.readFileSync(f,"utf8"))},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);receiveInstance(instance);Module["wasmModule"]=null;return instance.exports};self.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}OGVDecoderVideoVP9SIMDMTW(Module).then(function(instance){Module=instance})}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0,1);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInit();try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(Module["keepRuntimeAlive"]()){Module["PThread"].setExitStatus(result)}else{Module["__emscripten_thread_exit"](result)}}catch(ex){if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["keepRuntimeAlive"]()){}else{Module["__emscripten_thread_exit"](ex.status)}}else{throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}}; diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-wasm.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-wasm.js deleted file mode 100644 index ecb83b1..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-decoder-video-vp9-simd-wasm.js +++ /dev/null @@ -1,45 +0,0 @@ - -var OGVDecoderVideoVP9SIMDW = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoVP9SIMDW) { - OGVDecoderVideoVP9SIMDW = OGVDecoderVideoVP9SIMDW || {}; - - -var a;a||(a=typeof OGVDecoderVideoVP9SIMDW !== 'undefined' ? OGVDecoderVideoVP9SIMDW : {});var aa=Object.assign,ba,n;a.ready=new Promise(function(b,c){ba=b;n=c});var ca=a,ha=aa({},a),ia="object"===typeof window,p="function"===typeof importScripts,r="",v,w,x,fs,z,D; -if("object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node)r=p?require("path").dirname(r)+"/":__dirname+"/",D=function(){z||(fs=require("fs"),z=require("path"))},v=function(b,c){D();b=z.normalize(b);return fs.readFileSync(b,c?null:"utf8")},x=function(b){b=v(b,!0);b.buffer||(b=new Uint8Array(b));return b},w=function(b,c,e){D();b=z.normalize(b);fs.readFile(b,function(d,f){d?e(d):c(f.buffer)})},1=P.length&&(P.length=b+1),P[b]=c=oa.get(b));return c} -var Sa={m:function(){throw"longjmp";},k:function(b,c,e){ma.copyWithin(b,c,c+e)},l:function(b){var c=ma.length;b>>>=0;if(2147483648=e;e*=2){var d=c*(1+.2/e);d=Math.min(d,b+100663296);d=Math.max(b,d);0>>16);na();var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},a:function(){return ja},d:Ka,f:La,i:Ma,g:Na,e:Oa,c:Pa,j:Qa,h:Ra,n:function(b,c,e,d,f,g,h,k,q,t,u,J,Q,R,da,ea){function fa(E, -l,A,za,Aa,Ba,Ua,Va,S){E.set(new Uint8Array(Wa,l,A*za));var B,y;for(B=y=0;B=d||(X&&a._free(X),Ya=d,X=a._malloc(Ya));var f=X;(new Uint8Array(I.buffer,f,d)).set(new Uint8Array(b));return a._ogv_video_decoder_process_header(f,d)});c(e)};a.C=[]; -a.processFrame=function(b,c){function e(k){a._free(g);c(k)}var d=a._ogv_video_decoder_async(),f=b.byteLength,g=a._malloc(f);d&&a.C.push(e);var h=Z(function(){(new Uint8Array(I.buffer,g,f)).set(new Uint8Array(b));return a._ogv_video_decoder_process_frame(g,f)});d||e(h)};a.close=function(){};a.sync=function(){a._ogv_video_decoder_async()&&(a.C.push(function(){}),Z(function(){a._ogv_video_decoder_process_frame(0,0)}))};a.recycledFrames=[]; -a.recycleFrame=function(b){var c=a.recycledFrames;c.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�! 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 { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoVP9W) { - OGVDecoderVideoVP9W = OGVDecoderVideoVP9W || {}; - - -var a;a||(a=typeof OGVDecoderVideoVP9W !== 'undefined' ? OGVDecoderVideoVP9W : {});var aa=Object.assign,ba,n;a.ready=new Promise(function(b,c){ba=b;n=c});var ca=a,ha=aa({},a),ia="object"===typeof window,p="function"===typeof importScripts,r="",v,w,x,fs,z,D; -if("object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node)r=p?require("path").dirname(r)+"/":__dirname+"/",D=function(){z||(fs=require("fs"),z=require("path"))},v=function(b,c){D();b=z.normalize(b);return fs.readFileSync(b,c?null:"utf8")},x=function(b){b=v(b,!0);b.buffer||(b=new Uint8Array(b));return b},w=function(b,c,e){D();b=z.normalize(b);fs.readFile(b,function(d,f){d?e(d):c(f.buffer)})},1=P.length&&(P.length=b+1),P[b]=c=oa.get(b));return c} -var Sa={m:function(){throw"longjmp";},k:function(b,c,e){ma.copyWithin(b,c,c+e)},l:function(b){var c=ma.length;b>>>=0;if(2147483648=e;e*=2){var d=c*(1+.2/e);d=Math.min(d,b+100663296);d=Math.max(b,d);0>>16);na();var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},a:function(){return ja},d:Ka,f:La,i:Ma,g:Na,e:Oa,c:Pa,j:Qa,h:Ra,n:function(b,c,e,d,f,g,h,k,q,t,u,J,Q,R,da,ea){function fa(E, -l,A,za,Aa,Ba,Ua,Va,S){E.set(new Uint8Array(Wa,l,A*za));var B,y;for(B=y=0;B=d||(X&&a._free(X),Ya=d,X=a._malloc(Ya));var f=X;(new Uint8Array(I.buffer,f,d)).set(new Uint8Array(b));return a._ogv_video_decoder_process_header(f,d)});c(e)};a.C=[]; -a.processFrame=function(b,c){function e(k){a._free(g);c(k)}var d=a._ogv_video_decoder_async(),f=b.byteLength,g=a._malloc(f);d&&a.C.push(e);var h=Z(function(){(new Uint8Array(I.buffer,g,f)).set(new Uint8Array(b));return a._ogv_video_decoder_process_frame(g,f)});d||e(h)};a.close=function(){};a.sync=function(){a._ogv_video_decoder_async()&&(a.C.push(function(){}),Z(function(){a._ogv_video_decoder_process_frame(0,0)}))};a.recycledFrames=[]; -a.recycleFrame=function(b){var c=a.recycledFrames;c.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 diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-ogg-wasm.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-ogg-wasm.js deleted file mode 100644 index 2c1a1c1..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-ogg-wasm.js +++ /dev/null @@ -1,43 +0,0 @@ - -var OGVDemuxerOggW = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDemuxerOggW) { - OGVDemuxerOggW = OGVDemuxerOggW || {}; - - -var a;a||(a=typeof OGVDemuxerOggW !== 'undefined' ? OGVDemuxerOggW : {});var h=Object.assign,k,l;a.ready=new Promise(function(b,c){k=b;l=c});var m=h({},a),n="object"===typeof window,p="function"===typeof importScripts,q="",r,t,u,fs,v,w; -if("object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node)q=p?require("path").dirname(q)+"/":__dirname+"/",w=function(){v||(fs=require("fs"),v=require("path"))},r=function(b,c){w();b=v.normalize(b);return fs.readFileSync(b,c?null:"utf8")},u=function(b){b=r(b,!0);b.buffer||(b=new Uint8Array(b));return b},t=function(b,c,d){w();b=v.normalize(b);fs.readFile(b,function(e,f){e?d(e):c(f.buffer)})},1=T.length&&(T.length=b+1),T[b]=c=G.get(b));return c} -var ca={},da={d:function(b,c,d){D.copyWithin(b,c,c+d)},e:function(b){var c=D.length;b>>>=0;if(2147483648=d;d*=2){var e=c*(1+.2/d);e=Math.min(e,b+100663296);e=Math.max(b,e);0>>16);F();var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},f:function(b,c,d,e){b=ca.C(b);c=ca.A(b,c,d);E[e>>2]=c;return 0},a:function(b,c,d,e){var f=A.buffer;a.audioPackets.push({data:f.slice?f.slice(b,b+c): -(new Uint8Array(new Uint8Array(f,b,c))).buffer,timestamp:d,discardPadding:e})},c:function(b,c){function d(e){for(var f="",g=new Uint8Array(A.buffer);0!=g[e];e++)f+=String.fromCharCode(g[e]);return f}b&&(a.videoCodec=d(b));c&&(a.audioCodec=d(c));b=a._ogv_demuxer_media_duration();a.duration=0<=b?b:NaN;a.loadedMetadata=!0},b:function(b,c,d,e,f){var g=A.buffer;a.videoPackets.push({data:g.slice?g.slice(b,b+c):(new Uint8Array(new Uint8Array(g,b,c))).buffer,timestamp:d,keyframeTimestamp:e,isKeyframe:!!f})}}; -(function(){function b(f){a.asm=f.exports;A=a.asm.g;F();G=a.asm.s;I.unshift(a.asm.h);K--;a.monitorRunDependencies&&a.monitorRunDependencies(K);0==K&&(null!==L&&(clearInterval(L),L=null),M&&(f=M,M=null,f()))}function c(f){b(f.instance)}function d(f){return ba().then(function(g){return WebAssembly.instantiate(g,e)}).then(function(g){return g}).then(f,function(g){x("failed to asynchronously prepare wasm: "+g);z(g)})}var e={a:da};K++;a.monitorRunDependencies&&a.monitorRunDependencies(K);if(a.instantiateWasm)try{return a.instantiateWasm(e, -b)}catch(f){return x("Module.instantiateWasm callback failed with error: "+f),!1}(function(){return y||"function"!==typeof WebAssembly.instantiateStreaming||N()||O.startsWith("file://")||"function"!==typeof fetch?d(c):fetch(O,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(c,function(g){x("wasm streaming compile failed: "+g);x("falling back to ArrayBuffer instantiation");return d(c)})})})().catch(l);return{}})(); -a.___wasm_call_ctors=function(){return(a.___wasm_call_ctors=a.asm.h).apply(null,arguments)};a._ogv_demuxer_init=function(){return(a._ogv_demuxer_init=a.asm.i).apply(null,arguments)};a._ogv_demuxer_receive_input=function(){return(a._ogv_demuxer_receive_input=a.asm.j).apply(null,arguments)};a._ogv_demuxer_process=function(){return(a._ogv_demuxer_process=a.asm.k).apply(null,arguments)};a._ogv_demuxer_destroy=function(){return(a._ogv_demuxer_destroy=a.asm.l).apply(null,arguments)}; -a._ogv_demuxer_media_length=function(){return(a._ogv_demuxer_media_length=a.asm.m).apply(null,arguments)};a._ogv_demuxer_media_duration=function(){return(a._ogv_demuxer_media_duration=a.asm.n).apply(null,arguments)};a._ogv_demuxer_seekable=function(){return(a._ogv_demuxer_seekable=a.asm.o).apply(null,arguments)};a._ogv_demuxer_keypoint_offset=function(){return(a._ogv_demuxer_keypoint_offset=a.asm.p).apply(null,arguments)}; -a._ogv_demuxer_seek_to_keypoint=function(){return(a._ogv_demuxer_seek_to_keypoint=a.asm.q).apply(null,arguments)};a._ogv_demuxer_flush=function(){return(a._ogv_demuxer_flush=a.asm.r).apply(null,arguments)};a._malloc=function(){return(a._malloc=a.asm.t).apply(null,arguments)};a._free=function(){return(a._free=a.asm.u).apply(null,arguments)};var U;M=function ea(){U||V();U||(M=ea)}; -function V(){function b(){if(!U&&(U=!0,a.calledRun=!0,!B)){R(I);k(a);if(a.onRuntimeInitialized)a.onRuntimeInitialized();if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;){var c=a.postRun.shift();J.unshift(c)}R(J)}}if(!(0=d||(W&&a._free(W),X=d,W=a._malloc(X));var e=W;(new Uint8Array(A.buffer,e,d)).set(new Uint8Array(b));a._ogv_demuxer_receive_input(e,d)});c()};a.process=function(b){var c=Z(function(){return a._ogv_demuxer_process()});b(!!c)}; -a.dequeueVideoPacket=function(b){if(a.videoPackets.length){var c=a.videoPackets.shift().data;b(c)}else b(null)};a.dequeueAudioPacket=function(b){if(a.audioPackets.length){var c=a.audioPackets.shift();b(c.data,c.discardPadding)}else b(null)};a.getKeypointOffset=function(b,c){var d=Z(function(){return a._ogv_demuxer_keypoint_offset(1E3*b)});c(d)}; -a.seekToKeypoint=function(b,c){var d=Z(function(){return a._ogv_demuxer_seek_to_keypoint(1E3*b)});d&&(a.audioPackets.splice(0,a.audioPackets.length),a.videoPackets.splice(0,a.videoPackets.length));c(!!d)};a.flush=function(b){Z(function(){a.audioPackets.splice(0,a.audioPackets.length);a.videoPackets.splice(0,a.videoPackets.length);a._ogv_demuxer_flush()});b()};a.close=function(){}; - - - return OGVDemuxerOggW.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = OGVDemuxerOggW; -else if (typeof define === 'function' && define['amd']) - define([], function() { return OGVDemuxerOggW; }); -else if (typeof exports === 'object') - exports["OGVDemuxerOggW"] = OGVDemuxerOggW; diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-ogg-wasm.wasm b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-ogg-wasm.wasm deleted file mode 100755 index cceb85dde97c3e857cd82583d884904b30498eae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39042 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 WmoNKo_YXe%hgiV=B--6~-v0$@_K?T` diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-webm-wasm.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-webm-wasm.js deleted file mode 100644 index 6351025..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-webm-wasm.js +++ /dev/null @@ -1,46 +0,0 @@ - -var OGVDemuxerWebMW = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDemuxerWebMW) { - OGVDemuxerWebMW = OGVDemuxerWebMW || {}; - - -var a;a||(a=typeof OGVDemuxerWebMW !== 'undefined' ? OGVDemuxerWebMW : {});var h=Object.assign,k,l;a.ready=new Promise(function(b,c){k=b;l=c});var m=h({},a),n="object"===typeof window,q="function"===typeof importScripts,r="",t,u,v,fs,w,A; -if("object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node)r=q?require("path").dirname(r)+"/":__dirname+"/",A=function(){w||(fs=require("fs"),w=require("path"))},t=function(b,c){A();b=w.normalize(b);return fs.readFileSync(b,c?null:"utf8")},v=function(b){b=t(b,!0);b.buffer||(b=new Uint8Array(b));return b},u=function(b,c,d){A();b=w.normalize(b);fs.readFile(b,function(e,f){e?d(e):c(f.buffer)})},1=e);)++d;if(16f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}return e}function J(b){return b?I(K,b,void 0):""}var L,K,M; -function N(){var b=E.buffer;L=b;a.HEAP8=new Int8Array(b);a.HEAP16=new Int16Array(b);a.HEAP32=M=new Int32Array(b);a.HEAPU8=K=new Uint8Array(b);a.HEAPU16=new Uint16Array(b);a.HEAPU32=new Uint32Array(b);a.HEAPF32=new Float32Array(b);a.HEAPF64=new Float64Array(b)}var ba,ca=[],da=[],ea=[];function fa(){var b=a.preRun.shift();ca.unshift(b)}var O=0,P=null,Q=null;a.preloadedImages={};a.preloadedAudios={}; -function D(b){if(a.onAbort)a.onAbort(b);b="Aborted("+b+")";B(b);F=!0;b=new WebAssembly.RuntimeError(b+". Build with -s ASSERTIONS=1 for more info.");l(b);throw b;}function ha(){return R.startsWith("data:application/octet-stream;base64,")}var R;R="ogv-demuxer-webm-wasm.wasm";if(!ha()){var ia=R;R=a.locateFile?a.locateFile(ia,r):r+ia}function ja(){var b=R;try{if(b==R&&C)return new Uint8Array(C);if(v)return v(b);throw"both async and sync fetching of the wasm failed";}catch(c){D(c)}} -function ka(){if(!C&&(n||q)){if("function"===typeof fetch&&!R.startsWith("file://"))return fetch(R,{credentials:"same-origin"}).then(function(b){if(!b.ok)throw"failed to load wasm binary file at '"+R+"'";return b.arrayBuffer()}).catch(function(){return ja()});if(u)return new Promise(function(b,c){u(R,function(d){b(new Uint8Array(d))},c)})}return Promise.resolve().then(function(){return ja()})} -function S(b){for(;0=T.length&&(T.length=b+1),T[b]=c=ba.get(b));return c} -var ma=[null,[],[]],na={a:function(b,c,d,e){D("Assertion failed: "+J(b)+", at: "+[c?J(c):"unknown filename",d,e?J(e):"unknown function"])},f:function(){D("")},d:function(b,c,d){K.copyWithin(b,c,c+d)},e:function(b){var c=K.length;b>>>=0;if(2147483648=d;d*=2){var e=c*(1+.2/d);e=Math.min(e,b+100663296);e=Math.max(b,e);0>>16);N();var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},b:function(b, -c,d,e){for(var f=0,g=0;g>2],G=M[c+4>>2];c+=8;for(var x=0;x>2]=f;return 0},c:function(b,c,d,e){var f=E.buffer;a.audioPackets.push({data:f.slice?f.slice(b,b+c):(new Uint8Array(new Uint8Array(f,b,c))).buffer,timestamp:d,discardPadding:e})},j:function(b,c,d,e,f,g,p,G,x,y,z){a.videoFormat={width:b,height:c,chromaWidth:d,chromaHeight:e,cropLeft:G,cropTop:x,cropWidth:g,cropHeight:p,displayWidth:y, -displayHeight:z,fps:f}},h:function(b,c){function d(e){for(var f="",g=new Uint8Array(E.buffer);0!=g[e];e++)f+=String.fromCharCode(g[e]);return f}b&&(a.videoCodec=d(b));c&&(a.audioCodec=d(c));b=a._ogv_demuxer_media_duration();a.duration=0<=b?b:NaN;a.loadedMetadata=!0},i:function(b,c){if(a.onseek)a.onseek(b+4294967296*c)},g:function(b,c,d,e,f){var g=E.buffer;a.videoPackets.push({data:g.slice?g.slice(b,b+c):(new Uint8Array(new Uint8Array(g,b,c))).buffer,timestamp:d,keyframeTimestamp:e,isKeyframe:!!f})}}; -(function(){function b(f){a.asm=f.exports;E=a.asm.k;N();ba=a.asm.w;da.unshift(a.asm.l);O--;a.monitorRunDependencies&&a.monitorRunDependencies(O);0==O&&(null!==P&&(clearInterval(P),P=null),Q&&(f=Q,Q=null,f()))}function c(f){b(f.instance)}function d(f){return ka().then(function(g){return WebAssembly.instantiate(g,e)}).then(function(g){return g}).then(f,function(g){B("failed to asynchronously prepare wasm: "+g);D(g)})}var e={a:na};O++;a.monitorRunDependencies&&a.monitorRunDependencies(O);if(a.instantiateWasm)try{return a.instantiateWasm(e, -b)}catch(f){return B("Module.instantiateWasm callback failed with error: "+f),!1}(function(){return C||"function"!==typeof WebAssembly.instantiateStreaming||ha()||R.startsWith("file://")||"function"!==typeof fetch?d(c):fetch(R,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(c,function(g){B("wasm streaming compile failed: "+g);B("falling back to ArrayBuffer instantiation");return d(c)})})})().catch(l);return{}})(); -a.___wasm_call_ctors=function(){return(a.___wasm_call_ctors=a.asm.l).apply(null,arguments)};a._ogv_demuxer_init=function(){return(a._ogv_demuxer_init=a.asm.m).apply(null,arguments)};a._ogv_demuxer_receive_input=function(){return(a._ogv_demuxer_receive_input=a.asm.n).apply(null,arguments)};a._ogv_demuxer_process=function(){return(a._ogv_demuxer_process=a.asm.o).apply(null,arguments)};a._ogv_demuxer_destroy=function(){return(a._ogv_demuxer_destroy=a.asm.p).apply(null,arguments)}; -a._ogv_demuxer_flush=function(){return(a._ogv_demuxer_flush=a.asm.q).apply(null,arguments)};a._ogv_demuxer_media_length=function(){return(a._ogv_demuxer_media_length=a.asm.r).apply(null,arguments)};a._ogv_demuxer_media_duration=function(){return(a._ogv_demuxer_media_duration=a.asm.s).apply(null,arguments)};a._ogv_demuxer_seekable=function(){return(a._ogv_demuxer_seekable=a.asm.t).apply(null,arguments)}; -a._ogv_demuxer_keypoint_offset=function(){return(a._ogv_demuxer_keypoint_offset=a.asm.u).apply(null,arguments)};a._ogv_demuxer_seek_to_keypoint=function(){return(a._ogv_demuxer_seek_to_keypoint=a.asm.v).apply(null,arguments)};a._malloc=function(){return(a._malloc=a.asm.x).apply(null,arguments)};a._free=function(){return(a._free=a.asm.y).apply(null,arguments)};var U;Q=function oa(){U||V();U||(Q=oa)}; -function V(){function b(){if(!U&&(U=!0,a.calledRun=!0,!F)){S(da);k(a);if(a.onRuntimeInitialized)a.onRuntimeInitialized();if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;){var c=a.postRun.shift();ea.unshift(c)}S(ea)}}if(!(0=d||(W&&a._free(W),X=d,W=a._malloc(X));var e=W;(new Uint8Array(E.buffer,e,d)).set(new Uint8Array(b));a._ogv_demuxer_receive_input(e,d)});c()};a.process=function(b){var c=Z(function(){return a._ogv_demuxer_process()});b(!!c)}; -a.dequeueVideoPacket=function(b){if(a.videoPackets.length){var c=a.videoPackets.shift().data;b(c)}else b(null)};a.dequeueAudioPacket=function(b){if(a.audioPackets.length){var c=a.audioPackets.shift();b(c.data,c.discardPadding)}else b(null)};a.getKeypointOffset=function(b,c){var d=Z(function(){return a._ogv_demuxer_keypoint_offset(1E3*b)});c(d)}; -a.seekToKeypoint=function(b,c){var d=Z(function(){return a._ogv_demuxer_seek_to_keypoint(1E3*b)});d&&(a.audioPackets.splice(0,a.audioPackets.length),a.videoPackets.splice(0,a.videoPackets.length));c(!!d)};a.flush=function(b){Z(function(){a.audioPackets.splice(0,a.audioPackets.length);a.videoPackets.splice(0,a.videoPackets.length);a._ogv_demuxer_flush()});b()};a.close=function(){}; - - - return OGVDemuxerWebMW.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = OGVDemuxerWebMW; -else if (typeof define === 'function' && define['amd']) - define([], function() { return OGVDemuxerWebMW; }); -else if (typeof exports === 'object') - exports["OGVDemuxerWebMW"] = OGVDemuxerWebMW; diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-webm-wasm.wasm b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-demuxer-webm-wasm.wasm deleted file mode 100755 index fbdfd0a72bb4249390fd7f199b7b6c168bb0e251..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43838 zcmcJ&3z%Kib?3RyIrmxTR@JRi2}&y2oO=+lWDpjKd6@9fF1?L}WDo>rJYON8uvI1W zs4B_0BdN+kA#_i=L%wl$6UUhlI|;-=8PawV5<7#^lVq4N>7m>14&O|ALLOi29(%sf zJ;|8vIAMPOwa>ZtmQ=#nofPQabIyLP_g;JLwa;}2=O2ljbJ1s`HTNfri;L0X{T03z z-Tl#GbVeVG_s6?F9sm16NaGbGX#!e6*W&X*H^}Eh;BhdT zb_t&kyBeP#c0+uA#8vn_WS=u`IJx2adeUsyT|G$#Mw$a|v{{d9Nux3lC99&b)h@ZL zetDx-tEAC*;u=vUuDT>?)GF2JSd^yKdK4|iOG|OB33dF^%je^?e(P{F8@uSRTNgdz zZi|k%8>6G{`skRuHahM$MRV?&Xx?2NEx22w6YiGir2GEpqmhdqb)(V8+(5G(IUl71 z*WLWSn{N2N_kQo@_YC~>XXEQ%ZbkLQcuVHC54z0x#%!MORhiuoyFBub9?#uOr%HL` zqvO$#En**s>OJx22chC zjWtj?Kws4;RUJPzlg9$K0{n?@_wKywM6D=Iwq$Xqo>joNziLF)4r6bK+iIF-b?<;E z&1w*!9DH3K`*^{B{(o~bd4)khBdZ8rNHG}sC%}k*0i(E!QO&pgSXQIwEZH$JQ`Fx+ z2yRhUyCEJIHtjqX{e*Qp&|ut9AIoELzzW8S0rUGVr!h zdVP1fKbQyzBbo%lE*P&`NQZjlap+MM`L}Y9{m@D#8MG5%46+62myj(=-a@t@_j1_^ zR1C6J6-5f!3ImjaE}`w0NE5T_GTEvA-H4fxG&sHsF$1|iF{}2A8E6(_24X9U8P843 zkYdSSDP|Iui$tiW?g)G-b>j0|$z4i6fq70A0kI7h0lqF4HUP~+$`^7ZGS~*eg7hMD z5_e>!k)od_Kn+-eWVQrf_>!#{PW=_sNG9Els1O6b`DR_V2s6i!fVcFwx6k`CQ#9xvpTtm2oJhV4mwJg+SH;gbeMR+*ax=xBlABfom)B-U}xuftx5 zM2x+Tz6!h0iQ+B#uP_8yKk!({>xLG_0eew5w6LneE|GAJ8;aifHFOl6oaOV19TN+| z9$~hyS&+K@4UI>C zjoj$jq60mJx6l)Fq$UM*8>#;}w3UA{Ytd}({9@)N06k52#hTHPT6ZpwpMgS)BG+X0 z#4{66J(`1>mE9A0)E>=?38yl<$sq!=I@Exg?KSW={jDfU=v8Hz2t}7sC*c!@=Vp>! zg>q!9{SFyJ$zjwPBDDF52$czxCGB^SjGa76F z(<$u$;j(pB(bUF+nU4Cb%myZmb*hqa9<^7~Kx1d|47!r?cO;4yuXKJXp3ST49b+R$ z=PQ~(5yw5Uw(#f8=(uiY5%eXKy?A#XO|;i!5eN%DOyyGCZoyM^6w}}ipo2U#=ebPj zQarQXr6;3!Q4Kc4>+(nfE^u0sLcTGLkV-RPd%*4~Dz2*DrQy=b+5<>|X;!9g=uzDS zbStXIzt}{HO6`I4zck`1>;}>HY+f-u0U;CljRkIF(!McqsfTr$O zsF#$BVUy(`7vpjYB^8F<+ig;c(s$OV5T);|Q6Wm-S))RfzOzP!D18Twu(!+1MJB(u zYbk>DVDh*j&Llr=3|^L`_uBk`eaBXsFA#iudJ1OCVREourP)dfvlU~)WN`G=9>78P zx8wfF5&y#@{?m=NbLoC8sb9KHCJ8C^$&5dRClK7t*gGsjw08ndyW25(3z}(MTeCbo1z5;b7ILNk80asxNGcs4{5Bq?Gd8#TlnJvgCn+{R z32|obSe(b>V7@_95?mzzc~(;by5buFSewh40d1YtU0&f5p2?E14ncdC`LPfeWw727 zTO>qGd2*BFW!SQz#gtPo-1K~4ujXCN%vfLi8BN}9b}nPSUtrZ}cgJmF1(()IjB-Gr zYVH;jp{hEe6raR8=dODnoy0;fzmK~21;(z2v1T}W3W#a}CNh?Y=B%b{vZ01N82E=< zBRLYCz!=IJvRtt+EC`U*wXO|IB~c+bW&==uV7a$iu4OtEEK|)xkmder%^bU`ED=Tl ze>Gz2#+7P-yLnWVtSYc@HUyTfhwvW5>J10XLGsdXY|2?_Lf7W(-v?bwchy9{a4hSy z(xOhBY>ClGtreWqjjJ*FZ(xNknF|WRAfDWr-FZAgD+rx&0ogk-=$msk-VxsNDe{WN z2F%~=Evw*1AO@^zwA7}%sIqZsDF_CE$=2p+0xX@X9JyXaGsCuWM+K-Ze-1xKv>ZtN zqUL?(4jd`IQx>l%S*PAdV@a;?E);c9x42ommh;ay|2-i14LO?h*SwQtQQ(I^P zQHRx{6QaVZA2sBnSo50!b^XGLiYf|a!r7DwDWgRuoI%<|4b4$31OYP$XP*=^RDW2h zUpO&JUE3OKG6*rWV$p+s(QqG+wZaAx7h)%}T9R$)TVb%!!6KrR(4$#5NlqDoQ3s|D zB3NPk)Fh{muBDe_B?F1d&_@XM=m)PE&VO7j|*-4zo2o|(MK zO#6plVoXQ3e`Xhg^J`ynlZ!Wk-)mefJ-x(VMYmMVQs0{K$Bz3~Kl^V#Tb&mXUjI@+ z#-A@Qma;UDX3!ug!s?4zC#&xrZ2B+S2ziCUJ|8Z@U-MhCcaWt`R=Hyk`#?9F9P!WN zgB2No61jv{zw;$$%SOcAY$VK(G(a=vhdTzPSZ2?pGTyaEwEEpKh>qb}f{WTDVLr5# z3?e%#uFU{wGJAZcQzKv_P^&2Q-v%pFT@mVoongg}kF&bU%9E@6Z_0pKlK)l;c z#VQ!AfypyFWJ6J?7*!IKGAf&Avf5rOMPLPlX=b%qK^M&u9w|TqXGhSKQKI&UUo|^93K{jt%NMXvF_0oAds*)C}3b-_=I%EA15&^_!NOg7Y}pH zOTD#Oz~!;@)|%nnGCOuP7i;HI%`wI{z9a+zYiN5hov~o0eTB4-W^qB0xS$9&hy9bS-ZLz>OIbaBD6BR$PrW zriddiN831M)Rn!5hVAsQu8{bZ+cAlDC71yVH@deSlVOn8AbSRF=3-jrPzicSlykfVVSA7f_n;0Gb8sgq!ag|;Y{zD!}aP$!x__7 z7jm!V(XqNfEHVTILDE-?iJH#!1#AtO;VV?78wW>H84Q`|^I)+=_T=q&u*qE3^MgUycR~0*m~_=JR4f@OfSEdChBM zLct0|Is0Yi`Vt($dWTRrwHLrws|AI^%|Wv`xb@zqcO)1lHcDcNbh7gDasJNDs}_F# zU4)N=wdPt^6Eprj7)ThVEhAR?u_uy_2kT${lG_;D#)VlvyKd+yWerTRTVbjx=M<`p z&vYD=aUS`_7p6%E`SAp?MP)+Ta0uxXxmdo7dSQ=HYl14#+^&Se0VrLFCp)+QmEy^A zSK?`_UdEDmVwgqvN)XR#kQYWQc57IwUnHg9?K(@8ST3bD_&Oe!;+e!<@kC9fa{b~N zHlUasMHLoVg?M6%Sdv{Jp2%b=o zfl4BsY&$izO=B9K=nDasEgTOLUFv&Eu)utH94?s$npj8hS50h9JRU|Vd0?V1+l)Ub zS5S(eCDM22>|<}bfiTDHYMU^Mlg3-L&g$ROv?;A}v9$(;Ga38lc@uieLFwDltXyQO zZRb3!!!9<}JYUgN15DzFWqX-(Yz$Unia=+6x$$MvXXu< zmAg(o*^yDF$YUAGznjzADXlKgxx^s6Lxc5 zg29moVftZyNh8Q5Z7-6`;6Z6BLL@>`M=6(uR5r|kXvl$xB$c761;}i!84qrY90=4u zI1rlI4Aw#_tw0Wh74)Q1feo#!yHY8K{sO7QODT%Ef>d3pv{-=Rh*>vy+4c51{lUw? zLZ-bw_u``9r7RxM$$s;tsHGVcgM6jnr51XkaLU5n!uBrROME?xSYqSaY_a{_JW)Ib zKv~%!3zQLXR0)&1BA)m?Vd}EfBI>bP#lvUXnoS>z;-uJbo>ZWqeE)| zGjo#zOL=v2;LPb~{N}lvot~gLZ~jbluRQY(!&{%#XOwc&YpG4yfg^e12M*5`4P)QD zL(VDfloJGo>E9&6DfUYhtt>RV#_eP+2@rJ4mT_#)=C#Fb+t_l-xdP1Kxb;3r!!fkPD+r*uTds7Xy$Q#57!PRW{1%)X7Hy#qluLZ4H+0Kf3R4WR&z`Y8 z%+9h2rUcTi#)?!A9C~S%JzHnV462v00~4ODzad^9t~T5dZwOb{+z?+AuGsn59IoDb zL;T)wb<+*;P2uX68{%8QY|Cs%n!QDF;|g<)7HwI~I(`}SOpRhb7C=%hMAKkSDy-;B z63Px%a9M0OCQ$W4N`eUjb+e-@UBx#$c&n@AW@r9k-zWt%BD4vE)w`Gu{Y z(P9}emS&!h6c!a9*g0-Y{&I8|R*j*xE)p{(-!{tm$E&h+O_9_CTs1A=`8P&Ge z|32WCY}?C!bB*r*UCn=GP}^X?8?mz=TOtS2Q>f@UgBoIwA4bsF(b||`2z+Dq`q-Tk zs_ndS`X1Z{mT%yWnE**DsCo@TuwJ%xRQ=qkAAk~=<{2tAPd~##lmbOMSTK_hA(u44 z7f#5mfF^XDCFf4%wp&jLB2&^qv#vG(08*IYwQ5ZtG=$B!kFtJJI*R_YO4c%f%9hJL z(4SVuiv$3(=m%_1Ba7H?_KVOGKl-p@qj7<4TwvQFyoDEikA$#S+b-MQrLV`uz*%g} z%n&^g(V`uHVK&^N(NbI*NgC}7Tkn&iIPr0}V!c~Y=?#_c^QJxbbTW&1$WamrGkGQc z<3D`1aX3T>L`_y5wvWl0n%2QEcx#Ph$RyYoBmuur9Qjta;u;NOHIxZN{ju<+R3h$J z;6t9W*;w~#ynD5->`Krd_v3RpmO1vBfq!oD<1*c6;3N2>h{z7I0Sm$xbE@vNb;K8R z@>$TF039rzTtcyBbSwEd#M)2%^asFGsCwlsyTq9ST<%nDxizevdW|n&rtEEPqE>_R@PiTLdAUQ(%lx+{Zfy2eW9SYj*|<%wdH1(imZRF*ND! zrUhVU9XLWtP{*<<+8yY=F?l7*22V+<>0Pd&HLQ$ONx)`YsGUKe8m?BAv_^d}hxiAS;15&D((9&$^ zQs`y_0o`HggUeFoASKFTGxT7XBHymV?vY|?q(&%{ugGe6Y}kK!K<1n}v4(fgiNTZS z&)(Xxd6Xy5vj1-Du8r>LC{Op(p9Fw;N%11C1ocai2?k?ZYu(Zpy#T87Xs%%psLmD*^OOQ1w6X97ig zlMRX0sXUbo(f^8s6X7K%P{t5gPe0nU5MKWLD$RAjJLLbLRK#IJLL^%h68^kY;%)a0 zM9M&+Z>Etr)#MzMGnY)$&Ef|JBX)}0?+%Xx`_gB!R4I{dR_#p1Pu}K{9V92^CZwbM z$f*B!Ey3o0(O~^z&Hoc)}7 z;;pQuB27vy=?ekVyaiX~dno+d3jz1?*QpYcq@lCb?grrFB80!&GW#_*z<2Zo3JaF* zmZ@^_Ns3`+m5y@1-cGN(uRs$W$LhY$k`U&>Hj^=a?0k)%? zh@bdK8D1g4gGrE}hX9WlrAb|h_)JKe7_o^`dj<$!(tZq^67kK^!JX?yt#F61J?KQ= z21MneM0~a+tWGb51}!HMA4QoXjZ9u(w7~Fjf7A-91LyKYeDX;S zbtfGq7e`-QNSTG81+N&SKMkMVA}ki>Dv<!AbB6UMYBm-;Go$cvYt1+s2g* zpgkn?TxO&sn8+tHASE(lD#Btkbs@ZKEeg^$()1?`rN!fZ=|!R^GP9~?F;Cd!Z>Jz4EW()F)lT~Jx^q6(CO!?fP<}qysmte+eIa=&}!jO0(5oa-e+T)9*$HTe!~jmzn9IU zOMu22roZUoA@G5ykj@o3w(c6Jx_QSi^x!`P}T&0CX)EQ8Zn*hu18Q!yOXP0FUjqs_+6(WGtVV4EmTmGsLjvUBRVvPl= zL$mqi?;k|XP14aJoz;j2YmjS|k2*TfV9-S+@=8HduYSGGJrs|v?rNXNw+9M#_cg)q z0rz1#ppwf6J!{|=YhY=3$IkHZ<$-G$R%Bl#JH9hBB#l+54k3YRZ7G_ zh@kLtYa)bn0y7((QNK=NC{_DwB0oEJ z57J>^@t|6&gjCx>1hkQj`kN2W_@B9AMhbvz%=(6OO=^M6Pspoc?<37tL07ITT*M0m z=EOjvaoi>gGiDIB$g?G|32BMj(lt3j?M|Tcpvu&RlIR=*Q;+r5FdFeg$MaS;95{7+ z0%jn<{->IqRoPf)AZVwg>!K@rf&fOd67|SW;ckNDFg`VTs!=w|IWqsMn;q&@#)`k8 zvEka#(9l>-_i;5D8*7e5V`G>|X^j7ED%Xd`(lP2_Z6g0=w_~u`T7~FrOty5!fr`bT z!0&<+fEbmv7-~4S8!Bt7wY4UbTe2Z&)Z(}r%q(u0&cn@f*w5DG<=yv3u60>?!xYt8 zUEZjNvGT?m0S)`M`gg|!yl?o%95j0api&4XsI%jpQG+-i-;V)9Bse3%@q%pp8Byo? zE5+(;)HXWCCx`FFR*g?qp6HBcEorqi-Os*1U1J{-daRrT^%)FKj3%-08H0f$Np}E* zPg^MrK&n~TLK&Z|-wQb7lZkpxt>=gbp;xv5v$0?k<(+2DT_7VF3Ei@GmsOc`+4$+4 z^I%)B3lfT8h?ndPkDh!=PyA0eDWYR6_An>6R%PSaSQ}cT*$6t_MBOI_hbWh7zoa!aMA3Z)8(GPneBdR+~*JPZEm*u!cSMgdK&Z@yN8x4a4j*Zz2lYz=)spc?< zCT(viBOi*;Q*oIMfWqLQ5`UXw5uy#-q!XF*nXGTtXq&d%@~DN45TS3w^XCdLMOIod zM66+;H_8NN1Hvo?Z_uuTNtU)VrY^TDM|83l42fnzi8&T5fe)s%=}B0fkd~s8x^&&y0r_#T>u zi!?+Wh}FmvZ6dlR(kQzuDmwTgt;H^bgBf8e4e>-Pb{%1j7!{jf&j$7lYLC6w9?W|+ z34hg7O(z1!oS0E?XlA3kCg4u++=g+hVnY)OqUi$mu#uvr(&*m6eRjFi;#EQsfa{n~Sgbr&Dxp2y)>RD#SUIemTZ9 zm6M2&S9k(;H^eVTirpFwoZrAXT1)4DnUa@~I`0^_qBu66^ux%wpY1CpPtJewRwxU@ z*c5;L7A~1?UkH!(;Mcyc9m^@bkHQvOboR6gF}_^T83q2wZnbcMU%HiWenR%GYLNQ< zsav(qv%?!pdW7ctMS9e^<+Z80UJjO_5I{>igt-apzkZ7cHvb7VA90*RVNe^BzAe|d zH+Fb_RyEi9vqd#W3^ZM)-qy)P zZdBnY_ckWG4!Zv+_janQ#`2!~AL717dpkqQ;T`tkCU}HB%qkNpzIZf?r6no!__@xi zL>4fBelgT+fnMj1Wvg_ql$lNrTi!5JziK}Nt%N!;qTbo*fVy>pr(KS7$tst3t7t{H z{1|rG6_W*9prm^25hIKlMps<3lT3g4kmiYgUR*p{6;s#5vgAX$j(Ivh{&nWeP_=pa~ z)Q_A0BL|#-tgkCwrRLvAjvFnTh@}XS!z(c}ugzpSy-&@?9NEm}O}qbQy#FTazuC}# zv$_A~rrwPuU{#O|+=gbBqO&+612_q#iUgK~p$p=n5v*i0dr^Zl7V(IJcr+y*!-aUX zf@s(VCRo~WWcDv{GzuF*Kfy-Sbl{wM%1-6rL~`8R)~SjLU?UnA*@(skHiGQ0Wi~<{ zaKDXctY9P9BD=sw5L}oQU$TbAhX9uZni(Il%j}f|h!J#Q5;W2UIm`x#YD>>rMmS`p znvG7zJ=LfM)wq}(F(wmo3|&YLTv!W|EGI`AOlFrHX)u{xa&X#S4C<024JNZoj8~P(Sew=-H;hkFGo-Wk2 z&`v20gzHyQsb(V^mTFdlYGQZQCCl4NpKA7P#)hc~DvVAhk99a?a6LLc0-0s2CKK}2 zCW&!~Orw+EqQ+&qEu|k-Y(FEFtdTMy5FrBUS1m44%W$c~1}Ysn#UF;PJz0@`VbOOg zAI~n6ePK;k*hN$B&~MSmT40OY*&0l8z9t(BE#hnh_=+h9)~|X7cLv*0&H?@_SP4!g z+Y(IkyS)PeOMO1d!rB#mvyoYa3ikO3SzH6er%iSayp)Fj!fO((_QWE@rQOl5!w)C3={%auH(N3jBoIWe5X0|ni}8oB7&p&i-EC`e0UGJNGcQK3n@MU^2-< z8vq(&O8{r|#v}u()ymxfxZku6rhotU{b$}s8V9b9YS;a*zSI9D%eTp&Wn|MM&+0=V zJpqr2;=NMjhjd84R*r)HOA3#R8Bg{H<$UtXV~VzLVG8AZ=l-4r{VJ(H)uZo7~-b^JYXk!VKa|*-M+4!x_%B zl`I;zyzqH1HG~9&4PsAlvErL_qAr;UB}_bcE9i=*S!I)JvJlRjZB`h}=6+ztLW)=o zO6W+$0cm1Ogp~}Ej+P4Kn+^t-fb}Bf#j9FU(SZ-6L(5!(Y*26gA>YPr6WUlj3_DOEpm;>=s)-3MV9qlJwxgl38`ii|1N4{r!`@|0Ik zp&&2;!tp>cFU1E5N5U~Jt{UeK$p6WrXYda53arpkiOgOWVVuLgf_InTh|soQ(=}0u5S#gF!{^r9^_cimz;-J)}#%f~8A$FSlCT0pw^8&n^nCY8Ewc!@Lbki)Htv7@bJjgLHV0D$rL;I^z6;0bT(aI_+`@&CAqPYvjB(bWPMEGv_>Q2J$ zTq#izW#I~2z(OA9okSo7bjScDUl|io7h59oJ#Ds*^aMqSuXF55U*`zyPPQM{m5J)v z;wF~do>f+a;&1Ai#TvH4Tykhm?xn%0cJ!ddsp>L$sxAUc1*=P;<==f^5Yr(8Q@EzE zjL4PED}{u4Ia|M*DUTuih#_&kw( zt@nmFdm5(Rg4`@0vwo0#Iu+j~)m_#v?;8;Odre*&uQJ|_~MeX5I9r040jXHy> zpfo+%@LWQbw+hFpl?^geYQLWY=WOxAvdttFA`u<*w>8s2Q_0=MO}olX`ZBKn zptAb_)&C0}S!t7uqzORq*g1lN^~ySg*22gtKSvl`3WZUDA4BMQJTE1Dtbq^R-Jc2C&=S zjR>tt_d$4|cnofmz>*-zwG{E;j9_Qy#lYk(W5UT+n0AB)*DRx({aqe@?j3-xsANqX zrwjJRN*`sd15mMT@r>kJ1gnH11(eOr{(l1%KD$A&ZBWJc31T@-&pi={2I zSzQ<+3T+HIP^|+mW$1F)2Zu+Z4(-&hlG5$)DypU_4YDB9Vyltxra;2Y-TwcLNT`=s zsQ-fO>d#0=Wf4`8p7mTq9#Rl8lbScz(Jt$!dxgbh1VRNMpn=zw5g@}R0v1^Rm_!;xpU^iVvJ^!7PnrO^q}a7l z4~_|Mi5^|ixT|vnJJC7&G@YYwGlV@y4=zdPWDl$ljB(2Xv%`-eue=A@kdby301gTZ zZLBbd-Vh(-3$`5Q3-*45FBI^8qvSsm2VO&n1!Pd>@>5;373HfqZKB%hf?=DdCm%gP zs<7D$52_5Lr1A?u7Q+a&JMhVZVG|FYei`x(j32o$9b=|ViIJjj2eKvei;#gim zWp=3Qn$4!O*cuk>(h$`RjLzUB+ZAD$POIbrtu6+qL4(HQlS_KD%N37hLz5dGKZ~8s zo}fL7A>__N{y`x(Xp;)?x1RZ*zL2$E6lgmpNczE#WjCY6?v7v@Qlx-R{+G#AYUn25vzVCEu9%n%is4@BY;q-Q?ieKKU)vuzDTCi4Xp7OJd(*Th(w2I{MIiY9%E zE9vKwN_47rrm`5F4vUp0iz`Z9AcCU-YuPYb75#pTV zW$LSfyI)upe8afBte(kh6lZMJojJvtHGAR|Jg@dD7Y{XM!R(?LU1fUxDxkTt-z0TqR9Lw)&KmJwpE2byzwH3bX>Z?*&HT9JGP^@orFcUY^nkv!GcGK z4s^Ombg(6b=*Zhfk}e@SI!VI1Y=BWr($XKV#x;J@fKFLj@fwICjj+vJ1%KmH8H+FZ zDO!Vds)$y`F#%f|SB>i0`+d_rmL~-==a+6dopo>C{GZ)vf`eIgvhsLVnY`tRv+{_$ z4Tm4gD;AG{2uqD0lo{yWo_D7@G4$_twzRb6G|PxeNwuZMkBG%kgDTNustuJY`@0R! z1K5FOcOTH3nEHSz0ZAS!JN?$1?yPlGK6v9zt)R*+$rnNB-a$o*^lbAJ&#;mH6W_Fx zwG|$fB)Prp@4P#k^HNzli8 zi+J5OUCMKcpV0COdu6VAmPnIq7y??Cgsvb65Jg@nn>r+=y)fM-B_GL(N#ub8I+y}i9N#tMQMb}=vv zF1fYD^#`CN@Bv&~+nGqK+KCSIjAAT9bwYOCcg>72X5`<5J2|@=^KHBdlBE-=TlIIfG1XdezI@l#7`0j_GncTJ?*j+*y!}^5&SP|tl;v%84 zR!7Y97DN+OvxK#$NLT|wX#0Mfl3RYwjBg$Zk9N@(uVRLjyCMJQZbxTzvc&^34Ska~ zP4H=g4{(r$>kYiDd9rgE$%trjQHn zj{Jg*MF(-4%-(0yq`xu^#0@dz=Yn8*7A$I+=pvB!mnoe01=gs z+N|1y7BUfHu=bh|3sM#l-XTA5%mlKQvqh}EyCK8^k!&8L8f2Bq5hJK~rB4f2lDGWt z=|CWT46xqPnjNXc{>qFva@mAv3-xH3>9a~mJ5hm4)zcEJ337jfwW^1=R>FkVTwa^d zDFntq5%N*iknG+-AHk511t_3{j9fj_i3PLjJOPTJ-XmtguQ;I$jN1IUY@|Jw*Jgbb zR6$b)aBtRnY=oC>`q-42;W+0xoK^K)b^IoOwR+vfW|nFWt5t7QW@|{Nd9WRx&I{@= zLGp}zpRBTMZqzG1c*c@b`Fu=q{FjyZXx^iHQkAvxY|cSHStD}L@0iHh=s|cIGUo%N z?aFCl`$)1;ej&|d zn+RS-F*O=Y(bxc|FH7Y%A~9pkaV9 z8H5D5veqVtO%=6dP_yx$eHyDOX(3DfX>Mg=M+zs4W*2Bvm&(Hsdl*Wks6i~TmGg(o zVm=qshd8@b@l2{3;Rx>eG5CBGs?MO?v1Po*~f^i__5@C~w z$Pq4$LngM0%{mI;wD_QX4-6bkp9Zc?aVXN0YsNFDI%^&J<-eD-eU%n zc3~lKoV5h62+v(+n;&ypZ}Xk zTYtqU5LDrWsMu_0&*~qwxQmIG+Xh3ds@emQ!Gsr#RJ^RD1VwUdB2S7zdt;}H%&9?c zE$z6O!k7Ha2}sE_*l#0-(V-Ppw*?|>k!$5G4oD2(rpd6+XS4|Q7C65~^<#PoRidkp zRQ;Dmz~4X9;`LHcGUh&9_4oe?i$+ra$s){1_fJHV$?3_{1X%hAab8(sUD7ahYt{zm zS0iwWHGhFKK;~81dxldH-*inPmG%huunjqqZeEYbxUfS-C8aICabxm^HL)L^T4DgT z&e&aviK!YB7?<_7UM`HGNE8;l;8j?hgke=}u{$I_LZ=1uq-&3_RUH02-4IBbY$+`l zS+y7PYyeWd^9M21!pC)7qWA8AB2J^pZCMW@h+bf9@}ev`1%mot6{hf=QW1a+K(*0m z6pl8yYs3Yy8mCF9TmC@k}?f#>c zF)4oD26JI3yjE;NEFfMe#`=6Q*2}l~XG!>Rnn+hD`&R@)BqT^pZaTk9t7u%YfDLr& zM$!497<>IuB6bk<;@wMG_}UV_ZVF$U!`B8lMur9SL2}MV1?|O9@jaxR45O^}dWu47 zO+q1|af}<@>;MEo40?R#jYpxCpzer~7xFpStAfw2B8*eDt<>Lm1;z zaTwz%t6^h28HX|68)`gP)Ofa6tYHWs++U1olDT*Q$M<=vH#v>{H`XGe77)v6_ zPe$@lc!bWucB#Dg$#8inIu7zWY{Q= zMw50HzJdso3TY1|!YsOij+qb#Ms*^DxX&xxnnmLu4qmic8Vgxj1VD ziZh)E>dQD6qR-7Gj1^O$ggAL@GS*&BrHI+S@<-l=yxk3A0$T(Jdv_$p{8X*eLl_QRAszjVGy5GMO6BN#yx1cf{!9X%l&+ zky;;LENZZ|W^*Mqo-bd{s*yo@ttvhI092 zgu#b>p+Sok9D?^DdbUZ+CJJW20Cys!C&{PfI}ILoEDu|V+!wwMAa3keZo0UG^c5uiHv~ zZ=q4eIV4lLj&914m8&0yhl^qO-ne5NW?C=%QM;c$bGQ`Wdu9b|}fkU?WN zv@~I{!H!ZmW0WyH-9Zub#U4P^!hI&?P@y z3iftSq8`2LcHcGU8&pSjM`7-WB_LrPmiZRyRXVFfhRPm$b+Lu!f|PdI8q##YE8bBcYH=K4t7HGTYx>)Qr*u(1WG)I4*n0)sOR^3A zWqr2m%GNNw`cT*6CurPj=UH6^o%=(b(vs%EDJC5`(*zS~tWD;Y9G0GY47Y-VEPqDm zP!qq^9AvxX6#kM{~m+mk;9dqyT}K}?ipI;i(C zj2L}u`t9U20{QmjH>}?9eP~mA@@KzpchSB4RF_rdEmlms5fOOQ9mq6~!-xMHdKh~w zOOEG&Dj};*{w#bG^~gs09!bp(1uEYr%A*jXi}Gk8q$6)Bq$Tlt+$CKaaf62=63~$g z1oYzioMx1GmZ$v6RzWcP(|SgX3#AjY4uQsrfyAUxAW?6PqSUU-*^z!UM^;1=x3^R& z6VHpm#sL?an({!i{cX`C3qoj?=bbM+HbFOan9kXn$wjV{$8(a`*{-MaC-zTdt4`T* zZe_%M8&pdy3!?&hJ)WBJ;YCBHUAQME>3tTo!|NV8CRcdGh1&MC>hcc`YJWq9?p4il zO5-i9CFZoSmg@XI)ZiCn?aUa56l)1OGqedUif1+@Gg3D#>l8o{pYw_}ORxZ1;U9Lq6DW(L+pFW+J_ z(xTlf;%pnteKSPBe8d!b&15XaADR4li;9g{p1GYY(eD!^I!N{fy$TmFESueQoP$^! zll{3)VooZ3l0=+n_;lld9d3k;|xSIxb(r7i6bFDmL8 z9{fcy`|UTziRsNmOq*|a(0*&Dm;LBKBQIX#yo;UcdYhm(`$xy(c7+o^2(!uj`&(iV zJ3n3F+!6w2;+9zqW8b&6S++(EHmeAty-f(~{SeAI={E-^)|W~4w2YLUV23_y+F)3p zNGZnp;?(9%eDMProB3LGW3quSUaY3~(Q}kjArE=L1xNAswquWojBsew67o5Di5gzY zlTx(wKfgokk8fP&&spYamT>6QI#NvKhr*>W?Vh(hWI6A}YodR5bT>nE0htN$YDk2MInTdT2uRvRXz)WkYD~>Ph*EClwiFwk( zgJm-WsqatW?W~oD+Kms}k}ZUW!-lKi+vK+4DF*7EzmgYkc9eWaf^W9=3%L^VEmQ)? zOwQTbY~t4tKYI;K8LtbyTIhscLpaX11wJG`Z4S_HOg7w@>{{Lxhs$>TMqA5Jz~G1_ zt3=*r<$^|DE+2~AP8jOeR z5Uh9amj_r7j4V6e6s}}DWwqJHBGj_oSaRKY2aF7r4sm74^>OrY#@!mYA?=|nNB%1qG_Z{biYF^L~Wc8sKo zWT=sTqiSX#1a*-Sr<3YMC9j_3@qxs=uBNTD$SB4VgBFU4H?OSI%`)?V;i#UhI-Eamh|y-4^;n)LrtuU2}wq-Xg%^{aiq z)C+xBf(QwFIWR58?TE9ngvN@lhXH!O+W?uDwSsJQKZe3d4ihv|FEj7nfu)QU%2eef zTLO3btI8QvE`y@_G_~J3fuP~NmFifd_y1_G29Z9{#t6^;CGTr5-q}vNXzxdR2fco@ zcaWa5x_-AI)VG8v-oGhtjjkD$&Wr%scA!ppL+e=alUAaPe#|Ho441zHY2w@}xyuo^ z<=pKPf#ouvWW$BbTN@S^5}Wb|B8S^oAUbyVJvF#U0#t65C()@rY7ngjmeil}kMbFk zUolz7Coo)(>KAM?y~=@%bAA^~KV_6?N8AiO=ESBBGZwNLOdW#KYzOF>&Bs4m_LE&H zK37@BY_9C6L?KNbyp05qdQUQDSjLlq(iRbKUa#Zq(SLd!KXk-OFp(bxFQcJ2($$tAFhRDCbeYq_P37@BOFw*UJuJus|+#}_JE$SmmuP-{5755pqxv=9H z*$*!j=}!JUSgXP(Lh?bH{_w`T9lwy4{_15%rl%f0bmXC_g}H+d&Q47qS(y8n4lrK z6Gvu`9R28#dp6Yy=n8KS8ska~4;()F;B00c(e1)~cGbh#!v;?F@Z7;irsr?g z%?Z~JXtv?1`Hk7Z!-Dr?nLe+{=4THbJ9g;EhqJ3rl$f75bYy|+fVbf`H$6Xn!J~j~ z+2rBFM-MKzqsLCn>&c-bhZd$DJTX0W>?mE$yZPzq*_#b_4MagnoO!nrwX#D;vPq%m zAA0D}!l9!_=H1Doa}OMvcMmQ+y6LuqM;-*WqjTS$?A?xb&K*5*OpqC~yO2#id=!Gu zFC2X2n7YocI_9!Xw`C{h1?EEs7Y^#lk%LFvN2ecn#J&67?=JcGz|j*6*}~E60eGIB zIL707-5;AeJbiNdaF=#RAAT6RO$q(wz&>)~@WP>Eho=LY^ULA9CVOb^XyD1Qx#^RK zj-Hr59Jm##Ux3HFktm=dDOR!M7jXp*cj(B&dSZh2*3{m6bZ*++d2~7H4<0UgB_I!m zLaVuV84e|@di4#f{sur{!Zd&A5m47iTaO-DK#8^=dC+ga`|jz51puD!j`#4<6GtAp zpxWUNAHAUb(1(v46{6XZ=?@=VICOG4TR8N{^n*tqnl=S^s7ozz!KifTA$RDZ?ABYe zV?3FDXo~x7hvp9+K790}(+~B-q`^+iPcJL(19a=5V;`BG+sjB7)heZT_e0s{Pza85 zA3L_d0H(O}*&_!(mK`~|fHuw}N7LEigAX#&wb#BU{D1h+1BC{@XMXO%_Y~LHJ_tHN zFN4Jro)1n*RNW&7u}|}}2i=DGL;qlUYGGrx;aIjQ3pI|-9Xfe%VftFt+?d^R>jjSw zPapa4!bh_2`JR=ZZ@P3>x80g)xcUF)(8Ba1|E)U$JezI{cCxo>m5_u?>unV z2i?NQj!j>y50U=B2lsEEn%sS-r+|8Q`@Q@3?7nm7)Q-Ehf8d_&cW$+(Tla0-zIAHb z_C0>3*7xkb^MLEBa^Ij^@7X@Jf1gU#^Y)#48DEz>_V}Ijw!`1E$L{y)@sl89S2rGYsa2_{($pS`}W^+_k{!zY=J2I z_uakw!0vr_-Yw9!?(%ouxqXjaTQT#~)V=%en%o_V_uY8_Bp~G0DFhIt4jh157nbeY z)_r)-_E5Ozp1TihzsnVqKtGW}iCEq(T*jQe-dYMcV4mEw4@Ta3&)!LT<5|F=ci%_L z1N-)?hQDXq?tO+^Kk$2Y+Oyqv?y&EBcW>K%VWqo1xL@@3=x>+O?!_e|Zp{jR%R+dIPQx<;i^q z4(!`2$kfa7SxVA==RJG&^x(d0`(69Emp$rZh;S-#HtOnTa`yowcK?B0W#3bK{e4q+ z@BYE(Bqd0l%ARD?D1Qz%AGqx zH7V!*yLR8}4{XV+wYp%OMCS$@!h_!d+Yb?-{re^TYE@O-Ld_HQ@giW6UkM$47Mj+2h8pX zH%5x>clyaa+qW4Hr#^xobpa!>AAXxVdF*}e-l=={zmKb%?CK_W@Z@z|`FpQ(o87e+ zdmDIYCpMPq8oW94+3-rPIu;7ecVPNp8kj3}w^!52cfql^Wch|8Ck`Lp7~GNILn5FX z-hFI#A?pN5-DvJkc5Ln_e%Aap&875tb2dFUcXTeh>Y)MW&%ZOh{dO1r-n^pteskC^ zbO25lI+K-l)~r!4)zDQ_ zUuCy$jT;%DJQ=9Fi1)&bJJ+mHn7W$UsHOjvEbR=1wmfkIgL*pXT;opiNGR53a=$xz~tPm2DC8l!a8N#Du#uG793 z1B~j^@yY*dxmvq+t@EGG)1mUl%A3xAIZvZ8ddbt(m+P5*G{>x%Pm2EWm1)H9+WzE~ z>AP0zv3)czvl@Kz|K{ty_xs*^{S7zX^gchi6?^LZ?_HUuufHh9h$*bMUb`}V=iY#r z`^+D07ZecBk-;4P?gxb@)~8qfUq))@KD=}{bPaW$;=97Xr;R+$y+U{E(~&MGDEfc(rU*Y}N&T&r|2gjcMmc3v9lyH#{$gv2S{Yimz=!y@ZVGJ)j2_U<(QP{HqC4*lBTx>UzYbo^|jpUX`<|GKF6g%#@Ue}{A9 z@amd$BrQn$OLvEQRrqvGy83ek0M8YV#S8#g+LVr5Uljd8(J>%DyD43r7ajfXe0W~8 zc!eTP$=Tmy-4=%b8x*~#X!RR?MM%-p*QTrgLxI2(eMLyoOBAgyI{Z{$5mNLzMUNLn z`>wmv3Pm}j=&ARltDi4h{c3JS63b(7l%mTDFdnyppgc>wl9!?zi&me0FqFx_JqeFD zr>j3%K=|2vLy=H^+W8kKnl0JiSM)p#r091F`aSli0YbGp58JOx-+8JidM)&4Jbk6O z-i(oao;p8J)cNDSI>$_^oO>OU^(u8jHAOcStv-7ol&RGg=ii`c zdx6Rq`il0${P!XkMTal<72OZ>Df-U^)&G58(J`1$(I1o$_7yF`{Oi-zgC&H0MNiV| z`gG)M(c!Naz!NBY>V|an*`meI^x@P-TqycfG0sB|^l*X_Pu@s0u%O?TqNt#{vGTPE zQ@hu0Oh-7yWq;qdzwE(3aZ}p)k%A)E7mwAt%|CtLkFD8&2;G#9++WJT&R*;HrK|s{ z==4vD#}ZW_e*S%F=Q9N|UoDE%Va7jwJFEfKmTpc*zF73|wO+@s@c17Tk3Xl{{Gsx1 z+?;kEDLVc2@YFghp?!r;HzNVxpN{-^L9K5V)ztd?)73v!An_l&j}45cZ%J2oilRsR zgb@0^eoGo*pT5OcjR51V=}?`vGVu4wlrw2QcWa81!w=DPanT6jlXCA{|_zX Bkv;$b diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-es2017.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-es2017.js deleted file mode 100644 index 02710cd..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-es2017.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see ogv-es2017.js.LICENSE.txt */ -!function webpackUniversalModuleDefinition(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ogvjs=t():e.ogvjs=t()}(globalThis,(function(){return(()=>{var e={318:e=>{e.exports=function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports},848:e=>{window,e.exports=function(e){var t={};function r(i){if(t[i])return t[i].exports;var s=t[i]={i,l:!1,exports:{}};return e[i].call(s.exports,s,s.exports,r),s.l=!0,s.exports}return r.m=e,r.c=t,r.d=function(e,t,i){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)r.d(i,s,function(t){return e[t]}.bind(null,s));return i},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(e,t){function r(e,t){if(e<1||e!==Math.round(e))throw"Invalid channel count for BufferQueue";this.channels=e,this.bufferSize=t,this.flush()}r.prototype.flush=function(){this._buffers=[],this._pendingBuffer=this.createBuffer(this.bufferSize),this._pendingPos=0},r.prototype.sampleCount=function(){var e=0;return this._buffers.forEach((function(t){e+=t[0].length})),e},r.prototype.createBuffer=function(e){for(var t=[],i=0;i=s)return e;for(var h=[],u=0;u0?d[d.length+t]:e[0]:e[t]},u=0;ui&&(m=Math.SQRT1_2);for(var g=0;g=i&&(v=0);var y=e[v],b=new Float32Array(_);h(y,b,this._resampleLastSampleData?this._resampleLastSampleData[v]:void 0,m),u.push(b)}return this._resampleFractional=p,this._resampleLastSampleData=e,u},n.prototype.bufferData=function(e){if(!this._backend)throw"Invalid state: AudioFeeder cannot bufferData before init";var t=this._resample(e);t=this._tempoChanger.process(t),this._backend.appendBuffer(t)},n.prototype.getPlaybackState=function(){if(this._backend){var e=this._backend.getPlaybackState();return e.outputPlaybackPosition=e.playbackPosition,e.playbackPosition=this._tempoChanger.mapOutputToInputTime(e.outputPlaybackPosition),e}throw"Invalid state: AudioFeeder cannot getPlaybackState before init"},n.prototype.waitUntilReady=function(e){if(!this._backend)throw"Invalid state: AudioFeeder cannot waitUntilReady before init";this._backend.waitUntilReady(e)},n.prototype.start=function(){if(!this._backend)throw"Invalid state: AudioFeeder cannot start before init";this._backend.start()},n.prototype.stop=function(){if(!this._backend)throw"Invalid state: AudioFeeder cannot stop before init";this._backend.stop()},n.prototype.flush=function(){if(this._resampleFractional=0,this._resampleLastSampleData=void 0,!this._backend)throw"Invalid state: AudioFeeder cannot flush before init";this._tempoChanger.flush(this.durationBuffered),this._backend.flush()},n.prototype.close=function(){this._backend&&(this._backend.close(),this._backend=null)},n.prototype.onstarved=null,n.prototype.onbufferlow=null,n.isSupported=function(){return!!Float32Array&&t.isSupported()},n.initSharedAudioContext=function(){return t.isSupported()?t.initSharedAudioContext():null},e.exports=n}()},function(e,t,i){!function(){var t=window.AudioContext||window.webkitAudioContext,s=i(0),d=i(3);function o(e,t,i){var d=i.audioContext||o.initSharedAudioContext();if(this._context=d,this.output=i.output||d.destination,this.rate=d.sampleRate,this.channels=2,i.bufferSize&&(this.bufferSize=0|i.bufferSize),this.bufferThreshold=2*this.bufferSize,this._bufferQueue=new s(this.channels,this.bufferSize),this._playbackTimeAtBufferTail=d.currentTime,this._queuedTime=0,this._delayedTime=0,this._dropped=0,this._liveBuffer=this._bufferQueue.createBuffer(this.bufferSize),d.createScriptProcessor)this._node=d.createScriptProcessor(this.bufferSize,0,this.channels);else{if(!d.createJavaScriptNode)throw new Error("Bad version of web audio API?");this._node=d.createJavaScriptNode(this.bufferSize,0,this.channels)}}o.prototype.bufferSize=4096,o.prototype.bufferThreshold=8192,o.prototype._volume=1,Object.defineProperty(o.prototype,"volume",{get:function(){return this._volume},set:function(e){this._volume=+e}}),o.prototype._muted=!1,Object.defineProperty(o.prototype,"muted",{get:function(){return this._muted},set:function(e){this._muted=!!e}}),o.prototype._audioProcess=function(e){var t,i,s,h,u;u="number"==typeof e.playbackTime?e.playbackTime:this._context.currentTime+this.bufferSize/this.rate;var c=this._playbackTimeAtBufferTail;if(c0){var t=Math.round(e*this.rate),i=this._liveBuffer?this._liveBuffer[0].length:0;t>i?(this._bufferQueue.prependBuffer(this._liveBuffer),this._bufferQueue.prependBuffer(this._bufferQueue.createBuffer(t-i))):this._bufferQueue.prependBuffer(this._bufferQueue.trimBuffer(this._liveBuffer,i-t,t)),this._playbackTimeAtBufferTail-=e}this._node.onaudioprocess=null,this._node.disconnect()}},o.prototype.flush=function(){this._bufferQueue.flush()},o.prototype.close=function(){this.stop(),this._context=null},o.prototype.onstarved=null,o.prototype.onbufferlow=null,o.isSupported=function(){return!!t},o.sharedAudioContext=null,o.initSharedAudioContext=function(){if(!o.sharedAudioContext&&o.isSupported()){var e,i=new t;if(i.createScriptProcessor)e=i.createScriptProcessor(1024,0,2);else{if(!i.createJavaScriptNode)throw new Error("Bad version of web audio API?");e=i.createJavaScriptNode(1024,0,2)}e.connect(i.destination),e.disconnect(),o.sharedAudioContext=i}return o.sharedAudioContext},e.exports=o}()},function(e,t){e.exports=function(){if(void 0!==window.setImmediate)return window.setImmediate;if(window&&window.postMessage){var e=[];return window.addEventListener("message",(function(t){if(t.source===window){var i=t.data;if("object"==typeof i&&i.nextTickBrowserPingMessage){var s=e.pop();s&&s()}}})),function(t){e.push(t),window.postMessage({nextTickBrowserPingMessage:!0},document.location.toString())}}return function(e){setTimeout(e,0)}}()},function(e,t,i){var s;window,s=function(){return function(e){var t={};function r(i){if(t[i])return t[i].exports;var s=t[i]={i,l:!1,exports:{}};return e[i].call(s.exports,s,s.exports,r),s.l=!0,s.exports}return r.m=e,r.c=t,r.d=function(e,t,i){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)r.d(i,s,function(t){return e[t]}.bind(null,s));return i},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(e,t){var i={float_array:function(e){return new Float32Array(e)},blit:function(e,t,i,s,d){i.set(e.subarray(t,t+d),s)}};e.exports=i},function(e,t,i){var s,d;s=i(0),d=i(2),e.exports=function(e){var t=(e=e||{}).sampleRate||44100,i=e.wsizeLog||11,h=e.tempo||1,u=(e.numChannels,Math.pow(2,50/1200)-1),c=1<>1),T=s.float_array(b),k=s.float_array(b),w=s.float_array(b),P=s.float_array(b),E=s.float_array(b),x=s.float_array(b),A=1+(b>>1),R=[0,0],F=[],O=[],C=[],S=[];for(y=0;y<2;y++)F.push(s.float_array(A)),O.push(s.float_array(A)),C.push(s.float_array(A)),S.push(s.float_array(b));var B=s.float_array(A),D=s.float_array(A),M=0,V=0,I=[{in_time:0,out_time:0,tempo:h}],L=0,j=0,W=1,X=0,N=0,H=0,z=0,Y={mapOutputToInputTime:function(e){for(var t=I.length-1;e0;)t--;var i=I[t];return i.in_time+i.tempo*(e-i.out_time)},flush:function(e){X=0,R=[0,0],j=0,z=0,H=0;for(var t=0;t<2;t++)for(var i=0;i=0;)I.pop(),s--;I.push({in_time:M,out_time:V,tempo:h})}},getTempo:function(){return h},setTempo:function(e){m=g=f,e>=1?g=Math.round(m/e):m=Math.round(g*e),N=(1/e-1*g/m)*m,W=function(e,t){for(var i=e.length/t|0,s=0,d=0;di&&(i=e[s]);var d=1e-8*i,h=1,c=1;for(t[0]=1,s=2;sd&&e[s]>e[s-1]&&e[s]>=e[s+1]){var f=s+(e[s-1]-e[s+1])/(2*(e[s-1]-2*e[s]+e[s+1]));f-t[h-1]>l?(t[h++]=f,c=s):e[s]>e[c]&&(t[h-1]=f,c=s)}}return h}(y,T),w=O[l],P=C[l];if(0!=e&&0!=k){var E=0;for(H=0;Hm[E]&&E!=p;)++E;var x=E;E>0&&z-m[E-1].1*y[Math.round(z)]){var M=J(t,i,z),V=g[x]+v[x]+U(M,z,g[x],m[x],h)-M;w[H]=M,P[H]=V,B[H]=Math.cos(V),D[H]=Math.sin(V)}else w[H]=J(t,i,z),P[H]=0,B[H]=1,D[H]=0}T[k]=2*c;var I=T[x=0],L=T[x+1],j=B[x],W=D[x];for(b=1;b=I&&b-I>L-b&&(I=T[++x],L=T[x+1],j=B[x],W=D[x]);var X=t[b]*j-i[b]*W,N=t[b]*W+i[b]*j;t[b]=X,i[b]=N}}else for(var H=0;Hd&&(d=Math.abs(2*l.m_re[t]));for(t=0;td&&(d=Math.abs(l.m_re[t+g+e]+l.m_im[t]));for(t=c-g;td&&(d=Math.abs(2*l.m_im[t]));var u=1/Math.floor(1*c/(2*g));for(h*d>u&&(h=u/d),t=0;t1){d=s.float_array(e[0].length);for(var u=1/e.length,l=0;l0){var v=z+H+i,y=[];for(l=0;lw&&(w=z);var P=s.float_array(w);s.blit(p,0,P,0,z);for(var E=0,x=z,A=0,R=0;;){var F=c+m-H;if(E+F>i){s.blit(d,E,_,H,i-E),H+=i-E,E=i;break}F<=0?H-=2*m:(s.blit(d,E,_,H,F),E+=F,H=c-m),R=G(),M+=2*m/t,V+=R/t,(A=x+R-w)<0&&(A=0),s.blit(p,0,P,x,R-A),x+=R}s.blit(p,R-A,p,0,A),z=A;var O=[];for(l=0;l>=1;i.m_revTgt[d]=u}i.twiddleRe=s.float_array(i.m_logN),i.twiddleIm=s.float_array(i.m_logN);for(var l=1,f=0;f>1,c=d>>1,l=d;if(e)for(var f=1/d,_=0;_>=1,c>>=1,l>>=1}for(var F,O,C=i.m_revTgt,S=0;SS&&(O=t[F=C[S]],t[F]=t[S],t[S]=O,O=s[F],s[F]=s[S],s[S]=O)};var p=t>>1;return i.unpack=function(e,s,d,h){e[0]=i.m_re[0],d[0]=i.m_im[0],s[0]=h[0]=0,e[p]=i.m_re[p],d[p]=i.m_im[p],s[p]=h[p]=0;for(var u=1;u{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=class Bisector{constructor(e){this.lower=e.start,this.upper=e.end,this.onprocess=e.process,this.position=0,this.n=0}iterate(){return this.n++,this.position=Math.floor((this.lower+this.upper)/2),this.onprocess(this.lower,this.upper,this.position)}start(){return this.iterate(),this}left(){return this.upper=this.position,this.iterate()}right(){return this.lower=this.position,this.iterate()}};t.default=i},523:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=new class{hasTypedArrays(){return!!window.Uint32Array}hasWebAssembly(){return!!window.WebAssembly}hasWebAudio(){return!(!window.AudioContext&&!window.webkitAudioContext)}hasFlash(){return!1}hasAudio(){return this.hasWebAudio()}isBlacklisted(e){return!1}isSlow(){return!1}isTooSlow(){return!1}supported(e){return"OGVDecoder"===e?this.hasWebAssembly():"OGVPlayer"===e&&(this.supported("OGVDecoder")&&this.hasAudio())}};t.default=i},408:(e,t,i)=>{"use strict";var s=i(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var d=s(i(580));class OGVDecoderAudioProxy extends((0,d.default)({loadedMetadata:!1,audioFormat:null,audioBuffer:null,cpuTime:0})){init(e){this.proxy("init",[],e)}processHeader(e,t){this.proxy("processHeader",[e],t,[e])}processAudio(e,t){this.proxy("processAudio",[e],t,[e])}close(){this.terminate()}}var h=OGVDecoderAudioProxy;t.default=h},319:(e,t,i)=>{"use strict";var s=i(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var d=s(i(580));class OGVDecoderVideoProxy extends((0,d.default)({loadedMetadata:!1,videoFormat:null,frameBuffer:null,cpuTime:0})){init(e){this.proxy("init",[],e)}processHeader(e,t){this.proxy("processHeader",[e],t,[e])}processFrame(e,t){this.proxy("processFrame",[e],t,[e])}close(){this.terminate()}sync(){this.proxy("sync",[],(()=>{}))}recycleFrame(e){this.proxy("recycleFrame",[e],(()=>{}),[e.y.bytes.buffer,e.u.bytes.buffer,e.v.bytes.buffer])}}var h=OGVDecoderVideoProxy;t.default=h},445:(e,t,i)=>{"use strict";var s=i(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var d=s(i(539)),h="1.8.6-20220111172545-1f60d9d",u={OGVDemuxerOggW:"ogv-demuxer-ogg-wasm.js",OGVDemuxerWebMW:"ogv-demuxer-webm-wasm.js",OGVDecoderAudioOpusW:"ogv-decoder-audio-opus-wasm.js",OGVDecoderAudioVorbisW:"ogv-decoder-audio-vorbis-wasm.js",OGVDecoderVideoTheoraW:"ogv-decoder-video-theora-wasm.js",OGVDecoderVideoVP8W:"ogv-decoder-video-vp8-wasm.js",OGVDecoderVideoVP8MTW:"ogv-decoder-video-vp8-mt-wasm.js",OGVDecoderVideoVP9W:"ogv-decoder-video-vp9-wasm.js",OGVDecoderVideoVP9SIMDW:"ogv-decoder-video-vp9-simd-wasm.js",OGVDecoderVideoVP9MTW:"ogv-decoder-video-vp9-mt-wasm.js",OGVDecoderVideoVP9SIMDMTW:"ogv-decoder-video-vp9-simd-mt-wasm.js",OGVDecoderVideoAV1W:"ogv-decoder-video-av1-wasm.js",OGVDecoderVideoAV1SIMDW:"ogv-decoder-video-av1-simd-wasm.js",OGVDecoderVideoAV1MTW:"ogv-decoder-video-av1-mt-wasm.js",OGVDecoderVideoAV1SIMDMTW:"ogv-decoder-video-av1-simd-mt-wasm.js"};var c=class OGVLoaderBase{constructor(){this.base=this.defaultBase()}defaultBase(){}wasmSupported(){return d.default.wasmSupported()}scriptForClass(e){return u[e]}urlForClass(e){var t=this.scriptForClass(e);if(t)return this.urlForScript(t);throw new Error("asked for URL for unknown class "+e)}urlForScript(e){if(e){var t=this.base;return void 0===t?t="":t+="/",t+e+"?version="+encodeURIComponent(h)}throw new Error("asked for URL for unknown script "+e)}loadClass(e,t,i){i=i||{};var s=this.getGlobal(),d=this.urlForClass(e),classWrapper=t=>((t=t||{}).locateFile=e=>"data:"===e.slice(0,5)?e:this.urlForScript(e),t.mainScriptUrlOrBlob=this.scriptForClass(e)+"?version="+encodeURIComponent(h),s[e](t));"function"==typeof s[e]?t(classWrapper):this.loadScript(d,(()=>{t(classWrapper)}))}};t.default=c},964:(e,t,i)=>{"use strict";var s=i(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var d=s(i(408)),h=s(i(319)),u=s(i(445)),c={audio:{proxy:d.default,worker:"ogv-worker-audio.js"},video:{proxy:h.default,worker:"ogv-worker-video.js"}},l={OGVDecoderAudioOpusW:"audio",OGVDecoderAudioVorbisW:"audio",OGVDecoderVideoTheoraW:"video",OGVDecoderVideoVP8W:"video",OGVDecoderVideoVP9W:"video",OGVDecoderVideoVP9SIMDW:"video",OGVDecoderVideoAV1W:"video",OGVDecoderVideoAV1SIMDW:"video"};class OGVLoaderWeb extends u.default{constructor(){super(),this.scriptStatus={},this.scriptCallbacks={}}getGlobal(){return window}defaultBase(){for(var e,t,i=document.querySelectorAll("script"),s=/^(?:|(.*)\/)ogv(?:-support|-es2017)?\.js(?:\?|#|$)/,d=0;d{var i=this.scriptCallbacks[e];delete this.scriptCallbacks[e],this.scriptStatus[e]="done",i.forEach((e=>{e()}))};i.addEventListener("load",done),i.addEventListener("error",done),i.src=e,document.querySelector("head").appendChild(i)}}workerProxy(e,t){var i=c[l[e]];if(!i)throw new Error("Requested worker for class with no proxy: "+e);var s,d=i.proxy,h=i.worker,u=this.urlForScript(this.scriptForClass(e)),_=this.urlForScript(h),p=function construct(t){return new d(s,e,t)};if(_.match(/^https?:|\/\//i)){var m,g,v,y,b,T=!1,k=!1;function completionCheck(){if(1==T&&1==k){var e=v+" "+y+"\nOGVLoader.base = "+JSON.stringify(f.base);try{b=new Blob([e],{type:"application/javascript"})}catch(t){window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,(b=new BlobBuilder).append(e),b=b.getBlob()}s=new Worker(URL.createObjectURL(b)),t((function(e){return Promise.resolve(new p(e))}))}}(m=new XMLHttpRequest).open("GET",u,!0),m.onreadystatechange=function(){4==m.readyState&&200==m.status&&(v=m.responseText,T=!0,completionCheck())},m.send(),(g=new XMLHttpRequest).open("GET",_,!0),g.onreadystatechange=function(){4==g.readyState&&200==g.status&&(y=g.responseText,k=!0,completionCheck())},g.send()}else s=new Worker(_),t((function(e){return Promise.resolve(new p(e))}))}}var f=new OGVLoaderWeb,_=f;t.default=_},759:(e,t,i)=>{"use strict";var s=i(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var d=s(i(309)),h={MEDIA_ERR_ABORTED:1,MEDIA_ERR_NETWORK:2,MEDIA_ERR_DECODE:3,MEDIA_ERR_SRC_NOT_SUPPORTED:4};class OGVMediaError{constructor(e,t){this.code=e,this.message=t}}(0,d.default)(OGVMediaError,h),(0,d.default)(OGVMediaError.prototype,h);var u=OGVMediaError;t.default=u},278:(e,t)=>{"use strict";function split(e,t,i){var s=e.split(t,i).map((e=>function trim(e){return e.replace(/^\s+/,"").replace(/\s+$/,"")}(e)));if("number"==typeof i)for(;s.length{"use strict";var s=i(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var d,h=s(i(731)),u=s(i(936)),c=s(i(848)),l=s(i(964)),f=s(i(893)),_=s(i(309)),p=s(i(759)),m=s(i(278)),g=s(i(168)),v=s(i(625)),y=(()=>{if("function"==typeof setImmediate)return setImmediate;var e=new MessageChannel,t=[];return e.port1.onmessage=e=>{t.shift()()},function nextTick(i){t.push(i),e.port2.postMessage({})}})(),b={NETWORK_EMPTY:0,NETWORK_IDLE:1,NETWORK_LOADING:2,NETWORK_NO_SOURCE:3,HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},T="INITIAL",k="SEEKING_END",w="LOADED",P="PRELOAD",E="READY",x="PLAYING",A="SEEKING",R="ERROR",F="NOT_SEEKING",O="BISECT_TO_TARGET",C="BISECT_TO_KEYPOINT",S="LINEAR_TO_TARGET",B="exact",D="fast";function OGVJSElement(){var e=document.createElement("ogvjs");return Object.setPrototypeOf?Object.setPrototypeOf(e,Object.getPrototypeOf(this)):e.__proto__=this.__proto__,e}d="undefined"==typeof performance||void 0===typeof performance.now?Date.now:performance.now.bind(performance),OGVJSElement.prototype=Object.create(HTMLElement.prototype,{});class OGVPlayer extends OGVJSElement{constructor(e){if(super(),(e=e||{}).base=e.base||l.default.base,this._options=e,this._instanceId="ogvjs"+ ++OGVPlayer.instanceCount,void 0!==e.worker?this._enableWorker=!!e.worker:this._enableWorker=!!window.Worker,!l.default.wasmSupported())throw new Error("WebAssembly not supported");this._enableThreading=!!e.threading,this._enableSIMD=!!e.simd,this._state=T,this._seekState=F,this._detectedType=null,this._canvas=document.createElement("canvas"),this._frameSink=null,this.className=this._instanceId,(0,_.default)(this,b),this._view=this._canvas,this._view.style.position="absolute",this._view.style.top="0",this._view.style.left="0",this._view.style.width="100%",this._view.style.height="100%",this._view.style.objectFit="contain",this.appendChild(this._view),this._startTime=d(),this._codec=null,this._audioInfo=null,this._videoInfo=null,this._actionQueue=[],this._audioFeeder=null,this._muted=!1,this._initialPlaybackPosition=0,this._initialPlaybackOffset=0,this._prebufferingAudio=!1,this._initialSeekTime=0,this._currentSrc="",this._streamEnded=!1,this._mediaError=null,this._dataEnded=!1,this._byteLength=0,this._duration=null,this._lastSeenTimestamp=null,this._nextProcessingTimer,this._nextFrameTimer=null,this._loading=!1,this._started=!1,this._paused=!0,this._ended=!1,this._startedPlaybackInDocument=!1,this._stream=void 0,this._framesProcessed=0,this._targetPerFrameTime=1e3/60,this._actualPerFrameTime=0,this._totalFrameTime=0,this._totalFrameCount=0,this._playTime=0,this._bufferTime=0,this._drawingTime=0,this._proxyTime=0,this._totalJitter=0,this._droppedAudio=0,this._delayedAudio=0,this._lateFrames=0,this._poster="",this._thumbnail=null,this._frameEndTimestamp=0,this._audioEndTimestamp=0,this._decodedFrames=[],this._pendingFrames=[],this._lastFrameDecodeTime=0,this._lastFrameVideoCpuTime=0,this._lastFrameAudioCpuTime=0,this._lastFrameDemuxerCpuTime=0,this._lastFrameDrawingTime=0,this._lastFrameBufferTime=0,this._lastFrameProxyTime=0,this._lastVideoCpuTime=0,this._lastAudioCpuTime=0,this._lastDemuxerCpuTime=0,this._lastBufferTime=0,this._lastProxyTime=0,this._lastDrawingTime=0,this._lastFrameTimestamp=0,this._currentVideoCpuTime=0,this._lastTimeUpdate=0,this._timeUpdateInterval=250,this._seekTargetTime=0,this._bisectTargetTime=0,this._seekMode=null,this._lastSeekPosition=null,this._seekBisector=null,this._didSeek=null,this._depth=0,this._needProcessing=!1,this._pendingFrame=0,this._pendingAudio=0,this._framePipelineDepth=8,this._frameParallelism=this._enableThreading?Math.min(16,navigator.hardwareConcurrency)||1:0,this._audioPipelineDepth=12,this._videoInfo=null,this._audioInfo=null,this._width=0,this._height=0,this._volume=1,this._playbackRate=1,Object.defineProperties(this,{src:{get:function getSrc(){return this.getAttribute("src")||""},set:function setSrc(e){this.setAttribute("src",e),this._loading=!1,this._prepForLoad("interactive")}},buffered:{get:function getBuffered(){var e;return e=this._stream&&this._byteLength&&this._duration?this._stream.getBufferedRanges().map((e=>e.map((e=>e/this._stream.length*this._duration)))):[[0,0]],new g.default(e)}},seekable:{get:function getSeekable(){return this.duration<1/0&&this._stream&&this._stream.seekable&&this._codec&&this._codec.seekable?new g.default([[0,this._duration]]):new g.default([])}},currentTime:{get:function getCurrentTime(){return this._state==A?this._seekTargetTime:this._codec?this._state!=x||this._paused?this._initialPlaybackOffset:this._getPlaybackTime():this._initialSeekTime},set:function setCurrentTime(e){this._seek(e,B)}},duration:{get:function getDuration(){return this._codec&&this._codec.loadedMetadata?null!==this._duration?this._duration:1/0:NaN}},paused:{get:function getPaused(){return this._paused}},ended:{get:function getEnded(){return this._ended}},seeking:{get:function getSeeking(){return this._state==A}},muted:{get:function getMuted(){return this._muted},set:function setMuted(e){this._muted=e,this._audioFeeder?this._audioFeeder.muted=this._muted:this._started&&!this._muted&&this._codec&&this._codec.hasAudio&&(this._log("unmuting: switching from timer to audio clock"),this._initAudioFeeder(),this._startPlayback(this._audioEndTimestamp)),this._fireEventAsync("volumechange")}},poster:{get:function getPoster(){return this._poster},set:function setPoster(e){if(this._poster=e,!this._started){this._thumbnail&&this.removeChild(this._thumbnail);var t=new Image;t.src=this._poster,t.className="ogvjs-poster",t.style.position="absolute",t.style.top="0",t.style.left="0",t.style.width="100%",t.style.height="100%",t.style.objectFit="contain",t.style.visibility="hidden",t.addEventListener("load",(()=>{this._thumbnail===t&&(OGVPlayer.styleManager.appendRule("."+this._instanceId,{width:t.naturalWidth+"px",height:t.naturalHeight+"px"}),t.style.visibility="visible")})),this._thumbnail=t,this.appendChild(t)}}},videoWidth:{get:function getVideoWidth(){return this._videoInfo?this._videoInfo.displayWidth:0}},videoHeight:{get:function getVideoHeight(){return this._videoInfo?this._videoInfo.displayHeight:0}},ogvjsVideoFrameRate:{get:function getOgvJsVideoFrameRate(){return this._videoInfo?0==this._videoInfo.fps?this._totalFrameCount/(this._totalFrameTime/1e3):this._videoInfo.fps:0}},ogvjsAudioChannels:{get:function getOgvJsAudioChannels(){return this._audioInfo?this._audioInfo.channels:0}},ogvjsAudioSampleRate:{get:function getOgvJsAudioChannels(){return this._audioInfo?this._audioInfo.rate:0}},width:{get:function getWidth(){return this._width},set:function setWidth(e){this._width=parseInt(e,10),this.style.width=this._width+"px"}},height:{get:function getHeight(){return this._height},set:function setHeight(e){this._height=parseInt(e,10),this.style.height=this._height+"px"}},autoplay:{get:function getAutoplay(){return!1},set:function setAutoplay(e){}},controls:{get:function getControls(){return!1},set:function setControls(e){}},loop:{get:function getLoop(){return!1},set:function setLoop(e){}},crossOrigin:{get:function getCrossOrigin(){return null},set:function setCrossOrigin(e){}},currentSrc:{get:function getCurrentSrc(){return this._currentSrc}},defaultMuted:{get:function getDefaultMuted(){return!1}},defaultPlaybackRate:{get:function getDefaultPlaybackRate(){return 1}},error:{get:function getError(){return this._state===R?this._mediaError?this._mediaError:new p.default("unknown error occurred in media procesing"):null}},preload:{get:function getPreload(){return this.getAttribute("preload")||""},set:function setPreload(e){this.setAttribute("preload",e)}},readyState:{get:function getReadyState(){return this._stream&&this._codec&&this._codec.loadedMetadata?OGVPlayer.HAVE_ENOUGH_DATA:OGVPlayer.HAVE_NOTHING}},networkState:{get:function getNetworkState(){return this._stream?this._stream.waiting?OGVPlayer.NETWORK_LOADING:OGVPlayer.NETWORK_IDLE:this.readyState==OGVPlayer.HAVE_NOTHING?OGVPlayer.NETWORK_EMPTY:OGVPlayer.NETWORK_NO_SOURCE}},playbackRate:{get:function getPlaybackRate(){return this._playbackRate},set:function setPlaybackRate(e){var t=Number(e)||1;this._audioFeeder?this._audioFeeder.tempo=t:this._paused||(this._initialPlaybackOffset=this._getPlaybackTime(),this._initialPlaybackPosition=t*d()/1e3),this._playbackRate=t,this._fireEventAsync("ratechange")}},played:{get:function getPlayed(){return new g.default([[0,this.currentTime]])}},volume:{get:function getVolume(){return this._volume},set:function setVolume(e){this._volume=+e,this._audioFeeder&&(this._audioFeeder.volume=this._volume),this._fireEventAsync("volumechange")}}}),this.onframecallback=null,this.onloadstate=null,this.onprogress=null,this.onsuspend=null,this.onabort=null,this.onemptied=null,this.onstalled=null,this.onloadedmetadata=null,this.onloadeddata=null,this.oncanplay=null,this.oncanplaythrough=null,this.onplaying=null,this.onwaiting=null,this.onseeking=null,this.onseeked=null,this.onended=null,this.ondurationchange=null,this.ontimeupdate=null,this.onplay=null,this.onpause=null,this.onratechange=null,this.onresize=null,this.onvolumechange=null,this.onaudiofeedercreated=null}_time(e){var t=d();e();var i=d()-t;return this._lastFrameDecodeTime+=i,i}_log(e){var t=this._options;if(t.debug){var i=d()-this._startTime;t.debugFilter&&!e.match(t.debugFilter)||console.log("["+Math.round(10*i)/10+"ms] "+e)}}_fireEvent(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._log("fireEvent "+e);var i,s="function"==typeof Event;for(var d in s?i=new CustomEvent(e):(i=document.createEvent("Event")).initEvent(e,!1,!1),t)t.hasOwnProperty(d)&&(i[d]=t[d]);var h=this.dispatchEvent(i);!s&&"resize"===e&&this.onresize&&h&&this.onresize.call(this,i)}_fireEventAsync(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._log("fireEventAsync "+e),y((()=>{this._fireEvent(e,t)}))}static initSharedAudioContext(){c.default.initSharedAudioContext()}_initAudioFeeder(){var e=this._options,t={bufferSize:8192};e.audioContext&&(t.audioContext=e.audioContext),e.audioDestination&&(t.output=e.audioDestination),e.audioBackendFactory&&(t.backendFactory=e.audioBackendFactory);var i=this._audioFeeder=new c.default(t);i.init(this._audioInfo.channels,this._audioInfo.rate),this.onaudiofeedercreated&&this.onaudiofeedercreated(this._audioFeeder),i.bufferThreshold=1,i.volume=this.volume,i.muted=this.muted,i.tempo=this.playbackRate,i.onbufferlow=()=>{this._log("onbufferlow"),this._stream&&(this._stream.buffering||this._stream.seeking)||this._pendingAudio||this._pingProcessing()},i.onstarved=()=>{this._dataEnded?this._log("onstarved: appear to have reached end of audio"):(this._log("onstarved: halting audio due to starvation"),this._stopPlayback(),this._prebufferingAudio=!0),this._isProcessing()||this._pingProcessing(0)}}_startPlayback(e){if(this._audioFeeder){this._audioFeeder.start();var t=this._audioFeeder.getPlaybackState();this._initialPlaybackPosition=t.playbackPosition}else this._initialPlaybackPosition=this._playbackRate*d()/1e3;void 0!==e&&(this._initialPlaybackOffset=e),this._prebufferingAudio=!1,this._log("continuing at "+this._initialPlaybackPosition+", "+this._initialPlaybackOffset)}_stopPlayback(){this._initialPlaybackOffset=this._getPlaybackTime(),this._log("pausing at "+this._initialPlaybackOffset),this._audioFeeder&&this._audioFeeder.stop()}_getPlaybackTime(e){return this._prebufferingAudio||this._paused?this._initialPlaybackOffset:(this._audioFeeder?(e=e||this._audioFeeder.getPlaybackState()).playbackPosition:this._playbackRate*d()/1e3)-this._initialPlaybackPosition+this._initialPlaybackOffset}_stopVideo(){this._log("STOPPING"),this._state=T,this._seekState=F,this._started=!1,this._ended=!1,this._frameEndTimestamp=0,this._audioEndTimestamp=0,this._lastFrameDecodeTime=0,this._prebufferingAudio=!1,this._actionQueue.splice(0,this._actionQueue.length),this._stream&&(this._stream.abort(),this._stream=null,this._streamEnded=!1),this._codec&&(this._codec.close(),this._codec=null,this._pendingFrame=0,this._pendingAudio=0,this._dataEnded=!1),this._videoInfo=null,this._audioInfo=null,this._audioFeeder&&(this._audioFeeder.close(),this._audioFeeder=null),this._nextProcessingTimer&&(clearTimeout(this._nextProcessingTimer),this._nextProcessingTimer=null),this._nextFrameTimer&&(clearTimeout(this._nextFrameTimer),this._nextFrameTimer=null),this._frameSink&&(this._frameSink.clear(),this._frameSink=null),this._decodedFrames&&(this._decodedFrames=[]),this._pendingFrames&&(this._pendingFrames=[]),this._initialSeekTime=0,this._initialPlaybackPosition=0,this._initialPlaybackOffset=0,this._duration=null}_doFrameComplete(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._startedPlaybackInDocument&&!document.body.contains(this)&&y((()=>{this.stop()}));var t=d(),i=t-this._lastFrameTimestamp,s=this._actualPerFrameTime-this._targetPerFrameTime;this._totalJitter+=Math.abs(s),this._playTime+=i;var h={cpuTime:this._lastFrameDecodeTime,drawingTime:this._drawingTime-this._lastFrameDrawingTime,bufferTime:this._bufferTime-this._lastFrameBufferTime,proxyTime:this._proxyTime-this._lastFrameProxyTime,demuxerTime:0,videoTime:0,audioTime:0,clockTime:this._actualPerFrameTime,late:e.dropped,dropped:e.dropped};function n(e){return Math.round(10*e)/10}this._codec&&(h.demuxerTime=this._codec.demuxerCpuTime-this._lastFrameDemuxerCpuTime,h.videoTime+=this._currentVideoCpuTime-this._lastFrameVideoCpuTime,h.audioTime+=this._codec.audioCpuTime-this._lastFrameAudioCpuTime),h.cpuTime+=h.demuxerTime,this._lastFrameDecodeTime=0,this._lastFrameTimestamp=t,this._codec?(this._lastFrameVideoCpuTime=this._currentVideoCpuTime,this._lastFrameAudioCpuTime=this._codec.audioCpuTime,this._lastFrameDemuxerCpuTime=this._codec.demuxerCpuTime):(this._lastFrameVideoCpuTime=0,this._lastFrameAudioCpuTime=0,this._lastFrameDemuxerCpuTime=0),this._lastFrameDrawingTime=this._drawingTime,this._lastFrameBufferTime=this._bufferTime,this._lastFrameProxyTime=this._proxyTime,this._log("drew frame "+e.frameEndTimestamp+": clock time "+n(i)+" (jitter "+n(s)+") cpu: "+n(h.cpuTime)+" (mux: "+n(h.demuxerTime)+" buf: "+n(h.bufferTime)+" draw: "+n(h.drawingTime)+" proxy: "+n(h.proxyTime)+") vid: "+n(h.videoTime)+" aud: "+n(h.audioTime)),this._fireEventAsync("framecallback",h),(!this._lastTimeUpdate||t-this._lastTimeUpdate>=this._timeUpdateInterval)&&(this._lastTimeUpdate=t,this._fireEventAsync("timeupdate")),this._codec&&e.yCbCrBuffer&&this._codec.recycleFrame(e.yCbCrBuffer)}_seekStream(e){this._stream.seeking&&this._stream.abort(),this._stream.buffering&&this._stream.abort(),this._streamEnded=!1,this._dataEnded=!1,this._ended=!1,this._stream.seek(e).then((()=>{this._readBytesAndWait()})).catch((e=>{this._onStreamError(e)}))}_onStreamError(e){"AbortError"===e.name?this._log("i/o promise canceled; ignoring"):(this._log("i/o error: "+e),this._mediaError=new p.default(p.default.MEDIA_ERR_NETWORK,String(e)),this._state=R,this._stopPlayback())}_seek(e,t){if(this._log("requested seek to "+e+", mode "+t),this.readyState==this.HAVE_NOTHING)return this._log("not yet loaded; saving seek position for later"),void(this._initialSeekTime=e);if(this._stream&&!this._stream.seekable)throw new Error("Cannot seek a non-seekable stream");if(this._codec&&!this._codec.seekable)throw new Error("Cannot seek in a non-seekable file");var prepForSeek=i=>{this._stream&&this._stream.buffering&&this._stream.abort(),this._stream&&this._stream.seeking&&this._stream.abort(),this._actionQueue.splice(0,this._actionQueue.length),this._stopPlayback(),this._prebufferingAudio=!1,this._audioFeeder&&this._audioFeeder.flush(),this._state=A,this._seekTargetTime=e,this._seekMode=t,this._codec?this._codec.flush(i):i()};prepForSeek((()=>{this._isProcessing()||this._pingProcessing(0)})),this._actionQueue.push((()=>{prepForSeek((()=>{this._doSeek(e)}))}))}_doSeek(e){this._streamEnded=!1,this._dataEnded=!1,this._ended=!1,this._state=A,this._seekTargetTime=e,this._lastSeekPosition=-1,this._decodedFrames=[],this._pendingFrames=[],this._pendingFrame=0,this._pendingAudio=0,this._didSeek=!1,this._codec.seekToKeypoint(e,(t=>{if(t)return this._seekState=S,this._fireEventAsync("seeking"),this._didSeek?void 0:void this._pingProcessing();this._codec.getKeypointOffset(e,(e=>{e>0?(this._seekState=S,this._seekStream(e)):(this._seekState=O,this._startBisection(this._seekTargetTime)),this._fireEventAsync("seeking")}))}))}_startBisection(e){var t=Math.max(0,this._stream.length-65536);this._bisectTargetTime=e,this._seekBisector=new f.default({start:0,end:t,process:(e,t,i)=>i!=this._lastSeekPosition&&(this._lastSeekPosition=i,this._codec.flush((()=>{this._seekStream(i)})),!0)}),this._seekBisector.start()}_continueSeekedPlayback(){this._seekState=F,this._state=E,this._frameEndTimestamp=this._codec.frameTimestamp,this._audioEndTimestamp=this._codec.audioTimestamp,this._codec.hasAudio?this._seekTargetTime=this._codec.audioTimestamp:this._seekTargetTime=this._codec.frameTimestamp,this._initialPlaybackOffset=this._seekTargetTime;var finishedSeeking=()=>{this._lastTimeUpdate=this._seekTargetTime,this._fireEventAsync("timeupdate"),this._fireEventAsync("seeked"),this._isProcessing()||this._pingProcessing()};if(this._codec.hasVideo&&this._decodedFrames.length){var e=this._decodedFrames.shift();this._drawFrame(e.yCbCrBuffer),finishedSeeking()}else{if(this._codec.hasVideo&&this._codec.frameReady)return this._codec.decodeFrame((e=>{e&&this._drawFrame(this._codec.frameBuffer),finishedSeeking()})),void this._codec.sync();finishedSeeking()}}_drawFrame(e){this._thumbnail&&(this.removeChild(this._thumbnail),this._thumbnail=null),this._frameSink.drawFrame(e)}_doProcessLinearSeeking(){var e;if(e=this._codec.hasVideo?this._targetPerFrameTime/1e3:1/256,this._codec.hasVideo){if(this._pendingFrame)return;if(!this._codec.frameReady)return void this._codec.process((e=>{e?this._pingProcessing():this._streamEnded?(this._log("stream ended during linear seeking on video"),this._dataEnded=!0,this._continueSeekedPlayback()):this._readBytesAndWait()}));if(this._seekMode===D&&this._codec.keyframeTimestamp==this._codec.frameTimestamp)return void this._continueSeekedPlayback();if(this._codec.frameTimestamp<=this._seekTargetTime){var t=this._codec.frameTimestamp;return this._pendingFrame++,this._pendingFrames.push({frameEndTimestamp:t}),this._decodedFrames.splice(0,this._decodedFrames.length),this._codec.decodeFrame((e=>{this._pendingFrame--,this._pendingFrames.shift(),this._decodedFrames.push({yCbCrBuffer:this._codec.frameBuffer,videoCpuTime:this._codec.videoCpuTime,frameEndTimestamp:t}),this._pingProcessing()})),void this._codec.sync()}if(!this._codec.hasAudio)return void this._continueSeekedPlayback()}if(this._codec.hasAudio){if(this._pendingAudio)return;return this._codec.audioReady?this._codec.audioTimestamp+e{this._pingProcessing()})):void this._continueSeekedPlayback():void this._codec.process((e=>{e?this._pingProcessing():this._streamEnded?(this._log("stream ended during linear seeking on audio"),this._dataEnded=!0,this._continueSeekedPlayback()):this._readBytesAndWait()}))}}_doProcessBisectionSeek(){var e,t;if(this._codec.hasVideo)t=this._codec.frameTimestamp,e=this._targetPerFrameTime/1e3;else{if(!this._codec.hasAudio)throw new Error("Invalid seek state; no audio or video track available");t=this._codec.audioTimestamp,e=1/256}t<0?this._codec.process((e=>{if(e)this._pingProcessing();else if(this._streamEnded){if(this._log("stream ended during bisection seek"),!this._seekBisector.right())throw this._log("failed going back"),new Error("not sure what to do")}else this._readBytesAndWait()})):t-e/2>this._bisectTargetTime?this._seekBisector.left()||(this._log("close enough (left)"),this._seekTargetTime=t,this._continueSeekedPlayback()):t+e/20?this._targetPerFrameTime=1e3/this._videoInfo.fps:this._targetPerFrameTime=16.667,this._canvas.width=this._videoInfo.displayWidth,this._canvas.height=this._videoInfo.displayHeight,OGVPlayer.styleManager.appendRule("."+this._instanceId,{width:this._videoInfo.displayWidth+"px",height:this._videoInfo.displayHeight+"px"});var e={};void 0!==this._options.webGL&&(e.webGL=this._options.webGL),this._options.forceWebGL&&(e.webGL="required"),this._frameSink=h.default.attach(this._canvas,e)}_doProcessing(){if(this._didSeek&&(this._didSeek=!1),this._nextProcessingTimer=null,this._isProcessing(),this._depth>0)throw new Error("REENTRANCY FAIL: doProcessing recursing unexpectedly");var e=0;do{if(this._needProcessing=!1,this._depth++,this._doProcessingLoop(),this._depth--,this._needProcessing&&this._isProcessing())throw new Error("REENTRANCY FAIL: waiting on input or codec but asked to keep processing");++e>500&&(this._log("stuck in processing loop; breaking with timer"),this._needProcessing=0,this._pingProcessing(0))}while(this._needProcessing)}_doProcessingLoop(){if(this._actionQueue.length)this._actionQueue.shift()();else if(this._state==T)this._doProcessInitial();else if(this._state==k)this._doProcessSeekingEnd();else if(this._state==w)this._doProcessLoaded();else if(this._state==P)this._doProcessPreload();else if(this._state==E)this._doProcessReady();else if(this._state==A)this._doProcessSeeking();else if(this._state==x)this._doProcessPlay();else{if(this._state!=R)throw new Error("Unexpected OGVPlayer state "+this._state);this._doProcessError()}}_doProcessInitial(){if(this._codec.loadedMetadata){if(!this._codec.hasVideo&&!this._codec.hasAudio)throw new Error("No audio or video found, something is wrong");this._codec.hasAudio&&(this._audioInfo=this._codec.audioFormat),this._codec.hasVideo&&(this._videoInfo=this._codec.videoFormat,this._setupVideo()),isNaN(this._codec.duration)||(this._duration=this._codec.duration),null===this._duration&&this._stream.seekable&&"video/ogg"==this._detectedType?(this._state=k,this._lastSeenTimestamp=-1,this._codec.flush((()=>{this._seekStream(Math.max(0,this._stream.length-131072))}))):(this._state=w,this._pingProcessing())}else this._codec.process((e=>{if(e)this._pingProcessing();else{if(this._streamEnded)throw new Error("end of file before headers found");this._log("reading more cause we are out of data"),this._readBytesAndWait()}}))}_doProcessSeekingEnd(){this._codec.frameReady?(this._log("saw frame with "+this._codec.frameTimestamp),this._lastSeenTimestamp=Math.max(this._lastSeenTimestamp,this._codec.frameTimestamp),this._codec.discardFrame((()=>{this._pingProcessing()}))):this._codec.audioReady?(this._log("saw audio with "+this._codec.audioTimestamp),this._lastSeenTimestamp=Math.max(this._lastSeenTimestamp,this._codec.audioTimestamp),this._codec.discardAudio((()=>{this._pingProcessing()}))):this._codec.process((e=>{e?this._pingProcessing():this._stream.eof?(this._log("seek-duration: we are at the end: "+this._lastSeenTimestamp),this._lastSeenTimestamp>0&&(this._duration=this._lastSeenTimestamp),this._state=w,this._codec.flush((()=>{this._streamEnded=!1,this._dataEnded=!1,this._seekStream(0)}))):this._readBytesAndWait()}))}_doProcessLoaded(){this._state=P,this._fireEventAsync("loadedmetadata"),this._fireEventAsync("durationchange"),this._codec.hasVideo&&this._fireEventAsync("resize"),this._pingProcessing(0)}_doProcessPreload(){!this._codec.frameReady&&this._codec.hasVideo||!this._codec.audioReady&&this._codec.hasAudio?this._codec.process((e=>{e?this._pingProcessing():this._streamEnded?this._ended=!0:this._readBytesAndWait()})):(this._state=E,this._fireEventAsync("loadeddata"),this._pingProcessing())}_doProcessReady(){if(this._log("initial seek to "+this._initialSeekTime),this._initialSeekTime>0){var e=this._initialSeekTime;this._initialSeekTime=0,this._log("initial seek to "+e),this._doSeek(e)}else if(this._paused)this._log("paused while in ready");else{var finishStartPlaying=()=>{this._log("finishStartPlaying"),this._state=x,this._lastFrameTimestamp=d(),this._codec.hasAudio&&this._audioFeeder?this._prebufferingAudio=!0:this._startPlayback(),this._pingProcessing(0),this._fireEventAsync("play"),this._fireEventAsync("playing")};!this._codec.hasAudio||this._audioFeeder||this._muted?finishStartPlaying():(this._initAudioFeeder(),this._audioFeeder.waitUntilReady(finishStartPlaying))}}_doProcessSeeking(){if(this._seekState==F)throw new Error("seeking in invalid state (not seeking?)");if(this._seekState==O)this._doProcessBisectionSeek();else if(this._seekState==C)this._doProcessBisectionSeek();else{if(this._seekState!=S)throw new Error("Invalid seek state "+this._seekState);this._doProcessLinearSeeking()}}_doProcessPlay(){var e=this._codec;if(this._paused)this._log("paused during playback; stopping loop");else if((!e.hasAudio||e.audioReady||this._pendingAudio||this._dataEnded)&&(!e.hasVideo||e.frameReady||this._pendingFrame||this._decodedFrames.length||this._dataEnded)){var t,i,s,d=null,h=0,u=!1,c=0;if(e.hasAudio&&this._audioFeeder?(d=this._audioFeeder.getPlaybackState(),h=this._getPlaybackTime(d),u=this._dataEnded&&0==this._audioFeeder.durationBuffered,this._prebufferingAudio&&(this._audioFeeder.durationBuffered>=2*this._audioFeeder.bufferThreshold&&(!e.hasVideo||this._decodedFrames.length>=this._framePipelineDepth)||this._dataEnded)&&(this._log("prebuffering audio done; buffered to "+this._audioFeeder.durationBuffered),this._startPlayback(h),this._prebufferingAudio=!1),d.dropped!=this._droppedAudio&&this._log("dropped "+(d.dropped-this._droppedAudio)),d.delayed!=this._delayedAudio&&this._log("delayed "+(d.delayed-this._delayedAudio)),this._droppedAudio=d.dropped,this._delayedAudio=d.delayed,(t=this._audioFeeder.durationBuffered<=2*this._audioFeeder.bufferThreshold)&&(this._codec.audioReady?this._pendingAudio>=this._audioPipelineDepth&&(this._log("audio decode disabled: "+this._pendingAudio+" packets in flight"),t=!1):t=!1)):(h=this._getPlaybackTime(),t=this._codec.audioReady&&this._audioEndTimestamp0,s=this._pendingFrame+this._decodedFrames.length=l){for(var f=-1,_=0;_=0)for(;f-- >=0;){this._lateFrames++;var p=this._decodedFrames.shift();this._log("skipping already-decoded late frame at "+p.frameEndTimestamp),c=1e3*(p.frameEndTimestamp-h),this._frameEndTimestamp=p.frameEndTimestamp,this._actualPerFrameTime=this._targetPerFrameTime-c,this._framesProcessed++,p.dropped=!0,this._doFrameComplete(p)}var m=this._codec.nextKeyframeTimestamp,g=m-this._targetPerFrameTime/1e3*(this._framePipelineDepth+this._pendingFrame);if(m>=0&&m!=this._codec.frameTimestamp&&h>=g){this._log("skipping late frame at "+this._decodedFrames[0].frameEndTimestamp+" vs "+h+", expect to see keyframe at "+m);for(var v=0;v{})),this._framesProcessed++,this._doFrameComplete(k)}return void(this._isProcessing()||this._pingProcessing())}}else i&&c<=4||(i=!1)}if(s){this._log("play loop: ready to decode frame; thread depth: "+this._pendingFrame+", have buffered: "+this._decodedFrames.length),0==this._videoInfo.fps&&this._codec.frameTimestamp-this._frameEndTimestamp>0&&(this._targetPerFrameTime=1e3*(this._codec.frameTimestamp-this._frameEndTimestamp)),this._totalFrameTime+=this._targetPerFrameTime,this._totalFrameCount++;var w=this._frameEndTimestamp=this._codec.frameTimestamp;this._pendingFrame++,this._pendingFrames.push({frameEndTimestamp:w});var P=this._pendingFrames,E=!1,x=this._time((()=>{this._codec.decodeFrame((e=>{P===this._pendingFrames?(this._log("play loop callback: decoded frame"),this._pendingFrame--,this._pendingFrames.shift(),e?this._decodedFrames.push({yCbCrBuffer:this._codec.frameBuffer,videoCpuTime:this._codec.videoCpuTime,frameEndTimestamp:w}):this._log("Bad video packet or something"),this._codec.process((()=>{this._isProcessing()||this._pingProcessing(E?void 0:0)}))):this._log("play loop callback after flush, discarding")}))}));this._pendingFrame&&(E=!0,this._proxyTime+=x,this._pingProcessing(),this._dataEnded&&this._codec.sync())}else if(t){this._log("play loop: ready for audio; depth: "+this._pendingAudio),this._pendingAudio++;var A=this._codec.audioTimestamp,R=this._time((()=>{this._codec.decodeAudio((e=>{if(this._pendingAudio--,this._log("play loop callback: decoded audio"),this._audioEndTimestamp=A,e){var t=this._codec.audioBuffer;if(t&&(this._bufferTime+=this._time((()=>{this._audioFeeder&&this._audioFeeder.bufferData(t)})),!this._codec.hasVideo)){this._framesProcessed++;var i={frameEndTimestamp:this._audioEndTimestamp};this._doFrameComplete(i)}}this._isProcessing()||this._pingProcessing()}))}));this._pendingAudio&&(this._proxyTime+=R,this._codec.audioReady?this._pingProcessing():this._doProcessPlayDemux())}else if(i){this._log("play loop: ready to draw frame"),this._nextFrameTimer&&(clearTimeout(this._nextFrameTimer),this._nextFrameTimer=null),this._thumbnail&&(this.removeChild(this._thumbnail),this._thumbnail=null);var F=this._decodedFrames.shift();this._currentVideoCpuTime=F.videoCpuTime,this._drawingTime+=this._time((()=>{this._drawFrame(F.yCbCrBuffer)})),this._framesProcessed++,this._doFrameComplete(F),this._pingProcessing()}else if(!this._decodedFrames.length||this._nextFrameTimer||this._prebufferingAudio)if(this._dataEnded&&!(this._pendingAudio||this._pendingFrame||this._decodedFrames.length)){this._log("play loop: playback reached end of data "+[this._pendingAudio,this._pendingFrame,this._decodedFrames.length]);var O=0;this._codec.hasAudio&&this._audioFeeder&&(O=1e3*this._audioFeeder.durationBuffered),O>0?(this._log("play loop: ending pending "+O+" ms"),this._pingProcessing(Math.max(0,O))):(this._log("play loop: ENDING NOW: playback time "+this._getPlaybackTime()+"; frameEndTimestamp: "+this._frameEndTimestamp),this._stopPlayback(),this._prebufferingAudio=!1,this._initialPlaybackOffset=Math.max(this._audioEndTimestamp,this._frameEndTimestamp),this._ended=!0,this._paused=!0,this._fireEventAsync("pause"),this._fireEventAsync("ended"))}else this._prebufferingAudio&&(e.hasVideo&&!e.frameReady||e.hasAudio&&!e.audioReady)?(this._log("play loop: prebuffering demuxing"),this._doProcessPlayDemux()):this._log("play loop: waiting on async/timers");else{var C=c;this._log("play loop: setting a timer for drawing "+C),this._nextFrameTimer=setTimeout((()=>{this._nextFrameTimer=null,this._pingProcessing()}),C)}}else this._log("play loop: demuxing"),this._doProcessPlayDemux()}_doProcessPlayDemux(){var e=this._codec.frameReady,t=this._codec.audioReady;this._codec.process((i=>{this._codec.frameReady&&!e||this._codec.audioReady&&!t?(this._log("demuxer has packets"),this._pingProcessing()):i?(this._log("demuxer processing to find more packets"),this._pingProcessing()):(this._log("demuxer ran out of data"),this._streamEnded?(this._log("demuxer reached end of data stream"),this._dataEnded=!0,this._pingProcessing()):(this._log("demuxer loading more data"),this._readBytesAndWait()))}))}_doProcessError(){}_isProcessing(){return this._stream&&(this._stream.buffering||this._stream.seeking)||this._codec&&this._codec.processing}_readBytesAndWait(){if(this._stream.buffering||this._stream.seeking)this._log("readBytesAndWait during i/o");else{this._stream.read(32768).then((e=>{this._log("got input "+[e.byteLength]),e.byteLength&&this._actionQueue.push((()=>{this._codec.receiveInput(e,(()=>{this._pingProcessing()}))})),this._stream.eof&&(this._log("stream is at end!"),this._streamEnded=!0),this._isProcessing()||this._pingProcessing()})).catch((e=>{this._onStreamError(e)}))}}_pingProcessing(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;if(this._stream&&this._stream.waiting)this._log("waiting on input");else{this._nextProcessingTimer&&(this._log("canceling old processing timer"),clearTimeout(this._nextProcessingTimer),this._nextProcessingTimer=null);e>-1/256?this._nextProcessingTimer=setTimeout((()=>{this._pingProcessing()}),e):this._depth?this._needProcessing=!0:this._doProcessing()}}_startProcessingVideo(e){if(!this._started&&!this._codec){this._framesProcessed=0,this._bufferTime=0,this._drawingTime=0,this._proxyTime=0,this._started=!0,this._ended=!1;var t={base:this._options.base,worker:this._enableWorker,threading:this._enableThreading,simd:this._enableSIMD};this._detectedType&&(t.type=this._detectedType),this._codec=new v.default(t),this._lastVideoCpuTime=0,this._lastAudioCpuTime=0,this._lastDemuxerCpuTime=0,this._lastBufferTime=0,this._lastDrawingTime=0,this._lastProxyTime=0,this._lastFrameVideoCpuTime=0,this._lastFrameAudioCpuTime=0,this._lastFrameDemuxerCpuTime=0,this._lastFrameBufferTime=0,this._lastFrameProxyTime=0,this._lastFrameDrawingTime=0,this._currentVideoCpuTime=0,this._codec.onseek=e=>{this._didSeek=!0,this._stream&&this._seekStream(e)},this._codec.init((()=>{this._codec.receiveInput(e,(()=>{this._readBytesAndWait()}))}))}}_loadCodec(e){this._stream.read(1024).then((t=>{var i=new Uint8Array(t);i.length>4&&i[0]=="O".charCodeAt(0)&&i[1]=="g".charCodeAt(0)&&i[2]=="g".charCodeAt(0)&&i[3]=="S".charCodeAt(0)?this._detectedType="video/ogg":i.length>4&&26==i[0]&&69==i[1]&&223==i[2]&&163==i[3]?this._detectedType="video/webm":this._detectedType="video/ogg",e(t)}))}_prepForLoad(e){this._stopVideo();var doLoad=()=>{this._options.stream?this._stream=this._options.stream:this._stream=new u.default({url:this.src,cacheSize:16777216,progressive:!1}),this._stream.load().then((()=>{this._loading=!1,this._currentSrc=this.src,this._byteLength=this._stream.seekable?this._stream.length:0;var e=this._stream.headers["x-content-duration"];"string"==typeof e&&(this._duration=parseFloat(e)),this._loadCodec((e=>{this._startProcessingVideo(e)}))})).catch((e=>{this._onStreamError(e)}))};this._currentSrc="",this._loading=!0,this._actionQueue.push((()=>{e&&"none"===this.preload?this._loading=!1:doLoad()})),this._pingProcessing(0)}load(){this._prepForLoad()}canPlayType(e){var t=new m.default(e);function checkTypes(e){if(t.codecs){var i=0,s=0;return t.codecs.forEach((t=>{e.indexOf(t)>=0?i++:s++})),0===i||s>0?"":"probably"}return"maybe"}return"ogg"!==t.minor||"audio"!==t.major&&"video"!==t.major&&"application"!==t.major?"webm"!==t.minor||"audio"!==t.major&&"video"!==t.major?"":checkTypes(["vorbis","opus","vp8","vp9"]):checkTypes(["vorbis","opus","theora"])}play(){this._muted||this._options.audioContext||OGVPlayer.initSharedAudioContext(),this._paused&&(this._startedPlaybackInDocument=document.body.contains(this),this._paused=!1,this._state==A||(this._started&&this._codec&&this._codec.loadedMetadata?(this._ended&&this._stream&&this._byteLength?(this._log(".play() starting over after end"),this._seek(0)):this._log(".play() while already started"),this._state=E,this._isProcessing()||this._pingProcessing()):this._loading?this._log(".play() while loading"):(this._log(".play() before started"),this._stream||this.load())))}getPlaybackStats(){return{targetPerFrameTime:this._targetPerFrameTime,framesProcessed:this._framesProcessed,videoBytes:this._codec?this._codec.videoBytes:0,audioBytes:this._codec?this._codec.audioBytes:0,playTime:this._playTime,demuxingTime:this._codec?this._codec.demuxerCpuTime-this._lastDemuxerCpuTime:0,videoDecodingTime:this._codec?this._codec.videoCpuTime-this._lastVideoCpuTime:0,audioDecodingTime:this._codec?this._codec.audioCpuTime-this._lastAudioCpuTime:0,bufferTime:this._bufferTime-this._lastBufferTime,drawingTime:this._drawingTime-this._lastDrawingTime,proxyTime:this._proxyTime-this._lastProxyTime,droppedAudio:this._droppedAudio,delayedAudio:this._delayedAudio,jitter:this._totalJitter/this._framesProcessed,lateFrames:this._lateFrames}}resetPlaybackStats(){this._framesProcessed=0,this._playTime=0,this._codec&&(this._lastDemuxerCpuTime=this._codec.demuxerCpuTime,this._lastVideoCpuTime=this._codec.videoCpuTime,this._lastAudioCpuTime=this._codec.audioCpuTime,this._codec.videoBytes=0,this._codec.audioBytes=0),this._lastBufferTime=this._bufferTime,this._lastDrawingTime=this._drawingTime,this._lastProxyTime=this._proxyTime,this._totalJitter=0,this._totalFrameTime=0,this._totalFrameCount=0}getVideoFrameSink(){return this._frameSink}getCanvas(){return this._canvas}getVideo(){return null}pause(){this._paused||(this._nextProcessingTimer&&(clearTimeout(this._nextProcessingTimer),this._nextProcessingTimer=null),this._stopPlayback(),this._prebufferingAudio=!1,this._paused=!0,this._fireEvent("pause"))}stop(){this._stopVideo(),this._paused=!0}fastSeek(e){this._seek(+e,D)}}(0,_.default)(OGVPlayer,b),OGVPlayer.instanceCount=0,OGVPlayer.styleManager=new function StyleManager(){var e=document.createElement("style");e.type="text/css",e.textContent="ogvjs { display: inline-block; position: relative; -webkit-user-select: none; -webkit-tap-highlight-color: rgba(0,0,0,0); ",document.head.appendChild(e);var t=e.sheet;this.appendRule=function(e,i){var s=[];for(var d in i)i.hasOwnProperty(d)&&s.push(d+":"+i[d]);var h=e+"{"+s.join(";")+"}";t.insertRule(h,t.cssRules.length-1)}};var M=OGVPlayer;t.default=M},580:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=function OGVProxyClass(e){return class{constructor(t,i,s){for(var d in s=s||{},this.worker=t,this.transferables=function(){var e=new ArrayBuffer(1024),i=new Uint8Array(e);try{return t.postMessage({action:"transferTest",bytes:i},[e]),!e.byteLength}catch(e){return!1}}(),e)e.hasOwnProperty(d)&&(this[d]=e[d]);this.processingQueue=0,Object.defineProperty(this,"processing",{get:function get(){return this.processingQueue>0}}),this.messageCount=0,this.pendingCallbacks={},this.worker.addEventListener("message",(e=>{this.handleMessage(e)})),this.proxy("construct",[i,s],(()=>{}))}proxy(e,t,i){var s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];if(!this.worker)throw'Tried to call "'+e+'" method on closed proxy object';var d="callback-"+ ++this.messageCount+"-"+e;i&&(this.pendingCallbacks[d]=i);var h={action:e,callbackId:d,args:t||[]};this.processingQueue++,this.transferables?this.worker.postMessage(h,s):this.worker.postMessage(h)}terminate(){this.worker&&(this.worker.terminate(),this.worker=null,this.processingQueue=0,this.pendingCallbacks={})}handleMessage(e){if(this.processingQueue--,"callback"===e.data.action){var t=e.data,i=t.callbackId,s=t.args,d=this.pendingCallbacks[i];if(t.props)for(var h in t.props)t.props.hasOwnProperty(h)&&(this[h]=t.props[h]);d&&(delete this.pendingCallbacks[i],d.apply(this,s))}}}};t.default=i},168:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=class OGVTimeRanges{constructor(e){this._ranges=e,this.length=e.length}start(e){if(e<0||e>this.length||e!==(0|e))throw new RangeError("Invalid index");return this._ranges[e][0]}end(e){if(e<0||e>this.length||e!==(0|e))throw new RangeError("Invalid index");return this._ranges[e][1]}};t.default=i},625:(e,t,i)=>{"use strict";var s=i(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var d=s(i(964));var h=class OGVWrapperCodec{constructor(e){return this.options=e||{},this.demuxer=null,this.videoDecoder=null,this.audioDecoder=null,this.flushIter=0,this.loadedMetadata=!1,this.processing=!1,Object.defineProperties(this,{duration:{get:function get(){return this.loadedMetadata?this.demuxer.duration:NaN}},hasAudio:{get:function get(){return this.loadedMetadata&&!!this.audioDecoder}},audioReady:{get:function get(){return this.hasAudio&&this.demuxer.audioReady}},audioTimestamp:{get:function get(){return this.demuxer.audioTimestamp}},audioFormat:{get:function get(){return this.hasAudio?this.audioDecoder.audioFormat:null}},audioBuffer:{get:function get(){return this.hasAudio?this.audioDecoder.audioBuffer:null}},hasVideo:{get:function get(){return this.loadedMetadata&&!!this.videoDecoder}},frameReady:{get:function get(){return this.hasVideo&&this.demuxer.frameReady}},frameTimestamp:{get:function get(){return this.demuxer.frameTimestamp}},keyframeTimestamp:{get:function get(){return this.demuxer.keyframeTimestamp}},nextKeyframeTimestamp:{get:function get(){return this.demuxer.nextKeyframeTimestamp}},videoFormat:{get:function get(){return this.hasVideo?this.videoDecoder.videoFormat:null}},frameBuffer:{get:function get(){return this.hasVideo?this.videoDecoder.frameBuffer:null}},seekable:{get:function get(){return this.demuxer.seekable}},demuxerCpuTime:{get:function get(){return this.demuxer?this.demuxer.cpuTime:0}},audioCpuTime:{get:function get(){return this.audioDecoder?this.audioDecoder.cpuTime:0}},videoCpuTime:{get:function get(){return this.videoDecoder?this.videoDecoder.cpuTime:0}}}),this.loadedDemuxerMetadata=!1,this.loadedAudioMetadata=!1,this.loadedVideoMetadata=!1,this.loadedAllMetadata=!1,this.onseek=null,this.videoBytes=0,this.audioBytes=0,this}flushSafe(e){var t=this.flushIter;return i=>{this.flushIter<=t&&e(i)}}init(e){var t;this.processing=!0,t="video/webm"===this.options.type||"audio/webm"===this.options.type?"OGVDemuxerWebMW":"OGVDemuxerOggW",d.default.loadClass(t,(t=>{t().then((t=>{this.demuxer=t,t.onseek=e=>{this.onseek&&this.onseek(e)},t.init((()=>{this.processing=!1,e()}))}))}))}close(){this.demuxer&&(this.demuxer.close(),this.demuxer=null),this.videoDecoder&&(this.videoDecoder.close(),this.videoDecoder=null),this.audioDecoder&&(this.audioDecoder.close(),this.audioDecoder=null)}receiveInput(e,t){this.demuxer.receiveInput(e,t)}process(e){if(this.processing)throw new Error("reentrancy fail on OGVWrapperCodec.process");this.processing=!0;var finish=t=>{this.processing=!1,e(t)},doProcessData=()=>{this.demuxer.process(finish)};this.demuxer.loadedMetadata&&!this.loadedDemuxerMetadata?this.loadAudioCodec((()=>{this.loadVideoCodec((()=>{this.loadedDemuxerMetadata=!0,this.loadedAudioMetadata=!this.audioDecoder,this.loadedVideoMetadata=!this.videoDecoder,this.loadedAllMetadata=this.loadedAudioMetadata&&this.loadedVideoMetadata,finish(!0)}))})):this.loadedDemuxerMetadata&&!this.loadedAudioMetadata?this.audioDecoder.loadedMetadata?(this.loadedAudioMetadata=!0,this.loadedAllMetadata=this.loadedAudioMetadata&&this.loadedVideoMetadata,finish(!0)):this.demuxer.audioReady?this.demuxer.dequeueAudioPacket(((e,t)=>{this.audioBytes+=e.byteLength,this.audioDecoder.processHeader(e,(e=>{finish(!0)}))})):doProcessData():this.loadedAudioMetadata&&!this.loadedVideoMetadata?this.videoDecoder.loadedMetadata?(this.loadedVideoMetadata=!0,this.loadedAllMetadata=this.loadedAudioMetadata&&this.loadedVideoMetadata,finish(!0)):this.demuxer.frameReady?(this.processing=!0,this.demuxer.dequeueVideoPacket((e=>{this.videoBytes+=e.byteLength,this.videoDecoder.processHeader(e,(()=>{finish(!0)}))}))):doProcessData():this.loadedVideoMetadata&&!this.loadedMetadata&&this.loadedAllMetadata?(this.loadedMetadata=!0,finish(!0)):!this.loadedMetadata||this.hasAudio&&!this.demuxer.audioReady||this.hasVideo&&!this.demuxer.frameReady?doProcessData():finish(!0)}decodeFrame(e){var t=this.flushSafe(e),i=this.frameTimestamp,s=this.keyframeTimestamp;this.demuxer.dequeueVideoPacket((e=>{this.videoBytes+=e.byteLength,this.videoDecoder.processFrame(e,(e=>{var d=this.videoDecoder.frameBuffer;d&&(d.timestamp=i,d.keyframeTimestamp=s),t(e)}))}))}decodeAudio(e){var t=this.flushSafe(e);this.demuxer.dequeueAudioPacket(((e,i)=>{this.audioBytes+=e.byteLength,this.audioDecoder.processAudio(e,(e=>{if(i){var s=this.audioDecoder.audioBuffer,d=[];for(var h of s){var u=Math.round(i*this.audioFormat.rate/1e9);u>0?d.push(h.subarray(0,h.length-Math.min(u,h.length))):d.push(h.subarray(Math.min(Math.abs(u),h.length),h.length))}this.audioDecoder.audioBuffer=d}return t(e)}))}))}discardFrame(e){this.demuxer.dequeueVideoPacket((t=>{this.videoBytes+=t.byteLength,e()}))}discardAudio(e){this.demuxer.dequeueAudioPacket(((t,i)=>{this.audioBytes+=t.byteLength,e()}))}flush(e){this.flushIter++,this.demuxer.flush(e)}sync(){this.videoDecoder&&this.videoDecoder.sync()}recycleFrame(e){this.videoDecoder&&this.videoDecoder.recycleFrame(e)}getKeypointOffset(e,t){this.demuxer.getKeypointOffset(e,t)}seekToKeypoint(e,t){this.demuxer.seekToKeypoint(e,this.flushSafe(t))}loadAudioCodec(e){if(this.demuxer.audioCodec){var t={vorbis:"OGVDecoderAudioVorbisW",opus:"OGVDecoderAudioOpusW"}[this.demuxer.audioCodec];this.processing=!0,d.default.loadClass(t,(t=>{var i={};this.demuxer.audioFormat&&(i.audioFormat=this.demuxer.audioFormat),t(i).then((t=>{this.audioDecoder=t,t.init((()=>{this.loadedAudioMetadata=t.loadedMetadata,this.processing=!1,e()}))}))}),{worker:this.options.worker})}else e()}loadVideoCodec(e){if(this.demuxer.videoCodec){var t=!!this.options.simd,i=!!this.options.threading,s={theora:"OGVDecoderVideoTheoraW",vp8:i?"OGVDecoderVideoVP8MTW":"OGVDecoderVideoVP8W",vp9:i?t?"OGVDecoderVideoVP9SIMDMTW":"OGVDecoderVideoVP9MTW":t?"OGVDecoderVideoVP9SIMDW":"OGVDecoderVideoVP9W",av1:i?t?"OGVDecoderVideoAV1SIMDMTW":"OGVDecoderVideoAV1MTW":t?"OGVDecoderVideoAV1SIMDW":"OGVDecoderVideoAV1W"}[this.demuxer.videoCodec];this.processing=!0,d.default.loadClass(s,(t=>{var s={};this.demuxer.videoFormat&&(s.videoFormat=this.demuxer.videoFormat),i&&delete window.ENVIRONMENT_IS_PTHREAD,t(s).then((t=>{this.videoDecoder=t,t.init((()=>{this.loadedVideoMetadata=t.loadedMetadata,this.processing=!1,e()}))}))}),{worker:this.options.worker&&!this.options.threading})}else e()}};t.default=h},539:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=new class WebAssemblyChecker{constructor(){this.tested=!1,this.testResult=void 0}wasmSupported(){if(!this.tested){try{"object"==typeof WebAssembly?this.testResult=function testSafariWebAssemblyBug(){var e=new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,1,127,1,127,3,2,1,0,5,3,1,0,1,7,8,1,4,116,101,115,116,0,0,10,16,1,14,0,32,0,65,1,54,2,0,32,0,40,2,0,11]),t=new WebAssembly.Module(e);return 0!==new WebAssembly.Instance(t,{}).exports.test(4)}():this.testResult=!1}catch(e){console.log("Exception while testing WebAssembly",e),this.testResult=!1}this.tested=!0}return this.testResult}};t.default=i},309:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=function extend(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])};t.default=i},431:(e,t,i)=>{"use strict";var s=function(){function defineProperties(e,t){for(var i=0;i{"use strict";var s=function(){function defineProperties(e,t){for(var i=0;i=200&&e.xhr.status<300?(e.length=getXHRLength(e.xhr),e.headers=function getXHRHeaders(e){var t={};return e.getAllResponseHeaders().split(/\r?\n/).forEach((function(e){var i=e.split(/:\s*/,2);i.length>1&&(t[i[0].toLowerCase()]=i[1])})),t}(e.xhr),e.onXHRStart()):(s(),i(new Error("HTTP error "+e.xhr.status)))}},h=function checkError(){s(),i(new Error("network error"))},u=function checkBackendOpen(){s(),t()};s=function oncomplete(){e.xhr.removeEventListener("readystatechange",d),e.xhr.removeEventListener("error",h),e.off("open",u),e._onAbort=null},e.initXHR(),e.xhr.addEventListener("readystatechange",d),e.xhr.addEventListener("error",h),e.on("open",u),e.xhr.send()}))}},{key:"bufferToOffset",value:function bufferToOffset(e){return Promise.reject(new Error("abstract"))}},{key:"abort",value:function abort(){if(this.xhr.abort(),this._onAbort){var e=this._onAbort;this._onAbort=null;var t=new Error("Aborted");t.name="AbortError",e(t)}}},{key:"initXHR",value:function initXHR(){var e=this.url;this.cachever&&(e+="?buggy_cachever="+this.cachever),this.xhr.open("GET",e);var t=null;(this.offset||this.length)&&(t="bytes="+this.offset+"-"),this.length&&(t+=this.offset+this.length-1),null!==t&&this.xhr.setRequestHeader("Range",t)}},{key:"onXHRStart",value:function onXHRStart(){throw new Error("abstract")}}]),Backend}(i(566));e.exports=d},810:(e,t,i)=>{"use strict";var s=function(){function defineProperties(e,t){for(var i=0;i0&&(this.bytesRead+=e.length,this.emit("buffer",e))}},{key:"onXHRLoad",value:function onXHRLoad(){this.onXHRProgress(),d(BinaryStringBackend.prototype.__proto__||Object.getPrototypeOf(BinaryStringBackend.prototype),"onXHRLoad",this).call(this)}}]),BinaryStringBackend}(i(828));h.supported=function(){try{return!!(new XMLHttpRequest).overrideMimeType}catch(e){return!1}},e.exports=h},828:(e,t,i)=>{"use strict";var s=function(){function defineProperties(e,t){for(var i=0;i=e)i();else{var d=null;t._onAbort=function(e){d(),s(e)};var h=function checkBuffer(){t.offset>=e&&!t.eof&&(d(),i())},u=function checkDone(){d(),i()},c=function checkError(){d(),s(new Error("error streaming"))};d=function oncomplete(){t.buffering=!1,t.off("buffer",h),t.off("done",u),t.off("error",c),t._onAbort=null},t.buffering=!0,t.on("buffer",h),t.on("done",u),t.on("error",c)}}))}},{key:"initXHR",value:function initXHR(){d(DownloadBackend.prototype.__proto__||Object.getPrototypeOf(DownloadBackend.prototype),"initXHR",this).call(this)}},{key:"onXHRStart",value:function onXHRStart(){var e=this;this.xhr.addEventListener("progress",(function(){return e.onXHRProgress()})),this.xhr.addEventListener("error",(function(){return e.onXHRError()})),this.xhr.addEventListener("load",(function(){return e.onXHRLoad()})),this.emit("open")}},{key:"onXHRProgress",value:function onXHRProgress(){throw new Error("abstract")}},{key:"onXHRError",value:function onXHRError(){this.emit("error")}},{key:"onXHRLoad",value:function onXHRLoad(){this.eof=!0,this.emit("done")}}]),DownloadBackend}(i(306));e.exports=h},761:(e,t,i)=>{"use strict";var s=i(855),d=i(810),h=i(431);var u=null;e.exports=function instantiate(e){if(!1===e.progressive)return new h(e);if(u||(u=function autoselect(){return s.supported()?s:d.supported()?d:null}()),!u)throw new Error("No supported backend class");return new u(e)}},855:(e,t,i)=>{"use strict";var s=function(){function defineProperties(e,t){for(var i=0;i{"use strict";var t=function(){function defineProperties(e,t){for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:{},t=e.buffer,i=void 0===t?void 0:t,s=e.string,d=void 0===s?void 0:s,h=e.start,u=void 0===h?0:h,c=e.end,l=void 0===c?u+(i?i.byteLength:d?d.length:0):c,f=e.prev,_=void 0===f?null:f,p=e.next,m=void 0===p?null:p,g=e.eof,v=void 0!==g&&g,y=e.empty,b=void 0===y?!(i||d):y,T=e.timestamp,k=void 0===T?Date.now():T;_classCallCheck(this,CacheItem),this.start=u,this.end=l,this.prev=_,this.next=m,this.eof=v,this.empty=b,this.timestamp=k,this.buffer=i,this.string=d,Object.defineProperty(this,"length",{get:function get(){return this.end-this.start}})}return t(CacheItem,[{key:"contains",value:function contains(e){return e>=this.start&&(e{"use strict";var s=function(){function defineProperties(e,t){for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:{},t=e.cacheSize,i=void 0===t?0:t;_classCallCheck(this,CachePool);var s=new d({eof:!0});this.head=s,this.tail=s,this.readOffset=0,this.readCursor=s,this.writeOffset=0,this.writeCursor=s,this.cacheSize=i}return s(CachePool,[{key:"bytesReadable",value:function bytesReadable(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1/0,t=this.readOffset,i=this.readCursor,s=i.last((function(i){return!i.empty&&i.start<=t+e}));return s?Math.min(e,s.end-t):0}},{key:"bytesWritable",value:function bytesWritable(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1/0,t=this.writeOffset,i=this.writeCursor;if(i.eof)return e;var s=i.last((function(i){return i.empty&&i.start<=t+e}));return s?Math.min(e,s.end-t):0}},{key:"seekRead",value:function seekRead(e){var t=this.head.first((function(t){return t.contains(e)}));if(!t)throw new Error("read seek out of range");this.readOffset=e,this.readCursor=t}},{key:"seekWrite",value:function seekWrite(e){var t=this.head.first((function(t){return t.contains(e)}));if(!t)throw new Error("write seek out of range");this.writeOffset=e,this.writeCursor=t}},{key:"readBytes",value:function readBytes(e){for(var t=e.byteLength,i=this.bytesReadable(t),s=this.readOffset,d=s+i,h=s,u=this.readCursor;u&&!u.empty&&!(u.start>=d);u=u.next){var c=Math.min(d,u.end),l=e.subarray(h-s,c-s);u.readBytes(l,h,c),h=c}return this.readOffset=h,this.readCursor=this.readCursor.first((function(e){return e.contains(h)})),i}},{key:"write",value:function write(e){var t=this.bufferItem(e),i=this.writeCursor;if(!i.empty)throw new Error("write cursor not empty");if(!i.contains(t.end)&&i.end!==t.end)throw new Error("write cursor too small");i.startthis.readOffset+this.chunkSize)&&t.push(i));if(e>this.cacheSize){t.sort((function(e,t){return e.timestamp-t.timestamp}));for(var s=0;s{"use strict";e.exports=i(91)},566:e=>{"use strict";var t=function(){function defineProperties(e,t){for(var i=0;i=0&&i.splice(s,1)}},{key:"emit",value:function emit(e,t){(this._e[e]||[]).slice().forEach((function(e){return e(t)}))}}]),TinyEvents}();e.exports=i},936:(e,t,i)=>{"use strict";var s=function(){function defineProperties(e,t){for(var i=0;i=0&&c>=e.length)return void t(null);var l=e._clampToLength(s.writeOffset+s.bytesWritable(d))-s.writeOffset;if(0===l)t(null);else{var f=e._backend=new h({url:e.url,offset:e._cache.writeOffset,length:l,cachever:e._cachever,progressive:e.progressive}),_=null,p=function checkOpen(){f!==e._backend?(_(),i(new Error("invalid state"))):(f.on("buffer",(function(t){f===e._backend&&e._cache.write(t)})),f.on("done",(function(){f===e._backend&&(-1===e.length&&(e.length=e._backend.offset+e._backend.bytesRead),e._backend=null)})),t(f))},m=function checkError(t){f!==e._backend?i(new Error("invalid state")):(e._backend=null,i(t))};_=function oncomplete(){f.off("open",p),f.off("error",m)},f.on("open",p),f.on("error",m),f.on("cachever",(function(){e._cachever++})),f.load()}}}))}},{key:"_readAhead",value:function _readAhead(){var e=this;return new Promise((function(t,i){e._backend||e.eof?t():e._openBackend().then((function(){t()})).catch((function(e){i(e)}))}))}},{key:"seek",value:function seek(e){var t=this;return new Promise((function(i,s){if(!t.loaded||t.buffering||t.seeking)throw new Error("invalid state");if(e!==(0|e)||e<0)throw new Error("invalid input");if(t.length>=0&&e>t.length)throw new Error("seek past end of file");if(!t.seekable)throw new Error("seek on non-seekable stream");t._backend&&t.abort(),t._cache.seekRead(e),t._cache.seekWrite(e),t._readAhead().then(i).catch(s)}))}},{key:"read",value:function read(e){var t=this;return this.buffer(e).then((function(e){return t.readSync(e)}))}},{key:"readSync",value:function readSync(e){var t=this.bytesAvailable(e),i=new Uint8Array(t);if(this.readBytes(i)!==t)throw new Error("failed to read expected data");return i.buffer}},{key:"readBytes",value:function readBytes(e){if(!this.loaded||this.buffering||this.seeking)throw new Error("invalid state");if(!(e instanceof Uint8Array))throw new Error("invalid input");var t=this._cache.readBytes(e);return this._readAhead(),t}},{key:"buffer",value:function buffer(e){var t=this;return new Promise((function(i,s){if(!t.loaded||t.buffering||t.seeking)throw new Error("invalid state");if(e!==(0|e)||e<0)throw new Error("invalid input");var d=t._clampToLength(t.offset+e),h=d-t.offset,u=t.bytesAvailable(h);u>=h?i(u):(t.buffering=!0,t._openBackend().then((function(i){return i?i.bufferToOffset(d).then((function(){return t.buffering=!1,t.buffer(e)})):Promise.resolve(u)})).then((function(e){t.buffering=!1,i(e)})).catch((function(e){"AbortError"!==e.name&&(t.buffering=!1),s(e)})))}))}},{key:"bytesAvailable",value:function bytesAvailable(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1/0;return this._cache.bytesReadable(e)}},{key:"abort",value:function abort(){this.loading&&(this.loading=!1),this.buffering&&(this.buffering=!1),this.seeking&&(this.seeking=!1),this._backend&&(this._backend.abort(),this._backend=null)}},{key:"getBufferedRanges",value:function getBufferedRanges(){return this._cache.ranges()}},{key:"_clampToLength",value:function _clampToLength(e){return this.length<0?e:Math.min(this.length,e)}}]),StreamFile}();e.exports=u},826:e=>{e.exports={vertex:"precision lowp float;\n\nattribute vec2 aPosition;\nattribute vec2 aLumaPosition;\nattribute vec2 aChromaPosition;\nvarying vec2 vLumaPosition;\nvarying vec2 vChromaPosition;\nvoid main() {\n gl_Position = vec4(aPosition, 0, 1);\n vLumaPosition = aLumaPosition;\n vChromaPosition = aChromaPosition;\n}\n",fragment:"// inspired by https://github.com/mbebenita/Broadway/blob/master/Player/canvas.js\n\nprecision lowp float;\n\nuniform sampler2D uTextureY;\nuniform sampler2D uTextureCb;\nuniform sampler2D uTextureCr;\nvarying vec2 vLumaPosition;\nvarying vec2 vChromaPosition;\nvoid main() {\n // Y, Cb, and Cr planes are uploaded as LUMINANCE textures.\n float fY = texture2D(uTextureY, vLumaPosition).x;\n float fCb = texture2D(uTextureCb, vChromaPosition).x;\n float fCr = texture2D(uTextureCr, vChromaPosition).x;\n\n // Premultipy the Y...\n float fYmul = fY * 1.1643828125;\n\n // And convert that to RGB!\n gl_FragColor = vec4(\n fYmul + 1.59602734375 * fCr - 0.87078515625,\n fYmul - 0.39176171875 * fCb - 0.81296875 * fCr + 0.52959375,\n fYmul + 2.017234375 * fCb - 1.081390625,\n 1\n );\n}\n",vertexStripe:"precision lowp float;\n\nattribute vec2 aPosition;\nattribute vec2 aTexturePosition;\nvarying vec2 vTexturePosition;\n\nvoid main() {\n gl_Position = vec4(aPosition, 0, 1);\n vTexturePosition = aTexturePosition;\n}\n",fragmentStripe:"// extra 'stripe' texture fiddling to work around IE 11's poor performance on gl.LUMINANCE and gl.ALPHA textures\n\nprecision lowp float;\n\nuniform sampler2D uStripe;\nuniform sampler2D uTexture;\nvarying vec2 vTexturePosition;\nvoid main() {\n // Y, Cb, and Cr planes are mapped into a pseudo-RGBA texture\n // so we can upload them without expanding the bytes on IE 11\n // which doesn't allow LUMINANCE or ALPHA textures\n // The stripe textures mark which channel to keep for each pixel.\n // Each texture extraction will contain the relevant value in one\n // channel only.\n\n float fLuminance = dot(\n texture2D(uStripe, vTexturePosition),\n texture2D(uTexture, vTexturePosition)\n );\n\n gl_FragColor = vec4(fLuminance, fLuminance, fLuminance, 1);\n}\n"}},487:e=>{!function(){"use strict";function FrameSink(e,t){throw new Error("abstract")}FrameSink.prototype.drawFrame=function(e){throw new Error("abstract")},FrameSink.prototype.clear=function(){throw new Error("abstract")},e.exports=FrameSink}()},926:(e,t,i)=>{!function(){"use strict";var t=i(487),s=i(627);function SoftwareFrameSink(e){var t=this,i=e.getContext("2d"),d=null,h=null,u=null;return t.drawFrame=function drawFrame(t){var c=t.format;e.width===c.displayWidth&&e.height===c.displayHeight||(e.width=c.displayWidth,e.height=c.displayHeight),null!==d&&d.width==c.width&&d.height==c.height||function initImageData(e,t){for(var s=(d=i.createImageData(e,t)).data,h=e*t*4,u=0;u{!function(){"use strict";var t=i(487),s=i(826);function WebGLFrameSink(e){var t,i,d=this,h=WebGLFrameSink.contextForCanvas(e);if(null===h)throw new Error("WebGL unavailable");function compileShader(e,t){var i=h.createShader(e);if(h.shaderSource(i,t),h.compileShader(i),!h.getShaderParameter(i,h.COMPILE_STATUS)){var s=h.getShaderInfoLog(i);throw h.deleteShader(i),new Error("GL shader compilation for "+e+" failed: "+s)}return i}var u,c,l,f,_,p,m,g,v,y,b=new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),T={},k={},w={};function createOrReuseTexture(e,t){return T[e]&&!t||(T[e]=h.createTexture()),T[e]}function uploadTexture(e,t,i,s,d){var u=createOrReuseTexture(e,t);if(h.activeTexture(h.TEXTURE0),WebGLFrameSink.stripe){var c=!T[e+"_temp"]||t,l=createOrReuseTexture(e+"_temp",t);h.bindTexture(h.TEXTURE_2D,l),c?(h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_S,h.CLAMP_TO_EDGE),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_T,h.CLAMP_TO_EDGE),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.NEAREST),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,h.NEAREST),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,i/4,s,0,h.RGBA,h.UNSIGNED_BYTE,d)):h.texSubImage2D(h.TEXTURE_2D,0,0,0,i/4,s,h.RGBA,h.UNSIGNED_BYTE,d);var f=T[e+"_stripe"],_=!f||t;_&&(f=createOrReuseTexture(e+"_stripe",t)),h.bindTexture(h.TEXTURE_2D,f),_&&(h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_S,h.CLAMP_TO_EDGE),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_T,h.CLAMP_TO_EDGE),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.NEAREST),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,h.NEAREST),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,i,1,0,h.RGBA,h.UNSIGNED_BYTE,function buildStripe(e){if(w[e])return w[e];for(var t=e,i=new Uint32Array(t),s=0;s{!function(){"use strict";var t=i(877);e.exports={convertYCbCr:function convertYCbCr(e,i){var s=0|e.format.width,d=0|e.format.height,h=0|t(e.format.width/e.format.chromaWidth),u=0|t(e.format.height/e.format.chromaHeight),c=e.y.bytes,l=e.u.bytes,f=e.v.bytes,_=0|e.y.stride,p=0|e.u.stride,m=0|e.v.stride,g=s<<2,v=0,y=0,b=0,T=0,k=0,w=0,P=0,E=0,x=0,A=0,R=0,F=0,O=0,C=0,S=0,B=0,D=0,M=0;if(1==h&&1==u)for(P=0,E=g,M=0,B=0;B>8,i[P+1]=R-O>>8,i[P+2]=R+C>>8,P+=4,R=298*c[y++]|0,i[P]=R+F>>8,i[P+1]=R-O>>8,i[P+2]=R+C>>8,P+=4,R=298*c[b++]|0,i[E]=R+F>>8,i[E+1]=R-O>>8,i[E+2]=R+C>>8,E+=4,R=298*c[b++]|0,i[E]=R+F>>8,i[E+1]=R-O>>8,i[E+2]=R+C>>8,E+=4;P+=g,E+=g,M++}else for(w=0,B=0;B>u)*p|0,k=M*m|0,S=0;S>h)],F=(409*(A=0|f[k+D])|0)-57088|0,O=(100*x|0)+(208*A|0)-34816|0,C=(516*x|0)-70912|0,R=298*c[v++]|0,i[w]=R+F>>8,i[w+1]=R-O>>8,i[w+2]=R+C>>8,w+=4}}}()},877:e=>{!function(){"use strict";e.exports=function depower(e){for(var t=0,i=e>>1;0!=i;)i>>=1,t++;if(e!==1<{!function(){"use strict";var t=i(487),s=i(926),d=i(895),h={FrameSink:t,SoftwareFrameSink:s,WebGLFrameSink:d,attach:function(e,t){return("webGL"in(t=t||{})?t.webGL:d.isAvailable())?new d(e,t):new s(e,t)}};e.exports=h}()}},t={};function __webpack_require__(i){var s=t[i];if(void 0!==s)return s.exports;var d=t[i]={exports:{}};return e[i](d,d.exports,__webpack_require__),d.exports}var i={};return(()=>{"use strict";var e=i,t=__webpack_require__(318);Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"OGVCompat",{enumerable:!0,get:function get(){return s.default}}),Object.defineProperty(e,"OGVLoader",{enumerable:!0,get:function get(){return d.default}}),Object.defineProperty(e,"OGVMediaError",{enumerable:!0,get:function get(){return h.default}}),Object.defineProperty(e,"OGVMediaType",{enumerable:!0,get:function get(){return u.default}}),Object.defineProperty(e,"OGVPlayer",{enumerable:!0,get:function get(){return c.default}}),Object.defineProperty(e,"OGVTimeRanges",{enumerable:!0,get:function get(){return l.default}}),e.OGVVersion=void 0;var s=t(__webpack_require__(523)),d=t(__webpack_require__(964)),h=t(__webpack_require__(759)),u=t(__webpack_require__(278)),c=t(__webpack_require__(869)),l=t(__webpack_require__(168)),f="1.8.6-20220111172545-1f60d9d";e.OGVVersion=f,"object"==typeof window&&(window.OGVCompat=s.default,window.OGVLoader=d.default,window.OGVMediaError=h.default,window.OGVMediaType=u.default,window.OGVTimeRanges=l.default,window.OGVPlayer=c.default,window.OGVVersion=f)})(),i})()})); \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-support.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-support.js deleted file mode 100644 index cc966c9..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-support.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{var e={575:e=>{e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},913:e=>{function t(e,t){for(var o=0;o{e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports},8:e=>{function t(o){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(o)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},523:(e,t,o)=>{"use strict";var r=o(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=r(o(575)),u=r(o(913)),s=new(function(){function e(){(0,n.default)(this,e)}return(0,u.default)(e,[{key:"hasTypedArrays",value:function(){return!!window.Uint32Array}},{key:"hasWebAssembly",value:function(){return!!window.WebAssembly}},{key:"hasWebAudio",value:function(){return!(!window.AudioContext&&!window.webkitAudioContext)}},{key:"hasFlash",value:function(){return!1}},{key:"hasAudio",value:function(){return this.hasWebAudio()}},{key:"isBlacklisted",value:function(e){return!1}},{key:"isSlow",value:function(){return!1}},{key:"isTooSlow",value:function(){return!1}},{key:"supported",value:function(e){return"OGVDecoder"===e?this.hasWebAssembly():"OGVPlayer"===e&&this.supported("OGVDecoder")&&this.hasAudio()}}]),e}());t.default=s}},t={};function o(r){var n=t[r];if(void 0!==n)return n.exports;var u=t[r]={exports:{}};return e[r](u,u.exports,o),u.exports}(()=>{"use strict";var e=o(318),t=e(o(8)),r=e(o(523));"object"===("undefined"==typeof window?"undefined":(0,t.default)(window))&&(window.OGVCompat=r.default,window.OGVVersion="1.8.6-20220111172545-1f60d9d")})()})(); \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-version.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-version.js deleted file mode 100644 index 828291a..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-version.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{var e={318:e=>{e.exports=function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports},8:e=>{function _typeof(o){return e.exports=_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,_typeof(o)}e.exports=_typeof,e.exports.__esModule=!0,e.exports.default=e.exports}},o={};function __webpack_require__(t){var r=o[t];if(void 0!==r)return r.exports;var p=o[t]={exports:{}};return e[t](p,p.exports,__webpack_require__),p.exports}(()=>{"use strict";var e=__webpack_require__(318)(__webpack_require__(8)),o="1.8.6-20220111172545-1f60d9d";"object"===("undefined"==typeof window?"undefined":(0,e.default)(window))&&(window.OGVVersion=o)})()})(); \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-worker-audio.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-worker-audio.js deleted file mode 100644 index 42bd2b9..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-worker-audio.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{var e={506:e=>{e.exports=function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e},e.exports.__esModule=!0,e.exports.default=e.exports},575:e=>{e.exports=function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},913:e=>{function _defineProperties(e,t){for(var r=0;r{function _getPrototypeOf(t){return e.exports=_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function _getPrototypeOf(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,_getPrototypeOf(t)}e.exports=_getPrototypeOf,e.exports.__esModule=!0,e.exports.default=e.exports},205:(e,t,r)=>{var o=r(489);e.exports=function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)},e.exports.__esModule=!0,e.exports.default=e.exports},318:e=>{e.exports=function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports},585:(e,t,r)=>{var o=r(8).default,s=r(506);e.exports=function _possibleConstructorReturn(e,t){if(t&&("object"===o(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return s(e)},e.exports.__esModule=!0,e.exports.default=e.exports},489:e=>{function _setPrototypeOf(t,r){return e.exports=_setPrototypeOf=Object.setPrototypeOf||function _setPrototypeOf(e,t){return e.__proto__=t,e},e.exports.__esModule=!0,e.exports.default=e.exports,_setPrototypeOf(t,r)}e.exports=_setPrototypeOf,e.exports.__esModule=!0,e.exports.default=e.exports},8:e=>{function _typeof(t){return e.exports=_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,_typeof(t)}e.exports=_typeof,e.exports.__esModule=!0,e.exports.default=e.exports},445:(e,t,r)=>{"use strict";var o=r(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(575)),n=o(r(913)),a=o(r(539)),i="1.8.6-20220111172545-1f60d9d",u={OGVDemuxerOggW:"ogv-demuxer-ogg-wasm.js",OGVDemuxerWebMW:"ogv-demuxer-webm-wasm.js",OGVDecoderAudioOpusW:"ogv-decoder-audio-opus-wasm.js",OGVDecoderAudioVorbisW:"ogv-decoder-audio-vorbis-wasm.js",OGVDecoderVideoTheoraW:"ogv-decoder-video-theora-wasm.js",OGVDecoderVideoVP8W:"ogv-decoder-video-vp8-wasm.js",OGVDecoderVideoVP8MTW:"ogv-decoder-video-vp8-mt-wasm.js",OGVDecoderVideoVP9W:"ogv-decoder-video-vp9-wasm.js",OGVDecoderVideoVP9SIMDW:"ogv-decoder-video-vp9-simd-wasm.js",OGVDecoderVideoVP9MTW:"ogv-decoder-video-vp9-mt-wasm.js",OGVDecoderVideoVP9SIMDMTW:"ogv-decoder-video-vp9-simd-mt-wasm.js",OGVDecoderVideoAV1W:"ogv-decoder-video-av1-wasm.js",OGVDecoderVideoAV1SIMDW:"ogv-decoder-video-av1-simd-wasm.js",OGVDecoderVideoAV1MTW:"ogv-decoder-video-av1-mt-wasm.js",OGVDecoderVideoAV1SIMDMTW:"ogv-decoder-video-av1-simd-mt-wasm.js"},d=function(){function OGVLoaderBase(){(0,s.default)(this,OGVLoaderBase),this.base=this.defaultBase()}return(0,n.default)(OGVLoaderBase,[{key:"defaultBase",value:function defaultBase(){}},{key:"wasmSupported",value:function wasmSupported(){return a.default.wasmSupported()}},{key:"scriptForClass",value:function scriptForClass(e){return u[e]}},{key:"urlForClass",value:function urlForClass(e){var t=this.scriptForClass(e);if(t)return this.urlForScript(t);throw new Error("asked for URL for unknown class "+e)}},{key:"urlForScript",value:function urlForScript(e){if(e){var t=this.base;return void 0===t?t="":t+="/",t+e+"?version="+encodeURIComponent(i)}throw new Error("asked for URL for unknown script "+e)}},{key:"loadClass",value:function loadClass(e,t,r){var o=this;r=r||{};var s=this.getGlobal(),n=this.urlForClass(e),a=function classWrapper(t){return(t=t||{}).locateFile=function(e){return"data:"===e.slice(0,5)?e:o.urlForScript(e)},t.mainScriptUrlOrBlob=o.scriptForClass(e)+"?version="+encodeURIComponent(i),s[e](t)};"function"==typeof s[e]?t(a):this.loadScript(n,(function(){t(a)}))}}]),OGVLoaderBase}();t.default=d},713:(e,t,r)=>{"use strict";var o=r(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(575)),n=o(r(913)),a=o(r(205)),i=o(r(585)),u=o(r(754));function _createSuper(e){var t=function _isNativeReflectConstruct(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function _createSuperInternal(){var r,o=(0,u.default)(e);if(t){var s=(0,u.default)(this).constructor;r=Reflect.construct(o,arguments,s)}else r=o.apply(this,arguments);return(0,i.default)(this,r)}}var d=new(function(e){(0,a.default)(OGVLoaderWorker,e);var t=_createSuper(OGVLoaderWorker);function OGVLoaderWorker(){return(0,s.default)(this,OGVLoaderWorker),t.apply(this,arguments)}return(0,n.default)(OGVLoaderWorker,[{key:"loadScript",value:function loadScript(e,t){importScripts(e),t()}},{key:"getGlobal",value:function getGlobal(){return self}}]),OGVLoaderWorker}(o(r(445)).default));t.default=d},607:(e,t,r)=>{"use strict";var o=r(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=new(o(r(172)).default)(["loadedMetadata","audioFormat","audioBuffer","cpuTime"],{init:function init(e,t){this.target.init(t)},processHeader:function processHeader(e,t){this.target.processHeader(e[0],(function(e){t([e])}))},processAudio:function processAudio(e,t){this.target.processAudio(e[0],(function(e){t([e])}))}});t.default=s},172:(e,t,r)=>{"use strict";var o=r(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(8)),n=o(r(575)),a=o(r(913)),i=o(r(713));r.g.OGVLoader=i.default;var u=function(){function OGVWorkerSupport(e,t){var r=this;(0,n.default)(this,OGVWorkerSupport),this.propList=e,this.handlers=t,this.transferables=function(){var e=new ArrayBuffer(1024),t=new Uint8Array(e);try{return postMessage({action:"transferTest",bytes:t},[e]),!e.byteLength}catch(e){return!1}}(),this.target=null,this.sentProps={},this.pendingEvents=[],this.handlers.construct=function(e,t){var o=e[0],s=e[1];i.default.loadClass(o,(function(e){e(s).then((function(e){for(r.target=e,t();r.pendingEvents.length;)r.handleEvent(r.pendingEvents.shift())}))}))},addEventListener("message",(function(e){r.workerOnMessage(e)}))}return(0,a.default)(OGVWorkerSupport,[{key:"handleEvent",value:function handleEvent(e){var t=this;this.handlers[e.action].call(this,e.args,(function(r){r=r||[];var o={},s=[];t.propList.forEach((function(e){var r=t.target[e];if(t.sentProps[e]!==r)if(t.sentProps[e]=r,"duration"==e&&isNaN(r)&&isNaN(t.sentProps[e]));else if("audioBuffer"==e){if(o[e]=r,r)for(var n=0;n{"use strict";var o=r(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(8)),n=o(r(575)),a=o(r(913));var i=new(function(){function WebAssemblyChecker(){(0,n.default)(this,WebAssemblyChecker),this.tested=!1,this.testResult=void 0}return(0,a.default)(WebAssemblyChecker,[{key:"wasmSupported",value:function wasmSupported(){if(!this.tested){try{"object"===("undefined"==typeof WebAssembly?"undefined":(0,s.default)(WebAssembly))?this.testResult=function testSafariWebAssemblyBug(){var e=new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,1,127,1,127,3,2,1,0,5,3,1,0,1,7,8,1,4,116,101,115,116,0,0,10,16,1,14,0,32,0,65,1,54,2,0,32,0,40,2,0,11]),t=new WebAssembly.Module(e);return 0!==new WebAssembly.Instance(t,{}).exports.test(4)}():this.testResult=!1}catch(e){console.log("Exception while testing WebAssembly",e),this.testResult=!1}this.tested=!0}return this.testResult}}]),WebAssemblyChecker}());t.default=i}},t={};function __webpack_require__(r){var o=t[r];if(void 0!==o)return o.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,__webpack_require__),s.exports}__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),(()=>{"use strict";__webpack_require__(318)(__webpack_require__(607))})()})(); \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-worker-video.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-worker-video.js deleted file mode 100644 index b4f64bb..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv-worker-video.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{var e={506:e=>{e.exports=function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e},e.exports.__esModule=!0,e.exports.default=e.exports},575:e=>{e.exports=function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},913:e=>{function _defineProperties(e,t){for(var r=0;r{function _getPrototypeOf(t){return e.exports=_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function _getPrototypeOf(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,_getPrototypeOf(t)}e.exports=_getPrototypeOf,e.exports.__esModule=!0,e.exports.default=e.exports},205:(e,t,r)=>{var o=r(489);e.exports=function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&o(e,t)},e.exports.__esModule=!0,e.exports.default=e.exports},318:e=>{e.exports=function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports},585:(e,t,r)=>{var o=r(8).default,s=r(506);e.exports=function _possibleConstructorReturn(e,t){if(t&&("object"===o(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return s(e)},e.exports.__esModule=!0,e.exports.default=e.exports},489:e=>{function _setPrototypeOf(t,r){return e.exports=_setPrototypeOf=Object.setPrototypeOf||function _setPrototypeOf(e,t){return e.__proto__=t,e},e.exports.__esModule=!0,e.exports.default=e.exports,_setPrototypeOf(t,r)}e.exports=_setPrototypeOf,e.exports.__esModule=!0,e.exports.default=e.exports},8:e=>{function _typeof(t){return e.exports=_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,_typeof(t)}e.exports=_typeof,e.exports.__esModule=!0,e.exports.default=e.exports},445:(e,t,r)=>{"use strict";var o=r(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(575)),n=o(r(913)),a=o(r(539)),i="1.8.6-20220111172545-1f60d9d",u={OGVDemuxerOggW:"ogv-demuxer-ogg-wasm.js",OGVDemuxerWebMW:"ogv-demuxer-webm-wasm.js",OGVDecoderAudioOpusW:"ogv-decoder-audio-opus-wasm.js",OGVDecoderAudioVorbisW:"ogv-decoder-audio-vorbis-wasm.js",OGVDecoderVideoTheoraW:"ogv-decoder-video-theora-wasm.js",OGVDecoderVideoVP8W:"ogv-decoder-video-vp8-wasm.js",OGVDecoderVideoVP8MTW:"ogv-decoder-video-vp8-mt-wasm.js",OGVDecoderVideoVP9W:"ogv-decoder-video-vp9-wasm.js",OGVDecoderVideoVP9SIMDW:"ogv-decoder-video-vp9-simd-wasm.js",OGVDecoderVideoVP9MTW:"ogv-decoder-video-vp9-mt-wasm.js",OGVDecoderVideoVP9SIMDMTW:"ogv-decoder-video-vp9-simd-mt-wasm.js",OGVDecoderVideoAV1W:"ogv-decoder-video-av1-wasm.js",OGVDecoderVideoAV1SIMDW:"ogv-decoder-video-av1-simd-wasm.js",OGVDecoderVideoAV1MTW:"ogv-decoder-video-av1-mt-wasm.js",OGVDecoderVideoAV1SIMDMTW:"ogv-decoder-video-av1-simd-mt-wasm.js"},c=function(){function OGVLoaderBase(){(0,s.default)(this,OGVLoaderBase),this.base=this.defaultBase()}return(0,n.default)(OGVLoaderBase,[{key:"defaultBase",value:function defaultBase(){}},{key:"wasmSupported",value:function wasmSupported(){return a.default.wasmSupported()}},{key:"scriptForClass",value:function scriptForClass(e){return u[e]}},{key:"urlForClass",value:function urlForClass(e){var t=this.scriptForClass(e);if(t)return this.urlForScript(t);throw new Error("asked for URL for unknown class "+e)}},{key:"urlForScript",value:function urlForScript(e){if(e){var t=this.base;return void 0===t?t="":t+="/",t+e+"?version="+encodeURIComponent(i)}throw new Error("asked for URL for unknown script "+e)}},{key:"loadClass",value:function loadClass(e,t,r){var o=this;r=r||{};var s=this.getGlobal(),n=this.urlForClass(e),a=function classWrapper(t){return(t=t||{}).locateFile=function(e){return"data:"===e.slice(0,5)?e:o.urlForScript(e)},t.mainScriptUrlOrBlob=o.scriptForClass(e)+"?version="+encodeURIComponent(i),s[e](t)};"function"==typeof s[e]?t(a):this.loadScript(n,(function(){t(a)}))}}]),OGVLoaderBase}();t.default=c},713:(e,t,r)=>{"use strict";var o=r(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(575)),n=o(r(913)),a=o(r(205)),i=o(r(585)),u=o(r(754));function _createSuper(e){var t=function _isNativeReflectConstruct(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function _createSuperInternal(){var r,o=(0,u.default)(e);if(t){var s=(0,u.default)(this).constructor;r=Reflect.construct(o,arguments,s)}else r=o.apply(this,arguments);return(0,i.default)(this,r)}}var c=new(function(e){(0,a.default)(OGVLoaderWorker,e);var t=_createSuper(OGVLoaderWorker);function OGVLoaderWorker(){return(0,s.default)(this,OGVLoaderWorker),t.apply(this,arguments)}return(0,n.default)(OGVLoaderWorker,[{key:"loadScript",value:function loadScript(e,t){importScripts(e),t()}},{key:"getGlobal",value:function getGlobal(){return self}}]),OGVLoaderWorker}(o(r(445)).default));t.default=c},172:(e,t,r)=>{"use strict";var o=r(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(8)),n=o(r(575)),a=o(r(913)),i=o(r(713));r.g.OGVLoader=i.default;var u=function(){function OGVWorkerSupport(e,t){var r=this;(0,n.default)(this,OGVWorkerSupport),this.propList=e,this.handlers=t,this.transferables=function(){var e=new ArrayBuffer(1024),t=new Uint8Array(e);try{return postMessage({action:"transferTest",bytes:t},[e]),!e.byteLength}catch(e){return!1}}(),this.target=null,this.sentProps={},this.pendingEvents=[],this.handlers.construct=function(e,t){var o=e[0],s=e[1];i.default.loadClass(o,(function(e){e(s).then((function(e){for(r.target=e,t();r.pendingEvents.length;)r.handleEvent(r.pendingEvents.shift())}))}))},addEventListener("message",(function(e){r.workerOnMessage(e)}))}return(0,a.default)(OGVWorkerSupport,[{key:"handleEvent",value:function handleEvent(e){var t=this;this.handlers[e.action].call(this,e.args,(function(r){r=r||[];var o={},s=[];t.propList.forEach((function(e){var r=t.target[e];if(t.sentProps[e]!==r)if(t.sentProps[e]=r,"duration"==e&&isNaN(r)&&isNaN(t.sentProps[e]));else if("audioBuffer"==e){if(o[e]=r,r)for(var n=0;n{"use strict";var o=r(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=new(o(r(172)).default)(["loadedMetadata","videoFormat","frameBuffer","cpuTime"],{init:function init(e,t){this.target.init(t)},processHeader:function processHeader(e,t){this.target.processHeader(e[0],(function(e){t([e])}))},processFrame:function processFrame(e,t){this.target.processFrame(e[0],(function(e){t([e])}))},sync:function sync(e,t){this.target.sync(),t()},recycleFrame:function recycleFrame(e,t){this.target.recycleFrame(e[0]),t()}});t.default=s},539:(e,t,r)=>{"use strict";var o=r(318);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(8)),n=o(r(575)),a=o(r(913));var i=new(function(){function WebAssemblyChecker(){(0,n.default)(this,WebAssemblyChecker),this.tested=!1,this.testResult=void 0}return(0,a.default)(WebAssemblyChecker,[{key:"wasmSupported",value:function wasmSupported(){if(!this.tested){try{"object"===("undefined"==typeof WebAssembly?"undefined":(0,s.default)(WebAssembly))?this.testResult=function testSafariWebAssemblyBug(){var e=new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,1,127,1,127,3,2,1,0,5,3,1,0,1,7,8,1,4,116,101,115,116,0,0,10,16,1,14,0,32,0,65,1,54,2,0,32,0,40,2,0,11]),t=new WebAssembly.Module(e);return 0!==new WebAssembly.Instance(t,{}).exports.test(4)}():this.testResult=!1}catch(e){console.log("Exception while testing WebAssembly",e),this.testResult=!1}this.tested=!0}return this.testResult}}]),WebAssemblyChecker}());t.default=i}},t={};function __webpack_require__(r){var o=t[r];if(void 0!==o)return o.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,__webpack_require__),s.exports}__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),(()=>{"use strict";__webpack_require__(318)(__webpack_require__(443))})()})(); \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv.js b/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv.js deleted file mode 100644 index 35b3ea0..0000000 --- a/shelled/rustdesk-as-ref/web_deps/ogvjs-1.8.6/ogv.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see ogv.js.LICENSE.txt */ -!function webpackUniversalModuleDefinition(t,i){"object"==typeof exports&&"object"==typeof module?module.exports=i():"function"==typeof define&&define.amd?define([],i):"object"==typeof exports?exports.ogvjs=i():t.ogvjs=i()}(globalThis,(function(){return(()=>{var t={506:t=>{t.exports=function _assertThisInitialized(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t},t.exports.__esModule=!0,t.exports.default=t.exports},575:t=>{t.exports=function _classCallCheck(t,i){if(!(t instanceof i))throw new TypeError("Cannot call a class as a function")},t.exports.__esModule=!0,t.exports.default=t.exports},913:t=>{function _defineProperties(t,i){for(var u=0;u{var d=u(331);function _get(){return"undefined"!=typeof Reflect&&Reflect.get?(t.exports=_get=Reflect.get,t.exports.__esModule=!0,t.exports.default=t.exports):(t.exports=_get=function _get(t,i,u){var c=d(t,i);if(c){var l=Object.getOwnPropertyDescriptor(c,i);return l.get?l.get.call(arguments.length<3?t:u):l.value}},t.exports.__esModule=!0,t.exports.default=t.exports),_get.apply(this,arguments)}t.exports=_get,t.exports.__esModule=!0,t.exports.default=t.exports},754:t=>{function _getPrototypeOf(i){return t.exports=_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function _getPrototypeOf(t){return t.__proto__||Object.getPrototypeOf(t)},t.exports.__esModule=!0,t.exports.default=t.exports,_getPrototypeOf(i)}t.exports=_getPrototypeOf,t.exports.__esModule=!0,t.exports.default=t.exports},205:(t,i,u)=>{var d=u(489);t.exports=function _inherits(t,i){if("function"!=typeof i&&null!==i)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(i&&i.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),i&&d(t,i)},t.exports.__esModule=!0,t.exports.default=t.exports},318:t=>{t.exports=function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports},585:(t,i,u)=>{var d=u(8).default,c=u(506);t.exports=function _possibleConstructorReturn(t,i){if(i&&("object"===d(i)||"function"==typeof i))return i;if(void 0!==i)throw new TypeError("Derived constructors may only return object or undefined");return c(t)},t.exports.__esModule=!0,t.exports.default=t.exports},489:t=>{function _setPrototypeOf(i,u){return t.exports=_setPrototypeOf=Object.setPrototypeOf||function _setPrototypeOf(t,i){return t.__proto__=i,t},t.exports.__esModule=!0,t.exports.default=t.exports,_setPrototypeOf(i,u)}t.exports=_setPrototypeOf,t.exports.__esModule=!0,t.exports.default=t.exports},331:(t,i,u)=>{var d=u(754);t.exports=function _superPropBase(t,i){for(;!Object.prototype.hasOwnProperty.call(t,i)&&null!==(t=d(t)););return t},t.exports.__esModule=!0,t.exports.default=t.exports},8:t=>{function _typeof(i){return t.exports=_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t.exports.__esModule=!0,t.exports.default=t.exports,_typeof(i)}t.exports=_typeof,t.exports.__esModule=!0,t.exports.default=t.exports},848:t=>{window,t.exports=function(t){var i={};function r(u){if(i[u])return i[u].exports;var d=i[u]={i:u,l:!1,exports:{}};return t[u].call(d.exports,d,d.exports,r),d.l=!0,d.exports}return r.m=t,r.c=i,r.d=function(t,i,u){r.o(t,i)||Object.defineProperty(t,i,{enumerable:!0,get:u})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,i){if(1&i&&(t=r(t)),8&i)return t;if(4&i&&"object"==typeof t&&t&&t.__esModule)return t;var u=Object.create(null);if(r.r(u),Object.defineProperty(u,"default",{enumerable:!0,value:t}),2&i&&"string"!=typeof t)for(var d in t)r.d(u,d,function(i){return t[i]}.bind(null,d));return u},r.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(i,"a",i),i},r.o=function(t,i){return Object.prototype.hasOwnProperty.call(t,i)},r.p="",r(r.s=1)}([function(t,i){function r(t,i){if(t<1||t!==Math.round(t))throw"Invalid channel count for BufferQueue";this.channels=t,this.bufferSize=i,this.flush()}r.prototype.flush=function(){this._buffers=[],this._pendingBuffer=this.createBuffer(this.bufferSize),this._pendingPos=0},r.prototype.sampleCount=function(){var t=0;return this._buffers.forEach((function(i){t+=i[0].length})),t},r.prototype.createBuffer=function(t){for(var i=[],u=0;u=d)return t;for(var l=[],h=0;h0?c[c.length+i]:t[0]:t[i]},h=0;hu&&(y=Math.SQRT1_2);for(var b=0;b=u&&(T=0);var k=t[T],P=new Float32Array(g);l(k,P,this._resampleLastSampleData?this._resampleLastSampleData[T]:void 0,y),h.push(P)}return this._resampleFractional=v,this._resampleLastSampleData=t,h},n.prototype.bufferData=function(t){if(!this._backend)throw"Invalid state: AudioFeeder cannot bufferData before init";var i=this._resample(t);i=this._tempoChanger.process(i),this._backend.appendBuffer(i)},n.prototype.getPlaybackState=function(){if(this._backend){var t=this._backend.getPlaybackState();return t.outputPlaybackPosition=t.playbackPosition,t.playbackPosition=this._tempoChanger.mapOutputToInputTime(t.outputPlaybackPosition),t}throw"Invalid state: AudioFeeder cannot getPlaybackState before init"},n.prototype.waitUntilReady=function(t){if(!this._backend)throw"Invalid state: AudioFeeder cannot waitUntilReady before init";this._backend.waitUntilReady(t)},n.prototype.start=function(){if(!this._backend)throw"Invalid state: AudioFeeder cannot start before init";this._backend.start()},n.prototype.stop=function(){if(!this._backend)throw"Invalid state: AudioFeeder cannot stop before init";this._backend.stop()},n.prototype.flush=function(){if(this._resampleFractional=0,this._resampleLastSampleData=void 0,!this._backend)throw"Invalid state: AudioFeeder cannot flush before init";this._tempoChanger.flush(this.durationBuffered),this._backend.flush()},n.prototype.close=function(){this._backend&&(this._backend.close(),this._backend=null)},n.prototype.onstarved=null,n.prototype.onbufferlow=null,n.isSupported=function(){return!!Float32Array&&i.isSupported()},n.initSharedAudioContext=function(){return i.isSupported()?i.initSharedAudioContext():null},t.exports=n}()},function(t,i,u){!function(){var i=window.AudioContext||window.webkitAudioContext,d=u(0),c=u(3);function o(t,i,u){var c=u.audioContext||o.initSharedAudioContext();if(this._context=c,this.output=u.output||c.destination,this.rate=c.sampleRate,this.channels=2,u.bufferSize&&(this.bufferSize=0|u.bufferSize),this.bufferThreshold=2*this.bufferSize,this._bufferQueue=new d(this.channels,this.bufferSize),this._playbackTimeAtBufferTail=c.currentTime,this._queuedTime=0,this._delayedTime=0,this._dropped=0,this._liveBuffer=this._bufferQueue.createBuffer(this.bufferSize),c.createScriptProcessor)this._node=c.createScriptProcessor(this.bufferSize,0,this.channels);else{if(!c.createJavaScriptNode)throw new Error("Bad version of web audio API?");this._node=c.createJavaScriptNode(this.bufferSize,0,this.channels)}}o.prototype.bufferSize=4096,o.prototype.bufferThreshold=8192,o.prototype._volume=1,Object.defineProperty(o.prototype,"volume",{get:function(){return this._volume},set:function(t){this._volume=+t}}),o.prototype._muted=!1,Object.defineProperty(o.prototype,"muted",{get:function(){return this._muted},set:function(t){this._muted=!!t}}),o.prototype._audioProcess=function(t){var i,u,d,l,h;h="number"==typeof t.playbackTime?t.playbackTime:this._context.currentTime+this.bufferSize/this.rate;var _=this._playbackTimeAtBufferTail;if(_0){var i=Math.round(t*this.rate),u=this._liveBuffer?this._liveBuffer[0].length:0;i>u?(this._bufferQueue.prependBuffer(this._liveBuffer),this._bufferQueue.prependBuffer(this._bufferQueue.createBuffer(i-u))):this._bufferQueue.prependBuffer(this._bufferQueue.trimBuffer(this._liveBuffer,u-i,i)),this._playbackTimeAtBufferTail-=t}this._node.onaudioprocess=null,this._node.disconnect()}},o.prototype.flush=function(){this._bufferQueue.flush()},o.prototype.close=function(){this.stop(),this._context=null},o.prototype.onstarved=null,o.prototype.onbufferlow=null,o.isSupported=function(){return!!i},o.sharedAudioContext=null,o.initSharedAudioContext=function(){if(!o.sharedAudioContext&&o.isSupported()){var t,u=new i;if(u.createScriptProcessor)t=u.createScriptProcessor(1024,0,2);else{if(!u.createJavaScriptNode)throw new Error("Bad version of web audio API?");t=u.createJavaScriptNode(1024,0,2)}t.connect(u.destination),t.disconnect(),o.sharedAudioContext=u}return o.sharedAudioContext},t.exports=o}()},function(t,i){t.exports=function(){if(void 0!==window.setImmediate)return window.setImmediate;if(window&&window.postMessage){var t=[];return window.addEventListener("message",(function(i){if(i.source===window){var u=i.data;if("object"==typeof u&&u.nextTickBrowserPingMessage){var d=t.pop();d&&d()}}})),function(i){t.push(i),window.postMessage({nextTickBrowserPingMessage:!0},document.location.toString())}}return function(t){setTimeout(t,0)}}()},function(t,i,u){var d;window,d=function(){return function(t){var i={};function r(u){if(i[u])return i[u].exports;var d=i[u]={i:u,l:!1,exports:{}};return t[u].call(d.exports,d,d.exports,r),d.l=!0,d.exports}return r.m=t,r.c=i,r.d=function(t,i,u){r.o(t,i)||Object.defineProperty(t,i,{enumerable:!0,get:u})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,i){if(1&i&&(t=r(t)),8&i)return t;if(4&i&&"object"==typeof t&&t&&t.__esModule)return t;var u=Object.create(null);if(r.r(u),Object.defineProperty(u,"default",{enumerable:!0,value:t}),2&i&&"string"!=typeof t)for(var d in t)r.d(u,d,function(i){return t[i]}.bind(null,d));return u},r.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(i,"a",i),i},r.o=function(t,i){return Object.prototype.hasOwnProperty.call(t,i)},r.p="",r(r.s=1)}([function(t,i){var u={float_array:function(t){return new Float32Array(t)},blit:function(t,i,u,d,c){u.set(t.subarray(i,i+c),d)}};t.exports=u},function(t,i,u){var d,c;d=u(0),c=u(2),t.exports=function(t){var i=(t=t||{}).sampleRate||44100,u=t.wsizeLog||11,l=t.tempo||1,h=(t.numChannels,Math.pow(2,50/1200)-1),_=1<>1),w=d.float_array(P),E=d.float_array(P),x=d.float_array(P),A=d.float_array(P),R=d.float_array(P),O=d.float_array(P),S=1+(P>>1),C=[0,0],B=[],D=[],M=[],V=[];for(k=0;k<2;k++)B.push(d.float_array(S)),D.push(d.float_array(S)),M.push(d.float_array(S)),V.push(d.float_array(P));var I=d.float_array(S),L=d.float_array(S),j=0,W=0,X=[{in_time:0,out_time:0,tempo:l}],N=0,H=0,z=1,Y=0,Q=0,K=0,$=0,Z={mapOutputToInputTime:function(t){for(var i=X.length-1;t0;)i--;var u=X[i];return u.in_time+u.tempo*(t-u.out_time)},flush:function(t){Y=0,C=[0,0],H=0,$=0,K=0;for(var i=0;i<2;i++)for(var u=0;u=0;)X.pop(),d--;X.push({in_time:j,out_time:W,tempo:l})}},getTempo:function(){return l},setTempo:function(t){y=b=m,t>=1?b=Math.round(y/t):y=Math.round(b*t),Q=(1/t-1*b/y)*y,z=function(t,i){for(var u=t.length/i|0,d=0,c=0;cu&&(u=t[d]);var c=1e-8*u,l=1,_=1;for(i[0]=1,d=2;dc&&t[d]>t[d-1]&&t[d]>=t[d+1]){var m=d+(t[d-1]-t[d+1])/(2*(t[d-1]-2*t[d]+t[d+1]));m-i[l-1]>p?(i[l++]=m,_=d):t[d]>t[_]&&(i[l-1]=m,_=d)}}return l}(k,w),x=D[p],A=M[p];if(0!=t&&0!=E){var R=0;for(K=0;Ky[R]&&R!=v;)++R;var O=R;R>0&&$-y[R-1].1*k[Math.round($)]){var j=J(i,u,$),W=b[O]+T[O]+U(j,$,b[O],y[O],l)-j;x[K]=j,A[K]=W,I[K]=Math.cos(W),L[K]=Math.sin(W)}else x[K]=J(i,u,$),A[K]=0,I[K]=1,L[K]=0}w[E]=2*_;var X=w[O=0],N=w[O+1],H=I[O],z=L[O];for(P=1;P=X&&P-X>N-P&&(X=w[++O],N=w[O+1],H=I[O],z=L[O]);var Y=i[P]*H-u[P]*z,Q=i[P]*z+u[P]*H;i[P]=Y,u[P]=Q}}else for(var K=0;Kc&&(c=Math.abs(2*p.m_re[i]));for(i=0;i<_-b;i++)Math.abs(p.m_re[i+b+t]+p.m_im[i])>c&&(c=Math.abs(p.m_re[i+b+t]+p.m_im[i]));for(i=_-b;i<_;i++)Math.abs(2*p.m_im[i])>c&&(c=Math.abs(2*p.m_im[i]));var h=1/Math.floor(1*_/(2*b));for(l*c>h&&(l=h/c),i=0;i<_;i++)v[i]+=l*p.m_re[i],v[i+b+t]+=l*p.m_im[i];return N+=2,H=2*b+t};return Z.process=function(t){var u=t[0].length,c=t[0];if(t.length>1){c=d.float_array(t[0].length);for(var h=1/t.length,p=0;p0){var T=$+K+u,k=[];for(p=0;px&&(x=$);var A=d.float_array(x);d.blit(v,0,A,0,$);for(var R=0,O=$,S=0,C=0;;){var B=_+y-K;if(R+B>u){d.blit(c,R,g,K,u-R),K+=u-R,R=u;break}B<=0?K-=2*y:(d.blit(c,R,g,K,B),R+=B,K=_-y),C=G(),j+=2*y/i,W+=C/i,(S=O+C-x)<0&&(S=0),d.blit(v,0,A,O,C-S),O+=C}d.blit(v,C-S,v,0,S),$=S;var D=[];for(p=0;p>=1;u.m_revTgt[c]=h}u.twiddleRe=d.float_array(u.m_logN),u.twiddleIm=d.float_array(u.m_logN);for(var p=1,m=0;m>1,_=c>>1,p=c;if(t)for(var m=1/c,g=0;g>=1,_>>=1,p>>=1}for(var B,D,M=u.m_revTgt,V=0;VV&&(D=i[B=M[V]],i[B]=i[V],i[V]=D,D=d[B],d[B]=d[V],d[V]=D)};var v=i>>1;return u.unpack=function(t,d,c,l){t[0]=u.m_re[0],c[0]=u.m_im[0],d[0]=l[0]=0,t[v]=u.m_re[v],c[v]=u.m_im[v],d[v]=l[v]=0;for(var h=1;h{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(575)),l=d(u(913)),h=function(){function Bisector(t){(0,c.default)(this,Bisector),this.lower=t.start,this.upper=t.end,this.onprocess=t.process,this.position=0,this.n=0}return(0,l.default)(Bisector,[{key:"iterate",value:function iterate(){return this.n++,this.position=Math.floor((this.lower+this.upper)/2),this.onprocess(this.lower,this.upper,this.position)}},{key:"start",value:function start(){return this.iterate(),this}},{key:"left",value:function left(){return this.upper=this.position,this.iterate()}},{key:"right",value:function right(){return this.lower=this.position,this.iterate()}}]),Bisector}();i.default=h},523:(t,i,u)=>{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(575)),l=d(u(913)),h=new(function(){function _class(){(0,c.default)(this,_class)}return(0,l.default)(_class,[{key:"hasTypedArrays",value:function hasTypedArrays(){return!!window.Uint32Array}},{key:"hasWebAssembly",value:function hasWebAssembly(){return!!window.WebAssembly}},{key:"hasWebAudio",value:function hasWebAudio(){return!(!window.AudioContext&&!window.webkitAudioContext)}},{key:"hasFlash",value:function hasFlash(){return!1}},{key:"hasAudio",value:function hasAudio(){return this.hasWebAudio()}},{key:"isBlacklisted",value:function isBlacklisted(t){return!1}},{key:"isSlow",value:function isSlow(){return!1}},{key:"isTooSlow",value:function isTooSlow(){return!1}},{key:"supported",value:function supported(t){return"OGVDecoder"===t?this.hasWebAssembly():"OGVPlayer"===t&&(this.supported("OGVDecoder")&&this.hasAudio())}}]),_class}());i.default=h},408:(t,i,u)=>{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(575)),l=d(u(913)),h=d(u(205)),_=d(u(585)),p=d(u(754));function _createSuper(t){var i=function _isNativeReflectConstruct(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function _createSuperInternal(){var u,d=(0,p.default)(t);if(i){var c=(0,p.default)(this).constructor;u=Reflect.construct(d,arguments,c)}else u=d.apply(this,arguments);return(0,_.default)(this,u)}}var m=function(t){(0,h.default)(OGVDecoderAudioProxy,t);var i=_createSuper(OGVDecoderAudioProxy);function OGVDecoderAudioProxy(){return(0,c.default)(this,OGVDecoderAudioProxy),i.apply(this,arguments)}return(0,l.default)(OGVDecoderAudioProxy,[{key:"init",value:function init(t){this.proxy("init",[],t)}},{key:"processHeader",value:function processHeader(t,i){this.proxy("processHeader",[t],i,[t])}},{key:"processAudio",value:function processAudio(t,i){this.proxy("processAudio",[t],i,[t])}},{key:"close",value:function close(){this.terminate()}}]),OGVDecoderAudioProxy}((0,d(u(580)).default)({loadedMetadata:!1,audioFormat:null,audioBuffer:null,cpuTime:0})),g=m;i.default=g},319:(t,i,u)=>{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(575)),l=d(u(913)),h=d(u(205)),_=d(u(585)),p=d(u(754));function _createSuper(t){var i=function _isNativeReflectConstruct(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function _createSuperInternal(){var u,d=(0,p.default)(t);if(i){var c=(0,p.default)(this).constructor;u=Reflect.construct(d,arguments,c)}else u=d.apply(this,arguments);return(0,_.default)(this,u)}}var m=function(t){(0,h.default)(OGVDecoderVideoProxy,t);var i=_createSuper(OGVDecoderVideoProxy);function OGVDecoderVideoProxy(){return(0,c.default)(this,OGVDecoderVideoProxy),i.apply(this,arguments)}return(0,l.default)(OGVDecoderVideoProxy,[{key:"init",value:function init(t){this.proxy("init",[],t)}},{key:"processHeader",value:function processHeader(t,i){this.proxy("processHeader",[t],i,[t])}},{key:"processFrame",value:function processFrame(t,i){this.proxy("processFrame",[t],i,[t])}},{key:"close",value:function close(){this.terminate()}},{key:"sync",value:function sync(){this.proxy("sync",[],(function(){}))}},{key:"recycleFrame",value:function recycleFrame(t){this.proxy("recycleFrame",[t],(function(){}),[t.y.bytes.buffer,t.u.bytes.buffer,t.v.bytes.buffer])}}]),OGVDecoderVideoProxy}((0,d(u(580)).default)({loadedMetadata:!1,videoFormat:null,frameBuffer:null,cpuTime:0})),g=m;i.default=g},445:(t,i,u)=>{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(575)),l=d(u(913)),h=d(u(539)),_="1.8.6-20220111172545-1f60d9d",p={OGVDemuxerOggW:"ogv-demuxer-ogg-wasm.js",OGVDemuxerWebMW:"ogv-demuxer-webm-wasm.js",OGVDecoderAudioOpusW:"ogv-decoder-audio-opus-wasm.js",OGVDecoderAudioVorbisW:"ogv-decoder-audio-vorbis-wasm.js",OGVDecoderVideoTheoraW:"ogv-decoder-video-theora-wasm.js",OGVDecoderVideoVP8W:"ogv-decoder-video-vp8-wasm.js",OGVDecoderVideoVP8MTW:"ogv-decoder-video-vp8-mt-wasm.js",OGVDecoderVideoVP9W:"ogv-decoder-video-vp9-wasm.js",OGVDecoderVideoVP9SIMDW:"ogv-decoder-video-vp9-simd-wasm.js",OGVDecoderVideoVP9MTW:"ogv-decoder-video-vp9-mt-wasm.js",OGVDecoderVideoVP9SIMDMTW:"ogv-decoder-video-vp9-simd-mt-wasm.js",OGVDecoderVideoAV1W:"ogv-decoder-video-av1-wasm.js",OGVDecoderVideoAV1SIMDW:"ogv-decoder-video-av1-simd-wasm.js",OGVDecoderVideoAV1MTW:"ogv-decoder-video-av1-mt-wasm.js",OGVDecoderVideoAV1SIMDMTW:"ogv-decoder-video-av1-simd-mt-wasm.js"},m=function(){function OGVLoaderBase(){(0,c.default)(this,OGVLoaderBase),this.base=this.defaultBase()}return(0,l.default)(OGVLoaderBase,[{key:"defaultBase",value:function defaultBase(){}},{key:"wasmSupported",value:function wasmSupported(){return h.default.wasmSupported()}},{key:"scriptForClass",value:function scriptForClass(t){return p[t]}},{key:"urlForClass",value:function urlForClass(t){var i=this.scriptForClass(t);if(i)return this.urlForScript(i);throw new Error("asked for URL for unknown class "+t)}},{key:"urlForScript",value:function urlForScript(t){if(t){var i=this.base;return void 0===i?i="":i+="/",i+t+"?version="+encodeURIComponent(_)}throw new Error("asked for URL for unknown script "+t)}},{key:"loadClass",value:function loadClass(t,i,u){var d=this;u=u||{};var c=this.getGlobal(),l=this.urlForClass(t),h=function classWrapper(i){return(i=i||{}).locateFile=function(t){return"data:"===t.slice(0,5)?t:d.urlForScript(t)},i.mainScriptUrlOrBlob=d.scriptForClass(t)+"?version="+encodeURIComponent(_),c[t](i)};"function"==typeof c[t]?i(h):this.loadScript(l,(function(){i(h)}))}}]),OGVLoaderBase}();i.default=m},964:(t,i,u)=>{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(575)),l=d(u(913)),h=d(u(525)),_=d(u(205)),p=d(u(585)),m=d(u(754)),g=d(u(408)),v=d(u(319)),y=d(u(445));function _createSuper(t){var i=function _isNativeReflectConstruct(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function _createSuperInternal(){var u,d=(0,m.default)(t);if(i){var c=(0,m.default)(this).constructor;u=Reflect.construct(d,arguments,c)}else u=d.apply(this,arguments);return(0,p.default)(this,u)}}var b={audio:{proxy:g.default,worker:"ogv-worker-audio.js"},video:{proxy:v.default,worker:"ogv-worker-video.js"}},T={OGVDecoderAudioOpusW:"audio",OGVDecoderAudioVorbisW:"audio",OGVDecoderVideoTheoraW:"video",OGVDecoderVideoVP8W:"video",OGVDecoderVideoVP9W:"video",OGVDecoderVideoVP9SIMDW:"video",OGVDecoderVideoAV1W:"video",OGVDecoderVideoAV1SIMDW:"video"},k=new(function(t){(0,_.default)(OGVLoaderWeb,t);var i=_createSuper(OGVLoaderWeb);function OGVLoaderWeb(){var t;return(0,c.default)(this,OGVLoaderWeb),(t=i.call(this)).scriptStatus={},t.scriptCallbacks={},t}return(0,l.default)(OGVLoaderWeb,[{key:"getGlobal",value:function getGlobal(){return window}},{key:"defaultBase",value:function defaultBase(){for(var t,i,u=document.querySelectorAll("script"),d=/^(?:|(.*)\/)ogv(?:-support|-es2017)?\.js(?:\?|#|$)/,c=0;c{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(913)),l=d(u(575)),h=d(u(309)),_={MEDIA_ERR_ABORTED:1,MEDIA_ERR_NETWORK:2,MEDIA_ERR_DECODE:3,MEDIA_ERR_SRC_NOT_SUPPORTED:4},p=(0,c.default)((function OGVMediaError(t,i){(0,l.default)(this,OGVMediaError),this.code=t,this.message=i}));(0,h.default)(p,_),(0,h.default)(p.prototype,_);var m=p;i.default=m},278:(t,i,u)=>{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(913)),l=d(u(575));function split(t,i,u){var d=t.split(i,u).map((function(t){return function trim(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}(t)}));if("number"==typeof u)for(;d.length{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(575)),l=d(u(913)),h=d(u(506)),_=d(u(205)),p=d(u(585)),m=d(u(754)),g=d(u(8)),v=d(u(731)),y=d(u(936)),b=d(u(848)),T=d(u(964)),k=d(u(893)),P=d(u(309)),w=d(u(759)),E=d(u(278)),x=d(u(168)),A=d(u(625));function _createSuper(t){var i=function _isNativeReflectConstruct(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function _createSuperInternal(){var u,d=(0,m.default)(t);if(i){var c=(0,m.default)(this).constructor;u=Reflect.construct(d,arguments,c)}else u=d.apply(this,arguments);return(0,p.default)(this,u)}}var R,O=function(){if("function"==typeof setImmediate)return setImmediate;var t=new MessageChannel,i=[];return t.port1.onmessage=function(t){i.shift()()},function nextTick(u){i.push(u),t.port2.postMessage({})}}(),S={NETWORK_EMPTY:0,NETWORK_IDLE:1,NETWORK_LOADING:2,NETWORK_NO_SOURCE:3,HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},C="INITIAL",B="SEEKING_END",D="LOADED",M="PRELOAD",V="READY",I="PLAYING",L="SEEKING",j="ERROR",W="NOT_SEEKING",X="BISECT_TO_TARGET",N="BISECT_TO_KEYPOINT",H="LINEAR_TO_TARGET",z="exact",Y="fast";function OGVJSElement(){var t=document.createElement("ogvjs");return Object.setPrototypeOf?Object.setPrototypeOf(t,Object.getPrototypeOf(this)):t.__proto__=this.__proto__,t}R="undefined"==typeof performance||void 0===(0,g.default)(performance.now)?Date.now:performance.now.bind(performance),OGVJSElement.prototype=Object.create(HTMLElement.prototype,{});var Q=function(t){(0,_.default)(OGVPlayer,t);var i=_createSuper(OGVPlayer);function OGVPlayer(t){var u;if((0,c.default)(this,OGVPlayer),u=i.call(this),(t=t||{}).base=t.base||T.default.base,u._options=t,u._instanceId="ogvjs"+ ++OGVPlayer.instanceCount,void 0!==t.worker?u._enableWorker=!!t.worker:u._enableWorker=!!window.Worker,!T.default.wasmSupported())throw new Error("WebAssembly not supported");return u._enableThreading=!!t.threading,u._enableSIMD=!!t.simd,u._state=C,u._seekState=W,u._detectedType=null,u._canvas=document.createElement("canvas"),u._frameSink=null,u.className=u._instanceId,(0,P.default)((0,h.default)(u),S),u._view=u._canvas,u._view.style.position="absolute",u._view.style.top="0",u._view.style.left="0",u._view.style.width="100%",u._view.style.height="100%",u._view.style.objectFit="contain",u.appendChild(u._view),u._startTime=R(),u._codec=null,u._audioInfo=null,u._videoInfo=null,u._actionQueue=[],u._audioFeeder=null,u._muted=!1,u._initialPlaybackPosition=0,u._initialPlaybackOffset=0,u._prebufferingAudio=!1,u._initialSeekTime=0,u._currentSrc="",u._streamEnded=!1,u._mediaError=null,u._dataEnded=!1,u._byteLength=0,u._duration=null,u._lastSeenTimestamp=null,u._nextProcessingTimer,u._nextFrameTimer=null,u._loading=!1,u._started=!1,u._paused=!0,u._ended=!1,u._startedPlaybackInDocument=!1,u._stream=void 0,u._framesProcessed=0,u._targetPerFrameTime=1e3/60,u._actualPerFrameTime=0,u._totalFrameTime=0,u._totalFrameCount=0,u._playTime=0,u._bufferTime=0,u._drawingTime=0,u._proxyTime=0,u._totalJitter=0,u._droppedAudio=0,u._delayedAudio=0,u._lateFrames=0,u._poster="",u._thumbnail=null,u._frameEndTimestamp=0,u._audioEndTimestamp=0,u._decodedFrames=[],u._pendingFrames=[],u._lastFrameDecodeTime=0,u._lastFrameVideoCpuTime=0,u._lastFrameAudioCpuTime=0,u._lastFrameDemuxerCpuTime=0,u._lastFrameDrawingTime=0,u._lastFrameBufferTime=0,u._lastFrameProxyTime=0,u._lastVideoCpuTime=0,u._lastAudioCpuTime=0,u._lastDemuxerCpuTime=0,u._lastBufferTime=0,u._lastProxyTime=0,u._lastDrawingTime=0,u._lastFrameTimestamp=0,u._currentVideoCpuTime=0,u._lastTimeUpdate=0,u._timeUpdateInterval=250,u._seekTargetTime=0,u._bisectTargetTime=0,u._seekMode=null,u._lastSeekPosition=null,u._seekBisector=null,u._didSeek=null,u._depth=0,u._needProcessing=!1,u._pendingFrame=0,u._pendingAudio=0,u._framePipelineDepth=8,u._frameParallelism=u._enableThreading?Math.min(16,navigator.hardwareConcurrency)||1:0,u._audioPipelineDepth=12,u._videoInfo=null,u._audioInfo=null,u._width=0,u._height=0,u._volume=1,u._playbackRate=1,Object.defineProperties((0,h.default)(u),{src:{get:function getSrc(){return this.getAttribute("src")||""},set:function setSrc(t){this.setAttribute("src",t),this._loading=!1,this._prepForLoad("interactive")}},buffered:{get:function getBuffered(){var t,i=this;return t=this._stream&&this._byteLength&&this._duration?this._stream.getBufferedRanges().map((function(t){return t.map((function(t){return t/i._stream.length*i._duration}))})):[[0,0]],new x.default(t)}},seekable:{get:function getSeekable(){return this.duration<1/0&&this._stream&&this._stream.seekable&&this._codec&&this._codec.seekable?new x.default([[0,this._duration]]):new x.default([])}},currentTime:{get:function getCurrentTime(){return this._state==L?this._seekTargetTime:this._codec?this._state!=I||this._paused?this._initialPlaybackOffset:this._getPlaybackTime():this._initialSeekTime},set:function setCurrentTime(t){this._seek(t,z)}},duration:{get:function getDuration(){return this._codec&&this._codec.loadedMetadata?null!==this._duration?this._duration:1/0:NaN}},paused:{get:function getPaused(){return this._paused}},ended:{get:function getEnded(){return this._ended}},seeking:{get:function getSeeking(){return this._state==L}},muted:{get:function getMuted(){return this._muted},set:function setMuted(t){this._muted=t,this._audioFeeder?this._audioFeeder.muted=this._muted:this._started&&!this._muted&&this._codec&&this._codec.hasAudio&&(this._log("unmuting: switching from timer to audio clock"),this._initAudioFeeder(),this._startPlayback(this._audioEndTimestamp)),this._fireEventAsync("volumechange")}},poster:{get:function getPoster(){return this._poster},set:function setPoster(t){var i=this;if(this._poster=t,!this._started){this._thumbnail&&this.removeChild(this._thumbnail);var u=new Image;u.src=this._poster,u.className="ogvjs-poster",u.style.position="absolute",u.style.top="0",u.style.left="0",u.style.width="100%",u.style.height="100%",u.style.objectFit="contain",u.style.visibility="hidden",u.addEventListener("load",(function(){i._thumbnail===u&&(OGVPlayer.styleManager.appendRule("."+i._instanceId,{width:u.naturalWidth+"px",height:u.naturalHeight+"px"}),u.style.visibility="visible")})),this._thumbnail=u,this.appendChild(u)}}},videoWidth:{get:function getVideoWidth(){return this._videoInfo?this._videoInfo.displayWidth:0}},videoHeight:{get:function getVideoHeight(){return this._videoInfo?this._videoInfo.displayHeight:0}},ogvjsVideoFrameRate:{get:function getOgvJsVideoFrameRate(){return this._videoInfo?0==this._videoInfo.fps?this._totalFrameCount/(this._totalFrameTime/1e3):this._videoInfo.fps:0}},ogvjsAudioChannels:{get:function getOgvJsAudioChannels(){return this._audioInfo?this._audioInfo.channels:0}},ogvjsAudioSampleRate:{get:function getOgvJsAudioChannels(){return this._audioInfo?this._audioInfo.rate:0}},width:{get:function getWidth(){return this._width},set:function setWidth(t){this._width=parseInt(t,10),this.style.width=this._width+"px"}},height:{get:function getHeight(){return this._height},set:function setHeight(t){this._height=parseInt(t,10),this.style.height=this._height+"px"}},autoplay:{get:function getAutoplay(){return!1},set:function setAutoplay(t){}},controls:{get:function getControls(){return!1},set:function setControls(t){}},loop:{get:function getLoop(){return!1},set:function setLoop(t){}},crossOrigin:{get:function getCrossOrigin(){return null},set:function setCrossOrigin(t){}},currentSrc:{get:function getCurrentSrc(){return this._currentSrc}},defaultMuted:{get:function getDefaultMuted(){return!1}},defaultPlaybackRate:{get:function getDefaultPlaybackRate(){return 1}},error:{get:function getError(){return this._state===j?this._mediaError?this._mediaError:new w.default("unknown error occurred in media procesing"):null}},preload:{get:function getPreload(){return this.getAttribute("preload")||""},set:function setPreload(t){this.setAttribute("preload",t)}},readyState:{get:function getReadyState(){return this._stream&&this._codec&&this._codec.loadedMetadata?OGVPlayer.HAVE_ENOUGH_DATA:OGVPlayer.HAVE_NOTHING}},networkState:{get:function getNetworkState(){return this._stream?this._stream.waiting?OGVPlayer.NETWORK_LOADING:OGVPlayer.NETWORK_IDLE:this.readyState==OGVPlayer.HAVE_NOTHING?OGVPlayer.NETWORK_EMPTY:OGVPlayer.NETWORK_NO_SOURCE}},playbackRate:{get:function getPlaybackRate(){return this._playbackRate},set:function setPlaybackRate(t){var i=Number(t)||1;this._audioFeeder?this._audioFeeder.tempo=i:this._paused||(this._initialPlaybackOffset=this._getPlaybackTime(),this._initialPlaybackPosition=i*R()/1e3),this._playbackRate=i,this._fireEventAsync("ratechange")}},played:{get:function getPlayed(){return new x.default([[0,this.currentTime]])}},volume:{get:function getVolume(){return this._volume},set:function setVolume(t){this._volume=+t,this._audioFeeder&&(this._audioFeeder.volume=this._volume),this._fireEventAsync("volumechange")}}}),u.onframecallback=null,u.onloadstate=null,u.onprogress=null,u.onsuspend=null,u.onabort=null,u.onemptied=null,u.onstalled=null,u.onloadedmetadata=null,u.onloadeddata=null,u.oncanplay=null,u.oncanplaythrough=null,u.onplaying=null,u.onwaiting=null,u.onseeking=null,u.onseeked=null,u.onended=null,u.ondurationchange=null,u.ontimeupdate=null,u.onplay=null,u.onpause=null,u.onratechange=null,u.onresize=null,u.onvolumechange=null,u.onaudiofeedercreated=null,u}return(0,l.default)(OGVPlayer,[{key:"_time",value:function _time(t){var i=R();t();var u=R()-i;return this._lastFrameDecodeTime+=u,u}},{key:"_log",value:function _log(t){var i=this._options;if(i.debug){var u=R()-this._startTime;i.debugFilter&&!t.match(i.debugFilter)||console.log("["+Math.round(10*u)/10+"ms] "+t)}}},{key:"_fireEvent",value:function _fireEvent(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._log("fireEvent "+t);var u,d="function"==typeof Event;for(var c in d?u=new CustomEvent(t):(u=document.createEvent("Event")).initEvent(t,!1,!1),i)i.hasOwnProperty(c)&&(u[c]=i[c]);var l=this.dispatchEvent(u);!d&&"resize"===t&&this.onresize&&l&&this.onresize.call(this,u)}},{key:"_fireEventAsync",value:function _fireEventAsync(t){var i=this,u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._log("fireEventAsync "+t),O((function(){i._fireEvent(t,u)}))}},{key:"_initAudioFeeder",value:function _initAudioFeeder(){var t=this,i=this._options,u={bufferSize:8192};i.audioContext&&(u.audioContext=i.audioContext),i.audioDestination&&(u.output=i.audioDestination),i.audioBackendFactory&&(u.backendFactory=i.audioBackendFactory);var d=this._audioFeeder=new b.default(u);d.init(this._audioInfo.channels,this._audioInfo.rate),this.onaudiofeedercreated&&this.onaudiofeedercreated(this._audioFeeder),d.bufferThreshold=1,d.volume=this.volume,d.muted=this.muted,d.tempo=this.playbackRate,d.onbufferlow=function(){t._log("onbufferlow"),t._stream&&(t._stream.buffering||t._stream.seeking)||t._pendingAudio||t._pingProcessing()},d.onstarved=function(){t._dataEnded?t._log("onstarved: appear to have reached end of audio"):(t._log("onstarved: halting audio due to starvation"),t._stopPlayback(),t._prebufferingAudio=!0),t._isProcessing()||t._pingProcessing(0)}}},{key:"_startPlayback",value:function _startPlayback(t){if(this._audioFeeder){this._audioFeeder.start();var i=this._audioFeeder.getPlaybackState();this._initialPlaybackPosition=i.playbackPosition}else this._initialPlaybackPosition=this._playbackRate*R()/1e3;void 0!==t&&(this._initialPlaybackOffset=t),this._prebufferingAudio=!1,this._log("continuing at "+this._initialPlaybackPosition+", "+this._initialPlaybackOffset)}},{key:"_stopPlayback",value:function _stopPlayback(){this._initialPlaybackOffset=this._getPlaybackTime(),this._log("pausing at "+this._initialPlaybackOffset),this._audioFeeder&&this._audioFeeder.stop()}},{key:"_getPlaybackTime",value:function _getPlaybackTime(t){return this._prebufferingAudio||this._paused?this._initialPlaybackOffset:(this._audioFeeder?(t=t||this._audioFeeder.getPlaybackState()).playbackPosition:this._playbackRate*R()/1e3)-this._initialPlaybackPosition+this._initialPlaybackOffset}},{key:"_stopVideo",value:function _stopVideo(){this._log("STOPPING"),this._state=C,this._seekState=W,this._started=!1,this._ended=!1,this._frameEndTimestamp=0,this._audioEndTimestamp=0,this._lastFrameDecodeTime=0,this._prebufferingAudio=!1,this._actionQueue.splice(0,this._actionQueue.length),this._stream&&(this._stream.abort(),this._stream=null,this._streamEnded=!1),this._codec&&(this._codec.close(),this._codec=null,this._pendingFrame=0,this._pendingAudio=0,this._dataEnded=!1),this._videoInfo=null,this._audioInfo=null,this._audioFeeder&&(this._audioFeeder.close(),this._audioFeeder=null),this._nextProcessingTimer&&(clearTimeout(this._nextProcessingTimer),this._nextProcessingTimer=null),this._nextFrameTimer&&(clearTimeout(this._nextFrameTimer),this._nextFrameTimer=null),this._frameSink&&(this._frameSink.clear(),this._frameSink=null),this._decodedFrames&&(this._decodedFrames=[]),this._pendingFrames&&(this._pendingFrames=[]),this._initialSeekTime=0,this._initialPlaybackPosition=0,this._initialPlaybackOffset=0,this._duration=null}},{key:"_doFrameComplete",value:function _doFrameComplete(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._startedPlaybackInDocument&&!document.body.contains(this)&&O((function(){t.stop()}));var u=R(),d=u-this._lastFrameTimestamp,c=this._actualPerFrameTime-this._targetPerFrameTime;this._totalJitter+=Math.abs(c),this._playTime+=d;var l={cpuTime:this._lastFrameDecodeTime,drawingTime:this._drawingTime-this._lastFrameDrawingTime,bufferTime:this._bufferTime-this._lastFrameBufferTime,proxyTime:this._proxyTime-this._lastFrameProxyTime,demuxerTime:0,videoTime:0,audioTime:0,clockTime:this._actualPerFrameTime,late:i.dropped,dropped:i.dropped};function n(t){return Math.round(10*t)/10}this._codec&&(l.demuxerTime=this._codec.demuxerCpuTime-this._lastFrameDemuxerCpuTime,l.videoTime+=this._currentVideoCpuTime-this._lastFrameVideoCpuTime,l.audioTime+=this._codec.audioCpuTime-this._lastFrameAudioCpuTime),l.cpuTime+=l.demuxerTime,this._lastFrameDecodeTime=0,this._lastFrameTimestamp=u,this._codec?(this._lastFrameVideoCpuTime=this._currentVideoCpuTime,this._lastFrameAudioCpuTime=this._codec.audioCpuTime,this._lastFrameDemuxerCpuTime=this._codec.demuxerCpuTime):(this._lastFrameVideoCpuTime=0,this._lastFrameAudioCpuTime=0,this._lastFrameDemuxerCpuTime=0),this._lastFrameDrawingTime=this._drawingTime,this._lastFrameBufferTime=this._bufferTime,this._lastFrameProxyTime=this._proxyTime,this._log("drew frame "+i.frameEndTimestamp+": clock time "+n(d)+" (jitter "+n(c)+") cpu: "+n(l.cpuTime)+" (mux: "+n(l.demuxerTime)+" buf: "+n(l.bufferTime)+" draw: "+n(l.drawingTime)+" proxy: "+n(l.proxyTime)+") vid: "+n(l.videoTime)+" aud: "+n(l.audioTime)),this._fireEventAsync("framecallback",l),(!this._lastTimeUpdate||u-this._lastTimeUpdate>=this._timeUpdateInterval)&&(this._lastTimeUpdate=u,this._fireEventAsync("timeupdate")),this._codec&&i.yCbCrBuffer&&this._codec.recycleFrame(i.yCbCrBuffer)}},{key:"_seekStream",value:function _seekStream(t){var i=this;this._stream.seeking&&this._stream.abort(),this._stream.buffering&&this._stream.abort(),this._streamEnded=!1,this._dataEnded=!1,this._ended=!1,this._stream.seek(t).then((function(){i._readBytesAndWait()})).catch((function(t){i._onStreamError(t)}))}},{key:"_onStreamError",value:function _onStreamError(t){"AbortError"===t.name?this._log("i/o promise canceled; ignoring"):(this._log("i/o error: "+t),this._mediaError=new w.default(w.default.MEDIA_ERR_NETWORK,String(t)),this._state=j,this._stopPlayback())}},{key:"_seek",value:function _seek(t,i){var u=this;if(this._log("requested seek to "+t+", mode "+i),this.readyState==this.HAVE_NOTHING)return this._log("not yet loaded; saving seek position for later"),void(this._initialSeekTime=t);if(this._stream&&!this._stream.seekable)throw new Error("Cannot seek a non-seekable stream");if(this._codec&&!this._codec.seekable)throw new Error("Cannot seek in a non-seekable file");var d=function prepForSeek(d){u._stream&&u._stream.buffering&&u._stream.abort(),u._stream&&u._stream.seeking&&u._stream.abort(),u._actionQueue.splice(0,u._actionQueue.length),u._stopPlayback(),u._prebufferingAudio=!1,u._audioFeeder&&u._audioFeeder.flush(),u._state=L,u._seekTargetTime=t,u._seekMode=i,u._codec?u._codec.flush(d):d()};d((function(){u._isProcessing()||u._pingProcessing(0)})),this._actionQueue.push((function(){d((function(){u._doSeek(t)}))}))}},{key:"_doSeek",value:function _doSeek(t){var i=this;this._streamEnded=!1,this._dataEnded=!1,this._ended=!1,this._state=L,this._seekTargetTime=t,this._lastSeekPosition=-1,this._decodedFrames=[],this._pendingFrames=[],this._pendingFrame=0,this._pendingAudio=0,this._didSeek=!1,this._codec.seekToKeypoint(t,(function(u){if(u)return i._seekState=H,i._fireEventAsync("seeking"),i._didSeek?void 0:void i._pingProcessing();i._codec.getKeypointOffset(t,(function(t){t>0?(i._seekState=H,i._seekStream(t)):(i._seekState=X,i._startBisection(i._seekTargetTime)),i._fireEventAsync("seeking")}))}))}},{key:"_startBisection",value:function _startBisection(t){var i=this,u=Math.max(0,this._stream.length-65536);this._bisectTargetTime=t,this._seekBisector=new k.default({start:0,end:u,process:function process(t,u,d){return d!=i._lastSeekPosition&&(i._lastSeekPosition=d,i._codec.flush((function(){i._seekStream(d)})),!0)}}),this._seekBisector.start()}},{key:"_continueSeekedPlayback",value:function _continueSeekedPlayback(){var t=this;this._seekState=W,this._state=V,this._frameEndTimestamp=this._codec.frameTimestamp,this._audioEndTimestamp=this._codec.audioTimestamp,this._codec.hasAudio?this._seekTargetTime=this._codec.audioTimestamp:this._seekTargetTime=this._codec.frameTimestamp,this._initialPlaybackOffset=this._seekTargetTime;var i=function finishedSeeking(){t._lastTimeUpdate=t._seekTargetTime,t._fireEventAsync("timeupdate"),t._fireEventAsync("seeked"),t._isProcessing()||t._pingProcessing()};if(this._codec.hasVideo&&this._decodedFrames.length){var u=this._decodedFrames.shift();this._drawFrame(u.yCbCrBuffer),i()}else{if(this._codec.hasVideo&&this._codec.frameReady)return this._codec.decodeFrame((function(u){u&&t._drawFrame(t._codec.frameBuffer),i()})),void this._codec.sync();i()}}},{key:"_drawFrame",value:function _drawFrame(t){this._thumbnail&&(this.removeChild(this._thumbnail),this._thumbnail=null),this._frameSink.drawFrame(t)}},{key:"_doProcessLinearSeeking",value:function _doProcessLinearSeeking(){var t,i=this;if(t=this._codec.hasVideo?this._targetPerFrameTime/1e3:1/256,this._codec.hasVideo){if(this._pendingFrame)return;if(!this._codec.frameReady)return void this._codec.process((function(t){t?i._pingProcessing():i._streamEnded?(i._log("stream ended during linear seeking on video"),i._dataEnded=!0,i._continueSeekedPlayback()):i._readBytesAndWait()}));if(this._seekMode===Y&&this._codec.keyframeTimestamp==this._codec.frameTimestamp)return void this._continueSeekedPlayback();if(this._codec.frameTimestamp<=this._seekTargetTime){var u=this._codec.frameTimestamp;return this._pendingFrame++,this._pendingFrames.push({frameEndTimestamp:u}),this._decodedFrames.splice(0,this._decodedFrames.length),this._codec.decodeFrame((function(t){i._pendingFrame--,i._pendingFrames.shift(),i._decodedFrames.push({yCbCrBuffer:i._codec.frameBuffer,videoCpuTime:i._codec.videoCpuTime,frameEndTimestamp:u}),i._pingProcessing()})),void this._codec.sync()}if(!this._codec.hasAudio)return void this._continueSeekedPlayback()}if(this._codec.hasAudio){if(this._pendingAudio)return;return this._codec.audioReady?this._codec.audioTimestamp+tthis._bisectTargetTime?this._seekBisector.left()||(this._log("close enough (left)"),this._seekTargetTime=i,this._continueSeekedPlayback()):i+t/20?this._targetPerFrameTime=1e3/this._videoInfo.fps:this._targetPerFrameTime=16.667,this._canvas.width=this._videoInfo.displayWidth,this._canvas.height=this._videoInfo.displayHeight,OGVPlayer.styleManager.appendRule("."+this._instanceId,{width:this._videoInfo.displayWidth+"px",height:this._videoInfo.displayHeight+"px"});var t={};void 0!==this._options.webGL&&(t.webGL=this._options.webGL),this._options.forceWebGL&&(t.webGL="required"),this._frameSink=v.default.attach(this._canvas,t)}},{key:"_doProcessing",value:function _doProcessing(){if(this._didSeek&&(this._didSeek=!1),this._nextProcessingTimer=null,this._isProcessing(),this._depth>0)throw new Error("REENTRANCY FAIL: doProcessing recursing unexpectedly");var t=0;do{if(this._needProcessing=!1,this._depth++,this._doProcessingLoop(),this._depth--,this._needProcessing&&this._isProcessing())throw new Error("REENTRANCY FAIL: waiting on input or codec but asked to keep processing");++t>500&&(this._log("stuck in processing loop; breaking with timer"),this._needProcessing=0,this._pingProcessing(0))}while(this._needProcessing)}},{key:"_doProcessingLoop",value:function _doProcessingLoop(){if(this._actionQueue.length)this._actionQueue.shift()();else if(this._state==C)this._doProcessInitial();else if(this._state==B)this._doProcessSeekingEnd();else if(this._state==D)this._doProcessLoaded();else if(this._state==M)this._doProcessPreload();else if(this._state==V)this._doProcessReady();else if(this._state==L)this._doProcessSeeking();else if(this._state==I)this._doProcessPlay();else{if(this._state!=j)throw new Error("Unexpected OGVPlayer state "+this._state);this._doProcessError()}}},{key:"_doProcessInitial",value:function _doProcessInitial(){var t=this;if(this._codec.loadedMetadata){if(!this._codec.hasVideo&&!this._codec.hasAudio)throw new Error("No audio or video found, something is wrong");this._codec.hasAudio&&(this._audioInfo=this._codec.audioFormat),this._codec.hasVideo&&(this._videoInfo=this._codec.videoFormat,this._setupVideo()),isNaN(this._codec.duration)||(this._duration=this._codec.duration),null===this._duration&&this._stream.seekable&&"video/ogg"==this._detectedType?(this._state=B,this._lastSeenTimestamp=-1,this._codec.flush((function(){t._seekStream(Math.max(0,t._stream.length-131072))}))):(this._state=D,this._pingProcessing())}else this._codec.process((function(i){if(i)t._pingProcessing();else{if(t._streamEnded)throw new Error("end of file before headers found");t._log("reading more cause we are out of data"),t._readBytesAndWait()}}))}},{key:"_doProcessSeekingEnd",value:function _doProcessSeekingEnd(){var t=this;this._codec.frameReady?(this._log("saw frame with "+this._codec.frameTimestamp),this._lastSeenTimestamp=Math.max(this._lastSeenTimestamp,this._codec.frameTimestamp),this._codec.discardFrame((function(){t._pingProcessing()}))):this._codec.audioReady?(this._log("saw audio with "+this._codec.audioTimestamp),this._lastSeenTimestamp=Math.max(this._lastSeenTimestamp,this._codec.audioTimestamp),this._codec.discardAudio((function(){t._pingProcessing()}))):this._codec.process((function(i){i?t._pingProcessing():t._stream.eof?(t._log("seek-duration: we are at the end: "+t._lastSeenTimestamp),t._lastSeenTimestamp>0&&(t._duration=t._lastSeenTimestamp),t._state=D,t._codec.flush((function(){t._streamEnded=!1,t._dataEnded=!1,t._seekStream(0)}))):t._readBytesAndWait()}))}},{key:"_doProcessLoaded",value:function _doProcessLoaded(){this._state=M,this._fireEventAsync("loadedmetadata"),this._fireEventAsync("durationchange"),this._codec.hasVideo&&this._fireEventAsync("resize"),this._pingProcessing(0)}},{key:"_doProcessPreload",value:function _doProcessPreload(){var t=this;!this._codec.frameReady&&this._codec.hasVideo||!this._codec.audioReady&&this._codec.hasAudio?this._codec.process((function(i){i?t._pingProcessing():t._streamEnded?t._ended=!0:t._readBytesAndWait()})):(this._state=V,this._fireEventAsync("loadeddata"),this._pingProcessing())}},{key:"_doProcessReady",value:function _doProcessReady(){var t=this;if(this._log("initial seek to "+this._initialSeekTime),this._initialSeekTime>0){var i=this._initialSeekTime;this._initialSeekTime=0,this._log("initial seek to "+i),this._doSeek(i)}else if(this._paused)this._log("paused while in ready");else{var u=function finishStartPlaying(){t._log("finishStartPlaying"),t._state=I,t._lastFrameTimestamp=R(),t._codec.hasAudio&&t._audioFeeder?t._prebufferingAudio=!0:t._startPlayback(),t._pingProcessing(0),t._fireEventAsync("play"),t._fireEventAsync("playing")};!this._codec.hasAudio||this._audioFeeder||this._muted?u():(this._initAudioFeeder(),this._audioFeeder.waitUntilReady(u))}}},{key:"_doProcessSeeking",value:function _doProcessSeeking(){if(this._seekState==W)throw new Error("seeking in invalid state (not seeking?)");if(this._seekState==X)this._doProcessBisectionSeek();else if(this._seekState==N)this._doProcessBisectionSeek();else{if(this._seekState!=H)throw new Error("Invalid seek state "+this._seekState);this._doProcessLinearSeeking()}}},{key:"_doProcessPlay",value:function _doProcessPlay(){var t=this,i=this._codec;if(this._paused)this._log("paused during playback; stopping loop");else if((!i.hasAudio||i.audioReady||this._pendingAudio||this._dataEnded)&&(!i.hasVideo||i.frameReady||this._pendingFrame||this._decodedFrames.length||this._dataEnded)){var u,d,c,l=null,h=0,_=!1,p=0;if(i.hasAudio&&this._audioFeeder?(l=this._audioFeeder.getPlaybackState(),h=this._getPlaybackTime(l),_=this._dataEnded&&0==this._audioFeeder.durationBuffered,this._prebufferingAudio&&(this._audioFeeder.durationBuffered>=2*this._audioFeeder.bufferThreshold&&(!i.hasVideo||this._decodedFrames.length>=this._framePipelineDepth)||this._dataEnded)&&(this._log("prebuffering audio done; buffered to "+this._audioFeeder.durationBuffered),this._startPlayback(h),this._prebufferingAudio=!1),l.dropped!=this._droppedAudio&&this._log("dropped "+(l.dropped-this._droppedAudio)),l.delayed!=this._delayedAudio&&this._log("delayed "+(l.delayed-this._delayedAudio)),this._droppedAudio=l.dropped,this._delayedAudio=l.delayed,(u=this._audioFeeder.durationBuffered<=2*this._audioFeeder.bufferThreshold)&&(this._codec.audioReady?this._pendingAudio>=this._audioPipelineDepth&&(this._log("audio decode disabled: "+this._pendingAudio+" packets in flight"),u=!1):u=!1)):(h=this._getPlaybackTime(),u=this._codec.audioReady&&this._audioEndTimestamp0,c=this._pendingFrame+this._decodedFrames.length=m){for(var g=-1,v=0;v=0)for(;g-- >=0;){this._lateFrames++;var y=this._decodedFrames.shift();this._log("skipping already-decoded late frame at "+y.frameEndTimestamp),p=1e3*(y.frameEndTimestamp-h),this._frameEndTimestamp=y.frameEndTimestamp,this._actualPerFrameTime=this._targetPerFrameTime-p,this._framesProcessed++,y.dropped=!0,this._doFrameComplete(y)}var b=this._codec.nextKeyframeTimestamp,T=b-this._targetPerFrameTime/1e3*(this._framePipelineDepth+this._pendingFrame);if(b>=0&&b!=this._codec.frameTimestamp&&h>=T){this._log("skipping late frame at "+this._decodedFrames[0].frameEndTimestamp+" vs "+h+", expect to see keyframe at "+b);for(var k=0;k0&&(this._targetPerFrameTime=1e3*(this._codec.frameTimestamp-this._frameEndTimestamp)),this._totalFrameTime+=this._targetPerFrameTime,this._totalFrameCount++;var A=this._frameEndTimestamp=this._codec.frameTimestamp;this._pendingFrame++,this._pendingFrames.push({frameEndTimestamp:A});var R=this._pendingFrames,O=!1,S=this._time((function(){t._codec.decodeFrame((function(i){R===t._pendingFrames?(t._log("play loop callback: decoded frame"),t._pendingFrame--,t._pendingFrames.shift(),i?t._decodedFrames.push({yCbCrBuffer:t._codec.frameBuffer,videoCpuTime:t._codec.videoCpuTime,frameEndTimestamp:A}):t._log("Bad video packet or something"),t._codec.process((function(){t._isProcessing()||t._pingProcessing(O?void 0:0)}))):t._log("play loop callback after flush, discarding")}))}));this._pendingFrame&&(O=!0,this._proxyTime+=S,this._pingProcessing(),this._dataEnded&&this._codec.sync())}else if(u){this._log("play loop: ready for audio; depth: "+this._pendingAudio),this._pendingAudio++;var C=this._codec.audioTimestamp,B=this._time((function(){t._codec.decodeAudio((function(i){if(t._pendingAudio--,t._log("play loop callback: decoded audio"),t._audioEndTimestamp=C,i){var u=t._codec.audioBuffer;if(u&&(t._bufferTime+=t._time((function(){t._audioFeeder&&t._audioFeeder.bufferData(u)})),!t._codec.hasVideo)){t._framesProcessed++;var d={frameEndTimestamp:t._audioEndTimestamp};t._doFrameComplete(d)}}t._isProcessing()||t._pingProcessing()}))}));this._pendingAudio&&(this._proxyTime+=B,this._codec.audioReady?this._pingProcessing():this._doProcessPlayDemux())}else if(d){this._log("play loop: ready to draw frame"),this._nextFrameTimer&&(clearTimeout(this._nextFrameTimer),this._nextFrameTimer=null),this._thumbnail&&(this.removeChild(this._thumbnail),this._thumbnail=null);var D=this._decodedFrames.shift();this._currentVideoCpuTime=D.videoCpuTime,this._drawingTime+=this._time((function(){t._drawFrame(D.yCbCrBuffer)})),this._framesProcessed++,this._doFrameComplete(D),this._pingProcessing()}else if(!this._decodedFrames.length||this._nextFrameTimer||this._prebufferingAudio)if(this._dataEnded&&!(this._pendingAudio||this._pendingFrame||this._decodedFrames.length)){this._log("play loop: playback reached end of data "+[this._pendingAudio,this._pendingFrame,this._decodedFrames.length]);var M=0;this._codec.hasAudio&&this._audioFeeder&&(M=1e3*this._audioFeeder.durationBuffered),M>0?(this._log("play loop: ending pending "+M+" ms"),this._pingProcessing(Math.max(0,M))):(this._log("play loop: ENDING NOW: playback time "+this._getPlaybackTime()+"; frameEndTimestamp: "+this._frameEndTimestamp),this._stopPlayback(),this._prebufferingAudio=!1,this._initialPlaybackOffset=Math.max(this._audioEndTimestamp,this._frameEndTimestamp),this._ended=!0,this._paused=!0,this._fireEventAsync("pause"),this._fireEventAsync("ended"))}else this._prebufferingAudio&&(i.hasVideo&&!i.frameReady||i.hasAudio&&!i.audioReady)?(this._log("play loop: prebuffering demuxing"),this._doProcessPlayDemux()):this._log("play loop: waiting on async/timers");else{var V=p;this._log("play loop: setting a timer for drawing "+V),this._nextFrameTimer=setTimeout((function(){t._nextFrameTimer=null,t._pingProcessing()}),V)}}else this._log("play loop: demuxing"),this._doProcessPlayDemux()}},{key:"_doProcessPlayDemux",value:function _doProcessPlayDemux(){var t=this,i=this._codec.frameReady,u=this._codec.audioReady;this._codec.process((function(d){t._codec.frameReady&&!i||t._codec.audioReady&&!u?(t._log("demuxer has packets"),t._pingProcessing()):d?(t._log("demuxer processing to find more packets"),t._pingProcessing()):(t._log("demuxer ran out of data"),t._streamEnded?(t._log("demuxer reached end of data stream"),t._dataEnded=!0,t._pingProcessing()):(t._log("demuxer loading more data"),t._readBytesAndWait()))}))}},{key:"_doProcessError",value:function _doProcessError(){}},{key:"_isProcessing",value:function _isProcessing(){return this._stream&&(this._stream.buffering||this._stream.seeking)||this._codec&&this._codec.processing}},{key:"_readBytesAndWait",value:function _readBytesAndWait(){var t=this;if(this._stream.buffering||this._stream.seeking)this._log("readBytesAndWait during i/o");else{this._stream.read(32768).then((function(i){t._log("got input "+[i.byteLength]),i.byteLength&&t._actionQueue.push((function(){t._codec.receiveInput(i,(function(){t._pingProcessing()}))})),t._stream.eof&&(t._log("stream is at end!"),t._streamEnded=!0),t._isProcessing()||t._pingProcessing()})).catch((function(i){t._onStreamError(i)}))}}},{key:"_pingProcessing",value:function _pingProcessing(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;if(this._stream&&this._stream.waiting)this._log("waiting on input");else{this._nextProcessingTimer&&(this._log("canceling old processing timer"),clearTimeout(this._nextProcessingTimer),this._nextProcessingTimer=null);var u=-1/256;i>u?this._nextProcessingTimer=setTimeout((function(){t._pingProcessing()}),i):this._depth?this._needProcessing=!0:this._doProcessing()}}},{key:"_startProcessingVideo",value:function _startProcessingVideo(t){var i=this;if(!this._started&&!this._codec){this._framesProcessed=0,this._bufferTime=0,this._drawingTime=0,this._proxyTime=0,this._started=!0,this._ended=!1;var u={base:this._options.base,worker:this._enableWorker,threading:this._enableThreading,simd:this._enableSIMD};this._detectedType&&(u.type=this._detectedType),this._codec=new A.default(u),this._lastVideoCpuTime=0,this._lastAudioCpuTime=0,this._lastDemuxerCpuTime=0,this._lastBufferTime=0,this._lastDrawingTime=0,this._lastProxyTime=0,this._lastFrameVideoCpuTime=0,this._lastFrameAudioCpuTime=0,this._lastFrameDemuxerCpuTime=0,this._lastFrameBufferTime=0,this._lastFrameProxyTime=0,this._lastFrameDrawingTime=0,this._currentVideoCpuTime=0,this._codec.onseek=function(t){i._didSeek=!0,i._stream&&i._seekStream(t)},this._codec.init((function(){i._codec.receiveInput(t,(function(){i._readBytesAndWait()}))}))}}},{key:"_loadCodec",value:function _loadCodec(t){var i=this;this._stream.read(1024).then((function(u){var d=new Uint8Array(u);d.length>4&&d[0]=="O".charCodeAt(0)&&d[1]=="g".charCodeAt(0)&&d[2]=="g".charCodeAt(0)&&d[3]=="S".charCodeAt(0)?i._detectedType="video/ogg":d.length>4&&26==d[0]&&69==d[1]&&223==d[2]&&163==d[3]?i._detectedType="video/webm":i._detectedType="video/ogg",t(u)}))}},{key:"_prepForLoad",value:function _prepForLoad(t){var i=this;this._stopVideo();this._currentSrc="",this._loading=!0,this._actionQueue.push((function(){t&&"none"===i.preload?i._loading=!1:function doLoad(){i._options.stream?i._stream=i._options.stream:i._stream=new y.default({url:i.src,cacheSize:16777216,progressive:!1}),i._stream.load().then((function(){i._loading=!1,i._currentSrc=i.src,i._byteLength=i._stream.seekable?i._stream.length:0;var t=i._stream.headers["x-content-duration"];"string"==typeof t&&(i._duration=parseFloat(t)),i._loadCodec((function(t){i._startProcessingVideo(t)}))})).catch((function(t){i._onStreamError(t)}))}()})),this._pingProcessing(0)}},{key:"load",value:function load(){this._prepForLoad()}},{key:"canPlayType",value:function canPlayType(t){var i=new E.default(t);function checkTypes(t){if(i.codecs){var u=0,d=0;return i.codecs.forEach((function(i){t.indexOf(i)>=0?u++:d++})),0===u||d>0?"":"probably"}return"maybe"}return"ogg"!==i.minor||"audio"!==i.major&&"video"!==i.major&&"application"!==i.major?"webm"!==i.minor||"audio"!==i.major&&"video"!==i.major?"":checkTypes(["vorbis","opus","vp8","vp9"]):checkTypes(["vorbis","opus","theora"])}},{key:"play",value:function play(){this._muted||this._options.audioContext||OGVPlayer.initSharedAudioContext(),this._paused&&(this._startedPlaybackInDocument=document.body.contains(this),this._paused=!1,this._state==L||(this._started&&this._codec&&this._codec.loadedMetadata?(this._ended&&this._stream&&this._byteLength?(this._log(".play() starting over after end"),this._seek(0)):this._log(".play() while already started"),this._state=V,this._isProcessing()||this._pingProcessing()):this._loading?this._log(".play() while loading"):(this._log(".play() before started"),this._stream||this.load())))}},{key:"getPlaybackStats",value:function getPlaybackStats(){return{targetPerFrameTime:this._targetPerFrameTime,framesProcessed:this._framesProcessed,videoBytes:this._codec?this._codec.videoBytes:0,audioBytes:this._codec?this._codec.audioBytes:0,playTime:this._playTime,demuxingTime:this._codec?this._codec.demuxerCpuTime-this._lastDemuxerCpuTime:0,videoDecodingTime:this._codec?this._codec.videoCpuTime-this._lastVideoCpuTime:0,audioDecodingTime:this._codec?this._codec.audioCpuTime-this._lastAudioCpuTime:0,bufferTime:this._bufferTime-this._lastBufferTime,drawingTime:this._drawingTime-this._lastDrawingTime,proxyTime:this._proxyTime-this._lastProxyTime,droppedAudio:this._droppedAudio,delayedAudio:this._delayedAudio,jitter:this._totalJitter/this._framesProcessed,lateFrames:this._lateFrames}}},{key:"resetPlaybackStats",value:function resetPlaybackStats(){this._framesProcessed=0,this._playTime=0,this._codec&&(this._lastDemuxerCpuTime=this._codec.demuxerCpuTime,this._lastVideoCpuTime=this._codec.videoCpuTime,this._lastAudioCpuTime=this._codec.audioCpuTime,this._codec.videoBytes=0,this._codec.audioBytes=0),this._lastBufferTime=this._bufferTime,this._lastDrawingTime=this._drawingTime,this._lastProxyTime=this._proxyTime,this._totalJitter=0,this._totalFrameTime=0,this._totalFrameCount=0}},{key:"getVideoFrameSink",value:function getVideoFrameSink(){return this._frameSink}},{key:"getCanvas",value:function getCanvas(){return this._canvas}},{key:"getVideo",value:function getVideo(){return null}},{key:"pause",value:function pause(){this._paused||(this._nextProcessingTimer&&(clearTimeout(this._nextProcessingTimer),this._nextProcessingTimer=null),this._stopPlayback(),this._prebufferingAudio=!1,this._paused=!0,this._fireEvent("pause"))}},{key:"stop",value:function stop(){this._stopVideo(),this._paused=!0}},{key:"fastSeek",value:function fastSeek(t){this._seek(+t,Y)}}],[{key:"initSharedAudioContext",value:function initSharedAudioContext(){b.default.initSharedAudioContext()}}]),OGVPlayer}(OGVJSElement);(0,P.default)(Q,S),Q.instanceCount=0,Q.styleManager=new function StyleManager(){var t=document.createElement("style");t.type="text/css",t.textContent="ogvjs { display: inline-block; position: relative; -webkit-user-select: none; -webkit-tap-highlight-color: rgba(0,0,0,0); ",document.head.appendChild(t);var i=t.sheet;this.appendRule=function(t,u){var d=[];for(var c in u)u.hasOwnProperty(c)&&d.push(c+":"+u[c]);var l=t+"{"+d.join(";")+"}";i.insertRule(l,i.cssRules.length-1)}};var K=Q;i.default=K},580:(t,i,u)=>{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(575)),l=d(u(913));var h=function OGVProxyClass(t){return function(){function _class(i,u,d){var l=this;for(var h in(0,c.default)(this,_class),d=d||{},this.worker=i,this.transferables=function(){var t=new ArrayBuffer(1024),u=new Uint8Array(t);try{return i.postMessage({action:"transferTest",bytes:u},[t]),!t.byteLength}catch(t){return!1}}(),t)t.hasOwnProperty(h)&&(this[h]=t[h]);this.processingQueue=0,Object.defineProperty(this,"processing",{get:function get(){return this.processingQueue>0}}),this.messageCount=0,this.pendingCallbacks={},this.worker.addEventListener("message",(function(t){l.handleMessage(t)})),this.proxy("construct",[u,d],(function(){}))}return(0,l.default)(_class,[{key:"proxy",value:function proxy(t,i,u){var d=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];if(!this.worker)throw'Tried to call "'+t+'" method on closed proxy object';var c="callback-"+ ++this.messageCount+"-"+t;u&&(this.pendingCallbacks[c]=u);var l={action:t,callbackId:c,args:i||[]};this.processingQueue++,this.transferables?this.worker.postMessage(l,d):this.worker.postMessage(l)}},{key:"terminate",value:function terminate(){this.worker&&(this.worker.terminate(),this.worker=null,this.processingQueue=0,this.pendingCallbacks={})}},{key:"handleMessage",value:function handleMessage(t){if(this.processingQueue--,"callback"===t.data.action){var i=t.data,u=i.callbackId,d=i.args,c=this.pendingCallbacks[u];if(i.props)for(var l in i.props)i.props.hasOwnProperty(l)&&(this[l]=i.props[l]);c&&(delete this.pendingCallbacks[u],c.apply(this,d))}}}]),_class}()};i.default=h},168:(t,i,u)=>{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(575)),l=d(u(913)),h=function(){function OGVTimeRanges(t){(0,c.default)(this,OGVTimeRanges),this._ranges=t,this.length=t.length}return(0,l.default)(OGVTimeRanges,[{key:"start",value:function start(t){if(t<0||t>this.length||t!==(0|t))throw new RangeError("Invalid index");return this._ranges[t][0]}},{key:"end",value:function end(t){if(t<0||t>this.length||t!==(0|t))throw new RangeError("Invalid index");return this._ranges[t][1]}}]),OGVTimeRanges}();i.default=h},625:(t,i,u)=>{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(575)),l=d(u(913)),h=d(u(964));function _createForOfIteratorHelper(t,i){var u="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!u){if(Array.isArray(t)||(u=function _unsupportedIterableToArray(t,i){if(!t)return;if("string"==typeof t)return _arrayLikeToArray(t,i);var u=Object.prototype.toString.call(t).slice(8,-1);"Object"===u&&t.constructor&&(u=t.constructor.name);if("Map"===u||"Set"===u)return Array.from(t);if("Arguments"===u||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(u))return _arrayLikeToArray(t,i)}(t))||i&&t&&"number"==typeof t.length){u&&(t=u);var d=0,c=function F(){};return{s:c,n:function n(){return d>=t.length?{done:!0}:{done:!1,value:t[d++]}},e:function e(t){throw t},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var l,h=!0,_=!1;return{s:function s(){u=u.call(t)},n:function n(){var t=u.next();return h=t.done,t},e:function e(t){_=!0,l=t},f:function f(){try{h||null==u.return||u.return()}finally{if(_)throw l}}}}function _arrayLikeToArray(t,i){(null==i||i>t.length)&&(i=t.length);for(var u=0,d=new Array(i);u0?l.push(_.subarray(0,_.length-Math.min(p,_.length))):l.push(_.subarray(Math.min(Math.abs(p),_.length),_.length))}}catch(t){h.e(t)}finally{h.f()}i.audioDecoder.audioBuffer=l}return u(t)}))}))}},{key:"discardFrame",value:function discardFrame(t){var i=this;this.demuxer.dequeueVideoPacket((function(u){i.videoBytes+=u.byteLength,t()}))}},{key:"discardAudio",value:function discardAudio(t){var i=this;this.demuxer.dequeueAudioPacket((function(u,d){i.audioBytes+=u.byteLength,t()}))}},{key:"flush",value:function flush(t){this.flushIter++,this.demuxer.flush(t)}},{key:"sync",value:function sync(){this.videoDecoder&&this.videoDecoder.sync()}},{key:"recycleFrame",value:function recycleFrame(t){this.videoDecoder&&this.videoDecoder.recycleFrame(t)}},{key:"getKeypointOffset",value:function getKeypointOffset(t,i){this.demuxer.getKeypointOffset(t,i)}},{key:"seekToKeypoint",value:function seekToKeypoint(t,i){this.demuxer.seekToKeypoint(t,this.flushSafe(i))}},{key:"loadAudioCodec",value:function loadAudioCodec(t){var i=this;if(this.demuxer.audioCodec){var u={vorbis:"OGVDecoderAudioVorbisW",opus:"OGVDecoderAudioOpusW"}[this.demuxer.audioCodec];this.processing=!0,h.default.loadClass(u,(function(u){var d={};i.demuxer.audioFormat&&(d.audioFormat=i.demuxer.audioFormat),u(d).then((function(u){i.audioDecoder=u,u.init((function(){i.loadedAudioMetadata=u.loadedMetadata,i.processing=!1,t()}))}))}),{worker:this.options.worker})}else t()}},{key:"loadVideoCodec",value:function loadVideoCodec(t){var i=this;if(this.demuxer.videoCodec){var u=!!this.options.simd,d=!!this.options.threading,c={theora:"OGVDecoderVideoTheoraW",vp8:d?"OGVDecoderVideoVP8MTW":"OGVDecoderVideoVP8W",vp9:d?u?"OGVDecoderVideoVP9SIMDMTW":"OGVDecoderVideoVP9MTW":u?"OGVDecoderVideoVP9SIMDW":"OGVDecoderVideoVP9W",av1:d?u?"OGVDecoderVideoAV1SIMDMTW":"OGVDecoderVideoAV1MTW":u?"OGVDecoderVideoAV1SIMDW":"OGVDecoderVideoAV1W"}[this.demuxer.videoCodec];this.processing=!0,h.default.loadClass(c,(function(u){var c={};i.demuxer.videoFormat&&(c.videoFormat=i.demuxer.videoFormat),d&&delete window.ENVIRONMENT_IS_PTHREAD,u(c).then((function(u){i.videoDecoder=u,u.init((function(){i.loadedVideoMetadata=u.loadedMetadata,i.processing=!1,t()}))}))}),{worker:this.options.worker&&!this.options.threading})}else t()}}]),OGVWrapperCodec}();i.default=_},539:(t,i,u)=>{"use strict";var d=u(318);Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var c=d(u(8)),l=d(u(575)),h=d(u(913));var _=new(function(){function WebAssemblyChecker(){(0,l.default)(this,WebAssemblyChecker),this.tested=!1,this.testResult=void 0}return(0,h.default)(WebAssemblyChecker,[{key:"wasmSupported",value:function wasmSupported(){if(!this.tested){try{"object"===("undefined"==typeof WebAssembly?"undefined":(0,c.default)(WebAssembly))?this.testResult=function testSafariWebAssemblyBug(){var t=new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,1,127,1,127,3,2,1,0,5,3,1,0,1,7,8,1,4,116,101,115,116,0,0,10,16,1,14,0,32,0,65,1,54,2,0,32,0,40,2,0,11]),i=new WebAssembly.Module(t);return 0!==new WebAssembly.Instance(i,{}).exports.test(4)}():this.testResult=!1}catch(t){console.log("Exception while testing WebAssembly",t),this.testResult=!1}this.tested=!0}return this.testResult}}]),WebAssemblyChecker}());i.default=_},309:(t,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var u=function extend(t,i){for(var u in i)i.hasOwnProperty(u)&&(t[u]=i[u])};i.default=u},431:(t,i,u)=>{"use strict";var d=function(){function defineProperties(t,i){for(var u=0;u{"use strict";var d=function(){function defineProperties(t,i){for(var u=0;u=200&&t.xhr.status<300?(t.length=getXHRLength(t.xhr),t.headers=function getXHRHeaders(t){var i={};return t.getAllResponseHeaders().split(/\r?\n/).forEach((function(t){var u=t.split(/:\s*/,2);u.length>1&&(i[u[0].toLowerCase()]=u[1])})),i}(t.xhr),t.onXHRStart()):(d(),u(new Error("HTTP error "+t.xhr.status)))}},l=function checkError(){d(),u(new Error("network error"))},h=function checkBackendOpen(){d(),i()};d=function oncomplete(){t.xhr.removeEventListener("readystatechange",c),t.xhr.removeEventListener("error",l),t.off("open",h),t._onAbort=null},t.initXHR(),t.xhr.addEventListener("readystatechange",c),t.xhr.addEventListener("error",l),t.on("open",h),t.xhr.send()}))}},{key:"bufferToOffset",value:function bufferToOffset(t){return Promise.reject(new Error("abstract"))}},{key:"abort",value:function abort(){if(this.xhr.abort(),this._onAbort){var t=this._onAbort;this._onAbort=null;var i=new Error("Aborted");i.name="AbortError",t(i)}}},{key:"initXHR",value:function initXHR(){var t=this.url;this.cachever&&(t+="?buggy_cachever="+this.cachever),this.xhr.open("GET",t);var i=null;(this.offset||this.length)&&(i="bytes="+this.offset+"-"),this.length&&(i+=this.offset+this.length-1),null!==i&&this.xhr.setRequestHeader("Range",i)}},{key:"onXHRStart",value:function onXHRStart(){throw new Error("abstract")}}]),Backend}(u(566));t.exports=c},810:(t,i,u)=>{"use strict";var d=function(){function defineProperties(t,i){for(var u=0;u0&&(this.bytesRead+=t.length,this.emit("buffer",t))}},{key:"onXHRLoad",value:function onXHRLoad(){this.onXHRProgress(),c(BinaryStringBackend.prototype.__proto__||Object.getPrototypeOf(BinaryStringBackend.prototype),"onXHRLoad",this).call(this)}}]),BinaryStringBackend}(u(828));l.supported=function(){try{return!!(new XMLHttpRequest).overrideMimeType}catch(t){return!1}},t.exports=l},828:(t,i,u)=>{"use strict";var d=function(){function defineProperties(t,i){for(var u=0;u=t)u();else{var c=null;i._onAbort=function(t){c(),d(t)};var l=function checkBuffer(){i.offset>=t&&!i.eof&&(c(),u())},h=function checkDone(){c(),u()},_=function checkError(){c(),d(new Error("error streaming"))};c=function oncomplete(){i.buffering=!1,i.off("buffer",l),i.off("done",h),i.off("error",_),i._onAbort=null},i.buffering=!0,i.on("buffer",l),i.on("done",h),i.on("error",_)}}))}},{key:"initXHR",value:function initXHR(){c(DownloadBackend.prototype.__proto__||Object.getPrototypeOf(DownloadBackend.prototype),"initXHR",this).call(this)}},{key:"onXHRStart",value:function onXHRStart(){var t=this;this.xhr.addEventListener("progress",(function(){return t.onXHRProgress()})),this.xhr.addEventListener("error",(function(){return t.onXHRError()})),this.xhr.addEventListener("load",(function(){return t.onXHRLoad()})),this.emit("open")}},{key:"onXHRProgress",value:function onXHRProgress(){throw new Error("abstract")}},{key:"onXHRError",value:function onXHRError(){this.emit("error")}},{key:"onXHRLoad",value:function onXHRLoad(){this.eof=!0,this.emit("done")}}]),DownloadBackend}(u(306));t.exports=l},761:(t,i,u)=>{"use strict";var d=u(855),c=u(810),l=u(431);var h=null;t.exports=function instantiate(t){if(!1===t.progressive)return new l(t);if(h||(h=function autoselect(){return d.supported()?d:c.supported()?c:null}()),!h)throw new Error("No supported backend class");return new h(t)}},855:(t,i,u)=>{"use strict";var d=function(){function defineProperties(t,i){for(var u=0;u{"use strict";var i=function(){function defineProperties(t,i){for(var u=0;u0&&void 0!==arguments[0]?arguments[0]:{},i=t.buffer,u=void 0===i?void 0:i,d=t.string,c=void 0===d?void 0:d,l=t.start,h=void 0===l?0:l,_=t.end,p=void 0===_?h+(u?u.byteLength:c?c.length:0):_,m=t.prev,g=void 0===m?null:m,v=t.next,y=void 0===v?null:v,b=t.eof,T=void 0!==b&&b,k=t.empty,P=void 0===k?!(u||c):k,w=t.timestamp,E=void 0===w?Date.now():w;_classCallCheck(this,CacheItem),this.start=h,this.end=p,this.prev=g,this.next=y,this.eof=T,this.empty=P,this.timestamp=E,this.buffer=u,this.string=c,Object.defineProperty(this,"length",{get:function get(){return this.end-this.start}})}return i(CacheItem,[{key:"contains",value:function contains(t){return t>=this.start&&(t{"use strict";var d=function(){function defineProperties(t,i){for(var u=0;u0&&void 0!==arguments[0]?arguments[0]:{},i=t.cacheSize,u=void 0===i?0:i;_classCallCheck(this,CachePool);var d=new c({eof:!0});this.head=d,this.tail=d,this.readOffset=0,this.readCursor=d,this.writeOffset=0,this.writeCursor=d,this.cacheSize=u}return d(CachePool,[{key:"bytesReadable",value:function bytesReadable(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1/0,i=this.readOffset,u=this.readCursor,d=u.last((function(u){return!u.empty&&u.start<=i+t}));return d?Math.min(t,d.end-i):0}},{key:"bytesWritable",value:function bytesWritable(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1/0,i=this.writeOffset,u=this.writeCursor;if(u.eof)return t;var d=u.last((function(u){return u.empty&&u.start<=i+t}));return d?Math.min(t,d.end-i):0}},{key:"seekRead",value:function seekRead(t){var i=this.head.first((function(i){return i.contains(t)}));if(!i)throw new Error("read seek out of range");this.readOffset=t,this.readCursor=i}},{key:"seekWrite",value:function seekWrite(t){var i=this.head.first((function(i){return i.contains(t)}));if(!i)throw new Error("write seek out of range");this.writeOffset=t,this.writeCursor=i}},{key:"readBytes",value:function readBytes(t){for(var i=t.byteLength,u=this.bytesReadable(i),d=this.readOffset,c=d+u,l=d,h=this.readCursor;h&&!h.empty&&!(h.start>=c);h=h.next){var _=Math.min(c,h.end),p=t.subarray(l-d,_-d);h.readBytes(p,l,_),l=_}return this.readOffset=l,this.readCursor=this.readCursor.first((function(t){return t.contains(l)})),u}},{key:"write",value:function write(t){var i=this.bufferItem(t),u=this.writeCursor;if(!u.empty)throw new Error("write cursor not empty");if(!u.contains(i.end)&&u.end!==i.end)throw new Error("write cursor too small");u.startthis.readOffset+this.chunkSize)&&i.push(u));if(t>this.cacheSize){i.sort((function(t,i){return t.timestamp-i.timestamp}));for(var d=0;d{"use strict";t.exports=u(91)},566:t=>{"use strict";var i=function(){function defineProperties(t,i){for(var u=0;u=0&&u.splice(d,1)}},{key:"emit",value:function emit(t,i){(this._e[t]||[]).slice().forEach((function(t){return t(i)}))}}]),TinyEvents}();t.exports=u},936:(t,i,u)=>{"use strict";var d=function(){function defineProperties(t,i){for(var u=0;u=0&&_>=t.length)return void i(null);var p=t._clampToLength(d.writeOffset+d.bytesWritable(c))-d.writeOffset;if(0===p)i(null);else{var m=t._backend=new l({url:t.url,offset:t._cache.writeOffset,length:p,cachever:t._cachever,progressive:t.progressive}),g=null,v=function checkOpen(){m!==t._backend?(g(),u(new Error("invalid state"))):(m.on("buffer",(function(i){m===t._backend&&t._cache.write(i)})),m.on("done",(function(){m===t._backend&&(-1===t.length&&(t.length=t._backend.offset+t._backend.bytesRead),t._backend=null)})),i(m))},y=function checkError(i){m!==t._backend?u(new Error("invalid state")):(t._backend=null,u(i))};g=function oncomplete(){m.off("open",v),m.off("error",y)},m.on("open",v),m.on("error",y),m.on("cachever",(function(){t._cachever++})),m.load()}}}))}},{key:"_readAhead",value:function _readAhead(){var t=this;return new Promise((function(i,u){t._backend||t.eof?i():t._openBackend().then((function(){i()})).catch((function(t){u(t)}))}))}},{key:"seek",value:function seek(t){var i=this;return new Promise((function(u,d){if(!i.loaded||i.buffering||i.seeking)throw new Error("invalid state");if(t!==(0|t)||t<0)throw new Error("invalid input");if(i.length>=0&&t>i.length)throw new Error("seek past end of file");if(!i.seekable)throw new Error("seek on non-seekable stream");i._backend&&i.abort(),i._cache.seekRead(t),i._cache.seekWrite(t),i._readAhead().then(u).catch(d)}))}},{key:"read",value:function read(t){var i=this;return this.buffer(t).then((function(t){return i.readSync(t)}))}},{key:"readSync",value:function readSync(t){var i=this.bytesAvailable(t),u=new Uint8Array(i);if(this.readBytes(u)!==i)throw new Error("failed to read expected data");return u.buffer}},{key:"readBytes",value:function readBytes(t){if(!this.loaded||this.buffering||this.seeking)throw new Error("invalid state");if(!(t instanceof Uint8Array))throw new Error("invalid input");var i=this._cache.readBytes(t);return this._readAhead(),i}},{key:"buffer",value:function buffer(t){var i=this;return new Promise((function(u,d){if(!i.loaded||i.buffering||i.seeking)throw new Error("invalid state");if(t!==(0|t)||t<0)throw new Error("invalid input");var c=i._clampToLength(i.offset+t),l=c-i.offset,h=i.bytesAvailable(l);h>=l?u(h):(i.buffering=!0,i._openBackend().then((function(u){return u?u.bufferToOffset(c).then((function(){return i.buffering=!1,i.buffer(t)})):Promise.resolve(h)})).then((function(t){i.buffering=!1,u(t)})).catch((function(t){"AbortError"!==t.name&&(i.buffering=!1),d(t)})))}))}},{key:"bytesAvailable",value:function bytesAvailable(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1/0;return this._cache.bytesReadable(t)}},{key:"abort",value:function abort(){this.loading&&(this.loading=!1),this.buffering&&(this.buffering=!1),this.seeking&&(this.seeking=!1),this._backend&&(this._backend.abort(),this._backend=null)}},{key:"getBufferedRanges",value:function getBufferedRanges(){return this._cache.ranges()}},{key:"_clampToLength",value:function _clampToLength(t){return this.length<0?t:Math.min(this.length,t)}}]),StreamFile}();t.exports=h},826:t=>{t.exports={vertex:"precision lowp float;\n\nattribute vec2 aPosition;\nattribute vec2 aLumaPosition;\nattribute vec2 aChromaPosition;\nvarying vec2 vLumaPosition;\nvarying vec2 vChromaPosition;\nvoid main() {\n gl_Position = vec4(aPosition, 0, 1);\n vLumaPosition = aLumaPosition;\n vChromaPosition = aChromaPosition;\n}\n",fragment:"// inspired by https://github.com/mbebenita/Broadway/blob/master/Player/canvas.js\n\nprecision lowp float;\n\nuniform sampler2D uTextureY;\nuniform sampler2D uTextureCb;\nuniform sampler2D uTextureCr;\nvarying vec2 vLumaPosition;\nvarying vec2 vChromaPosition;\nvoid main() {\n // Y, Cb, and Cr planes are uploaded as LUMINANCE textures.\n float fY = texture2D(uTextureY, vLumaPosition).x;\n float fCb = texture2D(uTextureCb, vChromaPosition).x;\n float fCr = texture2D(uTextureCr, vChromaPosition).x;\n\n // Premultipy the Y...\n float fYmul = fY * 1.1643828125;\n\n // And convert that to RGB!\n gl_FragColor = vec4(\n fYmul + 1.59602734375 * fCr - 0.87078515625,\n fYmul - 0.39176171875 * fCb - 0.81296875 * fCr + 0.52959375,\n fYmul + 2.017234375 * fCb - 1.081390625,\n 1\n );\n}\n",vertexStripe:"precision lowp float;\n\nattribute vec2 aPosition;\nattribute vec2 aTexturePosition;\nvarying vec2 vTexturePosition;\n\nvoid main() {\n gl_Position = vec4(aPosition, 0, 1);\n vTexturePosition = aTexturePosition;\n}\n",fragmentStripe:"// extra 'stripe' texture fiddling to work around IE 11's poor performance on gl.LUMINANCE and gl.ALPHA textures\n\nprecision lowp float;\n\nuniform sampler2D uStripe;\nuniform sampler2D uTexture;\nvarying vec2 vTexturePosition;\nvoid main() {\n // Y, Cb, and Cr planes are mapped into a pseudo-RGBA texture\n // so we can upload them without expanding the bytes on IE 11\n // which doesn't allow LUMINANCE or ALPHA textures\n // The stripe textures mark which channel to keep for each pixel.\n // Each texture extraction will contain the relevant value in one\n // channel only.\n\n float fLuminance = dot(\n texture2D(uStripe, vTexturePosition),\n texture2D(uTexture, vTexturePosition)\n );\n\n gl_FragColor = vec4(fLuminance, fLuminance, fLuminance, 1);\n}\n"}},487:t=>{!function(){"use strict";function FrameSink(t,i){throw new Error("abstract")}FrameSink.prototype.drawFrame=function(t){throw new Error("abstract")},FrameSink.prototype.clear=function(){throw new Error("abstract")},t.exports=FrameSink}()},926:(t,i,u)=>{!function(){"use strict";var i=u(487),d=u(627);function SoftwareFrameSink(t){var i=this,u=t.getContext("2d"),c=null,l=null,h=null;return i.drawFrame=function drawFrame(i){var _=i.format;t.width===_.displayWidth&&t.height===_.displayHeight||(t.width=_.displayWidth,t.height=_.displayHeight),null!==c&&c.width==_.width&&c.height==_.height||function initImageData(t,i){for(var d=(c=u.createImageData(t,i)).data,l=t*i*4,h=0;h{!function(){"use strict";var i=u(487),d=u(826);function WebGLFrameSink(t){var i,u,c=this,l=WebGLFrameSink.contextForCanvas(t);if(null===l)throw new Error("WebGL unavailable");function compileShader(t,i){var u=l.createShader(t);if(l.shaderSource(u,i),l.compileShader(u),!l.getShaderParameter(u,l.COMPILE_STATUS)){var d=l.getShaderInfoLog(u);throw l.deleteShader(u),new Error("GL shader compilation for "+t+" failed: "+d)}return u}var h,_,p,m,g,v,y,b,T,k,P=new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),w={},E={},x={};function createOrReuseTexture(t,i){return w[t]&&!i||(w[t]=l.createTexture()),w[t]}function uploadTexture(t,i,u,d,c){var h=createOrReuseTexture(t,i);if(l.activeTexture(l.TEXTURE0),WebGLFrameSink.stripe){var _=!w[t+"_temp"]||i,p=createOrReuseTexture(t+"_temp",i);l.bindTexture(l.TEXTURE_2D,p),_?(l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.NEAREST),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.NEAREST),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,u/4,d,0,l.RGBA,l.UNSIGNED_BYTE,c)):l.texSubImage2D(l.TEXTURE_2D,0,0,0,u/4,d,l.RGBA,l.UNSIGNED_BYTE,c);var m=w[t+"_stripe"],g=!m||i;g&&(m=createOrReuseTexture(t+"_stripe",i)),l.bindTexture(l.TEXTURE_2D,m),g&&(l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.NEAREST),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.NEAREST),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,u,1,0,l.RGBA,l.UNSIGNED_BYTE,function buildStripe(t){if(x[t])return x[t];for(var i=t,u=new Uint32Array(i),d=0;d{!function(){"use strict";var i=u(877);t.exports={convertYCbCr:function convertYCbCr(t,u){var d=0|t.format.width,c=0|t.format.height,l=0|i(t.format.width/t.format.chromaWidth),h=0|i(t.format.height/t.format.chromaHeight),_=t.y.bytes,p=t.u.bytes,m=t.v.bytes,g=0|t.y.stride,v=0|t.u.stride,y=0|t.v.stride,b=d<<2,T=0,k=0,P=0,w=0,E=0,x=0,A=0,R=0,O=0,S=0,C=0,B=0,D=0,M=0,V=0,I=0,L=0,j=0;if(1==l&&1==h)for(A=0,R=b,j=0,I=0;I>8,u[A+1]=C-D>>8,u[A+2]=C+M>>8,A+=4,C=298*_[k++]|0,u[A]=C+B>>8,u[A+1]=C-D>>8,u[A+2]=C+M>>8,A+=4,C=298*_[P++]|0,u[R]=C+B>>8,u[R+1]=C-D>>8,u[R+2]=C+M>>8,R+=4,C=298*_[P++]|0,u[R]=C+B>>8,u[R+1]=C-D>>8,u[R+2]=C+M>>8,R+=4;A+=b,R+=b,j++}else for(x=0,I=0;I>h)*v|0,E=j*y|0,V=0;V>l)],B=(409*(S=0|m[E+L])|0)-57088|0,D=(100*O|0)+(208*S|0)-34816|0,M=(516*O|0)-70912|0,C=298*_[T++]|0,u[x]=C+B>>8,u[x+1]=C-D>>8,u[x+2]=C+M>>8,x+=4}}}()},877:t=>{!function(){"use strict";t.exports=function depower(t){for(var i=0,u=t>>1;0!=u;)u>>=1,i++;if(t!==1<{!function(){"use strict";var i=u(487),d=u(926),c=u(895),l={FrameSink:i,SoftwareFrameSink:d,WebGLFrameSink:c,attach:function(t,i){return("webGL"in(i=i||{})?i.webGL:c.isAvailable())?new c(t,i):new d(t,i)}};t.exports=l}()}},i={};function __webpack_require__(u){var d=i[u];if(void 0!==d)return d.exports;var c=i[u]={exports:{}};return t[u](c,c.exports,__webpack_require__),c.exports}var u={};return(()=>{"use strict";var t=u,i=__webpack_require__(318);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"OGVCompat",{enumerable:!0,get:function get(){return c.default}}),Object.defineProperty(t,"OGVLoader",{enumerable:!0,get:function get(){return l.default}}),Object.defineProperty(t,"OGVMediaError",{enumerable:!0,get:function get(){return h.default}}),Object.defineProperty(t,"OGVMediaType",{enumerable:!0,get:function get(){return _.default}}),Object.defineProperty(t,"OGVPlayer",{enumerable:!0,get:function get(){return p.default}}),Object.defineProperty(t,"OGVTimeRanges",{enumerable:!0,get:function get(){return m.default}}),t.OGVVersion=void 0;var d=i(__webpack_require__(8)),c=i(__webpack_require__(523)),l=i(__webpack_require__(964)),h=i(__webpack_require__(759)),_=i(__webpack_require__(278)),p=i(__webpack_require__(869)),m=i(__webpack_require__(168)),g="1.8.6-20220111172545-1f60d9d";t.OGVVersion=g,"object"===("undefined"==typeof window?"undefined":(0,d.default)(window))&&(window.OGVCompat=c.default,window.OGVLoader=l.default,window.OGVMediaError=h.default,window.OGVMediaType=_.default,window.OGVTimeRanges=m.default,window.OGVPlayer=p.default,window.OGVVersion=g)})(),u})()})); \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/web_deps/yuv-canvas-1.2.6.js b/shelled/rustdesk-as-ref/web_deps/yuv-canvas-1.2.6.js deleted file mode 100644 index 36e36f4..0000000 --- a/shelled/rustdesk-as-ref/web_deps/yuv-canvas-1.2.6.js +++ /dev/null @@ -1,1234 +0,0 @@ -(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i - -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 -MPLIED, 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 -ONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -/** - * Represents metadata about a YUV frame format. - * @typedef {Object} YUVFormat - * @property {number} width - width of encoded frame in luma pixels - * @property {number} height - height of encoded frame in luma pixels - * @property {number} chromaWidth - width of encoded frame in chroma pixels - * @property {number} chromaHeight - height of encoded frame in chroma pixels - * @property {number} cropLeft - upper-left X coordinate of visible crop region, in luma pixels - * @property {number} cropTop - upper-left Y coordinate of visible crop region, in luma pixels - * @property {number} cropWidth - width of visible crop region, in luma pixels - * @property {number} cropHeight - height of visible crop region, in luma pixels - * @property {number} displayWidth - final display width of visible region, in luma pixels - * @property {number} displayHeight - final display height of visible region, in luma pixels - */ - -/** - * Represents underlying image data for a single luma or chroma plane. - * Cannot be interpreted without the format data from a frame buffer. - * @typedef {Object} YUVPlane - * @property {Uint8Array} bytes - typed array containing image data bytes - * @property {number} stride - byte distance between rows in data - */ - -/** - * Represents a YUV image frame buffer, with enough format information - * to interpret the data usefully. Buffer objects use generic objects - * under the hood and can be transferred between worker threads using - * the structured clone algorithm. - * - * @typedef {Object} YUVFrame - * @property {YUVFormat} format - * @property {YUVPlane} y - * @property {YUVPlane} u - * @property {YUVPlane} v - */ - -/** - * Holder namespace for utility functions and constants related to - * YUV frame and plane buffers. - * - * @namespace - */ -var YUVBuffer = { - /** - * Validate a plane dimension - * @param {number} dim - vertical or horizontal dimension - * @throws exception on zero, negative, or non-integer value - */ - validateDimension: function(dim) { - if (dim <= 0 || dim !== (dim | 0)) { - throw 'YUV plane dimensions must be a positive integer'; - } - }, - - /** - * Validate a plane offset - * @param {number} dim - vertical or horizontal dimension - * @throws exception on negative or non-integer value - */ - validateOffset: function(dim) { - if (dim < 0 || dim !== (dim | 0)) { - throw 'YUV plane offsets must be a non-negative integer'; - } - }, - - /** - * Validate and fill out a YUVFormat object structure. - * - * At least width and height fields are required; other fields will be - * derived if left missing or empty: - * - chromaWidth and chromaHeight will be copied from width and height as for a 4:4:4 layout - * - cropLeft and cropTop will be 0 - * - cropWidth and cropHeight will be set to whatever of the frame is visible after cropTop and cropLeft are applied - * - displayWidth and displayHeight will be set to cropWidth and cropHeight. - * - * @param {YUVFormat} fields - input fields, must include width and height. - * @returns {YUVFormat} - validated structure, with all derivable fields filled out. - * @throws exception on invalid fields or missing width/height - */ - format: function(fields) { - var width = fields.width, - height = fields.height, - chromaWidth = fields.chromaWidth || width, - chromaHeight = fields.chromaHeight || height, - cropLeft = fields.cropLeft || 0, - cropTop = fields.cropTop || 0, - cropWidth = fields.cropWidth || width - cropLeft, - cropHeight = fields.cropHeight || height - cropTop, - displayWidth = fields.displayWidth || cropWidth, - displayHeight = fields.displayHeight || cropHeight; - this.validateDimension(width); - this.validateDimension(height); - this.validateDimension(chromaWidth); - this.validateDimension(chromaHeight); - this.validateOffset(cropLeft); - this.validateOffset(cropTop); - this.validateDimension(cropWidth); - this.validateDimension(cropHeight); - this.validateDimension(displayWidth); - this.validateDimension(displayHeight); - return { - width: width, - height: height, - chromaWidth: chromaWidth, - chromaHeight: chromaHeight, - cropLeft: cropLeft, - cropTop: cropTop, - cropWidth: cropWidth, - cropHeight: cropHeight, - displayWidth: displayWidth, - displayHeight: displayHeight - }; - }, - - /** - * Allocate a new YUVPlane object of the given size. - * @param {number} stride - byte distance between rows - * @param {number} rows - number of rows to allocate - * @returns {YUVPlane} - freshly allocated planar buffer - */ - allocPlane: function(stride, rows) { - YUVBuffer.validateDimension(stride); - YUVBuffer.validateDimension(rows); - return { - bytes: new Uint8Array(stride * rows), - stride: stride - } - }, - - /** - * Pick a suitable stride for a custom-allocated thingy - * @param {number} width - width in bytes - * @returns {number} - new width in bytes at least as large - * @throws exception on invalid input width - */ - suitableStride: function(width) { - YUVBuffer.validateDimension(width); - var alignment = 4, - remainder = width % alignment; - if (remainder == 0) { - return width; - } else { - return width + (alignment - remainder); - } - }, - - /** - * Allocate or extract a YUVPlane object from given dimensions/source. - * @param {number} width - width in pixels - * @param {number} height - height in pixels - * @param {Uint8Array} source - input byte array; optional (will create empty buffer if missing) - * @param {number} stride - row length in bytes; optional (will create a default if missing) - * @param {number} offset - offset into source array to extract; optional (will start at 0 if missing) - * @returns {YUVPlane} - freshly allocated planar buffer - */ - allocPlane: function(width, height, source, stride, offset) { - var size, bytes; - - this.validateDimension(width); - this.validateDimension(height); - - offset = offset || 0; - - stride = stride || this.suitableStride(width); - this.validateDimension(stride); - if (stride < width) { - throw "Invalid input stride for YUV plane; must be larger than width"; - } - - size = stride * height; - - if (source) { - if (source.length - offset < size) { - throw "Invalid input buffer for YUV plane; must be large enough for stride times height"; - } - bytes = source.slice(offset, offset + size); - } else { - bytes = new Uint8Array(size); - stride = stride || this.suitableStride(width); - } - - return { - bytes: bytes, - stride: stride - }; - }, - - /** - * Allocate a new YUVPlane object big enough for a luma plane in the given format - * @param {YUVFormat} format - target frame format - * @param {Uint8Array} source - input byte array; optional (will create empty buffer if missing) - * @param {number} stride - row length in bytes; optional (will create a default if missing) - * @param {number} offset - offset into source array to extract; optional (will start at 0 if missing) - * @returns {YUVPlane} - freshly allocated planar buffer - */ - lumaPlane: function(format, source, stride, offset) { - return this.allocPlane(format.width, format.height, source, stride, offset); - }, - - /** - * Allocate a new YUVPlane object big enough for a chroma plane in the given format, - * optionally copying data from an existing buffer. - * - * @param {YUVFormat} format - target frame format - * @param {Uint8Array} source - input byte array; optional (will create empty buffer if missing) - * @param {number} stride - row length in bytes; optional (will create a default if missing) - * @param {number} offset - offset into source array to extract; optional (will start at 0 if missing) - * @returns {YUVPlane} - freshly allocated planar buffer - */ - chromaPlane: function(format, source, stride, offset) { - return this.allocPlane(format.chromaWidth, format.chromaHeight, source, stride, offset); - }, - - /** - * Allocate a new YUVFrame object big enough for the given format - * @param {YUVFormat} format - target frame format - * @param {YUVPlane} y - optional Y plane; if missing, fresh one will be allocated - * @param {YUVPlane} u - optional U plane; if missing, fresh one will be allocated - * @param {YUVPlane} v - optional V plane; if missing, fresh one will be allocated - * @returns {YUVFrame} - freshly allocated frame buffer - */ - frame: function(format, y, u, v) { - y = y || this.lumaPlane(format); - u = u || this.chromaPlane(format); - v = v || this.chromaPlane(format); - return { - format: format, - y: y, - u: u, - v: v - } - }, - - /** - * Duplicate a plane using new buffer memory. - * @param {YUVPlane} plane - input plane to copy - * @returns {YUVPlane} - freshly allocated and filled planar buffer - */ - copyPlane: function(plane) { - return { - bytes: plane.bytes.slice(), - stride: plane.stride - }; - }, - - /** - * Duplicate a frame using new buffer memory. - * @param {YUVFrame} frame - input frame to copyFrame - * @returns {YUVFrame} - freshly allocated and filled frame buffer - */ - copyFrame: function(frame) { - return { - format: frame.format, - y: this.copyPlane(frame.y), - u: this.copyPlane(frame.u), - v: this.copyPlane(frame.v) - } - }, - - /** - * List the backing buffers for the frame's planes for transfer between - * threads via Worker.postMessage. - * @param {YUVFrame} frame - input frame - * @returns {Array} - list of transferable objects - */ - transferables: function(frame) { - return [frame.y.bytes.buffer, frame.u.bytes.buffer, frame.v.bytes.buffer]; - } -}; - -module.exports = YUVBuffer; - -},{}],4:[function(require,module,exports){ -(function() { - "use strict"; - - /** - * Create a YUVCanvas and attach it to an HTML5 canvas element. - * - * This will take over the drawing context of the canvas and may turn - * it into a WebGL 3d canvas if possible. Do not attempt to use the - * drawing context directly after this. - * - * @param {HTMLCanvasElement} canvas - HTML canvas element to attach to - * @param {YUVCanvasOptions} options - map of options - * @throws exception if WebGL requested but unavailable - * @constructor - * @abstract - */ - function FrameSink(canvas, options) { - throw new Error('abstract'); - } - - /** - * Draw a single YUV frame on the underlying canvas, converting to RGB. - * If necessary the canvas will be resized to the optimal pixel size - * for the given buffer's format. - * - * @param {YUVBuffer} buffer - the YUV buffer to draw - * @see {@link https://www.npmjs.com/package/yuv-buffer|yuv-buffer} for format - */ - FrameSink.prototype.drawFrame = function(buffer) { - throw new Error('abstract'); - }; - - /** - * Clear the canvas using appropriate underlying 2d or 3d context. - */ - FrameSink.prototype.clear = function() { - throw new Error('abstract'); - }; - - module.exports = FrameSink; - -})(); - -},{}],5:[function(require,module,exports){ -/* -Copyright (c) 2014-2016 Brion Vibber - -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 -MPLIED, 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. -*/ -(function() { - "use strict"; - - var FrameSink = require('./FrameSink.js'), - YCbCr = require('./YCbCr.js'); - - /** - * @param {HTMLCanvasElement} canvas - HTML canvas eledment to attach to - * @constructor - */ - function SoftwareFrameSink(canvas) { - var self = this, - ctx = canvas.getContext('2d'), - imageData = null, - resampleCanvas = null, - resampleContext = null; - - - - function initImageData(width, height) { - imageData = ctx.createImageData(width, height); - - // Prefill the alpha to opaque - var data = imageData.data, - pixelCount = width * height * 4; - for (var i = 0; i < pixelCount; i += 4) { - data[i + 3] = 255; - } - } - - function initResampleCanvas(cropWidth, cropHeight) { - resampleCanvas = document.createElement('canvas'); - resampleCanvas.width = cropWidth; - resampleCanvas.height = cropHeight; - resampleContext = resampleCanvas.getContext('2d'); - } - - /** - * Actually draw a frame into the canvas. - * @param {YUVFrame} buffer - YUV frame buffer object to draw - */ - self.drawFrame = function drawFrame(buffer) { - var format = buffer.format; - - if (canvas.width !== format.displayWidth || canvas.height !== format.displayHeight) { - // Keep the canvas at the right size... - canvas.width = format.displayWidth; - canvas.height = format.displayHeight; - } - - if (imageData === null || - imageData.width != format.width || - imageData.height != format.height) { - initImageData(format.width, format.height); - } - - // YUV -> RGB over the entire encoded frame - YCbCr.convertYCbCr(buffer, imageData.data); - - var resample = (format.cropWidth != format.displayWidth || format.cropHeight != format.displayHeight); - var drawContext; - if (resample) { - // hack for non-square aspect-ratio - // putImageData doesn't resample, so we have to draw in two steps. - if (!resampleCanvas) { - initResampleCanvas(format.cropWidth, format.cropHeight); - } - drawContext = resampleContext; - } else { - drawContext = ctx; - } - - // Draw cropped frame to either the final or temporary canvas - drawContext.putImageData(imageData, - -format.cropLeft, -format.cropTop, // must offset the offset - format.cropLeft, format.cropTop, - format.cropWidth, format.cropHeight); - - if (resample) { - ctx.drawImage(resampleCanvas, 0, 0, format.displayWidth, format.displayHeight); - } - }; - - self.clear = function() { - ctx.clearRect(0, 0, canvas.width, canvas.height); - }; - - return self; - } - - SoftwareFrameSink.prototype = Object.create(FrameSink.prototype); - - module.exports = SoftwareFrameSink; -})(); - -},{"./FrameSink.js":4,"./YCbCr.js":7}],6:[function(require,module,exports){ -/* -Copyright (c) 2014-2016 Brion Vibber - -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 -MPLIED, 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. -*/ -(function() { - "use strict"; - - var FrameSink = require('./FrameSink.js'), - shaders = require('../build/shaders.js'); - - /** - * Warning: canvas must not have been used for 2d drawing prior! - * - * @param {HTMLCanvasElement} canvas - HTML canvas element to attach to - * @constructor - */ - function WebGLFrameSink(canvas) { - var self = this, - gl = WebGLFrameSink.contextForCanvas(canvas), - debug = false; // swap this to enable more error checks, which can slow down rendering - - if (gl === null) { - throw new Error('WebGL unavailable'); - } - - // GL! - function checkError() { - if (debug) { - err = gl.getError(); - if (err !== 0) { - throw new Error("GL error " + err); - } - } - } - - function compileShader(type, source) { - var shader = gl.createShader(type); - gl.shaderSource(shader, source); - gl.compileShader(shader); - - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - var err = gl.getShaderInfoLog(shader); - gl.deleteShader(shader); - throw new Error('GL shader compilation for ' + type + ' failed: ' + err); - } - - return shader; - } - - - var program, - unpackProgram, - err; - - // In the world of GL there are no rectangles. - // There are only triangles. - // THERE IS NO SPOON. - var rectangle = new Float32Array([ - // First triangle (top left, clockwise) - -1.0, -1.0, - +1.0, -1.0, - -1.0, +1.0, - - // Second triangle (bottom right, clockwise) - -1.0, +1.0, - +1.0, -1.0, - +1.0, +1.0 - ]); - - var textures = {}; - var framebuffers = {}; - var stripes = {}; - var buf, positionLocation, unpackPositionLocation; - var unpackTexturePositionBuffer, unpackTexturePositionLocation; - var stripeLocation, unpackTextureLocation; - var lumaPositionBuffer, lumaPositionLocation; - var chromaPositionBuffer, chromaPositionLocation; - - function createOrReuseTexture(name) { - if (!textures[name]) { - textures[name] = gl.createTexture(); - } - return textures[name]; - } - - function uploadTexture(name, width, height, data) { - var texture = createOrReuseTexture(name); - gl.activeTexture(gl.TEXTURE0); - - if (WebGLFrameSink.stripe) { - var uploadTemp = !textures[name + '_temp']; - var tempTexture = createOrReuseTexture(name + '_temp'); - gl.bindTexture(gl.TEXTURE_2D, tempTexture); - if (uploadTemp) { - // new texture - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texImage2D( - gl.TEXTURE_2D, - 0, // mip level - gl.RGBA, // internal format - width / 4, - height, - 0, // border - gl.RGBA, // format - gl.UNSIGNED_BYTE, // type - data // data! - ); - } else { - // update texture - gl.texSubImage2D( - gl.TEXTURE_2D, - 0, // mip level - 0, // x offset - 0, // y offset - width / 4, - height, - gl.RGBA, // format - gl.UNSIGNED_BYTE, // type - data // data! - ); - } - - var stripeTexture = textures[name + '_stripe']; - var uploadStripe = !stripeTexture; - if (uploadStripe) { - stripeTexture = createOrReuseTexture(name + '_stripe'); - } - gl.bindTexture(gl.TEXTURE_2D, stripeTexture); - if (uploadStripe) { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texImage2D( - gl.TEXTURE_2D, - 0, // mip level - gl.RGBA, // internal format - width, - 1, - 0, // border - gl.RGBA, // format - gl.UNSIGNED_BYTE, //type - buildStripe(width, 1) // data! - ); - } - - } else { - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texImage2D( - gl.TEXTURE_2D, - 0, // mip level - gl.LUMINANCE, // internal format - width, - height, - 0, // border - gl.LUMINANCE, // format - gl.UNSIGNED_BYTE, //type - data // data! - ); - } - } - - function unpackTexture(name, width, height) { - var texture = textures[name]; - - // Upload to a temporary RGBA texture, then unpack it. - // This is faster than CPU-side swizzling in ANGLE on Windows. - gl.useProgram(unpackProgram); - - var fb = framebuffers[name]; - if (!fb) { - // Create a framebuffer and an empty target size - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texImage2D( - gl.TEXTURE_2D, - 0, // mip level - gl.RGBA, // internal format - width, - height, - 0, // border - gl.RGBA, // format - gl.UNSIGNED_BYTE, //type - null // data! - ); - - fb = framebuffers[name] = gl.createFramebuffer(); - } - - gl.bindFramebuffer(gl.FRAMEBUFFER, fb); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - - var tempTexture = textures[name + '_temp']; - gl.activeTexture(gl.TEXTURE1); - gl.bindTexture(gl.TEXTURE_2D, tempTexture); - gl.uniform1i(unpackTextureLocation, 1); - - var stripeTexture = textures[name + '_stripe']; - gl.activeTexture(gl.TEXTURE2); - gl.bindTexture(gl.TEXTURE_2D, stripeTexture); - gl.uniform1i(stripeLocation, 2); - - // Rectangle geometry - gl.bindBuffer(gl.ARRAY_BUFFER, buf); - gl.enableVertexAttribArray(positionLocation); - gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0); - - // Set up the texture geometry... - gl.bindBuffer(gl.ARRAY_BUFFER, unpackTexturePositionBuffer); - gl.enableVertexAttribArray(unpackTexturePositionLocation); - gl.vertexAttribPointer(unpackTexturePositionLocation, 2, gl.FLOAT, false, 0, 0); - - // Draw into the target texture... - gl.viewport(0, 0, width, height); - - gl.drawArrays(gl.TRIANGLES, 0, rectangle.length / 2); - - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - - } - - function attachTexture(name, register, index) { - gl.activeTexture(register); - gl.bindTexture(gl.TEXTURE_2D, textures[name]); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - - gl.uniform1i(gl.getUniformLocation(program, name), index); - } - - function buildStripe(width) { - if (stripes[width]) { - return stripes[width]; - } - var len = width, - out = new Uint32Array(len); - for (var i = 0; i < len; i += 4) { - out[i ] = 0x000000ff; - out[i + 1] = 0x0000ff00; - out[i + 2] = 0x00ff0000; - out[i + 3] = 0xff000000; - } - return stripes[width] = new Uint8Array(out.buffer); - } - - function initProgram(vertexShaderSource, fragmentShaderSource) { - var vertexShader = compileShader(gl.VERTEX_SHADER, vertexShaderSource); - var fragmentShader = compileShader(gl.FRAGMENT_SHADER, fragmentShaderSource); - - var program = gl.createProgram(); - gl.attachShader(program, vertexShader); - gl.attachShader(program, fragmentShader); - - gl.linkProgram(program); - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { - var err = gl.getProgramInfoLog(program); - gl.deleteProgram(program); - throw new Error('GL program linking failed: ' + err); - } - - return program; - } - - function init() { - if (WebGLFrameSink.stripe) { - unpackProgram = initProgram(shaders.vertexStripe, shaders.fragmentStripe); - unpackPositionLocation = gl.getAttribLocation(unpackProgram, 'aPosition'); - - unpackTexturePositionBuffer = gl.createBuffer(); - var textureRectangle = new Float32Array([ - 0, 0, - 1, 0, - 0, 1, - 0, 1, - 1, 0, - 1, 1 - ]); - gl.bindBuffer(gl.ARRAY_BUFFER, unpackTexturePositionBuffer); - gl.bufferData(gl.ARRAY_BUFFER, textureRectangle, gl.STATIC_DRAW); - - unpackTexturePositionLocation = gl.getAttribLocation(unpackProgram, 'aTexturePosition'); - stripeLocation = gl.getUniformLocation(unpackProgram, 'uStripe'); - unpackTextureLocation = gl.getUniformLocation(unpackProgram, 'uTexture'); - } - program = initProgram(shaders.vertex, shaders.fragment); - - buf = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buf); - gl.bufferData(gl.ARRAY_BUFFER, rectangle, gl.STATIC_DRAW); - - positionLocation = gl.getAttribLocation(program, 'aPosition'); - lumaPositionBuffer = gl.createBuffer(); - lumaPositionLocation = gl.getAttribLocation(program, 'aLumaPosition'); - chromaPositionBuffer = gl.createBuffer(); - chromaPositionLocation = gl.getAttribLocation(program, 'aChromaPosition'); - } - - /** - * Actually draw a frame. - * @param {YUVFrame} buffer - YUV frame buffer object - */ - self.drawFrame = function(buffer) { - var format = buffer.format; - - var formatUpdate = (!program || canvas.width !== format.displayWidth || canvas.height !== format.displayHeight); - if (formatUpdate) { - // Keep the canvas at the right size... - canvas.width = format.displayWidth; - canvas.height = format.displayHeight; - self.clear(); - } - - if (!program) { - init(); - } - - if (formatUpdate) { - var setupTexturePosition = function(buffer, location, texWidth) { - // Warning: assumes that the stride for Cb and Cr is the same size in output pixels - var textureX0 = format.cropLeft / texWidth; - var textureX1 = (format.cropLeft + format.cropWidth) / texWidth; - var textureY0 = (format.cropTop + format.cropHeight) / format.height; - var textureY1 = format.cropTop / format.height; - var textureRectangle = new Float32Array([ - textureX0, textureY0, - textureX1, textureY0, - textureX0, textureY1, - textureX0, textureY1, - textureX1, textureY0, - textureX1, textureY1 - ]); - - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, textureRectangle, gl.STATIC_DRAW); - }; - setupTexturePosition( - lumaPositionBuffer, - lumaPositionLocation, - buffer.y.stride); - setupTexturePosition( - chromaPositionBuffer, - chromaPositionLocation, - buffer.u.stride * format.width / format.chromaWidth); - } - - // Create or update the textures... - uploadTexture('uTextureY', buffer.y.stride, format.height, buffer.y.bytes); - uploadTexture('uTextureCb', buffer.u.stride, format.chromaHeight, buffer.u.bytes); - uploadTexture('uTextureCr', buffer.v.stride, format.chromaHeight, buffer.v.bytes); - - if (WebGLFrameSink.stripe) { - // Unpack the textures after upload to avoid blocking on GPU - unpackTexture('uTextureY', buffer.y.stride, format.height); - unpackTexture('uTextureCb', buffer.u.stride, format.chromaHeight); - unpackTexture('uTextureCr', buffer.v.stride, format.chromaHeight); - } - - // Set up the rectangle and draw it - gl.useProgram(program); - gl.viewport(0, 0, canvas.width, canvas.height); - - attachTexture('uTextureY', gl.TEXTURE0, 0); - attachTexture('uTextureCb', gl.TEXTURE1, 1); - attachTexture('uTextureCr', gl.TEXTURE2, 2); - - // Set up geometry - gl.bindBuffer(gl.ARRAY_BUFFER, buf); - gl.enableVertexAttribArray(positionLocation); - gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0); - - // Set up the texture geometry... - gl.bindBuffer(gl.ARRAY_BUFFER, lumaPositionBuffer); - gl.enableVertexAttribArray(lumaPositionLocation); - gl.vertexAttribPointer(lumaPositionLocation, 2, gl.FLOAT, false, 0, 0); - - gl.bindBuffer(gl.ARRAY_BUFFER, chromaPositionBuffer); - gl.enableVertexAttribArray(chromaPositionLocation); - gl.vertexAttribPointer(chromaPositionLocation, 2, gl.FLOAT, false, 0, 0); - - // Aaaaand draw stuff. - gl.drawArrays(gl.TRIANGLES, 0, rectangle.length / 2); - }; - - self.clear = function() { - gl.viewport(0, 0, canvas.width, canvas.height); - gl.clearColor(0.0, 0.0, 0.0, 0.0); - gl.clear(gl.COLOR_BUFFER_BIT); - }; - - self.clear(); - - return self; - } - - // For Windows; luminance and alpha textures are ssllooww to upload, - // so we pack into RGBA and unpack in the shaders. - // - // This seems to affect all browsers on Windows, probably due to fun - // mismatches between GL and D3D. - WebGLFrameSink.stripe = (function() { - if (navigator.userAgent.indexOf('Windows') !== -1) { - return true; - } - return false; - })(); - - WebGLFrameSink.contextForCanvas = function(canvas) { - var options = { - // Don't trigger discrete GPU in multi-GPU systems - preferLowPowerToHighPerformance: true, - powerPreference: 'low-power', - // Don't try to use software GL rendering! - failIfMajorPerformanceCaveat: true, - // In case we need to capture the resulting output. - preserveDrawingBuffer: true - }; - return canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options); - }; - - /** - * Static function to check if WebGL will be available with appropriate features. - * - * @returns {boolean} - true if available - */ - WebGLFrameSink.isAvailable = function() { - var canvas = document.createElement('canvas'), - gl; - canvas.width = 1; - canvas.height = 1; - try { - gl = WebGLFrameSink.contextForCanvas(canvas); - } catch (e) { - return false; - } - if (gl) { - var register = gl.TEXTURE0, - width = 4, - height = 4, - texture = gl.createTexture(), - data = new Uint8Array(width * height), - texWidth = WebGLFrameSink.stripe ? (width / 4) : width, - format = WebGLFrameSink.stripe ? gl.RGBA : gl.LUMINANCE, - filter = WebGLFrameSink.stripe ? gl.NEAREST : gl.LINEAR; - - gl.activeTexture(register); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter); - gl.texImage2D( - gl.TEXTURE_2D, - 0, // mip level - format, // internal format - texWidth, - height, - 0, // border - format, // format - gl.UNSIGNED_BYTE, //type - data // data! - ); - - var err = gl.getError(); - if (err) { - // Doesn't support luminance textures? - return false; - } else { - return true; - } - } else { - return false; - } - }; - - WebGLFrameSink.prototype = Object.create(FrameSink.prototype); - - module.exports = WebGLFrameSink; -})(); - -},{"../build/shaders.js":1,"./FrameSink.js":4}],7:[function(require,module,exports){ -/* -Copyright (c) 2014-2019 Brion Vibber - -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 -MPLIED, 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. -*/ -(function() { - "use strict"; - - var depower = require('./depower.js'); - - /** - * Basic YCbCr->RGB conversion - * - * @author Brion Vibber - * @copyright 2014-2019 - * @license MIT-style - * - * @param {YUVFrame} buffer - input frame buffer - * @param {Uint8ClampedArray} output - array to draw RGBA into - * Assumes that the output array already has alpha channel set to opaque. - */ - function convertYCbCr(buffer, output) { - var width = buffer.format.width | 0, - height = buffer.format.height | 0, - hdec = depower(buffer.format.width / buffer.format.chromaWidth) | 0, - vdec = depower(buffer.format.height / buffer.format.chromaHeight) | 0, - bytesY = buffer.y.bytes, - bytesCb = buffer.u.bytes, - bytesCr = buffer.v.bytes, - strideY = buffer.y.stride | 0, - strideCb = buffer.u.stride | 0, - strideCr = buffer.v.stride | 0, - outStride = width << 2, - YPtr = 0, Y0Ptr = 0, Y1Ptr = 0, - CbPtr = 0, CrPtr = 0, - outPtr = 0, outPtr0 = 0, outPtr1 = 0, - colorCb = 0, colorCr = 0, - multY = 0, multCrR = 0, multCbCrG = 0, multCbB = 0, - x = 0, y = 0, xdec = 0, ydec = 0; - - if (hdec == 1 && vdec == 1) { - // Optimize for 4:2:0, which is most common - outPtr0 = 0; - outPtr1 = outStride; - ydec = 0; - for (y = 0; y < height; y += 2) { - Y0Ptr = y * strideY | 0; - Y1Ptr = Y0Ptr + strideY | 0; - CbPtr = ydec * strideCb | 0; - CrPtr = ydec * strideCr | 0; - for (x = 0; x < width; x += 2) { - colorCb = bytesCb[CbPtr++] | 0; - colorCr = bytesCr[CrPtr++] | 0; - - // Quickie YUV conversion - // https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.2020_conversion - // multiplied by 256 for integer-friendliness - multCrR = (409 * colorCr | 0) - 57088 | 0; - multCbCrG = (100 * colorCb | 0) + (208 * colorCr | 0) - 34816 | 0; - multCbB = (516 * colorCb | 0) - 70912 | 0; - - multY = 298 * bytesY[Y0Ptr++] | 0; - output[outPtr0 ] = (multY + multCrR) >> 8; - output[outPtr0 + 1] = (multY - multCbCrG) >> 8; - output[outPtr0 + 2] = (multY + multCbB) >> 8; - outPtr0 += 4; - - multY = 298 * bytesY[Y0Ptr++] | 0; - output[outPtr0 ] = (multY + multCrR) >> 8; - output[outPtr0 + 1] = (multY - multCbCrG) >> 8; - output[outPtr0 + 2] = (multY + multCbB) >> 8; - outPtr0 += 4; - - multY = 298 * bytesY[Y1Ptr++] | 0; - output[outPtr1 ] = (multY + multCrR) >> 8; - output[outPtr1 + 1] = (multY - multCbCrG) >> 8; - output[outPtr1 + 2] = (multY + multCbB) >> 8; - outPtr1 += 4; - - multY = 298 * bytesY[Y1Ptr++] | 0; - output[outPtr1 ] = (multY + multCrR) >> 8; - output[outPtr1 + 1] = (multY - multCbCrG) >> 8; - output[outPtr1 + 2] = (multY + multCbB) >> 8; - outPtr1 += 4; - } - outPtr0 += outStride; - outPtr1 += outStride; - ydec++; - } - } else { - outPtr = 0; - for (y = 0; y < height; y++) { - xdec = 0; - ydec = y >> vdec; - YPtr = y * strideY | 0; - CbPtr = ydec * strideCb | 0; - CrPtr = ydec * strideCr | 0; - - for (x = 0; x < width; x++) { - xdec = x >> hdec; - colorCb = bytesCb[CbPtr + xdec] | 0; - colorCr = bytesCr[CrPtr + xdec] | 0; - - // Quickie YUV conversion - // https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.2020_conversion - // multiplied by 256 for integer-friendliness - multCrR = (409 * colorCr | 0) - 57088 | 0; - multCbCrG = (100 * colorCb | 0) + (208 * colorCr | 0) - 34816 | 0; - multCbB = (516 * colorCb | 0) - 70912 | 0; - - multY = 298 * bytesY[YPtr++] | 0; - output[outPtr ] = (multY + multCrR) >> 8; - output[outPtr + 1] = (multY - multCbCrG) >> 8; - output[outPtr + 2] = (multY + multCbB) >> 8; - outPtr += 4; - } - } - } - } - - module.exports = { - convertYCbCr: convertYCbCr - }; -})(); - -},{"./depower.js":8}],8:[function(require,module,exports){ -/* -Copyright (c) 2014-2016 Brion Vibber - -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 -MPLIED, 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. -*/ -(function() { - "use strict"; - - /** - * Convert a ratio into a bit-shift count; for instance a ratio of 2 - * becomes a bit-shift of 1, while a ratio of 1 is a bit-shift of 0. - * - * @author Brion Vibber - * @copyright 2016 - * @license MIT-style - * - * @param {number} ratio - the integer ratio to convert. - * @returns {number} - number of bits to shift to multiply/divide by the ratio. - * @throws exception if given a non-power-of-two - */ - function depower(ratio) { - var shiftCount = 0, - n = ratio >> 1; - while (n != 0) { - n = n >> 1; - shiftCount++ - } - if (ratio !== (1 << shiftCount)) { - throw 'chroma plane dimensions must be power of 2 ratio to luma plane dimensions; got ' + ratio; - } - return shiftCount; - } - - module.exports = depower; -})(); - -},{}],9:[function(require,module,exports){ -/* -Copyright (c) 2014-2016 Brion Vibber - -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 -MPLIED, 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. -*/ -(function() { - "use strict"; - - var FrameSink = require('./FrameSink.js'), - SoftwareFrameSink = require('./SoftwareFrameSink.js'), - WebGLFrameSink = require('./WebGLFrameSink.js'); - - /** - * @typedef {Object} YUVCanvasOptions - * @property {boolean} webGL - Whether to use WebGL to draw to the canvas and accelerate color space conversion. If left out, defaults to auto-detect. - */ - - var YUVCanvas = { - FrameSink: FrameSink, - - SoftwareFrameSink: SoftwareFrameSink, - - WebGLFrameSink: WebGLFrameSink, - - /** - * Attach a suitable FrameSink instance to an HTML5 canvas element. - * - * This will take over the drawing context of the canvas and may turn - * it into a WebGL 3d canvas if possible. Do not attempt to use the - * drawing context directly after this. - * - * @param {HTMLCanvasElement} canvas - HTML canvas element to attach to - * @param {YUVCanvasOptions} options - map of options - * @returns {FrameSink} - instance of suitable subclass. - */ - attach: function(canvas, options) { - options = options || {}; - var webGL = ('webGL' in options) ? options.webGL : WebGLFrameSink.isAvailable(); - if (webGL) { - return new WebGLFrameSink(canvas, options); - } else { - return new SoftwareFrameSink(canvas, options); - } - } - }; - - module.exports = YUVCanvas; -})(); - -},{"./FrameSink.js":4,"./SoftwareFrameSink.js":5,"./WebGLFrameSink.js":6}]},{},[2]); diff --git a/shelled/rustdesk-web-client/css/style.css b/shelled/rustdesk-web-client/css/style.css deleted file mode 100644 index d4deaea..0000000 --- a/shelled/rustdesk-web-client/css/style.css +++ /dev/null @@ -1,468 +0,0 @@ -/* RustDesk Standalone Web Client - Styles */ - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -:root { - --bg-primary: #0a0a0f; - --bg-secondary: #12121a; - --bg-tertiary: #1a1a2e; - --text-primary: #e0e0e0; - --text-secondary: #888; - --accent: #4a9eff; - --accent-hover: #3a8eef; - --danger: #ff4444; - --success: #44cc44; - --warning: #ffaa00; - --border: #2a2a3e; - --shadow: rgba(0, 0, 0, 0.4); - --radius: 8px; -} - -html, body { - width: 100%; - height: 100%; - overflow: hidden; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - background: var(--bg-primary); - color: var(--text-primary); -} - -/* ===== Connection Dialog ===== */ - -#connection-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: var(--bg-primary); - display: flex; - align-items: center; - justify-content: center; - z-index: 100; - transition: opacity 0.3s ease; -} - -#connection-overlay.hidden { - opacity: 0; - pointer-events: none; -} - -.connection-card { - background: var(--bg-secondary); - border: 1px solid var(--border); - border-radius: 16px; - padding: 40px; - width: 420px; - max-width: 90%; - box-shadow: 0 20px 60px var(--shadow); -} - -.connection-card h1 { - text-align: center; - font-size: 24px; - margin-bottom: 8px; - color: var(--text-primary); -} - -.connection-card .subtitle { - text-align: center; - font-size: 13px; - color: var(--text-secondary); - margin-bottom: 30px; -} - -.form-group { - margin-bottom: 16px; -} - -.form-group label { - display: block; - font-size: 12px; - color: var(--text-secondary); - margin-bottom: 6px; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.form-group input { - width: 100%; - padding: 10px 14px; - background: var(--bg-tertiary); - border: 1px solid var(--border); - border-radius: var(--radius); - color: var(--text-primary); - font-size: 14px; - outline: none; - transition: border-color 0.2s; -} - -.form-group input:focus { - border-color: var(--accent); -} - -.form-group input::placeholder { - color: #555; -} - -.form-row { - display: flex; - gap: 12px; -} - -.form-row .form-group { - flex: 1; -} - -.btn { - width: 100%; - padding: 12px; - border: none; - border-radius: var(--radius); - font-size: 14px; - font-weight: 600; - cursor: pointer; - transition: all 0.2s; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.btn-primary { - background: var(--accent); - color: white; -} - -.btn-primary:hover { - background: var(--accent-hover); -} - -.btn-primary:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.btn-danger { - background: var(--danger); - color: white; -} - -.btn-danger:hover { - background: #cc3333; -} - -.btn-sm { - padding: 6px 12px; - font-size: 12px; - width: auto; -} - -.btn-icon { - width: 36px; - height: 36px; - padding: 0; - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: 6px; - background: var(--bg-tertiary); - border: 1px solid var(--border); - color: var(--text-primary); - cursor: pointer; - font-size: 16px; - transition: all 0.2s; -} - -.btn-icon:hover { - background: var(--accent); - border-color: var(--accent); -} - -.btn-icon.active { - background: var(--accent); - border-color: var(--accent); -} - -/* ===== Password Dialog ===== */ - -#password-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.7); - display: none; - align-items: center; - justify-content: center; - z-index: 200; -} - -#password-overlay.visible { - display: flex; -} - -.password-card { - background: var(--bg-secondary); - border: 1px solid var(--border); - border-radius: 16px; - padding: 30px; - width: 380px; - max-width: 90%; - box-shadow: 0 20px 60px var(--shadow); -} - -.password-card h2 { - font-size: 18px; - margin-bottom: 16px; -} - -/* ===== Status Bar ===== */ - -#status-bar { - position: fixed; - top: 0; - left: 0; - right: 0; - height: 32px; - background: var(--bg-secondary); - border-bottom: 1px solid var(--border); - display: none; - align-items: center; - padding: 0 12px; - font-size: 12px; - z-index: 50; - gap: 16px; -} - -#status-bar.visible { - display: flex; -} - -.status-indicator { - width: 8px; - height: 8px; - border-radius: 50%; - background: var(--danger); - flex-shrink: 0; -} - -.status-indicator.connected { - background: var(--success); - box-shadow: 0 0 6px var(--success); -} - -.status-text { - color: var(--text-secondary); -} - -.status-text strong { - color: var(--text-primary); -} - -.status-right { - margin-left: auto; - display: flex; - align-items: center; - gap: 8px; -} - -.fps-display { - color: var(--text-secondary); - font-family: monospace; -} - -/* ===== Toolbar ===== */ - -#toolbar { - position: fixed; - bottom: 20px; - left: 50%; - transform: translateX(-50%); - background: var(--bg-secondary); - border: 1px solid var(--border); - border-radius: 12px; - padding: 6px; - display: none; - align-items: center; - gap: 4px; - box-shadow: 0 10px 40px var(--shadow); - z-index: 50; -} - -#toolbar.visible { - display: flex; -} - -.toolbar-divider { - width: 1px; - height: 24px; - background: var(--border); - margin: 0 4px; -} - -/* ===== Remote Canvas ===== */ - -#remote-canvas-wrapper { - position: fixed; - top: 32px; - left: 0; - right: 0; - bottom: 0; - background: #000; - display: none; - align-items: center; - justify-content: center; - overflow: hidden; -} - -#remote-canvas-wrapper.visible { - display: flex; -} - -#remote-canvas { - max-width: 100%; - max-height: 100%; - image-rendering: auto; - background: #111; -} - -/* ===== Log Panel ===== */ - -#log-panel { - position: fixed; - bottom: 0; - left: 0; - right: 0; - height: 200px; - background: var(--bg-secondary); - border-top: 1px solid var(--border); - display: none; - flex-direction: column; - z-index: 60; -} - -#log-panel.visible { - display: flex; -} - -#log-panel .log-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 6px 12px; - border-bottom: 1px solid var(--border); - font-size: 12px; - font-weight: 600; -} - -#log-panel .log-content { - flex: 1; - overflow-y: auto; - padding: 8px 12px; - font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace; - font-size: 11px; - line-height: 1.6; -} - -.log-entry { - color: var(--text-secondary); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.log-entry.error { - color: var(--danger); -} - -.log-entry.warn { - color: var(--warning); -} - -.log-entry.info { - color: var(--accent); -} - -/* ===== Toast Notifications ===== */ - -#toast-container { - position: fixed; - top: 44px; - right: 16px; - z-index: 300; - display: flex; - flex-direction: column; - gap: 8px; -} - -.toast { - background: var(--bg-secondary); - border: 1px solid var(--border); - border-radius: var(--radius); - padding: 12px 16px; - font-size: 13px; - box-shadow: 0 10px 30px var(--shadow); - animation: toastIn 0.3s ease; - max-width: 320px; -} - -.toast.error { - border-color: var(--danger); -} - -.toast.success { - border-color: var(--success); -} - -@keyframes toastIn { - from { opacity: 0; transform: translateX(20px); } - to { opacity: 1; transform: translateX(0); } -} - -/* ===== Loading Spinner ===== */ - -.spinner { - width: 20px; - height: 20px; - border: 2px solid var(--border); - border-top-color: var(--accent); - border-radius: 50%; - animation: spin 0.8s linear infinite; - display: inline-block; - vertical-align: middle; - margin-right: 8px; -} - -@keyframes spin { - to { transform: rotate(360deg); } -} - -/* ===== Responsive ===== */ - -@media (max-width: 600px) { - .connection-card { - padding: 24px; - width: 95%; - } - - .form-row { - flex-direction: column; - gap: 8px; - } - - #toolbar { - bottom: 10px; - padding: 4px; - gap: 2px; - } - - .btn-icon { - width: 32px; - height: 32px; - font-size: 14px; - } -} diff --git a/shelled/rustdesk-web-client/index.html b/shelled/rustdesk-web-client/index.html deleted file mode 100644 index dfdbe20..0000000 --- a/shelled/rustdesk-web-client/index.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - RustDesk - Remote Desktop - - - - - - -

    - - -
    -
    -

    🔐 Authentication Required

    -

    - The remote peer requires a password to connect. -

    -
    - -
    -
    - - -
    -
    -
    - - -
    - - Disconnected - - Peer: - - - Client: - -
    - — FPS -
    -
    - - -
    - -
    - - -
    - -
    - -
    - - - -
    - -
    - - -
    -
    - Connection Log - -
    -
    -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shelled/rustdesk-web-client/js/app.js b/shelled/rustdesk-web-client/js/app.js deleted file mode 100644 index 2747c02..0000000 --- a/shelled/rustdesk-web-client/js/app.js +++ /dev/null @@ -1,586 +0,0 @@ -/** - * RustDesk Standalone Web Client - Application - * - * Main application logic, UI management, and event coordination. - */ - -const RDApp = (() => { - let _logEntries = []; - let _logVisible = false; - let _toasts = []; - - /** - * Initialize the application - */ - async function init() { - log('info', 'Initializing RustDesk Standalone Web Client...'); - - // Initialize protobuf definitions - if (!RDProto.init()) { - showError('Failed to initialize protocol definitions'); - return false; - } - - // Setup UI event listeners - setupUI(); - - // Initialize audio (will be activated on user gesture) - // RDAudio.init() called on first user interaction - - log('info', 'Protocol definitions loaded successfully'); - log('info', 'Ready to connect. Enter server address and peer ID.'); - - return true; - } - - /** - * Setup UI event listeners - */ - function setupUI() { - // Connect button - document.getElementById('btn-connect').addEventListener('click', handleConnect); - - // Password dialog - document.getElementById('btn-password-submit').addEventListener('click', handlePasswordSubmit); - document.getElementById('btn-password-cancel').addEventListener('click', handlePasswordCancel); - document.getElementById('password-input').addEventListener('keydown', (e) => { - if (e.key === 'Enter') handlePasswordSubmit(); - if (e.key === 'Escape') handlePasswordCancel(); - }); - - // Enter key on connect form - const inputs = document.querySelectorAll('#connection-form input'); - inputs.forEach(input => { - input.addEventListener('keydown', (e) => { - if (e.key === 'Enter') handleConnect(); - }); - }); - - // Toolbar buttons - document.getElementById('btn-disconnect').addEventListener('click', handleDisconnect); - document.getElementById('btn-fullscreen').addEventListener('click', handleFullscreen); - document.getElementById('btn-mute').addEventListener('click', handleToggleMute); - document.getElementById('btn-ctrl-alt-del').addEventListener('click', handleCtrlAltDel); - document.getElementById('btn-keyboard').addEventListener('click', handleToggleKeyboard); - document.getElementById('btn-log').addEventListener('click', handleToggleLog); - - // Canvas resize - window.addEventListener('resize', handleResize); - - // Log panel close - document.getElementById('btn-log-close').addEventListener('click', () => { - _logVisible = false; - document.getElementById('log-panel').classList.remove('visible'); - }); - } - - /** - * Handle connect button click - */ - function handleConnect() { - const serverAddr = document.getElementById('server-addr').value.trim(); - const peerId = document.getElementById('peer-id').value.trim(); - const serverKey = document.getElementById('server-key').value.trim(); - const tls = document.getElementById('tls-check').checked; - - if (!serverAddr) { - showToast('Please enter a server address', 'error'); - return; - } - - if (!peerId) { - showToast('Please enter a remote peer ID', 'error'); - return; - } - - log('info', `Connecting to ${serverAddr} (TLS: ${tls})...`); - log('info', `Target peer: ${peerId}`); - - const btn = document.getElementById('btn-connect'); - btn.disabled = true; - btn.innerHTML = ' Connecting...'; - - // Connect - RDConnection.connect(serverAddr, { - tls: tls, - serverKey: serverKey, - onPassword: handlePasswordRequired, - on2FA: handle2FARequired, - onPeerInfo: handlePeerInfo, - onVideoFrame: handleVideoFrame, - onAudioFrame: handleAudioFrame, - onCursorData: handleCursorData, - onCursorPosition: handleCursorPosition, - onMiscEvent: handleMiscEvent, - onClipboard: handleClipboard, - onClose: handleSessionClose, - onStateChange: handleStateChange, - onError: handleError, - }); - - // Set target peer after connecting to hbbs - setTimeout(() => { - RDConnection.connectToPeer(peerId); - }, 100); - } - - /** - * Handle password required callback - */ - let _passwordResolve = null; - function handlePasswordRequired(hash, resolve) { - _passwordResolve = resolve; - document.getElementById('password-overlay').classList.add('visible'); - document.getElementById('password-input').value = ''; - document.getElementById('password-input').focus(); - } - - function handlePasswordSubmit() { - const password = document.getElementById('password-input').value; - document.getElementById('password-overlay').classList.remove('visible'); - if (_passwordResolve) { - _passwordResolve(password); - _passwordResolve = null; - } - } - - function handlePasswordCancel() { - document.getElementById('password-overlay').classList.remove('visible'); - if (_passwordResolve) { - _passwordResolve(null); - _passwordResolve = null; - } - } - - function handle2FARequired(resolve) { - // Simple prompt for 2FA (in production, use a proper dialog) - const code = prompt('Enter 2FA code:'); - resolve(code); - } - - /** - * Handle state changes - */ - function handleStateChange(newState, oldState) { - const statusText = document.getElementById('status-text'); - const indicator = document.getElementById('status-indicator'); - - switch (newState) { - case RDConnection.STATE.CONNECTING: - statusText.textContent = 'Connecting to server...'; - break; - case RDConnection.STATE.REGISTERING: - statusText.textContent = 'Registering...'; - break; - case RDConnection.STATE.PUNCHING: - statusText.textContent = 'Discovering peer...'; - break; - case RDConnection.STATE.RELAYING: - statusText.textContent = 'Establishing relay...'; - break; - case RDConnection.STATE.KEY_EXCHANGE: - statusText.textContent = 'Exchanging keys...'; - break; - case RDConnection.STATE.AUTHENTICATING: - statusText.textContent = 'Authenticating...'; - break; - case RDConnection.STATE.CONNECTED: - statusText.textContent = 'Connected'; - indicator.classList.add('connected'); - onSessionConnected(); - break; - case RDConnection.STATE.FAILED: - statusText.textContent = 'Connection failed'; - onSessionFailed(); - break; - case RDConnection.STATE.CLOSED: - statusText.textContent = 'Disconnected'; - indicator.classList.remove('connected'); - onSessionClosed(); - break; - } - } - - /** - * Handle peer info received after login - */ - function handlePeerInfo(peerInfo) { - log('info', `Connected to: ${peerInfo.username}@${peerInfo.hostname} (${peerInfo.platform}) v${peerInfo.version}`); - - if (peerInfo.displays && peerInfo.displays.length > 0) { - const display = peerInfo.displays[0]; - log('info', `Display: ${display.width}x${display.height} (${display.name})`); - RDInput.setDisplaySize(display.width, display.height); - RDVideo.resize(display.width, display.height); - } - - // Enable audio - RDAudio.init(); - - // Enable input - RDInput.setEnabled(true); - } - - /** - * Handle video frame - */ - function handleVideoFrame(videoFrame) { - RDVideo.handleVideoFrame(videoFrame); - } - - /** - * Handle audio frame - */ - function handleAudioFrame(audioFrame) { - RDAudio.handleAudioFrame(audioFrame); - } - - /** - * Handle cursor data - */ - function handleCursorData(cursorData) { - if (!cursorData) return; - - const canvas = document.getElementById('remote-canvas'); - const width = cursorData.width || 0; - const height = cursorData.height || 0; - - if (width === 0 || height === 0 || !cursorData.colors || cursorData.colors.length === 0) { - canvas.style.cursor = 'default'; - return; - } - - // Create cursor from RGBA data - const hotx = cursorData.hotx || 0; - const hoty = cursorData.hoty || 0; - const colors = new Uint8Array(cursorData.colors.buffer || cursorData.colors); - - // Create a canvas for the cursor image - const cursorCanvas = document.createElement('canvas'); - cursorCanvas.width = width; - cursorCanvas.height = height; - const ctx = cursorCanvas.getContext('2d'); - const imageData = ctx.createImageData(width, height); - - for (let i = 0; i < width * height; i++) { - const srcIdx = i * 4; - const dstIdx = i * 4; - // RustDesk sends BGRA, convert to RGBA - imageData.data[dstIdx] = colors[srcIdx + 2]; // R - imageData.data[dstIdx + 1] = colors[srcIdx + 1]; // G - imageData.data[dstIdx + 2] = colors[srcIdx]; // B - imageData.data[dstIdx + 3] = colors[srcIdx + 3]; // A - } - - ctx.putImageData(imageData, 0, 0); - const url = cursorCanvas.toDataURL(); - canvas.style.cursor = `url(${url}) ${hotx} ${hoty}, default`; - } - - /** - * Handle cursor position update - */ - function handleCursorPosition(pos) { - // Position updates are informational; the local cursor is already tracked - } - - /** - * Handle misc events - */ - function handleMiscEvent(field, data) { - switch (field) { - case 'audio_format': - if (data.sample_rate) { - RDAudio.setFormat(data.sample_rate, data.channels || 2); - } - break; - case 'switch_display': - if (data.width && data.height) { - RDInput.setDisplaySize(data.width, data.height); - RDVideo.resize(data.width, data.height); - } - break; - case 'close_reason': - log('warn', `Session closed by peer: ${data.close_reason}`); - break; - case 'permission_info': - const permName = data.permission_info.permission; - const enabled = data.permission_info.enabled; - log('info', `Permission ${permName}: ${enabled ? 'granted' : 'revoked'}`); - break; - case 'message_box': - showToast(`${data.title}: ${data.text}`, 'info'); - break; - } - } - - /** - * Handle clipboard event - */ - function handleClipboard(clipboard) { - if (!clipboard || !clipboard.contents || clipboard.contents.length === 0) return; - - for (const content of clipboard.contents) { - if (content.format === 0 && content.data) { // Text format - const text = new TextDecoder().decode(content.data); - if (navigator.clipboard && navigator.clipboard.writeText) { - navigator.clipboard.writeText(text).catch(() => {}); - } - log('info', 'Clipboard updated from remote'); - } - } - } - - /** - * Handle errors - */ - function handleError(error) { - log('error', error); - showToast(error, 'error'); - resetConnectButton(); - } - - /** - * Handle session close - */ - function handleSessionClose(reason) { - log('warn', 'Session closed:', reason); - showToast('Session closed: ' + (reason || 'Unknown reason'), 'info'); - onSessionClosed(); - } - - /** - * Called when session is connected - */ - function onSessionConnected() { - resetConnectButton(); - - // Hide connection overlay, show remote desktop - document.getElementById('connection-overlay').classList.add('hidden'); - document.getElementById('status-bar').classList.add('visible'); - document.getElementById('toolbar').classList.add('visible'); - document.getElementById('remote-canvas-wrapper').classList.add('visible'); - - // Initialize video and input - const canvas = document.getElementById('remote-canvas'); - RDVideo.init(canvas); - RDInput.init(canvas); - - // Update status - const peerId = document.getElementById('peer-id').value.trim(); - document.getElementById('peer-id-display').textContent = peerId; - - log('info', 'Session established!'); - - // Start FPS display update - setInterval(updateFpsDisplay, 1000); - } - - /** - * Called when session fails - */ - function onSessionFailed() { - resetConnectButton(); - RDConnection.close(); - } - - /** - * Called when session is closed - */ - function onSessionClosed() { - resetConnectButton(); - - // Show connection overlay, hide remote desktop - document.getElementById('connection-overlay').classList.remove('hidden'); - document.getElementById('status-bar').classList.remove('visible'); - document.getElementById('toolbar').classList.remove('visible'); - document.getElementById('remote-canvas-wrapper').classList.remove('visible'); - - // Disable input - RDInput.setEnabled(false); - - // Cleanup audio - RDAudio.cleanup(); - } - - /** - * Reset connect button state - */ - function resetConnectButton() { - const btn = document.getElementById('btn-connect'); - btn.disabled = false; - btn.innerHTML = 'Connect'; - } - - /** - * Handle disconnect button - */ - function handleDisconnect() { - RDConnection.close(); - } - - /** - * Handle fullscreen toggle - */ - function handleFullscreen() { - if (document.fullscreenElement) { - document.exitFullscreen(); - } else { - document.documentElement.requestFullscreen().catch(() => {}); - } - } - - /** - * Handle mute toggle - */ - function handleToggleMute() { - const muted = RDAudio.toggleMute(); - const btn = document.getElementById('btn-mute'); - btn.classList.toggle('active', muted); - btn.textContent = muted ? '🔇' : '🔊'; - log('info', muted ? 'Audio muted' : 'Audio unmuted'); - } - - /** - * Handle Ctrl+Alt+Del - */ - function handleCtrlAltDel() { - RDConnection.sendCtrlAltDel(); - log('info', 'Sent Ctrl+Alt+Del'); - } - - /** - * Handle keyboard toggle - */ - function handleToggleKeyboard() { - // Toggle keyboard capture mode - const btn = document.getElementById('btn-keyboard'); - btn.classList.toggle('active'); - } - - /** - * Handle log toggle - */ - function handleToggleLog() { - _logVisible = !_logVisible; - const panel = document.getElementById('log-panel'); - panel.classList.toggle('visible', _logVisible); - const btn = document.getElementById('btn-log'); - btn.classList.toggle('active', _logVisible); - } - - /** - * Handle window resize - */ - function handleResize() { - if (RDConnection.isConnected) { - RDInput.setDisplaySize(RDVideo.getDisplaySize().width, RDVideo.getDisplaySize().height); - } - } - - /** - * Update FPS display - */ - function updateFpsDisplay() { - if (!RDConnection.isConnected) return; - const fps = RDVideo.getFps(); - document.getElementById('fps-display').textContent = `${fps} FPS`; - } - - /** - * Add log entry - */ - function log(level, message) { - const timestamp = new Date().toLocaleTimeString(); - const entry = { level, message, timestamp }; - _logEntries.push(entry); - - // Update log panel if visible - const logContent = document.getElementById('log-content'); - if (logContent) { - const div = document.createElement('div'); - div.className = `log-entry ${level}`; - div.textContent = `[${timestamp}] ${message}`; - logContent.appendChild(div); - logContent.scrollTop = logContent.scrollHeight; - } - - // Also log to console - const prefix = { info: 'ℹ️', warn: '⚠️', error: '❌', debug: '🐛' }[level] || ''; - console.log(`${prefix} [RD] ${message}`); - } - - /** - * Show error - */ - function showError(message) { - log('error', message); - showToast(message, 'error'); - } - - /** - * Show toast notification - */ - function showToast(message, type = 'info') { - const container = document.getElementById('toast-container'); - const toast = document.createElement('div'); - toast.className = `toast ${type}`; - toast.textContent = message; - container.appendChild(toast); - - setTimeout(() => { - toast.style.opacity = '0'; - toast.style.transform = 'translateX(20px)'; - toast.style.transition = 'all 0.3s ease'; - setTimeout(() => toast.remove(), 300); - }, 5000); - } - - return { init, log, showError, showToast }; -})(); - -// ===== Bootstrap ===== - -document.addEventListener('DOMContentLoaded', async () => { - // Wait for external libraries to load - const waitForLib = (name, check, timeout = 5000) => { - return new Promise((resolve, reject) => { - if (check()) { resolve(); return; } - const start = Date.now(); - const interval = setInterval(() => { - if (check()) { clearInterval(interval); resolve(); return; } - if (Date.now() - start > timeout) { - clearInterval(interval); - reject(new Error(`${name} not available after ${timeout}ms`)); - } - }, 100); - }); - }; - - try { - // Wait for protobuf.js - await waitForLib('protobuf.js', () => typeof protobuf !== 'undefined'); - // Wait for TweetNaCl.js - await waitForLib('TweetNaCl.js', () => typeof nacl !== 'undefined'); - - RDApp.log('info', 'External libraries loaded'); - - // Try to load yuv-canvas - if (typeof YUVCanvas !== 'undefined') { - RDApp.log('info', 'yuv-canvas loaded'); - } else { - RDApp.log('warn', 'yuv-canvas not available, video rendering may be limited'); - } - - // Initialize the app - await RDApp.init(); - - RDApp.log('info', 'RustDesk Standalone Web Client ready!'); - RDApp.log('info', 'Supported codecs: VP8, VP9, AV1 (via ogvjs)'); - RDApp.log('info', 'Audio: Opus (via libopus)'); - - } catch (e) { - RDApp.log('error', `Initialization failed: ${e.message}`); - RDApp.showToast('Failed to initialize. Check console for details.', 'error'); - } -}); diff --git a/shelled/rustdesk-web-client/js/audio.js b/shelled/rustdesk-web-client/js/audio.js deleted file mode 100644 index db581b2..0000000 --- a/shelled/rustdesk-web-client/js/audio.js +++ /dev/null @@ -1,260 +0,0 @@ -/** - * RustDesk Standalone Web Client - Audio Decoder - * - * Handles Opus audio decoding using libopus WASM and playback - * through the Web Audio API. - */ - -const RDAudio = (() => { - let _audioContext = null; - let _opusDecoder = null; - let _sampleRate = 48000; - let _channels = 2; - let _gainNode = null; - let _isMuted = false; - let _volume = 1.0; - let _isEnabled = true; - let _nextPlayTime = 0; - let _initialized = false; - - /** - * Initialize audio subsystem - */ - async function init() { - if (_initialized) return true; - - try { - _audioContext = new (window.AudioContext || window.webkitAudioContext)({ - sampleRate: _sampleRate, - latencyHint: 'interactive' - }); - - _gainNode = _audioContext.createGain(); - _gainNode.connect(_audioContext.destination); - _gainNode.gain.value = _volume; - - // Initialize libopus decoder - await initOpusDecoder(); - - _initialized = true; - console.log('[RDAudio] Initialized. Sample rate:', _sampleRate, 'Channels:', _channels); - return true; - } catch (e) { - console.error('[RDAudio] Initialization failed:', e); - return false; - } - } - - /** - * Initialize the Opus decoder from libopus WASM - */ - async function initOpusDecoder() { - if (typeof OpusDecoder === 'undefined') { - console.warn('[RDAudio] OpusDecoder not available, audio disabled'); - _isEnabled = false; - return; - } - - try { - _opusDecoder = new OpusDecoder(); - // Initialize with sample rate and channels - const initResult = await _opusDecoder.init(_sampleRate, _channels); - if (initResult !== 0) { - console.error('[RDAudio] Opus decoder init failed:', initResult); - _opusDecoder = null; - _isEnabled = false; - return; - } - console.log('[RDAudio] Opus decoder initialized'); - } catch (e) { - console.warn('[RDAudio] Opus decoder creation failed:', e); - _opusDecoder = null; - _isEnabled = false; - } - } - - /** - * Handle incoming AudioFrame from the session - * @param {Object} audioFrame - Decoded protobuf AudioFrame - */ - function handleAudioFrame(audioFrame) { - if (!_isEnabled || !_audioContext) return; - if (_audioContext.state === 'suspended') { - _audioContext.resume(); - } - - if (!audioFrame.data || audioFrame.data.byteLength === 0) return; - - try { - if (_opusDecoder) { - decodeAndPlayOpus(audioFrame.data); - } else { - // Fallback: try to play raw PCM data - playPCMData(audioFrame.data); - } - } catch (e) { - console.error('[RDAudio] Audio decode error:', e); - } - } - - /** - * Decode Opus data and play through Web Audio API - */ - function decodeAndPlayOpus(opusData) { - if (!_opusDecoder || !_audioContext) return; - - const inputData = new Uint8Array(opusData.buffer || opusData); - - // Decode Opus to PCM - const pcmBuffer = _opusDecoder.decode(inputData); - - if (pcmBuffer && pcmBuffer.length > 0) { - playPCMData(pcmBuffer); - } - } - - /** - * Play PCM data through Web Audio API - * @param {Float32Array|Uint8Array} pcmData - PCM audio data - */ - function playPCMData(pcmData) { - if (!_audioContext || _isMuted) return; - - let float32Data; - - if (pcmData instanceof Float32Array) { - float32Data = pcmData; - } else { - // Convert bytes to Float32 - const dataView = new DataView(pcmData.buffer || pcmData); - float32Data = new Float32Array(dataView.byteLength / 4); - for (let i = 0; i < float32Data.length; i++) { - float32Data[i] = dataView.getFloat32(i * 4, true); // Little-endian - } - } - - const frameCount = float32Data.length / _channels; - if (frameCount === 0) return; - - // Create AudioBuffer - const audioBuffer = _audioContext.createBuffer(_channels, frameCount, _sampleRate); - - for (let ch = 0; ch < _channels; ch++) { - const channelData = audioBuffer.getChannelData(ch); - for (let i = 0; i < frameCount; i++) { - channelData[i] = float32Data[i * _channels + ch]; - } - } - - // Schedule playback - schedulePlayback(audioBuffer); - } - - /** - * Schedule audio buffer playback with gapless transition - */ - function schedulePlayback(audioBuffer) { - const currentTime = _audioContext.currentTime; - const startTime = Math.max(currentTime, _nextPlayTime); - - const source = _audioContext.createBufferSource(); - source.buffer = audioBuffer; - source.connect(_gainNode); - - source.onended = () => { - source.disconnect(); - }; - - source.start(startTime); - _nextPlayTime = startTime + audioBuffer.duration; - } - - /** - * Set audio format from server's AudioFormat message - */ - function setFormat(sampleRate, channels) { - if (sampleRate > 0) _sampleRate = sampleRate; - if (channels > 0) _channels = channels; - console.log('[RDAudio] Format updated:', _sampleRate, 'Hz,', _channels, 'channels'); - } - - /** - * Set volume (0.0 to 1.0) - */ - function setVolume(volume) { - _volume = Math.max(0, Math.min(1, volume)); - if (_gainNode) { - _gainNode.gain.value = _volume; - } - } - - /** - * Mute/unmute audio - */ - function setMuted(muted) { - _isMuted = muted; - if (_gainNode) { - _gainNode.gain.value = muted ? 0 : _volume; - } - } - - /** - * Toggle mute - */ - function toggleMute() { - setMuted(!_isMuted); - return _isMuted; - } - - /** - * Get mute state - */ - function isMuted() { - return _isMuted; - } - - /** - * Check if audio is enabled and initialized - */ - function isEnabled() { - return _isEnabled; - } - - /** - * Resume audio context (needed after user gesture) - */ - async function resume() { - if (_audioContext && _audioContext.state === 'suspended') { - await _audioContext.resume(); - } - } - - /** - * Clean up audio resources - */ - function cleanup() { - if (_opusDecoder) { - try { _opusDecoder.destroy(); } catch (e) {} - _opusDecoder = null; - } - if (_audioContext) { - _audioContext.close().catch(() => {}); - _audioContext = null; - } - _initialized = false; - _nextPlayTime = 0; - } - - return { - init, - handleAudioFrame, - setFormat, - setVolume, - setMuted, - toggleMute, - isMuted, - isEnabled, - resume, - cleanup - }; -})(); diff --git a/shelled/rustdesk-web-client/js/connection.js b/shelled/rustdesk-web-client/js/connection.js deleted file mode 100644 index ea1c9cf..0000000 --- a/shelled/rustdesk-web-client/js/connection.js +++ /dev/null @@ -1,1017 +0,0 @@ -/** - * RustDesk Standalone Web Client - Connection Manager - * - * Manages WebSocket connections to hbbs (signaling) and hbbr (relay), - * handles the full connection lifecycle including registration, - * punch hole, relay setup, and key exchange. - */ - -const RDConnection = (() => { - // Connection states - const STATE = { - DISCONNECTED: 'disconnected', - CONNECTING: 'connecting', - REGISTERING: 'registering', - PUNCHING: 'punching', - RELAYING: 'relaying', - KEY_EXCHANGE: 'key_exchange', - AUTHENTICATING: 'authenticating', - CONNECTED: 'connected', - FAILED: 'failed', - CLOSED: 'closed' - }; - - let _state = STATE.DISCONNECTED; - let _hbbsWs = null; // WebSocket to hbbs (signaling) - let _sessionWs = null; // WebSocket to hbbr/peer (session) - let _serverAddr = ''; // Server address (host or host:port) - let _useTls = false; // Whether to use wss:// - let _serverKey = ''; // Server's Ed25519 public key (for encrypted hbbs) - let _myId = ''; // Our registered client ID - let _myName = ''; // Our display name - let _myUuid = ''; // Our UUID - let _targetPeerId = ''; // Remote peer ID we want to connect to - let _peerPk = null; // Peer's Ed25519 public key from PunchHoleResponse - let _relayUuid = ''; // UUID for relay connection - let _hbbsEncrypted = false; // Whether hbbs connection is encrypted - let _hbbsSymmetricKey = null; // Symmetric key for hbbs encryption - let _hbbsSendSeq = 0; - let _hbbsRecvSeq = 0; - let _peerPlatform = ''; - let _peerVersion = ''; - let _passwordCallback = null; // Callback for password input - let _2faCallback = null; // Callback for 2FA input - let _onPeerInfo = null; // Callback for peer info received - let _onVideoFrame = null; // Callback for video frame received - let _onAudioFrame = null; // Callback for audio frame received - let _onCursorData = null; // Callback for cursor data received - let _onCursorPosition = null; // Callback for cursor position received - let _onMiscEvent = null; // Callback for misc events received - let _onClipboard = null; // Callback for clipboard events - let _onClose = null; // Callback for session close - let _onStateChange = null; // Callback for state changes - let _onError = null; // Callback for errors - let _msgBuffer = []; // Buffer for incomplete messages - let _serial = 0; // Registration serial number - let _keepAliveInterval = null; - let _latencyInterval = null; - - /** - * Generate a random 9-digit client ID for web client - */ - function generateClientId() { - const chars = '23456789abcdefghijkmnpqrstuvwxyz'; - let id = ''; - for (let i = 0; i < 9; i++) { - id += chars[Math.floor(Math.random() * chars.length)]; - } - return id; - } - - /** - * Generate a UUID v4 - */ - function generateUUID() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { - const r = Math.random() * 16 | 0; - return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); - }); - } - - /** - * Build WebSocket URL - */ - function buildWsUrl(host, path) { - const protocol = _useTls ? 'wss' : 'ws'; - // Detect if host is IP address - const isIp = /^\d{1,3}(\.\d{1,3}){3}$/.test(host) || host.includes('://'); - - if (isIp) { - // For IP: add +3 to port for WebSocket, or use default ports - // ws://ip:port format (no path) - let [hostname, port] = host.split(':'); - if (!port) port = '21115'; // Default hbbs TCP port - port = parseInt(port) + 3; // WebSocket port offset - return `${protocol}://${hostname}:${port}`; - } else { - // For domain: use path-based routing - const base = host.includes('://') ? host : `${protocol}://${host}`; - return `${base}${path}`; - } - } - - /** - * Initialize and connect to the server - */ - async function connect(serverAddr, options = {}) { - _serverAddr = serverAddr; - _useTls = options.tls !== false; - _serverKey = options.serverKey || ''; - _myId = options.clientId || generateClientId(); - _myName = options.clientName || `Web-${_myId.substring(0, 4)}`; - _myUuid = options.uuid || generateUUID(); - _passwordCallback = options.onPassword || null; - _2faCallback = options.on2FA || null; - _onPeerInfo = options.onPeerInfo || null; - _onVideoFrame = options.onVideoFrame || null; - _onAudioFrame = options.onAudioFrame || null; - _onCursorData = options.onCursorData || null; - _onCursorPosition = options.onCursorPosition || null; - _onMiscEvent = options.onMiscEvent || null; - _onClipboard = options.onClipboard || null; - _onClose = options.onClose || null; - _onStateChange = options.onStateChange || null; - _onError = options.onError || null; - - // Generate keypairs - RDCrypto.generateSignKeyPair(); - RDCrypto.generateBoxKeyPair(); - - setState(STATE.CONNECTING); - console.log('[RDConn] Connecting to', serverAddr); - - try { - await connectHbbs(); - } catch (e) { - console.error('[RDConn] Connection failed:', e); - setState(STATE.FAILED); - if (_onError) _onError(e.message); - } - } - - /** - * Connect to hbbs signaling server via WebSocket - */ - function connectHbbs() { - return new Promise((resolve, reject) => { - const url = buildWsUrl(_serverAddr, '/ws/id'); - console.log('[RDConn] Connecting to hbbs at', url); - - _hbbsWs = new WebSocket(url); - _hbbsWs.binaryType = 'arraybuffer'; - - _hbbsWs.onopen = () => { - console.log('[RDConn] Connected to hbbs'); - // First message from server should be KeyExchange (if encrypted) - // Wait for it before registering - }; - - _hbbsWs.onmessage = (event) => { - handleHbbsMessage(new Uint8Array(event.data)).then(resolve).catch(reject); - }; - - _hbbsWs.onerror = (e) => { - console.error('[RDConn] hbbs WebSocket error:', e); - reject(new Error('Failed to connect to signaling server')); - }; - - _hbbsWs.onclose = (e) => { - console.log('[RDConn] hbbs WebSocket closed:', e.code, e.reason); - if (_state !== STATE.CONNECTED && _state !== STATE.CLOSED) { - setState(STATE.FAILED); - if (_onError) _onError('Signaling connection closed'); - } - }; - - // Timeout for connection - setTimeout(() => { - if (_hbbsWs && _hbbsWs.readyState !== WebSocket.OPEN) { - reject(new Error('Connection timeout')); - } - }, 10000); - }); - } - - /** - * Handle incoming messages from hbbs - */ - async function handleHbbsMessage(data) { - let msgData = data; - - // Decrypt if hbbs connection is encrypted - if (RDCrypto.isHbbsEncrypted()) { - const decrypted = RDCrypto.hbbsDecrypt(data); - if (!decrypted) { - console.error('[RDConn] Failed to decrypt hbbs message'); - return; - } - msgData = decrypted; - } - - const rvMsg = RDProto.decodeRendezvousMsg(msgData); - const field = getRvField(rvMsg); - - switch (field) { - case 'key_exchange': - await handleServerKeyExchange(rvMsg.key_exchange); - break; - - case 'register_peer_response': - if (rvMsg.register_peer_response.request_pk) { - sendRegisterPk(); - } - break; - - case 'register_pk_response': - console.log('[RDConn] Registration result:', rvMsg.register_pk_response.result); - setState(STATE.PUNCHING); - sendPunchHole(); - break; - - case 'punch_hole_response': - await handlePunchHoleResponse(rvMsg.punch_hole_response); - break; - - case 'relay_response': - await handleRelayResponse(rvMsg.relay_response); - break; - - case 'online_response': - handleOnlineResponse(rvMsg.online_response); - break; - - case 'configure_update': - console.log('[RDConn] Server config update received'); - break; - - default: - console.log('[RDConn] Unhandled hbbs message:', field, rvMsg); - } - } - - /** - * Handle server key exchange (encrypted hbbs connection) - */ - async function handleServerKeyExchange(keyExchange) { - if (keyExchange.keys.length < 1) { - console.log('[RDConn] No server key provided, connection is unencrypted'); - sendRegisterPeer(); - return; - } - - if (!_serverKey) { - console.log('[RDConn] No server key configured, skipping verification'); - sendRegisterPeer(); - return; - } - - // Parse server's long-term Ed25519 public key from hex - const serverPk = hexToBytes(_serverKey); - - // Verify the server's ephemeral key signature - const serverEphemeralPk = RDCrypto.verifyServerKey(keyExchange.keys[0], serverPk); - if (!serverEphemeralPk) { - console.error('[RDConn] Server key verification failed'); - sendRegisterPeer(); - return; - } - - // Setup hbbs encryption using a separate keypair (not the session keypair) - RDCrypto.generateHbbsKeyPair(); - RDCrypto.setupHbbsEncryption(serverEphemeralPk); - - // Send our ephemeral pk back to server - sendHbbs(RDProto.encodeRendezvousMsg({ - key_exchange: { keys: [RDCrypto.hbbsBoxPublicKey] } - })); - - console.log('[RDConn] Server key exchange complete, hbbs connection encrypted'); - - // Proceed with registration - sendRegisterPeer(); - } - - /** - * Send RegisterPeer to hbbs - */ - function sendRegisterPeer() { - setState(STATE.REGISTERING); - _serial = Date.now() % 1000000; - sendHbbs(RDProto.encodeRendezvousMsg({ - register_peer: { id: _myId, serial: _serial } - })); - console.log('[RDConn] Sent RegisterPeer, id:', _myId); - } - - /** - * Send RegisterPk to hbbs - */ - function sendRegisterPk() { - const pk = RDCrypto.getSignPublicKey(); - sendHbbs(RDProto.encodeRendezvousMsg({ - register_pk: { - id: _myId, - uuid: _myUuid, - pk: pk - } - })); - console.log('[RDConn] Sent RegisterPk'); - } - - /** - * Send PunchHoleRequest to hbbs - */ - function sendPunchHole() { - sendHbbs(RDProto.encodeRendezvousMsg({ - punch_hole_request: { - id: _targetPeerId, - nat_type: 0, // UNKNOWN_NAT - conn_type: 0, // DEFAULT_CONN - version: '1.3.6', - force_relay: true // Web clients always use relay - } - })); - console.log('[RDConn] Sent PunchHoleRequest for', _targetPeerId); - } - - /** - * Handle PunchHoleResponse from hbbs - */ - async function handlePunchHoleResponse(response) { - console.log('[RDConn] PunchHoleResponse received'); - - // Check for failure - if (response.failure) { - const failures = { 0: 'ID_NOT_EXIST', 2: 'OFFLINE', 3: 'LICENSE_MISMATCH', 4: 'LICENSE_OVERUSE' }; - const reason = failures[response.failure] || `UNKNOWN(${response.failure})`; - console.error('[RDConn] Punch hole failed:', reason, response.other_failure); - setState(STATE.FAILED); - if (_onError) _onError(`Connection failed: ${reason}. ${response.other_failure || ''}`); - return; - } - - // Store peer's Ed25519 public key - if (response.pk) { - _peerPk = response.pk; - RDCrypto.setPeerPublicKey(response.pk); - } - - // Web clients always use relay - setState(STATE.RELAYING); - await connectRelay(); - } - - /** - * Connect to relay (hbbr) via WebSocket - */ - function connectRelay() { - return new Promise((resolve, reject) => { - const url = buildWsUrl(_serverAddr, '/ws/relay'); - console.log('[RDConn] Connecting to relay at', url); - - _sessionWs = new WebSocket(url); - _sessionWs.binaryType = 'arraybuffer'; - - _sessionWs.onopen = () => { - console.log('[RDConn] Connected to relay'); - // Send RequestRelay - sendRelay(RDProto.encodeRendezvousMsg({ - request_relay: { - id: _targetPeerId, - uuid: _myUuid, - secure: !!_peerPk, - conn_type: 0 // DEFAULT_CONN - } - })); - }; - - _sessionWs.onmessage = (event) => { - handleRelayMessage(new Uint8Array(event.data)); - }; - - _sessionWs.onerror = (e) => { - console.error('[RDConn] Relay WebSocket error:', e); - setState(STATE.FAILED); - if (_onError) _onError('Relay connection failed'); - }; - - _sessionWs.onclose = (e) => { - console.log('[RDConn] Relay WebSocket closed:', e.code, e.reason); - if (_state === STATE.CONNECTED) { - cleanup(); - if (_onClose) _onClose(e.reason || 'Session closed'); - } - }; - - // Store the resolve for later - _relayResolve = resolve; - _relayReject = reject; - }); - } - - /** - * Handle incoming messages from relay - */ - function handleRelayMessage(data) { - // First few messages from relay are RendezvousMessage - // After key exchange, they become Message (session protocol) - - let msgData = data; - let isSessionMsg = RDCrypto.isEncrypted(); - - if (isSessionMsg) { - // Try to decrypt as session message - msgData = RDCrypto.decrypt(data); - if (!msgData) { - console.error('[RDConn] Failed to decrypt session message'); - return; - } - handleSessionMessage(msgData); - } else { - // Still in rendezvous protocol - try { - const rvMsg = RDProto.decodeRendezvousMsg(msgData); - handleRelayRendezvous(rvMsg); - } catch (e) { - // Maybe it's a session message without encryption - try { - handleSessionMessage(msgData); - } catch (e2) { - console.error('[RDConn] Failed to parse message:', e, e2); - } - } - } - } - - /** - * Handle RendezvousMessage from relay - */ - function handleRelayRendezvous(rvMsg) { - const field = getRvField(rvMsg); - - switch (field) { - case 'relay_response': - handleRelayResponse(rvMsg.relay_response); - break; - - case 'punch_hole': - // Server is telling us about an incoming connection - console.log('[RDConn] PunchHole received (unexpected for web client)'); - break; - - default: - console.log('[RDConn] Unhandled relay rendezvous:', field); - } - } - - /** - * Handle RelayResponse from hbbr - */ - async function handleRelayResponse(response) { - console.log('[RDConn] RelayResponse received'); - - if (response.refuse_reason) { - console.error('[RDConn] Relay refused:', response.refuse_reason); - setState(STATE.FAILED); - if (_onError) _onError(`Relay refused: ${response.refuse_reason}`); - return; - } - - // If we got the peer's pk from relay response, use it - if (response.pk) { - _peerPk = response.pk; - RDCrypto.setPeerPublicKey(response.pk); - } - - if (response.uuid) { - _relayUuid = response.uuid; - console.log('[RDConn] Relay UUID:', response.uuid); - } - - setState(STATE.KEY_EXCHANGE); - console.log('[RDConn] Waiting for key exchange from peer...'); - // The actual session messages will come through the same relay WebSocket - if (_relayResolve) _relayResolve(); - } - - /** - * Handle session protocol Message from peer - */ - function handleSessionMessage(data) { - const msg = RDProto.decodeMsg(data); - const field = getMsgField(msg); - - switch (field) { - case 'signed_id': - handleSignedId(msg.signed_id); - break; - - case 'hash': - handleHashChallenge(msg.hash); - break; - - case 'login_response': - handleLoginResponse(msg.login_response); - break; - - case 'video_frame': - if (_onVideoFrame) _onVideoFrame(msg.video_frame); - break; - - case 'audio_frame': - if (_onAudioFrame) _onAudioFrame(msg.audio_frame); - break; - - case 'cursor_data': - if (_onCursorData) _onCursorData(msg.cursor_data); - break; - - case 'cursor_position': - if (_onCursorPosition) _onCursorPosition(msg.cursor_position); - break; - - case 'cursor_id': - console.log('[RDConn] Cursor ID:', msg.cursor_id.toString()); - break; - - case 'misc': - handleMiscEvent(msg.misc); - break; - - case 'clipboard': - if (_onClipboard) _onClipboard(msg.clipboard); - break; - - case 'test_delay': - handleTestDelay(msg.test_delay); - break; - - case 'message_box': - handleMessageBox(msg.message_box); - break; - - case 'peer_info': - if (_onPeerInfo) _onPeerInfo(msg.peer_info); - break; - - default: - console.log('[RDConn] Session message:', field); - } - } - - /** - * Handle SignedId (key exchange step 1) - */ - function handleSignedId(signedId) { - console.log('[RDConn] Received SignedId, performing key exchange...'); - try { - // Verify Ed25519 signature and extract IdPk - const idPk = RDCrypto.verifySignedId(signedId.id); - - // Create our PublicKey response - const keyResponse = RDCrypto.createKeyExchangeResponse(idPk.pk); - - // Send PublicKey message - sendSession(RDProto.encodeMsg({ - public_key: keyResponse - })); - - console.log('[RDConn] Key exchange complete, waiting for auth challenge...'); - setState(STATE.AUTHENTICATING); - } catch (e) { - console.error('[RDConn] Key exchange failed:', e); - setState(STATE.FAILED); - if (_onError) _onError(`Key exchange failed: ${e.message}`); - } - } - - /** - * Handle Hash challenge (authentication step 1) - */ - function handleHashChallenge(hash) { - console.log('[RDConn] Received hash challenge, requesting password...'); - if (_passwordCallback) { - _passwordCallback(hash, async (password) => { - if (password === null || password === undefined) { - // User cancelled - sendSession(RDProto.encodeMsg({})); - close(); - return; - } - const hashedPw = await RDCrypto.hashPassword(hash.salt, password); - sendSession(RDProto.encodeMsg( - RDProto.createPasswordLogin(_myId, _myName, hashedPw, 'Web', '1.3.6') - )); - }); - } else { - console.log('[RDConn] No password callback set, connecting without password'); - sendSession(RDProto.encodeMsg( - RDProto.createLoginRequest(_myId, _myName, new Uint8Array(0), 'Web', '1.3.6') - )); - } - } - - /** - * Handle LoginResponse (authentication result) - */ - function handleLoginResponse(response) { - if (response.error) { - console.error('[RDConn] Login failed:', response.error); - setState(STATE.FAILED); - if (_onError) _onError(`Authentication failed: ${response.error}`); - return; - } - - if (response.peer_info) { - _peerPlatform = response.peer_info.platform; - _peerVersion = response.peer_info.version; - console.log('[RDConn] Login successful! Peer:', response.peer_info.hostname, - 'Platform:', _peerPlatform, 'Version:', _peerVersion); - - if (_onPeerInfo) _onPeerInfo(response.peer_info); - setState(STATE.CONNECTED); - - // Start keepalive - startKeepalive(); - startLatencyTest(); - } - } - - /** - * Handle Misc event - */ - function handleMiscEvent(misc) { - const field = getMiscField(misc); - - switch (field) { - case 'close_reason': - console.log('[RDConn] Close reason:', misc.close_reason); - cleanup(); - if (_onClose) _onClose(misc.close_reason); - break; - - case 'permission_info': - console.log('[RDConn] Permission:', - misc.permission_info.permission, - misc.permission_info.enabled ? 'granted' : 'revoked'); - break; - - case 'switch_display': - console.log('[RDConn] Switch display:', misc.switch_display.display, - misc.switch_display.width, 'x', misc.switch_display.height); - break; - - case 'audio_format': - console.log('[RDConn] Audio format:', - misc.audio_format.sample_rate, 'Hz,', - misc.audio_format.channels, 'channels'); - break; - - case 'supported_encoding': - console.log('[RDConn] Server encoding support:', - 'h264:', misc.supported_encoding.h264, - 'h265:', misc.supported_encoding.h265, - 'vp8:', misc.supported_encoding.vp8, - 'av1:', misc.supported_encoding.av1); - break; - - case 'chat_message': - console.log('[RDConn] Chat:', misc.chat_message.text); - break; - - case 'elevation_request': - console.log('[RDConn] Elevation request'); - break; - - case 'refresh_video': - console.log('[RDConn] Refresh video requested'); - break; - - case 'back_notification': - console.log('[RDConn] Back notification:', misc.back_notification); - break; - - default: - // Pass to app callback - if (_onMiscEvent) _onMiscEvent(field, misc); - } - } - - /** - * Handle MessageBox from peer - */ - function handleMessageBox(msgBox) { - console.log('[RDConn] MessageBox:', msgBox.msgtype, msgBox.title, msgBox.text); - if (_onMiscEvent) _onMiscEvent('message_box', msgBox); - } - - /** - * Handle TestDelay (latency measurement) - */ - function handleTestDelay(testDelay) { - if (testDelay.from_client) return; // Don't echo our own - - const latency = testDelay.last_delay; - console.log('[RDConn] Latency:', latency, 'ms'); - } - - /** - * Send data to hbbs signaling server - */ - function sendHbbs(data) { - if (_hbbsWs && _hbbsWs.readyState === WebSocket.OPEN) { - if (RDCrypto.isHbbsEncrypted()) { - data = RDCrypto.hbbsEncrypt(data); - } - _hbbsWs.send(data); - } - } - - /** - * Send data through session (relay) WebSocket - */ - function sendSession(data) { - if (_sessionWs && _sessionWs.readyState === WebSocket.OPEN) { - let sendData = data; - if (RDCrypto.isEncrypted()) { - sendData = RDCrypto.encrypt(data); - } - _sessionWs.send(sendData); - } - } - - /** - * Connect to a specific peer - */ - function connectToPeer(peerId) { - _targetPeerId = peerId; - - if (_state === STATE.PUNCHING || - _state === STATE.REGISTERING || - _state === STATE.CONNECTING) { - // Already connected to hbbs, just send punch hole - sendPunchHole(); - } else if (_state === STATE.CONNECTED) { - // Already in a session, close it first - close(); - setTimeout(() => connect(_serverAddr), 500); - // After reconnect, we'll need to punch hole again - // The password callback etc. should still be set - } else { - // Reconnect to server - connect(_serverAddr, { - clientId: _myId, - clientName: _myName, - uuid: _myUuid, - tls: _useTls, - serverKey: _serverKey, - onPassword: _passwordCallback, - on2FA: _2faCallback, - onPeerInfo: _onPeerInfo, - onVideoFrame: _onVideoFrame, - onAudioFrame: _onAudioFrame, - onCursorData: _onCursorData, - onCursorPosition: _onCursorPosition, - onMiscEvent: _onMiscEvent, - onClipboard: _onClipboard, - onClose: _onClose, - onStateChange: _onStateChange, - onError: _onError, - }); - } - } - - /** - * Send a 2FA code - */ - function send2FACode(code) { - if (_state === STATE.AUTHENTICATING) { - sendSession(RDProto.encodeMsg({ - auth_2fa: { code: code } - })); - } - } - - /** - * Send a mouse event to the peer - */ - function sendMouseEvent(mask, x, y, modifiers = []) { - sendSession(RDProto.encodeMsg(RDProto.createMouseEvent(mask, x, y, modifiers))); - } - - /** - * Send a key event to the peer - */ - function sendKeyEvent(controlKey, down, press = false, modifiers = []) { - sendSession(RDProto.encodeMsg(RDProto.createKeyEvent(controlKey, down, press, modifiers))); - } - - /** - * Send a character key event to the peer - */ - function sendCharEvent(chr, down, press = false, modifiers = []) { - sendSession(RDProto.encodeMsg(RDProto.createCharKeyEvent(chr, down, press, modifiers))); - } - - /** - * Send clipboard text to peer - */ - function sendClipboard(text) { - sendSession(RDProto.encodeMsg(RDProto.createClipboard(text))); - } - - /** - * Send Ctrl+Alt+Del - */ - function sendCtrlAltDel() { - sendSession(RDProto.encodeMsg(RDProto.createKeyEvent(100, true, true))); - setTimeout(() => sendSession(RDProto.encodeMsg(RDProto.createKeyEvent(100, false, false))), 50); - } - - /** - * Request display switch - */ - function sendSwitchDisplay(display) { - sendSession(RDProto.encodeMsg({ - misc: { switch_display: { display: display } } - })); - } - - /** - * Lock remote screen - */ - function sendLockScreen() { - sendSession(RDProto.encodeMsg(RDProto.createKeyEvent(101, true, true))); - } - - /** - * Start keepalive interval - */ - function startKeepalive() { - stopKeepalive(); - _keepAliveInterval = setInterval(() => { - if (_state === STATE.CONNECTED) { - // Send empty message as keepalive - sendSession(new Uint8Array(0)); - } - }, 30000); - } - - /** - * Stop keepalive - */ - function stopKeepalive() { - if (_keepAliveInterval) { - clearInterval(_keepAliveInterval); - _keepAliveInterval = null; - } - } - - /** - * Start latency test interval - */ - function startLatencyTest() { - stopLatencyTest(); - _latencyInterval = setInterval(() => { - if (_state === STATE.CONNECTED) { - sendSession(RDProto.encodeMsg(RDProto.createTestDelay(true))); - } - }, 10000); - } - - /** - * Stop latency test - */ - function stopLatencyTest() { - if (_latencyInterval) { - clearInterval(_latencyInterval); - _latencyInterval = null; - } - } - - /** - * Clean up connection resources - */ - function cleanup() { - stopKeepalive(); - stopLatencyTest(); - RDCrypto.reset(); - RDCrypto.resetHbbs(); - } - - /** - * Close the connection - */ - function close() { - cleanup(); - if (_hbbsWs) { - try { _hbbsWs.close(); } catch (e) {} - _hbbsWs = null; - } - if (_sessionWs) { - try { _sessionWs.close(); } catch (e) {} - _sessionWs = null; - } - setState(STATE.CLOSED); - } - - /** - * Set connection state - */ - function setState(newState) { - const oldState = _state; - _state = newState; - console.log('[RDConn] State:', oldState, '->', newState); - if (_onStateChange) _onStateChange(newState, oldState); - } - - /** - * Get the active field from a RendezvousMessage - */ - function getRvField(msg) { - const fields = ['register_peer', 'register_peer_response', 'punch_hole_request', - 'punch_hole', 'punch_hole_sent', 'punch_hole_response', 'fetch_local_addr', - 'local_addr', 'configure_update', 'register_pk', 'register_pk_response', - 'software_update', 'request_relay', 'relay_response', 'test_nat_request', - 'test_nat_response', 'peer_discovery', 'online_request', 'online_response', - 'key_exchange', 'hc', 'http_proxy_request', 'http_proxy_response']; - for (const f of fields) { - if (msg[f] != null && !(typeof msg[f] === 'object' && Object.keys(msg[f]).length === 0 && !ArrayBuffer.isView(msg[f]))) { - return f; - } - } - // Check for bytes/number fields - if (msg.hc !== undefined && msg.hc !== null) return 'hc'; - return null; - } - - /** - * Get the active field from a Message - */ - function getMsgField(msg) { - const fields = ['signed_id', 'public_key', 'test_delay', 'video_frame', - 'login_request', 'login_response', 'hash', 'mouse_event', 'audio_frame', - 'cursor_data', 'cursor_position', 'key_event', 'clipboard', - 'file_action', 'file_response', 'misc', 'cliprdr', 'message_box', - 'peer_info', 'pointer_device_event', 'auth_2fa', 'multi_clipboards', - 'screenshot_request', 'screenshot_response', 'terminal_action', - 'terminal_response', 'switch_sides_response', 'voice_call_request', - 'voice_call_response']; - for (const f of fields) { - if (msg[f] != null) { - if (f === 'cursor_id' && msg[f] === 0n) continue; // Skip default bigint - if (typeof msg[f] === 'object' && !ArrayBuffer.isView(msg[f]) && - !(msg[f] instanceof Uint8Array) && !(msg[f] instanceof ArrayBuffer) && - Object.keys(msg[f]).length === 0) continue; - if (typeof msg[f] === 'number' && msg[f] === 0 && f === 'cursor_id') continue; - return f; - } - } - // Check cursor_id specifically (bigint) - if (msg.cursor_id && msg.cursor_id !== 0n) return 'cursor_id'; - return null; - } - - /** - * Get the active field from a Misc message - */ - function getMiscField(misc) { - const fields = ['chat_message', 'switch_display', 'permission_info', 'option', - 'audio_format', 'close_reason', 'refresh_video', 'video_received', - 'back_notification', 'restart_remote_device', 'uac', 'foreground_window_elevated', - 'stop_service', 'elevation_request', 'elevation_response', - 'portable_service_running', 'switch_sides_request', 'switch_back', - 'change_resolution', 'plugin_request', 'plugin_failure', - 'full_speed_fps', 'auto_adjust_fps', 'client_record_status', - 'capture_displays', 'refresh_video_display', 'toggle_virtual_display', - 'toggle_privacy_mode', 'supported_encoding', 'selected_sid', - 'change_display_resolution', 'message_query', 'follow_current_display']; - for (const f of fields) { - if (misc[f] != null && misc[f] !== false && misc[f] !== '') { - return f; - } - } - return null; - } - - /** - * Hex string to Uint8Array - */ - function hexToBytes(hex) { - const bytes = new Uint8Array(hex.length / 2); - for (let i = 0; i < hex.length; i += 2) { - bytes[i / 2] = parseInt(hex.substr(i, 2), 16); - } - return bytes; - } - - return { - STATE, - connect, - connectToPeer, - close, - sendMouseEvent, - sendKeyEvent, - sendCharEvent, - sendClipboard, - sendCtrlAltDel, - sendSwitchDisplay, - sendLockScreen, - send2FACode, - get state() { return _state; }, - get myId() { return _myId; }, - get myName() { return _myName; }, - get peerPlatform() { return _peerPlatform; }, - get isConnected() { return _state === STATE.CONNECTED; }, - }; -})(); diff --git a/shelled/rustdesk-web-client/js/crypto.js b/shelled/rustdesk-web-client/js/crypto.js deleted file mode 100644 index fdd638d..0000000 --- a/shelled/rustdesk-web-client/js/crypto.js +++ /dev/null @@ -1,341 +0,0 @@ -/** - * RustDesk Standalone Web Client - Cryptography Module - * - * Handles NaCl encryption/decryption, key exchange, and password hashing. - * Uses TweetNaCl.js for all cryptographic operations. - */ - -const RDCrypto = (() => { - let _sessionKey = null; // 32-byte symmetric key for session encryption - let _sendSeq = 0; // Send sequence counter - let _recvSeq = 0; // Receive sequence counter - let _peerPk = null; // Peer's Ed25519 public key (from PunchHoleResponse) - let _mySignKeyPair = null; // Our Ed25519 signing keypair - let _myBoxKeyPair = null; // Our Curve25519 box keypair (per-session) - - /** - * Generate a random Ed25519 signing keypair - */ - function generateSignKeyPair() { - _mySignKeyPair = nacl.sign.keyPair(); - return _mySignKeyPair; - } - - /** - * Generate a random Curve25519 keypair for ECDH - */ - function generateBoxKeyPair() { - _myBoxKeyPair = nacl.box.keyPair(); - return _myBoxKeyPair; - } - - /** - * Get our Ed25519 public key (32 bytes) - */ - function getSignPublicKey() { - return _mySignKeyPair ? _mySignKeyPair.publicKey : null; - } - - /** - * Get our Curve25519 public key (32 bytes) - */ - function getBoxPublicKey() { - return _myBoxKeyPair ? _myBoxKeyPair.publicKey : null; - } - - /** - * Set the peer's Ed25519 public key (from PunchHoleResponse.pk) - */ - function setPeerPublicKey(pk) { - _peerPk = new Uint8Array(pk); - } - - /** - * Verify a SignedId message - * SignedId.id = Ed25519 signature (64 bytes) || serialized IdPk protobuf - * Verification uses the peer's Ed25519 public key from PunchHoleResponse - * Returns the deserialized IdPk { id, pk } on success - */ - function verifySignedId(signedIdBytes) { - if (!_peerPk || _peerPk.length < 32) { - throw new Error('Peer public key not set'); - } - - const signed = new Uint8Array(signedIdBytes); - if (signed.length < 64) { - throw new Error('SignedId too short'); - } - - // NaCl sign format: signature (64 bytes) || message - const signature = signed.slice(0, 64); - const message = signed.slice(64); - - // Verify Ed25519 signature - // Note: nacl.sign.detached.verify expects (message, signature, publicKey) - const verified = nacl.sign.detached.verify(message, signature, _peerPk); - if (!verified) { - throw new Error('SignedId verification failed'); - } - - // Parse the message as IdPk protobuf - const IdPk = RDProto.lookup('IdPk'); - const idPk = IdPk.decode(message); - - console.log('[RDCrypto] SignedId verified. Peer ID:', idPk.id, - 'Curve25519 pk length:', idPk.pk.length); - return idPk; - } - - /** - * Create a PublicKey message for key exchange response - * Generates a random 32-byte symmetric key and encrypts it with nacl.box - * - * @param {Uint8Array} peerCurvePk - Peer's ephemeral Curve25519 public key (from IdPk.pk) - * @returns {Object} { asymmetric_value, symmetric_value } - */ - function createKeyExchangeResponse(peerCurvePk) { - if (!_myBoxKeyPair) { - generateBoxKeyPair(); - } - - // Generate random 32-byte symmetric session key - _sessionKey = nacl.randomBytes(32); - _sendSeq = 0; - _recvSeq = 0; - - // Compute shared key via ECDH: box.before(peer_pk, our_sk) - const sharedKey = nacl.box.before(new Uint8Array(peerCurvePk), _myBoxKeyPair.secretKey); - - // Encrypt the session key with the shared key - // nacl.box.after(message, nonce, sharedKey) returns MAC(16) + ciphertext - const nonce = new Uint8Array(24); // All zeros for key exchange - const encrypted = nacl.box.after(_sessionKey, nonce, sharedKey); - - const result = { - asymmetric_value: _myBoxKeyPair.publicKey, // Our Curve25519 pk (32 bytes) - symmetric_value: encrypted // MAC(16) + encrypted key (32) = 48 bytes - }; - - console.log('[RDCrypto] Key exchange response created. Session key established.'); - return result; - } - - /** - * Encrypt session data using NaCl secretbox - * Format: MAC (16 bytes) + ciphertext - * Nonce: 24-byte LE encoding of sequence number - */ - function encrypt(data) { - if (!_sessionKey) return data; - - const nonce = new Uint8Array(24); - const view = new DataView(nonce.buffer); - _sendSeq++; - view.setBigUint64(0, BigInt(_sendSeq), true); // LE - - const encrypted = nacl.secretbox(new Uint8Array(data), nonce, _sessionKey); - return encrypted; - } - - /** - * Decrypt session data using NaCl secretbox - */ - function decrypt(data) { - if (!_sessionKey) return new Uint8Array(data); - - const nonce = new Uint8Array(24); - const view = new DataView(nonce.buffer); - _recvSeq++; - view.setBigUint64(0, BigInt(_recvSeq), true); // LE - - const decrypted = nacl.secretbox.open(new Uint8Array(data), nonce, _sessionKey); - if (!decrypted) { - console.error('[RDCrypto] Decryption failed! Seq:', _recvSeq); - return null; - } - return decrypted; - } - - /** - * Check if encryption is active - */ - function isEncrypted() { - return _sessionKey !== null; - } - - /** - * Reset encryption state - */ - function reset() { - _sessionKey = null; - _sendSeq = 0; - _recvSeq = 0; - _peerPk = null; - } - - /** - * Hash password for RustDesk authentication - * RustDesk expects: SHA256(salt + password) - * - * @param {string} salt - The salt from the Hash challenge - * @param {string} password - The user's password - * @returns {Promise} - SHA256 hash as bytes - */ - async hashPassword(salt, password) { - const data = new TextEncoder().encode(salt + password); - const hash = await crypto.subtle.digest('SHA-256', data); - return new Uint8Array(hash); - } - - /** - * Verify hbbs server key exchange signature - * The server sends KeyExchange { keys: [signed_ephemeral_pk] } - * where signed_ephemeral_pk is Ed25519-sign(signature || ephemeral_pk) - * - * @param {Uint8Array} signedKey - The signed key from server's KeyExchange - * @param {Uint8Array} serverPk - The server's long-term Ed25519 public key - * @returns {Uint8Array|null} - The server's ephemeral Curve25519 public key - */ - function verifyServerKey(signedKey, serverPk) { - const signed = new Uint8Array(signedKey); - if (signed.length < 64) return null; - - const signature = signed.slice(0, 64); - const message = signed.slice(64); - - const verified = nacl.sign.detached.verify(message, signature, new Uint8Array(serverPk)); - if (!verified) { - console.error('[RDCrypto] Server key verification failed'); - return null; - } - - console.log('[RDCrypto] Server key verified, ephemeral pk length:', message.length); - return message; // This is the server's ephemeral Curve25519 pk - } - - /** - * Create client response for hbbs server key exchange - * @param {Uint8Array} serverEphemeralPk - Server's ephemeral Curve25519 pk - * @returns {Uint8Array[]} - [our_ephemeral_pk, encrypted_symmetric_key] - */ - function createServerKeyResponse(serverEphemeralPk) { - if (!_myBoxKeyPair) { - generateBoxKeyPair(); - } - - // Generate symmetric key for hbbs communication - const symmetricKey = nacl.randomBytes(32); - - // Compute shared key via ECDH - const sharedKey = nacl.box.before(new Uint8Array(serverEphemeralPk), _myBoxKeyPair.secretKey); - - // Encrypt symmetric key - const nonce = new Uint8Array(24); - const encrypted = nacl.box.after(symmetricKey, nonce, sharedKey); - - // Store the symmetric key for hbbs communication - // We'll handle this separately from the session key - // For now, just return the response - return [ - _myBoxKeyPair.publicKey, // Our ephemeral Curve25519 pk - encrypted // Encrypted symmetric key - ]; - } - - /** - * Get our Curve25519 secret key (32 bytes) - */ - function getBoxSecretKey() { - return _myBoxKeyPair ? _myBoxKeyPair.secretKey : null; - } - - /** - * Generate a fresh Curve25519 keypair for hbbs encryption - * Separate from the session keypair used for peer-to-peer - */ - let _hbbsBoxKeyPair = null; - let _hbbsSharedKey = null; - let _hbbsSendSeq = 0; - let _hbbsRecvSeq = 0; - - function generateHbbsKeyPair() { - _hbbsBoxKeyPair = nacl.box.keyPair(); - return _hbbsBoxKeyPair; - } - - function setupHbbsEncryption(serverEphemeralPk) { - if (!_hbbsBoxKeyPair) generateHbbsKeyPair(); - _hbbsSharedKey = nacl.box.before( - new Uint8Array(serverEphemeralPk), - _hbbsBoxKeyPair.secretKey - ); - _hbbsSendSeq = 0; - _hbbsRecvSeq = 0; - } - - function hbbsEncrypt(data) { - if (!_hbbsSharedKey) return data; - _hbbsSendSeq++; - const nonce = new Uint8Array(24); - new DataView(nonce.buffer).setBigUint64(0, BigInt(_hbbsSendSeq), true); - return nacl.secretbox(new Uint8Array(data), nonce, _hbbsSharedKey); - } - - function hbbsDecrypt(data) { - if (!_hbbsSharedKey) return new Uint8Array(data); - _hbbsRecvSeq++; - const nonce = new Uint8Array(24); - new DataView(nonce.buffer).setBigUint64(0, BigInt(_hbbsRecvSeq), true); - const decrypted = nacl.secretbox.open(new Uint8Array(data), nonce, _hbbsSharedKey); - if (!decrypted) { - console.error('[RDCrypto] hbbs decryption failed!'); - return null; - } - return decrypted; - } - - function isHbbsEncrypted() { - return _hbbsSharedKey !== null; - } - - function createHbbsKeyResponse(serverEphemeralPk) { - if (!_hbbsBoxKeyPair) generateHbbsKeyPair(); - setupHbbsEncryption(serverEphemeralPk); - return [ - _hbbsBoxKeyPair.publicKey, // Our ephemeral Curve25519 pk - null // The shared key is derived via ECDH, no separate encrypted key needed - ]; - } - - function resetHbbs() { - _hbbsBoxKeyPair = null; - _hbbsSharedKey = null; - _hbbsSendSeq = 0; - _hbbsRecvSeq = 0; - } - - return { - generateSignKeyPair, - generateBoxKeyPair, - getSignPublicKey, - getBoxPublicKey, - getBoxSecretKey, - setPeerPublicKey, - verifySignedId, - createKeyExchangeResponse, - encrypt, - decrypt, - isEncrypted, - reset, - hashPassword, - verifyServerKey, - createServerKeyResponse: createHbbsKeyResponse, - setupHbbsEncryption, - hbbsEncrypt, - hbbsDecrypt, - isHbbsEncrypted, - generateHbbsKeyPair, - get hbbsBoxPublicKey() { return _hbbsBoxKeyPair ? _hbbsBoxKeyPair.publicKey : null; }, - resetHbbs - }; -})(); diff --git a/shelled/rustdesk-web-client/js/input.js b/shelled/rustdesk-web-client/js/input.js deleted file mode 100644 index 6393a1f..0000000 --- a/shelled/rustdesk-web-client/js/input.js +++ /dev/null @@ -1,412 +0,0 @@ -/** - * RustDesk Standalone Web Client - Input Handler - * - * Captures mouse and keyboard events from the remote desktop canvas - * and converts them to RustDesk protocol messages. - */ - -const RDInput = (() => { - let _canvas = null; - let _enabled = false; - let _displayWidth = 0; - let _displayHeight = 0; - let _scaleX = 1; - let _scaleY = 1; - let _mouseButtons = 0; // Current mouse button mask - let _modifiers = []; // Current modifier keys - let _keyboardLocked = false; - let _viewOnly = false; - - // Mouse button masks - const MOUSE = { - LEFT: 1, - RIGHT: 2, - MIDDLE: 4, - BUTTON4: 8, - BUTTON5: 16 - }; - - // Modifier key mappings - const MODIFIER_MAP = { - 'ControlLeft': 50, // LeftControl - 'ControlRight': 54, // RightControl - 'ShiftLeft': 51, // LeftShift - 'ShiftRight': 55, // RightShift - 'AltLeft': 52, // LeftAlt - 'AltRight': 56, // RightAlt - 'MetaLeft': 53, // LeftMeta - 'MetaRight': 57, // RightMeta - }; - - // Key name to ControlKey enum mapping - const KEY_MAP = { - 'Alt': 1, 'Backspace': 2, 'CapsLock': 3, 'Control': 4, 'Delete': 5, - 'ArrowDown': 6, 'End': 7, 'Escape': 8, - 'F1': 9, 'F10': 10, 'F11': 11, 'F12': 12, - 'F2': 13, 'F3': 14, 'F4': 15, 'F5': 16, 'F6': 17, - 'F7': 18, 'F8': 19, 'F9': 20, - 'Home': 21, 'ArrowLeft': 22, 'Meta': 23, - 'PageDown': 24, 'PageUp': 25, 'Enter': 26, 'Return': 26, - 'ArrowRight': 27, 'Shift': 28, ' ': 29, 'Space': 29, - 'Tab': 30, 'ArrowUp': 31, - 'Insert': 49, - 'NumLock': 63, 'ScrollLock': 64, - 'PrintScreen': 66, - 'Numpad0': 32, 'Numpad1': 33, 'Numpad2': 34, 'Numpad3': 35, - 'Numpad4': 36, 'Numpad5': 37, 'Numpad6': 38, 'Numpad7': 39, - 'Numpad8': 40, 'Numpad9': 41, - 'NumpadAdd': 42, 'NumpadDecimal': 43, 'NumpadDelete': 44, - 'NumpadDivide': 45, 'NumpadEnter': 46, - 'NumpadMultiply': 47, 'NumpadSubtract': 48, - 'VolumeDown': 58, 'VolumeMute': 59, 'VolumeUp': 60, - 'ContextMenu': 61, - }; - - /** - * Initialize input handler - * @param {HTMLCanvasElement} canvas - The canvas to capture events from - */ - function init(canvas) { - _canvas = canvas; - attachMouseEvents(); - attachKeyboardEvents(); - attachTouchEvents(); - attachWheelEvents(); - console.log('[RDInput] Initialized'); - } - - /** - * Enable/disable input capture - */ - function setEnabled(enabled) { - _enabled = enabled; - if (enabled) { - _canvas.style.cursor = 'default'; - } else { - _canvas.style.cursor = 'not-allowed'; - } - } - - /** - * Set view-only mode - */ - function setViewOnly(viewOnly) { - _viewOnly = viewOnly; - } - - /** - * Update display dimensions for coordinate mapping - */ - function setDisplaySize(width, height) { - _displayWidth = width; - _displayHeight = height; - updateScale(); - } - - /** - * Calculate scale factors for coordinate mapping - */ - function updateScale() { - if (_canvas && _displayWidth > 0 && _displayHeight > 0) { - _scaleX = _displayWidth / _canvas.clientWidth; - _scaleY = _displayHeight / _canvas.clientHeight; - } else { - _scaleX = 1; - _scaleY = 1; - } - } - - /** - * Convert canvas coordinates to display coordinates - */ - function canvasToDisplay(canvasX, canvasY) { - return { - x: Math.round(canvasX * _scaleX), - y: Math.round(canvasY * _scaleY) - }; - } - - /** - * Attach mouse event listeners - */ - function attachMouseEvents() { - _canvas.addEventListener('mousedown', onMouseDown); - _canvas.addEventListener('mouseup', onMouseUp); - _canvas.addEventListener('mousemove', onMouseMove); - _canvas.addEventListener('mouseenter', onMouseEnter); - _canvas.addEventListener('mouseleave', onMouseLeave); - _canvas.addEventListener('contextmenu', (e) => e.preventDefault()); - } - - /** - * Attach keyboard event listeners - */ - function attachKeyboardEvents() { - document.addEventListener('keydown', onKeyDown); - document.addEventListener('keyup', onKeyUp); - } - - /** - * Attach touch event listeners - */ - function attachTouchEvents() { - _canvas.addEventListener('touchstart', onTouchStart, { passive: false }); - _canvas.addEventListener('touchmove', onTouchMove, { passive: false }); - _canvas.addEventListener('touchend', onTouchEnd, { passive: false }); - _canvas.addEventListener('touchcancel', onTouchEnd, { passive: false }); - } - - /** - * Attach wheel event listeners - */ - function attachWheelEvents() { - _canvas.addEventListener('wheel', onWheel, { passive: false }); - } - - /** - * Handle mouse down - */ - function onMouseDown(e) { - if (!_enabled || _viewOnly) return; - e.preventDefault(); - - updateModifiers(e); - - let buttonMask = 0; - switch (e.button) { - case 0: buttonMask = MOUSE.LEFT; break; - case 1: buttonMask = MOUSE.MIDDLE; break; - case 2: buttonMask = MOUSE.RIGHT; break; - case 3: buttonMask = MOUSE.BUTTON4; break; - case 4: buttonMask = MOUSE.BUTTON5; break; - } - - _mouseButtons |= buttonMask; - - const pos = canvasToDisplay(e.offsetX, e.offsetY); - RDConnection.sendMouseEvent(_mouseButtons | getModifierMask(), pos.x, pos.y, getModifierList()); - - // Focus for keyboard events - _canvas.focus(); - } - - /** - * Handle mouse up - */ - function onMouseUp(e) { - if (!_enabled || _viewOnly) return; - e.preventDefault(); - - updateModifiers(e); - - let buttonMask = 0; - switch (e.button) { - case 0: buttonMask = MOUSE.LEFT; break; - case 1: buttonMask = MOUSE.MIDDLE; break; - case 2: buttonMask = MOUSE.RIGHT; break; - case 3: buttonMask = MOUSE.BUTTON4; break; - case 4: buttonMask = MOUSE.BUTTON5; break; - } - - _mouseButtons &= ~buttonMask; - - const pos = canvasToDisplay(e.offsetX, e.offsetY); - RDConnection.sendMouseEvent(_mouseButtons | getModifierMask(), pos.x, pos.y, getModifierList()); - } - - /** - * Handle mouse move - */ - function onMouseMove(e) { - if (!_enabled || _viewOnly) return; - - const pos = canvasToDisplay(e.offsetX, e.offsetY); - RDConnection.sendMouseEvent(_mouseButtons | getModifierMask(), pos.x, pos.y, getModifierList()); - } - - /** - * Handle mouse enter - */ - function onMouseEnter(e) { - // Notify peer that mouse entered the canvas - } - - /** - * Handle mouse leave - */ - function onMouseLeave(e) { - if (!_enabled || _viewOnly) return; - - // Send a release event when mouse leaves - RDConnection.sendMouseEvent(0, -1, -1, []); - _mouseButtons = 0; - } - - /** - * Handle mouse wheel - */ - function onWheel(e) { - if (!_enabled || _viewOnly) return; - e.preventDefault(); - - const buttonMask = e.deltaY > 0 ? MOUSE.BUTTON5 : MOUSE.BUTTON4; - const pos = canvasToDisplay(e.offsetX, e.offsetY); - - // Press - RDConnection.sendMouseEvent(buttonMask | getModifierMask(), pos.x, pos.y, getModifierList()); - // Release - setTimeout(() => { - RDConnection.sendMouseEvent(getModifierMask(), pos.x, pos.y, getModifierList()); - }, 20); - } - - /** - * Handle touch start - */ - function onTouchStart(e) { - if (!_enabled || _viewOnly) return; - e.preventDefault(); - - if (e.touches.length === 1) { - const touch = e.touches[0]; - const rect = _canvas.getBoundingClientRect(); - const x = touch.clientX - rect.left; - const y = touch.clientY - rect.top; - const pos = canvasToDisplay(x, y); - - RDConnection.sendMouseEvent(MOUSE.LEFT | getModifierMask(), pos.x, pos.y, getModifierList()); - _mouseButtons = MOUSE.LEFT; - } - } - - /** - * Handle touch move - */ - function onTouchMove(e) { - if (!_enabled || _viewOnly) return; - e.preventDefault(); - - if (e.touches.length === 1) { - const touch = e.touches[0]; - const rect = _canvas.getBoundingClientRect(); - const x = touch.clientX - rect.left; - const y = touch.clientY - rect.top; - const pos = canvasToDisplay(x, y); - - RDConnection.sendMouseEvent(MOUSE.LEFT | getModifierMask(), pos.x, pos.y, getModifierList()); - } - } - - /** - * Handle touch end - */ - function onTouchEnd(e) { - if (!_enabled || _viewOnly) return; - e.preventDefault(); - - RDConnection.sendMouseEvent(getModifierMask(), -1, -1, []); - _mouseButtons = 0; - } - - /** - * Handle key down - */ - function onKeyDown(e) { - if (!_enabled || _viewOnly) return; - - // Don't capture if we're typing in an input field - if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return; - - e.preventDefault(); - e.stopPropagation(); - - updateModifiers(e); - - const controlKey = KEY_MAP[e.key] || KEY_MAP[e.code]; - if (controlKey) { - // Special key - RDConnection.sendKeyEvent(controlKey, true, false, getModifierList()); - } else { - // Regular character - const charCode = e.key.charCodeAt(0); - if (charCode > 0 && charCode < 65536) { - RDConnection.sendCharEvent(charCode, true, false, getModifierList()); - } - } - } - - /** - * Handle key up - */ - function onKeyUp(e) { - if (!_enabled || _viewOnly) return; - - if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return; - - e.preventDefault(); - e.stopPropagation(); - - updateModifiers(e); - - const controlKey = KEY_MAP[e.key] || KEY_MAP[e.code]; - if (controlKey) { - RDConnection.sendKeyEvent(controlKey, false, false, getModifierList()); - } else { - const charCode = e.key.charCodeAt(0); - if (charCode > 0 && charCode < 65536) { - RDConnection.sendCharEvent(charCode, false, false, getModifierList()); - } - } - } - - /** - * Update current modifier state - */ - function updateModifiers(e) { - _modifiers = []; - if (e.ctrlKey || e.metaKey) _modifiers.push(4); // Control - if (e.shiftKey) _modifiers.push(28); // Shift - if (e.altKey) _modifiers.push(1); // Alt - } - - /** - * Get current modifier key list - */ - function getModifierList() { - return [..._modifiers]; - } - - /** - * Get modifier bitmask for mouse events - */ - function getModifierMask() { - let mask = 0; - if (_modifiers.includes(4)) mask |= 0x10; // Ctrl - if (_modifiers.includes(28)) mask |= 0x20; // Shift - if (_modifiers.includes(1)) mask |= 0x40; // Alt - if (_modifiers.includes(23)) mask |= 0x80; // Meta - return mask; - } - - /** - * Type a string of text (for paste/keyboard input) - */ - function typeString(text) { - if (!_enabled || _viewOnly) return; - - for (const char of text) { - const charCode = char.charCodeAt(0); - RDConnection.sendCharEvent(charCode, true, true, getModifierList()); - } - } - - return { - init, - setEnabled, - setViewOnly, - setDisplaySize, - typeString, - MOUSE, - get enabled() { return _enabled; } - }; -})(); diff --git a/shelled/rustdesk-web-client/js/proto.js b/shelled/rustdesk-web-client/js/proto.js deleted file mode 100644 index e77746a..0000000 --- a/shelled/rustdesk-web-client/js/proto.js +++ /dev/null @@ -1,1209 +0,0 @@ -/** - * RustDesk Standalone Web Client - Protobuf Message Definitions - * - * This module defines all protobuf messages used in the RustDesk protocol - * using protobuf.js programmatic definitions (parsed from .proto text format). - */ - -const RDProto = (() => { - // Embedded proto definition - complete RustDesk protocol - const PROTO_TEXT = ` -syntax = "proto3"; -package hbb; - -// ===== Enums ===== - -enum NatType { - UNKNOWN_NAT = 0; - ASYMMETRIC = 1; - SYMMETRIC = 2; -} - -enum ConnType { - DEFAULT_CONN = 0; - FILE_TRANSFER = 1; - PORT_FORWARD = 2; - RDP = 3; - VIEW_CAMERA = 4; - TERMINAL = 5; -} - -enum ImageQuality { - NotSet = 0; - Low = 2; - Balanced = 3; - Best = 4; -} - -enum BoolOption { - NotSet = 0; - Yes = 1; - No = 2; -} - -enum PreferCodec { - Auto = 0; - VP9 = 1; - H264 = 2; - H265 = 3; - VP8 = 4; - AV1 = 5; -} - -enum Chroma { - I420 = 0; - I444 = 1; -} - -enum KeyboardMode { - Legacy = 0; - Map = 1; - Translate = 2; - Auto = 3; -} - -enum ControlKey { - Unknown = 0; - Alt = 1; - Backspace = 2; - CapsLock = 3; - Control = 4; - Delete = 5; - DownArrow = 6; - End = 7; - Escape = 8; - F1 = 9; - F10 = 10; - F11 = 11; - F12 = 12; - F2 = 13; - F3 = 14; - F4 = 15; - F5 = 16; - F6 = 17; - F7 = 18; - F8 = 19; - F9 = 20; - Home = 21; - LeftArrow = 22; - Meta = 23; - PageDown = 24; - PageUp = 25; - Return = 26; - RightArrow = 27; - Shift = 28; - Space = 29; - Tab = 30; - UpArrow = 31; - Numpad0 = 32; - Numpad1 = 33; - Numpad2 = 34; - Numpad3 = 35; - Numpad4 = 36; - Numpad5 = 37; - Numpad6 = 38; - Numpad7 = 39; - Numpad8 = 40; - Numpad9 = 41; - NumpadAdd = 42; - NumpadDecimal = 43; - NumpadDelete = 44; - NumpadDivide = 45; - NumpadEnter = 46; - NumpadMultiply = 47; - NumpadSubtract = 48; - Insert = 49; - LeftControl = 50; - LeftShift = 51; - LeftAlt = 52; - LeftMeta = 53; - RightControl = 54; - RightShift = 55; - RightAlt = 56; - RightMeta = 57; - VolumeDown = 58; - VolumeMute = 59; - VolumeUp = 60; - Win = 61; - WakeUp = 62; - NumLock = 63; - ScrollLock = 64; - Print = 65; - PrintScreen = 66; - CtrlAltDel = 100; - LockScreen = 101; -} - -// ===== Rendezvous Protocol ===== - -message RendezvousMessage { - oneof union { - RegisterPeer register_peer = 6; - RegisterPeerResponse register_peer_response = 7; - PunchHoleRequest punch_hole_request = 8; - PunchHole punch_hole = 9; - PunchHoleSent punch_hole_sent = 10; - PunchHoleResponse punch_hole_response = 11; - FetchLocalAddr fetch_local_addr = 12; - LocalAddr local_addr = 13; - ConfigUpdate configure_update = 14; - RegisterPk register_pk = 15; - RegisterPkResponse register_pk_response = 16; - SoftwareUpdate software_update = 17; - RequestRelay request_relay = 18; - RelayResponse relay_response = 19; - TestNatRequest test_nat_request = 20; - TestNatResponse test_nat_response = 21; - PeerDiscovery peer_discovery = 22; - OnlineRequest online_request = 23; - OnlineResponse online_response = 24; - KeyExchange key_exchange = 25; - HealthCheck hc = 26; - HttpProxyRequest http_proxy_request = 27; - HttpProxyResponse http_proxy_response = 28; - } -} - -message RegisterPeer { - string id = 1; - uint32 serial = 2; -} - -message RegisterPeerResponse { - bool request_pk = 1; -} - -message RegisterPk { - string id = 1; - string uuid = 2; - bytes pk = 3; - string old_id = 4; - bool no_register_device = 5; -} - -message RegisterPkResponse { - enum Result { - OK = 0; - UUID_MISMATCH = 2; - ID_EXISTS = 3; - TOO_FREQUENT = 4; - INVALID_ID_FORMAT = 5; - NOT_SUPPORT = 6; - SERVER_ERROR = 7; - } - Result result = 1; -} - -message PunchHoleRequest { - string id = 1; - NatType nat_type = 2; - string licence_key = 3; - ConnType conn_type = 4; - string token = 5; - string version = 6; - uint32 udp_port = 7; - bool force_relay = 8; - string socket_addr_v6 = 9; -} - -message PunchHole { - string socket_addr = 1; - string relay_server = 2; - NatType nat_type = 3; - uint32 udp_port = 4; - bool force_relay = 5; - string socket_addr_v6 = 6; -} - -message PunchHoleSent { - string socket_addr = 1; - string id = 2; - string relay_server = 3; - NatType nat_type = 4; - string version = 5; - uint32 udp_port = 6; - string socket_addr_v6 = 7; -} - -message PunchHoleResponse { - string socket_addr = 1; - bytes pk = 2; - enum Failure { - ID_NOT_EXIST = 0; - OFFLINE = 2; - LICENSE_MISMATCH = 3; - LICENSE_OVERUSE = 4; - } - Failure failure = 3; - string relay_server = 4; - oneof union { - NatType nat_type = 5; - bool is_local = 6; - } - string other_failure = 7; - string feedback = 8; - bool is_udp = 9; - uint32 udp_port = 10; - string socket_addr_v6 = 11; -} - -message RequestRelay { - string id = 1; - string uuid = 2; - string socket_addr = 3; - string relay_server = 4; - bool secure = 5; - string licence_key = 6; - ConnType conn_type = 7; - string token = 8; -} - -message RelayResponse { - string socket_addr = 1; - string uuid = 2; - string relay_server = 3; - oneof union { - string id = 4; - bytes pk = 5; - } - string refuse_reason = 6; - string version = 7; - string feedback = 8; - string socket_addr_v6 = 9; - uint32 udp_port = 10; -} - -message OnlineRequest { - string id = 1; - repeated string peers = 2; -} - -message OnlineResponse { - bytes states = 1; -} - -message KeyExchange { - repeated bytes keys = 1; -} - -message FetchLocalAddr { - string socket_addr = 1; - string relay_server = 2; - string socket_addr_v6 = 3; -} - -message LocalAddr { - string socket_addr = 1; - string local_addr = 2; - string relay_server = 3; - string id = 4; - string version = 5; - string socket_addr_v6 = 6; -} - -message ConfigUpdate { - uint32 serial = 1; - repeated string rendezvous_servers = 2; -} - -message SoftwareUpdate { - string url = 1; -} - -message TestNatRequest { - uint32 serial = 1; -} - -message TestNatResponse { - uint32 port = 1; - ConfigUpdate cu = 2; -} - -message PeerDiscovery { - string cmd = 1; - string mac = 2; - string id = 3; - string username = 4; - string hostname = 5; - string platform = 6; - string misc = 7; -} - -message HealthCheck { - string token = 1; -} - -message HttpProxyRequest { - string method = 1; - string path = 2; - repeated HeaderEntry headers = 3; - bytes body = 4; -} - -message HttpProxyResponse { - int32 status = 1; - repeated HeaderEntry headers = 2; - bytes body = 3; - string error = 4; -} - -message HeaderEntry { - string name = 1; - string value = 2; -} - -// ===== Session Protocol ===== - -message Message { - oneof union { - SignedId signed_id = 3; - PublicKey public_key = 4; - TestDelay test_delay = 5; - VideoFrame video_frame = 6; - LoginRequest login_request = 7; - LoginResponse login_response = 8; - Hash hash = 9; - MouseEvent mouse_event = 10; - AudioFrame audio_frame = 11; - CursorData cursor_data = 12; - CursorPosition cursor_position = 13; - uint64 cursor_id = 14; - KeyEvent key_event = 15; - Clipboard clipboard = 16; - FileAction file_action = 17; - FileResponse file_response = 18; - Misc misc = 19; - Cliprdr cliprdr = 20; - MessageBox message_box = 21; - SwitchSidesResponse switch_sides_response = 22; - VoiceCallRequest voice_call_request = 23; - VoiceCallResponse voice_call_response = 24; - PeerInfo peer_info = 25; - PointerDeviceEvent pointer_device_event = 26; - Auth2FA auth_2fa = 27; - MultiClipboards multi_clipboards = 28; - ScreenshotRequest screenshot_request = 29; - ScreenshotResponse screenshot_response = 30; - TerminalAction terminal_action = 31; - TerminalResponse terminal_response = 32; - } -} - -message SignedId { - bytes id = 1; -} - -message IdPk { - string id = 1; - bytes pk = 2; -} - -message PublicKey { - bytes asymmetric_value = 1; - bytes symmetric_value = 2; -} - -message Hash { - string salt = 1; - string challenge = 2; -} - -message LoginRequest { - string username = 1; - bytes password = 2; - string my_id = 4; - string my_name = 5; - OptionMessage option = 6; - oneof union { - FileTransfer file_transfer = 7; - PortForward port_forward = 8; - ViewCamera view_camera = 15; - Terminal terminal = 16; - } - bool video_ack_required = 9; - uint64 session_id = 10; - string version = 11; - OSLogin os_login = 12; - string my_platform = 13; - bytes hwid = 14; - string avatar = 17; -} - -message LoginResponse { - oneof union { - string error = 1; - PeerInfo peer_info = 2; - } - bool enable_trusted_devices = 3; -} - -message PeerInfo { - string username = 1; - string hostname = 2; - string platform = 3; - repeated DisplayInfo displays = 4; - int32 current_display = 5; - bool sas_enabled = 6; - string version = 7; - Features features = 8; - SupportedEncoding encoding = 9; - SupportedResolutions resolutions = 10; - string platform_additions = 11; - WindowsSessions windows_sessions = 12; -} - -message DisplayInfo { - sint32 x = 1; - sint32 y = 2; - int32 width = 3; - int32 height = 4; - string name = 5; - bool online = 6; - bool cursor_embedded = 7; - Resolution original_resolution = 8; - double scale = 9; -} - -message Resolution { - int32 width = 1; - int32 height = 2; -} - -message Features { - bool privacy_mode = 1; - bool terminal = 2; -} - -message SupportedEncoding { - bool h264 = 1; - bool h265 = 2; - bool vp8 = 3; - bool av1 = 4; - CodecAbility i444 = 5; -} - -message CodecAbility { - bool vp8 = 1; - bool vp9 = 2; - bool av1 = 3; - bool h264 = 4; - bool h265 = 5; -} - -message SupportedResolutions { - repeated Resolution resolutions = 1; -} - -message WindowsSessions { - repeated WindowsSession sessions = 1; - uint32 current_sid = 2; -} - -message WindowsSession { - uint32 sid = 1; - string name = 2; -} - -message OptionMessage { - ImageQuality image_quality = 1; - BoolOption lock_after_session_end = 2; - BoolOption show_remote_cursor = 3; - BoolOption privacy_mode = 4; - int32 custom_image_quality = 5; - BoolOption disable_audio = 6; - BoolOption enable_file_transfer = 7; - BoolOption clipboard = 8; - SupportedDecoding supported_decoding = 9; - int32 custom_fps = 10; - BoolOption follow_remote_cursor = 11; - BoolOption follow_remote_window = 12; - BoolOption disable_camera = 13; - BoolOption block_input = 14; - BoolOption keyboard = 15; - BoolOption terminal_persistent = 16; - BoolOption show_my_cursor = 17; -} - -message SupportedDecoding { - bool ability_vp9 = 1; - bool ability_h264 = 2; - bool ability_h265 = 3; - bool ability_vp8 = 4; - bool ability_av1 = 5; - PreferCodec prefer = 6; - CodecAbility i444 = 7; - Chroma prefer_chroma = 8; -} - -message FileTransfer { - string dir = 1; - bool show_hidden = 2; -} - -message PortForward { - string host = 1; - int32 port = 2; -} - -message ViewCamera {} - -message Terminal { - string service_id = 1; -} - -message OSLogin { - string username = 1; - string password = 2; -} - -// ===== Video ===== - -message VideoFrame { - oneof union { - EncodedVideoFrames vp9s = 6; - RGB rgb = 7; - YUV yuv = 8; - EncodedVideoFrames h264s = 10; - EncodedVideoFrames h265s = 11; - EncodedVideoFrames vp8s = 12; - EncodedVideoFrames av1s = 13; - } - int32 display = 14; -} - -message EncodedVideoFrames { - repeated EncodedVideoFrame frames = 1; -} - -message EncodedVideoFrame { - bytes data = 1; - bool key = 2; - int64 pts = 3; -} - -message RGB { - bool compress = 1; -} - -message YUV { - bool compress = 1; - int32 stride = 2; -} - -// ===== Audio ===== - -message AudioFrame { - bytes data = 1; -} - -// ===== Input ===== - -message MouseEvent { - int32 mask = 1; - sint32 x = 2; - sint32 y = 3; - repeated ControlKey modifiers = 4; -} - -message KeyEvent { - bool down = 1; - bool press = 2; - oneof union { - ControlKey control_key = 3; - uint32 chr = 4; - uint32 unicode = 5; - string seq = 6; - uint32 win2win_hotkey = 7; - } - repeated ControlKey modifiers = 8; - KeyboardMode mode = 9; -} - -// ===== Cursor ===== - -message CursorData { - uint64 id = 1; - sint32 hotx = 2; - sint32 hoty = 3; - int32 width = 4; - int32 height = 5; - bytes colors = 6; -} - -message CursorPosition { - sint32 x = 1; - sint32 y = 2; -} - -// ===== Misc ===== - -message Misc { - oneof union { - ChatMessage chat_message = 1; - SwitchDisplay switch_display = 2; - PermissionInfo permission_info = 3; - Option option = 4; - AudioFormat audio_format = 5; - string close_reason = 6; - bool refresh_video = 7; - bool video_received = 8; - BackNotification back_notification = 9; - bool restart_remote_device = 10; - bool uac = 11; - bool foreground_window_elevated = 12; - bool stop_service = 13; - ElevationRequest elevation_request = 14; - bool elevation_response = 15; - bool portable_service_running = 16; - SwitchSidesRequest switch_sides_request = 17; - SwitchBack switch_back = 18; - ChangeResolution change_resolution = 19; - PluginRequest plugin_request = 20; - PluginFailure plugin_failure = 21; - bool full_speed_fps = 22; - bool auto_adjust_fps = 23; - bool client_record_status = 24; - CaptureDisplays capture_displays = 25; - int32 refresh_video_display = 26; - ToggleVirtualDisplay toggle_virtual_display = 27; - TogglePrivacyMode toggle_privacy_mode = 28; - SupportedEncoding supported_encoding = 29; - string selected_sid = 30; - DisplayResolution change_display_resolution = 31; - MessageQuery message_query = 32; - bool follow_current_display = 33; - } -} - -message ChatMessage { string text = 1; } - -message SwitchDisplay { - int32 display = 1; - sint32 x = 2; - sint32 y = 3; - int32 width = 4; - int32 height = 5; - bool cursor_embedded = 6; - SupportedResolutions resolutions = 7; - Resolution original_resolution = 8; -} - -message PermissionInfo { - enum Permission { - Keyboard = 0; - Clipboard = 2; - Audio = 3; - File = 4; - Restart = 5; - Recording = 6; - BlockInput = 7; - } - Permission permission = 1; - bool enabled = 2; -} - -message Option { string name = 1; string value = 2; } - -message AudioFormat { - uint32 sample_rate = 1; - uint32 channels = 2; -} - -message BackNotification { - oneof union { - PrivacyModeState privacy_mode_state = 1; - BlockInputState block_input_state = 2; - } - string details = 3; - string impl_key = 4; - enum PrivacyModeState { OFF = 0; ON = 1; BLANK_SCREEN = 2; } - enum BlockInputState { RUNNING = 0; ON = 1; OFF = 2; } -} - -message ElevationRequest { - oneof union { bool direct = 1; ElevationRequestWithLogon logon = 2; } -} - -message ElevationRequestWithLogon { string username = 1; string password = 2; } - -message SwitchSidesRequest { bytes uuid = 1; } -message SwitchBack {} - -message ChangeResolution { Resolution resolution = 1; } - -message PluginRequest { string id = 1; bytes content = 2; } -message PluginFailure { string id = 1; string name = 2; string msg = 3; } - -message CaptureDisplays { - repeated int32 set = 1; - repeated int32 add = 2; - repeated int32 sub = 3; -} - -message ToggleVirtualDisplay { int32 display = 1; bool on = 2; } - -message TogglePrivacyMode { string impl_key = 1; bool on = 2; } - -message DisplayResolution { int32 display = 1; Resolution resolution = 2; } -message MessageQuery { int32 switch_display = 1; } - -// ===== Clipboard ===== - -message Clipboard { - enum ClipboardFormat { - Text = 0; - Rtf = 1; - Html = 2; - ImageRgba = 21; - ImagePng = 22; - ImageSvg = 23; - Special = 31; - } - bool compress = 1; - repeated ClipboardContent contents = 2; -} - -message ClipboardContent { - Clipboard.ClipboardFormat format = 1; - bytes data = 2; -} - -// ===== File Transfer ===== - -message FileAction { - oneof union { - ReadDir read_dir = 1; - FileTransferSendRequest send = 2; - FileTransferReceiveRequest receive = 3; - FileDirCreate create = 4; - FileRemoveDir remove_dir = 5; - FileRemoveFile remove_file = 6; - ReadAllFiles all_files = 7; - FileTransferCancel cancel = 8; - FileTransferSendConfirmRequest send_confirm = 9; - FileRename rename = 10; - ReadEmptyDirs read_empty_dirs = 11; - } -} - -message ReadDir { string path = 1; bool include_hidden = 2; } -message ReadAllFiles { string id = 1; string path = 2; bool include_hidden = 3; } -message ReadEmptyDirs { string id = 1; string path = 2; bool include_hidden = 3; } -message FileDirCreate { string id = 1; string path = 2; } -message FileRemoveDir { string id = 1; string path = 2; bool recursive = 3; } -message FileRemoveFile { string id = 1; string path = 2; sint32 file_num = 3; } -message FileRename { string id = 1; string path = 2; string new_name = 3; } - -message FileTransferSendRequest { - string id = 1; - string path = 2; - bool include_hidden = 3; - sint32 file_num = 4; - enum FileType { Generic = 0; Printer = 1; } - FileType file_type = 5; -} - -message FileTransferReceiveRequest { - string id = 1; - string path = 2; - repeated FileEntry files = 3; - sint32 file_num = 4; - uint64 total_size = 5; -} - -message FileTransferSendConfirmRequest { - string id = 1; - sint32 file_num = 2; - oneof union { - bool skip = 3; - uint32 offset_blk = 4; - } -} - -message FileTransferCancel { string id = 1; } - -message FileResponse { - oneof union { - FileDirectory dir = 1; - FileTransferBlock block = 2; - FileTransferError error = 3; - FileTransferDone done = 4; - FileTransferDigest digest = 5; - ReadEmptyDirsResponse empty_dirs = 6; - } -} - -message FileDirectory { - string id = 1; - string path = 2; - repeated FileEntry entries = 3; -} - -message FileEntry { - enum FileType { - Dir = 0; - DirLink = 2; - DirDrive = 3; - File = 4; - FileLink = 5; - } - FileType entry_type = 1; - string name = 2; - bool is_hidden = 3; - uint64 size = 4; - uint64 modified_time = 5; -} - -message FileTransferBlock { - string id = 1; - sint32 file_num = 2; - bytes data = 3; - bool compressed = 4; - uint32 blk_id = 5; -} - -message FileTransferError { string id = 1; string error = 2; sint32 file_num = 3; } -message FileTransferDone { string id = 1; sint32 file_num = 2; } - -message FileTransferDigest { - string id = 1; - sint32 file_num = 2; - uint64 last_modified = 3; - uint64 file_size = 4; - bool is_upload = 5; - bool is_identical = 6; - uint64 transferred_size = 7; - bool is_resume = 8; -} - -message ReadEmptyDirsResponse { - string path = 1; - repeated FileDirectory empty_dirs = 2; -} - -// ===== Test Delay ===== - -message TestDelay { - int64 time = 1; - bool from_client = 2; - int32 last_delay = 3; - int32 target_bitrate = 4; -} - -// ===== Auth ===== - -message Auth2FA { string code = 1; bytes hwid = 2; } - -// ===== Terminal ===== - -message TerminalAction { - oneof union { - OpenTerminal open = 1; - TerminalData data = 2; - ResizeTerminal resize = 3; - CloseTerminal close = 4; - } -} - -message TerminalResponse { - oneof union { - TerminalOpened opened = 1; - TerminalData data = 2; - TerminalClosed closed = 3; - TerminalError error = 4; - } -} - -message OpenTerminal { int32 terminal_id = 1; uint32 rows = 2; uint32 cols = 3; } -message TerminalData { int32 terminal_id = 1; bytes data = 2; bool compressed = 3; } -message ResizeTerminal { int32 terminal_id = 1; uint32 rows = 2; uint32 cols = 3; } -message CloseTerminal { int32 terminal_id = 1; } -message TerminalOpened { int32 terminal_id = 1; bool success = 2; string message = 3; } -message TerminalClosed { int32 terminal_id = 1; int32 exit_code = 2; } -message TerminalError { int32 terminal_id = 1; string message = 2; } - -// ===== Others ===== - -message MessageBox { - string msgtype = 1; - string title = 2; - string text = 3; - string link = 4; -} - -message PointerDeviceEvent { - TouchEvent touch = 1; - repeated ControlKey modifiers = 2; -} - -message TouchEvent { - oneof union { - TouchScaleUpdate scale_update = 1; - TouchPanStart pan_start = 2; - TouchPanUpdate pan_update = 3; - TouchPanEnd pan_end = 4; - TouchEnd end = 5; - } -} - -message TouchScaleUpdate { int32 scale = 1; } -message TouchPanStart { sint32 x = 1; sint32 y = 2; } -message TouchPanUpdate { sint32 x = 1; sint32 y = 2; } -message TouchPanEnd { sint32 x = 1; sint32 y = 2; } -message TouchEnd { sint32 x = 1; sint32 y = 2; } - -message ScreenshotRequest { int32 display = 1; uint64 sid = 2; } -message ScreenshotResponse { uint64 sid = 1; string msg = 2; bytes data = 3; } - -message SwitchSidesResponse { bytes uuid = 1; LoginRequest lr = 2; } - -message VoiceCallRequest { int64 req_timestamp = 1; bool is_connect = 2; } -message VoiceCallResponse { bool accepted = 1; int64 req_timestamp = 2; int64 ack_timestamp = 3; } - -message MultiClipboards { repeated Clipboard clipboards = 1; } - -message Cliprdr { - oneof union { - CliprdrMonitorReady ready = 1; - CliprdrServerFormatList format_list = 2; - CliprdrServerFormatListResponse format_list_response = 3; - CliprdrServerFormatDataRequest format_data_request = 4; - CliprdrServerFormatDataResponse format_data_response = 5; - CliprdrFileContentsRequest file_contents_request = 6; - CliprdrFileContentsResponse file_contents_response = 7; - CliprdrTryEmpty try_empty = 8; - CliprdrFiles files = 9; - } -} - -message CliprdrMonitorReady {} -message CliprdrServerFormatList { repeated CliprdrFormat formats = 1; } -message CliprdrFormat { int32 id = 1; string format = 2; } -message CliprdrServerFormatListResponse { int32 msg_flags = 1; } -message CliprdrServerFormatDataRequest { int32 requested_format_id = 1; } -message CliprdrServerFormatDataResponse { int32 msg_flags = 1; bytes format_data = 2; } -message CliprdrTryEmpty {} -message CliprdrFiles { repeated CliprdrFile files = 1; } -message CliprdrFile { string name = 1; uint64 size = 2; } -message CliprdrFileContentsRequest { - uint32 stream_id = 1; - uint32 list_index = 2; - uint32 dw_flags = 3; - uint64 n_position_low = 4; - uint64 n_position_high = 5; - uint32 cb_requested = 6; - bool have_clip_data_id = 7; - uint32 clip_data_id = 8; -} -message CliprdrFileContentsResponse { - int32 msg_flags = 1; - uint32 stream_id = 2; - bytes requested_data = 3; -} -`; - - let root = null; - let RendezvousMessage = null; - let Message = null; - - /** - * Initialize protobuf definitions. Must be called after protobuf.js is loaded. - */ - function init() { - try { - root = protobuf.Root.fromJSON(protobuf.parse(PROTO_TEXT).toJSON()); - RendezvousMessage = root.lookupType('hbb.RendezvousMessage'); - Message = root.lookupType('hbb.Message'); - console.log('[RDProto] Protocol definitions loaded successfully'); - return true; - } catch (e) { - console.error('[RDProto] Failed to load protocol definitions:', e); - return false; - } - } - - /** - * Lookup a message type by name - */ - function lookup(name) { - return root.lookupType(`hbb.${name}`); - } - - /** - * Encode a RendezvousMessage to bytes - */ - function encodeRendezvousMsg(data) { - const errMsg = RendezvousMessage.verify(data); - if (errMsg) throw new Error(`RendezvousMessage verify error: ${errMsg}`); - const msg = RendezvousMessage.create(data); - return RendezvousMessage.encode(msg).finish(); - } - - /** - * Decode a RendezvousMessage from bytes - */ - function decodeRendezvousMsg(bytes) { - return RendezvousMessage.decode(new Uint8Array(bytes)); - } - - /** - * Encode a Message to bytes - */ - function encodeMsg(data) { - const errMsg = Message.verify(data); - if (errMsg) throw new Error(`Message verify error: ${errMsg}`); - const msg = Message.create(data); - return Message.encode(msg).finish(); - } - - /** - * Decode a Message from bytes - */ - function decodeMsg(bytes) { - return Message.decode(new Uint8Array(bytes)); - } - - /** - * Get the active union field name from a message - */ - function getActiveField(msg) { - if (msg.union === null || msg.union === undefined) return null; - // protobuf.js oneof: check which field is set - const oneofFields = msg.$type.oneofs; - if (oneofFields && oneofFields.union) { - return oneofFields.union.oneof.find(f => msg[f] != null); - } - return null; - } - - /** - * Helper: Create a TestDelay message for latency measurement - */ - function createTestDelay(fromClient = true, lastDelay = 0) { - return { - test_delay: { - time: BigInt(Date.now()), - from_client: fromClient, - last_delay: lastDelay - } - }; - } - - /** - * Helper: Create a MouseEvent - */ - function createMouseEvent(mask, x, y, modifiers = []) { - return { - mouse_event: { - mask: mask, - x: x, - y: y, - modifiers: modifiers - } - }; - } - - /** - * Helper: Create a KeyEvent (legacy mode) - */ - function createKeyEvent(controlKey, down, press = false, modifiers = []) { - return { - key_event: { - control_key: controlKey, - down: down, - press: press, - modifiers: modifiers, - mode: 0 // Legacy - } - }; - } - - /** - * Helper: Create a KeyEvent with character - */ - function createCharKeyEvent(chr, down, press = false, modifiers = []) { - return { - key_event: { - chr: chr, - down: down, - press: press, - modifiers: modifiers, - mode: 0 // Legacy - } - }; - } - - /** - * Helper: Create a LoginRequest - */ - function createLoginRequest(myId, myName, password, peerPlatform, version) { - return { - login_request: { - my_id: myId, - my_name: myName, - password: password, - my_platform: peerPlatform || 'Web', - version: version || '1.3.6', - option: { - image_quality: 0, // NotSet - show_remote_cursor: 1, // Yes - privacy_mode: 0, - disable_audio: 0, - enable_file_transfer: 1, - clipboard: 1, - supported_decoding: { - ability_vp9: true, - ability_h264: false, - ability_h265: false, - ability_vp8: true, - ability_av1: true, - prefer: 0, // Auto - } - } - } - }; - } - - /** - * Helper: Create a LoginRequest for password auth - */ - function createPasswordLogin(myId, myName, hashedPassword, peerPlatform, version) { - return createLoginRequest(myId, myName, hashedPassword, peerPlatform, version); - } - - /** - * Helper: Create a Clipboard message - */ - function createClipboard(text) { - const encoder = new TextEncoder(); - return { - clipboard: { - contents: [{ - format: 0, // Text - data: encoder.encode(text) - }] - } - }; - } - - return { - init, - lookup, - encodeRendezvousMsg, - decodeRendezvousMsg, - encodeMsg, - decodeMsg, - getActiveField, - createTestDelay, - createMouseEvent, - createKeyEvent, - createCharKeyEvent, - createLoginRequest, - createPasswordLogin, - createClipboard, - // Expose type references - get Message() { return Message; }, - get RendezvousMessage() { return RendezvousMessage; }, - get root() { return root; } - }; -})(); diff --git a/shelled/rustdesk-web-client/js/video.js b/shelled/rustdesk-web-client/js/video.js deleted file mode 100644 index b61f671..0000000 --- a/shelled/rustdesk-web-client/js/video.js +++ /dev/null @@ -1,409 +0,0 @@ -/** - * RustDesk Standalone Web Client - Video Decoder - * - * Handles video decoding using ogvjs (VP8/VP9/AV1 WebAssembly decoders) - * and rendering to canvas using yuv-canvas (WebGL YUV→RGB conversion). - */ - -const RDVideo = (() => { - let _canvas = null; - let _ctx = null; - let _yuvCanvas = null; - let _decoders = {}; // Codec-specific decoders - let _currentCodec = null; // Currently active codec - let _displayWidth = 0; - let _displayHeight = 0; - let _lastRenderTime = 0; - let _frameCount = 0; - let _fpsCounter = 0; - let _fpsTime = 0; - let _currentFps = 0; - let _ogvSupport = null; - - // Supported codecs - const CODEC = { - VP8: 'vp8', - VP9: 'vp9', - AV1: 'av1', - H264: 'h264', - H265: 'h265' - }; - - /** - * Initialize video subsystem - * @param {HTMLCanvasElement} canvas - The canvas to render to - */ - function init(canvas) { - _canvas = canvas; - _ctx = canvas.getContext('2d'); - _yuvCanvas = new YUVCanvas({ - canvas: canvas, - webgl: true - }); - _fpsTime = performance.now(); - - console.log('[RDVideo] Initialized with canvas:', canvas.width, 'x', canvas.height); - return true; - } - - /** - * Initialize a video decoder for the given codec - */ - function initDecoder(codec) { - if (_decoders[codec]) return _decoders[codec]; - - console.log('[RDVideo] Initializing decoder for codec:', codec); - - try { - switch (codec) { - case CODEC.VP9: - _decoders[codec] = createOgvVideoDecoder('ogv-decoder-video-vp9-wasm'); - _currentCodec = codec; - break; - case CODEC.VP8: - _decoders[codec] = createOgvVideoDecoder('ogv-decoder-video-vp8-wasm'); - _currentCodec = codec; - break; - case CODEC.AV1: - _decoders[codec] = createOgvVideoDecoder('ogv-decoder-video-av1-wasm'); - _currentCodec = codec; - break; - default: - console.warn('[RDVideo] Unsupported codec:', codec); - return null; - } - return _decoders[codec]; - } catch (e) { - console.error('[RDVideo] Failed to init decoder for', codec, ':', e); - return null; - } - } - - /** - * Create an ogvjs video decoder - */ - function createOgvVideoDecoder(moduleName) { - // ogvjs uses a specific API for creating decoders - // We need to use the OGVDecoderVideoVPx or similar classes - if (typeof OGVDecoderVideoVP9 !== 'undefined') { - const decoderClass = { - 'ogv-decoder-video-vp9-wasm': OGVDecoderVideoVP9, - 'ogv-decoder-video-vp8-wasm': OGVDecoderVideoVP8, - 'ogv-decoder-video-av1-wasm': OGVDecoderVideoAV1, - }[moduleName]; - - if (decoderClass) { - const decoder = new decoderClass({ - type: moduleName, - }); - // Process any loaded frames - decoder.onvideo = function(frame) { - processDecodedFrame(frame); - }; - return decoder; - } - } - - // Fallback: create a frame processor that processes raw video data - console.warn('[RDVideo] ogvjs decoder classes not available, using fallback'); - return { - codec: moduleName, - processFrame: processFallbackFrame - }; - } - - /** - * Process a decoded video frame and render it - */ - function processDecodedFrame(frame) { - if (!frame || !frame.format) return; - - const width = frame.format.width; - const height = frame.format.height; - - if (width !== _displayWidth || height !== _displayHeight) { - _displayWidth = width; - _displayHeight = height; - _canvas.width = width; - _canvas.height = height; - console.log('[RDVideo] Display size changed:', width, 'x', height); - } - - // ogvjs provides frames in YUV420 format - // YUV data: frame.buf (planar Y, U, V) - if (frame.pixels) { - // RGBA data available directly - const imageData = new ImageData( - new Uint8ClampedArray(frame.pixels), - width, - height - ); - _ctx.putImageData(imageData, 0, 0); - } else if (frame.frames && frame.frames.length > 0 && frame.frames[0].buf) { - // YUV data - use yuv-canvas for WebGL rendering - const yuvFrame = frame.frames[0]; - renderYUV(yuvFrame.buf, width, height); - } - - updateFps(); - } - - /** - * Process a fallback frame (raw RGB/YUV data) - */ - function processFallbackFrame(data, width, height) { - if (!data || !data.byteLength) return; - - // Try to render as RGBA - if (_canvas.width !== width || _canvas.height !== height) { - _displayWidth = width; - _displayHeight = height; - _canvas.width = width; - _canvas.height = height; - } - - const imageData = new ImageData( - new Uint8ClampedArray(data.buffer || data), - width, - height - ); - _ctx.putImageData(imageData, 0, 0); - updateFps(); - } - - /** - * Render YUV data to canvas using WebGL - */ - function renderYUV(yuvData, width, height) { - if (!_yuvCanvas) return; - - try { - // YUV420 layout: Y plane (width*height), U plane (width*height/4), V plane (width*height/4) - const ySize = width * height; - const uvSize = ySize / 4; - - const yPlane = new Uint8Array(yuvData.buffer || yuvData, 0, ySize); - const uPlane = new Uint8Array(yuvData.buffer || yuvData, ySize, uvSize); - const vPlane = new Uint8Array(yuvData.buffer || yuvData, ySize + uvSize, uvSize); - - _yuvCanvas.drawFrame({ - format: { - width: width, - height: height, - chromaWidth: width / 2, - chromaHeight: height / 2, - chromaPitch: width / 2, - lumaPitch: width, - cropLeft: 0, - cropTop: 0, - cropWidth: width, - cropHeight: height, - bitDepth: 8 - }, - planes: [ - { data: yPlane, stride: width }, - { data: uPlane, stride: width / 2 }, - { data: vPlane, stride: width / 2 } - ], - time: { low: Date.now() % 0x100000000, high: 0 } - }); - } catch (e) { - console.error('[RDVideo] YUV render failed:', e); - // Fallback to 2D canvas - const ySize = width * height; - const yPlane = new Uint8Array(yuvData.buffer || yuvData, 0, ySize); - renderYUVToRGBA(yPlane, width, height); - } - } - - /** - * Fallback YUV to RGBA conversion using 2D canvas - */ - function renderYUVToRGBA(yPlane, width, height) { - const imageData = _ctx.createImageData(width, height); - const data = imageData.data; - - for (let i = 0; i < width * height; i++) { - const y = yPlane[i]; - const idx = i * 4; - // Simple grayscale (no U/V in this fallback) - data[idx] = y; - data[idx + 1] = y; - data[idx + 2] = y; - data[idx + 3] = 255; - } - - _ctx.putImageData(imageData, 0, 0); - } - - /** - * Handle incoming VideoFrame from the session - * @param {Object} videoFrame - Decoded protobuf VideoFrame - */ - function handleVideoFrame(videoFrame) { - if (!videoFrame) return; - - const display = videoFrame.display || 0; - - // Check for VP9 frames - if (videoFrame.vp9s && videoFrame.vp9s.frames && videoFrame.vp9s.frames.length > 0) { - const codec = CODEC.VP9; - if (_currentCodec !== codec) initDecoder(codec); - processEncodedFrames(videoFrame.vp9s.frames, codec); - return; - } - - // Check for VP8 frames - if (videoFrame.vp8s && videoFrame.vp8s.frames && videoFrame.vp8s.frames.length > 0) { - const codec = CODEC.VP8; - if (_currentCodec !== codec) initDecoder(codec); - processEncodedFrames(videoFrame.vp8s.frames, codec); - return; - } - - // Check for AV1 frames - if (videoFrame.av1s && videoFrame.av1s.frames && videoFrame.av1s.frames.length > 0) { - const codec = CODEC.AV1; - if (_currentCodec !== codec) initDecoder(codec); - processEncodedFrames(videoFrame.av1s.frames, codec); - return; - } - - // Check for raw RGB - if (videoFrame.rgb) { - // RGB data comes as the raw protobuf payload after the RGB message - // In practice, the raw data is appended after the VideoFrame message - console.log('[RDVideo] RGB frame received (not fully supported)'); - return; - } - - // Check for raw YUV - if (videoFrame.yuv) { - // Similar to RGB, YUV data is appended - console.log('[RDVideo] YUV frame received (not fully supported)'); - return; - } - - // H264/H265 not supported in browser without WASM decoders - if (videoFrame.h264s) { - console.log('[RDVideo] H.264 frame received (not supported in browser)'); - } - if (videoFrame.h265s) { - console.log('[RDVideo] H.265 frame received (not supported in browser)'); - } - } - - /** - * Process encoded video frames through the decoder - */ - function processEncodedFrames(frames, codec) { - const decoder = _decoders[codec]; - if (!decoder) { - console.warn('[RDVideo] No decoder for codec:', codec); - return; - } - - for (const frame of frames) { - if (!frame.data || frame.data.byteLength === 0) continue; - - try { - if (decoder.processFrame) { - // Custom fallback decoder - // Try to determine frame dimensions from data - // VP9 bitstream: first bytes contain frame header - // For now, just log - _frameCount++; - } else if (decoder instanceof OGVDecoderVideoVP9 || - decoder instanceof OGVDecoderVideoVP8 || - decoder instanceof OGVDecoderVideoAV1) { - // ogvjs native decoder - decoder.processHeader(frame.data); - // Check if decoder has loaded header info for dimensions - } - } catch (e) { - console.error('[RDVideo] Frame decode error:', e); - } - } - } - - /** - * Process raw RGBA data (from fallback/secondary path) - * @param {Uint8Array} rgba - RGBA pixel data - * @param {number} width - Frame width - * @param {number} height - Frame height - */ - function processRGBA(rgba, width, height) { - if (_canvas.width !== width || _canvas.height !== height) { - _canvas.width = width; - _canvas.height = height; - _displayWidth = width; - _displayHeight = height; - } - - const imageData = new ImageData( - new Uint8ClampedArray(rgba.buffer || rgba), - width, - height - ); - _ctx.putImageData(imageData, 0, 0); - updateFps(); - } - - /** - * Update FPS counter - */ - function updateFps() { - _frameCount++; - _fpsCounter++; - const now = performance.now(); - if (now - _fpsTime >= 1000) { - _currentFps = _fpsCounter; - _fpsCounter = 0; - _fpsTime = now; - } - } - - /** - * Get current FPS - */ - function getFps() { - return _currentFps; - } - - /** - * Resize the canvas - */ - function resize(width, height) { - if (_canvas) { - _canvas.width = width; - _canvas.height = height; - } - } - - /** - * Get current display dimensions - */ - function getDisplaySize() { - return { width: _displayWidth, height: _displayHeight }; - } - - /** - * Take a screenshot of the current canvas - */ - function screenshot() { - if (!_canvas) return null; - return _canvas.toDataURL('image/png'); - } - - return { - CODEC, - init, - handleVideoFrame, - processRGBA, - resize, - getDisplaySize, - getFps, - screenshot, - get canvas() { return _canvas; } - }; -})(); diff --git a/shelled/rustdesk-web-client/lib/libopus.js b/shelled/rustdesk-web-client/lib/libopus.js deleted file mode 100644 index 5b0ff49..0000000 --- a/shelled/rustdesk-web-client/lib/libopus.js +++ /dev/null @@ -1,5555 +0,0 @@ - - -// The Module object: Our interface to the outside world. We import -// and export values on it. There are various ways Module can be used: -// 1. Not defined. We create it here -// 2. A function parameter, function(Module) { ..generated code.. } -// 3. pre-run appended it, var Module = {}; ..generated code.. -// 4. External script tag defines var Module. -// We need to check if Module already exists (e.g. case 3 above). -// Substitution will be replaced with actual code on later stage of the build, -// this way Closure Compiler will not mangle it (e.g. case 4. above). -// Note that if you want to run closure, and also to use Module -// after the generated code, you will need to define var Module = {}; -// before the code. Then that object will be used in the code, and you -// can continue to use Module afterwards as well. -var Module = typeof Module !== 'undefined' ? Module : {}; - -// See https://caniuse.com/mdn-javascript_builtins_object_assign -var objAssign = Object.assign; - -// --pre-jses are emitted after the Module integration code, so that they can -// refer to Module (if they choose; they can also define Module) -Module["onRuntimeInitialized"] = function(){ - if(Module.onload) - Module.onload(); - Module.loaded = true; -} - -Module["locateFile"] = function(url){ - if(url == "libopus.wasm" && typeof LIBOPUS_WASM_URL != "undefined") - return LIBOPUS_WASM_URL; - else - return url; -} - - -// Sometimes an existing Module object exists with properties -// meant to overwrite the default module functionality. Here -// we collect those properties and reapply _after_ we configure -// the current environment's defaults to avoid having to be so -// defensive during initialization. -var moduleOverrides = objAssign({}, Module); - -var arguments_ = []; -var thisProgram = './this.program'; -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -// Determine the runtime environment we are in. You can customize this by -// setting the ENVIRONMENT setting at compile time (see settings.js). - -// Attempt to auto-detect the environment -var ENVIRONMENT_IS_WEB = typeof window === 'object'; -var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; -// N.b. Electron.js environment is simultaneously a NODE-environment, but -// also a web environment. -var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string'; -var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; - -if (Module['ENVIRONMENT']) { - throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)'); -} - -// `/` should be present at the end if `scriptDirectory` is not empty -var scriptDirectory = ''; -function locateFile(path) { - if (Module['locateFile']) { - return Module['locateFile'](path, scriptDirectory); - } - return scriptDirectory + path; -} - -// Hooks that are implemented differently in different runtime environments. -var read_, - readAsync, - readBinary, - setWindowTitle; - -// Normally we don't log exceptions but instead let them bubble out the top -// level where the embedding environment (e.g. the browser) can handle -// them. -// However under v8 and node we sometimes exit the process direcly in which case -// its up to use us to log the exception before exiting. -// If we fix https://github.com/emscripten-core/emscripten/issues/15080 -// this may no longer be needed under node. -function logExceptionOnExit(e) { - if (e instanceof ExitStatus) return; - let toLog = e; - if (e && typeof e === 'object' && e.stack) { - toLog = [e, e.stack]; - } - err('exiting due to exception: ' + toLog); -} - -var fs; -var nodePath; -var requireNodeFS; - -if (ENVIRONMENT_IS_NODE) { - if (!(typeof process === 'object' && typeof require === 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); - if (ENVIRONMENT_IS_WORKER) { - scriptDirectory = require('path').dirname(scriptDirectory) + '/'; - } else { - scriptDirectory = __dirname + '/'; - } - -// include: node_shell_read.js - - -requireNodeFS = () => { - // Use nodePath as the indicator for these not being initialized, - // since in some environments a global fs may have already been - // created. - if (!nodePath) { - fs = require('fs'); - nodePath = require('path'); - } -}; - -read_ = function shell_read(filename, binary) { - requireNodeFS(); - filename = nodePath['normalize'](filename); - return fs.readFileSync(filename, binary ? null : 'utf8'); -}; - -readBinary = (filename) => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - assert(ret.buffer); - return ret; -}; - -readAsync = (filename, onload, onerror) => { - requireNodeFS(); - filename = nodePath['normalize'](filename); - fs.readFile(filename, function(err, data) { - if (err) onerror(err); - else onload(data.buffer); - }); -}; - -// end include: node_shell_read.js - if (process['argv'].length > 1) { - thisProgram = process['argv'][1].replace(/\\/g, '/'); - } - - arguments_ = process['argv'].slice(2); - - if (typeof module !== 'undefined') { - module['exports'] = Module; - } - - process['on']('uncaughtException', function(ex) { - // suppress ExitStatus exceptions from showing an error - if (!(ex instanceof ExitStatus)) { - throw ex; - } - }); - - // Without this older versions of node (< v15) will log unhandled rejections - // but return 0, which is not normally the desired behaviour. This is - // not be needed with node v15 and about because it is now the default - // behaviour: - // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode - process['on']('unhandledRejection', function(reason) { throw reason; }); - - quit_ = (status, toThrow) => { - if (keepRuntimeAlive()) { - process['exitCode'] = status; - throw toThrow; - } - logExceptionOnExit(toThrow); - process['exit'](status); - }; - - Module['inspect'] = function () { return '[Emscripten Module object]'; }; - -} else -if (ENVIRONMENT_IS_SHELL) { - - if ((typeof process === 'object' && typeof require === 'function') || typeof window === 'object' || typeof importScripts === 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); - - if (typeof read != 'undefined') { - read_ = function shell_read(f) { - return read(f); - }; - } - - readBinary = function readBinary(f) { - let data; - if (typeof readbuffer === 'function') { - return new Uint8Array(readbuffer(f)); - } - data = read(f, 'binary'); - assert(typeof data === 'object'); - return data; - }; - - readAsync = function readAsync(f, onload, onerror) { - setTimeout(() => onload(readBinary(f)), 0); - }; - - if (typeof scriptArgs != 'undefined') { - arguments_ = scriptArgs; - } else if (typeof arguments != 'undefined') { - arguments_ = arguments; - } - - if (typeof quit === 'function') { - quit_ = (status, toThrow) => { - logExceptionOnExit(toThrow); - quit(status); - }; - } - - if (typeof print !== 'undefined') { - // Prefer to use print/printErr where they exist, as they usually work better. - if (typeof console === 'undefined') console = /** @type{!Console} */({}); - console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); - console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr !== 'undefined' ? printErr : print); - } - -} else - -// Note that this includes Node.js workers when relevant (pthreads is enabled). -// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and -// ENVIRONMENT_IS_NODE. -if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { - if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled - scriptDirectory = self.location.href; - } else if (typeof document !== 'undefined' && document.currentScript) { // web - scriptDirectory = document.currentScript.src; - } - // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. - // otherwise, slice off the final part of the url to find the script directory. - // if scriptDirectory does not contain a slash, lastIndexOf will return -1, - // and scriptDirectory will correctly be replaced with an empty string. - // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), - // they are removed because they could contain a slash. - if (scriptDirectory.indexOf('blob:') !== 0) { - scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1); - } else { - scriptDirectory = ''; - } - - if (!(typeof window === 'object' || typeof importScripts === 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); - - // Differentiate the Web Worker from the Node Worker case, as reading must - // be done differently. - { -// include: web_or_worker_shell_read.js - - - read_ = (url) => { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - xhr.send(null); - return xhr.responseText; - } - - if (ENVIRONMENT_IS_WORKER) { - readBinary = (url) => { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - xhr.responseType = 'arraybuffer'; - xhr.send(null); - return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); - }; - } - - readAsync = (url, onload, onerror) => { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.onload = () => { - if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 - onload(xhr.response); - return; - } - onerror(); - }; - xhr.onerror = onerror; - xhr.send(null); - } - -// end include: web_or_worker_shell_read.js - } - - setWindowTitle = (title) => document.title = title; -} else -{ - throw new Error('environment detection error'); -} - -var out = Module['print'] || console.log.bind(console); -var err = Module['printErr'] || console.warn.bind(console); - -// Merge back in the overrides -objAssign(Module, moduleOverrides); -// Free the object hierarchy contained in the overrides, this lets the GC -// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. -moduleOverrides = null; - -// Emit code to handle expected values on the Module object. This applies Module.x -// to the proper local x. This has two benefits: first, we only emit it if it is -// expected to arrive, and second, by using a local everywhere else that can be -// minified. - -if (Module['arguments']) arguments_ = Module['arguments']; -if (!Object.getOwnPropertyDescriptor(Module, 'arguments')) { - Object.defineProperty(Module, 'arguments', { - configurable: true, - get: function() { - abort('Module.arguments has been replaced with plain arguments_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (Module['thisProgram']) thisProgram = Module['thisProgram']; -if (!Object.getOwnPropertyDescriptor(Module, 'thisProgram')) { - Object.defineProperty(Module, 'thisProgram', { - configurable: true, - get: function() { - abort('Module.thisProgram has been replaced with plain thisProgram (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (Module['quit']) quit_ = Module['quit']; -if (!Object.getOwnPropertyDescriptor(Module, 'quit')) { - Object.defineProperty(Module, 'quit', { - configurable: true, - get: function() { - abort('Module.quit has been replaced with plain quit_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message -// Assertions on removed incoming Module JS APIs. -assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); -assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); -assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); -assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); -assert(typeof Module['read'] === 'undefined', 'Module.read option was removed (modify read_ in JS)'); -assert(typeof Module['readAsync'] === 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); -assert(typeof Module['readBinary'] === 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); -assert(typeof Module['setWindowTitle'] === 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); -assert(typeof Module['TOTAL_MEMORY'] === 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); - -if (!Object.getOwnPropertyDescriptor(Module, 'read')) { - Object.defineProperty(Module, 'read', { - configurable: true, - get: function() { - abort('Module.read has been replaced with plain read_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (!Object.getOwnPropertyDescriptor(Module, 'readAsync')) { - Object.defineProperty(Module, 'readAsync', { - configurable: true, - get: function() { - abort('Module.readAsync has been replaced with plain readAsync (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (!Object.getOwnPropertyDescriptor(Module, 'readBinary')) { - Object.defineProperty(Module, 'readBinary', { - configurable: true, - get: function() { - abort('Module.readBinary has been replaced with plain readBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (!Object.getOwnPropertyDescriptor(Module, 'setWindowTitle')) { - Object.defineProperty(Module, 'setWindowTitle', { - configurable: true, - get: function() { - abort('Module.setWindowTitle has been replaced with plain setWindowTitle (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} -var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; -var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; -var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; -var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; - - -assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-s ENVIRONMENT` to enable."); - - - - -var STACK_ALIGN = 16; -var POINTER_SIZE = 4; - -function getNativeTypeSize(type) { - switch (type) { - case 'i1': case 'i8': return 1; - case 'i16': return 2; - case 'i32': return 4; - case 'i64': return 8; - case 'float': return 4; - case 'double': return 8; - default: { - if (type[type.length - 1] === '*') { - return POINTER_SIZE; - } else if (type[0] === 'i') { - const bits = Number(type.substr(1)); - assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); - return bits / 8; - } else { - return 0; - } - } - } -} - -function warnOnce(text) { - if (!warnOnce.shown) warnOnce.shown = {}; - if (!warnOnce.shown[text]) { - warnOnce.shown[text] = 1; - err(text); - } -} - -// include: runtime_functions.js - - -// Wraps a JS function as a wasm function with a given signature. -function convertJsFunctionToWasm(func, sig) { - - // If the type reflection proposal is available, use the new - // "WebAssembly.Function" constructor. - // Otherwise, construct a minimal wasm module importing the JS function and - // re-exporting it. - if (typeof WebAssembly.Function === "function") { - var typeNames = { - 'i': 'i32', - 'j': 'i64', - 'f': 'f32', - 'd': 'f64' - }; - var type = { - parameters: [], - results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] - }; - for (var i = 1; i < sig.length; ++i) { - type.parameters.push(typeNames[sig[i]]); - } - return new WebAssembly.Function(type, func); - } - - // The module is static, with the exception of the type section, which is - // generated based on the signature passed in. - var typeSection = [ - 0x01, // id: section, - 0x00, // length: 0 (placeholder) - 0x01, // count: 1 - 0x60, // form: func - ]; - var sigRet = sig.slice(0, 1); - var sigParam = sig.slice(1); - var typeCodes = { - 'i': 0x7f, // i32 - 'j': 0x7e, // i64 - 'f': 0x7d, // f32 - 'd': 0x7c, // f64 - }; - - // Parameters, length + signatures - typeSection.push(sigParam.length); - for (var i = 0; i < sigParam.length; ++i) { - typeSection.push(typeCodes[sigParam[i]]); - } - - // Return values, length + signatures - // With no multi-return in MVP, either 0 (void) or 1 (anything else) - if (sigRet == 'v') { - typeSection.push(0x00); - } else { - typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); - } - - // Write the overall length of the type section back into the section header - // (excepting the 2 bytes for the section id and length) - typeSection[1] = typeSection.length - 2; - - // Rest of the module is static - var bytes = new Uint8Array([ - 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") - 0x01, 0x00, 0x00, 0x00, // version: 1 - ].concat(typeSection, [ - 0x02, 0x07, // import section - // (import "e" "f" (func 0 (type 0))) - 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, - 0x07, 0x05, // export section - // (export "f" (func 0 (type 0))) - 0x01, 0x01, 0x66, 0x00, 0x00, - ])); - - // We can compile this wasm module synchronously because it is very small. - // This accepts an import (at "e.f"), that it reroutes to an export (at "f") - var module = new WebAssembly.Module(bytes); - var instance = new WebAssembly.Instance(module, { - 'e': { - 'f': func - } - }); - var wrappedFunc = instance.exports['f']; - return wrappedFunc; -} - -var freeTableIndexes = []; - -// Weak map of functions in the table to their indexes, created on first use. -var functionsInTableMap; - -function getEmptyTableSlot() { - // Reuse a free index if there is one, otherwise grow. - if (freeTableIndexes.length) { - return freeTableIndexes.pop(); - } - // Grow the table - try { - wasmTable.grow(1); - } catch (err) { - if (!(err instanceof RangeError)) { - throw err; - } - throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; - } - return wasmTable.length - 1; -} - -function updateTableMap(offset, count) { - for (var i = offset; i < offset + count; i++) { - var item = getWasmTableEntry(i); - // Ignore null values. - if (item) { - functionsInTableMap.set(item, i); - } - } -} - -// Add a function to the table. -// 'sig' parameter is required if the function being added is a JS function. -function addFunction(func, sig) { - assert(typeof func !== 'undefined'); - - // Check if the function is already in the table, to ensure each function - // gets a unique index. First, create the map if this is the first use. - if (!functionsInTableMap) { - functionsInTableMap = new WeakMap(); - updateTableMap(0, wasmTable.length); - } - if (functionsInTableMap.has(func)) { - return functionsInTableMap.get(func); - } - - // It's not in the table, add it now. - - var ret = getEmptyTableSlot(); - - // Set the new value. - try { - // Attempting to call this with JS function will cause of table.set() to fail - setWasmTableEntry(ret, func); - } catch (err) { - if (!(err instanceof TypeError)) { - throw err; - } - assert(typeof sig !== 'undefined', 'Missing signature argument to addFunction: ' + func); - var wrapped = convertJsFunctionToWasm(func, sig); - setWasmTableEntry(ret, wrapped); - } - - functionsInTableMap.set(func, ret); - - return ret; -} - -function removeFunction(index) { - functionsInTableMap.delete(getWasmTableEntry(index)); - freeTableIndexes.push(index); -} - -// end include: runtime_functions.js -// include: runtime_debug.js - - -// end include: runtime_debug.js -var tempRet0 = 0; -var setTempRet0 = (value) => { tempRet0 = value; }; -var getTempRet0 = () => tempRet0; - - - -// === Preamble library stuff === - -// Documentation for the public APIs defined in this file must be updated in: -// site/source/docs/api_reference/preamble.js.rst -// A prebuilt local version of the documentation is available at: -// site/build/text/docs/api_reference/preamble.js.txt -// You can also build docs locally as HTML or other formats in site/ -// An online HTML version (which may be of a different version of Emscripten) -// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html - -var wasmBinary; -if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; -if (!Object.getOwnPropertyDescriptor(Module, 'wasmBinary')) { - Object.defineProperty(Module, 'wasmBinary', { - configurable: true, - get: function() { - abort('Module.wasmBinary has been replaced with plain wasmBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} -var noExitRuntime = Module['noExitRuntime'] || true; -if (!Object.getOwnPropertyDescriptor(Module, 'noExitRuntime')) { - Object.defineProperty(Module, 'noExitRuntime', { - configurable: true, - get: function() { - abort('Module.noExitRuntime has been replaced with plain noExitRuntime (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (typeof WebAssembly !== 'object') { - abort('no native wasm support detected'); -} - -// include: runtime_safe_heap.js - - -// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. -// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) - -/** @param {number} ptr - @param {number} value - @param {string} type - @param {number|boolean=} noSafe */ -function setValue(ptr, value, type = 'i8', noSafe) { - if (type.charAt(type.length-1) === '*') type = 'i32'; - switch (type) { - case 'i1': HEAP8[((ptr)>>0)] = value; break; - case 'i8': HEAP8[((ptr)>>0)] = value; break; - case 'i16': HEAP16[((ptr)>>1)] = value; break; - case 'i32': HEAP32[((ptr)>>2)] = value; break; - case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break; - case 'float': HEAPF32[((ptr)>>2)] = value; break; - case 'double': HEAPF64[((ptr)>>3)] = value; break; - default: abort('invalid type for setValue: ' + type); - } -} - -/** @param {number} ptr - @param {string} type - @param {number|boolean=} noSafe */ -function getValue(ptr, type = 'i8', noSafe) { - if (type.charAt(type.length-1) === '*') type = 'i32'; - switch (type) { - case 'i1': return HEAP8[((ptr)>>0)]; - case 'i8': return HEAP8[((ptr)>>0)]; - case 'i16': return HEAP16[((ptr)>>1)]; - case 'i32': return HEAP32[((ptr)>>2)]; - case 'i64': return HEAP32[((ptr)>>2)]; - case 'float': return HEAPF32[((ptr)>>2)]; - case 'double': return Number(HEAPF64[((ptr)>>3)]); - default: abort('invalid type for getValue: ' + type); - } - return null; -} - -// end include: runtime_safe_heap.js -// Wasm globals - -var wasmMemory; - -//======================================== -// Runtime essentials -//======================================== - -// whether we are quitting the application. no code should run after this. -// set in exit() and abort() -var ABORT = false; - -// set by exit() and abort(). Passed to 'onExit' handler. -// NOTE: This is also used as the process return code code in shell environments -// but only when noExitRuntime is false. -var EXITSTATUS; - -/** @type {function(*, string=)} */ -function assert(condition, text) { - if (!condition) { - abort('Assertion failed' + (text ? ': ' + text : '')); - } -} - -// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) -function getCFunc(ident) { - var func = Module['_' + ident]; // closure exported function - assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); - return func; -} - -// C calling interface. -/** @param {string|null=} returnType - @param {Array=} argTypes - @param {Arguments|Array=} args - @param {Object=} opts */ -function ccall(ident, returnType, argTypes, args, opts) { - // For fast lookup of conversion functions - var toC = { - 'string': function(str) { - var ret = 0; - if (str !== null && str !== undefined && str !== 0) { // null string - // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' - var len = (str.length << 2) + 1; - ret = stackAlloc(len); - stringToUTF8(str, ret, len); - } - return ret; - }, - 'array': function(arr) { - var ret = stackAlloc(arr.length); - writeArrayToMemory(arr, ret); - return ret; - } - }; - - function convertReturnValue(ret) { - if (returnType === 'string') return UTF8ToString(ret); - if (returnType === 'boolean') return Boolean(ret); - return ret; - } - - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - assert(returnType !== 'array', 'Return type should not be "array".'); - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func.apply(null, cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - - ret = onDone(ret); - return ret; -} - -/** @param {string=} returnType - @param {Array=} argTypes - @param {Object=} opts */ -function cwrap(ident, returnType, argTypes, opts) { - return function() { - return ccall(ident, returnType, argTypes, arguments, opts); - } -} - -// We used to include malloc/free by default in the past. Show a helpful error in -// builds with assertions. - -var ALLOC_NORMAL = 0; // Tries to use _malloc() -var ALLOC_STACK = 1; // Lives for the duration of the current function call - -// allocate(): This is for internal use. You can use it yourself as well, but the interface -// is a little tricky (see docs right below). The reason is that it is optimized -// for multiple syntaxes to save space in generated code. So you should -// normally not use allocate(), and instead allocate memory using _malloc(), -// initialize it with setValue(), and so forth. -// @slab: An array of data. -// @allocator: How to allocate memory, see ALLOC_* -/** @type {function((Uint8Array|Array), number)} */ -function allocate(slab, allocator) { - var ret; - assert(typeof allocator === 'number', 'allocate no longer takes a type argument') - assert(typeof slab !== 'number', 'allocate no longer takes a number as arg0') - - if (allocator == ALLOC_STACK) { - ret = stackAlloc(slab.length); - } else { - ret = _malloc(slab.length); - } - - if (slab.subarray || slab.slice) { - HEAPU8.set(/** @type {!Uint8Array} */(slab), ret); - } else { - HEAPU8.set(new Uint8Array(slab), ret); - } - return ret; -} - -// include: runtime_strings.js - - -// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. - -// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns -// a copy of that string as a Javascript String object. - -var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined; - -/** - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ArrayToString(heap, idx, maxBytesToRead) { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. - // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. - // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) - while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; - - if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { - return UTF8Decoder.decode(heap.subarray(idx, endPtr)); - } else { - var str = ''; - // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that - while (idx < endPtr) { - // For UTF8 byte structure, see: - // http://en.wikipedia.org/wiki/UTF-8#Description - // https://www.ietf.org/rfc/rfc2279.txt - // https://tools.ietf.org/html/rfc3629 - var u0 = heap[idx++]; - if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } - var u1 = heap[idx++] & 63; - if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } - var u2 = heap[idx++] & 63; - if ((u0 & 0xF0) == 0xE0) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); - } - - if (u0 < 0x10000) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 0x10000; - str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); - } - } - } - return str; -} - -// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a -// copy of that string as a Javascript String object. -// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit -// this parameter to scan the string until the first \0 byte. If maxBytesToRead is -// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the -// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will -// not produce a string of exact length [ptr, ptr+maxBytesToRead[) -// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may -// throw JS JIT optimizations off, so it is worth to consider consistently using one -// style or the other. -/** - * @param {number} ptr - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ToString(ptr, maxBytesToRead) { - ; - return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; -} - -// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', -// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. -// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. -// outIdx: The starting offset in the array to begin the copying. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. -// This count should include the null terminator, -// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. -// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { - if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. - return 0; - - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 - var u = str.charCodeAt(i); // possibly a lead surrogate - if (u >= 0xD800 && u <= 0xDFFF) { - var u1 = str.charCodeAt(++i); - u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); - } - if (u <= 0x7F) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 0x7FF) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 0xC0 | (u >> 6); - heap[outIdx++] = 0x80 | (u & 63); - } else if (u <= 0xFFFF) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 0xE0 | (u >> 12); - heap[outIdx++] = 0x80 | ((u >> 6) & 63); - heap[outIdx++] = 0x80 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - if (u > 0x10FFFF) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); - heap[outIdx++] = 0xF0 | (u >> 18); - heap[outIdx++] = 0x80 | ((u >> 12) & 63); - heap[outIdx++] = 0x80 | ((u >> 6) & 63); - heap[outIdx++] = 0x80 | (u & 63); - } - } - // Null-terminate the pointer to the buffer. - heap[outIdx] = 0; - return outIdx - startIdx; -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. -// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF8(str, outPtr, maxBytesToWrite) { - assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); - return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. -function lengthBytesUTF8(str) { - var len = 0; - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var u = str.charCodeAt(i); // possibly a lead surrogate - if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); - if (u <= 0x7F) ++len; - else if (u <= 0x7FF) len += 2; - else if (u <= 0xFFFF) len += 3; - else len += 4; - } - return len; -} - -// end include: runtime_strings.js -// include: runtime_strings_extra.js - - -// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. - -// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns -// a copy of that string as a Javascript String object. - -function AsciiToString(ptr) { - var str = ''; - while (1) { - var ch = HEAPU8[((ptr++)>>0)]; - if (!ch) return str; - str += String.fromCharCode(ch); - } -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. - -function stringToAscii(str, outPtr) { - return writeAsciiToMemory(str, outPtr, false); -} - -// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns -// a copy of that string as a Javascript String object. - -var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined; - -function UTF16ToString(ptr, maxBytesToRead) { - assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); - var endPtr = ptr; - // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. - // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. - var idx = endPtr >> 1; - var maxIdx = idx + maxBytesToRead / 2; - // If maxBytesToRead is not passed explicitly, it will be undefined, and this - // will always evaluate to true. This saves on code size. - while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; - endPtr = idx << 1; - - if (endPtr - ptr > 32 && UTF16Decoder) { - return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); - } else { - var str = ''; - - // If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition - // will always evaluate to true. The loop is then terminated on the first null char. - for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { - var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; - if (codeUnit == 0) break; - // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. - str += String.fromCharCode(codeUnit); - } - - return str; - } -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. -// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// outPtr: Byte address in Emscripten HEAP where to write the string to. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null -// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. -// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF16(str, outPtr, maxBytesToWrite) { - assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); - assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); - // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. - if (maxBytesToWrite === undefined) { - maxBytesToWrite = 0x7FFFFFFF; - } - if (maxBytesToWrite < 2) return 0; - maxBytesToWrite -= 2; // Null terminator. - var startPtr = outPtr; - var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; - for (var i = 0; i < numCharsToWrite; ++i) { - // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. - var codeUnit = str.charCodeAt(i); // possibly a lead surrogate - HEAP16[((outPtr)>>1)] = codeUnit; - outPtr += 2; - } - // Null-terminate the pointer to the HEAP. - HEAP16[((outPtr)>>1)] = 0; - return outPtr - startPtr; -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. - -function lengthBytesUTF16(str) { - return str.length*2; -} - -function UTF32ToString(ptr, maxBytesToRead) { - assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); - var i = 0; - - var str = ''; - // If maxBytesToRead is not passed explicitly, it will be undefined, and this - // will always evaluate to true. This saves on code size. - while (!(i >= maxBytesToRead / 4)) { - var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; - if (utf32 == 0) break; - ++i; - // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - if (utf32 >= 0x10000) { - var ch = utf32 - 0x10000; - str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); - } else { - str += String.fromCharCode(utf32); - } - } - return str; -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. -// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// outPtr: Byte address in Emscripten HEAP where to write the string to. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null -// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. -// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF32(str, outPtr, maxBytesToWrite) { - assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); - assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); - // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. - if (maxBytesToWrite === undefined) { - maxBytesToWrite = 0x7FFFFFFF; - } - if (maxBytesToWrite < 4) return 0; - var startPtr = outPtr; - var endPtr = startPtr + maxBytesToWrite - 4; - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var codeUnit = str.charCodeAt(i); // possibly a lead surrogate - if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { - var trailSurrogate = str.charCodeAt(++i); - codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); - } - HEAP32[((outPtr)>>2)] = codeUnit; - outPtr += 4; - if (outPtr + 4 > endPtr) break; - } - // Null-terminate the pointer to the HEAP. - HEAP32[((outPtr)>>2)] = 0; - return outPtr - startPtr; -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. - -function lengthBytesUTF32(str) { - var len = 0; - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var codeUnit = str.charCodeAt(i); - if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. - len += 4; - } - - return len; -} - -// Allocate heap space for a JS string, and write it there. -// It is the responsibility of the caller to free() that memory. -function allocateUTF8(str) { - var size = lengthBytesUTF8(str) + 1; - var ret = _malloc(size); - if (ret) stringToUTF8Array(str, HEAP8, ret, size); - return ret; -} - -// Allocate stack space for a JS string, and write it there. -function allocateUTF8OnStack(str) { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8Array(str, HEAP8, ret, size); - return ret; -} - -// Deprecated: This function should not be called because it is unsafe and does not provide -// a maximum length limit of how many bytes it is allowed to write. Prefer calling the -// function stringToUTF8Array() instead, which takes in a maximum length that can be used -// to be secure from out of bounds writes. -/** @deprecated - @param {boolean=} dontAddNull */ -function writeStringToMemory(string, buffer, dontAddNull) { - warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); - - var /** @type {number} */ lastChar, /** @type {number} */ end; - if (dontAddNull) { - // stringToUTF8Array always appends null. If we don't want to do that, remember the - // character that existed at the location where the null will be placed, and restore - // that after the write (below). - end = buffer + lengthBytesUTF8(string); - lastChar = HEAP8[end]; - } - stringToUTF8(string, buffer, Infinity); - if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. -} - -function writeArrayToMemory(array, buffer) { - assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') - HEAP8.set(array, buffer); -} - -/** @param {boolean=} dontAddNull */ -function writeAsciiToMemory(str, buffer, dontAddNull) { - for (var i = 0; i < str.length; ++i) { - assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff)); - HEAP8[((buffer++)>>0)] = str.charCodeAt(i); - } - // Null-terminate the pointer to the HEAP. - if (!dontAddNull) HEAP8[((buffer)>>0)] = 0; -} - -// end include: runtime_strings_extra.js -// Memory management - -function alignUp(x, multiple) { - if (x % multiple > 0) { - x += multiple - (x % multiple); - } - return x; -} - -var HEAP, -/** @type {ArrayBuffer} */ - buffer, -/** @type {Int8Array} */ - HEAP8, -/** @type {Uint8Array} */ - HEAPU8, -/** @type {Int16Array} */ - HEAP16, -/** @type {Uint16Array} */ - HEAPU16, -/** @type {Int32Array} */ - HEAP32, -/** @type {Uint32Array} */ - HEAPU32, -/** @type {Float32Array} */ - HEAPF32, -/** @type {Float64Array} */ - HEAPF64; - -function updateGlobalBufferAndViews(buf) { - buffer = buf; - Module['HEAP8'] = HEAP8 = new Int8Array(buf); - Module['HEAP16'] = HEAP16 = new Int16Array(buf); - Module['HEAP32'] = HEAP32 = new Int32Array(buf); - Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); - Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); - Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); - Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); - Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); -} - -var TOTAL_STACK = 5242880; -if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') - -var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216; -if (!Object.getOwnPropertyDescriptor(Module, 'INITIAL_MEMORY')) { - Object.defineProperty(Module, 'INITIAL_MEMORY', { - configurable: true, - get: function() { - abort('Module.INITIAL_MEMORY has been replaced with plain INITIAL_MEMORY (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -assert(INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); - -// check for full engine support (use string 'subarray' to avoid closure compiler confusion) -assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined, - 'JS engine does not provide full typed array support'); - -// If memory is defined in wasm, the user can't provide it. -assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -s IMPORTED_MEMORY to define wasmMemory externally'); -assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically'); - -// include: runtime_init_table.js -// In regular non-RELOCATABLE mode the table is exported -// from the wasm module and this will be assigned once -// the exports are available. -var wasmTable; - -// end include: runtime_init_table.js -// include: runtime_stack_check.js - - -// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. -function writeStackCookie() { - var max = _emscripten_stack_get_end(); - assert((max & 3) == 0); - // The stack grows downwards - HEAP32[((max + 4)>>2)] = 0x2135467; - HEAP32[((max + 8)>>2)] = 0x89BACDFE; - // Also test the global address 0 for integrity. - HEAP32[0] = 0x63736d65; /* 'emsc' */ -} - -function checkStackCookie() { - if (ABORT) return; - var max = _emscripten_stack_get_end(); - var cookie1 = HEAPU32[((max + 4)>>2)]; - var cookie2 = HEAPU32[((max + 8)>>2)]; - if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) { - abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' 0x' + cookie1.toString(16)); - } - // Also test the global address 0 for integrity. - if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); -} - -// end include: runtime_stack_check.js -// include: runtime_assertions.js - - -// Endianness check -(function() { - var h16 = new Int16Array(1); - var h8 = new Int8Array(h16.buffer); - h16[0] = 0x6373; - if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)'; -})(); - -// end include: runtime_assertions.js -var __ATPRERUN__ = []; // functions called before the runtime is initialized -var __ATINIT__ = []; // functions called during startup -var __ATEXIT__ = []; // functions called during shutdown -var __ATPOSTRUN__ = []; // functions called after the main() is called - -var runtimeInitialized = false; -var runtimeExited = false; -var runtimeKeepaliveCounter = 0; - -function keepRuntimeAlive() { - return noExitRuntime || runtimeKeepaliveCounter > 0; -} - -function preRun() { - - if (Module['preRun']) { - if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; - while (Module['preRun'].length) { - addOnPreRun(Module['preRun'].shift()); - } - } - - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - checkStackCookie(); - assert(!runtimeInitialized); - runtimeInitialized = true; - - -if (!Module["noFSInit"] && !FS.init.initialized) - FS.init(); -FS.ignorePermissions = false; - -TTY.init(); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - checkStackCookie(); - runtimeExited = true; -} - -function postRun() { - checkStackCookie(); - - if (Module['postRun']) { - if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; - while (Module['postRun'].length) { - addOnPostRun(Module['postRun'].shift()); - } - } - - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnExit(cb) { -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -// include: runtime_math.js - - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc - -assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); -assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); -assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); -assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); - -// end include: runtime_math.js -// A counter of dependencies for calling run(). If we need to -// do asynchronous work before running, increment this and -// decrement it. Incrementing must happen in a place like -// Module.preRun (used by emcc to add file preloading). -// Note that you can add dependencies in preRun, even though -// it happens right before run - run will be postponed until -// the dependencies are met. -var runDependencies = 0; -var runDependencyWatcher = null; -var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled -var runDependencyTracking = {}; - -function getUniqueRunDependency(id) { - var orig = id; - while (1) { - if (!runDependencyTracking[id]) return id; - id = orig + Math.random(); - } -} - -function addRunDependency(id) { - runDependencies++; - - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } - - if (id) { - assert(!runDependencyTracking[id]); - runDependencyTracking[id] = 1; - if (runDependencyWatcher === null && typeof setInterval !== 'undefined') { - // Check for missing dependencies every few seconds - runDependencyWatcher = setInterval(function() { - if (ABORT) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - return; - } - var shown = false; - for (var dep in runDependencyTracking) { - if (!shown) { - shown = true; - err('still waiting on run dependencies:'); - } - err('dependency: ' + dep); - } - if (shown) { - err('(end of list)'); - } - }, 10000); - } - } else { - err('warning: run dependency added without ID'); - } -} - -function removeRunDependency(id) { - runDependencies--; - - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } - - if (id) { - assert(runDependencyTracking[id]); - delete runDependencyTracking[id]; - } else { - err('warning: run dependency removed without ID'); - } - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); // can add another dependenciesFulfilled - } - } -} - -Module["preloadedImages"] = {}; // maps url to image data -Module["preloadedAudios"] = {}; // maps url to audio data - -/** @param {string|number=} what */ -function abort(what) { - { - if (Module['onAbort']) { - Module['onAbort'](what); - } - } - - what = 'Aborted(' + what + ')'; - // TODO(sbc): Should we remove printing and leave it up to whoever - // catches the exception? - err(what); - - ABORT = true; - EXITSTATUS = 1; - - // Use a wasm runtime error, because a JS error might be seen as a foreign - // exception, which means we'd run destructors on it. We need the error to - // simply make the program stop. - var e = new WebAssembly.RuntimeError(what); - - // Throw the error whether or not MODULARIZE is set because abort is used - // in code paths apart from instantiation where an exception is expected - // to be thrown when abort is called. - throw e; -} - -// {{MEM_INITIALIZER}} - -// include: memoryprofiler.js - - -// end include: memoryprofiler.js -// include: URIUtils.js - - -// Prefix of data URIs emitted by SINGLE_FILE and related options. -var dataURIPrefix = 'data:application/octet-stream;base64,'; - -// Indicates whether filename is a base64 data URI. -function isDataURI(filename) { - // Prefix of data URIs emitted by SINGLE_FILE and related options. - return filename.startsWith(dataURIPrefix); -} - -// Indicates whether filename is delivered via file protocol (as opposed to http/https) -function isFileURI(filename) { - return filename.startsWith('file://'); -} - -// end include: URIUtils.js -function createExportWrapper(name, fixedasm) { - return function() { - var displayName = name; - var asm = fixedasm; - if (!fixedasm) { - asm = Module['asm']; - } - assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization'); - assert(!runtimeExited, 'native function `' + displayName + '` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - if (!asm[name]) { - assert(asm[name], 'exported native function `' + displayName + '` not found'); - } - return asm[name].apply(null, arguments); - }; -} - -var wasmBinaryFile; - wasmBinaryFile = 'libopus.wasm'; - if (!isDataURI(wasmBinaryFile)) { - wasmBinaryFile = locateFile(wasmBinaryFile); - } - -function getBinary(file) { - try { - if (file == wasmBinaryFile && wasmBinary) { - return new Uint8Array(wasmBinary); - } - if (readBinary) { - return readBinary(file); - } else { - throw "both async and sync fetching of the wasm failed"; - } - } - catch (err) { - abort(err); - } -} - -function getBinaryPromise() { - // If we don't have the binary yet, try to to load it asynchronously. - // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. - // See https://github.com/github/fetch/pull/92#issuecomment-140665932 - // Cordova or Electron apps are typically loaded from a file:// url. - // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. - if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { - if (typeof fetch === 'function' - && !isFileURI(wasmBinaryFile) - ) { - return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { - if (!response['ok']) { - throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; - } - return response['arrayBuffer'](); - }).catch(function () { - return getBinary(wasmBinaryFile); - }); - } - else { - if (readAsync) { - // fetch is not available or url is file => try XHR (readAsync uses XHR internally) - return new Promise(function(resolve, reject) { - readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject) - }); - } - } - } - - // Otherwise, getBinary should be able to get it synchronously - return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); }); -} - -// Create the wasm instance. -// Receives the wasm imports, returns the exports. -function createWasm() { - // prepare imports - var info = { - 'env': asmLibraryArg, - 'wasi_snapshot_preview1': asmLibraryArg, - }; - // Load the wasm module and create an instance of using native support in the JS engine. - // handle a generated wasm instance, receiving its exports and - // performing other necessary setup - /** @param {WebAssembly.Module=} module*/ - function receiveInstance(instance, module) { - var exports = instance.exports; - - Module['asm'] = exports; - - wasmMemory = Module['asm']['memory']; - assert(wasmMemory, "memory not found in wasm exports"); - // This assertion doesn't hold when emscripten is run in --post-link - // mode. - // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. - //assert(wasmMemory.buffer.byteLength === 16777216); - updateGlobalBufferAndViews(wasmMemory.buffer); - - wasmTable = Module['asm']['__indirect_function_table']; - assert(wasmTable, "table not found in wasm exports"); - - addOnInit(Module['asm']['__wasm_call_ctors']); - - removeRunDependency('wasm-instantiate'); - } - // we can't run yet (except in a pthread, where we have a custom sync instantiator) - addRunDependency('wasm-instantiate'); - - // Prefer streaming instantiation if available. - // Async compilation can be confusing when an error on the page overwrites Module - // (for example, if the order of elements is wrong, and the one defining Module is - // later), so we save Module and check it later. - var trueModule = Module; - function receiveInstantiationResult(result) { - // 'result' is a ResultObject object which has both the module and instance. - // receiveInstance() will swap in the exports (to Module.asm) so they can be called - assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); - trueModule = null; - // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. - // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. - receiveInstance(result['instance']); - } - - function instantiateArrayBuffer(receiver) { - return getBinaryPromise().then(function(binary) { - return WebAssembly.instantiate(binary, info); - }).then(function (instance) { - return instance; - }).then(receiver, function(reason) { - err('failed to asynchronously prepare wasm: ' + reason); - - // Warn on some common problems. - if (isFileURI(wasmBinaryFile)) { - err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing'); - } - abort(reason); - }); - } - - function instantiateAsync() { - if (!wasmBinary && - typeof WebAssembly.instantiateStreaming === 'function' && - !isDataURI(wasmBinaryFile) && - // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. - !isFileURI(wasmBinaryFile) && - typeof fetch === 'function') { - return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) { - var result = WebAssembly.instantiateStreaming(response, info); - - return result.then( - receiveInstantiationResult, - function(reason) { - // We expect the most common failure cause to be a bad MIME type for the binary, - // in which case falling back to ArrayBuffer instantiation should work. - err('wasm streaming compile failed: ' + reason); - err('falling back to ArrayBuffer instantiation'); - return instantiateArrayBuffer(receiveInstantiationResult); - }); - }); - } else { - return instantiateArrayBuffer(receiveInstantiationResult); - } - } - - // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback - // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel - // to any other async startup actions they are performing. - if (Module['instantiateWasm']) { - try { - var exports = Module['instantiateWasm'](info, receiveInstance); - return exports; - } catch(e) { - err('Module.instantiateWasm callback failed with error: ' + e); - return false; - } - } - - instantiateAsync(); - return {}; // no exports yet; we'll fill them in later -} - -// Globals used by JS i64 conversions (see makeSetValue) -var tempDouble; -var tempI64; - -// === Body === - -var ASM_CONSTS = { - -}; - - - - - - - function callRuntimeCallbacks(callbacks) { - while (callbacks.length > 0) { - var callback = callbacks.shift(); - if (typeof callback == 'function') { - callback(Module); // Pass the module as the first argument. - continue; - } - var func = callback.func; - if (typeof func === 'number') { - if (callback.arg === undefined) { - getWasmTableEntry(func)(); - } else { - getWasmTableEntry(func)(callback.arg); - } - } else { - func(callback.arg === undefined ? null : callback.arg); - } - } - } - - function withStackSave(f) { - var stack = stackSave(); - var ret = f(); - stackRestore(stack); - return ret; - } - function demangle(func) { - warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); - return func; - } - - function demangleAll(text) { - var regex = - /\b_Z[\w\d_]+/g; - return text.replace(regex, - function(x) { - var y = demangle(x); - return x === y ? x : (y + ' [' + x + ']'); - }); - } - - var wasmTableMirror = []; - function getWasmTableEntry(funcPtr) { - var func = wasmTableMirror[funcPtr]; - if (!func) { - if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; - wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); - } - assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!"); - return func; - } - - function handleException(e) { - // Certain exception types we do not treat as errors since they are used for - // internal control flow. - // 1. ExitStatus, which is thrown by exit() - // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others - // that wish to return to JS event loop. - if (e instanceof ExitStatus || e == 'unwind') { - return EXITSTATUS; - } - quit_(1, e); - } - - function jsStackTrace() { - var error = new Error(); - if (!error.stack) { - // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, - // so try that as a special-case. - try { - throw new Error(); - } catch(e) { - error = e; - } - if (!error.stack) { - return '(no stack trace available)'; - } - } - return error.stack.toString(); - } - - function setWasmTableEntry(idx, func) { - wasmTable.set(idx, func); - wasmTableMirror[idx] = func; - } - - function stackTrace() { - var js = jsStackTrace(); - if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); - return demangleAll(js); - } - - function ___cxa_allocate_exception(size) { - // Thrown object is prepended by exception metadata block - return _malloc(size + 16) + 16; - } - - function ExceptionInfo(excPtr) { - this.excPtr = excPtr; - this.ptr = excPtr - 16; - - this.set_type = function(type) { - HEAP32[(((this.ptr)+(4))>>2)] = type; - }; - - this.get_type = function() { - return HEAP32[(((this.ptr)+(4))>>2)]; - }; - - this.set_destructor = function(destructor) { - HEAP32[(((this.ptr)+(8))>>2)] = destructor; - }; - - this.get_destructor = function() { - return HEAP32[(((this.ptr)+(8))>>2)]; - }; - - this.set_refcount = function(refcount) { - HEAP32[((this.ptr)>>2)] = refcount; - }; - - this.set_caught = function (caught) { - caught = caught ? 1 : 0; - HEAP8[(((this.ptr)+(12))>>0)] = caught; - }; - - this.get_caught = function () { - return HEAP8[(((this.ptr)+(12))>>0)] != 0; - }; - - this.set_rethrown = function (rethrown) { - rethrown = rethrown ? 1 : 0; - HEAP8[(((this.ptr)+(13))>>0)] = rethrown; - }; - - this.get_rethrown = function () { - return HEAP8[(((this.ptr)+(13))>>0)] != 0; - }; - - // Initialize native structure fields. Should be called once after allocated. - this.init = function(type, destructor) { - this.set_type(type); - this.set_destructor(destructor); - this.set_refcount(0); - this.set_caught(false); - this.set_rethrown(false); - } - - this.add_ref = function() { - var value = HEAP32[((this.ptr)>>2)]; - HEAP32[((this.ptr)>>2)] = value + 1; - }; - - // Returns true if last reference released. - this.release_ref = function() { - var prev = HEAP32[((this.ptr)>>2)]; - HEAP32[((this.ptr)>>2)] = prev - 1; - assert(prev > 0); - return prev === 1; - }; - } - - var exceptionLast = 0; - - var uncaughtExceptionCount = 0; - function ___cxa_throw(ptr, type, destructor) { - var info = new ExceptionInfo(ptr); - // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. - info.init(type, destructor); - exceptionLast = ptr; - uncaughtExceptionCount++; - throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s NO_DISABLE_EXCEPTION_CATCHING or -s EXCEPTION_CATCHING_ALLOWED=[..] to catch."; - } - - function _abort() { - abort('native code called abort()'); - } - - function _emscripten_memcpy_big(dest, src, num) { - HEAPU8.copyWithin(dest, src, src + num); - } - - function abortOnCannotGrowMemory(requestedSize) { - abort('Cannot enlarge memory arrays to size ' + requestedSize + ' bytes (OOM). Either (1) compile with -s INITIAL_MEMORY=X with X higher than the current value ' + HEAP8.length + ', (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 '); - } - function _emscripten_resize_heap(requestedSize) { - var oldSize = HEAPU8.length; - requestedSize = requestedSize >>> 0; - abortOnCannotGrowMemory(requestedSize); - } - - var ENV = {}; - - function getExecutableName() { - return thisProgram || './this.program'; - } - function getEnvStrings() { - if (!getEnvStrings.strings) { - // Default values. - // Browser language detection #8751 - var lang = ((typeof navigator === 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8'; - var env = { - 'USER': 'web_user', - 'LOGNAME': 'web_user', - 'PATH': '/', - 'PWD': '/', - 'HOME': '/home/web_user', - 'LANG': lang, - '_': getExecutableName() - }; - // Apply the user-provided values, if any. - for (var x in ENV) { - // x is a key in ENV; if ENV[x] is undefined, that means it was - // explicitly set to be so. We allow user code to do that to - // force variables with default values to remain unset. - if (ENV[x] === undefined) delete env[x]; - else env[x] = ENV[x]; - } - var strings = []; - for (var x in env) { - strings.push(x + '=' + env[x]); - } - getEnvStrings.strings = strings; - } - return getEnvStrings.strings; - } - - var PATH = {splitPath:function(filename) { - var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; - return splitPathRe.exec(filename).slice(1); - },normalizeArray:function(parts, allowAboveRoot) { - // if the path tries to go above the root, `up` ends up > 0 - var up = 0; - for (var i = parts.length - 1; i >= 0; i--) { - var last = parts[i]; - if (last === '.') { - parts.splice(i, 1); - } else if (last === '..') { - parts.splice(i, 1); - up++; - } else if (up) { - parts.splice(i, 1); - up--; - } - } - // if the path is allowed to go above the root, restore leading ..s - if (allowAboveRoot) { - for (; up; up--) { - parts.unshift('..'); - } - } - return parts; - },normalize:function(path) { - var isAbsolute = path.charAt(0) === '/', - trailingSlash = path.substr(-1) === '/'; - // Normalize the path - path = PATH.normalizeArray(path.split('/').filter(function(p) { - return !!p; - }), !isAbsolute).join('/'); - if (!path && !isAbsolute) { - path = '.'; - } - if (path && trailingSlash) { - path += '/'; - } - return (isAbsolute ? '/' : '') + path; - },dirname:function(path) { - var result = PATH.splitPath(path), - root = result[0], - dir = result[1]; - if (!root && !dir) { - // No dirname whatsoever - return '.'; - } - if (dir) { - // It has a dirname, strip trailing slash - dir = dir.substr(0, dir.length - 1); - } - return root + dir; - },basename:function(path) { - // EMSCRIPTEN return '/'' for '/', not an empty string - if (path === '/') return '/'; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf('/'); - if (lastSlash === -1) return path; - return path.substr(lastSlash+1); - },extname:function(path) { - return PATH.splitPath(path)[3]; - },join:function() { - var paths = Array.prototype.slice.call(arguments, 0); - return PATH.normalize(paths.join('/')); - },join2:function(l, r) { - return PATH.normalize(l + '/' + r); - }}; - - function getRandomDevice() { - if (typeof crypto === 'object' && typeof crypto['getRandomValues'] === 'function') { - // for modern web browsers - var randomBuffer = new Uint8Array(1); - return function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; - } else - if (ENVIRONMENT_IS_NODE) { - // for nodejs with or without crypto support included - try { - var crypto_module = require('crypto'); - // nodejs has crypto support - return function() { return crypto_module['randomBytes'](1)[0]; }; - } catch (e) { - // nodejs doesn't have crypto support - } - } - // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 - return function() { abort("no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };"); }; - } - - var PATH_FS = {resolve:function() { - var resolvedPath = '', - resolvedAbsolute = false; - for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { - var path = (i >= 0) ? arguments[i] : FS.cwd(); - // Skip empty and invalid entries - if (typeof path !== 'string') { - throw new TypeError('Arguments to path.resolve must be strings'); - } else if (!path) { - return ''; // an invalid portion invalidates the whole thing - } - resolvedPath = path + '/' + resolvedPath; - resolvedAbsolute = path.charAt(0) === '/'; - } - // At this point the path should be resolved to a full absolute path, but - // handle relative paths to be safe (might happen when process.cwd() fails) - resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { - return !!p; - }), !resolvedAbsolute).join('/'); - return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; - },relative:function(from, to) { - from = PATH_FS.resolve(from).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (; start < arr.length; start++) { - if (arr[start] !== '') break; - } - var end = arr.length - 1; - for (; end >= 0; end--) { - if (arr[end] !== '') break; - } - if (start > end) return []; - return arr.slice(start, end - start + 1); - } - var fromParts = trim(from.split('/')); - var toParts = trim(to.split('/')); - var length = Math.min(fromParts.length, toParts.length); - var samePartsLength = length; - for (var i = 0; i < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push('..'); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join('/'); - }}; - - var TTY = {ttys:[],init:function () { - // https://github.com/emscripten-core/emscripten/pull/1555 - // if (ENVIRONMENT_IS_NODE) { - // // currently, FS.init does not distinguish if process.stdin is a file or TTY - // // device, it always assumes it's a TTY device. because of this, we're forcing - // // process.stdin to UTF8 encoding to at least make stdin reading compatible - // // with text files until FS.init can be refactored. - // process['stdin']['setEncoding']('utf8'); - // } - },shutdown:function() { - // https://github.com/emscripten-core/emscripten/pull/1555 - // if (ENVIRONMENT_IS_NODE) { - // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? - // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation - // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? - // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle - // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call - // process['stdin']['pause'](); - // } - },register:function(dev, ops) { - TTY.ttys[dev] = { input: [], output: [], ops: ops }; - FS.registerDevice(dev, TTY.stream_ops); - },stream_ops:{open:function(stream) { - var tty = TTY.ttys[stream.node.rdev]; - if (!tty) { - throw new FS.ErrnoError(43); - } - stream.tty = tty; - stream.seekable = false; - },close:function(stream) { - // flush any pending line data - stream.tty.ops.flush(stream.tty); - },flush:function(stream) { - stream.tty.ops.flush(stream.tty); - },read:function(stream, buffer, offset, length, pos /* ignored */) { - if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset+i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - },write:function(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset+i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - }},default_tty_ops:{get_char:function(tty) { - if (!tty.input.length) { - var result = null; - if (ENVIRONMENT_IS_NODE) { - // we will read data by chunks of BUFSIZE - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - - try { - bytesRead = fs.readSync(process.stdin.fd, buf, 0, BUFSIZE, null); - } catch(e) { - // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, - // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. - if (e.toString().includes('EOF')) bytesRead = 0; - else throw e; - } - - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString('utf-8'); - } else { - result = null; - } - } else - if (typeof window != 'undefined' && - typeof window.prompt == 'function') { - // Browser. - result = window.prompt('Input: '); // returns null on cancel - if (result !== null) { - result += '\n'; - } - } else if (typeof readline == 'function') { - // Command line. - result = readline(); - if (result !== null) { - result += '\n'; - } - } - if (!result) { - return null; - } - tty.input = intArrayFromString(result, true); - } - return tty.input.shift(); - },put_char:function(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. - } - },flush:function(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - }},default_tty1_ops:{put_char:function(tty, val) { - if (val === null || val === 10) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - },flush:function(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - }}}; - - function zeroMemory(address, size) { - HEAPU8.fill(0, address, address + size); - } - - function alignMemory(size, alignment) { - assert(alignment, "alignment argument is required"); - return Math.ceil(size / alignment) * alignment; - } - function mmapAlloc(size) { - abort('internal error: mmapAlloc called but `memalign` native symbol not exported'); - } - var MEMFS = {ops_table:null,mount:function(mount) { - return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); - },createNode:function(parent, name, mode, dev) { - if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { - // no supported - throw new FS.ErrnoError(63); - } - if (!MEMFS.ops_table) { - MEMFS.ops_table = { - dir: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr, - lookup: MEMFS.node_ops.lookup, - mknod: MEMFS.node_ops.mknod, - rename: MEMFS.node_ops.rename, - unlink: MEMFS.node_ops.unlink, - rmdir: MEMFS.node_ops.rmdir, - readdir: MEMFS.node_ops.readdir, - symlink: MEMFS.node_ops.symlink - }, - stream: { - llseek: MEMFS.stream_ops.llseek - } - }, - file: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr - }, - stream: { - llseek: MEMFS.stream_ops.llseek, - read: MEMFS.stream_ops.read, - write: MEMFS.stream_ops.write, - allocate: MEMFS.stream_ops.allocate, - mmap: MEMFS.stream_ops.mmap, - msync: MEMFS.stream_ops.msync - } - }, - link: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr, - readlink: MEMFS.node_ops.readlink - }, - stream: {} - }, - chrdev: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr - }, - stream: FS.chrdev_stream_ops - } - }; - } - var node = FS.createNode(parent, name, mode, dev); - if (FS.isDir(node.mode)) { - node.node_ops = MEMFS.ops_table.dir.node; - node.stream_ops = MEMFS.ops_table.dir.stream; - node.contents = {}; - } else if (FS.isFile(node.mode)) { - node.node_ops = MEMFS.ops_table.file.node; - node.stream_ops = MEMFS.ops_table.file.stream; - node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. - // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred - // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size - // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. - node.contents = null; - } else if (FS.isLink(node.mode)) { - node.node_ops = MEMFS.ops_table.link.node; - node.stream_ops = MEMFS.ops_table.link.stream; - } else if (FS.isChrdev(node.mode)) { - node.node_ops = MEMFS.ops_table.chrdev.node; - node.stream_ops = MEMFS.ops_table.chrdev.stream; - } - node.timestamp = Date.now(); - // add the new node to the parent - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - },getFileDataAsTypedArray:function(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. - return new Uint8Array(node.contents); - },expandFileStorage:function(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. - // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. - // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to - // avoid overshooting the allocation cap by a very large margin. - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); // Allocate new storage. - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. - },resizeFileStorage:function(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; // Fully decommit when requesting a resize to zero. - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); // Allocate new storage. - if (oldContents) { - node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. - } - node.usedBytes = newSize; - } - },node_ops:{getattr:function(node) { - var attr = {}; - // device numbers reuse inode numbers. - attr.dev = FS.isChrdev(node.mode) ? node.id : 1; - attr.ino = node.id; - attr.mode = node.mode; - attr.nlink = 1; - attr.uid = 0; - attr.gid = 0; - attr.rdev = node.rdev; - if (FS.isDir(node.mode)) { - attr.size = 4096; - } else if (FS.isFile(node.mode)) { - attr.size = node.usedBytes; - } else if (FS.isLink(node.mode)) { - attr.size = node.link.length; - } else { - attr.size = 0; - } - attr.atime = new Date(node.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), - // but this is not required by the standard. - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - },setattr:function(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - },lookup:function(parent, name) { - throw FS.genericErrors[44]; - },mknod:function(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - },rename:function(old_node, new_dir, new_name) { - // if we're overwriting a directory at new_name, make sure it's empty. - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) { - } - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - // do the internal rewiring - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now() - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - old_node.parent = new_dir; - },unlink:function(parent, name) { - delete parent.contents[name]; - parent.timestamp = Date.now(); - },rmdir:function(parent, name) { - var node = FS.lookupNode(parent, name); - for (var i in node.contents) { - throw new FS.ErrnoError(55); - } - delete parent.contents[name]; - parent.timestamp = Date.now(); - },readdir:function(node) { - var entries = ['.', '..']; - for (var key in node.contents) { - if (!node.contents.hasOwnProperty(key)) { - continue; - } - entries.push(key); - } - return entries; - },symlink:function(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); - node.link = oldpath; - return node; - },readlink:function(node) { - if (!FS.isLink(node.mode)) { - throw new FS.ErrnoError(28); - } - return node.link; - }},stream_ops:{read:function(stream, buffer, offset, length, position) { - var contents = stream.node.contents; - if (position >= stream.node.usedBytes) return 0; - var size = Math.min(stream.node.usedBytes - position, length); - assert(size >= 0); - if (size > 8 && contents.subarray) { // non-trivial, and typed array - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - return size; - },write:function(stream, buffer, offset, length, position, canOwn) { - // The data buffer should be a typed array view - assert(!(buffer instanceof ArrayBuffer)); - - if (!length) return 0; - var node = stream.node; - node.timestamp = Date.now(); - - if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? - if (canOwn) { - assert(position === 0, 'canOwn must imply no weird position inside the file'); - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - - // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. - MEMFS.expandFileStorage(node, position+length); - if (node.contents.subarray && buffer.subarray) { - // Use typed array write which is available. - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. - } - } - node.usedBytes = Math.max(node.usedBytes, position + length); - return length; - },llseek:function(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - position += stream.node.usedBytes; - } - } - if (position < 0) { - throw new FS.ErrnoError(28); - } - return position; - },allocate:function(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - },mmap:function(stream, address, length, position, prot, flags) { - if (address !== 0) { - // We don't currently support location hints for the address of the mapping - throw new FS.ErrnoError(28); - } - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - var ptr; - var allocated; - var contents = stream.node.contents; - // Only make a new copy when MAP_PRIVATE is specified. - if (!(flags & 2) && contents.buffer === buffer) { - // We can't emulate MAP_SHARED when the file is not backed by the buffer - // we're mapping to (e.g. the HEAP buffer). - allocated = false; - ptr = contents.byteOffset; - } else { - // Try to avoid unnecessary slices. - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { ptr: ptr, allocated: allocated }; - },msync:function(stream, buffer, offset, length, mmapFlags) { - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (mmapFlags & 2) { - // MAP_PRIVATE calls need not to be synced back to underlying fs - return 0; - } - - var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - // should we check if bytesWritten and length are the same? - return 0; - }}}; - - function asyncLoad(url, onload, onerror, noRunDep) { - var dep = !noRunDep ? getUniqueRunDependency('al ' + url) : ''; - readAsync(url, function(arrayBuffer) { - assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, function(event) { - if (onerror) { - onerror(); - } else { - throw 'Loading data file "' + url + '" failed.'; - } - }); - if (dep) addRunDependency(dep); - } - - var ERRNO_MESSAGES = {0:"Success",1:"Arg list too long",2:"Permission denied",3:"Address already in use",4:"Address not available",5:"Address family not supported by protocol family",6:"No more processes",7:"Socket already connected",8:"Bad file number",9:"Trying to read unreadable message",10:"Mount device busy",11:"Operation canceled",12:"No children",13:"Connection aborted",14:"Connection refused",15:"Connection reset by peer",16:"File locking deadlock error",17:"Destination address required",18:"Math arg out of domain of func",19:"Quota exceeded",20:"File exists",21:"Bad address",22:"File too large",23:"Host is unreachable",24:"Identifier removed",25:"Illegal byte sequence",26:"Connection already in progress",27:"Interrupted system call",28:"Invalid argument",29:"I/O error",30:"Socket is already connected",31:"Is a directory",32:"Too many symbolic links",33:"Too many open files",34:"Too many links",35:"Message too long",36:"Multihop attempted",37:"File or path name too long",38:"Network interface is not configured",39:"Connection reset by network",40:"Network is unreachable",41:"Too many open files in system",42:"No buffer space available",43:"No such device",44:"No such file or directory",45:"Exec format error",46:"No record locks available",47:"The link has been severed",48:"Not enough core",49:"No message of desired type",50:"Protocol not available",51:"No space left on device",52:"Function not implemented",53:"Socket is not connected",54:"Not a directory",55:"Directory not empty",56:"State not recoverable",57:"Socket operation on non-socket",59:"Not a typewriter",60:"No such device or address",61:"Value too large for defined data type",62:"Previous owner died",63:"Not super-user",64:"Broken pipe",65:"Protocol error",66:"Unknown protocol",67:"Protocol wrong type for socket",68:"Math result not representable",69:"Read only file system",70:"Illegal seek",71:"No such process",72:"Stale file handle",73:"Connection timed out",74:"Text file busy",75:"Cross-device link",100:"Device not a stream",101:"Bad font file fmt",102:"Invalid slot",103:"Invalid request code",104:"No anode",105:"Block device required",106:"Channel number out of range",107:"Level 3 halted",108:"Level 3 reset",109:"Link number out of range",110:"Protocol driver not attached",111:"No CSI structure available",112:"Level 2 halted",113:"Invalid exchange",114:"Invalid request descriptor",115:"Exchange full",116:"No data (for no delay io)",117:"Timer expired",118:"Out of streams resources",119:"Machine is not on the network",120:"Package not installed",121:"The object is remote",122:"Advertise error",123:"Srmount error",124:"Communication error on send",125:"Cross mount point (not really error)",126:"Given log. name not unique",127:"f.d. invalid for this operation",128:"Remote address changed",129:"Can access a needed shared lib",130:"Accessing a corrupted shared lib",131:".lib section in a.out corrupted",132:"Attempting to link in too many libs",133:"Attempting to exec a shared library",135:"Streams pipe error",136:"Too many users",137:"Socket type not supported",138:"Not supported",139:"Protocol family not supported",140:"Can't send after socket shutdown",141:"Too many references",142:"Host is down",148:"No medium (in tape drive)",156:"Level 2 not synchronized"}; - - var ERRNO_CODES = {}; - var FS = {root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(path, opts = {}) { - path = PATH_FS.resolve(FS.cwd(), path); - - if (!path) return { path: '', node: null }; - - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - for (var key in defaults) { - if (opts[key] === undefined) { - opts[key] = defaults[key]; - } - } - - if (opts.recurse_count > 8) { // max recursive lookup of 8 - throw new FS.ErrnoError(32); - } - - // split the path - var parts = PATH.normalizeArray(path.split('/').filter(function(p) { - return !!p; - }), false); - - // start at the root - var current = FS.root; - var current_path = '/'; - - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length-1); - if (islast && opts.parent) { - // stop resolving - break; - } - - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - - // jump to the mount's root node if this is a mountpoint - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - - // by default, lookupPath will not follow a symlink if it is the final path component. - // setting opts.follow = true will override this behavior. - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - - var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); - current = lookup.node; - - if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). - throw new FS.ErrnoError(32); - } - } - } - } - - return { path: current_path, node: current }; - },getPath:function(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; - } - path = path ? node.name + '/' + path : node.name; - node = node.parent; - } - },hashName:function(parentid, name) { - var hash = 0; - - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 0) % FS.nameTable.length; - },hashAddNode:function(node) { - var hash = FS.hashName(node.parent.id, node.name); - node.name_next = FS.nameTable[hash]; - FS.nameTable[hash] = node; - },hashRemoveNode:function(node) { - var hash = FS.hashName(node.parent.id, node.name); - if (FS.nameTable[hash] === node) { - FS.nameTable[hash] = node.name_next; - } else { - var current = FS.nameTable[hash]; - while (current) { - if (current.name_next === node) { - current.name_next = node.name_next; - break; - } - current = current.name_next; - } - } - },lookupNode:function(parent, name) { - var errCode = FS.mayLookup(parent); - if (errCode) { - throw new FS.ErrnoError(errCode, parent); - } - var hash = FS.hashName(parent.id, name); - for (var node = FS.nameTable[hash]; node; node = node.name_next) { - var nodeName = node.name; - if (node.parent.id === parent.id && nodeName === name) { - return node; - } - } - // if we failed to find it in the cache, call into the VFS - return FS.lookup(parent, name); - },createNode:function(parent, name, mode, rdev) { - assert(typeof parent === 'object') - var node = new FS.FSNode(parent, name, mode, rdev); - - FS.hashAddNode(node); - - return node; - },destroyNode:function(node) { - FS.hashRemoveNode(node); - },isRoot:function(node) { - return node === node.parent; - },isMountpoint:function(node) { - return !!node.mounted; - },isFile:function(mode) { - return (mode & 61440) === 32768; - },isDir:function(mode) { - return (mode & 61440) === 16384; - },isLink:function(mode) { - return (mode & 61440) === 40960; - },isChrdev:function(mode) { - return (mode & 61440) === 8192; - },isBlkdev:function(mode) { - return (mode & 61440) === 24576; - },isFIFO:function(mode) { - return (mode & 61440) === 4096; - },isSocket:function(mode) { - return (mode & 49152) === 49152; - },flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:function(str) { - var flags = FS.flagModes[str]; - if (typeof flags === 'undefined') { - throw new Error('Unknown file open mode: ' + str); - } - return flags; - },flagsToPermissionString:function(flag) { - var perms = ['r', 'w', 'rw'][flag & 3]; - if ((flag & 512)) { - perms += 'w'; - } - return perms; - },nodePermissions:function(node, perms) { - if (FS.ignorePermissions) { - return 0; - } - // return 0 if any user, group or owner bits are set. - if (perms.includes('r') && !(node.mode & 292)) { - return 2; - } else if (perms.includes('w') && !(node.mode & 146)) { - return 2; - } else if (perms.includes('x') && !(node.mode & 73)) { - return 2; - } - return 0; - },mayLookup:function(dir) { - var errCode = FS.nodePermissions(dir, 'x'); - if (errCode) return errCode; - if (!dir.node_ops.lookup) return 2; - return 0; - },mayCreate:function(dir, name) { - try { - var node = FS.lookupNode(dir, name); - return 20; - } catch (e) { - } - return FS.nodePermissions(dir, 'wx'); - },mayDelete:function(dir, name, isdir) { - var node; - try { - node = FS.lookupNode(dir, name); - } catch (e) { - return e.errno; - } - var errCode = FS.nodePermissions(dir, 'wx'); - if (errCode) { - return errCode; - } - if (isdir) { - if (!FS.isDir(node.mode)) { - return 54; - } - if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { - return 10; - } - } else { - if (FS.isDir(node.mode)) { - return 31; - } - } - return 0; - },mayOpen:function(node, flags) { - if (!node) { - return 44; - } - if (FS.isLink(node.mode)) { - return 32; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write - (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - },MAX_OPEN_FDS:4096,nextfd:function(fd_start = 0, fd_end = FS.MAX_OPEN_FDS) { - for (var fd = fd_start; fd <= fd_end; fd++) { - if (!FS.streams[fd]) { - return fd; - } - } - throw new FS.ErrnoError(33); - },getStream:function(fd) { - return FS.streams[fd]; - },createStream:function(stream, fd_start, fd_end) { - if (!FS.FSStream) { - FS.FSStream = /** @constructor */ function(){}; - FS.FSStream.prototype = { - object: { - get: function() { return this.node; }, - set: function(val) { this.node = val; } - }, - isRead: { - get: function() { return (this.flags & 2097155) !== 1; } - }, - isWrite: { - get: function() { return (this.flags & 2097155) !== 0; } - }, - isAppend: { - get: function() { return (this.flags & 1024); } - } - }; - } - // clone it, so we can return an instance of FSStream - var newStream = new FS.FSStream(); - for (var p in stream) { - newStream[p] = stream[p]; - } - stream = newStream; - var fd = FS.nextfd(fd_start, fd_end); - stream.fd = fd; - FS.streams[fd] = stream; - return stream; - },closeStream:function(fd) { - FS.streams[fd] = null; - },chrdev_stream_ops:{open:function(stream) { - var device = FS.getDevice(stream.node.rdev); - // override node's stream ops with the device's - stream.stream_ops = device.stream_ops; - // forward the open call - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - },llseek:function() { - throw new FS.ErrnoError(70); - }},major:function(dev) { - return ((dev) >> 8); - },minor:function(dev) { - return ((dev) & 0xff); - },makedev:function(ma, mi) { - return ((ma) << 8 | (mi)); - },registerDevice:function(dev, ops) { - FS.devices[dev] = { stream_ops: ops }; - },getDevice:function(dev) { - return FS.devices[dev]; - },getMounts:function(mount) { - var mounts = []; - var check = [mount]; - - while (check.length) { - var m = check.pop(); - - mounts.push(m); - - check.push.apply(check, m.mounts); - } - - return mounts; - },syncfs:function(populate, callback) { - if (typeof(populate) === 'function') { - callback = populate; - populate = false; - } - - FS.syncFSRequests++; - - if (FS.syncFSRequests > 1) { - err('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work'); - } - - var mounts = FS.getMounts(FS.root.mount); - var completed = 0; - - function doCallback(errCode) { - assert(FS.syncFSRequests > 0); - FS.syncFSRequests--; - return callback(errCode); - } - - function done(errCode) { - if (errCode) { - if (!done.errored) { - done.errored = true; - return doCallback(errCode); - } - return; - } - if (++completed >= mounts.length) { - doCallback(null); - } - }; - - // sync all mounts - mounts.forEach(function (mount) { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - },mount:function(type, opts, mountpoint) { - if (typeof type === 'string') { - // The filesystem was not included, and instead we have an error - // message stored in the variable. - throw type; - } - var root = mountpoint === '/'; - var pseudo = !mountpoint; - var node; - - if (root && FS.root) { - throw new FS.ErrnoError(10); - } else if (!root && !pseudo) { - var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - - mountpoint = lookup.path; // use the absolute path - node = lookup.node; - - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); - } - - if (!FS.isDir(node.mode)) { - throw new FS.ErrnoError(54); - } - } - - var mount = { - type: type, - opts: opts, - mountpoint: mountpoint, - mounts: [] - }; - - // create a root node for the fs - var mountRoot = type.mount(mount); - mountRoot.mount = mount; - mount.root = mountRoot; - - if (root) { - FS.root = mountRoot; - } else if (node) { - // set as a mountpoint - node.mounted = mount; - - // add the new mount to the current mount's children - if (node.mount) { - node.mount.mounts.push(mount); - } - } - - return mountRoot; - },unmount:function (mountpoint) { - var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - - if (!FS.isMountpoint(lookup.node)) { - throw new FS.ErrnoError(28); - } - - // destroy the nodes for this mount, and all its child mounts - var node = lookup.node; - var mount = node.mounted; - var mounts = FS.getMounts(mount); - - Object.keys(FS.nameTable).forEach(function (hash) { - var current = FS.nameTable[hash]; - - while (current) { - var next = current.name_next; - - if (mounts.includes(current.mount)) { - FS.destroyNode(current); - } - - current = next; - } - }); - - // no longer a mountpoint - node.mounted = null; - - // remove this mount from the child mounts - var idx = node.mount.mounts.indexOf(mount); - assert(idx !== -1); - node.mount.mounts.splice(idx, 1); - },lookup:function(parent, name) { - return parent.node_ops.lookup(parent, name); - },mknod:function(path, mode, dev) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - if (!name || name === '.' || name === '..') { - throw new FS.ErrnoError(28); - } - var errCode = FS.mayCreate(parent, name); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.mknod) { - throw new FS.ErrnoError(63); - } - return parent.node_ops.mknod(parent, name, mode, dev); - },create:function(path, mode) { - mode = mode !== undefined ? mode : 438 /* 0666 */; - mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - },mkdir:function(path, mode) { - mode = mode !== undefined ? mode : 511 /* 0777 */; - mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - },mkdirTree:function(path, mode) { - var dirs = path.split('/'); - var d = ''; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += '/' + dirs[i]; - try { - FS.mkdir(d, mode); - } catch(e) { - if (e.errno != 20) throw e; - } - } - },mkdev:function(path, mode, dev) { - if (typeof(dev) === 'undefined') { - dev = mode; - mode = 438 /* 0666 */; - } - mode |= 8192; - return FS.mknod(path, mode, dev); - },symlink:function(oldpath, newpath) { - if (!PATH_FS.resolve(oldpath)) { - throw new FS.ErrnoError(44); - } - var lookup = FS.lookupPath(newpath, { parent: true }); - var parent = lookup.node; - if (!parent) { - throw new FS.ErrnoError(44); - } - var newname = PATH.basename(newpath); - var errCode = FS.mayCreate(parent, newname); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.symlink) { - throw new FS.ErrnoError(63); - } - return parent.node_ops.symlink(parent, newname, oldpath); - },rename:function(old_path, new_path) { - var old_dirname = PATH.dirname(old_path); - var new_dirname = PATH.dirname(new_path); - var old_name = PATH.basename(old_path); - var new_name = PATH.basename(new_path); - // parents must exist - var lookup, old_dir, new_dir; - - // let the errors from non existant directories percolate up - lookup = FS.lookupPath(old_path, { parent: true }); - old_dir = lookup.node; - lookup = FS.lookupPath(new_path, { parent: true }); - new_dir = lookup.node; - - if (!old_dir || !new_dir) throw new FS.ErrnoError(44); - // need to be part of the same mount - if (old_dir.mount !== new_dir.mount) { - throw new FS.ErrnoError(75); - } - // source must exist - var old_node = FS.lookupNode(old_dir, old_name); - // old path should not be an ancestor of the new path - var relative = PATH_FS.relative(old_path, new_dirname); - if (relative.charAt(0) !== '.') { - throw new FS.ErrnoError(28); - } - // new path should not be an ancestor of the old path - relative = PATH_FS.relative(new_path, old_dirname); - if (relative.charAt(0) !== '.') { - throw new FS.ErrnoError(55); - } - // see if the new path already exists - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) { - // not fatal - } - // early out if nothing needs to change - if (old_node === new_node) { - return; - } - // we'll need to delete the old entry - var isdir = FS.isDir(old_node.mode); - var errCode = FS.mayDelete(old_dir, old_name, isdir); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - // need delete permissions if we'll be overwriting. - // need create permissions if new doesn't already exist. - errCode = new_node ? - FS.mayDelete(new_dir, new_name, isdir) : - FS.mayCreate(new_dir, new_name); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!old_dir.node_ops.rename) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { - throw new FS.ErrnoError(10); - } - // if we are going to change the parent, check write permissions - if (new_dir !== old_dir) { - errCode = FS.nodePermissions(old_dir, 'w'); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - } - // remove the node from the lookup hash - FS.hashRemoveNode(old_node); - // do the underlying fs rename - try { - old_dir.node_ops.rename(old_node, new_dir, new_name); - } catch (e) { - throw e; - } finally { - // add the node back to the hash (in case node_ops.rename - // changed its name) - FS.hashAddNode(old_node); - } - },rmdir:function(path) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - var node = FS.lookupNode(parent, name); - var errCode = FS.mayDelete(parent, name, true); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.rmdir) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); - } - parent.node_ops.rmdir(parent, name); - FS.destroyNode(node); - },readdir:function(path) { - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.readdir(node); - },unlink:function(path) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - if (!parent) { - throw new FS.ErrnoError(44); - } - var name = PATH.basename(path); - var node = FS.lookupNode(parent, name); - var errCode = FS.mayDelete(parent, name, false); - if (errCode) { - // According to POSIX, we should map EISDIR to EPERM, but - // we instead do what Linux does (and we must, as we use - // the musl linux libc). - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.unlink) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); - } - parent.node_ops.unlink(parent, name); - FS.destroyNode(node); - },readlink:function(path) { - var lookup = FS.lookupPath(path); - var link = lookup.node; - if (!link) { - throw new FS.ErrnoError(44); - } - if (!link.node_ops.readlink) { - throw new FS.ErrnoError(28); - } - return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - },stat:function(path, dontFollow) { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - },lstat:function(path) { - return FS.stat(path, true); - },chmod:function(path, mode, dontFollow) { - var node; - if (typeof path === 'string') { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - },lchmod:function(path, mode) { - FS.chmod(path, mode, true); - },fchmod:function(fd, mode) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - FS.chmod(stream.node, mode); - },chown:function(path, uid, gid, dontFollow) { - var node; - if (typeof path === 'string') { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - // we ignore the uid / gid for now - }); - },lchown:function(path, uid, gid) { - FS.chown(path, uid, gid, true); - },fchown:function(fd, uid, gid) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - FS.chown(stream.node, uid, gid); - },truncate:function(path, len) { - if (len < 0) { - throw new FS.ErrnoError(28); - } - var node; - if (typeof path === 'string') { - var lookup = FS.lookupPath(path, { follow: true }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - if (FS.isDir(node.mode)) { - throw new FS.ErrnoError(31); - } - if (!FS.isFile(node.mode)) { - throw new FS.ErrnoError(28); - } - var errCode = FS.nodePermissions(node, 'w'); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - },ftruncate:function(fd, len) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - },utime:function(path, atime, mtime) { - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - },open:function(path, flags, mode, fd_start, fd_end) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; - mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; - if ((flags & 64)) { - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path === 'object') { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) { - // ignore - } - } - // perhaps we need to create the node - var created = false; - if ((flags & 64)) { - if (node) { - // if O_CREAT and O_EXCL are set, error out if the node already exists - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - // node doesn't exist, try to create it - node = FS.mknod(path, mode, 0); - created = true; - } - } - if (!node) { - throw new FS.ErrnoError(44); - } - // can't truncate a device - if (FS.isChrdev(node.mode)) { - flags &= ~512; - } - // if asked only for a directory, then this must be one - if ((flags & 65536) && !FS.isDir(node.mode)) { - throw new FS.ErrnoError(54); - } - // check permissions, if this is not a file we just created now (it is ok to - // create and write to a file with read-only permissions; it is read-only - // for later use) - if (!created) { - var errCode = FS.mayOpen(node, flags); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - } - // do truncation if necessary - if ((flags & 512)) { - FS.truncate(node, 0); - } - // we've already handled these, don't pass down to the underlying vfs - flags &= ~(128 | 512 | 131072); - - // register the stream with the filesystem - var stream = FS.createStream({ - node: node, - path: FS.getPath(node), // we want the absolute path to the node - id: node.id, - flags: flags, - mode: node.mode, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - node_ops: node.node_ops, - // used by the file family libc calls (fopen, fwrite, ferror, etc.) - ungotten: [], - error: false - }, fd_start, fd_end); - // call the new stream's open function - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module['logReadFiles'] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - return stream; - },close:function(stream) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (stream.getdents) stream.getdents = null; // free readdir state - try { - if (stream.stream_ops.close) { - stream.stream_ops.close(stream); - } - } catch (e) { - throw e; - } finally { - FS.closeStream(stream.fd); - } - stream.fd = null; - },isClosed:function(stream) { - return stream.fd === null; - },llseek:function(stream, offset, whence) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (!stream.seekable || !stream.stream_ops.llseek) { - throw new FS.ErrnoError(70); - } - if (whence != 0 && whence != 1 && whence != 2) { - throw new FS.ErrnoError(28); - } - stream.position = stream.stream_ops.llseek(stream, offset, whence); - stream.ungotten = []; - return stream.position; - },read:function(stream, buffer, offset, length, position) { - if (length < 0 || position < 0) { - throw new FS.ErrnoError(28); - } - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 1) { - throw new FS.ErrnoError(8); - } - if (FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(31); - } - if (!stream.stream_ops.read) { - throw new FS.ErrnoError(28); - } - var seeking = typeof position !== 'undefined'; - if (!seeking) { - position = stream.position; - } else if (!stream.seekable) { - throw new FS.ErrnoError(70); - } - var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); - if (!seeking) stream.position += bytesRead; - return bytesRead; - },write:function(stream, buffer, offset, length, position, canOwn) { - if (length < 0 || position < 0) { - throw new FS.ErrnoError(28); - } - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(31); - } - if (!stream.stream_ops.write) { - throw new FS.ErrnoError(28); - } - if (stream.seekable && stream.flags & 1024) { - // seek to the end before writing in append mode - FS.llseek(stream, 0, 2); - } - var seeking = typeof position !== 'undefined'; - if (!seeking) { - position = stream.position; - } else if (!stream.seekable) { - throw new FS.ErrnoError(70); - } - var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); - if (!seeking) stream.position += bytesWritten; - return bytesWritten; - },allocate:function(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - },mmap:function(stream, address, length, position, prot, flags) { - // User requests writing to file (prot & PROT_WRITE != 0). - // Checking if we have permissions to write to the file unless - // MAP_PRIVATE flag is set. According to POSIX spec it is possible - // to write to file opened in read-only mode with MAP_PRIVATE flag, - // as all modifications will be visible only in the memory of - // the current process. - if ((prot & 2) !== 0 - && (flags & 2) === 0 - && (stream.flags & 2097155) !== 2) { - throw new FS.ErrnoError(2); - } - if ((stream.flags & 2097155) === 1) { - throw new FS.ErrnoError(2); - } - if (!stream.stream_ops.mmap) { - throw new FS.ErrnoError(43); - } - return stream.stream_ops.mmap(stream, address, length, position, prot, flags); - },msync:function(stream, buffer, offset, length, mmapFlags) { - if (!stream || !stream.stream_ops.msync) { - return 0; - } - return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); - },munmap:function(stream) { - return 0; - },ioctl:function(stream, cmd, arg) { - if (!stream.stream_ops.ioctl) { - throw new FS.ErrnoError(59); - } - return stream.stream_ops.ioctl(stream, cmd, arg); - },readFile:function(path, opts = {}) { - opts.flags = opts.flags || 0; - opts.encoding = opts.encoding || 'binary'; - if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { - throw new Error('Invalid encoding type "' + opts.encoding + '"'); - } - var ret; - var stream = FS.open(path, opts.flags); - var stat = FS.stat(path); - var length = stat.size; - var buf = new Uint8Array(length); - FS.read(stream, buf, 0, length, 0); - if (opts.encoding === 'utf8') { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === 'binary') { - ret = buf; - } - FS.close(stream); - return ret; - },writeFile:function(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data === 'string') { - var buf = new Uint8Array(lengthBytesUTF8(data)+1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error('Unsupported data type'); - } - FS.close(stream); - },cwd:function() { - return FS.currentPath; - },chdir:function(path) { - var lookup = FS.lookupPath(path, { follow: true }); - if (lookup.node === null) { - throw new FS.ErrnoError(44); - } - if (!FS.isDir(lookup.node.mode)) { - throw new FS.ErrnoError(54); - } - var errCode = FS.nodePermissions(lookup.node, 'x'); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - FS.currentPath = lookup.path; - },createDefaultDirectories:function() { - FS.mkdir('/tmp'); - FS.mkdir('/home'); - FS.mkdir('/home/web_user'); - },createDefaultDevices:function() { - // create /dev - FS.mkdir('/dev'); - // setup /dev/null - FS.registerDevice(FS.makedev(1, 3), { - read: function() { return 0; }, - write: function(stream, buffer, offset, length, pos) { return length; } - }); - FS.mkdev('/dev/null', FS.makedev(1, 3)); - // setup /dev/tty and /dev/tty1 - // stderr needs to print output using err() rather than out() - // so we register a second tty just for it. - TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); - TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); - FS.mkdev('/dev/tty', FS.makedev(5, 0)); - FS.mkdev('/dev/tty1', FS.makedev(6, 0)); - // setup /dev/[u]random - var random_device = getRandomDevice(); - FS.createDevice('/dev', 'random', random_device); - FS.createDevice('/dev', 'urandom', random_device); - // we're not going to emulate the actual shm device, - // just create the tmp dirs that reside in it commonly - FS.mkdir('/dev/shm'); - FS.mkdir('/dev/shm/tmp'); - },createSpecialDirectories:function() { - // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the - // name of the stream for fd 6 (see test_unistd_ttyname) - FS.mkdir('/proc'); - var proc_self = FS.mkdir('/proc/self'); - FS.mkdir('/proc/self/fd'); - FS.mount({ - mount: function() { - var node = FS.createNode(proc_self, 'fd', 16384 | 511 /* 0777 */, 73); - node.node_ops = { - lookup: function(parent, name) { - var fd = +name; - var stream = FS.getStream(fd); - if (!stream) throw new FS.ErrnoError(8); - var ret = { - parent: null, - mount: { mountpoint: 'fake' }, - node_ops: { readlink: function() { return stream.path } } - }; - ret.parent = ret; // make it look like a simple root node - return ret; - } - }; - return node; - } - }, {}, '/proc/self/fd'); - },createStandardStreams:function() { - // TODO deprecate the old functionality of a single - // input / output callback and that utilizes FS.createDevice - // and instead require a unique set of stream ops - - // by default, we symlink the standard streams to the - // default tty devices. however, if the standard streams - // have been overwritten we create a unique device for - // them instead. - if (Module['stdin']) { - FS.createDevice('/dev', 'stdin', Module['stdin']); - } else { - FS.symlink('/dev/tty', '/dev/stdin'); - } - if (Module['stdout']) { - FS.createDevice('/dev', 'stdout', null, Module['stdout']); - } else { - FS.symlink('/dev/tty', '/dev/stdout'); - } - if (Module['stderr']) { - FS.createDevice('/dev', 'stderr', null, Module['stderr']); - } else { - FS.symlink('/dev/tty1', '/dev/stderr'); - } - - // open default streams for the stdin, stdout and stderr devices - var stdin = FS.open('/dev/stdin', 0); - var stdout = FS.open('/dev/stdout', 1); - var stderr = FS.open('/dev/stderr', 1); - assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); - assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); - assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); - },ensureErrnoError:function() { - if (FS.ErrnoError) return; - FS.ErrnoError = /** @this{Object} */ function ErrnoError(errno, node) { - this.node = node; - this.setErrno = /** @this{Object} */ function(errno) { - this.errno = errno; - for (var key in ERRNO_CODES) { - if (ERRNO_CODES[key] === errno) { - this.code = key; - break; - } - } - }; - this.setErrno(errno); - this.message = ERRNO_MESSAGES[errno]; - - // Try to get a maximally helpful stack trace. On Node.js, getting Error.stack - // now ensures it shows what we want. - if (this.stack) { - // Define the stack property for Node.js 4, which otherwise errors on the next line. - Object.defineProperty(this, "stack", { value: (new Error).stack, writable: true }); - this.stack = demangleAll(this.stack); - } - }; - FS.ErrnoError.prototype = new Error(); - FS.ErrnoError.prototype.constructor = FS.ErrnoError; - // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) - [44].forEach(function(code) { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ''; - }); - },staticInit:function() { - FS.ensureErrnoError(); - - FS.nameTable = new Array(4096); - - FS.mount(MEMFS, {}, '/'); - - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - - FS.filesystems = { - 'MEMFS': MEMFS, - }; - },init:function(input, output, error) { - assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); - FS.init.initialized = true; - - FS.ensureErrnoError(); - - // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here - Module['stdin'] = input || Module['stdin']; - Module['stdout'] = output || Module['stdout']; - Module['stderr'] = error || Module['stderr']; - - FS.createStandardStreams(); - },quit:function() { - FS.init.initialized = false; - // force-flush all streams, so we get musl std streams printed out - _fflush(0); - // close all of our streams - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - FS.close(stream); - } - },getMode:function(canRead, canWrite) { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; - },findObject:function(path, dontResolveLastLink) { - var ret = FS.analyzePath(path, dontResolveLastLink); - if (ret.exists) { - return ret.object; - } else { - return null; - } - },analyzePath:function(path, dontResolveLastLink) { - // operate from within the context of the symlink's target - try { - var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); - path = lookup.path; - } catch (e) { - } - var ret = { - isRoot: false, exists: false, error: 0, name: null, path: null, object: null, - parentExists: false, parentPath: null, parentObject: null - }; - try { - var lookup = FS.lookupPath(path, { parent: true }); - ret.parentExists = true; - ret.parentPath = lookup.path; - ret.parentObject = lookup.node; - ret.name = PATH.basename(path); - lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); - ret.exists = true; - ret.path = lookup.path; - ret.object = lookup.node; - ret.name = lookup.node.name; - ret.isRoot = lookup.path === '/'; - } catch (e) { - ret.error = e.errno; - }; - return ret; - },createPath:function(parent, path, canRead, canWrite) { - parent = typeof parent === 'string' ? parent : FS.getPath(parent); - var parts = path.split('/').reverse(); - while (parts.length) { - var part = parts.pop(); - if (!part) continue; - var current = PATH.join2(parent, part); - try { - FS.mkdir(current); - } catch (e) { - // ignore EEXIST - } - parent = current; - } - return current; - },createFile:function(parent, name, properties, canRead, canWrite) { - var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); - var mode = FS.getMode(canRead, canWrite); - return FS.create(path, mode); - },createDataFile:function(parent, name, data, canRead, canWrite, canOwn) { - var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; - var mode = FS.getMode(canRead, canWrite); - var node = FS.create(path, mode); - if (data) { - if (typeof data === 'string') { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - // make sure we can write to the file - FS.chmod(node, mode | 146); - var stream = FS.open(node, 577); - FS.write(stream, data, 0, data.length, 0, canOwn); - FS.close(stream); - FS.chmod(node, mode); - } - return node; - },createDevice:function(parent, name, input, output) { - var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); - var mode = FS.getMode(!!input, !!output); - if (!FS.createDevice.major) FS.createDevice.major = 64; - var dev = FS.makedev(FS.createDevice.major++, 0); - // Create a fake device that a set of stream ops to emulate - // the old behavior. - FS.registerDevice(dev, { - open: function(stream) { - stream.seekable = false; - }, - close: function(stream) { - // flush any pending line data - if (output && output.buffer && output.buffer.length) { - output(10); - } - }, - read: function(stream, buffer, offset, length, pos /* ignored */) { - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset+i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write: function(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset+i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - },forceLoadFile:function(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest !== 'undefined') { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - // Command-line. - try { - // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as - // read() will try to parse UTF8. - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error('Cannot load without read() or XMLHttpRequest.'); - } - },createLazyFile:function(parent, name, url, canRead, canWrite) { - // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. - /** @constructor */ - function LazyUint8Array() { - this.lengthKnown = false; - this.chunks = []; // Loaded chunks. Index is the chunk number - } - LazyUint8Array.prototype.get = /** @this{Object} */ function LazyUint8Array_get(idx) { - if (idx > this.length-1 || idx < 0) { - return undefined; - } - var chunkOffset = idx % this.chunkSize; - var chunkNum = (idx / this.chunkSize)|0; - return this.getter(chunkNum)[chunkOffset]; - }; - LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { - this.getter = getter; - }; - LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { - // Find length - var xhr = new XMLHttpRequest(); - xhr.open('HEAD', url, false); - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - var datalength = Number(xhr.getResponseHeader("Content-length")); - var header; - var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; - var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; - - var chunkSize = 1024*1024; // Chunk size in bytes - - if (!hasByteServing) chunkSize = datalength; - - // Function to get a range from the remote URL. - var doXHR = (function(from, to) { - if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); - - // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); - - // Some hints to the browser that we want binary data. - if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; - if (xhr.overrideMimeType) { - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - } - - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */(xhr.response || [])); - } else { - return intArrayFromString(xhr.responseText || '', true); - } - }); - var lazyArray = this; - lazyArray.setDataGetter(function(chunkNum) { - var start = chunkNum * chunkSize; - var end = (chunkNum+1) * chunkSize - 1; // including this byte - end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block - if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { - lazyArray.chunks[chunkNum] = doXHR(start, end); - } - if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); - return lazyArray.chunks[chunkNum]; - }); - - if (usesGzip || !datalength) { - // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length - chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file - datalength = this.getter(0).length; - chunkSize = datalength; - out("LazyFiles on gzip forces download of the whole file when length is accessed"); - } - - this._length = datalength; - this._chunkSize = chunkSize; - this.lengthKnown = true; - }; - if (typeof XMLHttpRequest !== 'undefined') { - if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; - var lazyArray = new LazyUint8Array(); - Object.defineProperties(lazyArray, { - length: { - get: /** @this{Object} */ function() { - if (!this.lengthKnown) { - this.cacheLength(); - } - return this._length; - } - }, - chunkSize: { - get: /** @this{Object} */ function() { - if (!this.lengthKnown) { - this.cacheLength(); - } - return this._chunkSize; - } - } - }); - - var properties = { isDevice: false, contents: lazyArray }; - } else { - var properties = { isDevice: false, url: url }; - } - - var node = FS.createFile(parent, name, properties, canRead, canWrite); - // This is a total hack, but I want to get this lazy file code out of the - // core of MEMFS. If we want to keep this lazy file concept I feel it should - // be its own thin LAZYFS proxying calls to MEMFS. - if (properties.contents) { - node.contents = properties.contents; - } else if (properties.url) { - node.contents = null; - node.url = properties.url; - } - // Add a function that defers querying the file size until it is asked the first time. - Object.defineProperties(node, { - usedBytes: { - get: /** @this {FSNode} */ function() { return this.contents.length; } - } - }); - // override each stream op with one that tries to force load the lazy file first - var stream_ops = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(function(key) { - var fn = node.stream_ops[key]; - stream_ops[key] = function forceLoadLazyFile() { - FS.forceLoadFile(node); - return fn.apply(null, arguments); - }; - }); - // use a custom read function - stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { - FS.forceLoadFile(node); - var contents = stream.node.contents; - if (position >= contents.length) - return 0; - var size = Math.min(contents.length - position, length); - assert(size >= 0); - if (contents.slice) { // normal array - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR - buffer[offset + i] = contents.get(position + i); - } - } - return size; - }; - node.stream_ops = stream_ops; - return node; - },createPreloadedFile:function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { - Browser.init(); // XXX perhaps this method should move onto Browser? - // TODO we should allow people to just pass in a complete filename instead - // of parent and name being that we just join them anyways - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname - function processData(byteArray) { - function finish(byteArray) { - if (preFinish) preFinish(); - if (!dontCreateFile) { - FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - if (onload) onload(); - removeRunDependency(dep); - } - var handled = false; - Module['preloadPlugins'].forEach(function(plugin) { - if (handled) return; - if (plugin['canHandle'](fullname)) { - plugin['handle'](byteArray, fullname, finish, function() { - if (onerror) onerror(); - removeRunDependency(dep); - }); - handled = true; - } - }); - if (!handled) finish(byteArray); - } - addRunDependency(dep); - if (typeof url == 'string') { - asyncLoad(url, function(byteArray) { - processData(byteArray); - }, onerror); - } else { - processData(url); - } - },indexedDB:function() { - return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; - },DB_NAME:function() { - return 'EM_FS_' + window.location.pathname; - },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function(paths, onload, onerror) { - onload = onload || function(){}; - onerror = onerror || function(){}; - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { - out('creating db'); - var db = openRequest.result; - db.createObjectStore(FS.DB_STORE_NAME); - }; - openRequest.onsuccess = function openRequest_onsuccess() { - var db = openRequest.result; - var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, fail = 0, total = paths.length; - function finish() { - if (fail == 0) onload(); else onerror(); - } - paths.forEach(function(path) { - var putRequest = files.put(FS.analyzePath(path).object.contents, path); - putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; - putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - },loadFilesFromDB:function(paths, onload, onerror) { - onload = onload || function(){}; - onerror = onerror || function(){}; - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = onerror; // no database to load from - openRequest.onsuccess = function openRequest_onsuccess() { - var db = openRequest.result; - try { - var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); - } catch(e) { - onerror(e); - return; - } - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, fail = 0, total = paths.length; - function finish() { - if (fail == 0) onload(); else onerror(); - } - paths.forEach(function(path) { - var getRequest = files.get(path); - getRequest.onsuccess = function getRequest_onsuccess() { - if (FS.analyzePath(path).exists) { - FS.unlink(path); - } - FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); - ok++; - if (ok + fail == total) finish(); - }; - getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - },absolutePath:function() { - abort('FS.absolutePath has been removed; use PATH_FS.resolve instead'); - },createFolder:function() { - abort('FS.createFolder has been removed; use FS.mkdir instead'); - },createLink:function() { - abort('FS.createLink has been removed; use FS.symlink instead'); - },joinPath:function() { - abort('FS.joinPath has been removed; use PATH.join instead'); - },mmapAlloc:function() { - abort('FS.mmapAlloc has been replaced by the top level function mmapAlloc'); - },standardizePath:function() { - abort('FS.standardizePath has been removed; use PATH.normalize instead'); - }}; - var SYSCALLS = {mappings:{},DEFAULT_POLLMASK:5,calculateAt:function(dirfd, path, allowEmpty) { - if (path[0] === '/') { - return path; - } - // relative path - var dir; - if (dirfd === -100) { - dir = FS.cwd(); - } else { - var dirstream = FS.getStream(dirfd); - if (!dirstream) throw new FS.ErrnoError(8); - dir = dirstream.path; - } - if (path.length == 0) { - if (!allowEmpty) { - throw new FS.ErrnoError(44);; - } - return dir; - } - return PATH.join2(dir, path); - },doStat:function(func, path, buf) { - try { - var stat = func(path); - } catch (e) { - if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { - // an error occurred while trying to look up the path; we should just report ENOTDIR - return -54; - } - throw e; - } - HEAP32[((buf)>>2)] = stat.dev; - HEAP32[(((buf)+(4))>>2)] = 0; - HEAP32[(((buf)+(8))>>2)] = stat.ino; - HEAP32[(((buf)+(12))>>2)] = stat.mode; - HEAP32[(((buf)+(16))>>2)] = stat.nlink; - HEAP32[(((buf)+(20))>>2)] = stat.uid; - HEAP32[(((buf)+(24))>>2)] = stat.gid; - HEAP32[(((buf)+(28))>>2)] = stat.rdev; - HEAP32[(((buf)+(32))>>2)] = 0; - (tempI64 = [stat.size>>>0,(tempDouble=stat.size,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(40))>>2)] = tempI64[0],HEAP32[(((buf)+(44))>>2)] = tempI64[1]); - HEAP32[(((buf)+(48))>>2)] = 4096; - HEAP32[(((buf)+(52))>>2)] = stat.blocks; - HEAP32[(((buf)+(56))>>2)] = (stat.atime.getTime() / 1000)|0; - HEAP32[(((buf)+(60))>>2)] = 0; - HEAP32[(((buf)+(64))>>2)] = (stat.mtime.getTime() / 1000)|0; - HEAP32[(((buf)+(68))>>2)] = 0; - HEAP32[(((buf)+(72))>>2)] = (stat.ctime.getTime() / 1000)|0; - HEAP32[(((buf)+(76))>>2)] = 0; - (tempI64 = [stat.ino>>>0,(tempDouble=stat.ino,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(80))>>2)] = tempI64[0],HEAP32[(((buf)+(84))>>2)] = tempI64[1]); - return 0; - },doMsync:function(addr, stream, len, flags, offset) { - var buffer = HEAPU8.slice(addr, addr + len); - FS.msync(stream, buffer, offset, len, flags); - },doMkdir:function(path, mode) { - // remove a trailing slash, if one - /a/b/ has basename of '', but - // we want to create b in the context of this function - path = PATH.normalize(path); - if (path[path.length-1] === '/') path = path.substr(0, path.length-1); - FS.mkdir(path, mode, 0); - return 0; - },doMknod:function(path, mode, dev) { - // we don't want this in the JS API as it uses mknod to create all nodes. - switch (mode & 61440) { - case 32768: - case 8192: - case 24576: - case 4096: - case 49152: - break; - default: return -28; - } - FS.mknod(path, mode, dev); - return 0; - },doReadlink:function(path, buf, bufsize) { - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf+len]; - stringToUTF8(ret, buf, bufsize+1); - // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) - // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. - HEAP8[buf+len] = endChar; - - return len; - },doAccess:function(path, amode) { - if (amode & ~7) { - // need a valid mode - return -28; - } - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - if (!node) { - return -44; - } - var perms = ''; - if (amode & 4) perms += 'r'; - if (amode & 2) perms += 'w'; - if (amode & 1) perms += 'x'; - if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - },doDup:function(path, flags, suggestFD) { - var suggest = FS.getStream(suggestFD); - if (suggest) FS.close(suggest); - return FS.open(path, flags, 0, suggestFD, suggestFD).fd; - },doReadv:function(stream, iov, iovcnt, offset) { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[(((iov)+(i*8))>>2)]; - var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; - var curr = FS.read(stream, HEAP8,ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; // nothing more to read - } - return ret; - },doWritev:function(stream, iov, iovcnt, offset) { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[(((iov)+(i*8))>>2)]; - var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; - var curr = FS.write(stream, HEAP8,ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - } - return ret; - },varargs:undefined,get:function() { - assert(SYSCALLS.varargs != undefined); - SYSCALLS.varargs += 4; - var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; - return ret; - },getStr:function(ptr) { - var ret = UTF8ToString(ptr); - return ret; - },getStreamFromFD:function(fd) { - var stream = FS.getStream(fd); - if (!stream) throw new FS.ErrnoError(8); - return stream; - },get64:function(low, high) { - if (low >= 0) assert(high === 0); - else assert(high === -1); - return low; - }}; - function _environ_get(__environ, environ_buf) { - var bufSize = 0; - getEnvStrings().forEach(function(string, i) { - var ptr = environ_buf + bufSize; - HEAP32[(((__environ)+(i * 4))>>2)] = ptr; - writeAsciiToMemory(string, ptr); - bufSize += string.length + 1; - }); - return 0; - } - - function _environ_sizes_get(penviron_count, penviron_buf_size) { - var strings = getEnvStrings(); - HEAP32[((penviron_count)>>2)] = strings.length; - var bufSize = 0; - strings.forEach(function(string) { - bufSize += string.length + 1; - }); - HEAP32[((penviron_buf_size)>>2)] = bufSize; - return 0; - } - - function _fd_close(fd) {try { - - var stream = SYSCALLS.getStreamFromFD(fd); - FS.close(stream); - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - function _fd_read(fd, iov, iovcnt, pnum) {try { - - var stream = SYSCALLS.getStreamFromFD(fd); - var num = SYSCALLS.doReadv(stream, iov, iovcnt); - HEAP32[((pnum)>>2)] = num; - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {try { - - - var stream = SYSCALLS.getStreamFromFD(fd); - var HIGH_OFFSET = 0x100000000; // 2^32 - // use an unsigned operator on low and shift high by 32-bits - var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); - - var DOUBLE_LIMIT = 0x20000000000000; // 2^53 - // we also check for equality since DOUBLE_LIMIT + 1 == DOUBLE_LIMIT - if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { - return -61; - } - - FS.llseek(stream, offset, whence); - (tempI64 = [stream.position>>>0,(tempDouble=stream.position,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((newOffset)>>2)] = tempI64[0],HEAP32[(((newOffset)+(4))>>2)] = tempI64[1]); - if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - function _fd_write(fd, iov, iovcnt, pnum) {try { - - ; - var stream = SYSCALLS.getStreamFromFD(fd); - var num = SYSCALLS.doWritev(stream, iov, iovcnt); - HEAP32[((pnum)>>2)] = num; - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - function _setTempRet0(val) { - setTempRet0(val); - } - - function __isLeapYear(year) { - return year%4 === 0 && (year%100 !== 0 || year%400 === 0); - } - - function __arraySum(array, index) { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) { - // no-op - } - return sum; - } - - var __MONTH_DAYS_LEAP = [31,29,31,30,31,30,31,31,30,31,30,31]; - - var __MONTH_DAYS_REGULAR = [31,28,31,30,31,30,31,31,30,31,30,31]; - function __addDays(date, days) { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = __isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth]; - - if (days > daysInCurrentMonth-newDate.getDate()) { - // we spill over to next month - days -= (daysInCurrentMonth-newDate.getDate()+1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth+1) - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear()+1); - } - } else { - // we stay in current month - newDate.setDate(newDate.getDate()+days); - return newDate; - } - } - - return newDate; - } - function _strftime(s, maxsize, format, tm) { - // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr); - // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html - - var tm_zone = HEAP32[(((tm)+(40))>>2)]; - - var date = { - tm_sec: HEAP32[((tm)>>2)], - tm_min: HEAP32[(((tm)+(4))>>2)], - tm_hour: HEAP32[(((tm)+(8))>>2)], - tm_mday: HEAP32[(((tm)+(12))>>2)], - tm_mon: HEAP32[(((tm)+(16))>>2)], - tm_year: HEAP32[(((tm)+(20))>>2)], - tm_wday: HEAP32[(((tm)+(24))>>2)], - tm_yday: HEAP32[(((tm)+(28))>>2)], - tm_isdst: HEAP32[(((tm)+(32))>>2)], - tm_gmtoff: HEAP32[(((tm)+(36))>>2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : '' - }; - - var pattern = UTF8ToString(format); - - // expand format - var EXPANSION_RULES_1 = { - '%c': '%a %b %d %H:%M:%S %Y', // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug 3 14:02:01 2013 - '%D': '%m/%d/%y', // Equivalent to %m / %d / %y - '%F': '%Y-%m-%d', // Equivalent to %Y - %m - %d - '%h': '%b', // Equivalent to %b - '%r': '%I:%M:%S %p', // Replaced by the time in a.m. and p.m. notation - '%R': '%H:%M', // Replaced by the time in 24-hour notation - '%T': '%H:%M:%S', // Replaced by the time - '%x': '%m/%d/%y', // Replaced by the locale's appropriate date representation - '%X': '%H:%M:%S', // Replaced by the locale's appropriate time representation - // Modified Conversion Specifiers - '%Ec': '%c', // Replaced by the locale's alternative appropriate date and time representation. - '%EC': '%C', // Replaced by the name of the base year (period) in the locale's alternative representation. - '%Ex': '%m/%d/%y', // Replaced by the locale's alternative date representation. - '%EX': '%H:%M:%S', // Replaced by the locale's alternative time representation. - '%Ey': '%y', // Replaced by the offset from %EC (year only) in the locale's alternative representation. - '%EY': '%Y', // Replaced by the full alternative year representation. - '%Od': '%d', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading zeros if there is any alternative symbol for zero; otherwise, with leading characters. - '%Oe': '%e', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading characters. - '%OH': '%H', // Replaced by the hour (24-hour clock) using the locale's alternative numeric symbols. - '%OI': '%I', // Replaced by the hour (12-hour clock) using the locale's alternative numeric symbols. - '%Om': '%m', // Replaced by the month using the locale's alternative numeric symbols. - '%OM': '%M', // Replaced by the minutes using the locale's alternative numeric symbols. - '%OS': '%S', // Replaced by the seconds using the locale's alternative numeric symbols. - '%Ou': '%u', // Replaced by the weekday as a number in the locale's alternative representation (Monday=1). - '%OU': '%U', // Replaced by the week number of the year (Sunday as the first day of the week, rules corresponding to %U ) using the locale's alternative numeric symbols. - '%OV': '%V', // Replaced by the week number of the year (Monday as the first day of the week, rules corresponding to %V ) using the locale's alternative numeric symbols. - '%Ow': '%w', // Replaced by the number of the weekday (Sunday=0) using the locale's alternative numeric symbols. - '%OW': '%W', // Replaced by the week number of the year (Monday as the first day of the week) using the locale's alternative numeric symbols. - '%Oy': '%y', // Replaced by the year (offset from %C ) using the locale's alternative numeric symbols. - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]); - } - - var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; - var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; - - function leadingSomething(value, digits, character) { - var str = typeof value === 'number' ? value.toString() : (value || ''); - while (str.length < digits) { - str = character[0]+str; - } - return str; - } - - function leadingNulls(value, digits) { - return leadingSomething(value, digits, '0'); - } - - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - - var compare; - if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) { - compare = sgn(date1.getDate()-date2.getDate()); - } - } - return compare; - } - - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: // Sunday - return new Date(janFourth.getFullYear()-1, 11, 29); - case 1: // Monday - return janFourth; - case 2: // Tuesday - return new Date(janFourth.getFullYear(), 0, 3); - case 3: // Wednesday - return new Date(janFourth.getFullYear(), 0, 2); - case 4: // Thursday - return new Date(janFourth.getFullYear(), 0, 1); - case 5: // Friday - return new Date(janFourth.getFullYear()-1, 11, 31); - case 6: // Saturday - return new Date(janFourth.getFullYear()-1, 11, 30); - } - } - - function getWeekBasedYear(date) { - var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); - - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4); - - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - // this date is after the start of the first week of this year - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear()+1; - } else { - return thisDate.getFullYear(); - } - } else { - return thisDate.getFullYear()-1; - } - } - - var EXPANSION_RULES_2 = { - '%a': function(date) { - return WEEKDAYS[date.tm_wday].substring(0,3); - }, - '%A': function(date) { - return WEEKDAYS[date.tm_wday]; - }, - '%b': function(date) { - return MONTHS[date.tm_mon].substring(0,3); - }, - '%B': function(date) { - return MONTHS[date.tm_mon]; - }, - '%C': function(date) { - var year = date.tm_year+1900; - return leadingNulls((year/100)|0,2); - }, - '%d': function(date) { - return leadingNulls(date.tm_mday, 2); - }, - '%e': function(date) { - return leadingSomething(date.tm_mday, 2, ' '); - }, - '%g': function(date) { - // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year. - // In this system, weeks begin on a Monday and week 1 of the year is the week that includes - // January 4th, which is also the week that includes the first Thursday of the year, and - // is also the first week that contains at least four days in the year. - // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of - // the last week of the preceding year; thus, for Saturday 2nd January 1999, - // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, - // or 31st is a Monday, it and any following days are part of week 1 of the following year. - // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01. - - return getWeekBasedYear(date).toString().substring(2); - }, - '%G': function(date) { - return getWeekBasedYear(date); - }, - '%H': function(date) { - return leadingNulls(date.tm_hour, 2); - }, - '%I': function(date) { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; - else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - '%j': function(date) { - // Day of the year (001-366) - return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3); - }, - '%m': function(date) { - return leadingNulls(date.tm_mon+1, 2); - }, - '%M': function(date) { - return leadingNulls(date.tm_min, 2); - }, - '%n': function() { - return '\n'; - }, - '%p': function(date) { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return 'AM'; - } else { - return 'PM'; - } - }, - '%S': function(date) { - return leadingNulls(date.tm_sec, 2); - }, - '%t': function() { - return '\t'; - }, - '%u': function(date) { - return date.tm_wday || 7; - }, - '%U': function(date) { - // Replaced by the week number of the year as a decimal number [00,53]. - // The first Sunday of January is the first day of week 1; - // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] - var janFirst = new Date(date.tm_year+1900, 0, 1); - var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7-janFirst.getDay()); - var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); - - // is target date after the first Sunday? - if (compareByDay(firstSunday, endDate) < 0) { - // calculate difference in days between first Sunday and endDate - var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; - var firstSundayUntilEndJanuary = 31-firstSunday.getDate(); - var days = firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); - return leadingNulls(Math.ceil(days/7), 2); - } - - return compareByDay(firstSunday, janFirst) === 0 ? '01': '00'; - }, - '%V': function(date) { - // Replaced by the week number of the year (Monday as the first day of the week) - // as a decimal number [01,53]. If the week containing 1 January has four - // or more days in the new year, then it is considered week 1. - // Otherwise, it is the last week of the previous year, and the next week is week 1. - // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday] - var janFourthThisYear = new Date(date.tm_year+1900, 0, 4); - var janFourthNextYear = new Date(date.tm_year+1901, 0, 4); - - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - - var endDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); - - if (compareByDay(endDate, firstWeekStartThisYear) < 0) { - // if given date is before this years first week, then it belongs to the 53rd week of last year - return '53'; - } - - if (compareByDay(firstWeekStartNextYear, endDate) <= 0) { - // if given date is after next years first week, then it belongs to the 01th week of next year - return '01'; - } - - // given date is in between CW 01..53 of this calendar year - var daysDifference; - if (firstWeekStartThisYear.getFullYear() < date.tm_year+1900) { - // first CW of this year starts last year - daysDifference = date.tm_yday+32-firstWeekStartThisYear.getDate() - } else { - // first CW of this year starts this year - daysDifference = date.tm_yday+1-firstWeekStartThisYear.getDate(); - } - return leadingNulls(Math.ceil(daysDifference/7), 2); - }, - '%w': function(date) { - return date.tm_wday; - }, - '%W': function(date) { - // Replaced by the week number of the year as a decimal number [00,53]. - // The first Monday of January is the first day of week 1; - // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] - var janFirst = new Date(date.tm_year, 0, 1); - var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7-janFirst.getDay()+1); - var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); - - // is target date after the first Monday? - if (compareByDay(firstMonday, endDate) < 0) { - var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; - var firstMondayUntilEndJanuary = 31-firstMonday.getDate(); - var days = firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); - return leadingNulls(Math.ceil(days/7), 2); - } - return compareByDay(firstMonday, janFirst) === 0 ? '01': '00'; - }, - '%y': function(date) { - // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year] - return (date.tm_year+1900).toString().substring(2); - }, - '%Y': function(date) { - // Replaced by the year as a decimal number (for example, 1997). [ tm_year] - return date.tm_year+1900; - }, - '%z': function(date) { - // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ). - // For example, "-0430" means 4 hours 30 minutes behind UTC (west of Greenwich). - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - // convert from minutes into hhmm format (which means 60 minutes = 100 units) - off = (off / 60)*100 + (off % 60); - return (ahead ? '+' : '-') + String("0000" + off).slice(-4); - }, - '%Z': function(date) { - return date.tm_zone; - }, - '%%': function() { - return '%'; - } - }; - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date)); - } - } - - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - - writeArrayToMemory(bytes, s); - return bytes.length-1; - } - function _strftime_l(s, maxsize, format, tm) { - return _strftime(s, maxsize, format, tm); // no locale support yet - } - - var FSNode = /** @constructor */ function(parent, name, mode, rdev) { - if (!parent) { - parent = this; // root node sets parent to itself - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - }; - var readMode = 292/*292*/ | 73/*73*/; - var writeMode = 146/*146*/; - Object.defineProperties(FSNode.prototype, { - read: { - get: /** @this{FSNode} */function() { - return (this.mode & readMode) === readMode; - }, - set: /** @this{FSNode} */function(val) { - val ? this.mode |= readMode : this.mode &= ~readMode; - } - }, - write: { - get: /** @this{FSNode} */function() { - return (this.mode & writeMode) === writeMode; - }, - set: /** @this{FSNode} */function(val) { - val ? this.mode |= writeMode : this.mode &= ~writeMode; - } - }, - isFolder: { - get: /** @this{FSNode} */function() { - return FS.isDir(this.mode); - } - }, - isDevice: { - get: /** @this{FSNode} */function() { - return FS.isChrdev(this.mode); - } - } - }); - FS.FSNode = FSNode; - FS.staticInit();; -ERRNO_CODES = { - 'EPERM': 63, - 'ENOENT': 44, - 'ESRCH': 71, - 'EINTR': 27, - 'EIO': 29, - 'ENXIO': 60, - 'E2BIG': 1, - 'ENOEXEC': 45, - 'EBADF': 8, - 'ECHILD': 12, - 'EAGAIN': 6, - 'EWOULDBLOCK': 6, - 'ENOMEM': 48, - 'EACCES': 2, - 'EFAULT': 21, - 'ENOTBLK': 105, - 'EBUSY': 10, - 'EEXIST': 20, - 'EXDEV': 75, - 'ENODEV': 43, - 'ENOTDIR': 54, - 'EISDIR': 31, - 'EINVAL': 28, - 'ENFILE': 41, - 'EMFILE': 33, - 'ENOTTY': 59, - 'ETXTBSY': 74, - 'EFBIG': 22, - 'ENOSPC': 51, - 'ESPIPE': 70, - 'EROFS': 69, - 'EMLINK': 34, - 'EPIPE': 64, - 'EDOM': 18, - 'ERANGE': 68, - 'ENOMSG': 49, - 'EIDRM': 24, - 'ECHRNG': 106, - 'EL2NSYNC': 156, - 'EL3HLT': 107, - 'EL3RST': 108, - 'ELNRNG': 109, - 'EUNATCH': 110, - 'ENOCSI': 111, - 'EL2HLT': 112, - 'EDEADLK': 16, - 'ENOLCK': 46, - 'EBADE': 113, - 'EBADR': 114, - 'EXFULL': 115, - 'ENOANO': 104, - 'EBADRQC': 103, - 'EBADSLT': 102, - 'EDEADLOCK': 16, - 'EBFONT': 101, - 'ENOSTR': 100, - 'ENODATA': 116, - 'ETIME': 117, - 'ENOSR': 118, - 'ENONET': 119, - 'ENOPKG': 120, - 'EREMOTE': 121, - 'ENOLINK': 47, - 'EADV': 122, - 'ESRMNT': 123, - 'ECOMM': 124, - 'EPROTO': 65, - 'EMULTIHOP': 36, - 'EDOTDOT': 125, - 'EBADMSG': 9, - 'ENOTUNIQ': 126, - 'EBADFD': 127, - 'EREMCHG': 128, - 'ELIBACC': 129, - 'ELIBBAD': 130, - 'ELIBSCN': 131, - 'ELIBMAX': 132, - 'ELIBEXEC': 133, - 'ENOSYS': 52, - 'ENOTEMPTY': 55, - 'ENAMETOOLONG': 37, - 'ELOOP': 32, - 'EOPNOTSUPP': 138, - 'EPFNOSUPPORT': 139, - 'ECONNRESET': 15, - 'ENOBUFS': 42, - 'EAFNOSUPPORT': 5, - 'EPROTOTYPE': 67, - 'ENOTSOCK': 57, - 'ENOPROTOOPT': 50, - 'ESHUTDOWN': 140, - 'ECONNREFUSED': 14, - 'EADDRINUSE': 3, - 'ECONNABORTED': 13, - 'ENETUNREACH': 40, - 'ENETDOWN': 38, - 'ETIMEDOUT': 73, - 'EHOSTDOWN': 142, - 'EHOSTUNREACH': 23, - 'EINPROGRESS': 26, - 'EALREADY': 7, - 'EDESTADDRREQ': 17, - 'EMSGSIZE': 35, - 'EPROTONOSUPPORT': 66, - 'ESOCKTNOSUPPORT': 137, - 'EADDRNOTAVAIL': 4, - 'ENETRESET': 39, - 'EISCONN': 30, - 'ENOTCONN': 53, - 'ETOOMANYREFS': 141, - 'EUSERS': 136, - 'EDQUOT': 19, - 'ESTALE': 72, - 'ENOTSUP': 138, - 'ENOMEDIUM': 148, - 'EILSEQ': 25, - 'EOVERFLOW': 61, - 'ECANCELED': 11, - 'ENOTRECOVERABLE': 56, - 'EOWNERDEAD': 62, - 'ESTRPIPE': 135, - };; -var ASSERTIONS = true; - - - -/** @type {function(string, boolean=, number=)} */ -function intArrayFromString(stringy, dontAddNull, length) { - var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; - var u8array = new Array(len); - var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); - if (dontAddNull) u8array.length = numBytesWritten; - return u8array; -} - -function intArrayToString(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - var chr = array[i]; - if (chr > 0xFF) { - if (ASSERTIONS) { - assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); - } - chr &= 0xFF; - } - ret.push(String.fromCharCode(chr)); - } - return ret.join(''); -} - - -var asmLibraryArg = { - "__cxa_allocate_exception": ___cxa_allocate_exception, - "__cxa_throw": ___cxa_throw, - "abort": _abort, - "emscripten_memcpy_big": _emscripten_memcpy_big, - "emscripten_resize_heap": _emscripten_resize_heap, - "environ_get": _environ_get, - "environ_sizes_get": _environ_sizes_get, - "fd_close": _fd_close, - "fd_read": _fd_read, - "fd_seek": _fd_seek, - "fd_write": _fd_write, - "setTempRet0": _setTempRet0, - "strftime_l": _strftime_l -}; -var asm = createWasm(); -/** @type {function(...*):?} */ -var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors"); - -/** @type {function(...*):?} */ -var _Encoder_new = Module["_Encoder_new"] = createExportWrapper("Encoder_new"); - -/** @type {function(...*):?} */ -var _Encoder_delete = Module["_Encoder_delete"] = createExportWrapper("Encoder_delete"); - -/** @type {function(...*):?} */ -var _Encoder_input = Module["_Encoder_input"] = createExportWrapper("Encoder_input"); - -/** @type {function(...*):?} */ -var _Encoder_output = Module["_Encoder_output"] = createExportWrapper("Encoder_output"); - -/** @type {function(...*):?} */ -var _Decoder_new = Module["_Decoder_new"] = createExportWrapper("Decoder_new"); - -/** @type {function(...*):?} */ -var _Decoder_delete = Module["_Decoder_delete"] = createExportWrapper("Decoder_delete"); - -/** @type {function(...*):?} */ -var _Decoder_input = Module["_Decoder_input"] = createExportWrapper("Decoder_input"); - -/** @type {function(...*):?} */ -var _Decoder_output = Module["_Decoder_output"] = createExportWrapper("Decoder_output"); - -/** @type {function(...*):?} */ -var _String_size = Module["_String_size"] = createExportWrapper("String_size"); - -/** @type {function(...*):?} */ -var _String_new = Module["_String_new"] = createExportWrapper("String_new"); - -/** @type {function(...*):?} */ -var _String_data = Module["_String_data"] = createExportWrapper("String_data"); - -/** @type {function(...*):?} */ -var _String_delete = Module["_String_delete"] = createExportWrapper("String_delete"); - -/** @type {function(...*):?} */ -var _Int16Array_size = Module["_Int16Array_size"] = createExportWrapper("Int16Array_size"); - -/** @type {function(...*):?} */ -var _Int16Array_new = Module["_Int16Array_new"] = createExportWrapper("Int16Array_new"); - -/** @type {function(...*):?} */ -var _Int16Array_data = Module["_Int16Array_data"] = createExportWrapper("Int16Array_data"); - -/** @type {function(...*):?} */ -var _Int16Array_delete = Module["_Int16Array_delete"] = createExportWrapper("Int16Array_delete"); - -/** @type {function(...*):?} */ -var _malloc = Module["_malloc"] = createExportWrapper("malloc"); - -/** @type {function(...*):?} */ -var _free = Module["_free"] = createExportWrapper("free"); - -/** @type {function(...*):?} */ -var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location"); - -/** @type {function(...*):?} */ -var _fflush = Module["_fflush"] = createExportWrapper("fflush"); - -/** @type {function(...*):?} */ -var _emscripten_stack_init = Module["_emscripten_stack_init"] = function() { - return (_emscripten_stack_init = Module["_emscripten_stack_init"] = Module["asm"]["emscripten_stack_init"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = function() { - return (_emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = function() { - return (_emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var stackSave = Module["stackSave"] = createExportWrapper("stackSave"); - -/** @type {function(...*):?} */ -var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore"); - -/** @type {function(...*):?} */ -var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc"); - -/** @type {function(...*):?} */ -var dynCall_viijii = Module["dynCall_viijii"] = createExportWrapper("dynCall_viijii"); - -/** @type {function(...*):?} */ -var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji"); - -/** @type {function(...*):?} */ -var dynCall_iiiiij = Module["dynCall_iiiiij"] = createExportWrapper("dynCall_iiiiij"); - -/** @type {function(...*):?} */ -var dynCall_iiiiijj = Module["dynCall_iiiiijj"] = createExportWrapper("dynCall_iiiiijj"); - -/** @type {function(...*):?} */ -var dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = createExportWrapper("dynCall_iiiiiijj"); - - - - - -// === Auto-generated postamble setup entry stuff === - -if (!Object.getOwnPropertyDescriptor(Module, "intArrayFromString")) Module["intArrayFromString"] = () => abort("'intArrayFromString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "intArrayToString")) Module["intArrayToString"] = () => abort("'intArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "ccall")) Module["ccall"] = () => abort("'ccall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "cwrap")) Module["cwrap"] = () => abort("'cwrap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setValue")) Module["setValue"] = () => abort("'setValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getValue")) Module["getValue"] = () => abort("'getValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "allocate")) Module["allocate"] = () => abort("'allocate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "UTF8ArrayToString")) Module["UTF8ArrayToString"] = () => abort("'UTF8ArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "UTF8ToString")) Module["UTF8ToString"] = () => abort("'UTF8ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8Array")) Module["stringToUTF8Array"] = () => abort("'stringToUTF8Array' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8")) Module["stringToUTF8"] = () => abort("'stringToUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF8")) Module["lengthBytesUTF8"] = () => abort("'lengthBytesUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = () => abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addOnPreRun")) Module["addOnPreRun"] = () => abort("'addOnPreRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addOnInit")) Module["addOnInit"] = () => abort("'addOnInit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addOnPreMain")) Module["addOnPreMain"] = () => abort("'addOnPreMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addOnExit")) Module["addOnExit"] = () => abort("'addOnExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addOnPostRun")) Module["addOnPostRun"] = () => abort("'addOnPostRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeStringToMemory")) Module["writeStringToMemory"] = () => abort("'writeStringToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeArrayToMemory")) Module["writeArrayToMemory"] = () => abort("'writeArrayToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeAsciiToMemory")) Module["writeAsciiToMemory"] = () => abort("'writeAsciiToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addRunDependency")) Module["addRunDependency"] = () => abort("'addRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "removeRunDependency")) Module["removeRunDependency"] = () => abort("'removeRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createFolder")) Module["FS_createFolder"] = () => abort("'FS_createFolder' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createPath")) Module["FS_createPath"] = () => abort("'FS_createPath' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createDataFile")) Module["FS_createDataFile"] = () => abort("'FS_createDataFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createPreloadedFile")) Module["FS_createPreloadedFile"] = () => abort("'FS_createPreloadedFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createLazyFile")) Module["FS_createLazyFile"] = () => abort("'FS_createLazyFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createLink")) Module["FS_createLink"] = () => abort("'FS_createLink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createDevice")) Module["FS_createDevice"] = () => abort("'FS_createDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_unlink")) Module["FS_unlink"] = () => abort("'FS_unlink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "getLEB")) Module["getLEB"] = () => abort("'getLEB' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getFunctionTables")) Module["getFunctionTables"] = () => abort("'getFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "alignFunctionTables")) Module["alignFunctionTables"] = () => abort("'alignFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerFunctions")) Module["registerFunctions"] = () => abort("'registerFunctions' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addFunction")) Module["addFunction"] = () => abort("'addFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "removeFunction")) Module["removeFunction"] = () => abort("'removeFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = () => abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "prettyPrint")) Module["prettyPrint"] = () => abort("'prettyPrint' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = () => abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getCompilerSetting")) Module["getCompilerSetting"] = () => abort("'getCompilerSetting' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "print")) Module["print"] = () => abort("'print' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "printErr")) Module["printErr"] = () => abort("'printErr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getTempRet0")) Module["getTempRet0"] = () => abort("'getTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setTempRet0")) Module["setTempRet0"] = () => abort("'setTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "callMain")) Module["callMain"] = () => abort("'callMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "abort")) Module["abort"] = () => abort("'abort' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "keepRuntimeAlive")) Module["keepRuntimeAlive"] = () => abort("'keepRuntimeAlive' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "zeroMemory")) Module["zeroMemory"] = () => abort("'zeroMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToNewUTF8")) Module["stringToNewUTF8"] = () => abort("'stringToNewUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setFileTime")) Module["setFileTime"] = () => abort("'setFileTime' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "abortOnCannotGrowMemory")) Module["abortOnCannotGrowMemory"] = () => abort("'abortOnCannotGrowMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "emscripten_realloc_buffer")) Module["emscripten_realloc_buffer"] = () => abort("'emscripten_realloc_buffer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "ENV")) Module["ENV"] = () => abort("'ENV' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "withStackSave")) Module["withStackSave"] = () => abort("'withStackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_CODES")) Module["ERRNO_CODES"] = () => abort("'ERRNO_CODES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_MESSAGES")) Module["ERRNO_MESSAGES"] = () => abort("'ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setErrNo")) Module["setErrNo"] = () => abort("'setErrNo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "inetPton4")) Module["inetPton4"] = () => abort("'inetPton4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "inetNtop4")) Module["inetNtop4"] = () => abort("'inetNtop4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "inetPton6")) Module["inetPton6"] = () => abort("'inetPton6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "inetNtop6")) Module["inetNtop6"] = () => abort("'inetNtop6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "readSockaddr")) Module["readSockaddr"] = () => abort("'readSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeSockaddr")) Module["writeSockaddr"] = () => abort("'writeSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "DNS")) Module["DNS"] = () => abort("'DNS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getHostByName")) Module["getHostByName"] = () => abort("'getHostByName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GAI_ERRNO_MESSAGES")) Module["GAI_ERRNO_MESSAGES"] = () => abort("'GAI_ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "Protocols")) Module["Protocols"] = () => abort("'Protocols' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "Sockets")) Module["Sockets"] = () => abort("'Sockets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getRandomDevice")) Module["getRandomDevice"] = () => abort("'getRandomDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "traverseStack")) Module["traverseStack"] = () => abort("'traverseStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "convertFrameToPC")) Module["convertFrameToPC"] = () => abort("'convertFrameToPC' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "UNWIND_CACHE")) Module["UNWIND_CACHE"] = () => abort("'UNWIND_CACHE' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "saveInUnwindCache")) Module["saveInUnwindCache"] = () => abort("'saveInUnwindCache' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "convertPCtoSourceLocation")) Module["convertPCtoSourceLocation"] = () => abort("'convertPCtoSourceLocation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgsArray")) Module["readAsmConstArgsArray"] = () => abort("'readAsmConstArgsArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgs")) Module["readAsmConstArgs"] = () => abort("'readAsmConstArgs' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "mainThreadEM_ASM")) Module["mainThreadEM_ASM"] = () => abort("'mainThreadEM_ASM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "jstoi_q")) Module["jstoi_q"] = () => abort("'jstoi_q' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "jstoi_s")) Module["jstoi_s"] = () => abort("'jstoi_s' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getExecutableName")) Module["getExecutableName"] = () => abort("'getExecutableName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "listenOnce")) Module["listenOnce"] = () => abort("'listenOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "autoResumeAudioContext")) Module["autoResumeAudioContext"] = () => abort("'autoResumeAudioContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "dynCallLegacy")) Module["dynCallLegacy"] = () => abort("'dynCallLegacy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getDynCaller")) Module["getDynCaller"] = () => abort("'getDynCaller' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = () => abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "callRuntimeCallbacks")) Module["callRuntimeCallbacks"] = () => abort("'callRuntimeCallbacks' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "wasmTableMirror")) Module["wasmTableMirror"] = () => abort("'wasmTableMirror' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setWasmTableEntry")) Module["setWasmTableEntry"] = () => abort("'setWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getWasmTableEntry")) Module["getWasmTableEntry"] = () => abort("'getWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "handleException")) Module["handleException"] = () => abort("'handleException' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePush")) Module["runtimeKeepalivePush"] = () => abort("'runtimeKeepalivePush' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePop")) Module["runtimeKeepalivePop"] = () => abort("'runtimeKeepalivePop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "callUserCallback")) Module["callUserCallback"] = () => abort("'callUserCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "maybeExit")) Module["maybeExit"] = () => abort("'maybeExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "safeSetTimeout")) Module["safeSetTimeout"] = () => abort("'safeSetTimeout' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "asmjsMangle")) Module["asmjsMangle"] = () => abort("'asmjsMangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "asyncLoad")) Module["asyncLoad"] = () => abort("'asyncLoad' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "alignMemory")) Module["alignMemory"] = () => abort("'alignMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "mmapAlloc")) Module["mmapAlloc"] = () => abort("'mmapAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "reallyNegative")) Module["reallyNegative"] = () => abort("'reallyNegative' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "unSign")) Module["unSign"] = () => abort("'unSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "reSign")) Module["reSign"] = () => abort("'reSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "formatString")) Module["formatString"] = () => abort("'formatString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "PATH")) Module["PATH"] = () => abort("'PATH' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "PATH_FS")) Module["PATH_FS"] = () => abort("'PATH_FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SYSCALLS")) Module["SYSCALLS"] = () => abort("'SYSCALLS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "syscallMmap2")) Module["syscallMmap2"] = () => abort("'syscallMmap2' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "syscallMunmap")) Module["syscallMunmap"] = () => abort("'syscallMunmap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getSocketFromFD")) Module["getSocketFromFD"] = () => abort("'getSocketFromFD' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getSocketAddress")) Module["getSocketAddress"] = () => abort("'getSocketAddress' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "JSEvents")) Module["JSEvents"] = () => abort("'JSEvents' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerKeyEventCallback")) Module["registerKeyEventCallback"] = () => abort("'registerKeyEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "specialHTMLTargets")) Module["specialHTMLTargets"] = () => abort("'specialHTMLTargets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "maybeCStringToJsString")) Module["maybeCStringToJsString"] = () => abort("'maybeCStringToJsString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "findEventTarget")) Module["findEventTarget"] = () => abort("'findEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "findCanvasEventTarget")) Module["findCanvasEventTarget"] = () => abort("'findCanvasEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getBoundingClientRect")) Module["getBoundingClientRect"] = () => abort("'getBoundingClientRect' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillMouseEventData")) Module["fillMouseEventData"] = () => abort("'fillMouseEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerMouseEventCallback")) Module["registerMouseEventCallback"] = () => abort("'registerMouseEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerWheelEventCallback")) Module["registerWheelEventCallback"] = () => abort("'registerWheelEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerUiEventCallback")) Module["registerUiEventCallback"] = () => abort("'registerUiEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerFocusEventCallback")) Module["registerFocusEventCallback"] = () => abort("'registerFocusEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceOrientationEventData")) Module["fillDeviceOrientationEventData"] = () => abort("'fillDeviceOrientationEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceOrientationEventCallback")) Module["registerDeviceOrientationEventCallback"] = () => abort("'registerDeviceOrientationEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceMotionEventData")) Module["fillDeviceMotionEventData"] = () => abort("'fillDeviceMotionEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceMotionEventCallback")) Module["registerDeviceMotionEventCallback"] = () => abort("'registerDeviceMotionEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "screenOrientation")) Module["screenOrientation"] = () => abort("'screenOrientation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillOrientationChangeEventData")) Module["fillOrientationChangeEventData"] = () => abort("'fillOrientationChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerOrientationChangeEventCallback")) Module["registerOrientationChangeEventCallback"] = () => abort("'registerOrientationChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillFullscreenChangeEventData")) Module["fillFullscreenChangeEventData"] = () => abort("'fillFullscreenChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerFullscreenChangeEventCallback")) Module["registerFullscreenChangeEventCallback"] = () => abort("'registerFullscreenChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerRestoreOldStyle")) Module["registerRestoreOldStyle"] = () => abort("'registerRestoreOldStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "hideEverythingExceptGivenElement")) Module["hideEverythingExceptGivenElement"] = () => abort("'hideEverythingExceptGivenElement' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "restoreHiddenElements")) Module["restoreHiddenElements"] = () => abort("'restoreHiddenElements' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setLetterbox")) Module["setLetterbox"] = () => abort("'setLetterbox' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "currentFullscreenStrategy")) Module["currentFullscreenStrategy"] = () => abort("'currentFullscreenStrategy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "restoreOldWindowedStyle")) Module["restoreOldWindowedStyle"] = () => abort("'restoreOldWindowedStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "softFullscreenResizeWebGLRenderTarget")) Module["softFullscreenResizeWebGLRenderTarget"] = () => abort("'softFullscreenResizeWebGLRenderTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "doRequestFullscreen")) Module["doRequestFullscreen"] = () => abort("'doRequestFullscreen' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillPointerlockChangeEventData")) Module["fillPointerlockChangeEventData"] = () => abort("'fillPointerlockChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockChangeEventCallback")) Module["registerPointerlockChangeEventCallback"] = () => abort("'registerPointerlockChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockErrorEventCallback")) Module["registerPointerlockErrorEventCallback"] = () => abort("'registerPointerlockErrorEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "requestPointerLock")) Module["requestPointerLock"] = () => abort("'requestPointerLock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillVisibilityChangeEventData")) Module["fillVisibilityChangeEventData"] = () => abort("'fillVisibilityChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerVisibilityChangeEventCallback")) Module["registerVisibilityChangeEventCallback"] = () => abort("'registerVisibilityChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerTouchEventCallback")) Module["registerTouchEventCallback"] = () => abort("'registerTouchEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillGamepadEventData")) Module["fillGamepadEventData"] = () => abort("'fillGamepadEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerGamepadEventCallback")) Module["registerGamepadEventCallback"] = () => abort("'registerGamepadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerBeforeUnloadEventCallback")) Module["registerBeforeUnloadEventCallback"] = () => abort("'registerBeforeUnloadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillBatteryEventData")) Module["fillBatteryEventData"] = () => abort("'fillBatteryEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "battery")) Module["battery"] = () => abort("'battery' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerBatteryEventCallback")) Module["registerBatteryEventCallback"] = () => abort("'registerBatteryEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setCanvasElementSize")) Module["setCanvasElementSize"] = () => abort("'setCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getCanvasElementSize")) Module["getCanvasElementSize"] = () => abort("'getCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "demangle")) Module["demangle"] = () => abort("'demangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "demangleAll")) Module["demangleAll"] = () => abort("'demangleAll' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "jsStackTrace")) Module["jsStackTrace"] = () => abort("'jsStackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = () => abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getEnvStrings")) Module["getEnvStrings"] = () => abort("'getEnvStrings' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "checkWasiClock")) Module["checkWasiClock"] = () => abort("'checkWasiClock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64")) Module["writeI53ToI64"] = () => abort("'writeI53ToI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Clamped")) Module["writeI53ToI64Clamped"] = () => abort("'writeI53ToI64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Signaling")) Module["writeI53ToI64Signaling"] = () => abort("'writeI53ToI64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Clamped")) Module["writeI53ToU64Clamped"] = () => abort("'writeI53ToU64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Signaling")) Module["writeI53ToU64Signaling"] = () => abort("'writeI53ToU64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "readI53FromI64")) Module["readI53FromI64"] = () => abort("'readI53FromI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "readI53FromU64")) Module["readI53FromU64"] = () => abort("'readI53FromU64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "convertI32PairToI53")) Module["convertI32PairToI53"] = () => abort("'convertI32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "convertU32PairToI53")) Module["convertU32PairToI53"] = () => abort("'convertU32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setImmediateWrapped")) Module["setImmediateWrapped"] = () => abort("'setImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "clearImmediateWrapped")) Module["clearImmediateWrapped"] = () => abort("'clearImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "polyfillSetImmediate")) Module["polyfillSetImmediate"] = () => abort("'polyfillSetImmediate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "uncaughtExceptionCount")) Module["uncaughtExceptionCount"] = () => abort("'uncaughtExceptionCount' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "exceptionLast")) Module["exceptionLast"] = () => abort("'exceptionLast' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "exceptionCaught")) Module["exceptionCaught"] = () => abort("'exceptionCaught' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "ExceptionInfo")) Module["ExceptionInfo"] = () => abort("'ExceptionInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "CatchInfo")) Module["CatchInfo"] = () => abort("'CatchInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "exception_addRef")) Module["exception_addRef"] = () => abort("'exception_addRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "exception_decRef")) Module["exception_decRef"] = () => abort("'exception_decRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "Browser")) Module["Browser"] = () => abort("'Browser' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "funcWrappers")) Module["funcWrappers"] = () => abort("'funcWrappers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = () => abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setMainLoop")) Module["setMainLoop"] = () => abort("'setMainLoop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "wget")) Module["wget"] = () => abort("'wget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "FS")) Module["FS"] = () => abort("'FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "MEMFS")) Module["MEMFS"] = () => abort("'MEMFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "TTY")) Module["TTY"] = () => abort("'TTY' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "PIPEFS")) Module["PIPEFS"] = () => abort("'PIPEFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SOCKFS")) Module["SOCKFS"] = () => abort("'SOCKFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "_setNetworkCallback")) Module["_setNetworkCallback"] = () => abort("'_setNetworkCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "tempFixedLengthArray")) Module["tempFixedLengthArray"] = () => abort("'tempFixedLengthArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "miniTempWebGLFloatBuffers")) Module["miniTempWebGLFloatBuffers"] = () => abort("'miniTempWebGLFloatBuffers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "heapObjectForWebGLType")) Module["heapObjectForWebGLType"] = () => abort("'heapObjectForWebGLType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "heapAccessShiftForWebGLHeap")) Module["heapAccessShiftForWebGLHeap"] = () => abort("'heapAccessShiftForWebGLHeap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GL")) Module["GL"] = () => abort("'GL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGet")) Module["emscriptenWebGLGet"] = () => abort("'emscriptenWebGLGet' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "computeUnpackAlignedImageSize")) Module["computeUnpackAlignedImageSize"] = () => abort("'computeUnpackAlignedImageSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetTexPixelData")) Module["emscriptenWebGLGetTexPixelData"] = () => abort("'emscriptenWebGLGetTexPixelData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetUniform")) Module["emscriptenWebGLGetUniform"] = () => abort("'emscriptenWebGLGetUniform' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "webglGetUniformLocation")) Module["webglGetUniformLocation"] = () => abort("'webglGetUniformLocation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "webglPrepareUniformLocationsBeforeFirstUse")) Module["webglPrepareUniformLocationsBeforeFirstUse"] = () => abort("'webglPrepareUniformLocationsBeforeFirstUse' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "webglGetLeftBracePos")) Module["webglGetLeftBracePos"] = () => abort("'webglGetLeftBracePos' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetVertexAttrib")) Module["emscriptenWebGLGetVertexAttrib"] = () => abort("'emscriptenWebGLGetVertexAttrib' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeGLArray")) Module["writeGLArray"] = () => abort("'writeGLArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "AL")) Module["AL"] = () => abort("'AL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SDL_unicode")) Module["SDL_unicode"] = () => abort("'SDL_unicode' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SDL_ttfContext")) Module["SDL_ttfContext"] = () => abort("'SDL_ttfContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SDL_audio")) Module["SDL_audio"] = () => abort("'SDL_audio' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SDL")) Module["SDL"] = () => abort("'SDL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SDL_gfx")) Module["SDL_gfx"] = () => abort("'SDL_gfx' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GLUT")) Module["GLUT"] = () => abort("'GLUT' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "EGL")) Module["EGL"] = () => abort("'EGL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GLFW_Window")) Module["GLFW_Window"] = () => abort("'GLFW_Window' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GLFW")) Module["GLFW"] = () => abort("'GLFW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GLEW")) Module["GLEW"] = () => abort("'GLEW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "IDBStore")) Module["IDBStore"] = () => abort("'IDBStore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "runAndAbortIfError")) Module["runAndAbortIfError"] = () => abort("'runAndAbortIfError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "warnOnce")) Module["warnOnce"] = () => abort("'warnOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stackSave")) Module["stackSave"] = () => abort("'stackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stackRestore")) Module["stackRestore"] = () => abort("'stackRestore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stackAlloc")) Module["stackAlloc"] = () => abort("'stackAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "AsciiToString")) Module["AsciiToString"] = () => abort("'AsciiToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToAscii")) Module["stringToAscii"] = () => abort("'stringToAscii' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "UTF16ToString")) Module["UTF16ToString"] = () => abort("'UTF16ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF16")) Module["stringToUTF16"] = () => abort("'stringToUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF16")) Module["lengthBytesUTF16"] = () => abort("'lengthBytesUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "UTF32ToString")) Module["UTF32ToString"] = () => abort("'UTF32ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF32")) Module["stringToUTF32"] = () => abort("'stringToUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF32")) Module["lengthBytesUTF32"] = () => abort("'lengthBytesUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8")) Module["allocateUTF8"] = () => abort("'allocateUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8OnStack")) Module["allocateUTF8OnStack"] = () => abort("'allocateUTF8OnStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -Module["writeStackCookie"] = writeStackCookie; -Module["checkStackCookie"] = checkStackCookie; -if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_NORMAL")) Object.defineProperty(Module, "ALLOC_NORMAL", { configurable: true, get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); -if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_STACK")) Object.defineProperty(Module, "ALLOC_STACK", { configurable: true, get: function() { abort("'ALLOC_STACK' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); - -var calledRun; - -/** - * @constructor - * @this {ExitStatus} - */ -function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; -} - -var calledMain = false; - -dependenciesFulfilled = function runCaller() { - // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled -}; - -function stackCheckInit() { - // This is normally called automatically during __wasm_call_ctors but need to - // get these values before even running any of the ctors so we call it redundantly - // here. - // TODO(sbc): Move writeStackCookie to native to to avoid this. - _emscripten_stack_init(); - writeStackCookie(); -} - -/** @type {function(Array=)} */ -function run(args) { - args = args || arguments_; - - if (runDependencies > 0) { - return; - } - - stackCheckInit(); - - preRun(); - - // a preRun added a dependency, run will be called later - if (runDependencies > 0) { - return; - } - - function doRun() { - // run may have just been called through dependencies being fulfilled just in this very frame, - // or while the async setStatus time below was happening - if (calledRun) return; - calledRun = true; - Module['calledRun'] = true; - - if (ABORT) return; - - initRuntime(); - - if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); - - assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'); - - postRun(); - } - - if (Module['setStatus']) { - Module['setStatus']('Running...'); - setTimeout(function() { - setTimeout(function() { - Module['setStatus'](''); - }, 1); - doRun(); - }, 1); - } else - { - doRun(); - } - checkStackCookie(); -} -Module['run'] = run; - -function checkUnflushedContent() { - // Compiler settings do not allow exiting the runtime, so flushing - // the streams is not possible. but in ASSERTIONS mode we check - // if there was something to flush, and if so tell the user they - // should request that the runtime be exitable. - // Normally we would not even include flush() at all, but in ASSERTIONS - // builds we do so just for this check, and here we see if there is any - // content to flush, that is, we check if there would have been - // something a non-ASSERTIONS build would have not seen. - // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 - // mode (which has its own special function for this; otherwise, all - // the code is inside libc) - var oldOut = out; - var oldErr = err; - var has = false; - out = err = (x) => { - has = true; - } - try { // it doesn't matter if it fails - _fflush(0); - // also flush in the JS FS layer - ['stdout', 'stderr'].forEach(function(name) { - var info = FS.analyzePath('/dev/' + name); - if (!info) return; - var stream = info.object; - var rdev = stream.rdev; - var tty = TTY.ttys[rdev]; - if (tty && tty.output && tty.output.length) { - has = true; - } - }); - } catch(e) {} - out = oldOut; - err = oldErr; - if (has) { - warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); - } -} - -/** @param {boolean|number=} implicit */ -function exit(status, implicit) { - EXITSTATUS = status; - - checkUnflushedContent(); - - if (keepRuntimeAlive()) { - // if exit() was called, we may warn the user if the runtime isn't actually being shut down - if (!implicit) { - var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'; - err(msg); - } - } else { - exitRuntime(); - } - - procExit(status); -} - -function procExit(code) { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - if (Module['onExit']) Module['onExit'](code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -} - -if (Module['preInit']) { - if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; - while (Module['preInit'].length > 0) { - Module['preInit'].pop()(); - } -} - -run(); - - - - - -// Encoder - -// create encoder -// channels: 1-2 -// samplerate: 8000,12000,16000,24000,48000 -// bitrate: see Opus recommended bitrates -// frame_size: frame size in milliseconds (2.5,5,10,20,40,60), 20 is recommended -// voice_optimization: true/false -function Encoder(channels, samplerate, bitrate, frame_size, voice_optimization) -{ - this.enc = Module._Encoder_new.apply(null, arguments); - this.out = Module._String_new(); -} - -// free encoder memory -Encoder.prototype.destroy = function() -{ - Module._Encoder_delete(this.enc); - Module._String_delete(this.out); -} - -// add samples to the encoder buffer -// samples: Int16Array of interleaved (if multiple channels) samples -Encoder.prototype.input = function(samples) -{ - var ptr = Module._malloc(samples.length*samples.BYTES_PER_ELEMENT); - var pdata = new Uint8Array(Module.HEAPU8.buffer, ptr, samples.length*samples.BYTES_PER_ELEMENT); - pdata.set(new Uint8Array(samples.buffer, samples.byteOffset, samples.length*samples.BYTES_PER_ELEMENT)); - - Module._Encoder_input(this.enc, ptr, samples.length); - Module._free(ptr); -} - -// output the next encoded packet -// return Uint8Array (valid until the next output call) or null if there is no packet to output -Encoder.prototype.output = function() -{ - var ok = Module._Encoder_output(this.enc, this.out); - if(ok) - return new Uint8Array(Module.HEAPU8.buffer, Module._String_data(this.out), Module._String_size(this.out)); -} - -// Decoder - -// create decoder -// channels and samplerate should match the encoder options -function Decoder(channels, samplerate) -{ - this.dec = Module._Decoder_new.apply(null, arguments); - this.out = Module._Int16Array_new(); -} - -// free decoder memory -Decoder.prototype.destroy = function() -{ - Module._Decoder_delete(this.dec); - Module._Int16Array_delete(this.out); -} - -// add packet to the decoder buffer -// packet: Uint8Array -Decoder.prototype.input = function(packet) -{ - var ptr = Module._malloc(packet.length*packet.BYTES_PER_ELEMENT); - var pdata = new Uint8Array(Module.HEAPU8.buffer, ptr, packet.length*packet.BYTES_PER_ELEMENT); - pdata.set(new Uint8Array(packet.buffer, packet.byteOffset, packet.length*packet.BYTES_PER_ELEMENT)); - - Module._Decoder_input(this.dec, ptr, packet.length); - Module._free(ptr); -} - -// output the next decoded samples -// return samples (interleaved if multiple channels) as Int16Array (valid until the next output call) or null if there is no output -Decoder.prototype.output = function() -{ - var ok = Module._Decoder_output(this.dec, this.out); - if(ok) - return new Int16Array(Module.HEAPU8.buffer, Module._Int16Array_data(this.out), Module._Int16Array_size(this.out)); -} - - -//export objects -Module.Encoder = Encoder; -Module.Decoder = Decoder; - -//make the module global if not using nodejs -if(Module["ENVIRONMENT"] != "NODE") - libopus = Module; - -var dec; -var i = 0; -self.addEventListener('message', (e) => { - if (e.data.channels > 0) { - if (dec) dec.destroy(); - dec = new Decoder(e.data.channels, e.data.sampleRate); - } else { - dec.input(e.data); - self.postMessage(dec.output().slice(0)); - } -}); \ No newline at end of file diff --git a/shelled/rustdesk-web-client/lib/libopus.wasm b/shelled/rustdesk-web-client/lib/libopus.wasm deleted file mode 100755 index 36e42afb17f032fbd8a78c5800e1db56d0f75efc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489750 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
    NJ1QsnsD;oIx;7&>B3&}UWkw4^a6zKPRE28i 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 jcM`Q-*6NAUkX=+yp>#s35^6WKkX` into `

    xpR@|)~8MkTyftD$c7VelT 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 R#&WV{U>-O_%?as?{txAm!_WW# diff --git a/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.js b/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.js deleted file mode 100644 index 60c4306..0000000 --- a/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.js +++ /dev/null @@ -1,40 +0,0 @@ - -var OGVDecoderAudioVorbisW = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderAudioVorbisW) { - OGVDecoderAudioVorbisW = OGVDecoderAudioVorbisW || {}; - - -var b;b||(b=typeof OGVDecoderAudioVorbisW !== 'undefined' ? OGVDecoderAudioVorbisW : {});var g=Object.assign,h,m;b.ready=new Promise(function(a,c){h=a;m=c});var n=b,p=g({},b),q=(a,c)=>{throw c;},r="object"===typeof window,t="function"===typeof importScripts,u="",v,w,x,fs,y,z; -if("object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node)u=t?require("path").dirname(u)+"/":__dirname+"/",z=function(){y||(fs=require("fs"),y=require("path"))},v=function(a,c){z();a=y.normalize(a);return fs.readFileSync(a,c?null:"utf8")},x=function(a){a=v(a,!0);a.buffer||(a=new Uint8Array(a));return a},w=function(a,c,e){z();a=y.normalize(a);fs.readFile(a,function(d,f){d?e(d):c(f.buffer)})},1{if(noExitRuntime||0=T.length&&(T.length=a+1),T[a]=c=K.get(a));return c} -var ha={a:function(a,c,e){I.copyWithin(a,c,c+e)},b:function(a){var c=I.length;a>>>=0;if(2147483648=e;e*=2){var d=c*(1+.2/e);d=Math.min(d,a+100663296);d=Math.max(a,d);0>>16);J();var f=1;break a}catch(k){}f=void 0}if(f)return!0}return!1},c:function(a){if(!(noExitRuntime||0=a)return W;W&&b._free(W);X=a;return W=b._malloc(X)}var Y;"undefined"===typeof performance||"undefined"===typeof performance.now?Y=Date.now:Y=performance.now.bind(performance);function Z(a){var c=Y();a=a();b.cpuTime+=Y()-c;return a}b.loadedMetadata=!!n.audioFormat;b.audioFormat=n.audioFormat||null;b.audioBuffer=null;b.cpuTime=0; -Object.defineProperty(b,"processing",{get:function(){return!1}});b.init=function(a){Z(function(){b._ogv_audio_decoder_init()});a()};b.processHeader=function(a,c){var e=Z(function(){var d=a.byteLength,f=ja(d);(new Uint8Array(F.buffer,f,d)).set(new Uint8Array(a));return b._ogv_audio_decoder_process_header(f,d)});c(e)};b.processAudio=function(a,c){var e=Z(function(){var d=a.byteLength,f=ja(d);(new Uint8Array(F.buffer,f,d)).set(new Uint8Array(a));return b._ogv_audio_decoder_process_audio(f,d)});c(e)}; -b.close=function(){}; - - - return OGVDecoderAudioVorbisW.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = OGVDecoderAudioVorbisW; -else if (typeof define === 'function' && define['amd']) - define([], function() { return OGVDecoderAudioVorbisW; }); -else if (typeof exports === 'object') - exports["OGVDecoderAudioVorbisW"] = OGVDecoderAudioVorbisW; diff --git a/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.wasm b/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-audio-vorbis-wasm.wasm deleted file mode 100755 index 5a492b033eae3e8c032e8c2f7e581e0535440664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155787 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 z 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 TjJDL)%E36P@V_G*SeyR~&oF>@ diff --git a/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.js b/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.js deleted file mode 100644 index b0ca206..0000000 --- a/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.js +++ /dev/null @@ -1,21 +0,0 @@ - -var OGVDecoderVideoAV1MTW = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoAV1MTW) { - OGVDecoderVideoAV1MTW = OGVDecoderVideoAV1MTW || {}; - -function GROWABLE_HEAP_U8(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPU8}function GROWABLE_HEAP_I32(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAP32}function GROWABLE_HEAP_F64(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPF64}var Module=typeof OGVDecoderVideoAV1MTW!=="undefined"?OGVDecoderVideoAV1MTW:{};var objAssign=Object.assign;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var options=Module;var moduleOverrides=objAssign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=function(){if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=function readAsync(filename,onload,onerror){requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("unhandledRejection",function(reason){throw reason});quit_=((status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)});Module["inspect"]=function(){return"[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=require("worker_threads")}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}global.Worker=nodeWorkerThreads.Worker}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!ENVIRONMENT_IS_NODE){read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=(title=>document.title=title)}else{}if(ENVIRONMENT_IS_NODE){if(typeof performance==="undefined"){global.performance=require("perf_hooks").performance}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){requireNodeFS();defaultPrint=(str=>fs.writeSync(1,str+"\n"));defaultPrintErr=(str=>fs.writeSync(2,str+"\n"))}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;objAssign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function TextDecoderWrapper(encoding){var textDecoder=new TextDecoder(encoding);this.decode=(data=>{if(data.buffer instanceof SharedArrayBuffer){data=new Uint8Array(data)}return textDecoder.decode.call(textDecoder,data)})}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf-16le"):undefined;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":1073741824/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATINIT__)}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;PThread.terminateAllThreads();runtimeExited=true}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="ogv-decoder-video-av1-mt-wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTlsInit(Module["asm"]["H"]);wasmTable=Module["asm"]["F"];addOnInit(Module["asm"]["y"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var ASM_CONSTS={};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function killThread(pthread_ptr){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var pthread=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];pthread.worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker),1);pthread.worker.pthread=undefined}function cancelThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];pthread.worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];if(pthread){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var worker=pthread.worker;PThread.returnWorkerToPool(worker)}}function _exit(status){exit(status)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],initMainThread:function(){var pthreadPoolSize=1;for(var i=0;i>2]=0;try{func()}finally{GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls>>2]=1}},receiveObjectTransfer:function(data){},threadInit:function(){for(var i in PThread.tlsInitFunctions){PThread.tlsInitFunctions[i]()}},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=function(e){var d=e["data"];var cmd=d["cmd"];if(worker.pthread)PThread.currentProxiedOperationCallerThread=worker.pthread.threadInfoStruct;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var thread=PThread.pthreads[d.targetThread];if(thread){thread.worker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processQueuedMainThreadWork"){_emscripten_main_thread_process_queued_calls()}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="detachedExit"){PThread.returnWorkerToPool(worker)}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else{err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=function(e){var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data})});worker.on("error",function(e){worker.onerror(e)});worker.on("detachedExit",function(){})}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("ogv-decoder-video-av1-mt-wasm.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=GROWABLE_HEAP_I32()[pthread_ptr+44>>2];var stackSize=GROWABLE_HEAP_I32()[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function invokeEntryPoint(ptr,arg){return getWasmTableEntry(ptr)(arg)}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTlsInit(tlsInitFunc,moduleExports,metadata){PThread.tlsInitFunctions.push(tlsInitFunc)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=(()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6})}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=(()=>performance.now()-Module["__performance_now_clock_drift"])}else _emscripten_get_now=(()=>performance.now());function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInit()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,threadInfoStruct:threadParams.pthread_ptr};worker.pthread=pthread;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"threadInfoStruct":threadParams.pthread_ptr};worker.runPthread=function(){msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}function ___pthread_create_js(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer==="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return _emscripten_sync_run_in_main_thread_4(687865856,pthread_ptr,attr,start_routine,arg)}if(error)return error;var threadParams={startRoutine:start_routine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function ___pthread_detached_exit(){postMessage({"cmd":"detachedExit"})}function __emscripten_default_pthread_stack_size(){return 2097152}function __emscripten_futex_wait_non_blocking(addr,val,timeout){var tNow=performance.now();var tEnd=tNow+timeout;var lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr);while(1){tNow=performance.now();if(tNow>tEnd){lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);return-73}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);if(lastAddr==0){break}_emscripten_main_thread_process_queued_calls();if(Atomics.load(GROWABLE_HEAP_I32(),addr>>2)!=val){return-6}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr)}return 0}function __emscripten_notify_thread_queue(targetThreadId,mainThreadId){if(targetThreadId==mainThreadId){postMessage({"cmd":"processQueuedMainThreadWork"})}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processThreadQueue"})}else{var pthread=PThread.pthreads[targetThreadId];var worker=pthread&&pthread.worker;if(!worker){return}worker.postMessage({"cmd":"processThreadQueue"})}return 1}function _abort(){abort("")}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}function _emscripten_memcpy_big(dest,src,num){GROWABLE_HEAP_U8().copyWithin(dest,src,src+num)}function _emscripten_num_logical_cores(){if(ENVIRONMENT_IS_NODE)return require("os").cpus().length;return navigator["hardwareConcurrency"]}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(function(){var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=GROWABLE_HEAP_U8().length;requestedSize=requestedSize>>>0;if(requestedSize<=oldSize){return false}var maxHeapSize=1073741824;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence>2]=eventTypeId;GROWABLE_HEAP_I32()[varargs+4>>2]=eventData;GROWABLE_HEAP_I32()[varargs+8>>2]=userData;_emscripten_dispatch_to_thread_(targetThread,637534208,eventHandlerFunc,eventData,varargs)})},getTargetThreadForEventCallback:function(targetThread){switch(targetThread){case 1:return 0;case 2:return PThread.currentProxiedOperationCallerThread;default:return targetThread}},getNodeNameForTarget:function(target){if(!target)return"";if(target==window)return"#window";if(target==screen)return"#screen";return target&&target.nodeName?target.nodeName:""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height){withStackSave(function(){var varargs=stackAlloc(12);var targetCanvasPtr=0;if(targetCanvas){targetCanvasPtr=stringToNewUTF8(targetCanvas)}GROWABLE_HEAP_I32()[varargs>>2]=targetCanvasPtr;GROWABLE_HEAP_I32()[varargs+4>>2]=width;GROWABLE_HEAP_I32()[varargs+8>>2]=height;_emscripten_dispatch_to_thread_(targetThread,657457152,0,targetCanvasPtr,varargs)})}function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread,targetCanvas,width,height){targetCanvas=targetCanvas?UTF8ToString(targetCanvas):"";_emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height)}function maybeCStringToJsString(cString){return cString>2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!=="undefined"?document:0,typeof window!=="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!=="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_set_canvas_element_size_calling_thread(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;if(canvas.canvasSharedPtr){GROWABLE_HEAP_I32()[canvas.canvasSharedPtr>>2]=width;GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+4>>2]=height}if(canvas.offscreenCanvas||!canvas.controlTransferredOffscreen){if(canvas.offscreenCanvas)canvas=canvas.offscreenCanvas;var autoResizeViewport=false;if(canvas.GLctxObject&&canvas.GLctxObject.GLctx){var prevViewport=canvas.GLctxObject.GLctx.getParameter(2978);autoResizeViewport=prevViewport[0]===0&&prevViewport[1]===0&&prevViewport[2]===canvas.width&&prevViewport[3]===canvas.height}canvas.width=width;canvas.height=height;if(autoResizeViewport){canvas.GLctxObject.GLctx.viewport(0,0,width,height)}}else if(canvas.canvasSharedPtr){var targetThread=GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+8>>2];_emscripten_set_offscreencanvas_size_on_target_thread(targetThread,target,width,height);return 1}else{return-4}return 0}function _emscripten_set_canvas_element_size_main_thread(target,width,height){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,1,target,width,height);return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(canvas){return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}else{return _emscripten_set_canvas_element_size_main_thread(target,width,height)}}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)};return 1}}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>2]:-1;source+=UTF8ToString(GROWABLE_HEAP_I32()[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;canvas.getContext=function(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}}var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=_malloc(8);GROWABLE_HEAP_I32()[handle+4>>2]=_pthread_self();var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;_free(GL.contexts[contextHandle].handle);GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=GROWABLE_HEAP_I32()[a+(24>>2)];var contextAttributes={"alpha":!!GROWABLE_HEAP_I32()[a+(0>>2)],"depth":!!GROWABLE_HEAP_I32()[a+(4>>2)],"stencil":!!GROWABLE_HEAP_I32()[a+(8>>2)],"antialias":!!GROWABLE_HEAP_I32()[a+(12>>2)],"premultipliedAlpha":!!GROWABLE_HEAP_I32()[a+(16>>2)],"preserveDrawingBuffer":!!GROWABLE_HEAP_I32()[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!GROWABLE_HEAP_I32()[a+(28>>2)],majorVersion:GROWABLE_HEAP_I32()[a+(32>>2)],minorVersion:GROWABLE_HEAP_I32()[a+(36>>2)],enableExtensionsByDefault:GROWABLE_HEAP_I32()[a+(40>>2)],explicitSwapControl:GROWABLE_HEAP_I32()[a+(44>>2)],proxyContextToMainThread:GROWABLE_HEAP_I32()[a+(48>>2)],renderViaOffscreenBackBuffer:GROWABLE_HEAP_I32()[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=GROWABLE_HEAP_I32()[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,fd);return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(4,1,fd,offset_low,offset_high,whence,newOffset)}function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(5,1,fd,iov,iovcnt,pnum);var num=0;for(var i=0;i>2];var len=GROWABLE_HEAP_I32()[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}function _ogvjs_callback_async_complete(ret,cpuTime){var callback=Module.callbacks.shift();Module["cpuTime"]+=cpuTime;callback(ret);return}function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight,picWidth,picHeight,picX,picY,displayWidth,displayHeight){var heap=wasmMemory.buffer;var format=Module["videoFormat"];function copyAndTrim(arr,buffer,stride,height,picX,picY,picWidth,picHeight,fill){arr.set(new Uint8Array(heap,buffer,stride*height));var x,y,ptr;for(ptr=0,y=0;y0){var next=recycled.shift(),format=next["format"];if(format["width"]===width&&format["height"]===height&&format["chromaWidth"]===chromaWidth&&format["chromaHeight"]===chromaHeight&&format["cropLeft"]===picX&&format["cropTop"]===picY&&format["cropWidth"]===picWidth&&format["cropHeight"]===picHeight&&format["displayWidth"]===displayWidth&&format["displayHeight"]===displayHeight&&next["y"]["bytes"].length===lenY&&next["u"]["bytes"].length===lenCb&&next["v"]["bytes"].length===lenCr){frame=next;break}}if(!frame){frame={"format":{"width":width,"height":height,"chromaWidth":chromaWidth,"chromaHeight":chromaHeight,"cropLeft":picX,"cropTop":picY,"cropWidth":picWidth,"cropHeight":picHeight,"displayWidth":displayWidth,"displayHeight":displayHeight},"y":{"bytes":new Uint8Array(lenY),"stride":strideY},"u":{"bytes":new Uint8Array(lenCb),"stride":strideCb},"v":{"bytes":new Uint8Array(lenCr),"stride":strideCr}}}copyAndTrim(frame["y"]["bytes"],bufferY,strideY,height,picX,picY,picWidth,picHeight,0);copyAndTrim(frame["u"]["bytes"],bufferCb,strideCb,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);copyAndTrim(frame["v"]["bytes"],bufferCr,strideCr,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);Module["frameBuffer"]=frame}if(!ENVIRONMENT_IS_PTHREAD)PThread.initMainThread();var GLctx;var proxiedFunctionTable=[null,exitOnMainThread,_emscripten_set_canvas_element_size_main_thread,_fd_close,_fd_seek,_fd_write];var asmLibraryArg={"v":___emscripten_init_main_thread_js,"q":___emscripten_thread_cleanup,"c":___pthread_create_js,"t":___pthread_detached_exit,"u":__emscripten_default_pthread_stack_size,"j":__emscripten_futex_wait_non_blocking,"i":__emscripten_notify_thread_queue,"f":_abort,"e":_emscripten_check_blocking_allowed,"b":_emscripten_get_now,"n":_emscripten_memcpy_big,"x":_emscripten_num_logical_cores,"w":_emscripten_receive_on_main_thread_js,"o":_emscripten_resize_heap,"g":_emscripten_set_canvas_element_size,"r":_emscripten_unwind_to_js_event_loop,"h":_emscripten_webgl_create_context,"s":_exit,"p":_fd_close,"m":_fd_seek,"d":_fd_write,"a":wasmMemory||Module["wasmMemory"],"k":_ogvjs_callback_async_complete,"l":_ogvjs_callback_frame};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["y"]).apply(null,arguments)};var _ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=function(){return(_ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=Module["asm"]["z"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["A"]).apply(null,arguments)};var _ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=function(){return(_ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=Module["asm"]["B"]).apply(null,arguments)};var _ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=function(){return(_ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=Module["asm"]["C"]).apply(null,arguments)};var _ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=function(){return(_ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=Module["asm"]["D"]).apply(null,arguments)};var _ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=function(){return(_ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=Module["asm"]["E"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["G"]).apply(null,arguments)};var _emscripten_tls_init=Module["_emscripten_tls_init"]=function(){return(_emscripten_tls_init=Module["_emscripten_tls_init"]=Module["asm"]["H"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["I"]).apply(null,arguments)};var _emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=function(){return(_emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=Module["asm"]["J"]).apply(null,arguments)};var _emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=function(){return(_emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=Module["asm"]["K"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return(_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["L"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["M"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["N"]).apply(null,arguments)};var _emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=function(){return(_emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=Module["asm"]["O"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["P"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["Q"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["R"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["S"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["T"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["U"]).apply(null,arguments)};var __emscripten_main_thread_futex=Module["__emscripten_main_thread_futex"]=375956;var __emscripten_allow_main_runtime_queued_calls=Module["__emscripten_allow_main_runtime_queued_calls"]=108308;Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["PThread"]=PThread;Module["PThread"]=PThread;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){readyPromiseResolve(Module);initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}if(keepRuntimeAlive()){}else{exitRuntime()}procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}if(ENVIRONMENT_IS_PTHREAD){noExitRuntime=false;PThread.initWorker()}run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module["_free"](inputBuffer)}inputBufferSize=size;inputBuffer=Module["_malloc"](inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance==="undefined"||typeof performance.now==="undefined"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module["cpuTime"]+=getTimestamp()-start;return ret}Module["loadedMetadata"]=!!options["videoFormat"];Module["videoFormat"]=options["videoFormat"]||null;Module["frameBuffer"]=null;Module["cpuTime"]=0;Object.defineProperty(Module,"processing",{get:function getProcessing(){return false}});Module["init"]=function(callback){time(function(){Module["_ogv_video_decoder_init"]()});callback()};Module["processHeader"]=function(data,callback){var ret=time(function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_header"](buffer,len)});callback(ret)};Module.callbacks=[];Module["processFrame"]=function(data,callback){var isAsync=Module["_ogv_video_decoder_async"]();var len=data.byteLength;var buffer=Module["_malloc"](len);function callbackWrapper(ret){Module["_free"](buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time(function(){var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_frame"](buffer,len)});if(!isAsync){callbackWrapper(ret)}};Module["close"]=function(){};Module["sync"]=function(){var isAsync=Module["_ogv_video_decoder_async"]();if(isAsync){Module.callbacks.push(function(){});time(function(){Module["_ogv_video_decoder_process_frame"](0,0)})}};Module["recycledFrames"]=[];Module["recycleFrame"]=function(frame){var arr=Module["recycledFrames"];arr.push(frame);if(arr.length>16){arr.shift()}}; - - - return OGVDecoderVideoAV1MTW.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = OGVDecoderVideoAV1MTW; -else if (typeof define === 'function' && define['amd']) - define([], function() { return OGVDecoderVideoAV1MTW; }); -else if (typeof exports === 'object') - exports["OGVDecoderVideoAV1MTW"] = OGVDecoderVideoAV1MTW; diff --git a/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.wasm b/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.wasm deleted file mode 100755 index c0e8abe04c73213c74af35bd7f3788a517e0cd2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418335 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§@8u+zPYm&6PRe=w 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¥_#0s*;46I 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¬}~q8?_;9z2iII{^r+L-WPPwUGg9n+ma<1XuKb7XT5D)fyur4 z|4fN~rM<%EA=+Hi2Kj5l($t`6C!gtXmIn7}aOiqI*J$77^BXvE(4_ejlVTapAn) znUk(nT9W;;b~)gRJxIS{j<_a`5cd(Y&~(_xv~l-2W7?R}0?ey=iy5U|bye8TxUcKM z<_hhEEl3YB&fAZgGqy4Pl%8eAxt->F_S43UZNhxlecbIb&uJm%1izg($Ms|8VfUo= zo;jlj+pe2O%qiOi{kj%so;1hwYwlq84K2-e%GGU~(BC#M8Sk3?rc1kI+|Vv-?-_^n z73OvAZE*0Ec~M(wYtW~(OJ^1sI?G$P6 zx#ILV?TQ(9bL6Je7?M2Q*R?FI0;?~}y+UU=O26cOPd{N$QflEa58GCnM{Z_8A2ZrY zy~90ioX}>?3wofIWOHiQv?TqaF=nK3e;T+lWXzbS^&9#svsACJcTk@odyDy=<}f?- zX=94^?$$zXUN%tb1=|M|Y(bs9_Wy57A>HS&@ zn(7MUycS?g(~IN!HDlUb>3Y|F$vtI+*xofx>a*qzbIf(taF{2|!)Azi)VyN9;tH`1 z=@I5>?WCS&Mwzo(w>GN<>+fp)#yMj`yJ$=q$K7wcPa8MP3bV#MV;iTGT+L$ z3g~a`l)FVgZ)6$4;PI?I;?oK9q;bhL1F~rJ_zmrhw$hlg_nXJ$G;+bq@M)+M)tx^jVg|m^H7MPJPCmrXM$tn-RteHpt*kTetf>)O^$o(5LiZ zJw%VA^;)zc^SV7EAlN*vO&bmF8ry_%lzzDGK4;Fjj%hXKq;1+ZtB)HMMz{Th9^t-Z zKklBkpK?d&4s(^Q#vF2;)-RYx0=Qeh;d;k4<62?6(QfREkxU5CFf^?U0 zSgSCO>;3u&y;-51)K<9<8?$QR5wVoSF8SW<=H zWP8snMbkW|kC|Ea6}F37l$peE!#nWNDr3Yr>`JqDyWcfu?1AQW{k-j*`>KA<9i&}= za;Ef2twmp@J8dfrmo}uGH{R9?q5JCr5qe-i!_Cur7JXG?q?se`b2f+BV56keCCeDM z4{1TJ6Z+ZD-ZKKUv72N1CH;&o3S?cSorc1*%tKJzb^RhZbsY>2!nM|6IQ0wK7>IXN z8`0m^gXzaC{Sv(&2_J7t9OVj5%b`=I#mj@r*0To&=&?c262Nj2Zi7 z*Npq9`yF?dEd)w-=-15iwDDo{kUP-5O7C|wAxpoeWtkmX2)ZDYhdZ#(Xuh00Hu({R-( zdkZB!VVtwStDgsn&)Ft4r#%?H3os68Ax4FLrF+)6Xm$jgx_S8~oWqpg3U?OB-wl=) zB0tW#FH`GDd$&G&^M?MOdCVx(EA$iYcZ?9-1qIzOuOLN&;X#Jh;EGE|l6ld5S5Ja| z3e8n6dQqDRm@txT{rZgU3aFv!S9GU&18kUp%d$X@4!gsB5y^W4xp`5q&>{>eMU89L zeZ>}J9@Y;}M-xNJCL0&almg};SW`ib7B&0o%8PNT-)@i!~nVsamWSj^XGDm3V6K+= zOq-W!%YY@<^mEz;J&ithxep;SOfo~Xt9-ueI;)K@E!3vX88b^i1_gEN5%zAQ z23~O(X-LT=^Bwm%y?>2Ty=QZog?hJf!mZg?=z-A5Bz#t5)M%GM%(o5a&C~8cIK4wV zXN>WD1Tx~t(u>Av&1J7Klk8{BU|Q|8KH*vkeFhk3bO(~8LO-wFu+1R3yRmV;;Fb{@J4FfW+XU{8(v3fC^=XTNa`DnG5oAvNQ) zBia@Hgc)I8vY)Y?)vmdxZ8JznxL;qPop*O@m-GO079DKDh{D`B=MK=1Ay2QNRk@6n zMyVEMo3#}}5drqo`U#}RS!2b`WBOU+lzGH{OuM38v^kKlPHjpr)TYd7w3i!bNoUcm zI$YDH!IJN&OTkrBTLd7dWkT>n(8fajnCa zg=|IM+DgqUVCp!$amsZ932^}#afP0~3bI8RXIxW^`Nh#9amHEq7=3rhb`**^=Dr4Q z#@SkoX+6sxfi?RM5?BKROKq$4Y1;0hJIR%W)V^q|p+uLF&`4qY|Ht6jaU|>&+mw0S z7Dx>Ov{|E@7{2$k8#m9|kzMG0@0wBiDy_qP(tSwl4mg6OJ99G)34Rt{p487G zhm7m?EMo-RIA)*KOWkM8>&7A16s>f^xb7O#YxKi4Nzj?t1 zvb*VdBmhzrS#(63aL>9M-0zuaoW?BL$c>wt{j_$&2!I}3XvtA}5HxntHf@}9N0|@74r2`2cp0ua1m}mC{q{f*?CQ-pG>2LHb!f!le%Bb%FQOCA!fPw- zW4za4JFIuRJK(1vuqjHrVjMEAxZVQ^&ub^$GluA8=W+0%?t^D1R~7k%xx&8Z*LX6z@;D0GDxbgda<(tXLc!hH;MYte7GJJ1@hA$8x? zuHKw5JKW<&$Y;n5^At38b;)r(&^Tet8b^$C0S&H0Mig8!;?8nk(F=_s^O$|wYzer8 z1c;;6PZ%R0^%cqiK1t59HqVLzGehNsn^j_F52JG18qav5hTnB^zkd^VdK1co!Vcd=9;}fAkNf` zQyP@6jUe|rY$x0oj1V;9C@dGJc?l^rhPE~0I%8ZRmcwa87%ldTNWLsAu6}YmiL7^_ zR}E3x6-fP4u2b$2?KC`|rYE8Go&w2-&;bI?V_JZ%)OJab-+0fsWb~V--N9HshtU%! zwWH`V0Z83`Ea@BW2IH_hN{=$9Z#tj~hyBRSDD%c=r_jmK7Qys$?)O}$&3A6rP+N3f zb5cK#Bx?znLUVjaKWpoE9mX1&!s0mRav_<)O>@kBL3_u2)po)>0cS^%%MkKl$P9qX zg7jI}kb44aVge0ig*Fv%#jHSYbV5r>Xa_58F6#fT860qdGPGzx#zl8Gn(|3_uV0_l zhtTQJeawsQRZu*>Bs~Iq(uHp zl%c^NXSGtd3u#`cpSgM1_70R0s85)2^y@kEEEa7I*cWFz4z^x3ve2{|?3dkQTRL2# z)23-jT8Dkyei2{P3FMAud)Ix`F1pQGTIM9kP->3Zhs+jq>B*ZHjce`*V+0#*mHRRp zSTIO=7|OY9t}@@l8tcZ=JdI61%fBJbfyR6pE<1&<>>4(OLqBCdiAK+O{fay9$Kms} zm3Rj3y${y_D(Kvy2KBiGzX3_Q_O-k3xnuc~xpaMrZHawJ00AYorS_!(O9?kwW?vSt zOadeHfF;W$_=4C80)DJ#2+9cz#DU^)IGj%B)D!_Rjv%LF%9~?AU_f9{U=YimI33O@ z=TuODBhVQ%)^2+~Z4^xDxzU-nZz42FW|T>FVs{)1hgN_jAUpbAE-U z{RHnyhYYV^0%44GX9eITgP7zf0~8>^!y{@hU~0=OYqoB6A?;sUubext{!mbw_`GLay8qs z`!}ZNIORz>BnwY5lo!qWeg0Xx$9pZ$$anQ>&v&Xu3Fh*W@A8}XKJVH4E=lv|DZhEY z%kNa(S0?%H&BvREoaN8^yEjkyP44%m&p&(fm){nb(|h0iGIN_RA8-D0_J04rv;5w& zNm;z#r4HWjQZ}iJw_e^d|9h1`OWeb&zxDO6-FwencP>|MUfh8=E+uY_!?89rKCh;I zC^9mmq@kyOth}gU%YkQ~f1$mpeaF<1U;WLRh?uyPY-eF?bXs;^QDI3|inF}2qpdkV z+gVoEF*xj48xoUM-qafznO0EU(KTG;tn3_nWO}-#zGe7Sna`t={K z35$tINYBoTjY&?+bmkSLB&6qWs%xxsX62MrxAgS!{D#E5@}~76vB}wGwH=x1c~u=F zd-l~=)%A=%Jp0`>Au-YMDVe#ku}R6P8QFQs38}dym9;gwnc2maO`E%TJ}fS)w03<+ zWMXDvbyH$ON&{$<@dGnTiPaIwovN1X~DLp$jHX%7BEh{%6HX$RwxV$nuJtJ>Z zU0Wy5heoI5mGgW;T5ee_&*xP%_iQaMDQoE7abTL~sX$7mdY%ICe7du+v^*;<-C0uA z*yeDoUB4kdJ%8Q0(2a2^S%n)Tqf$s{%E`6JXMn@;6WoA2*;^UGtoP}lb{Q8KPB*)ryp<$6RiJ>83QSqsnq{pXZ6;;%)SrZZ& z8xxlh77-O27ZVdFc_gQ#rX|G1CZuFJ3)V;mp^-5>PXRW@tX~%rwlO|AZR3W>$oRC} zf;DT_hi@cxckxt2#G)~(}nLsU$7SXe}4Y*N~q zHETm6qGMyponK>PA|s<>;^GtHDN9UTVoIt!FYi|QtX;QGU4(>&t(SsCM8>UIvu0gr zxSSm!;Ttx_gi;WS5GNIhjY~-8ca?+ZwARXQ-FlVly7eJEzh>R~unlrwNN7al`jAjQ zqoYH^!Xq|D#l}jyq*>3;ovmEguC>zFty4Fx4UzmPVo1ok_3J~(FTzTfPxXZ3*0Z{U zK;8KV?@@<(-@0`hqEoU;%j;V<4~#@@h>T0gEhw*U>*((v7};H2T2fZk*1cozW7E&h z9De4N?zX1-)~>uJ*Q%z%g_rR9nZBmgpO8DJ#g!-&Eb!w{73S#|}*&dZx3vzP72OciWzapLylYw|?;(-oL@>%Ji%p z_?!2~!s*#kmV*4k;_TFvl+2vMvdX%qmZs+VrXpu{W=>vV887SX?H}A?y?;YYa#r4^ z>W0?M;q*&vN(N8BTy0$gd0Ckmd1cj2J;S3D2c{+;ZEL8ls&CyqIQHP<&wclM$A7~6 zBcfuWW8;%jGNb@PSBWWU>2i_p%r8t&hND5QvWn`uhKAbu!rZKkY-d49WnFW7S5IHR zdjGocD7dAtyt<(!WPM0jWLzRhQCMEv*t$6WbRNb{gQ| z6VK1S`u#PI^$=t<9F~;EJ9Fba`~i#62+sVpqy)GrJFmF3yt=loy0#!ED_uIEyr!|W zb8|QRtvX->AeUXZsj5C?J&XcfQ-GrKnueC-#Q1pHrlg{-xwC(G`>xuGvJ&aM-r=$R zk39M8Ec^xA&lN!UB0d=gO-W79%+3*f|6e&PQ&(PND^3swbdatc}%Z|MV9-D^VLudf204eF2 ziZ1~ODF6+UodnQ$3qTu`=korPbbyBf)HSxY$@?8(MtEd2{ghv}ZXG}vE+CPZl95}u zDQe?}jT_^V<%!Y?>YbO9nVFGWP(mkk^bU{i<^9qD9H2o`YDQ#aWHjFr;^Pw%L}J7P zxNroGktN+xn4Xf9Nb4#Z5Smc$2SP)`H&B4|Z0QZI!Xm&Lxi1Ppj)W!Yw1SdNmDL%k z)GaAJx1e}abyHhs5APRz0vV+MiOD<()W^~c@&j!LU`Izw0W#>0TxSaX8HYT8R`Lpq zOUkVG3;2dn@WfO_4uDixLAtfv{BqS_+LsWdC&{uAO&_hCeVoFwSUP(Db42(F| zhXb{O&2jOG3fDktTAd$a>3yqYbVzDyYFaw|K~h`-ETY=OdcPp>dP*K0quvj0hJxQ4 zHb%!lkLxG_FOb@$rO_VJAW?C`Z@Kx%2fW`YzW>Aw(XLAm70I zP#T5ySP!{M`+$^jBA+-!==rXBf_o!qhNu|i6%8U^DVr2R^^3F!eM5sHzc}P2>R8LN zGINI%!E?n|RfrJlHcyFoje4FBQYk`sq$j(zNGC{W!$uKPQt$|&Cu&Z4q(GDi^5XD5 z&sk+XuP~o`?J19(q)Z<9sB)186gkPE?vgSn`8)qw8d8;sQb{?i`xk!Bdxyx$`Inz} zJ^$fFa&~@_mDBuRRL1acNK{-#UUgl250FMBLc=!3q+}GA)--kYZwpx$5*e4AmRnd| z+p@WLU^qD*m@27g?ikv-b=$5zd-F0gNo(vK-n;*isYjohZmz1VZs-~upM2)v|{OvzFR+Y$P*#d)U+%hJU_o6N#Gp(E-o+MRL1}Gq{QTOXF*v-U42u1eM4P- zR%TXCQCUqx2hycub35`bGbbPDZ0_vs8`v^XlAoKCgZL3y+dH&%yC^;(;ppBa)rj?> z9imQ(BAVtbuBdC-+>bnrh)YPzLIxwTyLw}zqGQvtippzSyHHPdj3S@23d z&?s|Bm`5)(z!aOM>jl@u4H0BOk?IeEopvqB~$4)G(dA}Q$bE9ITx2z)+=?ROY}d;rxf|A6fjX(*M)3|O%`(q3D2T~pnpUZ zCQm_GRej5P$YBElG(9`Nth&CTN$QWClTV8_b#(XiBqM24vI@$1mKlA!M)R@}&xI8Y z22M$fup|4cbwDfEpn|So;!!N(s)>vCz+uR93Og=6YA@z?G0lUd$%4;>+$=00{ll!VSl@y^_i@LOL>WP^r zo9n78(S5tOjP8Bt@#kKAh4*7Wq9}M806S3ZEu~OmUS*3O5=S44ut-B*B0uR3QE-Ji z^7D9qY&>lz`gUnqd1*R^Ws=gb$|`GMiQLTeRCS5E)zsSFT7dqG0$x;BS=-psf&DD_ z3dKtUxW7|iX#byjwa|>tS?&nn$;kvYx@`LkB&8~ z6#=LQ$jWt6oCW%%yc)TwC<2s7&XL0JH`Kp!89t5PRz{>Yy}$Rez{coC#FRs((_N(r9S_tNxj}Xsb$LhW#)g0G#T2 zOo)-)WkvaUPHFw7_P*hBDG0 zXdN4bKSd|b4-XTKFG|RlCMYUhtS^hcDhL52RX~6piXK3S(h69lryu-XjlvHCs0K() zr!>kBAzC7^m_+>-=+n{Bz@s2SqF_P_?SVFjh?Ley&&Ys37V6uoJ;VUPX98dp3q1%z za9L1NwyDCZKO7Ji9)-}!u<9=qApVN@6xAA{`=Qo~J}z31QiwN*ospO-`k-=D#A7Yc zAeMd{6_=8hfp%O{9vdAMh5DHQWak&bB8&BR>JI{jTMdwyltTS+m_Th}QlU1}^nj7l zqq&Za7o|?@3mQzcNvtcX&wZA5osuf`SL!ta1Cu8wK@4IVh~~-61|=5j|5AUcGrfwH z5gVuKZ)v=cKvc9`i?)d_M+-znThu{&cdgzK)8t3@EG>te1>j zslPNpDDF0C0o5BJA>^!#+UUjC)?3BEqWiIM7GEp-LQ=)P;aGf)xPU-Jh>8W4mZ9pe zC_uqph^M|(ORm=|znol9ORmxH=Pr~UZzavyM~knyNfN~dQJpIMA`L{jmHi~|mj_l^9uSL+fNu@UCy(oq!5^cNQI5iQEV*vEU>Q@Uke&UK_S9B;3xC}fe3|o>@QFK ztrpnT3*)!&n`)!tU^<#Sxg|5eQi7YZrG0Zx z|CVh#cI|yY!JB{^-f}b`q*`%FX=P1)Q)_2;|IoHk^da$>Mk9ehbky*&>KZglGU)9W z|FR|TP!96Y$m^P0@gWXx9oag(ZFJY3J$v@<6MX=S0grHX9Xj&>I^w?l4?Xhe)WJum zpL%k7y1A~ZsN0FTMJMAO84fKmX-#{^Hkv*0;H{t+lnK8CPB3@V4FKlLw!8`h_Fk|Itr> z{g;3H+kg1S^T=O@&?2MJutftySI%|fJ1?S^Wt++?DyjGe<<3&DA@|@#L$cz^L)$DW zw&aa?ax9HZe4aSg^70GvISND{19FshuPhevftFWnlFZ9DZ7M7C=p&+|=b@04qm$Lu zH#Rla*VQ*P)YsMKW4~j;Wg{y~lt$mu(b3tpxvRSq1HZGqtuQY)Co2o(H!r`i6pgN? zp&3K3x36z-0PA$1ucRQ~iN!DGQbBPE+1EB;2GBc$I54(vAF=v>PXB=bL@jLX=;|F9 zf&!o!;X9xH!yq1(7PqKA?jI67pRfPWk@5~Yx|2fo_Al0dY8%M9r@wDtcx1y?y=tz1_w6dAYec**L%R(6%;h zA_F?7eRDV5xn+15{aXPTA{i|n1vou3uSg((v4O7M{w-StGZ0oD0>BK$^mS5rAV5)o z=r;&+T%ls13in7)0s+k}EtIg+(uWyPNXfuR$Ayj|-q6R%G!EHRXR6s?(W7r)74p&mk0L? zK;SSEgs7|)3hL+tpZf;~2c-W+f{6qW{hx9$vVb>DuzGV(pQMQlr5Tj|pTMw;_?OBy zRq>{lcG2d9IK28lI&~h-m&)pDypfGf&7S`EjTa~ymCg|75r>$kYCt113j!{$fI8c; z3lS1KcJ3M*-I14*Edm0UjQ~qSW5?#+EyJTb_fG6TFm>pWsfX&SDnL8Uk4-bKP|LBFe;&9 z5Zs~w{80<-53w{Dwif@3qJYKrhq&s*7zYH@v3R^A+aepGfTF@ekq8?!_06ymCbP ze+{bl2Fv`y%_b1wqkuwD`ekr%BT9fWKp_Ck2oM=(0~CM`DdRj;LBMH z3P4IAAW#o*FaZ!08H6BJAfm3ZNid?lwYeZS7xh2@g75$&K-s2BVccfa2r!~c{C}1P zD@GaiFGE_%LIHUtCDj4~9_>~j0H;vsh7Dplrle$L<>i&4%1Hc*f(Nhti`AMyRj_Px zq2tnu#r7{Sn3a_)omp00U0d6**dERmA|>DIhK4o)iR45X@DwMrdS^*VMFpj5?&#?0 z84?W!bfc9s<$YG3jg1{0y}iT3qoaHG?%zLIU0yC?wy3DAtg1@#?C##OWyg-adk-9V z?6K+TXQcn<+ut&5Y*7HE1O!y;%(KVoOzCRt9(oc>LTq*EL(kZrWodE;q984OvHgvs z3Re{=ND0vt7u(}d2N03t6e%Gfk(8hmNU`UIF5z;9feH~5()xge(1!p7);=VVh3-oG zK_L~=dw>MJ4}GL5n)al^m_i{UMcO)4|Eo?G9G8)1MFEha=o8h|p8mItH6(pFelI9M z+vgd7333Xd`)A1_el!G%;QP;B3@KLU58%S|pWr&lj*H5=4YZ zlk)$nIx00!a2yIy{zM^xykc+v3l3Tk5WWGopp+I5c$U-K|H?*C%m4+TEveFGWaLQq z3uSrzKT3Y8mP5$q=NBU#Ld6`%i6aIkZ3LAAkPvcV5%}SwkH|=bi(n+3f^sI3Oq2|y zBXviE@D>OPL5+aGn^0gnx-pMLfdC*7A(jRNwlMU8uFyX`%=o7T0ABx-hXU{<(n*xW zY8wbx4dVMK0A`mCPD-(gJ~zIvy4!L=DoTQ07WkiVQi_`rQczT&@IgpQP(zeR4{azx zAy{D1hY$#omvj$>038;IKp#-8&<9PffJ@xGD5i=;ic4|#CksG;5OYnd+7AI!QBh^_ zzo(Z~M}^^e6A}=D%CP+5(#c)|fEV!OStLLJhD!1vfa+x#)rXrQ0qR3KbfZXzL$J=f;<;3?J6Y&I-!Ex+^CISfZ#EZmynGN841O-#)c{{7w(A? zk1~f4owC0y7Jvh)t3`W)HWYzS93V0`4-2Oh?!eA!ZnpX#_ZtWRL;-Dz0w@H%L~qdl zG!CvN2ms0!Pof6|r~y1p0woUv!mM7TFXRUP=n+srYD{x&6knx0q4KxBs;WxYSvQl+ zOD%}7Ktf=`3RqDH!Jx230cxOw))5+z-sgFBSQH?#MI~Z=47qc`2^WaVa~FU51Ix;akKhav!#rg&X~ zQD{qOBqmOEzZW4?uKdc2(XtU0DQOmc2!VJggzyL<5n&ZTKf^;GB0=Phq)8PKu1Ifa zq)6yP2*gJriPAnYAEeVNM|IhhbEh(T#Ky|W0MJfRi zNR@aG9WTAXYxxxav?2j-yp19PtIy>wHCjda)V+#egzki26-p?7waSi1IOsvI6!8cW zp$~Z%8So)KZW2WC0PujlEQJp8CUrm|ND=fAt!ug136nO9Rre{?ZlaT773d ztf(WCY>I8`hiYV@ZNap(AQxA(_>0pcJ7WS{zTMF*w272?B zbO8b%k*r%Vo-~&vTrVu`86P2A-$Pc4he*Q0J#V~iy2?rDLyDtvls**CzQ9Y2#4oBt z(p54fgiDuB7I=$`_tYN(u*M%0eWK(_IxS`OztuEq`~gMQ0yknpq`9U0J#C=IBUDfu zCZShUc$C@+nmg9|ArGO_5xLm?g-v6KmmNc^Q+q@_xuKyV)E38BRK>hCS6_v~p{bvf6_ zw|pc0mfz<8@b8{J|7E`Ksu$IV@2B}+B*oL}3+u0l05b5<0e5+uW8qm`;_C2>NBUAd zZy{Nsjy3#ah*0xOV>0!1Nabyz~H+o8b6TXBk}!U^2^{+Pd^85AKSgp-}rJSuCElvwVe{Y+02;MmK|d|ckkN!AcIQ} zGEU%c{Mj0REUO@dvy&LkUCeoTV*1%{rG3UI{jB?|K{)h z(ck#?U{6nHXGaHq&z>zqqhk~MA9?iI=f3;eiMRgzH~;-R|K-B};&1#L>L4Up>|WF< z#`tjji5p3ceaRrHzwvQVq%ihTIK-a9q{gR!`Q;fS%`fmbes0CH$?%zYL*%vM6)h=d z@I-mQ{Ee@tFu)RzXEBvw%e+F|>Nr0c5U6I>A@dstNkMo@QMYxU` zT_S{J4A^+&u}2O~Pct9#ndkk*Cp6bH_*hXvfJ$3;-MY0F-A=I8ovs{KZFLGB1c% z#c^Y~Fg*z1FMeWiJgc}i!JWba@m_%d{^BbZ$GaB6g#_SKRaaIh54pei3*w~-m}caX z2pkD~VR*FxzHe%3X>KG=r`cb8MuCK9;BkY0C4h(V2Zr7{8F}kwaGtZj_>H1G00a-V zOzxH8dpJ+V_q&Pi7#sux{Ka>a6cjj}IWp%%jSMleR@2bX+Paw#p&=PR^YZ`g;y*0y zUMT=FtsAdD4pf>@g^>^-Ac}}+yA}Z48Xw|G76pNrUJ1L!56|!f6#)U-I^lny<@WI- zGCqJY#neb9fPi9*8X=1to7zBO2~qMFUn21ZNC3tvl={G^0D%V*T|f-l2<+%D{=~uu z6`;l(q9#TShS`>m=!1u+4on_=^a+3QDYca{ipzonHN@o*g0^F9A0cQ@KKfU-*k}>27atZf+C>qP44Q zaFCJDeNzuV`P54g{^D;`{DnA8WqjQV&?1D2vG+#$g_FPd9Htw|2pl?-Qa@Ax z7t@9$I-`@}*G_-&I|?5}fsg<`Pk2W&aTyZ5(bv~M;4i+XC_f+RFLRz`v`sV!H8j@V z-qk%I5n#gq!sGPgZR3BGj<2SKL=nh@5}(Hc7=i!s9O@zu}fALE#Dt<)`dAGJR;Js~h&%T2XKS2N_5pLi8{+s^dn-o6O)z{QCG42g` z4Ug^I|G*=U%*?#>@*6++(T{(o_Kb@q7(s3P^m6L{KpVA-+oxfTv{8Lye0rh@bM{gKz%06+0ng7Yy)#0RG~u7SH#P zhg1k=NvR6)^%sA|IxGyGqMWMr9P;wj$U5OSwY7CMeAfAk&yx5Y!Y>Hm^aSuB_#`?9 z-fxo#Nq_NMf)7f8kN{5j7ePV@Ln{HGMEG^}^!khMLi-o#j{+eUKp|{bQKK|~P9gw_ z687@{7sh{iSUi*=E*1Yp=tm(sfQWG6f2HGN1bkk6m<11FASeJpgAf&fP*55YUaVFA zE5PG+@ngdO@-WMy2msIvAQ?&kdJHy5OPjy=GH-klt02j1C5BQ$;NV4~WLbd3U;LRB ze)j9960#M zXb>v;actlIgO8v?JbQTd6@T$}yg?=QX&?VtEhQ6Q8B0QFlM06IvQ_#wRf@16hlW#j)8 z|9cdKKP5iU!Uw=ZJl0l_l|;Jz(eZ!I2IvmDelr@qKvnyAj zL`nLMpY-Ab3~CLEV?%tI_(}^OKsEso0Aday{5)>b9|r4M0YB}i`<|Etm^&P~Pt zTKW(n*B<#V03ZkpCv+{FvxhyA4s`wKAf zus9f%B`Lll(YD0nq3}Vlhxj}dKq{Ul6#+P9_{$gnOc%-!E`f2($A=LV|B5w6OQtIRpEp0>g8sY1=j-#d z2MTx%Iap19`}k>p>G%%_eo|#3!@0;w6+w$9!G{lGLP*@39D)!^Nk~)pAq4`HRJu1o z077&Di~nyQf9)?F_cKLM$fsPV@UUgLhCf%uQ#2S2Q+r+jhpQg7ZKJ|(#e|G>fzX*3Ul zESjHye=-~$1N4xfWKn}f>d{Lm_2P;0H-Eujy1)4if)AoJgKB(WIi;e%()()mOhrYt z>VG00X(O?*Xc(+-(N@$W*8B(P!?zv{=9}Ubn1<$4>lFzJNbIu=_0#GWEi0bj9-*x- zO8530-6juz>G=~LeDJMjs&p+%=w&GZ4;tRL-i@jmA5sZUaZ=8&GXKJh4_2dqAh(&H z;o)%6Q7qMj$tw&jWe7e9c0hG}i01=jQllf*{0)EUN_+5BmgeUD3+H#J(F;#~JqV{D zLj0gI#n8w9UPe|dZtFVrgGdgS_>#2;Q3iAdQTT zB?zD(K=g4rD5^ZFNb65b_jaooAam_5FSlOc>uUx0o9nqO$OJNhJ^>Bo zg78RH&wD&7gjf;tv)VlD=J+8CPU%N z7p2efzo(xR!&t2@C@}w5iX3d^sd* zk?IO1=FJb8S1Kz>0mb}>RiUgWJs{$L{*k}utulEE<|~z@4hUh%Ps)WMg%(_sH-Cxw zOBQ~3oghjHfk)@&H~CBV^uNTqiw+=)yx=w^TR8to=s?;>VVso?`gzwsSG}kp^2^ST zB45c`j?bMx&`4eSK-^0bX9RGzEnZbcZ09a`SrB8xN=Zoqy%; zd3h&?bhT9~!3$|P$@8~-KnFZX*6L6IWzFyMm%f1ieO=+9YIw#g-1ePv#ds2J9l zB=VC(p7P+2BE5h2bnCU=Pw(pmNfa1ZKk%vUm|rrX-0*N;|68+NtXg2sSTHm?I1aSg9 za|fvkZY-z}6!P`IwY1N3cX`V&4&xpPv2&{cmXmo(BBflNb&EZ$9Yk z+g8s*2)9Z1k;#AbbjQYmvdvHS?0ET|^)XrLMQ!;dZQC6ia*J9Hc5InBvo<;-Ex*ZG z)I976OUtd=+0^sMTaM_|fntE-pT+uC#jSaej+U$xqKJZ*{BviDXNo?BtY!Du--k zmz$bi-mzvwTufX>Vqy;QLF`M$rfJUFHDNe9QsQIM^VN8C+{TS5d22!$l1`3|PR>N4 zvJF{Scy!8|b?hZa*tpue0i%+*)`ug}GHddm1X*M;|}Z)!MuBsqg=0`{367&z|`EOIAq}V$<{4Ew!{R zH$A_yrMn=fpuDMTsHC8E6GaDDz0jEX6BaEw)Pa{I!mfs`-YVH z&F-8@xygxHWle=n3bdzcQ%%SADT>wHyX&#nPSCQnU~F_!MnYUl4qGd-GhCwH;d@eD+me53yTCLPlOn zVsds-1skf88^y}X-&EhxJ=dS?ca&X{mXc9a!{$AORc%`+Rz*|a&Z!w+J}GfA329U= zi7jl>lT)(`%PCd{6;u29STqn9xnW~UE@SDLCAFDpY5A3{z09pEYwQ`>$M9wt^GjI# zmZ7}ljD*0<(1dv$`+Lk z9mCKJ+qAN77Q3{v2_@rtiD_&Y%l5Om`Kd{=yfZbFIxrZi_-bZN&-N3f5@RMiL zRcs&O*U>NyO@O3tZbE!WTnFFLdh&7d}AnP(1w`A4VX!6 zjHzP0WDmaZjaYoq%(!LbOy*s({|VHISCo}q$;ZP(WX3iKN=1`;QZT$z5W?R!#yW(z&Zp6cvgLQKD{T-w?DiBQm{h~ z-af5?=&;F?= zpPFfDkZI3^NVc=$g53A`(}!O?(%w|hlC`xBEli@?wqy5$2M^7>_{w*`zqyqK+F7uX zrF~hRci;Z0>8D>f`n@-P)WZ}RQqCE$!50f=Oz0E?3{S$ zk*A)0>Gkjb^yjC3Gt}3!xwEsaqnk-uqvH=8c>Kx3ue|odxBl$cXa08E;6P7zH`Aa8 zhIj0oc;Mm3W?p#tjW>VxtH1i&-@Y?CJT%bX*V8??W&7x!i35*5@f-y>@w3x^{h!|X z&%fKfePn28aDc_oM|bYq|L~(T&%W~74^Eu=&Dp;{|GSHq_U#^|`P zk=J?QZ+`oCzx$sq{n!8F!SV6Y(d|37ZQHfWns@c`D{me@^~=Bc+w=eBzh3^|-}?yS zfhVAZ^@;@G6Sf-=&jd7#TM*`=PlY#R_KVu=Cyz3yahXZqD2oT94@-R6` z<{ikyW2WlV`IbUpb!X2~2u{Ke*`DvRbrLm6L6AYgjykNxQxM#j=$_wwg+1w`^lS#GNn=D|;8nTFY$b=$YlrOrs&@4Ug>{ui8Z3Ma;@9CXP>5YGyVOl^bL= z2G%9ny>|gVD5!!iAP{HB1KY>KWX&V-M{9)U!vvd-Mlg3O874qqD1zCI4m5ho@hd{r($ozSRqGFmqpa zgBTpzzH84zQ;$FM{C8jf(TSg&8tCroXlG6y&urN`wrjt<`=wWo{qSd}esyN3ueVEf z+vpO67~@5cv4+CYV?X}+=`(-%+mXS6-k$C*nG*&=z~zT#o_qPVAH4PR-<&=7-~Ger z@G#KQ+s(4|Jh>l)c;?ypT<=0LN2fZ8NQ)`D+g6`|hVf#L$NhWU|FCxrsCC;=$Y-@ipxPLQe7giNbhSF&tA za|YR-VsKcks=~4gG9ybCWninxmR9Cu_YV#YZ7UP@hBIh3YsD1^mubU2eSnSyEd?y< zB3LB=A(NonC}sZu`{H=O1?XXNgS8I2%DJ-_$QohC6xM5*r$1P#j88uTA7uPad`1%S zyde^xkO4asN#8OG2`L*0DZm2+5Ttr{a~8cKlda2@z7t(ttUVpoZO5I~OjU0PpqqkE`rKLiU{IHi|;J@&Hhfh?xL@ADQ@m^g578Vv+6DU&57SS6*mUzqTrsVASF zVXJ!Zgu*m3>0yAyoAw-d__1f7d;aCNM)p@xdqT(_s9Sfy?2k-8HT%*lYCEC&I-X#! zfZoAv+nFTs=;P0+{bah@P*WP~>*;7}0%SdK5N2fy_#YexRyu%{CV8r7kX_pMOg{AZ z^x@g>9{bT-3Rv3PSuThLulk0p`PYxJ73yopPMkdTOMw>lY3M*@=>?I-#uY*wKJwa| zKlBzxd0)J@@w(K8P-ioIn@G zH;4i$C=o6AAaS~JG9&;lh$1nkNvMe!qDoj$p|lF@F%?6=&xFT%rcN_sU#2x!Xd(0W znIE3xfs46y6&9?c09zENs)e~l;ZU1CAS-=KDaa&#fsC>Wqz;koWN9t!A#;jr6pWyG z$R?EvM-V3H9%>zP)?rdpcs<*oeD2~3t!N$$L>(*k@DLqk~^LLN$uPrq(^AyXEnPf-df zkWpQOmM61a(H_}dw*Vnf-+-<*IDZEiwwSecfGJUW9rVGzA2kiFZ7d~+=FVQbY^j3& zDofNc)4G2UK|b+d4f}1Chzf%KCu=YaS!*yne%rMd>Ol=`8j(0GbJf$gbvugx)T3TV zsRDrN8<4h9(hf)6|sNnkpm)=;PPGjAAI<+r=EN9weP+0gA+X+9W5+3q@HBy zsu6_{kD*~4`N8oMCw|`F)z!uZXH8AAp#9L$=;%IK-{r{{XJ7x`TR-{vFaF#zPAz=E zdm$i!0tr44=&8CE6I}JG7~!Z765~Xmum>q5TG4|KEUYbNhc$nT?<`Gjfd!kfCZi=R zT4-VZrL5<|JZiBJHfPf0xgJ_IcpMw)55Hth`t^tB2 zNN^`O2~HqEf+WEm63Bh3dS;FUc;9tz?)v_Jt*_Ua(_PZLs&?)D)UMrK)vOso1cdlm z$OASD*b(FcuioJ`B62}iS+kc|aBb`4Ot1p7WMyZMae){X1FQ^3tg-3wPM33ITEdyN)`_Ii72$&EP1RKi`G|43287r@E z0GvbsPC|k~6-ESXOw2y2nwklqkdMklU>z5}C4o6>QE3I)SgCh7ER=ZiIVxD6N&VY3 zbYQy%Vx>?=36_r1-P{U!6;)&}778mFDamA!HUTK&?%W+PjC3{$%ph88c_+W@Mz0FI-WZwg7Vw>@CsJjgQ=YI^%O}5X0^dl?ot( z3>2YVq@sO&pNyL_W$xSs3zqid1DRux?k0{X@_^CWj=%)jw2MA2B;Pn9KtWdC;N>Oq z{v}aoGU=d~#Cb=)HcMYrq`NT?;GnJvx-|nIE$BuJ#JCXVB(EbA&jp>D(C;9@z<~E+ z=!cQ;DFX^2D2S~8C2JVq)S!^zL{=g}$DwFp5d-2dHvx_yZop@h=;nRpV&f}J#CC1B473M~9jIuSpD;FC_| zlZ(Ws!hZ0JEJP($iNdUl-EoHO7z5u5RurRT{(dn0IR-w20qMXO*?8~42P0#G5`35- zE>{wwu2+H&#FC&>4*nH|3Sw0VutIQ6=OAQdhZW`+E*=Cr`a|$q;4Nl|mkpfnWcP=m zVa!edAw-^B31ax;^B@0=fz?5Lpk%+d{;x&7FAnYw0vbRKAA%a;(C;LCRO1Iih?~kQm zLSO@JV83P-it(MmN&mOF2F1fVA!ITGyf-iSra3Z_E3BKI* zv9xR!SYY{(vIaO3@UFg(HtjQk@ml5XolBmzi6j7NNS zEH*Y7LkqBl{0;gT8CZ?JB?pixfKERW6EQ2}!wC#fNEG#ugOkJ;1UMmIEc1fn&5zv| z6x%ap!-0gyGK05!fD=ow-2<`f$W}gN-wZgGV(|T<%*=f3<5^x+16Y9*g+(0dk0PH= zD=sd>W1PlT_@m+ICJw1Eb_Y?iZw2`Pa1Fkq*bZnRAEJ#Ad>j_jRBRAY!EO-IN08@Z z$zz4~1HlN^nk0`hNdH>mA6XM(jqW9egdIMHgC4`vD|X63*5C=Cg1saY5IO@PhJ_nl z`b6doB*2;(#O5HYBq?~%sR-N}WMV?_g0(h)A9QO7Az%PO$ZQ2mt!NfN3e7^dasXtI zB5^>O$&z3eM*a~;rZ2=jO5CN$Nc8&rT28cXWb9~*)Zhb*>(F-x|>Ba;Kb308Xp zPDnf-W$2`VKtV*Lmpj=egp6BcZ80%AFxLsk*p0_B)I#B74JJ}#%`rayhX*u1tkmJ# zpsWQ&hI?QH{d_Et19NKu;!uYN`X25T^5IA}kr+4xA~17-Hw04`vY`aNDmi4s2x3wV z+%V!lB(wWT&}juV8t6Y71QM_TK28XMLWmUn(S^)D$ozvp0ihNKyjqsjtqH**ufO3v zTe7f$crWnI8+lSbBQ$P*l=#M6Y{iX^f_CD+jr%eIKUM+SiCSQbtQ zo{-JS=mvqncznC=g9&5;gl@(0&+Q>|O8xNxZ&^BBiuOxPjlQslK>98B@z~#lXBP(&(g;@ z)V=}GlKqk(#_(>CPgCP5&&N~aSSbW~x(g`T%9kuQCY$bJv)zP*Bq|U1$2S@V;sYNh z1UMm>aNx{0DF{;VXCLe(^=Oi0f(m#%N~R-3q{#GjaEQEHK@N%@SeA-+Ecm7eFak>& z1pq?Q`4Pkd8MyTWFy57{#w5fEiV#B=Ly^b(;yi#NfET{#LgeV0UO)a~ZZgdwd#M0m zu!7Sc-#Ek`Q>^WR{WbA^4~d3LjL07G-4ppEBMjZP2Ac~JoMCMiBK+{FQb7UwM?_Mw zXYFV_;K5$I#8;1%{uoNACyfdOT?Y>NL=o5l0D}TCY^Y^J1p=@~mxyEhp~MPS5&t_M-TVIhh(bx>Le zc@hlU1_u)9LS$5qeheM9Nf@y!C?ug|m@^bIiL)k%-EiVRB(wWbu=qfPfRzOHzW^VE zXTCu}<`^uFkSqS%UF1pt8@Pt%3zl-R0RePS+2Vr-A3ZP@vG6f4%(p%W9rBEgxXy7! zQH6|NkVd%1*ssm8XvD$@J~Bs;2Kfj=3F8FVLT{uS%h(f%B2Xg47rJK}oEa>_yeFE> zfiMXoGEaq`2nD;thhWh+1sZ}h!jEEpI3>`Yg&}eerc7ib9E^z=+F(iqQ!y1l5y7H? zU(saIh@upWM|f65M=nT1MC8X)BMIyfNn-^HGip*K8E?YLx5{JUAprvqVn0w<1Q7|o zSkM80U^|{}u>E5}JQTF20M(?sz<6vi1CJ)@D6k7HbZ{ILpwPi$2mP=g3l|hU2tu$9 z4R8j{q+z^%%pSmI5&>YPN=C33%|Q%?S2~3uib*5Ls!WW;w7Em#_~r_=6a@Fe$m2r^ zNRorV6x}@H1JM*@2%fOniBUwd!{(#NMMe>N@DmVE=S2MwM7N*7Ei|QnXNo~LQNxBJ zkpOTg7Ge5Bz=-UQHwcXeCc?-8ybQ#uf2R5i)0_hy_Q)nGY%C5emhOepDG4B|w@% zae{4X=yZog6Z96DUf=*X$%#NHyZOWiqFLnmXLffXB=HHc;6*l(a3^Ct1qc>XC z5Sc)IIO(Hl9xMP7RN)f^AW@nGss?OmL2-wgOTtukznlSxH8i>Zd$vR{$PhtP{Db%) z)PDhV^k*j0(hnO16oi>cU`S|aP+)}+BFGF3AXof@j}d|(&it5uROyd;ZyX{iRhBdr zWr7p^aS&=^c2Mvjk8#OCQu(p0g0s>8j2GBC|F}WmgJEwJKog81qP?U%)*upq7Eu@? z^mc-;@RIxZbwV21Nrt@p&%zfqrT&@tA5xuI9HS(tt`girp+rZ?nC$Xid>|NsgT)1$ z`4>jQivd@B8KA7CV9w{78MQW8Hj{U0D2!0{lF-l~rY@u}*eVhnwBcVCjk#KC$IqAP3^KHyN-2_IP5b>S>b2!V*TXNdhm(c?q${g5=|27wQT zScWV#39-o;4_;XHrg~0FAP0YE3NkCfK{JpGA$YL{(nk`3RUb>`V;sL|mb9=`0$YRR zp&uWpZbKxfP72O^^dND-YQPq2wP-_(;ltB(`9FArv(R!dZX$EPf3{HF76k<@ov} z05=xi1|*V!8>++C)(<83?|*?F{*Q+MF!~__-6{YL(!&F<2L}d=3jf7jmJy^)#C#N1 zm4GB4U4)GlBFw-TKFSP=dT$)@oREWJ5RivjE||gc5sA)^2w1cB3Q!90jDuh)p4<>H z!ob(4BSI0tg=R7o@WvRTsb+iKkU!(Tg>690jp_laQuSmoSBq z0U(Cqh18oI?5(hn{zLM6_roB4M|zik5}x}n23*lgfr7C2@k4_GgR&vR;KYB1|B>N6 zS>7AgqQD+75Zs~`Pd6c@_VUJi{-;9AGzsc1V36D5ebN>CKA594De(0bj4Ovb-GnD~Iv|%c1+DSa#q) z9WR8Te%LZ)fqDRn(M#ff>CeQ+A&Nz0lKJ73k0pIH?c<66A(f056e;OHK3o!bqvjQm z=l`obusTY+7`&xt@{jO&P+&-CXz(B5e@46~=6zA`jT1)p_y52e4vzgm=Kcl^$u3Oz zNBqZ91f{&^rjOqC9}+)G7G?1}<-MiSNMW!2@5TQQ92g98g9;b|fJ4&;q2oUi|KFw( z^!!MjjEtBehhAu}f18_xvxnmZ``tEf=A(@NRL)g+CndCdBn3_TP$&LhZux$6z* z_0}1N^>QkbE*wGn@+8MN`Ot}hiJrTi$6G1uZPz*`y+FcTn0_g1nCldWAiJ$LT9&8G ztxbN?Tcz+o%1v1QqKd1=N=8QwGz|Q859=J!vQTrBJu7}vR6ze8S2e-WS;}#>{cPJZ z>*;3IM$c6W6n+)9Z$-g^h^?W){*0fPx0csuE?W!@6~;+8hzRZ<&#jE=2;CW^=%ear zWaDR4ucI#ar-X!%{`Q35Vmj^QY%W@zvYcgRY%olBzT5)oZ-n<-=Wt^;d){!XagBGj zcKp#g-h7ejE%|Us0sTwmv&yn`TC_#9cWHTO1Sq#Ey_MQ5xk`AyNrp|z=iyuZc)ovm z5A(clyUpYWg$>eT!gP(izU+yCQ~jj8^xY5I&e93g8YlBm(pkvALkW8$hljd)E%%t@ z_RJ;SPS1dm^OY{-BX z-g)jJmYKSL%euw z2)0f$zM^Lr(H{Z#3y;qf6oAWlyWjgb<+++_*{V7cUI{i}ej<}5AvHs(| z-?|%GUNSr-moI4`Ob_5LEbPsGnsGbS&~v=S7m8vEW5f@Mt`pXuQDP(~i|*lEVj37d zMwXFagtxMJf*2!43ztcZ{T^eSix@w~9%m=~g78zr&ksKz{5o(NNKNq`FKsN!43< zx7-)9$A#$=v%|Bcm98nSR-B>uM1G_!SN5#rFQPYv^7CEHmgr?s^7?OdN9Zold8S^d zR3kM;Tvf>AE7>!%J+ck5&+DaX995B1`C56D1S2+6n0_kxkC^E(6)|4nH{~bFKahJY z8!6!^epyg`W>M7MNTa~mfTKQBeL9t-WPXxfBD#uGDokG;uM*!Et`mAVq$lKbke9;O z^6^rZqOL;v63I(qPDXo%^@UCg853L|bW15t`UlA(VfqaB;V$zW;~cp5=60iOf-Squ zLlx7dlZEZWrZ}!D4*K?TcHi4XTW>JeHcQpW6|WJd_xT@izv(>5>2t@a_H*rOZ5*sF z>ZEFI67p|pQgF=F@P_c>aQASX@O@#GVeKK=!6t!%24rV?rF|JcDvlGgDC$J`#gNIt z6P(}LM_bhxvpM4GcDSr?mUeb?+FNu^&+AodT~ue&ooW}< zT;Xwf`|}O*JuwRHbf_`6H|;cTT{BOU`5`A+?L$e*{vRv-1k`JnU|PY8nWrr zD#Uqni*@ra<$jZMCp$6I!NbIAo_UyIw+@@0m+^Dzn*?6`i`egDtfEW8Q$jTyZ`#zF z-Q?51o$(^&RYHFJu2}n++^F8L8^K-9S#U?F=(6`u%JR=xlpq$HEw>JAu#yABwy{m0yop+gafoS^X_|A|N z?@p)XR(p--=zgL4Le5`;VJ`OsG*7HpTY8e`&0AJ17U>^k?RU@9#O;X1W9?A%k$G!b z4B|+b_27ZJ*sPX;F!3R=L3%-7)I+ioqyRQa%mNzX0!R`^n`UgcbP~O zh_4dkh_#D;JERRaJfj@em~+&2Du1G|LC!$t`yu7OEdDa@Zc>rK0o`rd-)Xd~jONRg zpcW%4PUUUPGBVn&m#7u2(WUmokn$&Y6}79i`Y3fP+?H#Q)s!g}A`44FH8jvc+-R-l zBh_lfLb;hz+#%_*#aGkn1AMIVP3#SBY2H+9BjeS8<8qa4-0QGcjw`L=i~{wHv?mTJ ze@?4Kc}~G-ho|NqhC8%kRf)_GJi^>_^rECW5?@3&x{OxhNN6OEFtx=wD|?ZLs4i!X zjxAT&F;m=-Q;!igj)`Kzm>`U&UW^+?Qaez(8F|7~TO~*$Tcnkv&Dqb)U^n}GOi8DteW#6);D69?|D>ukHtunKD`a9@`~9QhNpKvZOy3NP&uMFrQmjkXxIy% zC?{E~1OqjVD8-vlpm#kJ+h$eIjCT)F_Bd>N$5>x$n$m9J@Xausu6aeWxy}jcW{IjO zjyc}@x=A%>Lb|bc2pzwyO6o zNY1kJtfcpQ48tBvwS7EoeQ)xu~(*cSoNKXudUzFA?AM9p|aTg&AD&G%k@b9BYnx$NmaU~>cI{4 z{z*M!iZ&KXq_z8t=e+db@8XA+KX3M=QOX@`w*J5TvlR(2xJ)pd?GNh8PqhX2pv$L#JW z@p6{SsBDq`sUJ40)GhfO-~568_Hin?DXRlW8aambO%E&e)D>#roniA^7MpXZtdjHt z!zR?}rbJU&CgGok{neBl=|!N59=u^mr6LJ`(HfNHo2cNs(DpjzK~Ve3v?ZYvoqn;DrRje(hGnKFKJyW?52op| z`C17F{U*qfd&#lBm=hBeqUmer9^v?0gJCo>#N5j5O)a%e&gmZqg{%xw=QXxtEwqi# z>D|KwNg-~fzqHc?V|9ZL-J>untvqg;mFZtplTe+nd>QztoAIM>iSreUUgP!pAu#%M z{T+>MbiY(Ps(ejxIBFmhpJE^v&r#fXGMUaX8w!=8w|O0~RW_JN!?6i!?z3%P8#JnAQPV*==VJIR{{!~>b@i#t zEDhi9kYYR5xLo5qiZ?IwpF2xwWXjDGe?(0M=Sthqo2EN8DrD`bX|TCYENz3gy4`CX z8Csu`W~toz@Jw%Ut6!-MM>WReUyTd%F}C`S;$KnQ+k*Y^!);^rT4{Y`yAM_cX5M%A zvwcZTSaely3w49!dzP|*Z%VUwHI&_^awnjn zVUZ=AY?8Qi(P4v3Bt5+*l_dj=t~WWWY{&5@431)HVf-uTF~P3(l}IDhvNEFwLtl0LNlepWvuB^&E-P*<%(5{){0~Z z>$uc>uikQv`%0hi>v*5L+)vdp!f+#>VoCW8gFPBk6rK58(es#U5wCwv&5lp;viLr+ zJ)#Fi7Vs(VHlM1$Q0t27TZL(~j+aZm3Vr2XZfUGnOZ%^bn_yO_w^LnGQI1la;yKr< z-RNs=Yd)7uB+SKQ#M(s1h;&klk+z#mHt8#APgW~clt&%aO7Daw`OLwG1%_$fg9P2L zY%+H+sM6Y~;v^pjeX4dlX*u7hO{Yg~wt^CBa9rZD_#-h(v1rk9kq%HS9AbbnLH)cX zS1#Kw z0C_0No@}*o0L7;jzByw%$tb?q(gZ)7rH`-UEj$ewN6}iKCBd9LpX)SH^RP(vw8ooTV@_rADbN$}% z75|PEby@}-%_j=p=nHZj@;mMLo7qUsCceBlNNGyuiA#$)^JQAvez>`v!CH-96wgzN z^<{bCYrGHJ6zkojbsX0et$jxAnqrEK1I71;!L?pqwqp$!YDiFu&m{CDq{U^#lts5w zc?qzSGLJFr(*9fZxWYV8)UI3|-ryVN*lT)DYX$iBRg;6RsOBn_OY#xYeQ5O=?@yhr ztaD5Xv=x+NATKr&3&ejF3l>`^dRt@{C(sm+_f9ya9 zkAhoeJ?h(r^wE&7zwnbH^$%j0@9NPB9YCO7HcaB)_xsL@VeAqZCf1uxH;rPLafu9* zfQAjvWSBo8P_L05QH<*fhB3hPSEUT|w3cD?O)$d4Ii`+23@BunkR*oLf%p;a40EF! zvlpa~2EU_xP#0*N6t3+d8K>jmjWuGJzuk#ThGBk3TP@I@4DiAY^(S;W$qdtg(Qq~7 zHwCnQ2ThkehS|i$sDe80fPn6fXPD*^gh6it>U#xcD}%;N3x=uiV3-H!D-)Dg2d;LS zG0Y_7bAeo)hpEv5S{G2~U&|ThEXw)=?fa#MVZQN4{eWoqJK;`2y~sSL1-uM)MI9ki z9tG$p(5-|Xb)fEV(jb+nb6yw94#x}@`PYI@Jj#6z852XjGEv{Jaj!A*d=Fk#pufTi zkNnX0QVi3G`0o&Z2iJMk3^TVFM~%@9Z)uS zdJnvq3*OI0n>*7PMijqukgqG?=|i+P7Cf2Z27ZFpR28(}mSOfpqCb^kVOzn<3&u=J zjA42M;VG}fEE%Gp=ZH2Ju`TyI7EQ(WH=VHizZ z6P_RAfTujT)4;cvxK0M26mcDZ>la06(=g}^u9fUiNAOf|Z0&j69oBIjy~7@p`-*#) zb&N-g*(14mRgG1SK5EV$Q#x)peO-JcLJ)4~d)4dMbF{swjE!*^R^4~COQiWTE*t)~ zHL*UA`ye^di49A1&TN(`U6MM@oegj4Q|SAqTdFg#d1En&+0bXv8{ajd>O{UTBpIV^ zQ&jbwESZ>lKAX)*_*Q32>$95T^vMxU=q0!(hZ*#J+I_BlVPi|h`2@&wUwE%hw@K~m zoCgUj!0S=f*SPEB)k1bVk2bM_jJ;`ZXi}}Lh}z{f&2c#T>1f~9-bEdMHr_4IFIbs+ zC4|r%cWFF4s|xi?a+zeItT!-?TwAqeHSej&$^Rvx%2&bV3*({brR_i0Kj+G4 zq&W^VeW^PN5;*u6)@$7}rtxT%MAo$MFFigrbJZD~u3htE*|V(kvGu{byrUf+YTGFc zPH*qa?Njdks&i$tQ~58kBfQU9>gW#4v8BVWV{%Jf{ZAQXfuGxrSMO802np&xQhi2H zibZlZ6wOCVcG2|32KQ+EM7zy&lsYYy4e0?Mi4jczuF192e5)&`LzB=iQr3`IhS?{^ zg;e4xliXVx-jk4~O2SrBhBSVKV zg@k9yuO%lYwDS{a5W|d=2&UzEa^{jCQ^IMd=k)Z|Hss<%=YR%-{AjeG!267BHz*uW zc&2?5`lXXQ(teZ%u&ey1ul^g;#Fqg@B;9`S(tRvTqoAX&W;!}V^+qny&j7#+0pUVB&N=ehmuHk}N)O0>6>4N0l!xGhgqQh zY4v+kRDCdx8r>1uj^Y(P%VoSpf!$ep)=|Kp@l{VF1A&E~wo3CfQsF%`v=QBce7>Fz zvR@%zO|G1yyEew%+8c=}-gs);YR)^D0{PXOFKP?E%=DNgACGd)xJkYj(a!ZvNAtYF z4?+8)>Q-hYqCY3;MTxtho~D5fD)S|gp1#H6J80tDl9r%zK+fH*C8ZajDuKplMdd+P zDd34*C(4gWHZfR>v0knChKCqzsUuBW^1EVTCRt7rYe&8*;if9Y&U~94V0{;wR8(#i z@+asmZfPs-N`ejGlrPnba@R-KsAr?xirk~NuYh`|Dkg-Fut)t{5A%+o-32Bp;$uPY z55LQ@*5oGM*uyECAuPLhc)+*M;G)fvZbo%U?RiF8SD|+ zfqb{UlVpBHKB?q#g8<0o60VJxk}=rS{7wFSw70sVH^3MD>0@XmM&{Zf0jWysF~)zM zan@oA`1nm}Xux%ppU~`(FNgdpdS)UepsVlMC2b74?-G8}J^_8xE7W&N)P#K0_9SL` z0dLek=ZrwUbMCz|8sPWd)F|T;1=vWuBR=1w{L+R;=@)|FwbS`ZR2$_62Bs_3g5R!L zW|qIhHc2Y=@&60`KDu#amQEP#GM(F;2GD!yvQ_dP^52i|)pmzIjxOk;-YvOm^=Ns> zo1In+hp5}94w4dUkgqoJOWnudw|v10hlRkY#dV2E6QM6Q>ZzP4M33`>a7 z=Yfw>d7%!E(2la2OR;A?z*lu+jwkX}*=b7jB41yUwLu;7Srxza(1vZcuXb&GAo5ME zGRtg<0e@{9l^wv3n`wbIGoUZ_Md!Vd zz@Lni2}bhZ&jjuzuT~@211*z_uA?8vt8C?LKt6L%%qx+vC+U!WwH)xKc)q7U`a7@5 zIBy~Jz+3H=h&t*g>L084JLJbS)!!rx^7F7b$GgrLa@@SPC<1ajL)m~s27+YQO%gT8 ze5TE0HW z2IEX&+e_ZIbjX9u2?nMv)8yqZ>x%pfQUi=qA?IerwXUy`zo21pMnouZNA4)+Yvdc} zWhuKG`HHfh+e)LKRjL)DG9WkNEg6MBL%!9NY&dzy*XMhJ;@_9i?=)_pKbg#97N)4j z4&JlCiM9;$n`ANrabip?!o)Pu9&TiuY6JKflJ(Fc2=Y6>JTdHqJ+Y1DML?d3@az;P z^ZwLmt}?MajFWP-D$)KGIcscxM*DwN9z&n9owc6Mu|obBZv&}EIDZ-yq{u;jounY$ zdhm6M@pO?-5&wmkqMSM6O|vRZjUW$>#fP1LMg7t$W(O3Q0AH%3N_G@7%t`gd3QHib z&r0tm>$+Upq0c&r5^<UhTIgR(!3O6`dI;Ctirwx8{A{-_eV0Mz7rr8Y zA|J=mTzWm^Q8sFk;aSv=Q}ZIB8S?d@V|Ued)K5*qj=s6`z1i=gzaalN5eaH!zI3*L z>(Bu_J<#Zo^(FM5`Iqg4|CS!FZEgvfyQCTx$-O|mByyLy*OLxv+LKG>QHEVB8V*-s z?$c}5mDGy4pNR^^WrbLAqYaS5o#kec`H+LX&1UH@!T;Vi>yrFb$dULx<}%3SM)0JG zULUJln(_(oVMp(k`Z6BusLn{dB!Ib}%x$XwXWdF<{zAUAw8h4g(BBU#M~A-zzjw9E z*1ST0P7!sZeAKf@5<398BV(>m`C6F9?a#ep2$|Ay$1?H9EPL*O^ule`LGk# zbb6IE<37vYu=Z>KnZ1k!Ck@RS?!`zm$RD4|)p7=Z##e-eodDg4_8&?$^I_LXCW;(H zK6}5ha$lk!ZE}LF9sr*h$W;^anRiYrB9F0yBupqDZLA!{t)UOU#NX0A5B=FuqVKmB z0CuT4IzJmYLGELW{`dTUD<3SPR2-)nW4uqScU3iIm{f?k2oOIdauAv-~jr|5=w% zxGovvY1_7%lPFKhqEXQb9-gCMF>TTigD)x;U>keO1 zRYcY-;MBIrkq(QIemdFQV>|R@cj4j4Nobc|rFcd}1lm`3xxfka`@Qje$wAD&ygJu5 zMS-7-BR4wFw}5{qbdtqt@N-*ImfKtKb6%cN=w;OJtCE8W6=>)2%D*!#!Ou4>`>JA! zF&u}iv%Q4!(!HAXKgW1GGThqg57=A9sgj=BD8D#gChVd!<|QS^<45|T{KnBGBH4IK z5E^7V3gcB<(kZt}MG=vw}`w{N0sZ z6}%MZ#ig0ajTk@X)fnVCC7{0>o^yL4m+CFP6@9?B>s?n`Wg216q}>bDL_KaL8hf}y zPWNYc`(J?Ec@@P(Z}EbUwcH`qHI!k#t&YxF2^>4qmQojv_T7m+@39;G`nj96jsx1a zK3L9df;#5Ai6$=7z~^h(y8@a)XGc*>R3G~FeEsBNN8s>;^s@oB4#3TvkzrC8zjR8! zNjeSsmbHHQ51~IlHcFIi&V)VIabk9raU+FQC2iT70W@k^ZFZuew*D zv!T7HA)yNW*HP6}3i^&c%^kN|h<&!xXf?(;wU9>3Es&ExqOBclp}#+*{pkG}>X(qW zFLVX^^#*rE+-cB1-y~Un4E1oRe44uo<-BamZ;Gpj9oS-3v6Txuu4G(3eF8eKGpbm!ma57eYH?V7I%TJ(xCe+jZzApF@5@Zty{V9l-aGz_8{>}{cA@yu2$O%(%ggh5~6LA)D z^`<5-r#g-S|lN=Pa~g40t&fIw_$0-<)TOqOBF+5!#y!y1T*W zb*MX;gX?fX8}+>=13ZST{VdHe#K&+z41V}d@E7fPg!&dk&;7K487TTz73S(_^9kHD zu>3y}evGv7NPA+6dr(&s$eAzb1vD~@7TSAEVemcV)&1KY3^N(}6{!!*gnaKp*;9~h zRTt(kA>a|}R5uLQ(6vmYdU%NAA0Xd;{w<@S2RX3}k9JaBMj0F`Qic zaTYs$(=Oe1rdok?6+Qm$746;G;g2HN! zss9BPAjjdp$i7Y8b6X}CuwjqFDVZ~(vpu*vZ1_Rzul2G;b7C@}aO6?al3R z>MCpH)=n-s>IM)Vwy^K>UQT;+wPN-j2-ozYptSbTR@WAjM`{+5Q0BHh^*?Z{!=HO! zbGQbEWp(XuKT{RnsY#Htmc%x4VwQ=H zqUT;I;)2BB7N$n;|5|(z4fly8K&@arNQ%*#W@}5)@^U1UX}qD>uOyj?6kSWtYg(s4 z?C~&7#Gj^*V4`V!j>sE&zUp^Rm0TEzU8dn%oE&um<3W@76%+&=*FYF$$G?|2Lorez{N7xc9JOEpSRZcm|7*c|}y z)Q&xsqPhL;d|hzR{j?FBZ>E2UEJgJ6pf_^lv5j6vut^HEYJ2H8--Ss3sv$W&5`gTf zeT_2~`F{6plp&HgBkhKvvK+vf=j0U&iJDM*Jbn`J;NRxsWs4#)eYAT`K%g9X*z-rG zqy=$WPb^9DaYFsx*6fQGfe1P1*N775WW7(F{9W+fFK3;dJ>(&$wj}-<(DXsugpzwH z0Aal((d($@Pu}kG4aldK_nG50l3_5X$i^|DUf#}4^hTc_e3|M-}kp> z^L{|N&otL?CV<}W&YLAxBY$|Dq|Qv>aZAB&*L`T$^xEAi6=;{7?iJ29 zx&Dgsmet;g`x5(J@#oUjZUI`$5JWZ)y6RD8^>mL1;fdv+adA= z@)i2=WdA_E(6maUYmo1&B@=yCqh3*sc^Tb7m|UyNai9*&WCt~I@({^4`k*Qg$o5yB zoNWk@bAQ#A2!DIn1=?zy2;_@&su3qIK~9cYrJe=7eUc|UnYuCk~8HfE6bmXLy((1*M7+n6Ba`_j2x(h2<0PZl*O zrTkgtGs+ltL33kXH00J;-I4O!)U8S?1^HT&6AW6B?{djApBKm%+;XSjVjSd2A&)xs zS6R;z-2=K?BWJ0kLVkDVCEMOofiYIwm2d#{{9gGHlY#Wl9IlD)LwoEJtaXn-&YHQO zc`O4?#y0KGX^zBMCYd1v+i&JMqHl2)i>y^CLBEX3tGC^)1}A8JSIQK~_eQyR>U@j0 zvKF0-e2>CUDw3CRjdS8G&Z6BrYJQCU5eDk+vVHzhw!lsO+hSj!+?a@`>W%2X3%Mb7 zONo3{ZU`G|1A5KL`T0T=)st3Wx)|?|&vqATE&GooXfPZgv zjxeU6cgW$S$Pt{E`4vi$aZx``O-%v$eRKY@ltKH?sYO!$EH~()`sHc&NbD~1zY6?C zb|vbYmU7&n2KqS6_-BqW;!QnK92L+U_n}j<_`V*dDK=Sq1%) zDf-lLIr{rphArDdbi!Pt9%-aAH{b&wf(4?@DuPZW{RirNk>N zuENC9d$r8xqQJ4tNQ?F0ZMQ6Y;FL{p6{O2PM2y>^ zrCSfw!wD5<;qC4Kr%S75*@=8SRPEYb?^}vVcy~nW49MY{KGB}NotVU1*h_bk_GZ4b z*#|k8P&+=+5jfJ=mQ}I<3h&|9s>T|_y1fq7jhexC*rUddb+QoG_=GX z;kIJl8^~FklqrXc<{xr?D?=Vy*`Iu9PD;wh<-kBKi{l|?r&HrCma z6CsZtNzw*a(eGT|aF3V3lO+wM=~@IJ{)hPZzvVLj%6y?Ve2HDEA#gu#x6>V*Rr5{4 z@?7xBbon1C!6C3yYPaWUCEz84##ub#j6KrvOQS|L9Fk?(Bj&ctUhFpX-oa%x~#)Ye-R z*#kG4TIH%^f$Nr*ddf23<8!AM>IUG?-QavvS@i#&{KziyLjnfTvaYU5i=d_m{wJsH8vU#Q|f;xI)L_EY5Kg(9`nn6cztpg z@G~(?-a!}bUlu;wdZ7-S+Ns)JzXIP13ton2pg-1?RwOM%fAv-UmKhU;`9n)tWfCo#JMWzYz z!H}QQWl8gcK)MLifsqzE(spe*@HBJuxv7mP2Q{ZQNbg1oP z)c0w;)S` zy#LKPAAMcN1un#4E(=b4s^bCHKF-HY)D{cR=={R4l(hM_L`;GGd3DgukfOW|ciG+|&H z23~*gAwg2ZFExqz#$9m3o7}jhBv&m5sn;g{c^iY2R8bJ=5rjb?2nd1V^>ayW&ZFa5N zbu)NOk^~V)MiKAJTkdoWNHvJr z>ifXqf{}vyak(?-p20_YSzAs?=q{T)h3S&>MWG!-jyL>VnmPY6>F}soo=4`Re9pT9e5bEN;eKGxs$<(DDjwNen|6-{PsZ{ElI(p1dym5I{g zE&=XAFuloI9{`cq4I0iDv83mHVo{Win#Nd4M_+Um$;PY{*+b7eMJnj|XnZc^`6K>% zxKhTF#-HSDq30ewF4Pysjz}^M8*>urIZ|vaJxjLE1(d)@6q!cDYdIG5d|vbmdUmu- zr1Y0de$LiQW)h9xBejp7vwMy;4+Vc#<&^$oFbEYf|BBHsp!3qPQ42@SAjh=s!{m@McdKKEt%Xt@y!5nW+l9g-DYK({*@>vEv zS0xg(A!o9epD6~57Tx^cqOhL6l-3OSwW>Cq(7K;WX8Y`iQ5IZ(FPS`*)>3`R1mgC^ z?!QWKQIC5Gn%bv9|C>T}mr{W0`O4i98Q{C1{r}dvNp~-&7-Z+VhDrFK-0iVXwXUMv ziCGqQ^HHv3UVy77&iWduqDe^a@HSN>D>$vPBJ5faf4ugyc;fWi)Apdm3ZlGTgDWx@ z^!z-J$y`T!C9^WDwqlT2RCPJx8S0P~OoS=PLIZb{o_ApvCf9HIHXcw93H1v03t&w=?*i)##CF5Dc7EXGDHLKCv)mWqHW=#QajnMD$l@ z)s9GMlsCTRMxi+R^PIsrk%!1PENqstE%NaSmOCCtz9UuNM7kkgLQ8dFHX3q4c`5ef zfpKPUBkqNAbK~Y}KL?WREsS)F#Q?ag=0ZY~2jo>Th%*WKBwZIs5oh`Fl%GrwfIlTw z5#c_N*OE4sk{}oh39>V3J0{vLlJG=6NX{w#$=&Qj!T`gS0=dVSd^0q>xXyBp_b1j68Yt9+5M!fmUqRmGi9?iX>x^@34uCr`|C zv>u$y)s@laXor&Wcv|jC>rFqzC6ia<2XSJe6ALY{@D?emewY2bu!+pP?O?-{Y;nF92xQuML%n_8FBJ% zELRJdVS@N3gX}hBxFqulgWH&Nm+O+Gzq`}M8P5eD@0FePH!(&3G~LO50s%Xv^abtj zHWw8sIpot$w=%hed{yOr0XL8@t$Al|D&*oj8CU8AE3vpHG8uF|qVB3FLVhO~Y_KCn zoJ#GwSZ7#0H)S@`$JmNa@{&2AXPtV>^eW`>*NST)hk@VLExdwN=(r4tc>0iFm${l) z82D%%Gg(s`BUxJUGgoKe?!AUj(`>=-%ltRSzcFRsgfES-S0T>r1qBlJt1vE@)Tt(n zK|dSjsklyoycy~!icUxU8iThgoD;7V+MSJQqPn)VjF6Ncb2Pqc6lu}9_JCs z**ZMn$>fre&Yz-w(<&moCmKPX>t3X$LVon^D;0)APjb^tOe;ZWGH;@nw=sE$p%a%5 zzRd6Fsj@GClV7t#q!aWmM=Vx0M!C=OFWJ3CzbIGfhe@FwlUnZ;Pe{T;ewims0`iFj zA62La-EDcF*;%37t5u#6zX7L4wCEJh1n$j~Tfsmb8CUN_X(G2VnYWF9l>>juHuz3J z{mNQg3(O%uL6Yv2j}eZ|;)>w6Y2qVIU-aMDqH4!7(Cw_(N$$Zo$o$K8!hcK8BCFi7 z1$f}4ZY#bJ_3KI8W7GjY8gc!-Pn(c&>Ceaz=*z9fm6e++Vq5^e|51K3)Rh3<{}3M^w|>Uko`&%&y3gSd_~~8l6z+j~kF8sqT#s@8RLjgl znMCMw*YpPIayVNJUyHk=y%!Rm={*Afp7OSNjW&X_t7cwID)?>L*1=ny0_Tman8;Q% z>#47v!dGZ-VRo8zmnz1U%IhIB!AFr+%Yx^SGi{mg8BgR}=qWFA3jEedzhP(zzMLtM z^=^bh#Wi(h%|QP>6g8rJJY~O7{Ac99n=nH&1p5DJk&@$T&{e80N-`q@>;DiR|F>M` zUzsnw2y(X0g&fL9<&&%YKoyhiC=g}yG1uC-ObIJYB9#9tjaxrw_krWAtqq`W+}HyHLnRC$h}wi zCi^``z+JC*dhNK+BaGn1sJat{9=uy zA$JdhN1L4j9$rWZb>C+Kr(B^~L=W^}VcGMf9NtbK{Ko}z=!Ur@9mtS zPojCwA=-!+FIP!<9t8WPRzL4W9PVrUhU=LQJF4Bft`+>054mdh4DHeLdZ&97D)w7jQ4u=2MZ;j_cehdY)iqy>Mx`IQTTLGCX5XIP49q>-ro6{H_Q)TTk@Ae|A*BFU+RX$xwgOCKcdV z@&f0Xs84RrGOzKbu%Ee_F<$O?con(N;f^upc?oab$V)wnMQ5T6fIH_a|I8Q%xoD~X zq0kn57~izGbYnK^*D>>5_x`ZH=>Y*^ho~FO-aMM}H|)7^ORckDF^d^L2phTN@R5 zOEVzHt?D&$JUCFTo+*9;xlDAJqZ$sr8ikxOj)0usOWf})iGJ0}st<5LeJ2)?%6EW^6qDIqKwc2#s~2=~Q$ z5|UdGe-GmySMVfRD*~TDC^^{WRszOV)~>5nGS;8En$p4^;Ah@nS%jfqivoSD_u=_; z>`sSM!uUE^`X$01#@Q*6tWqjP^w!Nq~p)W~#yBxIA50@`9;N97!i z+U<$BP#Bhyj{eT5xS2f~_J2`nDNjIuf2rep?a4k5+i$e7V-Kw-8^#6?GkkBEDQL-I`ep`|P)E&=x+icgnSc;aJS8ZO8%ZS?KT9 zxH*o~(BHQmX88`ld~Qg88S*{m^KJgQw!2^tE>^Xj!Rt%Dh*xM!z3-o%hhtp&nESqw z|6Vo>~QT0d2dZAE|g90()zgeTZ^j!%j7bp-<3<@!{Yg;CV@~!ObZ251YD< za1-SZz(64EuoV62hJMK5!#Cnl2fm<0TveAH4e>B18gqcyWQq3nAXW#VUNYt|ALYLQ zHq~YSZ=O5Dwo|$x4}jRV3T+7&Ku+R(9pQ_&mEh%w3HuPwK5fer_$a7FztRy;F|JOS zgKUh!5c@6b5aSZTOM#J3>r5rc^}ydNF&F1#;Ca}3nh5z#aJ*{FXFOu3)#r5r(FbiD zt43T4#aK6EZXRG>XG@T0fG=LgzC*zHbM!?Qwh;VYh{2Qaz5(MHVS~H_+H7YAKfw7v z?a!yL2VsnV`$>XB3Yu4(I0j}{JzDj<(YsT{uY$S7$Ed(p9<6Pj=&9ciEPRx)G3Ww@ zrFy)mSX)YaJZwMDS@phuzpjmos`uvZ0eFPRW_K6+FDy6c5nlEFo?Mxs@HuW-*YrNG zWK6-eG@IC)uC5pYoV@SDh5=Q&@{R3U*bDE=?WfpIFDD$OwQ>3QH|lXce?u~eC2MBUTWC~*w~pUbd99NYzZbPuv^QN z0`DJmda*rX@}PNHXwh$-4#h2YFR>b;^91Jo{8830yfUw3W8UJJIF}y{_cZnTW0}p) zckJF+I2gI>`fKG&=8Jv&codGA%_0`Jh%sF!IZG?Vd-gs(ibbmDKzT;S>qL{FP4>SV zca`qeXknK3Tjv_v=Vn=kclAc-exv23(Zf@UnjURCRmQvc|Kf1UyvAUf^w-Z?SmImk zX4l-ps?5~L=(zqhy-9j|KkI;$Od+@6Uw$tFZ{vU&Z}K5_hp5UCld*$M4cX;{G{wr}%70{l({}{)6EH z`1mSaF23Kw!SnIh!-V@zL58ePipM(&ztOsj_{(WX>PrUpSb^= zUO?&C}3C6Y)Yt(zVMleF|l`BZU^}( zi~rs=2mMS67-lyb&qgL*RJa2@vvsQ38(6M9*Dw6349Uyh?|WEckqPS8zbaIYMM~e3 zOhJ3Q!k3#AAy{Q)eBnO`i?F=&*=#x_*oCE|mI^VJJ7pufKi^ocCVFWj_;3 zv{#>*CENk0?%#~uW$v+v0I8OK#0$HFV|VKuL_gMK4R*MN=yRfEN6abA&+F>`86y!C zXB$owMeB{Ad;EHoFYkETQb@-4E?O68fN>m?AB^`BV$%QcJoYr5Af9)U+j?4v=JzGI zSiZ)%{KJP@|6+mUYA-H!Iqdy|=^|02&k9c0YmVcESyK0FrXaaJ2e#*h0XA|9A*+4X zM2{fmb5}es^84^SD}7*#?N|`cl-_N92J^YG!a3<2#{1A{D<`Z`M_t!YtP9+L%%Scn zh;Nm-&PhpVS3S-R@XoDIYy+I#D~^qND8qA=B%>M& zbf)=A&J*QwBEHlXuYhN~YB>uYVslJ}|S1ghk7Jfv5aykjthHrrH0o_KqZ#BZAU!oo3<$!srn$YDh zEL`UeMvKYG=s*4~&$S6w?Y3GMBU9Bd$b#4agk zr`J2+r?K)~ayeZ6dHq895)3p*YnJ$pQKjt?B^S{!nmw0FW*HI&M zuAqE!mp@wkfcbe=To>{l22m<9Q*WUk4tkj)F0yJFXJxETw|Y%^Y(XUma|zD7qHt#D4)p7a@^rEx29hZC5YKDn;y@En{z?21gX0)~M(zUF-x1257x_hW z#JIW|y&yAjTo3b;2Kxo1H@IB|Zo<)iDUD!Fyy*c8w z{B@KW02bp=%qE~*Oxpvd&Jx_Y)nk>+3LhsIG$5ipXZ(g(r@~+_#+EDBWCNI zz_^XGiNhtd7gBs7+zI38UbVgRJoM94cet2@UlOrF=P}CZWv4pM#(2X@_C$`9fk#v& zr+We4#m1XBz=)d=;j3$kdCAIt;wXH*)PdrJ$YChAt?EMhAe6JyRwZRmdCq0CQQjgs z!Mp|f>6gbm%P{WrUe;}{xZ@(0);0W81d<35OZ8JQ-n48dFF6RBZ<>ER z1@6dq=4?>T#b>lsSW)|@&bDmD?ib1eP7eFDa9uJ8)okNK`C zf1mO@aNeL-EVer$@N3Clly^+4wXTF659FWs*@-xNqV#OsJ!jZc_pW$H_S9$(T^{ZA z%GPz_5GUlNM`Parug@zxXZ1&%KBPZhY_EMlrbOsxO@}zkGW4^!hs^s4{58EeF6yuY zL^ZV+%XM*?&jdf{pIBsk4S4%9E6!m8`nj;^edq!BO&{|+Bn!uPMny^I;=H<9rych; z#jy#Kso9(XQyg$}2lFv!S_$-%_2voO>Z)U(Sjz7C;*spv z-6#6>pYf&!p(q#MZMw%^;O0^3*YV}9ApbSL<%~%{e~mYYpI9-7TC8&(xNysE=Aegp zxmWzWl@COTTa8h+AKIHGQTcU)FOgir`Db-lZNZ_RY29r+pP^mj@=5KUqMzLV@cQBMQV!Tz%tK5h58k z!2sr5Wb{P+aSV9x`q(uR?e-{H9<7gZM{9C&ggcPK4W^56JUC>DmJ;)w-FcafJ^bdk zf+vC35!bd<&F?Z6@o^omx=4`eGmKw~b{kV{&5z*xJMx~mzkxrvmtSp{`M-$A|1JCd z|90N`FgtrW;<-ok8~Zj`CyKIPhWA4}{z=ik!y-tggB7!L#sgp4)wcPs5Fah-eR^Ka zh0cz;;&c>vVZN8lzR>}m<7#DJzz_R%9_p`!IIto2M9gO3d93_Z;$wgC;Nr!p7ZF%f zJy)1bMENmpV-2rLz_)^@S~bECDiVVo{ZM~?ms37Di0=j&CE-Kh&mrAv+Vu8CJ+Gst zDX3QyZfZLX@g}8HR)96)!&!OHHu}Kf=2G4CN3pmwwtP@G8T@Bn^+?5lPDq3~`{{N9 zZr94f^cKP|P6TON4g}sSQzitQM?Blxc}`H719U{bQHt=D70Y{NWL$(JHM7{KEqpTP z$Cm!uk$C>Y`8VTj=@YJsL%dH-nCv_Z z>$z3#H__WXggf+oQYT|w{j$6vXLLIux$T`l1pPaVuTu)>j--Fo0B1cAh;+Z@=8>3> zgqVYN>o6aI9l!F~fOw^q?a}Ij3&zpCdFy&VB!NpNb{>rJ8v0dR3pbtIbJjI5epovcOSjsJePL*X=RZQdn$;oT zc1*GIJ%aOeNpBb7>jr(@qkR}BgFYyj-l-4jk8QcpFa!PDV5`tBMLeGFlVz2MdTSHU z%cL0R<}Rll1-|K$mzlT(w;KVpjfp*W_d*+FXA&d58H+bFMI0F9FX8Zm<&W)bHA6qqFdd(C(d- z0cpUUN6w(g=NKm`TAH#H{4^-u$8{v|c1ZHR3EpU#*(UTaj5|2H zH1;LtWq$6N#7XYpdoAZ{@54OW+3D)}0N?p;=ZqU+kFSEiw-xNMzb)?)2>be{di&gf zpBAUi^b>x9>Wj2FAtPM{Tp0yY%tQa~F|CKApEpZvJIiB$!-`J1eJ~GZ)tBW9VDFUP zT9pMwNMy#A*$H=6uZlNwzJz&f-?7Ti9e&;}XH=9M@a-qBYiALR1f_yc8;14{gMo z!>D6~^UTG3a9DqWunC`lYm4)L+V-cf|KTFREoXPHbeY1 z!e3+jHNjs~{58X0bNscyW{Fo;cx8=O&G5w~?%*z1SA{@4O=BoIe}a3mN0i{}_R2!5^M5(qY)ec({O14MIWRy%n$qv{$ zqI4=sr=fHwlgJMh0qRqDB_BY}Cp@t*)q*i(1{V<)LPG)a-$p`Pk&BU4Yt! zs9l8G3T(xw-4nHYp=LR1RiaiEYSf@c9ZEN#bRU%Li<13O@(Zq%8^o1yLs0rllpfA0 zxshBoHySm@qQ-cx9^X{ezsl z^*w5>MXe2}wF$MhqSkiQ`k9-_?cu)R_M_%O)I5TkC%DDjY3@7j9JhkIh~K@u%B{gS zaINF+p!NgQe!^|xUT{BguelxEdu|uUlYN{H`GqqihdDEHl(Qx$xEACT=RnSIuH-!D zMJ{swNIlUZ{fPk?N{q>9 zVooLzYchj0Cv%C6EG16ld*ViZ#IG9c!0&eMC&A?Ik(2%XGy z=^|!IH!@p#fH~9i%$Gi3;gs?T)RON=J@~FPhA*b+d<`w-2hoB2csiB;hOXdO&|Umi zdX7I#pYWHczT^pYmT0jUNpqGX31oGWWHv#fV9O)`3w(#GU@LPNM zsx$t%;hz_L(GUI?2%igupGCm0V&G2+@SnEu7va}dh2LE50zb$G?z_QL@`3Rp;JXx_ zPytNW;8g=&^#y(h0=q+j*^xl`SRi~7&^;CJX5!s!ZUVP}o6If6kNU0vlGku^xb@hx z8Cd)YDBcAe?&E&o4grHlfx(m9Htr0!le+-)UIBV<;>aBwdC2|7Jq3DS0=;j6UJBev zfjd3m&Iq_OBaeX3r(ARVqN_c5%{i0zoI7E}he$~P(Iuh4T?8>9F~D7G;I199B`L&? zbRrHUgE*5M;!g5_J)nsclR(mogb*cZMQVY+-XxCnL#;uiE%}lplaZt&8H<{eNEZ2; zbSLvj5%~@^){ttl38ib(E)rr~w^IE$9r|k}jk!^n2<{ zx6)90fX333v>m-n)95{#Ltj!km9SE3!m4Qt)|a}oFKIZNK$F-^n!^^-Qns2lvdwf9 z+f8S(U+FS-hHl0Wz5l}Q(X;FY{gYAliWxFP-j+G=t}KKPWbOGF)}2pbHGDQ3&KI$n zd=*>8_hUcvquE)027AmeV!D#G%t5k~wUQiRoh9d4FUf5-RPut&l1TZD5)1x>#F>8} z3F7sn@w}_F6Q3Z>=X*%2`GL~G{2b|5{C4SlVEYIDz4T|^PU|;5LF+nSqV<9wqoplb ztz{!Qq2(!gp%pE$)9xf`t6eBjYBxxxYmby{*ZxLwNBet;mCkNSg3j*}rOsW+Ec{UM zK^-gUYaK7Cr*51yS2tTaL02i=r8`{uLiZb~r`~#Lq26KXEWI1j6MFBZdiu?@+Uf^s z4b@N8+OA)&^#9f&(ujXIi$1Dgy_C83DZqCt=0YBbd9dQ*<;;uvrxT5W`p$n z%n#{JF>k5=#=K6y$l|E}Q43##NXuykD=evDbE^i!iB=B`dFyJU{?;#zo?4GJu4?9C z^03(vlPa6RrcZ6+%=+8vn)A)Cnon#l_`k5$n_@K=eBBt1m8I4$^(HGIY$ztY?aF*%up z!8h6>hG)SCipf{_W#xrrIN3m^B2F(N=g4|;kL)4u$w|cJYs85@C85A;dumR*Q75XT zL39XhO{dUwx`Y;Pe=cWS412_KOdSrpsGQrJ?vzxQhp?B#!qLS{9+cxuV<=@ukzC?`mfQnwU-Q=`+LGrIONo}$QDQCim$*x#B@xnWNv^b7(qB48@~w2CWSexG za2ZOny7tUTCDw6 zIzro0YpJ%6)_(0ot=rmpS~@!QS{^#%wA$+|(kj#0uQf~Oj@BU^1MN3De%ju;owf6H z>$S(}PS^fPca!#g-E-P@dT+E-^;+r-)Qi#iUN2wglHL#ar(P-s`anw%-1*4 zy`tYr*TF!cTVOCzcY(oX-Kz%IbR7*1^@n8|*d7Gq5rpXHa6g&0wSHJp(N>XTuV+Jj4BFQw`nB z4;hX$XGXWo!;RWmD2pDJB;aWw(w=zqjLzB?bU!;MWK~zKu*z%VFfUTeO$!anG!PaZr+ zILb+&A@so{q#Wb4pdt*Q8uY*>kT$_lhA1P!F)fr5RED51gc54DVb;VqtVG6PBXW)w zBI}Teyu%Utz!|#072LxedcYGA${QNM7c9gdu__RpKNt}!6g)p1{5}G)D+-)G1`#X{ zJU#)Oqzz(OTk!TI@bzSH^$y@BsfcZzz)!k>lV^aVWPz>ZfT!ewvE+fh_W)~=gNGM_ zxhTNFOTfWP!Pd*bzbnAMm57MdU^2DfFZEzEy}@A`!D#w{#|#i7cM&a>Ky8 zM}X6e0`C^$=Q!~03EKfhq+(D>5p>9xZ~jUzkxTM0z3L0-03VB(s}L=#PW;WC0u5?0-k@3yN>97 zle@*;=Kchqx{D}(ADsUo_lSE8-v5+)#yv;u{|o%;75M)faIAOG0FbgGG6?Li1DjKz zKo^!5P@=+zwulfN@J?$WPglf>9@e8~(1>oZz719;eGxqdK#46_sC$#*^T1lw96Z$! zZ5aWTEr1e1BMJxz1VWsFAS*Ce7f~?^mLar_oIOCZoJ=*cQkPbT1; z&S+ooD=VBM7&z|&yjFulPXzL6M77xlXLiNx3ZB;t;|zr-WB}2%K;|SM?0aDBD`2z^ z7|(={gkkJ9qL12Q)Zy@%EMUJL7@iC)t^uZw0#!c%l~aJ~26#m_ys8yuq`BzTEie}m z@Uk3uOK+flD$u(YC_DxKFLO zEfMFp;U@>-XDda8G6&wc4PJE)-XVCv9eB`Tc;IUI;IHtdyP{9rgHIiSSKSxA?T-5m}6nK2+(K`EX0W!glgDy60Efb^M4F8`3U$l1y%xp3L(2t1B-qI z8~uRUK8_iC3^bVmKY@sVLgt|sR-O#It%U_nU@o5kzve(y5O5=8CF)?~DX`W$%=mAZ zyQjdN1rQdD=qY3@>S6Dxu-tms;3Q`C8Srfh+=T#9nZQT`tUV1D+km-0h1q-#WLg1x zp+Hp@aMBwVpAOq?gf&hhn!EsRt%1leU@RMG5ftDI#JC?}jo&fPe*v@2fW~m(D+fqv zgw4N(6*s{?XAp^A0?{_WXe*$tD-hEcwx0=WZib!C!V<55Vq4%c0tm|mR{FvEvtZXP zu-rM==rz2zInWvj#B~F91oin1?7S70JP(__0iIg`nNh%49#As?c=#3;-v-IFvfY1c@#Mq{9G~^IyV6s7YVrmTP}rNdSQ;eMF023Y?i?i--+s53T@n)6p|rOxjV=u zXxsTvwnd~3aUojd7A(08Rw>5}`(U<=;mI8_(_>+!UtnQv;)=YD0;+id`I%e>nUGOJ zuaI5P55u4&+Cp9EkUwG16|hYu=GhM(V+xN+!+ej2tpxQiD3Nxg1d3x3*^O)vrS?#~ z`819?PzJrRhb$%|NKcYPJcu5-3+t|erK;d_0q`Gl_)llV)QPa%udup4@kAb}6e@lR z*-Neyo;uQaDCR+QE*(q@XaW?Agx(U_kD}=HJ76Yv74NVs<4MK35BW zT?1c#fE<}O@(E>7{NF(n-6T@#48>Cj-7}BwpqJ=Q=$xUnh_-=l*P^$`0kVvYA?2h4 zG89JSA>zRg@a;PIX$XAI8a|f^f1LtfKaMzIOni}Zs6f_XIWh~kkpXk1iBv(qqzmZJ z(ES{fF~Y9UUC0Xzqs6o>b)!1S9vmbq$T;Y>RAeX(BX6u-A%7j%IsMz%V%-SfiZTC?xBn62-=e- zQ4gv|?~=o06`4S)kQoUeX5=Yi%m&1ZKJfikA}5T1mp39pY(#W<#+f6_(is_(iDWhT z75Y)1dO|Ul(vi@Jd+Bw`Ge;KB=N6_=Ch%!h_zuZOpDz@u4Ne=L(6Fg>O+m_L*yub zAd^WQa!4V>iu{GRwiz+1KjKX^R>K&?l>vxJTM*A)LQ{v5Ok_c)khRDSJtD@)-*luE z$muMnztG!Mo4K+?reI&P1?*>b89H|tTgZm7V%CfcErrL$iGF9uA~up-HqfFGPdS4kanikbRu0%e?@jmpLw$OtdxypOW0m^ zo!wyj*itqMiawcnF#~p=9zkAf60MwsK>5%LSi z=nu#~)X@wYLapdu@ht-*U_o8fo9P#+Kj$JhGZ-GmV7~akbz`2 z*+$Nj*TjZ~(`?$CPNVDTZ}bT@W&SLUDcN|ok{x1q*j;v*tzr{c73;(Tm>GMD9Nz{y zo%TV7uNAeWZ^$3yCo+d@Cl| z&nB@N)`bNz3-+9zra#iJX}DNWnZy1 z$hKR_rf|%psjc`_nucP3>q5?M?^KZ|D|!7FkGZ7RoYNJ)6ST zvg7O#d(2L-b!;kYU|B4THDj;nIpikESvRa)7X0U8+(FG z&q=m{O=o>r4r|41*&F%?{fW+@+vx@RmNsV*tSfRsGuTFUiale`*=hD8`8(%_B(sQ{$gj?W;ToUXL&4|*)ilc*#Pzp+rrMWm&kpdV_Vs` z>*CcRJ5rvp4Jy_7j`KwzCWDEqliW$AzDpK9==F5pMOU_(}zQ%&Vl z3#OC-h7<}O)C{aqQ|r`&BV~abg@gInVh%J_O>eNG9I&AXaGVyH7fs#L2>z1`-V+5D zWA~XZ=?89;2Tl|7L3a!QPwCO5D}?b2%1_PzHTk|Kzt`mRn*3dpuWRyiO+K#4zcu-` zCcoC?)0+HQlP_!XV?p74%7+E~X~Xt{{%5d@2~flXc`E%cfhEj<8+%wy3Lp5W|FvKP z3*gNW_VNc8`CR|U0s}3fTZF5{t-z|=;jHQ`Ks?xO8Z?P;1zEUa)gHLYMxR1pJK@Sz zXV^I(IEe5jltH}LUZV1|9bJ2PSBBJkcCFqAB; z+6vgc7D(s;WK{rf{lL2`!N~f9mo{Kc?+pYD{NTUp{6j4Inuh-57PN+I`PmvJh=}2vjjS*6tn9IO#V0hvjaM32=q>C=pHG# z2@Uiev``u5)f<@oH~n)NDrW)IjsmL3m1vXOP(jO~hAJ?xzVMNMQ$AOrZx%u4ltAye z;|k0j=%1C)K}w*?A71ruTIV_x%@Qb^QYaixqEGHY@vMgOsRpV7;eY?8YHmWidEllwLn!c)_{N0Ew`agmP4gfK&|-VD*q#>m$gta^*~i9V#B{Fk~`2H zE1^G>&>{ZBlsthhSr2{E8$K0|Nb+wQ;~td6YAA|oD2qT`>3s&Ju@Q=+5k3`xc=K;+ z;Q=(k8fb%BXoO&5NnSuRY=U;^2cL>UO!_yz{|LN(E%<#scz!6ZGQR}x-va(W06rDN z{Wre;1l)W*IC^hz^>AWCUW2=D1BV~T{S)7Q27bK}Ji8HmI|6r6yaoT>&ix%J2V=d$n^Hupz2@vN94IT&dN)hir=0CN7C1>d91mIGRNco@nPaUAe6;Ztn zkXMLUI2b7Y`~0UKaN&+Mq%AO}K-3!wyv~DG*9Q~$`~0T?kl=}xB?+i1L7W=~gf4*o z-U+lDf*<^I{!`#>-dJ~%fu~Z$_YuJ6B53Me!1-n5`~G|WlOw)ZmpTATWr*#gfXgLN z$a{eCtH|{c_{%?MK`HdRj0pE6RUod90VcnL&fN!mUq_yg!B^~|@&7(2%0rDiz@K7? z5;1)o@VFc*^#HJa6FEK!{KOH8Jq|wipP5oAG_@0aDITgmpG*KES3+YR1g>u*zo!Ks zafa?rfWOJ1{6Ej5YC{pbz>iu(n-{<*2a(lKiid&hJIL+nz&~7}n%ltF3ZdTz!*4%k zTXmsl-QYusP}W88$05-8bIB24{2uapdhif;Xx_H)GX>Q5Q26XT|t zH+1?H=zU*k%MS3tGN{>6@Z2TP(R<+cS8-=Z3?gP8@gx}vLe?djAf|nnH-~S1{yBfOkF#P@wBEfb<)IV_d)obKg zE+9+u27Z4Zdh-DyfZ+fC$^X^tUw!36&H2^WI@BCreN{uv>DAXQ)Er)YMMBNl)z=tQ z99?zIK+V6^yj#t;)jV6xuhqO-&8O8oTFsx;yjjhc)jV0vkJY?b&4<-IScrfBZ~99n zDlmJ*L_0)F;l3;%j~2txil)AEKp#ACUg7?cRyc#E-g89nJkg^-^ddq$ zzwCd6|7o(nD;k+^P0pv8>(*p=nptg49;cbN*5qlL8EH)(rkP{b3eWm~hLpgj@ zfkUuvPyC<-he8`n!aA-0QaUl|C!G7c>UtGJ6R0;2(p>1a}V(2$lw)4O$&EG$=dBCx``| z30xgGJg{3}V4!Z`m4HnFlLC4L#0S_0JoP{9zu13}e~y2UzoGvvzg>Q_{Tlr;{QUg% z{cid0_MPWDz_+V!sIP_ZW1piwt9-`#^zv!vzx$eE&dx7^*??Uf*Z%1$DebsBX z*CMasUL{`byxhI?yzY4(@m%9M*|Xj=+cUzmr6=*c=CRLXxyN{q8jnnmRvs-qn8!`` zL+)$br@Hrb&v$R*?%{6i{@m@n+s|%G-Nw7sx#haWxw*L+xjlFN!*#do3fIZ5{ag!N z+q(w1+PG5JJ1!?&wz@2I8RydA(!-^li@%GF3-5Bz`Ly#6=Vi`QoWF4H>D<{l%GuS~ z#QBZWO{Zf{Tb-6TedRR3snjXmDaOgu$;yd3-FH0exYzLq$Jvgf9eX<#I;J{CI=VYr zI8w(44(A;XIBalO;4sPI3x{%t9EY|JK@JWM#t!f7@7kZW-*3Ocev$oT`@!~A_TB9} z*hkuX*f+D+wtpeJAv-DCBU>k1Ae$^3BCC7~Vg-DFMtt^okB6{BcorVAC4}p!lqqUzlr^%_%3@_rg}km*S;-}pmn%x- z<+6gtI)$uOQC+X7EL3oRN>y>Lv!b@XyiQiBtdrF!s%jLqipn~9LAe4A)}fPi zb&Xt_qNbv>wiXS_iWHTliXtwxN>L-8L9B;26{U4`*pE)s)))4a6_=JPWavv#X^o<= zPFd6V;Yd}DvQSZ5%OwgW6n#o-@#8L;^749xtWK$vmCI{N6f*Q*RwS>($s4PLe#mO8 z~jRs|p+hs(ebFml0$DyK<; zqt=xcm!jDkI7kCZw^rF&Xhbfntpk#fbW^Gv?c+=}l@hQiAhXHIRK;rrD2rZJ%cWo< zWIg4zvH}IHQLDh1aE`PZWu3B6S>9xSVMd#JsB-v^))8=9fWx)I%rpV57IUhoLq}`t zN-I_2rO6&RaT7v2G!6KpZ9bf{cMV`74quEQO|5-6EDrnwB0k$)TVI7}AWUf&u?wn3 zgbE*zbo}hyhw8=h3L%DkURLd!e|Jy}1WnV#sSAGIw~mUs-pZP?5ALsi|Ec@`U3{rj z)%!G@$O}~Cf}soQi;DpVRV@8z@TL(X)D)^h*2h^8di8Nha#fA8Lc3%Z3{ z%PP3{WEk%&dC7-yLLPh$w^6zjpT+7zkZiC=LDj>Ts$YHj9L%@nGe4A3ADR0fd+-@f zNxq~~BA4Rpx_6qa_)w?#=}sI~ z?Z#hyVsET!L;Ne;UCj%BI33k){52*Xrs6@>AK_MR-zi4EeJ>&tU8 zY{L6b8u;7eu_%{@Ex#{McF|hG$%L&Q7tpW?uXhNq8&t1j``~ro577Sn^$=B=L3rNL z^qL!r^4NrSV!y;Ttm*Y|ydLpMJHpS+Ha-5a{RyhNJMbJkvFSCQV<&x5ck(B%|Dkr%d|Tx=!WVda^3V(wDp~OUJ;@QI!KGappS3RgFRk0- W*zeoX`X>=Zv$)W@F5!Pf)Bgu5n*`ec diff --git a/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.worker.js b/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.worker.js deleted file mode 100644 index d8c3fd4..0000000 --- a/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-mt-wasm.worker.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";var Module={};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){var nodeWorkerThreads=require("worker_threads");var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(nodeFS.readFileSync(f,"utf8"))},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);receiveInstance(instance);Module["wasmModule"]=null;return instance.exports};self.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}OGVDecoderVideoAV1MTW(Module).then(function(instance){Module=instance})}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0,1);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInit();try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(Module["keepRuntimeAlive"]()){Module["PThread"].setExitStatus(result)}else{Module["__emscripten_thread_exit"](result)}}catch(ex){if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["keepRuntimeAlive"]()){}else{Module["__emscripten_thread_exit"](ex.status)}}else{throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}}; diff --git a/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.js b/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.js deleted file mode 100644 index 325a521..0000000 --- a/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.js +++ /dev/null @@ -1,21 +0,0 @@ - -var OGVDecoderVideoAV1SIMDMTW = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; - return ( -function(OGVDecoderVideoAV1SIMDMTW) { - OGVDecoderVideoAV1SIMDMTW = OGVDecoderVideoAV1SIMDMTW || {}; - -function GROWABLE_HEAP_U8(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPU8}function GROWABLE_HEAP_I32(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAP32}function GROWABLE_HEAP_F64(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer)}return HEAPF64}var Module=typeof OGVDecoderVideoAV1SIMDMTW!=="undefined"?OGVDecoderVideoAV1SIMDMTW:{};var objAssign=Object.assign;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var options=Module;var moduleOverrides=objAssign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=function(){if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=function readAsync(filename,onload,onerror){requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("unhandledRejection",function(reason){throw reason});quit_=((status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)});Module["inspect"]=function(){return"[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=require("worker_threads")}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}global.Worker=nodeWorkerThreads.Worker}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}if(!ENVIRONMENT_IS_NODE){read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=(title=>document.title=title)}else{}if(ENVIRONMENT_IS_NODE){if(typeof performance==="undefined"){global.performance=require("perf_hooks").performance}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){requireNodeFS();defaultPrint=(str=>fs.writeSync(1,str+"\n"));defaultPrintErr=(str=>fs.writeSync(2,str+"\n"))}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;objAssign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function TextDecoderWrapper(encoding){var textDecoder=new TextDecoder(encoding);this.decode=(data=>{if(data.buffer instanceof SharedArrayBuffer){data=new Uint8Array(data)}return textDecoder.decode.call(textDecoder,data)})}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf-16le"):undefined;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":1073741824/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATINIT__)}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;PThread.terminateAllThreads();runtimeExited=true}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what})}else{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="ogv-decoder-video-av1-simd-mt-wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTlsInit(Module["asm"]["H"]);wasmTable=Module["asm"]["F"];addOnInit(Module["asm"]["y"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency("wasm-instantiate")})})}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var ASM_CONSTS={};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function killThread(pthread_ptr){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var pthread=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];pthread.worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker),1);pthread.worker.pthread=undefined}function cancelThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];pthread.worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];if(pthread){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var worker=pthread.worker;PThread.returnWorkerToPool(worker)}}function _exit(status){exit(status)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],initMainThread:function(){var pthreadPoolSize=1;for(var i=0;i>2]=0;try{func()}finally{GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls>>2]=1}},receiveObjectTransfer:function(data){},threadInit:function(){for(var i in PThread.tlsInitFunctions){PThread.tlsInitFunctions[i]()}},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=function(e){var d=e["data"];var cmd=d["cmd"];if(worker.pthread)PThread.currentProxiedOperationCallerThread=worker.pthread.threadInfoStruct;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var thread=PThread.pthreads[d.targetThread];if(thread){thread.worker.postMessage(d,d["transferList"])}else{err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processQueuedMainThreadWork"){_emscripten_main_thread_process_queued_calls()}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="detachedExit"){PThread.returnWorkerToPool(worker)}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"])}}else{err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=function(e){var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data})});worker.on("error",function(e){worker.onerror(e)});worker.on("detachedExit",function(){})}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("ogv-decoder-video-av1-simd-mt-wasm.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=GROWABLE_HEAP_I32()[pthread_ptr+44>>2];var stackSize=GROWABLE_HEAP_I32()[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,0,returnCode);try{_exit(returnCode)}catch(e){handleException(e)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function invokeEntryPoint(ptr,arg){return getWasmTableEntry(ptr)(arg)}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTlsInit(tlsInitFunc,moduleExports,metadata){PThread.tlsInitFunctions.push(tlsInitFunc)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=(()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6})}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=(()=>performance.now()-Module["__performance_now_clock_drift"])}else _emscripten_get_now=(()=>performance.now());function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInit()}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread})}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,threadInfoStruct:threadParams.pthread_ptr};worker.pthread=pthread;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"threadInfoStruct":threadParams.pthread_ptr};worker.runPthread=function(){msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}return 0}function ___pthread_create_js(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer==="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return _emscripten_sync_run_in_main_thread_4(687865856,pthread_ptr,attr,start_routine,arg)}if(error)return error;var threadParams={startRoutine:start_routine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function ___pthread_detached_exit(){postMessage({"cmd":"detachedExit"})}function __emscripten_default_pthread_stack_size(){return 2097152}function __emscripten_futex_wait_non_blocking(addr,val,timeout){var tNow=performance.now();var tEnd=tNow+timeout;var lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr);while(1){tNow=performance.now();if(tNow>tEnd){lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);return-73}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,0);if(lastAddr==0){break}_emscripten_main_thread_process_queued_calls();if(Atomics.load(GROWABLE_HEAP_I32(),addr>>2)!=val){return-6}lastAddr=Atomics.exchange(GROWABLE_HEAP_I32(),__emscripten_main_thread_futex>>2,addr)}return 0}function __emscripten_notify_thread_queue(targetThreadId,mainThreadId){if(targetThreadId==mainThreadId){postMessage({"cmd":"processQueuedMainThreadWork"})}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processThreadQueue"})}else{var pthread=PThread.pthreads[targetThreadId];var worker=pthread&&pthread.worker;if(!worker){return}worker.postMessage({"cmd":"processThreadQueue"})}return 1}function _abort(){abort("")}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}function _emscripten_memcpy_big(dest,src,num){GROWABLE_HEAP_U8().copyWithin(dest,src,src+num)}function _emscripten_num_logical_cores(){if(ENVIRONMENT_IS_NODE)return require("os").cpus().length;return navigator["hardwareConcurrency"]}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(function(){var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=GROWABLE_HEAP_U8().length;requestedSize=requestedSize>>>0;if(requestedSize<=oldSize){return false}var maxHeapSize=1073741824;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence>2]=eventTypeId;GROWABLE_HEAP_I32()[varargs+4>>2]=eventData;GROWABLE_HEAP_I32()[varargs+8>>2]=userData;_emscripten_dispatch_to_thread_(targetThread,637534208,eventHandlerFunc,eventData,varargs)})},getTargetThreadForEventCallback:function(targetThread){switch(targetThread){case 1:return 0;case 2:return PThread.currentProxiedOperationCallerThread;default:return targetThread}},getNodeNameForTarget:function(target){if(!target)return"";if(target==window)return"#window";if(target==screen)return"#screen";return target&&target.nodeName?target.nodeName:""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height){withStackSave(function(){var varargs=stackAlloc(12);var targetCanvasPtr=0;if(targetCanvas){targetCanvasPtr=stringToNewUTF8(targetCanvas)}GROWABLE_HEAP_I32()[varargs>>2]=targetCanvasPtr;GROWABLE_HEAP_I32()[varargs+4>>2]=width;GROWABLE_HEAP_I32()[varargs+8>>2]=height;_emscripten_dispatch_to_thread_(targetThread,657457152,0,targetCanvasPtr,varargs)})}function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread,targetCanvas,width,height){targetCanvas=targetCanvas?UTF8ToString(targetCanvas):"";_emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height)}function maybeCStringToJsString(cString){return cString>2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!=="undefined"?document:0,typeof window!=="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!=="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_set_canvas_element_size_calling_thread(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;if(canvas.canvasSharedPtr){GROWABLE_HEAP_I32()[canvas.canvasSharedPtr>>2]=width;GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+4>>2]=height}if(canvas.offscreenCanvas||!canvas.controlTransferredOffscreen){if(canvas.offscreenCanvas)canvas=canvas.offscreenCanvas;var autoResizeViewport=false;if(canvas.GLctxObject&&canvas.GLctxObject.GLctx){var prevViewport=canvas.GLctxObject.GLctx.getParameter(2978);autoResizeViewport=prevViewport[0]===0&&prevViewport[1]===0&&prevViewport[2]===canvas.width&&prevViewport[3]===canvas.height}canvas.width=width;canvas.height=height;if(autoResizeViewport){canvas.GLctxObject.GLctx.viewport(0,0,width,height)}}else if(canvas.canvasSharedPtr){var targetThread=GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+8>>2];_emscripten_set_offscreencanvas_size_on_target_thread(targetThread,target,width,height);return 1}else{return-4}return 0}function _emscripten_set_canvas_element_size_main_thread(target,width,height){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,1,target,width,height);return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(canvas){return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}else{return _emscripten_set_canvas_element_size_main_thread(target,width,height)}}function _emscripten_unwind_to_js_event_loop(){throw"unwind"}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)};return 1}}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>2]:-1;source+=UTF8ToString(GROWABLE_HEAP_I32()[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;canvas.getContext=function(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}}var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=_malloc(8);GROWABLE_HEAP_I32()[handle+4>>2]=_pthread_self();var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;_free(GL.contexts[contextHandle].handle);GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=GROWABLE_HEAP_I32()[a+(24>>2)];var contextAttributes={"alpha":!!GROWABLE_HEAP_I32()[a+(0>>2)],"depth":!!GROWABLE_HEAP_I32()[a+(4>>2)],"stencil":!!GROWABLE_HEAP_I32()[a+(8>>2)],"antialias":!!GROWABLE_HEAP_I32()[a+(12>>2)],"premultipliedAlpha":!!GROWABLE_HEAP_I32()[a+(16>>2)],"preserveDrawingBuffer":!!GROWABLE_HEAP_I32()[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!GROWABLE_HEAP_I32()[a+(28>>2)],majorVersion:GROWABLE_HEAP_I32()[a+(32>>2)],minorVersion:GROWABLE_HEAP_I32()[a+(36>>2)],enableExtensionsByDefault:GROWABLE_HEAP_I32()[a+(40>>2)],explicitSwapControl:GROWABLE_HEAP_I32()[a+(44>>2)],proxyContextToMainThread:GROWABLE_HEAP_I32()[a+(48>>2)],renderViaOffscreenBackBuffer:GROWABLE_HEAP_I32()[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=GROWABLE_HEAP_I32()[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,fd);return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(4,1,fd,offset_low,offset_high,whence,newOffset)}function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(5,1,fd,iov,iovcnt,pnum);var num=0;for(var i=0;i>2];var len=GROWABLE_HEAP_I32()[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}function _ogvjs_callback_async_complete(ret,cpuTime){var callback=Module.callbacks.shift();Module["cpuTime"]+=cpuTime;callback(ret);return}function _ogvjs_callback_frame(bufferY,strideY,bufferCb,strideCb,bufferCr,strideCr,width,height,chromaWidth,chromaHeight,picWidth,picHeight,picX,picY,displayWidth,displayHeight){var heap=wasmMemory.buffer;var format=Module["videoFormat"];function copyAndTrim(arr,buffer,stride,height,picX,picY,picWidth,picHeight,fill){arr.set(new Uint8Array(heap,buffer,stride*height));var x,y,ptr;for(ptr=0,y=0;y0){var next=recycled.shift(),format=next["format"];if(format["width"]===width&&format["height"]===height&&format["chromaWidth"]===chromaWidth&&format["chromaHeight"]===chromaHeight&&format["cropLeft"]===picX&&format["cropTop"]===picY&&format["cropWidth"]===picWidth&&format["cropHeight"]===picHeight&&format["displayWidth"]===displayWidth&&format["displayHeight"]===displayHeight&&next["y"]["bytes"].length===lenY&&next["u"]["bytes"].length===lenCb&&next["v"]["bytes"].length===lenCr){frame=next;break}}if(!frame){frame={"format":{"width":width,"height":height,"chromaWidth":chromaWidth,"chromaHeight":chromaHeight,"cropLeft":picX,"cropTop":picY,"cropWidth":picWidth,"cropHeight":picHeight,"displayWidth":displayWidth,"displayHeight":displayHeight},"y":{"bytes":new Uint8Array(lenY),"stride":strideY},"u":{"bytes":new Uint8Array(lenCb),"stride":strideCb},"v":{"bytes":new Uint8Array(lenCr),"stride":strideCr}}}copyAndTrim(frame["y"]["bytes"],bufferY,strideY,height,picX,picY,picWidth,picHeight,0);copyAndTrim(frame["u"]["bytes"],bufferCb,strideCb,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);copyAndTrim(frame["v"]["bytes"],bufferCr,strideCr,chromaHeight,chromaPicX,chromaPicY,chromaPicWidth,chromaPicHeight,128);Module["frameBuffer"]=frame}if(!ENVIRONMENT_IS_PTHREAD)PThread.initMainThread();var GLctx;var proxiedFunctionTable=[null,exitOnMainThread,_emscripten_set_canvas_element_size_main_thread,_fd_close,_fd_seek,_fd_write];var asmLibraryArg={"v":___emscripten_init_main_thread_js,"q":___emscripten_thread_cleanup,"d":___pthread_create_js,"t":___pthread_detached_exit,"u":__emscripten_default_pthread_stack_size,"j":__emscripten_futex_wait_non_blocking,"i":__emscripten_notify_thread_queue,"c":_abort,"f":_emscripten_check_blocking_allowed,"b":_emscripten_get_now,"n":_emscripten_memcpy_big,"x":_emscripten_num_logical_cores,"w":_emscripten_receive_on_main_thread_js,"o":_emscripten_resize_heap,"g":_emscripten_set_canvas_element_size,"r":_emscripten_unwind_to_js_event_loop,"h":_emscripten_webgl_create_context,"s":_exit,"p":_fd_close,"m":_fd_seek,"e":_fd_write,"a":wasmMemory||Module["wasmMemory"],"k":_ogvjs_callback_async_complete,"l":_ogvjs_callback_frame};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["y"]).apply(null,arguments)};var _ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=function(){return(_ogv_video_decoder_init=Module["_ogv_video_decoder_init"]=Module["asm"]["z"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["A"]).apply(null,arguments)};var _ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=function(){return(_ogv_video_decoder_async=Module["_ogv_video_decoder_async"]=Module["asm"]["B"]).apply(null,arguments)};var _ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=function(){return(_ogv_video_decoder_destroy=Module["_ogv_video_decoder_destroy"]=Module["asm"]["C"]).apply(null,arguments)};var _ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=function(){return(_ogv_video_decoder_process_header=Module["_ogv_video_decoder_process_header"]=Module["asm"]["D"]).apply(null,arguments)};var _ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=function(){return(_ogv_video_decoder_process_frame=Module["_ogv_video_decoder_process_frame"]=Module["asm"]["E"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["G"]).apply(null,arguments)};var _emscripten_tls_init=Module["_emscripten_tls_init"]=function(){return(_emscripten_tls_init=Module["_emscripten_tls_init"]=Module["asm"]["H"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["I"]).apply(null,arguments)};var _emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=function(){return(_emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=Module["asm"]["J"]).apply(null,arguments)};var _emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=function(){return(_emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=Module["asm"]["K"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return(_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["L"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["M"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["N"]).apply(null,arguments)};var _emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=function(){return(_emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=Module["asm"]["O"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return(__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["P"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return(__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["Q"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["R"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["S"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["T"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["U"]).apply(null,arguments)};var __emscripten_main_thread_futex=Module["__emscripten_main_thread_futex"]=375988;var __emscripten_allow_main_runtime_queued_calls=Module["__emscripten_allow_main_runtime_queued_calls"]=108356;Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["PThread"]=PThread;Module["PThread"]=PThread;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){readyPromiseResolve(Module);initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}else{}}if(keepRuntimeAlive()){}else{exitRuntime()}procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}if(ENVIRONMENT_IS_PTHREAD){noExitRuntime=false;PThread.initWorker()}run();var inputBuffer,inputBufferSize;function reallocInputBuffer(size){if(inputBuffer&&inputBufferSize>=size){return inputBuffer}if(inputBuffer){Module["_free"](inputBuffer)}inputBufferSize=size;inputBuffer=Module["_malloc"](inputBufferSize);return inputBuffer}var getTimestamp;if(typeof performance==="undefined"||typeof performance.now==="undefined"){getTimestamp=Date.now}else{getTimestamp=performance.now.bind(performance)}function time(func){var start=getTimestamp(),ret;ret=func();Module["cpuTime"]+=getTimestamp()-start;return ret}Module["loadedMetadata"]=!!options["videoFormat"];Module["videoFormat"]=options["videoFormat"]||null;Module["frameBuffer"]=null;Module["cpuTime"]=0;Object.defineProperty(Module,"processing",{get:function getProcessing(){return false}});Module["init"]=function(callback){time(function(){Module["_ogv_video_decoder_init"]()});callback()};Module["processHeader"]=function(data,callback){var ret=time(function(){var len=data.byteLength;var buffer=reallocInputBuffer(len);var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_header"](buffer,len)});callback(ret)};Module.callbacks=[];Module["processFrame"]=function(data,callback){var isAsync=Module["_ogv_video_decoder_async"]();var len=data.byteLength;var buffer=Module["_malloc"](len);function callbackWrapper(ret){Module["_free"](buffer);callback(ret)}if(isAsync){Module.callbacks.push(callbackWrapper)}var ret=time(function(){var dest=new Uint8Array(wasmMemory.buffer,buffer,len);dest.set(new Uint8Array(data));return Module["_ogv_video_decoder_process_frame"](buffer,len)});if(!isAsync){callbackWrapper(ret)}};Module["close"]=function(){};Module["sync"]=function(){var isAsync=Module["_ogv_video_decoder_async"]();if(isAsync){Module.callbacks.push(function(){});time(function(){Module["_ogv_video_decoder_process_frame"](0,0)})}};Module["recycledFrames"]=[];Module["recycleFrame"]=function(frame){var arr=Module["recycledFrames"];arr.push(frame);if(arr.length>16){arr.shift()}}; - - - return OGVDecoderVideoAV1SIMDMTW.ready -} -); -})(); -if (typeof exports === 'object' && typeof module === 'object') - module.exports = OGVDecoderVideoAV1SIMDMTW; -else if (typeof define === 'function' && define['amd']) - define([], function() { return OGVDecoderVideoAV1SIMDMTW; }); -else if (typeof exports === 'object') - exports["OGVDecoderVideoAV1SIMDMTW"] = OGVDecoderVideoAV1SIMDMTW; diff --git a/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.wasm b/shelled/rustdesk-web-client/lib/ogvjs-1.8.6/ogv-decoder-video-av1-simd-mt-wasm.wasm deleted file mode 100755 index be718ad829bc6456f19f40df51d717e5bba18731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 495935 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 G37>+Q4<~#|X2&~4Ge4N{ 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

    6FWaLnDihsfVMUF7gB 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≦BLqBt_UK+jl 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 LAsFJ80FX=or49%{ diff --git a/shelled/rustdesk-as-ref/web_deps/libopus.js b/shelled/rustdesk-as-ref/web_deps/libopus.js deleted file mode 100644 index 5b0ff49..0000000 --- a/shelled/rustdesk-as-ref/web_deps/libopus.js +++ /dev/null @@ -1,5555 +0,0 @@ - - -// The Module object: Our interface to the outside world. We import -// and export values on it. There are various ways Module can be used: -// 1. Not defined. We create it here -// 2. A function parameter, function(Module) { ..generated code.. } -// 3. pre-run appended it, var Module = {}; ..generated code.. -// 4. External script tag defines var Module. -// We need to check if Module already exists (e.g. case 3 above). -// Substitution will be replaced with actual code on later stage of the build, -// this way Closure Compiler will not mangle it (e.g. case 4. above). -// Note that if you want to run closure, and also to use Module -// after the generated code, you will need to define var Module = {}; -// before the code. Then that object will be used in the code, and you -// can continue to use Module afterwards as well. -var Module = typeof Module !== 'undefined' ? Module : {}; - -// See https://caniuse.com/mdn-javascript_builtins_object_assign -var objAssign = Object.assign; - -// --pre-jses are emitted after the Module integration code, so that they can -// refer to Module (if they choose; they can also define Module) -Module["onRuntimeInitialized"] = function(){ - if(Module.onload) - Module.onload(); - Module.loaded = true; -} - -Module["locateFile"] = function(url){ - if(url == "libopus.wasm" && typeof LIBOPUS_WASM_URL != "undefined") - return LIBOPUS_WASM_URL; - else - return url; -} - - -// Sometimes an existing Module object exists with properties -// meant to overwrite the default module functionality. Here -// we collect those properties and reapply _after_ we configure -// the current environment's defaults to avoid having to be so -// defensive during initialization. -var moduleOverrides = objAssign({}, Module); - -var arguments_ = []; -var thisProgram = './this.program'; -var quit_ = (status, toThrow) => { - throw toThrow; -}; - -// Determine the runtime environment we are in. You can customize this by -// setting the ENVIRONMENT setting at compile time (see settings.js). - -// Attempt to auto-detect the environment -var ENVIRONMENT_IS_WEB = typeof window === 'object'; -var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; -// N.b. Electron.js environment is simultaneously a NODE-environment, but -// also a web environment. -var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string'; -var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; - -if (Module['ENVIRONMENT']) { - throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)'); -} - -// `/` should be present at the end if `scriptDirectory` is not empty -var scriptDirectory = ''; -function locateFile(path) { - if (Module['locateFile']) { - return Module['locateFile'](path, scriptDirectory); - } - return scriptDirectory + path; -} - -// Hooks that are implemented differently in different runtime environments. -var read_, - readAsync, - readBinary, - setWindowTitle; - -// Normally we don't log exceptions but instead let them bubble out the top -// level where the embedding environment (e.g. the browser) can handle -// them. -// However under v8 and node we sometimes exit the process direcly in which case -// its up to use us to log the exception before exiting. -// If we fix https://github.com/emscripten-core/emscripten/issues/15080 -// this may no longer be needed under node. -function logExceptionOnExit(e) { - if (e instanceof ExitStatus) return; - let toLog = e; - if (e && typeof e === 'object' && e.stack) { - toLog = [e, e.stack]; - } - err('exiting due to exception: ' + toLog); -} - -var fs; -var nodePath; -var requireNodeFS; - -if (ENVIRONMENT_IS_NODE) { - if (!(typeof process === 'object' && typeof require === 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); - if (ENVIRONMENT_IS_WORKER) { - scriptDirectory = require('path').dirname(scriptDirectory) + '/'; - } else { - scriptDirectory = __dirname + '/'; - } - -// include: node_shell_read.js - - -requireNodeFS = () => { - // Use nodePath as the indicator for these not being initialized, - // since in some environments a global fs may have already been - // created. - if (!nodePath) { - fs = require('fs'); - nodePath = require('path'); - } -}; - -read_ = function shell_read(filename, binary) { - requireNodeFS(); - filename = nodePath['normalize'](filename); - return fs.readFileSync(filename, binary ? null : 'utf8'); -}; - -readBinary = (filename) => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - assert(ret.buffer); - return ret; -}; - -readAsync = (filename, onload, onerror) => { - requireNodeFS(); - filename = nodePath['normalize'](filename); - fs.readFile(filename, function(err, data) { - if (err) onerror(err); - else onload(data.buffer); - }); -}; - -// end include: node_shell_read.js - if (process['argv'].length > 1) { - thisProgram = process['argv'][1].replace(/\\/g, '/'); - } - - arguments_ = process['argv'].slice(2); - - if (typeof module !== 'undefined') { - module['exports'] = Module; - } - - process['on']('uncaughtException', function(ex) { - // suppress ExitStatus exceptions from showing an error - if (!(ex instanceof ExitStatus)) { - throw ex; - } - }); - - // Without this older versions of node (< v15) will log unhandled rejections - // but return 0, which is not normally the desired behaviour. This is - // not be needed with node v15 and about because it is now the default - // behaviour: - // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode - process['on']('unhandledRejection', function(reason) { throw reason; }); - - quit_ = (status, toThrow) => { - if (keepRuntimeAlive()) { - process['exitCode'] = status; - throw toThrow; - } - logExceptionOnExit(toThrow); - process['exit'](status); - }; - - Module['inspect'] = function () { return '[Emscripten Module object]'; }; - -} else -if (ENVIRONMENT_IS_SHELL) { - - if ((typeof process === 'object' && typeof require === 'function') || typeof window === 'object' || typeof importScripts === 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); - - if (typeof read != 'undefined') { - read_ = function shell_read(f) { - return read(f); - }; - } - - readBinary = function readBinary(f) { - let data; - if (typeof readbuffer === 'function') { - return new Uint8Array(readbuffer(f)); - } - data = read(f, 'binary'); - assert(typeof data === 'object'); - return data; - }; - - readAsync = function readAsync(f, onload, onerror) { - setTimeout(() => onload(readBinary(f)), 0); - }; - - if (typeof scriptArgs != 'undefined') { - arguments_ = scriptArgs; - } else if (typeof arguments != 'undefined') { - arguments_ = arguments; - } - - if (typeof quit === 'function') { - quit_ = (status, toThrow) => { - logExceptionOnExit(toThrow); - quit(status); - }; - } - - if (typeof print !== 'undefined') { - // Prefer to use print/printErr where they exist, as they usually work better. - if (typeof console === 'undefined') console = /** @type{!Console} */({}); - console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); - console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr !== 'undefined' ? printErr : print); - } - -} else - -// Note that this includes Node.js workers when relevant (pthreads is enabled). -// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and -// ENVIRONMENT_IS_NODE. -if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { - if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled - scriptDirectory = self.location.href; - } else if (typeof document !== 'undefined' && document.currentScript) { // web - scriptDirectory = document.currentScript.src; - } - // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. - // otherwise, slice off the final part of the url to find the script directory. - // if scriptDirectory does not contain a slash, lastIndexOf will return -1, - // and scriptDirectory will correctly be replaced with an empty string. - // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), - // they are removed because they could contain a slash. - if (scriptDirectory.indexOf('blob:') !== 0) { - scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1); - } else { - scriptDirectory = ''; - } - - if (!(typeof window === 'object' || typeof importScripts === 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); - - // Differentiate the Web Worker from the Node Worker case, as reading must - // be done differently. - { -// include: web_or_worker_shell_read.js - - - read_ = (url) => { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - xhr.send(null); - return xhr.responseText; - } - - if (ENVIRONMENT_IS_WORKER) { - readBinary = (url) => { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - xhr.responseType = 'arraybuffer'; - xhr.send(null); - return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); - }; - } - - readAsync = (url, onload, onerror) => { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.onload = () => { - if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 - onload(xhr.response); - return; - } - onerror(); - }; - xhr.onerror = onerror; - xhr.send(null); - } - -// end include: web_or_worker_shell_read.js - } - - setWindowTitle = (title) => document.title = title; -} else -{ - throw new Error('environment detection error'); -} - -var out = Module['print'] || console.log.bind(console); -var err = Module['printErr'] || console.warn.bind(console); - -// Merge back in the overrides -objAssign(Module, moduleOverrides); -// Free the object hierarchy contained in the overrides, this lets the GC -// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. -moduleOverrides = null; - -// Emit code to handle expected values on the Module object. This applies Module.x -// to the proper local x. This has two benefits: first, we only emit it if it is -// expected to arrive, and second, by using a local everywhere else that can be -// minified. - -if (Module['arguments']) arguments_ = Module['arguments']; -if (!Object.getOwnPropertyDescriptor(Module, 'arguments')) { - Object.defineProperty(Module, 'arguments', { - configurable: true, - get: function() { - abort('Module.arguments has been replaced with plain arguments_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (Module['thisProgram']) thisProgram = Module['thisProgram']; -if (!Object.getOwnPropertyDescriptor(Module, 'thisProgram')) { - Object.defineProperty(Module, 'thisProgram', { - configurable: true, - get: function() { - abort('Module.thisProgram has been replaced with plain thisProgram (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (Module['quit']) quit_ = Module['quit']; -if (!Object.getOwnPropertyDescriptor(Module, 'quit')) { - Object.defineProperty(Module, 'quit', { - configurable: true, - get: function() { - abort('Module.quit has been replaced with plain quit_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message -// Assertions on removed incoming Module JS APIs. -assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); -assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); -assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); -assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); -assert(typeof Module['read'] === 'undefined', 'Module.read option was removed (modify read_ in JS)'); -assert(typeof Module['readAsync'] === 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); -assert(typeof Module['readBinary'] === 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); -assert(typeof Module['setWindowTitle'] === 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); -assert(typeof Module['TOTAL_MEMORY'] === 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); - -if (!Object.getOwnPropertyDescriptor(Module, 'read')) { - Object.defineProperty(Module, 'read', { - configurable: true, - get: function() { - abort('Module.read has been replaced with plain read_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (!Object.getOwnPropertyDescriptor(Module, 'readAsync')) { - Object.defineProperty(Module, 'readAsync', { - configurable: true, - get: function() { - abort('Module.readAsync has been replaced with plain readAsync (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (!Object.getOwnPropertyDescriptor(Module, 'readBinary')) { - Object.defineProperty(Module, 'readBinary', { - configurable: true, - get: function() { - abort('Module.readBinary has been replaced with plain readBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (!Object.getOwnPropertyDescriptor(Module, 'setWindowTitle')) { - Object.defineProperty(Module, 'setWindowTitle', { - configurable: true, - get: function() { - abort('Module.setWindowTitle has been replaced with plain setWindowTitle (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} -var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; -var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; -var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; -var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; - - -assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-s ENVIRONMENT` to enable."); - - - - -var STACK_ALIGN = 16; -var POINTER_SIZE = 4; - -function getNativeTypeSize(type) { - switch (type) { - case 'i1': case 'i8': return 1; - case 'i16': return 2; - case 'i32': return 4; - case 'i64': return 8; - case 'float': return 4; - case 'double': return 8; - default: { - if (type[type.length - 1] === '*') { - return POINTER_SIZE; - } else if (type[0] === 'i') { - const bits = Number(type.substr(1)); - assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); - return bits / 8; - } else { - return 0; - } - } - } -} - -function warnOnce(text) { - if (!warnOnce.shown) warnOnce.shown = {}; - if (!warnOnce.shown[text]) { - warnOnce.shown[text] = 1; - err(text); - } -} - -// include: runtime_functions.js - - -// Wraps a JS function as a wasm function with a given signature. -function convertJsFunctionToWasm(func, sig) { - - // If the type reflection proposal is available, use the new - // "WebAssembly.Function" constructor. - // Otherwise, construct a minimal wasm module importing the JS function and - // re-exporting it. - if (typeof WebAssembly.Function === "function") { - var typeNames = { - 'i': 'i32', - 'j': 'i64', - 'f': 'f32', - 'd': 'f64' - }; - var type = { - parameters: [], - results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] - }; - for (var i = 1; i < sig.length; ++i) { - type.parameters.push(typeNames[sig[i]]); - } - return new WebAssembly.Function(type, func); - } - - // The module is static, with the exception of the type section, which is - // generated based on the signature passed in. - var typeSection = [ - 0x01, // id: section, - 0x00, // length: 0 (placeholder) - 0x01, // count: 1 - 0x60, // form: func - ]; - var sigRet = sig.slice(0, 1); - var sigParam = sig.slice(1); - var typeCodes = { - 'i': 0x7f, // i32 - 'j': 0x7e, // i64 - 'f': 0x7d, // f32 - 'd': 0x7c, // f64 - }; - - // Parameters, length + signatures - typeSection.push(sigParam.length); - for (var i = 0; i < sigParam.length; ++i) { - typeSection.push(typeCodes[sigParam[i]]); - } - - // Return values, length + signatures - // With no multi-return in MVP, either 0 (void) or 1 (anything else) - if (sigRet == 'v') { - typeSection.push(0x00); - } else { - typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); - } - - // Write the overall length of the type section back into the section header - // (excepting the 2 bytes for the section id and length) - typeSection[1] = typeSection.length - 2; - - // Rest of the module is static - var bytes = new Uint8Array([ - 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") - 0x01, 0x00, 0x00, 0x00, // version: 1 - ].concat(typeSection, [ - 0x02, 0x07, // import section - // (import "e" "f" (func 0 (type 0))) - 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, - 0x07, 0x05, // export section - // (export "f" (func 0 (type 0))) - 0x01, 0x01, 0x66, 0x00, 0x00, - ])); - - // We can compile this wasm module synchronously because it is very small. - // This accepts an import (at "e.f"), that it reroutes to an export (at "f") - var module = new WebAssembly.Module(bytes); - var instance = new WebAssembly.Instance(module, { - 'e': { - 'f': func - } - }); - var wrappedFunc = instance.exports['f']; - return wrappedFunc; -} - -var freeTableIndexes = []; - -// Weak map of functions in the table to their indexes, created on first use. -var functionsInTableMap; - -function getEmptyTableSlot() { - // Reuse a free index if there is one, otherwise grow. - if (freeTableIndexes.length) { - return freeTableIndexes.pop(); - } - // Grow the table - try { - wasmTable.grow(1); - } catch (err) { - if (!(err instanceof RangeError)) { - throw err; - } - throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; - } - return wasmTable.length - 1; -} - -function updateTableMap(offset, count) { - for (var i = offset; i < offset + count; i++) { - var item = getWasmTableEntry(i); - // Ignore null values. - if (item) { - functionsInTableMap.set(item, i); - } - } -} - -// Add a function to the table. -// 'sig' parameter is required if the function being added is a JS function. -function addFunction(func, sig) { - assert(typeof func !== 'undefined'); - - // Check if the function is already in the table, to ensure each function - // gets a unique index. First, create the map if this is the first use. - if (!functionsInTableMap) { - functionsInTableMap = new WeakMap(); - updateTableMap(0, wasmTable.length); - } - if (functionsInTableMap.has(func)) { - return functionsInTableMap.get(func); - } - - // It's not in the table, add it now. - - var ret = getEmptyTableSlot(); - - // Set the new value. - try { - // Attempting to call this with JS function will cause of table.set() to fail - setWasmTableEntry(ret, func); - } catch (err) { - if (!(err instanceof TypeError)) { - throw err; - } - assert(typeof sig !== 'undefined', 'Missing signature argument to addFunction: ' + func); - var wrapped = convertJsFunctionToWasm(func, sig); - setWasmTableEntry(ret, wrapped); - } - - functionsInTableMap.set(func, ret); - - return ret; -} - -function removeFunction(index) { - functionsInTableMap.delete(getWasmTableEntry(index)); - freeTableIndexes.push(index); -} - -// end include: runtime_functions.js -// include: runtime_debug.js - - -// end include: runtime_debug.js -var tempRet0 = 0; -var setTempRet0 = (value) => { tempRet0 = value; }; -var getTempRet0 = () => tempRet0; - - - -// === Preamble library stuff === - -// Documentation for the public APIs defined in this file must be updated in: -// site/source/docs/api_reference/preamble.js.rst -// A prebuilt local version of the documentation is available at: -// site/build/text/docs/api_reference/preamble.js.txt -// You can also build docs locally as HTML or other formats in site/ -// An online HTML version (which may be of a different version of Emscripten) -// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html - -var wasmBinary; -if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; -if (!Object.getOwnPropertyDescriptor(Module, 'wasmBinary')) { - Object.defineProperty(Module, 'wasmBinary', { - configurable: true, - get: function() { - abort('Module.wasmBinary has been replaced with plain wasmBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} -var noExitRuntime = Module['noExitRuntime'] || true; -if (!Object.getOwnPropertyDescriptor(Module, 'noExitRuntime')) { - Object.defineProperty(Module, 'noExitRuntime', { - configurable: true, - get: function() { - abort('Module.noExitRuntime has been replaced with plain noExitRuntime (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -if (typeof WebAssembly !== 'object') { - abort('no native wasm support detected'); -} - -// include: runtime_safe_heap.js - - -// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. -// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) - -/** @param {number} ptr - @param {number} value - @param {string} type - @param {number|boolean=} noSafe */ -function setValue(ptr, value, type = 'i8', noSafe) { - if (type.charAt(type.length-1) === '*') type = 'i32'; - switch (type) { - case 'i1': HEAP8[((ptr)>>0)] = value; break; - case 'i8': HEAP8[((ptr)>>0)] = value; break; - case 'i16': HEAP16[((ptr)>>1)] = value; break; - case 'i32': HEAP32[((ptr)>>2)] = value; break; - case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break; - case 'float': HEAPF32[((ptr)>>2)] = value; break; - case 'double': HEAPF64[((ptr)>>3)] = value; break; - default: abort('invalid type for setValue: ' + type); - } -} - -/** @param {number} ptr - @param {string} type - @param {number|boolean=} noSafe */ -function getValue(ptr, type = 'i8', noSafe) { - if (type.charAt(type.length-1) === '*') type = 'i32'; - switch (type) { - case 'i1': return HEAP8[((ptr)>>0)]; - case 'i8': return HEAP8[((ptr)>>0)]; - case 'i16': return HEAP16[((ptr)>>1)]; - case 'i32': return HEAP32[((ptr)>>2)]; - case 'i64': return HEAP32[((ptr)>>2)]; - case 'float': return HEAPF32[((ptr)>>2)]; - case 'double': return Number(HEAPF64[((ptr)>>3)]); - default: abort('invalid type for getValue: ' + type); - } - return null; -} - -// end include: runtime_safe_heap.js -// Wasm globals - -var wasmMemory; - -//======================================== -// Runtime essentials -//======================================== - -// whether we are quitting the application. no code should run after this. -// set in exit() and abort() -var ABORT = false; - -// set by exit() and abort(). Passed to 'onExit' handler. -// NOTE: This is also used as the process return code code in shell environments -// but only when noExitRuntime is false. -var EXITSTATUS; - -/** @type {function(*, string=)} */ -function assert(condition, text) { - if (!condition) { - abort('Assertion failed' + (text ? ': ' + text : '')); - } -} - -// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) -function getCFunc(ident) { - var func = Module['_' + ident]; // closure exported function - assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); - return func; -} - -// C calling interface. -/** @param {string|null=} returnType - @param {Array=} argTypes - @param {Arguments|Array=} args - @param {Object=} opts */ -function ccall(ident, returnType, argTypes, args, opts) { - // For fast lookup of conversion functions - var toC = { - 'string': function(str) { - var ret = 0; - if (str !== null && str !== undefined && str !== 0) { // null string - // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' - var len = (str.length << 2) + 1; - ret = stackAlloc(len); - stringToUTF8(str, ret, len); - } - return ret; - }, - 'array': function(arr) { - var ret = stackAlloc(arr.length); - writeArrayToMemory(arr, ret); - return ret; - } - }; - - function convertReturnValue(ret) { - if (returnType === 'string') return UTF8ToString(ret); - if (returnType === 'boolean') return Boolean(ret); - return ret; - } - - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - assert(returnType !== 'array', 'Return type should not be "array".'); - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func.apply(null, cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - - ret = onDone(ret); - return ret; -} - -/** @param {string=} returnType - @param {Array=} argTypes - @param {Object=} opts */ -function cwrap(ident, returnType, argTypes, opts) { - return function() { - return ccall(ident, returnType, argTypes, arguments, opts); - } -} - -// We used to include malloc/free by default in the past. Show a helpful error in -// builds with assertions. - -var ALLOC_NORMAL = 0; // Tries to use _malloc() -var ALLOC_STACK = 1; // Lives for the duration of the current function call - -// allocate(): This is for internal use. You can use it yourself as well, but the interface -// is a little tricky (see docs right below). The reason is that it is optimized -// for multiple syntaxes to save space in generated code. So you should -// normally not use allocate(), and instead allocate memory using _malloc(), -// initialize it with setValue(), and so forth. -// @slab: An array of data. -// @allocator: How to allocate memory, see ALLOC_* -/** @type {function((Uint8Array|Array), number)} */ -function allocate(slab, allocator) { - var ret; - assert(typeof allocator === 'number', 'allocate no longer takes a type argument') - assert(typeof slab !== 'number', 'allocate no longer takes a number as arg0') - - if (allocator == ALLOC_STACK) { - ret = stackAlloc(slab.length); - } else { - ret = _malloc(slab.length); - } - - if (slab.subarray || slab.slice) { - HEAPU8.set(/** @type {!Uint8Array} */(slab), ret); - } else { - HEAPU8.set(new Uint8Array(slab), ret); - } - return ret; -} - -// include: runtime_strings.js - - -// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. - -// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns -// a copy of that string as a Javascript String object. - -var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined; - -/** - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ArrayToString(heap, idx, maxBytesToRead) { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. - // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. - // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) - while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; - - if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { - return UTF8Decoder.decode(heap.subarray(idx, endPtr)); - } else { - var str = ''; - // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that - while (idx < endPtr) { - // For UTF8 byte structure, see: - // http://en.wikipedia.org/wiki/UTF-8#Description - // https://www.ietf.org/rfc/rfc2279.txt - // https://tools.ietf.org/html/rfc3629 - var u0 = heap[idx++]; - if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } - var u1 = heap[idx++] & 63; - if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } - var u2 = heap[idx++] & 63; - if ((u0 & 0xF0) == 0xE0) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } else { - if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); - } - - if (u0 < 0x10000) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 0x10000; - str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); - } - } - } - return str; -} - -// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a -// copy of that string as a Javascript String object. -// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit -// this parameter to scan the string until the first \0 byte. If maxBytesToRead is -// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the -// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will -// not produce a string of exact length [ptr, ptr+maxBytesToRead[) -// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may -// throw JS JIT optimizations off, so it is worth to consider consistently using one -// style or the other. -/** - * @param {number} ptr - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ToString(ptr, maxBytesToRead) { - ; - return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; -} - -// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', -// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. -// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. -// outIdx: The starting offset in the array to begin the copying. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. -// This count should include the null terminator, -// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. -// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { - if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. - return 0; - - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 - var u = str.charCodeAt(i); // possibly a lead surrogate - if (u >= 0xD800 && u <= 0xDFFF) { - var u1 = str.charCodeAt(++i); - u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); - } - if (u <= 0x7F) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 0x7FF) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 0xC0 | (u >> 6); - heap[outIdx++] = 0x80 | (u & 63); - } else if (u <= 0xFFFF) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 0xE0 | (u >> 12); - heap[outIdx++] = 0x80 | ((u >> 6) & 63); - heap[outIdx++] = 0x80 | (u & 63); - } else { - if (outIdx + 3 >= endIdx) break; - if (u > 0x10FFFF) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); - heap[outIdx++] = 0xF0 | (u >> 18); - heap[outIdx++] = 0x80 | ((u >> 12) & 63); - heap[outIdx++] = 0x80 | ((u >> 6) & 63); - heap[outIdx++] = 0x80 | (u & 63); - } - } - // Null-terminate the pointer to the buffer. - heap[outIdx] = 0; - return outIdx - startIdx; -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. -// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF8(str, outPtr, maxBytesToWrite) { - assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); - return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. -function lengthBytesUTF8(str) { - var len = 0; - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var u = str.charCodeAt(i); // possibly a lead surrogate - if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); - if (u <= 0x7F) ++len; - else if (u <= 0x7FF) len += 2; - else if (u <= 0xFFFF) len += 3; - else len += 4; - } - return len; -} - -// end include: runtime_strings.js -// include: runtime_strings_extra.js - - -// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. - -// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns -// a copy of that string as a Javascript String object. - -function AsciiToString(ptr) { - var str = ''; - while (1) { - var ch = HEAPU8[((ptr++)>>0)]; - if (!ch) return str; - str += String.fromCharCode(ch); - } -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. - -function stringToAscii(str, outPtr) { - return writeAsciiToMemory(str, outPtr, false); -} - -// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns -// a copy of that string as a Javascript String object. - -var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined; - -function UTF16ToString(ptr, maxBytesToRead) { - assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); - var endPtr = ptr; - // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. - // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. - var idx = endPtr >> 1; - var maxIdx = idx + maxBytesToRead / 2; - // If maxBytesToRead is not passed explicitly, it will be undefined, and this - // will always evaluate to true. This saves on code size. - while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; - endPtr = idx << 1; - - if (endPtr - ptr > 32 && UTF16Decoder) { - return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); - } else { - var str = ''; - - // If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition - // will always evaluate to true. The loop is then terminated on the first null char. - for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { - var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; - if (codeUnit == 0) break; - // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. - str += String.fromCharCode(codeUnit); - } - - return str; - } -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. -// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// outPtr: Byte address in Emscripten HEAP where to write the string to. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null -// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. -// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF16(str, outPtr, maxBytesToWrite) { - assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); - assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); - // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. - if (maxBytesToWrite === undefined) { - maxBytesToWrite = 0x7FFFFFFF; - } - if (maxBytesToWrite < 2) return 0; - maxBytesToWrite -= 2; // Null terminator. - var startPtr = outPtr; - var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; - for (var i = 0; i < numCharsToWrite; ++i) { - // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. - var codeUnit = str.charCodeAt(i); // possibly a lead surrogate - HEAP16[((outPtr)>>1)] = codeUnit; - outPtr += 2; - } - // Null-terminate the pointer to the HEAP. - HEAP16[((outPtr)>>1)] = 0; - return outPtr - startPtr; -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. - -function lengthBytesUTF16(str) { - return str.length*2; -} - -function UTF32ToString(ptr, maxBytesToRead) { - assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); - var i = 0; - - var str = ''; - // If maxBytesToRead is not passed explicitly, it will be undefined, and this - // will always evaluate to true. This saves on code size. - while (!(i >= maxBytesToRead / 4)) { - var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; - if (utf32 == 0) break; - ++i; - // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - if (utf32 >= 0x10000) { - var ch = utf32 - 0x10000; - str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); - } else { - str += String.fromCharCode(utf32); - } - } - return str; -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. -// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// outPtr: Byte address in Emscripten HEAP where to write the string to. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null -// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. -// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF32(str, outPtr, maxBytesToWrite) { - assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); - assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); - // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. - if (maxBytesToWrite === undefined) { - maxBytesToWrite = 0x7FFFFFFF; - } - if (maxBytesToWrite < 4) return 0; - var startPtr = outPtr; - var endPtr = startPtr + maxBytesToWrite - 4; - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var codeUnit = str.charCodeAt(i); // possibly a lead surrogate - if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { - var trailSurrogate = str.charCodeAt(++i); - codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); - } - HEAP32[((outPtr)>>2)] = codeUnit; - outPtr += 4; - if (outPtr + 4 > endPtr) break; - } - // Null-terminate the pointer to the HEAP. - HEAP32[((outPtr)>>2)] = 0; - return outPtr - startPtr; -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. - -function lengthBytesUTF32(str) { - var len = 0; - for (var i = 0; i < str.length; ++i) { - // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var codeUnit = str.charCodeAt(i); - if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. - len += 4; - } - - return len; -} - -// Allocate heap space for a JS string, and write it there. -// It is the responsibility of the caller to free() that memory. -function allocateUTF8(str) { - var size = lengthBytesUTF8(str) + 1; - var ret = _malloc(size); - if (ret) stringToUTF8Array(str, HEAP8, ret, size); - return ret; -} - -// Allocate stack space for a JS string, and write it there. -function allocateUTF8OnStack(str) { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8Array(str, HEAP8, ret, size); - return ret; -} - -// Deprecated: This function should not be called because it is unsafe and does not provide -// a maximum length limit of how many bytes it is allowed to write. Prefer calling the -// function stringToUTF8Array() instead, which takes in a maximum length that can be used -// to be secure from out of bounds writes. -/** @deprecated - @param {boolean=} dontAddNull */ -function writeStringToMemory(string, buffer, dontAddNull) { - warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); - - var /** @type {number} */ lastChar, /** @type {number} */ end; - if (dontAddNull) { - // stringToUTF8Array always appends null. If we don't want to do that, remember the - // character that existed at the location where the null will be placed, and restore - // that after the write (below). - end = buffer + lengthBytesUTF8(string); - lastChar = HEAP8[end]; - } - stringToUTF8(string, buffer, Infinity); - if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. -} - -function writeArrayToMemory(array, buffer) { - assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') - HEAP8.set(array, buffer); -} - -/** @param {boolean=} dontAddNull */ -function writeAsciiToMemory(str, buffer, dontAddNull) { - for (var i = 0; i < str.length; ++i) { - assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff)); - HEAP8[((buffer++)>>0)] = str.charCodeAt(i); - } - // Null-terminate the pointer to the HEAP. - if (!dontAddNull) HEAP8[((buffer)>>0)] = 0; -} - -// end include: runtime_strings_extra.js -// Memory management - -function alignUp(x, multiple) { - if (x % multiple > 0) { - x += multiple - (x % multiple); - } - return x; -} - -var HEAP, -/** @type {ArrayBuffer} */ - buffer, -/** @type {Int8Array} */ - HEAP8, -/** @type {Uint8Array} */ - HEAPU8, -/** @type {Int16Array} */ - HEAP16, -/** @type {Uint16Array} */ - HEAPU16, -/** @type {Int32Array} */ - HEAP32, -/** @type {Uint32Array} */ - HEAPU32, -/** @type {Float32Array} */ - HEAPF32, -/** @type {Float64Array} */ - HEAPF64; - -function updateGlobalBufferAndViews(buf) { - buffer = buf; - Module['HEAP8'] = HEAP8 = new Int8Array(buf); - Module['HEAP16'] = HEAP16 = new Int16Array(buf); - Module['HEAP32'] = HEAP32 = new Int32Array(buf); - Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); - Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); - Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); - Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); - Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); -} - -var TOTAL_STACK = 5242880; -if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') - -var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216; -if (!Object.getOwnPropertyDescriptor(Module, 'INITIAL_MEMORY')) { - Object.defineProperty(Module, 'INITIAL_MEMORY', { - configurable: true, - get: function() { - abort('Module.INITIAL_MEMORY has been replaced with plain INITIAL_MEMORY (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') - } - }); -} - -assert(INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); - -// check for full engine support (use string 'subarray' to avoid closure compiler confusion) -assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined, - 'JS engine does not provide full typed array support'); - -// If memory is defined in wasm, the user can't provide it. -assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -s IMPORTED_MEMORY to define wasmMemory externally'); -assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically'); - -// include: runtime_init_table.js -// In regular non-RELOCATABLE mode the table is exported -// from the wasm module and this will be assigned once -// the exports are available. -var wasmTable; - -// end include: runtime_init_table.js -// include: runtime_stack_check.js - - -// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. -function writeStackCookie() { - var max = _emscripten_stack_get_end(); - assert((max & 3) == 0); - // The stack grows downwards - HEAP32[((max + 4)>>2)] = 0x2135467; - HEAP32[((max + 8)>>2)] = 0x89BACDFE; - // Also test the global address 0 for integrity. - HEAP32[0] = 0x63736d65; /* 'emsc' */ -} - -function checkStackCookie() { - if (ABORT) return; - var max = _emscripten_stack_get_end(); - var cookie1 = HEAPU32[((max + 4)>>2)]; - var cookie2 = HEAPU32[((max + 8)>>2)]; - if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) { - abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' 0x' + cookie1.toString(16)); - } - // Also test the global address 0 for integrity. - if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); -} - -// end include: runtime_stack_check.js -// include: runtime_assertions.js - - -// Endianness check -(function() { - var h16 = new Int16Array(1); - var h8 = new Int8Array(h16.buffer); - h16[0] = 0x6373; - if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)'; -})(); - -// end include: runtime_assertions.js -var __ATPRERUN__ = []; // functions called before the runtime is initialized -var __ATINIT__ = []; // functions called during startup -var __ATEXIT__ = []; // functions called during shutdown -var __ATPOSTRUN__ = []; // functions called after the main() is called - -var runtimeInitialized = false; -var runtimeExited = false; -var runtimeKeepaliveCounter = 0; - -function keepRuntimeAlive() { - return noExitRuntime || runtimeKeepaliveCounter > 0; -} - -function preRun() { - - if (Module['preRun']) { - if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; - while (Module['preRun'].length) { - addOnPreRun(Module['preRun'].shift()); - } - } - - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - checkStackCookie(); - assert(!runtimeInitialized); - runtimeInitialized = true; - - -if (!Module["noFSInit"] && !FS.init.initialized) - FS.init(); -FS.ignorePermissions = false; - -TTY.init(); - callRuntimeCallbacks(__ATINIT__); -} - -function exitRuntime() { - checkStackCookie(); - runtimeExited = true; -} - -function postRun() { - checkStackCookie(); - - if (Module['postRun']) { - if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; - while (Module['postRun'].length) { - addOnPostRun(Module['postRun'].shift()); - } - } - - callRuntimeCallbacks(__ATPOSTRUN__); -} - -function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); -} - -function addOnInit(cb) { - __ATINIT__.unshift(cb); -} - -function addOnExit(cb) { -} - -function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); -} - -// include: runtime_math.js - - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc - -assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); -assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); -assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); -assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); - -// end include: runtime_math.js -// A counter of dependencies for calling run(). If we need to -// do asynchronous work before running, increment this and -// decrement it. Incrementing must happen in a place like -// Module.preRun (used by emcc to add file preloading). -// Note that you can add dependencies in preRun, even though -// it happens right before run - run will be postponed until -// the dependencies are met. -var runDependencies = 0; -var runDependencyWatcher = null; -var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled -var runDependencyTracking = {}; - -function getUniqueRunDependency(id) { - var orig = id; - while (1) { - if (!runDependencyTracking[id]) return id; - id = orig + Math.random(); - } -} - -function addRunDependency(id) { - runDependencies++; - - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } - - if (id) { - assert(!runDependencyTracking[id]); - runDependencyTracking[id] = 1; - if (runDependencyWatcher === null && typeof setInterval !== 'undefined') { - // Check for missing dependencies every few seconds - runDependencyWatcher = setInterval(function() { - if (ABORT) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - return; - } - var shown = false; - for (var dep in runDependencyTracking) { - if (!shown) { - shown = true; - err('still waiting on run dependencies:'); - } - err('dependency: ' + dep); - } - if (shown) { - err('(end of list)'); - } - }, 10000); - } - } else { - err('warning: run dependency added without ID'); - } -} - -function removeRunDependency(id) { - runDependencies--; - - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } - - if (id) { - assert(runDependencyTracking[id]); - delete runDependencyTracking[id]; - } else { - err('warning: run dependency removed without ID'); - } - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); // can add another dependenciesFulfilled - } - } -} - -Module["preloadedImages"] = {}; // maps url to image data -Module["preloadedAudios"] = {}; // maps url to audio data - -/** @param {string|number=} what */ -function abort(what) { - { - if (Module['onAbort']) { - Module['onAbort'](what); - } - } - - what = 'Aborted(' + what + ')'; - // TODO(sbc): Should we remove printing and leave it up to whoever - // catches the exception? - err(what); - - ABORT = true; - EXITSTATUS = 1; - - // Use a wasm runtime error, because a JS error might be seen as a foreign - // exception, which means we'd run destructors on it. We need the error to - // simply make the program stop. - var e = new WebAssembly.RuntimeError(what); - - // Throw the error whether or not MODULARIZE is set because abort is used - // in code paths apart from instantiation where an exception is expected - // to be thrown when abort is called. - throw e; -} - -// {{MEM_INITIALIZER}} - -// include: memoryprofiler.js - - -// end include: memoryprofiler.js -// include: URIUtils.js - - -// Prefix of data URIs emitted by SINGLE_FILE and related options. -var dataURIPrefix = 'data:application/octet-stream;base64,'; - -// Indicates whether filename is a base64 data URI. -function isDataURI(filename) { - // Prefix of data URIs emitted by SINGLE_FILE and related options. - return filename.startsWith(dataURIPrefix); -} - -// Indicates whether filename is delivered via file protocol (as opposed to http/https) -function isFileURI(filename) { - return filename.startsWith('file://'); -} - -// end include: URIUtils.js -function createExportWrapper(name, fixedasm) { - return function() { - var displayName = name; - var asm = fixedasm; - if (!fixedasm) { - asm = Module['asm']; - } - assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization'); - assert(!runtimeExited, 'native function `' + displayName + '` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - if (!asm[name]) { - assert(asm[name], 'exported native function `' + displayName + '` not found'); - } - return asm[name].apply(null, arguments); - }; -} - -var wasmBinaryFile; - wasmBinaryFile = 'libopus.wasm'; - if (!isDataURI(wasmBinaryFile)) { - wasmBinaryFile = locateFile(wasmBinaryFile); - } - -function getBinary(file) { - try { - if (file == wasmBinaryFile && wasmBinary) { - return new Uint8Array(wasmBinary); - } - if (readBinary) { - return readBinary(file); - } else { - throw "both async and sync fetching of the wasm failed"; - } - } - catch (err) { - abort(err); - } -} - -function getBinaryPromise() { - // If we don't have the binary yet, try to to load it asynchronously. - // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. - // See https://github.com/github/fetch/pull/92#issuecomment-140665932 - // Cordova or Electron apps are typically loaded from a file:// url. - // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. - if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { - if (typeof fetch === 'function' - && !isFileURI(wasmBinaryFile) - ) { - return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { - if (!response['ok']) { - throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; - } - return response['arrayBuffer'](); - }).catch(function () { - return getBinary(wasmBinaryFile); - }); - } - else { - if (readAsync) { - // fetch is not available or url is file => try XHR (readAsync uses XHR internally) - return new Promise(function(resolve, reject) { - readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject) - }); - } - } - } - - // Otherwise, getBinary should be able to get it synchronously - return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); }); -} - -// Create the wasm instance. -// Receives the wasm imports, returns the exports. -function createWasm() { - // prepare imports - var info = { - 'env': asmLibraryArg, - 'wasi_snapshot_preview1': asmLibraryArg, - }; - // Load the wasm module and create an instance of using native support in the JS engine. - // handle a generated wasm instance, receiving its exports and - // performing other necessary setup - /** @param {WebAssembly.Module=} module*/ - function receiveInstance(instance, module) { - var exports = instance.exports; - - Module['asm'] = exports; - - wasmMemory = Module['asm']['memory']; - assert(wasmMemory, "memory not found in wasm exports"); - // This assertion doesn't hold when emscripten is run in --post-link - // mode. - // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. - //assert(wasmMemory.buffer.byteLength === 16777216); - updateGlobalBufferAndViews(wasmMemory.buffer); - - wasmTable = Module['asm']['__indirect_function_table']; - assert(wasmTable, "table not found in wasm exports"); - - addOnInit(Module['asm']['__wasm_call_ctors']); - - removeRunDependency('wasm-instantiate'); - } - // we can't run yet (except in a pthread, where we have a custom sync instantiator) - addRunDependency('wasm-instantiate'); - - // Prefer streaming instantiation if available. - // Async compilation can be confusing when an error on the page overwrites Module - // (for example, if the order of elements is wrong, and the one defining Module is - // later), so we save Module and check it later. - var trueModule = Module; - function receiveInstantiationResult(result) { - // 'result' is a ResultObject object which has both the module and instance. - // receiveInstance() will swap in the exports (to Module.asm) so they can be called - assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); - trueModule = null; - // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. - // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. - receiveInstance(result['instance']); - } - - function instantiateArrayBuffer(receiver) { - return getBinaryPromise().then(function(binary) { - return WebAssembly.instantiate(binary, info); - }).then(function (instance) { - return instance; - }).then(receiver, function(reason) { - err('failed to asynchronously prepare wasm: ' + reason); - - // Warn on some common problems. - if (isFileURI(wasmBinaryFile)) { - err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing'); - } - abort(reason); - }); - } - - function instantiateAsync() { - if (!wasmBinary && - typeof WebAssembly.instantiateStreaming === 'function' && - !isDataURI(wasmBinaryFile) && - // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. - !isFileURI(wasmBinaryFile) && - typeof fetch === 'function') { - return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) { - var result = WebAssembly.instantiateStreaming(response, info); - - return result.then( - receiveInstantiationResult, - function(reason) { - // We expect the most common failure cause to be a bad MIME type for the binary, - // in which case falling back to ArrayBuffer instantiation should work. - err('wasm streaming compile failed: ' + reason); - err('falling back to ArrayBuffer instantiation'); - return instantiateArrayBuffer(receiveInstantiationResult); - }); - }); - } else { - return instantiateArrayBuffer(receiveInstantiationResult); - } - } - - // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback - // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel - // to any other async startup actions they are performing. - if (Module['instantiateWasm']) { - try { - var exports = Module['instantiateWasm'](info, receiveInstance); - return exports; - } catch(e) { - err('Module.instantiateWasm callback failed with error: ' + e); - return false; - } - } - - instantiateAsync(); - return {}; // no exports yet; we'll fill them in later -} - -// Globals used by JS i64 conversions (see makeSetValue) -var tempDouble; -var tempI64; - -// === Body === - -var ASM_CONSTS = { - -}; - - - - - - - function callRuntimeCallbacks(callbacks) { - while (callbacks.length > 0) { - var callback = callbacks.shift(); - if (typeof callback == 'function') { - callback(Module); // Pass the module as the first argument. - continue; - } - var func = callback.func; - if (typeof func === 'number') { - if (callback.arg === undefined) { - getWasmTableEntry(func)(); - } else { - getWasmTableEntry(func)(callback.arg); - } - } else { - func(callback.arg === undefined ? null : callback.arg); - } - } - } - - function withStackSave(f) { - var stack = stackSave(); - var ret = f(); - stackRestore(stack); - return ret; - } - function demangle(func) { - warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); - return func; - } - - function demangleAll(text) { - var regex = - /\b_Z[\w\d_]+/g; - return text.replace(regex, - function(x) { - var y = demangle(x); - return x === y ? x : (y + ' [' + x + ']'); - }); - } - - var wasmTableMirror = []; - function getWasmTableEntry(funcPtr) { - var func = wasmTableMirror[funcPtr]; - if (!func) { - if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; - wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); - } - assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!"); - return func; - } - - function handleException(e) { - // Certain exception types we do not treat as errors since they are used for - // internal control flow. - // 1. ExitStatus, which is thrown by exit() - // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others - // that wish to return to JS event loop. - if (e instanceof ExitStatus || e == 'unwind') { - return EXITSTATUS; - } - quit_(1, e); - } - - function jsStackTrace() { - var error = new Error(); - if (!error.stack) { - // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, - // so try that as a special-case. - try { - throw new Error(); - } catch(e) { - error = e; - } - if (!error.stack) { - return '(no stack trace available)'; - } - } - return error.stack.toString(); - } - - function setWasmTableEntry(idx, func) { - wasmTable.set(idx, func); - wasmTableMirror[idx] = func; - } - - function stackTrace() { - var js = jsStackTrace(); - if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); - return demangleAll(js); - } - - function ___cxa_allocate_exception(size) { - // Thrown object is prepended by exception metadata block - return _malloc(size + 16) + 16; - } - - function ExceptionInfo(excPtr) { - this.excPtr = excPtr; - this.ptr = excPtr - 16; - - this.set_type = function(type) { - HEAP32[(((this.ptr)+(4))>>2)] = type; - }; - - this.get_type = function() { - return HEAP32[(((this.ptr)+(4))>>2)]; - }; - - this.set_destructor = function(destructor) { - HEAP32[(((this.ptr)+(8))>>2)] = destructor; - }; - - this.get_destructor = function() { - return HEAP32[(((this.ptr)+(8))>>2)]; - }; - - this.set_refcount = function(refcount) { - HEAP32[((this.ptr)>>2)] = refcount; - }; - - this.set_caught = function (caught) { - caught = caught ? 1 : 0; - HEAP8[(((this.ptr)+(12))>>0)] = caught; - }; - - this.get_caught = function () { - return HEAP8[(((this.ptr)+(12))>>0)] != 0; - }; - - this.set_rethrown = function (rethrown) { - rethrown = rethrown ? 1 : 0; - HEAP8[(((this.ptr)+(13))>>0)] = rethrown; - }; - - this.get_rethrown = function () { - return HEAP8[(((this.ptr)+(13))>>0)] != 0; - }; - - // Initialize native structure fields. Should be called once after allocated. - this.init = function(type, destructor) { - this.set_type(type); - this.set_destructor(destructor); - this.set_refcount(0); - this.set_caught(false); - this.set_rethrown(false); - } - - this.add_ref = function() { - var value = HEAP32[((this.ptr)>>2)]; - HEAP32[((this.ptr)>>2)] = value + 1; - }; - - // Returns true if last reference released. - this.release_ref = function() { - var prev = HEAP32[((this.ptr)>>2)]; - HEAP32[((this.ptr)>>2)] = prev - 1; - assert(prev > 0); - return prev === 1; - }; - } - - var exceptionLast = 0; - - var uncaughtExceptionCount = 0; - function ___cxa_throw(ptr, type, destructor) { - var info = new ExceptionInfo(ptr); - // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. - info.init(type, destructor); - exceptionLast = ptr; - uncaughtExceptionCount++; - throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s NO_DISABLE_EXCEPTION_CATCHING or -s EXCEPTION_CATCHING_ALLOWED=[..] to catch."; - } - - function _abort() { - abort('native code called abort()'); - } - - function _emscripten_memcpy_big(dest, src, num) { - HEAPU8.copyWithin(dest, src, src + num); - } - - function abortOnCannotGrowMemory(requestedSize) { - abort('Cannot enlarge memory arrays to size ' + requestedSize + ' bytes (OOM). Either (1) compile with -s INITIAL_MEMORY=X with X higher than the current value ' + HEAP8.length + ', (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 '); - } - function _emscripten_resize_heap(requestedSize) { - var oldSize = HEAPU8.length; - requestedSize = requestedSize >>> 0; - abortOnCannotGrowMemory(requestedSize); - } - - var ENV = {}; - - function getExecutableName() { - return thisProgram || './this.program'; - } - function getEnvStrings() { - if (!getEnvStrings.strings) { - // Default values. - // Browser language detection #8751 - var lang = ((typeof navigator === 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8'; - var env = { - 'USER': 'web_user', - 'LOGNAME': 'web_user', - 'PATH': '/', - 'PWD': '/', - 'HOME': '/home/web_user', - 'LANG': lang, - '_': getExecutableName() - }; - // Apply the user-provided values, if any. - for (var x in ENV) { - // x is a key in ENV; if ENV[x] is undefined, that means it was - // explicitly set to be so. We allow user code to do that to - // force variables with default values to remain unset. - if (ENV[x] === undefined) delete env[x]; - else env[x] = ENV[x]; - } - var strings = []; - for (var x in env) { - strings.push(x + '=' + env[x]); - } - getEnvStrings.strings = strings; - } - return getEnvStrings.strings; - } - - var PATH = {splitPath:function(filename) { - var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; - return splitPathRe.exec(filename).slice(1); - },normalizeArray:function(parts, allowAboveRoot) { - // if the path tries to go above the root, `up` ends up > 0 - var up = 0; - for (var i = parts.length - 1; i >= 0; i--) { - var last = parts[i]; - if (last === '.') { - parts.splice(i, 1); - } else if (last === '..') { - parts.splice(i, 1); - up++; - } else if (up) { - parts.splice(i, 1); - up--; - } - } - // if the path is allowed to go above the root, restore leading ..s - if (allowAboveRoot) { - for (; up; up--) { - parts.unshift('..'); - } - } - return parts; - },normalize:function(path) { - var isAbsolute = path.charAt(0) === '/', - trailingSlash = path.substr(-1) === '/'; - // Normalize the path - path = PATH.normalizeArray(path.split('/').filter(function(p) { - return !!p; - }), !isAbsolute).join('/'); - if (!path && !isAbsolute) { - path = '.'; - } - if (path && trailingSlash) { - path += '/'; - } - return (isAbsolute ? '/' : '') + path; - },dirname:function(path) { - var result = PATH.splitPath(path), - root = result[0], - dir = result[1]; - if (!root && !dir) { - // No dirname whatsoever - return '.'; - } - if (dir) { - // It has a dirname, strip trailing slash - dir = dir.substr(0, dir.length - 1); - } - return root + dir; - },basename:function(path) { - // EMSCRIPTEN return '/'' for '/', not an empty string - if (path === '/') return '/'; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf('/'); - if (lastSlash === -1) return path; - return path.substr(lastSlash+1); - },extname:function(path) { - return PATH.splitPath(path)[3]; - },join:function() { - var paths = Array.prototype.slice.call(arguments, 0); - return PATH.normalize(paths.join('/')); - },join2:function(l, r) { - return PATH.normalize(l + '/' + r); - }}; - - function getRandomDevice() { - if (typeof crypto === 'object' && typeof crypto['getRandomValues'] === 'function') { - // for modern web browsers - var randomBuffer = new Uint8Array(1); - return function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; - } else - if (ENVIRONMENT_IS_NODE) { - // for nodejs with or without crypto support included - try { - var crypto_module = require('crypto'); - // nodejs has crypto support - return function() { return crypto_module['randomBytes'](1)[0]; }; - } catch (e) { - // nodejs doesn't have crypto support - } - } - // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 - return function() { abort("no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };"); }; - } - - var PATH_FS = {resolve:function() { - var resolvedPath = '', - resolvedAbsolute = false; - for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { - var path = (i >= 0) ? arguments[i] : FS.cwd(); - // Skip empty and invalid entries - if (typeof path !== 'string') { - throw new TypeError('Arguments to path.resolve must be strings'); - } else if (!path) { - return ''; // an invalid portion invalidates the whole thing - } - resolvedPath = path + '/' + resolvedPath; - resolvedAbsolute = path.charAt(0) === '/'; - } - // At this point the path should be resolved to a full absolute path, but - // handle relative paths to be safe (might happen when process.cwd() fails) - resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { - return !!p; - }), !resolvedAbsolute).join('/'); - return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; - },relative:function(from, to) { - from = PATH_FS.resolve(from).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (; start < arr.length; start++) { - if (arr[start] !== '') break; - } - var end = arr.length - 1; - for (; end >= 0; end--) { - if (arr[end] !== '') break; - } - if (start > end) return []; - return arr.slice(start, end - start + 1); - } - var fromParts = trim(from.split('/')); - var toParts = trim(to.split('/')); - var length = Math.min(fromParts.length, toParts.length); - var samePartsLength = length; - for (var i = 0; i < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push('..'); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join('/'); - }}; - - var TTY = {ttys:[],init:function () { - // https://github.com/emscripten-core/emscripten/pull/1555 - // if (ENVIRONMENT_IS_NODE) { - // // currently, FS.init does not distinguish if process.stdin is a file or TTY - // // device, it always assumes it's a TTY device. because of this, we're forcing - // // process.stdin to UTF8 encoding to at least make stdin reading compatible - // // with text files until FS.init can be refactored. - // process['stdin']['setEncoding']('utf8'); - // } - },shutdown:function() { - // https://github.com/emscripten-core/emscripten/pull/1555 - // if (ENVIRONMENT_IS_NODE) { - // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? - // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation - // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? - // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle - // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call - // process['stdin']['pause'](); - // } - },register:function(dev, ops) { - TTY.ttys[dev] = { input: [], output: [], ops: ops }; - FS.registerDevice(dev, TTY.stream_ops); - },stream_ops:{open:function(stream) { - var tty = TTY.ttys[stream.node.rdev]; - if (!tty) { - throw new FS.ErrnoError(43); - } - stream.tty = tty; - stream.seekable = false; - },close:function(stream) { - // flush any pending line data - stream.tty.ops.flush(stream.tty); - },flush:function(stream) { - stream.tty.ops.flush(stream.tty); - },read:function(stream, buffer, offset, length, pos /* ignored */) { - if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset+i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - },write:function(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset+i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - }},default_tty_ops:{get_char:function(tty) { - if (!tty.input.length) { - var result = null; - if (ENVIRONMENT_IS_NODE) { - // we will read data by chunks of BUFSIZE - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - - try { - bytesRead = fs.readSync(process.stdin.fd, buf, 0, BUFSIZE, null); - } catch(e) { - // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, - // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. - if (e.toString().includes('EOF')) bytesRead = 0; - else throw e; - } - - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString('utf-8'); - } else { - result = null; - } - } else - if (typeof window != 'undefined' && - typeof window.prompt == 'function') { - // Browser. - result = window.prompt('Input: '); // returns null on cancel - if (result !== null) { - result += '\n'; - } - } else if (typeof readline == 'function') { - // Command line. - result = readline(); - if (result !== null) { - result += '\n'; - } - } - if (!result) { - return null; - } - tty.input = intArrayFromString(result, true); - } - return tty.input.shift(); - },put_char:function(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. - } - },flush:function(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - }},default_tty1_ops:{put_char:function(tty, val) { - if (val === null || val === 10) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - },flush:function(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - }}}; - - function zeroMemory(address, size) { - HEAPU8.fill(0, address, address + size); - } - - function alignMemory(size, alignment) { - assert(alignment, "alignment argument is required"); - return Math.ceil(size / alignment) * alignment; - } - function mmapAlloc(size) { - abort('internal error: mmapAlloc called but `memalign` native symbol not exported'); - } - var MEMFS = {ops_table:null,mount:function(mount) { - return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); - },createNode:function(parent, name, mode, dev) { - if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { - // no supported - throw new FS.ErrnoError(63); - } - if (!MEMFS.ops_table) { - MEMFS.ops_table = { - dir: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr, - lookup: MEMFS.node_ops.lookup, - mknod: MEMFS.node_ops.mknod, - rename: MEMFS.node_ops.rename, - unlink: MEMFS.node_ops.unlink, - rmdir: MEMFS.node_ops.rmdir, - readdir: MEMFS.node_ops.readdir, - symlink: MEMFS.node_ops.symlink - }, - stream: { - llseek: MEMFS.stream_ops.llseek - } - }, - file: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr - }, - stream: { - llseek: MEMFS.stream_ops.llseek, - read: MEMFS.stream_ops.read, - write: MEMFS.stream_ops.write, - allocate: MEMFS.stream_ops.allocate, - mmap: MEMFS.stream_ops.mmap, - msync: MEMFS.stream_ops.msync - } - }, - link: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr, - readlink: MEMFS.node_ops.readlink - }, - stream: {} - }, - chrdev: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr - }, - stream: FS.chrdev_stream_ops - } - }; - } - var node = FS.createNode(parent, name, mode, dev); - if (FS.isDir(node.mode)) { - node.node_ops = MEMFS.ops_table.dir.node; - node.stream_ops = MEMFS.ops_table.dir.stream; - node.contents = {}; - } else if (FS.isFile(node.mode)) { - node.node_ops = MEMFS.ops_table.file.node; - node.stream_ops = MEMFS.ops_table.file.stream; - node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. - // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred - // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size - // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. - node.contents = null; - } else if (FS.isLink(node.mode)) { - node.node_ops = MEMFS.ops_table.link.node; - node.stream_ops = MEMFS.ops_table.link.stream; - } else if (FS.isChrdev(node.mode)) { - node.node_ops = MEMFS.ops_table.chrdev.node; - node.stream_ops = MEMFS.ops_table.chrdev.stream; - } - node.timestamp = Date.now(); - // add the new node to the parent - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - },getFileDataAsTypedArray:function(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. - return new Uint8Array(node.contents); - },expandFileStorage:function(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. - // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. - // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to - // avoid overshooting the allocation cap by a very large margin. - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); // Allocate new storage. - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. - },resizeFileStorage:function(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; // Fully decommit when requesting a resize to zero. - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); // Allocate new storage. - if (oldContents) { - node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. - } - node.usedBytes = newSize; - } - },node_ops:{getattr:function(node) { - var attr = {}; - // device numbers reuse inode numbers. - attr.dev = FS.isChrdev(node.mode) ? node.id : 1; - attr.ino = node.id; - attr.mode = node.mode; - attr.nlink = 1; - attr.uid = 0; - attr.gid = 0; - attr.rdev = node.rdev; - if (FS.isDir(node.mode)) { - attr.size = 4096; - } else if (FS.isFile(node.mode)) { - attr.size = node.usedBytes; - } else if (FS.isLink(node.mode)) { - attr.size = node.link.length; - } else { - attr.size = 0; - } - attr.atime = new Date(node.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), - // but this is not required by the standard. - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - },setattr:function(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - },lookup:function(parent, name) { - throw FS.genericErrors[44]; - },mknod:function(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - },rename:function(old_node, new_dir, new_name) { - // if we're overwriting a directory at new_name, make sure it's empty. - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) { - } - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - // do the internal rewiring - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now() - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - old_node.parent = new_dir; - },unlink:function(parent, name) { - delete parent.contents[name]; - parent.timestamp = Date.now(); - },rmdir:function(parent, name) { - var node = FS.lookupNode(parent, name); - for (var i in node.contents) { - throw new FS.ErrnoError(55); - } - delete parent.contents[name]; - parent.timestamp = Date.now(); - },readdir:function(node) { - var entries = ['.', '..']; - for (var key in node.contents) { - if (!node.contents.hasOwnProperty(key)) { - continue; - } - entries.push(key); - } - return entries; - },symlink:function(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); - node.link = oldpath; - return node; - },readlink:function(node) { - if (!FS.isLink(node.mode)) { - throw new FS.ErrnoError(28); - } - return node.link; - }},stream_ops:{read:function(stream, buffer, offset, length, position) { - var contents = stream.node.contents; - if (position >= stream.node.usedBytes) return 0; - var size = Math.min(stream.node.usedBytes - position, length); - assert(size >= 0); - if (size > 8 && contents.subarray) { // non-trivial, and typed array - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - return size; - },write:function(stream, buffer, offset, length, position, canOwn) { - // The data buffer should be a typed array view - assert(!(buffer instanceof ArrayBuffer)); - - if (!length) return 0; - var node = stream.node; - node.timestamp = Date.now(); - - if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? - if (canOwn) { - assert(position === 0, 'canOwn must imply no weird position inside the file'); - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - - // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. - MEMFS.expandFileStorage(node, position+length); - if (node.contents.subarray && buffer.subarray) { - // Use typed array write which is available. - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. - } - } - node.usedBytes = Math.max(node.usedBytes, position + length); - return length; - },llseek:function(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - position += stream.node.usedBytes; - } - } - if (position < 0) { - throw new FS.ErrnoError(28); - } - return position; - },allocate:function(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - },mmap:function(stream, address, length, position, prot, flags) { - if (address !== 0) { - // We don't currently support location hints for the address of the mapping - throw new FS.ErrnoError(28); - } - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - var ptr; - var allocated; - var contents = stream.node.contents; - // Only make a new copy when MAP_PRIVATE is specified. - if (!(flags & 2) && contents.buffer === buffer) { - // We can't emulate MAP_SHARED when the file is not backed by the buffer - // we're mapping to (e.g. the HEAP buffer). - allocated = false; - ptr = contents.byteOffset; - } else { - // Try to avoid unnecessary slices. - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call(contents, position, position + length); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { ptr: ptr, allocated: allocated }; - },msync:function(stream, buffer, offset, length, mmapFlags) { - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (mmapFlags & 2) { - // MAP_PRIVATE calls need not to be synced back to underlying fs - return 0; - } - - var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - // should we check if bytesWritten and length are the same? - return 0; - }}}; - - function asyncLoad(url, onload, onerror, noRunDep) { - var dep = !noRunDep ? getUniqueRunDependency('al ' + url) : ''; - readAsync(url, function(arrayBuffer) { - assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, function(event) { - if (onerror) { - onerror(); - } else { - throw 'Loading data file "' + url + '" failed.'; - } - }); - if (dep) addRunDependency(dep); - } - - var ERRNO_MESSAGES = {0:"Success",1:"Arg list too long",2:"Permission denied",3:"Address already in use",4:"Address not available",5:"Address family not supported by protocol family",6:"No more processes",7:"Socket already connected",8:"Bad file number",9:"Trying to read unreadable message",10:"Mount device busy",11:"Operation canceled",12:"No children",13:"Connection aborted",14:"Connection refused",15:"Connection reset by peer",16:"File locking deadlock error",17:"Destination address required",18:"Math arg out of domain of func",19:"Quota exceeded",20:"File exists",21:"Bad address",22:"File too large",23:"Host is unreachable",24:"Identifier removed",25:"Illegal byte sequence",26:"Connection already in progress",27:"Interrupted system call",28:"Invalid argument",29:"I/O error",30:"Socket is already connected",31:"Is a directory",32:"Too many symbolic links",33:"Too many open files",34:"Too many links",35:"Message too long",36:"Multihop attempted",37:"File or path name too long",38:"Network interface is not configured",39:"Connection reset by network",40:"Network is unreachable",41:"Too many open files in system",42:"No buffer space available",43:"No such device",44:"No such file or directory",45:"Exec format error",46:"No record locks available",47:"The link has been severed",48:"Not enough core",49:"No message of desired type",50:"Protocol not available",51:"No space left on device",52:"Function not implemented",53:"Socket is not connected",54:"Not a directory",55:"Directory not empty",56:"State not recoverable",57:"Socket operation on non-socket",59:"Not a typewriter",60:"No such device or address",61:"Value too large for defined data type",62:"Previous owner died",63:"Not super-user",64:"Broken pipe",65:"Protocol error",66:"Unknown protocol",67:"Protocol wrong type for socket",68:"Math result not representable",69:"Read only file system",70:"Illegal seek",71:"No such process",72:"Stale file handle",73:"Connection timed out",74:"Text file busy",75:"Cross-device link",100:"Device not a stream",101:"Bad font file fmt",102:"Invalid slot",103:"Invalid request code",104:"No anode",105:"Block device required",106:"Channel number out of range",107:"Level 3 halted",108:"Level 3 reset",109:"Link number out of range",110:"Protocol driver not attached",111:"No CSI structure available",112:"Level 2 halted",113:"Invalid exchange",114:"Invalid request descriptor",115:"Exchange full",116:"No data (for no delay io)",117:"Timer expired",118:"Out of streams resources",119:"Machine is not on the network",120:"Package not installed",121:"The object is remote",122:"Advertise error",123:"Srmount error",124:"Communication error on send",125:"Cross mount point (not really error)",126:"Given log. name not unique",127:"f.d. invalid for this operation",128:"Remote address changed",129:"Can access a needed shared lib",130:"Accessing a corrupted shared lib",131:".lib section in a.out corrupted",132:"Attempting to link in too many libs",133:"Attempting to exec a shared library",135:"Streams pipe error",136:"Too many users",137:"Socket type not supported",138:"Not supported",139:"Protocol family not supported",140:"Can't send after socket shutdown",141:"Too many references",142:"Host is down",148:"No medium (in tape drive)",156:"Level 2 not synchronized"}; - - var ERRNO_CODES = {}; - var FS = {root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(path, opts = {}) { - path = PATH_FS.resolve(FS.cwd(), path); - - if (!path) return { path: '', node: null }; - - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - for (var key in defaults) { - if (opts[key] === undefined) { - opts[key] = defaults[key]; - } - } - - if (opts.recurse_count > 8) { // max recursive lookup of 8 - throw new FS.ErrnoError(32); - } - - // split the path - var parts = PATH.normalizeArray(path.split('/').filter(function(p) { - return !!p; - }), false); - - // start at the root - var current = FS.root; - var current_path = '/'; - - for (var i = 0; i < parts.length; i++) { - var islast = (i === parts.length-1); - if (islast && opts.parent) { - // stop resolving - break; - } - - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - - // jump to the mount's root node if this is a mountpoint - if (FS.isMountpoint(current)) { - if (!islast || (islast && opts.follow_mount)) { - current = current.mounted.root; - } - } - - // by default, lookupPath will not follow a symlink if it is the final path component. - // setting opts.follow = true will override this behavior. - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - - var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); - current = lookup.node; - - if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). - throw new FS.ErrnoError(32); - } - } - } - } - - return { path: current_path, node: current }; - },getPath:function(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; - } - path = path ? node.name + '/' + path : node.name; - node = node.parent; - } - },hashName:function(parentid, name) { - var hash = 0; - - for (var i = 0; i < name.length; i++) { - hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; - } - return ((parentid + hash) >>> 0) % FS.nameTable.length; - },hashAddNode:function(node) { - var hash = FS.hashName(node.parent.id, node.name); - node.name_next = FS.nameTable[hash]; - FS.nameTable[hash] = node; - },hashRemoveNode:function(node) { - var hash = FS.hashName(node.parent.id, node.name); - if (FS.nameTable[hash] === node) { - FS.nameTable[hash] = node.name_next; - } else { - var current = FS.nameTable[hash]; - while (current) { - if (current.name_next === node) { - current.name_next = node.name_next; - break; - } - current = current.name_next; - } - } - },lookupNode:function(parent, name) { - var errCode = FS.mayLookup(parent); - if (errCode) { - throw new FS.ErrnoError(errCode, parent); - } - var hash = FS.hashName(parent.id, name); - for (var node = FS.nameTable[hash]; node; node = node.name_next) { - var nodeName = node.name; - if (node.parent.id === parent.id && nodeName === name) { - return node; - } - } - // if we failed to find it in the cache, call into the VFS - return FS.lookup(parent, name); - },createNode:function(parent, name, mode, rdev) { - assert(typeof parent === 'object') - var node = new FS.FSNode(parent, name, mode, rdev); - - FS.hashAddNode(node); - - return node; - },destroyNode:function(node) { - FS.hashRemoveNode(node); - },isRoot:function(node) { - return node === node.parent; - },isMountpoint:function(node) { - return !!node.mounted; - },isFile:function(mode) { - return (mode & 61440) === 32768; - },isDir:function(mode) { - return (mode & 61440) === 16384; - },isLink:function(mode) { - return (mode & 61440) === 40960; - },isChrdev:function(mode) { - return (mode & 61440) === 8192; - },isBlkdev:function(mode) { - return (mode & 61440) === 24576; - },isFIFO:function(mode) { - return (mode & 61440) === 4096; - },isSocket:function(mode) { - return (mode & 49152) === 49152; - },flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:function(str) { - var flags = FS.flagModes[str]; - if (typeof flags === 'undefined') { - throw new Error('Unknown file open mode: ' + str); - } - return flags; - },flagsToPermissionString:function(flag) { - var perms = ['r', 'w', 'rw'][flag & 3]; - if ((flag & 512)) { - perms += 'w'; - } - return perms; - },nodePermissions:function(node, perms) { - if (FS.ignorePermissions) { - return 0; - } - // return 0 if any user, group or owner bits are set. - if (perms.includes('r') && !(node.mode & 292)) { - return 2; - } else if (perms.includes('w') && !(node.mode & 146)) { - return 2; - } else if (perms.includes('x') && !(node.mode & 73)) { - return 2; - } - return 0; - },mayLookup:function(dir) { - var errCode = FS.nodePermissions(dir, 'x'); - if (errCode) return errCode; - if (!dir.node_ops.lookup) return 2; - return 0; - },mayCreate:function(dir, name) { - try { - var node = FS.lookupNode(dir, name); - return 20; - } catch (e) { - } - return FS.nodePermissions(dir, 'wx'); - },mayDelete:function(dir, name, isdir) { - var node; - try { - node = FS.lookupNode(dir, name); - } catch (e) { - return e.errno; - } - var errCode = FS.nodePermissions(dir, 'wx'); - if (errCode) { - return errCode; - } - if (isdir) { - if (!FS.isDir(node.mode)) { - return 54; - } - if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { - return 10; - } - } else { - if (FS.isDir(node.mode)) { - return 31; - } - } - return 0; - },mayOpen:function(node, flags) { - if (!node) { - return 44; - } - if (FS.isLink(node.mode)) { - return 32; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write - (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - },MAX_OPEN_FDS:4096,nextfd:function(fd_start = 0, fd_end = FS.MAX_OPEN_FDS) { - for (var fd = fd_start; fd <= fd_end; fd++) { - if (!FS.streams[fd]) { - return fd; - } - } - throw new FS.ErrnoError(33); - },getStream:function(fd) { - return FS.streams[fd]; - },createStream:function(stream, fd_start, fd_end) { - if (!FS.FSStream) { - FS.FSStream = /** @constructor */ function(){}; - FS.FSStream.prototype = { - object: { - get: function() { return this.node; }, - set: function(val) { this.node = val; } - }, - isRead: { - get: function() { return (this.flags & 2097155) !== 1; } - }, - isWrite: { - get: function() { return (this.flags & 2097155) !== 0; } - }, - isAppend: { - get: function() { return (this.flags & 1024); } - } - }; - } - // clone it, so we can return an instance of FSStream - var newStream = new FS.FSStream(); - for (var p in stream) { - newStream[p] = stream[p]; - } - stream = newStream; - var fd = FS.nextfd(fd_start, fd_end); - stream.fd = fd; - FS.streams[fd] = stream; - return stream; - },closeStream:function(fd) { - FS.streams[fd] = null; - },chrdev_stream_ops:{open:function(stream) { - var device = FS.getDevice(stream.node.rdev); - // override node's stream ops with the device's - stream.stream_ops = device.stream_ops; - // forward the open call - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - },llseek:function() { - throw new FS.ErrnoError(70); - }},major:function(dev) { - return ((dev) >> 8); - },minor:function(dev) { - return ((dev) & 0xff); - },makedev:function(ma, mi) { - return ((ma) << 8 | (mi)); - },registerDevice:function(dev, ops) { - FS.devices[dev] = { stream_ops: ops }; - },getDevice:function(dev) { - return FS.devices[dev]; - },getMounts:function(mount) { - var mounts = []; - var check = [mount]; - - while (check.length) { - var m = check.pop(); - - mounts.push(m); - - check.push.apply(check, m.mounts); - } - - return mounts; - },syncfs:function(populate, callback) { - if (typeof(populate) === 'function') { - callback = populate; - populate = false; - } - - FS.syncFSRequests++; - - if (FS.syncFSRequests > 1) { - err('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work'); - } - - var mounts = FS.getMounts(FS.root.mount); - var completed = 0; - - function doCallback(errCode) { - assert(FS.syncFSRequests > 0); - FS.syncFSRequests--; - return callback(errCode); - } - - function done(errCode) { - if (errCode) { - if (!done.errored) { - done.errored = true; - return doCallback(errCode); - } - return; - } - if (++completed >= mounts.length) { - doCallback(null); - } - }; - - // sync all mounts - mounts.forEach(function (mount) { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - },mount:function(type, opts, mountpoint) { - if (typeof type === 'string') { - // The filesystem was not included, and instead we have an error - // message stored in the variable. - throw type; - } - var root = mountpoint === '/'; - var pseudo = !mountpoint; - var node; - - if (root && FS.root) { - throw new FS.ErrnoError(10); - } else if (!root && !pseudo) { - var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - - mountpoint = lookup.path; // use the absolute path - node = lookup.node; - - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); - } - - if (!FS.isDir(node.mode)) { - throw new FS.ErrnoError(54); - } - } - - var mount = { - type: type, - opts: opts, - mountpoint: mountpoint, - mounts: [] - }; - - // create a root node for the fs - var mountRoot = type.mount(mount); - mountRoot.mount = mount; - mount.root = mountRoot; - - if (root) { - FS.root = mountRoot; - } else if (node) { - // set as a mountpoint - node.mounted = mount; - - // add the new mount to the current mount's children - if (node.mount) { - node.mount.mounts.push(mount); - } - } - - return mountRoot; - },unmount:function (mountpoint) { - var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - - if (!FS.isMountpoint(lookup.node)) { - throw new FS.ErrnoError(28); - } - - // destroy the nodes for this mount, and all its child mounts - var node = lookup.node; - var mount = node.mounted; - var mounts = FS.getMounts(mount); - - Object.keys(FS.nameTable).forEach(function (hash) { - var current = FS.nameTable[hash]; - - while (current) { - var next = current.name_next; - - if (mounts.includes(current.mount)) { - FS.destroyNode(current); - } - - current = next; - } - }); - - // no longer a mountpoint - node.mounted = null; - - // remove this mount from the child mounts - var idx = node.mount.mounts.indexOf(mount); - assert(idx !== -1); - node.mount.mounts.splice(idx, 1); - },lookup:function(parent, name) { - return parent.node_ops.lookup(parent, name); - },mknod:function(path, mode, dev) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - if (!name || name === '.' || name === '..') { - throw new FS.ErrnoError(28); - } - var errCode = FS.mayCreate(parent, name); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.mknod) { - throw new FS.ErrnoError(63); - } - return parent.node_ops.mknod(parent, name, mode, dev); - },create:function(path, mode) { - mode = mode !== undefined ? mode : 438 /* 0666 */; - mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - },mkdir:function(path, mode) { - mode = mode !== undefined ? mode : 511 /* 0777 */; - mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - },mkdirTree:function(path, mode) { - var dirs = path.split('/'); - var d = ''; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += '/' + dirs[i]; - try { - FS.mkdir(d, mode); - } catch(e) { - if (e.errno != 20) throw e; - } - } - },mkdev:function(path, mode, dev) { - if (typeof(dev) === 'undefined') { - dev = mode; - mode = 438 /* 0666 */; - } - mode |= 8192; - return FS.mknod(path, mode, dev); - },symlink:function(oldpath, newpath) { - if (!PATH_FS.resolve(oldpath)) { - throw new FS.ErrnoError(44); - } - var lookup = FS.lookupPath(newpath, { parent: true }); - var parent = lookup.node; - if (!parent) { - throw new FS.ErrnoError(44); - } - var newname = PATH.basename(newpath); - var errCode = FS.mayCreate(parent, newname); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.symlink) { - throw new FS.ErrnoError(63); - } - return parent.node_ops.symlink(parent, newname, oldpath); - },rename:function(old_path, new_path) { - var old_dirname = PATH.dirname(old_path); - var new_dirname = PATH.dirname(new_path); - var old_name = PATH.basename(old_path); - var new_name = PATH.basename(new_path); - // parents must exist - var lookup, old_dir, new_dir; - - // let the errors from non existant directories percolate up - lookup = FS.lookupPath(old_path, { parent: true }); - old_dir = lookup.node; - lookup = FS.lookupPath(new_path, { parent: true }); - new_dir = lookup.node; - - if (!old_dir || !new_dir) throw new FS.ErrnoError(44); - // need to be part of the same mount - if (old_dir.mount !== new_dir.mount) { - throw new FS.ErrnoError(75); - } - // source must exist - var old_node = FS.lookupNode(old_dir, old_name); - // old path should not be an ancestor of the new path - var relative = PATH_FS.relative(old_path, new_dirname); - if (relative.charAt(0) !== '.') { - throw new FS.ErrnoError(28); - } - // new path should not be an ancestor of the old path - relative = PATH_FS.relative(new_path, old_dirname); - if (relative.charAt(0) !== '.') { - throw new FS.ErrnoError(55); - } - // see if the new path already exists - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) { - // not fatal - } - // early out if nothing needs to change - if (old_node === new_node) { - return; - } - // we'll need to delete the old entry - var isdir = FS.isDir(old_node.mode); - var errCode = FS.mayDelete(old_dir, old_name, isdir); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - // need delete permissions if we'll be overwriting. - // need create permissions if new doesn't already exist. - errCode = new_node ? - FS.mayDelete(new_dir, new_name, isdir) : - FS.mayCreate(new_dir, new_name); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!old_dir.node_ops.rename) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { - throw new FS.ErrnoError(10); - } - // if we are going to change the parent, check write permissions - if (new_dir !== old_dir) { - errCode = FS.nodePermissions(old_dir, 'w'); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - } - // remove the node from the lookup hash - FS.hashRemoveNode(old_node); - // do the underlying fs rename - try { - old_dir.node_ops.rename(old_node, new_dir, new_name); - } catch (e) { - throw e; - } finally { - // add the node back to the hash (in case node_ops.rename - // changed its name) - FS.hashAddNode(old_node); - } - },rmdir:function(path) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - var node = FS.lookupNode(parent, name); - var errCode = FS.mayDelete(parent, name, true); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.rmdir) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); - } - parent.node_ops.rmdir(parent, name); - FS.destroyNode(node); - },readdir:function(path) { - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.readdir(node); - },unlink:function(path) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - if (!parent) { - throw new FS.ErrnoError(44); - } - var name = PATH.basename(path); - var node = FS.lookupNode(parent, name); - var errCode = FS.mayDelete(parent, name, false); - if (errCode) { - // According to POSIX, we should map EISDIR to EPERM, but - // we instead do what Linux does (and we must, as we use - // the musl linux libc). - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.unlink) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); - } - parent.node_ops.unlink(parent, name); - FS.destroyNode(node); - },readlink:function(path) { - var lookup = FS.lookupPath(path); - var link = lookup.node; - if (!link) { - throw new FS.ErrnoError(44); - } - if (!link.node_ops.readlink) { - throw new FS.ErrnoError(28); - } - return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - },stat:function(path, dontFollow) { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - },lstat:function(path) { - return FS.stat(path, true); - },chmod:function(path, mode, dontFollow) { - var node; - if (typeof path === 'string') { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: (mode & 4095) | (node.mode & ~4095), - timestamp: Date.now() - }); - },lchmod:function(path, mode) { - FS.chmod(path, mode, true); - },fchmod:function(fd, mode) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - FS.chmod(stream.node, mode); - },chown:function(path, uid, gid, dontFollow) { - var node; - if (typeof path === 'string') { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - // we ignore the uid / gid for now - }); - },lchown:function(path, uid, gid) { - FS.chown(path, uid, gid, true); - },fchown:function(fd, uid, gid) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - FS.chown(stream.node, uid, gid); - },truncate:function(path, len) { - if (len < 0) { - throw new FS.ErrnoError(28); - } - var node; - if (typeof path === 'string') { - var lookup = FS.lookupPath(path, { follow: true }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - if (FS.isDir(node.mode)) { - throw new FS.ErrnoError(31); - } - if (!FS.isFile(node.mode)) { - throw new FS.ErrnoError(28); - } - var errCode = FS.nodePermissions(node, 'w'); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - },ftruncate:function(fd, len) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - },utime:function(path, atime, mtime) { - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - },open:function(path, flags, mode, fd_start, fd_end) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; - mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; - if ((flags & 64)) { - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path === 'object') { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) { - // ignore - } - } - // perhaps we need to create the node - var created = false; - if ((flags & 64)) { - if (node) { - // if O_CREAT and O_EXCL are set, error out if the node already exists - if ((flags & 128)) { - throw new FS.ErrnoError(20); - } - } else { - // node doesn't exist, try to create it - node = FS.mknod(path, mode, 0); - created = true; - } - } - if (!node) { - throw new FS.ErrnoError(44); - } - // can't truncate a device - if (FS.isChrdev(node.mode)) { - flags &= ~512; - } - // if asked only for a directory, then this must be one - if ((flags & 65536) && !FS.isDir(node.mode)) { - throw new FS.ErrnoError(54); - } - // check permissions, if this is not a file we just created now (it is ok to - // create and write to a file with read-only permissions; it is read-only - // for later use) - if (!created) { - var errCode = FS.mayOpen(node, flags); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - } - // do truncation if necessary - if ((flags & 512)) { - FS.truncate(node, 0); - } - // we've already handled these, don't pass down to the underlying vfs - flags &= ~(128 | 512 | 131072); - - // register the stream with the filesystem - var stream = FS.createStream({ - node: node, - path: FS.getPath(node), // we want the absolute path to the node - id: node.id, - flags: flags, - mode: node.mode, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - node_ops: node.node_ops, - // used by the file family libc calls (fopen, fwrite, ferror, etc.) - ungotten: [], - error: false - }, fd_start, fd_end); - // call the new stream's open function - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module['logReadFiles'] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - return stream; - },close:function(stream) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (stream.getdents) stream.getdents = null; // free readdir state - try { - if (stream.stream_ops.close) { - stream.stream_ops.close(stream); - } - } catch (e) { - throw e; - } finally { - FS.closeStream(stream.fd); - } - stream.fd = null; - },isClosed:function(stream) { - return stream.fd === null; - },llseek:function(stream, offset, whence) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (!stream.seekable || !stream.stream_ops.llseek) { - throw new FS.ErrnoError(70); - } - if (whence != 0 && whence != 1 && whence != 2) { - throw new FS.ErrnoError(28); - } - stream.position = stream.stream_ops.llseek(stream, offset, whence); - stream.ungotten = []; - return stream.position; - },read:function(stream, buffer, offset, length, position) { - if (length < 0 || position < 0) { - throw new FS.ErrnoError(28); - } - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 1) { - throw new FS.ErrnoError(8); - } - if (FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(31); - } - if (!stream.stream_ops.read) { - throw new FS.ErrnoError(28); - } - var seeking = typeof position !== 'undefined'; - if (!seeking) { - position = stream.position; - } else if (!stream.seekable) { - throw new FS.ErrnoError(70); - } - var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); - if (!seeking) stream.position += bytesRead; - return bytesRead; - },write:function(stream, buffer, offset, length, position, canOwn) { - if (length < 0 || position < 0) { - throw new FS.ErrnoError(28); - } - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(31); - } - if (!stream.stream_ops.write) { - throw new FS.ErrnoError(28); - } - if (stream.seekable && stream.flags & 1024) { - // seek to the end before writing in append mode - FS.llseek(stream, 0, 2); - } - var seeking = typeof position !== 'undefined'; - if (!seeking) { - position = stream.position; - } else if (!stream.seekable) { - throw new FS.ErrnoError(70); - } - var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); - if (!seeking) stream.position += bytesWritten; - return bytesWritten; - },allocate:function(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - },mmap:function(stream, address, length, position, prot, flags) { - // User requests writing to file (prot & PROT_WRITE != 0). - // Checking if we have permissions to write to the file unless - // MAP_PRIVATE flag is set. According to POSIX spec it is possible - // to write to file opened in read-only mode with MAP_PRIVATE flag, - // as all modifications will be visible only in the memory of - // the current process. - if ((prot & 2) !== 0 - && (flags & 2) === 0 - && (stream.flags & 2097155) !== 2) { - throw new FS.ErrnoError(2); - } - if ((stream.flags & 2097155) === 1) { - throw new FS.ErrnoError(2); - } - if (!stream.stream_ops.mmap) { - throw new FS.ErrnoError(43); - } - return stream.stream_ops.mmap(stream, address, length, position, prot, flags); - },msync:function(stream, buffer, offset, length, mmapFlags) { - if (!stream || !stream.stream_ops.msync) { - return 0; - } - return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); - },munmap:function(stream) { - return 0; - },ioctl:function(stream, cmd, arg) { - if (!stream.stream_ops.ioctl) { - throw new FS.ErrnoError(59); - } - return stream.stream_ops.ioctl(stream, cmd, arg); - },readFile:function(path, opts = {}) { - opts.flags = opts.flags || 0; - opts.encoding = opts.encoding || 'binary'; - if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { - throw new Error('Invalid encoding type "' + opts.encoding + '"'); - } - var ret; - var stream = FS.open(path, opts.flags); - var stat = FS.stat(path); - var length = stat.size; - var buf = new Uint8Array(length); - FS.read(stream, buf, 0, length, 0); - if (opts.encoding === 'utf8') { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === 'binary') { - ret = buf; - } - FS.close(stream); - return ret; - },writeFile:function(path, data, opts = {}) { - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data === 'string') { - var buf = new Uint8Array(lengthBytesUTF8(data)+1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error('Unsupported data type'); - } - FS.close(stream); - },cwd:function() { - return FS.currentPath; - },chdir:function(path) { - var lookup = FS.lookupPath(path, { follow: true }); - if (lookup.node === null) { - throw new FS.ErrnoError(44); - } - if (!FS.isDir(lookup.node.mode)) { - throw new FS.ErrnoError(54); - } - var errCode = FS.nodePermissions(lookup.node, 'x'); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - FS.currentPath = lookup.path; - },createDefaultDirectories:function() { - FS.mkdir('/tmp'); - FS.mkdir('/home'); - FS.mkdir('/home/web_user'); - },createDefaultDevices:function() { - // create /dev - FS.mkdir('/dev'); - // setup /dev/null - FS.registerDevice(FS.makedev(1, 3), { - read: function() { return 0; }, - write: function(stream, buffer, offset, length, pos) { return length; } - }); - FS.mkdev('/dev/null', FS.makedev(1, 3)); - // setup /dev/tty and /dev/tty1 - // stderr needs to print output using err() rather than out() - // so we register a second tty just for it. - TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); - TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); - FS.mkdev('/dev/tty', FS.makedev(5, 0)); - FS.mkdev('/dev/tty1', FS.makedev(6, 0)); - // setup /dev/[u]random - var random_device = getRandomDevice(); - FS.createDevice('/dev', 'random', random_device); - FS.createDevice('/dev', 'urandom', random_device); - // we're not going to emulate the actual shm device, - // just create the tmp dirs that reside in it commonly - FS.mkdir('/dev/shm'); - FS.mkdir('/dev/shm/tmp'); - },createSpecialDirectories:function() { - // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the - // name of the stream for fd 6 (see test_unistd_ttyname) - FS.mkdir('/proc'); - var proc_self = FS.mkdir('/proc/self'); - FS.mkdir('/proc/self/fd'); - FS.mount({ - mount: function() { - var node = FS.createNode(proc_self, 'fd', 16384 | 511 /* 0777 */, 73); - node.node_ops = { - lookup: function(parent, name) { - var fd = +name; - var stream = FS.getStream(fd); - if (!stream) throw new FS.ErrnoError(8); - var ret = { - parent: null, - mount: { mountpoint: 'fake' }, - node_ops: { readlink: function() { return stream.path } } - }; - ret.parent = ret; // make it look like a simple root node - return ret; - } - }; - return node; - } - }, {}, '/proc/self/fd'); - },createStandardStreams:function() { - // TODO deprecate the old functionality of a single - // input / output callback and that utilizes FS.createDevice - // and instead require a unique set of stream ops - - // by default, we symlink the standard streams to the - // default tty devices. however, if the standard streams - // have been overwritten we create a unique device for - // them instead. - if (Module['stdin']) { - FS.createDevice('/dev', 'stdin', Module['stdin']); - } else { - FS.symlink('/dev/tty', '/dev/stdin'); - } - if (Module['stdout']) { - FS.createDevice('/dev', 'stdout', null, Module['stdout']); - } else { - FS.symlink('/dev/tty', '/dev/stdout'); - } - if (Module['stderr']) { - FS.createDevice('/dev', 'stderr', null, Module['stderr']); - } else { - FS.symlink('/dev/tty1', '/dev/stderr'); - } - - // open default streams for the stdin, stdout and stderr devices - var stdin = FS.open('/dev/stdin', 0); - var stdout = FS.open('/dev/stdout', 1); - var stderr = FS.open('/dev/stderr', 1); - assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); - assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); - assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); - },ensureErrnoError:function() { - if (FS.ErrnoError) return; - FS.ErrnoError = /** @this{Object} */ function ErrnoError(errno, node) { - this.node = node; - this.setErrno = /** @this{Object} */ function(errno) { - this.errno = errno; - for (var key in ERRNO_CODES) { - if (ERRNO_CODES[key] === errno) { - this.code = key; - break; - } - } - }; - this.setErrno(errno); - this.message = ERRNO_MESSAGES[errno]; - - // Try to get a maximally helpful stack trace. On Node.js, getting Error.stack - // now ensures it shows what we want. - if (this.stack) { - // Define the stack property for Node.js 4, which otherwise errors on the next line. - Object.defineProperty(this, "stack", { value: (new Error).stack, writable: true }); - this.stack = demangleAll(this.stack); - } - }; - FS.ErrnoError.prototype = new Error(); - FS.ErrnoError.prototype.constructor = FS.ErrnoError; - // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) - [44].forEach(function(code) { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ''; - }); - },staticInit:function() { - FS.ensureErrnoError(); - - FS.nameTable = new Array(4096); - - FS.mount(MEMFS, {}, '/'); - - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - - FS.filesystems = { - 'MEMFS': MEMFS, - }; - },init:function(input, output, error) { - assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); - FS.init.initialized = true; - - FS.ensureErrnoError(); - - // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here - Module['stdin'] = input || Module['stdin']; - Module['stdout'] = output || Module['stdout']; - Module['stderr'] = error || Module['stderr']; - - FS.createStandardStreams(); - },quit:function() { - FS.init.initialized = false; - // force-flush all streams, so we get musl std streams printed out - _fflush(0); - // close all of our streams - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - FS.close(stream); - } - },getMode:function(canRead, canWrite) { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; - },findObject:function(path, dontResolveLastLink) { - var ret = FS.analyzePath(path, dontResolveLastLink); - if (ret.exists) { - return ret.object; - } else { - return null; - } - },analyzePath:function(path, dontResolveLastLink) { - // operate from within the context of the symlink's target - try { - var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); - path = lookup.path; - } catch (e) { - } - var ret = { - isRoot: false, exists: false, error: 0, name: null, path: null, object: null, - parentExists: false, parentPath: null, parentObject: null - }; - try { - var lookup = FS.lookupPath(path, { parent: true }); - ret.parentExists = true; - ret.parentPath = lookup.path; - ret.parentObject = lookup.node; - ret.name = PATH.basename(path); - lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); - ret.exists = true; - ret.path = lookup.path; - ret.object = lookup.node; - ret.name = lookup.node.name; - ret.isRoot = lookup.path === '/'; - } catch (e) { - ret.error = e.errno; - }; - return ret; - },createPath:function(parent, path, canRead, canWrite) { - parent = typeof parent === 'string' ? parent : FS.getPath(parent); - var parts = path.split('/').reverse(); - while (parts.length) { - var part = parts.pop(); - if (!part) continue; - var current = PATH.join2(parent, part); - try { - FS.mkdir(current); - } catch (e) { - // ignore EEXIST - } - parent = current; - } - return current; - },createFile:function(parent, name, properties, canRead, canWrite) { - var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); - var mode = FS.getMode(canRead, canWrite); - return FS.create(path, mode); - },createDataFile:function(parent, name, data, canRead, canWrite, canOwn) { - var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; - var mode = FS.getMode(canRead, canWrite); - var node = FS.create(path, mode); - if (data) { - if (typeof data === 'string') { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - // make sure we can write to the file - FS.chmod(node, mode | 146); - var stream = FS.open(node, 577); - FS.write(stream, data, 0, data.length, 0, canOwn); - FS.close(stream); - FS.chmod(node, mode); - } - return node; - },createDevice:function(parent, name, input, output) { - var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); - var mode = FS.getMode(!!input, !!output); - if (!FS.createDevice.major) FS.createDevice.major = 64; - var dev = FS.makedev(FS.createDevice.major++, 0); - // Create a fake device that a set of stream ops to emulate - // the old behavior. - FS.registerDevice(dev, { - open: function(stream) { - stream.seekable = false; - }, - close: function(stream) { - // flush any pending line data - if (output && output.buffer && output.buffer.length) { - output(10); - } - }, - read: function(stream, buffer, offset, length, pos /* ignored */) { - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset+i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write: function(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer[offset+i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - },forceLoadFile:function(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest !== 'undefined') { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (read_) { - // Command-line. - try { - // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as - // read() will try to parse UTF8. - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error('Cannot load without read() or XMLHttpRequest.'); - } - },createLazyFile:function(parent, name, url, canRead, canWrite) { - // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. - /** @constructor */ - function LazyUint8Array() { - this.lengthKnown = false; - this.chunks = []; // Loaded chunks. Index is the chunk number - } - LazyUint8Array.prototype.get = /** @this{Object} */ function LazyUint8Array_get(idx) { - if (idx > this.length-1 || idx < 0) { - return undefined; - } - var chunkOffset = idx % this.chunkSize; - var chunkNum = (idx / this.chunkSize)|0; - return this.getter(chunkNum)[chunkOffset]; - }; - LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { - this.getter = getter; - }; - LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { - // Find length - var xhr = new XMLHttpRequest(); - xhr.open('HEAD', url, false); - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - var datalength = Number(xhr.getResponseHeader("Content-length")); - var header; - var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; - var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; - - var chunkSize = 1024*1024; // Chunk size in bytes - - if (!hasByteServing) chunkSize = datalength; - - // Function to get a range from the remote URL. - var doXHR = (function(from, to) { - if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); - - // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); - - // Some hints to the browser that we want binary data. - if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; - if (xhr.overrideMimeType) { - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - } - - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(/** @type{Array} */(xhr.response || [])); - } else { - return intArrayFromString(xhr.responseText || '', true); - } - }); - var lazyArray = this; - lazyArray.setDataGetter(function(chunkNum) { - var start = chunkNum * chunkSize; - var end = (chunkNum+1) * chunkSize - 1; // including this byte - end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block - if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { - lazyArray.chunks[chunkNum] = doXHR(start, end); - } - if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); - return lazyArray.chunks[chunkNum]; - }); - - if (usesGzip || !datalength) { - // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length - chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file - datalength = this.getter(0).length; - chunkSize = datalength; - out("LazyFiles on gzip forces download of the whole file when length is accessed"); - } - - this._length = datalength; - this._chunkSize = chunkSize; - this.lengthKnown = true; - }; - if (typeof XMLHttpRequest !== 'undefined') { - if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; - var lazyArray = new LazyUint8Array(); - Object.defineProperties(lazyArray, { - length: { - get: /** @this{Object} */ function() { - if (!this.lengthKnown) { - this.cacheLength(); - } - return this._length; - } - }, - chunkSize: { - get: /** @this{Object} */ function() { - if (!this.lengthKnown) { - this.cacheLength(); - } - return this._chunkSize; - } - } - }); - - var properties = { isDevice: false, contents: lazyArray }; - } else { - var properties = { isDevice: false, url: url }; - } - - var node = FS.createFile(parent, name, properties, canRead, canWrite); - // This is a total hack, but I want to get this lazy file code out of the - // core of MEMFS. If we want to keep this lazy file concept I feel it should - // be its own thin LAZYFS proxying calls to MEMFS. - if (properties.contents) { - node.contents = properties.contents; - } else if (properties.url) { - node.contents = null; - node.url = properties.url; - } - // Add a function that defers querying the file size until it is asked the first time. - Object.defineProperties(node, { - usedBytes: { - get: /** @this {FSNode} */ function() { return this.contents.length; } - } - }); - // override each stream op with one that tries to force load the lazy file first - var stream_ops = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(function(key) { - var fn = node.stream_ops[key]; - stream_ops[key] = function forceLoadLazyFile() { - FS.forceLoadFile(node); - return fn.apply(null, arguments); - }; - }); - // use a custom read function - stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { - FS.forceLoadFile(node); - var contents = stream.node.contents; - if (position >= contents.length) - return 0; - var size = Math.min(contents.length - position, length); - assert(size >= 0); - if (contents.slice) { // normal array - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR - buffer[offset + i] = contents.get(position + i); - } - } - return size; - }; - node.stream_ops = stream_ops; - return node; - },createPreloadedFile:function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { - Browser.init(); // XXX perhaps this method should move onto Browser? - // TODO we should allow people to just pass in a complete filename instead - // of parent and name being that we just join them anyways - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname - function processData(byteArray) { - function finish(byteArray) { - if (preFinish) preFinish(); - if (!dontCreateFile) { - FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - if (onload) onload(); - removeRunDependency(dep); - } - var handled = false; - Module['preloadPlugins'].forEach(function(plugin) { - if (handled) return; - if (plugin['canHandle'](fullname)) { - plugin['handle'](byteArray, fullname, finish, function() { - if (onerror) onerror(); - removeRunDependency(dep); - }); - handled = true; - } - }); - if (!handled) finish(byteArray); - } - addRunDependency(dep); - if (typeof url == 'string') { - asyncLoad(url, function(byteArray) { - processData(byteArray); - }, onerror); - } else { - processData(url); - } - },indexedDB:function() { - return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; - },DB_NAME:function() { - return 'EM_FS_' + window.location.pathname; - },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function(paths, onload, onerror) { - onload = onload || function(){}; - onerror = onerror || function(){}; - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { - out('creating db'); - var db = openRequest.result; - db.createObjectStore(FS.DB_STORE_NAME); - }; - openRequest.onsuccess = function openRequest_onsuccess() { - var db = openRequest.result; - var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, fail = 0, total = paths.length; - function finish() { - if (fail == 0) onload(); else onerror(); - } - paths.forEach(function(path) { - var putRequest = files.put(FS.analyzePath(path).object.contents, path); - putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; - putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - },loadFilesFromDB:function(paths, onload, onerror) { - onload = onload || function(){}; - onerror = onerror || function(){}; - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = onerror; // no database to load from - openRequest.onsuccess = function openRequest_onsuccess() { - var db = openRequest.result; - try { - var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); - } catch(e) { - onerror(e); - return; - } - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, fail = 0, total = paths.length; - function finish() { - if (fail == 0) onload(); else onerror(); - } - paths.forEach(function(path) { - var getRequest = files.get(path); - getRequest.onsuccess = function getRequest_onsuccess() { - if (FS.analyzePath(path).exists) { - FS.unlink(path); - } - FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); - ok++; - if (ok + fail == total) finish(); - }; - getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - },absolutePath:function() { - abort('FS.absolutePath has been removed; use PATH_FS.resolve instead'); - },createFolder:function() { - abort('FS.createFolder has been removed; use FS.mkdir instead'); - },createLink:function() { - abort('FS.createLink has been removed; use FS.symlink instead'); - },joinPath:function() { - abort('FS.joinPath has been removed; use PATH.join instead'); - },mmapAlloc:function() { - abort('FS.mmapAlloc has been replaced by the top level function mmapAlloc'); - },standardizePath:function() { - abort('FS.standardizePath has been removed; use PATH.normalize instead'); - }}; - var SYSCALLS = {mappings:{},DEFAULT_POLLMASK:5,calculateAt:function(dirfd, path, allowEmpty) { - if (path[0] === '/') { - return path; - } - // relative path - var dir; - if (dirfd === -100) { - dir = FS.cwd(); - } else { - var dirstream = FS.getStream(dirfd); - if (!dirstream) throw new FS.ErrnoError(8); - dir = dirstream.path; - } - if (path.length == 0) { - if (!allowEmpty) { - throw new FS.ErrnoError(44);; - } - return dir; - } - return PATH.join2(dir, path); - },doStat:function(func, path, buf) { - try { - var stat = func(path); - } catch (e) { - if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { - // an error occurred while trying to look up the path; we should just report ENOTDIR - return -54; - } - throw e; - } - HEAP32[((buf)>>2)] = stat.dev; - HEAP32[(((buf)+(4))>>2)] = 0; - HEAP32[(((buf)+(8))>>2)] = stat.ino; - HEAP32[(((buf)+(12))>>2)] = stat.mode; - HEAP32[(((buf)+(16))>>2)] = stat.nlink; - HEAP32[(((buf)+(20))>>2)] = stat.uid; - HEAP32[(((buf)+(24))>>2)] = stat.gid; - HEAP32[(((buf)+(28))>>2)] = stat.rdev; - HEAP32[(((buf)+(32))>>2)] = 0; - (tempI64 = [stat.size>>>0,(tempDouble=stat.size,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(40))>>2)] = tempI64[0],HEAP32[(((buf)+(44))>>2)] = tempI64[1]); - HEAP32[(((buf)+(48))>>2)] = 4096; - HEAP32[(((buf)+(52))>>2)] = stat.blocks; - HEAP32[(((buf)+(56))>>2)] = (stat.atime.getTime() / 1000)|0; - HEAP32[(((buf)+(60))>>2)] = 0; - HEAP32[(((buf)+(64))>>2)] = (stat.mtime.getTime() / 1000)|0; - HEAP32[(((buf)+(68))>>2)] = 0; - HEAP32[(((buf)+(72))>>2)] = (stat.ctime.getTime() / 1000)|0; - HEAP32[(((buf)+(76))>>2)] = 0; - (tempI64 = [stat.ino>>>0,(tempDouble=stat.ino,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(80))>>2)] = tempI64[0],HEAP32[(((buf)+(84))>>2)] = tempI64[1]); - return 0; - },doMsync:function(addr, stream, len, flags, offset) { - var buffer = HEAPU8.slice(addr, addr + len); - FS.msync(stream, buffer, offset, len, flags); - },doMkdir:function(path, mode) { - // remove a trailing slash, if one - /a/b/ has basename of '', but - // we want to create b in the context of this function - path = PATH.normalize(path); - if (path[path.length-1] === '/') path = path.substr(0, path.length-1); - FS.mkdir(path, mode, 0); - return 0; - },doMknod:function(path, mode, dev) { - // we don't want this in the JS API as it uses mknod to create all nodes. - switch (mode & 61440) { - case 32768: - case 8192: - case 24576: - case 4096: - case 49152: - break; - default: return -28; - } - FS.mknod(path, mode, dev); - return 0; - },doReadlink:function(path, buf, bufsize) { - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf+len]; - stringToUTF8(ret, buf, bufsize+1); - // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) - // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. - HEAP8[buf+len] = endChar; - - return len; - },doAccess:function(path, amode) { - if (amode & ~7) { - // need a valid mode - return -28; - } - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - if (!node) { - return -44; - } - var perms = ''; - if (amode & 4) perms += 'r'; - if (amode & 2) perms += 'w'; - if (amode & 1) perms += 'x'; - if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - },doDup:function(path, flags, suggestFD) { - var suggest = FS.getStream(suggestFD); - if (suggest) FS.close(suggest); - return FS.open(path, flags, 0, suggestFD, suggestFD).fd; - },doReadv:function(stream, iov, iovcnt, offset) { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[(((iov)+(i*8))>>2)]; - var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; - var curr = FS.read(stream, HEAP8,ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; // nothing more to read - } - return ret; - },doWritev:function(stream, iov, iovcnt, offset) { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[(((iov)+(i*8))>>2)]; - var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; - var curr = FS.write(stream, HEAP8,ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - } - return ret; - },varargs:undefined,get:function() { - assert(SYSCALLS.varargs != undefined); - SYSCALLS.varargs += 4; - var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; - return ret; - },getStr:function(ptr) { - var ret = UTF8ToString(ptr); - return ret; - },getStreamFromFD:function(fd) { - var stream = FS.getStream(fd); - if (!stream) throw new FS.ErrnoError(8); - return stream; - },get64:function(low, high) { - if (low >= 0) assert(high === 0); - else assert(high === -1); - return low; - }}; - function _environ_get(__environ, environ_buf) { - var bufSize = 0; - getEnvStrings().forEach(function(string, i) { - var ptr = environ_buf + bufSize; - HEAP32[(((__environ)+(i * 4))>>2)] = ptr; - writeAsciiToMemory(string, ptr); - bufSize += string.length + 1; - }); - return 0; - } - - function _environ_sizes_get(penviron_count, penviron_buf_size) { - var strings = getEnvStrings(); - HEAP32[((penviron_count)>>2)] = strings.length; - var bufSize = 0; - strings.forEach(function(string) { - bufSize += string.length + 1; - }); - HEAP32[((penviron_buf_size)>>2)] = bufSize; - return 0; - } - - function _fd_close(fd) {try { - - var stream = SYSCALLS.getStreamFromFD(fd); - FS.close(stream); - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - function _fd_read(fd, iov, iovcnt, pnum) {try { - - var stream = SYSCALLS.getStreamFromFD(fd); - var num = SYSCALLS.doReadv(stream, iov, iovcnt); - HEAP32[((pnum)>>2)] = num; - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {try { - - - var stream = SYSCALLS.getStreamFromFD(fd); - var HIGH_OFFSET = 0x100000000; // 2^32 - // use an unsigned operator on low and shift high by 32-bits - var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); - - var DOUBLE_LIMIT = 0x20000000000000; // 2^53 - // we also check for equality since DOUBLE_LIMIT + 1 == DOUBLE_LIMIT - if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { - return -61; - } - - FS.llseek(stream, offset, whence); - (tempI64 = [stream.position>>>0,(tempDouble=stream.position,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((newOffset)>>2)] = tempI64[0],HEAP32[(((newOffset)+(4))>>2)] = tempI64[1]); - if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - function _fd_write(fd, iov, iovcnt, pnum) {try { - - ; - var stream = SYSCALLS.getStreamFromFD(fd); - var num = SYSCALLS.doWritev(stream, iov, iovcnt); - HEAP32[((pnum)>>2)] = num; - return 0; - } catch (e) { - if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - function _setTempRet0(val) { - setTempRet0(val); - } - - function __isLeapYear(year) { - return year%4 === 0 && (year%100 !== 0 || year%400 === 0); - } - - function __arraySum(array, index) { - var sum = 0; - for (var i = 0; i <= index; sum += array[i++]) { - // no-op - } - return sum; - } - - var __MONTH_DAYS_LEAP = [31,29,31,30,31,30,31,31,30,31,30,31]; - - var __MONTH_DAYS_REGULAR = [31,28,31,30,31,30,31,31,30,31,30,31]; - function __addDays(date, days) { - var newDate = new Date(date.getTime()); - while (days > 0) { - var leap = __isLeapYear(newDate.getFullYear()); - var currentMonth = newDate.getMonth(); - var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth]; - - if (days > daysInCurrentMonth-newDate.getDate()) { - // we spill over to next month - days -= (daysInCurrentMonth-newDate.getDate()+1); - newDate.setDate(1); - if (currentMonth < 11) { - newDate.setMonth(currentMonth+1) - } else { - newDate.setMonth(0); - newDate.setFullYear(newDate.getFullYear()+1); - } - } else { - // we stay in current month - newDate.setDate(newDate.getDate()+days); - return newDate; - } - } - - return newDate; - } - function _strftime(s, maxsize, format, tm) { - // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr); - // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html - - var tm_zone = HEAP32[(((tm)+(40))>>2)]; - - var date = { - tm_sec: HEAP32[((tm)>>2)], - tm_min: HEAP32[(((tm)+(4))>>2)], - tm_hour: HEAP32[(((tm)+(8))>>2)], - tm_mday: HEAP32[(((tm)+(12))>>2)], - tm_mon: HEAP32[(((tm)+(16))>>2)], - tm_year: HEAP32[(((tm)+(20))>>2)], - tm_wday: HEAP32[(((tm)+(24))>>2)], - tm_yday: HEAP32[(((tm)+(28))>>2)], - tm_isdst: HEAP32[(((tm)+(32))>>2)], - tm_gmtoff: HEAP32[(((tm)+(36))>>2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : '' - }; - - var pattern = UTF8ToString(format); - - // expand format - var EXPANSION_RULES_1 = { - '%c': '%a %b %d %H:%M:%S %Y', // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug 3 14:02:01 2013 - '%D': '%m/%d/%y', // Equivalent to %m / %d / %y - '%F': '%Y-%m-%d', // Equivalent to %Y - %m - %d - '%h': '%b', // Equivalent to %b - '%r': '%I:%M:%S %p', // Replaced by the time in a.m. and p.m. notation - '%R': '%H:%M', // Replaced by the time in 24-hour notation - '%T': '%H:%M:%S', // Replaced by the time - '%x': '%m/%d/%y', // Replaced by the locale's appropriate date representation - '%X': '%H:%M:%S', // Replaced by the locale's appropriate time representation - // Modified Conversion Specifiers - '%Ec': '%c', // Replaced by the locale's alternative appropriate date and time representation. - '%EC': '%C', // Replaced by the name of the base year (period) in the locale's alternative representation. - '%Ex': '%m/%d/%y', // Replaced by the locale's alternative date representation. - '%EX': '%H:%M:%S', // Replaced by the locale's alternative time representation. - '%Ey': '%y', // Replaced by the offset from %EC (year only) in the locale's alternative representation. - '%EY': '%Y', // Replaced by the full alternative year representation. - '%Od': '%d', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading zeros if there is any alternative symbol for zero; otherwise, with leading characters. - '%Oe': '%e', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading characters. - '%OH': '%H', // Replaced by the hour (24-hour clock) using the locale's alternative numeric symbols. - '%OI': '%I', // Replaced by the hour (12-hour clock) using the locale's alternative numeric symbols. - '%Om': '%m', // Replaced by the month using the locale's alternative numeric symbols. - '%OM': '%M', // Replaced by the minutes using the locale's alternative numeric symbols. - '%OS': '%S', // Replaced by the seconds using the locale's alternative numeric symbols. - '%Ou': '%u', // Replaced by the weekday as a number in the locale's alternative representation (Monday=1). - '%OU': '%U', // Replaced by the week number of the year (Sunday as the first day of the week, rules corresponding to %U ) using the locale's alternative numeric symbols. - '%OV': '%V', // Replaced by the week number of the year (Monday as the first day of the week, rules corresponding to %V ) using the locale's alternative numeric symbols. - '%Ow': '%w', // Replaced by the number of the weekday (Sunday=0) using the locale's alternative numeric symbols. - '%OW': '%W', // Replaced by the week number of the year (Monday as the first day of the week) using the locale's alternative numeric symbols. - '%Oy': '%y', // Replaced by the year (offset from %C ) using the locale's alternative numeric symbols. - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]); - } - - var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; - var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; - - function leadingSomething(value, digits, character) { - var str = typeof value === 'number' ? value.toString() : (value || ''); - while (str.length < digits) { - str = character[0]+str; - } - return str; - } - - function leadingNulls(value, digits) { - return leadingSomething(value, digits, '0'); - } - - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - - var compare; - if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) { - compare = sgn(date1.getDate()-date2.getDate()); - } - } - return compare; - } - - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: // Sunday - return new Date(janFourth.getFullYear()-1, 11, 29); - case 1: // Monday - return janFourth; - case 2: // Tuesday - return new Date(janFourth.getFullYear(), 0, 3); - case 3: // Wednesday - return new Date(janFourth.getFullYear(), 0, 2); - case 4: // Thursday - return new Date(janFourth.getFullYear(), 0, 1); - case 5: // Friday - return new Date(janFourth.getFullYear()-1, 11, 31); - case 6: // Saturday - return new Date(janFourth.getFullYear()-1, 11, 30); - } - } - - function getWeekBasedYear(date) { - var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); - - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4); - - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - // this date is after the start of the first week of this year - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear()+1; - } else { - return thisDate.getFullYear(); - } - } else { - return thisDate.getFullYear()-1; - } - } - - var EXPANSION_RULES_2 = { - '%a': function(date) { - return WEEKDAYS[date.tm_wday].substring(0,3); - }, - '%A': function(date) { - return WEEKDAYS[date.tm_wday]; - }, - '%b': function(date) { - return MONTHS[date.tm_mon].substring(0,3); - }, - '%B': function(date) { - return MONTHS[date.tm_mon]; - }, - '%C': function(date) { - var year = date.tm_year+1900; - return leadingNulls((year/100)|0,2); - }, - '%d': function(date) { - return leadingNulls(date.tm_mday, 2); - }, - '%e': function(date) { - return leadingSomething(date.tm_mday, 2, ' '); - }, - '%g': function(date) { - // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year. - // In this system, weeks begin on a Monday and week 1 of the year is the week that includes - // January 4th, which is also the week that includes the first Thursday of the year, and - // is also the first week that contains at least four days in the year. - // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of - // the last week of the preceding year; thus, for Saturday 2nd January 1999, - // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, - // or 31st is a Monday, it and any following days are part of week 1 of the following year. - // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01. - - return getWeekBasedYear(date).toString().substring(2); - }, - '%G': function(date) { - return getWeekBasedYear(date); - }, - '%H': function(date) { - return leadingNulls(date.tm_hour, 2); - }, - '%I': function(date) { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; - else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - '%j': function(date) { - // Day of the year (001-366) - return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3); - }, - '%m': function(date) { - return leadingNulls(date.tm_mon+1, 2); - }, - '%M': function(date) { - return leadingNulls(date.tm_min, 2); - }, - '%n': function() { - return '\n'; - }, - '%p': function(date) { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return 'AM'; - } else { - return 'PM'; - } - }, - '%S': function(date) { - return leadingNulls(date.tm_sec, 2); - }, - '%t': function() { - return '\t'; - }, - '%u': function(date) { - return date.tm_wday || 7; - }, - '%U': function(date) { - // Replaced by the week number of the year as a decimal number [00,53]. - // The first Sunday of January is the first day of week 1; - // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] - var janFirst = new Date(date.tm_year+1900, 0, 1); - var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7-janFirst.getDay()); - var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); - - // is target date after the first Sunday? - if (compareByDay(firstSunday, endDate) < 0) { - // calculate difference in days between first Sunday and endDate - var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; - var firstSundayUntilEndJanuary = 31-firstSunday.getDate(); - var days = firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); - return leadingNulls(Math.ceil(days/7), 2); - } - - return compareByDay(firstSunday, janFirst) === 0 ? '01': '00'; - }, - '%V': function(date) { - // Replaced by the week number of the year (Monday as the first day of the week) - // as a decimal number [01,53]. If the week containing 1 January has four - // or more days in the new year, then it is considered week 1. - // Otherwise, it is the last week of the previous year, and the next week is week 1. - // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday] - var janFourthThisYear = new Date(date.tm_year+1900, 0, 4); - var janFourthNextYear = new Date(date.tm_year+1901, 0, 4); - - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - - var endDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); - - if (compareByDay(endDate, firstWeekStartThisYear) < 0) { - // if given date is before this years first week, then it belongs to the 53rd week of last year - return '53'; - } - - if (compareByDay(firstWeekStartNextYear, endDate) <= 0) { - // if given date is after next years first week, then it belongs to the 01th week of next year - return '01'; - } - - // given date is in between CW 01..53 of this calendar year - var daysDifference; - if (firstWeekStartThisYear.getFullYear() < date.tm_year+1900) { - // first CW of this year starts last year - daysDifference = date.tm_yday+32-firstWeekStartThisYear.getDate() - } else { - // first CW of this year starts this year - daysDifference = date.tm_yday+1-firstWeekStartThisYear.getDate(); - } - return leadingNulls(Math.ceil(daysDifference/7), 2); - }, - '%w': function(date) { - return date.tm_wday; - }, - '%W': function(date) { - // Replaced by the week number of the year as a decimal number [00,53]. - // The first Monday of January is the first day of week 1; - // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] - var janFirst = new Date(date.tm_year, 0, 1); - var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7-janFirst.getDay()+1); - var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); - - // is target date after the first Monday? - if (compareByDay(firstMonday, endDate) < 0) { - var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; - var firstMondayUntilEndJanuary = 31-firstMonday.getDate(); - var days = firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); - return leadingNulls(Math.ceil(days/7), 2); - } - return compareByDay(firstMonday, janFirst) === 0 ? '01': '00'; - }, - '%y': function(date) { - // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year] - return (date.tm_year+1900).toString().substring(2); - }, - '%Y': function(date) { - // Replaced by the year as a decimal number (for example, 1997). [ tm_year] - return date.tm_year+1900; - }, - '%z': function(date) { - // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ). - // For example, "-0430" means 4 hours 30 minutes behind UTC (west of Greenwich). - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - // convert from minutes into hhmm format (which means 60 minutes = 100 units) - off = (off / 60)*100 + (off % 60); - return (ahead ? '+' : '-') + String("0000" + off).slice(-4); - }, - '%Z': function(date) { - return date.tm_zone; - }, - '%%': function() { - return '%'; - } - }; - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date)); - } - } - - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - - writeArrayToMemory(bytes, s); - return bytes.length-1; - } - function _strftime_l(s, maxsize, format, tm) { - return _strftime(s, maxsize, format, tm); // no locale support yet - } - - var FSNode = /** @constructor */ function(parent, name, mode, rdev) { - if (!parent) { - parent = this; // root node sets parent to itself - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - }; - var readMode = 292/*292*/ | 73/*73*/; - var writeMode = 146/*146*/; - Object.defineProperties(FSNode.prototype, { - read: { - get: /** @this{FSNode} */function() { - return (this.mode & readMode) === readMode; - }, - set: /** @this{FSNode} */function(val) { - val ? this.mode |= readMode : this.mode &= ~readMode; - } - }, - write: { - get: /** @this{FSNode} */function() { - return (this.mode & writeMode) === writeMode; - }, - set: /** @this{FSNode} */function(val) { - val ? this.mode |= writeMode : this.mode &= ~writeMode; - } - }, - isFolder: { - get: /** @this{FSNode} */function() { - return FS.isDir(this.mode); - } - }, - isDevice: { - get: /** @this{FSNode} */function() { - return FS.isChrdev(this.mode); - } - } - }); - FS.FSNode = FSNode; - FS.staticInit();; -ERRNO_CODES = { - 'EPERM': 63, - 'ENOENT': 44, - 'ESRCH': 71, - 'EINTR': 27, - 'EIO': 29, - 'ENXIO': 60, - 'E2BIG': 1, - 'ENOEXEC': 45, - 'EBADF': 8, - 'ECHILD': 12, - 'EAGAIN': 6, - 'EWOULDBLOCK': 6, - 'ENOMEM': 48, - 'EACCES': 2, - 'EFAULT': 21, - 'ENOTBLK': 105, - 'EBUSY': 10, - 'EEXIST': 20, - 'EXDEV': 75, - 'ENODEV': 43, - 'ENOTDIR': 54, - 'EISDIR': 31, - 'EINVAL': 28, - 'ENFILE': 41, - 'EMFILE': 33, - 'ENOTTY': 59, - 'ETXTBSY': 74, - 'EFBIG': 22, - 'ENOSPC': 51, - 'ESPIPE': 70, - 'EROFS': 69, - 'EMLINK': 34, - 'EPIPE': 64, - 'EDOM': 18, - 'ERANGE': 68, - 'ENOMSG': 49, - 'EIDRM': 24, - 'ECHRNG': 106, - 'EL2NSYNC': 156, - 'EL3HLT': 107, - 'EL3RST': 108, - 'ELNRNG': 109, - 'EUNATCH': 110, - 'ENOCSI': 111, - 'EL2HLT': 112, - 'EDEADLK': 16, - 'ENOLCK': 46, - 'EBADE': 113, - 'EBADR': 114, - 'EXFULL': 115, - 'ENOANO': 104, - 'EBADRQC': 103, - 'EBADSLT': 102, - 'EDEADLOCK': 16, - 'EBFONT': 101, - 'ENOSTR': 100, - 'ENODATA': 116, - 'ETIME': 117, - 'ENOSR': 118, - 'ENONET': 119, - 'ENOPKG': 120, - 'EREMOTE': 121, - 'ENOLINK': 47, - 'EADV': 122, - 'ESRMNT': 123, - 'ECOMM': 124, - 'EPROTO': 65, - 'EMULTIHOP': 36, - 'EDOTDOT': 125, - 'EBADMSG': 9, - 'ENOTUNIQ': 126, - 'EBADFD': 127, - 'EREMCHG': 128, - 'ELIBACC': 129, - 'ELIBBAD': 130, - 'ELIBSCN': 131, - 'ELIBMAX': 132, - 'ELIBEXEC': 133, - 'ENOSYS': 52, - 'ENOTEMPTY': 55, - 'ENAMETOOLONG': 37, - 'ELOOP': 32, - 'EOPNOTSUPP': 138, - 'EPFNOSUPPORT': 139, - 'ECONNRESET': 15, - 'ENOBUFS': 42, - 'EAFNOSUPPORT': 5, - 'EPROTOTYPE': 67, - 'ENOTSOCK': 57, - 'ENOPROTOOPT': 50, - 'ESHUTDOWN': 140, - 'ECONNREFUSED': 14, - 'EADDRINUSE': 3, - 'ECONNABORTED': 13, - 'ENETUNREACH': 40, - 'ENETDOWN': 38, - 'ETIMEDOUT': 73, - 'EHOSTDOWN': 142, - 'EHOSTUNREACH': 23, - 'EINPROGRESS': 26, - 'EALREADY': 7, - 'EDESTADDRREQ': 17, - 'EMSGSIZE': 35, - 'EPROTONOSUPPORT': 66, - 'ESOCKTNOSUPPORT': 137, - 'EADDRNOTAVAIL': 4, - 'ENETRESET': 39, - 'EISCONN': 30, - 'ENOTCONN': 53, - 'ETOOMANYREFS': 141, - 'EUSERS': 136, - 'EDQUOT': 19, - 'ESTALE': 72, - 'ENOTSUP': 138, - 'ENOMEDIUM': 148, - 'EILSEQ': 25, - 'EOVERFLOW': 61, - 'ECANCELED': 11, - 'ENOTRECOVERABLE': 56, - 'EOWNERDEAD': 62, - 'ESTRPIPE': 135, - };; -var ASSERTIONS = true; - - - -/** @type {function(string, boolean=, number=)} */ -function intArrayFromString(stringy, dontAddNull, length) { - var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; - var u8array = new Array(len); - var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); - if (dontAddNull) u8array.length = numBytesWritten; - return u8array; -} - -function intArrayToString(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - var chr = array[i]; - if (chr > 0xFF) { - if (ASSERTIONS) { - assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); - } - chr &= 0xFF; - } - ret.push(String.fromCharCode(chr)); - } - return ret.join(''); -} - - -var asmLibraryArg = { - "__cxa_allocate_exception": ___cxa_allocate_exception, - "__cxa_throw": ___cxa_throw, - "abort": _abort, - "emscripten_memcpy_big": _emscripten_memcpy_big, - "emscripten_resize_heap": _emscripten_resize_heap, - "environ_get": _environ_get, - "environ_sizes_get": _environ_sizes_get, - "fd_close": _fd_close, - "fd_read": _fd_read, - "fd_seek": _fd_seek, - "fd_write": _fd_write, - "setTempRet0": _setTempRet0, - "strftime_l": _strftime_l -}; -var asm = createWasm(); -/** @type {function(...*):?} */ -var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors"); - -/** @type {function(...*):?} */ -var _Encoder_new = Module["_Encoder_new"] = createExportWrapper("Encoder_new"); - -/** @type {function(...*):?} */ -var _Encoder_delete = Module["_Encoder_delete"] = createExportWrapper("Encoder_delete"); - -/** @type {function(...*):?} */ -var _Encoder_input = Module["_Encoder_input"] = createExportWrapper("Encoder_input"); - -/** @type {function(...*):?} */ -var _Encoder_output = Module["_Encoder_output"] = createExportWrapper("Encoder_output"); - -/** @type {function(...*):?} */ -var _Decoder_new = Module["_Decoder_new"] = createExportWrapper("Decoder_new"); - -/** @type {function(...*):?} */ -var _Decoder_delete = Module["_Decoder_delete"] = createExportWrapper("Decoder_delete"); - -/** @type {function(...*):?} */ -var _Decoder_input = Module["_Decoder_input"] = createExportWrapper("Decoder_input"); - -/** @type {function(...*):?} */ -var _Decoder_output = Module["_Decoder_output"] = createExportWrapper("Decoder_output"); - -/** @type {function(...*):?} */ -var _String_size = Module["_String_size"] = createExportWrapper("String_size"); - -/** @type {function(...*):?} */ -var _String_new = Module["_String_new"] = createExportWrapper("String_new"); - -/** @type {function(...*):?} */ -var _String_data = Module["_String_data"] = createExportWrapper("String_data"); - -/** @type {function(...*):?} */ -var _String_delete = Module["_String_delete"] = createExportWrapper("String_delete"); - -/** @type {function(...*):?} */ -var _Int16Array_size = Module["_Int16Array_size"] = createExportWrapper("Int16Array_size"); - -/** @type {function(...*):?} */ -var _Int16Array_new = Module["_Int16Array_new"] = createExportWrapper("Int16Array_new"); - -/** @type {function(...*):?} */ -var _Int16Array_data = Module["_Int16Array_data"] = createExportWrapper("Int16Array_data"); - -/** @type {function(...*):?} */ -var _Int16Array_delete = Module["_Int16Array_delete"] = createExportWrapper("Int16Array_delete"); - -/** @type {function(...*):?} */ -var _malloc = Module["_malloc"] = createExportWrapper("malloc"); - -/** @type {function(...*):?} */ -var _free = Module["_free"] = createExportWrapper("free"); - -/** @type {function(...*):?} */ -var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location"); - -/** @type {function(...*):?} */ -var _fflush = Module["_fflush"] = createExportWrapper("fflush"); - -/** @type {function(...*):?} */ -var _emscripten_stack_init = Module["_emscripten_stack_init"] = function() { - return (_emscripten_stack_init = Module["_emscripten_stack_init"] = Module["asm"]["emscripten_stack_init"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = function() { - return (_emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = function() { - return (_emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var stackSave = Module["stackSave"] = createExportWrapper("stackSave"); - -/** @type {function(...*):?} */ -var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore"); - -/** @type {function(...*):?} */ -var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc"); - -/** @type {function(...*):?} */ -var dynCall_viijii = Module["dynCall_viijii"] = createExportWrapper("dynCall_viijii"); - -/** @type {function(...*):?} */ -var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji"); - -/** @type {function(...*):?} */ -var dynCall_iiiiij = Module["dynCall_iiiiij"] = createExportWrapper("dynCall_iiiiij"); - -/** @type {function(...*):?} */ -var dynCall_iiiiijj = Module["dynCall_iiiiijj"] = createExportWrapper("dynCall_iiiiijj"); - -/** @type {function(...*):?} */ -var dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = createExportWrapper("dynCall_iiiiiijj"); - - - - - -// === Auto-generated postamble setup entry stuff === - -if (!Object.getOwnPropertyDescriptor(Module, "intArrayFromString")) Module["intArrayFromString"] = () => abort("'intArrayFromString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "intArrayToString")) Module["intArrayToString"] = () => abort("'intArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "ccall")) Module["ccall"] = () => abort("'ccall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "cwrap")) Module["cwrap"] = () => abort("'cwrap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setValue")) Module["setValue"] = () => abort("'setValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getValue")) Module["getValue"] = () => abort("'getValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "allocate")) Module["allocate"] = () => abort("'allocate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "UTF8ArrayToString")) Module["UTF8ArrayToString"] = () => abort("'UTF8ArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "UTF8ToString")) Module["UTF8ToString"] = () => abort("'UTF8ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8Array")) Module["stringToUTF8Array"] = () => abort("'stringToUTF8Array' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8")) Module["stringToUTF8"] = () => abort("'stringToUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF8")) Module["lengthBytesUTF8"] = () => abort("'lengthBytesUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = () => abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addOnPreRun")) Module["addOnPreRun"] = () => abort("'addOnPreRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addOnInit")) Module["addOnInit"] = () => abort("'addOnInit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addOnPreMain")) Module["addOnPreMain"] = () => abort("'addOnPreMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addOnExit")) Module["addOnExit"] = () => abort("'addOnExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addOnPostRun")) Module["addOnPostRun"] = () => abort("'addOnPostRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeStringToMemory")) Module["writeStringToMemory"] = () => abort("'writeStringToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeArrayToMemory")) Module["writeArrayToMemory"] = () => abort("'writeArrayToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeAsciiToMemory")) Module["writeAsciiToMemory"] = () => abort("'writeAsciiToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addRunDependency")) Module["addRunDependency"] = () => abort("'addRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "removeRunDependency")) Module["removeRunDependency"] = () => abort("'removeRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createFolder")) Module["FS_createFolder"] = () => abort("'FS_createFolder' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createPath")) Module["FS_createPath"] = () => abort("'FS_createPath' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createDataFile")) Module["FS_createDataFile"] = () => abort("'FS_createDataFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createPreloadedFile")) Module["FS_createPreloadedFile"] = () => abort("'FS_createPreloadedFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createLazyFile")) Module["FS_createLazyFile"] = () => abort("'FS_createLazyFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createLink")) Module["FS_createLink"] = () => abort("'FS_createLink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_createDevice")) Module["FS_createDevice"] = () => abort("'FS_createDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "FS_unlink")) Module["FS_unlink"] = () => abort("'FS_unlink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -if (!Object.getOwnPropertyDescriptor(Module, "getLEB")) Module["getLEB"] = () => abort("'getLEB' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getFunctionTables")) Module["getFunctionTables"] = () => abort("'getFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "alignFunctionTables")) Module["alignFunctionTables"] = () => abort("'alignFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerFunctions")) Module["registerFunctions"] = () => abort("'registerFunctions' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "addFunction")) Module["addFunction"] = () => abort("'addFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "removeFunction")) Module["removeFunction"] = () => abort("'removeFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = () => abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "prettyPrint")) Module["prettyPrint"] = () => abort("'prettyPrint' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = () => abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getCompilerSetting")) Module["getCompilerSetting"] = () => abort("'getCompilerSetting' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "print")) Module["print"] = () => abort("'print' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "printErr")) Module["printErr"] = () => abort("'printErr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getTempRet0")) Module["getTempRet0"] = () => abort("'getTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setTempRet0")) Module["setTempRet0"] = () => abort("'setTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "callMain")) Module["callMain"] = () => abort("'callMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "abort")) Module["abort"] = () => abort("'abort' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "keepRuntimeAlive")) Module["keepRuntimeAlive"] = () => abort("'keepRuntimeAlive' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "zeroMemory")) Module["zeroMemory"] = () => abort("'zeroMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToNewUTF8")) Module["stringToNewUTF8"] = () => abort("'stringToNewUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setFileTime")) Module["setFileTime"] = () => abort("'setFileTime' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "abortOnCannotGrowMemory")) Module["abortOnCannotGrowMemory"] = () => abort("'abortOnCannotGrowMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "emscripten_realloc_buffer")) Module["emscripten_realloc_buffer"] = () => abort("'emscripten_realloc_buffer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "ENV")) Module["ENV"] = () => abort("'ENV' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "withStackSave")) Module["withStackSave"] = () => abort("'withStackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_CODES")) Module["ERRNO_CODES"] = () => abort("'ERRNO_CODES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_MESSAGES")) Module["ERRNO_MESSAGES"] = () => abort("'ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setErrNo")) Module["setErrNo"] = () => abort("'setErrNo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "inetPton4")) Module["inetPton4"] = () => abort("'inetPton4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "inetNtop4")) Module["inetNtop4"] = () => abort("'inetNtop4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "inetPton6")) Module["inetPton6"] = () => abort("'inetPton6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "inetNtop6")) Module["inetNtop6"] = () => abort("'inetNtop6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "readSockaddr")) Module["readSockaddr"] = () => abort("'readSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeSockaddr")) Module["writeSockaddr"] = () => abort("'writeSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "DNS")) Module["DNS"] = () => abort("'DNS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getHostByName")) Module["getHostByName"] = () => abort("'getHostByName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GAI_ERRNO_MESSAGES")) Module["GAI_ERRNO_MESSAGES"] = () => abort("'GAI_ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "Protocols")) Module["Protocols"] = () => abort("'Protocols' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "Sockets")) Module["Sockets"] = () => abort("'Sockets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getRandomDevice")) Module["getRandomDevice"] = () => abort("'getRandomDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "traverseStack")) Module["traverseStack"] = () => abort("'traverseStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "convertFrameToPC")) Module["convertFrameToPC"] = () => abort("'convertFrameToPC' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "UNWIND_CACHE")) Module["UNWIND_CACHE"] = () => abort("'UNWIND_CACHE' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "saveInUnwindCache")) Module["saveInUnwindCache"] = () => abort("'saveInUnwindCache' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "convertPCtoSourceLocation")) Module["convertPCtoSourceLocation"] = () => abort("'convertPCtoSourceLocation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgsArray")) Module["readAsmConstArgsArray"] = () => abort("'readAsmConstArgsArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgs")) Module["readAsmConstArgs"] = () => abort("'readAsmConstArgs' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "mainThreadEM_ASM")) Module["mainThreadEM_ASM"] = () => abort("'mainThreadEM_ASM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "jstoi_q")) Module["jstoi_q"] = () => abort("'jstoi_q' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "jstoi_s")) Module["jstoi_s"] = () => abort("'jstoi_s' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getExecutableName")) Module["getExecutableName"] = () => abort("'getExecutableName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "listenOnce")) Module["listenOnce"] = () => abort("'listenOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "autoResumeAudioContext")) Module["autoResumeAudioContext"] = () => abort("'autoResumeAudioContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "dynCallLegacy")) Module["dynCallLegacy"] = () => abort("'dynCallLegacy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getDynCaller")) Module["getDynCaller"] = () => abort("'getDynCaller' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = () => abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "callRuntimeCallbacks")) Module["callRuntimeCallbacks"] = () => abort("'callRuntimeCallbacks' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "wasmTableMirror")) Module["wasmTableMirror"] = () => abort("'wasmTableMirror' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setWasmTableEntry")) Module["setWasmTableEntry"] = () => abort("'setWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getWasmTableEntry")) Module["getWasmTableEntry"] = () => abort("'getWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "handleException")) Module["handleException"] = () => abort("'handleException' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePush")) Module["runtimeKeepalivePush"] = () => abort("'runtimeKeepalivePush' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePop")) Module["runtimeKeepalivePop"] = () => abort("'runtimeKeepalivePop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "callUserCallback")) Module["callUserCallback"] = () => abort("'callUserCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "maybeExit")) Module["maybeExit"] = () => abort("'maybeExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "safeSetTimeout")) Module["safeSetTimeout"] = () => abort("'safeSetTimeout' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "asmjsMangle")) Module["asmjsMangle"] = () => abort("'asmjsMangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "asyncLoad")) Module["asyncLoad"] = () => abort("'asyncLoad' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "alignMemory")) Module["alignMemory"] = () => abort("'alignMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "mmapAlloc")) Module["mmapAlloc"] = () => abort("'mmapAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "reallyNegative")) Module["reallyNegative"] = () => abort("'reallyNegative' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "unSign")) Module["unSign"] = () => abort("'unSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "reSign")) Module["reSign"] = () => abort("'reSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "formatString")) Module["formatString"] = () => abort("'formatString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "PATH")) Module["PATH"] = () => abort("'PATH' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "PATH_FS")) Module["PATH_FS"] = () => abort("'PATH_FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SYSCALLS")) Module["SYSCALLS"] = () => abort("'SYSCALLS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "syscallMmap2")) Module["syscallMmap2"] = () => abort("'syscallMmap2' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "syscallMunmap")) Module["syscallMunmap"] = () => abort("'syscallMunmap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getSocketFromFD")) Module["getSocketFromFD"] = () => abort("'getSocketFromFD' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getSocketAddress")) Module["getSocketAddress"] = () => abort("'getSocketAddress' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "JSEvents")) Module["JSEvents"] = () => abort("'JSEvents' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerKeyEventCallback")) Module["registerKeyEventCallback"] = () => abort("'registerKeyEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "specialHTMLTargets")) Module["specialHTMLTargets"] = () => abort("'specialHTMLTargets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "maybeCStringToJsString")) Module["maybeCStringToJsString"] = () => abort("'maybeCStringToJsString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "findEventTarget")) Module["findEventTarget"] = () => abort("'findEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "findCanvasEventTarget")) Module["findCanvasEventTarget"] = () => abort("'findCanvasEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getBoundingClientRect")) Module["getBoundingClientRect"] = () => abort("'getBoundingClientRect' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillMouseEventData")) Module["fillMouseEventData"] = () => abort("'fillMouseEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerMouseEventCallback")) Module["registerMouseEventCallback"] = () => abort("'registerMouseEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerWheelEventCallback")) Module["registerWheelEventCallback"] = () => abort("'registerWheelEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerUiEventCallback")) Module["registerUiEventCallback"] = () => abort("'registerUiEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerFocusEventCallback")) Module["registerFocusEventCallback"] = () => abort("'registerFocusEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceOrientationEventData")) Module["fillDeviceOrientationEventData"] = () => abort("'fillDeviceOrientationEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceOrientationEventCallback")) Module["registerDeviceOrientationEventCallback"] = () => abort("'registerDeviceOrientationEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceMotionEventData")) Module["fillDeviceMotionEventData"] = () => abort("'fillDeviceMotionEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceMotionEventCallback")) Module["registerDeviceMotionEventCallback"] = () => abort("'registerDeviceMotionEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "screenOrientation")) Module["screenOrientation"] = () => abort("'screenOrientation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillOrientationChangeEventData")) Module["fillOrientationChangeEventData"] = () => abort("'fillOrientationChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerOrientationChangeEventCallback")) Module["registerOrientationChangeEventCallback"] = () => abort("'registerOrientationChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillFullscreenChangeEventData")) Module["fillFullscreenChangeEventData"] = () => abort("'fillFullscreenChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerFullscreenChangeEventCallback")) Module["registerFullscreenChangeEventCallback"] = () => abort("'registerFullscreenChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerRestoreOldStyle")) Module["registerRestoreOldStyle"] = () => abort("'registerRestoreOldStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "hideEverythingExceptGivenElement")) Module["hideEverythingExceptGivenElement"] = () => abort("'hideEverythingExceptGivenElement' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "restoreHiddenElements")) Module["restoreHiddenElements"] = () => abort("'restoreHiddenElements' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setLetterbox")) Module["setLetterbox"] = () => abort("'setLetterbox' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "currentFullscreenStrategy")) Module["currentFullscreenStrategy"] = () => abort("'currentFullscreenStrategy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "restoreOldWindowedStyle")) Module["restoreOldWindowedStyle"] = () => abort("'restoreOldWindowedStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "softFullscreenResizeWebGLRenderTarget")) Module["softFullscreenResizeWebGLRenderTarget"] = () => abort("'softFullscreenResizeWebGLRenderTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "doRequestFullscreen")) Module["doRequestFullscreen"] = () => abort("'doRequestFullscreen' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillPointerlockChangeEventData")) Module["fillPointerlockChangeEventData"] = () => abort("'fillPointerlockChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockChangeEventCallback")) Module["registerPointerlockChangeEventCallback"] = () => abort("'registerPointerlockChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockErrorEventCallback")) Module["registerPointerlockErrorEventCallback"] = () => abort("'registerPointerlockErrorEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "requestPointerLock")) Module["requestPointerLock"] = () => abort("'requestPointerLock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillVisibilityChangeEventData")) Module["fillVisibilityChangeEventData"] = () => abort("'fillVisibilityChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerVisibilityChangeEventCallback")) Module["registerVisibilityChangeEventCallback"] = () => abort("'registerVisibilityChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerTouchEventCallback")) Module["registerTouchEventCallback"] = () => abort("'registerTouchEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillGamepadEventData")) Module["fillGamepadEventData"] = () => abort("'fillGamepadEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerGamepadEventCallback")) Module["registerGamepadEventCallback"] = () => abort("'registerGamepadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerBeforeUnloadEventCallback")) Module["registerBeforeUnloadEventCallback"] = () => abort("'registerBeforeUnloadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "fillBatteryEventData")) Module["fillBatteryEventData"] = () => abort("'fillBatteryEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "battery")) Module["battery"] = () => abort("'battery' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "registerBatteryEventCallback")) Module["registerBatteryEventCallback"] = () => abort("'registerBatteryEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setCanvasElementSize")) Module["setCanvasElementSize"] = () => abort("'setCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getCanvasElementSize")) Module["getCanvasElementSize"] = () => abort("'getCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "demangle")) Module["demangle"] = () => abort("'demangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "demangleAll")) Module["demangleAll"] = () => abort("'demangleAll' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "jsStackTrace")) Module["jsStackTrace"] = () => abort("'jsStackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = () => abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getEnvStrings")) Module["getEnvStrings"] = () => abort("'getEnvStrings' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "checkWasiClock")) Module["checkWasiClock"] = () => abort("'checkWasiClock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64")) Module["writeI53ToI64"] = () => abort("'writeI53ToI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Clamped")) Module["writeI53ToI64Clamped"] = () => abort("'writeI53ToI64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Signaling")) Module["writeI53ToI64Signaling"] = () => abort("'writeI53ToI64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Clamped")) Module["writeI53ToU64Clamped"] = () => abort("'writeI53ToU64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Signaling")) Module["writeI53ToU64Signaling"] = () => abort("'writeI53ToU64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "readI53FromI64")) Module["readI53FromI64"] = () => abort("'readI53FromI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "readI53FromU64")) Module["readI53FromU64"] = () => abort("'readI53FromU64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "convertI32PairToI53")) Module["convertI32PairToI53"] = () => abort("'convertI32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "convertU32PairToI53")) Module["convertU32PairToI53"] = () => abort("'convertU32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setImmediateWrapped")) Module["setImmediateWrapped"] = () => abort("'setImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "clearImmediateWrapped")) Module["clearImmediateWrapped"] = () => abort("'clearImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "polyfillSetImmediate")) Module["polyfillSetImmediate"] = () => abort("'polyfillSetImmediate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "uncaughtExceptionCount")) Module["uncaughtExceptionCount"] = () => abort("'uncaughtExceptionCount' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "exceptionLast")) Module["exceptionLast"] = () => abort("'exceptionLast' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "exceptionCaught")) Module["exceptionCaught"] = () => abort("'exceptionCaught' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "ExceptionInfo")) Module["ExceptionInfo"] = () => abort("'ExceptionInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "CatchInfo")) Module["CatchInfo"] = () => abort("'CatchInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "exception_addRef")) Module["exception_addRef"] = () => abort("'exception_addRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "exception_decRef")) Module["exception_decRef"] = () => abort("'exception_decRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "Browser")) Module["Browser"] = () => abort("'Browser' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "funcWrappers")) Module["funcWrappers"] = () => abort("'funcWrappers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = () => abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "setMainLoop")) Module["setMainLoop"] = () => abort("'setMainLoop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "wget")) Module["wget"] = () => abort("'wget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "FS")) Module["FS"] = () => abort("'FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "MEMFS")) Module["MEMFS"] = () => abort("'MEMFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "TTY")) Module["TTY"] = () => abort("'TTY' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "PIPEFS")) Module["PIPEFS"] = () => abort("'PIPEFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SOCKFS")) Module["SOCKFS"] = () => abort("'SOCKFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "_setNetworkCallback")) Module["_setNetworkCallback"] = () => abort("'_setNetworkCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "tempFixedLengthArray")) Module["tempFixedLengthArray"] = () => abort("'tempFixedLengthArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "miniTempWebGLFloatBuffers")) Module["miniTempWebGLFloatBuffers"] = () => abort("'miniTempWebGLFloatBuffers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "heapObjectForWebGLType")) Module["heapObjectForWebGLType"] = () => abort("'heapObjectForWebGLType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "heapAccessShiftForWebGLHeap")) Module["heapAccessShiftForWebGLHeap"] = () => abort("'heapAccessShiftForWebGLHeap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GL")) Module["GL"] = () => abort("'GL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGet")) Module["emscriptenWebGLGet"] = () => abort("'emscriptenWebGLGet' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "computeUnpackAlignedImageSize")) Module["computeUnpackAlignedImageSize"] = () => abort("'computeUnpackAlignedImageSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetTexPixelData")) Module["emscriptenWebGLGetTexPixelData"] = () => abort("'emscriptenWebGLGetTexPixelData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetUniform")) Module["emscriptenWebGLGetUniform"] = () => abort("'emscriptenWebGLGetUniform' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "webglGetUniformLocation")) Module["webglGetUniformLocation"] = () => abort("'webglGetUniformLocation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "webglPrepareUniformLocationsBeforeFirstUse")) Module["webglPrepareUniformLocationsBeforeFirstUse"] = () => abort("'webglPrepareUniformLocationsBeforeFirstUse' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "webglGetLeftBracePos")) Module["webglGetLeftBracePos"] = () => abort("'webglGetLeftBracePos' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetVertexAttrib")) Module["emscriptenWebGLGetVertexAttrib"] = () => abort("'emscriptenWebGLGetVertexAttrib' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "writeGLArray")) Module["writeGLArray"] = () => abort("'writeGLArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "AL")) Module["AL"] = () => abort("'AL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SDL_unicode")) Module["SDL_unicode"] = () => abort("'SDL_unicode' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SDL_ttfContext")) Module["SDL_ttfContext"] = () => abort("'SDL_ttfContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SDL_audio")) Module["SDL_audio"] = () => abort("'SDL_audio' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SDL")) Module["SDL"] = () => abort("'SDL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "SDL_gfx")) Module["SDL_gfx"] = () => abort("'SDL_gfx' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GLUT")) Module["GLUT"] = () => abort("'GLUT' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "EGL")) Module["EGL"] = () => abort("'EGL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GLFW_Window")) Module["GLFW_Window"] = () => abort("'GLFW_Window' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GLFW")) Module["GLFW"] = () => abort("'GLFW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "GLEW")) Module["GLEW"] = () => abort("'GLEW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "IDBStore")) Module["IDBStore"] = () => abort("'IDBStore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "runAndAbortIfError")) Module["runAndAbortIfError"] = () => abort("'runAndAbortIfError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "warnOnce")) Module["warnOnce"] = () => abort("'warnOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stackSave")) Module["stackSave"] = () => abort("'stackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stackRestore")) Module["stackRestore"] = () => abort("'stackRestore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stackAlloc")) Module["stackAlloc"] = () => abort("'stackAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "AsciiToString")) Module["AsciiToString"] = () => abort("'AsciiToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToAscii")) Module["stringToAscii"] = () => abort("'stringToAscii' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "UTF16ToString")) Module["UTF16ToString"] = () => abort("'UTF16ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF16")) Module["stringToUTF16"] = () => abort("'stringToUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF16")) Module["lengthBytesUTF16"] = () => abort("'lengthBytesUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "UTF32ToString")) Module["UTF32ToString"] = () => abort("'UTF32ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF32")) Module["stringToUTF32"] = () => abort("'stringToUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF32")) Module["lengthBytesUTF32"] = () => abort("'lengthBytesUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8")) Module["allocateUTF8"] = () => abort("'allocateUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8OnStack")) Module["allocateUTF8OnStack"] = () => abort("'allocateUTF8OnStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -Module["writeStackCookie"] = writeStackCookie; -Module["checkStackCookie"] = checkStackCookie; -if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_NORMAL")) Object.defineProperty(Module, "ALLOC_NORMAL", { configurable: true, get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); -if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_STACK")) Object.defineProperty(Module, "ALLOC_STACK", { configurable: true, get: function() { abort("'ALLOC_STACK' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); - -var calledRun; - -/** - * @constructor - * @this {ExitStatus} - */ -function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; -} - -var calledMain = false; - -dependenciesFulfilled = function runCaller() { - // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) - if (!calledRun) run(); - if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled -}; - -function stackCheckInit() { - // This is normally called automatically during __wasm_call_ctors but need to - // get these values before even running any of the ctors so we call it redundantly - // here. - // TODO(sbc): Move writeStackCookie to native to to avoid this. - _emscripten_stack_init(); - writeStackCookie(); -} - -/** @type {function(Array=)} */ -function run(args) { - args = args || arguments_; - - if (runDependencies > 0) { - return; - } - - stackCheckInit(); - - preRun(); - - // a preRun added a dependency, run will be called later - if (runDependencies > 0) { - return; - } - - function doRun() { - // run may have just been called through dependencies being fulfilled just in this very frame, - // or while the async setStatus time below was happening - if (calledRun) return; - calledRun = true; - Module['calledRun'] = true; - - if (ABORT) return; - - initRuntime(); - - if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); - - assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'); - - postRun(); - } - - if (Module['setStatus']) { - Module['setStatus']('Running...'); - setTimeout(function() { - setTimeout(function() { - Module['setStatus'](''); - }, 1); - doRun(); - }, 1); - } else - { - doRun(); - } - checkStackCookie(); -} -Module['run'] = run; - -function checkUnflushedContent() { - // Compiler settings do not allow exiting the runtime, so flushing - // the streams is not possible. but in ASSERTIONS mode we check - // if there was something to flush, and if so tell the user they - // should request that the runtime be exitable. - // Normally we would not even include flush() at all, but in ASSERTIONS - // builds we do so just for this check, and here we see if there is any - // content to flush, that is, we check if there would have been - // something a non-ASSERTIONS build would have not seen. - // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 - // mode (which has its own special function for this; otherwise, all - // the code is inside libc) - var oldOut = out; - var oldErr = err; - var has = false; - out = err = (x) => { - has = true; - } - try { // it doesn't matter if it fails - _fflush(0); - // also flush in the JS FS layer - ['stdout', 'stderr'].forEach(function(name) { - var info = FS.analyzePath('/dev/' + name); - if (!info) return; - var stream = info.object; - var rdev = stream.rdev; - var tty = TTY.ttys[rdev]; - if (tty && tty.output && tty.output.length) { - has = true; - } - }); - } catch(e) {} - out = oldOut; - err = oldErr; - if (has) { - warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); - } -} - -/** @param {boolean|number=} implicit */ -function exit(status, implicit) { - EXITSTATUS = status; - - checkUnflushedContent(); - - if (keepRuntimeAlive()) { - // if exit() was called, we may warn the user if the runtime isn't actually being shut down - if (!implicit) { - var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'; - err(msg); - } - } else { - exitRuntime(); - } - - procExit(status); -} - -function procExit(code) { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - if (Module['onExit']) Module['onExit'](code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -} - -if (Module['preInit']) { - if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; - while (Module['preInit'].length > 0) { - Module['preInit'].pop()(); - } -} - -run(); - - - - - -// Encoder - -// create encoder -// channels: 1-2 -// samplerate: 8000,12000,16000,24000,48000 -// bitrate: see Opus recommended bitrates -// frame_size: frame size in milliseconds (2.5,5,10,20,40,60), 20 is recommended -// voice_optimization: true/false -function Encoder(channels, samplerate, bitrate, frame_size, voice_optimization) -{ - this.enc = Module._Encoder_new.apply(null, arguments); - this.out = Module._String_new(); -} - -// free encoder memory -Encoder.prototype.destroy = function() -{ - Module._Encoder_delete(this.enc); - Module._String_delete(this.out); -} - -// add samples to the encoder buffer -// samples: Int16Array of interleaved (if multiple channels) samples -Encoder.prototype.input = function(samples) -{ - var ptr = Module._malloc(samples.length*samples.BYTES_PER_ELEMENT); - var pdata = new Uint8Array(Module.HEAPU8.buffer, ptr, samples.length*samples.BYTES_PER_ELEMENT); - pdata.set(new Uint8Array(samples.buffer, samples.byteOffset, samples.length*samples.BYTES_PER_ELEMENT)); - - Module._Encoder_input(this.enc, ptr, samples.length); - Module._free(ptr); -} - -// output the next encoded packet -// return Uint8Array (valid until the next output call) or null if there is no packet to output -Encoder.prototype.output = function() -{ - var ok = Module._Encoder_output(this.enc, this.out); - if(ok) - return new Uint8Array(Module.HEAPU8.buffer, Module._String_data(this.out), Module._String_size(this.out)); -} - -// Decoder - -// create decoder -// channels and samplerate should match the encoder options -function Decoder(channels, samplerate) -{ - this.dec = Module._Decoder_new.apply(null, arguments); - this.out = Module._Int16Array_new(); -} - -// free decoder memory -Decoder.prototype.destroy = function() -{ - Module._Decoder_delete(this.dec); - Module._Int16Array_delete(this.out); -} - -// add packet to the decoder buffer -// packet: Uint8Array -Decoder.prototype.input = function(packet) -{ - var ptr = Module._malloc(packet.length*packet.BYTES_PER_ELEMENT); - var pdata = new Uint8Array(Module.HEAPU8.buffer, ptr, packet.length*packet.BYTES_PER_ELEMENT); - pdata.set(new Uint8Array(packet.buffer, packet.byteOffset, packet.length*packet.BYTES_PER_ELEMENT)); - - Module._Decoder_input(this.dec, ptr, packet.length); - Module._free(ptr); -} - -// output the next decoded samples -// return samples (interleaved if multiple channels) as Int16Array (valid until the next output call) or null if there is no output -Decoder.prototype.output = function() -{ - var ok = Module._Decoder_output(this.dec, this.out); - if(ok) - return new Int16Array(Module.HEAPU8.buffer, Module._Int16Array_data(this.out), Module._Int16Array_size(this.out)); -} - - -//export objects -Module.Encoder = Encoder; -Module.Decoder = Decoder; - -//make the module global if not using nodejs -if(Module["ENVIRONMENT"] != "NODE") - libopus = Module; - -var dec; -var i = 0; -self.addEventListener('message', (e) => { - if (e.data.channels > 0) { - if (dec) dec.destroy(); - dec = new Decoder(e.data.channels, e.data.sampleRate); - } else { - dec.input(e.data); - self.postMessage(dec.output().slice(0)); - } -}); \ No newline at end of file diff --git a/shelled/rustdesk-as-ref/web_deps/libopus.wasm b/shelled/rustdesk-as-ref/web_deps/libopus.wasm deleted file mode 100755 index 36e42afb17f032fbd8a78c5800e1db56d0f75efc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489750 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 jcM`Q-*6NAUkX=+yp>#s35^6WKkX` into `

    PkE)q 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 ) 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

    TR4DsE(GM9nX(={;5g=L% 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 `qEorLn+^#TtAv{5~_?PoGz!iR~`+D^UFuvAU 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