ghc-vis 0.5 → 0.6
raw patch · 11 files changed
+2541/−26 lines, 11 filesdep +SDLdep +svgcairodep ~cairosetup-changed
Dependencies added: SDL, svgcairo
Dependency ranges changed: cairo
Files
- Setup.hs +10/−2
- data/legend_graph.svg +177/−0
- data/legend_list.svg +236/−0
- data/main.ui +311/−0
- data/welcome.svg +1487/−0
- ghc-vis.cabal +23/−6
- ghci +3/−1
- src/GHC/Vis.hs +271/−15
- src/GHC/Vis/Types.hs +2/−0
- src/GHC/Vis/View/Graph/Parser.hs +4/−1
- src/GHC/Vis/View/List.hs +17/−1
Setup.hs view
@@ -3,11 +3,14 @@ import Distribution.Simple import Distribution.Simple.Setup import Distribution.Simple.LocalBuildInfo+import Distribution.PackageDescription (PackageDescription) import System.FilePath -main = defaultMainWithHooks $- simpleUserHooks { postInst = postInstHook (postInst simpleUserHooks) }+main = defaultMainWithHooks $ simpleUserHooks+ { postInst = postInstHook (postInst simpleUserHooks)+ , postConf = postConfHook (postConf simpleUserHooks)+ } postInstHook oldHook args iflags pDesc lbi = do let instDataDir = datadir $ absoluteInstallDirs pDesc lbi (fromFlag $ copyDest defaultCopyFlags)@@ -15,3 +18,8 @@ putStrLn $ "echo \":script " ++ (instDataDir </> "ghci") ++ "\" >> ~/.ghci" oldHook args iflags pDesc lbi++postConfHook oldHook args flags descr buildInfo = case profFlag of+ Flag True -> error "This library cannot be built using profiling. Try invoking cabal with the --disable-library-profiling flag."+ _ -> oldHook args flags descr buildInfo+ where profFlag = configProfLib $ configFlags buildInfo
+ data/legend_graph.svg view
@@ -0,0 +1,177 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="683.32867"+ height="198.40143"+ id="svg3254"+ version="1.1"+ inkscape:version="0.48.3.1 r9886"+ sodipodi:docname="legend_graph.svg">+ <defs+ id="defs3256" />+ <sodipodi:namedview+ id="base"+ pagecolor="#ffffff"+ bordercolor="#666666"+ borderopacity="1.0"+ inkscape:pageopacity="0.0"+ inkscape:pageshadow="2"+ inkscape:zoom="0.98994949"+ inkscape:cx="271.34121"+ inkscape:cy="-73.141686"+ inkscape:document-units="px"+ inkscape:current-layer="g3407"+ showgrid="false"+ inkscape:window-width="638"+ inkscape:window-height="503"+ inkscape:window-x="640"+ inkscape:window-y="519"+ inkscape:window-maximized="0"+ fit-margin-top="30"+ fit-margin-left="30"+ fit-margin-right="30"+ fit-margin-bottom="30" />+ <metadata+ id="metadata3259">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ <dc:title />+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <g+ inkscape:label="Layer 1"+ inkscape:groupmode="layer"+ id="layer1"+ transform="translate(-106.4685,-260.81906)">+ <g+ id="g3419">+ <text+ sodipodi:linespacing="125%"+ id="text3379"+ y="308.88992"+ x="143.44167"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="308.88992"+ x="143.44167"+ id="tspan3381"+ sodipodi:role="line">S# 1</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text3383"+ y="338.35858"+ x="136.52739"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="338.35858"+ x="136.52739"+ id="tspan3385"+ sodipodi:role="line">Thunk</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text3387"+ y="396.6333"+ x="149.4481"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="396.6333"+ x="149.4481"+ id="tspan3389"+ sodipodi:role="line">Fun</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text3391"+ y="367.48367"+ x="154.90495"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="367.48367"+ x="154.90495"+ id="tspan3393"+ sodipodi:role="line">AP</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text3399"+ y="426.0676"+ x="148.57463"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="426.0676"+ x="148.57463"+ id="tspan3401"+ sodipodi:role="line">PAP</tspan></text>+ </g>+ <g+ id="g3407"+ transform="translate(0,-3.0483551)">+ <text+ xml:space="preserve"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ x="229.28676"+ y="309.1387"+ id="text3198"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan3200"+ x="229.28676"+ y="309.1387">Data Constructor S# with argument 1</tspan></text>+ <text+ xml:space="preserve"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ x="229.5125"+ y="338.87601"+ id="text3202"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan3204"+ x="229.5125"+ y="338.87601">Unevaluated Expression</tspan></text>+ <text+ xml:space="preserve"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ x="229.28676"+ y="400.29871"+ id="text3206"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan3208"+ x="229.28676"+ y="400.29871">Function</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text3395"+ y="368.61334"+ x="229.5125"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="368.61334"+ x="229.5125"+ id="tspan3397"+ sodipodi:role="line">Unevaluated Expression (mostly in interpreted code)</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text3403"+ y="428.08789"+ x="229.28676"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="428.08789"+ x="229.28676"+ id="tspan3405"+ sodipodi:role="line">Function (mostly in interpreted code)</tspan></text>+ </g>+ </g>+</svg>
+ data/legend_list.svg view
@@ -0,0 +1,236 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="528.88135"+ height="294.60281"+ id="svg2"+ version="1.1"+ inkscape:version="0.48.3.1 r9886"+ sodipodi:docname="legend_list.svg">+ <defs+ id="defs4" />+ <sodipodi:namedview+ id="base"+ pagecolor="#ffffff"+ bordercolor="#666666"+ borderopacity="1.0"+ inkscape:pageopacity="0.0"+ inkscape:pageshadow="2"+ inkscape:zoom="0.49497475"+ inkscape:cx="111.81327"+ inkscape:cy="95.144158"+ inkscape:document-units="px"+ inkscape:current-layer="g3014"+ showgrid="false"+ fit-margin-top="30"+ fit-margin-left="30"+ fit-margin-right="30"+ fit-margin-bottom="30"+ inkscape:window-width="638"+ inkscape:window-height="503"+ inkscape:window-x="640"+ inkscape:window-y="14"+ inkscape:window-maximized="0" />+ <metadata+ id="metadata7">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ <dc:title />+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <g+ inkscape:label="Layer 1"+ inkscape:groupmode="layer"+ id="layer1"+ transform="translate(-226.47563,-43.350422)">+ <g+ transform="matrix(1.25,0,0,-1.25,256.47572,261.42618)"+ inkscape:label="block"+ id="g3012">+ <g+ id="g3014">+ <path+ id="path3016"+ style="fill:#80ff80;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60214996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ d="m 0.801,43.704 0,-37.301 c 0,-2.211 1.793,-4.004 4.004,-4.004 l 42.886,0 c 2.211,0 4.004,1.793 4.004,4.004 l 0,37.301 c 0,2.215 -1.793,4.008 -4.004,4.008 l -42.886,0 c -2.211,0 -4.004,-1.793 -4.004,-4.008 z"+ inkscape:connector-curvature="0" />+ <path+ id="path3018"+ style="fill:none;stroke:#000000;stroke-width:1.60214996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ d="m 0.801,25.056 50.894,0"+ inkscape:connector-curvature="0" />+ <text+ xml:space="preserve"+ style="font-size:16.01600075px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ x="16.071358"+ y="-8.1712036"+ id="text5596"+ sodipodi:linespacing="125%"+ transform="scale(1,-1)"><tspan+ sodipodi:role="line"+ id="tspan5598"+ x="16.071358"+ y="-8.1712036">b0</tspan></text>+ <text+ xml:space="preserve"+ style="font-size:16.01600075px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ x="6.785646"+ y="-28.83638"+ id="text5592"+ sodipodi:linespacing="125%"+ transform="scale(1,-1)"><tspan+ sodipodi:role="line"+ id="tspan5594"+ x="6.785646"+ y="-28.83638">S# 1</tspan></text>+ </g>+ </g>+ <g+ transform="matrix(1.25,0,0,-1.25,273.37009,189.72929)"+ inkscape:label="function"+ id="g3060">+ <g+ id="g3062">+ <path+ id="path3064"+ style="fill:#ffff80;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60826504;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ d="m 0.805,25.147 0,-18.722 c 0,-2.219 1.8,-4.02 4.019,-4.02 l 15.813,0 c 2.222,0 4.023,1.801 4.023,4.02 l 0,18.722 c 0,2.223 -1.801,4.024 -4.023,4.024 l -15.813,0 c -2.219,0 -4.019,-1.801 -4.019,-4.024 z"+ inkscape:connector-curvature="0" />+ <text+ id="text3066"+ transform="matrix(1,0,0,-1,4.823543,10.21773)">+ <tspan+ id="tspan3068"+ sodipodi:role="line"+ y="0"+ x="0 5.6290526"+ style="font-size:16.08300781px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">f0</tspan>+ </text>+ </g>+ </g>+ <g+ transform="matrix(1.25,0,0,-1.25,270.54259,309.95433)"+ inkscape:label="link"+ id="g3102">+ <g+ id="g3104">+ <path+ id="path3106"+ style="fill:#8080ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60826504;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ d="m 0.805,25.147 0,-18.722 c 0,-2.219 1.8,-4.02 4.019,-4.02 l 20.336,0 c 2.223,0 4.024,1.801 4.024,4.02 l 0,18.722 c 0,2.223 -1.801,4.024 -4.024,4.024 l -20.336,0 c -2.219,0 -4.019,-1.801 -4.019,-4.024 z"+ inkscape:connector-curvature="0" />+ <text+ id="text3108"+ transform="matrix(1,0,0,-1,4.824073,10.21773)">+ <tspan+ id="tspan3110"+ sodipodi:role="line"+ y="0"+ x="0 10.116212"+ style="font-size:16.08300781px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans">b0</tspan>+ </text>+ </g>+ </g>+ <g+ id="g3146"+ transform="matrix(1.25,0,0,-1.25,272.96947,141.20482)">+ <path+ inkscape:connector-curvature="0"+ d="m 0.805,25.147 0,-18.722 c 0,-2.219 1.8,-4.02 4.019,-4.02 l 16.453,0 c 2.223,0 4.024,1.801 4.024,4.02 l 0,18.722 c 0,2.223 -1.801,4.024 -4.024,4.024 l -16.453,0 c -2.219,0 -4.019,-1.801 -4.019,-4.024 z"+ style="fill:#ff8080;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60826504;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path3148" />+ <text+ transform="matrix(1,0,0,-1,4.823723,10.217731)"+ id="text3150">+ <tspan+ style="font-size:16.08300781px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+ x="0 6.2723732"+ y="0"+ sodipodi:role="line"+ id="tspan3152">t0</tspan>+ </text>+ </g>+ <g+ id="g3188"+ transform="matrix(1.25,0,0,-1.25,266.63856,92.67926)">+ <text+ transform="matrix(1,0,0,-1,-1.060159,1.827738)"+ id="text3190">+ <tspan+ style="font-size:16.08300781px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+ x="0 10.116212 28.547338"+ y="0"+ sodipodi:role="line"+ id="tspan3192">S#1</tspan>+ </text>+ </g>+ <text+ sodipodi:linespacing="125%"+ id="text3198"+ y="88.621712"+ x="345.71429"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="88.621712"+ x="345.71429"+ id="tspan3200"+ sodipodi:role="line">Data Constructor S# with argument 1</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text3202"+ y="127.01498"+ x="347.74588"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="127.01498"+ x="347.74588"+ id="tspan3204"+ sodipodi:role="line">Thunk (unevaluated expression)</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text3206"+ y="177.48763"+ x="345.71429"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="177.48763"+ x="345.71429"+ id="tspan3208"+ sodipodi:role="line">Function</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text3210"+ y="236.57452"+ x="346.36203"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="236.57452"+ x="346.36203"+ id="tspan3212"+ sodipodi:role="line">Same as S# 1, but with the name b0</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text3214"+ y="295.7645"+ x="347.52994"+ style="font-size:20.10000038px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ xml:space="preserve"><tspan+ y="295.7645"+ x="347.52994"+ id="tspan3216"+ sodipodi:role="line">A link to the memory location of b0</tspan></text>+ </g>+</svg>
+ data/main.ui view
@@ -0,0 +1,311 @@+<?xml version="1.0" encoding="UTF-8"?>+<interface>+ <requires lib="gtk+" version="2.24"/>+ <!-- interface-naming-policy project-wide -->+ <object class="GtkAboutDialog" id="aboutdialog">+ <property name="can_focus">False</property>+ <property name="border_width">5</property>+ <property name="type_hint">dialog</property>+ <property name="program_name">ghc-vis</property>+ <property name="version">0.6</property>+ <property name="website">http://felsin9.de/nnis/ghc-vis</property>+ <property name="authors">Dennis Felsing</property>+ <child internal-child="vbox">+ <object class="GtkVBox" id="dialog-vbox3">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="spacing">2</property>+ <child internal-child="action_area">+ <object class="GtkHButtonBox" id="dialog-action_area3">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="layout_style">end</property>+ </object>+ <packing>+ <property name="expand">False</property>+ <property name="fill">True</property>+ <property name="pack_type">end</property>+ <property name="position">0</property>+ </packing>+ </child>+ <child>+ <placeholder/>+ </child>+ </object>+ </child>+ </object>+ <object class="GtkImage" id="image1">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="stock">gtk-save</property>+ </object>+ <object class="GtkImage" id="image2">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="stock">gtk-save</property>+ </object>+ <object class="GtkImage" id="image3">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="stock">gtk-new</property>+ </object>+ <object class="GtkImage" id="image4">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="stock">gtk-jump-to</property>+ </object>+ <object class="GtkImage" id="image5">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="stock">gtk-refresh</property>+ </object>+ <object class="GtkImage" id="image6">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="stock">gtk-missing-image</property>+ </object>+ <object class="GtkImage" id="image7">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="stock">gtk-justify-left</property>+ </object>+ <object class="GtkWindow" id="legenddialog">+ <property name="can_focus">False</property>+ <property name="title" translatable="yes">ghc-vis Legend</property>+ <property name="default_width">440</property>+ <property name="default_height">250</property>+ <property name="destroy_with_parent">True</property>+ <property name="type_hint">dialog</property>+ <child>+ <object class="GtkDrawingArea" id="legenddrawingarea">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ </object>+ </child>+ </object>+ <object class="GtkFileChooserDialog" id="savedialog">+ <property name="can_focus">False</property>+ <property name="border_width">5</property>+ <property name="title" translatable="yes">ghc-vis Save</property>+ <property name="role">GtkFileChooserDialog</property>+ <property name="type_hint">dialog</property>+ <property name="action">save</property>+ <child internal-child="vbox">+ <object class="GtkVBox" id="dialog-vbox1">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="spacing">2</property>+ <child internal-child="action_area">+ <object class="GtkHButtonBox" id="dialog-action_area1">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="layout_style">end</property>+ <child>+ <object class="GtkButton" id="cancelbutton">+ <property name="label">gtk-cancel</property>+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">True</property>+ <property name="receives_default">True</property>+ <property name="use_stock">True</property>+ </object>+ <packing>+ <property name="expand">False</property>+ <property name="fill">False</property>+ <property name="position">0</property>+ </packing>+ </child>+ <child>+ <object class="GtkButton" id="savebutton">+ <property name="label">gtk-save</property>+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">True</property>+ <property name="has_focus">True</property>+ <property name="is_focus">True</property>+ <property name="can_default">True</property>+ <property name="has_default">True</property>+ <property name="receives_default">True</property>+ <property name="use_stock">True</property>+ </object>+ <packing>+ <property name="expand">False</property>+ <property name="fill">False</property>+ <property name="position">1</property>+ </packing>+ </child>+ </object>+ <packing>+ <property name="expand">False</property>+ <property name="fill">True</property>+ <property name="pack_type">end</property>+ <property name="position">0</property>+ </packing>+ </child>+ <child>+ <placeholder/>+ </child>+ </object>+ </child>+ <action-widgets>+ <action-widget response="-6">cancelbutton</action-widget>+ <action-widget response="-5">savebutton</action-widget>+ </action-widgets>+ </object>+ <object class="GtkWindow" id="window">+ <property name="can_focus">False</property>+ <property name="title" translatable="yes">ghc-vis</property>+ <property name="default_width">640</property>+ <property name="default_height">480</property>+ <child>+ <object class="GtkVBox" id="vbox1">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <child>+ <object class="GtkMenuBar" id="menubar1">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <child>+ <object class="GtkMenuItem" id="menuitem1">+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="label" translatable="yes">_File</property>+ <property name="use_underline">True</property>+ <child type="submenu">+ <object class="GtkMenu" id="menu1">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <child>+ <object class="GtkImageMenuItem" id="clear">+ <property name="label" translatable="yes">Clear (:clear, c)</property>+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="image">image3</property>+ <property name="use_stock">False</property>+ </object>+ </child>+ <child>+ <object class="GtkImageMenuItem" id="export">+ <property name="label" translatable="yes">Export (:export)</property>+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="image">image2</property>+ <property name="use_stock">False</property>+ </object>+ </child>+ <child>+ <object class="GtkSeparatorMenuItem" id="separatormenuitem1">+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ </object>+ </child>+ <child>+ <object class="GtkImageMenuItem" id="quit">+ <property name="label">gtk-quit</property>+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="use_underline">True</property>+ <property name="use_stock">True</property>+ </object>+ </child>+ </object>+ </child>+ </object>+ </child>+ <child>+ <object class="GtkMenuItem" id="menuitem3">+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="label" translatable="yes">_View</property>+ <property name="use_underline">True</property>+ <child type="submenu">+ <object class="GtkMenu" id="menu2">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <child>+ <object class="GtkImageMenuItem" id="switch">+ <property name="label" translatable="yes">Switch (:switch, v)</property>+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="image">image4</property>+ <property name="use_stock">False</property>+ </object>+ </child>+ <child>+ <object class="GtkImageMenuItem" id="update">+ <property name="label" translatable="yes">Update (:update, u)</property>+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="image">image5</property>+ <property name="use_stock">False</property>+ </object>+ </child>+ </object>+ </child>+ </object>+ </child>+ <child>+ <object class="GtkMenuItem" id="menuitem4">+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="label" translatable="yes">_Help</property>+ <property name="use_underline">True</property>+ <child type="submenu">+ <object class="GtkMenu" id="menu3">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <child>+ <object class="GtkImageMenuItem" id="legend">+ <property name="label" translatable="yes">Legend</property>+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="image">image7</property>+ <property name="use_stock">False</property>+ </object>+ </child>+ <child>+ <object class="GtkImageMenuItem" id="about">+ <property name="label">gtk-about</property>+ <property name="use_action_appearance">False</property>+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="use_underline">True</property>+ <property name="use_stock">True</property>+ </object>+ </child>+ </object>+ </child>+ </object>+ </child>+ </object>+ <packing>+ <property name="expand">False</property>+ <property name="fill">True</property>+ <property name="position">0</property>+ </packing>+ </child>+ <child>+ <object class="GtkDrawingArea" id="drawingarea">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ </object>+ <packing>+ <property name="expand">True</property>+ <property name="fill">True</property>+ <property name="position">1</property>+ </packing>+ </child>+ </object>+ </child>+ </object>+</interface>
+ data/welcome.svg view
@@ -0,0 +1,1487 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="919.96094"+ height="889.92102"+ id="svg3450"+ version="1.1"+ inkscape:version="0.48.3.1 r9886"+ sodipodi:docname="welcome.svg">+ <defs+ id="defs3452">+ <g+ id="g3824">+ <symbol+ id="glyph0-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3827"+ d="m 1.4375,5.125 0,-25.578125 14.5,0 0,25.578125 z m 1.640625,-1.609375 11.25,0 0,-22.328125 -11.25,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3830"+ d="m 2.734375,-22.03125 2.609375,0 0,22.03125 -2.609375,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3833"+ d="m 3.40625,-3.59375 2.984375,0 0,3.59375 -2.984375,0 z m 0,-11.40625 2.984375,0 0,3.59375 -2.984375,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3836"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-4"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3839"+ d="m 8.984375,-22 c -1.261719,2.167969 -2.199219,4.3125 -2.8125,6.4375 C 5.554688,-13.4375 5.25,-11.285156 5.25,-9.109375 c 0,2.1875 0.304688,4.351563 0.921875,6.484375 0.625,2.136719 1.5625,4.285156 2.8125,6.453125 l -2.265625,0 C 5.3125,1.609375 4.253906,-0.570312 3.546875,-2.71875 2.847656,-4.863281 2.5,-6.992188 2.5,-9.109375 c 0,-2.101563 0.347656,-4.21875 1.046875,-6.34375 C 4.242188,-17.585938 5.300781,-19.769531 6.71875,-22 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-5"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3842"+ d="m 15.515625,-20.453125 0,2.796875 c -1.085937,-0.519531 -2.109375,-0.90625 -3.078125,-1.15625 -0.960938,-0.257812 -1.886719,-0.390625 -2.78125,-0.390625 -1.554688,0 -2.757812,0.304687 -3.609375,0.90625 -0.84375,0.605469 -1.265625,1.464844 -1.265625,2.578125 0,0.9375 0.28125,1.648438 0.84375,2.125 0.5625,0.46875 1.628906,0.851562 3.203125,1.140625 l 1.71875,0.359375 c 2.132813,0.40625 3.707031,1.125 4.71875,2.15625 1.019531,1.023438 1.53125,2.390625 1.53125,4.109375 0,2.042969 -0.6875,3.59375 -2.0625,4.65625 -1.375,1.054687 -3.390625,1.578125 -6.046875,1.578125 -1,0 -2.0625,-0.117188 -3.1875,-0.34375 -1.125,-0.21875 -2.292969,-0.550781 -3.5,-1 L 2,-3.875 c 1.15625,0.648438 2.289062,1.136719 3.40625,1.46875 1.113281,0.335938 2.207031,0.5 3.28125,0.5 1.632812,0 2.894531,-0.320312 3.78125,-0.96875 0.894531,-0.644531 1.34375,-1.5625 1.34375,-2.75 0,-1.03125 -0.324219,-1.835938 -0.96875,-2.421875 -0.636719,-0.59375 -1.679688,-1.035156 -3.125,-1.328125 l -1.75,-0.34375 c -2.136719,-0.414062 -3.683594,-1.078125 -4.640625,-1.984375 -0.949219,-0.90625 -1.421875,-2.164063 -1.421875,-3.78125 0,-1.875 0.65625,-3.347656 1.96875,-4.421875 1.320312,-1.082031 3.140625,-1.625 5.453125,-1.625 0.988281,0 2,0.09375 3.03125,0.28125 1.03125,0.179688 2.082031,0.445312 3.15625,0.796875 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-6"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3845"+ d="m 14.828125,-12.765625 -4.125,0 -1.1875,4.734375 4.15625,0 z m -2.125,-8.046875 -1.46875,5.875 4.125,0 1.484375,-5.875 2.265625,0 -1.453125,5.875 4.421875,0 0,2.171875 -4.96875,0 -1.171875,4.734375 4.515625,0 0,2.171875 -5.0625,0 L 13.921875,0 11.65625,0 l 1.453125,-5.859375 -4.140625,0 L 7.5,0 5.21875,0 l 1.484375,-5.859375 -4.46875,0 0,-2.171875 4.984375,0 1.1875,-4.734375 -4.546875,0 0,-2.171875 5.109375,0 1.4375,-5.875 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-7"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3848"+ d="m 3.59375,-2.40625 4.671875,0 0,-16.125 -5.078125,1.015625 0,-2.609375 5.046875,-1.015625 2.875,0 0,18.734375 4.671875,0 0,2.40625 -12.1875,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-8"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3851"+ d="m 2.328125,-22 2.265625,0 c 1.414062,2.230469 2.472656,4.414062 3.171875,6.546875 0.707031,2.125 1.0625,4.242187 1.0625,6.34375 0,2.117187 -0.355469,4.246094 -1.0625,6.390625 C 7.066406,-0.570312 6.007812,1.609375 4.59375,3.828125 l -2.265625,0 C 3.578125,1.660156 4.507812,-0.488281 5.125,-2.625 5.75,-4.757812 6.0625,-6.921875 6.0625,-9.109375 6.0625,-11.285156 5.75,-13.4375 5.125,-15.5625 4.507812,-17.6875 3.578125,-19.832031 2.328125,-22 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-9"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3854"+ d="m 5.5625,-2.40625 9.984375,0 0,2.40625 L 2.125,0 l 0,-2.40625 c 1.082031,-1.125 2.5625,-2.628906 4.4375,-4.515625 1.875,-1.894531 3.050781,-3.117187 3.53125,-3.671875 0.914062,-1.03125 1.554688,-1.898438 1.921875,-2.609375 0.363281,-0.71875 0.546875,-1.421875 0.546875,-2.109375 0,-1.125 -0.398438,-2.035156 -1.1875,-2.734375 -0.78125,-0.707031 -1.808594,-1.0625 -3.078125,-1.0625 -0.898437,0 -1.84375,0.15625 -2.84375,0.46875 -0.992187,0.304687 -2.054687,0.773437 -3.1875,1.40625 l 0,-2.890625 C 3.421875,-20.582031 4.5,-20.929688 5.5,-21.171875 c 1,-0.238281 1.910156,-0.359375 2.734375,-0.359375 2.195313,0 3.945313,0.554688 5.25,1.65625 1.300781,1.09375 1.953125,2.558594 1.953125,4.390625 0,0.867187 -0.167969,1.6875 -0.5,2.46875 -0.324219,0.773437 -0.914062,1.6875 -1.765625,2.75 -0.242187,0.273437 -0.996094,1.0625 -2.265625,2.375 -1.261719,1.304687 -3.042969,3.132813 -5.34375,5.484375 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-10"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3857"+ d="m 11.765625,-11.40625 c 1.375,0.304688 2.441406,0.917969 3.203125,1.84375 0.769531,0.917969 1.15625,2.058594 1.15625,3.421875 0,2.085937 -0.71875,3.699219 -2.15625,4.84375 -1.429688,1.136719 -3.464844,1.703125 -6.109375,1.703125 -0.886719,0 -1.804687,-0.089844 -2.75,-0.265625 -0.9375,-0.1640625 -1.90625,-0.425781 -2.90625,-0.78125 l 0,-2.765625 C 3.003906,-2.9375 3.875,-2.582031 4.8125,-2.34375 5.757812,-2.113281 6.75,-2 7.78125,-2 c 1.789062,0 3.15625,-0.351562 4.09375,-1.0625 0.9375,-0.707031 1.40625,-1.734375 1.40625,-3.078125 0,-1.25 -0.4375,-2.222656 -1.3125,-2.921875 -0.875,-0.707031 -2.089844,-1.0625 -3.640625,-1.0625 l -2.46875,0 0,-2.34375 2.578125,0 c 1.40625,0 2.476562,-0.28125 3.21875,-0.84375 0.75,-0.5625 1.125,-1.375 1.125,-2.4375 0,-1.082031 -0.386719,-1.910156 -1.15625,-2.484375 -0.761719,-0.582031 -1.859375,-0.875 -3.296875,-0.875 -0.78125,0 -1.625,0.08594 -2.53125,0.25 -0.898437,0.167969 -1.882813,0.433594 -2.953125,0.796875 l 0,-2.5625 c 1.082031,-0.300781 2.097656,-0.523438 3.046875,-0.671875 0.957031,-0.15625 1.851563,-0.234375 2.6875,-0.234375 2.175781,0 3.894531,0.496094 5.15625,1.484375 1.269531,0.992187 1.90625,2.324219 1.90625,4 0,1.179687 -0.339844,2.171875 -1.015625,2.984375 -0.667969,0.804688 -1.621094,1.355469 -2.859375,1.65625 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-11"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3860"+ d="m 2.5,-22.03125 6,0 0,2.015625 -3.40625,0 0,21.8125 3.40625,0 0,2.03125 -6,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-12"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3863"+ d="m 8.828125,-22.03125 0,25.859375 -6.015625,0 0,-2.03125 3.390625,0 0,-21.8125 -3.390625,0 0,-2.015625 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-13"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3866"+ d="m 14.125,-7.921875 c 0,-1.914063 -0.398438,-3.414063 -1.1875,-4.5 -0.792969,-1.09375 -1.875,-1.640625 -3.25,-1.640625 -1.375,0 -2.460938,0.546875 -3.25,1.640625 -0.792969,1.085937 -1.1875,2.585937 -1.1875,4.5 0,1.917969 0.394531,3.421875 1.1875,4.515625 0.789062,1.09375 1.875,1.640625 3.25,1.640625 1.375,0 2.457031,-0.546875 3.25,-1.640625 C 13.726562,-4.5 14.125,-6.003906 14.125,-7.921875 z m -8.875,-5.53125 c 0.550781,-0.945313 1.242188,-1.644531 2.078125,-2.09375 0.832031,-0.457031 1.832031,-0.6875 3,-0.6875 1.925781,0 3.488281,0.765625 4.6875,2.296875 1.207031,1.523438 1.8125,3.527344 1.8125,6.015625 0,2.5 -0.605469,4.515625 -1.8125,6.046875 -1.199219,1.523438 -2.761719,2.28125 -4.6875,2.28125 -1.167969,0 -2.167969,-0.230469 -3,-0.6875 C 6.492188,-0.738281 5.800781,-1.4375 5.25,-2.375 l 0,2.375 -2.609375,0 0,-22.03125 2.609375,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-14"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3869"+ d="m 9.21875,-19.265625 c -1.46875,0 -2.578125,0.730469 -3.328125,2.1875 -0.742187,1.449219 -1.109375,3.625 -1.109375,6.53125 0,2.898437 0.367188,5.070313 1.109375,6.515625 0.75,1.449219 1.859375,2.171875 3.328125,2.171875 1.476562,0 2.585938,-0.722656 3.328125,-2.171875 0.75,-1.445312 1.125,-3.617188 1.125,-6.515625 0,-2.90625 -0.375,-5.082031 -1.125,-6.53125 -0.742187,-1.457031 -1.851563,-2.1875 -3.328125,-2.1875 z m 0,-2.265625 c 2.363281,0 4.171875,0.9375 5.421875,2.8125 1.257813,1.875 1.890625,4.601562 1.890625,8.171875 0,3.554687 -0.632812,6.265625 -1.890625,8.140625 -1.25,1.875 -3.058594,2.8125 -5.421875,2.8125 -2.367188,0 -4.179688,-0.9375 -5.4375,-2.8125 -1.25,-1.875 -1.875,-4.585938 -1.875,-8.140625 0,-3.570313 0.625,-6.296875 1.875,-8.171875 1.257812,-1.875 3.070312,-2.8125 5.4375,-2.8125 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-15"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3872"+ d="m 10.953125,-18.65625 -7.21875,11.296875 7.21875,0 z m -0.75,-2.484375 3.609375,0 0,13.78125 3.015625,0 0,2.375 -3.015625,0 0,4.984375 -2.859375,0 0,-4.984375 -9.53125,0 0,-2.765625 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-16"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3875"+ d="M 15.921875,-15.859375 10.1875,-8.140625 16.21875,0 13.140625,0 8.53125,-6.234375 3.90625,0 0.828125,0 7,-8.296875 l -5.640625,-7.5625 3.078125,0 4.203125,5.65625 4.203125,-5.65625 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-17"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3878"+ d="m 5.3125,-20.359375 0,4.5 5.359375,0 0,2.03125 -5.359375,0 0,8.609375 c 0,1.292969 0.175781,2.121094 0.53125,2.484375 C 6.195312,-2.367188 6.914062,-2.1875 8,-2.1875 l 2.671875,0 0,2.1875 L 8,0 C 5.988281,0 4.597656,-0.375 3.828125,-1.125 3.066406,-1.875 2.6875,-3.238281 2.6875,-5.21875 l 0,-8.609375 -1.90625,0 0,-2.03125 1.90625,0 0,-4.5 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-18"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3881"+ d="m 3.40625,-3.59375 2.984375,0 0,2.4375 L 4.0625,3.375 l -1.828125,0 1.171875,-4.53125 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-19"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path3884"+ d="M 9.328125,1.46875 C 8.597656,3.363281 7.878906,4.597656 7.171875,5.171875 6.472656,5.742188 5.539062,6.03125 4.375,6.03125 l -2.078125,0 0,-2.171875 1.53125,0 C 4.546875,3.859375 5.101562,3.6875 5.5,3.34375 5.894531,3 6.332031,2.195312 6.8125,0.9375 L 7.28125,-0.25 0.859375,-15.859375 l 2.765625,0 4.953125,12.40625 4.953125,-12.40625 2.765625,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ </g>+ <g+ id="g4592">+ <symbol+ id="glyph0-0-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4595"+ d="m 1.296875,4.59375 0,-22.921875 13,0 0,22.921875 z M 2.75,3.15625 l 10.09375,0 0,-20.03125 -10.09375,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-1-8"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4598"+ d="m 3.046875,-3.21875 2.671875,0 0,3.21875 -2.671875,0 z m 0,-10.21875 2.671875,0 0,3.21875 -2.671875,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4601"+ d="m 1.140625,4.0625 0,-20.28125 11.5,0 0,20.28125 z M 2.4375,2.78125 l 8.921875,0 0,-17.703125 -8.921875,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4604"+ d="m 7.859375,-14.53125 -3.078125,8.34375 6.171875,0 z m -1.28125,-2.234375 2.578125,0 L 15.546875,0 13.1875,0 l -1.53125,-4.296875 -7.5625,0 L 2.578125,0 0.1875,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4607"+ d="m 4.53125,-14.90625 0,6.296875 2.84375,0 c 1.0625,0 1.878906,-0.269531 2.453125,-0.8125 0.570313,-0.550781 0.859375,-1.332031 0.859375,-2.34375 0,-1 -0.289062,-1.769531 -0.859375,-2.3125 C 9.253906,-14.628906 8.4375,-14.90625 7.375,-14.90625 z M 2.25,-16.765625 l 5.125,0 c 1.882812,0 3.304688,0.429687 4.265625,1.28125 0.957031,0.84375 1.4375,2.085937 1.4375,3.71875 0,1.65625 -0.480469,2.914063 -1.4375,3.765625 -0.960937,0.84375 -2.382813,1.265625 -4.265625,1.265625 l -2.84375,0 L 4.53125,0 2.25,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4610"+ d="m 1.140625,4.0625 0,-20.28125 11.5,0 0,20.28125 z M 2.4375,2.78125 l 8.921875,0 0,-17.703125 -8.921875,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4613"+ d="m 12.3125,-16.21875 0,2.21875 c -0.867188,-0.414062 -1.683594,-0.722656 -2.453125,-0.921875 -0.761719,-0.207031 -1.496094,-0.3125 -2.203125,-0.3125 -1.230469,0 -2.183594,0.242187 -2.859375,0.71875 -0.667969,0.480469 -1,1.164063 -1,2.046875 0,0.742188 0.21875,1.304688 0.65625,1.6875 C 4.898438,-10.40625 5.75,-10.101562 7,-9.875 l 1.359375,0.28125 c 1.695313,0.324219 2.945313,0.890625 3.75,1.703125 0.800781,0.8125 1.203125,1.902344 1.203125,3.265625 0,1.625 -0.546875,2.859375 -1.640625,3.703125 -1.085937,0.8359375 -2.679687,1.25 -4.78125,1.25 -0.792969,0 -1.636719,-0.09375 -2.53125,-0.28125 -0.898437,-0.175781 -1.824219,-0.4375 -2.78125,-0.78125 l 0,-2.34375 c 0.925781,0.523437 1.828125,0.914063 2.703125,1.171875 0.882812,0.261719 1.753906,0.390625 2.609375,0.390625 1.300781,0 2.300781,-0.253906 3,-0.765625 0.707031,-0.507812 1.0625,-1.234375 1.0625,-2.171875 0,-0.820313 -0.257813,-1.46875 -0.765625,-1.9375 -0.5,-0.46875 -1.328125,-0.816406 -2.484375,-1.046875 l -1.375,-0.265625 C 4.628906,-8.035156 3.398438,-8.5625 2.640625,-9.28125 c -0.75,-0.71875 -1.125,-1.71875 -1.125,-3 0,-1.488281 0.519531,-2.660156 1.5625,-3.515625 1.050781,-0.851563 2.492187,-1.28125 4.328125,-1.28125 0.78125,0 1.578125,0.07422 2.390625,0.21875 0.820313,0.148437 1.660156,0.359375 2.515625,0.640625 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4616"+ d="m 11.765625,-10.125 -3.28125,0 -0.9375,3.75 3.296875,0 z m -1.6875,-6.390625 -1.171875,4.671875 3.28125,0 1.171875,-4.671875 1.796875,0 L 14,-11.84375 l 3.515625,0 0,1.71875 -3.953125,0 -0.921875,3.75 3.578125,0 0,1.71875 -4.015625,0 L 11.046875,0 9.25,0 l 1.15625,-4.65625 -3.296875,0 L 5.953125,0 4.140625,0 5.3125,-4.65625 l -3.53125,0 0,-1.71875 3.953125,0 0.9375,-3.75 -3.609375,0 0,-1.71875 4.046875,0 L 8.25,-16.515625 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4619"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-4"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4622"+ d="m 2.859375,-1.90625 3.703125,0 0,-12.796875 -4.03125,0.8125 0,-2.0625 4,-0.8125 2.28125,0 0,14.859375 3.703125,0 0,1.90625 -9.65625,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-5"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4625"+ d="m 4.40625,-1.90625 7.921875,0 0,1.90625 -10.640625,0 0,-1.90625 C 2.539062,-2.800781 3.710938,-4 5.203125,-5.5 6.691406,-7 7.625,-7.96875 8,-8.40625 c 0.726562,-0.8125 1.238281,-1.5 1.53125,-2.0625 0.289062,-0.570312 0.4375,-1.128906 0.4375,-1.671875 0,-0.894531 -0.3125,-1.617187 -0.9375,-2.171875 -0.625,-0.5625 -1.445312,-0.84375 -2.453125,-0.84375 -0.710937,0 -1.460937,0.125 -2.25,0.375 -0.792969,0.242188 -1.636719,0.609375 -2.53125,1.109375 l 0,-2.28125 c 0.914063,-0.375 1.769531,-0.65625 2.5625,-0.84375 0.789063,-0.1875 1.515625,-0.28125 2.171875,-0.28125 1.738281,0 3.125,0.4375 4.15625,1.3125 1.03125,0.867187 1.546875,2.027344 1.546875,3.484375 0,0.6875 -0.132813,1.339844 -0.390625,1.953125 -0.25,0.617187 -0.71875,1.34375 -1.40625,2.1875 -0.1875,0.21875 -0.78125,0.851563 -1.78125,1.890625 -1,1.03125 -2.417969,2.480469 -4.25,4.34375 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-6"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4628"+ d="m 9.328125,-9.046875 c 1.09375,0.242187 1.941406,0.730469 2.546875,1.46875 0.613281,0.730469 0.921875,1.632813 0.921875,2.703125 0,1.65625 -0.574219,2.9375 -1.71875,3.84375 -1.136719,0.90625 -2.75,1.359375 -4.84375,1.359375 -0.710937,0 -1.4375,-0.074219 -2.1875,-0.21875 C 3.304688,-0.0234375 2.539062,-0.226562 1.75,-0.5 l 0,-2.203125 c 0.632812,0.375 1.320312,0.65625 2.0625,0.84375 0.75,0.1875 1.535156,0.28125 2.359375,0.28125 1.414063,0 2.492187,-0.28125 3.234375,-0.84375 0.75,-0.5625 1.125,-1.378906 1.125,-2.453125 0,-0.988281 -0.351562,-1.757812 -1.046875,-2.3125 -0.6875,-0.5625 -1.648437,-0.84375 -2.875,-0.84375 l -1.953125,0 0,-1.859375 2.03125,0 c 1.113281,0 1.96875,-0.222656 2.5625,-0.671875 0.59375,-0.445312 0.890625,-1.085938 0.890625,-1.921875 0,-0.863281 -0.308594,-1.523437 -0.921875,-1.984375 -0.605469,-0.457031 -1.476562,-0.6875 -2.609375,-0.6875 -0.625,0 -1.296875,0.07031 -2.015625,0.203125 -0.710938,0.136719 -1.492188,0.34375 -2.34375,0.625 l 0,-2.03125 c 0.863281,-0.238281 1.671875,-0.414063 2.421875,-0.53125 0.757813,-0.125 1.472656,-0.1875 2.140625,-0.1875 1.71875,0 3.078125,0.398437 4.078125,1.1875 1.007813,0.78125 1.515625,1.839844 1.515625,3.171875 0,0.929688 -0.273438,1.714844 -0.8125,2.359375 -0.53125,0.636719 -1.289062,1.074219 -2.265625,1.3125 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-7"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4631"+ d="m 8.6875,-14.796875 -5.71875,8.953125 5.71875,0 z m -0.59375,-1.96875 2.859375,0 0,10.921875 2.390625,0 0,1.890625 -2.390625,0 0,3.953125 -2.265625,0 0,-3.953125 -7.5625,0 0,-2.1875 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4634"+ d="m 1.203125,4.25 0,-21.171875 12,0 0,21.171875 z m 1.34375,-1.34375 9.3125,0 0,-18.484375 -9.3125,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4637"+ d="m 2.0625,-18.234375 4.96875,0 0,1.671875 -2.8125,0 0,18.046875 2.8125,0 0,1.6875 -4.96875,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4640"+ d="m 7.296875,-18.234375 0,21.40625 -4.96875,0 0,-1.6875 2.8125,0 0,-18.046875 -2.8125,0 0,-1.671875 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4643"+ d="m 7.4375,-18.21875 c -1.042969,1.804688 -1.820312,3.585938 -2.328125,5.34375 -0.511719,1.75 -0.765625,3.53125 -0.765625,5.34375 0,1.804688 0.253906,3.589844 0.765625,5.359375 0.519531,1.773437 1.296875,3.550781 2.328125,5.34375 l -1.875,0 C 4.394531,1.328125 3.519531,-0.476562 2.9375,-2.25 2.351562,-4.019531 2.0625,-5.78125 2.0625,-7.53125 c 0,-1.75 0.285156,-3.503906 0.859375,-5.265625 C 3.503906,-14.566406 4.382812,-16.375 5.5625,-18.21875 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-4"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4646"+ d="m 1.921875,-18.21875 1.875,0 c 1.175781,1.84375 2.050781,3.652344 2.625,5.421875 0.582031,1.761719 0.875,3.515625 0.875,5.265625 0,1.75 -0.292969,3.511719 -0.875,5.28125 -0.574219,1.773438 -1.449219,3.578125 -2.625,5.421875 l -1.875,0 C 2.960938,1.378906 3.738281,-0.398438 4.25,-2.171875 4.757812,-3.941406 5.015625,-5.726562 5.015625,-7.53125 5.015625,-9.34375 4.757812,-11.125 4.25,-12.875 3.738281,-14.632812 2.960938,-16.414062 1.921875,-18.21875 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph4-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4649"+ d="m 1.140625,4.0625 0,-20.28125 11.5,0 0,20.28125 z M 2.4375,2.78125 l 8.921875,0 0,-17.703125 -8.921875,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph4-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4652"+ d="m 4.53125,-8 0,6.140625 3.640625,0 c 1.21875,0 2.117187,-0.25 2.703125,-0.75 0.59375,-0.507813 0.890625,-1.285156 0.890625,-2.328125 0,-1.050781 -0.296875,-1.820312 -0.890625,-2.3125 C 10.289062,-7.75 9.390625,-8 8.171875,-8 z m 0,-6.90625 0,5.0625 3.359375,0 c 1.101563,0 1.925781,-0.207031 2.46875,-0.625 0.539063,-0.414062 0.8125,-1.050781 0.8125,-1.90625 0,-0.84375 -0.273437,-1.472656 -0.8125,-1.890625 -0.542969,-0.425781 -1.367187,-0.640625 -2.46875,-0.640625 z M 2.25,-16.765625 l 5.796875,0 c 1.726563,0 3.0625,0.359375 4,1.078125 0.9375,0.71875 1.40625,1.742188 1.40625,3.0625 0,1.03125 -0.242187,1.851562 -0.71875,2.453125 -0.480469,0.605469 -1.183594,0.980469 -2.109375,1.125 1.113281,0.242187 1.976562,0.742187 2.59375,1.5 0.625,0.761719 0.9375,1.714844 0.9375,2.859375 0,1.492188 -0.511719,2.648438 -1.53125,3.46875 C 11.601562,-0.40625 10.15625,0 8.28125,0 L 2.25,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph4-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4655"+ d="m 14.8125,-15.46875 0,2.390625 c -0.761719,-0.71875 -1.574219,-1.25 -2.4375,-1.59375 -0.867188,-0.351563 -1.789062,-0.53125 -2.765625,-0.53125 -1.917969,0 -3.386719,0.589844 -4.40625,1.765625 -1.011719,1.167969 -1.515625,2.859375 -1.515625,5.078125 0,2.210937 0.503906,3.902344 1.515625,5.078125 1.019531,1.167969 2.488281,1.75 4.40625,1.75 0.976563,0 1.898437,-0.175781 2.765625,-0.53125 0.863281,-0.351562 1.675781,-0.882812 2.4375,-1.59375 l 0,2.359375 c -0.792969,0.542969 -1.632812,0.949219 -2.515625,1.21875 -0.886719,0.269531 -1.824219,0.40625 -2.8125,0.40625 -2.542969,0 -4.542969,-0.773437 -6,-2.328125 -1.460937,-1.550781 -2.1875,-3.671875 -2.1875,-6.359375 0,-2.695313 0.726563,-4.820313 2.1875,-6.375 1.457031,-1.5625 3.457031,-2.34375 6,-2.34375 1,0 1.941406,0.136719 2.828125,0.40625 0.882812,0.273437 1.71875,0.671875 2.5,1.203125 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph4-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4658"+ d="m 9.0625,-15.234375 c -1.648438,0 -2.953125,0.617187 -3.921875,1.84375 -0.96875,1.230469 -1.453125,2.90625 -1.453125,5.03125 0,2.105469 0.484375,3.773437 1.453125,5 0.96875,1.230469 2.273437,1.84375 3.921875,1.84375 1.644531,0 2.945312,-0.613281 3.90625,-1.84375 0.96875,-1.226563 1.453125,-2.894531 1.453125,-5 0,-2.125 -0.484375,-3.800781 -1.453125,-5.03125 -0.960938,-1.226563 -2.261719,-1.84375 -3.90625,-1.84375 z m 0,-1.84375 c 2.351562,0 4.234375,0.792969 5.640625,2.375 1.40625,1.574219 2.109375,3.6875 2.109375,6.34375 0,2.636719 -0.703125,4.746094 -2.109375,6.328125 -1.40625,1.574219 -3.289063,2.359375 -5.640625,2.359375 -2.355469,0 -4.242188,-0.785156 -5.65625,-2.359375 C 2,-3.601562 1.296875,-5.710938 1.296875,-8.359375 c 0,-2.65625 0.703125,-4.769531 2.109375,-6.34375 1.414062,-1.582031 3.300781,-2.375 5.65625,-2.375 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph5-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4661"+ d="m 1.25,4.421875 0,-22.046875 12.5,0 0,22.046875 z m 1.40625,-1.390625 9.703125,0 0,-19.25 -9.703125,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph5-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4664"+ d="M 8.046875,1.265625 C 7.410156,2.898438 6.789062,3.960938 6.1875,4.453125 c -0.605469,0.5 -1.414062,0.75 -2.421875,0.75 l -1.78125,0 0,-1.875 1.3125,0 c 0.613281,0 1.09375,-0.152344 1.4375,-0.453125 C 5.078125,2.582031 5.457031,1.894531 5.875,0.8125 L 6.28125,-0.21875 0.75,-13.671875 l 2.375,0 4.265625,10.6875 4.28125,-10.6875 2.375,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph5-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4667"+ d="M 13.71875,-13.671875 8.78125,-7.015625 13.984375,0 11.328125,0 7.34375,-5.375 3.375,0 0.71875,0 l 5.3125,-7.15625 -4.859375,-6.515625 2.65625,0 3.625,4.875 3.625,-4.875 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph6-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4670"+ d="m 1.140625,4.0625 0,-20.28125 11.5,0 0,20.28125 z M 2.4375,2.78125 l 8.921875,0 0,-17.703125 -8.921875,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph6-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4673"+ d="m 2.171875,-17.46875 2.0625,0 0,17.46875 -2.0625,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph6-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4676"+ d="m 4.40625,-1.90625 7.921875,0 0,1.90625 -10.640625,0 0,-1.90625 C 2.539062,-2.800781 3.710938,-4 5.203125,-5.5 6.691406,-7 7.625,-7.96875 8,-8.40625 c 0.726562,-0.8125 1.238281,-1.5 1.53125,-2.0625 0.289062,-0.570312 0.4375,-1.128906 0.4375,-1.671875 0,-0.894531 -0.3125,-1.617187 -0.9375,-2.171875 -0.625,-0.5625 -1.445312,-0.84375 -2.453125,-0.84375 -0.710937,0 -1.460937,0.125 -2.25,0.375 -0.792969,0.242188 -1.636719,0.609375 -2.53125,1.109375 l 0,-2.28125 c 0.914063,-0.375 1.769531,-0.65625 2.5625,-0.84375 0.789063,-0.1875 1.515625,-0.28125 2.171875,-0.28125 1.738281,0 3.125,0.4375 4.15625,1.3125 1.03125,0.867187 1.546875,2.027344 1.546875,3.484375 0,0.6875 -0.132813,1.339844 -0.390625,1.953125 -0.25,0.617187 -0.71875,1.34375 -1.40625,2.1875 -0.1875,0.21875 -0.78125,0.851563 -1.78125,1.890625 -1,1.03125 -2.417969,2.480469 -4.25,4.34375 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph7-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4679"+ d="m 1.203125,4.25 0,-21.171875 12,0 0,21.171875 z m 1.34375,-1.34375 9.3125,0 0,-18.484375 -9.3125,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph7-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path4682"+ d="m 2.265625,-18.234375 2.15625,0 0,18.234375 -2.15625,0 z"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ </g>+ </defs>+ <sodipodi:namedview+ id="base"+ pagecolor="#ffffff"+ bordercolor="#666666"+ borderopacity="1.0"+ inkscape:pageopacity="0.0"+ inkscape:pageshadow="2"+ inkscape:zoom="0.35"+ inkscape:cx="435.83443"+ inkscape:cy="33.42821"+ inkscape:document-units="px"+ inkscape:current-layer="layer1"+ showgrid="false"+ inkscape:window-width="1278"+ inkscape:window-height="1008"+ inkscape:window-x="0"+ inkscape:window-y="14"+ inkscape:window-maximized="0"+ fit-margin-top="20"+ fit-margin-left="20"+ fit-margin-right="20"+ fit-margin-bottom="20" />+ <metadata+ id="metadata3455">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ <dc:title />+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <g+ inkscape:label="Layer 1"+ inkscape:groupmode="layer"+ id="layer1"+ transform="translate(53.377808,-160.09879)">+ <text+ xml:space="preserve"+ style="font-size:144px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ x="127.14285"+ y="289.50504"+ id="text3464"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan3466"+ x="127.14285"+ y="289.50504">ghc-vis</tspan></text>+ <g+ id="surface287"+ transform="matrix(0.95750438,0,0,0.95750438,7.1095031,538.67303)">+ <g+ id="g3887"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use3889"+ y="43.740131"+ x="3.644531"+ xlink:href="#glyph0-1"+ width="1"+ height="1" />+ <use+ id="use3891"+ y="43.740131"+ x="11.745329"+ xlink:href="#glyph0-2"+ width="1"+ height="1" />+ <use+ id="use3893"+ y="43.740131"+ x="21.56879"+ xlink:href="#glyph0-3"+ width="1"+ height="1" />+ </g>+ <path+ id="path3895"+ transform="matrix(1.457859,0,0,1.457859,53.03246,43.735763)"+ d="m -8.30078e-4,-18.561456 0,46.560687 c 0,2.762506 2.237335078,4.999841 4.999841078,4.999841 l 233.242869,0 c 2.75982,0 4.99984,-2.237335 4.99984,-4.999841 l 0,-46.560687 c 0,-2.762506 -2.24002,-4.999842 -4.99984,-4.999842 l -233.242869,0 c -2.762506,0 -4.999841078,2.237336 -4.999841078,4.999842 z"+ style="fill:#7fff7f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <path+ id="path3897"+ transform="matrix(1.457859,0,0,1.457859,53.03246,43.735763)"+ d="m -8.30078e-4,4.717548 243.242550078,0"+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ id="g3899"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use3901"+ y="43.740131"+ x="63.964844"+ xlink:href="#glyph0-4"+ width="1"+ height="1" />+ <use+ id="use3903"+ y="43.740131"+ x="75.340126"+ xlink:href="#glyph0-5"+ width="1"+ height="1" />+ <use+ id="use3905"+ y="43.740131"+ x="93.848099"+ xlink:href="#glyph0-6"+ width="1"+ height="1" />+ <use+ id="use3907"+ y="43.740131"+ x="118.27863"+ xlink:href="#glyph0-3"+ width="1"+ height="1" />+ <use+ id="use3909"+ y="43.740131"+ x="127.54684"+ xlink:href="#glyph0-7"+ width="1"+ height="1" />+ <use+ id="use3911"+ y="43.740131"+ x="146.09753"+ xlink:href="#glyph0-8"+ width="1"+ height="1" />+ <use+ id="use3913"+ y="43.740131"+ x="157.47281"+ xlink:href="#glyph0-2"+ width="1"+ height="1" />+ <use+ id="use3915"+ y="43.740131"+ x="167.29628"+ xlink:href="#glyph0-4"+ width="1"+ height="1" />+ <use+ id="use3917"+ y="43.740131"+ x="178.67157"+ xlink:href="#glyph0-5"+ width="1"+ height="1" />+ <use+ id="use3919"+ y="43.740131"+ x="197.17953"+ xlink:href="#glyph0-6"+ width="1"+ height="1" />+ <use+ id="use3921"+ y="43.740131"+ x="221.61006"+ xlink:href="#glyph0-3"+ width="1"+ height="1" />+ <use+ id="use3923"+ y="43.740131"+ x="230.87828"+ xlink:href="#glyph0-9"+ width="1"+ height="1" />+ <use+ id="use3925"+ y="43.740131"+ x="249.42897"+ xlink:href="#glyph0-8"+ width="1"+ height="1" />+ <use+ id="use3927"+ y="43.740131"+ x="260.80426"+ xlink:href="#glyph0-2"+ width="1"+ height="1" />+ <use+ id="use3929"+ y="43.740131"+ x="270.62772"+ xlink:href="#glyph0-4"+ width="1"+ height="1" />+ <use+ id="use3931"+ y="43.740131"+ x="282.00299"+ xlink:href="#glyph0-5"+ width="1"+ height="1" />+ <use+ id="use3933"+ y="43.740131"+ x="300.51096"+ xlink:href="#glyph0-6"+ width="1"+ height="1" />+ <use+ id="use3935"+ y="43.740131"+ x="324.9415"+ xlink:href="#glyph0-3"+ width="1"+ height="1" />+ <use+ id="use3937"+ y="43.740131"+ x="334.20972"+ xlink:href="#glyph0-10"+ width="1"+ height="1" />+ <use+ id="use3939"+ y="43.740131"+ x="352.76041"+ xlink:href="#glyph0-8"+ width="1"+ height="1" />+ <use+ id="use3941"+ y="43.740131"+ x="364.13568"+ xlink:href="#glyph0-2"+ width="1"+ height="1" />+ <use+ id="use3943"+ y="43.740131"+ x="373.95914"+ xlink:href="#glyph0-11"+ width="1"+ height="1" />+ <use+ id="use3945"+ y="43.740131"+ x="385.33444"+ xlink:href="#glyph0-12"+ width="1"+ height="1" />+ </g>+ <g+ id="g3947"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use3949"+ y="81.322166"+ x="211.80859"+ xlink:href="#glyph0-13"+ width="1"+ height="1" />+ <use+ id="use3951"+ y="81.322166"+ x="230.31656"+ xlink:href="#glyph0-14"+ width="1"+ height="1" />+ </g>+ <g+ id="g3953"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use3955"+ y="177.2245"+ x="3.644531"+ xlink:href="#glyph0-1"+ width="1"+ height="1" />+ <use+ id="use3957"+ y="177.2245"+ x="11.745329"+ xlink:href="#glyph0-9"+ width="1"+ height="1" />+ <use+ id="use3959"+ y="177.2245"+ x="30.296013"+ xlink:href="#glyph0-2"+ width="1"+ height="1" />+ <use+ id="use3961"+ y="177.2245"+ x="40.119473"+ xlink:href="#glyph0-3"+ width="1"+ height="1" />+ </g>+ <path+ id="path3963"+ transform="matrix(1.457859,0,0,1.457859,53.03246,177.22096)"+ d="m -8.30078e-4,-18.562018 0,56.563049 c 0,2.759827 2.237335078,4.999842 4.999841078,4.999842 l 111.298719,0 c 2.76251,0 4.99984,-2.240015 4.99984,-4.999842 l 0,-56.563049 c 0,-2.762506 -2.23733,-4.999841 -4.99984,-4.999841 l -111.298719,0 c -2.762506,0 -4.999841078,2.237335 -4.999841078,4.999841 z"+ style="fill:#7fff7f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <path+ id="path3965"+ transform="matrix(1.457859,0,0,1.457859,53.03246,177.22096)"+ d="m -8.30078e-4,14.719348 121.298400078,0"+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ id="g3967"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use3969"+ y="177.2245"+ x="63.964844"+ xlink:href="#glyph0-4"+ width="1"+ height="1" />+ <use+ id="use3971"+ y="177.2245"+ x="75.340126"+ xlink:href="#glyph0-5"+ width="1"+ height="1" />+ <use+ id="use3973"+ y="177.2245"+ x="93.848099"+ xlink:href="#glyph0-6"+ width="1"+ height="1" />+ <use+ id="use3975"+ y="177.2245"+ x="118.27863"+ xlink:href="#glyph0-3"+ width="1"+ height="1" />+ <use+ id="use3977"+ y="177.2245"+ x="127.54684"+ xlink:href="#glyph0-15"+ width="1"+ height="1" />+ <use+ id="use3979"+ y="177.2245"+ x="146.09753"+ xlink:href="#glyph0-8"+ width="1"+ height="1" />+ <use+ id="use3981"+ y="177.2245"+ x="157.47281"+ xlink:href="#glyph0-2"+ width="1"+ height="1" />+ </g>+ <path+ id="path3983"+ transform="matrix(1.457859,0,0,1.457859,53.03246,177.22096)"+ d="m 80.878168,-18.562018 0,23.281684 c 0,2.759826 2.237335,4.999841 4.999841,4.999841 l 25.419881,0 c 2.7625,0 4.99984,-2.240015 4.99984,-4.999841 l 0,-23.281684 c 0,-2.762506 -2.23734,-4.999841 -4.99984,-4.999841 l -25.419881,0 c -2.762506,0 -4.999841,2.237335 -4.999841,4.999841 z"+ style="fill:#7f7fff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ id="g3985"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use3987"+ y="177.2245"+ x="178.23047"+ xlink:href="#glyph0-13"+ width="1"+ height="1" />+ <use+ id="use3989"+ y="177.2245"+ x="196.73843"+ xlink:href="#glyph0-14"+ width="1"+ height="1" />+ </g>+ <g+ id="g3991"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use3993"+ y="229.38857"+ x="122.92188"+ xlink:href="#glyph0-13"+ width="1"+ height="1" />+ <use+ id="use3995"+ y="229.38857"+ x="141.42986"+ xlink:href="#glyph0-7"+ width="1"+ height="1" />+ </g>+ <g+ id="g3997"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use3999"+ y="325.28702"+ x="3.644531"+ xlink:href="#glyph0-16"+ width="1"+ height="1" />+ <use+ id="use4001"+ y="325.28702"+ x="20.899656"+ xlink:href="#glyph0-2"+ width="1"+ height="1" />+ <use+ id="use4003"+ y="325.28702"+ x="30.72312"+ xlink:href="#glyph0-3"+ width="1"+ height="1" />+ </g>+ <path+ id="path4005"+ transform="matrix(1.457859,0,0,1.457859,53.03246,325.28474)"+ d="m -8.30078e-4,-18.562897 0,23.281684 c 0,2.762506 2.237335078,4.999841 4.999841078,4.999841 l 20.567407,0 c 2.759827,0 4.999842,-2.237335 4.999842,-4.999841 l 0,-23.281684 c 0,-2.759826 -2.240015,-4.999841 -4.999842,-4.999841 l -20.567407,0 c -2.762506,0 -4.999841078,2.240015 -4.999841078,4.999841 z"+ style="fill:#ff7f7f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ id="g4007"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use4009"+ y="325.28702"+ x="60.320312"+ xlink:href="#glyph0-17"+ width="1"+ height="1" />+ <use+ id="use4011"+ y="325.28702"+ x="71.752548"+ xlink:href="#glyph0-14"+ width="1"+ height="1" />+ </g>+ <g+ id="g4013"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use4015"+ y="325.28702"+ x="101.23828"+ xlink:href="#glyph0-4"+ width="1"+ height="1" />+ </g>+ <path+ id="path4017"+ transform="matrix(1.457859,0,0,1.457859,53.03246,325.28474)"+ d="m 43.36864,-18.562897 0,23.281684 c 0,2.762506 2.237335,4.999841 4.999841,4.999841 l 25.41988,0 c 2.762506,0 4.999841,-2.237335 4.999841,-4.999841 l 0,-23.281684 c 0,-2.759826 -2.237335,-4.999841 -4.999841,-4.999841 l -25.41988,0 c -2.762506,0 -4.999841,2.240015 -4.999841,4.999841 z"+ style="fill:#7f7fff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ id="g4019"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use4021"+ y="325.28702"+ x="123.54688"+ xlink:href="#glyph0-13"+ width="1"+ height="1" />+ <use+ id="use4023"+ y="325.28702"+ x="142.05486"+ xlink:href="#glyph0-7"+ width="1"+ height="1" />+ </g>+ <g+ id="g4025"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use4027"+ y="325.28702"+ x="171.53906"+ xlink:href="#glyph0-18"+ width="1"+ height="1" />+ </g>+ <path+ id="path4029"+ transform="matrix(1.457859,0,0,1.457859,53.03246,325.28474)"+ d="m 90.146362,-18.562897 0,23.281684 c 0,2.762506 2.237336,4.999841 4.999842,4.999841 l 25.419876,0 c 2.76251,0 4.99984,-2.237335 4.99984,-4.999841 l 0,-23.281684 c 0,-2.759826 -2.23733,-4.999841 -4.99984,-4.999841 l -25.419876,0 c -2.762506,0 -4.999842,2.240015 -4.999842,4.999841 z"+ style="fill:#7f7fff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ id="g4031"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use4033"+ y="325.28702"+ x="191.74219"+ xlink:href="#glyph0-13"+ width="1"+ height="1" />+ <use+ id="use4035"+ y="325.28702"+ x="210.25015"+ xlink:href="#glyph0-14"+ width="1"+ height="1" />+ </g>+ <g+ id="g4037"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use4039"+ y="325.28702"+ x="239.73438"+ xlink:href="#glyph0-8"+ width="1"+ height="1" />+ </g>+ <g+ id="g4041"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use4043"+ y="417.54092"+ x="3.644531"+ xlink:href="#glyph0-19"+ width="1"+ height="1" />+ <use+ id="use4045"+ y="417.54092"+ x="18.778358"+ xlink:href="#glyph0-2"+ width="1"+ height="1" />+ <use+ id="use4047"+ y="417.54092"+ x="28.601822"+ xlink:href="#glyph0-3"+ width="1"+ height="1" />+ </g>+ <path+ id="path4049"+ transform="matrix(1.457859,0,0,1.457859,53.03246,417.53986)"+ d="m -8.30078e-4,-18.563733 0,56.563049 c 0,2.762507 2.237335078,4.999842 4.999841078,4.999842 l 62.763281,0 c 2.762507,0 4.999842,-2.237335 4.999842,-4.999842 l 0,-56.563049 c 0,-2.759827 -2.237335,-4.999841 -4.999842,-4.999841 l -62.763281,0 c -2.762506,0 -4.999841078,2.240014 -4.999841078,4.999841 z"+ style="fill:#7fff7f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <path+ id="path4051"+ transform="matrix(1.457859,0,0,1.457859,53.03246,417.53986)"+ d="m -8.30078e-4,14.717633 72.762964078,0"+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ id="g4053"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use4055"+ y="417.54092"+ x="63.964844"+ xlink:href="#glyph0-4"+ width="1"+ height="1" />+ <use+ id="use4057"+ y="417.54092"+ x="75.340126"+ xlink:href="#glyph0-8"+ width="1"+ height="1" />+ <use+ id="use4059"+ y="417.54092"+ x="86.715416"+ xlink:href="#glyph0-2"+ width="1"+ height="1" />+ </g>+ <path+ id="path4061"+ transform="matrix(1.457859,0,0,1.457859,53.03246,417.53986)"+ d="m 32.342731,-18.563733 0,23.281683 c 0,2.762507 2.237335,4.999842 4.999841,4.999842 l 25.419879,0 c 2.762506,0 4.999841,-2.237335 4.999841,-4.999842 l 0,-23.281683 c 0,-2.759827 -2.237335,-4.999841 -4.999841,-4.999841 l -25.419879,0 c -2.762506,0 -4.999841,2.240014 -4.999841,4.999841 z"+ style="fill:#7f7fff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ id="g4063"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use4065"+ y="417.54092"+ x="107.47266"+ xlink:href="#glyph0-13"+ width="1"+ height="1" />+ <use+ id="use4067"+ y="417.54092"+ x="125.98063"+ xlink:href="#glyph0-9"+ width="1"+ height="1" />+ </g>+ <g+ id="g4069"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use4071"+ y="469.70499"+ x="87.542969"+ xlink:href="#glyph0-13"+ width="1"+ height="1" />+ <use+ id="use4073"+ y="469.70499"+ x="106.05094"+ xlink:href="#glyph0-9"+ width="1"+ height="1" />+ </g>+ </g>+ <text+ xml:space="preserve"+ style="font-size:72px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"+ x="406.8136"+ y="408.48969"+ id="text3468-5"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ x="406.8136"+ y="408.48969"+ id="tspan3472-8">Type :view x in GHCi</tspan><tspan+ sodipodi:role="line"+ x="406.8136"+ y="498.48969"+ id="tspan5130">to visualize expression x</tspan></text>+ <g+ transform="matrix(1.25,0,0,-1.25,439.73215,1037.3623)"+ id="g4843">+ <g+ id="g4845"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 110.125,-23.82 c 0,9.644 -11.727,17.461 -26.191,17.461 -14.465,0 -26.188,-7.817 -26.188,-17.461 0,-9.645 11.723,-17.461 26.188,-17.461 14.464,0 26.191,7.816 26.191,17.461"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4847" />+ </g>+ <g+ id="g4849"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 110.125,-130.52 c 0,13.93 -11.727,25.219 -26.191,25.219 -14.465,0 -26.188,-11.289 -26.188,-25.219 0,-13.929 11.723,-25.218 26.188,-25.218 14.464,0 26.191,11.289 26.191,25.218"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4851" />+ </g>+ <text+ transform="matrix(1,0,0,-1,79.570312,287.62471)"+ id="text4853">+ <tspan+ style="font-size:25.9445858px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+ x="0"+ y="0"+ id="tspan4855">:</tspan>+ </text>+ <g+ id="g4857"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 105.273,-217.82 c 0,13.929 -22.582,25.218 -50.437,25.218 -27.859,0 -50.441,-11.289 -50.441,-25.218 0,-13.93 22.582,-25.219 50.441,-25.219 27.855,0 50.437,11.289 50.437,25.219"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4859" />+ </g>+ <text+ transform="matrix(1,0,0,-1,26.703125,200.02351)"+ id="text4861">+ <tspan+ style="font-size:23.21299934px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+ x="0 14.693829 34.099895 41.45842"+ y="0"+ sodipodi:role="line"+ id="tspan4863">S# 1</tspan>+ </text>+ <g+ id="g4865"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 175.113,-217.82 c 0,13.929 -11.722,25.218 -26.187,25.218 -14.465,0 -26.192,-11.289 -26.192,-25.218 0,-13.93 11.727,-25.219 26.192,-25.219 14.465,0 26.187,11.289 26.187,25.219"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4867" />+ </g>+ <text+ transform="matrix(1,0,0,-1,144.55859,200.32393)"+ id="text4869">+ <tspan+ style="font-size:25.9445858px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+ x="0"+ y="0"+ id="tspan4871">:</tspan>+ </text>+ <g+ id="g4873"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 170.266,-392.422 c 0,13.93 -22.582,25.223 -50.442,25.223 -27.855,0 -50.437,-11.293 -50.437,-25.223 0,-13.926 22.582,-25.219 50.437,-25.219 27.86,0 50.442,11.293 50.442,25.219"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4875" />+ </g>+ <text+ transform="matrix(1,0,0,-1,91.695313,25.421945)"+ id="text4877">+ <tspan+ style="font-size:23.21299934px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+ x="0 14.693829 34.099895 41.45842"+ y="0"+ sodipodi:role="line"+ id="tspan4879">S# 1</tspan>+ </text>+ <g+ id="g4881"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 275.023,-305.121 c 0,13.93 -28.66,25.223 -64.019,25.223 -35.356,0 -64.02,-11.293 -64.02,-25.223 0,-13.926 28.664,-25.219 64.02,-25.219 35.359,0 64.019,11.293 64.019,25.219"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4883" />+ </g>+ <text+ transform="matrix(1,0,0,-1,173.66016,112.83297)"+ id="text4885">+ <tspan+ style="font-size:24.19260597px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+ x="0 14.733297 30.023024 45.336945 60.626671"+ y="0"+ sodipodi:role="line"+ id="tspan4887">Thunk</tspan>+ </text>+ <g+ id="g4889"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 288.605,-392.422 c 0,13.93 -22.582,25.223 -50.441,25.223 -27.855,0 -50.437,-11.293 -50.437,-25.223 0,-13.926 22.582,-25.219 50.437,-25.219 27.859,0 50.441,11.293 50.441,25.219"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4891" />+ </g>+ <text+ transform="matrix(1,0,0,-1,210.03516,25.421945)"+ id="text4893">+ <tspan+ style="font-size:23.21299934px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+ x="0 14.693829 34.099895 41.45842"+ y="0"+ sodipodi:role="line"+ id="tspan4895">S# 0</tspan>+ </text>+ <g+ id="g4897"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 83.934,-41.281 c 0,-14.547 0,-35.891 0,-54.321"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4899" />+ </g>+ <path+ inkscape:connector-curvature="0"+ d="m 87.816,328.398 -3.882,-9.699 -2.911,9.699 6.793,0 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+ id="path4901" />+ <g+ id="g4903"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 87.816,-95.602 -3.882,-9.699 -2.911,9.699 6.793,0 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4905" />+ </g>+ <text+ transform="matrix(1,0,0,-1,84.421875,344.52158)"+ id="text4907">+ <tspan+ style="font-size:22.93732834px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVuSans"+ x="0 8.9455585 23.510763 30.758959 45.324162 52.595295 59.866428"+ y="0"+ sodipodi:role="line"+ id="tspan4909">[1,1..]</tspan>+ </text>+ <g+ id="g4911"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 76.176,-154.77 c -2.91,-8.73 -6.789,-19.402 -9.699,-29.101"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4913" />+ </g>+ <path+ inkscape:connector-curvature="0"+ d="m 69.387,239.16 -5.821,-7.762 -0.972,9.704 6.793,-1.942 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+ id="path4915" />+ <g+ id="g4917"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 69.387,-184.84 -5.821,-7.762 -0.972,9.704 6.793,-1.942 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4919" />+ </g>+ <g+ id="g4921"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 99.453,-150.891 c 8.731,-11.64 19.402,-26.187 28.133,-38.8"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4923" />+ </g>+ <path+ inkscape:connector-curvature="0"+ d="m 130.496,236.25 2.91,-9.699 -8.73,5.82 5.82,3.879 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+ id="path4925" />+ <g+ id="g4927"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 130.496,-187.75 2.91,-9.699 -8.73,5.82 5.82,3.879 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4929" />+ </g>+ <g+ id="g4931"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 145.047,-243.039 c -2.91,-10.672 -4.852,-24.25 -6.793,-36.859 -3.879,-26.192 -8.731,-55.293 -12.609,-77.602"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4933" />+ </g>+ <path+ inkscape:connector-curvature="0"+ d="m 128.555,66.5 -4.852,-9.699 -1.937,10.668 6.789,-0.969 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+ id="path4935" />+ <g+ id="g4937"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 128.555,-357.5 -4.852,-9.699 -1.937,10.668 6.789,-0.969 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4939" />+ </g>+ <g+ id="g4941"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 163.477,-239.16 c 7.757,-9.699 16.488,-22.309 24.25,-33.949"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4943" />+ </g>+ <path+ inkscape:connector-curvature="0"+ d="m 190.637,152.828 2.91,-9.699 -7.762,5.82 4.852,3.879 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+ id="path4945" />+ <g+ id="g4947"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 190.637,-271.172 2.91,-9.699 -7.762,5.82 4.852,3.879 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4949" />+ </g>+ <g+ id="g4951"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 186.754,-328.398 c -11.641,-10.672 -24.25,-23.282 -35.891,-34.922"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4953" />+ </g>+ <path+ inkscape:connector-curvature="0"+ d="m 152.805,58.738 -9.7,-4.847 4.848,9.699 4.852,-4.852 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+ id="path4955" />+ <g+ id="g4957"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 152.805,-365.262 -9.7,-4.847 4.848,9.699 4.852,-4.852 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4959" />+ </g>+ <g+ id="g4961"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 218.766,-330.34 c 2.91,-8.73 5.82,-18.43 8.73,-27.16"+ style="fill:none;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4963" />+ </g>+ <path+ inkscape:connector-curvature="0"+ d="m 230.406,67.469 0,-10.668 -5.82,7.758 5.82,2.91 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+ id="path4965" />+ <g+ id="g4967"+ transform="translate(0,424)">+ <path+ inkscape:connector-curvature="0"+ d="m 230.406,-356.531 0,-10.668 -5.82,7.758 5.82,2.91 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none"+ id="path4969" />+ </g>+ </g>+ </g>+</svg>
ghc-vis.cabal view
@@ -1,5 +1,5 @@ name: ghc-vis-version: 0.5+version: 0.6 license: BSD3 license-file: LICENSE category: GHC, Debug, Development@@ -21,16 +21,24 @@ <http://felsin9.de/nnis/ghc-vis/#combined-debugger> tested-with: GHC == 7.4.1, GHC == 7.4.2, GHC == 7.6.1-data-files: ghci+data-files: ghci data/main.ui data/welcome.svg data/legend_graph.svg data/legend_list.svg Extra-source-files: nonghci-test.hs flag graph Default: True Description: "Enable graph view using Graphviz" +flag full+ Default: True+ Description: "Full ghc-vis window: decorations, buttons, legend"++flag sdl+ Default: False+ Description: "SDL window"+ Library Exposed-modules: GHC.Vis- Other-modules: GHC.Vis.Internal GHC.Vis.Types GHC.Vis.View.List GHC.Vis.View.Common+ Other-modules: GHC.Vis.Internal GHC.Vis.Types GHC.Vis.View.List GHC.Vis.View.Common Paths_ghc_vis Default-Language: Haskell2010 Build-depends: base == 4.*, mtl >= 2.0,@@ -50,6 +58,15 @@ xdot >= 0.2 Cpp-options: -DGRAPH_VIEW ---source-repository head--- type: darcs--- location: http://+ if flag(full)+ Build-depends: svgcairo >= 0.12+ Cpp-options: -DFULL_WINDOW++ if flag(sdl)+ Build-depends: SDL >= 0.6,+ cairo >= 0.12.4+ Cpp-options: -DSDL_WINDOW++source-repository head+ type: git+ location: git://r0q.ath.cx/vis
ghci view
@@ -1,4 +1,6 @@-:def vis \_ -> return $ "GHC.Vis.visualization"+:def vis \_ -> return $ "GHC.Vis.vis"+:def mvis \_ -> return $ "GHC.Vis.mvis"+:def svis \_ -> return $ "GHC.Vis.svis" :def view \x -> return $ "GHC.Vis.view (" ++ x ++ ") " ++ show x :def eval \x -> return $ "GHC.Vis.eval \"" ++ x ++ "\"" :def switch \_ -> return $ "GHC.Vis.switch"
src/GHC/Vis.hs view
@@ -34,7 +34,11 @@ > putStrLn "End" -} module GHC.Vis (- visualization, -- TODO: Maybe rename to vis+ vis,+ mvis,+#ifdef SDL_WINDOW+ svis,+#endif view, eval, switch,@@ -50,7 +54,7 @@ import Prelude hiding (error) #endif -import Graphics.UI.Gtk hiding (Box, Signal)+import Graphics.UI.Gtk hiding (Box, Signal, get, response) import qualified Graphics.UI.Gtk.Gdk.Events as E import System.IO@@ -79,6 +83,16 @@ import Graphics.Rendering.Cairo +#ifdef FULL_WINDOW+import Graphics.Rendering.Cairo.SVG+import Paths_ghc_vis as My+#endif++#ifdef SDL_WINDOW+import qualified Graphics.UI.SDL as SDL+import Foreign.Ptr ( castPtr )+#endif+ views :: [View] views = View List.redraw List.click List.move List.updateObjects List.export :@@ -108,13 +122,38 @@ signalTimeout :: Int signalTimeout = 1000000 +#ifdef SDL_WINDOW+black = SDL.Pixel maxBound+white = SDL.Pixel 0xFFFFFF+#endif+ -- | This is the main function. It's to be called from GHCi and launches a -- graphical window in a new thread.-visualization :: IO ()-visualization = do+vis :: IO ()+#ifdef FULL_WINDOW+vis = do vr <- swapMVar visRunning True unless vr $ void $ forkIO visMainThread+#else+vis = mvis+#endif +-- | A minimalistic version of ghc-vis, without window decorations, help and+-- all that other stuff.+mvis :: IO ()+mvis = do+ vr <- swapMVar visRunning True+ unless vr $ void $ forkIO mVisMainThread++#ifdef SDL_WINDOW+-- | SDL version. Not properly working yet. Mainly for testing whether SDL+-- works better than GTK on some platforms.+svis :: IO ()+svis = do+ vr <- swapMVar visRunning True+ unless vr $ void $ forkIO sdlVisMainThread+#endif+ -- | Add expressions with a name to the visualization window. view :: a -> String -> IO () view a name = put $ NewSignal (asBox a) name@@ -140,10 +179,15 @@ -- | Export the current visualization view to a file, format depends on the -- file ending. Currently supported: svg, png, pdf, ps export :: String -> IO ()-export filename = case mbDrawFn of- Right error -> putStrLn error- Left _ -> put $ ExportSignal ((\(Left x) -> x) mbDrawFn) filename+export filename = void $ export' filename +export' :: String -> IO (Maybe String)+export' filename = case mbDrawFn of+ Right error -> do putStrLn error+ return $ Just error+ Left _ -> do put $ ExportSignal ((\(Left x) -> x) mbDrawFn) filename+ return Nothing+ where mbDrawFn = case map toLower (reverse . take 4 . reverse $ filename) of ".svg" -> Left withSVGSurface ".pdf" -> Left withPDFSurface@@ -161,8 +205,8 @@ put :: Signal -> IO () put s = void $ timeout signalTimeout $ putMVar visSignal s -visMainThread :: IO ()-visMainThread = do+mVisMainThread :: IO ()+mVisMainThread = do initGUI window <- windowNew @@ -180,6 +224,50 @@ runCorrect move >>= \f -> f canvas return True + dummy <- windowNew++ setupGUI window canvas dummy++#ifdef SDL_WINDOW+sdlVisMainThread :: IO ()+sdlVisMainThread = SDL.withInit [ SDL.InitVideo ] $ do+ screen <- SDL.setVideoMode 600 600 32 [ SDL.Resizable ]++ SDL.fillRect screen Nothing black++ pixels <- fmap castPtr $ SDL.surfaceGetPixels screen++ -- Here we test the first of the user facing functions added by the patch.+ -- Be sure to use FORMATRGB24 so Cairo and SDL don't conflict about alpha+ -- values. If you need to use alpha channel in your Cairo routines, consider+ -- using an independent Cairo surface to buffer your alpha drawing to.+ --renderWith canvas demo1++ -- And here is the other new function for when you want to hide the+ -- Cairo.Surface from the caller.++ canvas <- createImageSurfaceForData pixels FormatRGB24 600 600 (600 * 4)++ reactThread <- forkIO $ react2++ let idle = do+ e <- SDL.waitEvent+ case e of+ SDL.Quit -> quit reactThread+ otherwise -> do+ putStrLn "Updating"+ s <- List.getState+ SDL.fillRect screen Nothing white+ boundingBoxes <- renderWith canvas $ List.draw s 600 600+ List.updateBoundingBoxes boundingBoxes+ SDL.flip screen+ idle++ idle+#endif++setupGUI :: (WidgetClass w1, WidgetClass w2, WidgetClass w3) => w1 -> w2 -> w3 -> IO ()+setupGUI window canvas legendCanvas = do onMotionNotify canvas False $ \e -> do state <- readIORef visState modifyIORef visState (\s -> s {mousePos = (E.eventX e, E.eventY e)})@@ -316,7 +404,7 @@ widgetShowAll window - reactThread <- forkIO $ react canvas window+ reactThread <- forkIO $ react canvas legendCanvas --onDestroy window mainQuit -- Causes :r problems with multiple windows onDestroy window (quit reactThread) @@ -328,8 +416,64 @@ swapMVar visRunning False killThread reactThread +#ifdef SDL_WINDOW+react2 :: IO b+react2 = do+ -- Timeout used to handle ghci reloads (:r)+ -- Reloads cause the visSignal to be reinitialized, but takeMVar is still+ -- waiting for the old one. This solution is not perfect, but it works for+ -- now.+ mbSignal <- timeout signalTimeout (takeMVar visSignal)+ case mbSignal of+ Nothing -> do+ running <- readMVar visRunning+ if running then react2 else+ -- :r caused visRunning to be reset+ (do swapMVar visRunning True+ timeout signalTimeout (putMVar visSignal UpdateSignal)+ react2)+ Just signal -> do+ case signal of+ NewSignal x n -> modifyMVar_ visBoxes (+ \y -> return $ if (x,n) `elem` y then y else y ++ [(x,n)])+ ClearSignal -> modifyMVar_ visBoxes (\_ -> return [])+ UpdateSignal -> return ()+ SwitchSignal -> doSwitch+ ExportSignal d f -> catch (runCorrect exportView >>= \e -> e d f)+ (\e -> do let err = show (e :: IOException)+ hPutStrLn stderr $ "Couldn't export to file \"" ++ f ++ "\": " ++ err+ return ())++ boxes <- readMVar visBoxes+ performGC -- TODO: Else Blackholes appear. Do we want this?+ -- Blackholes stop our current thread and only resume after+ -- they have been replaced with their result, thereby leading+ -- to an additional element in the HeapMap we don't want.+ -- Example for bad behaviour that would happen then:+ -- λ> let xs = [1..42] :: [Int]+ -- λ> let x = 17 :: Int+ -- λ> let ys = [ y | y <- xs, y >= x ]++ runCorrect updateObjects >>= \f -> f boxes++ --postGUISync $ widgetQueueDraw canvas+ --postGUISync $ widgetQueueDraw legendCanvas+ react2++#ifdef GRAPH_VIEW+ where doSwitch = isGraphvizInstalled >>= \gvi -> if gvi+ then modifyIORef visState (\s -> s {T.view = succN (T.view s), zoomRatio = 1, position = (0, 0)})+ else putStrLn "Cannot switch view: Graphviz not installed"++ succN GraphView = ListView+ succN ListView = GraphView+#else+ where doSwitch = putStrLn "Cannot switch view: Graph view disabled at build"+#endif+#endif+ react :: (WidgetClass w1, WidgetClass w2) => w1 -> w2 -> IO b-react canvas window = do+react canvas legendCanvas = do -- Timeout used to handle ghci reloads (:r) -- Reloads cause the visSignal to be reinitialized, but takeMVar is still -- waiting for the old one. This solution is not perfect, but it works for@@ -338,15 +482,15 @@ case mbSignal of Nothing -> do running <- readMVar visRunning- if running then react canvas window else+ if running then react canvas legendCanvas else -- :r caused visRunning to be reset (do swapMVar visRunning True timeout signalTimeout (putMVar visSignal UpdateSignal)- react canvas window)+ react canvas legendCanvas) Just signal -> do case signal of NewSignal x n -> modifyMVar_ visBoxes (- \y -> if (x,n) `elem` y then return y else return $ y ++ [(x,n)])+ \y -> return $ if (x,n) `elem` y then y else y ++ [(x,n)]) ClearSignal -> modifyMVar_ visBoxes (\_ -> return []) UpdateSignal -> return () SwitchSignal -> doSwitch@@ -368,7 +512,8 @@ runCorrect updateObjects >>= \f -> f boxes postGUISync $ widgetQueueDraw canvas- react canvas window+ postGUISync $ widgetQueueDraw legendCanvas+ react canvas legendCanvas #ifdef GRAPH_VIEW where doSwitch = isGraphvizInstalled >>= \gvi -> if gvi@@ -399,6 +544,117 @@ newPos = (oldPosX * zoom, oldPosY * zoom) return newPos++#ifdef FULL_WINDOW+visMainThread :: IO ()+visMainThread = do+ initGUI++ mainUIFile <- My.getDataFileName "data/main.ui"+ builder <- builderNew+ builderAddFromFile builder mainUIFile++ let get :: forall cls . GObjectClass cls+ => (GObject -> cls)+ -> String+ -> IO cls+ get = builderGetObject builder++ window <- get castToWindow "window"+ canvas <- get castToDrawingArea "drawingarea"++ saveDialog <- get castToFileChooserDialog "savedialog"+ aboutDialog <- get castToAboutDialog "aboutdialog"++ legendDialog <- get castToWindow "legenddialog"+ legendCanvas <- get castToDrawingArea "legenddrawingarea"++ newFilter "*.pdf" "PDF" saveDialog+ newFilter "*.svg" "SVG" saveDialog+ newFilter "*.ps" "PostScript" saveDialog+ newFilter "*.png" "PNG" saveDialog++ onResponse saveDialog $ fileSave saveDialog+ onResponse aboutDialog $ const $ widgetHide aboutDialog++ onDelete saveDialog $ const $ widgetHide saveDialog >> return True+ onDelete aboutDialog $ const $ widgetHide aboutDialog >> return True+ onDelete legendDialog $ const $ widgetHide legendDialog >> return True++ get castToMenuItem "clear" >>= \item -> onActivateLeaf item clear+ get castToMenuItem "switch" >>= \item -> onActivateLeaf item switch+ get castToMenuItem "update" >>= \item -> onActivateLeaf item update+ get castToMenuItem "export" >>= \item -> onActivateLeaf item $ widgetShow saveDialog+ get castToMenuItem "quit" >>= \item -> onActivateLeaf item $ widgetDestroy window+ get castToMenuItem "about" >>= \item -> onActivateLeaf item $ widgetShow aboutDialog+ get castToMenuItem "legend" >>= \item -> onActivateLeaf item $ widgetShow legendDialog++ widgetModifyBg canvas StateNormal backgroundColor+ widgetModifyBg legendCanvas StateNormal backgroundColor++ welcomeSVG <- My.getDataFileName "data/welcome.svg" >>= svgNewFromFile++ legendListSVG <- My.getDataFileName "data/legend_list.svg" >>= svgNewFromFile+ legendGraphSVG <- My.getDataFileName "data/legend_graph.svg" >>= svgNewFromFile++ onExpose canvas $ const $ do+ boxes <- readMVar visBoxes++ if null boxes+ then renderSVGScaled canvas welcomeSVG+ else do+ runCorrect redraw >>= \f -> f canvas+ runCorrect move >>= \f -> f canvas+ return True++ onExpose legendCanvas $ const $ do+ state <- readIORef visState+ renderSVGScaled legendCanvas $ case T.view state of+ ListView -> legendListSVG+ GraphView -> legendGraphSVG++ setupGUI window canvas legendCanvas++fileSave :: FileChooserDialog -> ResponseId -> IO ()+fileSave fcdialog response = do+ case response of+ ResponseOk -> do Just filename <- fileChooserGetFilename fcdialog+ mbError <- export' filename+ case mbError of+ Nothing -> return ()+ Just error -> do+ errorDialog <- messageDialogNew Nothing [] MessageError ButtonsOk error+ widgetShow errorDialog+ onResponse errorDialog $ const $ widgetHide errorDialog+ return ()+ _ -> return ()+ widgetHide fcdialog++newFilter :: FileChooserClass fc => String -> String -> fc -> IO ()+newFilter filterString name dialog = do+ filt <- fileFilterNew+ fileFilterAddPattern filt filterString+ fileFilterSetName filt $ name ++ " (" ++ filterString ++ ")"+ fileChooserAddFilter dialog filt++renderSVGScaled :: (WidgetClass w) => w -> SVG -> IO Bool+renderSVGScaled canvas svg = do+ E.Rectangle _ _ rw2 rh2 <- widgetGetAllocation canvas+ win <- widgetGetDrawWindow canvas+ renderWithDrawable win $ do+ let (cx2, cy2) = svgGetSize svg++ (rw,rh) = (fromIntegral rw2, fromIntegral rh2)+ (cx,cy) = (fromIntegral cx2, fromIntegral cy2)++ -- Proportional scaling+ (sx,sy) = (min (rw/cx) (rh/cy), sx)+ (ox,oy) = (rw/2 - sx*cx/2, rh/2 - sy*cy/2)++ translate ox oy+ scale sx sy+ svgRender svg+#endif -- Zoom into mouse, but only working from (0,0) -- newPos = ( oldPosX + x * zoomRatio s - x * newZoomRatio
src/GHC/Vis/Types.hs view
@@ -28,6 +28,7 @@ import Graphics.UI.Gtk hiding (Box, Signal, Point) import Graphics.Rendering.Cairo +-- | A simple Point type Point = (Double, Double) -- | A function to draw a cairo drawing to a file.@@ -83,6 +84,7 @@ , heapMap' :: HeapMap } +-- | The state of a printing operation type PrintState = MS.State PState -- | Simple representation of objects on the heap, so they can be arranged linearly
src/GHC/Vis/View/Graph/Parser.hs view
@@ -12,6 +12,8 @@ ) where +import Data.List+ import Control.Monad import qualified Data.Text.Lazy as B@@ -85,7 +87,7 @@ mbEdges xs (p,c) = return $ map (\b -> (p, boxPos b)) (allPtrs c) ++ xs boxPos :: Box -> Maybe Int- boxPos b = lookup b $ zip (map fst rhm) [0..]+ boxPos b = elemIndex b $ map fst rhm bcoChildren :: [Box] -> IO [Int] bcoChildren [] = return []@@ -120,6 +122,7 @@ defaultVis :: (Graph gr) => gr String String -> DotGraph Node defaultVis = graphToDot nonClusteredParams -- Somehow (X11Color Transparency) is white, use (RGBA 0 0 0 0) instead+ -- Ordering OutEdges is not strong enough to force edge ordering, might not look good anyway { globalAttributes = [GraphAttrs [BgColor [RGBA 0 0 0 0], FontName fontName, FontSize graphFontSize]] , fmtNode = \ (_,l) -> [toLabel l, FontName fontName, FontSize nodeFontSize] --, fmtNode = \ (_,l) -> [toLabel l, FontName fontName, FontSize nodeFontSize, Style [SItem Filled []], FillColor [RGBA 255 255 255 255], Color [RGBA 0 0 0 255]]
src/GHC/Vis/View/List.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE CPP, RankNTypes #-} {- | Module : GHC.Vis.View.List Copyright : (c) Dennis Felsing@@ -8,6 +8,13 @@ -} module GHC.Vis.View.List ( export,++#ifdef SDL_WINDOW+ getState,+ draw,+ updateBoundingBoxes,+#endif+ redraw, click, move,@@ -91,6 +98,15 @@ boundingBoxes <- render canvas (draw s rw2 rh2) modifyIORef state (\s' -> s' {bounds = boundingBoxes})++#ifdef SDL_WINDOW+getState :: IO State+getState = readIORef state++updateBoundingBoxes :: [(String, Rectangle)] -> IO ()+updateBoundingBoxes boundingBoxes = do+ modifyIORef state (\s' -> s' {bounds = boundingBoxes})+#endif -- | Export the visualization to an SVG file export :: DrawFunction -> String -> IO ()