r      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                                                                                                 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = >?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[ \ ] ^ _ ` 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 { | } ~                                        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{| } ~                                                                                                                         !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Graphviz-specific exceptions Ivan.Miljenovic@gmail.com Safe-Inferred=Exceptions that arise from using this library fall into four  categories: $ Unable to parse provided Dot code.  Dot code is not valid UTF-8. 7 An error when trying to run an external program (e.g. dot). 2 Treating a non-custom Attribute as a custom one.    Specification of color schemes. Ivan.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 11$; 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 11$; 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. -@Specify which colour palette and how many colours it has. Note ( the allowed values for the different  s. /9This represents the color schemes that Graphviz accepts. *  !"#$%&'()*+,-./012*  !"#$%&'()*+,-./012 #,+*)('&%$#"!  -./210Printing and parsing state. Ivan.Miljenovic@gmail.comNone@Several aspects of Dot code are either global or mutable state. The default separators for LayerSep. The default separators for  LayerListSep. " Internal utility functions Ivan.Miljenovic@gmail.comNone  First character of a non-quoted  must match this. The rest of a non-quoted  must match this. 3.Determine if this String represents a number. This assumes that 3 is . 0Determine if this String represents an integer. :Graphviz requires double quotes to be explicitly escaped. +Remove explicit escaping of double quotes. KThe following are Dot keywords and are not valid as labels, etc. unquoted.  Fold over s; first param is for  , second for . 343434Helper functions for Parsing. Ivan.Miljenovic@gmail.comNone:A ReadS-like type alias. < A variant of ;' where it is assumed that the provided ( parsing function consumes all of the  input (with the ( exception of whitespace at the end). =?Parse the required value, returning also the rest of the input   that hasn'(t been parsed (for debugging purposes). >If unable to parse Dot code properly,  a  . ?@Parse the required value with the assumption that it will parse  all of the input . @7Use this when you do not want numbers to be treated as  values. AParse a  that doesn't need to be quoted. D*Used when quotes are explicitly required; E?Parse a floating point number that actually contains decimals. F1Parse a bracketed item, discarding the brackets. The definition of bracket defined in Polyparse uses   and thus doesn'$t allow backtracking and trying the / next possible parser. This is a version of bracket that does. P*Parses at least one whitespace character. Q+Parses zero or more whitespace characters. R3Parse and discard optional surrounding whitespace. XParse a  where the provided s (as well as " and  \%) are escaped and the second list of s are those that E are not permitted. Note: does not parse surrounding quotes. The   value indicates whether empty s are allowed or  not. YParses a newline. Z6Consume all whitespace and newlines until a line with > non-whitespace is reached. The whitespace on that line is  not consumed. [?Parses and returns all characters up till the end of the line, . but does not touch the newline characters. ]The opposite of F. bATry to parse a list of the specified type; returns an empty list  if parsing fails. c.Return an empty list if parsing a list fails. D56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefr      !"#3456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef4:56789=?;<>F]@ACB34DXGHMNEOPQRSTUVWYZa\bc[^_`IJKLdef@56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefPre-process imported Dot code. Ivan.Miljenovic@gmail.comNoneg9Remove unparseable features of Dot, such as comments and D multi-line strings (which are converted to single-line strings). $@Parse out comments and make quoted strings spread over multiple 4 lines only over a single line. Should parse the entire input  . %6Parses 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  #7). Will consume the newline from the beginning of the E previous line, but will leave the one from the pre-processor line 3 there (so in the end it just removes the line). 'Parse -style comments. (Parse * ... *-style comments. )Lines can be split with a \ at the end of the line. g$%&'(*)+gg g$%&'(*)+/Helper functions for converting to Dot format. Ivan.Miljenovic@gmail.comNonehDA class used to correctly print parts of the Graphviz Dot language.  Minimal implementation is i. i>The unquoted representation, for use when composing values to $ produce a larger printing value. j>The actual quoted representation; this should be quoted if it A contains characters not permitted a plain ID String, a number - or it is not an HTML string. Defaults to i. k:The correct way of representing a list of this value when ? printed; not all Dot values require this to be implemented. 1 Defaults to Haskell-like list representation. lThe quoted form of k; defaults to wrapping double  quotes around the result of k (since the default 7 implementation has characters that must be quoted). m1A type alias to indicate what is being produced. n"Correctly render Graphviz output. oAConvert to DotCode; note that this has no indentation, as we can F only have one of indentation and (possibly) infinite line lengths. p For use with OverloadedStrings* to avoid ambiguous type variable errors. q For use with OverloadedStrings* to avoid ambiguous type variable errors. ,Check to see if this  needs to be quoted or not. -)Escape quotes in Strings that need them. .CEscape quotes and quote Texts that need them (including keywords). v&Escape the specified chars as well as ". w&Escape the specified chars as well as " and then wrap the  result in quotes. />Ensure the provided characters are all escaped. Note that we  cannot convert to m immediately because w ) needs to pass the result from this to r to determine if ! it needs to be quoted or not. %hijklmnopq,0r-.stuvw/xyz123456789:;<=U>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~hijklmnopqrstuvwxyzmnhijklpqorvwstuxyz!hijklmnopq,0r-.stuvw/xyz123456789:;<=Specification of X11 colors. Ivan.Miljenovic@gmail.comNone{AThe 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 {  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 Ivan.Miljenovic@gmail.comNone:Specifies a name for ports (used also in record-based and 7 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 SVG colors. Ivan.Miljenovic@gmail.comNone,The 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. = Convert an  to its equivalent  value.       !"#$%&'()*+,-./0123456789:;<=      !"#$%&'()*+,-./0123456789:;<=<;:9876543210/.-,+*)('&%$#"!      =<;:9876543210/.-,+*)('&%$#"!      = Specification of Brewer colors. Ivan.Miljenovic@gmail.comNone>This value should be between 1 and the level of the  - being used. >?(  !"#$%&'()*+,-.>?(-. ,+*)('&%$#"!  >?>?4Specification of Color-related types and functions. Ivan.Miljenovic@gmail.comNone @/More easily convert named colors to an overall G value. 'Bool is for whether quoting is needed. BA G$ tagged with an optional weighting. EMust be in range 0 <= W <= 1. F#The sum of the optional weightings must sum to at most 1. G@Defining a color for use with Graphviz. Note that named colors  have been split up into {s and those based upon the  Brewer color schemes. KThe L, M and N values must all  be 0 <= x <=1. UFor colors without weightings. V)For a list of colors without weightings. XAttempt to convert a G 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). Y Convert a  value to an Q G. Z Convert an  to an O G. 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. -@ABCDEFGHIJKLMNOPQRSTUVWXYZ/012@ABCDEFGHIJKLMNOPQRSTUVWXYZ"/210GQOKJIHRSTRSTPLMNFBCDEUV@AWXYZ@ABCDEFGQOKJIHRSTRSTPLMNUVWXYZ /Specification of HTML-like types for Graphviz. Ivan.Miljenovic@gmail.comNone6[ASpecifies 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. a?Specifies vertical placement. When an object is allocated more D space than required, this value determines where the extra space ) is placed above and below the object. cDefault value. eASpecifies horizontal placement. When an object is allocated more D space than required, this value determines where the extra space + is placed left and right of the object. f# values only; aligns lines of text 1 using the full cell width. The alignment of a 1 line is determined by its (possibly implicit)  associated  element. hDefault value. jNote that not all j values are valid everywhere: 7 see the comments for each one on where it is valid. k Valid for: , . l Valid for: , . m Valid for: , . Has an alias of TOOLTIP. n Valid for: , . o Valid for: . p Valid for: . q Valid for: . r Valid for: , . s Valid for: , . t Valid for: , . Requires Graphviz >= 2.29.0 u Valid for: , . v Valid for: , . w Valid for: , . Default is . x Valid for: , . y Valid for: . Default is 1. z 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 o. )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.0 ?A 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 e  j; defined this way for ease of  printing/ parsing. =Represents a textual component of an HTML-like label. It is  assumed that a & list is non-empty. It is preferable  to "group" " values together rather than have D 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 []] AThe overall type for HTML-like labels. Fundamentally, HTML-like E 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 h instance of a matches the ! HTML syntax (i.e. numbers and Html.* values; G values also  seem to work). Parses an HTML-compatible  , de-escaping known characters.  Note: this will/ fail if an unknown non-numeric HTML-escape is  used. @The characters that need to be escaped and what they need to be  replaced with (sans &). AFlip the order and add extra values that might be escaped. More 5 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 \/FOO Print something like  FOOATTR=\"ATTR_VALUE\"\/ Parse something like  FOOATTR=\"ATTR_VALUE\"value \/FOO Parse something like  FOOvalue \/FOO. Parse something like  FOOATTR=\"ATTR_VALUE\"\/ q[\]^_`abcdefghijklmnopqrstuvwxyz{|}~E[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Ej~}|{zyxwvutsrqponmlkeihgfadcb[`_^]\9[`_^]\adcbeihgfj~}|{zyxwvutsrqponmlk'Definition of the Graphviz attributes. Ivan.Miljenovic@gmail.comNoneA list of search paths. Only valid for Nodes.  For use with . Device Dependent $Nodes, Clusters and Graphs, for use  with ? ; requires  Graphviz >= 2.29.0 !Edges only; requires Graphviz >=  2.29.0 Nodes and Clusters  Nodes only  Elliptically-shaped Nodes only;  requires Graphviz >= 2.30.0 Rectangularly-shaped Nodes and ) Clusters; requires Graphviz >= 2.30.0 Nodes and Clusters Nodes and Edges Nodes and Edges Nodes and Edges Nodes and Edges Nodes and Edges &An individual style item. Except for , the []  should be empty. 4Geometries of shapes are affected by the attributes ,   and . %Must specify the record shape with a y. %Must specify the record shape with a y.  Has synonym of none. Recommended for  {s. Only affected by ,  and  6. Has synonym of oval. Also affected by ,  and N. Has synonyms of rect and  rectangle.  GSpecify the root node either as a Node attribute or a Graph attribute. !For Graphs only "For Nodes only #For Nodes only (@The number of points in the list must be equivalent to 1 mod 3; " note that this is not checked. -+Upper-case first character is major order; / lower-case second character is minor order. 6-Controls how (and if) edges are represented. For dot, the default is =; for all other layouts  the default is <. 7 fdp only 8Requires Graphviz >= 2.30.0. 9-Does not handle ports or edge labels in dot. =Except for dot, requires  non-overlapping nodes (see  _). BSort by cols, sort  by user, number of  rows/cols G,If non-negative, then packs; otherwise doesn't. O(Draw incoming edges in order specified. P(Draw outgoing edges in order specified. Q7A list of layer names. The names should all be unique T A values, and when printed will use an arbitrary character from   defLayerSep2. The values in the list are implicitly numbered   1, 2, .... S;You should not have any layer separator characters for the  T option, as they won't be parseable. TShould not be a number or all. _ How to deal with node overlaps.  Defaults to g except for fdp and sfdp. 2The 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 d  Nothing). For sfdp, the default is d (Just 0). ` Only when mode ==  aUses quadratic optimization to  minimize node displacement. bScale layout down as much as  possible without introducing $ overlaps, assuming none to begin  with. cRequires Graphviz >= 2.30.0. dRequires the Prism  library to be  available (if not,  this is equivalent to  c).   is equivalent to   1000.  Influenced by  . e/Remove overlaps by separately scaling x and y. f1Remove overlaps by uniformly scaling in x and y. l Can only be  for R 3 or greater. m)Input to Graphviz only: specify that the $ node position should not change. n.How to treat a node whose name is of the form " |edgelabel|*" 1 as a special node representing an edge label. oUse a two-step process. p*Make node close to old center of neighbor q&Make node close to center of neighbor r No effect s?Specifies the sub-values of a record-based label. By default, , the cells are laid out horizontally; use t to change C the orientation of the fields (can be applied recursively). To ' change the default orientation, use . vWill result in no label for  that cell. x,A RecordFields value should never be empty. zFor nodes only; requires  either  or   as the shape. {If   is used, the   value is the entire  "shape"; if anything else  except  is used then  the  is embedded  within the shape. /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 D 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) h (i.e. created with  {). "Whilst it is possible to create a h value with either a 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. +Draw a reverse directed edge with an arrow  to the node it's coming from. *Draw a directed edge with an arrow to the  node it's pointing go. If 6, then sub-graphs that are clusters are given special  treatment.  and  currently appear to be : identical and turn off the special cluster processing. .Should only have 2D points (i.e. created with {). BRepresents which side (when looking towards the node the arrow is  pointing to) is drawn. "What modifications to apply to an . Dot; has a basic grammar of arrow shapes which allows usage of ; up to 1,544,761 different shapes from 9 different basic  5s. Note that whilst an explicit list is used in the  definition of ), there must be at least one tuple and a C maximum of 4 (since that is what is required by Dot). For more  information, see:  (http://graphviz.org/doc/info/arrows.html >The 19 basic arrows shown on the overall attributes page have : been defined below as a convenience. Parsing of the 5 8 backward-compatible special cases is also supported. Some "s (mainly label-like ones) take a  argument : that allows for extra escape codes. This library doesn' t do any E 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  s. BThe extra escape codes include (note that these are all Strings):  \N- Replace with the name of the node (for Node s). \G. Replace with the name of the graph (for Node s) ? or the name of the graph or cluster, whichever is 5 applicable (for Graph, Cluster and Edge s). \E6 Replace with the name of the edge, formed by the two 9 adjoining nodes and the edge type (for Edge s). \T2 Replace with the name of the tail node (for Edge  s). \H2 Replace with the name of the head node (for Edge  s). \L Replace with the object's label (for all s).  Also, if the  in question is y, : or  , then \n, \l and \r split the label into lines > centered, left-justified and right-justified respectively. ?The available Graphviz commands. The following directions are B 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 graphviz)). Note that any command can be used on ( both directed and undirected graphs. When used with the $ attribute, it overrides any actual $ command called on the dot graph. #Draw clustered graphs as treemaps,  requires Graphviz >= 2.28.0. %Filter 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.  For symmetric layouts of graphs " (ideal for undirected graphs). "For hierachical graphs (ideal for  directed graphs). If 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 n is  for any potential  custom attribute name. 0The name for an UnknownAttribute; must satisfy n. >Attributes are used to customise the layout and design of Dot D 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: N; Default: 0.75; Minimum: 0.01  Valid for: E; Default: 1.0; Minimum: 0 (dot), 1 (neato,fdp,sfdp)  Valid for: G; Default: 0.05; Minimum: 0.0; Notes : not dot  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  Valid for: E; Default: ""; Notes: svg, map only  Valid for: G; Default: ""; Notes : svg only  Valid for: ENC  Valid for: G; Default:   seed for some unknown fixed seed.; Notes: fdp, neato only  Valid for: G; Default: = (dot), < (other); Parsing Default: =  Valid for: GCN; Default: 0; Minimum: 0  Valid for: G; Default: ; Notes : sfdp 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; NotesB: dot only; used for debugging by printing PostScript guide boxes  Valid for: N; Default:   Valid for: G; Default:  4; Notes : not dot  Valid for: G; Default: 30; Notes : dot only  Valid for: G; Notes*: twopi only, requires Graphviz >= 2.28.0  Valid for: N; Default: 8 (output), 20 (overlap and image maps)  Valid for: E; Default: ""; Notes : dot only  Valid for: E; Default: ""; Notes : dot only  Valid for: G; Default: 0; Notes): sfdp only, requires Graphviz >= 2.28.0  Valid for: G; Default: 0  Valid for: GN; Default: ! "" (graphs), " (nodes); Parsing Default: #; Notes: circo, twopi only  Valid for: G; Default: 1.0; Minimum: 0.0; Notes : sfdp only  Valid for: G; Default: ; Parsing Default: ; Notes : dot only  Valid for: N; Default: ; Parsing Default:   Valid for: N; Notes : write only  Valid for: G  Valid for: G; Default: [0.5] (dot), [1.0] (twopi); Minimum: [0.02]; Notes: twopi, dot only  Valid for: G; Default: ; Notes : dot only  Valid for: S; Notes : dot only  Valid for: G; Default: 0.0; Minimum: 0.0  Valid for: G; Default: '; Parsing Default: '; Notes : sfdp only  Valid for: EN  Valid for: N; Default: ; Parsing Default: ; Notes: fdp, neato 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: 5  Valid for: G  Valid for: G; Default:  0.0555 (4 points)  Valid for: G; Default: E; Notes : not dot  Valid for: G; Default: H; Parsing Default: I; Notes : not dot  Valid for: G; Default: -4; Minimum: -1.0e10; Notes : prism only  Valid for: G; Default: g; Parsing Default: g; Notes : not dot  Valid for: G; Default: M  Valid for: N; Default: 0.0; Minimum: 360.0  Valid for: GN; Default: none; Notes : dot only   Valid for: G; Notes : dot only   Valid for: G; Notes : dot only   Valid for: G; Default: ; Parsing Default: ; Notes : not dot   Valid for: GCNE; Default: ; Parsing Default:    Valid for: G; Default: 0.25; Minimum: 0.02; Notes : dot only  Valid for: G; Default: ; Parsing Default: ; Notes*: neato only; requires the Mosek software  Valid for: G; Default: ; Notes : neato only  Valid for: G; Default: ; Notes : neato only  Valid for: E; Default: 1; Minimum: 0; Notes : dot only  Valid for: G; Default: 1.0; Minimum: 0.0; Notes : circo only  Valid for: G; Default: 1.0; Notes : dot only  Valid for: G; Default: 100 * # nodes (mode == ), 200 (mode == ), 600 (fdp); Notes: fdp, neato only  Valid for: NG; Default: device dependent  Valid for: GC; Notes*: write only, requires Graphviz >= 2.28.0  Valid for: E; Default: ""; Notes : dot only  Valid for: EGC; Notes : write only  Valid for: GC; Notes*: write only, requires Graphviz >= 2.28.0  Valid for: E; Default: ""; Notes : dot only  Valid for: G; Default: 0.0; Notes : neato only  Valid for: G; Default: ; Minimum: 0; Notes : sfdp only  Valid for: E; Default: 1.0 (neato), 0.3 (fdp); Notes: fdp, neato only  Valid for: G  Valid for: G; Default: ^ " :t"   Valid for: G; Default: [] ! Valid for: G; Default: R [] " Valid for: G; Default: \ ","; Notes: requires Graphviz >= 2.30.0 # Valid for: EN; 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" + Valid for: E; Default: {  , Valid for: E; Default: ; Parsing Default:  - Valid for: E; Default: 1.0; Minimum: 0.0 . Valid for: E; Default: -25.0; Minimum: -180.0 / Valid for: G; Default: r; Notes): sfdp only, requires Graphviz >= 2.28.0 0 Valid for: E; Default: ""; Notes: svg, map only 1 Valid for: ENGC; Default: | "\N" (nodes), | "" (otherwise) 2 Valid for: N; Default: ; Parsing Default:  3 Valid for: G; Default:  []; NotesC: Printing and parsing is OS-specific, requires Graphviz >= 2.29.0 4 Valid for: N; Default: "" 5 Valid for: GNE; Default: ""; Notes: svg, postscript, map only 6 Valid for: N; Default: 0.5; Minimum: 0.02 7 Valid for: E; Default: ""; Notes: svg, cmap only 8 Valid for: E; Default: none; Notes: svg, map only 9 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: N; Default: ""; Notes : dot only ? Valid for: NCG; Default: 0; Notes: requires Graphviz >= 2.29.0 @ Valid for: G; Default: ; Parsing Default: ; Notes : only for ) attributes, requires Graphviz >= 2.29.0 A Valid for: ENGC; Default: 14.0; Minimum: 1.0 B Valid for: G; Default: system dependent C Valid for: G; Default: ; Notes : svg only D Valid for: ENGC; Default: " Times-Roman" E Valid for: ENGC; Default: {  F Valid for: N; Default: ; Parsing Default:  G Valid for: NEC; Default: [C ({  LightGray ) Nothing] (nodes), [C ({  ) Nothing] (clusters) H Valid for: G; Default:  3; Notes : not dot I Valid for: G; Default: .0001 * # nodes (mode == ), .0001 (mode == ); Notes : neato only J Valid for: E; Default: ""; Notes: svg, cmap only K Valid for: E; Default: none; Notes: svg, map only L Valid for: E; Default: ""; Notes: svg, map only M Valid for: G; Default: 96.0, 0.0; Notes: svg, bitmap output only; " resolution" is a synonym N Valid for: N; Default: 0.0; Minimum: -100.0 O Valid for: G; Default: ; Parsing Default: ; Notes : neato only P Valid for: E; Default:  (directed),  (undirected) Q Valid for: G; Default: 2; Minimum: 2; Notes : maximum of 10; sfdp, fdp, neato only R Valid for: G; Default: 2; Minimum: 2; Notes : maximum of 10; sfdp, fdp, neato only S Valid for: G; Default: 1+(avg. len)*sqrt(abs(V)) (unable to statically define); Minimum: The value of I.; Notes: neato only, only if F H T Valid for: E; Default: ; Parsing Default:  U Valid for: E; Default: ; Parsing Default: ; Notes : dot only V Valid for: G; Default: ; Parsing Default:  W Valid for: G; Default: ; Parsing Default: ; Notes : dot only X Valid for: ENG; Default: "" Y Valid for: ENCG; Default: 2 Z Valid for: ENC; Default: [C ({  ) Nothing] [ Valid for: G; Default: ; Notes : dot only \ Valid for: G; Default: ; Parsing Default:  ] Valid for: GC; Default: [] ^ Valid for: G; Notes : write only _ Valid for: G; Notes : dot only ` Valid for: E; Default:  a Valid for: E; Default: 1.0; Minimum: 0.0 b Valid for: E; Default:  c Valid for: NC; Default: 1.0; Minimum: >0; Notes.: patchwork only, requires Graphviz >= 2.30.0 d Valid for: ENGC; Default: none; Notes: svg, postscript, map only e Valid for: GC; Default: 0.3; Minimum: 0; Notes: sfdp, fdp only f Valid for: G; Default: 0.99; Minimum: 0.0; Notes : neato only gDetermine if this  is valid for use with Graphs. hDetermine if this ! is valid for use with Clusters. iDetermine if this " is valid for use with SubGraphs. jDetermine if this  is valid for use with Nodes. kDetermine if this  is valid for use with Edges. lDetermine if two  are the same type of . m(Return the default value for a specific  if possible; graph&cluster values are preferred over node edge values. nDetermine if the provided  value is a valid name for an . oRemove attributes that we don't want to consider:  Those that are defaults 1 * colorscheme (as the colors embed it anyway) For 6-like data structures where the presence of the field 1 name without a value implies a default value. Attempt to parse the "=value" part of a  key=value pair. If " there is an equal sign but the value part doesn't parse, throw  an un-recoverable error. pCreate a custom attribute. q6Determines whether or not this is a custom attribute. s/The value of a custom attribute. Will throw a   if the provided  isn' t a custom  one. t.The name of a custom attribute. Will throw a   if the provided  isn' t a custom  one. uEReturns all custom attributes and the list of non-custom Attributes. v@Find the (first instance of the) specified custom attribute and / returns it along with all other Attributes. w=Delete all custom attributes (actually, this will delete all  / values; as such it can also be used to remove  legacy attributes). x9Removes all instances of the specified custom attribute. yApply no modifications to an . z and  Print a ( value as expected within a Record data  structure. {Create a point with only x and y values.  Note that  overlap=false defaults to d Nothing,  but if the Prism library isn'%t available then it is equivalent to  c. _      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW /012@ABCDEFGHIJKLMNOPQRSTUVWXYZ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{fedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      lmogihjknpqrstuvwxy|{znrqpoxswvut     6=<;:987yzhijklm{>@?()*+,}~_gfedcba` #"!NPOJMLKFIHGAEDCB-543210/.$'&%]^[\ZWYXSVUTQR 4      #"!$'&%()*+,-543210/.6=<;:987>@?AEDCBFIHGJMLKNPOQRSVUTWYXZ[\]^_gfedcba`hijklmnrqposwvutxy|{z}~ ɝfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ghijklmnopqrstuvwxyz{      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW:Common internal functions for dealing with overall types. Ivan.Miljenovic@gmail.comNone| An edge in DotGraph.  A node in DotGraph. 'Represents a list of top-level list of  s for the  entire graph/sub-graph. Note that  also applies to   DotSubGraphs. Note that Dot allows a single  to be listed on a line; 6 if this is the case then when parsing, the type of  it " is determined and that type of GlobalAttribute is created. AA polymorphic type that covers all possible ID values allowed by % Dot syntax. Note that whilst the 5 and h  instances for ( will properly take care of the special 9 cases for numbers, they are treated differently here. X=Takes into account edge statements containing something like  a -> {b c}. YThis must# only be used for sub-graphs, etc. ZPrint the actual ID for a  DotSubGraph. [LParse the separator (and any other whitespace1 present) between statements. P\|}~]^_`abcdefghiXjklmnopqrstuvwxyz{|}~YZ[F\|}~]^_`abcdefghiXjklmnopqrstuvwxyz{|}~YZ[B\|}~]^_`abcdefghiXjklmnopqrstuvwxyz{|}~YZ[+Consider Attributes equal on constructors. Ivan.Miljenovic@gmail.comNoneDefined as a wrapper around  where equality is based 2 solely upon the constructor, not the contents. Create lookups for  Attributes. Ivan.Miljenovic@gmail.comNone"The available information on each  (both explicit and implicit). 0The available information for each cluster; the [] B 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 3 is a prefix of another, then take the longer one;  otherwise, take the first . -$ 3User-friendly wrappers around Graphviz attributes. Ivan.Miljenovic@gmail.comNone&0A 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 E highly recommended that you make any other types that you wish to D create labels from an instance of this class, preferably via the  String or Text instances. This function only creates a y value to enable you to use  it for  such as :, etc. Equivalent to y . ; the most common label  .  An alias for  for use with the OverloadedStrings  extension. Create a label outside 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. 9Specify the background color of a graph or cluster. For  clusters, if   is used, then  will  override it. As with ., but add a second color to create a gradient ) effect. Requires Graphviz >= 2.29.0. BSpecify the fill color of a node, cluster or arrowhead. Requires   / 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 ., but add a second color to create a gradient ) effect. Requires Graphviz >= 2.29.0. Specify the color of text. 4Specify the color of the bounding box of a cluster. The color7 attribute serves several purposes. As such care must = be taken when using it, and it is preferable to use those 4 alternatives that are available when they exist.  The color of edges;  The bounding color of nodes; 4 The bounding color of clusters (i.e. equivalent to );  If the   is set, then it defines the 3 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. 2Only available for rectangularly-shaped nodes and + clusters. Requires Graphviz >= 2.30.0. AOnly available for edges; creates a tapered edge between the two ( nodes. Requires Graphviz >= 2.29.0. 5Available for nodes, clusters and edges. When using  3, indicates that a radial gradient should be used.  Requires Graphviz >= 2.29.0. BSpecify the width of lines. Valid for clusters, nodes and edges. BSpecify the angle at which gradient fills are drawn; for use with   and  . Requires Graphviz >= 2.29.0. The shape of a node. @How to draw the arrow at the node the edge is pointing to. For ( an undirected graph, requires either   or   . ;How 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 A the incoming edges of a node must appear left-to-right in the 6 same order in which they are defined in the input. 9When specified as both a global graph or sub-graph level C attribute, then it takes precedence over an attribute specified  for an individual node.  When using dot0, this allows you to control relative placement  of sub-graphs and clusters. A shorter variant than using w. A shorter variant than using PortName from s. C{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     NOP{~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ~}|     NPOB ,The canonical representation of Dot graphs. Ivan.Miljenovic@gmail.comNoneA Dot graph in canonical form. If , no multiple edges are drawn. -Assumed to be an injective mapping function. #|}~%|}~1Definition of the clustering types for Graphviz. Ivan.Miljenovic@gmail.comNone $A tree representation of a cluster. 5Define 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. 7Extract 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. FSingleton 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. Ivan.Miljenovic@gmail.comNone?A 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 ). :This class exists just to make type signatures nicer; all  instances of  should also be an instance of  . :This class exists just to make type signatures nicer; all  instances of  should also be an instance of  . :This class exists just to make type signatures nicer; all  instances of  should also be an instance of  . >This class is used to provide a common interface to different # ways of representing a graph in Dot form. You will most probably not& need to create your own instances of  this class. >The type variable represents the current node type of the Dot  graph, and the * restriction is there because in practice = most implementations of some of these methods require it. <Convert from a graph in canonical form. This is especially ( useful when using the functions from Data.GraphViz.Algorithms. 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. 8Change the node values. This function is assumed to be   injective,, 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. >Give any anonymous sub-graphs or clusters a unique identifier  (i.e. there will be no  key in the   from ).  A variant of  with default attributes . removed and only attributes usable by graph/cluster kept (where  applicable).  A variant of ! with default attributes removed + and only attributes used by nodes kept.  A variant of ! 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  .  ==  D (this might not be true the other way around due to un-parseable  components). BParse a limited subset of the Dot language to form an instance of  6. Each instance may have its own limitations on what ) may or may not be parseable Dot code. 0Also removes any comments, etc. before parsing.  An alias for  for use with the OverloadedStrings  extension. +This instance loses precision by going via . * 956789hijkl|}~;hijkl56789|}~  'Various algorithms on Graphviz graphs. Ivan.Miljenovic@gmail.comNonePlace 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                        From sub-graphs ,Statements from the sub-graphs for testing.  From nodes/edges   ! " # $ % & ' ( ) * + , - .  *                            ! " # $ % & ' ( ) * + , - .#IO-related functions for graphviz. Ivan.Miljenovic@gmail.comNone /ACorrectly render Graphviz output in a more machine-oriented form ) (i.e. more compact than the output of  renderDot). Explicitly convert a (lazy)  0 to a  value using  UTF-8 encoding, throwing a  if there is a  decoding error.  Output the DotRepr to the specified  1.  Output the DotRepr to the spcified  1 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  1. Write the specified DotRepr to file. Read in and parse a DotRepr value from a file. Print the specified DotRepr to  2. Read in and parse a DotRepr value from  3. )Run an external command on the specified DotRepr. Remember to  use hSetBinaryMode on the  1 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 A generated Dot code. As such, this is only suitable for local  commands. 4 A version of  5& that fully evaluates the contents of  the  1' (that is, until EOF is reached). The  1 is  not closed. 6Store the result of the  1 consumption into the  7.  / 8Command to run Command-line arguments (Obtaining the output; should be strict. 4 6   / 8 4 6$Functions to run Graphviz commands. Ivan.Miljenovic@gmail.comNone,Unlike  ', these items do not produce an output C file; instead, they directly draw a canvas (i.e. a window) with  the resulting image.  :The possible Graphviz output formats (that is, those that  actually produce a file).  Google's WebP format; requires  Graphviz >= 2.29.0.  Wireless BitMap format; " monochrome format usually used ! for mobile computing devices. "Virtual 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 , but provides port % names on head and tail nodes when  applicable. Simple text format. Portable Document Format. The JPEG image format. As for , except only ! rectangles are used as active  areas. As for , except only ! rectangles are used as active  areas. Client-side imagemap. Server-side imagemap. Icon image file format.  Graphics Interchange Format. !Compressed version of ". "Internal GD library format. #FIG graphics language. $Encapsulated PostScript. %As with &, but provides $ even more information on how the  graph is drawn. & Reproduces the input along with  layout information. '"Pretty-printed Dot output with no  layout performed. (Windows Bitmap Format. 9BThis 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. :"A default file extension for each  . ,FRun the recommended Graphviz command on this graph, saving the result 3 to the file provided (note: file extensions are not checked). -ARun the chosen Graphviz command on this graph, saving the result 3 to the file provided (note: file extensions are not checked). ..Append the default extension for the provided   to  the provided  ; for the output file. /<Run the chosen Graphviz command on this graph, but send the 5 result to the given handle rather than to a file. Note that the  1 ->  < a function must fully consume  the input from the  1; e.g. use strict  ByteStrings rather  than lazy ones. (If the command was unsuccessful, then a  is  thrown. 0BRun the chosen Graphviz command on this graph and render it using  the given canvas type. 1ARun the recommended Graphviz command on this graph and render it  using the given canvas type. 2AIs the Graphviz suite of tools installed? This is determined by  whether dot is available in the PATH. 3>If Graphviz does not seem to be available, print the provided ( error message and then exit fatally. 3      !"#$%&'( 9 = >)*+ :,-./Which command to run The  to use The   type Extract the output The error or the result. ?0123 @ A5      !"#$%&'()*+,-./01235)*+ ('&%$#"!     ,-.01/23   ('&%$#"!   9 = >)*+ :,-./ ?0123 @ A,Alternate definition of the Graphviz types. Ivan.Miljenovic@gmail.comNone?@The internal representation of a generalised graph in Dot form. AIf , no multiple edges are drawn. B Convert a ? to a ?, keeping the same order of  statements. C-Assumed to be an injective mapping function. .456789:;<=>?@ABCD B D E F G H I J K L M N O P Q R S T U V W X C Y Z [ \ ] ^#|}~456789:;<=>?@ABCD%?@ABCD>9=<;:45678|}~!456789=<;:>?@ABCD B D E F G H I J K L M N O P Q R S T U V W X C Y Z [ \ ] ^+A monadic interface for making Dot graphs. Ivan.Miljenovic@gmail.comNoneEThe actual monad; as with F" but allows you to return a value E within the do-block. The actual implementation is based upon the  Writer monad. F+The monadic representation of a Dot graph. G9Create a directed dot graph with the specified graph ID. H.Create a directed dot graph with no graph ID. I;Create a undirected dot graph with the specified graph ID. J0Create a undirected dot graph with no graph ID. K Add graph sub-graphcluster attributes. LAdd global node attributes. MAdd global edge attributes N"Add a named cluster to the graph. OAdd a node to the graph. P,Add a node with no attributes to the graph. QAdd an edge to the graph. R Add an edge with no attributes. S An alias for R% to make edges look more undirected. # _ ` a b c d e f g hE i jF k l mGHIJ n o p qKLMNOPQRS rEFGHIJKLMNOPQRSFEGHIJKLMNOPQRS _ ` a b c g f e d hE i jF k l mGHIJ n o p qKLMNOPQRS r+A graph-like representation of Dot graphs. Ivan.Miljenovic@gmail.comNone&T@The decomposition of a node from a dot graph. Any loops should  be found in Z rather than Y . Note also  that these are created/consumed as if for directed graphs. W'The cluster this node can be found in;  Nothing indicates the node can be  found in the root graph. [0A Dot graph that allows graph operations on it. ^ Merge the T- into the graph. Assumes that the specified : node is not in the graph but that all endpoints in the  Z and Y (with the exception of loops) E 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 i are not quite inverses, as this D function will add in the cluster if it does not yet exist in the  graph, but i will not delete it. _(Recursively merge the list of contexts. $ composeList = foldr (&) emptyGraph `>Add a node to the current graph. Throws an error if the node  already exists in the graph. BIf 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). a A variant of `# that takes in a DotNode (not in a  cluster). bBAdd the specified edge to the graph; assumes both node values are B already present in the graph. If the graph is undirected then  the order of nodes doesn' t matter. c A variant of b that takes a | value. d?Add a new cluster to the graph; throws an error if the cluster ) already exists. Assumes that it doesn't match the identifier of 2 the overall graph. If the parent cluster doesn't already exist ' in the graph then it will be added. eHSpecify the parent of the cluster; adds both in if not already present. f>Specify the attributes of the cluster; adds it if not already  present. g!Create a graph with no clusters. h@Convert this DotGraph into canonical form. All edges are found / in the outer graph rather than in clusters. iA partial inverse of ^&, in that if a node exists in a graph D 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. jAs with i, but do not specify which node to  decompose. kARecursively decompose the Dot graph into a list of contexts such  that if (c:cs) = decomposeList dg, then dg = c & _ cs. 5Note that all global attributes are lost, so this is not 5 suitable for representing a Dot graph on its own. l?Delete the specified node from the graph; returns the original  graph if that node isn' t present. m=Delete all edges between the two nodes; returns the original  graph if there are no edges. nBDeletes the specified edge from the DotGraph (note: for unordered - graphs both orientations are considered). oAs with n but takes a | rather than individual  values. p>Delete the specified cluster, and makes any clusters or nodes = within it be in its root cluster (or the overall graph if  required). q?Remove clusters with no sub-clusters and no nodes within them. r Does this graph have any nodes? s#Does this graph have any clusters? t/Determine if this graph has nodes or clusters. v.Return the ID for the cluster the node is in. w$Return the attributes for the node. xAPredecessor edges for the specified node. For undirected graphs  equivalent to z. y?Successor edges for the specified node. For undirected graphs  equivalent to z. zAll edges involving this node. {6Which cluster (or the root graph) is this cluster in? }+Convert any existing DotRepr instance to a [. ~BConvert a canonical Dot graph to a graph-based one. This assumes > that the canonical graph is the same format as returned by  h. The " unsafeness" is that: - All clusters must have a unique identifier ( can ' be used to make sure all clusters have an identifier, but it  doesn't ensure uniqueness). ? All nodes are assumed to be explicitly listed precisely once. 4 Only edges found in the root graph are considered.  If this isn't the case, use  instead. The  graphToDot function from  Data.GraphViz produces output B 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). s+Uses the ParseDot instance for generalised ?s. t)Uses the PrintDot instance for canonical s. u If the graph is the output from , then it should be safe to  substitute ~ for . v It should be safe to substitute ~ for   in the output of this. eTUVWXYZ w x y z { | } ~  [ \] ^_ `%The cluster the node can be found in  (Nothing refers to the root graph). abcd!The identifier for this cluster. The parent of this cluster  (Nothing refers to the root  graph) efghijk lmnopqrstuvwxyz {| }~ s t u v8|}~TUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~8[TUVWXYZh~}rstu{|vwxyz\g]^_`ab|}~cdefijklmnopqLTUVWXYZ w x y z { | } ~   [ \] ^_ `abcd efghijk lmnopqrstuvwxyz {| }~ s t u vGraphviz bindings for Haskell. Ivan.Miljenovic@gmail.comNone8Used 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 cl and 3 after clustering the nodes have a label of type l (which may or  may not be the same as nl). ?The 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. Note that the term "cluster" is slightly conflated here: in  terms of GraphvizParams$ values, a cluster is a grouping of  nodes; the ) function lets you specify whether it is 3 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. 1A 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. /Specify 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 " value which assumes the graph is - directed, contains no clusters and has no s set. @If you wish to have the labels of the nodes to have a different  type after applying " from before clustering, then you ! will have to specify your own  value from  scratch (or use ). If you use a custom ! 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 '()'2 (i.e.: no clustering); this avoids problems when  using * internally within a function without any . constraint on what the clustering type is. A # value where every field is set to   5. 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 5 meantime. This is especially useful when you are D 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 Dot( format, using the specified parameters  to cluster the graph, etc. As with ., but this allows you to easily convert other C 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 ; "pseudo" in the sense that ) the original node and edge labels aren' t able to be  reconstructed. 9Run the appropriate Graphviz command on the graph to get A positional information and then combine that information back  into the original graph.  This is a "quick-and-dirty"" graph augmentation function that  sets no . 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 C when multiple edges between two nodes need to be distinguished. @Add a custom attribute to the list of attributes containing the ( value of the unique edge identifier. &Remove the unique identifier from the  .  Pass the / through the relevant command and then augment  the   that it came from. Use the  in the provided  to augment the ( node and edge labels in the provided  . The unique 3 identifiers on the edges are also stripped off. APlease note that the behaviour for this function is undefined if  the ! does not come from the original   (either @ by using a conversion function or by passing the result of a ! conversion function through a  via the  & or similar). $Quickly visualise a graph using the   . If 9 your label types are not (and cannot) be instances of ,  you may wish to use  ,   or   to set them to a value  such as "". #   ;56789hijkl{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     NOP|}~      !"#$%&'()*+,-./0123      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                    ! & + , 1 6 ; @  A C H I N O P Q R S T U Z _ ` a f k l m  r w x ~                      - 2 7 8 9  : ; @ E F K P Q R W X ] ^  c h m   o  t   y z                                                                 ! " # $ % & ' ( ) * + , - . / 0 1 + 2 3 4 5 6 & 5789:;<=>?@ABCDEFGGHIJKLMNOPQRSTUVWXYZ[\]^_/`abcdefghijklmnopqrstuvwxyz{|}~  6    !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW XYZ [\P]^_ `abcdefghijklmnopuqrstuvwxyz{|}~6O4  h                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E E F G H IJKL M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e fghijklmnopqrstuvwxyz{|}~:;<=>?EEFGHIUE      !"#$%&'()*+,-.'(/'(01234567895:;<'(=>?@ABCDEFGHIJKLMNOPQPRPSPTPUPVPWPXPYPZP[P\P]P^P_P`P`PaPbPcPdPePfPgPhPhij#k:lm:ln:lo:lp:lq:lr:ls:lt:lu:lv:lw:lx:;y:;z:;{:;|:;}:;~:;:;:;:;:;:;:;:;:;:;:;::::             ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G'(H*IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~FG89      !"#$%&'()*+,-./0123 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K LMNOPQRSTUVWX'YZ#[ \'( ] ^ _ ` a b c d e f g h i j klmnopqrstuvwxyz{|}~'(B]^_CD`abEFGKLhijk@KLFGHz(hijk           graphviz-2999.16.0.0Data.GraphViz.Exception&Data.GraphViz.Attributes.Colors.BrewerData.GraphViz.Attributes.ColorsData.GraphViz.ParsingData.GraphViz.PreProcessingData.GraphViz.Printing#Data.GraphViz.Attributes.Colors.X11!Data.GraphViz.Attributes.Complete#Data.GraphViz.Attributes.Colors.SVGData.GraphViz.Attributes.HTMLData.GraphViz.Types.CanonicalData.GraphViz.TypesData.GraphViz.Attributes Data.GraphVizData.GraphViz.AlgorithmsData.GraphViz.Commands.IOData.GraphViz.CommandsData.GraphViz.Types.GeneralisedData.GraphViz.Types.MonadicData.GraphViz.Types.Graph$Data.GraphViz.Attributes.ColorSchemeData.GraphViz.StateData.GraphViz.Util!Data.GraphViz.Attributes.InternalData.GraphViz.Types.CommonData.GraphViz.Attributes.SameData.GraphViz.Types.State#Data.GraphViz.Algorithms.ClusteringbaseControl.Exception.Basebracket mapExceptionhandle GHC.ExceptionthrowGraphvizException NotCustomAttr GVProgramExc NotUTF8Dot NotDotCode BrewerNameYlorrdYlorbrYlgnbuYlgnSpectralSet3Set2Set1RedsRdylgnRdylbuRdpuRdgyRdbuPurplesPurdPuorPubugnPubuPrgnPiygPastel2Pastel1PairedOrrdOrangesGreysGreensGnbuDark2BupuBugnBrbgBluesAccent BrewerSchemeBScheme ColorSchemeBrewerSVGX11 isNumString isIntStringParseDot parseUnqtparse parseUnqtList parseListParse runParser runParser'parseItcheckValidParseparseIt'onlyBoolquotelessString numString stringBlock quotedStringparseStrictFloat 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 printEscapedangledfslashprintColorSchemeX11Color 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 LabelledPortPortNamePNportNameSVGColorTealSilverOliveLime LightGreenHoneydewFuchsiaDarkRed DarkMagenta DarkKhakiDarkGrayDarkCyanDarkBlueCornsilkCornflowerBlueAqua svgColour BrewerColorBC 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 UnderlineBoldItalicsTextItemFontNewlineStrTextLabelRatios 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 ComponentBox3DFolderTabNoteMCircleMSquareMDiamondInvHouse 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 ShortPathModeTypeIpSepHierKKMajor GraphSizeGSizewidthheight desiredSize SVGFontNamesFontConfigNamesPostScriptNamesSvgNamesDPointPValDVal DEConstraintsHierConstraints NoConstraintsEdgeConstraintsDirTypeNoDirBothBackForward ClusterMode NoClusterGlobalLocalRect AspectTypeRatioPassCount RatioOnly ArrowSide BothSides RightSideLeftSide ArrowFill FilledArrow OpenArrow ArrowModifierArrMod arrowFill arrowSide ArrowShapeVeeTeeNormalNoArrowInvDotArrowDiamondCrowBox ArrowTypeAType EscStringGraphvizCommand PatchworkOsageSfdpFdpCircoTwoPiNeatoDotCustomAttribute AttributeNameUnknownAttributeXLPXLabelWeight VoroMarginVertices TrueColorTooltip TailTooltip TailTargetTailPort TailLabelTailClipTail_LPTailURL StyleSheetStyleStartSplinesSortV SmoothingSkewSizeSides ShowBoxesSep SearchSize SamplePointsSameTailSameHeadRotationRotateRepulsiveForce ReMinCrossRegularRectsRatioRankSepRankQuantumQuadTreePin PeripheriesPenWidthPenColorPagePadOverlapScaling OutputOrder OrientationOrderingNslimit1Nslimit Normalize NoJustifyNodeSepMosekModeMinLenMinDistMCLimitMaxIterMarginLWidthLTailLPosLHeightLHead LevelsGapLevelsLenLayout LayerSelectLayersLayer Landscape LabelTooltip LabelTargetLabelLoc LabelJust LabelFontSize LabelFontNameLabelFontColor LabelFloat LabelDistance LabelAngleLabelURL ImageScale ImagePathImage HeadTooltip HeadTargetHeadPort HeadLabelHeadClipHead_LPHeadURLGroup GradientAngle ForceLabelsFontSizeFontPath FontNamesFontName FontColor FillColorESepEpsilon EdgeTooltip EdgeTargetEdgeURLDPI DistortionDirEdgeConstraintsDirDimenDim DefaultDistDecorate Constraint ConcentrateCompoundComment ClusterRankCenterBgColor BoundingBoxAspect ArrowTail ArrowSize ArrowHeadAreaURLKDamping usedByGraphsusedByClustersusedBySubGraphs usedByNodes usedByEdges sameAttributedefaultAttributeValue validUnknownrmUnwantedAttributescustomAttributeisCustomisSpecifiedCustom customValue customName findCustomsfindSpecifiedCustomdeleteCustomAttributesdeleteSpecifiedCustomnoModsopenMod createPointDotEdgefromNodetoNodeedgeAttributesDotNodenodeIDnodeAttributesGlobalAttributes EdgeAttrs NodeAttrs GraphAttrsattrsGraphIDDblInt NodeLookup ClusterLookupPathArrow Labellable toLabelValuetoLabel textLabelxLabel xTextLabel forceLabelstextLabelValuebgColorbgColors fillColor fillColors fontColorpenColorcolorstylestylesdasheddottedsolidinvisboldfilledrounded diagonalsstripedwedgedtaperedradialpenWidth gradientAngleshapearrowTo arrowFromedgeEndsnormalinvdotArrowinvDotoDotinvODotnoArrowteediamondoDiamondcrowboxoBoxveeorderingrank 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 parseDotGraph textGraphIDCanonicaliseOptionsCOptsedgesInClustersgroupAttributesdefaultCanonOptionsdotLikeOptions canonicalisecanonicaliseOptionstransitiveReductiontransitiveReductionOptionstoUTF8hPutDothPutCompactDot hGetStricthGetDot writeDotFile readDotFileputDotreadDot runCommandGraphvizCanvasXlibGtkGraphvizOutputWebPWBmpVrmlVmlZVmlTiffSvgZSvgPs2PsPngPlainExtPlainPdfJpegCmapxNPImapNPCmapxImapIcoGifGd2GdFigEpsXDot DotOutputCanonBmp dirCommand undirCommand commandFor runGraphvizrunGraphvizCommand addExtensiongraphvizWithHandlerunGraphvizCanvasrunGraphvizCanvas'isGraphvizInstalledquitWithoutGraphviz DotStatementDEDNSGGADotMdigraphdigraph'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 defLayerSepdefLayerListSepGS directedEdgeslayerSep layerListSep attributeType graphColor clusterColor nodeColor edgeColor AttributeType EdgeAttribute NodeAttributeClusterAttributeSubGraphAttributeGraphAttributeGraphvizStateMmodifyGSgetsGS initialStategetDirectednesssetAttributeTypegetAttributeType setLayerSep getLayerSepsetLayerListSepgetLayerListSepsetColorSchemegetColorScheme$fGraphvizStateMParser$fGraphvizStateMStateT frstIDStringGHC.BaseString restIDStringtoDoubleghc-prim GHC.TypesTrue stringToInt escapeQuotes descapeQuoteskeywordsboolBoolFalse isIDString isKeyworduniquniqBy groupSortBygroupSortCollectByisSingle text-0.11.2.3Data.Text.Lazy.Internal polyparse-1.8 Text.ParserCombinators.Poly.Base adjustErrBadChar parseSignedparseInt parseInt' parseFloat parseFloat' parseQuote$fParseDotBrewerName$fParseDotBrewerScheme$fParseDotColorScheme $fParseDot[]$fParseDotText$fParseDotChar$fParseDotBool$fParseDotDouble$fParseDotWord16$fParseDotWord8$fParseDotInteger $fParseDotIntControl.Applicative ApplicativeoptionalliftA3liftA2liftA<**><**><*>puremanysome<|> AlternativegetConstConst unwrapMonad WrapMonad WrappedMonad unwrapArrow WrapArrow WrappedArrow getZipListZipList Data.Functor<$><$%Text.ParserCombinators.Poly.StateTextreparsestGetstQuerystUpdate many1Satisfy manySatisfyonFailsatisfyeofnextPParser manyFinally' manyFinally bracketSepsepBy1sepBymany1uptoexactlyoneOffailBaddiscardapplyoneOf' adjustErrcommit Commitment PolyParse"Text.ParserCombinators.Poly.ResultSuccessFailure CommittedResultparseOutUnwanted parseUnwantedparsePreProcessorparseLineCommentparseMultiLineCommentparseSplitLineparseConcatStrings parseHTMLqtChar unqtStringqtString addEscapes needsQuotes$fPrintDotBrewerName$fPrintDotBrewerScheme$fPrintDotColorScheme $fPrintDot[]$fPrintDotText$fPrintDotChar$fPrintDotBool$fPrintDotDouble$fPrintDotWord16$fPrintDotWord8$fPrintDotInteger $fPrintDotInt $fShowStateTwl-pprint-text-1.1.0.0$Text.PrettyPrint.Leijen.Text.Monadicgroupnestingcolumnnest linebreaklinetextcharemptyalignhangindent fillBreakfillprettyMrationaldoublefloatintegerintequals backslashdotspacecommacolonsemidquotesquoterbracketlbracketrbracelbraceranglelanglerparenlparenenclosebracketsanglesparensbracesdquotessquotes softbreaksoftline<$$><+><>vcathcatfillCatcatvsephsepfillSepsep punctuate encloseSep semiBracestupledlistText.PrettyPrint.Leijen.Text renderOneLineDoc colour-2.3.3Data.Colour.Internal AlphaColour$fParseDotX11Color$fPrintDotX11ColorparseEdgeBasedPP unqtPortName checkPortName compassLookup$fParseDotCompassPoint$fPrintDotCompassPoint$fParseDotPortPos$fPrintDotPortPos$fParseDotPortName$fPrintDotPortNameColour$fParseDotSVGColor$fPrintDotSVGColorparseNC' 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 parseFieldDef liftEqParse printPortName$fParseDotOverlap parseField parseFieldsparseFieldBooleDiamondopenArrhalfOpenemptyArrinvEmptyspecialArrowParse parseRecordunqtRecordStringrecordEscCharsprintPoint2DUnqt printPoint2D parsePoint2D parseLayerSepparseLayerNameparseLayerName'parseLayerListSepcheckLayerName parseArgscheckDDparseStyleName$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$fParseDotAspectType$fPrintDotAspectType$fParseDotArrowSide$fPrintDotArrowSide$fParseDotArrowFill$fPrintDotArrowFill$fParseDotArrowModifier$fPrintDotArrowModifier$fParseDotArrowShape$fPrintDotArrowShape$fParseDotArrowType$fPrintDotArrowType$fParseDotGraphvizCommand$fPrintDotGraphvizCommandparseEdgeNodesparseBracesBased 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$fToGraphIDIntegerstatementStructurestatementNodesstatementEdgeswithSubGraphIDrenumbermaxSGInt$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.0.2Data.ByteString.Lazy.Internal ByteStringGHC.IO.Handle.TypesHandleGHC.IO.Handle.FDstdoutstdin hGetContents'GHC.IO.Handle.Text hGetContentssignalWhenDoneGHC.MVarMVartoHandleGraphvizResultdefaultExtensionGHC.IOFilePathIO outputCallshowCmdgraphvizWithHandle'$fGraphvizResultGraphvizCanvas$fGraphvizResultGraphvizOutputgeneraliseDotGraph printGStmts parseGStmtsgeneraliseStatements stmtStructure stmtNodes stmtEdgesgeneraliseSubGraph$fFunctorDotStatement$fParseDotDotStatement$fPrintDotDotStatementClusterClclIDclStmtsDotStmtMEMNMCMArunDotexecDottelltellStmt execStmtsconvertStatementsconvertStatement $fMonadDotM$fReadDotGraph$fShowDotGraphEdgeMapNodeMapCI parentCluster clusterAttrs _inCluster _attributes _predecessors _successors GlobAttrsgraphAsnodeAsedgeAsDGvaluesemptyGAaddSuccaddPredaddPSaddEmptyClusterdelSuccdelPreddelPSemToDEcOptions toEdgeMapmapNs getNodeInfo getEdgeInfo globAttrMap clusterPath clusterPath' withValues withClusters toGlobAttrs fromGlobAttrsniSuccniPredtoMapfromMap fgl-5.4.2.4Data.Graph.Inductive.GraphGraphLNodeLEdge isUndirectedGHC.Err undefinedunsafePerformIOstripIDgmapnmapemapEIDeIDeLblidentifierAttrNameidentifierAttribute