diff --git a/src/wasm-lib/kcl/src/ast/types.rs b/src/wasm-lib/kcl/src/ast/types.rs index 0c3f3e12a..f34bf0c2d 100644 --- a/src/wasm-lib/kcl/src/ast/types.rs +++ b/src/wasm-lib/kcl/src/ast/types.rs @@ -715,15 +715,9 @@ impl BinaryPart { pub async fn get_result( &self, memory: &mut ProgramMemory, - pipe_info: &mut PipeInfo, + pipe_info: &PipeInfo, ctx: &ExecutorContext, ) -> Result { - // We DO NOT set this globally because if we did and this was called inside a pipe it would - // stop the execution of the pipe. - // THIS IS IMPORTANT. - let mut new_pipe_info = pipe_info.clone(); - new_pipe_info.is_in_pipe = false; - match self { BinaryPart::Literal(literal) => Ok(literal.into()), BinaryPart::Identifier(identifier) => { @@ -731,14 +725,10 @@ impl BinaryPart { Ok(value.clone()) } BinaryPart::BinaryExpression(binary_expression) => { - binary_expression.get_result(memory, &mut new_pipe_info, ctx).await - } - BinaryPart::CallExpression(call_expression) => { - call_expression.execute(memory, &mut new_pipe_info, ctx).await - } - BinaryPart::UnaryExpression(unary_expression) => { - unary_expression.get_result(memory, &mut new_pipe_info, ctx).await + binary_expression.get_result(memory, pipe_info, ctx).await } + BinaryPart::CallExpression(call_expression) => call_expression.execute(memory, pipe_info, ctx).await, + BinaryPart::UnaryExpression(unary_expression) => unary_expression.get_result(memory, pipe_info, ctx).await, BinaryPart::MemberExpression(member_expression) => member_expression.get_result(memory), } } @@ -1019,7 +1009,7 @@ impl CallExpression { pub async fn execute( &self, memory: &mut ProgramMemory, - pipe_info: &mut PipeInfo, + pipe_info: &PipeInfo, ctx: &ExecutorContext, ) -> Result { let fn_name = self.callee.name.clone(); @@ -1037,14 +1027,7 @@ impl CallExpression { Value::BinaryExpression(binary_expression) => { binary_expression.get_result(memory, pipe_info, ctx).await? } - Value::CallExpression(call_expression) => { - // We DO NOT set this globally because if we did and this was called inside a pipe it would - // stop the execution of the pipe. - // THIS IS IMPORTANT. - let mut new_pipe_info = pipe_info.clone(); - new_pipe_info.is_in_pipe = false; - call_expression.execute(memory, &mut new_pipe_info, ctx).await? - } + Value::CallExpression(call_expression) => call_expression.execute(memory, pipe_info, ctx).await?, Value::UnaryExpression(unary_expression) => unary_expression.get_result(memory, pipe_info, ctx).await?, Value::ObjectExpression(object_expression) => object_expression.execute(memory, pipe_info, ctx).await?, Value::ArrayExpression(array_expression) => array_expression.execute(memory, pipe_info, ctx).await?, @@ -1056,7 +1039,7 @@ impl CallExpression { } Value::PipeSubstitution(pipe_substitution) => pipe_info .previous_results - .get(&pipe_info.index - 1) + .as_ref() .ok_or_else(|| { KclError::Semantic(KclErrorDetails { message: format!("PipeSubstitution index out of bounds: {:?}", pipe_info), @@ -1081,13 +1064,7 @@ impl CallExpression { // Attempt to call the function. let args = crate::std::Args::new(fn_args, self.into(), ctx.clone()); let result = func.std_lib_fn()(args).await?; - if pipe_info.is_in_pipe { - pipe_info.index += 1; - pipe_info.previous_results.push(result); - execute_pipe_body(memory, &pipe_info.body.clone(), pipe_info, self.into(), ctx).await - } else { - Ok(result) - } + Ok(result) } FunctionKind::Std(func) => { let function_expression = func.function(); @@ -1152,14 +1129,7 @@ impl CallExpression { })?; let result = result.get_value()?; - if pipe_info.is_in_pipe { - pipe_info.index += 1; - pipe_info.previous_results.push(result); - - execute_pipe_body(memory, &pipe_info.body.clone(), pipe_info, self.into(), ctx).await - } else { - Ok(result) - } + Ok(result) } FunctionKind::UserDefined => { let func = memory.get(&fn_name, self.into())?; @@ -1175,14 +1145,7 @@ impl CallExpression { let result = result.get_value()?; - if pipe_info.is_in_pipe { - pipe_info.index += 1; - pipe_info.previous_results.push(result); - - execute_pipe_body(memory, &pipe_info.body.clone(), pipe_info, self.into(), ctx).await - } else { - Ok(result) - } + Ok(result) } } } @@ -1731,7 +1694,7 @@ impl ArrayExpression { pub async fn execute( &self, memory: &mut ProgramMemory, - pipe_info: &mut PipeInfo, + pipe_info: &PipeInfo, ctx: &ExecutorContext, ) -> Result { let mut results = Vec::with_capacity(self.elements.len()); @@ -1747,14 +1710,7 @@ impl ArrayExpression { Value::BinaryExpression(binary_expression) => { binary_expression.get_result(memory, pipe_info, ctx).await? } - Value::CallExpression(call_expression) => { - // We DO NOT set this globally because if we did and this was called inside a pipe it would - // stop the execution of the pipe. - // THIS IS IMPORTANT. - let mut new_pipe_info = pipe_info.clone(); - new_pipe_info.is_in_pipe = false; - call_expression.execute(memory, &mut new_pipe_info, ctx).await? - } + Value::CallExpression(call_expression) => call_expression.execute(memory, pipe_info, ctx).await?, Value::UnaryExpression(unary_expression) => unary_expression.get_result(memory, pipe_info, ctx).await?, Value::ObjectExpression(object_expression) => object_expression.execute(memory, pipe_info, ctx).await?, Value::ArrayExpression(array_expression) => array_expression.execute(memory, pipe_info, ctx).await?, @@ -1885,7 +1841,7 @@ impl ObjectExpression { pub async fn execute( &self, memory: &mut ProgramMemory, - pipe_info: &mut PipeInfo, + pipe_info: &PipeInfo, ctx: &ExecutorContext, ) -> Result { let mut object = Map::new(); @@ -1900,14 +1856,7 @@ impl ObjectExpression { Value::BinaryExpression(binary_expression) => { binary_expression.get_result(memory, pipe_info, ctx).await? } - Value::CallExpression(call_expression) => { - // We DO NOT set this globally because if we did and this was called inside a pipe it would - // stop the execution of the pipe. - // THIS IS IMPORTANT. - let mut new_pipe_info = pipe_info.clone(); - new_pipe_info.is_in_pipe = false; - call_expression.execute(memory, &mut new_pipe_info, ctx).await? - } + Value::CallExpression(call_expression) => call_expression.execute(memory, pipe_info, ctx).await?, Value::UnaryExpression(unary_expression) => unary_expression.get_result(memory, pipe_info, ctx).await?, Value::ObjectExpression(object_expression) => object_expression.execute(memory, pipe_info, ctx).await?, Value::ArrayExpression(array_expression) => array_expression.execute(memory, pipe_info, ctx).await?, @@ -2338,25 +2287,11 @@ impl BinaryExpression { pub async fn get_result( &self, memory: &mut ProgramMemory, - pipe_info: &mut PipeInfo, + pipe_info: &PipeInfo, ctx: &ExecutorContext, ) -> Result { - // We DO NOT set this globally because if we did and this was called inside a pipe it would - // stop the execution of the pipe. - // THIS IS IMPORTANT. - let mut new_pipe_info = pipe_info.clone(); - new_pipe_info.is_in_pipe = false; - - let left_json_value = self - .left - .get_result(memory, &mut new_pipe_info, ctx) - .await? - .get_json_value()?; - let right_json_value = self - .right - .get_result(memory, &mut new_pipe_info, ctx) - .await? - .get_json_value()?; + let left_json_value = self.left.get_result(memory, pipe_info, ctx).await?.get_json_value()?; + let right_json_value = self.right.get_result(memory, pipe_info, ctx).await?.get_json_value()?; // First check if we are doing string concatenation. if self.operator == BinaryOperator::Add { @@ -2542,19 +2477,13 @@ impl UnaryExpression { pub async fn get_result( &self, memory: &mut ProgramMemory, - pipe_info: &mut PipeInfo, + pipe_info: &PipeInfo, ctx: &ExecutorContext, ) -> Result { - // We DO NOT set this globally because if we did and this was called inside a pipe it would - // stop the execution of the pipe. - // THIS IS IMPORTANT. - let mut new_pipe_info = pipe_info.clone(); - new_pipe_info.is_in_pipe = false; - let num = parse_json_number_as_f64( &self .argument - .get_result(memory, &mut new_pipe_info, ctx) + .get_result(memory, pipe_info, ctx) .await? .get_json_value()?, self.into(), @@ -2606,6 +2535,8 @@ pub enum UnaryOperator { pub struct PipeExpression { pub start: usize, pub end: usize, + // TODO: Only the first body expression can be any Value. + // The rest will be CallExpression, and the AST type should reflect this. pub body: Vec, pub non_code_meta: NonCodeMeta, } @@ -2696,12 +2627,9 @@ impl PipeExpression { pub async fn get_result( &self, memory: &mut ProgramMemory, - pipe_info: &mut PipeInfo, + pipe_info: &PipeInfo, ctx: &ExecutorContext, ) -> Result { - // Reset the previous results. - pipe_info.previous_results = vec![]; - pipe_info.index = 0; execute_pipe_body(memory, &self.body, pipe_info, self.into(), ctx).await } @@ -2717,57 +2645,59 @@ impl PipeExpression { async fn execute_pipe_body( memory: &mut ProgramMemory, body: &[Value], - pipe_info: &mut PipeInfo, + pipe_info: &PipeInfo, source_range: SourceRange, ctx: &ExecutorContext, ) -> Result { - if pipe_info.index == body.len() { - pipe_info.is_in_pipe = false; - return Ok(pipe_info - .previous_results - .last() - .ok_or_else(|| { - KclError::Semantic(KclErrorDetails { - message: "Pipe body results should have at least one expression".to_string(), - source_ranges: vec![source_range], - }) - })? - .clone()); - } - - let expression = body.get(pipe_info.index).ok_or_else(|| { + let mut body_iter = body.iter(); + let first = body_iter.next().ok_or_else(|| { KclError::Semantic(KclErrorDetails { - message: format!("Invalid index for pipe: {}", pipe_info.index), + message: "Pipe expressions cannot be empty".to_owned(), source_ranges: vec![source_range], }) })?; - - match expression { - Value::BinaryExpression(binary_expression) => { - let result = binary_expression.get_result(memory, pipe_info, ctx).await?; - pipe_info.previous_results.push(result); - pipe_info.index += 1; - execute_pipe_body(memory, body, pipe_info, source_range, ctx).await - } - Value::CallExpression(call_expression) => { - pipe_info.is_in_pipe = true; - pipe_info.body = body.to_vec(); - call_expression.execute(memory, pipe_info, ctx).await - } - Value::Identifier(identifier) => { - let result = memory.get(&identifier.name, identifier.into())?; - pipe_info.previous_results.push(result.clone()); - pipe_info.index += 1; - execute_pipe_body(memory, body, pipe_info, source_range, ctx).await - } + // Evaluate the first element in the pipeline. + // They use the `pipe_info` from some AST node above this, so that if pipe expression is nested in a larger pipe expression, + // they use the % from the parent. After all, this pipe expression hasn't been executed yet, so it doesn't have any % value + // of its own. + let output = match first { + Value::BinaryExpression(binary_expression) => binary_expression.get_result(memory, pipe_info, ctx).await?, + Value::CallExpression(call_expression) => call_expression.execute(memory, pipe_info, ctx).await?, + Value::Identifier(identifier) => memory.get(&identifier.name, identifier.into())?.clone(), _ => { // Return an error this should not happen. - Err(KclError::Semantic(KclErrorDetails { - message: format!("PipeExpression not implemented here: {:?}", expression), - source_ranges: vec![expression.into()], - })) + return Err(KclError::Semantic(KclErrorDetails { + message: format!("PipeExpression not implemented here: {:?}", first), + source_ranges: vec![first.into()], + })); } + }; + // Now that we've evaluated the first child expression in the pipeline, following child expressions + // should use the previous child expression for %. + // This means there's no more need for the previous `pipe_info` from the parent AST node above this one. + let mut new_pipe_info = PipeInfo::new(); + new_pipe_info.previous_results = Some(output); + // Evaluate remaining elements. + for expression in body { + let output = match expression { + Value::BinaryExpression(binary_expression) => { + binary_expression.get_result(memory, &new_pipe_info, ctx).await? + } + Value::CallExpression(call_expression) => call_expression.execute(memory, &new_pipe_info, ctx).await?, + Value::Identifier(identifier) => memory.get(&identifier.name, identifier.into())?.clone(), + _ => { + // Return an error this should not happen. + return Err(KclError::Semantic(KclErrorDetails { + message: format!("PipeExpression not implemented here: {:?}", expression), + source_ranges: vec![expression.into()], + })); + } + }; + new_pipe_info.previous_results = Some(output); } + // Safe to unwrap here, because `newpipe_info` always has something pushed in when the `match first` executes. + let final_output = new_pipe_info.previous_results.unwrap(); + Ok(final_output) } #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, JsonSchema, Bake, FromStr, Display)] diff --git a/src/wasm-lib/kcl/src/executor.rs b/src/wasm-lib/kcl/src/executor.rs index 397febc52..836329bb6 100644 --- a/src/wasm-lib/kcl/src/executor.rs +++ b/src/wasm-lib/kcl/src/executor.rs @@ -953,20 +953,12 @@ impl ExtrudeSurface { #[ts(export)] #[serde(rename_all = "camelCase")] pub struct PipeInfo { - pub previous_results: Vec, - pub is_in_pipe: bool, - pub index: usize, - pub body: Vec, + pub previous_results: Option, } impl PipeInfo { pub fn new() -> Self { - Self { - previous_results: Vec::new(), - is_in_pipe: false, - index: 0, - body: Vec::new(), - } + Self { previous_results: None } } } @@ -1022,14 +1014,14 @@ pub async fn execute( ) .await?; - let mut pipe_info = PipeInfo::default(); + let pipe_info = PipeInfo::default(); // Iterate over the body of the program. for statement in &program.body { match statement { BodyItem::ExpressionStatement(expression_statement) => { if let Value::PipeExpression(pipe_expr) = &expression_statement.expression { - pipe_expr.get_result(memory, &mut pipe_info, ctx).await?; + pipe_expr.get_result(memory, &pipe_info, ctx).await?; } else if let Value::CallExpression(call_expr) = &expression_statement.expression { let fn_name = call_expr.callee.name.to_string(); let mut args: Vec = Vec::new(); @@ -1041,23 +1033,23 @@ pub async fn execute( args.push(memory_item.clone()); } Value::CallExpression(call_expr) => { - let result = call_expr.execute(memory, &mut pipe_info, ctx).await?; + let result = call_expr.execute(memory, &pipe_info, ctx).await?; args.push(result); } Value::BinaryExpression(binary_expression) => { - let result = binary_expression.get_result(memory, &mut pipe_info, ctx).await?; + let result = binary_expression.get_result(memory, &pipe_info, ctx).await?; args.push(result); } Value::UnaryExpression(unary_expression) => { - let result = unary_expression.get_result(memory, &mut pipe_info, ctx).await?; + let result = unary_expression.get_result(memory, &pipe_info, ctx).await?; args.push(result); } Value::ObjectExpression(object_expression) => { - let result = object_expression.execute(memory, &mut pipe_info, ctx).await?; + let result = object_expression.execute(memory, &pipe_info, ctx).await?; args.push(result); } Value::ArrayExpression(array_expression) => { - let result = array_expression.execute(memory, &mut pipe_info, ctx).await?; + let result = array_expression.execute(memory, &pipe_info, ctx).await?; args.push(result); } // We do nothing for the rest. @@ -1108,7 +1100,7 @@ pub async fn execute( memory.add(&var_name, value.clone(), source_range)?; } Value::BinaryExpression(binary_expression) => { - let result = binary_expression.get_result(memory, &mut pipe_info, ctx).await?; + let result = binary_expression.get_result(memory, &pipe_info, ctx).await?; memory.add(&var_name, result, source_range)?; } Value::FunctionExpression(function_expression) => { @@ -1145,11 +1137,11 @@ pub async fn execute( )?; } Value::CallExpression(call_expression) => { - let result = call_expression.execute(memory, &mut pipe_info, ctx).await?; + let result = call_expression.execute(memory, &pipe_info, ctx).await?; memory.add(&var_name, result, source_range)?; } Value::PipeExpression(pipe_expression) => { - let result = pipe_expression.get_result(memory, &mut pipe_info, ctx).await?; + let result = pipe_expression.get_result(memory, &pipe_info, ctx).await?; memory.add(&var_name, result, source_range)?; } Value::PipeSubstitution(pipe_substitution) => { @@ -1162,11 +1154,11 @@ pub async fn execute( })); } Value::ArrayExpression(array_expression) => { - let result = array_expression.execute(memory, &mut pipe_info, ctx).await?; + let result = array_expression.execute(memory, &pipe_info, ctx).await?; memory.add(&var_name, result, source_range)?; } Value::ObjectExpression(object_expression) => { - let result = object_expression.execute(memory, &mut pipe_info, ctx).await?; + let result = object_expression.execute(memory, &pipe_info, ctx).await?; memory.add(&var_name, result, source_range)?; } Value::MemberExpression(member_expression) => { @@ -1174,7 +1166,7 @@ pub async fn execute( memory.add(&var_name, result, source_range)?; } Value::UnaryExpression(unary_expression) => { - let result = unary_expression.get_result(memory, &mut pipe_info, ctx).await?; + let result = unary_expression.get_result(memory, &pipe_info, ctx).await?; memory.add(&var_name, result, source_range)?; } } @@ -1182,11 +1174,11 @@ pub async fn execute( } BodyItem::ReturnStatement(return_statement) => match &return_statement.argument { Value::BinaryExpression(bin_expr) => { - let result = bin_expr.get_result(memory, &mut pipe_info, ctx).await?; + let result = bin_expr.get_result(memory, &pipe_info, ctx).await?; memory.return_ = Some(ProgramReturn::Value(result)); } Value::UnaryExpression(unary_expr) => { - let result = unary_expr.get_result(memory, &mut pipe_info, ctx).await?; + let result = unary_expr.get_result(memory, &pipe_info, ctx).await?; memory.return_ = Some(ProgramReturn::Value(result)); } Value::Identifier(identifier) => { @@ -1197,15 +1189,15 @@ pub async fn execute( memory.return_ = Some(ProgramReturn::Value(literal.into())); } Value::ArrayExpression(array_expr) => { - let result = array_expr.execute(memory, &mut pipe_info, ctx).await?; + let result = array_expr.execute(memory, &pipe_info, ctx).await?; memory.return_ = Some(ProgramReturn::Value(result)); } Value::ObjectExpression(obj_expr) => { - let result = obj_expr.execute(memory, &mut pipe_info, ctx).await?; + let result = obj_expr.execute(memory, &pipe_info, ctx).await?; memory.return_ = Some(ProgramReturn::Value(result)); } Value::CallExpression(call_expr) => { - let result = call_expr.execute(memory, &mut pipe_info, ctx).await?; + let result = call_expr.execute(memory, &pipe_info, ctx).await?; memory.return_ = Some(ProgramReturn::Value(result)); } Value::MemberExpression(member_expr) => { @@ -1213,7 +1205,7 @@ pub async fn execute( memory.return_ = Some(ProgramReturn::Value(result)); } Value::PipeExpression(pipe_expr) => { - let result = pipe_expr.get_result(memory, &mut pipe_info, ctx).await?; + let result = pipe_expr.get_result(memory, &pipe_info, ctx).await?; memory.return_ = Some(ProgramReturn::Value(result)); } Value::PipeSubstitution(_) => {} diff --git a/src/wasm-lib/tests/executor/inputs/mike_stress_test.kcl b/src/wasm-lib/tests/executor/inputs/mike_stress_test.kcl index a32d1cbfb..f5e538de1 100644 --- a/src/wasm-lib/tests/executor/inputs/mike_stress_test.kcl +++ b/src/wasm-lib/tests/executor/inputs/mike_stress_test.kcl @@ -1,55 +1,5 @@ const part001 = startSketchOn('XY') |> startProfileAt([0.0, 0.0], %) - |> line([0.3095218558495034, -0.7083872933456363], %) - |> line([0.9654249947624629, -0.2160186018310415], %) - |> line([0.5639067891980512, 0.2782299956343597], %) - |> line([0.31099272713683224, -0.14283865756612024], %) - |> line([0.6050267610532611, 0.2419867749828144], %) - |> line([-0.4323915511683365, 0.5420452493934498], %) - |> line([-0.38075386000905387, -0.5066984514827444], %) - |> line([-0.24764758389378105, -0.028269261184496575], %) - |> line([-0.9547507244607472, 0.06698151094692739], %) - |> line([0.41281426037709057, 0.04247682532926844], %) - |> line([0.733675582700241, 0.3466438867749282], %) - |> line([-0.08320828774554445, 0.5306350687714299], %) - |> line([0.20070573965351035, -0.383629251628667], %) - |> line([-0.6100050904215362, 0.2122591494928594], %) - |> line([-0.8877251601125651, 0.9980849022788463], %) - |> line([0.3123326549087244, -0.13776227734026913], %) - |> line([-0.665018703555295, 0.9317350689283723], %) - |> line([0.11646747504481114, 0.44880962134512226], %) - |> line([-0.15034503757233764, -0.07514270519084065], %) - |> line([0.2106410349397485, -0.31901793587001537], %) - |> line([0.4367395608785267, -0.8469336669911456], %) - |> line([-0.6524104563094253, 0.022612116703192964], %) - |> line([0.04036408191329688, 0.7497713289526318], %) - |> line([-0.6099424500839847, 0.42578338327929477], %) - |> line([0.2738628173996067, 0.292996139723938], %) - |> line([0.8018957693340658, 0.5018988993652216], %) - |> line([0.9862148114460458, 0.8101962695418401], %) - |> line([0.18418024509134412, 0.6647051728461535], %) - |> line([-0.41769627175990043, -0.6264445510434984], %) - |> line([0.3991866953640668, 0.46136972597987436], %) - |> line([-0.44093982296772616, -0.8333288574682851], %) - |> line([-0.8447618278155113, -0.04502328445434012], %) - |> line([0.9053519778486987, 0.969918715258336], %) - |> line([0.3194360374757683, 0.03445025267979118], %) - |> line([0.06307363120331755, -0.0358428357517977], %) - |> line([-0.30728888002072186, -0.8058090225527681], %) - |> line([-0.2205915713289539, -0.68574749506418], %) - |> line([0.419141617082303, -0.374952391907611], %) - |> line([-0.7972443533406108, -0.37641928818278414], %) - |> line([0.3254690432623757, 0.800322923721221], %) - |> line([0.5419001425963772, 0.09338701240253178], %) - |> line([0.5272536888861876, -0.7219585162844677], %) - |> line([-0.9496693849948217, -0.2769753205653678], %) - |> line([0.4521856277880685, -0.962494995189215], %) - |> line([-0.07914106048413672, -0.5320023219059447], %) - |> line([-0.30087191904043586, -0.5990096310432906], %) - |> line([-0.9804312039683667, -0.20747398421974506], %) - |> line([0.7003345934688194, 0.34735726641904163], %) - |> line([-0.5812349365950902, 0.1245980114182097], %) - |> line([0.8562127850029553, 0.9561331524557184], %) |> line([-0.3670208139314082, 0.21201331909674526], %) |> line([-0.4707511307971115, 0.4905279615419764], %) |> line([-0.8328324229085962, 0.4677492878818803], %) @@ -71,156 +21,6 @@ const part001 = startSketchOn('XY') |> line([0.5235806061589545, 0.694318985642328], %) |> line([0.39140760219992154, -0.7839795272576484], %) |> line([0.8414243527073519, 0.5395591528940082], %) - |> line([-0.23919804420819268, 0.9950312242471215], %) - |> line([-0.24832135707240766, 0.12852484509989015], %) - |> line([-0.23306031340783884, -0.8746348470768666], %) - |> line([-0.982482038934116, 0.22333603211148145], %) - |> line([-0.8816255288350936, 0.5103601251495389], %) - |> line([0.15242108369693286, -0.7015378925056832], %) - |> line([-0.5385772302851539, -0.07031248099353693], %) - |> line([-0.16672156113764802, -0.5826174425548885], %) - |> line([0.25600811800134426, 0.025685903681070377], %) - |> line([0.9740978841265631, -0.9485583983333805], %) - |> line([0.7700855067313794, 0.9908891758829692], %) - |> line([-0.11756919649430464, 0.263852696629979], %) - |> line([0.622842218104259, -0.7773335041928975], %) - |> line([-0.9822916033957512, 0.9030795670859595], %) - |> line([0.17684671654276873, 0.5543296465531931], %) - |> line([-0.2585120033404764, -0.9946385700003058], %) - |> line([0.47903241172846855, 0.9436881919031574], %) - |> line([-0.34301067823447684, 0.6414567136954077], %) - |> line([0.6131643302815208, -0.4379709326841019], %) - |> line([-0.19976776590141587, 0.8961049779589205], %) - |> line([-0.8895558663652781, 0.08125215374497308], %) - |> line([0.7679023997363097, 0.05472225789480967], %) - |> line([-0.5573110628863549, -0.0493885276839825], %) - |> line([-0.8692870190797579, 0.34047428801384405], %) - |> line([-0.07963192514670636, 0.4906118707035698], %) - |> line([0.7546429709811202, 0.008793429901714722], %) - |> line([-0.33930119863603725, 0.904084721077185], %) - |> line([-0.9079263347011874, 0.05818097390308674], %) - |> line([0.9839286253275883, -0.4541365178001511], %) - |> line([-0.2630004661614309, -0.43811555004857716], %) - |> line([0.9656361166628373, -0.978769146384832], %) - |> line([-0.16395034069940184, -0.4639010139022397], %) - |> line([0.9105908865504724, -0.7176639594477656], %) - |> line([0.7070465909577839, 0.5157988806314064], %) - |> line([-0.012723556265232583, 0.6770815111856112], %) - |> line([-0.2943955496797206, -0.9743927595087347], %) - |> line([-0.1516930282544373, -0.3660544080480703], %) - |> line([-0.2695980406315064, -0.9768937499164652], %) - |> line([-0.3340785908248054, 0.5000926758093727], %) - |> line([-0.8613981451636481, 0.6683684704877668], %) - |> line([-0.8302138378432711, -0.0360629968083499], %) - |> line([-0.29040072414758744, 0.13018347388639695], %) - |> line([-0.4918613214920844, -0.6348418334773869], %) - |> line([-0.6621676894318094, -0.052130313096664604], %) - |> line([0.7417692436552934, 0.5896493608047846], %) - |> line([-0.7854331474660761, -0.032001603920813304], %) - |> line([-0.028697560050294113, 0.9608488511174829], %) - |> line([-0.7794985376111965, 0.4004278401373962], %) - |> line([-0.9333019526846862, 0.8413532084023534], %) - |> line([0.6669584789015472, 0.16795544524453265], %) - |> line([0.4691418582091864, -0.33541754144938984], %) - |> line([-0.3593199589576057, -0.7816337190621641], %) - |> line([-0.9145964527531667, -0.8064325123730209], %) - |> line([-0.9826383705388781, 0.3361524721141569], %) - |> line([-0.10809339353350111, -0.8758635697187047], %) - |> line([0.9541693823298274, 0.8263446355721698], %) - |> line([-0.44525574340096097, -0.6806381880440777], %) - |> line([-0.32599411929387645, 0.956248620927932], %) - |> line([0.9488597869031006, 0.045545197063536325], %) - |> line([0.7618475450804256, 0.10142472904482092], %) - |> line([0.3825096055636559, 0.10019167573578569], %) - |> line([-0.46148085777486303, 0.09056701568760928], %) - |> line([-0.22706656373264478, 0.9297166221335471], %) - |> line([-0.958861306195439, 0.31626278286591236], %) - |> line([-0.7010571654604918, 0.12109929549280829], %) - |> line([0.39726705538662155, 0.47600553691215475], %) - |> line([0.08621593475213007, -0.5296351060161009], %) - |> line([0.7754078435735718, 0.6093820711681557], %) - |> line([-0.3056814614007832, -0.8953363471752913], %) - |> line([0.48061255410893944, -0.38655492898582877], %) - |> line([-0.5989574891391645, 0.3133452514301842], %) - |> line([0.35506851023023334, 0.37705435800293374], %) - |> line([-0.6220678042464132, -0.5211627849228897], %) - |> line([0.2512638562718541, 0.951339134158065], %) - |> line([0.5205092100335389, -0.5136313372142864], %) - |> line([0.6606029240103481, 0.1887635591030341], %) - |> line([-0.22394411190507468, 0.5447920567080444], %) - |> line([0.5103589949893792, -0.29564917754139963], %) - |> line([0.16068072742941863, -0.22353679913991797], %) - |> line([-0.27792480093387906, 0.3435901480047461], %) - |> line([0.910750983246738, -0.9334565031046393], %) - |> line([-0.6515768237564095, 0.32212473016799326], %) - |> line([-0.5296333006910141, -0.3711267110258134], %) - |> line([0.2118314056290631, -0.33069360598339226], %) - |> line([-0.5365337213930894, -0.5473623916226522], %) - |> line([-0.5245048853127214, 0.8367949619466399], %) - |> line([-0.7540657866032676, 0.14769271338098067], %) - |> line([0.992763030391602, 0.7639316596588819], %) - |> line([0.857768378572884, -0.6944842500353121], %) - |> line([0.4005174768762376, 0.6600907669575815], %) - |> line([-0.645611390406511, -0.39861243885399], %) - |> line([0.009900486047594415, -0.77611756802181], %) - |> line([-0.19615593217773974, 0.41149023433301046], %) - |> line([0.42938472299603925, 0.9477517404188116], %) - |> line([0.40074130509588324, -0.566332587259486], %) - |> line([0.2898259341147218, 0.22590066890313354], %) - |> line([-0.5057556642549823, -0.5610169943703491], %) - |> line([0.4495779256452137, -0.021047394772889305], %) - |> line([0.173178392939364, -0.5498285342182849], %) - |> line([-0.08881879392509351, 0.25427796172400186], %) - |> line([-0.9657893584963719, 0.9839791825618085], %) - |> line([0.7083108746243418, -0.22535606355635363], %) - |> line([0.265419293693699, 0.35041736198594187], %) - |> line([0.7781087684483956, 0.05995639663529162], %) - |> line([-0.8768767310044128, -0.4718982924410984], %) - |> line([0.1678849629477135, -0.5293014024283789], %) - |> line([0.31120032834721156, 0.03705118004150609], %) - |> line([0.7329557552201549, -0.4314204260409016], %) - |> line([-0.6108642777595983, -0.35204612583851347], %) - |> line([-0.0839536144481916, -0.08354941188151321], %) - |> line([0.8371088826412028, 0.4260108441383106], %) - |> line([0.7493245515825924, 0.7618529060802053], %) - |> line([0.3221910673940078, 0.3927353824928492], %) - |> line([-0.9895483087404824, 0.18562652616960662], %) - |> line([-0.9579040110017665, 0.0353103934459702], %) - |> line([-0.05855811077127071, 0.12766243074937456], %) - |> line([0.15220552654559816, 0.576072300573911], %) - |> line([0.8846095083984233, -0.8738137361401468], %) - |> line([0.1506568989702708, -0.80620833872318], %) - |> line([0.6704828429539815, 0.3986607005727487], %) - |> line([-0.2113864165004411, 0.6162094819318868], %) - |> line([-0.9099033678353805, -0.7779600392259771], %) - |> line([0.11083360388105112, 0.34713599006897855], %) - |> line([0.15847847493707845, 0.3003425549761669], %) - |> line([0.057149024560813055, 0.6293978406406322], %) - |> line([0.02849804711673909, 0.3720708792227647], %) - |> line([0.9972884089146301, 0.83023332226007], %) - |> line([0.9345680207038343, 0.35203110690937445], %) - |> line([0.9001007717546186, -0.18486904592941977], %) - |> line([0.6170289088974352, -0.5164524313285441], %) - |> line([-0.960589963540097, 0.17372740027815037], %) - |> line([0.3862273162204759, 0.4119239419067209], %) - |> line([-0.9299016486339631, -0.8841302035625895], %) - |> line([0.2780400471183484, 0.8076195322861779], %) - |> line([0.3964118297657697, 0.22984978761967656], %) - |> line([-0.015952150868203674, -0.20163451763310558], %) - |> line([-0.4395610763077893, 0.6964676732605946], %) - |> line([-0.9111720887127097, 0.225080447388458], %) - |> line([0.07506155607092357, 0.6763598688853807], %) - |> line([0.7998287345894037, -0.7340954932733814], %) - |> line([-0.14730530701964129, 0.2647949264827336], %) - |> line([0.02956152490661612, -0.5657263126576406], %) - |> line([-0.8840295560189719, 0.7340227632302572], %) - |> line([0.45415942024525413, 0.15158083269451472], %) - |> line([0.9840487032500946, -0.6634475998601443], %) - |> line([0.13920534819599628, 0.736215165029908], %) - |> line([-0.1406599290299706, 0.40439717896079075], %) - |> line([-0.9169513885855405, 0.1570974766013722], %) - |> line([0.0034647416648696527, -0.6448386189259006], %) - |> line([0.1671862046540633, 0.5904328502842995], %) |> line([0.6137667704875602, 0.22119647516722085], %) |> line([0.8830488380766681, 0.6996724408425232], %) |> line([-0.41290485754343953, -0.4152647361760933], %) @@ -252,6 +52,906 @@ const part001 = startSketchOn('XY') |> line([-0.2568187045379722, -0.45031188717601367], %) |> line([0.6751951211858687, -0.9709424233465593], %) |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([0.9464450621708211, -0.2684908127803667], %) + |> line([0.5241732366617591, 0.9011437416408563], %) + |> line([-0.14255393713960607, -0.5194262624564814], %) + |> line([-0.4287123231350338, -0.4223564528725028], %) + |> line([-0.09316367294024519, -0.9063127021008246], %) + |> line([-0.2767766535558669, 0.6816248114129131], %) + |> line([0.9796762495562534, -0.0822145668330625], %) + |> line([-0.8666513070867441, -0.301053160242023], %) + |> line([0.537415656028112, 0.020272692875002774], %) + |> line([0.9332396256457531, -0.6228175690649898], %) + |> line([0.18052415837320734, -0.36894384647296197], %) + |> line([0.5384372634075449, 0.2377565050887107], %) + |> line([0.39043436929278874, 0.14273182483160451], %) + |> line([0.09782890412897283, 0.9907667536909659], %) + |> line([0.5286610085921146, -0.7924508308419256], %) + |> line([0.3789978184503342, 0.12396120576838676], %) + |> line([-0.9484912744890612, 0.6729649846476855], %) + |> line([0.7451758753425153, -0.21318737562458967], %) + |> line([0.1873200727251887, -0.15961374297992448], %) + |> line([-0.05729464924537564, -0.5436345558508746], %) + |> line([-0.09582414374469184, -0.7533839681212353], %) + |> line([-0.17254116580051848, -0.7669113400341137], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([-0.3670208139314082, 0.21201331909674526], %) + |> line([-0.4707511307971115, 0.4905279615419764], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([-0.6716353749059765, -0.9605576808879026], %) + |> line([0.010280170930300203, -0.37344123662342166], %) + |> line([0.10357375682791004, -0.42294321030821425], %) + |> line([0.4520311575096987, -0.11232675307600548], %) + |> line([-0.8821185914380845, -0.7155147434939819], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([0.7098978191546745, 0.11710004169385968], %) + |> line([-0.37876368560819995, 0.7106729314759084], %) + |> line([-0.29728126898353335, -0.06649734568328003], %) + |> line([0.22965781558352072, -0.7601866432836641], %) + |> line([-0.6356501074317229, 0.19458425399338064], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([-0.9580409549552311, -0.02243818192078395], %) + |> line([0.3299184618602866, -0.8353726942369875], %) + |> line([0.7434639386755209, -0.7919648864138378], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([-0.5035812884687294, 0.5150967434989442], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([0.8593271349126876, 0.08414894953725849], %) + |> line([-0.8181049219192864, -0.903548131323352], %) + |> line([0.3165782044458305, -0.24189274252014914], %) + |> line([-0.44390956414045135, -0.25912591535126905], %) + |> line([-0.6605165911891009, -0.40355115288839194], %) + |> line([-0.7170489950180006, 0.23454356079651384], %) + |> line([-0.2568187045379722, -0.45031188717601367], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.3670208139314082, 0.21201331909674526], %) + |> line([-0.4707511307971115, 0.4905279615419764], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([-0.6716353749059765, -0.9605576808879026], %) + |> line([0.010280170930300203, -0.37344123662342166], %) + |> line([-0.3670208139314082, 0.21201331909674526], %) + |> line([-0.4707511307971115, 0.4905279615419764], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([-0.6716353749059765, -0.9605576808879026], %) + |> line([0.010280170930300203, -0.37344123662342166], %) + |> line([0.10357375682791004, -0.42294321030821425], %) + |> line([0.4520311575096987, -0.11232675307600548], %) + |> line([-0.8821185914380845, -0.7155147434939819], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([0.7098978191546745, 0.11710004169385968], %) + |> line([-0.37876368560819995, 0.7106729314759084], %) + |> line([-0.29728126898353335, -0.06649734568328003], %) + |> line([0.22965781558352072, -0.7601866432836641], %) + |> line([-0.6356501074317229, 0.19458425399338064], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([-0.9580409549552311, -0.02243818192078395], %) + |> line([0.3299184618602866, -0.8353726942369875], %) + |> line([0.7434639386755209, -0.7919648864138378], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([-0.5035812884687294, 0.5150967434989442], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([0.8593271349126876, 0.08414894953725849], %) + |> line([-0.8181049219192864, -0.903548131323352], %) + |> line([0.3165782044458305, -0.24189274252014914], %) + |> line([-0.44390956414045135, -0.25912591535126905], %) + |> line([-0.6605165911891009, -0.40355115288839194], %) + |> line([-0.7170489950180006, 0.23454356079651384], %) + |> line([-0.2568187045379722, -0.45031188717601367], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([0.9464450621708211, -0.2684908127803667], %) + |> line([0.5241732366617591, 0.9011437416408563], %) + |> line([-0.14255393713960607, -0.5194262624564814], %) + |> line([-0.4287123231350338, -0.4223564528725028], %) + |> line([-0.09316367294024519, -0.9063127021008246], %) + |> line([-0.2767766535558669, 0.6816248114129131], %) + |> line([0.9796762495562534, -0.0822145668330625], %) + |> line([-0.8666513070867441, -0.301053160242023], %) + |> line([0.537415656028112, 0.020272692875002774], %) + |> line([0.9332396256457531, -0.6228175690649898], %) + |> line([0.18052415837320734, -0.36894384647296197], %) + |> line([0.5384372634075449, 0.2377565050887107], %) + |> line([0.39043436929278874, 0.14273182483160451], %) + |> line([0.09782890412897283, 0.9907667536909659], %) + |> line([0.5286610085921146, -0.7924508308419256], %) + |> line([0.3789978184503342, 0.12396120576838676], %) + |> line([-0.9484912744890612, 0.6729649846476855], %) + |> line([0.7451758753425153, -0.21318737562458967], %) + |> line([0.1873200727251887, -0.15961374297992448], %) + |> line([-0.05729464924537564, -0.5436345558508746], %) + |> line([-0.09582414374469184, -0.7533839681212353], %) + |> line([-0.17254116580051848, -0.7669113400341137], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([-0.3670208139314082, 0.21201331909674526], %) + |> line([-0.4707511307971115, 0.4905279615419764], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([-0.6716353749059765, -0.9605576808879026], %) + |> line([0.010280170930300203, -0.37344123662342166], %) + |> line([0.10357375682791004, -0.42294321030821425], %) + |> line([0.4520311575096987, -0.11232675307600548], %) + |> line([-0.8821185914380845, -0.7155147434939819], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([0.7098978191546745, 0.11710004169385968], %) + |> line([-0.37876368560819995, 0.7106729314759084], %) + |> line([-0.29728126898353335, -0.06649734568328003], %) + |> line([0.22965781558352072, -0.7601866432836641], %) + |> line([-0.6356501074317229, 0.19458425399338064], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([-0.9580409549552311, -0.02243818192078395], %) + |> line([0.3299184618602866, -0.8353726942369875], %) + |> line([0.7434639386755209, -0.7919648864138378], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([-0.5035812884687294, 0.5150967434989442], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([0.8593271349126876, 0.08414894953725849], %) + |> line([-0.8181049219192864, -0.903548131323352], %) + |> line([0.3165782044458305, -0.24189274252014914], %) + |> line([-0.44390956414045135, -0.25912591535126905], %) + |> line([-0.6605165911891009, -0.40355115288839194], %) + |> line([-0.7170489950180006, 0.23454356079651384], %) + |> line([-0.2568187045379722, -0.45031188717601367], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.3670208139314082, 0.21201331909674526], %) + |> line([-0.4707511307971115, 0.4905279615419764], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([-0.6716353749059765, -0.9605576808879026], %) + |> line([0.010280170930300203, -0.37344123662342166], %) + |> line([0.10357375682791004, -0.42294321030821425], %) + |> line([0.4520311575096987, -0.11232675307600548], %) + |> line([-0.8821185914380845, -0.7155147434939819], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([0.7098978191546745, 0.11710004169385968], %) + |> line([-0.37876368560819995, 0.7106729314759084], %) + |> line([-0.29728126898353335, -0.06649734568328003], %) + |> line([0.22965781558352072, -0.7601866432836641], %) + |> line([-0.6356501074317229, 0.19458425399338064], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([-0.9580409549552311, -0.02243818192078395], %) + |> line([0.3299184618602866, -0.8353726942369875], %) + |> line([0.7434639386755209, -0.7919648864138378], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([-0.5035812884687294, 0.5150967434989442], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([0.8593271349126876, 0.08414894953725849], %) + |> line([-0.8181049219192864, -0.903548131323352], %) + |> line([0.3165782044458305, -0.24189274252014914], %) + |> line([-0.44390956414045135, -0.25912591535126905], %) + |> line([-0.6605165911891009, -0.40355115288839194], %) + |> line([-0.7170489950180006, 0.23454356079651384], %) + |> line([-0.2568187045379722, -0.45031188717601367], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([-0.09582414374469184, -0.7533839681212353], %) + |> line([-0.17254116580051848, -0.7669113400341137], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([0.9464450621708211, -0.2684908127803667], %) + |> line([0.5241732366617591, 0.9011437416408563], %) + |> line([-0.14255393713960607, -0.5194262624564814], %) + |> line([-0.4287123231350338, -0.4223564528725028], %) + |> line([-0.09316367294024519, -0.9063127021008246], %) + |> line([-0.2767766535558669, 0.6816248114129131], %) + |> line([0.9796762495562534, -0.0822145668330625], %) + |> line([-0.8666513070867441, -0.301053160242023], %) + |> line([0.537415656028112, 0.020272692875002774], %) + |> line([0.9332396256457531, -0.6228175690649898], %) + |> line([0.18052415837320734, -0.36894384647296197], %) + |> line([0.5384372634075449, 0.2377565050887107], %) + |> line([0.39043436929278874, 0.14273182483160451], %) + |> line([0.09782890412897283, 0.9907667536909659], %) + |> line([0.5286610085921146, -0.7924508308419256], %) + |> line([0.3789978184503342, 0.12396120576838676], %) + |> line([-0.9484912744890612, 0.6729649846476855], %) + |> line([0.7451758753425153, -0.21318737562458967], %) + |> line([0.1873200727251887, -0.15961374297992448], %) + |> line([-0.05729464924537564, -0.5436345558508746], %) + |> line([-0.09582414374469184, -0.7533839681212353], %) + |> line([-0.17254116580051848, -0.7669113400341137], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([-0.6238548626325471, 0.4053626746020169], %) + |> line([0.1379445992766417, -0.47871087958516045], %) + |> line([-0.9516767113283946, 0.8619900618578948], %) + |> line([0.9398732950992088, 0.6326239915683629], %) + |> line([-0.8631974445502164, 0.016153555523963137], %) + |> line([0.19167797120152907, -0.4916414381703984], %) + |> line([-0.8644261221501586, -0.11434763886359756], %) + |> line([-0.029081958413378572, -0.5214138808318329], %) + |> line([-0.8713091851579695, 0.7866284950967315], %) + |> line([0.884342023093545, -0.1825407002568431], %) + |> line([-0.6978385295364686, 0.0440574328736949], %) + |> line([-0.48055049324331556, -0.028546347149214002], %) + |> line([0.41283517382864776, -0.44938038251347323], %) + |> line([0.7911399832501751, 0.893446368526005], %) + |> line([0.6507434699009087, -0.6890023920962012], %) + |> line([0.10489019777253028, -0.5467450997193952], %) + |> line([-0.5760905289992633, -0.2639900702114173], %) + |> line([0.39828861790105297, 0.8036624129416385], %) + |> line([-0.673848991328553, -0.918443329270668], %) + |> line([-0.8599152936179257, -0.9499371022680787], %) + |> line([0.6285243831393765, -0.5186557636566307], %) + |> line([0.3222412784832269, 0.24621192679727177], %) + |> line([0.19754357911311016, -0.7529246632397206], %) + |> line([-0.43181570545865555, 0.18945437402201537], %) + |> line([0.8714511090241797, -0.7215844196844685], %) + |> line([-0.3670208139314082, 0.21201331909674526], %) + |> line([-0.4707511307971115, 0.4905279615419764], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([-0.6716353749059765, -0.9605576808879026], %) + |> line([0.010280170930300203, -0.37344123662342166], %) + |> line([0.10357375682791004, -0.42294321030821425], %) + |> line([0.4520311575096987, -0.11232675307600548], %) + |> line([-0.8821185914380845, -0.7155147434939819], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([0.7098978191546745, 0.11710004169385968], %) + |> line([-0.37876368560819995, 0.7106729314759084], %) + |> line([-0.29728126898353335, -0.06649734568328003], %) + |> line([0.22965781558352072, -0.7601866432836641], %) + |> line([-0.6356501074317229, 0.19458425399338064], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([-0.9580409549552311, -0.02243818192078395], %) + |> line([0.3299184618602866, -0.8353726942369875], %) + |> line([0.7434639386755209, -0.7919648864138378], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([-0.5035812884687294, 0.5150967434989442], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([0.8593271349126876, 0.08414894953725849], %) + |> line([-0.8181049219192864, -0.903548131323352], %) + |> line([0.3165782044458305, -0.24189274252014914], %) + |> line([-0.44390956414045135, -0.25912591535126905], %) + |> line([-0.6605165911891009, -0.40355115288839194], %) + |> line([-0.7170489950180006, 0.23454356079651384], %) + |> line([-0.2568187045379722, -0.45031188717601367], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([0.9464450621708211, -0.2684908127803667], %) + |> line([0.5241732366617591, 0.9011437416408563], %) + |> line([-0.14255393713960607, -0.5194262624564814], %) + |> line([-0.4287123231350338, -0.4223564528725028], %) + |> line([-0.09316367294024519, -0.9063127021008246], %) + |> line([-0.2767766535558669, 0.6816248114129131], %) + |> line([0.9796762495562534, -0.0822145668330625], %) + |> line([-0.8666513070867441, -0.301053160242023], %) + |> line([0.537415656028112, 0.020272692875002774], %) + |> line([0.9332396256457531, -0.6228175690649898], %) + |> line([0.18052415837320734, -0.36894384647296197], %) + |> line([0.5384372634075449, 0.2377565050887107], %) + |> line([0.39043436929278874, 0.14273182483160451], %) + |> line([0.09782890412897283, 0.9907667536909659], %) + |> line([0.5286610085921146, -0.7924508308419256], %) + |> line([0.3789978184503342, 0.12396120576838676], %) + |> line([-0.9484912744890612, 0.6729649846476855], %) + |> line([0.7451758753425153, -0.21318737562458967], %) + |> line([0.1873200727251887, -0.15961374297992448], %) + |> line([-0.05729464924537564, -0.5436345558508746], %) + |> line([-0.09582414374469184, -0.7533839681212353], %) + |> line([-0.17254116580051848, -0.7669113400341137], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([-0.3670208139314082, 0.21201331909674526], %) + |> line([-0.4707511307971115, 0.4905279615419764], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([-0.6716353749059765, -0.9605576808879026], %) + |> line([0.010280170930300203, -0.37344123662342166], %) + |> line([0.10357375682791004, -0.42294321030821425], %) + |> line([0.4520311575096987, -0.11232675307600548], %) + |> line([-0.8821185914380845, -0.7155147434939819], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([0.7098978191546745, 0.11710004169385968], %) + |> line([-0.37876368560819995, 0.7106729314759084], %) + |> line([-0.29728126898353335, -0.06649734568328003], %) + |> line([0.22965781558352072, -0.7601866432836641], %) + |> line([-0.6356501074317229, 0.19458425399338064], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([-0.9580409549552311, -0.02243818192078395], %) + |> line([0.3299184618602866, -0.8353726942369875], %) + |> line([0.7434639386755209, -0.7919648864138378], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([-0.5035812884687294, 0.5150967434989442], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([0.8593271349126876, 0.08414894953725849], %) + |> line([-0.8181049219192864, -0.903548131323352], %) + |> line([0.3165782044458305, -0.24189274252014914], %) + |> line([-0.44390956414045135, -0.25912591535126905], %) + |> line([-0.6605165911891009, -0.40355115288839194], %) + |> line([-0.7170489950180006, 0.23454356079651384], %) + |> line([-0.2568187045379722, -0.45031188717601367], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.3670208139314082, 0.21201331909674526], %) + |> line([-0.4707511307971115, 0.4905279615419764], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([-0.6716353749059765, -0.9605576808879026], %) + |> line([0.010280170930300203, -0.37344123662342166], %) + |> line([-0.3670208139314082, 0.21201331909674526], %) + |> line([-0.4707511307971115, 0.4905279615419764], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([-0.6716353749059765, -0.9605576808879026], %) + |> line([0.010280170930300203, -0.37344123662342166], %) + |> line([0.10357375682791004, -0.42294321030821425], %) + |> line([0.4520311575096987, -0.11232675307600548], %) + |> line([-0.8821185914380845, -0.7155147434939819], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([0.7098978191546745, 0.11710004169385968], %) + |> line([-0.37876368560819995, 0.7106729314759084], %) + |> line([-0.29728126898353335, -0.06649734568328003], %) + |> line([0.22965781558352072, -0.7601866432836641], %) + |> line([-0.6356501074317229, 0.19458425399338064], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([-0.9580409549552311, -0.02243818192078395], %) + |> line([0.3299184618602866, -0.8353726942369875], %) + |> line([0.7434639386755209, -0.7919648864138378], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([-0.5035812884687294, 0.5150967434989442], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([0.8593271349126876, 0.08414894953725849], %) + |> line([-0.8181049219192864, -0.903548131323352], %) + |> line([0.3165782044458305, -0.24189274252014914], %) + |> line([-0.44390956414045135, -0.25912591535126905], %) + |> line([-0.6605165911891009, -0.40355115288839194], %) + |> line([-0.7170489950180006, 0.23454356079651384], %) + |> line([-0.2568187045379722, -0.45031188717601367], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([0.9464450621708211, -0.2684908127803667], %) + |> line([0.5241732366617591, 0.9011437416408563], %) + |> line([-0.14255393713960607, -0.5194262624564814], %) + |> line([-0.4287123231350338, -0.4223564528725028], %) + |> line([-0.09316367294024519, -0.9063127021008246], %) + |> line([-0.2767766535558669, 0.6816248114129131], %) + |> line([0.9796762495562534, -0.0822145668330625], %) + |> line([-0.8666513070867441, -0.301053160242023], %) + |> line([0.537415656028112, 0.020272692875002774], %) + |> line([0.9332396256457531, -0.6228175690649898], %) + |> line([0.18052415837320734, -0.36894384647296197], %) + |> line([0.5384372634075449, 0.2377565050887107], %) + |> line([0.39043436929278874, 0.14273182483160451], %) + |> line([0.09782890412897283, 0.9907667536909659], %) + |> line([0.5286610085921146, -0.7924508308419256], %) + |> line([0.3789978184503342, 0.12396120576838676], %) + |> line([-0.9484912744890612, 0.6729649846476855], %) + |> line([0.7451758753425153, -0.21318737562458967], %) + |> line([0.1873200727251887, -0.15961374297992448], %) + |> line([-0.05729464924537564, -0.5436345558508746], %) + |> line([-0.09582414374469184, -0.7533839681212353], %) + |> line([-0.17254116580051848, -0.7669113400341137], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([-0.3670208139314082, 0.21201331909674526], %) + |> line([-0.4707511307971115, 0.4905279615419764], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([-0.6716353749059765, -0.9605576808879026], %) + |> line([0.010280170930300203, -0.37344123662342166], %) + |> line([0.10357375682791004, -0.42294321030821425], %) + |> line([0.4520311575096987, -0.11232675307600548], %) + |> line([-0.8821185914380845, -0.7155147434939819], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([0.7098978191546745, 0.11710004169385968], %) + |> line([-0.37876368560819995, 0.7106729314759084], %) + |> line([-0.29728126898353335, -0.06649734568328003], %) + |> line([0.22965781558352072, -0.7601866432836641], %) + |> line([-0.6356501074317229, 0.19458425399338064], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([-0.9580409549552311, -0.02243818192078395], %) + |> line([0.3299184618602866, -0.8353726942369875], %) + |> line([0.7434639386755209, -0.7919648864138378], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([-0.5035812884687294, 0.5150967434989442], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([0.8593271349126876, 0.08414894953725849], %) + |> line([-0.8181049219192864, -0.903548131323352], %) + |> line([0.3165782044458305, -0.24189274252014914], %) + |> line([-0.44390956414045135, -0.25912591535126905], %) + |> line([-0.6605165911891009, -0.40355115288839194], %) + |> line([-0.7170489950180006, 0.23454356079651384], %) + |> line([-0.2568187045379722, -0.45031188717601367], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.3670208139314082, 0.21201331909674526], %) + |> line([-0.4707511307971115, 0.4905279615419764], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([0.8830488380766681, 0.6996724408425232], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([-0.6716353749059765, -0.9605576808879026], %) + |> line([0.010280170930300203, -0.37344123662342166], %) + |> line([0.10357375682791004, -0.42294321030821425], %) + |> line([0.4520311575096987, -0.11232675307600548], %) + |> line([-0.8821185914380845, -0.7155147434939819], %) + |> line([0.9195487101690416, 0.2691627465297364], %) + |> line([0.7098978191546745, 0.11710004169385968], %) + |> line([-0.37876368560819995, 0.7106729314759084], %) + |> line([-0.29728126898353335, -0.06649734568328003], %) + |> line([0.22965781558352072, -0.7601866432836641], %) + |> line([-0.6356501074317229, 0.19458425399338064], %) + |> line([0.5721251777404546, 0.2888584097921527], %) + |> line([-0.9580409549552311, -0.02243818192078395], %) + |> line([0.3299184618602866, -0.8353726942369875], %) + |> line([0.7434639386755209, -0.7919648864138378], %) + |> line([0.9935751011164615, 0.9042566468497608], %) + |> line([-0.5035812884687294, 0.5150967434989442], %) + |> line([0.5526227215900215, 0.7612604137272441], %) + |> line([0.8593271349126876, 0.08414894953725849], %) + |> line([-0.8181049219192864, -0.903548131323352], %) + |> line([0.3165782044458305, -0.24189274252014914], %) + |> line([-0.44390956414045135, -0.25912591535126905], %) + |> line([-0.6605165911891009, -0.40355115288839194], %) + |> line([-0.7170489950180006, 0.23454356079651384], %) + |> line([-0.2568187045379722, -0.45031188717601367], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) + |> line([-0.8328324229085962, 0.4677492878818803], %) + |> line([-0.8111463382182231, -0.41814807547140576], %) + |> line([0.03807684940941125, 0.25664826686353326], %) + |> line([0.23950083339596384, 0.43693196301855575], %) + |> line([-0.16279444820904887, 0.8064475707664818], %) + |> line([-0.08972872009232558, -0.08887625823751266], %) + |> line([0.9203433427102556, -0.17343459369697545], %) + |> line([0.0017496234414517975, -0.5178508316168335], %) + |> line([0.6206263405732759, -0.8733399468665124], %) + |> line([-0.7776386664456383, 0.7602780485384968], %) + |> line([0.5439379760788592, 0.8449177589350552], %) + |> line([-0.13036646025917076, 0.012051713627069693], %) + |> line([-0.1656465612645519, -0.20775229173765486], %) + |> line([-0.0962723255929061, -0.05417797659066137], %) + |> line([0.902108945498191, 0.3958978534964961], %) + |> line([0.27997950083139167, -0.17778188444008958], %) + |> line([0.5235806061589545, 0.694318985642328], %) + |> line([0.39140760219992154, -0.7839795272576484], %) + |> line([0.8414243527073519, 0.5395591528940082], %) + |> line([0.6137667704875602, 0.22119647516722085], %) + |> line([-0.09582414374469184, -0.7533839681212353], %) + |> line([-0.17254116580051848, -0.7669113400341137], %) + |> line([0.8944730032887609, 0.6093318694741408], %) + |> line([-0.41290485754343953, -0.4152647361760933], %) + |> line([0.5169538755575687, -0.9085567867302617], %) + |> line([0.6751951211858687, -0.9709424233465593], %) + |> line([-0.5689619842972184, 0.5918969913790362], %) |> line([0.9464450621708211, -0.2684908127803667], %) |> line([0.5241732366617591, 0.9011437416408563], %) |> line([-0.14255393713960607, -0.5194262624564814], %) diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index f52646cd1..329c5e995 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -142,6 +142,15 @@ const part002 = startSketchOn(part001, "start") twenty_twenty::assert_image("tests/executor/outputs/sketch_on_face_start.png", &result, 0.999); } +#[tokio::test(flavor = "multi_thread")] +async fn serial_test_mike_stress_lines() { + let code = include_str!("inputs/mike_stress_test.kcl"); + let result = execute_and_snapshot(code, kittycad::types::UnitLength::Mm) + .await + .unwrap(); + twenty_twenty::assert_image("tests/executor/outputs/mike_stress_test.png", &result, 0.999); +} + #[tokio::test(flavor = "multi_thread")] async fn serial_test_sketch_on_face_end() { let code = r#"fn cube = (pos, scale) => { @@ -493,7 +502,7 @@ async fn serial_test_execute_i_shape() { } #[tokio::test(flavor = "multi_thread")] -#[ignore] // ignore until more stack fixes +#[ignore] // No longer a stack overflow problem, instead it causes an engine internal error. async fn serial_test_execute_pipes_on_pipes() { let code = include_str!("inputs/pipes_on_pipes.kcl"); @@ -514,7 +523,6 @@ async fn serial_test_execute_cylinder() { } #[tokio::test(flavor = "multi_thread")] -#[ignore = "currently stack overflows"] async fn serial_test_execute_kittycad_svg() { let code = include_str!("inputs/kittycad_svg.kcl"); diff --git a/src/wasm-lib/tests/executor/outputs/i_shape.png b/src/wasm-lib/tests/executor/outputs/i_shape.png index 6ac6561f9..767338231 100644 Binary files a/src/wasm-lib/tests/executor/outputs/i_shape.png and b/src/wasm-lib/tests/executor/outputs/i_shape.png differ diff --git a/src/wasm-lib/tests/executor/outputs/kittycad_svg.png b/src/wasm-lib/tests/executor/outputs/kittycad_svg.png index 1fa46781c..8d2948b3a 100644 Binary files a/src/wasm-lib/tests/executor/outputs/kittycad_svg.png and b/src/wasm-lib/tests/executor/outputs/kittycad_svg.png differ diff --git a/src/wasm-lib/tests/executor/outputs/mike_stress_test.png b/src/wasm-lib/tests/executor/outputs/mike_stress_test.png new file mode 100644 index 000000000..5d26a3ffa Binary files /dev/null and b/src/wasm-lib/tests/executor/outputs/mike_stress_test.png differ diff --git a/src/wasm-lib/tests/executor/outputs/parametric_with_tan_arc.png b/src/wasm-lib/tests/executor/outputs/parametric_with_tan_arc.png index 010739f39..5fecaa523 100644 Binary files a/src/wasm-lib/tests/executor/outputs/parametric_with_tan_arc.png and b/src/wasm-lib/tests/executor/outputs/parametric_with_tan_arc.png differ diff --git a/src/wasm-lib/tests/executor/outputs/rounded_with_holes.png b/src/wasm-lib/tests/executor/outputs/rounded_with_holes.png index 32b520b31..1f13e16b4 100644 Binary files a/src/wasm-lib/tests/executor/outputs/rounded_with_holes.png and b/src/wasm-lib/tests/executor/outputs/rounded_with_holes.png differ diff --git a/src/wasm-lib/tests/executor/outputs/sketch_on_face_circle.png b/src/wasm-lib/tests/executor/outputs/sketch_on_face_circle.png index fd68e0cb2..7d6e3e0a7 100644 Binary files a/src/wasm-lib/tests/executor/outputs/sketch_on_face_circle.png and b/src/wasm-lib/tests/executor/outputs/sketch_on_face_circle.png differ diff --git a/src/wasm-lib/tests/executor/outputs/sketch_on_face_circle_tagged.png b/src/wasm-lib/tests/executor/outputs/sketch_on_face_circle_tagged.png index fd68e0cb2..7d6e3e0a7 100644 Binary files a/src/wasm-lib/tests/executor/outputs/sketch_on_face_circle_tagged.png and b/src/wasm-lib/tests/executor/outputs/sketch_on_face_circle_tagged.png differ diff --git a/src/wasm-lib/tests/executor/outputs/sketch_on_face_end.png b/src/wasm-lib/tests/executor/outputs/sketch_on_face_end.png index b502ad5ea..5e17038a7 100644 Binary files a/src/wasm-lib/tests/executor/outputs/sketch_on_face_end.png and b/src/wasm-lib/tests/executor/outputs/sketch_on_face_end.png differ diff --git a/src/wasm-lib/tests/executor/outputs/sketch_on_face_end_negative_extrude.png b/src/wasm-lib/tests/executor/outputs/sketch_on_face_end_negative_extrude.png index cd1778727..ee9a84b44 100644 Binary files a/src/wasm-lib/tests/executor/outputs/sketch_on_face_end_negative_extrude.png and b/src/wasm-lib/tests/executor/outputs/sketch_on_face_end_negative_extrude.png differ diff --git a/src/wasm-lib/tests/executor/outputs/sketch_on_face_of_face.png b/src/wasm-lib/tests/executor/outputs/sketch_on_face_of_face.png index 4cece5726..cf1eec4ba 100644 Binary files a/src/wasm-lib/tests/executor/outputs/sketch_on_face_of_face.png and b/src/wasm-lib/tests/executor/outputs/sketch_on_face_of_face.png differ diff --git a/src/wasm-lib/tests/executor/outputs/sketch_on_face_start.png b/src/wasm-lib/tests/executor/outputs/sketch_on_face_start.png index a641057c3..c0458492c 100644 Binary files a/src/wasm-lib/tests/executor/outputs/sketch_on_face_start.png and b/src/wasm-lib/tests/executor/outputs/sketch_on_face_start.png differ diff --git a/src/wasm-lib/tests/executor/outputs/tangential_arc.png b/src/wasm-lib/tests/executor/outputs/tangential_arc.png index 879074161..12b6839c1 100644 Binary files a/src/wasm-lib/tests/executor/outputs/tangential_arc.png and b/src/wasm-lib/tests/executor/outputs/tangential_arc.png differ diff --git a/src/wasm-lib/tests/executor/outputs/tangential_arc_to.png b/src/wasm-lib/tests/executor/outputs/tangential_arc_to.png index 879074161..12b6839c1 100644 Binary files a/src/wasm-lib/tests/executor/outputs/tangential_arc_to.png and b/src/wasm-lib/tests/executor/outputs/tangential_arc_to.png differ diff --git a/src/wasm-lib/tests/executor/outputs/tangential_arc_with_point.png b/src/wasm-lib/tests/executor/outputs/tangential_arc_with_point.png index 879074161..12b6839c1 100644 Binary files a/src/wasm-lib/tests/executor/outputs/tangential_arc_with_point.png and b/src/wasm-lib/tests/executor/outputs/tangential_arc_with_point.png differ