!-p      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      0SafeWimplicitConsume whitespace.implicitMatch boolean true.implicitMatch boolean falseimplicitMatch the function keyword.implicitMatch the include keyword.implicitMatch the use keyword.implicitMatch the if keyword.implicitMatch the else keyword.implicitMatch the module keyword.implicitMatch the let keyword.implicitMatch the undef keyword.implicitMatch the each keyword.implicit6match a single character token followed by whitespace.implicitmatch a colon.implicitmatch a semicolon.implicitmatch a comma.implicitMatch operators.implicit!match something between two ends. implicitDmatch an identifier. variable name, function name, module name, etc.!"#$%&'() NoneMmNoneMNone=?2implicitA symbolic 3D format!implicitA symbolic 2D object format. We want to have symbolic objects so that we can accelerate rendering & give ideal meshes for simple cases.)implicitA Boxed 3D object*implicitA Boxed 2D object+implicitA Box containing a 3D object.,implicitA Box containing a 2D object.-implicit A 3D box..implicit A 2D box./implicit A 3D object.0implicit A 2D object.1implicit5A normed triangle mesh is a mesh of normed triangles.3implicitDA triangle mesh is a bunch of triangles, attempting to be a surface.5implicitiA triangle ((v1,n1),(v2,n2),(v3,n3)) has vertices v1, v2, v3 with corresponding normals n1, n2, and n37implicitDA triangle in 3D space (a,b,c) = a triangle with vertices a, b and c9implicitA triangle in 2D space (a,b,c).;implicitPA chain of line segments, as in SVG or DXF. eg. [(0,0), (0.5,1), (1,0)] ---> /\*implicit5Add multiply and divide operators for two !2s or !3s.Bimplicit[A give up point for dividing !s, and for the maximum difference between abs(n) and abs(-n).Cimplicit5apply a function to both items in the provided tuple.Dimplicit:apply a function to all three items in the provided tuple.Eimplicit"TODO: Find a better place for thisFimplicit+Convert from our Integral to our Rational. Gimplicit+Convert from our Fast Integer (int32) to !.Himplicit;Convert from our rational to a float, for output to a file.Iimplicitadd aditional instances to Show, for when we dump the intermediate form of objects. FIXME: store functions in a dumpable form! These instances cover functionsI   !"#$%'&()*+,-./0123456789:;<>=?@ABCDEFGHIA@C?DBE=>;<9:785634120/.-,+*) !"#$%'&(  FGHNoneWEU Wimplicit>Options changing the behavior of the extended OpenScad engine.[implicitAn individual message.]implicitLThe types of messages the execution engine can send back to the application.dimplicitjIn order to not propagate Parsec or other modules around, create our own source position type for the AST.fimplicit&Objects for our OpenSCAD-like languagezimplicitIA statement, along with the line, column number, and file it is found at.|implicitAn expression.implicit-Handles parsing arguments to built-in modulesimplicit]For actual argument entries: ArgParser (argument name) (default) (doc) (next Argparser...)implicit2For returns: ArgParserTerminator (return value)implicitJFor failure: ArgParserFailIf (test) (error message) (child for if true)implicitThis is the state of a computation. It contains a hash of variables/functions, an array of OVals, a path, messages, and options controlling code execution.implicitcFor programs using this API to perform variable lookups, after execution of an escad has completed.FUVWXYZ[\]^_`abcdefjilkmgnophrqsywtvxuz{|~}F|~}z{sywtvxufjilkmgnophrqUVde[\]^_`abcWXYZNoneWJ7+implicitfPerform a variable lookup FIXME: generate a warning when we look up a variable that is not present.,implicit"Pure the path stored in the state. -.+/012,34567None%=XJ89:;<=>?>2NoneXR@implicitBuilds an argparser for the type that is expected from it. FIXME: make a version of this that accepts multiple symbol names, so we can have h= and height=AimplicitInline documentation.BimplicitAn inline default value.CimplicitAn inline example.DimplicitInline test and combinators.EimplicitApply arguments to an ArgParserEimplicit argumentsimplicitArgParser to apply them toimplicit(result, error messages)@ABCDFENoneV,GimplicitA pattern parserHimplicitParse a number.IimplicitMParse a variable reference. NOTE: abused by the parser for function calls.JimplicitParse a true or false value.Kimplicit6Parse a quoted string. FIXME: no u unicode support? LMNGHIJKOPL1M2NonegdwQimplicitparse expressions that don't associate, either because they are not operators or because they are operators that contain the expressions they operate on in start and end tokens, like parentheses, and no other operator can associate with their expressions.Rimplicitparse operations that start with a variable name, including variable reference, function calling, variable list indexing, and variable list splicing.Simplicit>Parse parentheses, lists, vectors, and vector/list generators.TimplicitApply a symbolic operator to a list of expressions, pureing one big expression. Accepts a string for the operator, to simplify callers.UimplicitgApply a symbolic operator to two expressions, combining left and right operands with an binary operatorVimplicit5An assignment expression within a let's bindings listWimplicit)build nested let statements when foldr'd.Nonegvimplicitall of the token parsers are lexemes which consume all trailing spaces nicely. | This leaves us to deal only with the first spaces in the file.XimplicitEA computable block of code in our openscad-like programming language.Yimplicit*A suite of s! What's a suite? Consider:%union() { sphere(3); }QThe suite was in the braces ({}). Similarily, the following has the same suite:union() sphere(3);LWe consider it to be a list of computables which are in turn StatementI s.ZimplicitLEvery StatementI requires a source position, thus we can build a combinator.[implicitVCommenting out a computation: use % or * before the statement, and it will not be run.\implicit>An include! Basically, inject another extopenscad file here...]implicitAn assignment (parser)^implicitA function declaration (parser)_implicitAn if statement (parser)`implicitparse a call to a module.aimplicitdeclare a module.bimplicit'parse the arguments passed to a module.cimplicit.parse the arguments in the module declaration.dimplicit6Find the source position. Used when generating errors.eimplicit"Remove statements that do nothing.NoneW|fimplicit6The names of all of the patterns in the given pattern.gimplicitGMatch patterns and ovals, returning a list of all of the OVals matched.himplicitCConstruct a VarLookup from the given Pattern and OVal, if possible.iimplicitThe entry point from StateC. evaluates an expression, pureing the result, and moving any error messages generated into the calling StateC.jklmnhioNoneW}pimplicitInterpret variable assignmentpNone>}qrsNonetimplicit#Serialize a float in full precisionuimplicit*Serialize a float with four decimal places vwxyz{tu|}None~implicitURemoves triangles that are empty when converting their positions to Float resolution.implicit%Generate an STL file is ASCII format.implicitconvert from ! to Float.implicit/Write a 32-bit little-endian float to a buffer.implicit+Generate an STL file in it's binary format.NoneW implicitVFormat an openscad call given that all the modified objects are in the Reader monad...implicitFirst, the 3D objects.NoneimplicitSlightly stretch the bounding box of an object, in order to ensure that during mesh generation, there are no problems because values are right at the edge. NoneimplicitSlightly stretch the bounding box of an object, in order to ensure that during mesh generation, there are no problems because values are right at the edge.!NoneBimplicitThe purpose of refine is to add detail to a polyline aproximating the boundary of an implicit function and to remove redundant points. We break this into two steps: detail and then simplify.implicitWe wrap detail to make it ignore very small segments, and to pass in an initial value for a depth counter argument. FIXME: magic number.implicitZdetail adds new points to a polyline to add more detail. FIXME: all of the magic numbers."None}#NoneimplicitJoin polylines that connect.implicitSimplify and sort a polyline.$None+%NoneZimplicitThe goal of getLoops is to extract loops from a list of segments. The input is a list of segments. The output a list of loops, where each loop is a list of segments, which each piece representing a "side".implicitQIf there aren't any segments, and the "building loop" is empty, produce no loops.&None'None(None)NoneJximplicit>getContour gets a polyline describing the edge of a 2D object.00000*Nonehimplicit.A colour. Red Green Blue and Alpha components.implicit,A light source. source point, and intensity.implicitHA ray. A point, and a normal pointing in the direction the ray is going.implicitQThe distance traveled by a line segment from the first point to the second point.implicit"Multiply a colour by an intensity.implicitAverage a set of colours.implicitCreate a ray from two points. Nonenimplicit0DXF2 export in 2D. conforming to AutoCAD R12/13.implicit@Gcode generation for the laser cutter in HackLab. Complies with  <https://ws680.nist.gov/publication/get_pdf.cfm?pub_id=823374$ FIXME: parameters would be nice.Noneimplicit>Generate a .obj format file from a NormedTriangleMesh see: 1https://en.wikipedia.org/wiki/Wavefront_.obj_file+NoneimplicitAGet an array of triangles describing the interior of a 2D object.implicit/This function returns triangles covering a portion of the interior of an object. The triangles are defined in a clockwise fashion, beginning on the point closest to origin, or failing that, the closest point to x1 on the x axis. It is based on the linearly-interpolated marching squares algorithm.Noneimplicit3The distance a point p is from a line segment (a,b)implicitRounded Maximum Consider max(x,y) = 0, the generated curve has a square-like corner. We replace it with a quarter of a circleimplicitRounded minimumimplicit}Like rmax, but on a list instead of two. Just as maximum is. The implementation is to take the maximum two and rmax those.implicitLike rmin but on a list.implicit/Pack the given objects in a box the given size.implicitradiusimplicitfirst number to round maximumimplicitsecond number to round maximumimplicitresulting numberimplicitradiusimplicitfirst number to round minimumimplicitsecond number to round minimumimplicitresulting numberimplicitradiusimplicitnumbers to take round maximumimplicitresulting numberimplicitradiusimplicitnumbers to take round minimumimplicitresulting numberimplicitThe box to pack withinimplicit"The space seperation between itemsimplicitObjects with their boxesimplicitAPacked objects with their positions, objects that could be packed,None implicit An empty box.implicitWIs a Box2 empty? | Really, this checks if it is one dimensional, which is good enough.implicit-Define a Box2 around all of the given points.implicit'Decompose a box into it's four corners.implicit,Define a Box2 around all of the given boxes.implicitADefine a Box2 that is the intersection of all of the given Box2s.implicit*Increase a boxes size by a rounding value.implicitDefine a Box2 around the given object, and the space it occupies while rotating about the center point. Note: No implementations for RectR, Translate2, or Scale2 as they would be identical to the fallthrough.impliciteput a box around a point, and all of the locations it will be at during an x degree arc around (0,0).-Noneimplicit An empty box.implicitWIs a Box3 empty? | Really, this checks if it is one dimensional, which is good enough.implicit*Increase a boxes size by a rounding value..None</Nonew NoneѲ None NoneF None=?@ANimplicitThere is a discrete way to aproximate this object. eg. Aproximating a 3D object with a triangle mesh would be DiscreteApproxable Obj3 TriangleMesh None>implicitSWrite an object to a file with LazyText IO, using the given format writer function.implicit^Serialize an object using the given format writer, which takes the filename and writes to it..implicitMSerialize an object using the given format writer. No file target is implied.implicit Resolutionimplicit*File Format Writer (Function that formats)implicit File NameimplicitObject to renderimplicitWriting Action!implicit ResolutionimplicitFile Format writerimplicit File NameimplicitObject to renderimplicitWriting Action!implicit Resolutionimplicit*File Format Writer (Function that formats)implicitObject to renderimplicitResulting lazy ByteString None=?@AC implicitComplement an Objectimplicit Rounded unionimplicitRounded differenceimplicitRounded minimumimplicit9Translate an object by a vector of appropriate dimension.implicitScale an objectimplicitOutset of an object.implicitMake a shell of an object.implicitGet the bounding box an objectimplicit'Get the implicit function for an objectimplicitObject to complementimplicitResultimplicitThe radius of roundingimplicitobjects to unionimplicitResulting objectimplicitThe radius of roundingimplicitObjects to differenceimplicitResulting objectimplicitThe radius of roundingimplicitObjects to intersectimplicitResulting objectimplicit8Vector to translate by (Also: a is a vector, blah, blah)implicitObject to translateimplicitResulting objectimplicitAmount to scale byimplicitObject to scaleimplicitResulting scaled objectimplicitdistance to outsetimplicitobject to outsetimplicitresulting objectimplicitwidth of shellimplicitobject to take shell ofimplicitresulting shellimplicitObject to get box ofimplicit Bounding boximplicit"Object to get implicit function ofimplicitImplicit functionimplicitImplicit functionimplicit Bounding boximplicitResulting objectimplicitRadius of the sphereimplicitResulting sphereimplicitRounding of cornersimplicitBottom.. cornerimplicitTop right... cornerimplicit)Resuting cube - (0,0,0) is bottom left...implicitRadius of the cylinderimplicitSecond radius of the cylinderimplicitHeight of the cylinderimplicitResulting cylinderimplicitRadius of the cylinderimplicitHeight of the cylinderimplicitResulting cylinderimplicitradius of the circleimplicitresulting circleimplicitBottom left cornerimplicitTop right cornerimplicit(Resulting square (bottom right = (0,0) )implicitRouding of the polygonimplicitVerticies of the polygonimplicitResulting polygonNoneX?implicit+Use the old syntax when defining arguments.implicit;The only thing exported here. basically, a list of modules.implicitmsphere is a module without a suite. this means that the parser will look for this like sphere(args...);implicitKFIXME: square1, square2 like cylinder has? | FIXME: translate for square2?implicitFIXME: 3D Polygons? | FIXME: handle rectangles that are not grid alligned. | FIXME: allow for rounding of polygon corners, specification of vertex ordering. | FIXME: polygons have to have more than two points, or do not generate geometry, and generate an error.implicitFIXME: rotating a module that is not found pures no geometry, instead of an error. | FIXME: error reporting on fallthrough. + FIXME: rotate(y=90) would be nice.implicitKFIXME: avoid the approximation in getBox3. better definition of function()?0NoneWimplicitmore complicated ones:NoneWimplicit1Define variables used during the extOpenScad run.implicitEvaluate an expression.NoneWimplicit8Small wrapper of our parser to handle parse errors, etc.NoneT+A     +A     1123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aabbccddeeffghijklmnopqrstuvwxyz{|}~,-./        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvpwxyz{|}~N !!!"###$%%&&&'()))))))***************++,,,,,,,,,--- Z 00'implicit-0.3.0.1-55ZZzIngQdsL3B0vcgSxvLGraphics.Implicit.Definitions)Graphics.Implicit.ExtOpenScad.Definitions)Graphics.Implicit.ExtOpenScad.Parser.Expr.Graphics.Implicit.ExtOpenScad.Parser.Statement,Graphics.Implicit.Export.TriangleMeshFormats(Graphics.Implicit.Export.PolylineFormats2Graphics.Implicit.Export.NormedTriangleMeshFormatsGraphics.Implicit.MathUtilGraphics.Implicit.ObjectUtil%Graphics.Implicit.Export.SymbolicObj3%Graphics.Implicit.Export.SymbolicObj2*Graphics.Implicit.Export.DiscreteAproxableGraphics.Implicit.ExportGraphics.Implicit.Primitives(Graphics.Implicit.ExtOpenScad.Primitives+Graphics.Implicit.ExtOpenScad.Eval.ConstantGraphics.Implicit.ExtOpenScadGraphics.Implicit*Graphics.Implicit.ExtOpenScad.Parser.LexerGraphics.Implicit.FastIntUtilGraphics.Implicit.IntegralUtil)Graphics.Implicit.ExtOpenScad.Util.StateC'Graphics.Implicit.ExtOpenScad.Util.OVal,Graphics.Implicit.ExtOpenScad.Util.ArgParser)Graphics.Implicit.ExtOpenScad.Parser.Util'Graphics.Implicit.ExtOpenScad.Eval.Expr,Graphics.Implicit.ExtOpenScad.Eval.StatementGraphics.Implicit.Export.Util)Graphics.Implicit.Export.TextBuilderUtils(Graphics.Implicit.Export.SymbolicFormats*Graphics.Implicit.Export.Symbolic.Rebound3*Graphics.Implicit.Export.Symbolic.Rebound2*Graphics.Implicit.Export.Render.RefineSegs+Graphics.Implicit.Export.Render.Interpolate/Graphics.Implicit.Export.Render.HandlePolylines'Graphics.Implicit.Export.Render.GetSegs(Graphics.Implicit.Export.Render.GetLoops+Graphics.Implicit.Export.Render.Definitions.Graphics.Implicit.Export.Render.TesselateLoops-Graphics.Implicit.Export.Render.HandleSquaresGraphics.Implicit.Export.Render!Graphics.Implicit.Export.RayTrace,Graphics.Implicit.Export.MarchingSquaresFill$Graphics.Implicit.ObjectUtil.GetBox2$Graphics.Implicit.ObjectUtil.GetBox3)Graphics.Implicit.ObjectUtil.GetImplicit2)Graphics.Implicit.ObjectUtil.GetImplicit3%Graphics.Implicit.ExtOpenScad.DefaultFastℕ fromFastℕ toFastℕℕfromℕtoℕ SymbolicObj3Rect3RSphereCylinder Complement3UnionR3 DifferenceR3 IntersectR3 Translate3Scale3Rotate3Rotate3VOutset3Shell3EmbedBoxedObj3ExtrudeRExtrudeRotateR ExtrudeRM RotateExtrudeExtrudeOnEdgeOf SymbolicObj2RectRCirclePolygonR Complement2UnionR2 DifferenceR2 IntersectR2 Translate2Scale2Rotate2Outset2Shell2EmbedBoxedObj2 BoxedObj3 BoxedObj2Boxed3Boxed2Box3Box2Obj3Obj2NormedTriangleMesh TriangleMeshNormedTriangleTrianglePolytriPolyline⋯*⋯/ℝ3ℝ2ℝminℝbothallthree⋅ fromℕtoℝfromFastℕtoℝfromℝtoFloat$fShow-> $fShow->0 $fShow->1 $fShow->2$fComponentWiseMultable(,,)$fComponentWiseMultable(,)$fNFDataPolyline$fNFDataPolytri$fNFDataTriangle$fNFDataTriangleMesh$fShowSymbolicObj2$fShowSymbolicObj3 TestInvariantEulerCharacteristicScadOptsopenScadCompatibilityimportsAllowedMessage MessageTypeTextOutWarningError SyntaxError Compatibility UnimplementedSourcePositionOVal OUndefinedOErrorOBoolONumOListOStringOFuncOUModuleONModule OVargsModuleOObj3OObj2 StatementInclude:=If NewModule ModuleCall DoNothing StatementIExprVarLitEListELamE:$PatternNameListPWild VarLookupSymbol ArgParserAP APTerminatorAPFailIf APExampleAPTestAPBranchStateC CompStatescadVarsoVals sourceDirmessagesscadOptsvarUnion lookupVarIn$fShowSourcePosition $fShowMessage $fShowOVal$fEqOVal$fAlternativeArgParser$fMonadPlusArgParser$fMonadArgParser$fApplicativeArgParser$fFunctorArgParser $fShowSymbol $fEqSymbol $fOrdSymbol $fShowPattern $fEqPattern$fEqSourcePosition$fShowMessageType$fEqMessageType $fEqMessage$fShowTestInvariant$fShowStatementI$fEqStatementI$fShowStatement $fEqStatement $fShowExpr$fEqExprexpr0 parseProgramstl binaryStljsTHREEsvgdxf2hacklabLaserGCodeobjdistFromLineSeg box3sWithinrmaxrmaximumrminimumpackgetBox2getBox3 getImplicit2 getImplicit3symbolicGetMeshsymbolicGetOrientedContoursymbolicGetContoursymbolicGetContourMeshDiscreteAproxable discreteAprox+$fDiscreteAproxableSymbolicObj2DynamicImage!$fDiscreteAproxableSymbolicObj2[]+$fDiscreteAproxableSymbolicObj3DynamicImage1$fDiscreteAproxableSymbolicObj3NormedTriangleMesh+$fDiscreteAproxableSymbolicObj3TriangleMesh writeObject formatObjectwriteSVG writeDXF2writeSTL writeBinSTLwriteOBJ writeTHREEJSwriteGCodeHacklabLaser writeSCAD3 writeSCAD2writePNG complementunionR differenceR intersectR translatescaleoutsetshellgetBox getImplicitimplicitsphererect3R cylinder2cylindercirclerectRpolygonRunion difference intersectextrudeRextrudeRotateR extrudeRM rotateExtrudeextrudeOnEdgeOfrotate3rotate3Vpack3rotatepack2$fObjectSymbolicObj3(,,)$fObjectSymbolicObj2(,)primitiveModules addConstantsrunExpr runOpenscad writePNG2 writePNG3 whiteSpace matchTrue matchFalse matchFunction matchIncludematchUsematchIf matchElse matchModulematchLet matchUndef matchEachmatchTok matchColon matchSemi matchCommamatchLE surroundedBymatchIdentifierlexermatchLTmatchGEmatchGTmatchEQmatchNEmatchANDmatchORmatchCATComponentWiseMultable lookupVargetPath getVarLookupmodifyVarLookuppushValsgetValsputValswithPathShiftedBy getRelPath addMessageerrorCwarnC scadOptions OTypeMirrortoOObjfromOObjoTypeStr getErrors caseOType<||> divideObjsargumentdoc defaultToexampletestargMapeulerCharacteristicpatternMatchernumbervariableboolean scadString*<|>?:tryMany scadUndefinedsourcePositionnonAssociativeExpr variableishvectorListParentheses collectorbinaryOperation assignmentbindLets computationsuite statementI throwAwayincludefunction ifStatementI userModuleuserModuleDeclarationmoduleArgsUnitmoduleArgsUnitDecl sourcePos removeNoOpspatVarspatMatchmatchPatevalExprStateE ExprState rawRunExpr runStatementI normTriangle normVertexcentroidbfbuildTruncFloat text-1.2.3.1Data.Text.Internal.LazyTextData.Text.Internal.BuilderBuildertoLazyTextWith fromLazyTextData.Text.Lazy toLazyTextbuildℕbuildInt cleanupTristoFloat float32LE callTokenbuildS3scad2scad3rebound3rebound2refinedetail'detail interpolatejoinSegsreducePolylinecleanLoopsFromSegsgetSegsgetLoops getLoops' TriSquareTrisSq tesselateLoopmergedSquareTris getContourgetMesh$***$***$$**$ColorLightRayvectorDistance colorMultaverage rayFromToSceneCamera cameraRaytraceRaygetContourMeshgetSquareTrianglesrminemptyBoxisEmpty pointsBox boxPoints unionBoxesintersectBoxes outsetBoxgetBox2R pointRBox writeObject'cubepolygonextrudedefaultPolymorphicFunctionsdefaultObjects