├── src-tauri ├── rustfmt.toml ├── src │ ├── build.rs │ ├── dir_map.rs │ ├── destinationinfo.rs │ ├── main.rs │ ├── compare.rs │ ├── listbackups.rs │ └── cmd.rs ├── .gitignore ├── icons │ ├── 32x32.png │ ├── icon.icns │ ├── icon.ico │ ├── icon.png │ ├── 128x128.png │ ├── 128x128@2x.png │ ├── StoreLogo.png │ ├── Square30x30Logo.png │ ├── Square44x44Logo.png │ ├── Square71x71Logo.png │ ├── Square89x89Logo.png │ ├── Square107x107Logo.png │ ├── Square142x142Logo.png │ ├── Square150x150Logo.png │ ├── Square284x284Logo.png │ └── Square310x310Logo.png ├── Cargo.toml ├── tauri.conf.json └── Cargo.lock ├── .gitattributes ├── .gitignore ├── assets ├── Logo.png ├── Logo.afdesign └── Screenshot.webp ├── public └── OpenSans-VariableFont_wdth,wght.ttf ├── src ├── main.ts ├── lib │ ├── commands.ts │ ├── Button.svelte │ └── ProgressBar.svelte ├── sidebar │ └── Sidebar.svelte ├── page │ ├── page.ts │ ├── Page.svelte │ └── PageItems.svelte └── App.svelte ├── index.html ├── vite.config.ts ├── tsconfig.json ├── eslint.config.js ├── .github └── workflows │ ├── release.yml │ └── test.yml ├── CHANGELOG.md ├── README.md ├── package.json └── bindings.ts /src-tauri/rustfmt.toml: -------------------------------------------------------------------------------- 1 | hard_tabs = true 2 | -------------------------------------------------------------------------------- /src-tauri/src/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | tauri_build::build(); 3 | } 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | /src-tauri/target 5 | /src-tauri/WixTools 6 | -------------------------------------------------------------------------------- /assets/Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/assets/Logo.png -------------------------------------------------------------------------------- /assets/Logo.afdesign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/assets/Logo.afdesign -------------------------------------------------------------------------------- /assets/Screenshot.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/assets/Screenshot.webp -------------------------------------------------------------------------------- /src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | WixTools 5 | -------------------------------------------------------------------------------- /src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /public/OpenSans-VariableFont_wdth,wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probablykasper/time-machine-inspector/HEAD/public/OpenSans-VariableFont_wdth,wght.ttf -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import App from './App.svelte' 2 | 3 | const app = new App({ 4 | target: document.body, 5 | intro: true, 6 | }) 7 | 8 | export default app 9 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/lib/commands.ts: -------------------------------------------------------------------------------- 1 | // utils.ts 2 | import * as c from '../../bindings' 3 | 4 | export default new Proxy({} as typeof c, { 5 | get: 6 | (_, property: string) => 7 | async (...args: unknown[]) => { 8 | try { 9 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 10 | return await (c as any)[property](...args) 11 | } catch (e) { 12 | c.errorPopup(String(e)) 13 | throw e 14 | } 15 | }, 16 | }) 17 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { svelte, vitePreprocess } from '@sveltejs/vite-plugin-svelte' 3 | import autoprefixer from 'autoprefixer' 4 | 5 | export default defineConfig({ 6 | clearScreen: false, 7 | server: { 8 | port: 3000, 9 | strictPort: true, 10 | }, 11 | build: { 12 | sourcemap: true, 13 | target: ['chrome64', 'edge79', 'firefox62', 'safari11.1'], 14 | }, 15 | css: { 16 | postcss: { 17 | plugins: [autoprefixer], 18 | }, 19 | }, 20 | plugins: [ 21 | svelte({ 22 | preprocess: vitePreprocess(), 23 | }), 24 | ], 25 | }) 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/svelte/tsconfig.json", 3 | "compilerOptions": { 4 | "target": "ESNext", 5 | "useDefineForClassFields": true, 6 | "module": "ESNext", 7 | "resolveJsonModule": true, 8 | /** 9 | * Typecheck JS in `.svelte` and `.js` files by default. 10 | * Disable checkJs if you'd like to use dynamic types in JS. 11 | * Note that setting allowJs false does not prevent the use 12 | * of JS in `.svelte` files. 13 | */ 14 | "allowJs": true, 15 | "checkJs": true, 16 | "isolatedModules": true 17 | }, 18 | "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] 19 | } 20 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import ts from 'typescript-eslint' 3 | import svelte from 'eslint-plugin-svelte' 4 | import prettier from 'eslint-config-prettier' 5 | import globals from 'globals' 6 | 7 | /** @type {import('eslint').Linter.Config[]} */ 8 | export default [ 9 | js.configs.recommended, 10 | ...ts.configs.recommended, 11 | ...svelte.configs['flat/recommended'], 12 | prettier, 13 | ...svelte.configs['flat/prettier'], 14 | { 15 | languageOptions: { 16 | globals: { 17 | ...globals.browser, 18 | ...globals.node, 19 | }, 20 | }, 21 | }, 22 | { 23 | files: ['**/*.svelte'], 24 | languageOptions: { 25 | parserOptions: { 26 | parser: ts.parser, 27 | }, 28 | }, 29 | }, 30 | { 31 | ignores: ['build/', '.svelte-kit/', 'dist/'], 32 | }, 33 | ] 34 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | tags: 5 | - 'v*' 6 | workflow_dispatch: 7 | 8 | jobs: 9 | release: 10 | runs-on: macos-13 # macos-14/latest are arm64 and do not produce x64 binaries 11 | steps: 12 | - name: Checkout repository 13 | uses: actions/checkout@v3 14 | 15 | - name: Node.js setup 16 | uses: actions/setup-node@v3 17 | with: 18 | node-version: 18 19 | 20 | - name: Rust setup 21 | uses: dtolnay/rust-toolchain@stable 22 | 23 | - run: npm install 24 | 25 | - name: Build and release 26 | uses: tauri-apps/tauri-action@v0 27 | env: 28 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 29 | with: 30 | tagName: v__VERSION__ 31 | releaseName: v__VERSION__ 32 | releaseDraft: true 33 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 1.2.1 - 2024 Jul 30 4 | - Fix missing property errors 5 | - Ignore destinations without mount point (until a better solution is found) 6 | - Scroll to selected item when using arrow keys 7 | 8 | ## 1.2.0 - 2023 May 19 9 | - Support macOS 13 10 | - Support multiple backup destinations 11 | 12 | ## 1.1.5 - 2022 Jul 9 13 | - Fix `No parent of path` error (#4) 14 | 15 | ## 1.1.4 - 2022 May 17 16 | - Re-enable window border 17 | - Fix app not working due to Content Security Policy issue 18 | 19 | ## 1.1.3 - 2022 May 17 20 | - Slight design improvements 21 | - Richer error message 22 | 23 | ## 1.1.2 - 2021 Feb 1 24 | - Optimize app size (#2) 25 | 26 | ## 1.1.1 - 2021 Jan 29 27 | - Add "no backups found" error message (#1) 28 | 29 | ## 1.1.0 - 2021 Jan 28 30 | - Add app icon 31 | 32 | ## 1.0.0 - 2021 Jan 28 33 | - Initial release 34 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | on: 3 | push: 4 | branches: 5 | - '*' 6 | pull_request: 7 | workflow_dispatch: 8 | 9 | jobs: 10 | test: 11 | runs-on: macos-latest 12 | steps: 13 | - name: Checkout repository 14 | uses: actions/checkout@v3 15 | 16 | - name: Node.js setup 17 | uses: actions/setup-node@v3 18 | with: 19 | node-version: 18 20 | 21 | - name: Rust setup 22 | uses: dtolnay/rust-toolchain@stable 23 | 24 | - name: Rust Cache 25 | uses: Swatinem/rust-cache@v2 26 | with: 27 | workspaces: ./src-tauri 28 | 29 | - run: npm install 30 | 31 | - run: npm run build:web 32 | 33 | - run: npm run test 34 | 35 | - run: npm run lint 36 | 37 | - name: Build 38 | uses: tauri-apps/tauri-action@v0 39 | env: 40 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 41 | -------------------------------------------------------------------------------- /src/lib/Button.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | 9 | 33 | -------------------------------------------------------------------------------- /src-tauri/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "time-machine-inspector" 3 | version = "1.2.1" 4 | description = "A Tauri App" 5 | default-run = "time-machine-inspector" 6 | edition = "2018" 7 | build = "src/build.rs" 8 | 9 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 10 | 11 | [build-dependencies] 12 | tauri-build = { version = "1.5.3", features = [] } 13 | 14 | [dependencies] 15 | serde_json = "1.0.121" 16 | serde = { version = "1.0.204", features = ["derive"] } 17 | tauri = { version = "1.7.1", features = [ 18 | "devtools", 19 | "dialog-message", 20 | "macos-private-api", 21 | "shell-open", 22 | ] } 23 | plist = { version = "1.7", features = ["serde"] } 24 | open = "5.3.0" 25 | tauri-specta = { version = "1.0.2", features = ["javascript", "typescript"] } 26 | specta = "1.0.5" 27 | regex = "1.10.5" 28 | 29 | [features] 30 | default = ["custom-protocol"] 31 | custom-protocol = ["tauri/custom-protocol"] 32 | 33 | [profile.release] 34 | panic = "abort" 35 | codegen-units = 1 36 | lto = true 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 |

Time Machine Inspector

5 |

6 | Find out what's hogging up your backups 7 |
8 | Download for Mac 9 |

