=      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                                                                                   ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K LMNOPQRSTUVWXYZ[\]^_`abc defghijklmnopqrstuvwxyz{|}~                                                                           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                                                                                                          !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Specification of color schemes.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred+All of these have a minimum level value of 3, with a maximum of 9 unless otherwise specified.  Maximum of 11.  Maximum of 12.  Maximum of 8. Maximum of 11. Maximum of 11. Maximum of 111; note that the last two are listed after the  values in the documentation. Maximum of 11-; note that the last two are listed first. Maximum of 111; note that the last two are listed after the  values in the documentation. Maximum of 11. Maximum of 11. Maximum of 8. Maximum of 12." Maximum of 8.% Maximum of 11.' Maximum of 8.(hSpecify which colour palette and how many colours it has. Note the allowed values for the different s.*8This represents the color schemes that Graphviz accepts.*  !"#$%&'()*+,-*  !"#$%&'()*+,-#'&%$#"!  ()*-,+Graphviz-specific exceptions(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred+.KExceptions that arise from using this library fall into four categories:"Unable to parse provided Dot code.Dot code is not valid UTF-8.6An error when trying to run an external program (e.g. dot).0Treating a non-custom Attribute as a custom one../0123 ./0123 .3210/.3210/Printing and parsing state.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred24?Several aspects of Dot code are either global or mutable state.If Y, allow fallbacks for attributes that don't match known specification when parsing.The default separators for LayerSep.The default separators for  LayerListSep.# Internal utility functions(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred  First character of a non-quoted  must match this.The rest of a non-quoted  must match this.4-Determine if this String represents a number.This assumes that 4 is ./Determine if this String represents an integer.9Graphviz requires double quotes to be explicitly escaped.*Remove explicit escaping of double quotes.JThe following are Dot keywords and are not valid as labels, etc. unquoted. Fold over s; first param is for  , second for .454545Helper functions for Parsing.*(c) Matthew Sackman, Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred24;A ReadS-like type alias.? A variant of <O where it is assumed that the provided parsing function consumes all of the 8 input (with the exception of whitespace at the end).@BParse the required value, returning also the rest of the input 2 that hasn't been parsed (for debugging purposes).AIf unable to parse Dot code properly,  a ..BTParse the required value with the assumption that it will parse all of the input .C7Use this when you do not want numbers to be treated as  values.DParse a  that doesn't need to be quoted.G)Used when quotes are explicitly required;YFlag indicates whether to check whether the number is actually a floating-point value.HParse a floating point number that actually contains decimals. Bool flag indicates whether values that need to be quoted are parsed.fBool flag indicates whether to allow parsing exponentiated term, as this is only allowed when quoted.QEAssumes that any letter is ASCII for case-insensitive comparisons.S)Parses at least one whitespace character.T*Parses zero or more whitespace characters.U2Parse and discard optional surrounding whitespace.[Parse a  where the provided s (as well as " and \%) are escaped and the second list of Ys are those that are not permitted. Note: does not parse surrounding quotes. The  value indicates whether empty s are allowed or not.\Parses a newline.]Consume all whitespace and newlines until a line with non-whitespace is reached. The whitespace on that line is not consumed.^lParses and returns all characters up till the end of the line, but does not touch the newline characters.`The opposite of .eUTry to parse a list of the specified type; returns an empty list if parsing fails.f-Return an empty list if parsing a list fails.Ignores  and assumes 'not . null . versionBranch' (usually you want 'length . versionBranch == 2') and that all such values are non-negative.G6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghiu      !"#$%&'()*+,-./0123456789:;<=456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi6;6789:@B<?>=A`CDFE45G[JKPQHIRSTUVWXYZ\]d_ef^abcLMNOghiC6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghiPre-process imported Dot code.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferredj|Remove unparseable features of Dot, such as comments and multi-line strings (which are converted to single-line strings).>tParse out comments and make quoted strings spread over multiple lines only over a single line. Should parse the entire input .?dParses an unwanted part of the Dot code (comments and pre-processor lines; also un-splits lines).@@Remove pre-processor lines (that is, those that start with a #). Will consume the newline from the beginning of the previous line, but will leave the one from the pre-processor line there (so in the end it just removes the line).AParse //-style comments.BParse * ... *-style comments.CLines can be split with a \ at the end of the line. j>?@ABDCEjj j>?@ABDCE.Helper functions for converting to Dot format.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred24kaA class used to correctly print parts of the Graphviz Dot language. Minimal implementation is l.laThe unquoted representation, for use when composing values to produce a larger printing value.mThe actual quoted representation; this should be quoted if it contains characters not permitted a plain ID String, a number or it is not an HTML string. Defaults to l.nThe correct way of representing a list of this value when printed; not all Dot values require this to be implemented. Defaults to Haskell-like list representation.oThe quoted form of n=; defaults to wrapping double quotes around the result of nJ (since the default implementation has characters that must be quoted).p0A type alias to indicate what is being produced.q!Correctly render Graphviz output.rConvert to DotCode; note that this has no indentation, as we can only have one of indentation and (possibly) infinite line lengths.s For use with OverloadedStrings) to avoid ambiguous type variable errors.t For use with OverloadedStrings) to avoid ambiguous type variable errors.FCheck to see if this  needs to be quoted or not.G(Escape quotes in Strings that need them.HBEscape quotes and quote Texts that need them (including keywords).y&Escape the specified chars as well as ".z&Escape the specified chars as well as "' and then wrap the result in quotes.ISEnsure the provided characters are all escaped. Note that we cannot convert to p immediately because z* needs to pass the result from this to u1 to determine if it needs to be quoted or not.JIgnores ^ and assumes 'not . null . versionBranch' (usually you want 'length . versionBranch == 2').&klmnopqrstFKuGHvwxyzI{|}LMNOPJQRSTUVWXXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~klmnopqrstuvwxyz{|}pqklmnostruyzvwx{|}"klmnopqrstFKuGHvwxyzI{|}LMNOPJQRSTUVWXAvailable command-line programs(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred ~The available Graphviz commands. The following directions are based upon those in the Graphviz man page (available online at  !http://graphviz.org/pdf/dot.1.pdf$, or if installed on your system  man graphvizP). Note that any command can be used on both directed and undirected graphs.When used with the LayoutG attribute, it overrides any actual command called on the dot graph.BDraw clustered graphs as treemaps, requires Graphviz >= 2.28.0.DFilter for drawing clustered graphs, requires Graphviz >= 2.28.0.+As with Fdp, but ideal for large graphs./Spring-model approach for undirected graphs.For circular layout of graphs.For radial layout of graphs.AFor symmetric layouts of graphs (ideal for undirected graphs).6For hierachical graphs (ideal for directed graphs). ~ ~~Specification of X11 colors.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-InferredThe X11 colors that Graphviz uses. Note that these are slightly different from the "normal" X11 colors used (e.g. the inclusion of Crimson<). Graphviz's list of colors also duplicated almost all Gray colors with Grey ones; parsing of an q which is specified using "grey" will succeed, even for those that don't have the duplicate spelling (e.g. DarkSlateGray1).Equivalent to setting Style [SItem Invisible []]. Convert an  to its equivalent Colour value. Note that it uses  because of ; all other  values are completely opaque.&      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~$      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~$~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      "~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      $Internal Attribute value definitions(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-InferredqSpecifies a name for ports (used also in record-based and HTML-like labels). Note that it is not valid for a  value to contain a colon (:.) character; it is assumed that it doesn't.5When attached to a node in a DotEdge definition, the  and the  can be in separate quotes.  Specification of Brewer colors.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-InferredThis value should be between 1 and the level of the ( being used.(  !"#$%&'()(()'&%$#"!   Specification of SVG colors.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-InferredUThe SVG colors that Graphviz uses. Graphviz's list of colors also duplicated all *Gray* colors with *Grey* ones; parsing of an . which is specified using "grey" will succeed.K Convert an  to its equivalent  value.      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      KJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      K Arrow types(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-InferredL[Represents which side (when looking towards the node the arrow is pointing to) is drawn.S"What modifications to apply to an W.aDoty has a basic grammar of arrow shapes which allows usage of up to 1,544,761 different shapes from 9 different basic WFs. Note that whilst an explicit list is used in the definition of a, there must be at least one tuple and a maximum of 4 (since that is what is required by Dot). For more information, see: (http://graphviz.org/doc/info/arrows.htmlThe 19 basic arrows shown on the overall attributes page have been defined below as a convenience. Parsing of the 5 backward-compatible special cases is also supported.dApply no modifications to an W.eR and M*LMNOPQRSTUVWXYZ[\]^_`abcde LMNOPQRSTUVWXYZ[\]^_`abcdeLONMPRQSTUVW `_^]\[ZYXabcde3Specification of Color-related types and functions.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred f/More easily convert named colors to an overall m value.&Bool is for whether quoting is needed.hA m# tagged with an optional weighting.kMust be in range  0 <= W <= 1.l#The sum of the optional weightings must sum to at most 1.m[Defining a color for use with Graphviz. Note that named colors have been split up into 3s and those based upon the Brewer color schemes.qThe r, s and t values must all be  0 <= x <=1.{For colors without weightings.|(For a list of colors without weightings.~Attempt to convert a m into a - value with an alpha channel. The use of % is because the RGB values of the @s haven't been stored here (primarily for licensing reasons). Convert a  value to an w m. Convert an  to an u m'. The exception to this is for any  which has alphaChannel ac == 0; these are converted to  X11Color  (note that the  instance for such an  is  "transparent").The  of a  value.-fghijklmnopqrstuvwxyz{|}~*+,-fghijklmnopqrstuvwxyz{|}~"*-,+mwuqponxyzxyzvrstlhijk{|fg}~fghijklmwuqponxyzxyzvrst{|}~ .Specification of HTML-like types for Graphviz.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred6Specifies how an image will use any extra space available in its cell. If undefined, the image inherits the value of the  ImageScale attribute.Default value.Specifies vertical placement. When an object is allocated more space than required, this value determines where the extra space is placed above and below the object.Default value.Specifies horizontal placement. When an object is allocated more space than required, this value determines where the extra space is placed left and right of the object. values only; aligns lines of text using the full cell width. The alignment of a line is determined by its (possibly implicit) associated  element.Default value.Note that not all T values are valid everywhere: see the comments for each one on where it is valid. Valid for: , . Valid for: , . Valid for: , . Has an alias of TOOLTIP. Valid for: , . Valid for: . Valid for: . Valid for: . Valid for: , . Valid for: , . Valid for: , . Requires Graphviz >= 2.29.0 Valid for: , . Valid for: , . Valid for: , . Default is . Valid for: , . Valid for: . Default is 1. Valid for: , . Valid for: , . Default is 2 ; maximum is 127. Valid for: , . Default is 2. Valid for: . Default is 1; 0 represents no border. Valid for: , . Default is 1; 0 represents no border. Valid for:  (including ), , . Valid for: . Valid for: , , .;The various HTML-like label-specific attributes being used.The path to an image; accepted  are  and .)Cells either recursively contain another $ or else a path to an image file.Should be between  or ' values, requires Graphviz >= 2.29.0 A row in a . The list of & values is assumed to be non-empty.Should be between ' values, requires Graphviz >= 2.29.0JA table in HTML-like labels. Tables are optionally wrapped in overall FONT tags. Optional FONT attributes.  [] denotes empty FONT tags;  denotes no such tags.%This list is assumed to be non-empty."Textual items in HTML-like labels.%Only available in Graphviz >= 2.28.0.Only accepts an optional  3; defined this way for ease of printing/parsing.ORepresents a textual component of an HTML-like label. It is assumed that a 4 list is non-empty. It is preferable to "group"  values together rather than have individual ones. Note that when printing, the individual values are concatenated together without spaces, and when parsing anything that isn't a tag is assumed to be a : that is, something like " <BR/> <BR/>" is parsed as: ![Newline [], Str " ", Newline []]The overall type for HTML-like labels. Fundamentally, HTML-like values in Graphviz are either textual (i.e. a single element with formatting) or a table. Note that  values can be nested via .Only to be used when the k instance of a. matches the HTML syntax (i.e. numbers and Html.* values; m values also seem to work).Parses an HTML-compatible ., de-escaping known characters. Note: this will7 fail if an unknown non-numeric HTML-escape is used.WThe characters that need to be escaped and what they need to be replaced with (sans &).vFlip the order and add extra values that might be escaped. More specifically, provide the escape code for spaces ("nbsp") and apostrophes ("apos"&) since they aren't used for escaping.Print something like  FOOATTR="ATTR_VALUE"value /FOOPrint something like  FOOATTR="ATTR_VALUE"/Parse something like  FOOATTR="ATTR_VALUE"value /FOOParse something like  FOOvalue /FOO.Parse something like  FOOATTR="ATTR_VALUE"/qEE9+Values for use with the Attribute data type(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-InferredtDetermine how the Width and Height) attributes specify the size of nodes.Width and Height dictate the size of the shape only and the label can expand out of the shape (with a warning). Requires Graphviz >= 2.38.0.Width and HeightP dictate the size of the node with a warning if the label cannot fit in this.gNodes will be the smallest width and height needed to contain the label and any possible image. Width and Height" are the minimum allowed sizes.}If set, normalizes coordinates such that the first point is at the origin and the first edge is at the angle if specified.HAngle of first edge when normalized. Requires Graphviz >= 2.32.0.Equivalent to  0.YA numeric type with an explicit separation between integers and floating-point values.A list of search paths.Only valid for Nodes. For use with .Device Dependent,Nodes, Clusters and Graphs, for use with  GradientAngle ; requires Graphviz >= 2.29.0*Edges only; requires Graphviz >= 2.29.0Nodes and Clusters Nodes only>Elliptically-shaped Nodes only; requires Graphviz >= 2.30.0GRectangularly-shaped Nodes and Clusters; requires Graphviz >= 2.30.0Nodes and ClustersNodes and EdgesNodes and EdgesNodes and EdgesNodes and EdgesNodes and Edges&An individual style item. Except for , the [] should be empty.4Geometries of shapes are affected by the attributes Regular,  Peripheries and  Orientation.%Must specify the record shape with a .%Must specify the record shape with a .Requires Graphviz >= 2.30.0.Requires Graphviz >= 2.30.0.Requires Graphviz >= 2.30.0.Requires Graphviz >= 2.30.0.Requires Graphviz >= 2.30.0.Requires Graphviz >= 2.30.0.Requires Graphviz >= 2.30.0.Requires Graphviz >= 2.30.0.Requires Graphviz >= 2.30.0.Requires Graphviz >= 2.30.0.Requires Graphviz >= 2.30.0.Requires Graphviz >= 2.30.0. Requires Graphviz >= 2.30.0.!Requires Graphviz >= 2.30.0."Requires Graphviz >= 2.30.0.#Requires Graphviz >= 2.30.0.$Requires Graphviz >= 2.30.0.%Requires Graphviz >= 2.30.0.&Requires Graphviz >= 2.30.0.'Requires Graphviz >= 2.30.0.-Requires Graphviz >= 2.36.0..Requires Graphviz >= 2.32.0.AHas synonym of none. Recommended for s.DOnly affected by  Peripheries, Width and Height.FHas synonym of oval.GAlso affected by Sides, Skew and  Distortion.HHas synonyms of rect and  rectangle.TFSpecify the root node either as a Node attribute or a Graph attribute.UFor Graphs onlyVFor Nodes onlyWFor Nodes only\aThe number of points in the list must be equivalent to 1 mod 3; note that this is not checked.aYUpper-case first character is major order; lower-case second character is minor order.j,Controls how (and if) edges are represented.For Dot, the default is q*; for all other layouts the default is p.kFdp onlylRequires Graphviz >= 2.30.0.m(Does not handle ports or edge labels in Dot.q Except for Dot,, requires non-overlapping nodes (see ).v1Sort by cols, sort by user, number of rows/cols{/If non-negative, then packs; otherwise doesn't.'Draw incoming edges in order specified.'Draw outgoing edges in order specified.7A list of layer names. The names should all be unique E values, and when printed will use an arbitrary character from  defLayerSep5. The values in the list are implicitly numbered  1, 2, ....>You should not have any layer separator characters for the $ option, as they won't be parseable.Should not be a number or "all".How to deal with node overlaps. Defaults to  except for Fdp and Sfdp./The ability to specify the number of tries for Fdp')s initial force-directed technique is not supported (by default, Fdp uses 9, passes of its in-built technique, and then  Nothing).For Sfdp, the default is  (Just 0). Only when mode == =Uses quadratic optimization to minimize node displacement.iScale layout down as much as possible without introducing overlaps, assuming none to begin with.Requires Graphviz >= 2.30.0.VRequires the Prism library to be available (if not, this is equivalent to ).  is equivalent to  1000. Influenced by OverlapScaling..Remove overlaps by separately scaling x and y.0Remove overlaps by uniformly scaling in x and y. Can only be  for Dim 3 or greater.LInput to Graphviz only: specify that the node position should not change./How to treat a node whose name is of the form " |edgelabel|*2" as a special node representing an edge label.Use a two-step process.)Make node close to old center of neighbor%Make node close to center of neighbor No effectkSpecifies the sub-values of a record-based label. By default, the cells are laid out horizontally; use u to change the orientation of the fields (can be applied recursively). To change the default orientation, use I.)Will result in no label for that cell.+A RecordFields value should never be empty.#For nodes only; requires either  or  as the shape.If A is used, the < value is the entire "shape"; if anything else except D is used then the ! is embedded within the shape.For Neato unless indicated otherwise.For Sfdp, requires Graphviz >= 2.32.0.For Sfdp, requires Graphviz >= 2.32.0..Maximum width and height of drawing in inches.If Nothing., then the height is the same as the width._If drawing is smaller than specified size, this value determines whether it is scaled up.The mapping used for FontName values in SVG output.!More information can be found at  'http://www.graphviz.org/doc/fontfaq.txt. Use fontconfig font conventions.Use PostScript font names.%Use the legal generic SVG font names. Either a  or a (2D)  (i.e. created with )."Whilst it is possible to create a j value with either a third co-ordinate or a forced position, these are ignored for printing/parsing.An optional prefix of '+' is allowed when parsing. Only when mode == ..Specify where to place arrow heads on an edge.Draw an undirected edge.%Draw arrows on both ends of the edge.KDraw a reverse directed edge with an arrow to the node it's coming from.CDraw a directed edge with an arrow to the node it's pointing go.If E, then sub-graphs that are clusters are given special treatment.  and Q currently appear to be identical and turn off the special cluster processing..Should only have 2D points (i.e. created with ).Some  Attribute"s (mainly label-like ones) take a  argument that allows for extra escape codes. This library doesn't do any extra checks or special parsing for these escape codes, but usage of  rather than [ indicates that the Graphviz tools will recognise these extra escape codes for these  Attributes.AThe extra escape codes include (note that these are all Strings): \N,Replace with the name of the node (for Node  Attributes). \G-Replace with the name of the graph (for Node  Attributeos) or the name of the graph or cluster, whichever is applicable (for Graph, Cluster and Edge  Attributes).\EjReplace with the name of the edge, formed by the two adjoining nodes and the edge type (for Edge  Attributes).\T:Replace with the name of the tail node (for Edge  Attributes).\H:Replace with the name of the head node (for Edge  Attributes).\L)Replace with the object's label (for all  Attributes). Also, if the  Attribute in question is ,  HeadLabel or  TailLabel, then \n, \l and \rY split the label into lines centered, left-justified and right-justified respectively.Print a 5 value as expected within a Record data structure.Create a point with only x and y values. Note that  overlap=false defaults to  NothingJ, but if the Prism library isn't available then it is equivalent to .      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst&      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~           7HGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! IMLKJNSRQPOTWVUX[ZY\]^_`aihgfedcbjqponmlkrtsuyxwvz}|{~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst&Definition of the Graphviz attributes.*(c) Matthew Sackman, Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-InferreddIf performing any custom pre-/post-processing on Dot code, you may wish to utilise some custom &. These are wrappers around the  constructor (and thus  is just an alias for ).You should ensure that  is . for any potential custom attribute name.0The name for an UnknownAttribute; must satisfy .Attributes are used to customise the layout and design of Dot graphs. Care must be taken to ensure that the attribute you use is valid, as not all attributes can be used everywhere. Valid for(: Assumed valid for all; the fields are  name and value respectively. Valid for: EN; Notes): write only, requires Graphviz >= 2.29.0 Valid for: EN; Default:  ""; Notes: requires Graphviz >= 2.29.0 Valid for: G; Notes]: xdot only, requires Graphviz >= 2.34.0, equivalent to specifying version of xdot to be used Valid for: N; Default: 0.75; Minimum: 0.01 Valid for: E; Default: u 1; Minimum: u 0 (), u 1 (,,); Notes2: as of Graphviz 2.30: weights for dot need to be us Valid for: G; Default: 0.05; Minimum: 0.0; Notes: not  Valid for: G; Default: none Valid for: N; Notes : write only Valid for: G; Parsing Default: ; Notes: bitmap output only Valid for: NEC; Default: ""; Notes: svg, cmap only Valid for: ENGC; Default: none; Notes: svg, map only Valid for: E; Default: ""; Notes: svg, cmap only Valid for: E; Default: none; Notes: svg, map only Valid for: E; Default:   Valid for: E; Default:  "" Valid for: E; Default: ; Parsing Default:  Valid for: E; Notes): write only, requires Graphviz >= 2.30.0 Valid for: E; Default: ""; Notes: svg, map only Valid for: G; Default: ""; Notes : svg only Valid for: ENCG Valid for: G; Default:   seed for some unknown fixed seed.; Notes: ,  only Valid for: G; Default: q (), p (other); Parsing Default: q Valid for: GCN; Default: 0; Minimum: 0 Valid for: G; Default: ; Notes:  only Valid for: N; Default: 0.0; Minimum: -100.0 Valid for: G Valid for: N; Default: 4; Minimum: 0 Valid for: ENG; Default: 0; Minimum: 0; Notes: < only; used for debugging by printing PostScript guide boxes Valid for: N; Default: F Valid for: G; Default:  4; Notes: not  Valid for: G; Default: 30; Notes:  only Valid for: G; Notes: Not =, requires Graphviz >= 2.28.0 (>= 2.38.0 for anything except ) Valid for: N; Default: 8 (output), 20 (overlap and image maps) Valid for: E; Default: ""; Notes:  only Valid for: E; Default: ""; Notes:  only Valid for: G; Default: 0; Notes: " only, requires Graphviz >= 2.28.0 Valid for: G; Default: 0 Valid for: GN; Default: U "" (graphs), V (nodes); Parsing Default: W; Notes: , Twopi only Valid for: G; Default: 1.0; Minimum: 0.0; Notes:  only Valid for: G; Default: ; Parsing Default: ; Notes:  only Valid for: N; Default: ; Parsing Default:  Valid for: N; Notes : write only  Valid for: G  Valid for: G; Default: [0.5] (), [1.0] (Twopi); Minimum: [0.02]; Notes: Twopi,  only  Valid for: G; Default: M; Notes:  only  Valid for: S; Notes:  only  Valid for: G; Default: 0.0; Minimum: 0.0 Valid for: G; Default: [; Parsing Default: [; Notes:  only Valid for: EN Valid for: N; Default: ; Parsing Default: ; Notes: ,  only Valid for: NC; Default: shape default (nodes), 1 (clusters); Minimum: 0 Valid for: CNE; Default: 1.0; Minimum: 0.0 Valid for: C; Default:   Valid for: G; Default: i Valid for: G Valid for: G; Default:  0.0555 (4 points) Valid for: G; Default: y Valid for: G; Default: |; Parsing Default: } Valid for: G; Default: ; Parsing Default: ; Notes: " only, requires Graphviz >= 2.36.0 Valid for: G; Default: -4; Minimum: -1.0e10; Notes:  only Valid for: G; Default: ; Parsing Default: ; Notes: not  Valid for: G; Default:  Valid for: N; Default: 0.0; Minimum: 360.0 Valid for: GN; Default: none; Notes:  only Valid for: G; Notes:  only  Valid for: G; Notes:  only! Valid for: G; Default: ; Parsing Default: ; Notes: not " Valid for: GCNE; Default: ; Parsing Default: # Valid for: G; Default: 0.25; Minimum: 0.02$ Valid for: G; Default: ; Parsing Default: ; Notes: " only; requires the Mosek software% Valid for: G; Default: ; Notes:  only& Valid for: G; Default:  (actually   for 5, but this isn't used as a default in this library); Notes: ,  only' Valid for: E; Default: 1; Minimum: 0; Notes:  only( Valid for: G; Default: 1.0; Minimum: 0.0; Notes:  only) Valid for: G; Default: 1.0; Notes:  only* Valid for: G; Default:  100 * # nodes (mode == ), 200 (mode == ), 600 (); Notes: ,  only+ Valid for: NGC; Default: device dependent, Valid for: GC; Notes): write only, requires Graphviz >= 2.28.0- Valid for: E; Default: ""; Notes:  only. Valid for: EGC; Notes : write only/ Valid for: GC; Notes): write only, requires Graphviz >= 2.28.00 Valid for: E; Default: ""; Notes:  only1 Valid for: G; Default: 0.0; Notes:  only2 Valid for: G; Default: ; Minimum: 0; Notes:  only3 Valid for: E; Default: 1.0 (), 0.3 (); Notes: ,  only4 Valid for: G5 Valid for: G; Default:  " :t"6 Valid for: G; Default: []7 Valid for: G; Default:  []8 Valid for: G; Default:  ","; Notes: requires Graphviz >= 2.30.09 Valid for: ENC; Default: []: Valid for: G; Default: ; Parsing Default: ; Valid for: E; Default: ""; Notes: svg, cmap only< Valid for: E; Default: none; Notes: svg, map only= Valid for: GCN; Default:  (clusters),  (root graphs),  (nodes)> Valid for: GC; Default: ? Valid for: E; Default: 14.0; Minimum: 1.0@ Valid for: E; Default:  "Times-Roman"A Valid for: E; Default:  B Valid for: E; Default: ; Parsing Default: C Valid for: E; Default: 1.0; Minimum: 0.0D Valid for: E; Default: -25.0; Minimum: -180.0E Valid for: G; Default: ; Notes: " only, requires Graphviz >= 2.28.0F Valid for: E; Default: ""; Notes: svg, map onlyG Valid for: ENGC; Default:  "\N" (nodes),  "" (otherwise)H Valid for: N; Default: none; Notes: ,  only, a value of 0 is equivalent to being 72, requires Graphviz >= 2.36.0I Valid for: N; Default: ; Parsing Default: J Valid for: G; Default:  []; NotesB: Printing and parsing is OS-specific, requires Graphviz >= 2.29.0K Valid for: N; Default: ""L Valid for: GNE; Default: ""; Notes: svg, postscript, map onlyM Valid for: N; Default: 0.5; Minimum: 0.02N Valid for: E; Default: ""; Notes: svg, cmap onlyO Valid for: E; Default: none; Notes: svg, map onlyP Valid for: E; Default:  Q Valid for: E; Default:  ""R Valid for: E; Default: ; Parsing Default: S Valid for: E; Notes): write only, requires Graphviz >= 2.30.0T Valid for: E; Default: ""; Notes: svg, map onlyU Valid for: N; Default: ""; Notes:  onlyV Valid for: NCG; Default: 0; Notes: requires Graphviz >= 2.29.0W Valid for: G; Default: ; Parsing Default: ; Notes : only for ( attributes, requires Graphviz >= 2.29.0X Valid for: ENGC; Default: 14.0; Minimum: 1.0Y Valid for: G; Default: system dependentZ Valid for: G; Default: ; Notes : svg only[ Valid for: ENGC; Default:  "Times-Roman"\ Valid for: ENGC; Default:  ] Valid for: N; Default: ; Parsing Default: ^ Valid for: NEC; Default: [i (  LightGray ) Nothing] (nodes), [i (  ) Nothing] (clusters)_ Valid for: G; Default:  3; Notes: not ` Valid for: G; Default: .0001 * # nodes (mode == ), .0001 (mode == ); Notes:  onlya Valid for: E; Default: ""; Notes: svg, cmap onlyb Valid for: E; Default: none; Notes: svg, map onlyc Valid for: E; Default: ""; Notes: svg, map onlyd Valid for: G; Default: 96.0, 0.0; Notes4: svg, bitmap output only; "resolution" is a synonyme Valid for: N; Default: 0.0; Minimum: -100.0f Valid for: G; Default: ; Parsing Default: ; Notes:  onlyg Valid for: E; Default:  (directed),  (undirected)h Valid for: G; Default: 2; Minimum: 2; Notes : maximum of 10; , ,  onlyi Valid for: G; Default: 2; Minimum: 2; Notes : maximum of 10; , ,  onlyj Valid for: G; Default: 1+(avg. len)*sqrt(abs(V)) (unable to statically define); Minimum: The value of `.; Notes:  only, only if z |k Valid for: E; Default: ; Parsing Default: l Valid for: E; Default: ; Parsing Default: ; Notes:  onlym Valid for: G; Default: ; Parsing Default: n Valid for: G; Default: ; Parsing Default: ; Notes:  onlyo Valid for: ENG; Default: ""p Valid for: ENCG; Default: -q Valid for: ENC; Default: [i (  ) Nothing]r Valid for: G; Default: ; Notes:  onlys Valid for: G; Default: ; Parsing Default: t Valid for: GC; Default: []u Valid for: G; Notes : write onlyv Valid for: G; Default: none; Notes : xdot onlyw Valid for: E; Default: cx Valid for: E; Default: 1.0; Minimum: 0.0y Valid for: E; Default: cz Valid for: NC; Default: 1.0; Minimum: >0; Notes: " only, requires Graphviz >= 2.30.0{ Valid for: ENGC; Default: none; Notes: svg, postscript, map only| Valid for: GC; Default: 0.3; Minimum: 0; Notes: ,  only} Valid for: G; Default: 0.99; Minimum: 0.0; Notes:  only~Determine if this  is valid for use with Graphs.Determine if this  is valid for use with Clusters.Determine if this ! is valid for use with SubGraphs.Determine if this  is valid for use with Nodes.Determine if this  is valid for use with Edges.Determine if two  are the same type of .(Return the default value for a specific  if possible; graph&cluster values are preferred over node edge values.Determine if the provided  value is a valid name for an .1Remove attributes that we don't want to consider:Those that are defaults+colorscheme (as the colors embed it anyway)vFor f-like data structures where the presence of the field name without a value implies a default value.wAttempt to parse the "=value" part of a  key=value- pair. If there is an equal sign but the value6 part doesn't parse, throw an un-recoverable error.Create a custom attribute.5Determines whether or not this is a custom attribute.2The value of a custom attribute. Will throw a . if the provided  isn't a custom one.1The name of a custom attribute. Will throw a . if the provided  isn't a custom one.DReturns all custom attributes and the list of non-custom Attributes.nFind the (first instance of the) specified custom attribute and returns it along with all other Attributes.@Delete all custom attributes (actually, this will delete all E values; as such it can also be used to remove legacy attributes).8Removes all instances of the specified custom attribute.      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~xyzvw{|*+,-~LMNOPQRSTUVWXYZ[\]^_`abdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ~HGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! jqponmlkabW`_^]\[ZYXSTUVPRQLONMderts\]^_`~TWVU~z}|{uyxwvaihgfedcbX[ZYNSRQPOIMLKJ     ݠ}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ~xyzvw{|9Common internal functions for dealing with overall types.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred An edge in DotGraph. A node in DotGraph.'Represents a list of top-level list of 0s for the entire graph/sub-graph. Note that  also applies to  DotSubGraphs.Note that Dot allows a single O to be listed on a line; if this is the case then when parsing, the type of & it is determined and that type of GlobalAttribute is created.fA polymorphic type that covers all possible ID values allowed by Dot syntax. Note that whilst the 6 and k instances for ` will properly take care of the special cases for numbers, they are treated differently here.}@Takes into account edge statements containing something like  a -> {b c}.~This must" only be used for sub-graphs, etc.Print the actual ID for a  DotSubGraph.KParse the separator (and any other whitespace1 present) between statements.O}~!~B}~*Consider Attributes equal on constructors.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-InferredDefined as a wrapper around J where equality is based solely upon the constructor, not the contents. Create lookups for  Attributes.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.comNone"The available information on each  (both explicit and implicit).0The available information for each cluster; the []~ denotes all locations where that particular cluster is located (more than one location can indicate possible problems).?The path of clusters that must be traversed to reach this spot.If one P is a prefix of another, then take the longer one; otherwise, take the first .-$ 2User-friendly wrappers around Graphviz attributes.*(c) Matthew Sackman, Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred24'/A particular way of drawing the end of an edge.#A particular style type to be used.A convenience class to make it easier to create labels. It is highly recommended that you make any other types that you wish to create labels from an instance of this class, preferably via the String or Text instances.This function only creates a & value to enable you to use it for  such as Q, etc.Equivalent to  . ; the most common label . An alias for  for use with the OverloadedStrings extension.Create a label outsideP of a node/edge. Currently only in the Graphviz development branch (2.29.*). An alias for  for use with the OverloadedStrings extension.Force the positioning of $s, even when it will cause overlaps. An alias for  for use with the OverloadedStrings extension.ISpecify the background color of a graph or cluster. For clusters, if   is used, then  will override it.As with V, but add a second color to create a gradient effect. Requires Graphviz >= 2.29.0.ESpecify the fill color of a node, cluster or arrowhead. Requires  M for nodes and clusters. For nodes and edges, if this isn't set then the ) value is used instead; for clusters,  is used.As with V, but add a second color to create a gradient effect. Requires Graphviz >= 2.29.0.Specify the color of text.3Specify the color of the bounding box of a cluster.The color attribute serves several purposes. As such care must be taken when using it, and it is preferable to use those alternatives that are available when they exist.The color of edges;The bounding color of nodes;3The bounding color of clusters (i.e. equivalent to );If the  P is set, then it defines the background color of nodes and clusters unless  or  respectively is set.Also available for edges.Also available for edges.Also available for edges.Also available for edges.Also available for edges.Also available for clusters.Also available for clusters.Only available for nodes.\Only available for rectangularly-shaped nodes and clusters. Requires Graphviz >= 2.30.0.NOnly available for elliptically-shaped nodes. Requires Graphviz >= 2.30.0.hOnly available for edges; creates a tapered edge between the two nodes. Requires Graphviz >= 2.29.0.8Available for nodes, clusters and edges. When using R, indicates that a radial gradient should be used. Requires Graphviz >= 2.29.0.ASpecify the width of lines. Valid for clusters, nodes and edges.ESpecify the angle at which gradient fills are drawn; for use with  and . Requires Graphviz >= 2.29.0.The shape of a node.hHow to draw the arrow at the node the edge is pointing to. For an undirected graph, requires either   or  .NHow to draw the arrow at the node the edge is coming from. Requires either   or  .)Specify where to place arrows on an edge.Specify an ordering of edges of a node: either the outgoing or the incoming edges of a node must appear left-to-right in the same order in which they are defined in the input.When specified as both a global graph or sub-graph level attribute, then it takes precedence over an attribute specified for an individual node. When using dotN, this allows you to control relative placement of sub-graphs and clusters.A shorter variant than using .A shorter variant than using PortName from .B      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~c !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHNOPQRS~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      HGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! cNSRQPOA +The canonical representation of Dot graphs.*(c) Matthew Sackman, Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-InferredA Dot graph in canonical form.If , no multiple edges are drawn.,Assumed to be an injective mapping function.      "$      0Definition of the clustering types for Graphviz.*(c) Matthew Sackman, Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.com Safe-Inferred #A tree representation of a cluster.bDefine into which cluster a particular node belongs. Clusters can be nested to arbitrary depth.Indicates that the  is in the Cluster c.'Indicates the actual Node in the Graph. 6Extract the clusters and nodes from the list of nodes. ;Convert a single node cluster into its tree representation. `Two nodes are in the same "default" cluster; otherwise check if they are in the same cluster. ESingleton nodes come first, and then ordering based upon the cluster. Extract the sub-trees. Combine clusters. 5Convert the cluster representation of the trees into  s and s (with  =  , and  = ).  Convert this   into its Dot representation.              %Haskell representation of Dot graphs.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.comNone2346BA convenience class to make it easier to convert data types to & values, e.g. for cluster identifiers.+In most cases, conversion would be via the  or  instances (e.g. using  ).JThis class exists just to make type signatures nicer; all instances of " should also be an instance of .JThis class exists just to make type signatures nicer; all instances of " should also be an instance of .JThis class exists just to make type signatures nicer; all instances of " should also be an instance of .aThis class is used to provide a common interface to different ways of representing a graph in Dot form.You will most probably not4 need to create your own instances of this class.PThe type variable represents the current node type of the Dot graph, and the  f restriction is there because in practice most implementations of some of these methods require it.dConvert from a graph in canonical form. This is especially useful when using the functions from Data.GraphViz.Algorithms.See FromGeneralisedDot in Data.GraphViz.Types.Generalised( for a semi-inverse of this function.Return the ID of the graph.Set the ID of the graph.Is this graph directed?'Set whether a graph is directed or not.=Is this graph strict? Strict graphs disallow multiple edges.(A strict graph disallows multiple edges.;Change the node values. This function is assumed to be  injectiveY, otherwise the resulting graph will not be identical to the original (modulo labels).@Return information on all the clusters contained within this , as well as the top-level  for the overall graph.Return information on the s contained within this . The & parameter indicates if applicable  should be included.Return information on the s contained within this . The & parameter indicates if applicable  should be included.XGive any anonymous sub-graphs or clusters a unique identifier (i.e. there will be no  key in the  from ). A variant of k with default attributes removed and only attributes usable by graph/cluster kept (where applicable). A variant of K with default attributes removed and only attributes used by nodes kept. A variant of K with default attributes removed and only attributes used by edges kept.Returns all resultant  s in the  (not including NodeAttrs).Returns all resultant  s in the  (not including EdgeAttrs). The actual Dot code for an instance of $. Note that it is expected that  .  ==  T (this might not be true the other way around due to un-parseable components).EParse a limited subset of the Dot language to form an instance of ^. Each instance may have its own limitations on what may or may not be parseable Dot code./Also removes any comments, etc. before parsing.As with  , but if an  Attributef cannot be parsed strictly according to the known rules, let it fall back to being parsed as an UnknownAttribute. This is especially useful for when using a version of Graphviz that is either newer (especially for the XDot attributes) or older (when some attributes have changed) but you'd still prefer it to parse rather than throwing an error. An alias for  for use with the OverloadedStrings extension. +This instance loses precision by going via u.,            ! " # $ %<6789:klmno>klmno6789:             ! " # $ %&Various algorithms on Graphviz graphs.*(c) Matthew Sackman, Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.comNone6A [Place edges in the clusters where their nodes are rather than in the top-level graph.  Put common  as top-level . Options that are more like how  dot -Tcanon works. )Canonicalise with some sensible defaults.As with  , but allow custom .8 & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ;      < = > ? @ A BFrom sub-graphs+Statements from the sub-graphs for testing.From nodes/edges C D E F G H I J K L M N O P Q R S            * & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ;      < = > ? @ A B C D E F G H I J K L M N O P Q R S"IO-related functions for graphviz.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.comNone6 TjCorrectly render Graphviz output in a more machine-oriented form (i.e. more compact than the output of  renderDot).Explicitly convert a (lazy)  U to a + value using UTF-8 encoding, throwing a .! if there is a decoding error. Output the DotRepr to the specified  V. Output the DotRepr to the spcified  V- in a more compact, machine-oriented form.Strictly read in a % value using an appropriate encoding.Read in and parse a DotRepr value from the specified  V.Write the specified DotRepr to file.Read in and parse a DotRepr value from a file.Print the specified DotRepr to  W.Read in and parse a DotRepr value from  X.)Run an external command on the specified DotRepr. Remember to use hSetBinaryMode on the  V) for the output function if necessary.(If the command was unsuccessful, then a . is thrown.For performance reasons, a temporary file is used to store the generated Dot code. As such, this is only suitable for local commands. Y A version of  Z- that fully evaluates the contents of the  V' (that is, until EOF is reached). The  V is not closed. [Store the result of the  V consumption into the  \. T ]Command to runCommand-line arguments'Obtaining the output; should be strict. Y [ ^ _ ` a   T ] Y [ ^ _ ` a#Functions to run Graphviz commands.*(c) Matthew Sackman, Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.comNone6,Unlike , these items do not produce an output file; instead, they directly draw a canvas (i.e. a window) with the resulting image.VThe possible Graphviz output formats (that is, those that actually produce a file).5Google's WebP format; requires Graphviz >= 2.29.0. ZWireless BitMap format; monochrome format usually used for mobile computing devices.!eVirtual Reality Modeling Language format; requires nodes to have a third dimension set via the Pos attribute (and with a Dim value of at least 3)."Compressed VML format; % is usually preferred.#Vector Markup Language; & is usually preferred.$Tagged Image File Format.%Compressed SVG format.& Scalable Vector Graphics format.'PostScript for PDF.( PostScript.)!Portable Network Graphics format.*As for +G, but provides port names on head and tail nodes when applicable.+Simple text format.,Portable Document Format.-The JPEG image format..As for 08, except only rectangles are used as active areas./As for 18, except only rectangles are used as active areas.0Client-side imagemap.1Server-side imagemap.2Icon image file format.3Graphics Interchange Format.4Compressed version of 5.5Internal GD library format.6FIG graphics language.7Encapsulated PostScript.8As with 9T, but provides even more information on how the graph is drawn. The optional  b" is the same as specifying the  XDotVersion attribute.96Reproduces the input along with layout information.:6Pretty-printed Dot output with no layout performed.;Windows Bitmap Format. cdThis class is for those data types that are valid options for the Graphviz tools to use with the -T argument.<(The default command for directed graphs.=*The default command for undirected graphs.>?The appropriate (default) Graphviz command for the given graph. d"A default file extension for each .?yRun the recommended Graphviz command on this graph, saving the result to the file provided (note: file extensions are not checked).@tRun the chosen Graphviz command on this graph, saving the result to the file provided (note: file extensions are not checked).A.Append the default extension for the provided  to the provided  e for the output file.BpRun the chosen Graphviz command on this graph, but send the result to the given handle rather than to a file.Note that the  V ->  f a function must% fully consume the input from the  V; e.g. use strict  ByteStrings rather than lazy ones.(If the command was unsuccessful, then a . is thrown.C[Run the chosen Graphviz command on this graph and render it using the given canvas type.D`Run the recommended Graphviz command on this graph and render it using the given canvas type.ELIs the Graphviz suite of tools installed? This is determined by whether dot is available in the PATH.FeIf Graphviz does not seem to be available, print the provided error message and then exit fatally.3 !"#$%&'()*+,-./0123456789:; c g h<=> d?@ABWhich command to runThe  to useThe  typeExtract the outputThe error or the result. iCDEF j k5~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEF5~<=>;:9876543210/.-,+*)('&%$#"! ?@ACDBEF;:9876543210/.-,+*)('&%$#"!  c g h<=> d?@AB iCDEF j k+Alternate definition of the Graphviz types.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.comNone246RThis class is useful for being able to parse in a dot graph as a generalised one, and then convert it to your preferred representation.&This can be seen as a semi-inverse of .T?The internal representation of a generalised graph in Dot form.VIf , no multiple edges are drawn. l Convert a T to a T*, keeping the same order of statements. m,Assumed to be an injective mapping function.2GHIJKLMNOPQRSTUVWXY l n o p q r s t u v w x y z { | } ~  m $GHIJKLMNOPQRSTUVWXY&TUVWXYRSQLPONMGHIJK$GHIJKLPONMQRSTUVWXY l n o p q r s t u v w x y z { | } ~  m *A monadic interface for making Dot graphs.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.comNone246ZThe actual monad; as with [w but allows you to return a value within the do-block. The actual implementation is based upon the Writer monad.[*The monadic representation of a Dot graph.\8Create a directed dot graph with the specified graph ID.]-Create a directed dot graph with no graph ID.^:Create a undirected dot graph with the specified graph ID._/Create a undirected dot graph with no graph ID.` Add graph sub-graphcluster attributes.aAdd global node attributes.bAdd global edge attributesc!Add a named cluster to the graph.dAdd a node to the graph.e+Add a node with no attributes to the graph.fAdd an edge to the graph.gAdd an edge with no attributes.h An alias for g$ to make edges look more undirected.% Z [ \]^_ `abcdefgh Z[\]^_`abcdefgh[Z\]^_`abcdefgh   Z [ \]^_ `abcdefgh g h *A graph-like representation of Dot graphs.(c) Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.comNone246&iOThe decomposition of a node from a dot graph. Any loops should be found in o rather than n:. Note also that these are created/consumed as if for directed graphs.l*The cluster this node can be found in; Nothing6 indicates the node can be found in the root graph.p/A Dot graph that allows graph operations on it.s Merge the ij into the graph. Assumes that the specified node is not in the graph but that all endpoints in the o and n (with the exception of loops) are. If the cluster is not present in the graph, then it will be added with no attributes with a parent of the root graph. Note that & and ~ are notk quite inverses, as this function will add in the cluster if it does not yet exist in the graph, but ~ will not delete it.t'Recursively merge the list of contexts. "composeList = foldr (&) emptyGraphu]Add a node to the current graph. Throws an error if the node already exists in the graph.If the specified cluster does not yet exist in the graph, then it will be added (as a sub-graph of the overall graph and no attributes).v A variant of u/ that takes in a DotNode (not in a cluster).wAdd the specified edge to the graph; assumes both node values are already present in the graph. If the graph is undirected then the order of nodes doesn't matter.x A variant of w that takes a  value.yAdd a new cluster to the graph; throws an error if the cluster already exists. Assumes that it doesn't match the identifier of the overall graph. If the parent cluster doesn't already exist in the graph then it will be added.zGSpecify the parent of the cluster; adds both in if not already present.{ISpecify the attributes of the cluster; adds it if not already present.| Create a graph with no clusters.}nConvert this DotGraph into canonical form. All edges are found in the outer graph rather than in clusters.~A partial inverse of s, in that if a node exists in a graph then it will be decomposed, but will not remove the cluster that it was in even if it was the only node in that cluster.As with ~, but do not specify which node to decompose.LRecursively decompose the Dot graph into a list of contexts such that if (c:cs) = decomposeList dg, then  dg = c & t cs.5Note that all global attributes are lost, so this is not5 suitable for representing a Dot graph on its own.cDelete the specified node from the graph; returns the original graph if that node isn't present.\Delete all edges between the two nodes; returns the original graph if there are no edges.nDeletes the specified edge from the DotGraph (note: for unordered graphs both orientations are considered).As with  but takes a " rather than individual values.Delete the specified cluster, and makes any clusters or nodes within it be in its root cluster (or the overall graph if required).>Remove clusters with no sub-clusters and no nodes within them.Does this graph have any nodes?"Does this graph have any clusters?.Determine if this graph has nodes or clusters.-Return the ID for the cluster the node is in.#Return the attributes for the node.RPredecessor edges for the specified node. For undirected graphs equivalent to .PSuccessor edges for the specified node. For undirected graphs equivalent to .All edges involving this node.5Which cluster (or the root graph) is this cluster in?+Convert any existing DotRepr instance to a p.Convert a canonical Dot graph to a graph-based one. This assumes that the canonical graph is the same format as returned by }. The "unsafeness" is that:,All clusters must have a unique identifier (, can be used to make sure all clusters have7 an identifier, but it doesn't ensure uniqueness).=All nodes are assumed to be explicitly listed precisely once.2Only edges found in the root graph are considered.If this isn't the case, use  instead.The  graphToDot function from  Data.GraphVizq produces output suitable for this function (assuming all clusters are provided with a unique identifier); graphElemsToDot] is suitable if all nodes are specified in the input list (rather than just the edges). +Uses the ParseDot instance for generalised Ts. )Uses the PrintDot instance for canonical s.  If the graph is the output from  *, then it should be safe to substitute  for .  It should be safe to substitute  for  in the output of this.fijklmno p qr st u)The cluster the node can be found in (Nothing refers to the root graph).vwxy The identifier for this cluster.The parent of this cluster (Nothing refers to the root graph) z{|}~    7ijklmnopqrstuvwxyz{|}~7pijklmno}q|rstuvwxyz{~Mijklmno    p qr st uvwxy z{|}~    sGraphviz bindings for Haskell.*(c) Matthew Sackman, Ivan Lazar Miljenovic3-Clause BSD-styleIvan.Miljenovic@gmail.comNone367Used to augment an edge label with a unique identifier.-Augment the current edge label type with the  applied to that edge.-Augment the current node label type with the  applied to that node. An alias for  when dealing with FGL graphs.)Defines the parameters used to convert a   into a .A value of type  n nl el cl l indicates that the   has a node type of n, node labels of type nl, edge labels of type el!, corresponding clusters of type cl8 and after clustering the nodes have a label of type l) (which may or may not be the same as nl).BThe tuples in the function types represent labelled nodes (for (n,nl) and (n,l)) and labelled edges ((n,n,el); the value  (f,t,ftl) is an edge from f to l with a label of ftl). These correspond to   and   in FGL graphs.The clustering in  can be to arbitrary depth.HNote that the term "cluster" is slightly conflated here: in terms of GraphvizParams2 values, a cluster is a grouping of nodes; the [ function lets you specify whether it is a cluster in the Dot sense or just a sub-graph.True if the graph is directed; False otherwise.The top-level global  for the entire graph.?A function to specify which cluster a particular node is in.=Is this "cluster" actually a cluster, or just a sub-graph?"The name/identifier for a cluster.DSpecify which global attributes are applied in the given cluster. The specific  Attributes for a node. The specific  Attributes for an edge. +Determine if the given graph is undirected. A default O value which assumes the graph is directed, contains no clusters and has no s set.WIf you wish to have the labels of the nodes to have a different type after applying C from before clustering, then you will have to specify your own  value from scratch (or use ).If you use a custom y function (which if you actually want clusters you should) then you should also override the (nonsensical) default . A variant of . that enforces that the clustering type is '()'; (i.e.: no clustering); this avoids problems when using W internally within a function without any constraint on what the clustering type is.A & value where every field is set to  ]. This is useful when you have a function that will set some of the values for you (e.g. ) but you don't want to bother thinking of default values to set in the meantime. This is especially useful when you are programmatically setting the clustering function (and as such do not know what the types might be).Determine if the provided  , is directed or not and set the value of  appropriately.Convert a graph to DotE format, using the specified parameters to cluster the graph, etc.As with , but this allows you to easily convert other graph-like formats to a Dot graph as long as you can get a list of nodes and edges from it.A pseudo-inverse to e; "pseudo" in the sense that the original node and edge labels aren't able to be reconstructed.Run the appropriate Graphviz command on the graph to get positional information and then combine that information back into the original graph.HThis is a "quick-and-dirty" graph augmentation function that sets no C and thus should be referentially transparent and is wrapped in  .Note that the provided  is only used for ,  and .Add unique edge identifiers to each label. This is useful for when multiple edges between two nodes need to be distinguished.gAdd a custom attribute to the list of attributes containing the value of the unique edge identifier. &Remove the unique identifier from the  . Pass the 6 through the relevant command and then augment the   that it came from.Use the  in the provided 8 to augment the node and edge labels in the provided  @. The unique identifiers on the edges are also stripped off.HPlease note that the behaviour for this function is undefined if the ! does not come from the original  j (either by using a conversion function or by passing the result of a conversion function through a ~ via the 9 or similar).$Quickly visualise a graph using the  ?. If your label types are not (and cannot) be instances of , you may wish to use  ,   or  # to set them to a value such as "".#   A6789:klmno~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~c !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHNOPQRS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEF     !" !# !$ %&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                % & + , 1 6 ; < A F K P  Q S X Y ^ _ ` a b c d e j o p q v { | }                           = B G H I  J K P U V [ ` a b g h m n  s x }                                   !"# $ % & ' ( ) * + , - . / 0 1 2 3 4 * 5 6 7 $ 8 9 : ; < = > ? @  A B C D E F . G H H I J K L M N O P Q R S T U V W X Y Z [ U \ ] ^ _ ` P _abcdefghijklmnopqrstuvwxyz{||}~YX      !"#$%&'()*+,-./01233456789:;<=>?@A`BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijjklmnG3opqr4stuvw6xyz{|}~$  *E(&8`;=>M      ^       ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Z [ \ ] ^_`a b c d e f g h i j k l m n o p q r s t u v w x y z { |}~OPQRSTZZ[\]^Z      !"#$%&'()*+,-./012 3456789:;<=> ?@ABCDEFGHIJKLMNOPQRS_TUVWX"Y Z[\]^_`abcdefghijk lm ln lo lp lq lr ls lt lu lv lw lx ly lz l{ l| l| l} l~ l l l l l l l  ?WWWWWWWWWWWWWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWWWW        ! "#$%&'()*+,-./0123 45 678 9: ;<=>?@ABCDEFGHIJKL 4M 4N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z{|}~yzkkl      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s tuvwxyz{|}~ 6 ?                       Z jklmnostU  st    ?   9:         [\]             P   ! " # $ % & ' ( ) * + , - . , - / , - 0 1 2 3  4 5 , - 6 , - 7 , - 8 9 : ; < = >graphviz-2999.17.0.2Data.GraphViz.Exception&Data.GraphViz.Attributes.Colors.BrewerData.GraphViz.Attributes.ColorsData.GraphViz.ParsingData.GraphViz.PreProcessingData.GraphViz.Printing!Data.GraphViz.Attributes.Complete#Data.GraphViz.Attributes.Colors.X11#Data.GraphViz.Attributes.Colors.SVGData.GraphViz.AttributesData.GraphViz.Attributes.HTMLData.GraphViz.Types.CanonicalData.GraphViz.Types Data.GraphVizData.GraphViz.AlgorithmsData.GraphViz.Commands.IOData.GraphViz.CommandsData.GraphViz.Types.GeneralisedData.GraphViz.Types.MonadicData.GraphViz.Types.Graph$Data.GraphViz.Attributes.ColorSchemeData.GraphViz.Internal.StateData.GraphViz.Internal.Util Data.GraphViz.Commands.Available!Data.GraphViz.Attributes.InternalData.GraphViz.Attributes.ArrowsData.GraphViz.Attributes.Values#Data.GraphViz.Types.Internal.CommonData.GraphViz.Attributes.SameData.GraphViz.Types.State#Data.GraphViz.Algorithms.ClusteringbaseControl.Exception.Basebracket mapExceptionhandle GHC.Exceptionthrow BrewerNameYlorrdYlorbrYlgnbuYlgnSpectralSet3Set2Set1RedsRdylgnRdylbuRdpuRdgyRdbuPurplesPurdPuorPubugnPubuPrgnPiygPastel2Pastel1PairedOrrdOrangesGreysGreensGnbuDark2BupuBugnBrbgBluesAccent BrewerSchemeBScheme ColorSchemeBrewerSVGX11GraphvizException CmdNotFound NotCustomAttr GVProgramExc NotUTF8Dot NotDotCode isNumString isIntStringParseDot parseUnqtparse parseUnqtList parseListParse runParserparseLiberally runParserWith runParser'parseItcheckValidParseparseIt'onlyBoolquotelessString numString stringBlock quotedStringparseStrictFloatparseSignedFloat parseAndSpacestring stringRep stringReps stringParse stringValuestrings characternoneOf whitespace1 whitespacewrapWhitespaceoptionalQuotedStringoptionalQuoted quotedParseorQuote quoteChar parseEscapednewlinenewline' consumeLineparseEq ignoreSepcommaSep commaSepUnqt commaSep' parseComma tryParseList tryParseList' parseAngled parseBracedparseColorScheme preProcessPrintDotunqtDottoDot unqtListToDot listToDotDotCode renderDotprintItunqtTextdotText addQuoteswrapcommaDel printField unqtEscaped printEscapedangledfslashprintColorSchemeGraphvizCommand PatchworkOsageSfdpFdpCircoTwoPiNeatoDotX11Color YellowGreenYellow4Yellow3Yellow2Yellow1Yellow WhiteSmokeWhiteWheat4Wheat3Wheat2Wheat1Wheat VioletRed4 VioletRed3 VioletRed2 VioletRed1 VioletRedViolet Turquoise4 Turquoise3 Turquoise2 Turquoise1 Turquoise TransparentTomato4Tomato3Tomato2Tomato1TomatoThistle4Thistle3Thistle2Thistle1ThistleTan4Tan3Tan2Tan1Tan SteelBlue4 SteelBlue3 SteelBlue2 SteelBlue1 SteelBlue SpringGreen4 SpringGreen3 SpringGreen2 SpringGreen1 SpringGreenSnow4Snow3Snow2Snow1Snow SlateGray4 SlateGray3 SlateGray2 SlateGray1 SlateGray SlateBlue4 SlateBlue3 SlateBlue2 SlateBlue1 SlateBlueSkyBlue4SkyBlue3SkyBlue2SkyBlue1SkyBlueSienna4Sienna3Sienna2Sienna1Sienna SeaShell4 SeaShell3 SeaShell2 SeaShell1SeaShell SeaGreen4 SeaGreen3 SeaGreen2 SeaGreen1SeaGreen SandyBrownSalmon4Salmon3Salmon2Salmon1Salmon SaddleBrown RoyalBlue4 RoyalBlue3 RoyalBlue2 RoyalBlue1 RoyalBlue RosyBrown4 RosyBrown3 RosyBrown2 RosyBrown1 RosyBrownRed4Red3Red2Red1RedPurple4Purple3Purple2Purple1Purple PowderBluePlum4Plum3Plum2Plum1PlumPink4Pink3Pink2Pink1PinkPeru PeachPuff4 PeachPuff3 PeachPuff2 PeachPuff1 PeachPuff PapayaWhipPaleVioletRed4PaleVioletRed3PaleVioletRed2PaleVioletRed1 PaleVioletRedPaleTurquoise4PaleTurquoise3PaleTurquoise2PaleTurquoise1 PaleTurquoise PaleGreen4 PaleGreen3 PaleGreen2 PaleGreen1 PaleGreen PaleGoldenrodOrchid4Orchid3Orchid2Orchid1Orchid OrangeRed4 OrangeRed3 OrangeRed2 OrangeRed1 OrangeRedOrange4Orange3Orange2Orange1Orange OliveDrab4 OliveDrab3 OliveDrab2 OliveDrab1 OliveDrabOldLaceNavyBlueNavy NavajoWhite4 NavajoWhite3 NavajoWhite2 NavajoWhite1 NavajoWhiteMoccasin MistyRose4 MistyRose3 MistyRose2 MistyRose1 MistyRose MintCream MidnightBlueMediumVioletRedMediumTurquoiseMediumSpringGreenMediumSlateBlueMediumSeaGreen MediumPurple4 MediumPurple3 MediumPurple2 MediumPurple1 MediumPurple MediumOrchid4 MediumOrchid3 MediumOrchid2 MediumOrchid1 MediumOrchid MediumBlueMediumAquamarineMaroon4Maroon3Maroon2Maroon1MaroonMagenta4Magenta3Magenta2Magenta1MagentaLinen LimeGreen LightYellow4 LightYellow3 LightYellow2 LightYellow1 LightYellowLightSteelBlue4LightSteelBlue3LightSteelBlue2LightSteelBlue1LightSteelBlueLightSlateGrayLightSlateBlue LightSkyBlue4 LightSkyBlue3 LightSkyBlue2 LightSkyBlue1 LightSkyBlue LightSeaGreen LightSalmon4 LightSalmon3 LightSalmon2 LightSalmon1 LightSalmon LightPink4 LightPink3 LightPink2 LightPink1 LightPink LightGrayLightGoldenrodYellowLightGoldenrod4LightGoldenrod3LightGoldenrod2LightGoldenrod1LightGoldenrod LightCyan4 LightCyan3 LightCyan2 LightCyan1 LightCyan LightCoral LightBlue4 LightBlue3 LightBlue2 LightBlue1 LightBlue LemonChiffon4 LemonChiffon3 LemonChiffon2 LemonChiffon1 LemonChiffon LawnGreenLavenderBlush4LavenderBlush3LavenderBlush2LavenderBlush1 LavenderBlushLavenderKhaki4Khaki3Khaki2Khaki1KhakiIvory4Ivory3Ivory2Ivory1IvoryIndigo IndianRed4 IndianRed3 IndianRed2 IndianRed1 IndianRedHotPink4HotPink3HotPink2HotPink1HotPink HoneyDew4 HoneyDew3 HoneyDew2 HoneyDew1HoneyDew GreenYellowGreen4Green3Green2Green1GreenGray100Gray99Gray98Gray97Gray96Gray95Gray94Gray93Gray92Gray91Gray90Gray89Gray88Gray87Gray86Gray85Gray84Gray83Gray82Gray81Gray80Gray79Gray78Gray77Gray76Gray75Gray74Gray73Gray72Gray71Gray70Gray69Gray68Gray67Gray66Gray65Gray64Gray63Gray62Gray61Gray60Gray59Gray58Gray57Gray56Gray55Gray54Gray53Gray52Gray51Gray50Gray49Gray48Gray47Gray46Gray45Gray44Gray43Gray42Gray41Gray40Gray39Gray38Gray37Gray36Gray35Gray34Gray33Gray32Gray31Gray30Gray29Gray28Gray27Gray26Gray25Gray24Gray23Gray22Gray21Gray20Gray19Gray18Gray17Gray16Gray15Gray14Gray13Gray12Gray11Gray10Gray9Gray8Gray7Gray6Gray5Gray4Gray3Gray2Gray1Gray0Gray Goldenrod4 Goldenrod3 Goldenrod2 Goldenrod1 GoldenrodGold4Gold3Gold2Gold1Gold GhostWhite Gainsboro ForestGreen FloralWhite Firebrick4 Firebrick3 Firebrick2 Firebrick1 Firebrick DodgerBlue4 DodgerBlue3 DodgerBlue2 DodgerBlue1 DodgerBlueDimGray DeepSkyBlue4 DeepSkyBlue3 DeepSkyBlue2 DeepSkyBlue1 DeepSkyBlue DeepPink4 DeepPink3 DeepPink2 DeepPink1DeepPink DarkViolet DarkTurquoiseDarkSlateGray4DarkSlateGray3DarkSlateGray2DarkSlateGray1 DarkSlateGray DarkSlateBlue DarkSeaGreen4 DarkSeaGreen3 DarkSeaGreen2 DarkSeaGreen1 DarkSeaGreen DarkSalmon DarkOrchid4 DarkOrchid3 DarkOrchid2 DarkOrchid1 DarkOrchid DarkOrange4 DarkOrange3 DarkOrange2 DarkOrange1 DarkOrangeDarkOliveGreen4DarkOliveGreen3DarkOliveGreen2DarkOliveGreen1DarkOliveGreen Darkkhaki DarkGreenDarkGoldenrod4DarkGoldenrod3DarkGoldenrod2DarkGoldenrod1 DarkGoldenrodCyan4Cyan3Cyan2Cyan1CyanCrimson CornSilk4 CornSilk3 CornSilk2 CornSilk1CornSilkCornFlowerBlueCoral4Coral3Coral2Coral1Coral Chocolate4 Chocolate3 Chocolate2 Chocolate1 Chocolate Chartreuse4 Chartreuse3 Chartreuse2 Chartreuse1 Chartreuse CadetBlue4 CadetBlue3 CadetBlue2 CadetBlue1 CadetBlue Burlywood4 Burlywood3 Burlywood2 Burlywood1 BurlywoodBrown4Brown3Brown2Brown1Brown BlueVioletBlue4Blue3Blue2Blue1BlueBlanchedAlmondBlackBisque4Bisque3Bisque2Bisque1BisqueBeigeAzure4Azure3Azure2Azure1Azure Aquamarine4 Aquamarine3 Aquamarine2 Aquamarine1 Aquamarine AntiqueWhite4 AntiqueWhite3 AntiqueWhite2 AntiqueWhite1 AntiqueWhite AliceBlue x11Colour CompassPointNoCP CenterPoint NorthWestWest SouthWestSouth SouthEastEast NorthEastNorthPortPos LabelledPortPortNamePNportName BrewerColorBCSVGColorTealSilverOliveLime LightGreenHoneydewFuchsiaDarkRed DarkMagenta DarkKhakiDarkGrayDarkCyanDarkBlueCornsilkCornflowerBlueAqua svgColour ArrowSide BothSides RightSideLeftSide ArrowFill FilledArrow OpenArrow ArrowModifierArrMod arrowFill arrowSide ArrowShapeVeeTeeNormalNoArrowInvDotArrowDiamondCrowBox ArrowTypeATypenormalnoModsopenMod NamedColortoColor WeightedColorWCwColor weighting ColorListColorHSVhue saturationvalueRGBAalphaRGBredgreenbluetoWC toColorListtoWColortoColour fromColour fromAColourScale ExpandBoth ExpandHeight ExpandWidthScaleUniformly NaturalSizeVAlignHBottomHMiddleHTopAlignHTextHRightHCenterHLeft AttributeWidthTitleTargetSrcRowSpanPort PointSizeIDHRefHeight FixedSizeFaceColSpan CellSpacing CellPadding CellBorderBorderBGColorBAlign AttributesImgCell VerticalRuleImgCell LabelCellRowHorizontalRuleCellsTableHTabletableFontAttrs tableAttrs tableRowsFormat Superscript Subscript UnderlineBoldItalicsTextItemFontNewlineStrTextLabelNodeSize SetShapeSize SetNodeSize GrowAsNeeded NormalizedNormalizedAngle NotNormalized IsNormalizedNumberDblIntRatios AutoRatio ExpandRatio CompressRatio FillRatio AspectRatio JustificationJCenterJRightJLeft ScaleTypeFillBoth FillHeight FillWidthNoScale UniformScalePathspathsVerticalPlacementVBottomVCenterVTop FocusType NodeFocusXYViewPortVPwValhValzValfocus StyleNameDDRadialTaperedRounded DiagonalsWedgedStripedFilled InvisibleSolidDottedDashed StyleItemSItemSTStyle RandomStyle SelfStyle RegularStyle StartTypeStartStyleSeed StartSeed StartStyle SmoothTypeTriangleSmoothSpringRNG PowerDist GraphDistAvgDistNoSmoothShapeMRecordRecord LPromoterLArrowRArrow RPromoter ProteinStab ProteaseSiteRNAStabRibosite Insulator SignatureAssembly NoOverhangThreePovOverhangFivePovOverhangRestrictionSite PrimerSiteUTR TerminatorCDSPromoter ComponentBox3DFolderTabNoteStarSquareMCircleMSquareMDiamondInvHouse InvTrapezium InvTriangle TripleOctagon DoubleOctagon DoubleCircleOctagonSeptagonHexagonPentagonHouse Parallelogram Trapezium DiamondShape PlainTextTriangleEgg PointShapeCircleEllipsePolygonBoxShapeRankDir FromRight FromBottomFromLeftFromTopRankTypeSinkRankMaxRank SourceRankMinRankSameRankRootNodeName NotCentral IsCentralQuadTypeNoQTFastQTNormalQTSplineendPoint startPoint splinePointsPageDirLtLbRtRbTrTlBrBlEdgeType CompoundEdgeCurvedOrthoPolyLineNoEdges LineEdges SplineEdgesPos SplinePosPointPosPackMode PackArray PackGraph PackClustPackNodePack PackMarginDontPackDoPack OutputMode EdgesFirst NodesFirst BreadthFirstOrderInEdgesOutEdges LayerListLLLayerIDLRNameLRInt AllLayersLayerRangeElemLRSLRID LayerRange LayerListSepLLSepLayerSepLSepOverlap IpsepOverlap VpscOverlapCompressOverlapVoronoiOverlap PrismOverlapScaleXYOverlaps ScaleOverlaps KeepOverlapsPointxCoordyCoordzCoordforcePos LabelSchemeRemoveAndStraightenCloseToOldCenter CloseToCenter NotEdgeLabel RecordField FlipFields FieldLabelLabelledTarget RecordFields RecordLabel HtmlLabelStrLabelModelMDSCircuitSubSet ShortPathModeTypeMaxEnt SpringModeIpSepHierKKMajor GraphSizeGSizewidthheight desiredSize SVGFontNamesFontConfigNamesPostScriptNamesSvgNamesDPointPValDVal DEConstraintsHierConstraints NoConstraintsEdgeConstraintsDirTypeNoDirBothBackForward ClusterMode NoClusterGlobalLocalRect EscString createPointCustomAttribute AttributeNameUnknownAttributeXLPXLabel XDotVersionWeight VoroMarginVertices TrueColorTooltip TailTooltip TailTargetTailPort TailLabelTailClipTail_LPTailURL StyleSheetStyleStartSplinesSortV SmoothingSkewSizeSides ShowBoxesSep SearchSize SamplePointsSameTailSameHeadRotationRotateRepulsiveForce ReMinCrossRegularRectsRatioRankSepRankQuantumQuadTreePin PeripheriesPenWidthPenColorPagePad OverlapShrinkOverlapScaling OutputOrder OrientationOrderingNslimit1Nslimit Normalize NoJustifyNodeSepMosekModeMinLenMinDistMCLimitMaxIterMarginLWidthLTailLPosLHeightLHead LevelsGapLevelsLenLayout LayerSelectLayersLayer Landscape LabelTooltip LabelTargetLabelLoc LabelJust LabelFontSize LabelFontNameLabelFontColor LabelFloat LabelDistance LabelAngleLabelURL InputScale ImageScale ImagePathImage HeadTooltip HeadTargetHeadPort HeadLabelHeadClipHead_LPHeadURLGroup GradientAngle ForceLabelsFontSizeFontPath FontNamesFontName FontColor FillColorESepEpsilon EdgeTooltip EdgeTargetEdgeURLDPI DistortionDirEdgeConstraintsDirDimenDim DefaultDistDecorate Constraint ConcentrateCompoundComment ClusterRankCenterBgColor BoundingBox Background ArrowTail ArrowSize ArrowHeadAreaURLKDamping usedByGraphsusedByClustersusedBySubGraphs usedByNodes usedByEdges sameAttributedefaultAttributeValue validUnknownrmUnwantedAttributescustomAttributeisCustomisSpecifiedCustom customValue customName findCustomsfindSpecifiedCustomdeleteCustomAttributesdeleteSpecifiedCustomDotEdgefromNodetoNodeedgeAttributesDotNodenodeIDnodeAttributesGlobalAttributes EdgeAttrs NodeAttrs GraphAttrsattrsGraphIDNum NodeLookup ClusterLookupPathArrow Labellable toLabelValuetoLabel textLabelxLabel xTextLabel forceLabelstextLabelValuebgColorbgColors fillColor fillColors fontColorpenColorcolorstylestylesdasheddottedsolidinvisboldfilledrounded diagonalsstripedwedgedtaperedradialpenWidth gradientAngleshapearrowTo arrowFromedgeEndsinvdotArrowinvDotoDotinvODotnoArrowteediamondoDiamondcrowboxoBoxveeorderingrank DotSubGraphDotSG isCluster subGraphID subGraphStmts DotStatementsDotStmts attrStmts subGraphs nodeStmts edgeStmtsDotGraph strictGraph directedGraphgraphIDgraphStatements NodeClusterCN ToGraphID toGraphID PPDotRepr ParseDotRepr PrintDotReprDotRepr fromCanonicalgetIDsetIDgraphIsDirected setIsDirected graphIsStrict setStrictness mapDotGraphgraphStructureInformationnodeInformationedgeInformation unAnonymisegraphStructureInformationCleannodeInformationCleanedgeInformationClean graphNodes graphEdges printDotGraph parseDotGraphparseDotGraphLiberally textGraphIDCanonicaliseOptionsCOptsedgesInClustersgroupAttributesdefaultCanonOptionsdotLikeOptions canonicalisecanonicaliseOptionstransitiveReductiontransitiveReductionOptionstoUTF8hPutDothPutCompactDot hGetStricthGetDot writeDotFile readDotFileputDotreadDot runCommandGraphvizCanvasXlibGtkGraphvizOutputWebPWBmpVrmlVmlZVmlTiffSvgZSvgPs2PsPngPlainExtPlainPdfJpegCmapxNPImapNPCmapxImapIcoGifGd2GdFigEpsXDot DotOutputCanonBmp dirCommand undirCommand commandFor runGraphvizrunGraphvizCommand addExtensiongraphvizWithHandlerunGraphvizCanvasrunGraphvizCanvas'isGraphvizInstalledquitWithoutGraphviz DotStatementDEDNSGGAFromGeneralisedDotfromGeneralisedDotMdigraphdigraph'graphgraph' graphAttrs nodeAttrs edgeAttrsclusternodenode'edge--><->ContextCntxt inCluster attributes predecessors successorsadjacent emptyGraph& composeListaddNode addDotNodeaddEdge addDotEdge addClustersetClusterParentsetClusterAttributesmkGraph toCanonical decompose decomposeAny decomposeList deleteNodedeleteAllEdges deleteEdge deleteDotEdge deleteClusterremoveEmptyClustersisEmpty hasClusters isEmptyGraphgraphAttributesfoundInCluster attributesOfpredecessorsOf successorsOf adjacentToparentOfclusterAttributes fromDotReprunsafeFromCanonicalEdgeID AttributeEdge AttributeNode LNodeClusterGraphvizParamsParams isDirectedglobalAttributes clusterBy isDotCluster clusterID fmtClusterfmtNodefmtEdge defaultParamsnonClusteredParams blankParamssetDirectedness graphToDotgraphElemsToDot dotToGraph graphToGraph dotizeGraph addEdgeIDssetEdgeIDAttribute dotAttributes augmentGraphpreview$fExceptionGraphvizException$fShowGraphvizException GraphvizState parseStrictlyghc-prim GHC.TypesFalse defLayerSepdefLayerListSepGS directedEdgeslayerSep layerListSep attributeType graphColor clusterColor nodeColor edgeColor AttributeType EdgeAttribute NodeAttributeClusterAttributeSubGraphAttributeGraphAttributeGraphvizStateMmodifyGSgetsGS initialStategetDirectednesssetAttributeTypegetAttributeType setLayerSep getLayerSepsetLayerListSepgetLayerListSepsetColorSchemegetColorScheme$fGraphvizStateMParser$fGraphvizStateMStateT frstIDStringGHC.BaseString restIDStringtoDoubleTrue stringToInt escapeQuotes descapeQuoteskeywordsboolBool isIDString isKeyword createVersionuniquniqBy groupSortBygroupSortCollectByisSingle text-1.2.0.3Data.Text.Internal.Lazy parseIntCheck parseFloatCharpolyparse-1.11 Text.ParserCombinators.Poly.Base$fParseDotVersion Data.Version versionTags parseSignedparseIntparseSignedInt parseQuote$fParseDotBrewerName$fParseDotBrewerScheme$fParseDotColorScheme $fParseDot[]$fParseDotText$fParseDotChar$fParseDotBool$fParseDotDouble$fParseDotWord16$fParseDotWord8$fParseDotInteger $fParseDotIntControl.Applicative<*>pure Alternative ApplicativeoptionalliftA3liftA2liftA<**><**>manysome<|>getConstConst unwrapMonad WrapMonad WrappedMonad unwrapArrow WrapArrow WrappedArrow getZipListZipList Data.Functor<$><$%Text.ParserCombinators.Poly.StateTextreparsestGetstQuerystUpdate many1Satisfy manySatisfyonFailsatisfyeofnextPParser manyFinally' manyFinally bracketSepsepBy1sepBymany1uptoexactlyoneOf adjustErrBadfailBaddiscardapplyoneOf' adjustErrcommit Commitment PolyParse"Text.ParserCombinators.Poly.ResultSuccessFailure CommittedResultparseOutUnwanted parseUnwantedparsePreProcessorparseLineCommentparseMultiLineCommentparseSplitLineparseConcatStrings parseHTMLqtChar unqtStringqtString addEscapes$fPrintDotVersion needsQuotes$fPrintDotBrewerName$fPrintDotBrewerScheme$fPrintDotColorScheme $fPrintDot[]$fPrintDotText$fPrintDotChar$fPrintDotBool$fPrintDotDouble$fPrintDotWord16$fPrintDotWord8$fPrintDotInteger $fPrintDotInt $fShowStateTwl-pprint-text-1.1.0.3$Text.PrettyPrint.Leijen.Text.Monadicgroupnestingcolumnnest linebreaklinetextcharemptyalignhangindent fillBreakfillprettyMrationaldoublefloatintegerintequals backslashdotspacecommacolonsemidquotesquoterbracketlbracketrbracelbraceranglelanglerparenlparenenclosebracketsanglesparensbracesdquotessquotes spacebreak softbreaksoftline<$$><++><+><>vcathcatfillCatcatvsephsepfillSepsep punctuate encloseSep semiBracestupledlistText.PrettyPrint.Leijen.TextdisplayB renderOneLineDoc$fParseDotGraphvizCommand$fPrintDotGraphvizCommand colour-2.3.3Data.Colour.Internal AlphaColour$fParseDotX11Color$fPrintDotX11ColorparseEdgeBasedPP unqtPortName checkPortName compassLookup$fParseDotCompassPoint$fPrintDotCompassPoint$fParseDotPortPos$fPrintDotPortPos$fParseDotPortName$fPrintDotPortNameColour$fParseDotSVGColor$fPrintDotSVGColoreDiamondopenArrhalfOpenemptyArrinvEmptyspecialArrowParse$fParseDotArrowSide$fPrintDotArrowSide$fParseDotArrowFill$fPrintDotArrowFill$fParseDotArrowModifier$fPrintDotArrowModifier$fParseDotArrowShape$fPrintDotArrowShape$fParseDotArrowType$fPrintDotArrowTypeparseNC' Data.MaybeMaybeGHC.ShowShowmaxWordGHC.EnummaxBoundGHC.WordWord8 colorSchemeprintNChexColorword8DocparseNCprintNamedColorparseNamedColor parseX11Color toOpacity$fNamedColorSVGColor$fNamedColorX11Color$fNamedColorBrewerColor$fParseDotWeightedColor$fPrintDotWeightedColor$fParseDotColor$fPrintDotColorJustNothingprintHtmlField unescapeHtml htmlEscapes htmlUnescapesprintTag printEmptyTagparseTag parseTagRep parseEmptyTag printCellprintHtmlField'parseHtmlFieldparseHtmlField'escapeAttribute escapeValue escapeHtmlunescapeAttribute unescapeValue printBoolHtml parseBoolHtml printFontTag parseFontTag$fParseDotScale$fPrintDotScale$fParseDotVAlign$fPrintDotVAlign$fParseDotAlign$fPrintDotAlign$fParseDotAttribute$fPrintDotAttribute $fParseDotImg $fPrintDotImg$fParseDotCell$fPrintDotCell $fParseDotRow $fPrintDotRow$fParseDotTable$fPrintDotTable$fParseDotFormat$fPrintDotFormat$fParseDotTextItem$fPrintDotTextItem$fParseDotLabel$fPrintDotLabelDouble printPortName$fParseDotOverlap parseRecordunqtRecordStringrecordEscCharsprintPoint2DUnqt printPoint2D parsePoint2D parseLayerSepparseLayerNameparseLayerName'parseLayerListSepcheckLayerName parseArgscheckDDparseStyleName parseRatio parseNumberparseNormalized$fParseDotNodeSize$fPrintDotNodeSize$fParseDotNormalized$fPrintDotNormalized$fParseDotNumber$fPrintDotNumber$fParseDotRatios$fPrintDotRatios$fParseDotJustification$fPrintDotJustification$fParseDotScaleType$fPrintDotScaleType$fParseDotPaths$fPrintDotPaths$fParseDotVerticalPlacement$fPrintDotVerticalPlacement$fParseDotFocusType$fPrintDotFocusType$fParseDotViewPort$fPrintDotViewPort$fParseDotStyleName$fPrintDotStyleName$fParseDotStyleItem$fPrintDotStyleItem$fParseDotSTStyle$fPrintDotSTStyle$fParseDotStartType$fPrintDotStartType$fParseDotSmoothType$fPrintDotSmoothType$fParseDotShape$fPrintDotShape$fParseDotRankDir$fPrintDotRankDir$fParseDotRankType$fPrintDotRankType$fParseDotRoot$fPrintDotRoot$fParseDotQuadType$fPrintDotQuadType$fParseDotSpline$fPrintDotSpline$fParseDotPageDir$fPrintDotPageDir$fParseDotEdgeType$fPrintDotEdgeType $fParseDotPos $fPrintDotPos$fParseDotPackMode$fPrintDotPackMode$fParseDotPack$fPrintDotPack$fParseDotOutputMode$fPrintDotOutputMode$fParseDotOrder$fPrintDotOrder$fParseDotLayerList$fPrintDotLayerList$fParseDotLayerID$fPrintDotLayerID$fParseDotLayerRangeElem$fPrintDotLayerRangeElem$fParseDotLayerListSep$fPrintDotLayerListSep$fParseDotLayerSep$fPrintDotLayerSep$fPrintDotOverlap$fParseDotPoint$fPrintDotPoint$fParseDotLabelScheme$fPrintDotLabelScheme$fParseDotRecordField$fPrintDotRecordField$fParseDotModel$fPrintDotModel$fParseDotModeType$fPrintDotModeType$fParseDotGraphSize$fPrintDotGraphSize$fParseDotSVGFontNames$fPrintDotSVGFontNames$fParseDotDPoint$fPrintDotDPoint$fParseDotDEConstraints$fPrintDotDEConstraints$fParseDotDirType$fPrintDotDirType$fParseDotClusterMode$fPrintDotClusterMode$fParseDotRect$fPrintDotRect parseFieldDef liftEqParse parseField parseFieldsparseFieldBoolparseEdgeNodesparseBracesBased printSGID statementEndEdgeNode stringNum numericValuepartitionGlobalunPartitionGlobalprintGlobAttrType globAttrTypeparseGlobAttrType determineTypewithGlob printNodeID parseNodeID printEdgeID parseEdgeID parseEdgeNodemkEdgemkEdges addPortPos parseEdgeType parseEdgeLinedirEdgedirEdge' undirEdge undirEdge'dirGraph dirGraph' undirGraph undirGraph'strGraph strGraph'sGraphsGraph'clustclust' printGraphID parseGraphIDprintStmtBasedprintStmtBasedListprintBracesBasedprintSubGraphID parseSubGraphparseSubGraphID parseSGIDprintAttrBasedprintAttrBasedListparseAttrBasedparseAttrBasedListparseStatements$fFunctorDotEdge$fParseDotDotEdge$fPrintDotDotEdge$fFunctorDotNode$fParseDotDotNode$fPrintDotDotNode$fParseDotGlobalAttributes$fPrintDotGlobalAttributes$fParseDotGraphID$fPrintDotGraphIDSameAttrSAttrsSAgetAttrtoSAttrunSame unSameSet $fOrdSameAttr $fEqSameAttrmergePs EdgeState NodeStateNodeInfoNIattsgAttslocation NodeLookup' ClusterInfoClusterLookup' GraphState StateValueSV globalAttrs useGlobals globalPathGVState modifyGlobal modifyValue addGlobals getGlobalsgetPath modifyPath recursiveCall unionWith getGraphInfo mergeCInfos addSubGraphaddGraphGlobals toDotNodes getNodeLookup mergeNInfosaddNodeGlobals mergeNode addEdgeNodes getDotEdgesaddEdgeGlobals$fLabellable(,)$fLabellablePortName$fLabellableRecordField$fLabellable[]$fLabellableTable$fLabellable[]0$fLabellableLabel$fLabellableBool$fLabellableDouble$fLabellableInt$fLabellable[]1$fLabellableChar$fLabellableText$fLabellableText0$fFunctorDotGraphsubGraphAttrTypeprintSubGraphID'$fFunctorDotSubGraph$fParseDotDotSubGraph$fPrintDotDotSubGraph$fFunctorDotStatements$fParseDotDotStatements$fPrintDotDotStatements$fParseDotDotGraph$fPrintDotDotGraph ClusterTreeclustersToNodes clustToTree sameClust clustOrdergetNodescollapseNClusts treesToDot treeToDotCTNTshow GHC.ClassesOrdid$fToGraphIDIntegerparseDotGraphWithstatementStructurestatementNodesstatementEdgeswithSubGraphIDrenumbermaxSGInt$fToGraphIDDouble$fToGraphIDInt$fToGraphIDChar $fToGraphID[]$fToGraphIDText$fPPDotReprDotGraphn$fParseDotReprDotGraphn$fPrintDotReprDotGraphn$fDotReprDotGraphnTagStateTagMap TaggedValuesTVmarkedincomingoutgoing TaggedEdgeTagSetTag CanonControlCCcOptsisGraphclustersclustEstopIDtopAttrs EdgeLocations EdgeClusters NodePathsNodePathcreateCanonical thisLevel makeGrouping setGlobalupdateGraphGlobsnonSameDefaultsgetCommonGlobs keepIfAnyhasAny promoteDSG compLists nonEmptyGAs edgeClusters rmTransEdgeszeroTagtagEdgesdefTVgetMapgetsMap modifyMapgetSet modifySet edgeGraphtraverserenderCompactDotbytestring-0.10.4.0Data.ByteString.Lazy.Internal ByteStringGHC.IO.Handle.TypesHandleGHC.IO.Handle.FDstdoutstdin hGetContents'GHC.IO.Handle.Text hGetContentssignalWhenDoneGHC.MVarMVartoHandlecanonicalizeExecutable isExecutable liftMaybePluscanonicalizePath'VersionGraphvizResultdefaultExtensionGHC.IOFilePathIO outputCallshowCmdgraphvizWithHandle'$fGraphvizResultGraphvizCanvas$fGraphvizResultGraphvizOutputgeneraliseDotGraph printGStmts parseGStmtsgeneraliseStatements stmtStructure stmtNodes stmtEdgesgeneraliseSubGraph$fFunctorDotStatement$fParseDotDotStatement$fPrintDotDotStatement$fFromGeneralisedDotDotGraphn$fFromGeneralisedDotDotGraphn0ClusterClclIDclStmtsDotStmtMEMNMCMArunDotexecDottelltellStmt execStmtsconvertStatementsconvertStatement $fMonadDotM$fApplicativeDotM $fFunctorDotM$fReadDotGraph$fShowDotGraphEdgeMapNodeMapCI parentCluster clusterAttrs _inCluster _attributes _predecessors _successors GlobAttrsgraphAsnodeAsedgeAsDGvaluesemptyGAaddSuccaddPredaddPSaddEmptyClusterdelSuccdelPreddelPSemToDEcOptions toEdgeMapmapNs getNodeInfo getEdgeInfo globAttrMap clusterPath clusterPath' withValues withClusters toGlobAttrs fromGlobAttrsniSuccniPredtoMapfromMap fgl-5.5.0.1Data.Graph.Inductive.GraphGraphLNodeLEdge isUndirectedGHC.Err undefinedunsafePerformIOstripIDgmapnmapemapEIDeIDeLblidentifierAttrNameidentifierAttribute