TVa      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                                                                                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B CDEFGHIJKLMNOPQRSTUVWX 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 { | } ~                                     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@AB C D E F G H I J K L M N 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 { | } ~                                                          !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`Graphviz-specific exceptions Ivan.Miljenovic@gmail.com Safe-Infered=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. ab  ab Specification of color schemes. Ivan.Miljenovic@gmail.com Safe-Infered +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.com Safe-Inferedc@Several aspects of Dot code are either global or mutable state. cdefghijklmnopqrstuvwxyz{|}~cdefghijklmnopqrstuvwxyz{|}cdefghijklqponmrstuvwxyz{|}~Internal utility functions Ivan.Miljenovic@gmail.com Safe-Infered  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.com Safe-Infered: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. R'Parse and discard optional 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. aFor 6-like data structures where the presence of the field 1 name without a value implies a default value. C56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkw3456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk9:56789=?;<>F@ACB34DXGHMNEOPQRSTUVWYZf\gh[]^_`abcdeIJKLijk?56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkPre-process imported Dot code. Ivan.Miljenovic@gmail.com Safe-Inferedl9Remove unparseable features of Dot, such as comments and D multi-line strings (which are converted to single-line strings). llll/Helper functions for converting to Dot format. Ivan.Miljenovic@gmail.com Safe-Infered mDA class used to correctly print parts of the Graphviz Dot language.  Minimal implementation is n. n>The unquoted representation, for use when composing values to $ produce a larger printing value. o>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 n. p: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. qThe quoted form of p; defaults to wrapping double  quotes around the result of p (since the default 7 implementation has characters that must be quoted). r1A type alias to indicate what is being produced. s"Correctly render Graphviz output. tAConvert to DotCode; note that this has no indentation, as we can F only have one of indentation and (possibly) infinite line lengths. u For use with OverloadedStrings* to avoid ambiguous type variable errors. v For use with OverloadedStrings* to avoid ambiguous type variable errors. {&Escape the specified chars as well as ". |&Escape the specified chars as well as " and then wrap the  result in quotes. mnopqrstuvwxyz{|}~V      !"#$%&'()*+,-.mnopqrstuvwxyz{|}~rsmnopquvtw{|xyz}~mnopqrstuvwxyz{|}~Specification of X11 colors. Ivan.Miljenovic@gmail.com Safe-InferedAThe 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{|}~01$      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~$~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      "~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      01%Internal Attribute value definitions Ivan.Miljenovic@gmail.com Safe-Infered: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. 25When attached to a node in a DotEdge definition, the   and the  can be in separate quotes. 2345678923  23456789 Specification of SVG colors. Ivan.Miljenovic@gmail.com Safe-Infered,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. B Convert an  to its equivalent : value.       !"#$%&'()*+,-./0123456789:;<=>?@AB;<      !"#$%&'()*+,-./0123456789:;<=>?@ABA@?>=<;:9876543210/.-,+*)('&%$#"!      BA@?>=<;:9876543210/.-,+*)('&%$#"!      B;< Specification of Brewer colors. Ivan.Miljenovic@gmail.com Safe-InferedCThis value should be between 1 and the level of the  - being used. CD(  !"#$%&'()*+,-.CD(-. ,+*)('&%$#"!  CDCD4Specification of Color-related types and functions. Ivan.Miljenovic@gmail.com Safe-InferedE/More easily convert named colors to an overall G value. 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. UAttempt to convert a G into a : value with an alpha  channel. The use of =" is because the RGB values of the  Cs haven',t been stored here (primarily for licensing  reasons). V Convert a : value to an Q G. W 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"). EFGHIJKLMNOPQRSTUVW?@ABC/012EFGHIJKLMNOPQRSTUVW/210GQOKJIHRSTRSTPLMNEFUVW EFGQOKJIHRSTRSTPLMNUVW?@ABC /Specification of HTML-like types for Graphviz. Ivan.Miljenovic@gmail.com Safe-Infered-XASpecifies 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 D space than required, this value determines where the extra space ) is placed above and below the object. `Default value. bASpecifies 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. c# 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. eDefault value. gNote that not all g values are valid everywhere: 7 see the comments for each one on where it is valid. h Valid for: , . i Valid for: , . j Valid for: , . Has an alias of TOOLTIP. k Valid for: , . l Valid for: . m Valid for: . n Valid for: . o Valid for: , . p Valid for: , . q Valid for: , . Requires Graphviz >= 2.29.0 r Valid for: , . s Valid for: , . t Valid for: , . Default is . u Valid for: , . v Valid for: . Default is 1. w Valid for: , . x Valid for: , . Default is 2 ; maximum is 127. y Valid for: , . Default is 2. z 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 X and l. )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. D  [] denotes empty FONT tags;  E 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 b  g; 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 . [XYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~FGHIJKLMNOPQRSTUVWXYZ[EXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Eg~}|{zyxwvutsrqponmlkjihbfedc^a`_X]\[ZY#X]\[ZY^a`_bfedcg~}|{zyxwvutsrqponmlkjihFGHIJKLMNOPQRSTUVWXYZ['Definition of the Graphviz attributes. Ivan.Miljenovic@gmail.com Safe-InferedOnly 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 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. %Must specify the record shape with a W. %Must specify the record shape with a W. Has synonym of none. 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. -Controls how (and if) edges are represented.  fdp only $Sort by cols, sort  by user, number of  rows/cols ),If non-negative, then packs; otherwise doesn't. 1(Draw incoming edges in order specified. 2(Draw outgoing edges in order specified. 30A list of layer names. The names should all be 6 values, 9 and when printed will use an arbitrary character from   defLayerSep. 5;You should not have any layer separator characters for the  6 option, as they won't be parseable. 6Should not be a number of all. ? Only when mode == ` BOnly when sfdp is  available, E  is equivalent to  D 1000. J Can only be D for  3 or greater. K)Input to Graphviz only: specify that the $ node position should not change. MUse a two-step process. N*Make node close to old center of neighbor O&Make node close to center of neighbor P No effect Q?Specifies the sub-values of a record-based label. By default, , the cells are laid out horizontally; use R to change C the orientation of the fields (can be applied recursively). To ' change the default orientation, use . TWill result in no label for  that cell. V,A RecordFields value should never be empty. XFor nodes only; requires  either  or   as the shape. YIf  is used, the   value is the entire  "shape"; if anything else  except  is used then  the  is embedded  within the shape. d Either a \ or a (2D) F (i.e. created with  A). g Only when mode == `. k/Specify where to place arrow heads on an edge. lDraw an undirected edge. m&Draw arrows on both ends of the edge. n+Draw a reverse directed edge with an arrow  to the node it's coming from. o*Draw a directed edge with an arrow to the  node it's pointing go. t.Should only have 2D points (i.e. created with A). yBRepresents 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 W,  or  , then \n, \l and \r split the label into lines > centered, left-justified and right-justified respectively. 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 5 is  for any potential  custom attribute name. 0The name for an UnknownAttribute; must satisfy 5. >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: N; Default: 0.0; Minimum:  -MAXFLOAT, -1000  Valid for: EN; Default: Z ""; 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: Z ""  Valid for: E; Default: ; Parsing Default:   Valid for: E; Default: ""; Notes: svg, map only  Valid for: G; Default: ""; Notes : svg only  Valid for: ENC  Valid for: G; Notes: fdp, neato only  Valid for: G; 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; Notes : dot only  Valid for: N; Default: ""  Valid for: N; Default:   Valid for: G; Default: f 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:   Valid for: G  Valid for: G; Default: f 0.0555 (4 points)  Valid for: G; Default: '; Notes : not dot  Valid for: G; Default: *; Parsing Default: +; Notes : not dot  Valid for: G; Default: -4; Minimum: -1.0e10; Notes : prism only  Valid for: G; Default: E; Parsing Default: E; Notes : not dot  Valid for: G; Default: /  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: c; 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 == b), 200 (mode == c), 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: ]; Minimum: 0; Notes : sfdp only  Valid for: G; Default: 0.0; Notes : neato only  Valid for: E; Default: 1.0 (neato), 0.3 (fdp); Notes: fdp, neato only  Valid for: G; Default: ""  Valid for: G; Default: = " :t"  Valid for: G; Default: 4 []  Valid for: EN  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: P; Notes): sfdp only, requires Graphviz >= 2.28.0  Valid for: E; Default: ""; Notes: svg, map only  Valid for: ENGC; Default: Z "\N" (nodes), Z "" (otherwise)  Valid for: N; Default: ; Parsing Default:   Valid for: G; Default:  []; NotesC: Printing and parsing is OS-specific, requires Graphviz >= 2.29.0  Valid for: N; Default: ""  Valid for: GNE; Default: ""; Notes: svg, postscript, map only  Valid for: N; Default: 0.5; Minimum: 0.02  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: Z ""  Valid for: E; Default: ; Parsing Default:   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   Valid for: ENGC; Default: 14.0; Minimum: 1.0   Valid for: G; Default: system dependent   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: [  LightGray] (nodes), [ ] (clusters)  Valid for: G; Default: f 3; Notes : not dot  Valid for: G; Default: .0001 * # nodes (mode == b), .0001 (mode == c); Notes : neato only  Valid for: E; Default: ""; Notes: svg, cmap only  Valid for: E; Default: none; Notes: svg, map only  Valid for: E; Default: ""; Notes: svg, map only  Valid for: G; Default: 96.0, 0.0; Notes: svg, bitmap output only; " resolution" is a synonym  Valid for: N; Default: 0.0; Minimum: -100.0  Valid for: G; Default: i; Parsing Default: j; Notes : neato only  Valid for: E; Default: o (directed), l (undirected)  Valid for: G; Default: 2; Minimum: 2; Notes: sfdp, fdp, neato only  Valid for: G; Default: 2; Minimum: 2; Notes: sfdp, fdp, neato only  Valid for: G; Default: 1+(avg. len)*sqrt(|V|); Minimum: epsilon; Notes: neato only, only if ( *  Valid for: E; Default: ; Parsing Default:   Valid for: E; Default: ; Parsing Default: ; Notes : dot only  Valid for: G; Default: ; Parsing Default:   Valid for: G; Default: ; Parsing Default: ; Notes : dot only   Valid for: ENG; Default: "" ! Valid for: ENC; Default: [ ] " Valid for: G; Default: s; Notes : dot only # Valid for: G; Default: ; Parsing Default:  $ Valid for: GC; Default: [ ] % Valid for: ENCG; Default: 2 & Valid for: G; Notes : write only ' Valid for: G; Notes : dot only ( Valid for: E; Default:  [(?, )] ) Valid for: E; Default: 1.0; Minimum: 0.0 * Valid for: E; Default:  [(?, )] + Valid for: ENGC; Default: none; Notes: svg, postscript, map only , Valid for: GC; Default: 0.3; Minimum: 0; Notes: sfdp, fdp only - Valid for: G; Default: 0.99; Minimum: 0.0; Notes : neato only .Determine if this  is valid for use with Graphs. /Determine if this ! is valid for use with Clusters. 0Determine if this " is valid for use with SubGraphs. 1Determine if this  is valid for use with Nodes. 2Determine if this  is valid for use with Edges. 3Determine if two  are the same type of . 4(Return the default value for a specific  if possible; graph&cluster values are preferred over node edge values. 5Determine if the provided  value is a valid name for an . 6Create a custom attribute. 76Determines whether or not this is a custom attribute. 9/The value of a custom attribute. Will throw a   if the provided  isn' t a custom  one. :.The name of a custom attribute. Will throw a   if the provided  isn' t a custom  one. ;EReturns all custom attributes and the list of non-custom Attributes. <@Find 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  / values; as such it can also be used to remove  legacy attributes). >9Removes all instances of the specified custom attribute. ?Apply no modifications to an . @ and z ACreate a point with only x and y values.       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@A^_`abcdefghijklmnopqrstuvwxyz{|}~/012EFGHIJKLMNOPQRSTUVW      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@A-,+*)('&%$#"!      34.0/1256789:;<=>WZYXLPONMVQUTSRtukonml}~y|{z?@FGHIJKA "!dfevxwpsrq[^]\>EDCBA@?  021,/.-(+*)#'&%$   _cba`gjih<=9;:587634        "!#'&%$(+*),/.-0213458769;:<=>EDCBA@?FGHIJKLPONMQUTSRVWZYX[^]\_cba`dfegjihkonmlpsrqtuvxwy|{z}~ -,+*)('&%$#"!      ./0123456789:;<=>?@A^_`abcdefghijklmnopqrstuvwxyz{|}~:Common internal functions for dealing with overall types. Ivan.Miljenovic@gmail.com Safe-InferedB An edge in DotGraph. G A node in DotGraph. K'Represents a list of top-level list of  s for the  entire graph/sub-graph. Note that N 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. PAA polymorphic type that covers all possible ID values allowed by % Dot syntax. Note that whilst the 5 and m  instances for ( will properly take care of the special 9 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. LParse the separator (and any other whitespace1 present) between statements. NBCDEFGHIJKLMNOPQRSDBCDEFGHIJKLMNOPQRS@BCDEFGHIJKNMLOOOPSRQ+Consider Attributes equal on constructors. Ivan.Miljenovic@gmail.com Safe-InferedDefined as a wrapper around  where equality is based 2 solely upon the constructor, not the contents. Create lookups for  Attributes. Ivan.Miljenovic@gmail.com Safe-InferedT"The available information on each G (both explicit and implicit). U0The available information for each cluster; the [V] B denotes all locations where that particular cluster is located < (more than one location can indicate possible problems). V@The path of clusters that must be traversed to reach this spot. TUV     TUV     TUV      3User-friendly wrappers around Graphviz attributes. Ivan.Miljenovic@gmail.com Safe-Infered%W0A particular way of drawing the end of an edge. X$A particular style type to be used. Y?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. ZThis function only creates a W value to enable you to use  it for  such as , etc. [Equivalent to W . Z; 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 Z for use with the OverloadedStrings  extension. a9Specify the background color of a graph or cluster. For  clusters, if h o is used, then c will  override it. bAs with a., but add a second color to create a gradient ) effect. Requires Graphviz >= 2.29.0. cBSpecify the fill color of a node, cluster or arrowhead. Requires  h o/ for nodes and clusters. For nodes and edges,  if this isn't set then the g value is used instead; for  clusters, a is used. dAs with c., but add a second color to create a gradient ) effect. Requires Graphviz >= 2.29.0. eSpecify the color of text. f4Specify the color of the bounding box of a cluster. gThe 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 f);  If the o X is set, then it defines the 3 background color of nodes and clusters unless c or  a respectively is set. jAlso available for edges. kAlso available for edges. lAlso available for edges. mAlso available for edges. nAlso available for edges. oAlso available for clusters. pAlso available for clusters. qOnly available for nodes. rAOnly available for edges; creates a tapered edge between the two ( nodes. Requires Graphviz >= 2.29.0. s5Available for nodes, clusters and edges. When using  u3, indicates that a radial gradient should be used.  Requires Graphviz >= 2.29.0. tBSpecify the width of lines. Valid for clusters, nodes and edges. uBSpecify the angle at which gradient fills are drawn; for use with  b and d . Requires Graphviz >= 2.29.0. vThe shape of a node. w@How to draw the arrow at the node the edge is pointing to. For ( an undirected graph, requires either y o or  y m. x;How to draw the arrow at the node the edge is coming from.  Requires either y n or y m. y*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 U. A shorter variant than using PortName from Q. @WXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~012klmnoWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~[\]^_`YZ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      abcdefgtuhiXjklnmoqprsvwxykonmlWz{|~}021?WXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ,The canonical representation of Dot graphs. Ivan.Miljenovic@gmail.com Safe-InferedA Dot graph in canonical form. If , no multiple edges are drawn. -Assumed to be an injective mapping function.  !"#$#BCDEFGHIJKLMNOPQRS%PSRQKNMLOOOGHIJBCDEF  !"#$1Definition of the clustering types for Graphviz. Ivan.Miljenovic@gmail.com Safe-Infered5Define 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. %%% &Haskell representation of Dot graphs. Ivan.Miljenovic@gmail.com Safe-Infered?A convenience class to make it easier to convert data types to  P' 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 N for the  overall graph. Return information on the Gs contained within this  . The # parameter indicates if applicable  M should be included. Return information on the Bs contained within this  . The # parameter indicates if applicable  L should be included. >Give any anonymous sub-graphs or clusters a unique identifier  (i.e. there will be no E key in the U  from ). Returns all resultant G s in the  (not including  NodeAttrs). Returns all resultant B 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 *. !+),-./0123656789mnopqBCDEFGHIJKLMNOPQRSTUV8mnopq56789PSRQKNMLOOOGHIJBCDEFUTV +),-./0123'Various algorithms on Graphviz graphs. Ivan.Miljenovic@gmail.com Safe-InferedPlace edges in the clusters  where their nodes are rather  than in the top-level graph.  Put common  as  top-level K. Options that are more like how  dot -Tcanon works. $Implements similar functionality to  dot -Tcanon. However, this " method requires no IO and doesn'#t care about image locations, etc. AThis function will create a single explicit definition for every > node in the original graph and place it in the appropriate B position in the cluster hierarchy. All edges are found in the A deepest cluster that contains both nodes. Currently node and 5 edge attributes are not grouped into global ones. As with , but allow custom .   #IO-related functions for graphviz. Ivan.Miljenovic@gmail.com Safe-Infered Explicitly convert a (lazy) 4 to a  value using  UTF-8 encoding, throwing a  if there is a  decoding error.  Output the DotRepr to the specified 5.  Output the DotRepr to the spcified 5 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 5. Write the specified DotRepr to file. Read in and parse a DotRepr value from a file. Print the specified DotRepr to 6. Read in and parse a DotRepr value from 7. )Run an external command on the specified DotRepr. Remember to  use 8 on the 5 for the output function if  necessary. (If the command was unsuccessful, then a  is  thrown. Command to run Command-line arguments (Obtaining the output; should be strict.   $Functions to run Graphviz commands. Ivan.Miljenovic@gmail.com Safe-Infered0Unlike ', 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   attribute. 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. ?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. #Draw clustered graphs as treemaps,  requires Graphviz >= 2.28.0. %Filter for drawing clustered graphs,  requires Graphviz >= 2.28.0.  For symmetric layout of 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). )The default command for directed graphs. +The default command for undirected graphs. @The appropriate (default) Graphviz command for the given graph. 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 9 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 5 -> : a function must fully consume  the input from the 5; e.g. use strict  ByteStrings rather  than lazy ones. (If the command was unsuccessful, then a  is  thrown. BRun the chosen Graphviz command on this graph and render it using  the given canvas type. ARun the recommended Graphviz command on this graph and render it  using the given canvas type. 4Which command to run The  to use The  type Extract the output The error or the result. ;<22;<,Alternate definition of the Graphviz types. Ivan.Miljenovic@gmail.com Safe-Infered@The internal representation of a generalised graph in Dot form. If , no multiple edges are drawn. =-Assumed to be an injective mapping function.    >?@ABC=DEFGHI#BCDEFGHIJKLMNOPQRS   %   PSRQKNMLOOOGHIJBCDEF   >?@ABC=DEFGHI+A monadic interface for making Dot graphs. Ivan.Miljenovic@gmail.com Safe-Infered The actual monad; as with  " but allows you to return a value E within the do-block. The actual implementation is based upon the  Writer monad.  +The monadic representation of a Dot graph. 9Create 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. 0Create a undirected dot graph with no graph ID.  Add graph sub-graphcluster attributes. Add global node attributes. Add global edge attributes "Add a named cluster to the graph. Add a node to the graph. ,Add a node with no attributes to the graph. Add an edge to the graph.  Add an edge with no attributes.  An alias for % to make edges look more undirected.   JPQRS    PSRQ  J+A graph-like representation of Dot graphs. Ivan.Miljenovic@gmail.com Safe-Infered&@The decomposition of a node from a dot graph. Any loops should  be found in ! rather than   . Note also  that these are created/consumed as if for directed graphs. '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 - into the graph. Assumes that the specified : node is not in the graph but that all endpoints in the  ! and   (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 0 are not quite inverses, as this D function will add in the cluster if it does not yet exist in the  graph, but 0 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 variant of '# that takes in a DotNode (not in a  cluster). )BAdd 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. * A variant of ) that takes a B value. +?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. ,HSpecify the parent of the cluster; adds both in if not already present. ->Specify the attributes of the cluster; adds it if not already  present. .!Create a graph with no clusters. /@Convert this DotGraph into canonical form. All edges are found / in the outer graph rather than in clusters. 0A 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. 1As with 0, but do not specify which node to  decompose. 2ARecursively 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. 3?Delete the specified node from the graph; returns the original  graph if that node isn' t present. 4=Delete all edges between the two nodes; returns the original  graph if there are no edges. 5BDeletes the specified edge from the DotGraph (note: for unordered - graphs both orientations are considered). 6As with 5 but takes a B rather than individual  values. 7>Delete the specified cluster, and makes any clusters or nodes = within it be in its root cluster (or the overall graph if  required). 8?Remove clusters with no sub-clusters and no nodes within them. 9 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. ?APredecessor edges for the specified node. For undirected graphs  equivalent to A. @?Successor edges for the specified node. For undirected graphs  equivalent to A. AAll edges involving this node. B6Which cluster (or the root graph) is this cluster in? D+Convert any existing DotRepr instance to a ". EBConvert 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 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). K+Uses the ParseDot instance for generalised s. L)Uses the PrintDot instance for canonical s. M If the graph is the output from &, then it should be safe to  substitute E for . N It should be safe to substitute E for   in the output of this. 3 !"#$%&'%The cluster the node can be found in  (Nothing refers to the root graph). ()*+!The identifier for this cluster. The parent of this cluster  (Nothing refers to the root  graph) ,-./0123456789:;<=>?@ABCDEKLOPQRMN8BCDEFGHIJPQRS !"#$%&'()*+,-./0123456789:;<=>?@ABCDE8"PSRQ !/ED9:;<BC=>?@A#.$%&'GHIJ()BCDEF*+,-012345678- !"#$%&'()*+,-./0123456789:;<=>?@ABCDEKLOPQRMNGraphviz bindings for Haskell. Ivan.Miljenovic@gmail.com Safe-InferedF8Used to augment an edge label with a unique identifier. G-Augment the current edge label type with the  applied  to that edge. H-Augment the current node label type with the  applied  to that node. I An alias for  when dealing with FGL graphs. J)Defines the parameters used to convert a S into a . A value of type J n nl el cl l indicates that  the S 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 T and U in FGL graphs. The clustering in N can be to arbitrary depth. LTrue if the graph is directed; False  otherwise. MThe top-level global  for the entire  graph. N1A function to specify which cluster a particular  node is in. OThe name/identifier for a cluster. P/Specify which global attributes are applied in  the given cluster. Q The specific  Attributes for a node. R The specific  Attributes for an edge. S A default J" 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 N" from before clustering, then you ! will have to specify your own J value from  scratch (or use U). If you use a custom N! function (which if you actually ? want clusters you should) then you should also override the  (nonsensical) default O. T A variant of S# that enforces that the clustering  type is '()'2 (i.e.: no clustering); this avoids problems when  using S* internally within a function without any . constraint on what the clustering type is. UA J# value where every field is set to  V5. This is useful when you have a function that will ( set some of the values for you (e.g. V ) 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). VDetermine if the provided S is directed or not and set the  value of L appropriately. WConvert a graph to Dot( format, using the specified parameters  to cluster the graph, etc. XAs with W., 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. YA pseudo-inverse to W; "pseudo" in the sense that ) the original node and edge labels aren' t able to be  reconstructed. Z9Run 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 W. Note that the provided J is only used for  L, N and O. \?Add unique edge identifiers to each label. This is useful for C when multiple edges between two nodes need to be distinguished. ]Add the Comment0 to the list of attributes containing the value " of the unique edge identifier. ^ Pass the / through the relevant command and then augment  the S that it came from. _Use the  in the provided  to augment the ( node and edge labels in the provided S. 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 S (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 Y,  you may wish to use X, Y or Z to set them to a value  such as "". FGHIJKLMNOPQRSTUVWXYZ[\]^_`56789mnopq      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~012klmnoBCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~FGHIJKLMNOPQRSTUVWXYZ[\]^_`JKLMNOPQRSTUVIWXYHGZ[F\]^_`FGHIJKLMNOPQRSTUVWXYZ[\]^_`[ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                   ! & + 0 1 6 ; @ E  F H M N S T U V W X Y Z _ d e f k p q r  w | }                       2 7 < = >  ? @ E J K P U V W \ ] b c  h m r   t  y   ~                                                                     ! " # $ % & ' ( ) * + , - . ( / 0 1 2 3 # 2456789:;<=>?@ABCDDEFGHIJKLMNOPQRSTUVWXYZ,[\]^_`abcdefghijklmnopqrstuvwxyz{|}~3      !"#$%&'M()* +,-./0123456789:;p<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwx3yz{|}~O1  2                                                                                  ! " # $ % & ' ()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs     teuvwxyz{|}~} 2                           ! " # $ $%&'()(*(+(,(-(.(/(0(1(2(3(456789:;<=>?@ABCDEFGFHFIFJKLMNOPQRSTUVWXYZXY[XY\XY]XY^XY_XY`XYaXYbXYcXYdXYeXYfXYgXYhXYiXYjXYkXYlXYmXYnXYoXYpXYqXYrXYsXYtXYuXYvXYwXYxXYyXYzXY{XY|XY}XY~XYXYXYXYXYXYXYXYXYXYXYXY&XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX                              !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{ | } ~                             graphviz-2999.13.0.2Data.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 parseField parseFieldsparseFieldBoolparseFieldsBool parseFieldDefparseFieldsDefcommaSep 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 NamedColortoColorColorHSVhue saturationvalueRGBAalphaRGBredgreenbluetoColour 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 DiagonalsFilled InvisibleSolidDottedDashed StyleItemSItemSTStyle RandomStyle SelfStyle RegularStyle StartTypeStartStyleSeed StartSeed StartStyle SmoothTypeTriangleSmoothSpringRNG PowerDist GraphDistAvgDistNoSmoothShapeMRecordRecord ComponentBox3DFolderTabNoteMCircleMSquareMDiamondInvHouse InvTrapezium InvTriangle TripleOctagon DoubleOctagon DoubleCircleOctagonSeptagonHexagonPentagonHouse Parallelogram Trapezium DiamondShape PlainTextTriangleEgg PointShapeCircleEllipsePolygonBoxShapeRankDir FromRight FromBottomFromLeftFromTopRankTypeSinkRankMaxRank SourceRankMinRankSameRankRootNodeName NotCentral IsCentralQuadTypeNoQTFastQTNormalQTSplinePageDirLtLbRtRbTrTlBrBlEdgeType CompoundEdgePolyLineNoEdges LineEdges SplineEdgesPos SplinePosPointPosPackMode PackArray PackGraph PackClustPackNodePack PackMarginDontPackDoPack OutputMode EdgesFirst NodesFirst BreadthFirstOrderInEdgesOutEdges LayerListLLLayerIDLRNameLRInt AllLayers LayerRangeLRSLRIDLayerSepLSepOverlap IpsepOverlap VpscOverlapCompressOverlap PrismOverlapScaleXYOverlaps ScaleOverlaps KeepOverlapsPointxCoordyCoordzCoordforcePos LabelSchemeRemoveAndStraightenCloseToOldCenter CloseToCenter NotEdgeLabel RecordField FlipFields FieldLabelLabelledTarget RecordFields RecordLabel HtmlLabelStrLabelModelCircuitSubSet ShortPathModeTypeIpSepHierKKMajorDPointPValDVal DEConstraintsHierConstraints NoConstraintsEdgeConstraintsDirTypeNoDirBothBackForward ClusterMode NoClusterGlobalLocalRect AspectTypeRatioPassCount RatioOnly ArrowSide BothSides RightSideLeftSide ArrowFill FilledArrow OpenArrow ArrowModifierArrMod arrowFill arrowSide ArrowShapeVeeTeeNormalNoArrowInvDotArrowDiamondCrowBox ArrowTypeAType EscStringCustomAttribute AttributeNameUnknownAttributeZXLabelWeight VoroMarginVertices TrueColorTooltip TailTooltip TailTargetTailPort TailLabelTailClipTailURL StyleSheetStyleStartSplinesSortV SmoothingSkewSizeSides ShowBoxes ShapeFileSep SearchSize SamplePointsSameTailSameHeadRotationRotateRepulsiveForce ReMinCrossRegularRectsRatioRankSepRankQuantumQuadTreePin PeripheriesPenWidthPenColorPagePadOverlapScaling OutputOrder OrientationOrderingNslimit1Nslimit Normalize NoJustifyNodeSepMosekModeMinLenMinDistMCLimitMaxIterMarginLWidthLTailLPosLHeightLHeadLevels LevelsGapLenLayoutLayersLayer Landscape LabelTooltip LabelTargetLabelLoc LabelJust LabelFontSize LabelFontNameLabelFontColor LabelFloat LabelDistance LabelAngleLabelURL ImageScale ImagePathImage HeadTooltip HeadTargetHeadPort HeadLabelHeadClipHeadURLGroup GradientAngle ForceLabelsFontSizeFontPath FontNamesFontName FontColor FillColorESepEpsilon EdgeTooltip EdgeTargetEdgeURLDPI DistortionDirEdgeConstraintsDirDimenDim DefaultDistDecorate Constraint ConcentrateCompoundComment ClusterRankCenterBgColor BoundingBoxAspect ArrowTail ArrowSize ArrowHeadURLKDamping usedByGraphsusedByClustersusedBySubGraphs usedByNodes usedByEdges sameAttributedefaultAttributeValue validUnknowncustomAttributeisCustomisSpecifiedCustom customValue customName findCustomsfindSpecifiedCustomdeleteCustomAttributesdeleteSpecifiedCustomnoModsopenMod createPointDotEdgefromNodetoNodeedgeAttributesDotNodenodeIDnodeAttributesGlobalAttributes EdgeAttrs NodeAttrs GraphAttrsattrsGraphIDDblInt NodeLookup ClusterLookupPathArrow Labellable toLabelValuetoLabel textLabelxLabel xTextLabel forceLabelstextLabelValuebgColorbgColors fillColor fillColors fontColorpenColorcolorstylestylesdasheddottedsolidinvisboldfilledrounded diagonalstaperedradialpenWidth gradientAngleshapearrowTo arrowFromedgeEndsnormalinvdotArrowinvDotoDotinvODotnoArrowteediamondoDiamondcrowboxoBoxveeorderingrank DotSubGraphDotSG isCluster subGraphID subGraphStmts DotStatementsDotStmts attrStmts subGraphs nodeStmts edgeStmtsDotGraph strictGraph directedGraphgraphIDgraphStatements NodeClusterCN ToGraphID toGraphID PPDotRepr ParseDotRepr PrintDotReprDotRepr fromCanonicalgetIDsetIDgraphIsDirected setIsDirected graphIsStrict setStrictness mapDotGraphgraphStructureInformationnodeInformationedgeInformation unAnonymise graphNodes graphEdges printDotGraph parseDotGraph textGraphIDCanonicaliseOptionsCOptsedgesInClustersgroupAttributesdefaultCanonOptionsdotLikeOptions canonicalisecanonicaliseOptionstransitiveReductiontransitiveReductionOptionstoUTF8hPutDothPutCompactDot hGetStricthGetDot writeDotFile readDotFileputDotreadDot runCommandGraphvizCanvasXlibGtkGraphvizOutputWebPWBmpVrmlVmlZVmlTiffSvgZSvgPs2PsPngPlainExtPlainPdfJpegCmapxNPImapNPCmapxImapIcoGifGd2GdFigEpsXDot DotOutputCanonBmpGraphvizCommand PatchworkOsageFdpCircoTwoPiNeatoDot dirCommand undirCommand commandFor runGraphvizrunGraphvizCommand addExtensiongraphvizWithHandlerunGraphvizCanvasrunGraphvizCanvas' 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 clusterID fmtClusterfmtNodefmtEdge defaultParamsnonClusteredParams blankParamssetDirectedness graphToDotgraphElemsToDot dotToGraph graphToGraph dotizeGraph addEdgeIDssetEdgeIDAttribute dotAttributes augmentGraphpreview$fExceptionGraphvizException$fShowGraphvizException GraphvizStateGS directedEdgeslayerSep attributeType graphColor clusterColor nodeColor edgeColor AttributeType EdgeAttribute NodeAttributeClusterAttributeSubGraphAttributeGraphAttributeGraphvizStateMmodifyGSgetsGS initialStategetDirectednesssetAttributeTypegetAttributeType setLayerSep getLayerSepsetColorSchemegetColorScheme$fGraphvizStateMParser$fGraphvizStateMStateT frstIDStringGHC.BaseString restIDStringtoDoubleghc-prim GHC.TypesTrue stringToInt escapeQuotes descapeQuoteskeywordsboolBoolFalse isIDString isKeyworduniquniqBy groupSortBygroupSortCollectByisSingle text-0.11.2.0Data.Text.Lazy.Internal polyparse-1.8 Text.ParserCombinators.Poly.Base adjustErrBadChar$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 CommittedResult$fPrintDotBrewerName$fPrintDotBrewerScheme$fPrintDotColorScheme $fPrintDot[]$fPrintDotText$fPrintDotChar$fPrintDotBool$fPrintDotDouble$fPrintDotWord16$fPrintDotWord8$fPrintDotInteger $fPrintDotInt $fShowStateTwl-pprint-text-1.0.0.0$Text.PrettyPrint.Leijen.Text.Monadicgroupnestingcolumnnest linebreaklinetextcharemptyalignhangindent fillBreakwidthfillprettyMrationaldoublefloatintegerintequals backslashdotspacecommacolonsemidquotesquoterbracketlbracketrbracelbraceranglelanglerparenlparenenclosebracketsanglesparensbracesdquotessquotes softbreaksoftline<$$><+><>vcathcatfillCatcatvsephsepfillSepsep punctuate encloseSep semiBracestupledlistText.PrettyPrint.Leijen.TextDoc colour-2.3.3Data.Colour.Internal AlphaColour$fParseDotX11Color$fPrintDotX11ColorparseEdgeBasedPP compassLookup$fParseDotCompassPoint$fPrintDotCompassPoint$fParseDotPortPos$fPrintDotPortPos$fParseDotPortName$fPrintDotPortNameColour$fParseDotSVGColor$fPrintDotSVGColor Data.MaybeMaybeGHC.ShowShow$fNamedColorSVGColor$fNamedColorX11Color$fNamedColorBrewerColor$fParseDotColor$fPrintDotColorJustNothing$fParseDotScale$fPrintDotScale$fParseDotVAlign$fPrintDotVAlign$fParseDotAlign$fPrintDotAlign$fParseDotAttribute$fPrintDotAttribute $fParseDotImg $fPrintDotImg$fParseDotCell$fPrintDotCell $fParseDotRow $fPrintDotRow$fParseDotTable$fPrintDotTable$fParseDotFormat$fPrintDotFormat$fParseDotTextItem$fPrintDotTextItem$fParseDotLabel$fPrintDotLabelDoubleGHC.EnummaxBound$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$fParseDotLayerRange$fPrintDotLayerRange$fParseDotLayerSep$fPrintDotLayerSep$fParseDotOverlap$fPrintDotOverlap$fParseDotPoint$fPrintDotPoint$fParseDotLabelScheme$fPrintDotLabelScheme$fParseDotRecordField$fPrintDotRecordField$fParseDotModel$fPrintDotModel$fParseDotModeType$fPrintDotModeType$fParseDotDPoint$fPrintDotDPoint$fParseDotDEConstraints$fPrintDotDEConstraints$fParseDotDirType$fPrintDotDirType$fParseDotClusterMode$fPrintDotClusterMode$fParseDotRect$fPrintDotRect$fParseDotAspectType$fPrintDotAspectType$fParseDotArrowSide$fPrintDotArrowSide$fParseDotArrowFill$fPrintDotArrowFill$fParseDotArrowModifier$fPrintDotArrowModifier$fParseDotArrowShape$fPrintDotArrowShape$fParseDotArrowType$fPrintDotArrowTypeparseEdgeNodesparseBracesBased printSGID statementEndEdgeNode stringNum numericValuepartitionGlobalprintGlobAttrType globAttrTypeparseGlobAttrType determineType 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$fPrintDotGraphIDSameAttrSAttrstoSAttrunSame $fOrdSameAttr $fEqSameAttr EdgeState NodeState GraphState recursiveCall getGraphInfo addSubGraphaddGraphGlobals toDotNodes getNodeLookupaddNodeGlobals addEdgeNodes getDotEdgesaddEdgeGlobals$fLabellable(,)$fLabellablePortName$fLabellableRecordField$fLabellable[]$fLabellableTable$fLabellable[]0$fLabellableLabel$fLabellableBool$fLabellableDouble$fLabellableInt$fLabellable[]1$fLabellableChar$fLabellableText$fFunctorDotGraph$fFunctorDotSubGraph$fParseDotDotSubGraph$fPrintDotDotSubGraph$fFunctorDotStatements$fParseDotDotStatements$fPrintDotDotStatements$fParseDotDotGraph$fPrintDotDotGraphclustersToNodesshow GHC.ClassesOrdid$fToGraphIDInteger$fToGraphIDDouble$fToGraphIDInt$fToGraphIDChar $fToGraphID[]$fToGraphIDText$fPPDotReprDotGraphn$fParseDotReprDotGraphn$fPrintDotReprDotGraphn$fDotReprDotGraphnbytestring-0.9.2.1Data.ByteString.Lazy.Internal ByteStringGHC.IO.Handle.TypesHandleGHC.IO.Handle.FDstdoutstdin GHC.IO.HandlehSetBinaryModeGHC.IOFilePathIO$fGraphvizResultGraphvizCanvas$fGraphvizResultGraphvizOutput$fFunctorDotStatement$fParseDotDotStatement$fPrintDotDotStatement $fMonadDotM$fReadDotGraph$fShowDotGraph fgl-5.4.2.4Data.Graph.Inductive.GraphGraphLNodeLEdgeGHC.Err undefinedunsafePerformIOgmapnmapemap