├── .gitignore
├── SetTimerResolution.exe
├── appsettings.json
├── .idea
├── vcs.xml
├── .gitignore
├── modules.xml
└── untitled.iml
├── .gitattributes
├── .vscode
└── launch.json
├── Cargo.toml
├── README.md
├── src
└── main.rs
└── Cargo.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | /target
2 | results.txt
3 |
--------------------------------------------------------------------------------
/SetTimerResolution.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SwiftyPop/TimerResBenchmark/HEAD/SetTimerResolution.exe
--------------------------------------------------------------------------------
/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "StartValue": 0.5,
3 | "IncrementValue": 0.002,
4 | "EndValue": 0.51,
5 | "SampleValue": 20
6 | }
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Mark Rust files as detectable by GitHub Linguist
2 | *.rs linguist-detectable
3 |
4 | # Ignore C# files in language stats
5 | *.cs linguist-vendored
6 |
7 | # Ignore build artifacts
8 | target/* linguist-generated
9 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": []
7 | }
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/untitled.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "timer_res_benchmark"
3 | version = "0.3.2"
4 | edition = "2021"
5 |
6 | [dependencies]
7 | windows-sys = { version = "0.59.0", features = ["Win32_Foundation", "Win32_Security", "Win32_System_Threading", "Win32_System_ProcessStatus", "Win32_System_LibraryLoader"] }
8 | serde = { version = "1.0.217", features = ["derive"] }
9 | serde_json = "1.0.135"
10 | tokio = { version = "1.43.0", features = ["full"] }
11 | csv = "1.3.1"
12 | indicatif = "0.17.9"
13 | os_info = "3.9.2"
14 | raw-cpuid = "11.3.0"
15 | lazy_static = "1.5.0"
16 | sysinfo = "0.33.1"
17 | colored = "3.0.0"
18 | plotters = "0.3.7"
19 | comfy-table = "7.1.3"
20 |
21 |
22 | [dependencies.windows]
23 | version = "0.59.0"
24 | features = [
25 | "Wdk",
26 | "Wdk_System",
27 | "Wdk_System_SystemInformation",
28 | "Win32_System",
29 | "Win32_System_Console",
30 | "Win32_System_Threading",
31 | "Win32_System_SystemInformation",
32 | "Win32_Foundation"
33 | ]
34 |
35 | [dev-dependencies]
36 | # For testing
37 |
38 | [profile.release]
39 | # Optimize for performance
40 | opt-level = 3
41 | lto = true
42 | codegen-units = 1
43 | strip = "symbols"
44 | panic = "abort"
45 | incremental = false
46 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # TimerResBenchmark
2 |
3 |
A Rust-based tool for benchmarking system timer resolution to achieve precise sleep intervals, optimizing performance and consistency for high-performance tasks like gaming, especially in low-latency scenarios. It automatically detects HPET status and identifies the optimal timer resolution for your system.
4 |
5 | 
6 |
7 | 
8 |
9 |
10 | ---
11 |
12 | ## Features
13 | - Checks if HPET is enabled or disabled during benchmark setup.
14 | 
15 | - **Customizable Benchmark Parameters**
16 | - Modify the start value, end value, increment value and sample value through the program/config file.
17 | 
18 |
19 | - **Automatically detects the optimal timer resolution for your system** based on the lowest sleep delta and standard deviation.
20 | 
21 |
22 | - **Rewritten in Rust** for better performance and less overhead.
23 | - GUI (under development)
24 | - Graph (under development)
25 |
26 | ---
27 |
28 | ## Installation and Usage
29 |
30 | 1. **Disable HPET** and set up an **Idle-disabled power plan** (follow the [Troubleshooting](https://github.com/SwiftyPop/TimerResBenchmark/tree/main?tab=readme-ov-file#troubleshooting) guide for help).
31 | 2. Download the latest release from [GitHub Releases](https://github.com/SwiftyPop/TimerResBenchmark/releases).
32 | 3. Extract the `.7z` archive.
33 | 4. Run `timer_res_benchmark.exe` as an administrator.
34 | - You can adjust the benchmark parameters directly in the program or modify them manually in the 'appsettings.json' file(default value).
35 | 5. After the benchmark completes, it will automatically detect the optimal timer resolution for your system. The results and additional details will be saved in the 'results.txt' file.
36 |
37 | ---
38 |
39 | ### Step 2: Set the Optimal Timer Resolution
40 | 1. Create a shortcut for `SetTimerResolution.exe`.
41 | 2. Place the shortcut in your `shell:startup` folder with the following target:
42 | ```
43 | C:\PATH\TO\SetTimerResolution.exe --no-console --resolution 5000
44 | ```
45 | - Replace `5000` with your optimal resolution (e.g., `5000` for 0.5ms).
46 | 3. Restart your PC and verify the settings using `MeasureSleep.exe`.
47 |
48 | ---
49 | ### [Optional] Visualize the Results
50 | 1. Visit [Plotly Chart Studio](https://chart-studio.plotly.com/create/#/).
51 | 2. Click **"Import"** at the top right and upload the `results.txt` file.
52 | 3. Add a trace and configure the settings as shown below:
53 | 
54 | 4. Look for the lowest `Sleep(1) Delta` on the y-axis. This represents the most precise and consistent 1ms sleep delays.
55 | - Example: If the lowest delta is at 0.5024ms, this is your optimal timer resolution.
56 |
57 | ---
58 |
59 | ## Troubleshooting
60 |
61 | ### Sleep Delays Are Spiking (>1ms)
62 | 1. **Disable HPET**:
63 | - Open Command Prompt as administrator and run:
64 | ```bash
65 | bcdedit /deletevalue useplatformclock
66 | bcdedit /set disabledynamictick yes
67 | ```
68 | - On Windows Server 2022+ and Windows 11+, apply this registry change:
69 | ```plaintext
70 | [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel]
71 | "GlobalTimerResolutionRequests"=dword:00000001
72 | ```
73 | - You can now verify HPET status via this program:
74 | 
75 |
76 |
77 | 2. **Use an Idle-Disabled Power Plan**:
78 | - Download the [Muren power plan](https://www.mediafire.com/file/39yxlxpbkyjg3qa/Muren.pow/file).
79 | - Import the plan using Command Prompt:
80 | ```bash
81 | powercfg -import C:\PATH\TO\MUREN.POW
82 | ```
83 | - Set your power plan to **Muren**.
84 |
85 | ---
86 |
87 | ## Why Use TimerResBenchmark?
88 | - Disables HPET and uses more stable timers (e.g., TSC at 3.32MHz) for better frame rate consistency and lower latency.
89 | - Unlike the original PowerShell-based benchmark, this tool is now a native executable written in Rust, making it faster and easier to use.
90 | - This tool was initially rewritten from C# to Rust as part of a learning project. Contributions and feedback are always welcome!
91 |
92 | ---
93 |
94 | ## License
95 | This project is licensed under the **MIT License**. See the [LICENSE](https://github.com/SwiftyPop/TimerResBenchmark/blob/master/LICENSE) file for details.
96 |
--------------------------------------------------------------------------------
/src/main.rs:
--------------------------------------------------------------------------------
1 | use io::ErrorKind;
2 | use serde::{Deserialize, Serialize};
3 | use std::io::{self, BufWriter, Error, Write};
4 | use std::path::PathBuf;
5 | use std::process::{Command, Stdio};
6 | use std::time::Duration;
7 | use std::{env, ptr};
8 | use std::{fs, mem::size_of};
9 | use tokio::task;
10 | use tokio::time::sleep;
11 | use std::mem;
12 | use os_info;
13 | use raw_cpuid;
14 | use windows_sys::Win32::Foundation::HANDLE;
15 | use windows_sys::Win32::Security::{GetTokenInformation, TokenElevation, TOKEN_ELEVATION, TOKEN_QUERY};
16 | use windows_sys::Win32::System::Threading::{GetCurrentProcess, OpenProcessToken};
17 | use std::sync::atomic::{AtomicBool, Ordering};
18 | use std::sync::Once;
19 | use indicatif;
20 | use std::sync::Mutex;
21 | use comfy_table::{Cell, Color, ContentArrangement, Row, Table};
22 | use colored::Colorize;
23 |
24 | #[derive(Debug, Deserialize, Serialize)]
25 | struct BenchmarkingParameters {
26 | #[serde(rename = "StartValue", deserialize_with = "validate_positive_f64")]
27 | start_value: f64,
28 | #[serde(rename = "IncrementValue", deserialize_with = "validate_positive_f64")]
29 | increment_value: f64,
30 | #[serde(rename = "EndValue", deserialize_with = "validate_positive_f64")]
31 | end_value: f64,
32 | #[serde(rename = "SampleValue", deserialize_with = "validate_positive_i32")]
33 | sample_value: i32,
34 | }
35 |
36 | fn validate_positive_f64<'de, D>(deserializer: D) -> Result
37 | where
38 | D: serde::Deserializer<'de>,
39 | {
40 | let value = f64::deserialize(deserializer)?;
41 | if value > 0.0 {
42 | Ok(value)
43 | } else {
44 | Err(serde::de::Error::custom("Value must be positive"))
45 | }
46 | }
47 |
48 | fn validate_positive_i32<'de, D>(deserializer: D) -> Result
49 | where
50 | D: serde::Deserializer<'de>,
51 | {
52 | let value = i32::deserialize(deserializer)?;
53 | if value > 0 {
54 | Ok(value)
55 | } else {
56 | Err(serde::de::Error::custom("Value must be positive"))
57 | }
58 | }
59 |
60 |
61 | #[tokio::main]
62 | async fn main() -> io::Result<()> {
63 | use colored::*;
64 |
65 | // Create a dynamic separator using '=' characters
66 | let separator = "=".repeat(60);
67 |
68 | // Title Block
69 | println!("\n{}", separator);
70 | println!("{:^60}", "🚀 Timer Resolution Benchmark Tool".bold().cyan());
71 | println!("{}\n", separator);
72 |
73 | // Check admin privileges first - fail fast
74 | if !is_admin() {
75 | eprintln!("{} {}", "❌ Error:".bold().red(), "Administrator privileges required!".bold().red());
76 | eprintln!(" {}", "Please run this program as Administrator.".bold().red());
77 | return Err(Error::new(ErrorKind::PermissionDenied, "Administrator privileges required"));
78 | }
79 |
80 | // System information block
81 | println!("{}", "📊 System Information".bold().yellow());
82 | println!("━━━━━━━━━━━━━━━━━━━");
83 | println!("📂 Working Directory: {}", env::current_dir()?.display());
84 | println!("🛡️ Admin Privileges: {}", "✓ Confirmed".bold().green());
85 |
86 | // Display OS information
87 | let os_info = os_info::get();
88 |
89 | // Check if the OS is Windows and display specific version information
90 | if let os_info::Type::Windows = os_info.os_type() {
91 | if let Some(build_number) = os_info.version().to_string().split('.').nth(2).and_then(|s| s.parse::().ok()) {
92 | let version = if build_number >= 22000 {
93 | "Windows 11"
94 | } else {
95 | "Windows 10"
96 | };
97 | println!("🖥️ Windows Version: {} (Build {})", version, build_number);
98 | } else {
99 | println!("🖥️ Windows Version: Unknown Build");
100 | }
101 | }
102 |
103 | // Display CPU information
104 | let cpuid = raw_cpuid::CpuId::new();
105 |
106 | // Get the CPU brand string
107 | if let Some(brand) = cpuid.get_processor_brand_string() {
108 | println!("💻 CPU: {}", brand.as_str().trim());
109 | } else {
110 | println!("💻 CPU: Unknown");
111 | }
112 |
113 | println!();
114 |
115 | // HPET Configuration block
116 | println!("{}", "🔧 System Configuration".bold().yellow());
117 | println!("━━━━━━━━━━━━━━━━━━━━");
118 | check_hpet_status()?;
119 | println!();
120 |
121 | // Load and parse configuration
122 | let parameters = match fs::read_to_string("appsettings.json")
123 | .and_then(|content| serde_json::from_str::(&content)
124 | .map_err(|e| Error::new(ErrorKind::InvalidData, e)))
125 | {
126 | Ok(mut params) => {
127 | let mut input = String::new();
128 | let mut prompt = |desc: &str, current: &str| -> io::Result> {
129 | println!("▸ {}: {} (current)", desc, current);
130 | println!("Enter new {} (or press Enter to keep current): ", desc);
131 | input.clear();
132 | io::stdin().read_line(&mut input)?;
133 | let trimmed = input.trim();
134 | Ok(if trimmed.is_empty() { None } else { Some(trimmed.to_string()) })
135 | };
136 |
137 | println!("⚙️ Benchmark Parameters");
138 | println!("━━━━━━━━━━━━━━━━━━━");
139 |
140 | if let Some(new_value) = prompt("Start Value", &format!("{:.4} ms", params.start_value))? {
141 | params.start_value = new_value.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, e))?;
142 | }
143 | if let Some(new_value) = prompt("Increment Value", &format!("{:.4} ms", params.increment_value))? {
144 | params.increment_value = new_value.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, e))?;
145 | }
146 | if let Some(new_value) = prompt("End Value", &format!("{:.4} ms", params.end_value))? {
147 | params.end_value = new_value.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, e))?;
148 | }
149 | if let Some(new_value) = prompt("Sample Value", ¶ms.sample_value.to_string())? {
150 | params.sample_value = new_value.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, e))?;
151 | }
152 |
153 | let iterations = ((params.end_value - params.start_value) / params.increment_value).ceil();
154 | println!("▸ Iterations: {}\n", iterations as i32);
155 |
156 | // Save updated parameters back to appsettings.json
157 | if let Err(e) = fs::write("appsettings.json", serde_json::to_string_pretty(¶ms)?) {
158 | eprintln!("❌ Failed to save updated parameters: {}", e);
159 | }
160 |
161 | params
162 | },
163 | Err(e) => {
164 | eprintln!("❌ Configuration Error: {}", e);
165 | return Err(e);
166 | }
167 | };
168 |
169 | let exe_dir = env::current_exe()?.parent()
170 | .ok_or_else(|| {
171 | eprintln!("❌ Error: Failed to get current executable path");
172 | Error::new(ErrorKind::Other, "Failed to get current executable path")
173 | })?
174 | .to_path_buf();
175 |
176 | let set_timer_resolution_path = exe_dir.join("SetTimerResolution.exe");
177 | let measure_sleep_path = exe_dir.join("MeasureSleep.exe");
178 |
179 | // Dependency check
180 | println!("\n🔍 Checking Dependencies");
181 | println!("━━━━━━━━━━━━━━━━━━━━━");
182 |
183 | let dependencies = [
184 | ("SetTimerResolution.exe", &set_timer_resolution_path),
185 | ("MeasureSleep.exe", &measure_sleep_path),
186 | ];
187 |
188 | let missing_dependencies: Vec<_> = dependencies.iter()
189 | .filter_map(|(name, path)| {
190 | if path.exists() {
191 | println!("✓ Found: {}", path.file_name().unwrap_or_default().to_string_lossy());
192 | None
193 | } else {
194 | Some(*name)
195 | }
196 | })
197 | .collect();
198 |
199 | if !missing_dependencies.is_empty() {
200 | eprintln!("❌ Error: Missing dependencies: {}", missing_dependencies.join(", "));
201 | return Err(Error::new(ErrorKind::NotFound, "Missing dependencies"));
202 | }
203 | println!();
204 |
205 | prompt_user("⏳ Press Enter to start the benchmark...")?;
206 |
207 | fn prompt_user(message: &str) -> io::Result<()> {
208 | println!("{}", message);
209 | io::stdin().read_line(&mut String::new())?;
210 | Ok(())
211 | }
212 |
213 | let results_file = fs::File::create("results.txt")?;
214 | let mut results_writer = BufWriter::with_capacity(8 * 1024, results_file);
215 | writeln!(results_writer, "RequestedResolutionMs,DeltaMs,StandardDeviation")?;
216 | println!("📝 Results will be saved to: results.txt");
217 |
218 | let mut current = parameters.start_value;
219 | let total_iterations = ((parameters.end_value - parameters.start_value) / parameters.increment_value).ceil() as u64;
220 | let progress_bar = indicatif::ProgressBar::new(total_iterations);
221 | progress_bar.set_style(
222 | indicatif::ProgressStyle::default_bar()
223 | .template(
224 | "{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {pos}/{len} \n\
225 | ▸ Current Resolution: {msg:.yellow} \n\
226 | ▸ ETA: {eta_precise} | Iteration Time: {per_sec}"
227 | )
228 | .map_err(|e| Error::new(ErrorKind::Other, e.to_string()))?
229 | .progress_chars("█▓▒░ ")
230 | .with_key("per_sec", |state: &indicatif::ProgressState, w: &mut dyn std::fmt::Write| write!(w, "{:.2}s/iter", state.per_sec()).unwrap())
231 | );
232 | progress_bar.enable_steady_tick(Duration::from_millis(100));
233 |
234 | while current <= parameters.end_value {
235 | let resolution = ((current * 10_000.0).round() / 10_000.0 * 10_000.0) as i32;
236 |
237 | let set_timer_resolution_path = set_timer_resolution_path.clone();
238 | let set_timer_result = task::spawn_blocking({
239 | move || {
240 | Command::new(&set_timer_resolution_path)
241 | .args(&["--resolution", &resolution.to_string(), "--no-console"])
242 | .stdout(Stdio::null())
243 | .spawn()
244 | }
245 | }).await?;
246 |
247 | if let Err(e) = set_timer_result {
248 | eprintln!("Failed to set timer resolution: {}", e);
249 | }
250 |
251 |
252 | sleep(Duration::from_millis(1)).await;
253 |
254 | let output = Command::new(&measure_sleep_path)
255 | .arg("--samples")
256 | .arg(parameters.sample_value.to_string())
257 | .output()
258 | .map_err(|e| {
259 | eprintln!("Failed to execute measurement: {}", e);
260 | e
261 | })?;
262 |
263 | let (avg, stdev) = parse_measurement_output(&output.stdout).map_err(|e| {
264 | eprintln!("Failed to parse measurement output: {}", e);
265 | e
266 | })?;
267 |
268 | if avg != 0.0 && stdev != 0.0 {
269 | writeln!(results_writer, "{:.4},{:.4},{:.4}", current, avg, stdev)?;
270 | } else {
271 | eprintln!("❌ Measurement output is invalid for resolution: {}", resolution);
272 | }
273 |
274 | results_writer.flush()?;
275 | if let Err(e) = kill_process("SetTimerResolution.exe") {
276 | eprintln!("Failed to kill process: {}", e);
277 | }
278 |
279 | current += parameters.increment_value;
280 | progress_bar.set_message(format!("Current resolution: {:.4} ms", current));
281 | progress_bar.inc(1);
282 | }
283 |
284 | progress_bar.finish_with_message("Benchmarking completed successfully");
285 |
286 | // Confirm the existence of the results file
287 | let results_path = PathBuf::from("results.txt");
288 | if !results_path.exists() {
289 | eprintln!("❌ Error: results.txt file not found!");
290 | return Err(Error::new(ErrorKind::NotFound, "results.txt file not found"));
291 | }
292 |
293 | let results_content = fs::read_to_string(&results_path)?;
294 | let mut rdr = csv::ReaderBuilder::new()
295 | .has_headers(true)
296 | .from_reader(results_content.as_bytes());
297 |
298 | let mut all_results = Vec::new();
299 | let mut optimal_resolution = None;
300 | let mut min_delta = f64::MAX;
301 | let mut min_std = f64::MAX;
302 |
303 | for result in rdr.records().filter_map(|r| r.ok()) {
304 | if let (Ok(res), Ok(delta), Ok(std)) = (
305 | result[0].parse::(),
306 | result[1].parse::(),
307 | result[2].parse::(),
308 | ) {
309 | all_results.push((res, delta, std));
310 |
311 | // Find the optimal resolution
312 | if delta < min_delta || (delta == min_delta && std < min_std) {
313 | optimal_resolution = Some(res);
314 | min_delta = delta;
315 | min_std = std;
316 | }
317 | }
318 | }
319 | // Call print_summary if valid results are found
320 | if let Some(resolution) = optimal_resolution {
321 | print_summary(resolution, &all_results);
322 | } else {
323 | eprintln!("❌ Error: No valid data found in results.txt");
324 | return Err(Error::new(ErrorKind::InvalidData, "No valid data found in results.txt"));
325 | }
326 |
327 | println!("Benchmarking completed successfully");
328 |
329 | // Wait for user input before exiting
330 | prompt_exit()?;
331 |
332 | Ok(())
333 | }
334 |
335 | fn prompt_exit() -> io::Result<()> {
336 | println!("Press Enter to exit...");
337 | io::stdin().read_line(&mut String::new())?;
338 | Ok(())
339 | }
340 | fn print_summary(optimal_res: f64, all_results: &[(f64, f64, f64)]) {
341 | assert!(!all_results.is_empty(), "Cannot print summary of empty results");
342 |
343 | let mut table = Table::new();
344 | table.set_content_arrangement(ContentArrangement::Dynamic);
345 | table.set_header(vec![
346 | Cell::new("Resolution (ms)"),
347 | Cell::new("Avg Δ (ms)"),
348 | Cell::new("STDEV"),
349 | ]);
350 |
351 | let mut optimal_row_index = None;
352 |
353 | for (i, &(res, avg, stdev)) in all_results.iter().enumerate() {
354 | // Check if this row is optimal based on a tolerance
355 | let is_optimal = (res - optimal_res).abs() < f64::EPSILON;
356 | if is_optimal {
357 | optimal_row_index = Some(i);
358 | }
359 |
360 | // Create cells with formatted numbers.
361 | // We use comfy_table's Cell and its styling API, so the styling does not affect width calculations.
362 | let res_cell = if is_optimal {
363 | Cell::new(format!("{:>8.4}", res)).fg(Color::Green)
364 | } else {
365 | Cell::new(format!("{:>8.4}", res))
366 | };
367 | let avg_cell = if is_optimal {
368 | Cell::new(format!("{:>8.4}", avg)).fg(Color::Green)
369 | } else {
370 | Cell::new(format!("{:>8.4}", avg))
371 | };
372 | let stdev_cell = if is_optimal {
373 | Cell::new(format!("{:>8.4}", stdev)).fg(Color::Green)
374 | } else {
375 | Cell::new(format!("{:>8.4}", stdev))
376 | };
377 |
378 | let row = Row::from(vec![res_cell, avg_cell, stdev_cell]);
379 | table.add_row(row);
380 | }
381 |
382 | assert!(optimal_row_index.is_some(), "Optimal resolution not found in results");
383 |
384 | // Finally, print the table.
385 | println!("{}", table);
386 |
387 | // Print the header and optimal resolution.
388 | println!("\n{}", "OPTIMAL RESOLUTION FOUND".green().bold());
389 | println!("{}", "═════════════════════════");
390 | println!("▸ {:>8.4} ms\n", optimal_res);
391 | }
392 |
393 |
394 | lazy_static::lazy_static! {
395 | static ref HPET_STATUS: Mutex> = Mutex::new(None);
396 | }
397 |
398 | fn check_hpet_status() -> io::Result<()> {
399 | let mut status = HPET_STATUS.lock().unwrap();
400 |
401 | // Use the cached status if available.
402 | if let Some(ref cached_status) = *status {
403 | println!("HPET status (cached): {}", cached_status);
404 | return Ok(());
405 | }
406 |
407 | // Run the bcdedit command to get the current boot configuration.
408 | let output = Command::new("bcdedit")
409 | .arg("/enum")
410 | .arg("{current}")
411 | .output()?;
412 |
413 | if !output.status.success() {
414 | eprintln!("❌ Error: Failed to retrieve HPET status");
415 | return Err(Error::new(ErrorKind::Other, "Failed to retrieve HPET status"));
416 | }
417 |
418 | let output_str = String::from_utf8_lossy(&output.stdout);
419 |
420 | // We'll capture the values for the two keys if they exist.
421 | let mut useplatformclock_value: Option = None;
422 | let mut disabledynamictick_value: Option = None;
423 |
424 | for line in output_str.lines() {
425 | let mut parts = line.split_whitespace();
426 | if let (Some(key), Some(value)) = (parts.next(), parts.next()) {
427 | match key.to_lowercase().as_str() {
428 | "useplatformclock" => {
429 | useplatformclock_value = Some(value.to_lowercase());
430 | }
431 | "disabledynamictick" => {
432 | disabledynamictick_value = Some(value.to_lowercase());
433 | }
434 | _ => {}
435 | }
436 | }
437 | }
438 |
439 | // Decide HPET status.
440 | // According to the requirement, if "useplatformclock" is absent and "disabledynamictick" is "yes",
441 | // then we consider HPET as disabled.
442 | let hpet_status = match (
443 | useplatformclock_value.as_deref(),
444 | disabledynamictick_value.as_deref(),
445 | ) {
446 | // If "useplatformclock" is present and equals "no", and disabledynamictick is "yes" → disabled.
447 | (Some("no"), Some("yes")) => "disabled",
448 | // If "useplatformclock" is absent but disabledynamictick is "yes" → disabled.
449 | (None, Some("yes")) => "disabled",
450 | // If both keys are absent, default to disabled.
451 | (None, None) => "disabled",
452 | // In all other cases, consider HPET as enabled.
453 | _ => "enabled",
454 | };
455 |
456 | println!("HPET status: {}", hpet_status);
457 |
458 | // If HPET is enabled, notify the user and prompt to disable.
459 | if hpet_status == "enabled" {
460 | println!("⚠️ HPET is enabled. For optimal results, it is recommended to disable HPET.");
461 | println!("Please refer to the troubleshooting guide: https://github.com/SwiftyPop/TimerResBenchmark?tab=readme-ov-file#troubleshooting");
462 | println!("Would you like to disable HPET now? (y/n): ");
463 | let mut input = String::new();
464 | io::stdin().read_line(&mut input)?;
465 | if input.trim().eq_ignore_ascii_case("y") {
466 | if let Err(e) = disable_hpet() {
467 | eprintln!("❌ Error: Failed to disable HPET: {}", e);
468 | return Err(e);
469 | }
470 | println!("✅ HPET has been disabled. Please restart your computer for the changes to take effect.");
471 | }
472 | }
473 |
474 | *status = Some(hpet_status.to_string());
475 |
476 | Ok(())
477 | }
478 |
479 | fn disable_hpet() -> io::Result<()> {
480 | let mut commands = vec![
481 | {
482 | let mut cmd = Command::new("bcdedit");
483 | cmd.arg("/deletevalue").arg("useplatformclock");
484 | cmd
485 | },
486 | {
487 | let mut cmd = Command::new("bcdedit");
488 | cmd.arg("/set").arg("disabledynamictick").arg("yes");
489 | cmd
490 | },
491 | ];
492 |
493 | if let Err(e) = apply_registry_tweak() {
494 | eprintln!("❌ Error: Failed to apply registry tweak: {}", e);
495 | return Err(e.into());
496 | }
497 |
498 | for command in commands.iter_mut() {
499 | let output = command.output()
500 | .map_err(|e| io::Error::new(io::ErrorKind::Other, format!("Failed to disable HPET: {}", e)))?;
501 | if !output.status.success() {
502 | return Err(io::Error::new(
503 | io::ErrorKind::Other,
504 | format!("Failed to disable HPET: {}", output.status),
505 | ));
506 | }
507 | }
508 |
509 | Ok(())
510 | }
511 |
512 | fn apply_registry_tweak() -> io::Result<()> {
513 | let output = Command::new("reg")
514 | .arg("add")
515 | .arg(r"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel")
516 | .arg("/v")
517 | .arg("GlobalTimerResolutionRequests")
518 | .arg("/t")
519 | .arg("REG_DWORD")
520 | .arg("/d")
521 | .arg("1")
522 | .arg("/f")
523 | .output()?;
524 |
525 | if !output.status.success() {
526 | return Err(Error::new(
527 | ErrorKind::Other,
528 | "Failed to apply registry tweak",
529 | ));
530 | }
531 |
532 | Ok(())
533 | }
534 |
535 | fn parse_measurement_output(output: &[u8]) -> io::Result<(f64, f64)> {
536 | let output_str = std::str::from_utf8(output)
537 | .map_err(|e| Error::new(ErrorKind::InvalidData, e))?;
538 |
539 | let mut avg = None;
540 | let mut stdev = None;
541 |
542 | for line in output_str.lines() {
543 | if avg.is_none() && line.starts_with("Avg: ") {
544 | avg = line[5..].parse().ok();
545 | } else if stdev.is_none() && line.starts_with("STDEV: ") {
546 | stdev = line[7..].parse().ok();
547 | }
548 |
549 | if avg.is_some() && stdev.is_some() {
550 | break;
551 | }
552 | }
553 |
554 | avg.zip(stdev).ok_or_else(|| Error::new(ErrorKind::InvalidData, "Invalid measurement output"))
555 | }
556 |
557 | static IS_ADMIN: AtomicBool = AtomicBool::new(false);
558 | static INIT: Once = Once::new();
559 |
560 | fn is_admin() -> bool {
561 | INIT.call_once(|| {
562 | unsafe {
563 | let mut token: HANDLE = ptr::null_mut();
564 | if OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &mut token) != 0 {
565 | let mut elevation: TOKEN_ELEVATION = mem::zeroed();
566 | let mut size = size_of::() as u32;
567 |
568 | if GetTokenInformation(
569 | token,
570 | TokenElevation,
571 | &mut elevation as *mut _ as *mut std::ffi::c_void,
572 | size,
573 | &mut size,
574 | ) != 0 && elevation.TokenIsElevated != 0
575 | {
576 | IS_ADMIN.store(true, Ordering::Relaxed);
577 | }
578 | windows_sys::Win32::Foundation::CloseHandle(token);
579 | }
580 | }
581 | });
582 |
583 | IS_ADMIN.load(Ordering::Relaxed)
584 | }
585 |
586 | fn kill_process(process_name: &str) -> io::Result<()> {
587 | let mut system = sysinfo::System::new_all();
588 | system.refresh_all();
589 |
590 | let mut found = false;
591 |
592 | for (_pid, process) in system.processes() {
593 | if process.name().eq_ignore_ascii_case(process_name) {
594 | if process.kill() {
595 | found = true;
596 | } else {
597 | return Err(Error::new(ErrorKind::Other, format!("Failed to kill process {}", process_name)));
598 | }
599 | }
600 | }
601 |
602 | if !found {
603 | eprintln!("Process {} not found", process_name);
604 | return Err(Error::new(ErrorKind::NotFound, format!("Process {} not found", process_name)));
605 | }
606 |
607 | Ok(())
608 | }
609 |
610 |
611 |
--------------------------------------------------------------------------------
/Cargo.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Cargo.
2 | # It is not intended for manual editing.
3 | version = 4
4 |
5 | [[package]]
6 | name = "addr2line"
7 | version = "0.24.2"
8 | source = "registry+https://github.com/rust-lang/crates.io-index"
9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
10 | dependencies = [
11 | "gimli",
12 | ]
13 |
14 | [[package]]
15 | name = "adler2"
16 | version = "2.0.0"
17 | source = "registry+https://github.com/rust-lang/crates.io-index"
18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
19 |
20 | [[package]]
21 | name = "android-tzdata"
22 | version = "0.1.1"
23 | source = "registry+https://github.com/rust-lang/crates.io-index"
24 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
25 |
26 | [[package]]
27 | name = "android_system_properties"
28 | version = "0.1.5"
29 | source = "registry+https://github.com/rust-lang/crates.io-index"
30 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
31 | dependencies = [
32 | "libc",
33 | ]
34 |
35 | [[package]]
36 | name = "autocfg"
37 | version = "1.4.0"
38 | source = "registry+https://github.com/rust-lang/crates.io-index"
39 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
40 |
41 | [[package]]
42 | name = "backtrace"
43 | version = "0.3.74"
44 | source = "registry+https://github.com/rust-lang/crates.io-index"
45 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
46 | dependencies = [
47 | "addr2line",
48 | "cfg-if",
49 | "libc",
50 | "miniz_oxide",
51 | "object",
52 | "rustc-demangle",
53 | "windows-targets 0.52.6",
54 | ]
55 |
56 | [[package]]
57 | name = "bitflags"
58 | version = "1.3.2"
59 | source = "registry+https://github.com/rust-lang/crates.io-index"
60 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
61 |
62 | [[package]]
63 | name = "bitflags"
64 | version = "2.8.0"
65 | source = "registry+https://github.com/rust-lang/crates.io-index"
66 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
67 |
68 | [[package]]
69 | name = "bumpalo"
70 | version = "3.16.0"
71 | source = "registry+https://github.com/rust-lang/crates.io-index"
72 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
73 |
74 | [[package]]
75 | name = "bytemuck"
76 | version = "1.21.0"
77 | source = "registry+https://github.com/rust-lang/crates.io-index"
78 | checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"
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.9.0"
89 | source = "registry+https://github.com/rust-lang/crates.io-index"
90 | checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
91 |
92 | [[package]]
93 | name = "cc"
94 | version = "1.2.10"
95 | source = "registry+https://github.com/rust-lang/crates.io-index"
96 | checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229"
97 | dependencies = [
98 | "shlex",
99 | ]
100 |
101 | [[package]]
102 | name = "cfg-if"
103 | version = "1.0.0"
104 | source = "registry+https://github.com/rust-lang/crates.io-index"
105 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
106 |
107 | [[package]]
108 | name = "chrono"
109 | version = "0.4.39"
110 | source = "registry+https://github.com/rust-lang/crates.io-index"
111 | checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
112 | dependencies = [
113 | "android-tzdata",
114 | "iana-time-zone",
115 | "js-sys",
116 | "num-traits",
117 | "wasm-bindgen",
118 | "windows-targets 0.52.6",
119 | ]
120 |
121 | [[package]]
122 | name = "color_quant"
123 | version = "1.1.0"
124 | source = "registry+https://github.com/rust-lang/crates.io-index"
125 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
126 |
127 | [[package]]
128 | name = "colored"
129 | version = "3.0.0"
130 | source = "registry+https://github.com/rust-lang/crates.io-index"
131 | checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e"
132 | dependencies = [
133 | "windows-sys 0.59.0",
134 | ]
135 |
136 | [[package]]
137 | name = "comfy-table"
138 | version = "7.1.3"
139 | source = "registry+https://github.com/rust-lang/crates.io-index"
140 | checksum = "24f165e7b643266ea80cb858aed492ad9280e3e05ce24d4a99d7d7b889b6a4d9"
141 | dependencies = [
142 | "crossterm",
143 | "strum",
144 | "strum_macros",
145 | "unicode-width",
146 | ]
147 |
148 | [[package]]
149 | name = "console"
150 | version = "0.15.10"
151 | source = "registry+https://github.com/rust-lang/crates.io-index"
152 | checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b"
153 | dependencies = [
154 | "encode_unicode",
155 | "libc",
156 | "once_cell",
157 | "unicode-width",
158 | "windows-sys 0.59.0",
159 | ]
160 |
161 | [[package]]
162 | name = "core-foundation"
163 | version = "0.9.4"
164 | source = "registry+https://github.com/rust-lang/crates.io-index"
165 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
166 | dependencies = [
167 | "core-foundation-sys",
168 | "libc",
169 | ]
170 |
171 | [[package]]
172 | name = "core-foundation-sys"
173 | version = "0.8.7"
174 | source = "registry+https://github.com/rust-lang/crates.io-index"
175 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
176 |
177 | [[package]]
178 | name = "core-graphics"
179 | version = "0.23.2"
180 | source = "registry+https://github.com/rust-lang/crates.io-index"
181 | checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"
182 | dependencies = [
183 | "bitflags 1.3.2",
184 | "core-foundation",
185 | "core-graphics-types",
186 | "foreign-types",
187 | "libc",
188 | ]
189 |
190 | [[package]]
191 | name = "core-graphics-types"
192 | version = "0.1.3"
193 | source = "registry+https://github.com/rust-lang/crates.io-index"
194 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
195 | dependencies = [
196 | "bitflags 1.3.2",
197 | "core-foundation",
198 | "libc",
199 | ]
200 |
201 | [[package]]
202 | name = "core-text"
203 | version = "20.1.0"
204 | source = "registry+https://github.com/rust-lang/crates.io-index"
205 | checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5"
206 | dependencies = [
207 | "core-foundation",
208 | "core-graphics",
209 | "foreign-types",
210 | "libc",
211 | ]
212 |
213 | [[package]]
214 | name = "crc32fast"
215 | version = "1.4.2"
216 | source = "registry+https://github.com/rust-lang/crates.io-index"
217 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
218 | dependencies = [
219 | "cfg-if",
220 | ]
221 |
222 | [[package]]
223 | name = "crossbeam-deque"
224 | version = "0.8.6"
225 | source = "registry+https://github.com/rust-lang/crates.io-index"
226 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
227 | dependencies = [
228 | "crossbeam-epoch",
229 | "crossbeam-utils",
230 | ]
231 |
232 | [[package]]
233 | name = "crossbeam-epoch"
234 | version = "0.9.18"
235 | source = "registry+https://github.com/rust-lang/crates.io-index"
236 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
237 | dependencies = [
238 | "crossbeam-utils",
239 | ]
240 |
241 | [[package]]
242 | name = "crossbeam-utils"
243 | version = "0.8.21"
244 | source = "registry+https://github.com/rust-lang/crates.io-index"
245 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
246 |
247 | [[package]]
248 | name = "crossterm"
249 | version = "0.28.1"
250 | source = "registry+https://github.com/rust-lang/crates.io-index"
251 | checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
252 | dependencies = [
253 | "bitflags 2.8.0",
254 | "crossterm_winapi",
255 | "parking_lot",
256 | "rustix",
257 | "winapi",
258 | ]
259 |
260 | [[package]]
261 | name = "crossterm_winapi"
262 | version = "0.9.1"
263 | source = "registry+https://github.com/rust-lang/crates.io-index"
264 | checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
265 | dependencies = [
266 | "winapi",
267 | ]
268 |
269 | [[package]]
270 | name = "csv"
271 | version = "1.3.1"
272 | source = "registry+https://github.com/rust-lang/crates.io-index"
273 | checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf"
274 | dependencies = [
275 | "csv-core",
276 | "itoa",
277 | "ryu",
278 | "serde",
279 | ]
280 |
281 | [[package]]
282 | name = "csv-core"
283 | version = "0.1.11"
284 | source = "registry+https://github.com/rust-lang/crates.io-index"
285 | checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70"
286 | dependencies = [
287 | "memchr",
288 | ]
289 |
290 | [[package]]
291 | name = "dirs"
292 | version = "5.0.1"
293 | source = "registry+https://github.com/rust-lang/crates.io-index"
294 | checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
295 | dependencies = [
296 | "dirs-sys",
297 | ]
298 |
299 | [[package]]
300 | name = "dirs-sys"
301 | version = "0.4.1"
302 | source = "registry+https://github.com/rust-lang/crates.io-index"
303 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
304 | dependencies = [
305 | "libc",
306 | "option-ext",
307 | "redox_users",
308 | "windows-sys 0.48.0",
309 | ]
310 |
311 | [[package]]
312 | name = "dlib"
313 | version = "0.5.2"
314 | source = "registry+https://github.com/rust-lang/crates.io-index"
315 | checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412"
316 | dependencies = [
317 | "libloading",
318 | ]
319 |
320 | [[package]]
321 | name = "dwrote"
322 | version = "0.11.2"
323 | source = "registry+https://github.com/rust-lang/crates.io-index"
324 | checksum = "70182709525a3632b2ba96b6569225467b18ecb4a77f46d255f713a6bebf05fd"
325 | dependencies = [
326 | "lazy_static",
327 | "libc",
328 | "winapi",
329 | "wio",
330 | ]
331 |
332 | [[package]]
333 | name = "either"
334 | version = "1.13.0"
335 | source = "registry+https://github.com/rust-lang/crates.io-index"
336 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
337 |
338 | [[package]]
339 | name = "encode_unicode"
340 | version = "1.0.0"
341 | source = "registry+https://github.com/rust-lang/crates.io-index"
342 | checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"
343 |
344 | [[package]]
345 | name = "errno"
346 | version = "0.3.10"
347 | source = "registry+https://github.com/rust-lang/crates.io-index"
348 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
349 | dependencies = [
350 | "libc",
351 | "windows-sys 0.59.0",
352 | ]
353 |
354 | [[package]]
355 | name = "fdeflate"
356 | version = "0.3.7"
357 | source = "registry+https://github.com/rust-lang/crates.io-index"
358 | checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
359 | dependencies = [
360 | "simd-adler32",
361 | ]
362 |
363 | [[package]]
364 | name = "flate2"
365 | version = "1.0.35"
366 | source = "registry+https://github.com/rust-lang/crates.io-index"
367 | checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
368 | dependencies = [
369 | "crc32fast",
370 | "miniz_oxide",
371 | ]
372 |
373 | [[package]]
374 | name = "float-ord"
375 | version = "0.3.2"
376 | source = "registry+https://github.com/rust-lang/crates.io-index"
377 | checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d"
378 |
379 | [[package]]
380 | name = "font-kit"
381 | version = "0.14.2"
382 | source = "registry+https://github.com/rust-lang/crates.io-index"
383 | checksum = "b64b34f4efd515f905952d91bc185039863705592c0c53ae6d979805dd154520"
384 | dependencies = [
385 | "bitflags 2.8.0",
386 | "byteorder",
387 | "core-foundation",
388 | "core-graphics",
389 | "core-text",
390 | "dirs",
391 | "dwrote",
392 | "float-ord",
393 | "freetype-sys",
394 | "lazy_static",
395 | "libc",
396 | "log",
397 | "pathfinder_geometry",
398 | "pathfinder_simd",
399 | "walkdir",
400 | "winapi",
401 | "yeslogic-fontconfig-sys",
402 | ]
403 |
404 | [[package]]
405 | name = "foreign-types"
406 | version = "0.5.0"
407 | source = "registry+https://github.com/rust-lang/crates.io-index"
408 | checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
409 | dependencies = [
410 | "foreign-types-macros",
411 | "foreign-types-shared",
412 | ]
413 |
414 | [[package]]
415 | name = "foreign-types-macros"
416 | version = "0.2.3"
417 | source = "registry+https://github.com/rust-lang/crates.io-index"
418 | checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
419 | dependencies = [
420 | "proc-macro2",
421 | "quote",
422 | "syn",
423 | ]
424 |
425 | [[package]]
426 | name = "foreign-types-shared"
427 | version = "0.3.1"
428 | source = "registry+https://github.com/rust-lang/crates.io-index"
429 | checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
430 |
431 | [[package]]
432 | name = "freetype-sys"
433 | version = "0.20.1"
434 | source = "registry+https://github.com/rust-lang/crates.io-index"
435 | checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134"
436 | dependencies = [
437 | "cc",
438 | "libc",
439 | "pkg-config",
440 | ]
441 |
442 | [[package]]
443 | name = "getrandom"
444 | version = "0.2.15"
445 | source = "registry+https://github.com/rust-lang/crates.io-index"
446 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
447 | dependencies = [
448 | "cfg-if",
449 | "libc",
450 | "wasi",
451 | ]
452 |
453 | [[package]]
454 | name = "gif"
455 | version = "0.12.0"
456 | source = "registry+https://github.com/rust-lang/crates.io-index"
457 | checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045"
458 | dependencies = [
459 | "color_quant",
460 | "weezl",
461 | ]
462 |
463 | [[package]]
464 | name = "gimli"
465 | version = "0.31.1"
466 | source = "registry+https://github.com/rust-lang/crates.io-index"
467 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
468 |
469 | [[package]]
470 | name = "heck"
471 | version = "0.5.0"
472 | source = "registry+https://github.com/rust-lang/crates.io-index"
473 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
474 |
475 | [[package]]
476 | name = "iana-time-zone"
477 | version = "0.1.61"
478 | source = "registry+https://github.com/rust-lang/crates.io-index"
479 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
480 | dependencies = [
481 | "android_system_properties",
482 | "core-foundation-sys",
483 | "iana-time-zone-haiku",
484 | "js-sys",
485 | "wasm-bindgen",
486 | "windows-core 0.52.0",
487 | ]
488 |
489 | [[package]]
490 | name = "iana-time-zone-haiku"
491 | version = "0.1.2"
492 | source = "registry+https://github.com/rust-lang/crates.io-index"
493 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
494 | dependencies = [
495 | "cc",
496 | ]
497 |
498 | [[package]]
499 | name = "image"
500 | version = "0.24.9"
501 | source = "registry+https://github.com/rust-lang/crates.io-index"
502 | checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d"
503 | dependencies = [
504 | "bytemuck",
505 | "byteorder",
506 | "color_quant",
507 | "jpeg-decoder",
508 | "num-traits",
509 | "png",
510 | ]
511 |
512 | [[package]]
513 | name = "indicatif"
514 | version = "0.17.10"
515 | source = "registry+https://github.com/rust-lang/crates.io-index"
516 | checksum = "aeffd0d77fc9a0bc8ec71b6364089028b48283b534f874178753723ad9241f42"
517 | dependencies = [
518 | "console",
519 | "number_prefix",
520 | "portable-atomic",
521 | "unicode-width",
522 | "web-time",
523 | ]
524 |
525 | [[package]]
526 | name = "itoa"
527 | version = "1.0.14"
528 | source = "registry+https://github.com/rust-lang/crates.io-index"
529 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
530 |
531 | [[package]]
532 | name = "jpeg-decoder"
533 | version = "0.3.1"
534 | source = "registry+https://github.com/rust-lang/crates.io-index"
535 | checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
536 |
537 | [[package]]
538 | name = "js-sys"
539 | version = "0.3.77"
540 | source = "registry+https://github.com/rust-lang/crates.io-index"
541 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
542 | dependencies = [
543 | "once_cell",
544 | "wasm-bindgen",
545 | ]
546 |
547 | [[package]]
548 | name = "lazy_static"
549 | version = "1.5.0"
550 | source = "registry+https://github.com/rust-lang/crates.io-index"
551 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
552 |
553 | [[package]]
554 | name = "libc"
555 | version = "0.2.169"
556 | source = "registry+https://github.com/rust-lang/crates.io-index"
557 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
558 |
559 | [[package]]
560 | name = "libloading"
561 | version = "0.8.6"
562 | source = "registry+https://github.com/rust-lang/crates.io-index"
563 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
564 | dependencies = [
565 | "cfg-if",
566 | "windows-targets 0.52.6",
567 | ]
568 |
569 | [[package]]
570 | name = "libredox"
571 | version = "0.1.3"
572 | source = "registry+https://github.com/rust-lang/crates.io-index"
573 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
574 | dependencies = [
575 | "bitflags 2.8.0",
576 | "libc",
577 | ]
578 |
579 | [[package]]
580 | name = "linux-raw-sys"
581 | version = "0.4.15"
582 | source = "registry+https://github.com/rust-lang/crates.io-index"
583 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
584 |
585 | [[package]]
586 | name = "lock_api"
587 | version = "0.4.12"
588 | source = "registry+https://github.com/rust-lang/crates.io-index"
589 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
590 | dependencies = [
591 | "autocfg",
592 | "scopeguard",
593 | ]
594 |
595 | [[package]]
596 | name = "log"
597 | version = "0.4.25"
598 | source = "registry+https://github.com/rust-lang/crates.io-index"
599 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
600 |
601 | [[package]]
602 | name = "memchr"
603 | version = "2.7.4"
604 | source = "registry+https://github.com/rust-lang/crates.io-index"
605 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
606 |
607 | [[package]]
608 | name = "miniz_oxide"
609 | version = "0.8.3"
610 | source = "registry+https://github.com/rust-lang/crates.io-index"
611 | checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924"
612 | dependencies = [
613 | "adler2",
614 | "simd-adler32",
615 | ]
616 |
617 | [[package]]
618 | name = "mio"
619 | version = "1.0.3"
620 | source = "registry+https://github.com/rust-lang/crates.io-index"
621 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
622 | dependencies = [
623 | "libc",
624 | "wasi",
625 | "windows-sys 0.52.0",
626 | ]
627 |
628 | [[package]]
629 | name = "ntapi"
630 | version = "0.4.1"
631 | source = "registry+https://github.com/rust-lang/crates.io-index"
632 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4"
633 | dependencies = [
634 | "winapi",
635 | ]
636 |
637 | [[package]]
638 | name = "num-traits"
639 | version = "0.2.19"
640 | source = "registry+https://github.com/rust-lang/crates.io-index"
641 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
642 | dependencies = [
643 | "autocfg",
644 | ]
645 |
646 | [[package]]
647 | name = "number_prefix"
648 | version = "0.4.0"
649 | source = "registry+https://github.com/rust-lang/crates.io-index"
650 | checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
651 |
652 | [[package]]
653 | name = "object"
654 | version = "0.36.7"
655 | source = "registry+https://github.com/rust-lang/crates.io-index"
656 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
657 | dependencies = [
658 | "memchr",
659 | ]
660 |
661 | [[package]]
662 | name = "once_cell"
663 | version = "1.20.2"
664 | source = "registry+https://github.com/rust-lang/crates.io-index"
665 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
666 |
667 | [[package]]
668 | name = "option-ext"
669 | version = "0.2.0"
670 | source = "registry+https://github.com/rust-lang/crates.io-index"
671 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
672 |
673 | [[package]]
674 | name = "os_info"
675 | version = "3.9.2"
676 | source = "registry+https://github.com/rust-lang/crates.io-index"
677 | checksum = "6e6520c8cc998c5741ee68ec1dc369fc47e5f0ea5320018ecf2a1ccd6328f48b"
678 | dependencies = [
679 | "log",
680 | "serde",
681 | "windows-sys 0.52.0",
682 | ]
683 |
684 | [[package]]
685 | name = "parking_lot"
686 | version = "0.12.3"
687 | source = "registry+https://github.com/rust-lang/crates.io-index"
688 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
689 | dependencies = [
690 | "lock_api",
691 | "parking_lot_core",
692 | ]
693 |
694 | [[package]]
695 | name = "parking_lot_core"
696 | version = "0.9.10"
697 | source = "registry+https://github.com/rust-lang/crates.io-index"
698 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
699 | dependencies = [
700 | "cfg-if",
701 | "libc",
702 | "redox_syscall",
703 | "smallvec",
704 | "windows-targets 0.52.6",
705 | ]
706 |
707 | [[package]]
708 | name = "pathfinder_geometry"
709 | version = "0.5.1"
710 | source = "registry+https://github.com/rust-lang/crates.io-index"
711 | checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3"
712 | dependencies = [
713 | "log",
714 | "pathfinder_simd",
715 | ]
716 |
717 | [[package]]
718 | name = "pathfinder_simd"
719 | version = "0.5.4"
720 | source = "registry+https://github.com/rust-lang/crates.io-index"
721 | checksum = "5cf07ef4804cfa9aea3b04a7bbdd5a40031dbb6b4f2cbaf2b011666c80c5b4f2"
722 | dependencies = [
723 | "rustc_version",
724 | ]
725 |
726 | [[package]]
727 | name = "pin-project-lite"
728 | version = "0.2.16"
729 | source = "registry+https://github.com/rust-lang/crates.io-index"
730 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
731 |
732 | [[package]]
733 | name = "pkg-config"
734 | version = "0.3.31"
735 | source = "registry+https://github.com/rust-lang/crates.io-index"
736 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
737 |
738 | [[package]]
739 | name = "plotters"
740 | version = "0.3.7"
741 | source = "registry+https://github.com/rust-lang/crates.io-index"
742 | checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747"
743 | dependencies = [
744 | "chrono",
745 | "font-kit",
746 | "image",
747 | "lazy_static",
748 | "num-traits",
749 | "pathfinder_geometry",
750 | "plotters-backend",
751 | "plotters-bitmap",
752 | "plotters-svg",
753 | "ttf-parser",
754 | "wasm-bindgen",
755 | "web-sys",
756 | ]
757 |
758 | [[package]]
759 | name = "plotters-backend"
760 | version = "0.3.7"
761 | source = "registry+https://github.com/rust-lang/crates.io-index"
762 | checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"
763 |
764 | [[package]]
765 | name = "plotters-bitmap"
766 | version = "0.3.7"
767 | source = "registry+https://github.com/rust-lang/crates.io-index"
768 | checksum = "72ce181e3f6bf82d6c1dc569103ca7b1bd964c60ba03d7e6cdfbb3e3eb7f7405"
769 | dependencies = [
770 | "gif",
771 | "image",
772 | "plotters-backend",
773 | ]
774 |
775 | [[package]]
776 | name = "plotters-svg"
777 | version = "0.3.7"
778 | source = "registry+https://github.com/rust-lang/crates.io-index"
779 | checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"
780 | dependencies = [
781 | "plotters-backend",
782 | ]
783 |
784 | [[package]]
785 | name = "png"
786 | version = "0.17.16"
787 | source = "registry+https://github.com/rust-lang/crates.io-index"
788 | checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526"
789 | dependencies = [
790 | "bitflags 1.3.2",
791 | "crc32fast",
792 | "fdeflate",
793 | "flate2",
794 | "miniz_oxide",
795 | ]
796 |
797 | [[package]]
798 | name = "portable-atomic"
799 | version = "1.10.0"
800 | source = "registry+https://github.com/rust-lang/crates.io-index"
801 | checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6"
802 |
803 | [[package]]
804 | name = "proc-macro2"
805 | version = "1.0.93"
806 | source = "registry+https://github.com/rust-lang/crates.io-index"
807 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
808 | dependencies = [
809 | "unicode-ident",
810 | ]
811 |
812 | [[package]]
813 | name = "quote"
814 | version = "1.0.38"
815 | source = "registry+https://github.com/rust-lang/crates.io-index"
816 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
817 | dependencies = [
818 | "proc-macro2",
819 | ]
820 |
821 | [[package]]
822 | name = "raw-cpuid"
823 | version = "11.3.0"
824 | source = "registry+https://github.com/rust-lang/crates.io-index"
825 | checksum = "c6928fa44c097620b706542d428957635951bade7143269085389d42c8a4927e"
826 | dependencies = [
827 | "bitflags 2.8.0",
828 | ]
829 |
830 | [[package]]
831 | name = "rayon"
832 | version = "1.10.0"
833 | source = "registry+https://github.com/rust-lang/crates.io-index"
834 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
835 | dependencies = [
836 | "either",
837 | "rayon-core",
838 | ]
839 |
840 | [[package]]
841 | name = "rayon-core"
842 | version = "1.12.1"
843 | source = "registry+https://github.com/rust-lang/crates.io-index"
844 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
845 | dependencies = [
846 | "crossbeam-deque",
847 | "crossbeam-utils",
848 | ]
849 |
850 | [[package]]
851 | name = "redox_syscall"
852 | version = "0.5.8"
853 | source = "registry+https://github.com/rust-lang/crates.io-index"
854 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
855 | dependencies = [
856 | "bitflags 2.8.0",
857 | ]
858 |
859 | [[package]]
860 | name = "redox_users"
861 | version = "0.4.6"
862 | source = "registry+https://github.com/rust-lang/crates.io-index"
863 | checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
864 | dependencies = [
865 | "getrandom",
866 | "libredox",
867 | "thiserror",
868 | ]
869 |
870 | [[package]]
871 | name = "rustc-demangle"
872 | version = "0.1.24"
873 | source = "registry+https://github.com/rust-lang/crates.io-index"
874 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
875 |
876 | [[package]]
877 | name = "rustc_version"
878 | version = "0.4.1"
879 | source = "registry+https://github.com/rust-lang/crates.io-index"
880 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
881 | dependencies = [
882 | "semver",
883 | ]
884 |
885 | [[package]]
886 | name = "rustix"
887 | version = "0.38.44"
888 | source = "registry+https://github.com/rust-lang/crates.io-index"
889 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
890 | dependencies = [
891 | "bitflags 2.8.0",
892 | "errno",
893 | "libc",
894 | "linux-raw-sys",
895 | "windows-sys 0.59.0",
896 | ]
897 |
898 | [[package]]
899 | name = "rustversion"
900 | version = "1.0.19"
901 | source = "registry+https://github.com/rust-lang/crates.io-index"
902 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
903 |
904 | [[package]]
905 | name = "ryu"
906 | version = "1.0.19"
907 | source = "registry+https://github.com/rust-lang/crates.io-index"
908 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
909 |
910 | [[package]]
911 | name = "same-file"
912 | version = "1.0.6"
913 | source = "registry+https://github.com/rust-lang/crates.io-index"
914 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
915 | dependencies = [
916 | "winapi-util",
917 | ]
918 |
919 | [[package]]
920 | name = "scopeguard"
921 | version = "1.2.0"
922 | source = "registry+https://github.com/rust-lang/crates.io-index"
923 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
924 |
925 | [[package]]
926 | name = "semver"
927 | version = "1.0.25"
928 | source = "registry+https://github.com/rust-lang/crates.io-index"
929 | checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03"
930 |
931 | [[package]]
932 | name = "serde"
933 | version = "1.0.217"
934 | source = "registry+https://github.com/rust-lang/crates.io-index"
935 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
936 | dependencies = [
937 | "serde_derive",
938 | ]
939 |
940 | [[package]]
941 | name = "serde_derive"
942 | version = "1.0.217"
943 | source = "registry+https://github.com/rust-lang/crates.io-index"
944 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
945 | dependencies = [
946 | "proc-macro2",
947 | "quote",
948 | "syn",
949 | ]
950 |
951 | [[package]]
952 | name = "serde_json"
953 | version = "1.0.137"
954 | source = "registry+https://github.com/rust-lang/crates.io-index"
955 | checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b"
956 | dependencies = [
957 | "itoa",
958 | "memchr",
959 | "ryu",
960 | "serde",
961 | ]
962 |
963 | [[package]]
964 | name = "shlex"
965 | version = "1.3.0"
966 | source = "registry+https://github.com/rust-lang/crates.io-index"
967 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
968 |
969 | [[package]]
970 | name = "signal-hook-registry"
971 | version = "1.4.2"
972 | source = "registry+https://github.com/rust-lang/crates.io-index"
973 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
974 | dependencies = [
975 | "libc",
976 | ]
977 |
978 | [[package]]
979 | name = "simd-adler32"
980 | version = "0.3.7"
981 | source = "registry+https://github.com/rust-lang/crates.io-index"
982 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
983 |
984 | [[package]]
985 | name = "smallvec"
986 | version = "1.13.2"
987 | source = "registry+https://github.com/rust-lang/crates.io-index"
988 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
989 |
990 | [[package]]
991 | name = "socket2"
992 | version = "0.5.8"
993 | source = "registry+https://github.com/rust-lang/crates.io-index"
994 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
995 | dependencies = [
996 | "libc",
997 | "windows-sys 0.52.0",
998 | ]
999 |
1000 | [[package]]
1001 | name = "strum"
1002 | version = "0.26.3"
1003 | source = "registry+https://github.com/rust-lang/crates.io-index"
1004 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
1005 |
1006 | [[package]]
1007 | name = "strum_macros"
1008 | version = "0.26.4"
1009 | source = "registry+https://github.com/rust-lang/crates.io-index"
1010 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
1011 | dependencies = [
1012 | "heck",
1013 | "proc-macro2",
1014 | "quote",
1015 | "rustversion",
1016 | "syn",
1017 | ]
1018 |
1019 | [[package]]
1020 | name = "syn"
1021 | version = "2.0.96"
1022 | source = "registry+https://github.com/rust-lang/crates.io-index"
1023 | checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
1024 | dependencies = [
1025 | "proc-macro2",
1026 | "quote",
1027 | "unicode-ident",
1028 | ]
1029 |
1030 | [[package]]
1031 | name = "sysinfo"
1032 | version = "0.33.1"
1033 | source = "registry+https://github.com/rust-lang/crates.io-index"
1034 | checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01"
1035 | dependencies = [
1036 | "core-foundation-sys",
1037 | "libc",
1038 | "memchr",
1039 | "ntapi",
1040 | "rayon",
1041 | "windows 0.57.0",
1042 | ]
1043 |
1044 | [[package]]
1045 | name = "thiserror"
1046 | version = "1.0.69"
1047 | source = "registry+https://github.com/rust-lang/crates.io-index"
1048 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
1049 | dependencies = [
1050 | "thiserror-impl",
1051 | ]
1052 |
1053 | [[package]]
1054 | name = "thiserror-impl"
1055 | version = "1.0.69"
1056 | source = "registry+https://github.com/rust-lang/crates.io-index"
1057 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
1058 | dependencies = [
1059 | "proc-macro2",
1060 | "quote",
1061 | "syn",
1062 | ]
1063 |
1064 | [[package]]
1065 | name = "timer_res_benchmark"
1066 | version = "0.3.2"
1067 | dependencies = [
1068 | "colored",
1069 | "comfy-table",
1070 | "csv",
1071 | "indicatif",
1072 | "lazy_static",
1073 | "os_info",
1074 | "plotters",
1075 | "raw-cpuid",
1076 | "serde",
1077 | "serde_json",
1078 | "sysinfo",
1079 | "tokio",
1080 | "windows 0.59.0",
1081 | "windows-sys 0.59.0",
1082 | ]
1083 |
1084 | [[package]]
1085 | name = "tokio"
1086 | version = "1.43.0"
1087 | source = "registry+https://github.com/rust-lang/crates.io-index"
1088 | checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e"
1089 | dependencies = [
1090 | "backtrace",
1091 | "bytes",
1092 | "libc",
1093 | "mio",
1094 | "parking_lot",
1095 | "pin-project-lite",
1096 | "signal-hook-registry",
1097 | "socket2",
1098 | "tokio-macros",
1099 | "windows-sys 0.52.0",
1100 | ]
1101 |
1102 | [[package]]
1103 | name = "tokio-macros"
1104 | version = "2.5.0"
1105 | source = "registry+https://github.com/rust-lang/crates.io-index"
1106 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
1107 | dependencies = [
1108 | "proc-macro2",
1109 | "quote",
1110 | "syn",
1111 | ]
1112 |
1113 | [[package]]
1114 | name = "ttf-parser"
1115 | version = "0.20.0"
1116 | source = "registry+https://github.com/rust-lang/crates.io-index"
1117 | checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4"
1118 |
1119 | [[package]]
1120 | name = "unicode-ident"
1121 | version = "1.0.16"
1122 | source = "registry+https://github.com/rust-lang/crates.io-index"
1123 | checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034"
1124 |
1125 | [[package]]
1126 | name = "unicode-width"
1127 | version = "0.2.0"
1128 | source = "registry+https://github.com/rust-lang/crates.io-index"
1129 | checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
1130 |
1131 | [[package]]
1132 | name = "walkdir"
1133 | version = "2.5.0"
1134 | source = "registry+https://github.com/rust-lang/crates.io-index"
1135 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
1136 | dependencies = [
1137 | "same-file",
1138 | "winapi-util",
1139 | ]
1140 |
1141 | [[package]]
1142 | name = "wasi"
1143 | version = "0.11.0+wasi-snapshot-preview1"
1144 | source = "registry+https://github.com/rust-lang/crates.io-index"
1145 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
1146 |
1147 | [[package]]
1148 | name = "wasm-bindgen"
1149 | version = "0.2.100"
1150 | source = "registry+https://github.com/rust-lang/crates.io-index"
1151 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
1152 | dependencies = [
1153 | "cfg-if",
1154 | "once_cell",
1155 | "rustversion",
1156 | "wasm-bindgen-macro",
1157 | ]
1158 |
1159 | [[package]]
1160 | name = "wasm-bindgen-backend"
1161 | version = "0.2.100"
1162 | source = "registry+https://github.com/rust-lang/crates.io-index"
1163 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
1164 | dependencies = [
1165 | "bumpalo",
1166 | "log",
1167 | "proc-macro2",
1168 | "quote",
1169 | "syn",
1170 | "wasm-bindgen-shared",
1171 | ]
1172 |
1173 | [[package]]
1174 | name = "wasm-bindgen-macro"
1175 | version = "0.2.100"
1176 | source = "registry+https://github.com/rust-lang/crates.io-index"
1177 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
1178 | dependencies = [
1179 | "quote",
1180 | "wasm-bindgen-macro-support",
1181 | ]
1182 |
1183 | [[package]]
1184 | name = "wasm-bindgen-macro-support"
1185 | version = "0.2.100"
1186 | source = "registry+https://github.com/rust-lang/crates.io-index"
1187 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
1188 | dependencies = [
1189 | "proc-macro2",
1190 | "quote",
1191 | "syn",
1192 | "wasm-bindgen-backend",
1193 | "wasm-bindgen-shared",
1194 | ]
1195 |
1196 | [[package]]
1197 | name = "wasm-bindgen-shared"
1198 | version = "0.2.100"
1199 | source = "registry+https://github.com/rust-lang/crates.io-index"
1200 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
1201 | dependencies = [
1202 | "unicode-ident",
1203 | ]
1204 |
1205 | [[package]]
1206 | name = "web-sys"
1207 | version = "0.3.77"
1208 | source = "registry+https://github.com/rust-lang/crates.io-index"
1209 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
1210 | dependencies = [
1211 | "js-sys",
1212 | "wasm-bindgen",
1213 | ]
1214 |
1215 | [[package]]
1216 | name = "web-time"
1217 | version = "1.1.0"
1218 | source = "registry+https://github.com/rust-lang/crates.io-index"
1219 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
1220 | dependencies = [
1221 | "js-sys",
1222 | "wasm-bindgen",
1223 | ]
1224 |
1225 | [[package]]
1226 | name = "weezl"
1227 | version = "0.1.8"
1228 | source = "registry+https://github.com/rust-lang/crates.io-index"
1229 | checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
1230 |
1231 | [[package]]
1232 | name = "winapi"
1233 | version = "0.3.9"
1234 | source = "registry+https://github.com/rust-lang/crates.io-index"
1235 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
1236 | dependencies = [
1237 | "winapi-i686-pc-windows-gnu",
1238 | "winapi-x86_64-pc-windows-gnu",
1239 | ]
1240 |
1241 | [[package]]
1242 | name = "winapi-i686-pc-windows-gnu"
1243 | version = "0.4.0"
1244 | source = "registry+https://github.com/rust-lang/crates.io-index"
1245 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1246 |
1247 | [[package]]
1248 | name = "winapi-util"
1249 | version = "0.1.9"
1250 | source = "registry+https://github.com/rust-lang/crates.io-index"
1251 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
1252 | dependencies = [
1253 | "windows-sys 0.59.0",
1254 | ]
1255 |
1256 | [[package]]
1257 | name = "winapi-x86_64-pc-windows-gnu"
1258 | version = "0.4.0"
1259 | source = "registry+https://github.com/rust-lang/crates.io-index"
1260 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1261 |
1262 | [[package]]
1263 | name = "windows"
1264 | version = "0.57.0"
1265 | source = "registry+https://github.com/rust-lang/crates.io-index"
1266 | checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
1267 | dependencies = [
1268 | "windows-core 0.57.0",
1269 | "windows-targets 0.52.6",
1270 | ]
1271 |
1272 | [[package]]
1273 | name = "windows"
1274 | version = "0.59.0"
1275 | source = "registry+https://github.com/rust-lang/crates.io-index"
1276 | checksum = "7f919aee0a93304be7f62e8e5027811bbba96bcb1de84d6618be56e43f8a32a1"
1277 | dependencies = [
1278 | "windows-core 0.59.0",
1279 | "windows-targets 0.53.0",
1280 | ]
1281 |
1282 | [[package]]
1283 | name = "windows-core"
1284 | version = "0.52.0"
1285 | source = "registry+https://github.com/rust-lang/crates.io-index"
1286 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
1287 | dependencies = [
1288 | "windows-targets 0.52.6",
1289 | ]
1290 |
1291 | [[package]]
1292 | name = "windows-core"
1293 | version = "0.57.0"
1294 | source = "registry+https://github.com/rust-lang/crates.io-index"
1295 | checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
1296 | dependencies = [
1297 | "windows-implement 0.57.0",
1298 | "windows-interface 0.57.0",
1299 | "windows-result 0.1.2",
1300 | "windows-targets 0.52.6",
1301 | ]
1302 |
1303 | [[package]]
1304 | name = "windows-core"
1305 | version = "0.59.0"
1306 | source = "registry+https://github.com/rust-lang/crates.io-index"
1307 | checksum = "810ce18ed2112484b0d4e15d022e5f598113e220c53e373fb31e67e21670c1ce"
1308 | dependencies = [
1309 | "windows-implement 0.59.0",
1310 | "windows-interface 0.59.0",
1311 | "windows-result 0.3.0",
1312 | "windows-strings",
1313 | "windows-targets 0.53.0",
1314 | ]
1315 |
1316 | [[package]]
1317 | name = "windows-implement"
1318 | version = "0.57.0"
1319 | source = "registry+https://github.com/rust-lang/crates.io-index"
1320 | checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
1321 | dependencies = [
1322 | "proc-macro2",
1323 | "quote",
1324 | "syn",
1325 | ]
1326 |
1327 | [[package]]
1328 | name = "windows-implement"
1329 | version = "0.59.0"
1330 | source = "registry+https://github.com/rust-lang/crates.io-index"
1331 | checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1"
1332 | dependencies = [
1333 | "proc-macro2",
1334 | "quote",
1335 | "syn",
1336 | ]
1337 |
1338 | [[package]]
1339 | name = "windows-interface"
1340 | version = "0.57.0"
1341 | source = "registry+https://github.com/rust-lang/crates.io-index"
1342 | checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
1343 | dependencies = [
1344 | "proc-macro2",
1345 | "quote",
1346 | "syn",
1347 | ]
1348 |
1349 | [[package]]
1350 | name = "windows-interface"
1351 | version = "0.59.0"
1352 | source = "registry+https://github.com/rust-lang/crates.io-index"
1353 | checksum = "cb26fd936d991781ea39e87c3a27285081e3c0da5ca0fcbc02d368cc6f52ff01"
1354 | dependencies = [
1355 | "proc-macro2",
1356 | "quote",
1357 | "syn",
1358 | ]
1359 |
1360 | [[package]]
1361 | name = "windows-result"
1362 | version = "0.1.2"
1363 | source = "registry+https://github.com/rust-lang/crates.io-index"
1364 | checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8"
1365 | dependencies = [
1366 | "windows-targets 0.52.6",
1367 | ]
1368 |
1369 | [[package]]
1370 | name = "windows-result"
1371 | version = "0.3.0"
1372 | source = "registry+https://github.com/rust-lang/crates.io-index"
1373 | checksum = "d08106ce80268c4067c0571ca55a9b4e9516518eaa1a1fe9b37ca403ae1d1a34"
1374 | dependencies = [
1375 | "windows-targets 0.53.0",
1376 | ]
1377 |
1378 | [[package]]
1379 | name = "windows-strings"
1380 | version = "0.3.0"
1381 | source = "registry+https://github.com/rust-lang/crates.io-index"
1382 | checksum = "b888f919960b42ea4e11c2f408fadb55f78a9f236d5eef084103c8ce52893491"
1383 | dependencies = [
1384 | "windows-targets 0.53.0",
1385 | ]
1386 |
1387 | [[package]]
1388 | name = "windows-sys"
1389 | version = "0.48.0"
1390 | source = "registry+https://github.com/rust-lang/crates.io-index"
1391 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
1392 | dependencies = [
1393 | "windows-targets 0.48.5",
1394 | ]
1395 |
1396 | [[package]]
1397 | name = "windows-sys"
1398 | version = "0.52.0"
1399 | source = "registry+https://github.com/rust-lang/crates.io-index"
1400 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
1401 | dependencies = [
1402 | "windows-targets 0.52.6",
1403 | ]
1404 |
1405 | [[package]]
1406 | name = "windows-sys"
1407 | version = "0.59.0"
1408 | source = "registry+https://github.com/rust-lang/crates.io-index"
1409 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
1410 | dependencies = [
1411 | "windows-targets 0.52.6",
1412 | ]
1413 |
1414 | [[package]]
1415 | name = "windows-targets"
1416 | version = "0.48.5"
1417 | source = "registry+https://github.com/rust-lang/crates.io-index"
1418 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
1419 | dependencies = [
1420 | "windows_aarch64_gnullvm 0.48.5",
1421 | "windows_aarch64_msvc 0.48.5",
1422 | "windows_i686_gnu 0.48.5",
1423 | "windows_i686_msvc 0.48.5",
1424 | "windows_x86_64_gnu 0.48.5",
1425 | "windows_x86_64_gnullvm 0.48.5",
1426 | "windows_x86_64_msvc 0.48.5",
1427 | ]
1428 |
1429 | [[package]]
1430 | name = "windows-targets"
1431 | version = "0.52.6"
1432 | source = "registry+https://github.com/rust-lang/crates.io-index"
1433 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
1434 | dependencies = [
1435 | "windows_aarch64_gnullvm 0.52.6",
1436 | "windows_aarch64_msvc 0.52.6",
1437 | "windows_i686_gnu 0.52.6",
1438 | "windows_i686_gnullvm 0.52.6",
1439 | "windows_i686_msvc 0.52.6",
1440 | "windows_x86_64_gnu 0.52.6",
1441 | "windows_x86_64_gnullvm 0.52.6",
1442 | "windows_x86_64_msvc 0.52.6",
1443 | ]
1444 |
1445 | [[package]]
1446 | name = "windows-targets"
1447 | version = "0.53.0"
1448 | source = "registry+https://github.com/rust-lang/crates.io-index"
1449 | checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b"
1450 | dependencies = [
1451 | "windows_aarch64_gnullvm 0.53.0",
1452 | "windows_aarch64_msvc 0.53.0",
1453 | "windows_i686_gnu 0.53.0",
1454 | "windows_i686_gnullvm 0.53.0",
1455 | "windows_i686_msvc 0.53.0",
1456 | "windows_x86_64_gnu 0.53.0",
1457 | "windows_x86_64_gnullvm 0.53.0",
1458 | "windows_x86_64_msvc 0.53.0",
1459 | ]
1460 |
1461 | [[package]]
1462 | name = "windows_aarch64_gnullvm"
1463 | version = "0.48.5"
1464 | source = "registry+https://github.com/rust-lang/crates.io-index"
1465 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
1466 |
1467 | [[package]]
1468 | name = "windows_aarch64_gnullvm"
1469 | version = "0.52.6"
1470 | source = "registry+https://github.com/rust-lang/crates.io-index"
1471 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
1472 |
1473 | [[package]]
1474 | name = "windows_aarch64_gnullvm"
1475 | version = "0.53.0"
1476 | source = "registry+https://github.com/rust-lang/crates.io-index"
1477 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
1478 |
1479 | [[package]]
1480 | name = "windows_aarch64_msvc"
1481 | version = "0.48.5"
1482 | source = "registry+https://github.com/rust-lang/crates.io-index"
1483 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
1484 |
1485 | [[package]]
1486 | name = "windows_aarch64_msvc"
1487 | version = "0.52.6"
1488 | source = "registry+https://github.com/rust-lang/crates.io-index"
1489 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
1490 |
1491 | [[package]]
1492 | name = "windows_aarch64_msvc"
1493 | version = "0.53.0"
1494 | source = "registry+https://github.com/rust-lang/crates.io-index"
1495 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
1496 |
1497 | [[package]]
1498 | name = "windows_i686_gnu"
1499 | version = "0.48.5"
1500 | source = "registry+https://github.com/rust-lang/crates.io-index"
1501 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
1502 |
1503 | [[package]]
1504 | name = "windows_i686_gnu"
1505 | version = "0.52.6"
1506 | source = "registry+https://github.com/rust-lang/crates.io-index"
1507 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
1508 |
1509 | [[package]]
1510 | name = "windows_i686_gnu"
1511 | version = "0.53.0"
1512 | source = "registry+https://github.com/rust-lang/crates.io-index"
1513 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
1514 |
1515 | [[package]]
1516 | name = "windows_i686_gnullvm"
1517 | version = "0.52.6"
1518 | source = "registry+https://github.com/rust-lang/crates.io-index"
1519 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
1520 |
1521 | [[package]]
1522 | name = "windows_i686_gnullvm"
1523 | version = "0.53.0"
1524 | source = "registry+https://github.com/rust-lang/crates.io-index"
1525 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
1526 |
1527 | [[package]]
1528 | name = "windows_i686_msvc"
1529 | version = "0.48.5"
1530 | source = "registry+https://github.com/rust-lang/crates.io-index"
1531 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
1532 |
1533 | [[package]]
1534 | name = "windows_i686_msvc"
1535 | version = "0.52.6"
1536 | source = "registry+https://github.com/rust-lang/crates.io-index"
1537 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
1538 |
1539 | [[package]]
1540 | name = "windows_i686_msvc"
1541 | version = "0.53.0"
1542 | source = "registry+https://github.com/rust-lang/crates.io-index"
1543 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
1544 |
1545 | [[package]]
1546 | name = "windows_x86_64_gnu"
1547 | version = "0.48.5"
1548 | source = "registry+https://github.com/rust-lang/crates.io-index"
1549 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
1550 |
1551 | [[package]]
1552 | name = "windows_x86_64_gnu"
1553 | version = "0.52.6"
1554 | source = "registry+https://github.com/rust-lang/crates.io-index"
1555 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
1556 |
1557 | [[package]]
1558 | name = "windows_x86_64_gnu"
1559 | version = "0.53.0"
1560 | source = "registry+https://github.com/rust-lang/crates.io-index"
1561 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
1562 |
1563 | [[package]]
1564 | name = "windows_x86_64_gnullvm"
1565 | version = "0.48.5"
1566 | source = "registry+https://github.com/rust-lang/crates.io-index"
1567 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
1568 |
1569 | [[package]]
1570 | name = "windows_x86_64_gnullvm"
1571 | version = "0.52.6"
1572 | source = "registry+https://github.com/rust-lang/crates.io-index"
1573 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
1574 |
1575 | [[package]]
1576 | name = "windows_x86_64_gnullvm"
1577 | version = "0.53.0"
1578 | source = "registry+https://github.com/rust-lang/crates.io-index"
1579 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
1580 |
1581 | [[package]]
1582 | name = "windows_x86_64_msvc"
1583 | version = "0.48.5"
1584 | source = "registry+https://github.com/rust-lang/crates.io-index"
1585 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
1586 |
1587 | [[package]]
1588 | name = "windows_x86_64_msvc"
1589 | version = "0.52.6"
1590 | source = "registry+https://github.com/rust-lang/crates.io-index"
1591 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
1592 |
1593 | [[package]]
1594 | name = "windows_x86_64_msvc"
1595 | version = "0.53.0"
1596 | source = "registry+https://github.com/rust-lang/crates.io-index"
1597 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
1598 |
1599 | [[package]]
1600 | name = "wio"
1601 | version = "0.2.2"
1602 | source = "registry+https://github.com/rust-lang/crates.io-index"
1603 | checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5"
1604 | dependencies = [
1605 | "winapi",
1606 | ]
1607 |
1608 | [[package]]
1609 | name = "yeslogic-fontconfig-sys"
1610 | version = "6.0.0"
1611 | source = "registry+https://github.com/rust-lang/crates.io-index"
1612 | checksum = "503a066b4c037c440169d995b869046827dbc71263f6e8f3be6d77d4f3229dbd"
1613 | dependencies = [
1614 | "dlib",
1615 | "once_cell",
1616 | "pkg-config",
1617 | ]
1618 |
--------------------------------------------------------------------------------