From d744b604c7eee289907787fb5d9b0979acc19055 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Wed, 30 Oct 2024 17:24:36 +0300 Subject: [PATCH 01/73] WIP on value id parents --- compiler/noirc_evaluator/Cargo.toml | 1 + .../check_for_underconstrained_values.rs | 170 +++++++++++++++++- 2 files changed, 170 insertions(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/Cargo.toml b/compiler/noirc_evaluator/Cargo.toml index 1db6af2ae85..bd2be436276 100644 --- a/compiler/noirc_evaluator/Cargo.toml +++ b/compiler/noirc_evaluator/Cargo.toml @@ -25,6 +25,7 @@ serde.workspace = true serde_json.workspace = true serde_with = "3.2.0" tracing.workspace = true +tracing-test = "0.2.5" chrono = "0.4.37" rayon.workspace = true cfg-if.workspace = true diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index aa5f4c8df95..0a6213d1d1c 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -10,6 +10,7 @@ use crate::ssa::ir::value::{Value, ValueId}; use crate::ssa::ssa_gen::Ssa; use im::HashMap; use rayon::prelude::*; +use tracing::{debug, trace}; use std::collections::{BTreeMap, HashSet}; impl Ssa { @@ -32,6 +33,25 @@ impl Ssa { }) .collect() } + + /// Find brillig calls left unconstrained with later manual asserts + pub(crate) fn detect_unchecked_brillig_calls(&mut self) -> Vec { + let functions_id = self.functions.values().map(|f| f.id().to_usize()).collect::>(); + functions_id + .iter() + .par_bridge() + .flat_map(|fid| { + let function_to_process = &self.functions[&FunctionId::new(*fid)]; + match function_to_process.runtime() { + RuntimeType::Acir { .. } => detect_unchecked_brillig_calls_within_function( + function_to_process, + &self.functions, + ), + RuntimeType::Brillig => Vec::new(), + } + }) + .collect() + } } /// Detect independent subgraphs (not connected to function inputs or outputs) and return a vector of bug reports if some are found @@ -63,6 +83,111 @@ fn check_for_underconstrained_values_within_function( } warnings } + +/// Detect brillig calls left unconstrained with later manual asserts +/// and return a vector of bug reports if some are found +fn detect_unchecked_brillig_calls_within_function( + function: &Function, + all_functions: &BTreeMap, +) -> Vec { + let mut warnings: Vec = Vec::new(); + + let mut context = DigraphContext::new(function, all_functions); + + // let all_brillig_generated_values: HashSet = + // context.brillig_return_to_argument.keys().copied().collect(); + + // let connected_sets_indices = + // context.find_sets_connected_to_function_inputs_or_outputs(function); + + // // Go through each disconnected set, find brillig calls that caused it and form warnings + // for set_index in + // HashSet::from_iter(0..(context.value_sets.len())).difference(&connected_sets_indices) + // { + // let current_set = &context.value_sets[*set_index]; + // warnings.append(&mut context.find_disconnecting_brillig_calls_with_results_in_set( + // current_set, + // &all_brillig_generated_values, + // function, + // )); + // } + warnings +} + +#[derive(Default)] +struct DigraphContext { + visited_blocks: HashSet, + block_queue: Vec, + value_parents: HashMap>, + brillig_return_to_argument: HashMap>, + brillig_return_to_instruction_id: HashMap, +} + +impl DigraphContext { + pub(crate) fn new( + function: &Function, + all_functions: &BTreeMap + ) -> Self { + let mut context = Self::default(); + context.build_value_flow_graph(function, all_functions); + context + } + + /// Build flow graph of variable ValueIds + /// + /// Additionally, store information about brillig calls in the context + fn build_value_flow_graph( + &mut self, + function: &Function, + all_functions: &BTreeMap, + ) { + trace!("building value flow graph for function {}", function); + + self.block_queue.push(function.entry_block()); + while let Some(block) = self.block_queue.pop() { + if self.visited_blocks.contains(&block) { + continue; + } + self.visited_blocks.insert(block); + self.build_block_value_flow_graph(block, function, all_functions); + } + } + + fn build_block_value_flow_graph( + &mut self, + block: BasicBlockId, + function: &Function, + all_functions: &BTreeMap, + ) { + trace!("building block value flow graph for block {} of function {}", block, function); + + for instruction in function.dfg[block].instructions() { + let mut arguments = Vec::new(); + + // Collect non-constant instruction arguments + function.dfg[*instruction].for_each_value(|value_id| { + if function.dfg.get_numeric_constant(value_id).is_none() { + arguments.push(function.dfg.resolve(value_id)); + } + }); + + // Assign parent arguments to non-constant results + for value_id in function.dfg.instruction_results(*instruction).iter() { + if function.dfg.get_numeric_constant(*value_id).is_none() { + for argument in &arguments { + // Fill out result value parents + self.value_parents.entry(*value_id).or_insert(vec![]).push(function.dfg.resolve(*argument)); + } + } + } + + trace!("instruction {}: arguments: {:?}", instruction, arguments); + trace!("value parents map: {:?}", self.value_parents); + + } + } +} + #[derive(Default)] struct Context { visited_blocks: HashSet, @@ -81,6 +206,7 @@ impl Context { function: &Function, all_functions: &BTreeMap, ) { + trace!("compute_sets_of_connected_value_ids()"); // Go through each block in the function and create a list of sets of ValueIds connected by instructions self.block_queue.push(function.entry_block()); while let Some(block) = self.block_queue.pop() { @@ -179,6 +305,8 @@ impl Context { instruction_arguments_and_results.insert(function.dfg.resolve(*value_id)); } } + + trace!("value_ids participating in {}: {:?}", instruction, instruction_arguments_and_results); // For most instructions we just connect inputs and outputs match &function.dfg[*instruction] { @@ -352,9 +480,12 @@ impl Context { #[cfg(test)] mod test { use crate::ssa::{ + Ssa, function_builder::FunctionBuilder, - ir::{instruction::BinaryOp, map::Id, types::Type}, + ir::{instruction::BinaryOp, map::Id, types::{Type, NumericType}}, }; + use tracing::{debug, trace}; + use tracing_test::traced_test; #[test] /// Test that a connected function raises no warnings @@ -366,6 +497,7 @@ mod test { // v4 = eq v2, v3 // return v2 // } + debug!("simple connected function"); let main_id = Id::test_new(0); let mut builder = FunctionBuilder::new("main".into(), main_id); let v0 = builder.add_parameter(Type::field()); @@ -428,4 +560,40 @@ mod test { let ssa_level_warnings = ssa.check_for_underconstrained_values(); assert_eq!(ssa_level_warnings.len(), 1); } + + #[test] + #[traced_test] + /// Test where the results of a call to a brillig function are left unchecked with a later assert, + /// by example of the program illustrating issue #5425 (simplified). + fn test_underconstrained_value_detector_5425() { + /* + unconstrained fn maximum_price(options: [u32; 2]) -> u32 { + let mut maximum_option = options[0]; + if (options[1] > options[0]) { + maximum_option = options[1]; + } + maximum_option + } + + fn main(sandwiches: pub [u32; 2], drinks: pub [u32; 2], best_value: u32) { + let most_expensive_sandwich = maximum_price(sandwiches); + let mut sandwich_exists = false; + sandwich_exists |= (sandwiches[0] == most_expensive_sandwich); + sandwich_exists |= (sandwiches[1] == most_expensive_sandwich); + assert(sandwich_exists); + + let most_expensive_drink = maximum_price(drinks); + assert( + best_value + == (most_expensive_sandwich + most_expensive_drink) + ); + } + */ + let mut ssa: Ssa = serde_json::from_str(r#" + {"functions":[[{"index":0},{"entry_block":{"index":0},"name":"main","id":{"index":0},"runtime":{"Acir":"Inline"},"dfg":{"instructions":{"storage":[{"IncrementRc":{"value":{"index":0}}},{"IncrementRc":{"value":{"index":1}}},{"Call":{"func":{"index":3},"arguments":[{"index":0}]}},"Allocate",{"Store":{"address":{"index":6},"value":{"index":5}}},{"Load":{"address":{"index":6}}},{"ArrayGet":{"array":{"index":0},"index":{"index":9}}},{"Binary":{"lhs":{"index":11},"rhs":{"index":4},"operator":"Eq"}},{"Binary":{"lhs":{"index":7},"rhs":{"index":12},"operator":"Or"}},{"Store":{"address":{"index":6},"value":{"index":13}}},{"Load":{"address":{"index":6}}},{"ArrayGet":{"array":{"index":0},"index":{"index":10}}},{"Binary":{"lhs":{"index":16},"rhs":{"index":4},"operator":"Eq"}},{"Binary":{"lhs":{"index":14},"rhs":{"index":17},"operator":"Or"}},{"Store":{"address":{"index":6},"value":{"index":18}}},{"Load":{"address":{"index":6}}},{"Constrain":[{"index":19},{"index":20},null]},{"Call":{"func":{"index":21},"arguments":[{"index":1}]}},{"Binary":{"lhs":{"index":4},"rhs":{"index":22},"operator":"Add"}},{"Binary":{"lhs":{"index":2},"rhs":{"index":23},"operator":"Eq"}},{"Constrain":[{"index":2},{"index":23},null]},{"DecrementRc":{"value":{"index":0}}},{"DecrementRc":{"value":{"index":1}}}]},"results":{"i0":[],"i20":[],"i17":[{"index":22}],"i14":[],"i11":[{"index":16}],"i8":[{"index":13}],"i5":[{"index":7}],"i2":[{"index":4}],"i22":[],"i19":[{"index":24}],"i16":[],"i13":[{"index":18}],"i10":[{"index":14}],"i7":[{"index":12}],"i4":[],"i1":[],"i21":[],"i18":[{"index":23}],"i15":[{"index":19}],"i12":[{"index":17}],"i9":[],"i6":[{"index":11}],"i3":[{"index":6}]},"values":{"storage":[{"Param":{"block":{"index":0},"position":0,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"Param":{"block":{"index":0},"position":1,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"Param":{"block":{"index":0},"position":2,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Function":{"index":1}},{"Instruction":{"instruction":{"index":2},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":3},"position":0,"typ":{"Reference":{"Numeric":{"Unsigned":{"bit_size":1}}}}}},{"Instruction":{"instruction":{"index":5},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":"NativeField"}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":6},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":7},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":8},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":10},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":"NativeField"}}},{"Instruction":{"instruction":{"index":11},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":12},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":13},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":15},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Function":{"index":1}},{"Instruction":{"instruction":{"index":17},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":18},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":19},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}}]},"blocks":{"storage":[{"parameters":[{"index":0},{"index":1},{"index":2}],"instructions":[{"index":0},{"index":1},{"index":2},{"index":3},{"index":4},{"index":5},{"index":6},{"index":7},{"index":8},{"index":9},{"index":10},{"index":11},{"index":12},{"index":13},{"index":14},{"index":15},{"index":16},{"index":17},{"index":18},{"index":19},{"index":20},{"index":21},{"index":22}],"terminator":{"Return":{"return_values":[],"call_stack":[{"span":{"start":611,"end":681},"file":70}]}}}]}}}],[{"index":1},{"entry_block":{"index":0},"name":"maximum_price","id":{"index":1},"runtime":"Brillig","dfg":{"instructions":{"storage":[{"IncrementRc":{"value":{"index":0}}},{"ArrayGet":{"array":{"index":0},"index":{"index":2}}},"Allocate",{"Store":{"address":{"index":5},"value":{"index":4}}},{"ArrayGet":{"array":{"index":0},"index":{"index":3}}},{"ArrayGet":{"array":{"index":0},"index":{"index":2}}},{"Binary":{"lhs":{"index":8},"rhs":{"index":7},"operator":"Lt"}},{"ArrayGet":{"array":{"index":0},"index":{"index":3}}},{"Store":{"address":{"index":5},"value":{"index":10}}},{"Load":{"address":{"index":5}}},{"DecrementRc":{"value":{"index":0}}}]},"results":{"i0":[],"i10":[],"i7":[{"index":10}],"i4":[{"index":7}],"i1":[{"index":4}],"i8":[],"i5":[{"index":8}],"i2":[{"index":5}],"i9":[{"index":11}],"i6":[{"index":9}],"i3":[]},"values":{"storage":[{"Param":{"block":{"index":0},"position":0,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":"NativeField"}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":1},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":2},"position":0,"typ":{"Reference":{"Numeric":{"Unsigned":{"bit_size":32}}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":"NativeField"}}},{"Instruction":{"instruction":{"index":4},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":5},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":6},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":7},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":9},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}}]},"blocks":{"storage":[{"parameters":[{"index":0}],"instructions":[{"index":0},{"index":1},{"index":2},{"index":3},{"index":4},{"index":5},{"index":6}],"terminator":{"JmpIf":{"condition":{"index":9},"then_destination":{"index":1},"else_destination":{"index":2},"call_stack":[{"span":{"start":108,"end":131},"file":70}]}}},{"parameters":[],"instructions":[{"index":7},{"index":8}],"terminator":{"Jmp":{"destination":{"index":2},"arguments":[],"call_stack":[{"span":{"start":160,"end":170},"file":70}]}}},{"parameters":[],"instructions":[{"index":9},{"index":10}],"terminator":{"Return":{"return_values":[{"index":11}],"call_stack":[{"span":{"start":160,"end":170},"file":70}]}}}]}}}]],"main_id":{"index":0}} + "#).unwrap(); + + let ssa_level_warnings = ssa.detect_unchecked_brillig_calls(); + //assert_eq!(ssa_level_warnings.len(), 1); + } } From 8e711ec946b06b400edf18475f1bf0a8390abdbf Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 31 Oct 2024 21:22:09 +0300 Subject: [PATCH 02/73] Build the actual dependency graph, record constrains/brilligs --- .../check_for_underconstrained_values.rs | 151 +++++++++++------- 1 file changed, 96 insertions(+), 55 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index c977227a644..df1fb91f0a9 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -10,8 +10,8 @@ use crate::ssa::ir::value::{Value, ValueId}; use crate::ssa::ssa_gen::Ssa; use im::HashMap; use rayon::prelude::*; -use tracing::{debug, trace}; use std::collections::{BTreeMap, HashSet}; +use tracing::{debug, trace}; impl Ssa { /// Go through each top-level non-brillig function and detect if it has independent subgraphs @@ -33,9 +33,9 @@ impl Ssa { }) .collect() } - + /// Find brillig calls left unconstrained with later manual asserts - pub(crate) fn detect_unchecked_brillig_calls(&mut self) -> Vec { + pub(crate) fn check_for_missing_brillig_constrains(&mut self) -> Vec { let functions_id = self.functions.values().map(|f| f.id().to_usize()).collect::>(); functions_id .iter() @@ -43,11 +43,11 @@ impl Ssa { .flat_map(|fid| { let function_to_process = &self.functions[&FunctionId::new(*fid)]; match function_to_process.runtime() { - RuntimeType::Acir { .. } => detect_unchecked_brillig_calls_within_function( + RuntimeType::Acir { .. } => check_for_missing_brillig_constrains_within_function( function_to_process, &self.functions, ), - RuntimeType::Brillig => Vec::new(), + RuntimeType::Brillig(_) => Vec::new(), } }) .collect() @@ -86,63 +86,55 @@ fn check_for_underconstrained_values_within_function( /// Detect brillig calls left unconstrained with later manual asserts /// and return a vector of bug reports if some are found -fn detect_unchecked_brillig_calls_within_function( +fn check_for_missing_brillig_constrains_within_function( function: &Function, all_functions: &BTreeMap, ) -> Vec { let mut warnings: Vec = Vec::new(); - let mut context = DigraphContext::new(function, all_functions); - + let mut context = DependencyContext::default(); + context.build(function, all_functions); + + context.collect_warnings(); // let all_brillig_generated_values: HashSet = - // context.brillig_return_to_argument.keys().copied().collect(); + // context.brillig_return_to_argument.keys().copied().collect(); // let connected_sets_indices = - // context.find_sets_connected_to_function_inputs_or_outputs(function); + // context.find_sets_connected_to_function_inputs_or_outputs(function); // // Go through each disconnected set, find brillig calls that caused it and form warnings // for set_index in - // HashSet::from_iter(0..(context.value_sets.len())).difference(&connected_sets_indices) + // HashSet::from_iter(0..(context.value_sets.len())).difference(&connected_sets_indices) // { - // let current_set = &context.value_sets[*set_index]; - // warnings.append(&mut context.find_disconnecting_brillig_calls_with_results_in_set( - // current_set, - // &all_brillig_generated_values, - // function, - // )); + // let current_set = &context.value_sets[*set_index]; + // warnings.append(&mut context.find_disconnecting_brillig_calls_with_results_in_set( + // current_set, + // &all_brillig_generated_values, + // function, + // )); // } warnings } #[derive(Default)] -struct DigraphContext { +struct DependencyContext { visited_blocks: HashSet, block_queue: Vec, value_parents: HashMap>, - brillig_return_to_argument: HashMap>, - brillig_return_to_instruction_id: HashMap, + memory_slots: HashMap, + constrained_values: Vec>, + brillig_values: Vec>, } -impl DigraphContext { - pub(crate) fn new( - function: &Function, - all_functions: &BTreeMap - ) -> Self { - let mut context = Self::default(); - context.build_value_flow_graph(function, all_functions); - context - } - - /// Build flow graph of variable ValueIds - /// - /// Additionally, store information about brillig calls in the context - fn build_value_flow_graph( +impl DependencyContext { + /// Build the dependency graph of variable ValueIds, also storing + /// information on value ids involved in constrain operations + /// and brillig calls + fn build( &mut self, function: &Function, all_functions: &BTreeMap, ) { - trace!("building value flow graph for function {}", function); - self.block_queue.push(function.entry_block()); while let Some(block) = self.block_queue.pop() { if self.visited_blocks.contains(&block) { @@ -152,7 +144,7 @@ impl DigraphContext { self.build_block_value_flow_graph(block, function, all_functions); } } - + fn build_block_value_flow_graph( &mut self, block: BasicBlockId, @@ -160,10 +152,11 @@ impl DigraphContext { all_functions: &BTreeMap, ) { trace!("building block value flow graph for block {} of function {}", block, function); - + for instruction in function.dfg[block].instructions() { let mut arguments = Vec::new(); - + let mut results = Vec::new(); + // Collect non-constant instruction arguments function.dfg[*instruction].for_each_value(|value_id| { if function.dfg.get_numeric_constant(value_id).is_none() { @@ -171,20 +164,66 @@ impl DigraphContext { } }); - // Assign parent arguments to non-constant results + // Assign parent arguments to non-constant results for value_id in function.dfg.instruction_results(*instruction).iter() { if function.dfg.get_numeric_constant(*value_id).is_none() { - for argument in &arguments { - // Fill out result value parents - self.value_parents.entry(*value_id).or_insert(vec![]).push(function.dfg.resolve(*argument)); - } + results.push(function.dfg.resolve(*value_id)); } } - trace!("instruction {}: arguments: {:?}", instruction, arguments); - trace!("value parents map: {:?}", self.value_parents); - + // Process special case instruction types + match &function.dfg[*instruction] { + // For memory operations, we have to link up the stored value as a parent + // of one loaded from the same memory slot + Instruction::Store { address, value } => { + self.memory_slots.insert(*address, *value); + } + Instruction::Load { address } => { + // Remember the value stored at address as parent for the results + if let Some(value_id) = self.memory_slots.get(address) { + for result in results { + self.value_parents.entry(result).or_insert(vec![]).push(*value_id); + } + } else { + debug!("load instruction {} has attempted to access previously unused memory location, skipping", + instruction); + } + } + // Record the constrain instruction arguments to check them against those + // involved in brillig calls + Instruction::Constrain(value1, value2, _) => { + self.constrained_values.push(vec![*value1, *value2]); + } + // Record arguments/results for each brillig call for the check + Instruction::Call { func: func_id, arguments } => { + if let Value::Function(callee) = &function.dfg[*func_id] { + if let RuntimeType::Brillig(_) = all_functions[&callee].runtime() { + let mut involved_values = vec![]; + // using call arguments here, _not_ the instruction arguments collected + // above (as they would include an unneeded valueid) + involved_values.extend(arguments); + involved_values.extend(&results); + self.brillig_values.push(involved_values); + } + } + } + _ => { + // Record all the used arguments as parents of the results + for result in results { + self.value_parents.entry(result).or_insert(vec![]).extend(&arguments); + } + } + } } + + trace!("resulting value parents map: {:?}", self.value_parents); + trace!("resulting constrained values: {:?}", self.constrained_values); + trace!("resulting brillig involved values: {:?}", self.brillig_values); + } + + /// Check if the constrained values can be traced back to brillig calls. + /// For every brillig call not properly constrained, emit a corresponding warning. + fn collect_warnings(&mut self) { } } @@ -305,8 +344,6 @@ impl Context { instruction_arguments_and_results.insert(function.dfg.resolve(*value_id)); } } - - trace!("value_ids participating in {}: {:?}", instruction, instruction_arguments_and_results); // For most instructions we just connect inputs and outputs match &function.dfg[*instruction] { @@ -483,9 +520,13 @@ mod test { use noirc_frontend::monomorphization::ast::InlineType; use crate::ssa::{ - Ssa, function_builder::FunctionBuilder, - ir::{instruction::BinaryOp, map::Id, types::{Type, NumericType}}, + ir::{ + instruction::BinaryOp, + map::Id, + types::{NumericType, Type}, + }, + Ssa, }; use tracing::{debug, trace}; use tracing_test::traced_test; @@ -563,11 +604,11 @@ mod test { let ssa_level_warnings = ssa.check_for_underconstrained_values(); assert_eq!(ssa_level_warnings.len(), 1); } - + #[test] #[traced_test] /// Test where the results of a call to a brillig function are left unchecked with a later assert, - /// by example of the program illustrating issue #5425 (simplified). + /// by example of the program illustrating issue #5425 (simplified). fn test_underconstrained_value_detector_5425() { /* unconstrained fn maximum_price(options: [u32; 2]) -> u32 { @@ -593,10 +634,10 @@ mod test { } */ let mut ssa: Ssa = serde_json::from_str(r#" - {"functions":[[{"index":0},{"entry_block":{"index":0},"name":"main","id":{"index":0},"runtime":{"Acir":"Inline"},"dfg":{"instructions":{"storage":[{"IncrementRc":{"value":{"index":0}}},{"IncrementRc":{"value":{"index":1}}},{"Call":{"func":{"index":3},"arguments":[{"index":0}]}},"Allocate",{"Store":{"address":{"index":6},"value":{"index":5}}},{"Load":{"address":{"index":6}}},{"ArrayGet":{"array":{"index":0},"index":{"index":9}}},{"Binary":{"lhs":{"index":11},"rhs":{"index":4},"operator":"Eq"}},{"Binary":{"lhs":{"index":7},"rhs":{"index":12},"operator":"Or"}},{"Store":{"address":{"index":6},"value":{"index":13}}},{"Load":{"address":{"index":6}}},{"ArrayGet":{"array":{"index":0},"index":{"index":10}}},{"Binary":{"lhs":{"index":16},"rhs":{"index":4},"operator":"Eq"}},{"Binary":{"lhs":{"index":14},"rhs":{"index":17},"operator":"Or"}},{"Store":{"address":{"index":6},"value":{"index":18}}},{"Load":{"address":{"index":6}}},{"Constrain":[{"index":19},{"index":20},null]},{"Call":{"func":{"index":21},"arguments":[{"index":1}]}},{"Binary":{"lhs":{"index":4},"rhs":{"index":22},"operator":"Add"}},{"Binary":{"lhs":{"index":2},"rhs":{"index":23},"operator":"Eq"}},{"Constrain":[{"index":2},{"index":23},null]},{"DecrementRc":{"value":{"index":0}}},{"DecrementRc":{"value":{"index":1}}}]},"results":{"i0":[],"i20":[],"i17":[{"index":22}],"i14":[],"i11":[{"index":16}],"i8":[{"index":13}],"i5":[{"index":7}],"i2":[{"index":4}],"i22":[],"i19":[{"index":24}],"i16":[],"i13":[{"index":18}],"i10":[{"index":14}],"i7":[{"index":12}],"i4":[],"i1":[],"i21":[],"i18":[{"index":23}],"i15":[{"index":19}],"i12":[{"index":17}],"i9":[],"i6":[{"index":11}],"i3":[{"index":6}]},"values":{"storage":[{"Param":{"block":{"index":0},"position":0,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"Param":{"block":{"index":0},"position":1,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"Param":{"block":{"index":0},"position":2,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Function":{"index":1}},{"Instruction":{"instruction":{"index":2},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":3},"position":0,"typ":{"Reference":{"Numeric":{"Unsigned":{"bit_size":1}}}}}},{"Instruction":{"instruction":{"index":5},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":"NativeField"}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":6},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":7},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":8},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":10},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":"NativeField"}}},{"Instruction":{"instruction":{"index":11},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":12},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":13},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":15},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Function":{"index":1}},{"Instruction":{"instruction":{"index":17},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":18},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":19},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}}]},"blocks":{"storage":[{"parameters":[{"index":0},{"index":1},{"index":2}],"instructions":[{"index":0},{"index":1},{"index":2},{"index":3},{"index":4},{"index":5},{"index":6},{"index":7},{"index":8},{"index":9},{"index":10},{"index":11},{"index":12},{"index":13},{"index":14},{"index":15},{"index":16},{"index":17},{"index":18},{"index":19},{"index":20},{"index":21},{"index":22}],"terminator":{"Return":{"return_values":[],"call_stack":[{"span":{"start":611,"end":681},"file":70}]}}}]}}}],[{"index":1},{"entry_block":{"index":0},"name":"maximum_price","id":{"index":1},"runtime":"Brillig","dfg":{"instructions":{"storage":[{"IncrementRc":{"value":{"index":0}}},{"ArrayGet":{"array":{"index":0},"index":{"index":2}}},"Allocate",{"Store":{"address":{"index":5},"value":{"index":4}}},{"ArrayGet":{"array":{"index":0},"index":{"index":3}}},{"ArrayGet":{"array":{"index":0},"index":{"index":2}}},{"Binary":{"lhs":{"index":8},"rhs":{"index":7},"operator":"Lt"}},{"ArrayGet":{"array":{"index":0},"index":{"index":3}}},{"Store":{"address":{"index":5},"value":{"index":10}}},{"Load":{"address":{"index":5}}},{"DecrementRc":{"value":{"index":0}}}]},"results":{"i0":[],"i10":[],"i7":[{"index":10}],"i4":[{"index":7}],"i1":[{"index":4}],"i8":[],"i5":[{"index":8}],"i2":[{"index":5}],"i9":[{"index":11}],"i6":[{"index":9}],"i3":[]},"values":{"storage":[{"Param":{"block":{"index":0},"position":0,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":"NativeField"}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":1},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":2},"position":0,"typ":{"Reference":{"Numeric":{"Unsigned":{"bit_size":32}}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":"NativeField"}}},{"Instruction":{"instruction":{"index":4},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":5},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":6},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":7},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":9},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}}]},"blocks":{"storage":[{"parameters":[{"index":0}],"instructions":[{"index":0},{"index":1},{"index":2},{"index":3},{"index":4},{"index":5},{"index":6}],"terminator":{"JmpIf":{"condition":{"index":9},"then_destination":{"index":1},"else_destination":{"index":2},"call_stack":[{"span":{"start":108,"end":131},"file":70}]}}},{"parameters":[],"instructions":[{"index":7},{"index":8}],"terminator":{"Jmp":{"destination":{"index":2},"arguments":[],"call_stack":[{"span":{"start":160,"end":170},"file":70}]}}},{"parameters":[],"instructions":[{"index":9},{"index":10}],"terminator":{"Return":{"return_values":[{"index":11}],"call_stack":[{"span":{"start":160,"end":170},"file":70}]}}}]}}}]],"main_id":{"index":0}} + {"functions":[[{"index":0},{"entry_block":{"index":0},"name":"main","id":{"index":0},"runtime":{"Acir":"Inline"},"dfg":{"instructions":{"storage":[{"IncrementRc":{"value":{"index":0}}},{"IncrementRc":{"value":{"index":1}}},{"Call":{"func":{"index":3},"arguments":[{"index":0}]}},"Allocate",{"Store":{"address":{"index":6},"value":{"index":5}}},{"Load":{"address":{"index":6}}},{"ArrayGet":{"array":{"index":0},"index":{"index":9}}},{"Binary":{"lhs":{"index":11},"rhs":{"index":4},"operator":"Eq"}},{"Binary":{"lhs":{"index":7},"rhs":{"index":12},"operator":"Or"}},{"Store":{"address":{"index":6},"value":{"index":13}}},{"Load":{"address":{"index":6}}},{"ArrayGet":{"array":{"index":0},"index":{"index":10}}},{"Binary":{"lhs":{"index":16},"rhs":{"index":4},"operator":"Eq"}},{"Binary":{"lhs":{"index":14},"rhs":{"index":17},"operator":"Or"}},{"Store":{"address":{"index":6},"value":{"index":18}}},{"Load":{"address":{"index":6}}},{"Constrain":[{"index":19},{"index":20},null]},{"Call":{"func":{"index":21},"arguments":[{"index":1}]}},{"Binary":{"lhs":{"index":4},"rhs":{"index":22},"operator":"Add"}},{"Binary":{"lhs":{"index":2},"rhs":{"index":23},"operator":"Eq"}},{"Constrain":[{"index":2},{"index":23},null]},{"DecrementRc":{"value":{"index":0}}},{"DecrementRc":{"value":{"index":1}}}]},"results":{"i0":[],"i20":[],"i17":[{"index":22}],"i14":[],"i11":[{"index":16}],"i8":[{"index":13}],"i5":[{"index":7}],"i2":[{"index":4}],"i22":[],"i19":[{"index":24}],"i16":[],"i13":[{"index":18}],"i10":[{"index":14}],"i7":[{"index":12}],"i4":[],"i1":[],"i21":[],"i18":[{"index":23}],"i15":[{"index":19}],"i12":[{"index":17}],"i9":[],"i6":[{"index":11}],"i3":[{"index":6}]},"values":{"storage":[{"Param":{"block":{"index":0},"position":0,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"Param":{"block":{"index":0},"position":1,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"Param":{"block":{"index":0},"position":2,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Function":{"index":1}},{"Instruction":{"instruction":{"index":2},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":3},"position":0,"typ":{"Reference":{"Numeric":{"Unsigned":{"bit_size":1}}}}}},{"Instruction":{"instruction":{"index":5},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":"NativeField"}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":6},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":7},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":8},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":10},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":"NativeField"}}},{"Instruction":{"instruction":{"index":11},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":12},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":13},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":15},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Function":{"index":1}},{"Instruction":{"instruction":{"index":17},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":18},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":19},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}}]},"blocks":{"storage":[{"parameters":[{"index":0},{"index":1},{"index":2}],"instructions":[{"index":0},{"index":1},{"index":2},{"index":3},{"index":4},{"index":5},{"index":6},{"index":7},{"index":8},{"index":9},{"index":10},{"index":11},{"index":12},{"index":13},{"index":14},{"index":15},{"index":16},{"index":17},{"index":18},{"index":19},{"index":20},{"index":21},{"index":22}],"terminator":{"Return":{"return_values":[],"call_stack":[{"span":{"start":611,"end":681},"file":70}]}}}]}}}],[{"index":1},{"entry_block":{"index":0},"name":"maximum_price","id":{"index":1},"runtime":{"Brillig":"Inline"},"dfg":{"instructions":{"storage":[{"IncrementRc":{"value":{"index":0}}},{"ArrayGet":{"array":{"index":0},"index":{"index":2}}},"Allocate",{"Store":{"address":{"index":5},"value":{"index":4}}},{"ArrayGet":{"array":{"index":0},"index":{"index":3}}},{"ArrayGet":{"array":{"index":0},"index":{"index":2}}},{"Binary":{"lhs":{"index":8},"rhs":{"index":7},"operator":"Lt"}},{"ArrayGet":{"array":{"index":0},"index":{"index":3}}},{"Store":{"address":{"index":5},"value":{"index":10}}},{"Load":{"address":{"index":5}}},{"DecrementRc":{"value":{"index":0}}}]},"results":{"i0":[],"i10":[],"i7":[{"index":10}],"i4":[{"index":7}],"i1":[{"index":4}],"i8":[],"i5":[{"index":8}],"i2":[{"index":5}],"i9":[{"index":11}],"i6":[{"index":9}],"i3":[]},"values":{"storage":[{"Param":{"block":{"index":0},"position":0,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":"NativeField"}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":1},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":2},"position":0,"typ":{"Reference":{"Numeric":{"Unsigned":{"bit_size":32}}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":"NativeField"}}},{"Instruction":{"instruction":{"index":4},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":5},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":6},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":7},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":9},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}}]},"blocks":{"storage":[{"parameters":[{"index":0}],"instructions":[{"index":0},{"index":1},{"index":2},{"index":3},{"index":4},{"index":5},{"index":6}],"terminator":{"JmpIf":{"condition":{"index":9},"then_destination":{"index":1},"else_destination":{"index":2},"call_stack":[{"span":{"start":108,"end":131},"file":70}]}}},{"parameters":[],"instructions":[{"index":7},{"index":8}],"terminator":{"Jmp":{"destination":{"index":2},"arguments":[],"call_stack":[{"span":{"start":160,"end":170},"file":70}]}}},{"parameters":[],"instructions":[{"index":9},{"index":10}],"terminator":{"Return":{"return_values":[{"index":11}],"call_stack":[{"span":{"start":160,"end":170},"file":70}]}}}]}}}]],"main_id":{"index":0}} "#).unwrap(); - let ssa_level_warnings = ssa.detect_unchecked_brillig_calls(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); //assert_eq!(ssa_level_warnings.len(), 1); } } From 1ac3e3fa2b5bbc88e9d595e2ed7111553c27b82e Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Fri, 1 Nov 2024 17:27:42 +0300 Subject: [PATCH 03/73] Check for brillig call constrain coverage --- .../check_for_underconstrained_values.rs | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index df1fb91f0a9..57e5f8a04c0 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -121,9 +121,12 @@ struct DependencyContext { visited_blocks: HashSet, block_queue: Vec, value_parents: HashMap>, + // Map keeping track of values stored at memory locations memory_slots: HashMap, + // List of values involved in constrain instructions constrained_values: Vec>, - brillig_values: Vec>, + // Map of brillig call ids to sets of their arguments and results + brillig_values: HashMap, HashSet)>, } impl DependencyContext { @@ -198,12 +201,8 @@ impl DependencyContext { Instruction::Call { func: func_id, arguments } => { if let Value::Function(callee) = &function.dfg[*func_id] { if let RuntimeType::Brillig(_) = all_functions[&callee].runtime() { - let mut involved_values = vec![]; - // using call arguments here, _not_ the instruction arguments collected - // above (as they would include an unneeded valueid) - involved_values.extend(arguments); - involved_values.extend(&results); - self.brillig_values.push(involved_values); + self.brillig_values.insert(*func_id, + (HashSet::from_iter(arguments.clone()), HashSet::from_iter(results))); } } } @@ -224,6 +223,36 @@ impl DependencyContext { /// Check if the constrained values can be traced back to brillig calls. /// For every brillig call not properly constrained, emit a corresponding warning. fn collect_warnings(&mut self) { + let mut covered_brillig_calls: HashSet = HashSet::new(); + for constrained_values in &self.constrained_values { + let constrain_ancestors: HashSet<_> = constrained_values.iter().flat_map(|v| self.collect_ancestors(*v)).collect(); + for (brillig_call, brillig_values) in &self.brillig_values { + // If there is at least one value among the constrain value ancestors + // in both of the brillig call arguments and results, consider the call properly covered + if constrain_ancestors.intersection(&brillig_values.0).next().is_some() && + constrain_ancestors.intersection(&brillig_values.1).next().is_some() { + trace!("brillig call at {} covered by constrained values {:?}", brillig_call, constrained_values); + covered_brillig_calls.insert(*brillig_call); + } + } + } + + // For each unchecked brillig call, emit a warning + + } + + /// Build a set of all ValueIds the given ValueId descends from + fn collect_ancestors(&self, value_id: ValueId) -> HashSet { + let mut to_visit = vec![value_id]; + let mut ancestors = HashSet::new(); + while let Some(value_id) = to_visit.pop() { + if let Some(values) = self.value_parents.get(&value_id) { + to_visit.extend(values); + ancestors.extend(values); + } + } + + ancestors } } From e848be76fa35dc02da16fbe57ab5f02bfca6e880 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Fri, 1 Nov 2024 17:33:05 +0300 Subject: [PATCH 04/73] cargo fmt, clippy --- .../check_for_underconstrained_values.rs | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 57e5f8a04c0..13507de8094 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -43,10 +43,12 @@ impl Ssa { .flat_map(|fid| { let function_to_process = &self.functions[&FunctionId::new(*fid)]; match function_to_process.runtime() { - RuntimeType::Acir { .. } => check_for_missing_brillig_constrains_within_function( - function_to_process, - &self.functions, - ), + RuntimeType::Acir { .. } => { + check_for_missing_brillig_constrains_within_function( + function_to_process, + &self.functions, + ) + } RuntimeType::Brillig(_) => Vec::new(), } }) @@ -94,7 +96,7 @@ fn check_for_missing_brillig_constrains_within_function( let mut context = DependencyContext::default(); context.build(function, all_functions); - + context.collect_warnings(); // let all_brillig_generated_values: HashSet = // context.brillig_return_to_argument.keys().copied().collect(); @@ -133,11 +135,7 @@ impl DependencyContext { /// Build the dependency graph of variable ValueIds, also storing /// information on value ids involved in constrain operations /// and brillig calls - fn build( - &mut self, - function: &Function, - all_functions: &BTreeMap, - ) { + fn build(&mut self, function: &Function, all_functions: &BTreeMap) { self.block_queue.push(function.entry_block()); while let Some(block) = self.block_queue.pop() { if self.visited_blocks.contains(&block) { @@ -185,7 +183,7 @@ impl DependencyContext { // Remember the value stored at address as parent for the results if let Some(value_id) = self.memory_slots.get(address) { for result in results { - self.value_parents.entry(result).or_insert(vec![]).push(*value_id); + self.value_parents.entry(result).or_default().push(*value_id); } } else { debug!("load instruction {} has attempted to access previously unused memory location, skipping", @@ -201,15 +199,20 @@ impl DependencyContext { Instruction::Call { func: func_id, arguments } => { if let Value::Function(callee) = &function.dfg[*func_id] { if let RuntimeType::Brillig(_) = all_functions[&callee].runtime() { - self.brillig_values.insert(*func_id, - (HashSet::from_iter(arguments.clone()), HashSet::from_iter(results))); + self.brillig_values.insert( + *func_id, + ( + HashSet::from_iter(arguments.clone()), + HashSet::from_iter(results), + ), + ); } } } _ => { // Record all the used arguments as parents of the results for result in results { - self.value_parents.entry(result).or_insert(vec![]).extend(&arguments); + self.value_parents.entry(result).or_default().extend(&arguments); } } } @@ -225,20 +228,25 @@ impl DependencyContext { fn collect_warnings(&mut self) { let mut covered_brillig_calls: HashSet = HashSet::new(); for constrained_values in &self.constrained_values { - let constrain_ancestors: HashSet<_> = constrained_values.iter().flat_map(|v| self.collect_ancestors(*v)).collect(); + let constrain_ancestors: HashSet<_> = + constrained_values.iter().flat_map(|v| self.collect_ancestors(*v)).collect(); for (brillig_call, brillig_values) in &self.brillig_values { // If there is at least one value among the constrain value ancestors // in both of the brillig call arguments and results, consider the call properly covered - if constrain_ancestors.intersection(&brillig_values.0).next().is_some() && - constrain_ancestors.intersection(&brillig_values.1).next().is_some() { - trace!("brillig call at {} covered by constrained values {:?}", brillig_call, constrained_values); + if constrain_ancestors.intersection(&brillig_values.0).next().is_some() + && constrain_ancestors.intersection(&brillig_values.1).next().is_some() + { + trace!( + "brillig call at {} covered by constrained values {:?}", + brillig_call, + constrained_values + ); covered_brillig_calls.insert(*brillig_call); } } } // For each unchecked brillig call, emit a warning - } /// Build a set of all ValueIds the given ValueId descends from From d74152517d9fed1bccd1c42041d801935604afe5 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Fri, 1 Nov 2024 17:33:21 +0300 Subject: [PATCH 05/73] Move tracing-test to dev-dependencies --- compiler/noirc_evaluator/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/Cargo.toml b/compiler/noirc_evaluator/Cargo.toml index bd2be436276..8ccad0860b8 100644 --- a/compiler/noirc_evaluator/Cargo.toml +++ b/compiler/noirc_evaluator/Cargo.toml @@ -25,13 +25,13 @@ serde.workspace = true serde_json.workspace = true serde_with = "3.2.0" tracing.workspace = true -tracing-test = "0.2.5" chrono = "0.4.37" rayon.workspace = true cfg-if.workspace = true [dev-dependencies] proptest.workspace = true +tracing-test = "0.2.5" [features] bn254 = ["noirc_frontend/bn254"] From 49b59c6c1ec0c63c7d0202b4bc61cd78619225c2 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 4 Nov 2024 18:16:51 +0300 Subject: [PATCH 06/73] Collect SSA reports --- compiler/noirc_evaluator/src/errors.rs | 7 +- .../check_for_underconstrained_values.rs | 67 +++++++------------ 2 files changed, 29 insertions(+), 45 deletions(-) diff --git a/compiler/noirc_evaluator/src/errors.rs b/compiler/noirc_evaluator/src/errors.rs index 994e97eabb8..78719a92296 100644 --- a/compiler/noirc_evaluator/src/errors.rs +++ b/compiler/noirc_evaluator/src/errors.rs @@ -93,7 +93,10 @@ impl From for FileDiagnostic { let message = bug.to_string(); let (secondary_message, call_stack) = match bug { InternalBug::IndependentSubgraph { call_stack } => { - ("There is no path from the output of this brillig call to either return values or inputs of the circuit, which creates an independent subgraph. This is quite likely a soundness vulnerability".to_string(),call_stack) + ("There is no path from the output of this brillig call to either return values or inputs of the circuit, which creates an independent subgraph. This is quite likely a soundness vulnerability".to_string(), call_stack) + } + InternalBug::UncheckedBrilligCall { call_stack } => { + ("There is no assert checking this brillig call's inputs against its return values in some way. This should be done to prevent potential soundness vulnerabilities".to_string(), call_stack) } InternalBug::AssertFailed { call_stack } => ("As a result, the compiled circuit is ensured to fail. Other assertions may also fail during execution".to_string(), call_stack) }; @@ -119,6 +122,8 @@ pub enum InternalWarning { pub enum InternalBug { #[error("Input to brillig function is in a separate subgraph to output")] IndependentSubgraph { call_stack: CallStack }, + #[error("Brillig function call isn't properly covered by a manual constrain")] + UncheckedBrilligCall { call_stack: CallStack }, #[error("Assertion is always false")] AssertFailed { call_stack: CallStack }, } diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 13507de8094..6ca1489205b 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -34,7 +34,8 @@ impl Ssa { .collect() } - /// Find brillig calls left unconstrained with later manual asserts + /// Detect brillig calls left unconstrained with later manual asserts + /// and return a vector of bug reports if some are found pub(crate) fn check_for_missing_brillig_constrains(&mut self) -> Vec { let functions_id = self.functions.values().map(|f| f.id().to_usize()).collect::>(); functions_id @@ -44,10 +45,9 @@ impl Ssa { let function_to_process = &self.functions[&FunctionId::new(*fid)]; match function_to_process.runtime() { RuntimeType::Acir { .. } => { - check_for_missing_brillig_constrains_within_function( - function_to_process, - &self.functions, - ) + let mut context = DependencyContext::default(); + context.build(function_to_process, &self.functions); + context.collect_warnings(function_to_process) } RuntimeType::Brillig(_) => Vec::new(), } @@ -86,38 +86,6 @@ fn check_for_underconstrained_values_within_function( warnings } -/// Detect brillig calls left unconstrained with later manual asserts -/// and return a vector of bug reports if some are found -fn check_for_missing_brillig_constrains_within_function( - function: &Function, - all_functions: &BTreeMap, -) -> Vec { - let mut warnings: Vec = Vec::new(); - - let mut context = DependencyContext::default(); - context.build(function, all_functions); - - context.collect_warnings(); - // let all_brillig_generated_values: HashSet = - // context.brillig_return_to_argument.keys().copied().collect(); - - // let connected_sets_indices = - // context.find_sets_connected_to_function_inputs_or_outputs(function); - - // // Go through each disconnected set, find brillig calls that caused it and form warnings - // for set_index in - // HashSet::from_iter(0..(context.value_sets.len())).difference(&connected_sets_indices) - // { - // let current_set = &context.value_sets[*set_index]; - // warnings.append(&mut context.find_disconnecting_brillig_calls_with_results_in_set( - // current_set, - // &all_brillig_generated_values, - // function, - // )); - // } - warnings -} - #[derive(Default)] struct DependencyContext { visited_blocks: HashSet, @@ -128,7 +96,7 @@ struct DependencyContext { // List of values involved in constrain instructions constrained_values: Vec>, // Map of brillig call ids to sets of their arguments and results - brillig_values: HashMap, HashSet)>, + brillig_values: HashMap, HashSet)>, } impl DependencyContext { @@ -200,7 +168,7 @@ impl DependencyContext { if let Value::Function(callee) = &function.dfg[*func_id] { if let RuntimeType::Brillig(_) = all_functions[&callee].runtime() { self.brillig_values.insert( - *func_id, + *instruction, ( HashSet::from_iter(arguments.clone()), HashSet::from_iter(results), @@ -225,8 +193,8 @@ impl DependencyContext { /// Check if the constrained values can be traced back to brillig calls. /// For every brillig call not properly constrained, emit a corresponding warning. - fn collect_warnings(&mut self) { - let mut covered_brillig_calls: HashSet = HashSet::new(); + fn collect_warnings(&mut self, function: &Function) -> Vec { + let mut covered_brillig_calls: HashSet = HashSet::new(); for constrained_values in &self.constrained_values { let constrain_ancestors: HashSet<_> = constrained_values.iter().flat_map(|v| self.collect_ancestors(*v)).collect(); @@ -247,6 +215,19 @@ impl DependencyContext { } // For each unchecked brillig call, emit a warning + let unchecked_calls = + self.brillig_values.keys().filter(|v| !covered_brillig_calls.contains(v)); + + let warnings: Vec = unchecked_calls + .map(|brillig_call| { + SsaReport::Bug(InternalBug::UncheckedBrilligCall { + call_stack: function.dfg.get_call_stack(*brillig_call), + }) + }) + .collect(); + + trace!("making following reports for function {}: {:?}", function, warnings); + warnings } /// Build a set of all ValueIds the given ValueId descends from @@ -565,7 +546,6 @@ mod test { }, Ssa, }; - use tracing::{debug, trace}; use tracing_test::traced_test; #[test] @@ -578,7 +558,6 @@ mod test { // v4 = eq v2, v3 // return v2 // } - debug!("simple connected function"); let main_id = Id::test_new(0); let mut builder = FunctionBuilder::new("main".into(), main_id); let v0 = builder.add_parameter(Type::field()); @@ -675,6 +654,6 @@ mod test { "#).unwrap(); let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); - //assert_eq!(ssa_level_warnings.len(), 1); + assert_eq!(ssa_level_warnings.len(), 1); } } From 7e6bf9b4f26bb841915d5c2b1001162261dc88c8 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Tue, 5 Nov 2024 18:40:55 +0300 Subject: [PATCH 07/73] Remove instruction catch-all --- .../check_for_underconstrained_values.rs | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 6ca1489205b..edbfe86a105 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -140,7 +140,7 @@ impl DependencyContext { } } - // Process special case instruction types + // Process instructions match &function.dfg[*instruction] { // For memory operations, we have to link up the stored value as a parent // of one loaded from the same memory slot @@ -177,12 +177,24 @@ impl DependencyContext { } } } - _ => { + Instruction::ArrayGet { .. } + | Instruction::ArraySet { .. } + | Instruction::Binary(..) + | Instruction::Cast(..) + | Instruction::IfElse { .. } + | Instruction::Not(..) + | Instruction::Truncate { .. } => { // Record all the used arguments as parents of the results for result in results { self.value_parents.entry(result).or_default().extend(&arguments); } } + // These instructions won't affect the dependency graph + Instruction::Allocate { .. } + | Instruction::DecrementRc { .. } + | Instruction::EnableSideEffectsIf { .. } + | Instruction::IncrementRc { .. } + | Instruction::RangeCheck { .. } => {} } } @@ -226,7 +238,7 @@ impl DependencyContext { }) .collect(); - trace!("making following reports for function {}: {:?}", function, warnings); + trace!("making following reports for function {}: {:?}", function.name(), warnings); warnings } @@ -263,7 +275,6 @@ impl Context { function: &Function, all_functions: &BTreeMap, ) { - trace!("compute_sets_of_connected_value_ids()"); // Go through each block in the function and create a list of sets of ValueIds connected by instructions self.block_queue.push(function.entry_block()); while let Some(block) = self.block_queue.pop() { @@ -549,6 +560,7 @@ mod test { use tracing_test::traced_test; #[test] + #[traced_test] /// Test that a connected function raises no warnings fn test_simple_connected_function() { // fn main { @@ -577,6 +589,7 @@ mod test { } #[test] + #[traced_test] /// Test where the results of a call to a brillig function are not connected to main function inputs or outputs /// This should be detected. fn test_simple_function_with_disconnected_part() { From b4181693d65f568f5ce8e2947eb8abe713d09c61 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Tue, 5 Nov 2024 18:46:25 +0300 Subject: [PATCH 08/73] Consider brillig call covered if _all_ the results are constrained --- .../src/ssa/checks/check_for_underconstrained_values.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index edbfe86a105..f5bc0db47f8 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -211,10 +211,11 @@ impl DependencyContext { let constrain_ancestors: HashSet<_> = constrained_values.iter().flat_map(|v| self.collect_ancestors(*v)).collect(); for (brillig_call, brillig_values) in &self.brillig_values { - // If there is at least one value among the constrain value ancestors - // in both of the brillig call arguments and results, consider the call properly covered + // If there is at least one value among the brillig call arguments + // along with all the results featuring in the constrain value ancestors, + // consider the call properly covered if constrain_ancestors.intersection(&brillig_values.0).next().is_some() - && constrain_ancestors.intersection(&brillig_values.1).next().is_some() + && constrain_ancestors.is_superset(&brillig_values.1) { trace!( "brillig call at {} covered by constrained values {:?}", From ea84f593c85567b02e69f646a872ec24bde7299a Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Wed, 6 Nov 2024 15:38:40 +0300 Subject: [PATCH 09/73] Rework the 5425 reduced test case --- .../check_for_underconstrained_values.rs | 96 ++++++++++++++++++- 1 file changed, 92 insertions(+), 4 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index f5bc0db47f8..e358b70f159 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -167,6 +167,7 @@ impl DependencyContext { Instruction::Call { func: func_id, arguments } => { if let Value::Function(callee) = &function.dfg[*func_id] { if let RuntimeType::Brillig(_) = all_functions[&callee].runtime() { + trace!("brillig function {} called at {}", callee, instruction); self.brillig_values.insert( *instruction, ( @@ -556,8 +557,8 @@ mod test { map::Id, types::{NumericType, Type}, }, - Ssa, }; + use std::sync::Arc; use tracing_test::traced_test; #[test] @@ -662,11 +663,98 @@ mod test { == (most_expensive_sandwich + most_expensive_drink) ); } + + fn main f0 { + b0(v0: [u32; 2], v1: [u32; 2], v2: u32): + inc_rc v0 + inc_rc v1 + v4 = call f1(v0) + v6 = allocate + store u1 0 at v6 + v7 = load v6 + v11 = array_get v0, index u32 0 + v12 = eq v11, v4 + v13 = or v7, v12 + store v13 at v6 + v14 = load v6 + v16 = array_get v0, index u32 1 + v17 = eq v16, v4 + v18 = or v14, v17 + store v18 at v6 + v19 = load v6 + constrain v19 == u1 1 + v22 = call f1(v1) + v23 = add v4, v22 + v24 = eq v2, v23 + constrain v2 == v23 + dec_rc v0 + dec_rc v1 + return + } */ - let mut ssa: Ssa = serde_json::from_str(r#" - {"functions":[[{"index":0},{"entry_block":{"index":0},"name":"main","id":{"index":0},"runtime":{"Acir":"Inline"},"dfg":{"instructions":{"storage":[{"IncrementRc":{"value":{"index":0}}},{"IncrementRc":{"value":{"index":1}}},{"Call":{"func":{"index":3},"arguments":[{"index":0}]}},"Allocate",{"Store":{"address":{"index":6},"value":{"index":5}}},{"Load":{"address":{"index":6}}},{"ArrayGet":{"array":{"index":0},"index":{"index":9}}},{"Binary":{"lhs":{"index":11},"rhs":{"index":4},"operator":"Eq"}},{"Binary":{"lhs":{"index":7},"rhs":{"index":12},"operator":"Or"}},{"Store":{"address":{"index":6},"value":{"index":13}}},{"Load":{"address":{"index":6}}},{"ArrayGet":{"array":{"index":0},"index":{"index":10}}},{"Binary":{"lhs":{"index":16},"rhs":{"index":4},"operator":"Eq"}},{"Binary":{"lhs":{"index":14},"rhs":{"index":17},"operator":"Or"}},{"Store":{"address":{"index":6},"value":{"index":18}}},{"Load":{"address":{"index":6}}},{"Constrain":[{"index":19},{"index":20},null]},{"Call":{"func":{"index":21},"arguments":[{"index":1}]}},{"Binary":{"lhs":{"index":4},"rhs":{"index":22},"operator":"Add"}},{"Binary":{"lhs":{"index":2},"rhs":{"index":23},"operator":"Eq"}},{"Constrain":[{"index":2},{"index":23},null]},{"DecrementRc":{"value":{"index":0}}},{"DecrementRc":{"value":{"index":1}}}]},"results":{"i0":[],"i20":[],"i17":[{"index":22}],"i14":[],"i11":[{"index":16}],"i8":[{"index":13}],"i5":[{"index":7}],"i2":[{"index":4}],"i22":[],"i19":[{"index":24}],"i16":[],"i13":[{"index":18}],"i10":[{"index":14}],"i7":[{"index":12}],"i4":[],"i1":[],"i21":[],"i18":[{"index":23}],"i15":[{"index":19}],"i12":[{"index":17}],"i9":[],"i6":[{"index":11}],"i3":[{"index":6}]},"values":{"storage":[{"Param":{"block":{"index":0},"position":0,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"Param":{"block":{"index":0},"position":1,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"Param":{"block":{"index":0},"position":2,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Function":{"index":1}},{"Instruction":{"instruction":{"index":2},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":3},"position":0,"typ":{"Reference":{"Numeric":{"Unsigned":{"bit_size":1}}}}}},{"Instruction":{"instruction":{"index":5},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":"NativeField"}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":6},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":7},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":8},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":10},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":"NativeField"}}},{"Instruction":{"instruction":{"index":11},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":12},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":13},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":15},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Function":{"index":1}},{"Instruction":{"instruction":{"index":17},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":18},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":19},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}}]},"blocks":{"storage":[{"parameters":[{"index":0},{"index":1},{"index":2}],"instructions":[{"index":0},{"index":1},{"index":2},{"index":3},{"index":4},{"index":5},{"index":6},{"index":7},{"index":8},{"index":9},{"index":10},{"index":11},{"index":12},{"index":13},{"index":14},{"index":15},{"index":16},{"index":17},{"index":18},{"index":19},{"index":20},{"index":21},{"index":22}],"terminator":{"Return":{"return_values":[],"call_stack":[{"span":{"start":611,"end":681},"file":70}]}}}]}}}],[{"index":1},{"entry_block":{"index":0},"name":"maximum_price","id":{"index":1},"runtime":{"Brillig":"Inline"},"dfg":{"instructions":{"storage":[{"IncrementRc":{"value":{"index":0}}},{"ArrayGet":{"array":{"index":0},"index":{"index":2}}},"Allocate",{"Store":{"address":{"index":5},"value":{"index":4}}},{"ArrayGet":{"array":{"index":0},"index":{"index":3}}},{"ArrayGet":{"array":{"index":0},"index":{"index":2}}},{"Binary":{"lhs":{"index":8},"rhs":{"index":7},"operator":"Lt"}},{"ArrayGet":{"array":{"index":0},"index":{"index":3}}},{"Store":{"address":{"index":5},"value":{"index":10}}},{"Load":{"address":{"index":5}}},{"DecrementRc":{"value":{"index":0}}}]},"results":{"i0":[],"i10":[],"i7":[{"index":10}],"i4":[{"index":7}],"i1":[{"index":4}],"i8":[],"i5":[{"index":8}],"i2":[{"index":5}],"i9":[{"index":11}],"i6":[{"index":9}],"i3":[]},"values":{"storage":[{"Param":{"block":{"index":0},"position":0,"typ":{"Array":[[{"Numeric":{"Unsigned":{"bit_size":32}}}],2]}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":"NativeField"}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000000","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":1},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":2},"position":0,"typ":{"Reference":{"Numeric":{"Unsigned":{"bit_size":32}}}}}},{"NumericConstant":{"constant":"0000000000000000000000000000000000000000000000000000000000000001","typ":{"Numeric":"NativeField"}}},{"Instruction":{"instruction":{"index":4},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":5},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":6},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":1}}}}},{"Instruction":{"instruction":{"index":7},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}},{"Instruction":{"instruction":{"index":9},"position":0,"typ":{"Numeric":{"Unsigned":{"bit_size":32}}}}}]},"blocks":{"storage":[{"parameters":[{"index":0}],"instructions":[{"index":0},{"index":1},{"index":2},{"index":3},{"index":4},{"index":5},{"index":6}],"terminator":{"JmpIf":{"condition":{"index":9},"then_destination":{"index":1},"else_destination":{"index":2},"call_stack":[{"span":{"start":108,"end":131},"file":70}]}}},{"parameters":[],"instructions":[{"index":7},{"index":8}],"terminator":{"Jmp":{"destination":{"index":2},"arguments":[],"call_stack":[{"span":{"start":160,"end":170},"file":70}]}}},{"parameters":[],"instructions":[{"index":9},{"index":10}],"terminator":{"Return":{"return_values":[{"index":11}],"call_stack":[{"span":{"start":160,"end":170},"file":70}]}}}]}}}]],"main_id":{"index":0}} - "#).unwrap(); + let type_u32 = Type::Numeric(NumericType::Unsigned { bit_size: 32 }); + let type_u1 = Type::Numeric(NumericType::Unsigned { bit_size: 1 }); + + let main_id = Id::test_new(0); + let mut builder = FunctionBuilder::new("main".into(), main_id); + + let zero = builder.numeric_constant(0u32, type_u32.clone()); + let one = builder.numeric_constant(1u32, type_u32.clone()); + + let bool_false = builder.numeric_constant(0u32, type_u1.clone()); + let bool_true = builder.numeric_constant(1u32, type_u1.clone()); + + let v0 = builder.add_parameter(Type::Array(Arc::new(vec![type_u32.clone()]), 2)); + let v1 = builder.add_parameter(Type::Array(Arc::new(vec![type_u32.clone()]), 2)); + let v2 = builder.add_parameter(type_u32.clone()); + + builder.insert_inc_rc(v0); + builder.insert_inc_rc(v1); + + let br_function_id = Id::test_new(1); + let br_function = builder.import_function(br_function_id); + + let v4 = builder.insert_call(br_function, vec![v0], vec![type_u32.clone()])[0]; + let v6 = builder.insert_allocate(type_u32.clone()); + builder.insert_store(v6, bool_false); + let v7 = builder.insert_load(v6, type_u1.clone()); + let v11 = builder.insert_array_get(v0, zero, type_u32.clone()); + let v12 = builder.insert_binary(v11, BinaryOp::Eq, v4); + let v13 = builder.insert_binary(v7, BinaryOp::Or, v12); + + builder.insert_store(v6, v13); + let v14 = builder.insert_load(v6, type_u1.clone()); + let v16 = builder.insert_array_get(v0, one, type_u32.clone()); + let v17 = builder.insert_binary(v16, BinaryOp::Eq, v4); + let v18 = builder.insert_binary(v14, BinaryOp::Or, v17); + + builder.insert_store(v6, v18); + let v19 = builder.insert_load(v6, type_u1.clone()); + + builder.insert_constrain(v19, bool_true, None); + + let v22 = builder.insert_call(br_function, vec![v1], vec![type_u32.clone()])[0]; + let v23 = builder.insert_binary(v4, BinaryOp::Add, v22); + let _v24 = builder.insert_binary(v2, BinaryOp::Eq, v23); + + builder.insert_constrain(v2, v23, None); + + builder.insert_dec_rc(v0); + builder.insert_dec_rc(v1); + + builder.terminate_with_return(vec![]); + + // We're faking the brillig function here, for simplicity's sake + + builder.new_brillig_function("maximum_price".into(), br_function_id, InlineType::default()); + let v0 = builder.add_parameter(Type::Array(Arc::new(vec![type_u32.clone()]), 2)); + let zero = builder.numeric_constant(0u32, type_u32.clone()); + + let v1 = builder.insert_array_get(v0, zero, type_u32); + builder.terminate_with_return(vec![v1]); + + let mut ssa = builder.finish(); let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); assert_eq!(ssa_level_warnings.len(), 1); } From 835571b3985d8c89d13df92b02f0ce2611991f03 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 7 Nov 2024 17:53:18 +0300 Subject: [PATCH 10/73] Add 5425 test into test_programs --- .../Nargo.toml | 7 ++++ .../src/main.nr | 34 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 test_programs/compile_success_with_bug/underconstrained_value_detector_5425/Nargo.toml create mode 100644 test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr diff --git a/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/Nargo.toml b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/Nargo.toml new file mode 100644 index 00000000000..48ab5a0390b --- /dev/null +++ b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "underconstrained_value_detector_5425" +type = "bin" +authors = [""] +compiler_version = ">=0.36.0" + +[dependencies] \ No newline at end of file diff --git a/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr new file mode 100644 index 00000000000..859d699a303 --- /dev/null +++ b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr @@ -0,0 +1,34 @@ +unconstrained fn maximum_price(options: [u32; 3]) -> u32 { + let mut maximum_option= 0; + for option in options { + if (option > maximum_option) { + maximum_option=option; + } + } + maximum_option +} + +fn main(sandwiches: pub [u32; 3], drinks: pub [u32; 3], snacks: pub [u32; 3], best_value: u32) { + let meal_deal_cost:u32= 390; + let most_expensive_sandwich= maximum_price(sandwiches); + let mut sandwich_exists= false; + for sandwich_price in sandwiches { + assert(sandwich_price <= most_expensive_sandwich); + sandwich_exists|=sandwich_price==most_expensive_sandwich; + } + assert(sandwich_exists); + + let most_expensive_drink= maximum_price(drinks); + let mut drink_exists= false; + for drink_price in drinks { + assert(drink_price <= most_expensive_drink); + drink_exists|=drink_price==most_expensive_drink; + } + assert(drink_exists); + + let most_expensive_snack= maximum_price(snacks); + assert( + best_value + == (most_expensive_sandwich + most_expensive_drink + most_expensive_snack - meal_deal_cost) + ); +} From f3e50ec46f3b817caa045ad2374df32255ac123a Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 7 Nov 2024 17:57:13 +0300 Subject: [PATCH 11/73] Add missing brillig constrain check into ssa.rs --- compiler/noirc_evaluator/src/ssa.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa.rs b/compiler/noirc_evaluator/src/ssa.rs index 0c4e42f09ef..18f92ea79e0 100644 --- a/compiler/noirc_evaluator/src/ssa.rs +++ b/compiler/noirc_evaluator/src/ssa.rs @@ -129,12 +129,19 @@ pub(crate) fn optimize_into_acir( .run_pass(Ssa::array_set_optimization, "After Array Set Optimizations:") .finish(); - let ssa_level_warnings = if options.skip_underconstrained_check { - vec![] - } else { - time("After Check for Underconstrained Values", options.print_codegen_timings, || { - ssa.check_for_underconstrained_values() - }) + let mut ssa_level_warnings = vec![]; + + if !options.skip_underconstrained_check { + ssa_level_warnings.extend(time( + "After Check for Underconstrained Values", + options.print_codegen_timings, + || ssa.check_for_underconstrained_values(), + )); + ssa_level_warnings.extend(time( + "After Check for Missing Brillig Constrains", + options.print_codegen_timings, + || ssa.check_for_missing_brillig_constrains(), + )); }; drop(ssa_gen_span_guard); From 0b1bcf8cb095a03fd495afea160e7b8a6103617e Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Fri, 8 Nov 2024 18:38:03 +0300 Subject: [PATCH 12/73] Add skip check compiler option --- compiler/noirc_driver/src/lib.rs | 7 +++++++ compiler/noirc_evaluator/src/ssa.rs | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/compiler/noirc_driver/src/lib.rs b/compiler/noirc_driver/src/lib.rs index d10029d81e6..f5a1299888e 100644 --- a/compiler/noirc_driver/src/lib.rs +++ b/compiler/noirc_driver/src/lib.rs @@ -126,6 +126,12 @@ pub struct CompileOptions { #[arg(long)] pub skip_underconstrained_check: bool, + /// Flag to turn off the compiler check for missing brilling call constrains. + /// Warning: This can improve compilation speed but can also lead to correctness errors. + /// This check should always be run on production code. + #[arg(long)] + pub skip_missing_brillig_constrains_check: bool, + /// Setting to decide on an inlining strategy for brillig functions. /// A more aggressive inliner should generate larger programs but more optimized /// A less aggressive inliner should generate smaller programs @@ -588,6 +594,7 @@ pub fn compile_no_check( }, emit_ssa: if options.emit_ssa { Some(context.package_build_path.clone()) } else { None }, skip_underconstrained_check: options.skip_underconstrained_check, + skip_missing_brillig_constrains_check: options.skip_missing_brillig_constrains_check, inliner_aggressiveness: options.inliner_aggressiveness, }; diff --git a/compiler/noirc_evaluator/src/ssa.rs b/compiler/noirc_evaluator/src/ssa.rs index 18f92ea79e0..4bf1e1a7722 100644 --- a/compiler/noirc_evaluator/src/ssa.rs +++ b/compiler/noirc_evaluator/src/ssa.rs @@ -68,6 +68,9 @@ pub struct SsaEvaluatorOptions { /// Skip the check for under constrained values pub skip_underconstrained_check: bool, + /// Skip the missing brillig call constrains check + pub skip_missing_brillig_constrains_check: bool, + /// The higher the value, the more inlined brillig functions will be. pub inliner_aggressiveness: i64, } @@ -137,8 +140,11 @@ pub(crate) fn optimize_into_acir( options.print_codegen_timings, || ssa.check_for_underconstrained_values(), )); + } + + if !options.skip_missing_brillig_constrains_check { ssa_level_warnings.extend(time( - "After Check for Missing Brillig Constrains", + "After Check for Missing Brillig Call Constrains", options.print_codegen_timings, || ssa.check_for_missing_brillig_constrains(), )); From 93eb1940efba22e287482b483fad1649285201b1 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Tue, 12 Nov 2024 21:42:37 +0300 Subject: [PATCH 13/73] nargo fmt test program --- .../src/main.nr | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr index 859d699a303..feaf907a480 100644 --- a/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr +++ b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr @@ -1,34 +1,37 @@ unconstrained fn maximum_price(options: [u32; 3]) -> u32 { - let mut maximum_option= 0; + let mut maximum_option = 0; for option in options { if (option > maximum_option) { - maximum_option=option; + maximum_option = option; } } maximum_option } fn main(sandwiches: pub [u32; 3], drinks: pub [u32; 3], snacks: pub [u32; 3], best_value: u32) { - let meal_deal_cost:u32= 390; - let most_expensive_sandwich= maximum_price(sandwiches); - let mut sandwich_exists= false; + let meal_deal_cost: u32 = 390; + let most_expensive_sandwich = maximum_price(sandwiches); + let mut sandwich_exists = false; for sandwich_price in sandwiches { assert(sandwich_price <= most_expensive_sandwich); - sandwich_exists|=sandwich_price==most_expensive_sandwich; + sandwich_exists |= sandwich_price == most_expensive_sandwich; } assert(sandwich_exists); - let most_expensive_drink= maximum_price(drinks); - let mut drink_exists= false; + let most_expensive_drink = maximum_price(drinks); + let mut drink_exists = false; for drink_price in drinks { assert(drink_price <= most_expensive_drink); - drink_exists|=drink_price==most_expensive_drink; + drink_exists |= drink_price == most_expensive_drink; } assert(drink_exists); - let most_expensive_snack= maximum_price(snacks); + let most_expensive_snack = maximum_price(snacks); assert( best_value - == (most_expensive_sandwich + most_expensive_drink + most_expensive_snack - meal_deal_cost) + == ( + most_expensive_sandwich + most_expensive_drink + most_expensive_snack + - meal_deal_cost + ), ); } From b70a4dbce71966c9e5408fa758d61caab399bd0b Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Tue, 12 Nov 2024 21:48:49 +0300 Subject: [PATCH 14/73] Add multiple results brillig check, fix ancestor walk --- .../check_for_underconstrained_values.rs | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index e358b70f159..fcbb86af1e4 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -211,6 +211,7 @@ impl DependencyContext { for constrained_values in &self.constrained_values { let constrain_ancestors: HashSet<_> = constrained_values.iter().flat_map(|v| self.collect_ancestors(*v)).collect(); + trace!("checking constrain involving values {:?}", constrain_ancestors); for (brillig_call, brillig_values) in &self.brillig_values { // If there is at least one value among the brillig call arguments // along with all the results featuring in the constrain value ancestors, @@ -247,7 +248,7 @@ impl DependencyContext { /// Build a set of all ValueIds the given ValueId descends from fn collect_ancestors(&self, value_id: ValueId) -> HashSet { let mut to_visit = vec![value_id]; - let mut ancestors = HashSet::new(); + let mut ancestors = HashSet::from([value_id]); while let Some(value_id) = to_visit.pop() { if let Some(values) = self.value_parents.get(&value_id) { to_visit.extend(values); @@ -638,7 +639,7 @@ mod test { #[test] #[traced_test] - /// Test where the results of a call to a brillig function are left unchecked with a later assert, + /// Test where a call to a brillig function is left unchecked with a later assert, /// by example of the program illustrating issue #5425 (simplified). fn test_underconstrained_value_detector_5425() { /* @@ -736,7 +737,6 @@ mod test { let v22 = builder.insert_call(br_function, vec![v1], vec![type_u32.clone()])[0]; let v23 = builder.insert_binary(v4, BinaryOp::Add, v22); - let _v24 = builder.insert_binary(v2, BinaryOp::Eq, v23); builder.insert_constrain(v2, v23, None); @@ -758,4 +758,49 @@ mod test { let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); assert_eq!(ssa_level_warnings.len(), 1); } + + #[test] + #[traced_test] + /// Test where a call to a brillig function returning multiple result values + /// is left unchecked with a later assert involving all the results + fn test_unchecked_multiple_results_brillig() { + let type_u32 = Type::Numeric(NumericType::Unsigned { bit_size: 32 }); + + let main_id = Id::test_new(0); + let mut builder = FunctionBuilder::new("main".into(), main_id); + + let v0 = builder.add_parameter(type_u32.clone()); + + let br_function_id = Id::test_new(1); + let br_function = builder.import_function(br_function_id); + + // First call is constrained properly, involving both results + let call_results = + builder.insert_call(br_function, vec![v0], vec![type_u32.clone(), type_u32.clone()]); + let (v6, v7) = (call_results[0], call_results[1]); + let v8 = builder.insert_binary(v6, BinaryOp::Mul, v7); + builder.insert_constrain(v8, v0, None); + + // Second call is insufficiently constrained, involving only one of the results + let call_results = + builder.insert_call(br_function, vec![v0], vec![type_u32.clone(), type_u32.clone()]); + let (v9, _) = (call_results[0], call_results[1]); + let v11 = builder.insert_binary(v9, BinaryOp::Mul, v9); + builder.insert_constrain(v11, v0, None); + + builder.terminate_with_return(vec![]); + + // We're faking the brillig function here, for simplicity's sake + + builder.new_brillig_function("factor".into(), br_function_id, InlineType::default()); + let v0 = builder.add_parameter(type_u32.clone()); + let zero = builder.numeric_constant(0u32, type_u32.clone()); + + builder.terminate_with_return(vec![zero, zero]); + + let mut ssa = builder.finish(); + + let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); + assert_eq!(ssa_level_warnings.len(), 1); + } } From a796e2ea914699e53502bd893bb33f46bc1fbe1b Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Wed, 13 Nov 2024 21:33:38 +0300 Subject: [PATCH 15/73] Clean up --- .../src/ssa/checks/check_for_underconstrained_values.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index fcbb86af1e4..2ab214f59c9 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -793,7 +793,7 @@ mod test { // We're faking the brillig function here, for simplicity's sake builder.new_brillig_function("factor".into(), br_function_id, InlineType::default()); - let v0 = builder.add_parameter(type_u32.clone()); + builder.add_parameter(type_u32.clone()); let zero = builder.numeric_constant(0u32, type_u32.clone()); builder.terminate_with_return(vec![zero, zero]); From 1dfb9b2bf334a80c31964de60d38607b76c8f858 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 14 Nov 2024 00:37:49 +0300 Subject: [PATCH 16/73] Fix possible parent loops, skip covered brillig calls --- .../ssa/checks/check_for_underconstrained_values.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 2ab214f59c9..5304bfd75bb 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -213,6 +213,9 @@ impl DependencyContext { constrained_values.iter().flat_map(|v| self.collect_ancestors(*v)).collect(); trace!("checking constrain involving values {:?}", constrain_ancestors); for (brillig_call, brillig_values) in &self.brillig_values { + if covered_brillig_calls.contains(brillig_call) { + continue; + } // If there is at least one value among the brillig call arguments // along with all the results featuring in the constrain value ancestors, // consider the call properly covered @@ -248,10 +251,16 @@ impl DependencyContext { /// Build a set of all ValueIds the given ValueId descends from fn collect_ancestors(&self, value_id: ValueId) -> HashSet { let mut to_visit = vec![value_id]; + let mut visited = HashSet::new(); let mut ancestors = HashSet::from([value_id]); while let Some(value_id) = to_visit.pop() { + visited.insert(value_id); if let Some(values) = self.value_parents.get(&value_id) { - to_visit.extend(values); + for value in values { + if !visited.contains(value) { + to_visit.push(*value); + } + } ancestors.extend(values); } } From a5b7aa8e3035d63f1226090e2006e9850211d5ca Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 14 Nov 2024 16:39:30 +0300 Subject: [PATCH 17/73] Optimize --- .../ssa/checks/check_for_underconstrained_values.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 5304bfd75bb..8df9d825183 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -207,6 +207,11 @@ impl DependencyContext { /// Check if the constrained values can be traced back to brillig calls. /// For every brillig call not properly constrained, emit a corresponding warning. fn collect_warnings(&mut self, function: &Function) -> Vec { + // the check is unneeded if there are no brillig calls + if self.brillig_values.is_empty() { + return vec![]; + } + let mut covered_brillig_calls: HashSet = HashSet::new(); for constrained_values in &self.constrained_values { let constrain_ancestors: HashSet<_> = @@ -230,6 +235,11 @@ impl DependencyContext { covered_brillig_calls.insert(*brillig_call); } } + + // stop checking if all the brillig calls are already found covered + if covered_brillig_calls.len() == self.brillig_values.len() { + break; + } } // For each unchecked brillig call, emit a warning @@ -251,6 +261,8 @@ impl DependencyContext { /// Build a set of all ValueIds the given ValueId descends from fn collect_ancestors(&self, value_id: ValueId) -> HashSet { let mut to_visit = vec![value_id]; + // loops are possible judging by testing on noir-contracts, + // so don't revisit nodes let mut visited = HashSet::new(); let mut ancestors = HashSet::from([value_id]); while let Some(value_id) = to_visit.pop() { From c9635f51671f1228c60634124b7a06979b5752cc Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 14 Nov 2024 17:35:20 +0300 Subject: [PATCH 18/73] Reverse order of checking constrains --- .../src/ssa/checks/check_for_underconstrained_values.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 8df9d825183..2174dfca447 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -213,7 +213,9 @@ impl DependencyContext { } let mut covered_brillig_calls: HashSet = HashSet::new(); - for constrained_values in &self.constrained_values { + + // reverse order of constrains to check the ones with fewest ancestors first + for constrained_values in self.constrained_values.iter().rev() { let constrain_ancestors: HashSet<_> = constrained_values.iter().flat_map(|v| self.collect_ancestors(*v)).collect(); trace!("checking constrain involving values {:?}", constrain_ancestors); From 2c42c519820fe2240479c9d4d1dc8b691901b467 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Fri, 15 Nov 2024 14:06:56 +0300 Subject: [PATCH 19/73] WIP --- .../check_for_underconstrained_values.rs | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 2174dfca447..5de352563f1 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -97,6 +97,26 @@ struct DependencyContext { constrained_values: Vec>, // Map of brillig call ids to sets of their arguments and results brillig_values: HashMap, HashSet)>, + tainted: HashMap, +} + +#[derive(Clone)] +struct BrilligTaintedIds { + arguments: HashSet, + results: Vec>, +} + +impl BrilligTaintedIds { + fn mark_child(&mut self, parent: &ValueId, child: ValueId) { + if self.arguments.contains(parent) { + self.arguments.insert(child); + } + for result in &mut self.results { + if result.contains(parent) { + result.insert(child); + } + } + } } impl DependencyContext { @@ -133,7 +153,7 @@ impl DependencyContext { } }); - // Assign parent arguments to non-constant results + // Collect non-constant instruction results for value_id in function.dfg.instruction_results(*instruction).iter() { if function.dfg.get_numeric_constant(*value_id).is_none() { results.push(function.dfg.resolve(*value_id)); @@ -168,13 +188,21 @@ impl DependencyContext { if let Value::Function(callee) = &function.dfg[*func_id] { if let RuntimeType::Brillig(_) = all_functions[&callee].runtime() { trace!("brillig function {} called at {}", callee, instruction); + self.tainted.insert( + *instruction, + BrilligTaintedIds { + arguments: HashSet::from_iter(arguments.clone()), + results: results.iter().map(|v| HashSet::from([*v])).collect(), + } + ); + self.brillig_values.insert( *instruction, ( HashSet::from_iter(arguments.clone()), HashSet::from_iter(results), ), - ); + ); } } } From 5d7520f562672af6d263aeb5e4cfedc1cc948e1b Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Fri, 15 Nov 2024 14:34:19 +0300 Subject: [PATCH 20/73] Process more cases --- .../check_for_underconstrained_values.rs | 79 ++++++++++++++++--- 1 file changed, 67 insertions(+), 12 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 2174dfca447..98444fa4e6e 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -163,17 +163,73 @@ impl DependencyContext { Instruction::Constrain(value1, value2, _) => { self.constrained_values.push(vec![*value1, *value2]); } - // Record arguments/results for each brillig call for the check + // Consider range check to also be constraining + Instruction::RangeCheck { value, .. } => { + self.constrained_values.push(vec![*value]); + } Instruction::Call { func: func_id, arguments } => { - if let Value::Function(callee) = &function.dfg[*func_id] { - if let RuntimeType::Brillig(_) = all_functions[&callee].runtime() { - trace!("brillig function {} called at {}", callee, instruction); - self.brillig_values.insert( - *instruction, - ( - HashSet::from_iter(arguments.clone()), - HashSet::from_iter(results), - ), + match &function.dfg[*func_id] { + Value::Intrinsic(intrinsic) => match intrinsic { + Intrinsic::ApplyRangeConstraint | Intrinsic::AssertConstant => { + // Consider these intrinsic arguments constrained + self.constrained_values.push(arguments.clone()); + } + Intrinsic::AsWitness | Intrinsic::IsUnconstrained => { + // These intrinsics won't affect the dependency graph + } + Intrinsic::ArrayLen + | Intrinsic::ArrayAsStrUnchecked + | Intrinsic::AsField + | Intrinsic::AsSlice + | Intrinsic::BlackBox(..) + | Intrinsic::DerivePedersenGenerators + | Intrinsic::FromField + | Intrinsic::SlicePushBack + | Intrinsic::SlicePushFront + | Intrinsic::SlicePopBack + | Intrinsic::SlicePopFront + | Intrinsic::SliceInsert + | Intrinsic::SliceRemove + | Intrinsic::StaticAssert + | Intrinsic::StrAsBytes + | Intrinsic::ToBits(..) + | Intrinsic::ToRadix(..) + | Intrinsic::FieldLessThan => { + // Record all the function arguments as parents of the results + for result in results { + self.value_parents.entry(result).or_default().extend(arguments); + } + } + }, + Value::Function(callee) => match all_functions[&callee].runtime() { + RuntimeType::Brillig(_) => { + // Record arguments/results for each brillig call for the check + trace!("brillig function {} called at {}", callee, instruction); + self.brillig_values.insert( + *instruction, + ( + HashSet::from_iter(arguments.clone()), + HashSet::from_iter(results), + ), + ); + } + RuntimeType::Acir(..) => { + // Record all the function arguments as parents of the results + for result in results { + self.value_parents.entry(result).or_default().extend(arguments); + } + } + }, + Value::ForeignFunction(..) => { + debug!("should not be able to reach foreign function from non-brillig functions, {func_id} in function {}", function.name()); + } + Value::Array { .. } + | Value::Instruction { .. } + | Value::NumericConstant { .. } + | Value::Param { .. } => { + debug!( + "should not be able to call {func_id} in function {}", + function.name() ); } } @@ -194,8 +250,7 @@ impl DependencyContext { Instruction::Allocate { .. } | Instruction::DecrementRc { .. } | Instruction::EnableSideEffectsIf { .. } - | Instruction::IncrementRc { .. } - | Instruction::RangeCheck { .. } => {} + | Instruction::IncrementRc { .. } => {} } } From 610007dd819ddf994703af662ac44239ee75feff Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Fri, 15 Nov 2024 16:34:18 +0300 Subject: [PATCH 21/73] Resolve all value ids --- Cargo.lock | 22 +++++++++ .../check_for_underconstrained_values.rs | 13 +++--- .../src/main.nr | 45 ++++++------------- 3 files changed, 44 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 35ff97f55e3..f6ec81f0a1a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3142,6 +3142,7 @@ dependencies = [ "similar-asserts", "thiserror", "tracing", + "tracing-test", ] [[package]] @@ -5053,6 +5054,27 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tracing-test" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "557b891436fe0d5e0e363427fc7f217abf9ccd510d5136549847bdcbcd011d68" +dependencies = [ + "tracing-core", + "tracing-subscriber", + "tracing-test-macro", +] + +[[package]] +name = "tracing-test-macro" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" +dependencies = [ + "quote", + "syn 2.0.87", +] + [[package]] name = "tracing-web" version = "0.1.3" diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 98444fa4e6e..47f29775104 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -145,13 +145,14 @@ impl DependencyContext { // For memory operations, we have to link up the stored value as a parent // of one loaded from the same memory slot Instruction::Store { address, value } => { - self.memory_slots.insert(*address, *value); + self.memory_slots.insert(*address, function.dfg.resolve(*value)); } Instruction::Load { address } => { // Remember the value stored at address as parent for the results if let Some(value_id) = self.memory_slots.get(address) { for result in results { - self.value_parents.entry(result).or_default().push(*value_id); + self.value_parents.entry(result).or_default() + .push(function.dfg.resolve(*value_id)); } } else { debug!("load instruction {} has attempted to access previously unused memory location, skipping", @@ -160,12 +161,14 @@ impl DependencyContext { } // Record the constrain instruction arguments to check them against those // involved in brillig calls - Instruction::Constrain(value1, value2, _) => { - self.constrained_values.push(vec![*value1, *value2]); + Instruction::Constrain(value_id1, value_id2, _) => { + self.constrained_values.push(vec![ + function.dfg.resolve(*value_id1), + function.dfg.resolve(*value_id2)]); } // Consider range check to also be constraining Instruction::RangeCheck { value, .. } => { - self.constrained_values.push(vec![*value]); + self.constrained_values.push(vec![function.dfg.resolve(*value)]); } Instruction::Call { func: func_id, arguments } => { match &function.dfg[*func_id] { diff --git a/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr index feaf907a480..f1d71e806c1 100644 --- a/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr +++ b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr @@ -1,37 +1,20 @@ -unconstrained fn maximum_price(options: [u32; 3]) -> u32 { - let mut maximum_option = 0; - for option in options { - if (option > maximum_option) { - maximum_option = option; - } - } - maximum_option +pub global TWO_POW_128: Field = 0x100000000000000000000000000000000; + +unconstrained fn decompose_hint(x: Field) -> (Field, Field) { + (0, 0) } -fn main(sandwiches: pub [u32; 3], drinks: pub [u32; 3], snacks: pub [u32; 3], best_value: u32) { - let meal_deal_cost: u32 = 390; - let most_expensive_sandwich = maximum_price(sandwiches); - let mut sandwich_exists = false; - for sandwich_price in sandwiches { - assert(sandwich_price <= most_expensive_sandwich); - sandwich_exists |= sandwich_price == most_expensive_sandwich; - } - assert(sandwich_exists); +fn decompose(x: Field) -> (Field, Field) { + unsafe { + let (xlo, xhi) = decompose_hint(x); - let most_expensive_drink = maximum_price(drinks); - let mut drink_exists = false; - for drink_price in drinks { - assert(drink_price <= most_expensive_drink); - drink_exists |= drink_price == most_expensive_drink; + xlo.assert_max_bit_size::<128>(); + xhi.assert_max_bit_size::<128>(); + //assert_eq(x, xlo + TWO_POW_128 * xhi); + (xlo, xhi) } - assert(drink_exists); +} - let most_expensive_snack = maximum_price(snacks); - assert( - best_value - == ( - most_expensive_sandwich + most_expensive_drink + most_expensive_snack - - meal_deal_cost - ), - ); +pub fn main(x: Field) -> pub (Field, Field) { + decompose(x) } From 257895813c7cf8929d45fa4d6481c08033651066 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Fri, 15 Nov 2024 16:38:52 +0300 Subject: [PATCH 22/73] Restore proper 5425 main --- .../src/main.nr | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr index f1d71e806c1..feaf907a480 100644 --- a/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr +++ b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr @@ -1,20 +1,37 @@ -pub global TWO_POW_128: Field = 0x100000000000000000000000000000000; - -unconstrained fn decompose_hint(x: Field) -> (Field, Field) { - (0, 0) +unconstrained fn maximum_price(options: [u32; 3]) -> u32 { + let mut maximum_option = 0; + for option in options { + if (option > maximum_option) { + maximum_option = option; + } + } + maximum_option } -fn decompose(x: Field) -> (Field, Field) { - unsafe { - let (xlo, xhi) = decompose_hint(x); +fn main(sandwiches: pub [u32; 3], drinks: pub [u32; 3], snacks: pub [u32; 3], best_value: u32) { + let meal_deal_cost: u32 = 390; + let most_expensive_sandwich = maximum_price(sandwiches); + let mut sandwich_exists = false; + for sandwich_price in sandwiches { + assert(sandwich_price <= most_expensive_sandwich); + sandwich_exists |= sandwich_price == most_expensive_sandwich; + } + assert(sandwich_exists); - xlo.assert_max_bit_size::<128>(); - xhi.assert_max_bit_size::<128>(); - //assert_eq(x, xlo + TWO_POW_128 * xhi); - (xlo, xhi) + let most_expensive_drink = maximum_price(drinks); + let mut drink_exists = false; + for drink_price in drinks { + assert(drink_price <= most_expensive_drink); + drink_exists |= drink_price == most_expensive_drink; } -} + assert(drink_exists); -pub fn main(x: Field) -> pub (Field, Field) { - decompose(x) + let most_expensive_snack = maximum_price(snacks); + assert( + best_value + == ( + most_expensive_sandwich + most_expensive_drink + most_expensive_snack + - meal_deal_cost + ), + ); } From cf031bbdd108bcaba107668f37d4f3ee4a632403 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Sat, 16 Nov 2024 00:04:08 +0300 Subject: [PATCH 23/73] Don't check brillig arguments intersection if there are none --- Cargo.lock | 5731 ----------------- .../check_for_underconstrained_values.rs | 32 +- 2 files changed, 24 insertions(+), 5739 deletions(-) delete mode 100644 Cargo.lock diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index f6ec81f0a1a..00000000000 --- a/Cargo.lock +++ /dev/null @@ -1,5731 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "acir" -version = "0.54.0" -dependencies = [ - "acir_field", - "base64 0.21.7", - "bincode", - "brillig", - "criterion", - "flate2", - "fxhash", - "pprof 0.13.0", - "serde", - "serde-big-array", - "serde-generate", - "serde-reflection", - "serde_json", - "strum", - "strum_macros", - "thiserror", -] - -[[package]] -name = "acir_field" -version = "0.54.0" -dependencies = [ - "ark-bls12-381", - "ark-bn254", - "ark-ff", - "cfg-if 1.0.0", - "hex", - "num-bigint", - "proptest", - "serde", -] - -[[package]] -name = "acvm" -version = "0.54.0" -dependencies = [ - "acir", - "acvm_blackbox_solver", - "ark-bls12-381", - "ark-bn254", - "bn254_blackbox_solver", - "brillig_vm", - "indexmap 1.9.3", - "num-bigint", - "proptest", - "serde", - "thiserror", - "tracing", - "zkhash", -] - -[[package]] -name = "acvm_blackbox_solver" -version = "0.54.0" -dependencies = [ - "acir", - "blake2", - "blake3", - "k256", - "keccak", - "libaes", - "num-bigint", - "p256", - "proptest", - "sha2", - "thiserror", -] - -[[package]] -name = "acvm_cli" -version = "0.40.0" -dependencies = [ - "acir", - "acvm", - "bn254_blackbox_solver", - "clap", - "color-eyre", - "const_format", - "nargo", - "paste", - "proptest", - "rand 0.8.5", - "thiserror", - "toml 0.7.8", - "tracing-appender", - "tracing-subscriber", -] - -[[package]] -name = "acvm_js" -version = "0.54.0" -dependencies = [ - "acvm", - "bn254_blackbox_solver", - "build-data", - "console_error_panic_hook", - "const-str", - "getrandom 0.2.15", - "gloo-utils", - "js-sys", - "pkg-config", - "serde", - "tracing-subscriber", - "tracing-web", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test", -] - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if 1.0.0", - "getrandom 0.2.15", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anes" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" - -[[package]] -name = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" -dependencies = [ - "anstyle", - "windows-sys 0.59.0", -] - -[[package]] -name = "anyhow" -version = "1.0.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" - -[[package]] -name = "ark-bls12-381" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", -] - -[[package]] -name = "ark-bn254" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", -] - -[[package]] -name = "ark-ec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" -dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", - "itertools", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "derivative", - "digest", - "itertools", - "num-bigint", - "num-traits", - "paste", - "rustc_version", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-poly" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" -dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-serialize-derive", - "ark-std", - "digest", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "assert_cmd" -version = "2.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1835b7f27878de8525dc71410b5a31cdcc5f230aed5ba5df968e09c201b23d" -dependencies = [ - "anstyle", - "bstr", - "doc-comment", - "libc", - "predicates 3.1.2", - "predicates-core", - "predicates-tree", - "wait-timeout", -] - -[[package]] -name = "assert_fs" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7efdb1fdb47602827a342857666feb372712cbc64b414172bd6b167a02927674" -dependencies = [ - "anstyle", - "doc-comment", - "globwalk", - "predicates 3.1.2", - "predicates-core", - "predicates-tree", - "tempfile", -] - -[[package]] -name = "async-lsp" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138985dd8aefbefeaa66b01b7f5b2b6b4c333fcef1cc5f32c63a2aabe37d6de3" -dependencies = [ - "futures 0.3.31", - "lsp-types 0.94.1", - "pin-project-lite", - "rustix", - "serde", - "serde_json", - "thiserror", - "tokio", - "tower-layer", - "tower-service", - "tracing", - "waitpid-any", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide 0.7.4", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest", -] - -[[package]] -name = "blake2b_simd" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - -[[package]] -name = "blake3" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if 1.0.0", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bls12_381" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" -dependencies = [ - "ff 0.12.1", - "group 0.12.1", - "pairing", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "bn254_blackbox_solver" -version = "0.54.0" -dependencies = [ - "acir", - "acvm_blackbox_solver", - "ark-bn254", - "ark-ec", - "ark-ff", - "ark-std", - "criterion", - "hex", - "lazy_static", - "noir_grumpkin", - "num-bigint", - "pprof 0.12.1", -] - -[[package]] -name = "brillig" -version = "0.54.0" -dependencies = [ - "acir_field", - "serde", -] - -[[package]] -name = "brillig_vm" -version = "0.54.0" -dependencies = [ - "acir", - "acvm_blackbox_solver", - "num-bigint", - "num-traits", - "thiserror", -] - -[[package]] -name = "bstr" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" -dependencies = [ - "memchr", - "regex-automata 0.4.8", - "serde", -] - -[[package]] -name = "build-data" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aed3884e2cab7c973c8fd2d150314b6a932df7fdc830edcaf1e8e7c4ae9db3c0" -dependencies = [ - "chrono", - "safe-lock", - "safe-regex", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytemuck" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" - -[[package]] -name = "camino" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - -[[package]] -name = "cc" -version = "1.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baee610e9452a8f6f0a1b6194ec09ff9e2d85dea54432acdae41aa0761c95d70" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.6", -] - -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - -[[package]] -name = "clap" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap-markdown" -version = "0.1.3" -source = "git+https://github.com/noir-lang/clap-markdown?rev=450d759532c88f0dba70891ceecdbc9ff8f25d2b#450d759532c88f0dba70891ceecdbc9ff8f25d2b" -dependencies = [ - "clap", -] - -[[package]] -name = "clap_builder" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_complete" -version = "4.5.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11611dca53440593f38e6b25ec629de50b14cdfa63adc0fb856115a2c6d97595" -dependencies = [ - "clap", -] - -[[package]] -name = "clap_derive" -version = "4.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "clap_lex" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" - -[[package]] -name = "clipboard-win" -version = "4.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" -dependencies = [ - "error-code", - "str-buf", - "winapi", -] - -[[package]] -name = "codespan" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3362992a0d9f1dd7c3d0e89e0ab2bb540b7a95fea8cd798090e758fda2899b5e" -dependencies = [ - "codespan-reporting", - "serde", -] - -[[package]] -name = "codespan-lsp" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4159b76af02757139baf42c0c971c6dc155330999fbfd8eddb29b97fb2db68" -dependencies = [ - "codespan-reporting", - "lsp-types 0.88.0", - "url 2.5.3", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "serde", - "termcolor", - "unicode-width", -] - -[[package]] -name = "color-eyre" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" -dependencies = [ - "backtrace", - "color-spantrace", - "eyre", - "indenter", - "once_cell", - "owo-colors", - "tracing-error", -] - -[[package]] -name = "color-spantrace" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" -dependencies = [ - "once_cell", - "owo-colors", - "tracing-core", - "tracing-error", -] - -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - -[[package]] -name = "comma" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55b672471b4e9f9e95499ea597ff64941a309b2cdbffcc46f2cc5e2d971fd335" - -[[package]] -name = "console" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" -dependencies = [ - "encode_unicode 0.3.6", - "lazy_static", - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const-str" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3618cccc083bb987a415d85c02ca6c9994ea5b44731ec28b9ecf09658655fba9" - -[[package]] -name = "const_format" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpp_demangle" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "cpufeatures" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "criterion" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" -dependencies = [ - "anes", - "cast", - "ciborium", - "clap", - "criterion-plot", - "is-terminal", - "itertools", - "num-traits", - "once_cell", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "tinytemplate", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" -dependencies = [ - "cast", - "itertools", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "csv" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" -dependencies = [ - "memchr", -] - -[[package]] -name = "dap" -version = "0.4.1-alpha1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c7fc89d334ab745ba679f94c7314c9b17ecdcd923c111df6206e9fd7729fa9" -dependencies = [ - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "darling" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.87", -] - -[[package]] -name = "darling_macro" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core 0.9.10", -] - -[[package]] -name = "debugid" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" -dependencies = [ - "uuid", -] - -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "0.99.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" -dependencies = [ - "convert_case 0.4.0", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.87", -] - -[[package]] -name = "difflib" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if 1.0.0", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "easy-repl" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d0001ed25c451c57f8d6724d448a6546a5d78bbac77a63a22e32c735b7ea16" -dependencies = [ - "anyhow", - "rustyline", - "rustyline-derive", - "shell-words", - "textwrap 0.15.2", - "thiserror", - "trie-rs", -] - -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der", - "elliptic-curve", - "rfc6979", - "signature", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct", - "crypto-bigint", - "der", - "digest", - "ff 0.12.1", - "generic-array", - "group 0.12.1", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "endian-type" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" - -[[package]] -name = "env_filter" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" -dependencies = [ - "log", -] - -[[package]] -name = "env_logger" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" -dependencies = [ - "env_filter", - "log", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "error-code" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" -dependencies = [ - "libc", - "str-buf", -] - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" - -[[package]] -name = "fd-lock" -version = "3.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5" -dependencies = [ - "cfg-if 1.0.0", - "rustix", - "windows-sys 0.48.0", -] - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "bitvec", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "bitvec", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fid-rs" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28658c0c3420305705adde833a0d2d614207507d013a5f25707553fb2ae2cd" -dependencies = [ - "rayon", -] - -[[package]] -name = "file-id" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bc904b9bbefcadbd8e3a9fb0d464a9b979de6324c03b3c663e8994f46a5be36" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "libredox 0.1.3", - "windows-sys 0.59.0", -] - -[[package]] -name = "findshlibs" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b9e59cd0f7e0806cca4be089683ecb6434e602038df21fe6bf6711b2f07f64" -dependencies = [ - "cc", - "lazy_static", - "libc", - "winapi", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.0.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" -dependencies = [ - "crc32fast", - "miniz_oxide 0.8.0", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - -[[package]] -name = "fm" -version = "0.38.0" -dependencies = [ - "codespan-reporting", - "iter-extended", - "serde", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding 2.3.1", -] - -[[package]] -name = "fsevent-sys" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" -dependencies = [ - "libc", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", - "num_cpus", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures 0.1.31", - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "globset" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", -] - -[[package]] -name = "globwalk" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" -dependencies = [ - "bitflags 2.6.0", - "ignore", - "walkdir", -] - -[[package]] -name = "gloo-utils" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037fcb07216cb3a30f7292bd0176b050b7b9a052ba830ef7d5d65f6dc64ba58e" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "memuse", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff 0.13.0", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "half" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "cfg-if 1.0.0", - "crunchy", -] - -[[package]] -name = "halo2" -version = "0.1.0-beta.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a23c779b38253fe1538102da44ad5bd5378495a61d2c4ee18d64eaa61ae5995" -dependencies = [ - "halo2_proofs", -] - -[[package]] -name = "halo2_proofs" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e925780549adee8364c7f2b685c753f6f3df23bde520c67416e93bf615933760" -dependencies = [ - "blake2b_simd", - "ff 0.12.1", - "group 0.12.1", - "pasta_curves 0.4.1", - "rand_core 0.6.4", - "rayon", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "iai" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71a816c97c42258aa5834d07590b718b4c9a598944cd39a52dc25b351185d678" - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "ignore" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" -dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata 0.4.8", - "same-file", - "walkdir", - "winapi-util", -] - -[[package]] -name = "im" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" -dependencies = [ - "bitmaps", - "rand_core 0.6.4", - "rand_xoshiro", - "serde", - "sized-chunks", - "typenum", - "version_check", -] - -[[package]] -name = "include_dir" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b56e147e6187d61e9d0f039f10e070d0c0a887e24fe0bb9ca3f29bfde62cab" -dependencies = [ - "glob", - "include_dir_impl", - "proc-macro-hack", -] - -[[package]] -name = "include_dir_impl" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a0c890c85da4bab7bce4204c707396bbd3c6c8a681716a51c8814cfc2b682df" -dependencies = [ - "anyhow", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" -dependencies = [ - "equivalent", - "hashbrown 0.15.1", - "serde", -] - -[[package]] -name = "inferno" -version = "0.11.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" -dependencies = [ - "ahash", - "clap", - "crossbeam-channel", - "crossbeam-utils", - "dashmap", - "env_logger", - "indexmap 2.6.0", - "is-terminal", - "itoa", - "log", - "num-format", - "once_cell", - "quick-xml", - "rgb", - "str_stack", -] - -[[package]] -name = "inotify" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" -dependencies = [ - "bitflags 1.3.2", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "is-terminal" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" -dependencies = [ - "hermit-abi 0.4.0", - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "iter-extended" -version = "0.38.0" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonrpc" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34efde8d2422fb79ed56db1d3aea8fa5b583351d15a26770cdee2f88813dd702" -dependencies = [ - "base64 0.13.1", - "minreq", - "serde", - "serde_json", -] - -[[package]] -name = "jsonrpc-client-transports" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b99d4207e2a04fb4581746903c2bb7eb376f88de9c699d0f3e10feeac0cd3a" -dependencies = [ - "derive_more", - "futures 0.3.31", - "jsonrpc-core", - "jsonrpc-pubsub", - "log", - "serde", - "serde_json", - "url 1.7.2", -] - -[[package]] -name = "jsonrpc-core" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" -dependencies = [ - "futures 0.3.31", - "futures-executor", - "futures-util", - "log", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "jsonrpc-core-client" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b51da17abecbdab3e3d4f26b01c5ec075e88d3abe3ab3b05dc9aa69392764ec0" -dependencies = [ - "futures 0.3.31", - "jsonrpc-client-transports", -] - -[[package]] -name = "jsonrpc-derive" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "jsonrpc-http-server" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" -dependencies = [ - "futures 0.3.31", - "hyper", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "net2", - "parking_lot 0.11.2", - "unicase", -] - -[[package]] -name = "jsonrpc-pubsub" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240f87695e6c6f62fb37f05c02c04953cf68d6408b8c1c89de85c7a0125b1011" -dependencies = [ - "futures 0.3.31", - "jsonrpc-core", - "lazy_static", - "log", - "parking_lot 0.11.2", - "rand 0.7.3", - "serde", -] - -[[package]] -name = "jsonrpc-server-utils" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" -dependencies = [ - "bytes", - "futures 0.3.31", - "globset", - "jsonrpc-core", - "lazy_static", - "log", - "tokio", - "tokio-stream", - "tokio-util 0.6.10", - "unicase", -] - -[[package]] -name = "jubjub" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a575df5f985fe1cd5b2b05664ff6accfc46559032b954529fd225a2168d27b0f" -dependencies = [ - "bitvec", - "bls12_381", - "ff 0.12.1", - "group 0.12.1", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if 1.0.0", - "ecdsa", - "elliptic-curve", - "sha2", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "kqueue" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" -dependencies = [ - "kqueue-sys", - "libc", -] - -[[package]] -name = "kqueue-sys" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" -dependencies = [ - "bitflags 1.3.2", - "libc", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "libaes" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82903360c009b816f5ab72a9b68158c27c301ee2c3f20655b55c5e589e7d3bb7" - -[[package]] -name = "libc" -version = "0.2.162" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" - -[[package]] -name = "libm" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" - -[[package]] -name = "libredox" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" -dependencies = [ - "bitflags 2.6.0", - "libc", - "redox_syscall 0.4.1", -] - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.6.0", - "libc", - "redox_syscall 0.5.7", -] - -[[package]] -name = "light-poseidon" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" -dependencies = [ - "ark-bn254", - "ark-ff", - "num-bigint", - "thiserror", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "litemap" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "louds-rs" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16a91fb20f74b6d9a758a0103a2884af525a2fa34fbfe19f4b3c5482a4a54e9" -dependencies = [ - "fid-rs", -] - -[[package]] -name = "lsp-types" -version = "0.88.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e8e042772e4e10b3785822f63c82399d0dd233825de44d2596f7fa86e023e0" -dependencies = [ - "bitflags 1.3.2", - "serde", - "serde_json", - "serde_repr", - "url 2.5.3", -] - -[[package]] -name = "lsp-types" -version = "0.94.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66bfd44a06ae10647fe3f8214762e9369fd4248df1350924b4ef9e770a85ea1" -dependencies = [ - "bitflags 1.3.2", - "serde", - "serde_json", - "serde_repr", - "url 2.5.3", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memmap2" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memuse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2145869435ace5ea6ea3d35f59be559317ec9a0d04e1812d5f185a87b6d36f1a" - -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", -] - -[[package]] -name = "minreq" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763d142cdff44aaadd9268bebddb156ef6c65a0e13486bb81673cf2d8739f9b0" -dependencies = [ - "log", - "serde", - "serde_json", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - -[[package]] -name = "mio" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "nargo" -version = "0.38.0" -dependencies = [ - "acvm", - "fm", - "iter-extended", - "jsonrpc", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-http-server", - "noir_fuzzer", - "noirc_abi", - "noirc_driver", - "noirc_errors", - "noirc_frontend", - "noirc_printable_type", - "proptest", - "rand 0.8.5", - "rayon", - "serde", - "thiserror", - "tracing", - "walkdir", -] - -[[package]] -name = "nargo_cli" -version = "0.38.0" -dependencies = [ - "acvm", - "ark-bn254", - "assert_cmd", - "assert_fs", - "async-lsp", - "bn254_blackbox_solver", - "build-data", - "clap", - "clap-markdown", - "clap_complete", - "color-eyre", - "const_format", - "criterion", - "dap", - "dirs", - "fm", - "iai", - "iter-extended", - "lazy_static", - "light-poseidon", - "nargo", - "nargo_fmt", - "nargo_toml", - "noir_debugger", - "noir_lsp", - "noirc_abi", - "noirc_artifacts", - "noirc_driver", - "noirc_errors", - "noirc_frontend", - "notify", - "notify-debouncer-full", - "paste", - "pprof 0.13.0", - "predicates 2.1.5", - "prettytable-rs", - "proptest", - "rayon", - "serde", - "serde_json", - "sha2", - "sha3", - "similar-asserts", - "tempfile", - "termcolor", - "termion", - "test-binary", - "test-case", - "thiserror", - "tokio", - "tokio-util 0.7.12", - "toml 0.7.8", - "tower", - "tracing-appender", - "tracing-subscriber", -] - -[[package]] -name = "nargo_fmt" -version = "0.38.0" -dependencies = [ - "noirc_frontend", - "serde", - "similar-asserts", - "thiserror", - "toml 0.7.8", -] - -[[package]] -name = "nargo_toml" -version = "0.38.0" -dependencies = [ - "dirs", - "fm", - "nargo", - "noirc_driver", - "noirc_frontend", - "semver", - "serde", - "thiserror", - "toml 0.7.8", - "url 2.5.3", -] - -[[package]] -name = "net2" -version = "0.2.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi", -] - -[[package]] -name = "nibble_vec" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" -dependencies = [ - "smallvec", -] - -[[package]] -name = "nix" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" -dependencies = [ - "bitflags 1.3.2", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset", -] - -[[package]] -name = "nix" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if 1.0.0", - "libc", - "memoffset", - "pin-utils", -] - -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", - "libc", -] - -[[package]] -name = "noir_debugger" -version = "0.38.0" -dependencies = [ - "acvm", - "assert_cmd", - "build-data", - "codespan-reporting", - "dap", - "easy-repl", - "fm", - "nargo", - "noirc_artifacts", - "noirc_driver", - "noirc_errors", - "noirc_frontend", - "noirc_printable_type", - "owo-colors", - "rexpect", - "serde_json", - "tempfile", - "thiserror", -] - -[[package]] -name = "noir_fuzzer" -version = "0.38.0" -dependencies = [ - "acvm", - "noirc_abi", - "noirc_artifacts", - "proptest", - "rand 0.8.5", -] - -[[package]] -name = "noir_grumpkin" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7d49a4b14b13c0dc730b05780b385828ab88f4148daaad7db080ecdce07350" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff", - "ark-std", -] - -[[package]] -name = "noir_lsp" -version = "0.38.0" -dependencies = [ - "acvm", - "async-lsp", - "codespan-lsp", - "convert_case 0.6.0", - "fm", - "fxhash", - "lsp-types 0.94.1", - "nargo", - "nargo_fmt", - "nargo_toml", - "noirc_driver", - "noirc_errors", - "noirc_frontend", - "rayon", - "serde", - "serde_json", - "strum", - "thiserror", - "tokio", - "tower", - "wasm-bindgen", -] - -[[package]] -name = "noir_profiler" -version = "0.38.0" -dependencies = [ - "acir", - "bn254_blackbox_solver", - "clap", - "color-eyre", - "const_format", - "fm", - "fxhash", - "im", - "inferno", - "nargo", - "noirc_abi", - "noirc_artifacts", - "noirc_driver", - "noirc_errors", - "noirc_evaluator", - "serde", - "serde_json", - "tempfile", - "tracing-appender", - "tracing-subscriber", -] - -[[package]] -name = "noir_wasm" -version = "0.38.0" -dependencies = [ - "acvm", - "build-data", - "console_error_panic_hook", - "fm", - "getrandom 0.2.15", - "gloo-utils", - "js-sys", - "nargo", - "noirc_artifacts", - "noirc_driver", - "noirc_errors", - "noirc_evaluator", - "noirc_frontend", - "rust-embed", - "serde", - "tracing-subscriber", - "tracing-web", - "wasm-bindgen", -] - -[[package]] -name = "noirc_abi" -version = "0.38.0" -dependencies = [ - "acvm", - "iter-extended", - "noirc_printable_type", - "num-bigint", - "num-traits", - "proptest", - "proptest-derive 0.4.0", - "serde", - "serde_json", - "strum", - "strum_macros", - "thiserror", - "toml 0.7.8", -] - -[[package]] -name = "noirc_abi_wasm" -version = "0.38.0" -dependencies = [ - "acvm", - "build-data", - "console_error_panic_hook", - "getrandom 0.2.15", - "gloo-utils", - "iter-extended", - "js-sys", - "noirc_abi", - "serde", - "wasm-bindgen", - "wasm-bindgen-test", -] - -[[package]] -name = "noirc_arena" -version = "0.38.0" - -[[package]] -name = "noirc_artifacts" -version = "0.38.0" -dependencies = [ - "acvm", - "codespan-reporting", - "fm", - "noirc_abi", - "noirc_driver", - "noirc_errors", - "noirc_printable_type", - "serde", - "tempfile", -] - -[[package]] -name = "noirc_driver" -version = "0.38.0" -dependencies = [ - "acvm", - "build-data", - "clap", - "fm", - "fxhash", - "iter-extended", - "noirc_abi", - "noirc_errors", - "noirc_evaluator", - "noirc_frontend", - "rust-embed", - "serde", - "tracing", -] - -[[package]] -name = "noirc_errors" -version = "0.38.0" -dependencies = [ - "acvm", - "base64 0.21.7", - "codespan", - "codespan-reporting", - "flate2", - "fm", - "noirc_printable_type", - "serde", - "serde_json", - "serde_with", - "tracing", -] - -[[package]] -name = "noirc_evaluator" -version = "0.38.0" -dependencies = [ - "acvm", - "bn254_blackbox_solver", - "cfg-if 1.0.0", - "chrono", - "fxhash", - "im", - "iter-extended", - "noirc_errors", - "noirc_frontend", - "num-bigint", - "num-traits", - "proptest", - "rayon", - "serde", - "serde_json", - "serde_with", - "similar-asserts", - "thiserror", - "tracing", - "tracing-test", -] - -[[package]] -name = "noirc_frontend" -version = "0.38.0" -dependencies = [ - "acvm", - "base64 0.21.7", - "bn254_blackbox_solver", - "cfg-if 1.0.0", - "fm", - "im", - "iter-extended", - "noirc_arena", - "noirc_errors", - "noirc_printable_type", - "num-bigint", - "num-traits", - "petgraph", - "proptest", - "proptest-derive 0.5.0", - "rangemap", - "regex", - "rustc-hash", - "serde", - "serde_json", - "small-ord-set", - "smol_str", - "strum", - "strum_macros", - "thiserror", - "tracing", -] - -[[package]] -name = "noirc_printable_type" -version = "0.38.0" -dependencies = [ - "acvm", - "iter-extended", - "jsonrpc", - "regex", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "normalize-line-endings" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" - -[[package]] -name = "notify" -version = "6.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" -dependencies = [ - "bitflags 2.6.0", - "crossbeam-channel", - "filetime", - "fsevent-sys", - "inotify", - "kqueue", - "libc", - "log", - "mio 0.8.11", - "walkdir", - "windows-sys 0.48.0", -] - -[[package]] -name = "notify-debouncer-full" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7fd166739789c9ff169e654dc1501373db9d80a4c3f972817c8a4d7cf8f34e" -dependencies = [ - "crossbeam-channel", - "file-id", - "log", - "notify", - "parking_lot 0.12.3", - "walkdir", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-format" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" -dependencies = [ - "arrayvec", - "itoa", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.9", - "libc", -] - -[[package]] -name = "numtoa" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "oorandom" -version = "11.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "owo-colors" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" - -[[package]] -name = "p256" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" -dependencies = [ - "ecdsa", - "elliptic-curve", - "sha2", -] - -[[package]] -name = "pairing" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" -dependencies = [ - "group 0.12.1", -] - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.10", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall 0.5.7", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "pasta_curves" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc65faf8e7313b4b1fbaa9f7ca917a0eed499a9663be71477f87993604341d8" -dependencies = [ - "blake2b_simd", - "ff 0.12.1", - "group 0.12.1", - "lazy_static", - "rand 0.8.5", - "static_assertions", - "subtle", -] - -[[package]] -name = "pasta_curves" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" -dependencies = [ - "blake2b_simd", - "ff 0.13.0", - "group 0.13.0", - "lazy_static", - "rand 0.8.5", - "static_assertions", - "subtle", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap 2.6.0", -] - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_macros", - "phf_shared", - "proc-macro-hack", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - -[[package]] -name = "plotters" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" -dependencies = [ - "num-traits", - "plotters-backend", - "plotters-svg", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "plotters-backend" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" - -[[package]] -name = "plotters-svg" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" -dependencies = [ - "plotters-backend", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "pprof" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978385d59daf9269189d052ca8a84c1acfd0715c0599a5d5188d4acc078ca46a" -dependencies = [ - "backtrace", - "cfg-if 1.0.0", - "criterion", - "findshlibs", - "inferno", - "libc", - "log", - "nix 0.26.4", - "once_cell", - "parking_lot 0.12.3", - "smallvec", - "symbolic-demangle", - "tempfile", - "thiserror", -] - -[[package]] -name = "pprof" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5c97c51bd34c7e742402e216abdeb44d415fbe6ae41d56b114723e953711cb" -dependencies = [ - "backtrace", - "cfg-if 1.0.0", - "criterion", - "findshlibs", - "inferno", - "libc", - "log", - "nix 0.26.4", - "once_cell", - "parking_lot 0.12.3", - "smallvec", - "symbolic-demangle", - "tempfile", - "thiserror", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "predicates" -version = "2.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" -dependencies = [ - "difflib", - "float-cmp", - "itertools", - "normalize-line-endings", - "predicates-core", - "regex", -] - -[[package]] -name = "predicates" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" -dependencies = [ - "anstyle", - "difflib", - "predicates-core", -] - -[[package]] -name = "predicates-core" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" - -[[package]] -name = "predicates-tree" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" -dependencies = [ - "predicates-core", - "termtree", -] - -[[package]] -name = "prettytable-rs" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea25e07510aa6ab6547308ebe3c036016d162b8da920dbb079e3ba8acf3d95a" -dependencies = [ - "csv", - "encode_unicode 1.0.0", - "is-terminal", - "lazy_static", - "term", - "unicode-width", -] - -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml 0.5.11", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - -[[package]] -name = "proc-macro2" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.6.0", - "lazy_static", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax 0.8.5", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "proptest-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf16337405ca084e9c78985114633b6827711d22b9e6ef6c6c0d665eb3f0b6e" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "proptest-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff7ff745a347b87471d859a377a9a404361e7efc2a971d73424a6d183c0fc77" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quick-xml" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f50b1c63b38611e7d4d7f68b82d3ad0cc71a2ad2e7f61fc10f1328d917c93cd" -dependencies = [ - "memchr", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "radix_trie" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" -dependencies = [ - "endian-type", - "nibble_vec", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rand_xoshiro" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rangemap" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "redox_termios" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb" - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.15", - "libredox 0.1.3", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rexpect" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ff60778f96fb5a48adbe421d21bf6578ed58c0872d712e7e08593c195adff8" -dependencies = [ - "comma", - "nix 0.25.1", - "regex", - "tempfile", - "thiserror", -] - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint", - "hmac", - "zeroize", -] - -[[package]] -name = "rgb" -version = "0.8.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "rust-embed" -version = "6.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a36224c3276f8c4ebc8c20f158eca7ca4359c8db89991c4925132aaaf6702661" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "6.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b94b81e5b2c284684141a2fb9e2a31be90638caf040bf9afbc5a0416afe1ac" -dependencies = [ - "proc-macro2", - "quote", - "rust-embed-utils", - "syn 2.0.87", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "7.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d38ff6bf570dc3bb7100fce9f7b60c33fa71d80e88da3f2580df4ff2bdded74" -dependencies = [ - "sha2", - "walkdir", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustversion" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "rustyline" -version = "9.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db7826789c0e25614b03e5a54a0717a86f9ff6e6e5247f92b369472869320039" -dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", - "clipboard-win", - "dirs-next", - "fd-lock", - "libc", - "log", - "memchr", - "nix 0.23.2", - "radix_trie", - "scopeguard", - "smallvec", - "unicode-segmentation", - "unicode-width", - "utf8parse", - "winapi", -] - -[[package]] -name = "rustyline-derive" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb35a55ab810b5c0fe31606fe9b47d1354e4dc519bec0a102655f78ea2b38057" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "safe-lock" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29841ed0a577196bca5b753cd4e4022fa50b718e56fc0d35919ed32e20ec65c" - -[[package]] -name = "safe-proc-macro2" -version = "1.0.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd85be67db87168aa3c13fd0da99f48f2ab005dccad5af5626138dc1df20eb6" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "safe-quote" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e530f7831f3feafcd5f1aae406ac205dd998436b4007c8e80f03eca78a88f7" -dependencies = [ - "safe-proc-macro2", -] - -[[package]] -name = "safe-regex" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ab4bc484ef480a9ce79b381efd7b6767700f514d47bc599036e9d6f7f3c49d" -dependencies = [ - "safe-regex-macro", -] - -[[package]] -name = "safe-regex-compiler" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71f8c78bffb07962595e1bfa5ed11d24dd855eedc50b6a735f5ef648ce621b" -dependencies = [ - "safe-proc-macro2", - "safe-quote", -] - -[[package]] -name = "safe-regex-macro" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0909ab4b77511df24201cd66541d6a028887c77ecc065f277c68a12a663274ef" -dependencies = [ - "safe-proc-macro2", - "safe-regex-compiler", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.214" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-big-array" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" -dependencies = [ - "serde", -] - -[[package]] -name = "serde-generate" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c9331265d81c61212dc75df7b0836544ed8e32dba77a522f113805ff9a948e" -dependencies = [ - "heck 0.3.3", - "include_dir", - "phf", - "serde", - "serde-reflection", - "textwrap 0.13.4", -] - -[[package]] -name = "serde-reflection" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05a5f801ac62a51a49d378fdb3884480041b99aced450b28990673e8ff99895" -dependencies = [ - "once_cell", - "serde", - "thiserror", -] - -[[package]] -name = "serde_derive" -version = "1.0.214" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "serde_json" -version = "1.0.132" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_with" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.6.0", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest", - "keccak", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest", - "rand_core 0.6.4", -] - -[[package]] -name = "similar" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" -dependencies = [ - "bstr", - "unicode-segmentation", -] - -[[package]] -name = "similar-asserts" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe85670573cd6f0fa97940f26e7e6601213c3b0555246c24234131f88c5709e" -dependencies = [ - "console", - "similar", -] - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "sized-chunks" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" -dependencies = [ - "bitmaps", - "typenum", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "small-ord-set" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf7035a2b2268a5be8c1395738565b06beda836097e12021cdefc06b127a0e7e" -dependencies = [ - "smallvec", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "smawk" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" - -[[package]] -name = "smol_str" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "str-buf" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" - -[[package]] -name = "str_stack" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091b6114800a5f2141aee1d1b9d6ca3592ac062dc5decb3764ec5895a47b4eb" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "symbolic-common" -version = "12.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d4d73159efebfb389d819fd479afb2dbd57dcb3e3f4b7fcfa0e675f5a46c1cb" -dependencies = [ - "debugid", - "memmap2", - "stable_deref_trait", - "uuid", -] - -[[package]] -name = "symbolic-demangle" -version = "12.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a767859f6549c665011970874c3f541838b4835d5aaaa493d3ee383918be9f10" -dependencies = [ - "cpp_demangle", - "rustc-demangle", - "symbolic-common", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" -dependencies = [ - "cfg-if 1.0.0", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "termion" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "417813675a504dfbbf21bfde32c03e5bf9f2413999962b479023c02848c1c7a5" -dependencies = [ - "libc", - "libredox 0.0.2", - "numtoa", - "redox_termios", -] - -[[package]] -name = "termtree" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" - -[[package]] -name = "test-binary" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c7cb854285c40b61c0fade358bf63a2bb1226688a1ea11432ea65349209e6e3" -dependencies = [ - "camino", - "cargo_metadata", - "once_cell", - "paste", - "thiserror", -] - -[[package]] -name = "test-case" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2550dd13afcd286853192af8601920d959b14c401fcece38071d53bf0768a8" -dependencies = [ - "test-case-macros", -] - -[[package]] -name = "test-case-core" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" -dependencies = [ - "cfg-if 1.0.0", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "test-case-macros" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", - "test-case-core", -] - -[[package]] -name = "textwrap" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd05616119e612a8041ef58f2b578906cc2531a6069047ae092cfb86a325d835" -dependencies = [ - "smawk", - "unicode-width", -] - -[[package]] -name = "textwrap" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" -dependencies = [ - "smawk", - "unicode-linebreak", - "unicode-width", -] - -[[package]] -name = "thiserror" -version = "1.0.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if 1.0.0", - "once_cell", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinytemplate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.41.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio 1.0.2", - "pin-project-lite", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "tokio-stream" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.6.0", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-appender" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" -dependencies = [ - "crossbeam-channel", - "thiserror", - "time", - "tracing-subscriber", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-error" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" -dependencies = [ - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "tracing-test" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "557b891436fe0d5e0e363427fc7f217abf9ccd510d5136549847bdcbcd011d68" -dependencies = [ - "tracing-core", - "tracing-subscriber", - "tracing-test-macro", -] - -[[package]] -name = "tracing-test-macro" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" -dependencies = [ - "quote", - "syn 2.0.87", -] - -[[package]] -name = "tracing-web" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e6a141feebd51f8d91ebfd785af50fca223c570b86852166caa3b141defe7c" -dependencies = [ - "js-sys", - "tracing-core", - "tracing-subscriber", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "trie-rs" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5096c019d49566aff57593a06e401c7f588da84e9a575d0ed2ac0913f51928c0" -dependencies = [ - "louds-rs", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicase" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" - -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - -[[package]] -name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-linebreak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] - -[[package]] -name = "url" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" -dependencies = [ - "form_urlencoded", - "idna 1.0.3", - "percent-encoding 2.3.1", - "serde", -] - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "waitpid-any" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0189157c93c54d86e5c61ddf0c1223baa25e5bfb2f6f9983c678985b028d7c12" -dependencies = [ - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" -dependencies = [ - "cfg-if 1.0.0", - "serde", - "serde_json", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.87", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" - -[[package]] -name = "wasm-bindgen-test" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e636f3a428ff62b3742ebc3c70e254dfe12b8c2b469d688ea59cdd4abcf502" -dependencies = [ - "console_error_panic_hook", - "js-sys", - "scoped-tls", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test-macro", -] - -[[package]] -name = "wasm-bindgen-test-macro" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f18c1fad2f7c4958e7bcce014fa212f59a65d5e3721d0f77e6c0b27ede936ba3" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "web-sys" -version = "0.3.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "yoke" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "zerofrom" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "zkhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4352d1081da6922701401cdd4cbf29a2723feb4cfabb5771f6fee8e9276da1c7" -dependencies = [ - "ark-ff", - "ark-std", - "bitvec", - "blake2", - "bls12_381", - "byteorder", - "cfg-if 1.0.0", - "group 0.12.1", - "group 0.13.0", - "halo2", - "hex", - "jubjub", - "lazy_static", - "pasta_curves 0.5.1", - "rand 0.8.5", - "serde", - "sha2", - "sha3", - "subtle", -] diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 47f29775104..51e4f477150 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -151,7 +151,9 @@ impl DependencyContext { // Remember the value stored at address as parent for the results if let Some(value_id) = self.memory_slots.get(address) { for result in results { - self.value_parents.entry(result).or_default() + self.value_parents + .entry(result) + .or_default() .push(function.dfg.resolve(*value_id)); } } else { @@ -163,19 +165,25 @@ impl DependencyContext { // involved in brillig calls Instruction::Constrain(value_id1, value_id2, _) => { self.constrained_values.push(vec![ - function.dfg.resolve(*value_id1), - function.dfg.resolve(*value_id2)]); + function.dfg.resolve(*value_id1), + function.dfg.resolve(*value_id2), + ]); } // Consider range check to also be constraining Instruction::RangeCheck { value, .. } => { self.constrained_values.push(vec![function.dfg.resolve(*value)]); } Instruction::Call { func: func_id, arguments } => { + let arguments = arguments + .iter() + .filter(|v| function.dfg.get_numeric_constant(**v).is_none()); + //.copied(); + match &function.dfg[*func_id] { Value::Intrinsic(intrinsic) => match intrinsic { Intrinsic::ApplyRangeConstraint | Intrinsic::AssertConstant => { // Consider these intrinsic arguments constrained - self.constrained_values.push(arguments.clone()); + self.constrained_values.push(arguments.copied().collect()); } Intrinsic::AsWitness | Intrinsic::IsUnconstrained => { // These intrinsics won't affect the dependency graph @@ -200,7 +208,10 @@ impl DependencyContext { | Intrinsic::FieldLessThan => { // Record all the function arguments as parents of the results for result in results { - self.value_parents.entry(result).or_default().extend(arguments); + self.value_parents + .entry(result) + .or_default() + .extend(arguments.clone()); } } }, @@ -211,7 +222,7 @@ impl DependencyContext { self.brillig_values.insert( *instruction, ( - HashSet::from_iter(arguments.clone()), + HashSet::from_iter(arguments.copied()), HashSet::from_iter(results), ), ); @@ -219,7 +230,10 @@ impl DependencyContext { RuntimeType::Acir(..) => { // Record all the function arguments as parents of the results for result in results { - self.value_parents.entry(result).or_default().extend(arguments); + self.value_parents + .entry(result) + .or_default() + .extend(arguments.clone()); } } }, @@ -282,9 +296,11 @@ impl DependencyContext { continue; } // If there is at least one value among the brillig call arguments + // (or there are no non-constant arguments, which could happen with optimization) // along with all the results featuring in the constrain value ancestors, // consider the call properly covered - if constrain_ancestors.intersection(&brillig_values.0).next().is_some() + if (brillig_values.0.is_empty() + || constrain_ancestors.intersection(&brillig_values.0).next().is_some()) && constrain_ancestors.is_superset(&brillig_values.1) { trace!( From 632ae245562037170922046372bf7e6ca2018975 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 18 Nov 2024 19:31:01 +0300 Subject: [PATCH 24/73] Clean up --- .../src/ssa/checks/check_for_underconstrained_values.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 51e4f477150..7e3b6f98100 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -177,7 +177,6 @@ impl DependencyContext { let arguments = arguments .iter() .filter(|v| function.dfg.get_numeric_constant(**v).is_none()); - //.copied(); match &function.dfg[*func_id] { Value::Intrinsic(intrinsic) => match intrinsic { From 29db10a9c103bfb65ba79228f3b9286c40824bc0 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 18 Nov 2024 20:29:27 +0300 Subject: [PATCH 25/73] Add constant brillig call test, fix comments --- .../check_for_underconstrained_values.rs | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 7e3b6f98100..91f5e22e832 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -1,6 +1,6 @@ -//! This module defines an SSA pass that detects if the final function has any subgraphs independent from inputs and outputs. -//! If this is the case, then part of the final circuit can be completely replaced by any other passing circuit, since there are no constraints ensuring connections. -//! So the compiler informs the developer of this as a bug +//! This module defines security SSA passes detecting constraint problems leading to possible +//! soundness vulnerabilities. +//! The compiler informs the developer of these as bugs. use crate::errors::{InternalBug, SsaReport}; use crate::ssa::ir::basic_block::BasicBlockId; use crate::ssa::ir::function::RuntimeType; @@ -14,6 +14,8 @@ use std::collections::{BTreeMap, HashSet}; use tracing::{debug, trace}; impl Ssa { + /// This function provides an SSA pass that detects if the final function has any subgraphs independent from inputs and outputs. + /// If this is the case, then part of the final circuit can be completely replaced by any other passing circuit, since there are no constraints ensuring connections. /// Go through each top-level non-brillig function and detect if it has independent subgraphs #[tracing::instrument(level = "trace", skip(self))] pub(crate) fn check_for_underconstrained_values(&mut self) -> Vec { @@ -899,4 +901,46 @@ mod test { let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); assert_eq!(ssa_level_warnings.len(), 1); } + + #[test] + #[traced_test] + /// Test where a brillig function is called with a constant argument + /// (should _not_ lead to a false positive failed check + /// if all the results are constrained) + fn test_checked_brillig_with_constant_arguments() { + let type_u32 = Type::Numeric(NumericType::Unsigned { bit_size: 32 }); + + let main_id = Id::test_new(0); + let mut builder = FunctionBuilder::new("main".into(), main_id); + + let v0 = builder.add_parameter(type_u32.clone()); + + let seven = builder.field_constant(7u128); + + let br_function_id = Id::test_new(1); + let br_function = builder.import_function(br_function_id); + + // The call is constrained properly, involving both results + // (but the argument to the brillig is a constant) + let call_results = + builder.insert_call(br_function, vec![seven], vec![type_u32.clone(), type_u32.clone()]); + let (v6, v7) = (call_results[0], call_results[1]); + let v8 = builder.insert_binary(v6, BinaryOp::Mul, v7); + builder.insert_constrain(v8, v0, None); + + builder.terminate_with_return(vec![]); + + // We're faking the brillig function here, for simplicity's sake + + builder.new_brillig_function("factor".into(), br_function_id, InlineType::default()); + builder.add_parameter(Type::field()); + let zero = builder.numeric_constant(0u32, type_u32.clone()); + + builder.terminate_with_return(vec![zero, zero]); + + let mut ssa = builder.finish(); + + let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); + assert_eq!(ssa_level_warnings.len(), 0); + } } From b125bd5e34d4a7dd7e080e2422ca3f0d7f99802d Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 18 Nov 2024 21:21:01 +0300 Subject: [PATCH 26/73] Add range checked brillig call test --- .../check_for_underconstrained_values.rs | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 91f5e22e832..c30644f0b4a 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -943,4 +943,41 @@ mod test { let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); assert_eq!(ssa_level_warnings.len(), 0); } + + #[test] + #[traced_test] + /// Test where a brillig function call is constrained with a range check + /// (should _not_ lead to a false positive failed check) + fn test_range_checked_brillig() { + let type_u32 = Type::Numeric(NumericType::Unsigned { bit_size: 32 }); + + let main_id = Id::test_new(0); + let mut builder = FunctionBuilder::new("main".into(), main_id); + + let v0 = builder.add_parameter(type_u32.clone()); + + let br_function_id = Id::test_new(1); + let br_function = builder.import_function(br_function_id); + + // The call is constrained properly with a range check, involving + // both brillig call argument and result + let call_results = builder.insert_call(br_function, vec![v0], vec![type_u32.clone()]); + let v1 = call_results[0]; + let v2 = builder.insert_binary(v1, BinaryOp::Add, v0); + builder.insert_range_check(v2, 32, None); + + builder.terminate_with_return(vec![]); + + // We're faking the brillig function here, for simplicity's sake + + builder.new_brillig_function("dummy".into(), br_function_id, InlineType::default()); + builder.add_parameter(type_u32.clone()); + let zero = builder.numeric_constant(0u32, type_u32.clone()); + builder.terminate_with_return(vec![zero]); + + let mut ssa = builder.finish(); + + let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); + assert_eq!(ssa_level_warnings.len(), 0); + } } From 94d4ba83c71c5bc420075d999c10600f0dcb058b Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 18 Nov 2024 21:58:39 +0300 Subject: [PATCH 27/73] Get Cargo.lock from master --- Cargo.lock | 5709 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 5709 insertions(+) create mode 100644 Cargo.lock diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000000..35ff97f55e3 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,5709 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "acir" +version = "0.54.0" +dependencies = [ + "acir_field", + "base64 0.21.7", + "bincode", + "brillig", + "criterion", + "flate2", + "fxhash", + "pprof 0.13.0", + "serde", + "serde-big-array", + "serde-generate", + "serde-reflection", + "serde_json", + "strum", + "strum_macros", + "thiserror", +] + +[[package]] +name = "acir_field" +version = "0.54.0" +dependencies = [ + "ark-bls12-381", + "ark-bn254", + "ark-ff", + "cfg-if 1.0.0", + "hex", + "num-bigint", + "proptest", + "serde", +] + +[[package]] +name = "acvm" +version = "0.54.0" +dependencies = [ + "acir", + "acvm_blackbox_solver", + "ark-bls12-381", + "ark-bn254", + "bn254_blackbox_solver", + "brillig_vm", + "indexmap 1.9.3", + "num-bigint", + "proptest", + "serde", + "thiserror", + "tracing", + "zkhash", +] + +[[package]] +name = "acvm_blackbox_solver" +version = "0.54.0" +dependencies = [ + "acir", + "blake2", + "blake3", + "k256", + "keccak", + "libaes", + "num-bigint", + "p256", + "proptest", + "sha2", + "thiserror", +] + +[[package]] +name = "acvm_cli" +version = "0.40.0" +dependencies = [ + "acir", + "acvm", + "bn254_blackbox_solver", + "clap", + "color-eyre", + "const_format", + "nargo", + "paste", + "proptest", + "rand 0.8.5", + "thiserror", + "toml 0.7.8", + "tracing-appender", + "tracing-subscriber", +] + +[[package]] +name = "acvm_js" +version = "0.54.0" +dependencies = [ + "acvm", + "bn254_blackbox_solver", + "build-data", + "console_error_panic_hook", + "const-str", + "getrandom 0.2.15", + "gloo-utils", + "js-sys", + "pkg-config", + "serde", + "tracing-subscriber", + "tracing-web", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if 1.0.0", + "getrandom 0.2.15", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" + +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "assert_cmd" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1835b7f27878de8525dc71410b5a31cdcc5f230aed5ba5df968e09c201b23d" +dependencies = [ + "anstyle", + "bstr", + "doc-comment", + "libc", + "predicates 3.1.2", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + +[[package]] +name = "assert_fs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7efdb1fdb47602827a342857666feb372712cbc64b414172bd6b167a02927674" +dependencies = [ + "anstyle", + "doc-comment", + "globwalk", + "predicates 3.1.2", + "predicates-core", + "predicates-tree", + "tempfile", +] + +[[package]] +name = "async-lsp" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138985dd8aefbefeaa66b01b7f5b2b6b4c333fcef1cc5f32c63a2aabe37d6de3" +dependencies = [ + "futures 0.3.31", + "lsp-types 0.94.1", + "pin-project-lite", + "rustix", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower-layer", + "tower-service", + "tracing", + "waitpid-any", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide 0.7.4", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "blake3" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if 1.0.0", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bls12_381" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" +dependencies = [ + "ff 0.12.1", + "group 0.12.1", + "pairing", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "bn254_blackbox_solver" +version = "0.54.0" +dependencies = [ + "acir", + "acvm_blackbox_solver", + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-std", + "criterion", + "hex", + "lazy_static", + "noir_grumpkin", + "num-bigint", + "pprof 0.12.1", +] + +[[package]] +name = "brillig" +version = "0.54.0" +dependencies = [ + "acir_field", + "serde", +] + +[[package]] +name = "brillig_vm" +version = "0.54.0" +dependencies = [ + "acir", + "acvm_blackbox_solver", + "num-bigint", + "num-traits", + "thiserror", +] + +[[package]] +name = "bstr" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +dependencies = [ + "memchr", + "regex-automata 0.4.8", + "serde", +] + +[[package]] +name = "build-data" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aed3884e2cab7c973c8fd2d150314b6a932df7fdc830edcaf1e8e7c4ae9db3c0" +dependencies = [ + "chrono", + "safe-lock", + "safe-regex", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baee610e9452a8f6f0a1b6194ec09ff9e2d85dea54432acdae41aa0761c95d70" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.6", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap-markdown" +version = "0.1.3" +source = "git+https://github.com/noir-lang/clap-markdown?rev=450d759532c88f0dba70891ceecdbc9ff8f25d2b#450d759532c88f0dba70891ceecdbc9ff8f25d2b" +dependencies = [ + "clap", +] + +[[package]] +name = "clap_builder" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_complete" +version = "4.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11611dca53440593f38e6b25ec629de50b14cdfa63adc0fb856115a2c6d97595" +dependencies = [ + "clap", +] + +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "clipboard-win" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + +[[package]] +name = "codespan" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3362992a0d9f1dd7c3d0e89e0ab2bb540b7a95fea8cd798090e758fda2899b5e" +dependencies = [ + "codespan-reporting", + "serde", +] + +[[package]] +name = "codespan-lsp" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4159b76af02757139baf42c0c971c6dc155330999fbfd8eddb29b97fb2db68" +dependencies = [ + "codespan-reporting", + "lsp-types 0.88.0", + "url 2.5.3", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "color-eyre" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "comma" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55b672471b4e9f9e95499ea597ff64941a309b2cdbffcc46f2cc5e2d971fd335" + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode 0.3.6", + "lazy_static", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-str" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3618cccc083bb987a415d85c02ca6c9994ea5b44731ec28b9ecf09658655fba9" + +[[package]] +name = "const_format" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpp_demangle" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + +[[package]] +name = "dap" +version = "0.4.1-alpha1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c7fc89d334ab745ba679f94c7314c9b17ecdcd923c111df6206e9fd7729fa9" +dependencies = [ + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.87", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core 0.9.10", +] + +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid", +] + +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case 0.4.0", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.87", +] + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "easy-repl" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81d0001ed25c451c57f8d6724d448a6546a5d78bbac77a63a22e32c735b7ea16" +dependencies = [ + "anyhow", + "rustyline", + "rustyline-derive", + "shell-words", + "textwrap 0.15.2", + "thiserror", + "trie-rs", +] + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "digest", + "ff 0.12.1", + "generic-array", + "group 0.12.1", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "endian-type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + +[[package]] +name = "env_filter" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +dependencies = [ + "log", +] + +[[package]] +name = "env_logger" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +dependencies = [ + "env_filter", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "error-code" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +dependencies = [ + "libc", + "str-buf", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" + +[[package]] +name = "fd-lock" +version = "3.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5" +dependencies = [ + "cfg-if 1.0.0", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "bitvec", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fid-rs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28658c0c3420305705adde833a0d2d614207507d013a5f25707553fb2ae2cd" +dependencies = [ + "rayon", +] + +[[package]] +name = "file-id" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bc904b9bbefcadbd8e3a9fb0d464a9b979de6324c03b3c663e8994f46a5be36" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "libredox 0.1.3", + "windows-sys 0.59.0", +] + +[[package]] +name = "findshlibs" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b9e59cd0f7e0806cca4be089683ecb6434e602038df21fe6bf6711b2f07f64" +dependencies = [ + "cc", + "lazy_static", + "libc", + "winapi", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.0", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fm" +version = "0.38.0" +dependencies = [ + "codespan-reporting", + "iter-extended", + "serde", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding 2.3.1", +] + +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures 0.1.31", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", +] + +[[package]] +name = "globwalk" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" +dependencies = [ + "bitflags 2.6.0", + "ignore", + "walkdir", +] + +[[package]] +name = "gloo-utils" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037fcb07216cb3a30f7292bd0176b050b7b9a052ba830ef7d5d65f6dc64ba58e" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "memuse", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.0", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if 1.0.0", + "crunchy", +] + +[[package]] +name = "halo2" +version = "0.1.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a23c779b38253fe1538102da44ad5bd5378495a61d2c4ee18d64eaa61ae5995" +dependencies = [ + "halo2_proofs", +] + +[[package]] +name = "halo2_proofs" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e925780549adee8364c7f2b685c753f6f3df23bde520c67416e93bf615933760" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "pasta_curves 0.4.1", + "rand_core 0.6.4", + "rayon", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "iai" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71a816c97c42258aa5834d07590b718b4c9a598944cd39a52dc25b351185d678" + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ignore" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.8", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "include_dir" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b56e147e6187d61e9d0f039f10e070d0c0a887e24fe0bb9ca3f29bfde62cab" +dependencies = [ + "glob", + "include_dir_impl", + "proc-macro-hack", +] + +[[package]] +name = "include_dir_impl" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a0c890c85da4bab7bce4204c707396bbd3c6c8a681716a51c8814cfc2b682df" +dependencies = [ + "anyhow", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.1", + "serde", +] + +[[package]] +name = "inferno" +version = "0.11.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" +dependencies = [ + "ahash", + "clap", + "crossbeam-channel", + "crossbeam-utils", + "dashmap", + "env_logger", + "indexmap 2.6.0", + "is-terminal", + "itoa", + "log", + "num-format", + "once_cell", + "quick-xml", + "rgb", + "str_stack", +] + +[[package]] +name = "inotify" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +dependencies = [ + "hermit-abi 0.4.0", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "iter-extended" +version = "0.38.0" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpc" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34efde8d2422fb79ed56db1d3aea8fa5b583351d15a26770cdee2f88813dd702" +dependencies = [ + "base64 0.13.1", + "minreq", + "serde", + "serde_json", +] + +[[package]] +name = "jsonrpc-client-transports" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b99d4207e2a04fb4581746903c2bb7eb376f88de9c699d0f3e10feeac0cd3a" +dependencies = [ + "derive_more", + "futures 0.3.31", + "jsonrpc-core", + "jsonrpc-pubsub", + "log", + "serde", + "serde_json", + "url 1.7.2", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures 0.3.31", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "jsonrpc-core-client" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b51da17abecbdab3e3d4f26b01c5ec075e88d3abe3ab3b05dc9aa69392764ec0" +dependencies = [ + "futures 0.3.31", + "jsonrpc-client-transports", +] + +[[package]] +name = "jsonrpc-derive" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpc-http-server" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" +dependencies = [ + "futures 0.3.31", + "hyper", + "jsonrpc-core", + "jsonrpc-server-utils", + "log", + "net2", + "parking_lot 0.11.2", + "unicase", +] + +[[package]] +name = "jsonrpc-pubsub" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240f87695e6c6f62fb37f05c02c04953cf68d6408b8c1c89de85c7a0125b1011" +dependencies = [ + "futures 0.3.31", + "jsonrpc-core", + "lazy_static", + "log", + "parking_lot 0.11.2", + "rand 0.7.3", + "serde", +] + +[[package]] +name = "jsonrpc-server-utils" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" +dependencies = [ + "bytes", + "futures 0.3.31", + "globset", + "jsonrpc-core", + "lazy_static", + "log", + "tokio", + "tokio-stream", + "tokio-util 0.6.10", + "unicase", +] + +[[package]] +name = "jubjub" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a575df5f985fe1cd5b2b05664ff6accfc46559032b954529fd225a2168d27b0f" +dependencies = [ + "bitvec", + "bls12_381", + "ff 0.12.1", + "group 0.12.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if 1.0.0", + "ecdsa", + "elliptic-curve", + "sha2", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "kqueue" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libaes" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82903360c009b816f5ab72a9b68158c27c301ee2c3f20655b55c5e589e7d3bb7" + +[[package]] +name = "libc" +version = "0.2.162" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall 0.5.7", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff", + "num-bigint", + "thiserror", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "louds-rs" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16a91fb20f74b6d9a758a0103a2884af525a2fa34fbfe19f4b3c5482a4a54e9" +dependencies = [ + "fid-rs", +] + +[[package]] +name = "lsp-types" +version = "0.88.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e8e042772e4e10b3785822f63c82399d0dd233825de44d2596f7fa86e023e0" +dependencies = [ + "bitflags 1.3.2", + "serde", + "serde_json", + "serde_repr", + "url 2.5.3", +] + +[[package]] +name = "lsp-types" +version = "0.94.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66bfd44a06ae10647fe3f8214762e9369fd4248df1350924b4ef9e770a85ea1" +dependencies = [ + "bitflags 1.3.2", + "serde", + "serde_json", + "serde_repr", + "url 2.5.3", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memuse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2145869435ace5ea6ea3d35f59be559317ec9a0d04e1812d5f185a87b6d36f1a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "minreq" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763d142cdff44aaadd9268bebddb156ef6c65a0e13486bb81673cf2d8739f9b0" +dependencies = [ + "log", + "serde", + "serde_json", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "nargo" +version = "0.38.0" +dependencies = [ + "acvm", + "fm", + "iter-extended", + "jsonrpc", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-http-server", + "noir_fuzzer", + "noirc_abi", + "noirc_driver", + "noirc_errors", + "noirc_frontend", + "noirc_printable_type", + "proptest", + "rand 0.8.5", + "rayon", + "serde", + "thiserror", + "tracing", + "walkdir", +] + +[[package]] +name = "nargo_cli" +version = "0.38.0" +dependencies = [ + "acvm", + "ark-bn254", + "assert_cmd", + "assert_fs", + "async-lsp", + "bn254_blackbox_solver", + "build-data", + "clap", + "clap-markdown", + "clap_complete", + "color-eyre", + "const_format", + "criterion", + "dap", + "dirs", + "fm", + "iai", + "iter-extended", + "lazy_static", + "light-poseidon", + "nargo", + "nargo_fmt", + "nargo_toml", + "noir_debugger", + "noir_lsp", + "noirc_abi", + "noirc_artifacts", + "noirc_driver", + "noirc_errors", + "noirc_frontend", + "notify", + "notify-debouncer-full", + "paste", + "pprof 0.13.0", + "predicates 2.1.5", + "prettytable-rs", + "proptest", + "rayon", + "serde", + "serde_json", + "sha2", + "sha3", + "similar-asserts", + "tempfile", + "termcolor", + "termion", + "test-binary", + "test-case", + "thiserror", + "tokio", + "tokio-util 0.7.12", + "toml 0.7.8", + "tower", + "tracing-appender", + "tracing-subscriber", +] + +[[package]] +name = "nargo_fmt" +version = "0.38.0" +dependencies = [ + "noirc_frontend", + "serde", + "similar-asserts", + "thiserror", + "toml 0.7.8", +] + +[[package]] +name = "nargo_toml" +version = "0.38.0" +dependencies = [ + "dirs", + "fm", + "nargo", + "noirc_driver", + "noirc_frontend", + "semver", + "serde", + "thiserror", + "toml 0.7.8", + "url 2.5.3", +] + +[[package]] +name = "net2" +version = "0.2.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi", +] + +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + +[[package]] +name = "nix" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if 1.0.0", + "libc", + "memoffset", + "pin-utils", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if 1.0.0", + "libc", +] + +[[package]] +name = "noir_debugger" +version = "0.38.0" +dependencies = [ + "acvm", + "assert_cmd", + "build-data", + "codespan-reporting", + "dap", + "easy-repl", + "fm", + "nargo", + "noirc_artifacts", + "noirc_driver", + "noirc_errors", + "noirc_frontend", + "noirc_printable_type", + "owo-colors", + "rexpect", + "serde_json", + "tempfile", + "thiserror", +] + +[[package]] +name = "noir_fuzzer" +version = "0.38.0" +dependencies = [ + "acvm", + "noirc_abi", + "noirc_artifacts", + "proptest", + "rand 0.8.5", +] + +[[package]] +name = "noir_grumpkin" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7d49a4b14b13c0dc730b05780b385828ab88f4148daaad7db080ecdce07350" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "noir_lsp" +version = "0.38.0" +dependencies = [ + "acvm", + "async-lsp", + "codespan-lsp", + "convert_case 0.6.0", + "fm", + "fxhash", + "lsp-types 0.94.1", + "nargo", + "nargo_fmt", + "nargo_toml", + "noirc_driver", + "noirc_errors", + "noirc_frontend", + "rayon", + "serde", + "serde_json", + "strum", + "thiserror", + "tokio", + "tower", + "wasm-bindgen", +] + +[[package]] +name = "noir_profiler" +version = "0.38.0" +dependencies = [ + "acir", + "bn254_blackbox_solver", + "clap", + "color-eyre", + "const_format", + "fm", + "fxhash", + "im", + "inferno", + "nargo", + "noirc_abi", + "noirc_artifacts", + "noirc_driver", + "noirc_errors", + "noirc_evaluator", + "serde", + "serde_json", + "tempfile", + "tracing-appender", + "tracing-subscriber", +] + +[[package]] +name = "noir_wasm" +version = "0.38.0" +dependencies = [ + "acvm", + "build-data", + "console_error_panic_hook", + "fm", + "getrandom 0.2.15", + "gloo-utils", + "js-sys", + "nargo", + "noirc_artifacts", + "noirc_driver", + "noirc_errors", + "noirc_evaluator", + "noirc_frontend", + "rust-embed", + "serde", + "tracing-subscriber", + "tracing-web", + "wasm-bindgen", +] + +[[package]] +name = "noirc_abi" +version = "0.38.0" +dependencies = [ + "acvm", + "iter-extended", + "noirc_printable_type", + "num-bigint", + "num-traits", + "proptest", + "proptest-derive 0.4.0", + "serde", + "serde_json", + "strum", + "strum_macros", + "thiserror", + "toml 0.7.8", +] + +[[package]] +name = "noirc_abi_wasm" +version = "0.38.0" +dependencies = [ + "acvm", + "build-data", + "console_error_panic_hook", + "getrandom 0.2.15", + "gloo-utils", + "iter-extended", + "js-sys", + "noirc_abi", + "serde", + "wasm-bindgen", + "wasm-bindgen-test", +] + +[[package]] +name = "noirc_arena" +version = "0.38.0" + +[[package]] +name = "noirc_artifacts" +version = "0.38.0" +dependencies = [ + "acvm", + "codespan-reporting", + "fm", + "noirc_abi", + "noirc_driver", + "noirc_errors", + "noirc_printable_type", + "serde", + "tempfile", +] + +[[package]] +name = "noirc_driver" +version = "0.38.0" +dependencies = [ + "acvm", + "build-data", + "clap", + "fm", + "fxhash", + "iter-extended", + "noirc_abi", + "noirc_errors", + "noirc_evaluator", + "noirc_frontend", + "rust-embed", + "serde", + "tracing", +] + +[[package]] +name = "noirc_errors" +version = "0.38.0" +dependencies = [ + "acvm", + "base64 0.21.7", + "codespan", + "codespan-reporting", + "flate2", + "fm", + "noirc_printable_type", + "serde", + "serde_json", + "serde_with", + "tracing", +] + +[[package]] +name = "noirc_evaluator" +version = "0.38.0" +dependencies = [ + "acvm", + "bn254_blackbox_solver", + "cfg-if 1.0.0", + "chrono", + "fxhash", + "im", + "iter-extended", + "noirc_errors", + "noirc_frontend", + "num-bigint", + "num-traits", + "proptest", + "rayon", + "serde", + "serde_json", + "serde_with", + "similar-asserts", + "thiserror", + "tracing", +] + +[[package]] +name = "noirc_frontend" +version = "0.38.0" +dependencies = [ + "acvm", + "base64 0.21.7", + "bn254_blackbox_solver", + "cfg-if 1.0.0", + "fm", + "im", + "iter-extended", + "noirc_arena", + "noirc_errors", + "noirc_printable_type", + "num-bigint", + "num-traits", + "petgraph", + "proptest", + "proptest-derive 0.5.0", + "rangemap", + "regex", + "rustc-hash", + "serde", + "serde_json", + "small-ord-set", + "smol_str", + "strum", + "strum_macros", + "thiserror", + "tracing", +] + +[[package]] +name = "noirc_printable_type" +version = "0.38.0" +dependencies = [ + "acvm", + "iter-extended", + "jsonrpc", + "regex", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "notify" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" +dependencies = [ + "bitflags 2.6.0", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio 0.8.11", + "walkdir", + "windows-sys 0.48.0", +] + +[[package]] +name = "notify-debouncer-full" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb7fd166739789c9ff169e654dc1501373db9d80a4c3f972817c8a4d7cf8f34e" +dependencies = [ + "crossbeam-channel", + "file-id", + "log", + "notify", + "parking_lot 0.12.3", + "walkdir", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec", + "itoa", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "numtoa" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "oorandom" +version = "11.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + +[[package]] +name = "p256" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +dependencies = [ + "ecdsa", + "elliptic-curve", + "sha2", +] + +[[package]] +name = "pairing" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +dependencies = [ + "group 0.12.1", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.10", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.5.7", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "pasta_curves" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc65faf8e7313b4b1fbaa9f7ca917a0eed499a9663be71477f87993604341d8" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "lazy_static", + "rand 0.8.5", + "static_assertions", + "subtle", +] + +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +dependencies = [ + "blake2b_simd", + "ff 0.13.0", + "group 0.13.0", + "lazy_static", + "rand 0.8.5", + "static_assertions", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.6.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros", + "phf_shared", + "proc-macro-hack", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "plotters" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "pprof" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978385d59daf9269189d052ca8a84c1acfd0715c0599a5d5188d4acc078ca46a" +dependencies = [ + "backtrace", + "cfg-if 1.0.0", + "criterion", + "findshlibs", + "inferno", + "libc", + "log", + "nix 0.26.4", + "once_cell", + "parking_lot 0.12.3", + "smallvec", + "symbolic-demangle", + "tempfile", + "thiserror", +] + +[[package]] +name = "pprof" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef5c97c51bd34c7e742402e216abdeb44d415fbe6ae41d56b114723e953711cb" +dependencies = [ + "backtrace", + "cfg-if 1.0.0", + "criterion", + "findshlibs", + "inferno", + "libc", + "log", + "nix 0.26.4", + "once_cell", + "parking_lot 0.12.3", + "smallvec", + "symbolic-demangle", + "tempfile", + "thiserror", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "predicates" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +dependencies = [ + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" +dependencies = [ + "anstyle", + "difflib", + "predicates-core", +] + +[[package]] +name = "predicates-core" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" + +[[package]] +name = "predicates-tree" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "prettytable-rs" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea25e07510aa6ab6547308ebe3c036016d162b8da920dbb079e3ba8acf3d95a" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml 0.5.11", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.6.0", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "proptest-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf16337405ca084e9c78985114633b6827711d22b9e6ef6c6c0d665eb3f0b6e" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "proptest-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff7ff745a347b87471d859a377a9a404361e7efc2a971d73424a6d183c0fc77" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-xml" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f50b1c63b38611e7d4d7f68b82d3ad0cc71a2ad2e7f61fc10f1328d917c93cd" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "radix_trie" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_termios" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb" + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.15", + "libredox 0.1.3", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rexpect" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01ff60778f96fb5a48adbe421d21bf6578ed58c0872d712e7e08593c195adff8" +dependencies = [ + "comma", + "nix 0.25.1", + "regex", + "tempfile", + "thiserror", +] + +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint", + "hmac", + "zeroize", +] + +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "rust-embed" +version = "6.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a36224c3276f8c4ebc8c20f158eca7ca4359c8db89991c4925132aaaf6702661" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "6.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49b94b81e5b2c284684141a2fb9e2a31be90638caf040bf9afbc5a0416afe1ac" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn 2.0.87", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "7.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d38ff6bf570dc3bb7100fce9f7b60c33fa71d80e88da3f2580df4ff2bdded74" +dependencies = [ + "sha2", + "walkdir", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustversion" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "rustyline" +version = "9.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7826789c0e25614b03e5a54a0717a86f9ff6e6e5247f92b369472869320039" +dependencies = [ + "bitflags 1.3.2", + "cfg-if 1.0.0", + "clipboard-win", + "dirs-next", + "fd-lock", + "libc", + "log", + "memchr", + "nix 0.23.2", + "radix_trie", + "scopeguard", + "smallvec", + "unicode-segmentation", + "unicode-width", + "utf8parse", + "winapi", +] + +[[package]] +name = "rustyline-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb35a55ab810b5c0fe31606fe9b47d1354e4dc519bec0a102655f78ea2b38057" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "safe-lock" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29841ed0a577196bca5b753cd4e4022fa50b718e56fc0d35919ed32e20ec65c" + +[[package]] +name = "safe-proc-macro2" +version = "1.0.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd85be67db87168aa3c13fd0da99f48f2ab005dccad5af5626138dc1df20eb6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "safe-quote" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e530f7831f3feafcd5f1aae406ac205dd998436b4007c8e80f03eca78a88f7" +dependencies = [ + "safe-proc-macro2", +] + +[[package]] +name = "safe-regex" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ab4bc484ef480a9ce79b381efd7b6767700f514d47bc599036e9d6f7f3c49d" +dependencies = [ + "safe-regex-macro", +] + +[[package]] +name = "safe-regex-compiler" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d71f8c78bffb07962595e1bfa5ed11d24dd855eedc50b6a735f5ef648ce621b" +dependencies = [ + "safe-proc-macro2", + "safe-quote", +] + +[[package]] +name = "safe-regex-macro" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0909ab4b77511df24201cd66541d6a028887c77ecc065f277c68a12a663274ef" +dependencies = [ + "safe-proc-macro2", + "safe-regex-compiler", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + +[[package]] +name = "serde-generate" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c9331265d81c61212dc75df7b0836544ed8e32dba77a522f113805ff9a948e" +dependencies = [ + "heck 0.3.3", + "include_dir", + "phf", + "serde", + "serde-reflection", + "textwrap 0.13.4", +] + +[[package]] +name = "serde-reflection" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05a5f801ac62a51a49d378fdb3884480041b99aced450b28990673e8ff99895" +dependencies = [ + "once_cell", + "serde", + "thiserror", +] + +[[package]] +name = "serde_derive" +version = "1.0.214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "serde_json" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_with" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.6.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "similar" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" +dependencies = [ + "bstr", + "unicode-segmentation", +] + +[[package]] +name = "similar-asserts" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe85670573cd6f0fa97940f26e7e6601213c3b0555246c24234131f88c5709e" +dependencies = [ + "console", + "similar", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "small-ord-set" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf7035a2b2268a5be8c1395738565b06beda836097e12021cdefc06b127a0e7e" +dependencies = [ + "smallvec", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smawk" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" + +[[package]] +name = "smol_str" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "str-buf" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" + +[[package]] +name = "str_stack" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091b6114800a5f2141aee1d1b9d6ca3592ac062dc5decb3764ec5895a47b4eb" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "symbolic-common" +version = "12.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d4d73159efebfb389d819fd479afb2dbd57dcb3e3f4b7fcfa0e675f5a46c1cb" +dependencies = [ + "debugid", + "memmap2", + "stable_deref_trait", + "uuid", +] + +[[package]] +name = "symbolic-demangle" +version = "12.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a767859f6549c665011970874c3f541838b4835d5aaaa493d3ee383918be9f10" +dependencies = [ + "cpp_demangle", + "rustc-demangle", + "symbolic-common", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +dependencies = [ + "cfg-if 1.0.0", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "termion" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417813675a504dfbbf21bfde32c03e5bf9f2413999962b479023c02848c1c7a5" +dependencies = [ + "libc", + "libredox 0.0.2", + "numtoa", + "redox_termios", +] + +[[package]] +name = "termtree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" + +[[package]] +name = "test-binary" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c7cb854285c40b61c0fade358bf63a2bb1226688a1ea11432ea65349209e6e3" +dependencies = [ + "camino", + "cargo_metadata", + "once_cell", + "paste", + "thiserror", +] + +[[package]] +name = "test-case" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2550dd13afcd286853192af8601920d959b14c401fcece38071d53bf0768a8" +dependencies = [ + "test-case-macros", +] + +[[package]] +name = "test-case-core" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" +dependencies = [ + "cfg-if 1.0.0", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "test-case-macros" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "test-case-core", +] + +[[package]] +name = "textwrap" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd05616119e612a8041ef58f2b578906cc2531a6069047ae092cfb86a325d835" +dependencies = [ + "smawk", + "unicode-width", +] + +[[package]] +name = "textwrap" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" +dependencies = [ + "smawk", + "unicode-linebreak", + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if 1.0.0", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.41.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio 1.0.2", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "tokio-stream" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.6.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tracing-web" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e6a141feebd51f8d91ebfd785af50fca223c570b86852166caa3b141defe7c" +dependencies = [ + "js-sys", + "tracing-core", + "tracing-subscriber", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "trie-rs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5096c019d49566aff57593a06e401c7f588da84e9a575d0ed2ac0913f51928c0" +dependencies = [ + "louds-rs", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicase" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" + +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +dependencies = [ + "idna 0.1.5", + "matches", + "percent-encoding 1.0.1", +] + +[[package]] +name = "url" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +dependencies = [ + "form_urlencoded", + "idna 1.0.3", + "percent-encoding 2.3.1", + "serde", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[package]] +name = "waitpid-any" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0189157c93c54d86e5c61ddf0c1223baa25e5bfb2f6f9983c678985b028d7c12" +dependencies = [ + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +dependencies = [ + "cfg-if 1.0.0", + "serde", + "serde_json", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.87", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e636f3a428ff62b3742ebc3c70e254dfe12b8c2b469d688ea59cdd4abcf502" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f18c1fad2f7c4958e7bcce014fa212f59a65d5e3721d0f77e6c0b27ede936ba3" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "web-sys" +version = "0.3.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "zkhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4352d1081da6922701401cdd4cbf29a2723feb4cfabb5771f6fee8e9276da1c7" +dependencies = [ + "ark-ff", + "ark-std", + "bitvec", + "blake2", + "bls12_381", + "byteorder", + "cfg-if 1.0.0", + "group 0.12.1", + "group 0.13.0", + "halo2", + "hex", + "jubjub", + "lazy_static", + "pasta_curves 0.5.1", + "rand 0.8.5", + "serde", + "sha2", + "sha3", + "subtle", +] From 9c66a91574e0528519710eee04bd9e0dbd50a504 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 21 Nov 2024 12:20:11 +0300 Subject: [PATCH 28/73] Avoid allocating extra vectors --- .../check_for_underconstrained_values.rs | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 41b0588fdd5..00ba4e8a896 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -106,11 +106,11 @@ struct BrilligTaintedIds { } impl BrilligTaintedIds { - // Add children of a given parent to the tainted value set - // (for arguments one set is enough, for results we keep them - // separate as all the results should be covered along - // with a single argument in the forthcoming check) - fn mark_children(&mut self, parent: &ValueId, children: &[ValueId]) { + /// Add children of a given parent to the tainted value set + /// (for arguments one set is enough, for results we keep them + /// separate as all the results should be covered along + /// with a single argument in the forthcoming check) + fn update_children(&mut self, parent: &ValueId, children: &[ValueId]) { if self.arguments.contains(parent) { self.arguments.extend(children); } @@ -121,7 +121,7 @@ impl BrilligTaintedIds { } } - // If brillig call is properly constrained by the given ids, return true + /// If brillig call is properly constrained by the given ids, return true fn check_constrained(&self, constrained_values: &HashSet) -> bool { // Every result should be constrained let results_constrained = self @@ -138,9 +138,8 @@ impl BrilligTaintedIds { } impl DependencyContext { - /// Build the dependency graph of variable ValueIds, also storing - /// information on value ids involved in constrain operations - /// and brillig calls + /// Build the dependency context of variable ValueIds, storing + /// information on value ids involved in unchecked brillig calls fn build(&mut self, function: &Function, all_functions: &BTreeMap) { self.block_queue.push(function.entry_block()); while let Some(block) = self.block_queue.pop() { @@ -159,10 +158,12 @@ impl DependencyContext { all_functions: &BTreeMap, ) { trace!("processing instructions of block {} of function {}", block, function); + let mut arguments = Vec::new(); + let mut results = Vec::new(); for instruction in function.dfg[block].instructions() { - let mut arguments = Vec::new(); - let mut results = Vec::new(); + arguments.clear(); + results.clear(); // Collect non-constant instruction arguments function.dfg[*instruction].for_each_value(|value_id| { @@ -314,17 +315,17 @@ impl DependencyContext { warnings } - // Update sets of value ids that can be traced back to recorded brillig calls + /// Update sets of value ids that can be traced back to recorded brillig calls fn update_children(&mut self, parents: &[ValueId], children: &[ValueId]) { for (_, tainted_ids) in self.tainted.iter_mut() { for parent in parents { - tainted_ids.mark_children(parent, children); + tainted_ids.update_children(parent, children); } } } - // Check if any of the recorded brillig calls has been properly constrained - // by given values, if so stop following it + /// Check if any of the recorded brillig calls has been properly constrained + /// by given values, if so stop following it fn clear_constrained(&mut self, constrained_values: &[ValueId]) { trace!("attempting to clear brillig calls constrained by values: {:?}", constrained_values); let constrained_values: HashSet<_> = HashSet::from_iter(constrained_values.iter().copied()); From caf8b0d561bc35e599413d3bf9c288e71889aa2f Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 25 Nov 2024 18:53:49 +0300 Subject: [PATCH 29/73] Update match --- .../src/ssa/checks/check_for_underconstrained_values.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index cecfe35d572..3cb192d6b2b 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -222,6 +222,7 @@ impl DependencyContext { // These intrinsics won't affect the dependency graph } Intrinsic::ArrayLen + | Intrinsic::ArrayRefCount | Intrinsic::ArrayAsStrUnchecked | Intrinsic::AsField | Intrinsic::AsSlice @@ -232,6 +233,7 @@ impl DependencyContext { | Intrinsic::SlicePushFront | Intrinsic::SlicePopBack | Intrinsic::SlicePopFront + | Intrinsic::SliceRefCount | Intrinsic::SliceInsert | Intrinsic::SliceRemove | Intrinsic::StaticAssert @@ -266,8 +268,7 @@ impl DependencyContext { Value::ForeignFunction(..) => { debug!("should not be able to reach foreign function from non-brillig functions, {func_id} in function {}", function.name()); } - Value::Array { .. } - | Value::Instruction { .. } + Value::Instruction { .. } | Value::NumericConstant { .. } | Value::Param { .. } => { debug!( @@ -291,7 +292,8 @@ impl DependencyContext { Instruction::Allocate { .. } | Instruction::DecrementRc { .. } | Instruction::EnableSideEffectsIf { .. } - | Instruction::IncrementRc { .. } => {} + | Instruction::IncrementRc { .. } + | Instruction::MakeArray { .. } => {} } } From 75e5cc0f94abb10059e3bc1f466f1e0291be7b2e Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Fri, 29 Nov 2024 20:44:18 +0300 Subject: [PATCH 30/73] Fix typos, improve comments --- compiler/noirc_evaluator/src/errors.rs | 2 +- .../check_for_underconstrained_values.rs | 20 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/compiler/noirc_evaluator/src/errors.rs b/compiler/noirc_evaluator/src/errors.rs index 78719a92296..640bf2e2f1c 100644 --- a/compiler/noirc_evaluator/src/errors.rs +++ b/compiler/noirc_evaluator/src/errors.rs @@ -122,7 +122,7 @@ pub enum InternalWarning { pub enum InternalBug { #[error("Input to brillig function is in a separate subgraph to output")] IndependentSubgraph { call_stack: CallStack }, - #[error("Brillig function call isn't properly covered by a manual constrain")] + #[error("Brillig function call isn't properly covered by a manual constraint")] UncheckedBrilligCall { call_stack: CallStack }, #[error("Assertion is always false")] AssertFailed { call_stack: CallStack }, diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 3cb192d6b2b..6a53a9a1376 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -36,8 +36,8 @@ impl Ssa { .collect() } - /// Detect brillig calls left unconstrained with later manual asserts - /// and return a vector of bug reports if some are found + /// Detect brillig calls left unconstrained with manual asserts + /// and return a vector of bug reports if any have been found pub(crate) fn check_for_missing_brillig_constrains(&mut self) -> Vec { let functions_id = self.functions.values().map(|f| f.id().to_usize()).collect::>(); functions_id @@ -99,6 +99,8 @@ struct DependencyContext { tainted: HashMap, } +/// Structure keeping track of value ids descending from brilling calls' +/// arguments and results #[derive(Clone, Debug)] struct BrilligTaintedIds { arguments: HashSet, @@ -108,8 +110,8 @@ struct BrilligTaintedIds { impl BrilligTaintedIds { /// Add children of a given parent to the tainted value set /// (for arguments one set is enough, for results we keep them - /// separate as all the results should be covered along - /// with a single argument in the forthcoming check) + /// separate as the forthcoming check considers the call covered + /// if all the results and one of the arguments were covered fn update_children(&mut self, parent: &ValueId, children: &[ValueId]) { if self.arguments.contains(parent) { self.arguments.extend(children); @@ -151,6 +153,8 @@ impl DependencyContext { } } + /// Go over the given block tracking brillig calls and checking them against + /// following constraints fn process_instructions( &mut self, block: BasicBlockId, @@ -317,7 +321,7 @@ impl DependencyContext { warnings } - /// Update sets of value ids that can be traced back to recorded brillig calls + /// Update sets of value ids that can be traced back to the brillig calls being tracked fn update_children(&mut self, parents: &[ValueId], children: &[ValueId]) { for (_, tainted_ids) in self.tainted.iter_mut() { for parent in parents { @@ -326,8 +330,8 @@ impl DependencyContext { } } - /// Check if any of the recorded brillig calls has been properly constrained - /// by given values, if so stop following it + /// Check if any of the recorded brillig calls have been properly constrained + /// by given values, if so stop tracking them fn clear_constrained(&mut self, constrained_values: &[ValueId]) { trace!("attempting to clear brillig calls constrained by values: {:?}", constrained_values); let constrained_values: HashSet<_> = HashSet::from_iter(constrained_values.iter().copied()); @@ -717,7 +721,7 @@ mod test { #[test] #[traced_test] /// Test where a call to a brillig function is left unchecked with a later assert, - /// by example of the program illustrating issue #5425 (simplified). + /// by example of the program illustrating issue #5425 (simplified variant). fn test_underconstrained_value_detector_5425() { /* unconstrained fn maximum_price(options: [u32; 2]) -> u32 { From 2c5bccdc7ee1814cc9cab746d88730db9efc73fd Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Fri, 29 Nov 2024 22:25:07 +0300 Subject: [PATCH 31/73] Update Cargo.lock --- Cargo.lock | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 94a84b89d05..fdf17c8a6d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3153,6 +3153,7 @@ dependencies = [ "similar-asserts", "thiserror", "tracing", + "tracing-test", ] [[package]] @@ -5064,6 +5065,27 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tracing-test" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "557b891436fe0d5e0e363427fc7f217abf9ccd510d5136549847bdcbcd011d68" +dependencies = [ + "tracing-core", + "tracing-subscriber", + "tracing-test-macro", +] + +[[package]] +name = "tracing-test-macro" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" +dependencies = [ + "quote", + "syn 2.0.87", +] + [[package]] name = "tracing-web" version = "0.1.3" From 241ed61f3bbd43592bbe1995cdde5eca2200c5db Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Sat, 30 Nov 2024 23:40:48 +0300 Subject: [PATCH 32/73] Update the check to comply with the check_unconstrained_regression test --- .../check_for_underconstrained_values.rs | 98 ++++++++++++++----- 1 file changed, 76 insertions(+), 22 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 6a53a9a1376..b5f168ae88f 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -94,20 +94,39 @@ struct DependencyContext { block_queue: Vec, // Map keeping track of values stored at memory locations memory_slots: HashMap, - // Map of brillig call ids to sets of the value ids depending - // on their arguments and results + // Map of values resulting from array get instructions + // to the actual array values + array_elements: HashMap, + // Map of brillig call ids to sets of the value ids descending + // from their arguments and results tainted: HashMap, } /// Structure keeping track of value ids descending from brilling calls' -/// arguments and results +/// arguments and results, also storing information on relevant ids +/// already constrained #[derive(Clone, Debug)] struct BrilligTaintedIds { + // Argument descendant value ids arguments: HashSet, + // Result descendant value ids results: Vec>, + // Initial result value ids + root_results: HashSet, + // Already constrained value ids + constrained: HashSet, } impl BrilligTaintedIds { + fn new(arguments: &[ValueId], results: &[ValueId]) -> Self { + BrilligTaintedIds { + arguments: HashSet::from_iter(arguments.iter().copied()), + results: results.iter().map(|result| HashSet::from([*result])).collect(), + root_results: HashSet::from_iter(results.iter().copied()), + constrained: HashSet::new(), + } + } + /// Add children of a given parent to the tainted value set /// (for arguments one set is enough, for results we keep them /// separate as the forthcoming check considers the call covered @@ -124,18 +143,37 @@ impl BrilligTaintedIds { } /// If brillig call is properly constrained by the given ids, return true - fn check_constrained(&self, constrained_values: &HashSet) -> bool { - // Every result should be constrained - let results_constrained = self + fn check_constrained(&self) -> bool { + // If every result has now been constrained, + // consider the call properly constrained + self.results + .iter() + .map(|values| values.intersection(&self.constrained).next().is_some()) + .all(|constrained| constrained) + } + + /// Remember partial constraints (involving one result and one argument) + /// along the way to take them into final consideration + fn store_partial_constraints(&mut self, constrained_values: &HashSet) { + // For a valid partial constrain, a value descending from + // one of the results should be constrained + let result_constrained = self .results .iter() .map(|values| values.intersection(constrained_values).next().is_some()) - .all(|constrained| constrained); + .any(|constrained| constrained); - // Along with any argument (in case non-constant arguments were present) - (self.arguments.is_empty() + // Also, one of the argument descendants should be constrained + // (skipped if there were no arguments, or if the actual result and not a + // descendant has been constrained) + if (self.arguments.is_empty() + || self.root_results.intersection(constrained_values).next().is_some() || self.arguments.intersection(constrained_values).next().is_some()) - && results_constrained + && result_constrained + { + // Remember the partial constraint + self.constrained.extend(constrained_values); + } } } @@ -255,13 +293,7 @@ impl DependencyContext { trace!("brillig function {} called at {}", callee, instruction); self.tainted.insert( *instruction, - BrilligTaintedIds { - arguments: HashSet::from_iter(arguments.iter().copied()), - results: results - .iter() - .map(|result| HashSet::from([*result])) - .collect(), - }, + BrilligTaintedIds::new(&arguments, &results), ); } RuntimeType::Acir(..) => { @@ -282,8 +314,16 @@ impl DependencyContext { } } } - Instruction::ArrayGet { .. } - | Instruction::ArraySet { .. } + // For array get operations, we link the resulting values to + // the corresponding array value ids + // (this is required later because for now we consider array elements + // being constrained as valid as the whole arrays being constrained) + Instruction::ArrayGet { array, .. } => { + for result in &results { + self.array_elements.insert(*result, *array); + } + } + Instruction::ArraySet { .. } | Instruction::Binary(..) | Instruction::Cast(..) | Instruction::IfElse { .. } @@ -331,11 +371,25 @@ impl DependencyContext { } /// Check if any of the recorded brillig calls have been properly constrained - /// by given values, if so stop tracking them + /// by given values after recording partial constraints, if so stop tracking them fn clear_constrained(&mut self, constrained_values: &[ValueId]) { trace!("attempting to clear brillig calls constrained by values: {:?}", constrained_values); - let constrained_values: HashSet<_> = HashSet::from_iter(constrained_values.iter().copied()); - self.tainted.retain(|_, tainted_ids| !tainted_ids.check_constrained(&constrained_values)); + + // For now, consider array element constraints to be array constraints + // TODO: this probably has to be further looked into, to ensure _every_ element + // of an array result of a brillig call has been constrained + + let constrained_arrays = + constrained_values.iter().filter_map(|value| self.array_elements.get(value)); + + let mut constrained_values: HashSet<_> = + HashSet::from_iter(constrained_values.iter().copied()); + constrained_values.extend(constrained_arrays); + + self.tainted.iter_mut().for_each(|(_, tainted_ids)| { + tainted_ids.store_partial_constraints(&constrained_values); + }); + self.tainted.retain(|_, tainted_ids| !tainted_ids.check_constrained()); } } From d86cfa2651c70694a7ae3ca1ab69c977c8763626 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Sun, 1 Dec 2024 00:10:18 +0300 Subject: [PATCH 33/73] Capitalize Brillig in comments to match the style --- compiler/noirc_driver/src/lib.rs | 2 +- compiler/noirc_evaluator/src/ssa.rs | 4 +- .../check_for_underconstrained_values.rs | 58 +++++++++---------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/compiler/noirc_driver/src/lib.rs b/compiler/noirc_driver/src/lib.rs index 717fd772bac..df8f8931bf3 100644 --- a/compiler/noirc_driver/src/lib.rs +++ b/compiler/noirc_driver/src/lib.rs @@ -126,7 +126,7 @@ pub struct CompileOptions { #[arg(long)] pub skip_underconstrained_check: bool, - /// Flag to turn off the compiler check for missing brilling call constrains. + /// Flag to turn off the compiler check for missing Brillig call constrains. /// Warning: This can improve compilation speed but can also lead to correctness errors. /// This check should always be run on production code. #[arg(long)] diff --git a/compiler/noirc_evaluator/src/ssa.rs b/compiler/noirc_evaluator/src/ssa.rs index 4844b62757c..27ac184a9f4 100644 --- a/compiler/noirc_evaluator/src/ssa.rs +++ b/compiler/noirc_evaluator/src/ssa.rs @@ -65,10 +65,10 @@ pub struct SsaEvaluatorOptions { /// Skip the check for under constrained values pub skip_underconstrained_check: bool, - /// Skip the missing brillig call constrains check + /// Skip the missing Brillig call constrains check pub skip_missing_brillig_constrains_check: bool, - /// The higher the value, the more inlined brillig functions will be. + /// The higher the value, the more inlined Brillig functions will be. pub inliner_aggressiveness: i64, /// Maximum accepted percentage increase in the Brillig bytecode size after unrolling loops. diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index b5f168ae88f..08df9f02a47 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -16,7 +16,7 @@ use tracing::{debug, trace}; impl Ssa { /// This function provides an SSA pass that detects if the final function has any subgraphs independent from inputs and outputs. /// If this is the case, then part of the final circuit can be completely replaced by any other passing circuit, since there are no constraints ensuring connections. - /// Go through each top-level non-brillig function and detect if it has independent subgraphs + /// Go through each top-level non-Brillig function and detect if it has independent subgraphs #[tracing::instrument(level = "trace", skip(self))] pub(crate) fn check_for_underconstrained_values(&mut self) -> Vec { let functions_id = self.functions.values().map(|f| f.id().to_usize()).collect::>(); @@ -36,7 +36,7 @@ impl Ssa { .collect() } - /// Detect brillig calls left unconstrained with manual asserts + /// Detect Brillig calls left unconstrained with manual asserts /// and return a vector of bug reports if any have been found pub(crate) fn check_for_missing_brillig_constrains(&mut self) -> Vec { let functions_id = self.functions.values().map(|f| f.id().to_usize()).collect::>(); @@ -142,7 +142,7 @@ impl BrilligTaintedIds { } } - /// If brillig call is properly constrained by the given ids, return true + /// If Brillig call is properly constrained by the given ids, return true fn check_constrained(&self) -> bool { // If every result has now been constrained, // consider the call properly constrained @@ -179,7 +179,7 @@ impl BrilligTaintedIds { impl DependencyContext { /// Build the dependency context of variable ValueIds, storing - /// information on value ids involved in unchecked brillig calls + /// information on value ids involved in unchecked Brillig calls fn build(&mut self, function: &Function, all_functions: &BTreeMap) { self.block_queue.push(function.entry_block()); while let Some(block) = self.block_queue.pop() { @@ -191,7 +191,7 @@ impl DependencyContext { } } - /// Go over the given block tracking brillig calls and checking them against + /// Go over the given block tracking Brillig calls and checking them against /// following constraints fn process_instructions( &mut self, @@ -238,7 +238,7 @@ impl DependencyContext { } } // Check the constrain instruction arguments against those - // involved in brillig calls, remove covered calls + // involved in Brillig calls, remove covered calls Instruction::Constrain(value_id1, value_id2, _) => { self.clear_constrained(&[ function.dfg.resolve(*value_id1), @@ -289,8 +289,8 @@ impl DependencyContext { }, Value::Function(callee) => match all_functions[&callee].runtime() { RuntimeType::Brillig(_) => { - // Record arguments/results for each brillig call for the check - trace!("brillig function {} called at {}", callee, instruction); + // Record arguments/results for each Brillig call for the check + trace!("Brillig function {} called at {}", callee, instruction); self.tainted.insert( *instruction, BrilligTaintedIds::new(&arguments, &results), @@ -302,7 +302,7 @@ impl DependencyContext { } }, Value::ForeignFunction(..) => { - debug!("should not be able to reach foreign function from non-brillig functions, {func_id} in function {}", function.name()); + debug!("should not be able to reach foreign function from non-Brillig functions, {func_id} in function {}", function.name()); } Value::Instruction { .. } | Value::NumericConstant { .. } @@ -341,10 +341,10 @@ impl DependencyContext { } } - trace!("resulting brillig involved values: {:?}", self.tainted); + trace!("resulting Brillig involved values: {:?}", self.tainted); } - /// Every brillig call not properly constrained should remain in the tainted set + /// Every Brillig call not properly constrained should remain in the tainted set /// at this point. For each, emit a corresponding warning. fn collect_warnings(&mut self, function: &Function) -> Vec { let warnings: Vec = self @@ -361,7 +361,7 @@ impl DependencyContext { warnings } - /// Update sets of value ids that can be traced back to the brillig calls being tracked + /// Update sets of value ids that can be traced back to the Brillig calls being tracked fn update_children(&mut self, parents: &[ValueId], children: &[ValueId]) { for (_, tainted_ids) in self.tainted.iter_mut() { for parent in parents { @@ -370,14 +370,14 @@ impl DependencyContext { } } - /// Check if any of the recorded brillig calls have been properly constrained + /// Check if any of the recorded Brillig calls have been properly constrained /// by given values after recording partial constraints, if so stop tracking them fn clear_constrained(&mut self, constrained_values: &[ValueId]) { - trace!("attempting to clear brillig calls constrained by values: {:?}", constrained_values); + trace!("attempting to clear Brillig calls constrained by values: {:?}", constrained_values); // For now, consider array element constraints to be array constraints // TODO: this probably has to be further looked into, to ensure _every_ element - // of an array result of a brillig call has been constrained + // of an array result of a Brillig call has been constrained let constrained_arrays = constrained_values.iter().filter_map(|value| self.array_elements.get(value)); @@ -405,7 +405,7 @@ struct Context { impl Context { /// Compute sets of variable ValueIds that are connected with constraints /// - /// Additionally, store information about brillig calls in the context + /// Additionally, store information about Brillig calls in the context fn compute_sets_of_connected_value_ids( &mut self, function: &Function, @@ -452,7 +452,7 @@ impl Context { connected_sets_indices } - /// Find which brillig calls separate this set from others and return bug warnings about them + /// Find which Brillig calls separate this set from others and return bug warnings about them fn find_disconnecting_brillig_calls_with_results_in_set( &self, current_set: &HashSet, @@ -463,7 +463,7 @@ impl Context { // Find brillig-generated values in the set let intersection = all_brillig_generated_values.intersection(current_set).copied(); - // Go through all brillig outputs in the set + // Go through all Brillig outputs in the set for brillig_output_in_set in intersection { // Get the inputs that correspond to the output let inputs: HashSet = @@ -485,7 +485,7 @@ impl Context { } /// Go through each instruction in the block and add a set of ValueIds connected through that instruction /// - /// Additionally, this function adds mappings of brillig return values to call arguments and instruction ids from calls to brillig functions in the block + /// Additionally, this function adds mappings of Brillig return values to call arguments and instruction ids from calls to Brillig functions in the block fn connect_value_ids_in_block( &mut self, function: &Function, @@ -558,7 +558,7 @@ impl Context { }, Value::Function(callee) => match all_functions[&callee].runtime() { RuntimeType::Brillig(_) => { - // For calls to brillig functions we memorize the mapping of results to argument ValueId's and InstructionId's + // For calls to Brillig functions we memorize the mapping of results to argument ValueId's and InstructionId's // The latter are needed to produce the callstack later for result in function.dfg.instruction_results(*instruction).iter().filter( @@ -578,7 +578,7 @@ impl Context { } }, Value::ForeignFunction(..) => { - panic!("Should not be able to reach foreign function from non-brillig functions, {func_id} in function {}", function.name()); + panic!("Should not be able to reach foreign function from non-Brillig functions, {func_id} in function {}", function.name()); } Value::Instruction { .. } | Value::NumericConstant { .. } @@ -728,7 +728,7 @@ mod test { #[test] #[traced_test] - /// Test where the results of a call to a brillig function are not connected to main function inputs or outputs + /// Test where the results of a call to a Brillig function are not connected to main function inputs or outputs /// This should be detected. fn test_simple_function_with_disconnected_part() { // unconstrained fn br(v0: Field, v1: Field){ @@ -774,7 +774,7 @@ mod test { #[test] #[traced_test] - /// Test where a call to a brillig function is left unchecked with a later assert, + /// Test where a call to a Brillig function is left unchecked with a later assert, /// by example of the program illustrating issue #5425 (simplified variant). fn test_underconstrained_value_detector_5425() { /* @@ -880,7 +880,7 @@ mod test { builder.terminate_with_return(vec![]); - // We're faking the brillig function here, for simplicity's sake + // We're faking the Brillig function here, for simplicity's sake builder.new_brillig_function("maximum_price".into(), br_function_id, InlineType::default()); let v0 = builder.add_parameter(Type::Array(Arc::new(vec![type_u32.clone()]), 2)); @@ -925,7 +925,7 @@ mod test { builder.terminate_with_return(vec![]); - // We're faking the brillig function here, for simplicity's sake + // We're faking the Brillig function here, for simplicity's sake builder.new_brillig_function("factor".into(), br_function_id, InlineType::default()); builder.add_parameter(type_u32.clone()); @@ -958,7 +958,7 @@ mod test { let br_function = builder.import_function(br_function_id); // The call is constrained properly, involving both results - // (but the argument to the brillig is a constant) + // (but the argument to the Brillig is a constant) let call_results = builder.insert_call(br_function, vec![seven], vec![type_u32.clone(), type_u32.clone()]); let (v6, v7) = (call_results[0], call_results[1]); @@ -967,7 +967,7 @@ mod test { builder.terminate_with_return(vec![]); - // We're faking the brillig function here, for simplicity's sake + // We're faking the Brillig function here, for simplicity's sake builder.new_brillig_function("factor".into(), br_function_id, InlineType::default()); builder.add_parameter(Type::field()); @@ -997,7 +997,7 @@ mod test { let br_function = builder.import_function(br_function_id); // The call is constrained properly with a range check, involving - // both brillig call argument and result + // both Brillig call argument and result let call_results = builder.insert_call(br_function, vec![v0], vec![type_u32.clone()]); let v1 = call_results[0]; let v2 = builder.insert_binary(v1, BinaryOp::Add, v0); @@ -1005,7 +1005,7 @@ mod test { builder.terminate_with_return(vec![]); - // We're faking the brillig function here, for simplicity's sake + // We're faking the Brillig function here, for simplicity's sake builder.new_brillig_function("dummy".into(), br_function_id, InlineType::default()); builder.add_parameter(type_u32.clone()); From 6b4b719a6e3a5acfb6ef3070d41548af4a568fe7 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Sun, 1 Dec 2024 00:16:46 +0300 Subject: [PATCH 34/73] Capitalize Brillig --- compiler/noirc_evaluator/src/errors.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/errors.rs b/compiler/noirc_evaluator/src/errors.rs index 640bf2e2f1c..755ec3a0f20 100644 --- a/compiler/noirc_evaluator/src/errors.rs +++ b/compiler/noirc_evaluator/src/errors.rs @@ -120,7 +120,7 @@ pub enum InternalWarning { #[derive(Debug, PartialEq, Eq, Clone, Error, Serialize, Deserialize)] pub enum InternalBug { - #[error("Input to brillig function is in a separate subgraph to output")] + #[error("Input to Brillig function is in a separate subgraph to output")] IndependentSubgraph { call_stack: CallStack }, #[error("Brillig function call isn't properly covered by a manual constraint")] UncheckedBrilligCall { call_stack: CallStack }, From 5429962d442f410323a7e906532aba5435679590 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Sun, 1 Dec 2024 00:38:33 +0300 Subject: [PATCH 35/73] Fix array get handling --- .../src/ssa/checks/check_for_underconstrained_values.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 08df9f02a47..84c52ae79a9 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -165,9 +165,9 @@ impl BrilligTaintedIds { // Also, one of the argument descendants should be constrained // (skipped if there were no arguments, or if the actual result and not a - // descendant has been constrained) + // descendant has been constrained, e.g. against a constant) if (self.arguments.is_empty() - || self.root_results.intersection(constrained_values).next().is_some() + || self.root_results.is_superset(constrained_values) || self.arguments.intersection(constrained_values).next().is_some()) && result_constrained { @@ -322,6 +322,8 @@ impl DependencyContext { for result in &results { self.array_elements.insert(*result, *array); } + // Record all the used arguments as parents of the results + self.update_children(&arguments, &results); } Instruction::ArraySet { .. } | Instruction::Binary(..) From c2c8b9a7f3d38c333dc85c3fc243adb8c9c18d06 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Sun, 1 Dec 2024 01:12:27 +0300 Subject: [PATCH 36/73] Fix/optimize partial constraint aggregation --- .../check_for_underconstrained_values.rs | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 84c52ae79a9..9a609c16330 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -113,8 +113,8 @@ struct BrilligTaintedIds { results: Vec>, // Initial result value ids root_results: HashSet, - // Already constrained value ids - constrained: HashSet, + // Result indices already found constrained + results_constrained: HashSet, } impl BrilligTaintedIds { @@ -123,19 +123,23 @@ impl BrilligTaintedIds { arguments: HashSet::from_iter(arguments.iter().copied()), results: results.iter().map(|result| HashSet::from([*result])).collect(), root_results: HashSet::from_iter(results.iter().copied()), - constrained: HashSet::new(), + results_constrained: HashSet::new(), } } /// Add children of a given parent to the tainted value set /// (for arguments one set is enough, for results we keep them /// separate as the forthcoming check considers the call covered - /// if all the results and one of the arguments were covered + /// if all the results were properly covered) fn update_children(&mut self, parent: &ValueId, children: &[ValueId]) { if self.arguments.contains(parent) { self.arguments.extend(children); } - for result in &mut self.results { + for (i, result) in &mut self.results.iter_mut().enumerate() { + // Skip updating results already found covered + if self.results_constrained.contains(&i) { + continue; + } if result.contains(parent) { result.extend(children); } @@ -146,33 +150,36 @@ impl BrilligTaintedIds { fn check_constrained(&self) -> bool { // If every result has now been constrained, // consider the call properly constrained - self.results - .iter() - .map(|values| values.intersection(&self.constrained).next().is_some()) - .all(|constrained| constrained) + self.results.len() == self.results_constrained.len() } - /// Remember partial constraints (involving one result and one argument) + /// Remember partial constraints (involving some of the results and an argument) /// along the way to take them into final consideration fn store_partial_constraints(&mut self, constrained_values: &HashSet) { + let mut results_involved: Vec = vec![]; + // For a valid partial constrain, a value descending from // one of the results should be constrained - let result_constrained = self - .results - .iter() - .map(|values| values.intersection(constrained_values).next().is_some()) - .any(|constrained| constrained); + for (i, result_descendants) in self.results.iter().enumerate() { + // Skip checking already covered results + if self.results_constrained.contains(&i) { + continue; + } + if result_descendants.intersection(constrained_values).next().is_some() { + results_involved.push(i); + } + } // Also, one of the argument descendants should be constrained - // (skipped if there were no arguments, or if the actual result and not a + // (skipped if there were no arguments, or if an actual result and not a // descendant has been constrained, e.g. against a constant) if (self.arguments.is_empty() - || self.root_results.is_superset(constrained_values) + || self.root_results.intersection(constrained_values).next().is_some() || self.arguments.intersection(constrained_values).next().is_some()) - && result_constrained + && !results_involved.is_empty() { // Remember the partial constraint - self.constrained.extend(constrained_values); + self.results_constrained.extend(results_involved); } } } From 5fb7f5becf7dad81d5fff608cfe54555fd82d2b9 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Sun, 1 Dec 2024 01:51:37 +0300 Subject: [PATCH 37/73] Optimize --- .../ssa/checks/check_for_underconstrained_values.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 9a609c16330..892ce7b96ef 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -103,8 +103,8 @@ struct DependencyContext { } /// Structure keeping track of value ids descending from brilling calls' -/// arguments and results, also storing information on relevant ids -/// already constrained +/// arguments and results, also storing information on results +/// already properly constrained #[derive(Clone, Debug)] struct BrilligTaintedIds { // Argument descendant value ids @@ -173,10 +173,10 @@ impl BrilligTaintedIds { // Also, one of the argument descendants should be constrained // (skipped if there were no arguments, or if an actual result and not a // descendant has been constrained, e.g. against a constant) - if (self.arguments.is_empty() - || self.root_results.intersection(constrained_values).next().is_some() - || self.arguments.intersection(constrained_values).next().is_some()) - && !results_involved.is_empty() + if !results_involved.is_empty() + && (self.arguments.is_empty() + || self.root_results.intersection(constrained_values).next().is_some() + || self.arguments.intersection(constrained_values).next().is_some()) { // Remember the partial constraint self.results_constrained.extend(results_involved); From cef0f9a6dfffbfd331c95b5033a0ae5b8c9bb2ef Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Sun, 1 Dec 2024 02:26:00 +0300 Subject: [PATCH 38/73] Optimize, skip over instructions preceding Brillig calls --- .../checks/check_for_underconstrained_values.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 892ce7b96ef..b7dcd269db0 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -211,6 +211,19 @@ impl DependencyContext { let mut results = Vec::new(); for instruction in function.dfg[block].instructions() { + // Optimization: there is no reason to do anything until a Brillig + // call is encountered + if self.tainted.is_empty() { + if let Instruction::Call { func: func_id, .. } = &function.dfg[*instruction] { + if let Value::Function(callee) = &function.dfg[*func_id] { + if let RuntimeType::Brillig(_) = all_functions[&callee].runtime() { + } else { + continue; + } + } + } + } + arguments.clear(); results.clear(); @@ -327,7 +340,7 @@ impl DependencyContext { // being constrained as valid as the whole arrays being constrained) Instruction::ArrayGet { array, .. } => { for result in &results { - self.array_elements.insert(*result, *array); + self.array_elements.insert(*result, function.dfg.resolve(*array)); } // Record all the used arguments as parents of the results self.update_children(&arguments, &results); From 0a75c0af1ff898468ff990fcb664f9fb89e6e4a3 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Sun, 1 Dec 2024 03:05:40 +0300 Subject: [PATCH 39/73] Skip the check if there are no Brillig functions --- .../src/ssa/checks/check_for_underconstrained_values.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index b7dcd269db0..1979ceaed7b 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -39,6 +39,11 @@ impl Ssa { /// Detect Brillig calls left unconstrained with manual asserts /// and return a vector of bug reports if any have been found pub(crate) fn check_for_missing_brillig_constrains(&mut self) -> Vec { + // Skip the check if there are no Brillig calls involved + if !self.functions.values().any(|func| func.runtime().is_brillig()) { + return vec![]; + }; + let functions_id = self.functions.values().map(|f| f.id().to_usize()).collect::>(); functions_id .iter() @@ -216,8 +221,7 @@ impl DependencyContext { if self.tainted.is_empty() { if let Instruction::Call { func: func_id, .. } = &function.dfg[*instruction] { if let Value::Function(callee) = &function.dfg[*func_id] { - if let RuntimeType::Brillig(_) = all_functions[&callee].runtime() { - } else { + if !all_functions[&callee].runtime().is_brillig() { continue; } } From a55b1bcf51b7eb1621fe1f8f0d29719794c58880 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Sun, 1 Dec 2024 03:22:41 +0300 Subject: [PATCH 40/73] Fix typos --- compiler/noirc_driver/src/lib.rs | 4 ++-- compiler/noirc_evaluator/src/ssa.rs | 10 +++++----- .../ssa/checks/check_for_underconstrained_values.rs | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/compiler/noirc_driver/src/lib.rs b/compiler/noirc_driver/src/lib.rs index df8f8931bf3..a83c13e0b6a 100644 --- a/compiler/noirc_driver/src/lib.rs +++ b/compiler/noirc_driver/src/lib.rs @@ -130,7 +130,7 @@ pub struct CompileOptions { /// Warning: This can improve compilation speed but can also lead to correctness errors. /// This check should always be run on production code. #[arg(long)] - pub skip_missing_brillig_constrains_check: bool, + pub skip_missing_brillig_constraints_check: bool, /// Setting to decide on an inlining strategy for Brillig functions. /// A more aggressive inliner should generate larger programs but more optimized @@ -602,7 +602,7 @@ pub fn compile_no_check( }, emit_ssa: if options.emit_ssa { Some(context.package_build_path.clone()) } else { None }, skip_underconstrained_check: options.skip_underconstrained_check, - skip_missing_brillig_constrains_check: options.skip_missing_brillig_constrains_check, + skip_missing_brillig_constraints_check: options.skip_missing_brillig_constraints_check, inliner_aggressiveness: options.inliner_aggressiveness, max_bytecode_increase_percent: options.max_bytecode_increase_percent, }; diff --git a/compiler/noirc_evaluator/src/ssa.rs b/compiler/noirc_evaluator/src/ssa.rs index 27ac184a9f4..842cf329c94 100644 --- a/compiler/noirc_evaluator/src/ssa.rs +++ b/compiler/noirc_evaluator/src/ssa.rs @@ -65,8 +65,8 @@ pub struct SsaEvaluatorOptions { /// Skip the check for under constrained values pub skip_underconstrained_check: bool, - /// Skip the missing Brillig call constrains check - pub skip_missing_brillig_constrains_check: bool, + /// Skip the missing Brillig call constraints check + pub skip_missing_brillig_constraints_check: bool, /// The higher the value, the more inlined Brillig functions will be. pub inliner_aggressiveness: i64, @@ -148,11 +148,11 @@ pub(crate) fn optimize_into_acir( )); } - if !options.skip_missing_brillig_constrains_check { + if !options.skip_missing_brillig_constraints_check { ssa_level_warnings.extend(time( - "After Check for Missing Brillig Call Constrains", + "After Check for Missing Brillig Call Constraints", options.print_codegen_timings, - || ssa.check_for_missing_brillig_constrains(), + || ssa.check_for_missing_brillig_constraints(), )); }; diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 1979ceaed7b..777d10c5b7b 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -38,8 +38,8 @@ impl Ssa { /// Detect Brillig calls left unconstrained with manual asserts /// and return a vector of bug reports if any have been found - pub(crate) fn check_for_missing_brillig_constrains(&mut self) -> Vec { - // Skip the check if there are no Brillig calls involved + pub(crate) fn check_for_missing_brillig_constraints(&mut self) -> Vec { + // Skip the check if there are no Brillig functions involved if !self.functions.values().any(|func| func.runtime().is_brillig()) { return vec![]; }; @@ -916,7 +916,7 @@ mod test { builder.terminate_with_return(vec![v1]); let mut ssa = builder.finish(); - let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); assert_eq!(ssa_level_warnings.len(), 1); } @@ -961,7 +961,7 @@ mod test { let mut ssa = builder.finish(); - let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); assert_eq!(ssa_level_warnings.len(), 1); } @@ -1003,7 +1003,7 @@ mod test { let mut ssa = builder.finish(); - let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); assert_eq!(ssa_level_warnings.len(), 0); } @@ -1040,7 +1040,7 @@ mod test { let mut ssa = builder.finish(); - let ssa_level_warnings = ssa.check_for_missing_brillig_constrains(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); assert_eq!(ssa_level_warnings.len(), 0); } } From 73e6ce2810d8d40ccd14b03b06fa0cdc88c51dd5 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 2 Dec 2024 15:55:54 +0300 Subject: [PATCH 41/73] Attempt lowering recursion limit --- compiler/noirc_evaluator/src/ssa/opt/inlining.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/opt/inlining.rs b/compiler/noirc_evaluator/src/ssa/opt/inlining.rs index f91487fd73e..52d56cecb2c 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/inlining.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/inlining.rs @@ -22,7 +22,7 @@ use fxhash::FxHashMap as HashMap; /// An arbitrary limit to the maximum number of recursive call /// frames at any point in time. -const RECURSION_LIMIT: u32 = 1000; +const RECURSION_LIMIT: u32 = 500; impl Ssa { /// Inline all functions within the IR. From fecb7ac094c37448410f9d50f9e95b15e01c9382 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 2 Dec 2024 16:26:43 +0300 Subject: [PATCH 42/73] Update test --- compiler/noirc_evaluator/src/ssa/opt/inlining.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/opt/inlining.rs b/compiler/noirc_evaluator/src/ssa/opt/inlining.rs index 52d56cecb2c..097170ff69e 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/inlining.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/inlining.rs @@ -1090,7 +1090,7 @@ mod test { #[test] #[should_panic( - expected = "Attempted to recur more than 1000 times during inlining function 'main': acir(inline) fn main f0 {" + expected = "Attempted to recur more than 500 times during inlining function 'main': acir(inline) fn main f0 {" )] fn unconditional_recursion() { // fn main f1 { From 4c20131d8d4887c5f39f3a689fbcaf1fc73950af Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 2 Dec 2024 18:56:06 +0300 Subject: [PATCH 43/73] Clear the taint record of Brillig results found constrained --- .../src/ssa/checks/check_for_underconstrained_values.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 777d10c5b7b..6ab4dde2b40 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -107,7 +107,7 @@ struct DependencyContext { tainted: HashMap, } -/// Structure keeping track of value ids descending from brilling calls' +/// Structure keeping track of value ids descending from Brillig calls' /// arguments and results, also storing information on results /// already properly constrained #[derive(Clone, Debug)] @@ -184,7 +184,9 @@ impl BrilligTaintedIds { || self.arguments.intersection(constrained_values).next().is_some()) { // Remember the partial constraint - self.results_constrained.extend(results_involved); + self.results_constrained.extend(&results_involved); + // We can clear the unneeded sets now + results_involved.iter().for_each(|i| self.results[*i].clear()); } } } From 3c5a92cb0f097f3c698f058d2d9804b6f0f7b1bb Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Wed, 4 Dec 2024 03:00:12 +0300 Subject: [PATCH 44/73] Update compiler/noirc_evaluator/src/errors.rs Co-authored-by: Michael J Klein --- compiler/noirc_evaluator/src/errors.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/errors.rs b/compiler/noirc_evaluator/src/errors.rs index 254082a3437..31fdda1ae2b 100644 --- a/compiler/noirc_evaluator/src/errors.rs +++ b/compiler/noirc_evaluator/src/errors.rs @@ -96,7 +96,7 @@ impl From for FileDiagnostic { ("There is no path from the output of this brillig call to either return values or inputs of the circuit, which creates an independent subgraph. This is quite likely a soundness vulnerability".to_string(), call_stack) } InternalBug::UncheckedBrilligCall { call_stack } => { - ("There is no assert checking this brillig call's inputs against its return values in some way. This should be done to prevent potential soundness vulnerabilities".to_string(), call_stack) + ("There is no constraint between this brillig call's inputs and its return values. This should be done to prevent potential soundness vulnerabilities".to_string(), call_stack) } InternalBug::AssertFailed { call_stack } => ("As a result, the compiled circuit is ensured to fail. Other assertions may also fail during execution".to_string(), call_stack) }; From 78aac764778162ff26ec2639f5f9c522d89cba09 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Wed, 4 Dec 2024 03:08:26 +0300 Subject: [PATCH 45/73] Update compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs Co-authored-by: Michael J Klein --- .../src/ssa/checks/check_for_underconstrained_values.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 6ab4dde2b40..7bd38e8dbdd 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -163,7 +163,7 @@ impl BrilligTaintedIds { fn store_partial_constraints(&mut self, constrained_values: &HashSet) { let mut results_involved: Vec = vec![]; - // For a valid partial constrain, a value descending from + // For a valid partial constraint, a value descending from // one of the results should be constrained for (i, result_descendants) in self.results.iter().enumerate() { // Skip checking already covered results From ebf7dc2398327db15d49c34ac3146a4387104c4c Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Wed, 4 Dec 2024 03:32:46 +0300 Subject: [PATCH 46/73] Change debug! to panic --- .../src/ssa/checks/check_for_underconstrained_values.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 7bd38e8dbdd..819d4726565 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -11,7 +11,7 @@ use crate::ssa::ssa_gen::Ssa; use im::HashMap; use rayon::prelude::*; use std::collections::{BTreeMap, HashSet}; -use tracing::{debug, trace}; +use tracing::trace; impl Ssa { /// This function provides an SSA pass that detects if the final function has any subgraphs independent from inputs and outputs. @@ -259,7 +259,7 @@ impl DependencyContext { if let Some(value_id) = self.memory_slots.get(address) { self.update_children(&[function.dfg.resolve(*value_id)], &results); } else { - debug!("load instruction {} has attempted to access previously unused memory location, skipping", + panic!("load instruction {} has attempted to access previously unused memory location, skipping", instruction); } } @@ -328,12 +328,12 @@ impl DependencyContext { } }, Value::ForeignFunction(..) => { - debug!("should not be able to reach foreign function from non-Brillig functions, {func_id} in function {}", function.name()); + panic!("should not be able to reach foreign function from non-Brillig functions, {func_id} in function {}", function.name()); } Value::Instruction { .. } | Value::NumericConstant { .. } | Value::Param { .. } => { - debug!( + panic!( "should not be able to call {func_id} in function {}", function.name() ); From acbb10aa8d2b6e029bc7c4a1545b7b7ab85cffa0 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Wed, 4 Dec 2024 03:37:38 +0300 Subject: [PATCH 47/73] Shorten the skip option name --- compiler/noirc_driver/src/lib.rs | 4 ++-- compiler/noirc_evaluator/src/ssa.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/compiler/noirc_driver/src/lib.rs b/compiler/noirc_driver/src/lib.rs index 9e6207b4efe..a8b46a317c1 100644 --- a/compiler/noirc_driver/src/lib.rs +++ b/compiler/noirc_driver/src/lib.rs @@ -135,7 +135,7 @@ pub struct CompileOptions { /// Warning: This can improve compilation speed but can also lead to correctness errors. /// This check should always be run on production code. #[arg(long)] - pub skip_missing_brillig_constraints_check: bool, + pub skip_brillig_constraints_check: bool, /// Setting to decide on an inlining strategy for Brillig functions. /// A more aggressive inliner should generate larger programs but more optimized @@ -631,7 +631,7 @@ pub fn compile_no_check( }, emit_ssa: if options.emit_ssa { Some(context.package_build_path.clone()) } else { None }, skip_underconstrained_check: options.skip_underconstrained_check, - skip_missing_brillig_constraints_check: options.skip_missing_brillig_constraints_check, + skip_brillig_constraints_check: options.skip_brillig_constraints_check, inliner_aggressiveness: options.inliner_aggressiveness, max_bytecode_increase_percent: options.max_bytecode_increase_percent, }; diff --git a/compiler/noirc_evaluator/src/ssa.rs b/compiler/noirc_evaluator/src/ssa.rs index 5ca1342a16a..61f256cd72d 100644 --- a/compiler/noirc_evaluator/src/ssa.rs +++ b/compiler/noirc_evaluator/src/ssa.rs @@ -73,7 +73,7 @@ pub struct SsaEvaluatorOptions { pub skip_underconstrained_check: bool, /// Skip the missing Brillig call constraints check - pub skip_missing_brillig_constraints_check: bool, + pub skip_brillig_constraints_check: bool, /// The higher the value, the more inlined Brillig functions will be. pub inliner_aggressiveness: i64, @@ -155,7 +155,7 @@ pub(crate) fn optimize_into_acir( )); } - if !options.skip_missing_brillig_constraints_check { + if !options.skip_brillig_constraints_check { ssa_level_warnings.extend(time( "After Check for Missing Brillig Call Constraints", options.print_codegen_timings, From a44828b0ed9f05139375b24e4460eed2c52c1b12 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Wed, 4 Dec 2024 04:00:46 +0300 Subject: [PATCH 48/73] Fix redundant function id conversions --- .../checks/check_for_underconstrained_values.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 819d4726565..a94f7c0205f 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -19,12 +19,12 @@ impl Ssa { /// Go through each top-level non-Brillig function and detect if it has independent subgraphs #[tracing::instrument(level = "trace", skip(self))] pub(crate) fn check_for_underconstrained_values(&mut self) -> Vec { - let functions_id = self.functions.values().map(|f| f.id().to_usize()).collect::>(); - functions_id - .iter() + self.functions + .values() + .map(|f| f.id()) .par_bridge() .flat_map(|fid| { - let function_to_process = &self.functions[&FunctionId::new(*fid)]; + let function_to_process = &self.functions[&fid]; match function_to_process.runtime() { RuntimeType::Acir { .. } => check_for_underconstrained_values_within_function( function_to_process, @@ -44,12 +44,12 @@ impl Ssa { return vec![]; }; - let functions_id = self.functions.values().map(|f| f.id().to_usize()).collect::>(); - functions_id - .iter() + self.functions + .values() + .map(|f| f.id()) .par_bridge() .flat_map(|fid| { - let function_to_process = &self.functions[&FunctionId::new(*fid)]; + let function_to_process = &self.functions[&fid]; match function_to_process.runtime() { RuntimeType::Acir { .. } => { let mut context = DependencyContext::default(); From 6e2cd9e35a350bf2c2afd0baa990a8e1b31523fe Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Wed, 4 Dec 2024 21:04:26 +0300 Subject: [PATCH 49/73] Update TODO --- .../src/ssa/checks/check_for_underconstrained_values.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index a94f7c0205f..de0fb30a73a 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -404,7 +404,8 @@ impl DependencyContext { trace!("attempting to clear Brillig calls constrained by values: {:?}", constrained_values); // For now, consider array element constraints to be array constraints - // TODO: this probably has to be further looked into, to ensure _every_ element + // TODO(https://github.com/noir-lang/noir/issues/6698): + // This probably has to be further looked into, to ensure _every_ element // of an array result of a Brillig call has been constrained let constrained_arrays = From 5cf36a25c46e36e8693486589e0b57fc605e57d3 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Wed, 4 Dec 2024 22:16:22 +0300 Subject: [PATCH 50/73] Rework tests to use the new SSA loader --- .../check_for_underconstrained_values.rs | 360 ++++++------------ 1 file changed, 120 insertions(+), 240 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index de0fb30a73a..c97cd3ce7f4 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -316,7 +316,11 @@ impl DependencyContext { Value::Function(callee) => match all_functions[&callee].runtime() { RuntimeType::Brillig(_) => { // Record arguments/results for each Brillig call for the check - trace!("Brillig function {} called at {}", callee, instruction); + trace!( + "Brillig function {} called at {}", + all_functions[&callee], + instruction + ); self.tainted.insert( *instruction, BrilligTaintedIds::new(&arguments, &results), @@ -713,44 +717,24 @@ impl Context { } #[cfg(test)] mod test { - use noirc_frontend::monomorphization::ast::InlineType; - - use crate::ssa::{ - function_builder::FunctionBuilder, - ir::{ - instruction::BinaryOp, - map::Id, - types::{NumericType, Type}, - }, - }; - use std::sync::Arc; + use crate::ssa::Ssa; use tracing_test::traced_test; #[test] #[traced_test] /// Test that a connected function raises no warnings fn test_simple_connected_function() { - // fn main { - // b0(v0: Field, v1: Field): - // v2 = add v0, 1 - // v3 = mul v1, 2 - // v4 = eq v2, v3 - // return v2 - // } - let main_id = Id::test_new(0); - let mut builder = FunctionBuilder::new("main".into(), main_id); - let v0 = builder.add_parameter(Type::field()); - let v1 = builder.add_parameter(Type::field()); - - let one = builder.field_constant(1u128); - let two = builder.field_constant(2u128); - - let v2 = builder.insert_binary(v0, BinaryOp::Add, one); - let v3 = builder.insert_binary(v1, BinaryOp::Mul, two); - let _v4 = builder.insert_binary(v2, BinaryOp::Eq, v3); - builder.terminate_with_return(vec![v2]); - - let mut ssa = builder.finish(); + let program = r#" + acir(inline) fn main f0 { + b0(v0: Field, v1: Field): + v2 = add v0, Field 1 + v3 = mul v1, Field 2 + v4 = eq v2, v3 + return v2 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); let ssa_level_warnings = ssa.check_for_underconstrained_values(); assert_eq!(ssa_level_warnings.len(), 0); } @@ -760,43 +744,24 @@ mod test { /// Test where the results of a call to a Brillig function are not connected to main function inputs or outputs /// This should be detected. fn test_simple_function_with_disconnected_part() { - // unconstrained fn br(v0: Field, v1: Field){ - // v2 = add v0, v1 - // return v2 - // } - // - // fn main { - // b0(v0: Field, v1: Field): - // v2 = add v0, 1 - // v3 = mul v1, 2 - // v4 = call br(v2, v3) - // v5 = add v4, 2 - // return - // } - let main_id = Id::test_new(0); - let mut builder = FunctionBuilder::new("main".into(), main_id); - let v0 = builder.add_parameter(Type::field()); - let v1 = builder.add_parameter(Type::field()); - - let one = builder.field_constant(1u128); - let two = builder.field_constant(2u128); - - let v2 = builder.insert_binary(v0, BinaryOp::Add, one); - let v3 = builder.insert_binary(v1, BinaryOp::Mul, two); - - let br_function_id = Id::test_new(1); - let br_function = builder.import_function(br_function_id); - let v4 = builder.insert_call(br_function, vec![v2, v3], vec![Type::field()])[0]; - let v5 = builder.insert_binary(v4, BinaryOp::Add, two); - builder.insert_constrain(v5, one, None); - builder.terminate_with_return(vec![]); - - builder.new_brillig_function("br".into(), br_function_id, InlineType::default()); - let v0 = builder.add_parameter(Type::field()); - let v1 = builder.add_parameter(Type::field()); - let v2 = builder.insert_binary(v0, BinaryOp::Add, v1); - builder.terminate_with_return(vec![v2]); - let mut ssa = builder.finish(); + let program = r#" + acir(inline) fn main f0 { + b0(v0: Field, v1: Field): + v2 = add v0, Field 1 + v3 = mul v1, Field 2 + v4 = call f1(v2, v3) -> Field + v5 = add v4, Field 2 + return + } + + brillig(inline) fn br f1 { + b0(v0: Field, v1: Field): + v2 = add v0, v1 + return v2 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); let ssa_level_warnings = ssa.check_for_underconstrained_values(); assert_eq!(ssa_level_warnings.len(), 1); } @@ -828,97 +793,46 @@ mod test { == (most_expensive_sandwich + most_expensive_drink) ); } + */ - fn main f0 { - b0(v0: [u32; 2], v1: [u32; 2], v2: u32): - inc_rc v0 - inc_rc v1 - v4 = call f1(v0) - v6 = allocate - store u1 0 at v6 - v7 = load v6 - v11 = array_get v0, index u32 0 - v12 = eq v11, v4 - v13 = or v7, v12 - store v13 at v6 - v14 = load v6 - v16 = array_get v0, index u32 1 - v17 = eq v16, v4 - v18 = or v14, v17 - store v18 at v6 - v19 = load v6 - constrain v19 == u1 1 - v22 = call f1(v1) - v23 = add v4, v22 - v24 = eq v2, v23 - constrain v2 == v23 - dec_rc v0 - dec_rc v1 + // The Brillig function is fake, for simplicity's sake + + let program = r#" + acir(inline) fn main f0 { + b0(v4: [u32; 2], v5: [u32; 2], v6: u32): + inc_rc v4 + inc_rc v5 + v8 = call f1(v4) -> u32 + v9 = allocate -> &mut u32 + store u1 0 at v9 + v10 = load v9 -> u1 + v11 = array_get v4, index u32 0 -> u32 + v12 = eq v11, v8 + v13 = or v10, v12 + store v13 at v9 + v14 = load v9 -> u1 + v15 = array_get v4, index u32 1 -> u32 + v16 = eq v15, v8 + v17 = or v14, v16 + store v17 at v9 + v18 = load v9 -> u1 + constrain v18 == u1 1 + v19 = call f1(v5) -> u32 + v20 = add v8, v19 + constrain v6 == v20 + dec_rc v4 + dec_rc v5 return } - */ - let type_u32 = Type::Numeric(NumericType::Unsigned { bit_size: 32 }); - let type_u1 = Type::Numeric(NumericType::Unsigned { bit_size: 1 }); - - let main_id = Id::test_new(0); - let mut builder = FunctionBuilder::new("main".into(), main_id); - - let zero = builder.numeric_constant(0u32, type_u32.clone()); - let one = builder.numeric_constant(1u32, type_u32.clone()); - - let bool_false = builder.numeric_constant(0u32, type_u1.clone()); - let bool_true = builder.numeric_constant(1u32, type_u1.clone()); - - let v0 = builder.add_parameter(Type::Array(Arc::new(vec![type_u32.clone()]), 2)); - let v1 = builder.add_parameter(Type::Array(Arc::new(vec![type_u32.clone()]), 2)); - let v2 = builder.add_parameter(type_u32.clone()); - - builder.insert_inc_rc(v0); - builder.insert_inc_rc(v1); - - let br_function_id = Id::test_new(1); - let br_function = builder.import_function(br_function_id); - - let v4 = builder.insert_call(br_function, vec![v0], vec![type_u32.clone()])[0]; - let v6 = builder.insert_allocate(type_u32.clone()); - builder.insert_store(v6, bool_false); - let v7 = builder.insert_load(v6, type_u1.clone()); - let v11 = builder.insert_array_get(v0, zero, type_u32.clone()); - let v12 = builder.insert_binary(v11, BinaryOp::Eq, v4); - let v13 = builder.insert_binary(v7, BinaryOp::Or, v12); - - builder.insert_store(v6, v13); - let v14 = builder.insert_load(v6, type_u1.clone()); - let v16 = builder.insert_array_get(v0, one, type_u32.clone()); - let v17 = builder.insert_binary(v16, BinaryOp::Eq, v4); - let v18 = builder.insert_binary(v14, BinaryOp::Or, v17); - - builder.insert_store(v6, v18); - let v19 = builder.insert_load(v6, type_u1.clone()); - - builder.insert_constrain(v19, bool_true, None); - - let v22 = builder.insert_call(br_function, vec![v1], vec![type_u32.clone()])[0]; - let v23 = builder.insert_binary(v4, BinaryOp::Add, v22); - - builder.insert_constrain(v2, v23, None); - - builder.insert_dec_rc(v0); - builder.insert_dec_rc(v1); - - builder.terminate_with_return(vec![]); - - // We're faking the Brillig function here, for simplicity's sake - - builder.new_brillig_function("maximum_price".into(), br_function_id, InlineType::default()); - let v0 = builder.add_parameter(Type::Array(Arc::new(vec![type_u32.clone()]), 2)); - let zero = builder.numeric_constant(0u32, type_u32.clone()); - - let v1 = builder.insert_array_get(v0, zero, type_u32); - builder.terminate_with_return(vec![v1]); + brillig(inline) fn maximum_price f1 { + b0(v0: [u32; 2]): + v2 = array_get v0, index u32 0 -> u32 + return v2 + } + "#; - let mut ssa = builder.finish(); + let mut ssa = Ssa::from_str(program).unwrap(); let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); assert_eq!(ssa_level_warnings.len(), 1); } @@ -928,42 +842,28 @@ mod test { /// Test where a call to a brillig function returning multiple result values /// is left unchecked with a later assert involving all the results fn test_unchecked_multiple_results_brillig() { - let type_u32 = Type::Numeric(NumericType::Unsigned { bit_size: 32 }); - - let main_id = Id::test_new(0); - let mut builder = FunctionBuilder::new("main".into(), main_id); - - let v0 = builder.add_parameter(type_u32.clone()); - - let br_function_id = Id::test_new(1); - let br_function = builder.import_function(br_function_id); - // First call is constrained properly, involving both results - let call_results = - builder.insert_call(br_function, vec![v0], vec![type_u32.clone(), type_u32.clone()]); - let (v6, v7) = (call_results[0], call_results[1]); - let v8 = builder.insert_binary(v6, BinaryOp::Mul, v7); - builder.insert_constrain(v8, v0, None); - // Second call is insufficiently constrained, involving only one of the results - let call_results = - builder.insert_call(br_function, vec![v0], vec![type_u32.clone(), type_u32.clone()]); - let (v9, _) = (call_results[0], call_results[1]); - let v11 = builder.insert_binary(v9, BinaryOp::Mul, v9); - builder.insert_constrain(v11, v0, None); - - builder.terminate_with_return(vec![]); - - // We're faking the Brillig function here, for simplicity's sake - - builder.new_brillig_function("factor".into(), br_function_id, InlineType::default()); - builder.add_parameter(type_u32.clone()); - let zero = builder.numeric_constant(0u32, type_u32.clone()); - - builder.terminate_with_return(vec![zero, zero]); + // The Brillig function is fake, for simplicity's sake + let program = r#" + acir(inline) fn main f0 { + b0(v0: u32): + v2, v3 = call f1(v0) -> (u32, u32) + v4 = mul v2, v3 + constrain v4 == v0 + v5, v6 = call f1(v0) -> (u32, u32) + v7 = mul v5, v5 + constrain v7 == v0 + return + } - let mut ssa = builder.finish(); + brillig(inline) fn factor f1 { + b0(v0: u32): + return u32 0, u32 0 + } + "#; + let mut ssa = Ssa::from_str(program).unwrap(); let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); assert_eq!(ssa_level_warnings.len(), 1); } @@ -974,38 +874,26 @@ mod test { /// (should _not_ lead to a false positive failed check /// if all the results are constrained) fn test_checked_brillig_with_constant_arguments() { - let type_u32 = Type::Numeric(NumericType::Unsigned { bit_size: 32 }); - - let main_id = Id::test_new(0); - let mut builder = FunctionBuilder::new("main".into(), main_id); - - let v0 = builder.add_parameter(type_u32.clone()); - - let seven = builder.field_constant(7u128); - - let br_function_id = Id::test_new(1); - let br_function = builder.import_function(br_function_id); - // The call is constrained properly, involving both results // (but the argument to the Brillig is a constant) - let call_results = - builder.insert_call(br_function, vec![seven], vec![type_u32.clone(), type_u32.clone()]); - let (v6, v7) = (call_results[0], call_results[1]); - let v8 = builder.insert_binary(v6, BinaryOp::Mul, v7); - builder.insert_constrain(v8, v0, None); - - builder.terminate_with_return(vec![]); - - // We're faking the Brillig function here, for simplicity's sake - - builder.new_brillig_function("factor".into(), br_function_id, InlineType::default()); - builder.add_parameter(Type::field()); - let zero = builder.numeric_constant(0u32, type_u32.clone()); - - builder.terminate_with_return(vec![zero, zero]); + // The Brillig function is fake, for simplicity's sake + + let program = r#" + acir(inline) fn main f0 { + b0(v0: u32): + v3, v4 = call f1(Field 7) -> (u32, u32) + v5 = mul v3, v4 + constrain v5 == v0 + return + } - let mut ssa = builder.finish(); + brillig(inline) fn factor f1 { + b0(v0: Field): + return u32 0, u32 0 + } + "#; + let mut ssa = Ssa::from_str(program).unwrap(); let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); assert_eq!(ssa_level_warnings.len(), 0); } @@ -1015,34 +903,26 @@ mod test { /// Test where a brillig function call is constrained with a range check /// (should _not_ lead to a false positive failed check) fn test_range_checked_brillig() { - let type_u32 = Type::Numeric(NumericType::Unsigned { bit_size: 32 }); - - let main_id = Id::test_new(0); - let mut builder = FunctionBuilder::new("main".into(), main_id); - - let v0 = builder.add_parameter(type_u32.clone()); - - let br_function_id = Id::test_new(1); - let br_function = builder.import_function(br_function_id); - // The call is constrained properly with a range check, involving // both Brillig call argument and result - let call_results = builder.insert_call(br_function, vec![v0], vec![type_u32.clone()]); - let v1 = call_results[0]; - let v2 = builder.insert_binary(v1, BinaryOp::Add, v0); - builder.insert_range_check(v2, 32, None); - - builder.terminate_with_return(vec![]); - - // We're faking the Brillig function here, for simplicity's sake - - builder.new_brillig_function("dummy".into(), br_function_id, InlineType::default()); - builder.add_parameter(type_u32.clone()); - let zero = builder.numeric_constant(0u32, type_u32.clone()); - builder.terminate_with_return(vec![zero]); + // The Brillig function is fake, for simplicity's sake + + let program = r#" + acir(inline) fn main f0 { + b0(v0: u32): + v2 = call f1(v0) -> u32 + v3 = add v2, v0 + range_check v3 to 32 bits + return + } - let mut ssa = builder.finish(); + brillig(inline) fn dummy f1 { + b0(v0: u32): + return u32 0 + } + "#; + let mut ssa = Ssa::from_str(program).unwrap(); let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); assert_eq!(ssa_level_warnings.len(), 0); } From 1b292831b5134f70064cab049d73b3c53a537281 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 13:38:32 +0300 Subject: [PATCH 51/73] Experiment: disable check by default to test unconditional_recursion on CI --- compiler/noirc_driver/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_driver/src/lib.rs b/compiler/noirc_driver/src/lib.rs index a8b46a317c1..f44450378fe 100644 --- a/compiler/noirc_driver/src/lib.rs +++ b/compiler/noirc_driver/src/lib.rs @@ -134,7 +134,7 @@ pub struct CompileOptions { /// Flag to turn off the compiler check for missing Brillig call constrains. /// Warning: This can improve compilation speed but can also lead to correctness errors. /// This check should always be run on production code. - #[arg(long)] + #[arg(long, default_value = "true")] pub skip_brillig_constraints_check: bool, /// Setting to decide on an inlining strategy for Brillig functions. From 4dfcf8f51874935c7bb2f9c0242cb32d4dfc037b Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 13:48:16 +0300 Subject: [PATCH 52/73] Experiment: dial RECURSION_LIMIT back to 1000 to see if unconditional_recursion still fails on CI --- compiler/noirc_evaluator/src/ssa/opt/inlining.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/opt/inlining.rs b/compiler/noirc_evaluator/src/ssa/opt/inlining.rs index 097170ff69e..f91487fd73e 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/inlining.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/inlining.rs @@ -22,7 +22,7 @@ use fxhash::FxHashMap as HashMap; /// An arbitrary limit to the maximum number of recursive call /// frames at any point in time. -const RECURSION_LIMIT: u32 = 500; +const RECURSION_LIMIT: u32 = 1000; impl Ssa { /// Inline all functions within the IR. @@ -1090,7 +1090,7 @@ mod test { #[test] #[should_panic( - expected = "Attempted to recur more than 500 times during inlining function 'main': acir(inline) fn main f0 {" + expected = "Attempted to recur more than 1000 times during inlining function 'main': acir(inline) fn main f0 {" )] fn unconditional_recursion() { // fn main f1 { From 5b4fd91e7b96a52d8e083befed6d6982962b8c04 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 14:14:15 +0300 Subject: [PATCH 53/73] Revert experiment --- compiler/noirc_driver/src/lib.rs | 2 +- compiler/noirc_evaluator/src/ssa/opt/inlining.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler/noirc_driver/src/lib.rs b/compiler/noirc_driver/src/lib.rs index f44450378fe..a8b46a317c1 100644 --- a/compiler/noirc_driver/src/lib.rs +++ b/compiler/noirc_driver/src/lib.rs @@ -134,7 +134,7 @@ pub struct CompileOptions { /// Flag to turn off the compiler check for missing Brillig call constrains. /// Warning: This can improve compilation speed but can also lead to correctness errors. /// This check should always be run on production code. - #[arg(long, default_value = "true")] + #[arg(long)] pub skip_brillig_constraints_check: bool, /// Setting to decide on an inlining strategy for Brillig functions. diff --git a/compiler/noirc_evaluator/src/ssa/opt/inlining.rs b/compiler/noirc_evaluator/src/ssa/opt/inlining.rs index f91487fd73e..097170ff69e 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/inlining.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/inlining.rs @@ -22,7 +22,7 @@ use fxhash::FxHashMap as HashMap; /// An arbitrary limit to the maximum number of recursive call /// frames at any point in time. -const RECURSION_LIMIT: u32 = 1000; +const RECURSION_LIMIT: u32 = 500; impl Ssa { /// Inline all functions within the IR. @@ -1090,7 +1090,7 @@ mod test { #[test] #[should_panic( - expected = "Attempted to recur more than 1000 times during inlining function 'main': acir(inline) fn main f0 {" + expected = "Attempted to recur more than 500 times during inlining function 'main': acir(inline) fn main f0 {" )] fn unconditional_recursion() { // fn main f1 { From 2a3038690af7e6f613767222acc4b45cb19bcc5c Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 14:35:51 +0300 Subject: [PATCH 54/73] Add nested type result brillig test case --- .../check_for_underconstrained_values.rs | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index c97cd3ce7f4..03b99edea9d 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -926,4 +926,59 @@ mod test { let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); assert_eq!(ssa_level_warnings.len(), 0); } + + #[test] + #[traced_test] + /// Test where a brillig nested type result is insufficiently constrained + /// (with a field constraint missing) + fn test_nested_type_result_brillig() { + /* + struct Animal { + legs: Field, + eyes: u8, + tag: Tag, + } + + struct Tag { + no: Field, + } + + unconstrained fn foo(bar: Field) -> Animal { + Animal { + legs: 4, + eyes: 2, + tag: Tag { no: bar } + } + } + + fn main(x: Field) -> pub Animal { + let dog = foo(x); + assert(dog.legs == 4); + assert(dog.tag.no == x); + + dog + } + */ + + let program = r#" + acir(inline) fn main f0 { + b0(v0: Field): + v2, v3, v4 = call f1(v0) -> (Field, u8, Field) + v6 = eq v2, Field 4 + constrain v2 == Field 4 + v10 = eq v4, v0 + constrain v4 == v0 + return v2, v3, v4 + } + + brillig(inline) fn foo f1 { + b0(v0: Field): + return Field 4, u8 2, v0 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); + assert_eq!(ssa_level_warnings.len(), 1); + } } From f798585caff67dbeb284083e0c75003d152203f0 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 14:46:10 +0300 Subject: [PATCH 55/73] Update Cargo.lock --- Cargo.lock | 281 ++++++++++++++++++++++++++--------------------------- 1 file changed, 140 insertions(+), 141 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 087079a42ed..56d2504521b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -230,9 +230,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "ark-bls12-381" @@ -556,9 +556,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" dependencies = [ "arrayref", "arrayvec", @@ -628,12 +628,12 @@ dependencies = [ [[package]] name = "bstr" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" dependencies = [ "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "serde", ] @@ -656,9 +656,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" [[package]] name = "byteorder" @@ -668,9 +668,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "camino" @@ -683,9 +683,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" dependencies = [ "serde", ] @@ -712,9 +712,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.36" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baee610e9452a8f6f0a1b6194ec09ff9e2d85dea54432acdae41aa0761c95d70" +checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" dependencies = [ "shlex", ] @@ -775,9 +775,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "69371e34337c4c984bbe322360c2547210bf632eb2814bbe78a6e87a2935bd2b" dependencies = [ "clap_builder", "clap_derive", @@ -793,9 +793,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "6e24c1b4099818523236a8ca881d2b45db98dadfb4625cf6608c12069fcbbde1" dependencies = [ "anstream", "anstyle", @@ -805,9 +805,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.37" +version = "4.5.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11611dca53440593f38e6b25ec629de50b14cdfa63adc0fb856115a2c6d97595" +checksum = "d9647a559c112175f17cf724dc72d3645680a883c58481332779192b0d8e7a01" dependencies = [ "clap", ] @@ -821,14 +821,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "clipboard-win" @@ -859,7 +859,7 @@ checksum = "fc4159b76af02757139baf42c0c971c6dc155330999fbfd8eddb29b97fb2db68" dependencies = [ "codespan-reporting", "lsp-types 0.88.0", - "url 2.5.3", + "url 2.5.4", ] [[package]] @@ -1004,9 +1004,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -1120,9 +1120,9 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" dependencies = [ "csv-core", "itoa", @@ -1171,7 +1171,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1182,7 +1182,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1249,7 +1249,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1318,7 +1318,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1425,12 +1425,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1552,9 +1552,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide 0.8.0", @@ -1671,7 +1671,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1769,7 +1769,7 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -1876,9 +1876,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -2129,7 +2129,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2180,7 +2180,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "same-file", "walkdir", "winapi-util", @@ -2244,12 +2244,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.15.2", "serde", ] @@ -2265,7 +2265,7 @@ dependencies = [ "crossbeam-utils", "dashmap", "env_logger", - "indexmap 2.6.0", + "indexmap 2.7.0", "is-terminal", "itoa", "log", @@ -2337,9 +2337,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" @@ -2536,9 +2536,9 @@ checksum = "82903360c009b816f5ab72a9b68158c27c301ee2c3f20655b55c5e589e7d3bb7" [[package]] name = "libc" -version = "0.2.162" +version = "0.2.167" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" [[package]] name = "libm" @@ -2588,9 +2588,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" @@ -2627,7 +2627,7 @@ dependencies = [ "serde", "serde_json", "serde_repr", - "url 2.5.3", + "url 2.5.4", ] [[package]] @@ -2640,7 +2640,7 @@ dependencies = [ "serde", "serde_json", "serde_repr", - "url 2.5.3", + "url 2.5.4", ] [[package]] @@ -2708,9 +2708,9 @@ dependencies = [ [[package]] name = "minreq" -version = "2.12.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763d142cdff44aaadd9268bebddb156ef6c65a0e13486bb81673cf2d8739f9b0" +checksum = "36a8e50e917e18a37d500d27d40b7bc7d127e71c0c94fb2d83f43b4afd308390" dependencies = [ "log", "serde", @@ -2731,11 +2731,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", @@ -2824,7 +2823,7 @@ dependencies = [ "test-case", "thiserror", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "toml 0.7.8", "tower", "tracing-appender", @@ -2855,7 +2854,7 @@ dependencies = [ "serde", "thiserror", "toml 0.7.8", - "url 2.5.3", + "url 2.5.4", ] [[package]] @@ -3469,7 +3468,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.7.0", ] [[package]] @@ -3703,9 +3702,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -3749,7 +3748,7 @@ checksum = "6ff7ff745a347b87471d859a377a9a404361e7efc2a971d73424a6d183c0fc77" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -3959,7 +3958,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -3974,9 +3973,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -4048,7 +4047,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.87", + "syn 2.0.90", "walkdir", ] @@ -4085,9 +4084,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.39" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags 2.6.0", "errno", @@ -4253,9 +4252,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -4296,20 +4295,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -4325,7 +4324,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4347,7 +4346,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -4364,7 +4363,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4496,9 +4495,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4577,9 +4576,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "symbolic-common" -version = "12.12.1" +version = "12.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d4d73159efebfb389d819fd479afb2dbd57dcb3e3f4b7fcfa0e675f5a46c1cb" +checksum = "e5ba5365997a4e375660bed52f5b42766475d5bc8ceb1bb13fea09c469ea0f49" dependencies = [ "debugid", "memmap2", @@ -4589,9 +4588,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.12.1" +version = "12.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a767859f6549c665011970874c3f541838b4835d5aaaa493d3ee383918be9f10" +checksum = "beff338b2788519120f38c59ff4bb15174f52a183e547bac3d6072c2c0aa48aa" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -4611,9 +4610,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.87" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -4628,7 +4627,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4719,7 +4718,7 @@ dependencies = [ "cfg-if 1.0.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4730,7 +4729,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "test-case-core", ] @@ -4757,22 +4756,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4787,9 +4786,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -4808,9 +4807,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -4853,14 +4852,14 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.1" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.2", + "mio 1.0.3", "pin-project-lite", "socket2", "tokio-macros", @@ -4875,7 +4874,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4905,9 +4904,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -4953,7 +4952,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -4985,9 +4984,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -5009,20 +5008,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -5030,9 +5029,9 @@ dependencies = [ [[package]] name = "tracing-error" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" dependencies = [ "tracing", "tracing-subscriber", @@ -5051,9 +5050,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -5085,7 +5084,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" dependencies = [ "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -5142,9 +5141,9 @@ checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-linebreak" @@ -5192,9 +5191,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna 1.0.3", @@ -5311,7 +5310,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "wasm-bindgen-shared", ] @@ -5345,7 +5344,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5610,9 +5609,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -5622,13 +5621,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "synstructure", ] @@ -5650,27 +5649,27 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "synstructure", ] @@ -5691,7 +5690,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -5713,7 +5712,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] From d86891bea9e01d12988d4ee344883d018be32ea7 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 14:53:04 +0300 Subject: [PATCH 56/73] Update Cargo.lock --- Cargo.lock | 281 +++++++++++++++++++++++++++-------------------------- 1 file changed, 141 insertions(+), 140 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 56d2504521b..087079a42ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -230,9 +230,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "ark-bls12-381" @@ -556,9 +556,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.5" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" dependencies = [ "arrayref", "arrayvec", @@ -628,12 +628,12 @@ dependencies = [ [[package]] name = "bstr" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" +checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" dependencies = [ "memchr", - "regex-automata 0.4.9", + "regex-automata 0.4.8", "serde", ] @@ -656,9 +656,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" [[package]] name = "byteorder" @@ -668,9 +668,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "camino" @@ -683,9 +683,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.9" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] @@ -712,9 +712,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.2" +version = "1.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" +checksum = "baee610e9452a8f6f0a1b6194ec09ff9e2d85dea54432acdae41aa0761c95d70" dependencies = [ "shlex", ] @@ -775,9 +775,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.22" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69371e34337c4c984bbe322360c2547210bf632eb2814bbe78a6e87a2935bd2b" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -793,9 +793,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.22" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e24c1b4099818523236a8ca881d2b45db98dadfb4625cf6608c12069fcbbde1" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -805,9 +805,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.38" +version = "4.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9647a559c112175f17cf724dc72d3645680a883c58481332779192b0d8e7a01" +checksum = "11611dca53440593f38e6b25ec629de50b14cdfa63adc0fb856115a2c6d97595" dependencies = [ "clap", ] @@ -821,14 +821,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] name = "clap_lex" -version = "0.7.3" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "clipboard-win" @@ -859,7 +859,7 @@ checksum = "fc4159b76af02757139baf42c0c971c6dc155330999fbfd8eddb29b97fb2db68" dependencies = [ "codespan-reporting", "lsp-types 0.88.0", - "url 2.5.4", + "url 2.5.3", ] [[package]] @@ -1004,9 +1004,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -1120,9 +1120,9 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" dependencies = [ "csv-core", "itoa", @@ -1171,7 +1171,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -1182,7 +1182,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -1249,7 +1249,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -1318,7 +1318,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -1425,12 +1425,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -1552,9 +1552,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.35" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide 0.8.0", @@ -1671,7 +1671,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -1769,7 +1769,7 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.9", + "regex-automata 0.4.8", "regex-syntax 0.8.5", ] @@ -1876,9 +1876,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" [[package]] name = "heck" @@ -2129,7 +2129,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -2180,7 +2180,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata 0.4.9", + "regex-automata 0.4.8", "same-file", "walkdir", "winapi-util", @@ -2244,12 +2244,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.1", "serde", ] @@ -2265,7 +2265,7 @@ dependencies = [ "crossbeam-utils", "dashmap", "env_logger", - "indexmap 2.7.0", + "indexmap 2.6.0", "is-terminal", "itoa", "log", @@ -2337,9 +2337,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" @@ -2536,9 +2536,9 @@ checksum = "82903360c009b816f5ab72a9b68158c27c301ee2c3f20655b55c5e589e7d3bb7" [[package]] name = "libc" -version = "0.2.167" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libm" @@ -2588,9 +2588,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" -version = "0.7.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" [[package]] name = "lock_api" @@ -2627,7 +2627,7 @@ dependencies = [ "serde", "serde_json", "serde_repr", - "url 2.5.4", + "url 2.5.3", ] [[package]] @@ -2640,7 +2640,7 @@ dependencies = [ "serde", "serde_json", "serde_repr", - "url 2.5.4", + "url 2.5.3", ] [[package]] @@ -2708,9 +2708,9 @@ dependencies = [ [[package]] name = "minreq" -version = "2.13.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36a8e50e917e18a37d500d27d40b7bc7d127e71c0c94fb2d83f43b4afd308390" +checksum = "763d142cdff44aaadd9268bebddb156ef6c65a0e13486bb81673cf2d8739f9b0" dependencies = [ "log", "serde", @@ -2731,10 +2731,11 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", @@ -2823,7 +2824,7 @@ dependencies = [ "test-case", "thiserror", "tokio", - "tokio-util 0.7.13", + "tokio-util 0.7.12", "toml 0.7.8", "tower", "tracing-appender", @@ -2854,7 +2855,7 @@ dependencies = [ "serde", "thiserror", "toml 0.7.8", - "url 2.5.4", + "url 2.5.3", ] [[package]] @@ -3468,7 +3469,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.7.0", + "indexmap 2.6.0", ] [[package]] @@ -3702,9 +3703,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -3748,7 +3749,7 @@ checksum = "6ff7ff745a347b87471d859a377a9a404361e7efc2a971d73424a6d183c0fc77" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -3958,7 +3959,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", + "regex-automata 0.4.8", "regex-syntax 0.8.5", ] @@ -3973,9 +3974,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -4047,7 +4048,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.90", + "syn 2.0.87", "walkdir", ] @@ -4084,9 +4085,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.41" +version = "0.38.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" dependencies = [ "bitflags 2.6.0", "errno", @@ -4252,9 +4253,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.215" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] @@ -4295,20 +4296,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -4324,7 +4325,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -4346,7 +4347,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -4363,7 +4364,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -4495,9 +4496,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4576,9 +4577,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "symbolic-common" -version = "12.12.3" +version = "12.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ba5365997a4e375660bed52f5b42766475d5bc8ceb1bb13fea09c469ea0f49" +checksum = "3d4d73159efebfb389d819fd479afb2dbd57dcb3e3f4b7fcfa0e675f5a46c1cb" dependencies = [ "debugid", "memmap2", @@ -4588,9 +4589,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.12.3" +version = "12.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beff338b2788519120f38c59ff4bb15174f52a183e547bac3d6072c2c0aa48aa" +checksum = "a767859f6549c665011970874c3f541838b4835d5aaaa493d3ee383918be9f10" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -4610,9 +4611,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -4627,7 +4628,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -4718,7 +4719,7 @@ dependencies = [ "cfg-if 1.0.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -4729,7 +4730,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", "test-case-core", ] @@ -4756,22 +4757,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -4786,9 +4787,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.37" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -4807,9 +4808,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -4852,14 +4853,14 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.3", + "mio 1.0.2", "pin-project-lite", "socket2", "tokio-macros", @@ -4874,7 +4875,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -4904,9 +4905,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -4952,7 +4953,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", @@ -4984,9 +4985,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "log", "pin-project-lite", @@ -5008,20 +5009,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -5029,9 +5030,9 @@ dependencies = [ [[package]] name = "tracing-error" -version = "0.2.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" dependencies = [ "tracing", "tracing-subscriber", @@ -5050,9 +5051,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -5084,7 +5085,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" dependencies = [ "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -5141,9 +5142,9 @@ checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-linebreak" @@ -5191,9 +5192,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.4" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna 1.0.3", @@ -5310,7 +5311,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -5344,7 +5345,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5609,9 +5610,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" dependencies = [ "serde", "stable_deref_trait", @@ -5621,13 +5622,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", "synstructure", ] @@ -5649,27 +5650,27 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", "synstructure", ] @@ -5690,7 +5691,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] @@ -5712,7 +5713,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.87", ] [[package]] From ca1fc4fa67e17834efdfef9ebfde32c1ac4e69ce Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 16:24:13 +0300 Subject: [PATCH 57/73] Update comments, bring in unsafe{} for the 5425 test case --- .../src/main.nr | 57 +++++++++++-------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr index feaf907a480..1d9269eebd5 100644 --- a/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr +++ b/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr @@ -9,29 +9,40 @@ unconstrained fn maximum_price(options: [u32; 3]) -> u32 { } fn main(sandwiches: pub [u32; 3], drinks: pub [u32; 3], snacks: pub [u32; 3], best_value: u32) { - let meal_deal_cost: u32 = 390; - let most_expensive_sandwich = maximum_price(sandwiches); - let mut sandwich_exists = false; - for sandwich_price in sandwiches { - assert(sandwich_price <= most_expensive_sandwich); - sandwich_exists |= sandwich_price == most_expensive_sandwich; - } - assert(sandwich_exists); + unsafe { + let meal_deal_cost: u32 = 390; + let most_expensive_sandwich = maximum_price(sandwiches); + let mut sandwich_exists = false; + for sandwich_price in sandwiches { + assert(sandwich_price <= most_expensive_sandwich); + sandwich_exists |= sandwich_price == most_expensive_sandwich; + } - let most_expensive_drink = maximum_price(drinks); - let mut drink_exists = false; - for drink_price in drinks { - assert(drink_price <= most_expensive_drink); - drink_exists |= drink_price == most_expensive_drink; - } - assert(drink_exists); + // maximum_price(sandwiches) is properly constrained with this assert, + // linking the result to the arguments + assert(sandwich_exists); + + let most_expensive_drink = maximum_price(drinks); + let mut drink_exists = false; + for drink_price in drinks { + assert(drink_price <= most_expensive_drink); + drink_exists |= drink_price == most_expensive_drink; + } + + // maximum_price(drinks) is properly constrained with this assert, + // linking the result to the arguments + assert(drink_exists); - let most_expensive_snack = maximum_price(snacks); - assert( - best_value - == ( - most_expensive_sandwich + most_expensive_drink + most_expensive_snack - - meal_deal_cost - ), - ); + let most_expensive_snack = maximum_price(snacks); + // maximum_price(snacks)'s result isn't constrained against `snacks` + // in any way, triggering the missing Brillig constraint check + + assert( + best_value + == ( + most_expensive_sandwich + most_expensive_drink + most_expensive_snack + - meal_deal_cost + ), + ); + } } From 5f1f8da6632d85acbb494ba90811745cfd942cfc Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 16:30:39 +0300 Subject: [PATCH 58/73] Enable the compile_success_with_bug test type --- tooling/nargo_cli/build.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tooling/nargo_cli/build.rs b/tooling/nargo_cli/build.rs index f0334eaf713..97f7e048d46 100644 --- a/tooling/nargo_cli/build.rs +++ b/tooling/nargo_cli/build.rs @@ -36,6 +36,7 @@ fn main() { generate_compile_success_empty_tests(&mut test_file, &test_dir); generate_compile_success_contract_tests(&mut test_file, &test_dir); generate_compile_success_no_bug_tests(&mut test_file, &test_dir); + generate_compile_success_with_bug_tests(&mut test_file, &test_dir); generate_compile_failure_tests(&mut test_file, &test_dir); } @@ -462,6 +463,35 @@ fn generate_compile_success_no_bug_tests(test_file: &mut File, test_data_dir: &P writeln!(test_file, "}}").unwrap(); } +/// Generate tests for checking that the contract compiles and there are "bugs" in stderr +fn generate_compile_success_with_bug_tests(test_file: &mut File, test_data_dir: &Path) { + let test_type = "compile_success_with_bug"; + let test_cases = read_test_cases(test_data_dir, test_type); + + writeln!( + test_file, + "mod {test_type} {{ + use super::*; + " + ) + .unwrap(); + for (test_name, test_dir) in test_cases { + let test_dir = test_dir.display(); + + generate_test_cases( + test_file, + &test_name, + &test_dir, + "compile", + r#" + nargo.assert().success().stderr(predicate::str::contains("bug:")); + "#, + &MatrixConfig::default(), + ); + } + writeln!(test_file, "}}").unwrap(); +} + fn generate_compile_failure_tests(test_file: &mut File, test_data_dir: &Path) { let test_type = "compile_failure"; let test_cases = read_test_cases(test_data_dir, test_type); From 55f991dc3b4111b768dc81a2e55be2ec6f481efe Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 16:45:46 +0300 Subject: [PATCH 59/73] Upgrade pprof to fix advisories on CI --- Cargo.lock | 64 ++++++++++++---------- Cargo.toml | 2 +- acvm-repo/bn254_blackbox_solver/Cargo.toml | 2 +- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 087079a42ed..2ae72f5538f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,7 +13,7 @@ dependencies = [ "criterion", "flate2", "fxhash", - "pprof 0.13.0", + "pprof", "serde", "serde-big-array", "serde-generate", @@ -158,6 +158,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e0966165eaf052580bd70eb1b32cb3d6245774c0104d1b2793e9650bf83b52a" +dependencies = [ + "equator", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -604,7 +613,7 @@ dependencies = [ "lazy_static", "noir_grumpkin", "num-bigint", - "pprof 0.12.1", + "pprof", ] [[package]] @@ -1417,6 +1426,26 @@ dependencies = [ "log", ] +[[package]] +name = "equator" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35da53b5a021d2484a7cc49b2ac7f2d840f8236a286f84202369bd338d761ea" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf679796c0322556351f287a51b49e48f7c4986e727b5dd78c972d30e2e16cc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -2807,7 +2836,7 @@ dependencies = [ "notify", "notify-debouncer-full", "paste", - "pprof 0.13.0", + "pprof", "predicates 2.1.5", "prettytable-rs", "proptest", @@ -3580,32 +3609,11 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "pprof" -version = "0.12.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978385d59daf9269189d052ca8a84c1acfd0715c0599a5d5188d4acc078ca46a" -dependencies = [ - "backtrace", - "cfg-if 1.0.0", - "criterion", - "findshlibs", - "inferno", - "libc", - "log", - "nix 0.26.4", - "once_cell", - "parking_lot 0.12.3", - "smallvec", - "symbolic-demangle", - "tempfile", - "thiserror", -] - -[[package]] -name = "pprof" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5c97c51bd34c7e742402e216abdeb44d415fbe6ae41d56b114723e953711cb" +checksum = "ebbe2f8898beba44815fdc9e5a4ae9c929e21c5dc29b0c774a15555f7f58d6d0" dependencies = [ + "aligned-vec", "backtrace", "cfg-if 1.0.0", "criterion", @@ -5412,7 +5420,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 94ebe54fde1..4ce0ddd999f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -126,7 +126,7 @@ codespan-reporting = "0.11.1" criterion = "0.5.0" # Note that using the "frame-pointer" feature breaks framegraphs on linux # https://github.com/tikv/pprof-rs/pull/172 -pprof = { version = "0.13", features = ["flamegraph", "criterion"] } +pprof = { version = "0.14", features = ["flamegraph", "criterion"] } cfg-if = "1.0.0" dirs = "4" diff --git a/acvm-repo/bn254_blackbox_solver/Cargo.toml b/acvm-repo/bn254_blackbox_solver/Cargo.toml index 8829692b9b4..825a0ef0481 100644 --- a/acvm-repo/bn254_blackbox_solver/Cargo.toml +++ b/acvm-repo/bn254_blackbox_solver/Cargo.toml @@ -30,7 +30,7 @@ num-bigint.workspace = true [dev-dependencies] ark-std.workspace = true criterion = "0.5.0" -pprof = { version = "0.12", features = [ +pprof = { version = "0.14", features = [ "flamegraph", "frame-pointer", "criterion", From 4a63ba60cafb9597c9fbef0855972edae9af4a59 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 17:25:45 +0300 Subject: [PATCH 60/73] Rewrite ResultStatus as an enum --- .../check_for_underconstrained_values.rs | 63 +++++++++++-------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 03b99edea9d..f1e9f05c359 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -114,21 +114,28 @@ struct DependencyContext { struct BrilligTaintedIds { // Argument descendant value ids arguments: HashSet, - // Result descendant value ids - results: Vec>, + // Results status + results: Vec, // Initial result value ids root_results: HashSet, - // Result indices already found constrained - results_constrained: HashSet, +} + +#[derive(Clone, Debug)] +enum ResultStatus { + // Keep track of descendants until found constrained + Unconstrained { descendants: HashSet }, + Constrained, } impl BrilligTaintedIds { fn new(arguments: &[ValueId], results: &[ValueId]) -> Self { BrilligTaintedIds { arguments: HashSet::from_iter(arguments.iter().copied()), - results: results.iter().map(|result| HashSet::from([*result])).collect(), + results: results + .iter() + .map(|result| ResultStatus::Unconstrained { descendants: HashSet::from([*result]) }) + .collect(), root_results: HashSet::from_iter(results.iter().copied()), - results_constrained: HashSet::new(), } } @@ -140,13 +147,17 @@ impl BrilligTaintedIds { if self.arguments.contains(parent) { self.arguments.extend(children); } - for (i, result) in &mut self.results.iter_mut().enumerate() { - // Skip updating results already found covered - if self.results_constrained.contains(&i) { - continue; - } - if result.contains(parent) { - result.extend(children); + for result_status in &mut self.results.iter_mut() { + match result_status { + // Skip updating results already found covered + ResultStatus::Constrained => { + continue; + } + ResultStatus::Unconstrained { descendants } => { + if descendants.contains(parent) { + descendants.extend(children); + } + } } } } @@ -155,7 +166,7 @@ impl BrilligTaintedIds { fn check_constrained(&self) -> bool { // If every result has now been constrained, // consider the call properly constrained - self.results.len() == self.results_constrained.len() + self.results.iter().all(|result| matches!(result, ResultStatus::Constrained)) } /// Remember partial constraints (involving some of the results and an argument) @@ -165,13 +176,17 @@ impl BrilligTaintedIds { // For a valid partial constraint, a value descending from // one of the results should be constrained - for (i, result_descendants) in self.results.iter().enumerate() { - // Skip checking already covered results - if self.results_constrained.contains(&i) { - continue; - } - if result_descendants.intersection(constrained_values).next().is_some() { - results_involved.push(i); + for (i, result_status) in self.results.iter().enumerate() { + match result_status { + // Skip checking already covered results + ResultStatus::Constrained => { + continue; + } + ResultStatus::Unconstrained { descendants } => { + if descendants.intersection(constrained_values).next().is_some() { + results_involved.push(i); + } + } } } @@ -183,10 +198,8 @@ impl BrilligTaintedIds { || self.root_results.intersection(constrained_values).next().is_some() || self.arguments.intersection(constrained_values).next().is_some()) { - // Remember the partial constraint - self.results_constrained.extend(&results_involved); - // We can clear the unneeded sets now - results_involved.iter().for_each(|i| self.results[*i].clear()); + // Remember the partial constraint, clearing the sets + results_involved.iter().for_each(|i| self.results[*i] = ResultStatus::Constrained); } } } From 4e6cc07841fa30d59c0498e7a9500431ee32ef69 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 17:29:33 +0300 Subject: [PATCH 61/73] Update compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs Co-authored-by: Akosh Farkash --- .../src/ssa/checks/check_for_underconstrained_values.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index f1e9f05c359..0dd0369000f 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -272,7 +272,7 @@ impl DependencyContext { if let Some(value_id) = self.memory_slots.get(address) { self.update_children(&[function.dfg.resolve(*value_id)], &results); } else { - panic!("load instruction {} has attempted to access previously unused memory location, skipping", + panic!("load instruction {} has attempted to access previously unused memory location", instruction); } } From 4c69ed630a5927255edcbf083120bca6c651ba11 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 17:34:32 +0300 Subject: [PATCH 62/73] Remove unneeded resolve --- .../src/ssa/checks/check_for_underconstrained_values.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 0dd0369000f..845fa366937 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -270,7 +270,7 @@ impl DependencyContext { Instruction::Load { address } => { // Recall the value stored at address as parent for the results if let Some(value_id) = self.memory_slots.get(address) { - self.update_children(&[function.dfg.resolve(*value_id)], &results); + self.update_children(&[*value_id], &results); } else { panic!("load instruction {} has attempted to access previously unused memory location", instruction); From dc12963f3b1b99cec0cc0d718ae95a9595ff54db Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 17:37:54 +0300 Subject: [PATCH 63/73] Move arguments/results allocation inside the loop --- .../src/ssa/checks/check_for_underconstrained_values.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 845fa366937..9ea78771f33 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -227,8 +227,6 @@ impl DependencyContext { all_functions: &BTreeMap, ) { trace!("processing instructions of block {} of function {}", block, function); - let mut arguments = Vec::new(); - let mut results = Vec::new(); for instruction in function.dfg[block].instructions() { // Optimization: there is no reason to do anything until a Brillig @@ -243,8 +241,8 @@ impl DependencyContext { } } - arguments.clear(); - results.clear(); + let mut arguments = Vec::new(); + let mut results = Vec::new(); // Collect non-constant instruction arguments function.dfg[*instruction].for_each_value(|value_id| { From e4c7bdeee067137ca8763b9b47827a0bc4c752b9 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 17:44:34 +0300 Subject: [PATCH 64/73] Fix Brillig encountered check --- .../src/ssa/checks/check_for_underconstrained_values.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 9ea78771f33..bd9e22be41a 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -232,13 +232,17 @@ impl DependencyContext { // Optimization: there is no reason to do anything until a Brillig // call is encountered if self.tainted.is_empty() { + let mut brillig_encountered = false; if let Instruction::Call { func: func_id, .. } = &function.dfg[*instruction] { if let Value::Function(callee) = &function.dfg[*func_id] { - if !all_functions[&callee].runtime().is_brillig() { - continue; + if all_functions[&callee].runtime().is_brillig() { + brillig_encountered = true; } } } + if !brillig_encountered { + continue; + } } let mut arguments = Vec::new(); From 4661ee5fa1ed0f73118135bf557d1c5f9a75b4bd Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 18:24:34 +0300 Subject: [PATCH 65/73] Update compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs Co-authored-by: Akosh Farkash --- .../src/ssa/checks/check_for_underconstrained_values.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index bd9e22be41a..43bfa23f137 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -353,7 +353,7 @@ impl DependencyContext { | Value::NumericConstant { .. } | Value::Param { .. } => { panic!( - "should not be able to call {func_id} in function {}", + "calling non-function value with ID {func_id} in function {}", function.name() ); } From 82e44313b0ba32a9225b6f4067dda11d5a7a6561 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 18:46:31 +0300 Subject: [PATCH 66/73] Clear up partial constraint comments --- .../src/ssa/checks/check_for_underconstrained_values.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 43bfa23f137..e65a5286058 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -171,6 +171,8 @@ impl BrilligTaintedIds { /// Remember partial constraints (involving some of the results and an argument) /// along the way to take them into final consideration + /// Generally, a valid partial constraint should link up a result descendant + /// and an argument descendant, although there are also edge cases mentioned below. fn store_partial_constraints(&mut self, constrained_values: &HashSet) { let mut results_involved: Vec = vec![]; @@ -190,7 +192,7 @@ impl BrilligTaintedIds { } } - // Also, one of the argument descendants should be constrained + // Along with it, one of the argument descendants should be constrained // (skipped if there were no arguments, or if an actual result and not a // descendant has been constrained, e.g. against a constant) if !results_involved.is_empty() From 6b068c56b7917be4812b5e9cb58c87b8501f8c6b Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 18:53:39 +0300 Subject: [PATCH 67/73] Remove pre-Brillig call skip (see https://github.com/noir-lang/noir/pull/6658#pullrequestreview-2482103067) --- .../checks/check_for_underconstrained_values.rs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index e65a5286058..55d5107129f 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -231,22 +231,6 @@ impl DependencyContext { trace!("processing instructions of block {} of function {}", block, function); for instruction in function.dfg[block].instructions() { - // Optimization: there is no reason to do anything until a Brillig - // call is encountered - if self.tainted.is_empty() { - let mut brillig_encountered = false; - if let Instruction::Call { func: func_id, .. } = &function.dfg[*instruction] { - if let Value::Function(callee) = &function.dfg[*func_id] { - if all_functions[&callee].runtime().is_brillig() { - brillig_encountered = true; - } - } - } - if !brillig_encountered { - continue; - } - } - let mut arguments = Vec::new(); let mut results = Vec::new(); From 8d3dd709def8db688692b451d6142c9ab8d8d2e7 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Thu, 5 Dec 2024 19:01:25 +0300 Subject: [PATCH 68/73] Switch the recursion issue solution --- .github/workflows/test-rust-workspace-msrv.yml | 1 + .github/workflows/test-rust-workspace.yml | 1 + compiler/noirc_evaluator/src/ssa/opt/inlining.rs | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-rust-workspace-msrv.yml b/.github/workflows/test-rust-workspace-msrv.yml index ae016169830..281fc5f24ee 100644 --- a/.github/workflows/test-rust-workspace-msrv.yml +++ b/.github/workflows/test-rust-workspace-msrv.yml @@ -87,6 +87,7 @@ jobs: name: nextest-archive - name: Run tests run: | + RUST_MIN_STACK=8388608 \ cargo nextest run --archive-file nextest-archive.tar.zst \ --partition count:${{ matrix.partition }}/4 \ --no-fail-fast diff --git a/.github/workflows/test-rust-workspace.yml b/.github/workflows/test-rust-workspace.yml index 1f3ee5e2268..e177504d830 100644 --- a/.github/workflows/test-rust-workspace.yml +++ b/.github/workflows/test-rust-workspace.yml @@ -74,6 +74,7 @@ jobs: name: nextest-archive - name: Run tests run: | + RUST_MIN_STACK=8388608 \ cargo nextest run --archive-file nextest-archive.tar.zst \ --partition count:${{ matrix.partition }}/4 \ --no-fail-fast diff --git a/compiler/noirc_evaluator/src/ssa/opt/inlining.rs b/compiler/noirc_evaluator/src/ssa/opt/inlining.rs index 097170ff69e..f91487fd73e 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/inlining.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/inlining.rs @@ -22,7 +22,7 @@ use fxhash::FxHashMap as HashMap; /// An arbitrary limit to the maximum number of recursive call /// frames at any point in time. -const RECURSION_LIMIT: u32 = 500; +const RECURSION_LIMIT: u32 = 1000; impl Ssa { /// Inline all functions within the IR. @@ -1090,7 +1090,7 @@ mod test { #[test] #[should_panic( - expected = "Attempted to recur more than 500 times during inlining function 'main': acir(inline) fn main f0 {" + expected = "Attempted to recur more than 1000 times during inlining function 'main': acir(inline) fn main f0 {" )] fn unconditional_recursion() { // fn main f1 { From 798947c450e9ad5be66dfbbfd0cd31b2b19c5fa7 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 9 Dec 2024 16:42:27 +0300 Subject: [PATCH 69/73] Rework update_children to remove the parent loop --- .../ssa/checks/check_for_underconstrained_values.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 55d5107129f..d029c9c5760 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -143,8 +143,8 @@ impl BrilligTaintedIds { /// (for arguments one set is enough, for results we keep them /// separate as the forthcoming check considers the call covered /// if all the results were properly covered) - fn update_children(&mut self, parent: &ValueId, children: &[ValueId]) { - if self.arguments.contains(parent) { + fn update_children(&mut self, parents: &HashSet, children: &[ValueId]) { + if self.arguments.intersection(parents).next().is_some() { self.arguments.extend(children); } for result_status in &mut self.results.iter_mut() { @@ -154,7 +154,7 @@ impl BrilligTaintedIds { continue; } ResultStatus::Unconstrained { descendants } => { - if descendants.contains(parent) { + if descendants.intersection(parents).next().is_some() { descendants.extend(children); } } @@ -396,10 +396,9 @@ impl DependencyContext { /// Update sets of value ids that can be traced back to the Brillig calls being tracked fn update_children(&mut self, parents: &[ValueId], children: &[ValueId]) { + let parents: HashSet<_> = HashSet::from_iter(parents.iter().copied()); for (_, tainted_ids) in self.tainted.iter_mut() { - for parent in parents { - tainted_ids.update_children(parent, children); - } + tainted_ids.update_children(&parents, children); } } From 1451a037e5ae5d132fb355ac65308eaba0e9e8d2 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 9 Dec 2024 17:35:12 +0300 Subject: [PATCH 70/73] Fix the false negative root result intersection check case --- .../check_for_underconstrained_values.rs | 76 ++++++++++++++----- 1 file changed, 56 insertions(+), 20 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index d029c9c5760..87b3865cb01 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -194,10 +194,11 @@ impl BrilligTaintedIds { // Along with it, one of the argument descendants should be constrained // (skipped if there were no arguments, or if an actual result and not a - // descendant has been constrained, e.g. against a constant) + // descendant has been constrained _alone_, e.g. against a constant) if !results_involved.is_empty() && (self.arguments.is_empty() - || self.root_results.intersection(constrained_values).next().is_some() + || (constrained_values.len() == 1 + && self.root_results.intersection(constrained_values).next().is_some()) || self.arguments.intersection(constrained_values).next().is_some()) { // Remember the partial constraint, clearing the sets @@ -267,14 +268,14 @@ impl DependencyContext { // Check the constrain instruction arguments against those // involved in Brillig calls, remove covered calls Instruction::Constrain(value_id1, value_id2, _) => { - self.clear_constrained(&[ - function.dfg.resolve(*value_id1), - function.dfg.resolve(*value_id2), - ]); + self.clear_constrained( + &[function.dfg.resolve(*value_id1), function.dfg.resolve(*value_id2)], + function, + ); } // Consider range check to also be constraining Instruction::RangeCheck { value, .. } => { - self.clear_constrained(&[function.dfg.resolve(*value)]); + self.clear_constrained(&[function.dfg.resolve(*value)], function); } Instruction::Call { func: func_id, .. } => { // For functions, we remove the first element of arguments, @@ -285,7 +286,7 @@ impl DependencyContext { Value::Intrinsic(intrinsic) => match intrinsic { Intrinsic::ApplyRangeConstraint | Intrinsic::AssertConstant => { // Consider these intrinsic arguments constrained - self.clear_constrained(&arguments); + self.clear_constrained(&arguments, function); } Intrinsic::AsWitness | Intrinsic::IsUnconstrained => { // These intrinsics won't affect the dependency graph @@ -404,20 +405,26 @@ impl DependencyContext { /// Check if any of the recorded Brillig calls have been properly constrained /// by given values after recording partial constraints, if so stop tracking them - fn clear_constrained(&mut self, constrained_values: &[ValueId]) { + fn clear_constrained(&mut self, constrained_values: &[ValueId], function: &Function) { trace!("attempting to clear Brillig calls constrained by values: {:?}", constrained_values); + // Remove numeric constants + let constrained_values = + constrained_values.iter().filter(|v| function.dfg.get_numeric_constant(**v).is_none()); + // For now, consider array element constraints to be array constraints // TODO(https://github.com/noir-lang/noir/issues/6698): // This probably has to be further looked into, to ensure _every_ element // of an array result of a Brillig call has been constrained - - let constrained_arrays = - constrained_values.iter().filter_map(|value| self.array_elements.get(value)); - - let mut constrained_values: HashSet<_> = - HashSet::from_iter(constrained_values.iter().copied()); - constrained_values.extend(constrained_arrays); + let constrained_values: HashSet<_> = constrained_values + .map(|v| { + if let Some(parent_array) = self.array_elements.get(v) { + *parent_array + } else { + *v + } + }) + .collect(); self.tainted.iter_mut().for_each(|(_, tainted_ids)| { tainted_ids.store_partial_constraints(&constrained_values); @@ -839,7 +846,7 @@ mod test { #[test] #[traced_test] - /// Test where a call to a brillig function returning multiple result values + /// Test where a call to a Brillig function returning multiple result values /// is left unchecked with a later assert involving all the results fn test_unchecked_multiple_results_brillig() { // First call is constrained properly, involving both results @@ -870,7 +877,7 @@ mod test { #[test] #[traced_test] - /// Test where a brillig function is called with a constant argument + /// Test where a Brillig function is called with a constant argument /// (should _not_ lead to a false positive failed check /// if all the results are constrained) fn test_checked_brillig_with_constant_arguments() { @@ -900,7 +907,7 @@ mod test { #[test] #[traced_test] - /// Test where a brillig function call is constrained with a range check + /// Test where a Brillig function call is constrained with a range check /// (should _not_ lead to a false positive failed check) fn test_range_checked_brillig() { // The call is constrained properly with a range check, involving @@ -929,7 +936,7 @@ mod test { #[test] #[traced_test] - /// Test where a brillig nested type result is insufficiently constrained + /// Test where a Brillig nested type result is insufficiently constrained /// (with a field constraint missing) fn test_nested_type_result_brillig() { /* @@ -981,4 +988,33 @@ mod test { let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); assert_eq!(ssa_level_warnings.len(), 1); } + + #[test] + #[traced_test] + /// Test where Brillig calls' root result values are constrained against + /// each other (covers a false negative edge case) + /// (https://github.com/noir-lang/noir/pull/6658#pullrequestreview-2482170066) + fn test_root_result_intersection_false_negative() { + let program = r#" + acir(inline) fn main f0 { + b0(v0: Field, v1: Field): + v3 = call f1(v0, v1) -> Field + v5 = call f1(v0, v1) -> Field + v6 = eq v3, v5 + constrain v3 == v5 + v8 = add v3, v5 + return v8 + } + + brillig(inline) fn foo f1 { + b0(v0: Field, v1: Field): + v2 = add v0, v1 + return v2 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); + assert_eq!(ssa_level_warnings.len(), 2); + } } From 7b6ba1953154bf5848e7e4595427b8399364e4b4 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Mon, 9 Dec 2024 19:04:25 +0300 Subject: [PATCH 71/73] Update warning --- compiler/noirc_evaluator/src/errors.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/noirc_evaluator/src/errors.rs b/compiler/noirc_evaluator/src/errors.rs index 31fdda1ae2b..bb224617994 100644 --- a/compiler/noirc_evaluator/src/errors.rs +++ b/compiler/noirc_evaluator/src/errors.rs @@ -93,10 +93,10 @@ impl From for FileDiagnostic { let message = bug.to_string(); let (secondary_message, call_stack) = match bug { InternalBug::IndependentSubgraph { call_stack } => { - ("There is no path from the output of this brillig call to either return values or inputs of the circuit, which creates an independent subgraph. This is quite likely a soundness vulnerability".to_string(), call_stack) + ("There is no path from the output of this Brillig call to either return values or inputs of the circuit, which creates an independent subgraph. This is quite likely a soundness vulnerability".to_string(), call_stack) } InternalBug::UncheckedBrilligCall { call_stack } => { - ("There is no constraint between this brillig call's inputs and its return values. This should be done to prevent potential soundness vulnerabilities".to_string(), call_stack) + ("This Brillig call's inputs and its return values haven't been sufficiently constrained. This should be done to prevent potential soundness vulnerabilities".to_string(), call_stack) } InternalBug::AssertFailed { call_stack } => ("As a result, the compiled circuit is ensured to fail. Other assertions may also fail during execution".to_string(), call_stack) }; From cd37a3de5f517c200df403cad9dc78fef3385867 Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Tue, 10 Dec 2024 02:57:14 +0300 Subject: [PATCH 72/73] Update instruction set --- .../src/ssa/checks/check_for_underconstrained_values.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 14c2e9b0607..40c9dc03ec3 100644 --- a/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -299,6 +299,7 @@ impl DependencyContext { | Intrinsic::BlackBox(..) | Intrinsic::DerivePedersenGenerators | Intrinsic::FromField + | Intrinsic::Hint(..) | Intrinsic::SlicePushBack | Intrinsic::SlicePushFront | Intrinsic::SlicePopBack From 344342feb8bd768c131011287274c9c9c5ba683a Mon Sep 17 00:00:00 2001 From: Ratmir Karabut Date: Tue, 10 Dec 2024 03:05:21 +0300 Subject: [PATCH 73/73] Fix build --- compiler/noirc_evaluator/src/ssa/opt/hint.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/compiler/noirc_evaluator/src/ssa/opt/hint.rs b/compiler/noirc_evaluator/src/ssa/opt/hint.rs index 147367261a8..567a0795edc 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/hint.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/hint.rs @@ -19,6 +19,7 @@ mod tests { expression_width: ExpressionWidth::default(), emit_ssa: None, skip_underconstrained_check: true, + skip_brillig_constraints_check: true, inliner_aggressiveness: 0, max_bytecode_increase_percent: None, };