10 |
11 | 12 | ![Screenshot](assets/Screenshot.webp) 13 | 14 | ## Dev instructions 15 | 16 | ### Get started 17 | 18 | 1. Install Node.js 19 | 2. Install Rust 20 | 3. Follow the [Tauri setup guide](https://tauri.studio/en/docs/getting-started/intro) 21 | 4. Run `npm install` 22 | 23 | ### Commands 24 | - `npm run dev`: Start app in dev mode 25 | - `npm run build`: Build 26 | - `npm run lint`: Lint 27 | - `npm run format`: Format 28 | 29 | ### Release new version 30 | 1. Update `CHANGELOG.md` 31 | 2. Bump the version number in `src-tauri/Cargo.toml` 32 | 3. Run `cargo check` to update `Cargo.lock` 33 | 4. Create a git tag in the format `v#.#.#` 34 | 5. Add release notes to the generated GitHub release and publish it 35 | -------------------------------------------------------------------------------- /src/lib/ProgressBar.svelte: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | 7 | 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "tauri": "tauri", 6 | "dev": "tauri dev", 7 | "dev:web": "vite", 8 | "build": "tauri build", 9 | "build:web": "vite build", 10 | "test": "cargo test --manifest-path ./src-tauri/Cargo.toml", 11 | "lint": "svelte-check --tsconfig ./tsconfig.json && eslint src && prettier --check src", 12 | "format": "eslint --fix src && prettier --write src" 13 | }, 14 | "devDependencies": { 15 | "@sveltejs/vite-plugin-svelte": "^3.1.1", 16 | "@tauri-apps/api": "^1.6.0", 17 | "@tauri-apps/cli": "^1.6.0", 18 | "@tsconfig/svelte": "^5.0.4", 19 | "@types/eslint": "^9.6.0", 20 | "autoprefixer": "^10.4.19", 21 | "eslint": "^9.8.0", 22 | "eslint-config-prettier": "^9.1.0", 23 | "eslint-plugin-svelte": "^2.43.0", 24 | "prettier": "^3.3.3", 25 | "prettier-plugin-svelte": "^3.2.6", 26 | "sass": "^1.77.8", 27 | "svelte": "^4.2.18", 28 | "svelte-check": "^3.8.4", 29 | "tauri-specta": "^0.0.2", 30 | "typescript": "^5.5.4", 31 | "typescript-eslint": "^8.0.0-alpha.58", 32 | "vite": "^5.3.5" 33 | }, 34 | "prettier": { 35 | "useTabs": true, 36 | "printWidth": 100, 37 | "semi": false, 38 | "singleQuote": true, 39 | "plugins": [ 40 | "prettier-plugin-svelte" 41 | ] 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /bindings.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | // This file was generated by [tauri-specta](https://github.com/oscartbeaumont/tauri-specta). Do not edit this file manually. 3 | 4 | declare global { 5 | interface Window { 6 | __TAURI_INVOKE__(cmd: string, args?: Record): Promise; 7 | } 8 | } 9 | 10 | // Function avoids 'window not defined' in SSR 11 | const invoke = () => window.__TAURI_INVOKE__; 12 | 13 | export function errorPopup(msg: string) { 14 | return invoke()("error_popup", { msg }) 15 | } 16 | 17 | export function loadBackupList(destinationId: string, refresh: boolean) { 18 | return invoke()("load_backup_list", { destinationId,refresh }) 19 | } 20 | 21 | export function getBackup(destinationId: string, newB: string, refresh: boolean) { 22 | return invoke()("get_backup", { destinationId,newB,refresh }) 23 | } 24 | 25 | export function backupsInfo() { 26 | return invoke()("backups_info") 27 | } 28 | 29 | export function destinationinfo() { 30 | return invoke()("destinationinfo") 31 | } 32 | 33 | export type Backup = { path: string; name: string } 34 | export type LoadedBackupItem = { size: number } 35 | export type DestinationDetail = { id: string; mount_point: string; mount_point_name: string } 36 | export type DirMap = { map: { [key: string]: { [key: string]: LoadedBackupItem } } } 37 | export type BackupInfo = { old: string; new: string; loading: boolean } 38 | -------------------------------------------------------------------------------- /src-tauri/tauri.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "package": { 3 | "productName": "Time Machine Inspector" 4 | }, 5 | "build": { 6 | "distDir": "../dist", 7 | "devPath": "http://localhost:3000", 8 | "beforeDevCommand": "npm run dev:web", 9 | "beforeBuildCommand": "npm run build:web" 10 | }, 11 | "tauri": { 12 | "macOSPrivateApi": true, 13 | "bundle": { 14 | "active": true, 15 | "targets": ["dmg"], 16 | "identifier": "space.kasper.time-machine-inspector", 17 | "icon": [ 18 | "icons/32x32.png", 19 | "icons/128x128.png", 20 | "icons/128x128@2x.png", 21 | "icons/icon.icns", 22 | "icons/icon.ico" 23 | ], 24 | "resources": [], 25 | "externalBin": [], 26 | "copyright": "© 2021 kasper.space", 27 | "category": "Utility", 28 | "shortDescription": "", 29 | "longDescription": "", 30 | "deb": { 31 | "depends": [] 32 | }, 33 | "macOS": { 34 | "frameworks": [], 35 | "minimumSystemVersion": "10.13", 36 | "exceptionDomain": "", 37 | "signingIdentity": null, 38 | "entitlements": null 39 | }, 40 | "windows": { 41 | "certificateThumbprint": null, 42 | "digestAlgorithm": "sha256", 43 | "timestampUrl": "" 44 | } 45 | }, 46 | "updater": { 47 | "active": false 48 | }, 49 | "allowlist": { 50 | "dialog": { 51 | "message": true 52 | }, 53 | "shell": { 54 | "open": true 55 | } 56 | }, 57 | "security": { 58 | "csp": "default-src 'self'; style-src 'unsafe-inline' *" 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/sidebar/Sidebar.svelte: -------------------------------------------------------------------------------- 1 | 26 | 27 |
28 | {#each backups as backup} 29 | 43 | {/each} 44 |
45 | 46 | 79 | -------------------------------------------------------------------------------- /src/page/page.ts: -------------------------------------------------------------------------------- 1 | import { get, writable } from 'svelte/store' 2 | import commands from '../lib/commands' 3 | import type { Backup } from '../../bindings' 4 | 5 | export const backups = (() => { 6 | const store = writable(null) 7 | return { 8 | subscribe: store.subscribe, 9 | set: (value: Backup[] | null) => { 10 | store.set(value) 11 | backupInfos.load() 12 | }, 13 | } 14 | })() 15 | 16 | export type BackupInfo = { 17 | old: string 18 | new: string 19 | loading: boolean 20 | } 21 | export const backupInfos = (() => { 22 | const store = writable([] as BackupInfo[]) 23 | return { 24 | subscribe: store.subscribe, 25 | load: async () => { 26 | const result = await commands.backupsInfo() 27 | const $page = get(page) 28 | 29 | for (const info of result) { 30 | if (info.new === $page.backup?.path) { 31 | if ($page.loading !== info.loading) { 32 | page.set_loading(info.loading) 33 | } 34 | } 35 | } 36 | store.set(result) 37 | }, 38 | } 39 | })() 40 | 41 | export const selectedPath = writable(null as string | null) 42 | 43 | export type PageMap = { 44 | [name: string]: PageItems 45 | } 46 | export type PageItems = { 47 | [name: string]: PageItem 48 | } 49 | export type PageItem = { 50 | size: number 51 | isOpen?: boolean 52 | } 53 | 54 | export const pageMap = writable({} as PageMap) 55 | 56 | type Page = { 57 | backup: Backup | null 58 | loading: boolean 59 | } 60 | export const page = (() => { 61 | const store = writable({ 62 | backup: null, 63 | loading: false, 64 | }) 65 | return { 66 | subscribe: store.subscribe, 67 | set: (value: Page) => { 68 | store.set(value) 69 | backupInfos.load() 70 | }, 71 | set_loading: (value: boolean) => { 72 | store.update(($page) => { 73 | $page.loading = value 74 | return $page 75 | }) 76 | }, 77 | } 78 | })() 79 | 80 | export function close() { 81 | page.set({ 82 | backup: null, 83 | loading: false, 84 | }) 85 | backups.set(null) 86 | } 87 | -------------------------------------------------------------------------------- /src-tauri/src/dir_map.rs: -------------------------------------------------------------------------------- 1 | use crate::cmd::LoadedBackupItem; 2 | use crate::{compare, throw}; 3 | use serde::Serialize; 4 | use specta::Type; 5 | use std::collections::hash_map::Entry; 6 | use std::collections::HashMap; 7 | use std::ffi::OsStr; 8 | use std::path::{Path, PathBuf}; 9 | 10 | pub type DirContents = HashMap; 11 | 12 | #[derive(Serialize, Clone, Debug, Type, Default)] 13 | pub struct DirMap { 14 | pub map: HashMap, 15 | } 16 | 17 | fn get_parent<'a>(path: &'a Path) -> Result<&'a Path, String> { 18 | match path.parent() { 19 | Some(p) => Ok(p), 20 | None => throw!("No parent of path {}", path.to_string_lossy()), 21 | } 22 | } 23 | fn get_basename<'a>(path: &'a Path) -> Result<&'a OsStr, String> { 24 | match path.file_name() { 25 | Some(p) => Ok(p), 26 | None => throw!("No base of path {}", path.to_string_lossy()), 27 | } 28 | } 29 | 30 | impl DirMap { 31 | pub fn new() -> Self { 32 | Self { 33 | map: HashMap::new(), 34 | } 35 | } 36 | pub fn get_or_create_dir(&mut self, path: String) -> &mut DirContents { 37 | self.map.entry(path).or_insert(HashMap::new()) 38 | } 39 | pub fn item_entry(&mut self, path: &Path) -> Result, String> { 40 | let dir = get_parent(path)?.to_string_lossy().to_string(); 41 | let basename = get_basename(path)?.to_string_lossy().to_string(); 42 | 43 | let dir_contents = self.get_or_create_dir(dir); 44 | Ok(dir_contents.entry(basename)) 45 | } 46 | pub fn from_comparison(comparison: compare::Comparison) -> Result { 47 | let mut dir_map = DirMap::new(); 48 | 49 | for change in comparison.changes { 50 | let new_item = match change { 51 | compare::Change::Add(add) => add.added_item, 52 | compare::Change::Update(update) => update.newer_item, 53 | compare::Change::Delete(_) => continue, 54 | }; 55 | let path = PathBuf::from(new_item.path); 56 | 57 | for ancestor in path.ancestors() { 58 | if ancestor == Path::new("/") { 59 | break; 60 | } 61 | let item = dir_map 62 | .item_entry(ancestor)? 63 | .or_insert(LoadedBackupItem { size: 0 }); 64 | item.size += new_item.size; 65 | } 66 | } 67 | Ok(dir_map) 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src-tauri/src/destinationinfo.rs: -------------------------------------------------------------------------------- 1 | use crate::cmd::{check_cmd_success, DestinationsState}; 2 | use crate::listbackups::Destination; 3 | use crate::throw; 4 | use serde::{Deserialize, Serialize}; 5 | use specta::Type; 6 | use std::collections::HashMap; 7 | use std::process::Command; 8 | use tauri::{command, State}; 9 | 10 | #[derive(Deserialize, Debug)] 11 | #[serde(deny_unknown_fields)] 12 | pub struct DestinationInfoXml { 13 | #[serde(rename = "Destinations")] 14 | pub destinations: Vec, 15 | } 16 | 17 | #[derive(Deserialize, Debug, Type)] 18 | #[serde(deny_unknown_fields)] 19 | pub struct DestinationXml { 20 | #[serde(alias = "Kind")] 21 | pub kind: String, 22 | #[serde(alias = "URL")] 23 | pub url: Option, 24 | #[serde(alias = "Name")] 25 | pub name: String, 26 | #[serde(alias = "ID")] 27 | pub id: String, 28 | #[serde(alias = "LastDestination")] 29 | pub last_destination: Option, 30 | #[serde(alias = "MountPoint")] 31 | pub mount_point: Option, 32 | } 33 | 34 | #[derive(Serialize, Debug, Type)] 35 | pub struct DestinationDetail { 36 | pub id: String, 37 | pub mount_point: String, 38 | pub mount_point_name: String, 39 | } 40 | 41 | #[command] 42 | #[specta::specta] 43 | pub async fn destinationinfo( 44 | state: State<'_, DestinationsState>, 45 | ) -> Result, String> { 46 | let output = Command::new("tmutil") 47 | .arg("destinationinfo") 48 | .arg("-X") 49 | .output() 50 | .expect("Error calling command"); 51 | check_cmd_success(&output.status, output.stderr.clone())?; 52 | println!("Success running destinationinfo"); 53 | 54 | let output_xml: DestinationInfoXml = match plist::from_bytes(&output.stdout) { 55 | Ok(v) => v, 56 | Err(e) => throw!("Unable to parse response: {}", e), 57 | }; 58 | 59 | let mut destinations_map = HashMap::new(); 60 | for destination_xml in &output_xml.destinations { 61 | if let Some(mount_point) = &destination_xml.mount_point { 62 | destinations_map.insert( 63 | destination_xml.id.clone(), 64 | Destination { 65 | backups: None, 66 | mount_point: mount_point.clone(), 67 | }, 68 | ); 69 | } 70 | } 71 | state.lock()?.destinations = Some(destinations_map.clone()); 72 | 73 | let destinations_details = output_xml 74 | .destinations 75 | .into_iter() 76 | .filter_map(|dest| { 77 | let id = dest.id; // Move id out of dest to avoid borrow checker error 78 | dest.mount_point.map(|mount_point| { 79 | let mount_point_name = if mount_point.starts_with("/Volumes/") { 80 | mount_point["/Volumes/".len()..].to_string() 81 | } else { 82 | mount_point.clone() 83 | }; 84 | 85 | DestinationDetail { 86 | id, 87 | mount_point: mount_point.clone(), 88 | mount_point_name, 89 | } 90 | }) 91 | }) 92 | .collect(); 93 | 94 | Ok(destinations_details) 95 | } 96 | -------------------------------------------------------------------------------- /src/page/Page.svelte: -------------------------------------------------------------------------------- 1 | 45 | 46 | {#if !destination} 47 |
48 |

You can open a backup from the sidebar when it's loaded

49 |
50 | {:else if !$page.backup} 51 |
52 |

You can open a backup from the sidebar

53 |
54 | {:else} 55 |
56 |
{$page.backup.path}
57 |
58 | {#if $page.loading} 59 |
60 | 61 |
62 | {:else if $pageMap === null || $pageMap[$page.backup.path] === undefined} 63 |
64 | 65 |
66 | {:else} 67 | 68 | {/if} 69 |
70 |
71 | {/if} 72 | 73 | 107 | -------------------------------------------------------------------------------- /src-tauri/src/main.rs: -------------------------------------------------------------------------------- 1 | #![cfg_attr( 2 | all(not(debug_assertions), target_os = "windows"), 3 | windows_subsystem = "windows" 4 | )] 5 | 6 | use std::thread; 7 | use std::time::Instant; 8 | use tauri::api::{dialog, shell}; 9 | use tauri::{ 10 | command, AboutMetadata, CustomMenuItem, Manager, Menu, MenuEntry, MenuItem, Submenu, Window, 11 | WindowBuilder, WindowUrl, 12 | }; 13 | 14 | mod cmd; 15 | mod compare; 16 | mod destinationinfo; 17 | mod dir_map; 18 | mod listbackups; 19 | 20 | #[command] 21 | #[specta::specta] 22 | fn error_popup(msg: String, win: Window) { 23 | println!("Error: {}", msg); 24 | thread::spawn(move || { 25 | dialog::message(Some(&win), "Error", msg); 26 | }); 27 | } 28 | 29 | #[macro_export] 30 | macro_rules! throw { 31 | ($($arg:tt)*) => {{ 32 | return Err(format!($($arg)*)) 33 | }}; 34 | } 35 | 36 | pub fn reset_dur(since: &mut Instant) -> f32 { 37 | let dur = Instant::now().duration_since(*since).as_nanos() as f32; 38 | *since = Instant::now(); 39 | dur / 1000.0 / 1000.0 40 | } 41 | 42 | fn main() { 43 | #[cfg(debug_assertions)] 44 | { 45 | tauri_specta::ts::export( 46 | specta::collect_types![ 47 | error_popup, 48 | cmd::load_backup_list, 49 | cmd::get_backup, 50 | cmd::backups_info, 51 | destinationinfo::destinationinfo, 52 | ], 53 | "../bindings.ts", 54 | ) 55 | .unwrap(); 56 | println!("Generated TS types"); 57 | } 58 | 59 | let ctx = tauri::generate_context!(); 60 | 61 | tauri::Builder::default() 62 | .manage(cmd::DestinationsState(Default::default())) 63 | .manage(cmd::LoadedBackups(Default::default())) 64 | .invoke_handler(tauri::generate_handler![ 65 | error_popup, 66 | cmd::load_backup_list, 67 | cmd::get_backup, 68 | cmd::backups_info, 69 | destinationinfo::destinationinfo, 70 | ]) 71 | .setup(|app| { 72 | let _window = WindowBuilder::new(app, "main", WindowUrl::default()) 73 | .title("Time Machine Inspector") 74 | .resizable(true) 75 | .decorations(true) 76 | .always_on_top(false) 77 | .inner_size(1000.0, 700.0) 78 | .min_inner_size(600.0, 250.0) 79 | .skip_taskbar(false) 80 | .fullscreen(false) 81 | .build() 82 | .expect("Unable to create window"); 83 | Ok(()) 84 | }) 85 | .menu(Menu::with_items([ 86 | #[cfg(target_os = "macos")] 87 | MenuEntry::Submenu(Submenu::new( 88 | &ctx.package_info().name, 89 | Menu::with_items([ 90 | MenuItem::About(ctx.package_info().name.clone(), AboutMetadata::default()) 91 | .into(), 92 | MenuItem::Separator.into(), 93 | MenuItem::Services.into(), 94 | MenuItem::Separator.into(), 95 | MenuItem::Hide.into(), 96 | MenuItem::HideOthers.into(), 97 | MenuItem::ShowAll.into(), 98 | MenuItem::Separator.into(), 99 | MenuItem::Quit.into(), 100 | ]), 101 | )), 102 | MenuEntry::Submenu(Submenu::new( 103 | "File", 104 | Menu::with_items([MenuItem::CloseWindow.into()]), 105 | )), 106 | MenuEntry::Submenu(Submenu::new( 107 | "Edit", 108 | Menu::with_items([ 109 | MenuItem::Undo.into(), 110 | MenuItem::Redo.into(), 111 | MenuItem::Separator.into(), 112 | MenuItem::Cut.into(), 113 | MenuItem::Copy.into(), 114 | MenuItem::Paste.into(), 115 | #[cfg(not(target_os = "macos"))] 116 | MenuItem::Separator.into(), 117 | MenuItem::SelectAll.into(), 118 | ]), 119 | )), 120 | MenuEntry::Submenu(Submenu::new( 121 | "View", 122 | Menu::with_items([MenuItem::EnterFullScreen.into()]), 123 | )), 124 | MenuEntry::Submenu(Submenu::new( 125 | "Window", 126 | Menu::with_items([MenuItem::Minimize.into(), MenuItem::Zoom.into()]), 127 | )), 128 | MenuEntry::Submenu(Submenu::new( 129 | "Help", 130 | Menu::with_items([CustomMenuItem::new("Learn More", "Learn More").into()]), 131 | )), 132 | ])) 133 | .on_menu_event(|event| { 134 | let event_name = event.menu_item_id(); 135 | match event_name { 136 | "Learn More" => { 137 | let link = 138 | "https://github.com/probablykasper/time-machine-inspector".to_string(); 139 | shell::open(&event.window().shell_scope(), link, None).unwrap(); 140 | } 141 | _ => {} 142 | } 143 | }) 144 | .run(ctx) 145 | .expect("error while running tauri application"); 146 | } 147 | -------------------------------------------------------------------------------- /src-tauri/src/compare.rs: -------------------------------------------------------------------------------- 1 | use crate::cmd::check_cmd_success; 2 | use crate::dir_map::DirMap; 3 | use crate::{reset_dur, throw}; 4 | use plist::Value; 5 | use serde::de::DeserializeOwned; 6 | use serde::{Deserialize, Serialize}; 7 | use std::io::{BufRead, BufReader, BufWriter, Cursor}; 8 | use std::process::{Command, Stdio}; 9 | use std::time::Instant; 10 | 11 | #[derive(Serialize, Debug)] 12 | pub struct Comparison { 13 | pub changes: Vec, 14 | pub totals: Totals, 15 | } 16 | 17 | #[derive(Deserialize, Debug)] 18 | #[serde(deny_unknown_fields)] 19 | struct ComparisonXml { 20 | #[serde(rename = "Changes")] 21 | changes: Vec, 22 | #[serde(rename = "Totals")] 23 | totals: Totals, 24 | } 25 | 26 | #[derive(Serialize, Deserialize, Debug)] 27 | #[serde(untagged)] 28 | pub enum Change { 29 | Add(Add), 30 | Update(Update), 31 | Delete(Delete), 32 | } 33 | 34 | #[derive(Serialize, Deserialize, Debug)] 35 | #[serde(deny_unknown_fields)] 36 | pub struct Add { 37 | #[serde(alias = "AddedItem")] 38 | pub added_item: Item, 39 | } 40 | 41 | #[derive(Serialize, Deserialize, Debug)] 42 | #[serde(deny_unknown_fields)] 43 | pub struct Update { 44 | #[serde(alias = "Differences")] 45 | pub differences: Vec, 46 | #[serde(alias = "NewerItem")] 47 | pub newer_item: Item, 48 | #[serde(alias = "OlderItem")] 49 | pub older_item: Item, 50 | } 51 | 52 | #[derive(Serialize, Deserialize, Debug)] 53 | #[serde(deny_unknown_fields)] 54 | pub struct Delete { 55 | #[serde(alias = "RemovedItem")] 56 | pub removed_item: Item, 57 | } 58 | 59 | #[derive(Serialize, Deserialize, Debug)] 60 | #[serde(deny_unknown_fields)] 61 | pub struct Item { 62 | #[serde(rename = "Path")] 63 | pub path: String, 64 | #[serde(rename = "Size")] 65 | pub size: u64, 66 | } 67 | 68 | #[derive(Serialize, Deserialize, Debug)] 69 | #[serde(deny_unknown_fields)] 70 | pub struct Totals { 71 | #[serde(alias = "AddedSize")] 72 | pub added_size: u64, 73 | #[serde(alias = "ChangedSize")] 74 | pub changed_size: u64, 75 | #[serde(alias = "RemovedSize")] 76 | pub removed_size: u64, 77 | } 78 | 79 | pub fn parse_xml(lines: &[u8]) -> Result { 80 | let comparison: ComparisonXml = match plist::from_bytes(lines) { 81 | Ok(v) => v, 82 | Err(e) => throw!("Unable to parse response: {}", e), 83 | }; 84 | 85 | let mut changes = Vec::with_capacity(comparison.changes.len()); 86 | 87 | for change_dict in &comparison.changes { 88 | let change: Change = match deserialize_value(&change_dict) { 89 | Ok(v) => v, 90 | Err(e) => { 91 | throw!( 92 | "Unable to read change: {}\nReceived value: {:#?}", 93 | e, 94 | change_dict 95 | ); 96 | } 97 | }; 98 | changes.push(change); 99 | } 100 | 101 | Ok(Comparison { 102 | changes, 103 | totals: comparison.totals, 104 | }) 105 | } 106 | 107 | fn deserialize_value(value: &Value) -> Result { 108 | let mut buf_writer = BufWriter::new(Vec::new()); 109 | match value.to_writer_binary(&mut buf_writer) { 110 | Ok(_) => {} 111 | Err(_) => throw!("Failed serializing change"), 112 | }; 113 | let bytes = match buf_writer.into_inner() { 114 | Ok(v) => v, 115 | Err(_) => throw!("Error change_buf_writer.into_inner"), 116 | }; 117 | let cursor = Cursor::new(bytes); 118 | let change: T = match plist::from_reader(cursor) { 119 | Ok(v) => v, 120 | Err(e) => throw!("Unable to read item: {}", e.to_string()), 121 | }; 122 | Ok(change) 123 | } 124 | 125 | pub fn compare(old: &str, new: &str) -> Result { 126 | let mut anchor = Instant::now(); 127 | 128 | println!("tmutil compare -X -s '{}' '{}'", old, new); 129 | 130 | let mut cmd = Command::new("tmutil") 131 | .arg("compare") 132 | .arg("-X") 133 | .arg("-s") 134 | .arg(old) 135 | .arg(new) 136 | .stdout(Stdio::piped()) 137 | .stderr(Stdio::piped()) 138 | .spawn() 139 | .expect("Error calling command"); 140 | 141 | reset_dur(&mut anchor); 142 | 143 | let mut child_out = BufReader::new(cmd.stdout.as_mut().unwrap()); 144 | let mut lines = Vec::new(); 145 | 146 | loop { 147 | match child_out.read_until(b'\n', &mut lines) { 148 | Ok(0) => break, 149 | _ => {} 150 | }; 151 | } 152 | 153 | let output = cmd.wait_with_output().expect("Failed ot wait on command"); 154 | check_cmd_success(&output.status, output.stderr)?; 155 | 156 | println!("\u{23f1} {:.3}ms reading output", reset_dur(&mut anchor)); 157 | 158 | let comparison = parse_xml(&lines)?; 159 | println!("{:#?}", comparison.totals); 160 | 161 | println!("\u{23f1} {:.3}ms parse xml", reset_dur(&mut anchor)); 162 | 163 | let dir_map = DirMap::from_comparison(comparison)?; 164 | 165 | println!("\u{23f1} {:.3}ms constructing map", reset_dur(&mut anchor)); 166 | 167 | Ok(dir_map) 168 | } 169 | -------------------------------------------------------------------------------- /src/App.svelte: -------------------------------------------------------------------------------- 1 | 46 | 47 | 95 | 96 | 97 | 155 | -------------------------------------------------------------------------------- /src-tauri/src/listbackups.rs: -------------------------------------------------------------------------------- 1 | use crate::cmd::{check_cmd_success, parse_output}; 2 | use regex::Regex; 3 | use serde::Serialize; 4 | use specta::Type; 5 | use std::collections::HashMap; 6 | use std::path::PathBuf; 7 | use std::process::Command; 8 | 9 | #[derive(Serialize, Clone, Type, Default)] 10 | pub struct Destinations { 11 | /// ID -> Destination 12 | pub destinations: Option>, 13 | } 14 | impl Destinations { 15 | pub fn get_destination<'a>(&'a mut self, id: &str) -> Result<&'a mut Destination, String> { 16 | let paths = self 17 | .destinations 18 | .as_mut() 19 | .ok_or("Destinations not loaded")?; 20 | let destination = paths 21 | .get_mut(id) 22 | .ok_or(format!("Destination not found: {}", id)); 23 | destination 24 | } 25 | } 26 | 27 | #[derive(Serialize, Clone, Type)] 28 | pub struct Destination { 29 | /// Backups, if loaded 30 | pub backups: Option>, 31 | pub mount_point: String, 32 | } 33 | impl Destination { 34 | pub fn load_backups_list<'a>(&'a mut self) -> Result<&Vec, String> { 35 | let backups = listbackups(&self.mount_point)?; 36 | self.backups = Some(backups); 37 | Ok(self.backups.as_ref().unwrap()) 38 | } 39 | } 40 | 41 | #[derive(Serialize, Clone, Type, Debug)] 42 | pub struct Backup { 43 | pub path: String, 44 | pub name: String, 45 | } 46 | 47 | fn listbackups(mount_point: &str) -> Result, String> { 48 | println!("tmutil listbackups"); 49 | 50 | let output = Command::new("tmutil") 51 | .arg("listbackups") 52 | .arg("-d") 53 | .arg(mount_point) 54 | .output() 55 | .expect("Error calling command"); 56 | check_cmd_success(&output.status, output.stderr.clone())?; 57 | println!("Success listing backups"); 58 | 59 | let output_str = parse_output(output.stdout)?; 60 | println!("{output_str}"); 61 | 62 | let mut paths: Vec<_> = output_str 63 | .trim() 64 | .split('\n') 65 | .map(|s| s.to_string()) 66 | .collect(); 67 | 68 | let mut stored_machine_dir = None; 69 | let mut get_machine_dir = || -> Result { 70 | match &stored_machine_dir { 71 | None => { 72 | println!("tmutil machinedirectory"); 73 | let output = Command::new("tmutil") 74 | .arg("machinedirectory") 75 | .output() 76 | .expect("Error calling command"); 77 | check_cmd_success(&output.status, output.stderr.clone())?; 78 | println!("Success getting machinedirectory"); 79 | let output_str = parse_output(output.stdout)?.trim().to_string(); 80 | stored_machine_dir = Some(output_str.clone()); 81 | Ok(output_str) 82 | } 83 | Some(machine_dir) => Ok(machine_dir.clone()), 84 | } 85 | }; 86 | for path in &mut paths { 87 | if path.starts_with("/") { 88 | continue; 89 | } else { 90 | let machine_dir = get_machine_dir()?; 91 | *path = machine_dir + "/" + &path; 92 | } 93 | } 94 | if let Some(path0) = paths.get(0) { 95 | if path0.starts_with("/") {} 96 | } 97 | 98 | let backups = paths 99 | .into_iter() 100 | .map(|path| Backup { 101 | name: name_from_path(&path), 102 | path, 103 | }) 104 | .collect(); 105 | Ok(backups) 106 | } 107 | 108 | fn name_from_path(path: &str) -> String { 109 | let parts: Vec<_> = PathBuf::from(path) 110 | .components() 111 | .filter_map(|component| match component { 112 | std::path::Component::Normal(name) => Some(name.to_string_lossy().to_string()), 113 | std::path::Component::RootDir => Some("/".to_string()), 114 | _ => panic!("Unexpected path component"), 115 | }) 116 | .collect(); 117 | 118 | // Examples: 119 | // /Volumes/Time Machine Backups/Backups.backupdb/computer-name/2022-08-09-032130 120 | // /Volumes/.timemachine/C5DA5F96-328F-40A3-9FE6-DB1CA872E766/2023-05-17-123613.backup/2023-05-17-123613.backup 121 | 122 | let last = parts.last().cloned().unwrap_or_default(); 123 | 124 | let catalina = Regex::new(r"^\d{4}\-\d{2}\-\d{2}\-\d{6}$").unwrap(); 125 | if catalina.is_match(&last) { 126 | return last; 127 | } 128 | 129 | let ventura = Regex::new(r"^\d{4}\-\d{2}\-\d{2}\-\d{6}.backup$").unwrap(); 130 | if ventura.is_match(&last) { 131 | return last.trim_end_matches(".backup").to_string(); 132 | } 133 | 134 | // fallback 135 | if parts.len() >= 3 && parts[0] == "/" && parts[1] == "Volumes" { 136 | let mut parts = parts; 137 | parts.drain(0..3); // remove /Volumes// 138 | return parts.join("/"); 139 | } 140 | path.to_string() 141 | } 142 | 143 | #[test] 144 | fn test_name_from_path() { 145 | assert_eq!( 146 | name_from_path( 147 | "/Volumes/Time Machine Backups/Backups.backupdb/computer-name/2022-08-09-032130", 148 | ), 149 | "2022-08-09-032130" 150 | ); 151 | assert_eq!( 152 | name_from_path( 153 | "/Volumes/.timemachine/C5DA5A96-328E-40F3-9FD6-DB1AC872F6A6/2022-08-09-032130.backup/2022-08-09-032130.backup", 154 | ), 155 | "2022-08-09-032130" 156 | ); 157 | assert_eq!(name_from_path("/Volumes/Something/else"), "else"); 158 | assert_eq!(name_from_path("/Volumes"), "/Volumes"); 159 | } 160 | -------------------------------------------------------------------------------- /src/page/PageItems.svelte: -------------------------------------------------------------------------------- 1 | 126 | 127 | 128 | 129 | {#each dir as item, i} 130 | 131 | 132 |
($selectedPath = item.path)} 139 | on:click={() => openOrClose(item)} 140 | > 141 | 142 |
openOrClose(item)} 146 | on:click|stopPropagation 147 | > 148 | {#if $pageMap && $pageMap[item.path]} 149 | 152 | {/if} 153 |
154 | {item.name} 155 |
156 | {#if item.size < 1000} 157 | {item.size} 158 | {:else if item.size < 1000000} 159 | {item.size / 1000} KB 160 | {:else if item.size < 1000000000} 161 | {item.size / 1000000} MB 162 | {:else if item.size < 1000000000000} 163 | {item.size / 1000000000} GB 164 | {:else if item.size < 1000000000000000} 165 | {item.size / 1000000000000} TB 166 | {/if} 167 |
168 |
169 |
170 | {#if item.isOpen} 171 | ($selectedPath = item.path)} 176 | on:selectDown={() => onSelectDown(i)} 177 | /> 178 | {/if} 179 |
180 | {/each} 181 | 182 | 212 | -------------------------------------------------------------------------------- /src-tauri/src/cmd.rs: -------------------------------------------------------------------------------- 1 | use crate::dir_map::DirMap; 2 | use crate::listbackups::{Backup, Destinations}; 3 | use crate::{compare, throw}; 4 | use serde::Serialize; 5 | use specta::Type; 6 | use std::collections::HashMap; 7 | use std::fs::File; 8 | use std::process::ExitStatus; 9 | use std::sync::{Mutex, MutexGuard}; 10 | use tauri::api::dialog; 11 | use tauri::{command, State, Window}; 12 | 13 | pub fn parse_output(bytes: Vec) -> Result { 14 | match String::from_utf8(bytes) { 15 | Ok(s) => Ok(s), 16 | Err(e) => throw!("Unable to parse output: {}", e), 17 | } 18 | } 19 | 20 | fn code_to_str(code: Option) -> String { 21 | match code { 22 | Some(code) => format!("{}", code), 23 | None => "None".to_string(), 24 | } 25 | } 26 | 27 | pub fn check_cmd_success(status: &ExitStatus, stderr: Vec) -> Result<(), String> { 28 | if !status.success() { 29 | let stderr = parse_output(stderr)?; 30 | throw!("tmutil error {}:\n{}", code_to_str(status.code()), stderr); 31 | } 32 | Ok(()) 33 | } 34 | 35 | pub async fn full_disk_access(dialog_window: Window) -> Result<(), String> { 36 | match File::open("/Library/Preferences/com.apple.TimeMachine.plist") { 37 | Ok(_file) => {} 38 | Err(e) => match e.kind() { 39 | std::io::ErrorKind::PermissionDenied => { 40 | dialog::message( 41 | Some(&dialog_window), 42 | "Full Disk Access", 43 | "Time Machine Utility requires full disk access to interact with Time Machine.\n\ 44 | To grant access:\n\ 45 | \n\ 46 | 1. Go to System Preferences > Security & Privacy > Privacy\n\ 47 | 2. Select Full Disk Access on the left\n\ 48 | 3. Add and enable Time Machine Inspector on the right", 49 | ); 50 | 51 | open::that( 52 | "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles", 53 | ) 54 | .unwrap(); 55 | 56 | return Ok(()); 57 | } 58 | _ => eprintln!("Unable to open Time Machine preferences: {}", e), 59 | }, 60 | }; 61 | Ok(()) 62 | } 63 | 64 | pub struct DestinationsState(pub Mutex); 65 | 66 | impl DestinationsState { 67 | pub fn lock(&self) -> Result, String> { 68 | match self.0.lock() { 69 | Ok(mutex) => Ok(mutex), 70 | Err(e) => throw!("Unable to acquire mutex: {}", e), 71 | } 72 | } 73 | } 74 | 75 | #[command] 76 | #[specta::specta] 77 | pub async fn load_backup_list( 78 | destination_id: String, 79 | refresh: bool, 80 | w: Window, 81 | state: State<'_, DestinationsState>, 82 | ) -> Result, String> { 83 | // get cached backup_list 84 | if !refresh { 85 | let mut destinations = state.lock()?; 86 | let destination = destinations.get_destination(&destination_id)?; 87 | match &destination.backups { 88 | Some(backups) => return Ok(backups.clone()), 89 | None => {} 90 | } 91 | } 92 | 93 | full_disk_access(w).await?; 94 | let mut destinations = state.lock()?; 95 | let destination = destinations.get_destination(&destination_id)?; 96 | let backups = destination.load_backups_list()?; 97 | println!("Listed backups {:#?}", backups); 98 | 99 | Ok(backups.clone()) 100 | } 101 | 102 | #[derive(Serialize, Clone, Type, Debug)] 103 | pub struct LoadedBackupItem { 104 | #[specta(type = u32)] // tauri bigint fix 105 | pub size: u64, 106 | } 107 | 108 | #[derive(Serialize, Clone)] 109 | pub struct LoadedBackup { 110 | pub old: String, 111 | pub new: String, 112 | pub map: DirMap, 113 | pub loading: bool, 114 | } 115 | pub type LoadedBackupsMap = HashMap<(String, String), LoadedBackup>; 116 | 117 | pub struct LoadedBackups(pub Mutex); 118 | 119 | impl LoadedBackups { 120 | pub fn lock(&self) -> Result, String> { 121 | match self.0.lock() { 122 | Ok(mutex) => Ok(mutex), 123 | Err(e) => throw!("Unable to lock backup list: {}", e), 124 | } 125 | } 126 | } 127 | 128 | #[derive(Serialize, Clone, Type)] 129 | pub struct BackupInfo { 130 | pub old: String, 131 | pub new: String, 132 | pub loading: bool, 133 | } 134 | 135 | #[command] 136 | #[specta::specta] 137 | pub async fn backups_info(state: State<'_, LoadedBackups>) -> Result, String> { 138 | let map = state.lock()?; 139 | let info = map.values().map(|b| BackupInfo { 140 | old: b.old.clone(), 141 | new: b.new.clone(), 142 | loading: b.loading, 143 | }); 144 | Ok(info.collect()) 145 | } 146 | 147 | async fn do_compare(old: &str, new: &str, w: Window) -> Result { 148 | full_disk_access(w).await?; 149 | Ok(compare::compare(&old, &new)?) 150 | } 151 | 152 | #[command] 153 | #[specta::specta] 154 | pub async fn get_backup<'a>( 155 | destination_id: String, 156 | new_b: String, 157 | refresh: bool, 158 | w: Window, 159 | state: State<'_, LoadedBackups>, 160 | destinations_state: State<'_, DestinationsState>, 161 | ) -> Result { 162 | let (old_b, new_b) = { 163 | let mut destinations = destinations_state.lock()?; 164 | let destination = destinations.get_destination(&destination_id)?; 165 | let backups = match &destination.backups { 166 | Some(data) => data, 167 | None => throw!("Backup list not loaded"), 168 | }; 169 | let new_pos = match backups.iter().position(|p| p.path == new_b) { 170 | Some(pos) => pos, 171 | None => throw!("Unable to find backup {}", new_b), 172 | }; 173 | let old_b = backups 174 | .get(new_pos - 1) 175 | .ok_or("No previous backup")? 176 | .clone() 177 | .path; 178 | (old_b, new_b) 179 | }; 180 | let old_new = (old_b.clone(), new_b.clone()); 181 | 182 | // get cached dir_map 183 | if !refresh { 184 | let loaded_backups = state.lock()?; 185 | match loaded_backups.get(&old_new) { 186 | Some(loaded_backup) => { 187 | return Ok(loaded_backup.map.clone()); 188 | } 189 | None => {} 190 | } 191 | } 192 | 193 | { 194 | let mut loaded_backups = state.lock()?; 195 | match loaded_backups.get_mut(&old_new) { 196 | Some(loaded_backup) => { 197 | if (loaded_backup).loading { 198 | throw!("Already loading backup"); 199 | } 200 | } 201 | None => { 202 | let backup = LoadedBackup { 203 | old: old_b.clone(), 204 | new: new_b.clone(), 205 | map: DirMap::new(), 206 | loading: true, 207 | }; 208 | loaded_backups.insert(old_new.clone(), backup); 209 | } 210 | } 211 | } 212 | 213 | match do_compare(&old_b, &new_b, w).await { 214 | Ok(dir_map) => { 215 | let mut loaded_backups = state.lock()?; 216 | let backup = LoadedBackup { 217 | old: old_b, 218 | new: new_b, 219 | map: dir_map.clone(), 220 | loading: false, 221 | }; 222 | loaded_backups.insert(old_new, backup); 223 | return Ok(dir_map); 224 | } 225 | Err(e) => { 226 | let mut loaded_backups = state.lock()?; 227 | loaded_backups.remove(&old_new); 228 | return Err(e); 229 | } 230 | } 231 | } 232 | -------------------------------------------------------------------------------- /src-tauri/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "Inflector" 7 | version = "0.11.4" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" 10 | 11 | [[package]] 12 | name = "addr2line" 13 | version = "0.22.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" 16 | dependencies = [ 17 | "gimli", 18 | ] 19 | 20 | [[package]] 21 | name = "adler" 22 | version = "1.0.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 25 | 26 | [[package]] 27 | name = "aho-corasick" 28 | version = "1.1.3" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 31 | dependencies = [ 32 | "memchr", 33 | ] 34 | 35 | [[package]] 36 | name = "alloc-no-stdlib" 37 | version = "2.0.4" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 40 | 41 | [[package]] 42 | name = "alloc-stdlib" 43 | version = "0.2.2" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 46 | dependencies = [ 47 | "alloc-no-stdlib", 48 | ] 49 | 50 | [[package]] 51 | name = "android-tzdata" 52 | version = "0.1.1" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 55 | 56 | [[package]] 57 | name = "android_system_properties" 58 | version = "0.1.5" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 61 | dependencies = [ 62 | "libc", 63 | ] 64 | 65 | [[package]] 66 | name = "anyhow" 67 | version = "1.0.86" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" 70 | 71 | [[package]] 72 | name = "atk" 73 | version = "0.15.1" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" 76 | dependencies = [ 77 | "atk-sys", 78 | "bitflags 1.3.2", 79 | "glib", 80 | "libc", 81 | ] 82 | 83 | [[package]] 84 | name = "atk-sys" 85 | version = "0.15.1" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" 88 | dependencies = [ 89 | "glib-sys", 90 | "gobject-sys", 91 | "libc", 92 | "system-deps 6.2.2", 93 | ] 94 | 95 | [[package]] 96 | name = "autocfg" 97 | version = "1.3.0" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 100 | 101 | [[package]] 102 | name = "backtrace" 103 | version = "0.3.73" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" 106 | dependencies = [ 107 | "addr2line", 108 | "cc", 109 | "cfg-if", 110 | "libc", 111 | "miniz_oxide", 112 | "object", 113 | "rustc-demangle", 114 | ] 115 | 116 | [[package]] 117 | name = "base64" 118 | version = "0.13.1" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 121 | 122 | [[package]] 123 | name = "base64" 124 | version = "0.21.7" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 127 | 128 | [[package]] 129 | name = "base64" 130 | version = "0.22.1" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 133 | 134 | [[package]] 135 | name = "bitflags" 136 | version = "1.3.2" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 139 | 140 | [[package]] 141 | name = "bitflags" 142 | version = "2.6.0" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 145 | 146 | [[package]] 147 | name = "block" 148 | version = "0.1.6" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 151 | 152 | [[package]] 153 | name = "block-buffer" 154 | version = "0.10.4" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 157 | dependencies = [ 158 | "generic-array", 159 | ] 160 | 161 | [[package]] 162 | name = "brotli" 163 | version = "3.5.0" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" 166 | dependencies = [ 167 | "alloc-no-stdlib", 168 | "alloc-stdlib", 169 | "brotli-decompressor", 170 | ] 171 | 172 | [[package]] 173 | name = "brotli-decompressor" 174 | version = "2.5.1" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" 177 | dependencies = [ 178 | "alloc-no-stdlib", 179 | "alloc-stdlib", 180 | ] 181 | 182 | [[package]] 183 | name = "bstr" 184 | version = "1.10.0" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" 187 | dependencies = [ 188 | "memchr", 189 | "serde", 190 | ] 191 | 192 | [[package]] 193 | name = "bumpalo" 194 | version = "3.16.0" 195 | source = "registry+https://github.com/rust-lang/crates.io-index" 196 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 197 | 198 | [[package]] 199 | name = "bytemuck" 200 | version = "1.16.1" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" 203 | 204 | [[package]] 205 | name = "byteorder" 206 | version = "1.5.0" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 209 | 210 | [[package]] 211 | name = "bytes" 212 | version = "1.6.1" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" 215 | 216 | [[package]] 217 | name = "cairo-rs" 218 | version = "0.15.12" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" 221 | dependencies = [ 222 | "bitflags 1.3.2", 223 | "cairo-sys-rs", 224 | "glib", 225 | "libc", 226 | "thiserror", 227 | ] 228 | 229 | [[package]] 230 | name = "cairo-sys-rs" 231 | version = "0.15.1" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" 234 | dependencies = [ 235 | "glib-sys", 236 | "libc", 237 | "system-deps 6.2.2", 238 | ] 239 | 240 | [[package]] 241 | name = "cargo_toml" 242 | version = "0.15.3" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" 245 | dependencies = [ 246 | "serde", 247 | "toml 0.7.8", 248 | ] 249 | 250 | [[package]] 251 | name = "cc" 252 | version = "1.1.7" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" 255 | 256 | [[package]] 257 | name = "cesu8" 258 | version = "1.1.0" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 261 | 262 | [[package]] 263 | name = "cfb" 264 | version = "0.7.3" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" 267 | dependencies = [ 268 | "byteorder", 269 | "fnv", 270 | "uuid", 271 | ] 272 | 273 | [[package]] 274 | name = "cfg-expr" 275 | version = "0.9.1" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" 278 | dependencies = [ 279 | "smallvec", 280 | ] 281 | 282 | [[package]] 283 | name = "cfg-expr" 284 | version = "0.15.8" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" 287 | dependencies = [ 288 | "smallvec", 289 | "target-lexicon", 290 | ] 291 | 292 | [[package]] 293 | name = "cfg-if" 294 | version = "1.0.0" 295 | source = "registry+https://github.com/rust-lang/crates.io-index" 296 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 297 | 298 | [[package]] 299 | name = "chrono" 300 | version = "0.4.38" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" 303 | dependencies = [ 304 | "android-tzdata", 305 | "iana-time-zone", 306 | "num-traits", 307 | "serde", 308 | "windows-targets 0.52.6", 309 | ] 310 | 311 | [[package]] 312 | name = "cocoa" 313 | version = "0.24.1" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" 316 | dependencies = [ 317 | "bitflags 1.3.2", 318 | "block", 319 | "cocoa-foundation", 320 | "core-foundation", 321 | "core-graphics", 322 | "foreign-types", 323 | "libc", 324 | "objc", 325 | ] 326 | 327 | [[package]] 328 | name = "cocoa-foundation" 329 | version = "0.1.2" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" 332 | dependencies = [ 333 | "bitflags 1.3.2", 334 | "block", 335 | "core-foundation", 336 | "core-graphics-types", 337 | "libc", 338 | "objc", 339 | ] 340 | 341 | [[package]] 342 | name = "color_quant" 343 | version = "1.1.0" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 346 | 347 | [[package]] 348 | name = "combine" 349 | version = "4.6.7" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 352 | dependencies = [ 353 | "bytes", 354 | "memchr", 355 | ] 356 | 357 | [[package]] 358 | name = "convert_case" 359 | version = "0.4.0" 360 | source = "registry+https://github.com/rust-lang/crates.io-index" 361 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 362 | 363 | [[package]] 364 | name = "core-foundation" 365 | version = "0.9.4" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 368 | dependencies = [ 369 | "core-foundation-sys", 370 | "libc", 371 | ] 372 | 373 | [[package]] 374 | name = "core-foundation-sys" 375 | version = "0.8.6" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 378 | 379 | [[package]] 380 | name = "core-graphics" 381 | version = "0.22.3" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" 384 | dependencies = [ 385 | "bitflags 1.3.2", 386 | "core-foundation", 387 | "core-graphics-types", 388 | "foreign-types", 389 | "libc", 390 | ] 391 | 392 | [[package]] 393 | name = "core-graphics-types" 394 | version = "0.1.3" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 397 | dependencies = [ 398 | "bitflags 1.3.2", 399 | "core-foundation", 400 | "libc", 401 | ] 402 | 403 | [[package]] 404 | name = "cpufeatures" 405 | version = "0.2.12" 406 | source = "registry+https://github.com/rust-lang/crates.io-index" 407 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 408 | dependencies = [ 409 | "libc", 410 | ] 411 | 412 | [[package]] 413 | name = "crc32fast" 414 | version = "1.4.2" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 417 | dependencies = [ 418 | "cfg-if", 419 | ] 420 | 421 | [[package]] 422 | name = "crossbeam-channel" 423 | version = "0.5.13" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" 426 | dependencies = [ 427 | "crossbeam-utils", 428 | ] 429 | 430 | [[package]] 431 | name = "crossbeam-deque" 432 | version = "0.8.5" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" 435 | dependencies = [ 436 | "crossbeam-epoch", 437 | "crossbeam-utils", 438 | ] 439 | 440 | [[package]] 441 | name = "crossbeam-epoch" 442 | version = "0.9.18" 443 | source = "registry+https://github.com/rust-lang/crates.io-index" 444 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 445 | dependencies = [ 446 | "crossbeam-utils", 447 | ] 448 | 449 | [[package]] 450 | name = "crossbeam-utils" 451 | version = "0.8.20" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" 454 | 455 | [[package]] 456 | name = "crypto-common" 457 | version = "0.1.6" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 460 | dependencies = [ 461 | "generic-array", 462 | "typenum", 463 | ] 464 | 465 | [[package]] 466 | name = "cssparser" 467 | version = "0.27.2" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" 470 | dependencies = [ 471 | "cssparser-macros", 472 | "dtoa-short", 473 | "itoa 0.4.8", 474 | "matches", 475 | "phf 0.8.0", 476 | "proc-macro2", 477 | "quote", 478 | "smallvec", 479 | "syn 1.0.109", 480 | ] 481 | 482 | [[package]] 483 | name = "cssparser-macros" 484 | version = "0.6.1" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 487 | dependencies = [ 488 | "quote", 489 | "syn 2.0.72", 490 | ] 491 | 492 | [[package]] 493 | name = "ctor" 494 | version = "0.2.8" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" 497 | dependencies = [ 498 | "quote", 499 | "syn 2.0.72", 500 | ] 501 | 502 | [[package]] 503 | name = "darling" 504 | version = "0.20.10" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" 507 | dependencies = [ 508 | "darling_core", 509 | "darling_macro", 510 | ] 511 | 512 | [[package]] 513 | name = "darling_core" 514 | version = "0.20.10" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" 517 | dependencies = [ 518 | "fnv", 519 | "ident_case", 520 | "proc-macro2", 521 | "quote", 522 | "strsim", 523 | "syn 2.0.72", 524 | ] 525 | 526 | [[package]] 527 | name = "darling_macro" 528 | version = "0.20.10" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" 531 | dependencies = [ 532 | "darling_core", 533 | "quote", 534 | "syn 2.0.72", 535 | ] 536 | 537 | [[package]] 538 | name = "deranged" 539 | version = "0.3.11" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 542 | dependencies = [ 543 | "powerfmt", 544 | "serde", 545 | ] 546 | 547 | [[package]] 548 | name = "derive_more" 549 | version = "0.99.18" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" 552 | dependencies = [ 553 | "convert_case", 554 | "proc-macro2", 555 | "quote", 556 | "rustc_version", 557 | "syn 2.0.72", 558 | ] 559 | 560 | [[package]] 561 | name = "digest" 562 | version = "0.10.7" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 565 | dependencies = [ 566 | "block-buffer", 567 | "crypto-common", 568 | ] 569 | 570 | [[package]] 571 | name = "dirs-next" 572 | version = "2.0.0" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" 575 | dependencies = [ 576 | "cfg-if", 577 | "dirs-sys-next", 578 | ] 579 | 580 | [[package]] 581 | name = "dirs-sys-next" 582 | version = "0.1.2" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 585 | dependencies = [ 586 | "libc", 587 | "redox_users", 588 | "winapi", 589 | ] 590 | 591 | [[package]] 592 | name = "dispatch" 593 | version = "0.2.0" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 596 | 597 | [[package]] 598 | name = "document-features" 599 | version = "0.2.10" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" 602 | dependencies = [ 603 | "litrs", 604 | ] 605 | 606 | [[package]] 607 | name = "dtoa" 608 | version = "1.0.9" 609 | source = "registry+https://github.com/rust-lang/crates.io-index" 610 | checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" 611 | 612 | [[package]] 613 | name = "dtoa-short" 614 | version = "0.3.5" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" 617 | dependencies = [ 618 | "dtoa", 619 | ] 620 | 621 | [[package]] 622 | name = "dunce" 623 | version = "1.0.4" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" 626 | 627 | [[package]] 628 | name = "either" 629 | version = "1.13.0" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 632 | 633 | [[package]] 634 | name = "embed-resource" 635 | version = "2.4.3" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "4edcacde9351c33139a41e3c97eb2334351a81a2791bebb0b243df837128f602" 638 | dependencies = [ 639 | "cc", 640 | "memchr", 641 | "rustc_version", 642 | "toml 0.8.16", 643 | "vswhom", 644 | "winreg", 645 | ] 646 | 647 | [[package]] 648 | name = "embed_plist" 649 | version = "1.2.2" 650 | source = "registry+https://github.com/rust-lang/crates.io-index" 651 | checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" 652 | 653 | [[package]] 654 | name = "encoding_rs" 655 | version = "0.8.34" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" 658 | dependencies = [ 659 | "cfg-if", 660 | ] 661 | 662 | [[package]] 663 | name = "equivalent" 664 | version = "1.0.1" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 667 | 668 | [[package]] 669 | name = "errno" 670 | version = "0.3.9" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 673 | dependencies = [ 674 | "libc", 675 | "windows-sys 0.52.0", 676 | ] 677 | 678 | [[package]] 679 | name = "fastrand" 680 | version = "2.1.0" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 683 | 684 | [[package]] 685 | name = "fdeflate" 686 | version = "0.3.4" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" 689 | dependencies = [ 690 | "simd-adler32", 691 | ] 692 | 693 | [[package]] 694 | name = "field-offset" 695 | version = "0.3.6" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" 698 | dependencies = [ 699 | "memoffset", 700 | "rustc_version", 701 | ] 702 | 703 | [[package]] 704 | name = "filetime" 705 | version = "0.2.23" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" 708 | dependencies = [ 709 | "cfg-if", 710 | "libc", 711 | "redox_syscall 0.4.1", 712 | "windows-sys 0.52.0", 713 | ] 714 | 715 | [[package]] 716 | name = "flate2" 717 | version = "1.0.30" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" 720 | dependencies = [ 721 | "crc32fast", 722 | "miniz_oxide", 723 | ] 724 | 725 | [[package]] 726 | name = "fnv" 727 | version = "1.0.7" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 730 | 731 | [[package]] 732 | name = "foreign-types" 733 | version = "0.3.2" 734 | source = "registry+https://github.com/rust-lang/crates.io-index" 735 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 736 | dependencies = [ 737 | "foreign-types-shared", 738 | ] 739 | 740 | [[package]] 741 | name = "foreign-types-shared" 742 | version = "0.1.1" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 745 | 746 | [[package]] 747 | name = "form_urlencoded" 748 | version = "1.2.1" 749 | source = "registry+https://github.com/rust-lang/crates.io-index" 750 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 751 | dependencies = [ 752 | "percent-encoding", 753 | ] 754 | 755 | [[package]] 756 | name = "futf" 757 | version = "0.1.5" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" 760 | dependencies = [ 761 | "mac", 762 | "new_debug_unreachable", 763 | ] 764 | 765 | [[package]] 766 | name = "futures-channel" 767 | version = "0.3.30" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 770 | dependencies = [ 771 | "futures-core", 772 | ] 773 | 774 | [[package]] 775 | name = "futures-core" 776 | version = "0.3.30" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 779 | 780 | [[package]] 781 | name = "futures-executor" 782 | version = "0.3.30" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 785 | dependencies = [ 786 | "futures-core", 787 | "futures-task", 788 | "futures-util", 789 | ] 790 | 791 | [[package]] 792 | name = "futures-io" 793 | version = "0.3.30" 794 | source = "registry+https://github.com/rust-lang/crates.io-index" 795 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 796 | 797 | [[package]] 798 | name = "futures-macro" 799 | version = "0.3.30" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 802 | dependencies = [ 803 | "proc-macro2", 804 | "quote", 805 | "syn 2.0.72", 806 | ] 807 | 808 | [[package]] 809 | name = "futures-task" 810 | version = "0.3.30" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 813 | 814 | [[package]] 815 | name = "futures-util" 816 | version = "0.3.30" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 819 | dependencies = [ 820 | "futures-core", 821 | "futures-macro", 822 | "futures-task", 823 | "pin-project-lite", 824 | "pin-utils", 825 | "slab", 826 | ] 827 | 828 | [[package]] 829 | name = "fxhash" 830 | version = "0.2.1" 831 | source = "registry+https://github.com/rust-lang/crates.io-index" 832 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 833 | dependencies = [ 834 | "byteorder", 835 | ] 836 | 837 | [[package]] 838 | name = "gdk" 839 | version = "0.15.4" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" 842 | dependencies = [ 843 | "bitflags 1.3.2", 844 | "cairo-rs", 845 | "gdk-pixbuf", 846 | "gdk-sys", 847 | "gio", 848 | "glib", 849 | "libc", 850 | "pango", 851 | ] 852 | 853 | [[package]] 854 | name = "gdk-pixbuf" 855 | version = "0.15.11" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" 858 | dependencies = [ 859 | "bitflags 1.3.2", 860 | "gdk-pixbuf-sys", 861 | "gio", 862 | "glib", 863 | "libc", 864 | ] 865 | 866 | [[package]] 867 | name = "gdk-pixbuf-sys" 868 | version = "0.15.10" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" 871 | dependencies = [ 872 | "gio-sys", 873 | "glib-sys", 874 | "gobject-sys", 875 | "libc", 876 | "system-deps 6.2.2", 877 | ] 878 | 879 | [[package]] 880 | name = "gdk-sys" 881 | version = "0.15.1" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" 884 | dependencies = [ 885 | "cairo-sys-rs", 886 | "gdk-pixbuf-sys", 887 | "gio-sys", 888 | "glib-sys", 889 | "gobject-sys", 890 | "libc", 891 | "pango-sys", 892 | "pkg-config", 893 | "system-deps 6.2.2", 894 | ] 895 | 896 | [[package]] 897 | name = "gdkwayland-sys" 898 | version = "0.15.3" 899 | source = "registry+https://github.com/rust-lang/crates.io-index" 900 | checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" 901 | dependencies = [ 902 | "gdk-sys", 903 | "glib-sys", 904 | "gobject-sys", 905 | "libc", 906 | "pkg-config", 907 | "system-deps 6.2.2", 908 | ] 909 | 910 | [[package]] 911 | name = "gdkx11-sys" 912 | version = "0.15.1" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" 915 | dependencies = [ 916 | "gdk-sys", 917 | "glib-sys", 918 | "libc", 919 | "system-deps 6.2.2", 920 | "x11", 921 | ] 922 | 923 | [[package]] 924 | name = "generator" 925 | version = "0.7.5" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" 928 | dependencies = [ 929 | "cc", 930 | "libc", 931 | "log", 932 | "rustversion", 933 | "windows 0.48.0", 934 | ] 935 | 936 | [[package]] 937 | name = "generic-array" 938 | version = "0.14.7" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 941 | dependencies = [ 942 | "typenum", 943 | "version_check", 944 | ] 945 | 946 | [[package]] 947 | name = "getrandom" 948 | version = "0.1.16" 949 | source = "registry+https://github.com/rust-lang/crates.io-index" 950 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 951 | dependencies = [ 952 | "cfg-if", 953 | "libc", 954 | "wasi 0.9.0+wasi-snapshot-preview1", 955 | ] 956 | 957 | [[package]] 958 | name = "getrandom" 959 | version = "0.2.15" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 962 | dependencies = [ 963 | "cfg-if", 964 | "libc", 965 | "wasi 0.11.0+wasi-snapshot-preview1", 966 | ] 967 | 968 | [[package]] 969 | name = "gimli" 970 | version = "0.29.0" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" 973 | 974 | [[package]] 975 | name = "gio" 976 | version = "0.15.12" 977 | source = "registry+https://github.com/rust-lang/crates.io-index" 978 | checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" 979 | dependencies = [ 980 | "bitflags 1.3.2", 981 | "futures-channel", 982 | "futures-core", 983 | "futures-io", 984 | "gio-sys", 985 | "glib", 986 | "libc", 987 | "once_cell", 988 | "thiserror", 989 | ] 990 | 991 | [[package]] 992 | name = "gio-sys" 993 | version = "0.15.10" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" 996 | dependencies = [ 997 | "glib-sys", 998 | "gobject-sys", 999 | "libc", 1000 | "system-deps 6.2.2", 1001 | "winapi", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "glib" 1006 | version = "0.15.12" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" 1009 | dependencies = [ 1010 | "bitflags 1.3.2", 1011 | "futures-channel", 1012 | "futures-core", 1013 | "futures-executor", 1014 | "futures-task", 1015 | "glib-macros", 1016 | "glib-sys", 1017 | "gobject-sys", 1018 | "libc", 1019 | "once_cell", 1020 | "smallvec", 1021 | "thiserror", 1022 | ] 1023 | 1024 | [[package]] 1025 | name = "glib-macros" 1026 | version = "0.15.13" 1027 | source = "registry+https://github.com/rust-lang/crates.io-index" 1028 | checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" 1029 | dependencies = [ 1030 | "anyhow", 1031 | "heck 0.4.1", 1032 | "proc-macro-crate", 1033 | "proc-macro-error", 1034 | "proc-macro2", 1035 | "quote", 1036 | "syn 1.0.109", 1037 | ] 1038 | 1039 | [[package]] 1040 | name = "glib-sys" 1041 | version = "0.15.10" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" 1044 | dependencies = [ 1045 | "libc", 1046 | "system-deps 6.2.2", 1047 | ] 1048 | 1049 | [[package]] 1050 | name = "glob" 1051 | version = "0.3.1" 1052 | source = "registry+https://github.com/rust-lang/crates.io-index" 1053 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 1054 | 1055 | [[package]] 1056 | name = "globset" 1057 | version = "0.4.14" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" 1060 | dependencies = [ 1061 | "aho-corasick", 1062 | "bstr", 1063 | "log", 1064 | "regex-automata 0.4.7", 1065 | "regex-syntax 0.8.4", 1066 | ] 1067 | 1068 | [[package]] 1069 | name = "gobject-sys" 1070 | version = "0.15.10" 1071 | source = "registry+https://github.com/rust-lang/crates.io-index" 1072 | checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" 1073 | dependencies = [ 1074 | "glib-sys", 1075 | "libc", 1076 | "system-deps 6.2.2", 1077 | ] 1078 | 1079 | [[package]] 1080 | name = "gtk" 1081 | version = "0.15.5" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" 1084 | dependencies = [ 1085 | "atk", 1086 | "bitflags 1.3.2", 1087 | "cairo-rs", 1088 | "field-offset", 1089 | "futures-channel", 1090 | "gdk", 1091 | "gdk-pixbuf", 1092 | "gio", 1093 | "glib", 1094 | "gtk-sys", 1095 | "gtk3-macros", 1096 | "libc", 1097 | "once_cell", 1098 | "pango", 1099 | "pkg-config", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "gtk-sys" 1104 | version = "0.15.3" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" 1107 | dependencies = [ 1108 | "atk-sys", 1109 | "cairo-sys-rs", 1110 | "gdk-pixbuf-sys", 1111 | "gdk-sys", 1112 | "gio-sys", 1113 | "glib-sys", 1114 | "gobject-sys", 1115 | "libc", 1116 | "pango-sys", 1117 | "system-deps 6.2.2", 1118 | ] 1119 | 1120 | [[package]] 1121 | name = "gtk3-macros" 1122 | version = "0.15.6" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" 1125 | dependencies = [ 1126 | "anyhow", 1127 | "proc-macro-crate", 1128 | "proc-macro-error", 1129 | "proc-macro2", 1130 | "quote", 1131 | "syn 1.0.109", 1132 | ] 1133 | 1134 | [[package]] 1135 | name = "hashbrown" 1136 | version = "0.12.3" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1139 | 1140 | [[package]] 1141 | name = "hashbrown" 1142 | version = "0.14.5" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1145 | 1146 | [[package]] 1147 | name = "heck" 1148 | version = "0.3.3" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 1151 | dependencies = [ 1152 | "unicode-segmentation", 1153 | ] 1154 | 1155 | [[package]] 1156 | name = "heck" 1157 | version = "0.4.1" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 1160 | 1161 | [[package]] 1162 | name = "heck" 1163 | version = "0.5.0" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1166 | 1167 | [[package]] 1168 | name = "hex" 1169 | version = "0.4.3" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1172 | 1173 | [[package]] 1174 | name = "html5ever" 1175 | version = "0.26.0" 1176 | source = "registry+https://github.com/rust-lang/crates.io-index" 1177 | checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" 1178 | dependencies = [ 1179 | "log", 1180 | "mac", 1181 | "markup5ever", 1182 | "proc-macro2", 1183 | "quote", 1184 | "syn 1.0.109", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "http" 1189 | version = "0.2.12" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 1192 | dependencies = [ 1193 | "bytes", 1194 | "fnv", 1195 | "itoa 1.0.11", 1196 | ] 1197 | 1198 | [[package]] 1199 | name = "http-range" 1200 | version = "0.1.5" 1201 | source = "registry+https://github.com/rust-lang/crates.io-index" 1202 | checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" 1203 | 1204 | [[package]] 1205 | name = "iana-time-zone" 1206 | version = "0.1.60" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" 1209 | dependencies = [ 1210 | "android_system_properties", 1211 | "core-foundation-sys", 1212 | "iana-time-zone-haiku", 1213 | "js-sys", 1214 | "wasm-bindgen", 1215 | "windows-core", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "iana-time-zone-haiku" 1220 | version = "0.1.2" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1223 | dependencies = [ 1224 | "cc", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "ico" 1229 | version = "0.3.0" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" 1232 | dependencies = [ 1233 | "byteorder", 1234 | "png", 1235 | ] 1236 | 1237 | [[package]] 1238 | name = "ident_case" 1239 | version = "1.0.1" 1240 | source = "registry+https://github.com/rust-lang/crates.io-index" 1241 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1242 | 1243 | [[package]] 1244 | name = "idna" 1245 | version = "0.5.0" 1246 | source = "registry+https://github.com/rust-lang/crates.io-index" 1247 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 1248 | dependencies = [ 1249 | "unicode-bidi", 1250 | "unicode-normalization", 1251 | ] 1252 | 1253 | [[package]] 1254 | name = "ignore" 1255 | version = "0.4.22" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" 1258 | dependencies = [ 1259 | "crossbeam-deque", 1260 | "globset", 1261 | "log", 1262 | "memchr", 1263 | "regex-automata 0.4.7", 1264 | "same-file", 1265 | "walkdir", 1266 | "winapi-util", 1267 | ] 1268 | 1269 | [[package]] 1270 | name = "image" 1271 | version = "0.24.9" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" 1274 | dependencies = [ 1275 | "bytemuck", 1276 | "byteorder", 1277 | "color_quant", 1278 | "num-traits", 1279 | ] 1280 | 1281 | [[package]] 1282 | name = "indexmap" 1283 | version = "1.9.3" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 1286 | dependencies = [ 1287 | "autocfg", 1288 | "hashbrown 0.12.3", 1289 | "serde", 1290 | ] 1291 | 1292 | [[package]] 1293 | name = "indexmap" 1294 | version = "2.2.6" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 1297 | dependencies = [ 1298 | "equivalent", 1299 | "hashbrown 0.14.5", 1300 | "serde", 1301 | ] 1302 | 1303 | [[package]] 1304 | name = "indoc" 1305 | version = "1.0.9" 1306 | source = "registry+https://github.com/rust-lang/crates.io-index" 1307 | checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" 1308 | 1309 | [[package]] 1310 | name = "indoc" 1311 | version = "2.0.5" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" 1314 | 1315 | [[package]] 1316 | name = "infer" 1317 | version = "0.13.0" 1318 | source = "registry+https://github.com/rust-lang/crates.io-index" 1319 | checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" 1320 | dependencies = [ 1321 | "cfb", 1322 | ] 1323 | 1324 | [[package]] 1325 | name = "instant" 1326 | version = "0.1.13" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" 1329 | dependencies = [ 1330 | "cfg-if", 1331 | ] 1332 | 1333 | [[package]] 1334 | name = "is-docker" 1335 | version = "0.2.0" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" 1338 | dependencies = [ 1339 | "once_cell", 1340 | ] 1341 | 1342 | [[package]] 1343 | name = "is-wsl" 1344 | version = "0.4.0" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" 1347 | dependencies = [ 1348 | "is-docker", 1349 | "once_cell", 1350 | ] 1351 | 1352 | [[package]] 1353 | name = "itertools" 1354 | version = "0.10.5" 1355 | source = "registry+https://github.com/rust-lang/crates.io-index" 1356 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1357 | dependencies = [ 1358 | "either", 1359 | ] 1360 | 1361 | [[package]] 1362 | name = "itoa" 1363 | version = "0.4.8" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" 1366 | 1367 | [[package]] 1368 | name = "itoa" 1369 | version = "1.0.11" 1370 | source = "registry+https://github.com/rust-lang/crates.io-index" 1371 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 1372 | 1373 | [[package]] 1374 | name = "javascriptcore-rs" 1375 | version = "0.16.0" 1376 | source = "registry+https://github.com/rust-lang/crates.io-index" 1377 | checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" 1378 | dependencies = [ 1379 | "bitflags 1.3.2", 1380 | "glib", 1381 | "javascriptcore-rs-sys", 1382 | ] 1383 | 1384 | [[package]] 1385 | name = "javascriptcore-rs-sys" 1386 | version = "0.4.0" 1387 | source = "registry+https://github.com/rust-lang/crates.io-index" 1388 | checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" 1389 | dependencies = [ 1390 | "glib-sys", 1391 | "gobject-sys", 1392 | "libc", 1393 | "system-deps 5.0.0", 1394 | ] 1395 | 1396 | [[package]] 1397 | name = "jni" 1398 | version = "0.20.0" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" 1401 | dependencies = [ 1402 | "cesu8", 1403 | "combine", 1404 | "jni-sys", 1405 | "log", 1406 | "thiserror", 1407 | "walkdir", 1408 | ] 1409 | 1410 | [[package]] 1411 | name = "jni-sys" 1412 | version = "0.3.0" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 1415 | 1416 | [[package]] 1417 | name = "js-sys" 1418 | version = "0.3.69" 1419 | source = "registry+https://github.com/rust-lang/crates.io-index" 1420 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 1421 | dependencies = [ 1422 | "wasm-bindgen", 1423 | ] 1424 | 1425 | [[package]] 1426 | name = "json-patch" 1427 | version = "1.4.0" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" 1430 | dependencies = [ 1431 | "serde", 1432 | "serde_json", 1433 | "thiserror", 1434 | ] 1435 | 1436 | [[package]] 1437 | name = "kuchikiki" 1438 | version = "0.8.2" 1439 | source = "registry+https://github.com/rust-lang/crates.io-index" 1440 | checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" 1441 | dependencies = [ 1442 | "cssparser", 1443 | "html5ever", 1444 | "indexmap 1.9.3", 1445 | "matches", 1446 | "selectors", 1447 | ] 1448 | 1449 | [[package]] 1450 | name = "lazy_static" 1451 | version = "1.5.0" 1452 | source = "registry+https://github.com/rust-lang/crates.io-index" 1453 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1454 | 1455 | [[package]] 1456 | name = "libc" 1457 | version = "0.2.155" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 1460 | 1461 | [[package]] 1462 | name = "libredox" 1463 | version = "0.1.3" 1464 | source = "registry+https://github.com/rust-lang/crates.io-index" 1465 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 1466 | dependencies = [ 1467 | "bitflags 2.6.0", 1468 | "libc", 1469 | ] 1470 | 1471 | [[package]] 1472 | name = "linux-raw-sys" 1473 | version = "0.4.14" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 1476 | 1477 | [[package]] 1478 | name = "litrs" 1479 | version = "0.4.1" 1480 | source = "registry+https://github.com/rust-lang/crates.io-index" 1481 | checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 1482 | 1483 | [[package]] 1484 | name = "lock_api" 1485 | version = "0.4.12" 1486 | source = "registry+https://github.com/rust-lang/crates.io-index" 1487 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1488 | dependencies = [ 1489 | "autocfg", 1490 | "scopeguard", 1491 | ] 1492 | 1493 | [[package]] 1494 | name = "log" 1495 | version = "0.4.22" 1496 | source = "registry+https://github.com/rust-lang/crates.io-index" 1497 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 1498 | 1499 | [[package]] 1500 | name = "loom" 1501 | version = "0.5.6" 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" 1503 | checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" 1504 | dependencies = [ 1505 | "cfg-if", 1506 | "generator", 1507 | "scoped-tls", 1508 | "serde", 1509 | "serde_json", 1510 | "tracing", 1511 | "tracing-subscriber", 1512 | ] 1513 | 1514 | [[package]] 1515 | name = "mac" 1516 | version = "0.1.1" 1517 | source = "registry+https://github.com/rust-lang/crates.io-index" 1518 | checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 1519 | 1520 | [[package]] 1521 | name = "malloc_buf" 1522 | version = "0.0.6" 1523 | source = "registry+https://github.com/rust-lang/crates.io-index" 1524 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 1525 | dependencies = [ 1526 | "libc", 1527 | ] 1528 | 1529 | [[package]] 1530 | name = "markup5ever" 1531 | version = "0.11.0" 1532 | source = "registry+https://github.com/rust-lang/crates.io-index" 1533 | checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" 1534 | dependencies = [ 1535 | "log", 1536 | "phf 0.10.1", 1537 | "phf_codegen 0.10.0", 1538 | "string_cache", 1539 | "string_cache_codegen", 1540 | "tendril", 1541 | ] 1542 | 1543 | [[package]] 1544 | name = "matchers" 1545 | version = "0.1.0" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1548 | dependencies = [ 1549 | "regex-automata 0.1.10", 1550 | ] 1551 | 1552 | [[package]] 1553 | name = "matches" 1554 | version = "0.1.10" 1555 | source = "registry+https://github.com/rust-lang/crates.io-index" 1556 | checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" 1557 | 1558 | [[package]] 1559 | name = "memchr" 1560 | version = "2.7.4" 1561 | source = "registry+https://github.com/rust-lang/crates.io-index" 1562 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1563 | 1564 | [[package]] 1565 | name = "memoffset" 1566 | version = "0.9.1" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 1569 | dependencies = [ 1570 | "autocfg", 1571 | ] 1572 | 1573 | [[package]] 1574 | name = "miniz_oxide" 1575 | version = "0.7.4" 1576 | source = "registry+https://github.com/rust-lang/crates.io-index" 1577 | checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" 1578 | dependencies = [ 1579 | "adler", 1580 | "simd-adler32", 1581 | ] 1582 | 1583 | [[package]] 1584 | name = "ndk" 1585 | version = "0.6.0" 1586 | source = "registry+https://github.com/rust-lang/crates.io-index" 1587 | checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" 1588 | dependencies = [ 1589 | "bitflags 1.3.2", 1590 | "jni-sys", 1591 | "ndk-sys", 1592 | "num_enum", 1593 | "thiserror", 1594 | ] 1595 | 1596 | [[package]] 1597 | name = "ndk-context" 1598 | version = "0.1.1" 1599 | source = "registry+https://github.com/rust-lang/crates.io-index" 1600 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 1601 | 1602 | [[package]] 1603 | name = "ndk-sys" 1604 | version = "0.3.0" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" 1607 | dependencies = [ 1608 | "jni-sys", 1609 | ] 1610 | 1611 | [[package]] 1612 | name = "new_debug_unreachable" 1613 | version = "1.0.6" 1614 | source = "registry+https://github.com/rust-lang/crates.io-index" 1615 | checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 1616 | 1617 | [[package]] 1618 | name = "nodrop" 1619 | version = "0.1.14" 1620 | source = "registry+https://github.com/rust-lang/crates.io-index" 1621 | checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 1622 | 1623 | [[package]] 1624 | name = "nu-ansi-term" 1625 | version = "0.46.0" 1626 | source = "registry+https://github.com/rust-lang/crates.io-index" 1627 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1628 | dependencies = [ 1629 | "overload", 1630 | "winapi", 1631 | ] 1632 | 1633 | [[package]] 1634 | name = "num-conv" 1635 | version = "0.1.0" 1636 | source = "registry+https://github.com/rust-lang/crates.io-index" 1637 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1638 | 1639 | [[package]] 1640 | name = "num-traits" 1641 | version = "0.2.19" 1642 | source = "registry+https://github.com/rust-lang/crates.io-index" 1643 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1644 | dependencies = [ 1645 | "autocfg", 1646 | ] 1647 | 1648 | [[package]] 1649 | name = "num_enum" 1650 | version = "0.5.11" 1651 | source = "registry+https://github.com/rust-lang/crates.io-index" 1652 | checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" 1653 | dependencies = [ 1654 | "num_enum_derive", 1655 | ] 1656 | 1657 | [[package]] 1658 | name = "num_enum_derive" 1659 | version = "0.5.11" 1660 | source = "registry+https://github.com/rust-lang/crates.io-index" 1661 | checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" 1662 | dependencies = [ 1663 | "proc-macro-crate", 1664 | "proc-macro2", 1665 | "quote", 1666 | "syn 1.0.109", 1667 | ] 1668 | 1669 | [[package]] 1670 | name = "objc" 1671 | version = "0.2.7" 1672 | source = "registry+https://github.com/rust-lang/crates.io-index" 1673 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 1674 | dependencies = [ 1675 | "malloc_buf", 1676 | "objc_exception", 1677 | ] 1678 | 1679 | [[package]] 1680 | name = "objc-foundation" 1681 | version = "0.1.1" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" 1684 | dependencies = [ 1685 | "block", 1686 | "objc", 1687 | "objc_id", 1688 | ] 1689 | 1690 | [[package]] 1691 | name = "objc_exception" 1692 | version = "0.1.2" 1693 | source = "registry+https://github.com/rust-lang/crates.io-index" 1694 | checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" 1695 | dependencies = [ 1696 | "cc", 1697 | ] 1698 | 1699 | [[package]] 1700 | name = "objc_id" 1701 | version = "0.1.1" 1702 | source = "registry+https://github.com/rust-lang/crates.io-index" 1703 | checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" 1704 | dependencies = [ 1705 | "objc", 1706 | ] 1707 | 1708 | [[package]] 1709 | name = "object" 1710 | version = "0.36.2" 1711 | source = "registry+https://github.com/rust-lang/crates.io-index" 1712 | checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" 1713 | dependencies = [ 1714 | "memchr", 1715 | ] 1716 | 1717 | [[package]] 1718 | name = "once_cell" 1719 | version = "1.19.0" 1720 | source = "registry+https://github.com/rust-lang/crates.io-index" 1721 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1722 | 1723 | [[package]] 1724 | name = "open" 1725 | version = "3.2.0" 1726 | source = "registry+https://github.com/rust-lang/crates.io-index" 1727 | checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" 1728 | dependencies = [ 1729 | "pathdiff", 1730 | "windows-sys 0.42.0", 1731 | ] 1732 | 1733 | [[package]] 1734 | name = "open" 1735 | version = "5.3.0" 1736 | source = "registry+https://github.com/rust-lang/crates.io-index" 1737 | checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3" 1738 | dependencies = [ 1739 | "is-wsl", 1740 | "libc", 1741 | "pathdiff", 1742 | ] 1743 | 1744 | [[package]] 1745 | name = "overload" 1746 | version = "0.1.1" 1747 | source = "registry+https://github.com/rust-lang/crates.io-index" 1748 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1749 | 1750 | [[package]] 1751 | name = "pango" 1752 | version = "0.15.10" 1753 | source = "registry+https://github.com/rust-lang/crates.io-index" 1754 | checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" 1755 | dependencies = [ 1756 | "bitflags 1.3.2", 1757 | "glib", 1758 | "libc", 1759 | "once_cell", 1760 | "pango-sys", 1761 | ] 1762 | 1763 | [[package]] 1764 | name = "pango-sys" 1765 | version = "0.15.10" 1766 | source = "registry+https://github.com/rust-lang/crates.io-index" 1767 | checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" 1768 | dependencies = [ 1769 | "glib-sys", 1770 | "gobject-sys", 1771 | "libc", 1772 | "system-deps 6.2.2", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "parking_lot" 1777 | version = "0.12.3" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1780 | dependencies = [ 1781 | "lock_api", 1782 | "parking_lot_core", 1783 | ] 1784 | 1785 | [[package]] 1786 | name = "parking_lot_core" 1787 | version = "0.9.10" 1788 | source = "registry+https://github.com/rust-lang/crates.io-index" 1789 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1790 | dependencies = [ 1791 | "cfg-if", 1792 | "libc", 1793 | "redox_syscall 0.5.3", 1794 | "smallvec", 1795 | "windows-targets 0.52.6", 1796 | ] 1797 | 1798 | [[package]] 1799 | name = "paste" 1800 | version = "1.0.15" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1803 | 1804 | [[package]] 1805 | name = "pathdiff" 1806 | version = "0.2.1" 1807 | source = "registry+https://github.com/rust-lang/crates.io-index" 1808 | checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" 1809 | 1810 | [[package]] 1811 | name = "percent-encoding" 1812 | version = "2.3.1" 1813 | source = "registry+https://github.com/rust-lang/crates.io-index" 1814 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1815 | 1816 | [[package]] 1817 | name = "phf" 1818 | version = "0.8.0" 1819 | source = "registry+https://github.com/rust-lang/crates.io-index" 1820 | checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" 1821 | dependencies = [ 1822 | "phf_macros 0.8.0", 1823 | "phf_shared 0.8.0", 1824 | "proc-macro-hack", 1825 | ] 1826 | 1827 | [[package]] 1828 | name = "phf" 1829 | version = "0.10.1" 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" 1831 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 1832 | dependencies = [ 1833 | "phf_shared 0.10.0", 1834 | ] 1835 | 1836 | [[package]] 1837 | name = "phf" 1838 | version = "0.11.2" 1839 | source = "registry+https://github.com/rust-lang/crates.io-index" 1840 | checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" 1841 | dependencies = [ 1842 | "phf_macros 0.11.2", 1843 | "phf_shared 0.11.2", 1844 | ] 1845 | 1846 | [[package]] 1847 | name = "phf_codegen" 1848 | version = "0.8.0" 1849 | source = "registry+https://github.com/rust-lang/crates.io-index" 1850 | checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" 1851 | dependencies = [ 1852 | "phf_generator 0.8.0", 1853 | "phf_shared 0.8.0", 1854 | ] 1855 | 1856 | [[package]] 1857 | name = "phf_codegen" 1858 | version = "0.10.0" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" 1861 | dependencies = [ 1862 | "phf_generator 0.10.0", 1863 | "phf_shared 0.10.0", 1864 | ] 1865 | 1866 | [[package]] 1867 | name = "phf_generator" 1868 | version = "0.8.0" 1869 | source = "registry+https://github.com/rust-lang/crates.io-index" 1870 | checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" 1871 | dependencies = [ 1872 | "phf_shared 0.8.0", 1873 | "rand 0.7.3", 1874 | ] 1875 | 1876 | [[package]] 1877 | name = "phf_generator" 1878 | version = "0.10.0" 1879 | source = "registry+https://github.com/rust-lang/crates.io-index" 1880 | checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" 1881 | dependencies = [ 1882 | "phf_shared 0.10.0", 1883 | "rand 0.8.5", 1884 | ] 1885 | 1886 | [[package]] 1887 | name = "phf_generator" 1888 | version = "0.11.2" 1889 | source = "registry+https://github.com/rust-lang/crates.io-index" 1890 | checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" 1891 | dependencies = [ 1892 | "phf_shared 0.11.2", 1893 | "rand 0.8.5", 1894 | ] 1895 | 1896 | [[package]] 1897 | name = "phf_macros" 1898 | version = "0.8.0" 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" 1900 | checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" 1901 | dependencies = [ 1902 | "phf_generator 0.8.0", 1903 | "phf_shared 0.8.0", 1904 | "proc-macro-hack", 1905 | "proc-macro2", 1906 | "quote", 1907 | "syn 1.0.109", 1908 | ] 1909 | 1910 | [[package]] 1911 | name = "phf_macros" 1912 | version = "0.11.2" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" 1915 | dependencies = [ 1916 | "phf_generator 0.11.2", 1917 | "phf_shared 0.11.2", 1918 | "proc-macro2", 1919 | "quote", 1920 | "syn 2.0.72", 1921 | ] 1922 | 1923 | [[package]] 1924 | name = "phf_shared" 1925 | version = "0.8.0" 1926 | source = "registry+https://github.com/rust-lang/crates.io-index" 1927 | checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" 1928 | dependencies = [ 1929 | "siphasher", 1930 | ] 1931 | 1932 | [[package]] 1933 | name = "phf_shared" 1934 | version = "0.10.0" 1935 | source = "registry+https://github.com/rust-lang/crates.io-index" 1936 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 1937 | dependencies = [ 1938 | "siphasher", 1939 | ] 1940 | 1941 | [[package]] 1942 | name = "phf_shared" 1943 | version = "0.11.2" 1944 | source = "registry+https://github.com/rust-lang/crates.io-index" 1945 | checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" 1946 | dependencies = [ 1947 | "siphasher", 1948 | ] 1949 | 1950 | [[package]] 1951 | name = "pin-project-lite" 1952 | version = "0.2.14" 1953 | source = "registry+https://github.com/rust-lang/crates.io-index" 1954 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 1955 | 1956 | [[package]] 1957 | name = "pin-utils" 1958 | version = "0.1.0" 1959 | source = "registry+https://github.com/rust-lang/crates.io-index" 1960 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1961 | 1962 | [[package]] 1963 | name = "pkg-config" 1964 | version = "0.3.30" 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" 1966 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 1967 | 1968 | [[package]] 1969 | name = "plist" 1970 | version = "1.7.0" 1971 | source = "registry+https://github.com/rust-lang/crates.io-index" 1972 | checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" 1973 | dependencies = [ 1974 | "base64 0.22.1", 1975 | "indexmap 2.2.6", 1976 | "quick-xml", 1977 | "serde", 1978 | "time", 1979 | ] 1980 | 1981 | [[package]] 1982 | name = "png" 1983 | version = "0.17.13" 1984 | source = "registry+https://github.com/rust-lang/crates.io-index" 1985 | checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" 1986 | dependencies = [ 1987 | "bitflags 1.3.2", 1988 | "crc32fast", 1989 | "fdeflate", 1990 | "flate2", 1991 | "miniz_oxide", 1992 | ] 1993 | 1994 | [[package]] 1995 | name = "powerfmt" 1996 | version = "0.2.0" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1999 | 2000 | [[package]] 2001 | name = "ppv-lite86" 2002 | version = "0.2.17" 2003 | source = "registry+https://github.com/rust-lang/crates.io-index" 2004 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 2005 | 2006 | [[package]] 2007 | name = "precomputed-hash" 2008 | version = "0.1.1" 2009 | source = "registry+https://github.com/rust-lang/crates.io-index" 2010 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 2011 | 2012 | [[package]] 2013 | name = "proc-macro-crate" 2014 | version = "1.3.1" 2015 | source = "registry+https://github.com/rust-lang/crates.io-index" 2016 | checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" 2017 | dependencies = [ 2018 | "once_cell", 2019 | "toml_edit 0.19.15", 2020 | ] 2021 | 2022 | [[package]] 2023 | name = "proc-macro-error" 2024 | version = "1.0.4" 2025 | source = "registry+https://github.com/rust-lang/crates.io-index" 2026 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 2027 | dependencies = [ 2028 | "proc-macro-error-attr", 2029 | "proc-macro2", 2030 | "quote", 2031 | "syn 1.0.109", 2032 | "version_check", 2033 | ] 2034 | 2035 | [[package]] 2036 | name = "proc-macro-error-attr" 2037 | version = "1.0.4" 2038 | source = "registry+https://github.com/rust-lang/crates.io-index" 2039 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 2040 | dependencies = [ 2041 | "proc-macro2", 2042 | "quote", 2043 | "version_check", 2044 | ] 2045 | 2046 | [[package]] 2047 | name = "proc-macro-hack" 2048 | version = "0.5.20+deprecated" 2049 | source = "registry+https://github.com/rust-lang/crates.io-index" 2050 | checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" 2051 | 2052 | [[package]] 2053 | name = "proc-macro2" 2054 | version = "1.0.86" 2055 | source = "registry+https://github.com/rust-lang/crates.io-index" 2056 | checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" 2057 | dependencies = [ 2058 | "unicode-ident", 2059 | ] 2060 | 2061 | [[package]] 2062 | name = "quick-xml" 2063 | version = "0.32.0" 2064 | source = "registry+https://github.com/rust-lang/crates.io-index" 2065 | checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" 2066 | dependencies = [ 2067 | "memchr", 2068 | ] 2069 | 2070 | [[package]] 2071 | name = "quote" 2072 | version = "1.0.36" 2073 | source = "registry+https://github.com/rust-lang/crates.io-index" 2074 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 2075 | dependencies = [ 2076 | "proc-macro2", 2077 | ] 2078 | 2079 | [[package]] 2080 | name = "rand" 2081 | version = "0.7.3" 2082 | source = "registry+https://github.com/rust-lang/crates.io-index" 2083 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 2084 | dependencies = [ 2085 | "getrandom 0.1.16", 2086 | "libc", 2087 | "rand_chacha 0.2.2", 2088 | "rand_core 0.5.1", 2089 | "rand_hc", 2090 | "rand_pcg", 2091 | ] 2092 | 2093 | [[package]] 2094 | name = "rand" 2095 | version = "0.8.5" 2096 | source = "registry+https://github.com/rust-lang/crates.io-index" 2097 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2098 | dependencies = [ 2099 | "libc", 2100 | "rand_chacha 0.3.1", 2101 | "rand_core 0.6.4", 2102 | ] 2103 | 2104 | [[package]] 2105 | name = "rand_chacha" 2106 | version = "0.2.2" 2107 | source = "registry+https://github.com/rust-lang/crates.io-index" 2108 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 2109 | dependencies = [ 2110 | "ppv-lite86", 2111 | "rand_core 0.5.1", 2112 | ] 2113 | 2114 | [[package]] 2115 | name = "rand_chacha" 2116 | version = "0.3.1" 2117 | source = "registry+https://github.com/rust-lang/crates.io-index" 2118 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2119 | dependencies = [ 2120 | "ppv-lite86", 2121 | "rand_core 0.6.4", 2122 | ] 2123 | 2124 | [[package]] 2125 | name = "rand_core" 2126 | version = "0.5.1" 2127 | source = "registry+https://github.com/rust-lang/crates.io-index" 2128 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 2129 | dependencies = [ 2130 | "getrandom 0.1.16", 2131 | ] 2132 | 2133 | [[package]] 2134 | name = "rand_core" 2135 | version = "0.6.4" 2136 | source = "registry+https://github.com/rust-lang/crates.io-index" 2137 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2138 | dependencies = [ 2139 | "getrandom 0.2.15", 2140 | ] 2141 | 2142 | [[package]] 2143 | name = "rand_hc" 2144 | version = "0.2.0" 2145 | source = "registry+https://github.com/rust-lang/crates.io-index" 2146 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 2147 | dependencies = [ 2148 | "rand_core 0.5.1", 2149 | ] 2150 | 2151 | [[package]] 2152 | name = "rand_pcg" 2153 | version = "0.2.1" 2154 | source = "registry+https://github.com/rust-lang/crates.io-index" 2155 | checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" 2156 | dependencies = [ 2157 | "rand_core 0.5.1", 2158 | ] 2159 | 2160 | [[package]] 2161 | name = "raw-window-handle" 2162 | version = "0.5.2" 2163 | source = "registry+https://github.com/rust-lang/crates.io-index" 2164 | checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" 2165 | 2166 | [[package]] 2167 | name = "redox_syscall" 2168 | version = "0.4.1" 2169 | source = "registry+https://github.com/rust-lang/crates.io-index" 2170 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 2171 | dependencies = [ 2172 | "bitflags 1.3.2", 2173 | ] 2174 | 2175 | [[package]] 2176 | name = "redox_syscall" 2177 | version = "0.5.3" 2178 | source = "registry+https://github.com/rust-lang/crates.io-index" 2179 | checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" 2180 | dependencies = [ 2181 | "bitflags 2.6.0", 2182 | ] 2183 | 2184 | [[package]] 2185 | name = "redox_users" 2186 | version = "0.4.5" 2187 | source = "registry+https://github.com/rust-lang/crates.io-index" 2188 | checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" 2189 | dependencies = [ 2190 | "getrandom 0.2.15", 2191 | "libredox", 2192 | "thiserror", 2193 | ] 2194 | 2195 | [[package]] 2196 | name = "regex" 2197 | version = "1.10.5" 2198 | source = "registry+https://github.com/rust-lang/crates.io-index" 2199 | checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" 2200 | dependencies = [ 2201 | "aho-corasick", 2202 | "memchr", 2203 | "regex-automata 0.4.7", 2204 | "regex-syntax 0.8.4", 2205 | ] 2206 | 2207 | [[package]] 2208 | name = "regex-automata" 2209 | version = "0.1.10" 2210 | source = "registry+https://github.com/rust-lang/crates.io-index" 2211 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 2212 | dependencies = [ 2213 | "regex-syntax 0.6.29", 2214 | ] 2215 | 2216 | [[package]] 2217 | name = "regex-automata" 2218 | version = "0.4.7" 2219 | source = "registry+https://github.com/rust-lang/crates.io-index" 2220 | checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" 2221 | dependencies = [ 2222 | "aho-corasick", 2223 | "memchr", 2224 | "regex-syntax 0.8.4", 2225 | ] 2226 | 2227 | [[package]] 2228 | name = "regex-syntax" 2229 | version = "0.6.29" 2230 | source = "registry+https://github.com/rust-lang/crates.io-index" 2231 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 2232 | 2233 | [[package]] 2234 | name = "regex-syntax" 2235 | version = "0.8.4" 2236 | source = "registry+https://github.com/rust-lang/crates.io-index" 2237 | checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" 2238 | 2239 | [[package]] 2240 | name = "rfd" 2241 | version = "0.10.0" 2242 | source = "registry+https://github.com/rust-lang/crates.io-index" 2243 | checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" 2244 | dependencies = [ 2245 | "block", 2246 | "dispatch", 2247 | "glib-sys", 2248 | "gobject-sys", 2249 | "gtk-sys", 2250 | "js-sys", 2251 | "lazy_static", 2252 | "log", 2253 | "objc", 2254 | "objc-foundation", 2255 | "objc_id", 2256 | "raw-window-handle", 2257 | "wasm-bindgen", 2258 | "wasm-bindgen-futures", 2259 | "web-sys", 2260 | "windows 0.37.0", 2261 | ] 2262 | 2263 | [[package]] 2264 | name = "rustc-demangle" 2265 | version = "0.1.24" 2266 | source = "registry+https://github.com/rust-lang/crates.io-index" 2267 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 2268 | 2269 | [[package]] 2270 | name = "rustc_version" 2271 | version = "0.4.0" 2272 | source = "registry+https://github.com/rust-lang/crates.io-index" 2273 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 2274 | dependencies = [ 2275 | "semver", 2276 | ] 2277 | 2278 | [[package]] 2279 | name = "rustix" 2280 | version = "0.38.34" 2281 | source = "registry+https://github.com/rust-lang/crates.io-index" 2282 | checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" 2283 | dependencies = [ 2284 | "bitflags 2.6.0", 2285 | "errno", 2286 | "libc", 2287 | "linux-raw-sys", 2288 | "windows-sys 0.52.0", 2289 | ] 2290 | 2291 | [[package]] 2292 | name = "rustversion" 2293 | version = "1.0.17" 2294 | source = "registry+https://github.com/rust-lang/crates.io-index" 2295 | checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" 2296 | 2297 | [[package]] 2298 | name = "ryu" 2299 | version = "1.0.18" 2300 | source = "registry+https://github.com/rust-lang/crates.io-index" 2301 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 2302 | 2303 | [[package]] 2304 | name = "same-file" 2305 | version = "1.0.6" 2306 | source = "registry+https://github.com/rust-lang/crates.io-index" 2307 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2308 | dependencies = [ 2309 | "winapi-util", 2310 | ] 2311 | 2312 | [[package]] 2313 | name = "scoped-tls" 2314 | version = "1.0.1" 2315 | source = "registry+https://github.com/rust-lang/crates.io-index" 2316 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 2317 | 2318 | [[package]] 2319 | name = "scopeguard" 2320 | version = "1.2.0" 2321 | source = "registry+https://github.com/rust-lang/crates.io-index" 2322 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2323 | 2324 | [[package]] 2325 | name = "selectors" 2326 | version = "0.22.0" 2327 | source = "registry+https://github.com/rust-lang/crates.io-index" 2328 | checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" 2329 | dependencies = [ 2330 | "bitflags 1.3.2", 2331 | "cssparser", 2332 | "derive_more", 2333 | "fxhash", 2334 | "log", 2335 | "matches", 2336 | "phf 0.8.0", 2337 | "phf_codegen 0.8.0", 2338 | "precomputed-hash", 2339 | "servo_arc", 2340 | "smallvec", 2341 | "thin-slice", 2342 | ] 2343 | 2344 | [[package]] 2345 | name = "semver" 2346 | version = "1.0.23" 2347 | source = "registry+https://github.com/rust-lang/crates.io-index" 2348 | checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" 2349 | dependencies = [ 2350 | "serde", 2351 | ] 2352 | 2353 | [[package]] 2354 | name = "serde" 2355 | version = "1.0.204" 2356 | source = "registry+https://github.com/rust-lang/crates.io-index" 2357 | checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" 2358 | dependencies = [ 2359 | "serde_derive", 2360 | ] 2361 | 2362 | [[package]] 2363 | name = "serde_derive" 2364 | version = "1.0.204" 2365 | source = "registry+https://github.com/rust-lang/crates.io-index" 2366 | checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" 2367 | dependencies = [ 2368 | "proc-macro2", 2369 | "quote", 2370 | "syn 2.0.72", 2371 | ] 2372 | 2373 | [[package]] 2374 | name = "serde_json" 2375 | version = "1.0.121" 2376 | source = "registry+https://github.com/rust-lang/crates.io-index" 2377 | checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609" 2378 | dependencies = [ 2379 | "indexmap 2.2.6", 2380 | "itoa 1.0.11", 2381 | "memchr", 2382 | "ryu", 2383 | "serde", 2384 | ] 2385 | 2386 | [[package]] 2387 | name = "serde_repr" 2388 | version = "0.1.19" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" 2391 | dependencies = [ 2392 | "proc-macro2", 2393 | "quote", 2394 | "syn 2.0.72", 2395 | ] 2396 | 2397 | [[package]] 2398 | name = "serde_spanned" 2399 | version = "0.6.7" 2400 | source = "registry+https://github.com/rust-lang/crates.io-index" 2401 | checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" 2402 | dependencies = [ 2403 | "serde", 2404 | ] 2405 | 2406 | [[package]] 2407 | name = "serde_with" 2408 | version = "3.9.0" 2409 | source = "registry+https://github.com/rust-lang/crates.io-index" 2410 | checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" 2411 | dependencies = [ 2412 | "base64 0.22.1", 2413 | "chrono", 2414 | "hex", 2415 | "indexmap 1.9.3", 2416 | "indexmap 2.2.6", 2417 | "serde", 2418 | "serde_derive", 2419 | "serde_json", 2420 | "serde_with_macros", 2421 | "time", 2422 | ] 2423 | 2424 | [[package]] 2425 | name = "serde_with_macros" 2426 | version = "3.9.0" 2427 | source = "registry+https://github.com/rust-lang/crates.io-index" 2428 | checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" 2429 | dependencies = [ 2430 | "darling", 2431 | "proc-macro2", 2432 | "quote", 2433 | "syn 2.0.72", 2434 | ] 2435 | 2436 | [[package]] 2437 | name = "serialize-to-javascript" 2438 | version = "0.1.1" 2439 | source = "registry+https://github.com/rust-lang/crates.io-index" 2440 | checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 2441 | dependencies = [ 2442 | "serde", 2443 | "serde_json", 2444 | "serialize-to-javascript-impl", 2445 | ] 2446 | 2447 | [[package]] 2448 | name = "serialize-to-javascript-impl" 2449 | version = "0.1.1" 2450 | source = "registry+https://github.com/rust-lang/crates.io-index" 2451 | checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 2452 | dependencies = [ 2453 | "proc-macro2", 2454 | "quote", 2455 | "syn 1.0.109", 2456 | ] 2457 | 2458 | [[package]] 2459 | name = "servo_arc" 2460 | version = "0.1.1" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" 2463 | dependencies = [ 2464 | "nodrop", 2465 | "stable_deref_trait", 2466 | ] 2467 | 2468 | [[package]] 2469 | name = "sha2" 2470 | version = "0.10.8" 2471 | source = "registry+https://github.com/rust-lang/crates.io-index" 2472 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 2473 | dependencies = [ 2474 | "cfg-if", 2475 | "cpufeatures", 2476 | "digest", 2477 | ] 2478 | 2479 | [[package]] 2480 | name = "sharded-slab" 2481 | version = "0.1.7" 2482 | source = "registry+https://github.com/rust-lang/crates.io-index" 2483 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 2484 | dependencies = [ 2485 | "lazy_static", 2486 | ] 2487 | 2488 | [[package]] 2489 | name = "simd-adler32" 2490 | version = "0.3.7" 2491 | source = "registry+https://github.com/rust-lang/crates.io-index" 2492 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 2493 | 2494 | [[package]] 2495 | name = "siphasher" 2496 | version = "0.3.11" 2497 | source = "registry+https://github.com/rust-lang/crates.io-index" 2498 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 2499 | 2500 | [[package]] 2501 | name = "slab" 2502 | version = "0.4.9" 2503 | source = "registry+https://github.com/rust-lang/crates.io-index" 2504 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2505 | dependencies = [ 2506 | "autocfg", 2507 | ] 2508 | 2509 | [[package]] 2510 | name = "smallvec" 2511 | version = "1.13.2" 2512 | source = "registry+https://github.com/rust-lang/crates.io-index" 2513 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 2514 | 2515 | [[package]] 2516 | name = "soup2" 2517 | version = "0.2.1" 2518 | source = "registry+https://github.com/rust-lang/crates.io-index" 2519 | checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" 2520 | dependencies = [ 2521 | "bitflags 1.3.2", 2522 | "gio", 2523 | "glib", 2524 | "libc", 2525 | "once_cell", 2526 | "soup2-sys", 2527 | ] 2528 | 2529 | [[package]] 2530 | name = "soup2-sys" 2531 | version = "0.2.0" 2532 | source = "registry+https://github.com/rust-lang/crates.io-index" 2533 | checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" 2534 | dependencies = [ 2535 | "bitflags 1.3.2", 2536 | "gio-sys", 2537 | "glib-sys", 2538 | "gobject-sys", 2539 | "libc", 2540 | "system-deps 5.0.0", 2541 | ] 2542 | 2543 | [[package]] 2544 | name = "specta" 2545 | version = "1.0.5" 2546 | source = "registry+https://github.com/rust-lang/crates.io-index" 2547 | checksum = "c2240c3aa020aa61d2c569087d213baafbb212f4ceb9de9dd162376ea6aa0fe3" 2548 | dependencies = [ 2549 | "document-features", 2550 | "indoc 1.0.9", 2551 | "once_cell", 2552 | "paste", 2553 | "serde", 2554 | "serde_json", 2555 | "specta-macros", 2556 | "tauri", 2557 | "thiserror", 2558 | ] 2559 | 2560 | [[package]] 2561 | name = "specta-macros" 2562 | version = "1.0.5" 2563 | source = "registry+https://github.com/rust-lang/crates.io-index" 2564 | checksum = "4605306321c356e03873b8ee71d7592a5e7c508add325c3ed0677c16fdf1bcfb" 2565 | dependencies = [ 2566 | "Inflector", 2567 | "itertools", 2568 | "proc-macro2", 2569 | "quote", 2570 | "syn 1.0.109", 2571 | "termcolor", 2572 | ] 2573 | 2574 | [[package]] 2575 | name = "stable_deref_trait" 2576 | version = "1.2.0" 2577 | source = "registry+https://github.com/rust-lang/crates.io-index" 2578 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2579 | 2580 | [[package]] 2581 | name = "state" 2582 | version = "0.5.3" 2583 | source = "registry+https://github.com/rust-lang/crates.io-index" 2584 | checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" 2585 | dependencies = [ 2586 | "loom", 2587 | ] 2588 | 2589 | [[package]] 2590 | name = "string_cache" 2591 | version = "0.8.7" 2592 | source = "registry+https://github.com/rust-lang/crates.io-index" 2593 | checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" 2594 | dependencies = [ 2595 | "new_debug_unreachable", 2596 | "once_cell", 2597 | "parking_lot", 2598 | "phf_shared 0.10.0", 2599 | "precomputed-hash", 2600 | "serde", 2601 | ] 2602 | 2603 | [[package]] 2604 | name = "string_cache_codegen" 2605 | version = "0.5.2" 2606 | source = "registry+https://github.com/rust-lang/crates.io-index" 2607 | checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" 2608 | dependencies = [ 2609 | "phf_generator 0.10.0", 2610 | "phf_shared 0.10.0", 2611 | "proc-macro2", 2612 | "quote", 2613 | ] 2614 | 2615 | [[package]] 2616 | name = "strsim" 2617 | version = "0.11.1" 2618 | source = "registry+https://github.com/rust-lang/crates.io-index" 2619 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2620 | 2621 | [[package]] 2622 | name = "syn" 2623 | version = "1.0.109" 2624 | source = "registry+https://github.com/rust-lang/crates.io-index" 2625 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2626 | dependencies = [ 2627 | "proc-macro2", 2628 | "quote", 2629 | "unicode-ident", 2630 | ] 2631 | 2632 | [[package]] 2633 | name = "syn" 2634 | version = "2.0.72" 2635 | source = "registry+https://github.com/rust-lang/crates.io-index" 2636 | checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" 2637 | dependencies = [ 2638 | "proc-macro2", 2639 | "quote", 2640 | "unicode-ident", 2641 | ] 2642 | 2643 | [[package]] 2644 | name = "system-deps" 2645 | version = "5.0.0" 2646 | source = "registry+https://github.com/rust-lang/crates.io-index" 2647 | checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" 2648 | dependencies = [ 2649 | "cfg-expr 0.9.1", 2650 | "heck 0.3.3", 2651 | "pkg-config", 2652 | "toml 0.5.11", 2653 | "version-compare 0.0.11", 2654 | ] 2655 | 2656 | [[package]] 2657 | name = "system-deps" 2658 | version = "6.2.2" 2659 | source = "registry+https://github.com/rust-lang/crates.io-index" 2660 | checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" 2661 | dependencies = [ 2662 | "cfg-expr 0.15.8", 2663 | "heck 0.5.0", 2664 | "pkg-config", 2665 | "toml 0.8.16", 2666 | "version-compare 0.2.0", 2667 | ] 2668 | 2669 | [[package]] 2670 | name = "tao" 2671 | version = "0.16.9" 2672 | source = "registry+https://github.com/rust-lang/crates.io-index" 2673 | checksum = "575c856fc21e551074869dcfaad8f706412bd5b803dfa0fbf6881c4ff4bfafab" 2674 | dependencies = [ 2675 | "bitflags 1.3.2", 2676 | "cairo-rs", 2677 | "cc", 2678 | "cocoa", 2679 | "core-foundation", 2680 | "core-graphics", 2681 | "crossbeam-channel", 2682 | "dispatch", 2683 | "gdk", 2684 | "gdk-pixbuf", 2685 | "gdk-sys", 2686 | "gdkwayland-sys", 2687 | "gdkx11-sys", 2688 | "gio", 2689 | "glib", 2690 | "glib-sys", 2691 | "gtk", 2692 | "image", 2693 | "instant", 2694 | "jni", 2695 | "lazy_static", 2696 | "libc", 2697 | "log", 2698 | "ndk", 2699 | "ndk-context", 2700 | "ndk-sys", 2701 | "objc", 2702 | "once_cell", 2703 | "parking_lot", 2704 | "png", 2705 | "raw-window-handle", 2706 | "scopeguard", 2707 | "serde", 2708 | "tao-macros", 2709 | "unicode-segmentation", 2710 | "uuid", 2711 | "windows 0.39.0", 2712 | "windows-implement", 2713 | "x11-dl", 2714 | ] 2715 | 2716 | [[package]] 2717 | name = "tao-macros" 2718 | version = "0.1.2" 2719 | source = "registry+https://github.com/rust-lang/crates.io-index" 2720 | checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" 2721 | dependencies = [ 2722 | "proc-macro2", 2723 | "quote", 2724 | "syn 1.0.109", 2725 | ] 2726 | 2727 | [[package]] 2728 | name = "tar" 2729 | version = "0.4.41" 2730 | source = "registry+https://github.com/rust-lang/crates.io-index" 2731 | checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" 2732 | dependencies = [ 2733 | "filetime", 2734 | "libc", 2735 | "xattr", 2736 | ] 2737 | 2738 | [[package]] 2739 | name = "target-lexicon" 2740 | version = "0.12.15" 2741 | source = "registry+https://github.com/rust-lang/crates.io-index" 2742 | checksum = "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2" 2743 | 2744 | [[package]] 2745 | name = "tauri" 2746 | version = "1.7.1" 2747 | source = "registry+https://github.com/rust-lang/crates.io-index" 2748 | checksum = "336bc661a3f3250853fa83c6e5245449ed1c26dce5dcb28bdee7efedf6278806" 2749 | dependencies = [ 2750 | "anyhow", 2751 | "cocoa", 2752 | "dirs-next", 2753 | "dunce", 2754 | "embed_plist", 2755 | "encoding_rs", 2756 | "flate2", 2757 | "futures-util", 2758 | "getrandom 0.2.15", 2759 | "glib", 2760 | "glob", 2761 | "gtk", 2762 | "heck 0.5.0", 2763 | "http", 2764 | "ignore", 2765 | "objc", 2766 | "once_cell", 2767 | "open 3.2.0", 2768 | "percent-encoding", 2769 | "rand 0.8.5", 2770 | "raw-window-handle", 2771 | "regex", 2772 | "rfd", 2773 | "semver", 2774 | "serde", 2775 | "serde_json", 2776 | "serde_repr", 2777 | "serialize-to-javascript", 2778 | "state", 2779 | "tar", 2780 | "tauri-macros", 2781 | "tauri-runtime", 2782 | "tauri-runtime-wry", 2783 | "tauri-utils", 2784 | "tempfile", 2785 | "thiserror", 2786 | "tokio", 2787 | "url", 2788 | "uuid", 2789 | "webkit2gtk", 2790 | "webview2-com", 2791 | "windows 0.39.0", 2792 | ] 2793 | 2794 | [[package]] 2795 | name = "tauri-build" 2796 | version = "1.5.3" 2797 | source = "registry+https://github.com/rust-lang/crates.io-index" 2798 | checksum = "b0c6ec7a5c3296330c7818478948b422967ce4649094696c985f61d50076d29c" 2799 | dependencies = [ 2800 | "anyhow", 2801 | "cargo_toml", 2802 | "dirs-next", 2803 | "heck 0.5.0", 2804 | "json-patch", 2805 | "semver", 2806 | "serde", 2807 | "serde_json", 2808 | "tauri-utils", 2809 | "tauri-winres", 2810 | "walkdir", 2811 | ] 2812 | 2813 | [[package]] 2814 | name = "tauri-codegen" 2815 | version = "1.4.4" 2816 | source = "registry+https://github.com/rust-lang/crates.io-index" 2817 | checksum = "c1aed706708ff1200ec12de9cfbf2582b5d8ec05f6a7293911091effbd22036b" 2818 | dependencies = [ 2819 | "base64 0.21.7", 2820 | "brotli", 2821 | "ico", 2822 | "json-patch", 2823 | "plist", 2824 | "png", 2825 | "proc-macro2", 2826 | "quote", 2827 | "regex", 2828 | "semver", 2829 | "serde", 2830 | "serde_json", 2831 | "sha2", 2832 | "tauri-utils", 2833 | "thiserror", 2834 | "time", 2835 | "uuid", 2836 | "walkdir", 2837 | ] 2838 | 2839 | [[package]] 2840 | name = "tauri-macros" 2841 | version = "1.4.5" 2842 | source = "registry+https://github.com/rust-lang/crates.io-index" 2843 | checksum = "b88f831d2973ae4f81a706a0004e67dac87f2e4439973bbe98efbd73825d8ede" 2844 | dependencies = [ 2845 | "heck 0.5.0", 2846 | "proc-macro2", 2847 | "quote", 2848 | "syn 1.0.109", 2849 | "tauri-codegen", 2850 | "tauri-utils", 2851 | ] 2852 | 2853 | [[package]] 2854 | name = "tauri-runtime" 2855 | version = "0.14.4" 2856 | source = "registry+https://github.com/rust-lang/crates.io-index" 2857 | checksum = "3068ed62b63dedc705558f4248c7ecbd5561f0f8050949859ea0db2326f26012" 2858 | dependencies = [ 2859 | "gtk", 2860 | "http", 2861 | "http-range", 2862 | "rand 0.8.5", 2863 | "raw-window-handle", 2864 | "serde", 2865 | "serde_json", 2866 | "tauri-utils", 2867 | "thiserror", 2868 | "url", 2869 | "uuid", 2870 | "webview2-com", 2871 | "windows 0.39.0", 2872 | ] 2873 | 2874 | [[package]] 2875 | name = "tauri-runtime-wry" 2876 | version = "0.14.9" 2877 | source = "registry+https://github.com/rust-lang/crates.io-index" 2878 | checksum = "d4c3db170233096aa30330feadcd895bf9317be97e624458560a20e814db7955" 2879 | dependencies = [ 2880 | "cocoa", 2881 | "gtk", 2882 | "percent-encoding", 2883 | "rand 0.8.5", 2884 | "raw-window-handle", 2885 | "tauri-runtime", 2886 | "tauri-utils", 2887 | "uuid", 2888 | "webkit2gtk", 2889 | "webview2-com", 2890 | "windows 0.39.0", 2891 | "wry", 2892 | ] 2893 | 2894 | [[package]] 2895 | name = "tauri-specta" 2896 | version = "1.0.2" 2897 | source = "registry+https://github.com/rust-lang/crates.io-index" 2898 | checksum = "aa034c38b7bdfeccc606eca0b030a1e67a20b78e7642edef09816b7e1ff9a9de" 2899 | dependencies = [ 2900 | "heck 0.4.1", 2901 | "indoc 2.0.5", 2902 | "serde", 2903 | "serde_json", 2904 | "specta", 2905 | "tauri", 2906 | "thiserror", 2907 | ] 2908 | 2909 | [[package]] 2910 | name = "tauri-utils" 2911 | version = "1.6.0" 2912 | source = "registry+https://github.com/rust-lang/crates.io-index" 2913 | checksum = "2826db448309d382dac14d520f0c0a40839b87b57b977e59cf5f296b3ace6a93" 2914 | dependencies = [ 2915 | "brotli", 2916 | "ctor", 2917 | "dunce", 2918 | "glob", 2919 | "heck 0.5.0", 2920 | "html5ever", 2921 | "infer", 2922 | "json-patch", 2923 | "kuchikiki", 2924 | "log", 2925 | "memchr", 2926 | "phf 0.11.2", 2927 | "proc-macro2", 2928 | "quote", 2929 | "semver", 2930 | "serde", 2931 | "serde_json", 2932 | "serde_with", 2933 | "thiserror", 2934 | "url", 2935 | "walkdir", 2936 | "windows-version", 2937 | ] 2938 | 2939 | [[package]] 2940 | name = "tauri-winres" 2941 | version = "0.1.1" 2942 | source = "registry+https://github.com/rust-lang/crates.io-index" 2943 | checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" 2944 | dependencies = [ 2945 | "embed-resource", 2946 | "toml 0.7.8", 2947 | ] 2948 | 2949 | [[package]] 2950 | name = "tempfile" 2951 | version = "3.10.1" 2952 | source = "registry+https://github.com/rust-lang/crates.io-index" 2953 | checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" 2954 | dependencies = [ 2955 | "cfg-if", 2956 | "fastrand", 2957 | "rustix", 2958 | "windows-sys 0.52.0", 2959 | ] 2960 | 2961 | [[package]] 2962 | name = "tendril" 2963 | version = "0.4.3" 2964 | source = "registry+https://github.com/rust-lang/crates.io-index" 2965 | checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" 2966 | dependencies = [ 2967 | "futf", 2968 | "mac", 2969 | "utf-8", 2970 | ] 2971 | 2972 | [[package]] 2973 | name = "termcolor" 2974 | version = "1.4.1" 2975 | source = "registry+https://github.com/rust-lang/crates.io-index" 2976 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 2977 | dependencies = [ 2978 | "winapi-util", 2979 | ] 2980 | 2981 | [[package]] 2982 | name = "thin-slice" 2983 | version = "0.1.1" 2984 | source = "registry+https://github.com/rust-lang/crates.io-index" 2985 | checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" 2986 | 2987 | [[package]] 2988 | name = "thiserror" 2989 | version = "1.0.63" 2990 | source = "registry+https://github.com/rust-lang/crates.io-index" 2991 | checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" 2992 | dependencies = [ 2993 | "thiserror-impl", 2994 | ] 2995 | 2996 | [[package]] 2997 | name = "thiserror-impl" 2998 | version = "1.0.63" 2999 | source = "registry+https://github.com/rust-lang/crates.io-index" 3000 | checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" 3001 | dependencies = [ 3002 | "proc-macro2", 3003 | "quote", 3004 | "syn 2.0.72", 3005 | ] 3006 | 3007 | [[package]] 3008 | name = "thread_local" 3009 | version = "1.1.8" 3010 | source = "registry+https://github.com/rust-lang/crates.io-index" 3011 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 3012 | dependencies = [ 3013 | "cfg-if", 3014 | "once_cell", 3015 | ] 3016 | 3017 | [[package]] 3018 | name = "time" 3019 | version = "0.3.36" 3020 | source = "registry+https://github.com/rust-lang/crates.io-index" 3021 | checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 3022 | dependencies = [ 3023 | "deranged", 3024 | "itoa 1.0.11", 3025 | "num-conv", 3026 | "powerfmt", 3027 | "serde", 3028 | "time-core", 3029 | "time-macros", 3030 | ] 3031 | 3032 | [[package]] 3033 | name = "time-core" 3034 | version = "0.1.2" 3035 | source = "registry+https://github.com/rust-lang/crates.io-index" 3036 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 3037 | 3038 | [[package]] 3039 | name = "time-machine-inspector" 3040 | version = "1.2.1" 3041 | dependencies = [ 3042 | "open 5.3.0", 3043 | "plist", 3044 | "regex", 3045 | "serde", 3046 | "serde_json", 3047 | "specta", 3048 | "tauri", 3049 | "tauri-build", 3050 | "tauri-specta", 3051 | ] 3052 | 3053 | [[package]] 3054 | name = "time-macros" 3055 | version = "0.2.18" 3056 | source = "registry+https://github.com/rust-lang/crates.io-index" 3057 | checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" 3058 | dependencies = [ 3059 | "num-conv", 3060 | "time-core", 3061 | ] 3062 | 3063 | [[package]] 3064 | name = "tinyvec" 3065 | version = "1.8.0" 3066 | source = "registry+https://github.com/rust-lang/crates.io-index" 3067 | checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" 3068 | dependencies = [ 3069 | "tinyvec_macros", 3070 | ] 3071 | 3072 | [[package]] 3073 | name = "tinyvec_macros" 3074 | version = "0.1.1" 3075 | source = "registry+https://github.com/rust-lang/crates.io-index" 3076 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 3077 | 3078 | [[package]] 3079 | name = "tokio" 3080 | version = "1.39.2" 3081 | source = "registry+https://github.com/rust-lang/crates.io-index" 3082 | checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" 3083 | dependencies = [ 3084 | "backtrace", 3085 | "bytes", 3086 | "pin-project-lite", 3087 | ] 3088 | 3089 | [[package]] 3090 | name = "toml" 3091 | version = "0.5.11" 3092 | source = "registry+https://github.com/rust-lang/crates.io-index" 3093 | checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" 3094 | dependencies = [ 3095 | "serde", 3096 | ] 3097 | 3098 | [[package]] 3099 | name = "toml" 3100 | version = "0.7.8" 3101 | source = "registry+https://github.com/rust-lang/crates.io-index" 3102 | checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" 3103 | dependencies = [ 3104 | "serde", 3105 | "serde_spanned", 3106 | "toml_datetime", 3107 | "toml_edit 0.19.15", 3108 | ] 3109 | 3110 | [[package]] 3111 | name = "toml" 3112 | version = "0.8.16" 3113 | source = "registry+https://github.com/rust-lang/crates.io-index" 3114 | checksum = "81967dd0dd2c1ab0bc3468bd7caecc32b8a4aa47d0c8c695d8c2b2108168d62c" 3115 | dependencies = [ 3116 | "serde", 3117 | "serde_spanned", 3118 | "toml_datetime", 3119 | "toml_edit 0.22.17", 3120 | ] 3121 | 3122 | [[package]] 3123 | name = "toml_datetime" 3124 | version = "0.6.7" 3125 | source = "registry+https://github.com/rust-lang/crates.io-index" 3126 | checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db" 3127 | dependencies = [ 3128 | "serde", 3129 | ] 3130 | 3131 | [[package]] 3132 | name = "toml_edit" 3133 | version = "0.19.15" 3134 | source = "registry+https://github.com/rust-lang/crates.io-index" 3135 | checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 3136 | dependencies = [ 3137 | "indexmap 2.2.6", 3138 | "serde", 3139 | "serde_spanned", 3140 | "toml_datetime", 3141 | "winnow 0.5.40", 3142 | ] 3143 | 3144 | [[package]] 3145 | name = "toml_edit" 3146 | version = "0.22.17" 3147 | source = "registry+https://github.com/rust-lang/crates.io-index" 3148 | checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16" 3149 | dependencies = [ 3150 | "indexmap 2.2.6", 3151 | "serde", 3152 | "serde_spanned", 3153 | "toml_datetime", 3154 | "winnow 0.6.16", 3155 | ] 3156 | 3157 | [[package]] 3158 | name = "tracing" 3159 | version = "0.1.40" 3160 | source = "registry+https://github.com/rust-lang/crates.io-index" 3161 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 3162 | dependencies = [ 3163 | "pin-project-lite", 3164 | "tracing-attributes", 3165 | "tracing-core", 3166 | ] 3167 | 3168 | [[package]] 3169 | name = "tracing-attributes" 3170 | version = "0.1.27" 3171 | source = "registry+https://github.com/rust-lang/crates.io-index" 3172 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 3173 | dependencies = [ 3174 | "proc-macro2", 3175 | "quote", 3176 | "syn 2.0.72", 3177 | ] 3178 | 3179 | [[package]] 3180 | name = "tracing-core" 3181 | version = "0.1.32" 3182 | source = "registry+https://github.com/rust-lang/crates.io-index" 3183 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 3184 | dependencies = [ 3185 | "once_cell", 3186 | "valuable", 3187 | ] 3188 | 3189 | [[package]] 3190 | name = "tracing-log" 3191 | version = "0.2.0" 3192 | source = "registry+https://github.com/rust-lang/crates.io-index" 3193 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 3194 | dependencies = [ 3195 | "log", 3196 | "once_cell", 3197 | "tracing-core", 3198 | ] 3199 | 3200 | [[package]] 3201 | name = "tracing-subscriber" 3202 | version = "0.3.18" 3203 | source = "registry+https://github.com/rust-lang/crates.io-index" 3204 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 3205 | dependencies = [ 3206 | "matchers", 3207 | "nu-ansi-term", 3208 | "once_cell", 3209 | "regex", 3210 | "sharded-slab", 3211 | "smallvec", 3212 | "thread_local", 3213 | "tracing", 3214 | "tracing-core", 3215 | "tracing-log", 3216 | ] 3217 | 3218 | [[package]] 3219 | name = "typenum" 3220 | version = "1.17.0" 3221 | source = "registry+https://github.com/rust-lang/crates.io-index" 3222 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 3223 | 3224 | [[package]] 3225 | name = "unicode-bidi" 3226 | version = "0.3.15" 3227 | source = "registry+https://github.com/rust-lang/crates.io-index" 3228 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 3229 | 3230 | [[package]] 3231 | name = "unicode-ident" 3232 | version = "1.0.12" 3233 | source = "registry+https://github.com/rust-lang/crates.io-index" 3234 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 3235 | 3236 | [[package]] 3237 | name = "unicode-normalization" 3238 | version = "0.1.23" 3239 | source = "registry+https://github.com/rust-lang/crates.io-index" 3240 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 3241 | dependencies = [ 3242 | "tinyvec", 3243 | ] 3244 | 3245 | [[package]] 3246 | name = "unicode-segmentation" 3247 | version = "1.11.0" 3248 | source = "registry+https://github.com/rust-lang/crates.io-index" 3249 | checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" 3250 | 3251 | [[package]] 3252 | name = "url" 3253 | version = "2.5.2" 3254 | source = "registry+https://github.com/rust-lang/crates.io-index" 3255 | checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" 3256 | dependencies = [ 3257 | "form_urlencoded", 3258 | "idna", 3259 | "percent-encoding", 3260 | "serde", 3261 | ] 3262 | 3263 | [[package]] 3264 | name = "utf-8" 3265 | version = "0.7.6" 3266 | source = "registry+https://github.com/rust-lang/crates.io-index" 3267 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 3268 | 3269 | [[package]] 3270 | name = "uuid" 3271 | version = "1.10.0" 3272 | source = "registry+https://github.com/rust-lang/crates.io-index" 3273 | checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" 3274 | dependencies = [ 3275 | "getrandom 0.2.15", 3276 | ] 3277 | 3278 | [[package]] 3279 | name = "valuable" 3280 | version = "0.1.0" 3281 | source = "registry+https://github.com/rust-lang/crates.io-index" 3282 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 3283 | 3284 | [[package]] 3285 | name = "version-compare" 3286 | version = "0.0.11" 3287 | source = "registry+https://github.com/rust-lang/crates.io-index" 3288 | checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" 3289 | 3290 | [[package]] 3291 | name = "version-compare" 3292 | version = "0.2.0" 3293 | source = "registry+https://github.com/rust-lang/crates.io-index" 3294 | checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 3295 | 3296 | [[package]] 3297 | name = "version_check" 3298 | version = "0.9.5" 3299 | source = "registry+https://github.com/rust-lang/crates.io-index" 3300 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 3301 | 3302 | [[package]] 3303 | name = "vswhom" 3304 | version = "0.1.0" 3305 | source = "registry+https://github.com/rust-lang/crates.io-index" 3306 | checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" 3307 | dependencies = [ 3308 | "libc", 3309 | "vswhom-sys", 3310 | ] 3311 | 3312 | [[package]] 3313 | name = "vswhom-sys" 3314 | version = "0.1.2" 3315 | source = "registry+https://github.com/rust-lang/crates.io-index" 3316 | checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" 3317 | dependencies = [ 3318 | "cc", 3319 | "libc", 3320 | ] 3321 | 3322 | [[package]] 3323 | name = "walkdir" 3324 | version = "2.5.0" 3325 | source = "registry+https://github.com/rust-lang/crates.io-index" 3326 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 3327 | dependencies = [ 3328 | "same-file", 3329 | "winapi-util", 3330 | ] 3331 | 3332 | [[package]] 3333 | name = "wasi" 3334 | version = "0.9.0+wasi-snapshot-preview1" 3335 | source = "registry+https://github.com/rust-lang/crates.io-index" 3336 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 3337 | 3338 | [[package]] 3339 | name = "wasi" 3340 | version = "0.11.0+wasi-snapshot-preview1" 3341 | source = "registry+https://github.com/rust-lang/crates.io-index" 3342 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3343 | 3344 | [[package]] 3345 | name = "wasm-bindgen" 3346 | version = "0.2.92" 3347 | source = "registry+https://github.com/rust-lang/crates.io-index" 3348 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 3349 | dependencies = [ 3350 | "cfg-if", 3351 | "wasm-bindgen-macro", 3352 | ] 3353 | 3354 | [[package]] 3355 | name = "wasm-bindgen-backend" 3356 | version = "0.2.92" 3357 | source = "registry+https://github.com/rust-lang/crates.io-index" 3358 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 3359 | dependencies = [ 3360 | "bumpalo", 3361 | "log", 3362 | "once_cell", 3363 | "proc-macro2", 3364 | "quote", 3365 | "syn 2.0.72", 3366 | "wasm-bindgen-shared", 3367 | ] 3368 | 3369 | [[package]] 3370 | name = "wasm-bindgen-futures" 3371 | version = "0.4.42" 3372 | source = "registry+https://github.com/rust-lang/crates.io-index" 3373 | checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" 3374 | dependencies = [ 3375 | "cfg-if", 3376 | "js-sys", 3377 | "wasm-bindgen", 3378 | "web-sys", 3379 | ] 3380 | 3381 | [[package]] 3382 | name = "wasm-bindgen-macro" 3383 | version = "0.2.92" 3384 | source = "registry+https://github.com/rust-lang/crates.io-index" 3385 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 3386 | dependencies = [ 3387 | "quote", 3388 | "wasm-bindgen-macro-support", 3389 | ] 3390 | 3391 | [[package]] 3392 | name = "wasm-bindgen-macro-support" 3393 | version = "0.2.92" 3394 | source = "registry+https://github.com/rust-lang/crates.io-index" 3395 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 3396 | dependencies = [ 3397 | "proc-macro2", 3398 | "quote", 3399 | "syn 2.0.72", 3400 | "wasm-bindgen-backend", 3401 | "wasm-bindgen-shared", 3402 | ] 3403 | 3404 | [[package]] 3405 | name = "wasm-bindgen-shared" 3406 | version = "0.2.92" 3407 | source = "registry+https://github.com/rust-lang/crates.io-index" 3408 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 3409 | 3410 | [[package]] 3411 | name = "web-sys" 3412 | version = "0.3.69" 3413 | source = "registry+https://github.com/rust-lang/crates.io-index" 3414 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 3415 | dependencies = [ 3416 | "js-sys", 3417 | "wasm-bindgen", 3418 | ] 3419 | 3420 | [[package]] 3421 | name = "webkit2gtk" 3422 | version = "0.18.2" 3423 | source = "registry+https://github.com/rust-lang/crates.io-index" 3424 | checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" 3425 | dependencies = [ 3426 | "bitflags 1.3.2", 3427 | "cairo-rs", 3428 | "gdk", 3429 | "gdk-sys", 3430 | "gio", 3431 | "gio-sys", 3432 | "glib", 3433 | "glib-sys", 3434 | "gobject-sys", 3435 | "gtk", 3436 | "gtk-sys", 3437 | "javascriptcore-rs", 3438 | "libc", 3439 | "once_cell", 3440 | "soup2", 3441 | "webkit2gtk-sys", 3442 | ] 3443 | 3444 | [[package]] 3445 | name = "webkit2gtk-sys" 3446 | version = "0.18.0" 3447 | source = "registry+https://github.com/rust-lang/crates.io-index" 3448 | checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" 3449 | dependencies = [ 3450 | "atk-sys", 3451 | "bitflags 1.3.2", 3452 | "cairo-sys-rs", 3453 | "gdk-pixbuf-sys", 3454 | "gdk-sys", 3455 | "gio-sys", 3456 | "glib-sys", 3457 | "gobject-sys", 3458 | "gtk-sys", 3459 | "javascriptcore-rs-sys", 3460 | "libc", 3461 | "pango-sys", 3462 | "pkg-config", 3463 | "soup2-sys", 3464 | "system-deps 6.2.2", 3465 | ] 3466 | 3467 | [[package]] 3468 | name = "webview2-com" 3469 | version = "0.19.1" 3470 | source = "registry+https://github.com/rust-lang/crates.io-index" 3471 | checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" 3472 | dependencies = [ 3473 | "webview2-com-macros", 3474 | "webview2-com-sys", 3475 | "windows 0.39.0", 3476 | "windows-implement", 3477 | ] 3478 | 3479 | [[package]] 3480 | name = "webview2-com-macros" 3481 | version = "0.6.0" 3482 | source = "registry+https://github.com/rust-lang/crates.io-index" 3483 | checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" 3484 | dependencies = [ 3485 | "proc-macro2", 3486 | "quote", 3487 | "syn 1.0.109", 3488 | ] 3489 | 3490 | [[package]] 3491 | name = "webview2-com-sys" 3492 | version = "0.19.0" 3493 | source = "registry+https://github.com/rust-lang/crates.io-index" 3494 | checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" 3495 | dependencies = [ 3496 | "regex", 3497 | "serde", 3498 | "serde_json", 3499 | "thiserror", 3500 | "windows 0.39.0", 3501 | "windows-bindgen", 3502 | "windows-metadata", 3503 | ] 3504 | 3505 | [[package]] 3506 | name = "winapi" 3507 | version = "0.3.9" 3508 | source = "registry+https://github.com/rust-lang/crates.io-index" 3509 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3510 | dependencies = [ 3511 | "winapi-i686-pc-windows-gnu", 3512 | "winapi-x86_64-pc-windows-gnu", 3513 | ] 3514 | 3515 | [[package]] 3516 | name = "winapi-i686-pc-windows-gnu" 3517 | version = "0.4.0" 3518 | source = "registry+https://github.com/rust-lang/crates.io-index" 3519 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3520 | 3521 | [[package]] 3522 | name = "winapi-util" 3523 | version = "0.1.8" 3524 | source = "registry+https://github.com/rust-lang/crates.io-index" 3525 | checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" 3526 | dependencies = [ 3527 | "windows-sys 0.52.0", 3528 | ] 3529 | 3530 | [[package]] 3531 | name = "winapi-x86_64-pc-windows-gnu" 3532 | version = "0.4.0" 3533 | source = "registry+https://github.com/rust-lang/crates.io-index" 3534 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3535 | 3536 | [[package]] 3537 | name = "windows" 3538 | version = "0.37.0" 3539 | source = "registry+https://github.com/rust-lang/crates.io-index" 3540 | checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" 3541 | dependencies = [ 3542 | "windows_aarch64_msvc 0.37.0", 3543 | "windows_i686_gnu 0.37.0", 3544 | "windows_i686_msvc 0.37.0", 3545 | "windows_x86_64_gnu 0.37.0", 3546 | "windows_x86_64_msvc 0.37.0", 3547 | ] 3548 | 3549 | [[package]] 3550 | name = "windows" 3551 | version = "0.39.0" 3552 | source = "registry+https://github.com/rust-lang/crates.io-index" 3553 | checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" 3554 | dependencies = [ 3555 | "windows-implement", 3556 | "windows_aarch64_msvc 0.39.0", 3557 | "windows_i686_gnu 0.39.0", 3558 | "windows_i686_msvc 0.39.0", 3559 | "windows_x86_64_gnu 0.39.0", 3560 | "windows_x86_64_msvc 0.39.0", 3561 | ] 3562 | 3563 | [[package]] 3564 | name = "windows" 3565 | version = "0.48.0" 3566 | source = "registry+https://github.com/rust-lang/crates.io-index" 3567 | checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" 3568 | dependencies = [ 3569 | "windows-targets 0.48.5", 3570 | ] 3571 | 3572 | [[package]] 3573 | name = "windows-bindgen" 3574 | version = "0.39.0" 3575 | source = "registry+https://github.com/rust-lang/crates.io-index" 3576 | checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" 3577 | dependencies = [ 3578 | "windows-metadata", 3579 | "windows-tokens", 3580 | ] 3581 | 3582 | [[package]] 3583 | name = "windows-core" 3584 | version = "0.52.0" 3585 | source = "registry+https://github.com/rust-lang/crates.io-index" 3586 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 3587 | dependencies = [ 3588 | "windows-targets 0.52.6", 3589 | ] 3590 | 3591 | [[package]] 3592 | name = "windows-implement" 3593 | version = "0.39.0" 3594 | source = "registry+https://github.com/rust-lang/crates.io-index" 3595 | checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" 3596 | dependencies = [ 3597 | "syn 1.0.109", 3598 | "windows-tokens", 3599 | ] 3600 | 3601 | [[package]] 3602 | name = "windows-metadata" 3603 | version = "0.39.0" 3604 | source = "registry+https://github.com/rust-lang/crates.io-index" 3605 | checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" 3606 | 3607 | [[package]] 3608 | name = "windows-sys" 3609 | version = "0.42.0" 3610 | source = "registry+https://github.com/rust-lang/crates.io-index" 3611 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 3612 | dependencies = [ 3613 | "windows_aarch64_gnullvm 0.42.2", 3614 | "windows_aarch64_msvc 0.42.2", 3615 | "windows_i686_gnu 0.42.2", 3616 | "windows_i686_msvc 0.42.2", 3617 | "windows_x86_64_gnu 0.42.2", 3618 | "windows_x86_64_gnullvm 0.42.2", 3619 | "windows_x86_64_msvc 0.42.2", 3620 | ] 3621 | 3622 | [[package]] 3623 | name = "windows-sys" 3624 | version = "0.48.0" 3625 | source = "registry+https://github.com/rust-lang/crates.io-index" 3626 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3627 | dependencies = [ 3628 | "windows-targets 0.48.5", 3629 | ] 3630 | 3631 | [[package]] 3632 | name = "windows-sys" 3633 | version = "0.52.0" 3634 | source = "registry+https://github.com/rust-lang/crates.io-index" 3635 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3636 | dependencies = [ 3637 | "windows-targets 0.52.6", 3638 | ] 3639 | 3640 | [[package]] 3641 | name = "windows-targets" 3642 | version = "0.48.5" 3643 | source = "registry+https://github.com/rust-lang/crates.io-index" 3644 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3645 | dependencies = [ 3646 | "windows_aarch64_gnullvm 0.48.5", 3647 | "windows_aarch64_msvc 0.48.5", 3648 | "windows_i686_gnu 0.48.5", 3649 | "windows_i686_msvc 0.48.5", 3650 | "windows_x86_64_gnu 0.48.5", 3651 | "windows_x86_64_gnullvm 0.48.5", 3652 | "windows_x86_64_msvc 0.48.5", 3653 | ] 3654 | 3655 | [[package]] 3656 | name = "windows-targets" 3657 | version = "0.52.6" 3658 | source = "registry+https://github.com/rust-lang/crates.io-index" 3659 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3660 | dependencies = [ 3661 | "windows_aarch64_gnullvm 0.52.6", 3662 | "windows_aarch64_msvc 0.52.6", 3663 | "windows_i686_gnu 0.52.6", 3664 | "windows_i686_gnullvm", 3665 | "windows_i686_msvc 0.52.6", 3666 | "windows_x86_64_gnu 0.52.6", 3667 | "windows_x86_64_gnullvm 0.52.6", 3668 | "windows_x86_64_msvc 0.52.6", 3669 | ] 3670 | 3671 | [[package]] 3672 | name = "windows-tokens" 3673 | version = "0.39.0" 3674 | source = "registry+https://github.com/rust-lang/crates.io-index" 3675 | checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" 3676 | 3677 | [[package]] 3678 | name = "windows-version" 3679 | version = "0.1.1" 3680 | source = "registry+https://github.com/rust-lang/crates.io-index" 3681 | checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" 3682 | dependencies = [ 3683 | "windows-targets 0.52.6", 3684 | ] 3685 | 3686 | [[package]] 3687 | name = "windows_aarch64_gnullvm" 3688 | version = "0.42.2" 3689 | source = "registry+https://github.com/rust-lang/crates.io-index" 3690 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 3691 | 3692 | [[package]] 3693 | name = "windows_aarch64_gnullvm" 3694 | version = "0.48.5" 3695 | source = "registry+https://github.com/rust-lang/crates.io-index" 3696 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3697 | 3698 | [[package]] 3699 | name = "windows_aarch64_gnullvm" 3700 | version = "0.52.6" 3701 | source = "registry+https://github.com/rust-lang/crates.io-index" 3702 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3703 | 3704 | [[package]] 3705 | name = "windows_aarch64_msvc" 3706 | version = "0.37.0" 3707 | source = "registry+https://github.com/rust-lang/crates.io-index" 3708 | checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" 3709 | 3710 | [[package]] 3711 | name = "windows_aarch64_msvc" 3712 | version = "0.39.0" 3713 | source = "registry+https://github.com/rust-lang/crates.io-index" 3714 | checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" 3715 | 3716 | [[package]] 3717 | name = "windows_aarch64_msvc" 3718 | version = "0.42.2" 3719 | source = "registry+https://github.com/rust-lang/crates.io-index" 3720 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 3721 | 3722 | [[package]] 3723 | name = "windows_aarch64_msvc" 3724 | version = "0.48.5" 3725 | source = "registry+https://github.com/rust-lang/crates.io-index" 3726 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3727 | 3728 | [[package]] 3729 | name = "windows_aarch64_msvc" 3730 | version = "0.52.6" 3731 | source = "registry+https://github.com/rust-lang/crates.io-index" 3732 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3733 | 3734 | [[package]] 3735 | name = "windows_i686_gnu" 3736 | version = "0.37.0" 3737 | source = "registry+https://github.com/rust-lang/crates.io-index" 3738 | checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" 3739 | 3740 | [[package]] 3741 | name = "windows_i686_gnu" 3742 | version = "0.39.0" 3743 | source = "registry+https://github.com/rust-lang/crates.io-index" 3744 | checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" 3745 | 3746 | [[package]] 3747 | name = "windows_i686_gnu" 3748 | version = "0.42.2" 3749 | source = "registry+https://github.com/rust-lang/crates.io-index" 3750 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 3751 | 3752 | [[package]] 3753 | name = "windows_i686_gnu" 3754 | version = "0.48.5" 3755 | source = "registry+https://github.com/rust-lang/crates.io-index" 3756 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3757 | 3758 | [[package]] 3759 | name = "windows_i686_gnu" 3760 | version = "0.52.6" 3761 | source = "registry+https://github.com/rust-lang/crates.io-index" 3762 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3763 | 3764 | [[package]] 3765 | name = "windows_i686_gnullvm" 3766 | version = "0.52.6" 3767 | source = "registry+https://github.com/rust-lang/crates.io-index" 3768 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3769 | 3770 | [[package]] 3771 | name = "windows_i686_msvc" 3772 | version = "0.37.0" 3773 | source = "registry+https://github.com/rust-lang/crates.io-index" 3774 | checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" 3775 | 3776 | [[package]] 3777 | name = "windows_i686_msvc" 3778 | version = "0.39.0" 3779 | source = "registry+https://github.com/rust-lang/crates.io-index" 3780 | checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" 3781 | 3782 | [[package]] 3783 | name = "windows_i686_msvc" 3784 | version = "0.42.2" 3785 | source = "registry+https://github.com/rust-lang/crates.io-index" 3786 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 3787 | 3788 | [[package]] 3789 | name = "windows_i686_msvc" 3790 | version = "0.48.5" 3791 | source = "registry+https://github.com/rust-lang/crates.io-index" 3792 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3793 | 3794 | [[package]] 3795 | name = "windows_i686_msvc" 3796 | version = "0.52.6" 3797 | source = "registry+https://github.com/rust-lang/crates.io-index" 3798 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3799 | 3800 | [[package]] 3801 | name = "windows_x86_64_gnu" 3802 | version = "0.37.0" 3803 | source = "registry+https://github.com/rust-lang/crates.io-index" 3804 | checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" 3805 | 3806 | [[package]] 3807 | name = "windows_x86_64_gnu" 3808 | version = "0.39.0" 3809 | source = "registry+https://github.com/rust-lang/crates.io-index" 3810 | checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" 3811 | 3812 | [[package]] 3813 | name = "windows_x86_64_gnu" 3814 | version = "0.42.2" 3815 | source = "registry+https://github.com/rust-lang/crates.io-index" 3816 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 3817 | 3818 | [[package]] 3819 | name = "windows_x86_64_gnu" 3820 | version = "0.48.5" 3821 | source = "registry+https://github.com/rust-lang/crates.io-index" 3822 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3823 | 3824 | [[package]] 3825 | name = "windows_x86_64_gnu" 3826 | version = "0.52.6" 3827 | source = "registry+https://github.com/rust-lang/crates.io-index" 3828 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3829 | 3830 | [[package]] 3831 | name = "windows_x86_64_gnullvm" 3832 | version = "0.42.2" 3833 | source = "registry+https://github.com/rust-lang/crates.io-index" 3834 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 3835 | 3836 | [[package]] 3837 | name = "windows_x86_64_gnullvm" 3838 | version = "0.48.5" 3839 | source = "registry+https://github.com/rust-lang/crates.io-index" 3840 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3841 | 3842 | [[package]] 3843 | name = "windows_x86_64_gnullvm" 3844 | version = "0.52.6" 3845 | source = "registry+https://github.com/rust-lang/crates.io-index" 3846 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3847 | 3848 | [[package]] 3849 | name = "windows_x86_64_msvc" 3850 | version = "0.37.0" 3851 | source = "registry+https://github.com/rust-lang/crates.io-index" 3852 | checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" 3853 | 3854 | [[package]] 3855 | name = "windows_x86_64_msvc" 3856 | version = "0.39.0" 3857 | source = "registry+https://github.com/rust-lang/crates.io-index" 3858 | checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" 3859 | 3860 | [[package]] 3861 | name = "windows_x86_64_msvc" 3862 | version = "0.42.2" 3863 | source = "registry+https://github.com/rust-lang/crates.io-index" 3864 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 3865 | 3866 | [[package]] 3867 | name = "windows_x86_64_msvc" 3868 | version = "0.48.5" 3869 | source = "registry+https://github.com/rust-lang/crates.io-index" 3870 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 3871 | 3872 | [[package]] 3873 | name = "windows_x86_64_msvc" 3874 | version = "0.52.6" 3875 | source = "registry+https://github.com/rust-lang/crates.io-index" 3876 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3877 | 3878 | [[package]] 3879 | name = "winnow" 3880 | version = "0.5.40" 3881 | source = "registry+https://github.com/rust-lang/crates.io-index" 3882 | checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" 3883 | dependencies = [ 3884 | "memchr", 3885 | ] 3886 | 3887 | [[package]] 3888 | name = "winnow" 3889 | version = "0.6.16" 3890 | source = "registry+https://github.com/rust-lang/crates.io-index" 3891 | checksum = "b480ae9340fc261e6be3e95a1ba86d54ae3f9171132a73ce8d4bbaf68339507c" 3892 | dependencies = [ 3893 | "memchr", 3894 | ] 3895 | 3896 | [[package]] 3897 | name = "winreg" 3898 | version = "0.52.0" 3899 | source = "registry+https://github.com/rust-lang/crates.io-index" 3900 | checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" 3901 | dependencies = [ 3902 | "cfg-if", 3903 | "windows-sys 0.48.0", 3904 | ] 3905 | 3906 | [[package]] 3907 | name = "wry" 3908 | version = "0.24.10" 3909 | source = "registry+https://github.com/rust-lang/crates.io-index" 3910 | checksum = "00711278ed357350d44c749c286786ecac644e044e4da410d466212152383b45" 3911 | dependencies = [ 3912 | "base64 0.13.1", 3913 | "block", 3914 | "cocoa", 3915 | "core-graphics", 3916 | "crossbeam-channel", 3917 | "dunce", 3918 | "gdk", 3919 | "gio", 3920 | "glib", 3921 | "gtk", 3922 | "html5ever", 3923 | "http", 3924 | "kuchikiki", 3925 | "libc", 3926 | "log", 3927 | "objc", 3928 | "objc_id", 3929 | "once_cell", 3930 | "serde", 3931 | "serde_json", 3932 | "sha2", 3933 | "soup2", 3934 | "tao", 3935 | "thiserror", 3936 | "url", 3937 | "webkit2gtk", 3938 | "webkit2gtk-sys", 3939 | "webview2-com", 3940 | "windows 0.39.0", 3941 | "windows-implement", 3942 | ] 3943 | 3944 | [[package]] 3945 | name = "x11" 3946 | version = "2.21.0" 3947 | source = "registry+https://github.com/rust-lang/crates.io-index" 3948 | checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" 3949 | dependencies = [ 3950 | "libc", 3951 | "pkg-config", 3952 | ] 3953 | 3954 | [[package]] 3955 | name = "x11-dl" 3956 | version = "2.21.0" 3957 | source = "registry+https://github.com/rust-lang/crates.io-index" 3958 | checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 3959 | dependencies = [ 3960 | "libc", 3961 | "once_cell", 3962 | "pkg-config", 3963 | ] 3964 | 3965 | [[package]] 3966 | name = "xattr" 3967 | version = "1.3.1" 3968 | source = "registry+https://github.com/rust-lang/crates.io-index" 3969 | checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" 3970 | dependencies = [ 3971 | "libc", 3972 | "linux-raw-sys", 3973 | "rustix", 3974 | ] 3975 | --------------------------------------------------------------------------------