├── .gitignore ├── src ├── constants.rs ├── config.rs ├── map.rs └── main.rs ├── readme_ko.md ├── readme.md ├── Cargo.toml ├── LICENSE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /src/constants.rs: -------------------------------------------------------------------------------- 1 | /* 2 | * Created on Sat Feb 05 2022 3 | * 4 | * Copyright (c) storycraft. Licensed under the MIT Licence. 5 | */ 6 | 7 | pub const CONFIG_FILE: &str = "direct_share.toml"; 8 | pub const FALLBACK_FILENAME: &str = "unknown"; 9 | 10 | pub const TAR_BUF_SIZE: usize = 65536; 11 | pub const FILE_BUF_SIZE: usize = 65536; 12 | -------------------------------------------------------------------------------- /readme_ko.md: -------------------------------------------------------------------------------- 1 | # DirectShare 2 | 여러 파일들을 간편하게 셀프 호스팅 할 수 있게 해줍니다. 3 | 4 | ## 기능 5 | * 자동 uPnP 포트포워딩 6 | * 포트, 단축 URL 길이 설정 가능 7 | * 폴더 공유 (tar 아카이브화) 8 | 9 | ## 사용법 10 | 공유 할 파일들을 프로그램에 드래그하여 실행한뒤 생성된 단축 url로 접속하면 다운로드 할 수 있습니다. 11 | 폴더의 경우 tar 파일로 공유됩니다. 12 | 13 | ``` 14 | registered foo.txt url: http://127.0.0.1:1024/xIqfLguw 15 | ``` 16 | `http://127.0.0.1:1024/xIqfLguw` 가 foo.txt 파일을 받을수 있는 주소 입니다. 17 | `direct_share.toml` 파일에서 단축 url의 주소 길이와 포트 번호를 설정 할 수 있습니다. 18 | 19 | ## License 20 | `DirectShare` is following MIT License -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | [한국어 README](./readme_ko.md) 2 | 3 | # DirectShare 4 | Self host files & directory in one click 5 | 6 | ## Features 7 | * Automatic uPnP port forwarding 8 | * Configurable port, shorten url length 9 | * Directory sharing (via tarball archive) 10 | 11 | ## Usage 12 | Drag files into executable and connect to generated shorten url. 13 | Directories are shared as tarball archive. 14 | 15 | ``` 16 | registered foo.txt url: http://127.0.0.1:1024/xIqfLguw 17 | ``` 18 | `http://127.0.0.1:1024/xIqfLguw` is download url for foo.txt. 19 | URL length and host port are configurable in `direct_share.toml`. 20 | 21 | ## License 22 | `DirectShare` is following MIT License -------------------------------------------------------------------------------- /src/config.rs: -------------------------------------------------------------------------------- 1 | /* 2 | * Created on Sat Feb 05 2022 3 | * 4 | * Copyright (c) storycraft. Licensed under the MIT Licence. 5 | */ 6 | 7 | use std::num::{NonZeroU16, NonZeroU8}; 8 | 9 | use serde::{Deserialize, Serialize}; 10 | 11 | #[derive(Debug, Clone, Serialize, Deserialize)] 12 | /// App config 13 | pub struct DirectShareConfig { 14 | /// Port that can be used to bind server 15 | pub port: NonZeroU16, 16 | 17 | /// Key length for shorten url 18 | pub key_length: NonZeroU8, 19 | } 20 | 21 | impl Default for DirectShareConfig { 22 | fn default() -> Self { 23 | Self { 24 | port: NonZeroU16::new(1024).unwrap(), 25 | key_length: NonZeroU8::new(8).unwrap(), 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "direct-share" 3 | description = "Share any files easily from your machine" 4 | version = "1.0.0" 5 | edition = "2021" 6 | license = "MIT" 7 | authors = ["storycraft "] 8 | repository = "https://github.com/storycraft/direct-share" 9 | 10 | [dependencies] 11 | log = "0.4" 12 | serde = { version = "1", features = ["derive"] } 13 | tokio = { version = "1", features = ["full"] } 14 | hyper = { version = "1", features = ["full"] } 15 | http-body-util = "0.1" 16 | hyper-util = { version = "0.1", features = ["full"] } 17 | toml = "0.8" 18 | pretty_env_logger = "0.5" 19 | rand = "0.8" 20 | thiserror = "1" 21 | anyhow = "1" 22 | tokio-util = "0.7" 23 | futures-util = "0.3" 24 | tokio-tar = "0.3.1" 25 | igd = { version = "0.12", features = ["aio"] } 26 | local-ip-address = "0.6" 27 | never-say-never = "6.6.666" 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 storycraft 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/map.rs: -------------------------------------------------------------------------------- 1 | /* 2 | * Created on Sun Feb 06 2022 3 | * 4 | * Copyright (c) storycraft. Licensed under the MIT Licence. 5 | */ 6 | 7 | use std::{collections::HashMap, num::NonZeroU8, path::PathBuf}; 8 | 9 | use rand::{thread_rng, Rng}; 10 | 11 | #[derive(Debug, Clone)] 12 | pub struct PathMap { 13 | key_length: NonZeroU8, 14 | map: HashMap, 15 | } 16 | 17 | impl PathMap { 18 | pub fn new(key_length: NonZeroU8) -> Self { 19 | Self { 20 | key_length, 21 | map: HashMap::new(), 22 | } 23 | } 24 | 25 | /// Get file path from shorten uri 26 | pub fn get(&self, path: &str) -> Option<&PathBuf> { 27 | self.map.get(path) 28 | } 29 | 30 | /// Register new path and return path 31 | pub fn register(&mut self, path: PathBuf) -> String { 32 | let key = gen_key(self.key_length.get() as usize); 33 | 34 | self.map.insert(key.clone(), path); 35 | 36 | key 37 | } 38 | } 39 | 40 | fn gen_key(size: usize) -> String { 41 | const LIST: [char; 64] = [ 42 | '_', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 43 | 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 44 | 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 45 | 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 46 | ]; 47 | 48 | let mut key = String::with_capacity(size); 49 | 50 | let mut rng = thread_rng(); 51 | for _ in 0..size { 52 | key.push(LIST[rng.gen_range(0..64)]); 53 | } 54 | 55 | key 56 | } 57 | 58 | #[cfg(test)] 59 | mod tests { 60 | use crate::map::gen_key; 61 | 62 | #[test] 63 | pub fn gen_key_test() { 64 | let key = gen_key(21); 65 | 66 | println!("{}", key); 67 | 68 | assert_eq!(key.len(), 21) 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | /* 2 | * Created on Sat Feb 05 2022 3 | * 4 | * Copyright (c) storycraft. Licensed under the MIT Licence. 5 | */ 6 | 7 | pub mod config; 8 | pub mod constants; 9 | pub mod map; 10 | 11 | use std::{ 12 | convert::Infallible, 13 | env, 14 | error::Error, 15 | ffi::OsString, 16 | fs::Metadata, 17 | io::{self, ErrorKind}, 18 | net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4}, 19 | num::NonZeroU16, 20 | path::Path, 21 | sync::Arc, 22 | time::Duration, 23 | }; 24 | 25 | use config::DirectShareConfig; 26 | use constants::{FILE_BUF_SIZE, TAR_BUF_SIZE}; 27 | use futures_util::{FutureExt, TryStreamExt}; 28 | use http_body_util::{combinators::BoxBody, BodyExt, Empty, StreamBody}; 29 | use hyper::{ 30 | body::{Bytes, Frame}, 31 | header, 32 | server::conn::http1, 33 | service::service_fn, 34 | Method, Request, Response, StatusCode, 35 | }; 36 | use hyper_util::rt::TokioIo; 37 | use igd::{aio::search_gateway, PortMappingProtocol, SearchOptions}; 38 | use local_ip_address::local_ip; 39 | use log::LevelFilter; 40 | use never_say_never::Never; 41 | use thiserror::Error; 42 | use tokio::{ 43 | fs::{self, File}, 44 | io::duplex, 45 | net::TcpListener, 46 | select, signal, spawn, 47 | time::sleep, 48 | }; 49 | use tokio_util::io::ReaderStream; 50 | 51 | use crate::map::PathMap; 52 | 53 | #[tokio::main] 54 | async fn main() -> Result<(), Box> { 55 | pretty_env_logger::formatted_timed_builder() 56 | .filter_level({ 57 | #[cfg(not(debug_assertions))] 58 | { 59 | LevelFilter::Info 60 | } 61 | #[cfg(debug_assertions)] 62 | { 63 | LevelFilter::Trace 64 | } 65 | }) 66 | .parse_default_env() 67 | .init(); 68 | 69 | log::info!("initializing DirectShare..."); 70 | 71 | let config = load_config().await; 72 | 73 | let args: Vec = env::args_os().skip(1).collect(); 74 | if args.is_empty() { 75 | log::error!("please drag files to start server"); 76 | return Ok(()); 77 | } 78 | 79 | let mut map = PathMap::new(config.key_length); 80 | 81 | let ip = local_ip().unwrap_or(IpAddr::V4(Ipv4Addr::UNSPECIFIED)); 82 | 83 | let service = spawn(upnp_service(ip, config.port)); 84 | 85 | for arg in args { 86 | let key = map.register(arg.clone().into()); 87 | 88 | log::info!( 89 | "registered {} url: http://{ip}:{}/{key}", 90 | arg.to_string_lossy(), 91 | config.port 92 | ); 93 | } 94 | 95 | log::info!("server starting on http://{}:{}/", ip, config.port); 96 | let listener = match TcpListener::bind(SocketAddrV4::new( 97 | Ipv4Addr::UNSPECIFIED, 98 | config.port.get(), 99 | )) 100 | .await 101 | { 102 | Ok(listener) => listener, 103 | Err(err) => { 104 | log::error!("cannot start server err: {err}"); 105 | return Ok(()); 106 | } 107 | }; 108 | 109 | select! { 110 | Ok(_) = signal::ctrl_c() => { 111 | log::info!("stopping server..."); 112 | let _ = service.await; 113 | } 114 | _ = server(listener, Arc::new(map)) => {} 115 | }; 116 | 117 | Ok(()) 118 | } 119 | 120 | async fn server(listener: TcpListener, map: Arc) -> Result { 121 | loop { 122 | let (stream, addr) = listener.accept().await?; 123 | 124 | log::trace!("{addr} connected"); 125 | 126 | spawn({ 127 | let map = map.clone(); 128 | 129 | async move { 130 | if let Err(err) = http1::Builder::new() 131 | .serve_connection( 132 | TokioIo::new(stream), 133 | service_fn(|req| response(addr, &map, req).map(Ok::<_, Infallible>)), 134 | ) 135 | .await 136 | { 137 | log::warn!("could not deliver file from addr: {addr} err: {err}"); 138 | } 139 | } 140 | }); 141 | } 142 | } 143 | 144 | async fn upnp_service(ip: IpAddr, port: NonZeroU16) { 145 | let gateway = match search_gateway(SearchOptions::default()).await { 146 | Ok(gateway) => gateway, 147 | Err(err) => { 148 | log::warn!("uPnP discovery failed err: {err}"); 149 | return; 150 | } 151 | }; 152 | 153 | if let Ok(external_ip) = gateway.get_external_ip().await { 154 | if ip != external_ip { 155 | log::warn!("NAT detected external_ip: {external_ip}"); 156 | log::warn!("use {external_ip} instead when sharing over WAN"); 157 | } 158 | } 159 | 160 | let IpAddr::V4(ip) = ip else { 161 | return; 162 | }; 163 | 164 | let port = port.get(); 165 | 166 | let task = async { 167 | const TIMEOUT: Duration = Duration::from_secs(120); 168 | 169 | 'task_loop: loop { 170 | let mut attempts = 0; 171 | while let Err(err) = gateway 172 | .add_port( 173 | PortMappingProtocol::TCP, 174 | port, 175 | SocketAddrV4::new(ip, port), 176 | TIMEOUT.as_secs() as u32, 177 | "DirectShare port mapping", 178 | ) 179 | .await 180 | { 181 | if attempts >= 5 { 182 | log::error!("uPnP port mapping failed, please do port forwarding manually or cannot be shared over WAN"); 183 | break 'task_loop; 184 | } 185 | 186 | let next = Duration::from_secs(5 + attempts * 5); 187 | log::warn!( 188 | "uPnP port mapping failed, retrying after {} secs err: {err}", 189 | next.as_secs() 190 | ); 191 | 192 | sleep(next).await; 193 | attempts += 1; 194 | } 195 | 196 | sleep(TIMEOUT).await; 197 | } 198 | }; 199 | 200 | let cleanup = async { 201 | if signal::ctrl_c().await.is_err() { 202 | log::warn!("SIGINT signal hook failed."); 203 | return; 204 | }; 205 | 206 | let _ = gateway.remove_port(PortMappingProtocol::TCP, port).await; 207 | }; 208 | 209 | select! { 210 | _ = task => {} 211 | _ = cleanup => {} 212 | } 213 | } 214 | 215 | async fn response( 216 | addr: SocketAddr, 217 | map: &PathMap, 218 | req: Request, 219 | ) -> Response> { 220 | let method = req.method(); 221 | let path = { 222 | let mut chars = req.uri().path().chars(); 223 | chars.next(); 224 | 225 | chars.as_str() 226 | }; 227 | 228 | log::info!("method: {method} path: {path} addr: {addr}"); 229 | 230 | if Method::GET != method { 231 | return not_found_page(); 232 | } 233 | 234 | let Some(file_path) = map.get(path) else { 235 | return not_found_page(); 236 | }; 237 | 238 | let meta = match fs::metadata(file_path).await { 239 | Ok(meta) => meta, 240 | Err(err) => { 241 | log::error!("cannot stat {} err: {err}", file_path.display()); 242 | 243 | return not_found_page(); 244 | } 245 | }; 246 | 247 | let file_name = file_path 248 | .file_name() 249 | .map(|os_str| os_str.to_string_lossy().to_string()) 250 | .unwrap_or(constants::FALLBACK_FILENAME.into()); 251 | 252 | if meta.is_file() { 253 | log::info!("serving file: {} addr: {addr}", file_path.display()); 254 | serve_file(file_path.as_path(), &file_name, meta, req).await 255 | } else { 256 | log::info!("serving directory: {} addr: {addr}", file_path.display()); 257 | serve_directory(file_path.as_path(), &file_name, req).await 258 | } 259 | } 260 | 261 | async fn serve_file( 262 | path: &Path, 263 | file_name: &str, 264 | meta: Metadata, 265 | _req: Request, 266 | ) -> Response> { 267 | let file = match File::open(path).await { 268 | Ok(file) => file, 269 | Err(err) => { 270 | log::error!("cannot open file path: {} err: {err}", path.display()); 271 | return not_found_page(); 272 | } 273 | }; 274 | 275 | let mut res = Response::new( 276 | StreamBody::new(ReaderStream::with_capacity(file, FILE_BUF_SIZE).map_ok(Frame::data)) 277 | .boxed(), 278 | ); 279 | 280 | let headers = res.headers_mut(); 281 | headers.insert( 282 | header::CONTENT_LENGTH, 283 | meta.len().to_string().parse().unwrap(), 284 | ); 285 | headers.insert( 286 | header::CONTENT_DISPOSITION, 287 | format!("attachment; filename={}", file_name) 288 | .parse() 289 | .unwrap(), 290 | ); 291 | 292 | res 293 | } 294 | 295 | async fn serve_directory( 296 | path: &Path, 297 | dir_name: &str, 298 | _req: Request, 299 | ) -> Response> { 300 | let archive_name = format!("{dir_name}.tar"); 301 | 302 | let (tx, rx) = duplex(TAR_BUF_SIZE); 303 | 304 | tokio::spawn({ 305 | let path = path.to_path_buf(); 306 | 307 | async move { 308 | let mut ar = tokio_tar::Builder::new_non_terminated(tx); 309 | ar.append_dir_all(".", path).await?; 310 | ar.finish().await?; 311 | 312 | Ok::<_, io::Error>(()) 313 | } 314 | }); 315 | 316 | let mut res = Response::new(StreamBody::new(ReaderStream::new(rx).map_ok(Frame::data)).boxed()); 317 | 318 | let headers = res.headers_mut(); 319 | headers.insert( 320 | header::CONTENT_DISPOSITION, 321 | format!("attachment; filename={}", archive_name) 322 | .parse() 323 | .unwrap(), 324 | ); 325 | 326 | res 327 | } 328 | 329 | fn not_found_page() -> Response> { 330 | Response::builder() 331 | .status(StatusCode::NOT_FOUND) 332 | .body(Empty::::new().map_err(|_| unreachable!()).boxed()) 333 | .unwrap() 334 | } 335 | 336 | async fn load_config() -> DirectShareConfig { 337 | #[derive(Debug, Error)] 338 | pub enum Error { 339 | #[error(transparent)] 340 | Invalid(#[from] toml::de::Error), 341 | #[error(transparent)] 342 | Unreadable(#[from] io::Error), 343 | } 344 | 345 | async fn load() -> Result { 346 | let data = fs::read_to_string(constants::CONFIG_FILE) 347 | .await 348 | .map_err(Error::Unreadable)?; 349 | 350 | toml::from_str::(&data).map_err(Error::Invalid) 351 | } 352 | 353 | match load().await { 354 | Ok(config) => config, 355 | 356 | Err(Error::Unreadable(err)) => { 357 | log::warn!("config is unreadable. using default config. err: {err}"); 358 | 359 | let config = DirectShareConfig::default(); 360 | 361 | if err.kind() == ErrorKind::NotFound { 362 | log::info!("creating default config..."); 363 | if let Err(write_err) = fs::write( 364 | constants::CONFIG_FILE, 365 | toml::to_string_pretty(&config).unwrap(), 366 | ) 367 | .await 368 | { 369 | log::warn!("cannot write default config err: {write_err}"); 370 | } else { 371 | log::info!("default config written"); 372 | } 373 | } 374 | 375 | config 376 | } 377 | 378 | Err(Error::Invalid(err)) => { 379 | log::error!( 380 | "config is corrupted or not in right format, using default config err: {err}" 381 | ); 382 | 383 | DirectShareConfig::default() 384 | } 385 | } 386 | } 387 | -------------------------------------------------------------------------------- /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 = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "anyhow" 31 | version = "1.0.81" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" 34 | 35 | [[package]] 36 | name = "attohttpc" 37 | version = "0.16.3" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "fdb8867f378f33f78a811a8eb9bf108ad99430d7aad43315dd9319c827ef6247" 40 | dependencies = [ 41 | "http 0.2.12", 42 | "log", 43 | "url", 44 | "wildmatch", 45 | ] 46 | 47 | [[package]] 48 | name = "autocfg" 49 | version = "1.2.0" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" 52 | 53 | [[package]] 54 | name = "backtrace" 55 | version = "0.3.71" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" 58 | dependencies = [ 59 | "addr2line", 60 | "cc", 61 | "cfg-if", 62 | "libc", 63 | "miniz_oxide", 64 | "object", 65 | "rustc-demangle", 66 | ] 67 | 68 | [[package]] 69 | name = "bitflags" 70 | version = "1.3.2" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 73 | 74 | [[package]] 75 | name = "bitflags" 76 | version = "2.5.0" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" 79 | 80 | [[package]] 81 | name = "byteorder" 82 | version = "1.5.0" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 85 | 86 | [[package]] 87 | name = "bytes" 88 | version = "1.6.0" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" 91 | 92 | [[package]] 93 | name = "cc" 94 | version = "1.0.90" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" 97 | 98 | [[package]] 99 | name = "cfg-if" 100 | version = "1.0.0" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 103 | 104 | [[package]] 105 | name = "direct-share" 106 | version = "1.0.0" 107 | dependencies = [ 108 | "anyhow", 109 | "futures-util", 110 | "http-body-util", 111 | "hyper 1.2.0", 112 | "hyper-util", 113 | "igd", 114 | "local-ip-address", 115 | "log", 116 | "never-say-never", 117 | "pretty_env_logger", 118 | "rand", 119 | "serde", 120 | "thiserror", 121 | "tokio", 122 | "tokio-tar", 123 | "tokio-util", 124 | "toml", 125 | ] 126 | 127 | [[package]] 128 | name = "either" 129 | version = "1.10.0" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" 132 | 133 | [[package]] 134 | name = "env_logger" 135 | version = "0.10.2" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" 138 | dependencies = [ 139 | "humantime", 140 | "is-terminal", 141 | "log", 142 | "regex", 143 | "termcolor", 144 | ] 145 | 146 | [[package]] 147 | name = "equivalent" 148 | version = "1.0.1" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 151 | 152 | [[package]] 153 | name = "errno" 154 | version = "0.3.8" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 157 | dependencies = [ 158 | "libc", 159 | "windows-sys 0.52.0", 160 | ] 161 | 162 | [[package]] 163 | name = "filetime" 164 | version = "0.2.23" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" 167 | dependencies = [ 168 | "cfg-if", 169 | "libc", 170 | "redox_syscall 0.4.1", 171 | "windows-sys 0.52.0", 172 | ] 173 | 174 | [[package]] 175 | name = "fnv" 176 | version = "1.0.7" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 179 | 180 | [[package]] 181 | name = "form_urlencoded" 182 | version = "1.2.1" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 185 | dependencies = [ 186 | "percent-encoding", 187 | ] 188 | 189 | [[package]] 190 | name = "futures" 191 | version = "0.3.30" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 194 | dependencies = [ 195 | "futures-channel", 196 | "futures-core", 197 | "futures-executor", 198 | "futures-io", 199 | "futures-sink", 200 | "futures-task", 201 | "futures-util", 202 | ] 203 | 204 | [[package]] 205 | name = "futures-channel" 206 | version = "0.3.30" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 209 | dependencies = [ 210 | "futures-core", 211 | "futures-sink", 212 | ] 213 | 214 | [[package]] 215 | name = "futures-core" 216 | version = "0.3.30" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 219 | 220 | [[package]] 221 | name = "futures-executor" 222 | version = "0.3.30" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 225 | dependencies = [ 226 | "futures-core", 227 | "futures-task", 228 | "futures-util", 229 | ] 230 | 231 | [[package]] 232 | name = "futures-io" 233 | version = "0.3.30" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 236 | 237 | [[package]] 238 | name = "futures-macro" 239 | version = "0.3.30" 240 | source = "registry+https://github.com/rust-lang/crates.io-index" 241 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 242 | dependencies = [ 243 | "proc-macro2", 244 | "quote", 245 | "syn 2.0.55", 246 | ] 247 | 248 | [[package]] 249 | name = "futures-sink" 250 | version = "0.3.30" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 253 | 254 | [[package]] 255 | name = "futures-task" 256 | version = "0.3.30" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 259 | 260 | [[package]] 261 | name = "futures-util" 262 | version = "0.3.30" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 265 | dependencies = [ 266 | "futures-channel", 267 | "futures-core", 268 | "futures-io", 269 | "futures-macro", 270 | "futures-sink", 271 | "futures-task", 272 | "memchr", 273 | "pin-project-lite", 274 | "pin-utils", 275 | "slab", 276 | ] 277 | 278 | [[package]] 279 | name = "getrandom" 280 | version = "0.2.12" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" 283 | dependencies = [ 284 | "cfg-if", 285 | "libc", 286 | "wasi", 287 | ] 288 | 289 | [[package]] 290 | name = "gimli" 291 | version = "0.28.1" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 294 | 295 | [[package]] 296 | name = "h2" 297 | version = "0.3.25" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" 300 | dependencies = [ 301 | "bytes", 302 | "fnv", 303 | "futures-core", 304 | "futures-sink", 305 | "futures-util", 306 | "http 0.2.12", 307 | "indexmap", 308 | "slab", 309 | "tokio", 310 | "tokio-util", 311 | "tracing", 312 | ] 313 | 314 | [[package]] 315 | name = "h2" 316 | version = "0.4.3" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "51ee2dd2e4f378392eeff5d51618cd9a63166a2513846bbc55f21cfacd9199d4" 319 | dependencies = [ 320 | "bytes", 321 | "fnv", 322 | "futures-core", 323 | "futures-sink", 324 | "futures-util", 325 | "http 1.1.0", 326 | "indexmap", 327 | "slab", 328 | "tokio", 329 | "tokio-util", 330 | "tracing", 331 | ] 332 | 333 | [[package]] 334 | name = "hashbrown" 335 | version = "0.14.3" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 338 | 339 | [[package]] 340 | name = "hermit-abi" 341 | version = "0.3.9" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 344 | 345 | [[package]] 346 | name = "http" 347 | version = "0.2.12" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 350 | dependencies = [ 351 | "bytes", 352 | "fnv", 353 | "itoa", 354 | ] 355 | 356 | [[package]] 357 | name = "http" 358 | version = "1.1.0" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 361 | dependencies = [ 362 | "bytes", 363 | "fnv", 364 | "itoa", 365 | ] 366 | 367 | [[package]] 368 | name = "http-body" 369 | version = "0.4.6" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 372 | dependencies = [ 373 | "bytes", 374 | "http 0.2.12", 375 | "pin-project-lite", 376 | ] 377 | 378 | [[package]] 379 | name = "http-body" 380 | version = "1.0.0" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 383 | dependencies = [ 384 | "bytes", 385 | "http 1.1.0", 386 | ] 387 | 388 | [[package]] 389 | name = "http-body-util" 390 | version = "0.1.1" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" 393 | dependencies = [ 394 | "bytes", 395 | "futures-core", 396 | "http 1.1.0", 397 | "http-body 1.0.0", 398 | "pin-project-lite", 399 | ] 400 | 401 | [[package]] 402 | name = "httparse" 403 | version = "1.8.0" 404 | source = "registry+https://github.com/rust-lang/crates.io-index" 405 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 406 | 407 | [[package]] 408 | name = "httpdate" 409 | version = "1.0.3" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 412 | 413 | [[package]] 414 | name = "humantime" 415 | version = "2.1.0" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 418 | 419 | [[package]] 420 | name = "hyper" 421 | version = "0.14.28" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" 424 | dependencies = [ 425 | "bytes", 426 | "futures-channel", 427 | "futures-core", 428 | "futures-util", 429 | "h2 0.3.25", 430 | "http 0.2.12", 431 | "http-body 0.4.6", 432 | "httparse", 433 | "httpdate", 434 | "itoa", 435 | "pin-project-lite", 436 | "socket2", 437 | "tokio", 438 | "tower-service", 439 | "tracing", 440 | "want", 441 | ] 442 | 443 | [[package]] 444 | name = "hyper" 445 | version = "1.2.0" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" 448 | dependencies = [ 449 | "bytes", 450 | "futures-channel", 451 | "futures-util", 452 | "h2 0.4.3", 453 | "http 1.1.0", 454 | "http-body 1.0.0", 455 | "httparse", 456 | "httpdate", 457 | "itoa", 458 | "pin-project-lite", 459 | "smallvec", 460 | "tokio", 461 | "want", 462 | ] 463 | 464 | [[package]] 465 | name = "hyper-util" 466 | version = "0.1.3" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" 469 | dependencies = [ 470 | "bytes", 471 | "futures-channel", 472 | "futures-util", 473 | "http 1.1.0", 474 | "http-body 1.0.0", 475 | "hyper 1.2.0", 476 | "pin-project-lite", 477 | "socket2", 478 | "tokio", 479 | "tower", 480 | "tower-service", 481 | "tracing", 482 | ] 483 | 484 | [[package]] 485 | name = "idna" 486 | version = "0.5.0" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 489 | dependencies = [ 490 | "unicode-bidi", 491 | "unicode-normalization", 492 | ] 493 | 494 | [[package]] 495 | name = "igd" 496 | version = "0.12.1" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "556b5a75cd4adb7c4ea21c64af1c48cefb2ce7d43dc4352c720a1fe47c21f355" 499 | dependencies = [ 500 | "attohttpc", 501 | "bytes", 502 | "futures", 503 | "http 0.2.12", 504 | "hyper 0.14.28", 505 | "log", 506 | "rand", 507 | "tokio", 508 | "url", 509 | "xmltree", 510 | ] 511 | 512 | [[package]] 513 | name = "indexmap" 514 | version = "2.2.6" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 517 | dependencies = [ 518 | "equivalent", 519 | "hashbrown", 520 | ] 521 | 522 | [[package]] 523 | name = "is-terminal" 524 | version = "0.4.12" 525 | source = "registry+https://github.com/rust-lang/crates.io-index" 526 | checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" 527 | dependencies = [ 528 | "hermit-abi", 529 | "libc", 530 | "windows-sys 0.52.0", 531 | ] 532 | 533 | [[package]] 534 | name = "itoa" 535 | version = "1.0.11" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 538 | 539 | [[package]] 540 | name = "libc" 541 | version = "0.2.153" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" 544 | 545 | [[package]] 546 | name = "linux-raw-sys" 547 | version = "0.4.13" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" 550 | 551 | [[package]] 552 | name = "local-ip-address" 553 | version = "0.6.1" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "136ef34e18462b17bf39a7826f8f3bbc223341f8e83822beb8b77db9a3d49696" 556 | dependencies = [ 557 | "libc", 558 | "neli", 559 | "thiserror", 560 | "windows-sys 0.48.0", 561 | ] 562 | 563 | [[package]] 564 | name = "lock_api" 565 | version = "0.4.11" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 568 | dependencies = [ 569 | "autocfg", 570 | "scopeguard", 571 | ] 572 | 573 | [[package]] 574 | name = "log" 575 | version = "0.4.21" 576 | source = "registry+https://github.com/rust-lang/crates.io-index" 577 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 578 | 579 | [[package]] 580 | name = "memchr" 581 | version = "2.7.1" 582 | source = "registry+https://github.com/rust-lang/crates.io-index" 583 | checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" 584 | 585 | [[package]] 586 | name = "miniz_oxide" 587 | version = "0.7.2" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 590 | dependencies = [ 591 | "adler", 592 | ] 593 | 594 | [[package]] 595 | name = "mio" 596 | version = "0.8.11" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 599 | dependencies = [ 600 | "libc", 601 | "wasi", 602 | "windows-sys 0.48.0", 603 | ] 604 | 605 | [[package]] 606 | name = "neli" 607 | version = "0.6.4" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "1100229e06604150b3becd61a4965d5c70f3be1759544ea7274166f4be41ef43" 610 | dependencies = [ 611 | "byteorder", 612 | "libc", 613 | "log", 614 | "neli-proc-macros", 615 | ] 616 | 617 | [[package]] 618 | name = "neli-proc-macros" 619 | version = "0.1.3" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | checksum = "c168194d373b1e134786274020dae7fc5513d565ea2ebb9bc9ff17ffb69106d4" 622 | dependencies = [ 623 | "either", 624 | "proc-macro2", 625 | "quote", 626 | "serde", 627 | "syn 1.0.109", 628 | ] 629 | 630 | [[package]] 631 | name = "never-say-never" 632 | version = "6.6.666" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "cf5a574dadd7941adeaa71823ecba5e28331b8313fb2e1c6a5c7e5981ea53ad6" 635 | 636 | [[package]] 637 | name = "num_cpus" 638 | version = "1.16.0" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 641 | dependencies = [ 642 | "hermit-abi", 643 | "libc", 644 | ] 645 | 646 | [[package]] 647 | name = "object" 648 | version = "0.32.2" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 651 | dependencies = [ 652 | "memchr", 653 | ] 654 | 655 | [[package]] 656 | name = "once_cell" 657 | version = "1.19.0" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 660 | 661 | [[package]] 662 | name = "parking_lot" 663 | version = "0.12.1" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 666 | dependencies = [ 667 | "lock_api", 668 | "parking_lot_core", 669 | ] 670 | 671 | [[package]] 672 | name = "parking_lot_core" 673 | version = "0.9.9" 674 | source = "registry+https://github.com/rust-lang/crates.io-index" 675 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 676 | dependencies = [ 677 | "cfg-if", 678 | "libc", 679 | "redox_syscall 0.4.1", 680 | "smallvec", 681 | "windows-targets 0.48.5", 682 | ] 683 | 684 | [[package]] 685 | name = "percent-encoding" 686 | version = "2.3.1" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 689 | 690 | [[package]] 691 | name = "pin-project" 692 | version = "1.1.5" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 695 | dependencies = [ 696 | "pin-project-internal", 697 | ] 698 | 699 | [[package]] 700 | name = "pin-project-internal" 701 | version = "1.1.5" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 704 | dependencies = [ 705 | "proc-macro2", 706 | "quote", 707 | "syn 2.0.55", 708 | ] 709 | 710 | [[package]] 711 | name = "pin-project-lite" 712 | version = "0.2.13" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 715 | 716 | [[package]] 717 | name = "pin-utils" 718 | version = "0.1.0" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 721 | 722 | [[package]] 723 | name = "ppv-lite86" 724 | version = "0.2.17" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 727 | 728 | [[package]] 729 | name = "pretty_env_logger" 730 | version = "0.5.0" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" 733 | dependencies = [ 734 | "env_logger", 735 | "log", 736 | ] 737 | 738 | [[package]] 739 | name = "proc-macro2" 740 | version = "1.0.79" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" 743 | dependencies = [ 744 | "unicode-ident", 745 | ] 746 | 747 | [[package]] 748 | name = "quote" 749 | version = "1.0.35" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" 752 | dependencies = [ 753 | "proc-macro2", 754 | ] 755 | 756 | [[package]] 757 | name = "rand" 758 | version = "0.8.5" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 761 | dependencies = [ 762 | "libc", 763 | "rand_chacha", 764 | "rand_core", 765 | ] 766 | 767 | [[package]] 768 | name = "rand_chacha" 769 | version = "0.3.1" 770 | source = "registry+https://github.com/rust-lang/crates.io-index" 771 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 772 | dependencies = [ 773 | "ppv-lite86", 774 | "rand_core", 775 | ] 776 | 777 | [[package]] 778 | name = "rand_core" 779 | version = "0.6.4" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 782 | dependencies = [ 783 | "getrandom", 784 | ] 785 | 786 | [[package]] 787 | name = "redox_syscall" 788 | version = "0.3.5" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" 791 | dependencies = [ 792 | "bitflags 1.3.2", 793 | ] 794 | 795 | [[package]] 796 | name = "redox_syscall" 797 | version = "0.4.1" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 800 | dependencies = [ 801 | "bitflags 1.3.2", 802 | ] 803 | 804 | [[package]] 805 | name = "regex" 806 | version = "1.10.4" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" 809 | dependencies = [ 810 | "aho-corasick", 811 | "memchr", 812 | "regex-automata", 813 | "regex-syntax", 814 | ] 815 | 816 | [[package]] 817 | name = "regex-automata" 818 | version = "0.4.6" 819 | source = "registry+https://github.com/rust-lang/crates.io-index" 820 | checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 821 | dependencies = [ 822 | "aho-corasick", 823 | "memchr", 824 | "regex-syntax", 825 | ] 826 | 827 | [[package]] 828 | name = "regex-syntax" 829 | version = "0.8.3" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" 832 | 833 | [[package]] 834 | name = "rustc-demangle" 835 | version = "0.1.23" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 838 | 839 | [[package]] 840 | name = "rustix" 841 | version = "0.38.32" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" 844 | dependencies = [ 845 | "bitflags 2.5.0", 846 | "errno", 847 | "libc", 848 | "linux-raw-sys", 849 | "windows-sys 0.52.0", 850 | ] 851 | 852 | [[package]] 853 | name = "scopeguard" 854 | version = "1.2.0" 855 | source = "registry+https://github.com/rust-lang/crates.io-index" 856 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 857 | 858 | [[package]] 859 | name = "serde" 860 | version = "1.0.197" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" 863 | dependencies = [ 864 | "serde_derive", 865 | ] 866 | 867 | [[package]] 868 | name = "serde_derive" 869 | version = "1.0.197" 870 | source = "registry+https://github.com/rust-lang/crates.io-index" 871 | checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" 872 | dependencies = [ 873 | "proc-macro2", 874 | "quote", 875 | "syn 2.0.55", 876 | ] 877 | 878 | [[package]] 879 | name = "serde_spanned" 880 | version = "0.6.5" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" 883 | dependencies = [ 884 | "serde", 885 | ] 886 | 887 | [[package]] 888 | name = "signal-hook-registry" 889 | version = "1.4.1" 890 | source = "registry+https://github.com/rust-lang/crates.io-index" 891 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 892 | dependencies = [ 893 | "libc", 894 | ] 895 | 896 | [[package]] 897 | name = "slab" 898 | version = "0.4.9" 899 | source = "registry+https://github.com/rust-lang/crates.io-index" 900 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 901 | dependencies = [ 902 | "autocfg", 903 | ] 904 | 905 | [[package]] 906 | name = "smallvec" 907 | version = "1.13.2" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 910 | 911 | [[package]] 912 | name = "socket2" 913 | version = "0.5.6" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" 916 | dependencies = [ 917 | "libc", 918 | "windows-sys 0.52.0", 919 | ] 920 | 921 | [[package]] 922 | name = "syn" 923 | version = "1.0.109" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 926 | dependencies = [ 927 | "proc-macro2", 928 | "quote", 929 | "unicode-ident", 930 | ] 931 | 932 | [[package]] 933 | name = "syn" 934 | version = "2.0.55" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" 937 | dependencies = [ 938 | "proc-macro2", 939 | "quote", 940 | "unicode-ident", 941 | ] 942 | 943 | [[package]] 944 | name = "termcolor" 945 | version = "1.4.1" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 948 | dependencies = [ 949 | "winapi-util", 950 | ] 951 | 952 | [[package]] 953 | name = "thiserror" 954 | version = "1.0.58" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" 957 | dependencies = [ 958 | "thiserror-impl", 959 | ] 960 | 961 | [[package]] 962 | name = "thiserror-impl" 963 | version = "1.0.58" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" 966 | dependencies = [ 967 | "proc-macro2", 968 | "quote", 969 | "syn 2.0.55", 970 | ] 971 | 972 | [[package]] 973 | name = "tinyvec" 974 | version = "1.6.0" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 977 | dependencies = [ 978 | "tinyvec_macros", 979 | ] 980 | 981 | [[package]] 982 | name = "tinyvec_macros" 983 | version = "0.1.1" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 986 | 987 | [[package]] 988 | name = "tokio" 989 | version = "1.37.0" 990 | source = "registry+https://github.com/rust-lang/crates.io-index" 991 | checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" 992 | dependencies = [ 993 | "backtrace", 994 | "bytes", 995 | "libc", 996 | "mio", 997 | "num_cpus", 998 | "parking_lot", 999 | "pin-project-lite", 1000 | "signal-hook-registry", 1001 | "socket2", 1002 | "tokio-macros", 1003 | "windows-sys 0.48.0", 1004 | ] 1005 | 1006 | [[package]] 1007 | name = "tokio-macros" 1008 | version = "2.2.0" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 1011 | dependencies = [ 1012 | "proc-macro2", 1013 | "quote", 1014 | "syn 2.0.55", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "tokio-stream" 1019 | version = "0.1.15" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" 1022 | dependencies = [ 1023 | "futures-core", 1024 | "pin-project-lite", 1025 | "tokio", 1026 | ] 1027 | 1028 | [[package]] 1029 | name = "tokio-tar" 1030 | version = "0.3.1" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | checksum = "9d5714c010ca3e5c27114c1cdeb9d14641ace49874aa5626d7149e47aedace75" 1033 | dependencies = [ 1034 | "filetime", 1035 | "futures-core", 1036 | "libc", 1037 | "redox_syscall 0.3.5", 1038 | "tokio", 1039 | "tokio-stream", 1040 | "xattr", 1041 | ] 1042 | 1043 | [[package]] 1044 | name = "tokio-util" 1045 | version = "0.7.10" 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" 1047 | checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 1048 | dependencies = [ 1049 | "bytes", 1050 | "futures-core", 1051 | "futures-sink", 1052 | "pin-project-lite", 1053 | "tokio", 1054 | "tracing", 1055 | ] 1056 | 1057 | [[package]] 1058 | name = "toml" 1059 | version = "0.8.12" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" 1062 | dependencies = [ 1063 | "serde", 1064 | "serde_spanned", 1065 | "toml_datetime", 1066 | "toml_edit", 1067 | ] 1068 | 1069 | [[package]] 1070 | name = "toml_datetime" 1071 | version = "0.6.5" 1072 | source = "registry+https://github.com/rust-lang/crates.io-index" 1073 | checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" 1074 | dependencies = [ 1075 | "serde", 1076 | ] 1077 | 1078 | [[package]] 1079 | name = "toml_edit" 1080 | version = "0.22.9" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" 1083 | dependencies = [ 1084 | "indexmap", 1085 | "serde", 1086 | "serde_spanned", 1087 | "toml_datetime", 1088 | "winnow", 1089 | ] 1090 | 1091 | [[package]] 1092 | name = "tower" 1093 | version = "0.4.13" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 1096 | dependencies = [ 1097 | "futures-core", 1098 | "futures-util", 1099 | "pin-project", 1100 | "pin-project-lite", 1101 | "tokio", 1102 | "tower-layer", 1103 | "tower-service", 1104 | "tracing", 1105 | ] 1106 | 1107 | [[package]] 1108 | name = "tower-layer" 1109 | version = "0.3.2" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 1112 | 1113 | [[package]] 1114 | name = "tower-service" 1115 | version = "0.3.2" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1118 | 1119 | [[package]] 1120 | name = "tracing" 1121 | version = "0.1.40" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1124 | dependencies = [ 1125 | "log", 1126 | "pin-project-lite", 1127 | "tracing-core", 1128 | ] 1129 | 1130 | [[package]] 1131 | name = "tracing-core" 1132 | version = "0.1.32" 1133 | source = "registry+https://github.com/rust-lang/crates.io-index" 1134 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1135 | dependencies = [ 1136 | "once_cell", 1137 | ] 1138 | 1139 | [[package]] 1140 | name = "try-lock" 1141 | version = "0.2.5" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1144 | 1145 | [[package]] 1146 | name = "unicode-bidi" 1147 | version = "0.3.15" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 1150 | 1151 | [[package]] 1152 | name = "unicode-ident" 1153 | version = "1.0.12" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1156 | 1157 | [[package]] 1158 | name = "unicode-normalization" 1159 | version = "0.1.23" 1160 | source = "registry+https://github.com/rust-lang/crates.io-index" 1161 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 1162 | dependencies = [ 1163 | "tinyvec", 1164 | ] 1165 | 1166 | [[package]] 1167 | name = "url" 1168 | version = "2.5.0" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 1171 | dependencies = [ 1172 | "form_urlencoded", 1173 | "idna", 1174 | "percent-encoding", 1175 | ] 1176 | 1177 | [[package]] 1178 | name = "want" 1179 | version = "0.3.1" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1182 | dependencies = [ 1183 | "try-lock", 1184 | ] 1185 | 1186 | [[package]] 1187 | name = "wasi" 1188 | version = "0.11.0+wasi-snapshot-preview1" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1191 | 1192 | [[package]] 1193 | name = "wildmatch" 1194 | version = "1.1.0" 1195 | source = "registry+https://github.com/rust-lang/crates.io-index" 1196 | checksum = "7f44b95f62d34113cf558c93511ac93027e03e9c29a60dd0fd70e6e025c7270a" 1197 | 1198 | [[package]] 1199 | name = "winapi" 1200 | version = "0.3.9" 1201 | source = "registry+https://github.com/rust-lang/crates.io-index" 1202 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1203 | dependencies = [ 1204 | "winapi-i686-pc-windows-gnu", 1205 | "winapi-x86_64-pc-windows-gnu", 1206 | ] 1207 | 1208 | [[package]] 1209 | name = "winapi-i686-pc-windows-gnu" 1210 | version = "0.4.0" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1213 | 1214 | [[package]] 1215 | name = "winapi-util" 1216 | version = "0.1.6" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" 1219 | dependencies = [ 1220 | "winapi", 1221 | ] 1222 | 1223 | [[package]] 1224 | name = "winapi-x86_64-pc-windows-gnu" 1225 | version = "0.4.0" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1228 | 1229 | [[package]] 1230 | name = "windows-sys" 1231 | version = "0.48.0" 1232 | source = "registry+https://github.com/rust-lang/crates.io-index" 1233 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1234 | dependencies = [ 1235 | "windows-targets 0.48.5", 1236 | ] 1237 | 1238 | [[package]] 1239 | name = "windows-sys" 1240 | version = "0.52.0" 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" 1242 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1243 | dependencies = [ 1244 | "windows-targets 0.52.4", 1245 | ] 1246 | 1247 | [[package]] 1248 | name = "windows-targets" 1249 | version = "0.48.5" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1252 | dependencies = [ 1253 | "windows_aarch64_gnullvm 0.48.5", 1254 | "windows_aarch64_msvc 0.48.5", 1255 | "windows_i686_gnu 0.48.5", 1256 | "windows_i686_msvc 0.48.5", 1257 | "windows_x86_64_gnu 0.48.5", 1258 | "windows_x86_64_gnullvm 0.48.5", 1259 | "windows_x86_64_msvc 0.48.5", 1260 | ] 1261 | 1262 | [[package]] 1263 | name = "windows-targets" 1264 | version = "0.52.4" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" 1267 | dependencies = [ 1268 | "windows_aarch64_gnullvm 0.52.4", 1269 | "windows_aarch64_msvc 0.52.4", 1270 | "windows_i686_gnu 0.52.4", 1271 | "windows_i686_msvc 0.52.4", 1272 | "windows_x86_64_gnu 0.52.4", 1273 | "windows_x86_64_gnullvm 0.52.4", 1274 | "windows_x86_64_msvc 0.52.4", 1275 | ] 1276 | 1277 | [[package]] 1278 | name = "windows_aarch64_gnullvm" 1279 | version = "0.48.5" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1282 | 1283 | [[package]] 1284 | name = "windows_aarch64_gnullvm" 1285 | version = "0.52.4" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" 1288 | 1289 | [[package]] 1290 | name = "windows_aarch64_msvc" 1291 | version = "0.48.5" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1294 | 1295 | [[package]] 1296 | name = "windows_aarch64_msvc" 1297 | version = "0.52.4" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" 1300 | 1301 | [[package]] 1302 | name = "windows_i686_gnu" 1303 | version = "0.48.5" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1306 | 1307 | [[package]] 1308 | name = "windows_i686_gnu" 1309 | version = "0.52.4" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" 1312 | 1313 | [[package]] 1314 | name = "windows_i686_msvc" 1315 | version = "0.48.5" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1318 | 1319 | [[package]] 1320 | name = "windows_i686_msvc" 1321 | version = "0.52.4" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" 1324 | 1325 | [[package]] 1326 | name = "windows_x86_64_gnu" 1327 | version = "0.48.5" 1328 | source = "registry+https://github.com/rust-lang/crates.io-index" 1329 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1330 | 1331 | [[package]] 1332 | name = "windows_x86_64_gnu" 1333 | version = "0.52.4" 1334 | source = "registry+https://github.com/rust-lang/crates.io-index" 1335 | checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" 1336 | 1337 | [[package]] 1338 | name = "windows_x86_64_gnullvm" 1339 | version = "0.48.5" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1342 | 1343 | [[package]] 1344 | name = "windows_x86_64_gnullvm" 1345 | version = "0.52.4" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" 1348 | 1349 | [[package]] 1350 | name = "windows_x86_64_msvc" 1351 | version = "0.48.5" 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" 1353 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1354 | 1355 | [[package]] 1356 | name = "windows_x86_64_msvc" 1357 | version = "0.52.4" 1358 | source = "registry+https://github.com/rust-lang/crates.io-index" 1359 | checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" 1360 | 1361 | [[package]] 1362 | name = "winnow" 1363 | version = "0.6.5" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" 1366 | dependencies = [ 1367 | "memchr", 1368 | ] 1369 | 1370 | [[package]] 1371 | name = "xattr" 1372 | version = "1.3.1" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" 1375 | dependencies = [ 1376 | "libc", 1377 | "linux-raw-sys", 1378 | "rustix", 1379 | ] 1380 | 1381 | [[package]] 1382 | name = "xml-rs" 1383 | version = "0.8.20" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" 1386 | 1387 | [[package]] 1388 | name = "xmltree" 1389 | version = "0.10.3" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" 1392 | dependencies = [ 1393 | "xml-rs", 1394 | ] 1395 | --------------------------------------------------------------------------------