packages feed

bishbosh 0.0.0.7 → 0.0.0.8

raw patch · 37 files changed

+2560/−2051 lines, 37 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- BishBosh.ContextualNotation.StandardAlgebraic: showsCoordinates :: (Enum x, Enum y) => Coordinates x y -> ShowS
- BishBosh.Model.Game: instance (GHC.Enum.Enum x, GHC.Enum.Enum y, GHC.Classes.Ord x, GHC.Classes.Ord y, GHC.Read.Read x, GHC.Read.Read y, GHC.Show.Show x, GHC.Show.Show y) => BishBosh.Property.ForsythEdwards.ReadsFEN (BishBosh.Model.Game.Game x y)
- BishBosh.Notation.Coordinate: data Coordinate x y
- BishBosh.Notation.Coordinate: instance (GHC.Classes.Eq x, GHC.Classes.Eq y) => GHC.Classes.Eq (BishBosh.Notation.Coordinate.Coordinate x y)
- BishBosh.Notation.Coordinate: instance (GHC.Enum.Enum x, GHC.Enum.Enum y) => GHC.Show.Show (BishBosh.Notation.Coordinate.Coordinate x y)
- BishBosh.Notation.Coordinate: instance (GHC.Enum.Enum x, GHC.Enum.Enum y, GHC.Classes.Ord x, GHC.Classes.Ord y) => GHC.Read.Read (BishBosh.Notation.Coordinate.Coordinate x y)
- BishBosh.Notation.Coordinate: instance BishBosh.Attribute.Rank.Promotable (BishBosh.Notation.Coordinate.Coordinate x y)
- BishBosh.Notation.Coordinate: mkCoordinate :: Move x y -> Maybe Rank -> Coordinate x y
- BishBosh.Notation.Coordinate: mkCoordinate' :: Promotable promotable => Move x y -> promotable -> Coordinate x y
- BishBosh.Notation.Coordinate: origin :: (Int, Int)
- BishBosh.Notation.Coordinate: regexSyntax :: String
- BishBosh.Notation.Coordinate: showsCoordinates :: (Enum x, Enum y) => Coordinates x y -> ShowS
- BishBosh.Notation.MoveNotation: coordinate :: MoveNotation
- BishBosh.Notation.MoveNotation: isCoordinate :: MoveNotation -> Bool
- BishBosh.Property.ForsythEdwards: showsNullField :: ShowS
- BishBosh.Property.ForsythEdwards: showsSeparator :: ShowS
+ BishBosh.Attribute.LogicalColour: instance BishBosh.Property.ExtendedPositionDescription.ReadsEPD BishBosh.Attribute.LogicalColour.LogicalColour
+ BishBosh.Attribute.LogicalColour: instance BishBosh.Property.ExtendedPositionDescription.ShowsEPD BishBosh.Attribute.LogicalColour.LogicalColour
+ BishBosh.Component.Piece: instance BishBosh.Property.ExtendedPositionDescription.ReadsEPD BishBosh.Component.Piece.Piece
+ BishBosh.Component.Piece: instance BishBosh.Property.ExtendedPositionDescription.ShowsEPD BishBosh.Component.Piece.Piece
+ BishBosh.Model.Game: instance (GHC.Enum.Enum x, GHC.Enum.Enum y, GHC.Classes.Ord x, GHC.Classes.Ord y) => BishBosh.Property.ExtendedPositionDescription.ShowsEPD (BishBosh.Model.Game.Game x y)
+ BishBosh.Model.Game: instance (GHC.Enum.Enum x, GHC.Enum.Enum y, GHC.Classes.Ord x, GHC.Classes.Ord y, GHC.Show.Show x, GHC.Show.Show y) => BishBosh.Property.ExtendedPositionDescription.ReadsEPD (BishBosh.Model.Game.Game x y)
+ BishBosh.Model.Game: instance (GHC.Enum.Enum x, GHC.Enum.Enum y, GHC.Classes.Ord x, GHC.Classes.Ord y, GHC.Show.Show x, GHC.Show.Show y) => BishBosh.Property.ForsythEdwards.ReadsFEN (BishBosh.Model.Game.Game x y)
+ BishBosh.Notation.MoveNotation: isPureCoordinate :: MoveNotation -> Bool
+ BishBosh.Notation.MoveNotation: pureCoordinate :: MoveNotation
+ BishBosh.Notation.PureCoordinate: abscissaParser :: Enum x => TextParser x
+ BishBosh.Notation.PureCoordinate: coordinatesParser :: (Enum x, Enum y, Ord x, Ord y) => TextParser (Coordinates x y)
+ BishBosh.Notation.PureCoordinate: data PureCoordinate x y
+ BishBosh.Notation.PureCoordinate: encode :: (Enum x, Enum y) => Coordinates x y -> (ShowS, ShowS)
+ BishBosh.Notation.PureCoordinate: instance (GHC.Classes.Eq x, GHC.Classes.Eq y) => GHC.Classes.Eq (BishBosh.Notation.PureCoordinate.PureCoordinate x y)
+ BishBosh.Notation.PureCoordinate: instance (GHC.Enum.Enum x, GHC.Enum.Enum y) => GHC.Show.Show (BishBosh.Notation.PureCoordinate.PureCoordinate x y)
+ BishBosh.Notation.PureCoordinate: instance (GHC.Enum.Enum x, GHC.Enum.Enum y, GHC.Classes.Ord x, GHC.Classes.Ord y) => GHC.Read.Read (BishBosh.Notation.PureCoordinate.PureCoordinate x y)
+ BishBosh.Notation.PureCoordinate: instance BishBosh.Attribute.Rank.Promotable (BishBosh.Notation.PureCoordinate.PureCoordinate x y)
+ BishBosh.Notation.PureCoordinate: mkPureCoordinate :: Move x y -> Maybe Rank -> PureCoordinate x y
+ BishBosh.Notation.PureCoordinate: mkPureCoordinate' :: Promotable promotable => Move x y -> promotable -> PureCoordinate x y
+ BishBosh.Notation.PureCoordinate: ordinateParser :: Enum y => TextParser y
+ BishBosh.Notation.PureCoordinate: origin :: (Int, Int)
+ BishBosh.Notation.PureCoordinate: readsCoordinates :: (Enum x, Enum y, Ord x, Ord y) => ReadS (Coordinates x y)
+ BishBosh.Notation.PureCoordinate: regexSyntax :: String
+ BishBosh.Notation.PureCoordinate: showsCoordinates :: (Enum x, Enum y) => Coordinates x y -> ShowS
+ BishBosh.Property.ExtendedPositionDescription: class ReadsEPD a
+ BishBosh.Property.ExtendedPositionDescription: class ShowsEPD a
+ BishBosh.Property.ExtendedPositionDescription: readEPD :: ReadsEPD a => String -> a
+ BishBosh.Property.ExtendedPositionDescription: readsEPD :: ReadsEPD a => ReadS a
+ BishBosh.Property.ExtendedPositionDescription: showEPD :: ShowsEPD a => a -> String
+ BishBosh.Property.ExtendedPositionDescription: showsEPD :: ShowsEPD a => a -> ShowS
+ BishBosh.Property.ExtendedPositionDescription: showsNullField :: ShowS
+ BishBosh.Property.ExtendedPositionDescription: showsSeparator :: ShowS
+ BishBosh.State.Board: instance (GHC.Enum.Enum x, GHC.Enum.Enum y, GHC.Classes.Ord x, GHC.Classes.Ord y) => BishBosh.Property.ExtendedPositionDescription.ReadsEPD (BishBosh.State.Board.Board x y)
+ BishBosh.State.Board: instance (GHC.Enum.Enum x, GHC.Enum.Enum y, GHC.Classes.Ord x, GHC.Classes.Ord y) => BishBosh.Property.ExtendedPositionDescription.ShowsEPD (BishBosh.State.Board.Board x y)
+ BishBosh.State.CastleableRooksByLogicalColour: instance (GHC.Enum.Enum x, GHC.Classes.Eq x) => BishBosh.Property.ExtendedPositionDescription.ShowsEPD (BishBosh.State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour x)
+ BishBosh.State.CastleableRooksByLogicalColour: instance (GHC.Enum.Enum x, GHC.Classes.Ord x, GHC.Show.Show x) => BishBosh.Property.ExtendedPositionDescription.ReadsEPD (BishBosh.State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour x)
+ BishBosh.State.MaybePieceByCoordinates: instance (GHC.Enum.Enum x, GHC.Enum.Enum y, GHC.Classes.Ord x, GHC.Classes.Ord y) => BishBosh.Property.ExtendedPositionDescription.ReadsEPD (BishBosh.State.MaybePieceByCoordinates.MaybePieceByCoordinates x y)
+ BishBosh.State.MaybePieceByCoordinates: instance (GHC.Enum.Enum x, GHC.Enum.Enum y, GHC.Classes.Ord x, GHC.Classes.Ord y) => BishBosh.Property.ExtendedPositionDescription.ShowsEPD (BishBosh.State.MaybePieceByCoordinates.MaybePieceByCoordinates x y)
+ BishBosh.UI.PrintObject: EPD :: PrintObject
+ BishBosh.UI.PrintObject: epdTag :: String
- BishBosh.Property.ForsythEdwards: class ReadsFEN a
+ BishBosh.Property.ForsythEdwards: class ReadsEPD a => ReadsFEN a
- BishBosh.Property.ForsythEdwards: class ShowsFEN a
+ BishBosh.Property.ForsythEdwards: class ShowsEPD a => ShowsFEN a
- BishBosh.State.CastleableRooksByLogicalColour: fromAssocs :: (Enum x, Ord x, Show x) => [(LogicalColour, [x])] -> CastleableRooksByLogicalColour x
+ BishBosh.State.CastleableRooksByLogicalColour: fromAssocs :: (Enum x, Ord x, Show x) => AbscissaeByLogicalColour x -> CastleableRooksByLogicalColour x

Files

.ghci view
@@ -1,1 +1,1 @@-:set -isrc-lib:src-exe:src-test:dist/build/autogen -optP-include -optPdist/build/autogen/cabal_macros.h -Wall -fno-warn-tabs+:set -isrc-lib:src-exe:src-test -Wall -fno-warn-tabs
README.markdown view
@@ -9,7 +9,7 @@  ## Installation -It can be built and installed using [Cabal](https://www.haskell.org/cabal/users-guide/installing-packages.html).+It can be built and installed using [Cabal](https://www.haskell.org/cabal/users-guide/installing-packages.html) or [The Haskell Tool Stack](https://docs.haskellstack.org/en/stable/README/).  ## Documentation @@ -25,11 +25,10 @@  ## Testing -The test-suite can be run using:+The test-suite can be run using either of: -    cabal configure --enable-tests;-    cabal build;-    cabal test --show-details=always;+* cabal configure --enable-tests && cabal build && cabal test --show-details=always;+* stack test;  It's currently only been tested on **Linux**. 
bishbosh.cabal view
@@ -14,7 +14,7 @@ -- along with BishBosh.  If not, see <http://www.gnu.org/licenses/>.  Name:		bishbosh-Version:	0.0.0.7+Version:	0.0.0.8 Cabal-version:	>= 1.10 Copyright:	(C) 2018 Dr. Alistair Ward License:	GPL@@ -60,13 +60,17 @@     Default:		False  -- Automatically disabled when the required package isn't available.--- To manually disable, use "runhaskell Setup configure -f -polyparse --verbose"; which may be required to access Parsec's more precise error-messages.+-- To access Parsec's more precise error-messages, manually disable using one of:+--	runhaskell Setup configure -f -polyparse --verbose;+--	stack build --flag 'bishbosh:-polyparse' --cabal-verbose; flag polyparse     Description:	Link with package "polyparse" when available, rather than "parsec".     Default:		True  -- Automatically disabled when the required package isn't available.--- To manually disable, use "runhaskell Setup configure -f -hxtrelaxng --verbose", under which circumstances the XML-configuration will be validated against the packaged DTD instead.+-- To force validation of the XML-configuration against the packaged DTD, manually disable using one of:+--	runhaskell Setup configure -f -hxtrelaxng --verbose;+--	stack build --flag 'bishbosh:-hxtrelaxng' --cabal-verbose; flag hxtrelaxng     Description:	Link with package "hxt-relaxng" when available, for more precise specification of the XML-configuration than a traditional DTD.     Default:		True@@ -156,11 +160,12 @@         BishBosh.Model.MoveFrequency         BishBosh.Model.PositionHashTree         BishBosh.Model.Result-        BishBosh.Notation.Coordinate         BishBosh.Notation.ICCFNumeric         BishBosh.Notation.MoveNotation+        BishBosh.Notation.PureCoordinate         BishBosh.Notation.Smith         BishBosh.Property.Empty+        BishBosh.Property.ExtendedPositionDescription         BishBosh.Property.ForsythEdwards         BishBosh.Property.Null         BishBosh.Property.Opposable@@ -377,9 +382,9 @@         BishBosh.Test.QuickCheck.Model.GameTree         BishBosh.Test.QuickCheck.Model.MoveFrequency         BishBosh.Test.QuickCheck.Model.Result-        BishBosh.Test.QuickCheck.Notation.Coordinate         BishBosh.Test.QuickCheck.Notation.ICCFNumeric         BishBosh.Test.QuickCheck.Notation.MoveNotation+        BishBosh.Test.QuickCheck.Notation.PureCoordinate         BishBosh.Test.QuickCheck.Notation.Smith         BishBosh.Test.QuickCheck.Search.KillerMoves         BishBosh.Test.QuickCheck.Search.Search
bishbosh.spec view
@@ -24,7 +24,7 @@  Summary:	BishBosh is a chess-game. Name:		bishbosh-Version:	0.0.0.7+Version:	0.0.0.8 Release:	1 License:	GPLv3 # From '/usr/share/doc/packages/rpm/GROUPS'.
bishbosh.svg view
@@ -1,1527 +1,1827 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">-<!-- Generated by graphviz version 2.38.0 (20140413.2041)- -->-<!-- Title: G Pages: 1 -->-<svg width="2880pt" height="1705pt"- viewBox="0.00 0.00 2880.00 1704.64" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">-<g id="graph0" class="graph" transform="scale(0.593578 0.593578) rotate(0) translate(4 2867.8)">-<title>G</title>-<polygon fill="white" stroke="none" points="-4,4 -4,-2867.8 4847.93,-2867.8 4847.93,4 -4,4"/>-<g id="clust1" class="cluster"><title>cluster_0</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="14.2806,-21.2724 14.2806,-2746.8 4771.28,-2746.8 4771.28,-21.2724 14.2806,-21.2724"/>-<text text-anchor="middle" x="2392.78" y="-2731.6" font-family="Times,serif" font-size="14.00">BishBosh</text>-</g>-<g id="clust2" class="cluster"><title>cluster_1</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2545.28,-454.698 2545.28,-874.828 3667.28,-874.828 3667.28,-454.698 2545.28,-454.698"/>-<text text-anchor="middle" x="3106.28" y="-859.628" font-family="Times,serif" font-size="14.00">Attribute</text>-</g>-<g id="clust3" class="cluster"><title>cluster_2</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2397.28,-454.698 2397.28,-1265.71 2525.28,-1265.71 2525.28,-454.698 2397.28,-454.698"/>-<text text-anchor="middle" x="2461.28" y="-1250.51" font-family="Times,serif" font-size="14.00">Cartesian</text>-</g>-<g id="clust4" class="cluster"><title>cluster_3</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="1605.28,-675.399 1605.28,-1265.71 2036.28,-1265.71 2036.28,-675.399 1605.28,-675.399"/>-<text text-anchor="middle" x="1820.78" y="-1250.51" font-family="Times,serif" font-size="14.00">Component</text>-</g>-<g id="clust5" class="cluster"><title>cluster_4</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="269.281,-2148.51 269.281,-2347.94 535.281,-2347.94 535.281,-2148.51 269.281,-2148.51"/>-<text text-anchor="middle" x="402.281" y="-2332.74" font-family="Times,serif" font-size="14.00">Concurrent</text>-</g>-<g id="clust6" class="cluster"><title>cluster_5</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3433.28,-1286.98 3433.28,-2347.94 3759.28,-2347.94 3759.28,-1286.98 3433.28,-1286.98"/>-<text text-anchor="middle" x="3596.28" y="-2332.74" font-family="Times,serif" font-size="14.00">ContextualNotation</text>-</g>-<g id="clust7" class="cluster"><title>cluster_6</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3945.28,-233.997 3945.28,-433.426 4763.28,-433.426 4763.28,-233.997 3945.28,-233.997"/>-<text text-anchor="middle" x="4354.28" y="-418.226" font-family="Times,serif" font-size="14.00">Data</text>-</g>-<g id="clust8" class="cluster"><title>cluster_7</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3133.28,-1507.68 3133.28,-2127.24 3425.28,-2127.24 3425.28,-1507.68 3133.28,-1507.68"/>-<text text-anchor="middle" x="3279.28" y="-2112.04" font-family="Times,serif" font-size="14.00">Evaluation</text>-</g>-<g id="clust9" class="cluster"><title>cluster_8</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3767.28,-675.399 3767.28,-1707.11 4573.28,-1707.11 4573.28,-675.399 3767.28,-675.399"/>-<text text-anchor="middle" x="4170.28" y="-1691.91" font-family="Times,serif" font-size="14.00">Input</text>-</g>-<g id="clust10" class="cluster"><title>cluster_9</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="1321.28,-1066.28 1321.28,-1906.54 1567.28,-1906.54 1567.28,-1066.28 1321.28,-1066.28"/>-<text text-anchor="middle" x="1444.28" y="-1891.34" font-family="Times,serif" font-size="14.00">Model</text>-</g>-<g id="clust11" class="cluster"><title>cluster_10</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="154.281,-1066.28 154.281,-1486.41 503.281,-1486.41 503.281,-1066.28 154.281,-1066.28"/>-<text text-anchor="middle" x="328.781" y="-1471.21" font-family="Times,serif" font-size="14.00">Notation</text>-</g>-<g id="clust12" class="cluster"><title>cluster_11</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2140.28,-42.5448 2140.28,-433.426 3000.28,-433.426 3000.28,-42.5448 2140.28,-42.5448"/>-<text text-anchor="middle" x="2570.28" y="-418.226" font-family="Times,serif" font-size="14.00">Property</text>-</g>-<g id="clust13" class="cluster"><title>cluster_12</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2044.28,-1066.28 2044.28,-2347.94 2377.28,-2347.94 2377.28,-1066.28 2044.28,-1066.28"/>-<text text-anchor="middle" x="2210.78" y="-2332.74" font-family="Times,serif" font-size="14.00">Search</text>-</g>-<g id="clust14" class="cluster"><title>cluster_13</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="543.281,-1066.28 543.281,-2347.94 1313.28,-2347.94 1313.28,-1066.28 543.281,-1066.28"/>-<text text-anchor="middle" x="928.281" y="-2332.74" font-family="Times,serif" font-size="14.00">State</text>-</g>-<g id="clust15" class="cluster"><title>cluster_14</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3705.28,-233.997 3705.28,-654.127 3811.28,-654.127 3811.28,-233.997 3705.28,-233.997"/>-<text text-anchor="middle" x="3758.28" y="-638.927" font-family="Times,serif" font-size="14.00">Text</text>-</g>-<g id="clust16" class="cluster"><title>cluster_15</title>-<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3781.28,-1927.81 3781.28,-2547.37 4019.28,-2547.37 4019.28,-1927.81 3781.28,-1927.81"/>-<text text-anchor="middle" x="3900.28" y="-2532.17" font-family="Times,serif" font-size="14.00">UI</text>-</g>-<!-- u4 -->-<g id="node1" class="node"><title>u4</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3310.28" cy="-524.272" rx="67.6881" ry="18"/>-<text text-anchor="middle" x="3310.28" y="-520.572" font-family="Times,serif" font-size="14.00">PhysicalColour</text>-</g>-<!-- u7 -->-<g id="node2" class="node"><title>u7</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2618.28" cy="-524.272" rx="64.9885" ry="18"/>-<text text-anchor="middle" x="2618.28" y="-520.572" font-family="Times,serif" font-size="14.00">LogicalColour</text>-</g>-<!-- u8 -->-<g id="node68" class="node"><title>u8</title>-<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2490.28" cy="-303.272" rx="71.4873" ry="18"/>-<text text-anchor="middle" x="2490.28" y="-299.572" font-family="Times,serif" font-size="14.00">ForsythEdwards</text>-</g>-<!-- u7&#45;&gt;u8 -->-<g id="edge7" class="edge"><title>u7&#45;&gt;u8</title>-<path fill="none" stroke="black" d="M2608.45,-506.451C2586.16,-468.314 2531.67,-375.082 2505.2,-329.794"/>-<polygon fill="black" stroke="black" points="2508.21,-328.018 2500.15,-321.151 2502.17,-331.55 2508.21,-328.018"/>-</g>-<!-- u9 -->-<g id="node69" class="node"><title>u9</title>-<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2630.28" cy="-303.272" rx="50.0912" ry="18"/>-<text text-anchor="middle" x="2630.28" y="-299.572" font-family="Times,serif" font-size="14.00">Opposable</text>-</g>-<!-- u7&#45;&gt;u9 -->-<g id="edge8" class="edge"><title>u7&#45;&gt;u9</title>-<path fill="none" stroke="black" d="M2619.22,-506.088C2621.3,-468.188 2626.29,-377.17 2628.79,-331.449"/>-<polygon fill="black" stroke="black" points="2632.29,-331.554 2629.34,-321.377 2625.3,-331.171 2632.29,-331.554"/>-</g>-<!-- u11 -->-<g id="node3" class="node"><title>u11</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2823.28" cy="-744.272" rx="51.9908" ry="18"/>-<text text-anchor="middle" x="2823.28" y="-740.572" font-family="Times,serif" font-size="14.00">MoveType</text>-</g>-<!-- u12 -->-<g id="node4" class="node"><title>u12</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2731.28" cy="-524.272" rx="29.795" ry="18"/>-<text text-anchor="middle" x="2731.28" y="-520.572" font-family="Times,serif" font-size="14.00">Rank</text>-</g>-<!-- u11&#45;&gt;u12 -->-<g id="edge9" class="edge"><title>u11&#45;&gt;u12</title>-<path fill="none" stroke="black" d="M2816.06,-726.166C2800.03,-688.187 2761.39,-596.622 2742.31,-551.417"/>-<polygon fill="black" stroke="black" points="2745.45,-549.852 2738.34,-542 2739,-552.574 2745.45,-549.852"/>-</g>-<!-- u5 -->-<g id="node97" class="node"><title>u5</title>-<ellipse fill="#ff3333" stroke="black" stroke-width="0" cx="3758.28" cy="-303.272" rx="44.6926" ry="18"/>-<text text-anchor="middle" x="3758.28" y="-299.572" font-family="Times,serif" font-size="14.00">ShowList</text>-</g>-<!-- u11&#45;&gt;u5 -->-<g id="edge10" class="edge"><title>u11&#45;&gt;u5</title>-<path fill="none" stroke="black" d="M2853.21,-729.408C2862.95,-725.33 2873.92,-721.185 2884.28,-718.272 3079.72,-663.305 3654.61,-727.801 3786.28,-573.272 3816.88,-537.366 3782.19,-392.102 3765.86,-331.271"/>-<polygon fill="black" stroke="black" points="3769.14,-329.997 3763.13,-321.27 3762.38,-331.838 3769.14,-329.997"/>-</g>-<!-- u14 -->-<g id="node5" class="node"><title>u14</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3088.28" cy="-744.272" rx="45.4919" ry="18"/>-<text text-anchor="middle" x="3088.28" y="-740.572" font-family="Times,serif" font-size="14.00">Direction</text>-</g>-<!-- u14&#45;&gt;u7 -->-<g id="edge11" class="edge"><title>u14&#45;&gt;u7</title>-<path fill="none" stroke="black" d="M3060.05,-729.994C3051.77,-726.156 3042.69,-721.999 3034.28,-718.272 2883.35,-651.361 2838.09,-650.711 2692.28,-573.272 2677.67,-565.511 2662.2,-555.749 2649.21,-547.058"/>-<polygon fill="black" stroke="black" points="2650.9,-543.97 2640.66,-541.251 2646.97,-549.763 2650.9,-543.97"/>-</g>-<!-- u15 -->-<g id="node33" class="node"><title>u15</title>-<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="3997.28" cy="-303.272" rx="44.393" ry="18"/>-<text text-anchor="middle" x="3997.28" y="-299.572" font-family="Times,serif" font-size="14.00">Ordering</text>-</g>-<!-- u14&#45;&gt;u15 -->-<g id="edge12" class="edge"><title>u14&#45;&gt;u15</title>-<path fill="none" stroke="black" d="M3114.72,-729.611C3123.34,-725.543 3133.07,-721.354 3142.28,-718.272 3432.44,-621.182 3561.73,-744.542 3815.28,-573.272 3907.43,-511.024 3965.62,-385.03 3987.48,-330.456"/>-<polygon fill="black" stroke="black" points="3990.74,-331.717 3991.14,-321.129 3984.23,-329.16 3990.74,-331.717"/>-</g>-<!-- u16 -->-<g id="node34" class="node"><title>u16</title>-<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4183.28" cy="-303.272" rx="48.1917" ry="18"/>-<text text-anchor="middle" x="4183.28" y="-299.572" font-family="Times,serif" font-size="14.00">Exception</text>-</g>-<!-- u14&#45;&gt;u16 -->-<g id="edge13" class="edge"><title>u14&#45;&gt;u16</title>-<path fill="none" stroke="black" d="M3114.7,-729.541C3123.32,-725.469 3133.05,-721.295 3142.28,-718.272 3451.24,-617.063 3588.51,-753.23 3859.28,-573.272 3892.85,-550.96 3881.74,-526.736 3910.28,-498.272 3992.33,-416.452 4033.84,-422.133 4126.28,-352.272 4136.84,-344.29 4148.07,-335.018 4157.74,-326.764"/>-<polygon fill="black" stroke="black" points="4160.16,-329.3 4165.45,-320.12 4155.59,-323.997 4160.16,-329.3"/>-</g>-<!-- u17 -->-<g id="node70" class="node"><title>u17</title>-<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2748.28" cy="-303.272" rx="50.0912" ry="18"/>-<text text-anchor="middle" x="2748.28" y="-299.572" font-family="Times,serif" font-size="14.00">Orientated</text>-</g>-<!-- u14&#45;&gt;u17 -->-<g id="edge14" class="edge"><title>u14&#45;&gt;u17</title>-<path fill="none" stroke="black" d="M3115.5,-729.78C3186.29,-694.419 3371.76,-599.951 3387.28,-573.272 3404.04,-544.46 3407.77,-524.563 3387.28,-498.272 3223.86,-288.62 3044.9,-471.419 2807.28,-352.272 2794.61,-345.921 2782.2,-336.46 2772.05,-327.612"/>-<polygon fill="black" stroke="black" points="2774.2,-324.836 2764.44,-320.719 2769.5,-330.025 2774.2,-324.836"/>-</g>-<!-- u18 -->-<g id="node71" class="node"><title>u18</title>-<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2647.28" cy="-111.272" rx="52.7911" ry="18"/>-<text text-anchor="middle" x="2647.28" y="-107.572" font-family="Times,serif" font-size="14.00">Reflectable</text>-</g>-<!-- u14&#45;&gt;u18 -->-<g id="edge15" class="edge"><title>u14&#45;&gt;u18</title>-<path fill="none" stroke="black" d="M3116.73,-730.106C3202.23,-690.527 3451.04,-575.221 3452.28,-573.272 3461.11,-559.401 3462.68,-290.014 3452.28,-277.272 3358.05,-161.766 2881.22,-124.887 2709.24,-115.237"/>-<polygon fill="black" stroke="black" points="2709.26,-111.733 2699.08,-114.679 2708.88,-118.722 2709.26,-111.733"/>-</g>-<!-- u19 -->-<g id="node6" class="node"><title>u19</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2653.28" cy="-744.272" rx="100.182" ry="18"/>-<text text-anchor="middle" x="2653.28" y="-740.572" font-family="Times,serif" font-size="14.00">LogicalColourOfSquare</text>-</g>-<!-- u19&#45;&gt;u7 -->-<g id="edge16" class="edge"><title>u19&#45;&gt;u7</title>-<path fill="none" stroke="black" d="M2650.53,-726.166C2644.48,-688.439 2629.93,-597.837 2622.62,-552.325"/>-<polygon fill="black" stroke="black" points="2626.06,-551.618 2621.01,-542.299 2619.14,-552.727 2626.06,-551.618"/>-</g>-<!-- u49 -->-<g id="node7" class="node"><title>u49</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3593.28" cy="-744.272" rx="66.0889" ry="18"/>-<text text-anchor="middle" x="3593.28" y="-740.572" font-family="Times,serif" font-size="14.00">ColourScheme</text>-</g>-<!-- u49&#45;&gt;u4 -->-<g id="edge17" class="edge"><title>u49&#45;&gt;u4</title>-<path fill="none" stroke="black" d="M3572.01,-726.887C3522,-688.365 3396.88,-591.985 3339.67,-547.91"/>-<polygon fill="black" stroke="black" points="3341.47,-544.88 3331.41,-541.551 3337.2,-550.426 3341.47,-544.88"/>-</g>-<!-- u49&#45;&gt;u16 -->-<g id="edge18" class="edge"><title>u49&#45;&gt;u16</title>-<path fill="none" stroke="black" d="M3637.33,-730.766C3711.31,-708.222 3862.77,-655.341 3968.28,-573.272 4060.69,-501.398 4137.52,-382.095 4168.54,-329.969"/>-<polygon fill="black" stroke="black" points="4171.74,-331.438 4173.79,-321.045 4165.7,-327.888 4171.74,-331.438"/>-</g>-<!-- u49&#45;&gt;u5 -->-<g id="edge19" class="edge"><title>u49&#45;&gt;u5</title>-<path fill="none" stroke="black" d="M3625.45,-728.498C3674.14,-704.123 3764.71,-650.388 3801.28,-573.272 3840.42,-490.744 3796.03,-379.643 3771.87,-330.047"/>-<polygon fill="black" stroke="black" points="3774.94,-328.356 3767.34,-320.974 3768.68,-331.484 3774.94,-328.356"/>-</g>-<!-- u60 -->-<g id="node8" class="node"><title>u60</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3394.28" cy="-744.272" rx="115.08" ry="18"/>-<text text-anchor="middle" x="3394.28" y="-740.572" font-family="Times,serif" font-size="14.00">CaptureMoveSortAlgorithm</text>-</g>-<!-- u65 -->-<g id="node9" class="node"><title>u65</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2921.28" cy="-524.272" rx="142.175" ry="18"/>-<text text-anchor="middle" x="2921.28" y="-520.572" font-family="Times,serif" font-size="14.00">WeightedMeanAndCriterionValues</text>-</g>-<!-- u40 -->-<g id="node73" class="node"><title>u40</title>-<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2866.28" cy="-303.272" rx="50.0912" ry="18"/>-<text text-anchor="middle" x="2866.28" y="-299.572" font-family="Times,serif" font-size="14.00">ShowFloat</text>-</g>-<!-- u65&#45;&gt;u40 -->-<g id="edge20" class="edge"><title>u65&#45;&gt;u40</title>-<path fill="none" stroke="black" d="M2916.96,-506.088C2907.43,-468.108 2884.49,-376.786 2873.03,-331.16"/>-<polygon fill="black" stroke="black" points="2876.41,-330.223 2870.58,-321.377 2869.62,-331.929 2876.41,-330.223"/>-</g>-<!-- u65&#45;&gt;u5 -->-<g id="edge21" class="edge"><title>u65&#45;&gt;u5</title>-<path fill="none" stroke="black" d="M2998.17,-509.102C3183.93,-474.513 3646.47,-386.128 3709.28,-352.272 3720.31,-346.329 3730.54,-337.166 3738.78,-328.432"/>-<polygon fill="black" stroke="black" points="3741.41,-330.744 3745.47,-320.96 3736.19,-326.075 3741.41,-330.744"/>-</g>-<!-- u66 -->-<g id="node10" class="node"><title>u66</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3206.28" cy="-744.272" rx="54.6905" ry="18"/>-<text text-anchor="middle" x="3206.28" y="-740.572" font-family="Times,serif" font-size="14.00">RankValues</text>-</g>-<!-- u66&#45;&gt;u12 -->-<g id="edge22" class="edge"><title>u66&#45;&gt;u12</title>-<path fill="none" stroke="black" d="M3172.4,-730.034C3162.68,-726.235 3152.06,-722.088 3142.28,-718.272 2976.97,-653.768 2913.66,-677.826 2770.28,-573.272 2761.43,-566.819 2753.44,-557.889 2747.03,-549.479"/>-<polygon fill="black" stroke="black" points="2749.86,-547.42 2741.18,-541.354 2744.19,-551.513 2749.86,-547.42"/>-</g>-<!-- u66&#45;&gt;u16 -->-<g id="edge23" class="edge"><title>u66&#45;&gt;u16</title>-<path fill="none" stroke="black" d="M3238.53,-729.668C3248.59,-725.695 3259.81,-721.546 3270.28,-718.272 3536.26,-635.153 3633.07,-701.88 3880.28,-573.272 3888.45,-569.023 4086.04,-391.696 4157.66,-327.319"/>-<polygon fill="black" stroke="black" points="4160.26,-329.684 4165.36,-320.395 4155.58,-324.478 4160.26,-329.684"/>-</g>-<!-- u67 -->-<g id="node38" class="node"><title>u67</title>-<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4088.28" cy="-303.272" rx="29.4969" ry="18"/>-<text text-anchor="middle" x="4088.28" y="-299.572" font-family="Times,serif" font-size="14.00">Num</text>-</g>-<!-- u66&#45;&gt;u67 -->-<g id="edge24" class="edge"><title>u66&#45;&gt;u67</title>-<path fill="none" stroke="black" d="M3238.9,-729.682C3248.88,-725.753 3259.96,-721.625 3270.28,-718.272 3512.76,-639.535 3603.53,-699.062 3825.28,-573.272 3938.33,-509.148 4034.53,-382.183 4071.78,-328.813"/>-<polygon fill="black" stroke="black" points="4074.84,-330.534 4077.64,-320.316 4069.08,-326.559 4074.84,-330.534"/>-</g>-<!-- u66&#45;&gt;u40 -->-<g id="edge25" class="edge"><title>u66&#45;&gt;u40</title>-<path fill="none" stroke="black" d="M3234.18,-728.627C3302.21,-691.022 3466.37,-587.729 3400.28,-498.272 3269.04,-320.636 3120.09,-456.327 2925.28,-352.272 2912.78,-345.596 2900.39,-336.083 2890.22,-327.284"/>-<polygon fill="black" stroke="black" points="2892.36,-324.505 2882.58,-320.448 2887.7,-329.723 2892.36,-324.505"/>-</g>-<!-- u66&#45;&gt;u5 -->-<g id="edge26" class="edge"><title>u66&#45;&gt;u5</title>-<path fill="none" stroke="black" d="M3231.5,-728.294C3278.42,-700.043 3381.69,-636.068 3462.28,-573.272 3569.91,-489.411 3686.7,-375.813 3735.18,-327.529"/>-<polygon fill="black" stroke="black" points="3737.76,-329.898 3742.36,-320.355 3732.81,-324.945 3737.76,-329.898"/>-</g>-<!-- u69 -->-<g id="node11" class="node"><title>u69</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2959.28" cy="-744.272" rx="65.7887" ry="18"/>-<text text-anchor="middle" x="2959.28" y="-740.572" font-family="Times,serif" font-size="14.00">CriterionValue</text>-</g>-<!-- u69&#45;&gt;u65 -->-<g id="edge28" class="edge"><title>u69&#45;&gt;u65</title>-<path fill="none" stroke="black" d="M2956.3,-726.166C2949.72,-688.439 2933.93,-597.837 2926,-552.325"/>-<polygon fill="black" stroke="black" points="2929.41,-551.549 2924.25,-542.299 2922.52,-552.752 2929.41,-551.549"/>-</g>-<!-- u70 -->-<g id="node12" class="node"><title>u70</title>-<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="3153.28" cy="-524.272" rx="71.4873" ry="18"/>-<text text-anchor="middle" x="3153.28" y="-520.572" font-family="Times,serif" font-size="14.00">CriterionWeight</text>-</g>-<!-- u69&#45;&gt;u70 -->-<g id="edge29" class="edge"><title>u69&#45;&gt;u70</title>-<path fill="none" stroke="black" d="M2974.18,-726.528C3008.25,-688.248 3091.94,-594.205 3131.67,-549.559"/>-<polygon fill="black" stroke="black" points="3134.3,-551.871 3138.33,-542.074 3129.07,-547.217 3134.3,-551.871"/>-</g>-<!-- u21 -->-<g id="node103" class="node"><title>u21</title>-<ellipse fill="#ffffbb" stroke="black" stroke-width="0" cx="3218.28" cy="-303.272" rx="33.5952" ry="18"/>-<text text-anchor="middle" x="3218.28" y="-299.572" font-family="Times,serif" font-size="14.00">Types</text>-</g>-<!-- u69&#45;&gt;u21 -->-<g id="edge27" class="edge"><title>u69&#45;&gt;u21</title>-<path fill="none" stroke="black" d="M2997.18,-729.533C3099.69,-692.193 3375.59,-590.493 3387.28,-573.272 3449.41,-481.748 3310.45,-368.52 3247.36,-323.775"/>-<polygon fill="black" stroke="black" points="3249.19,-320.785 3238.99,-317.925 3245.18,-326.522 3249.19,-320.785"/>-</g>-<!-- u70&#45;&gt;u16 -->-<g id="edge30" class="edge"><title>u70&#45;&gt;u16</title>-<path fill="none" stroke="black" d="M3194.08,-509.305C3206.56,-505.364 3220.4,-501.323 3233.28,-498.272 3624.62,-405.622 3760.9,-520.277 4126.28,-352.272 4139.08,-346.387 4151.3,-336.824 4161.13,-327.777"/>-<polygon fill="black" stroke="black" points="4163.68,-330.172 4168.45,-320.712 4158.82,-325.133 4163.68,-330.172"/>-</g>-<!-- u70&#45;&gt;u67 -->-<g id="edge31" class="edge"><title>u70&#45;&gt;u67</title>-<path fill="none" stroke="black" d="M3194.11,-509.424C3206.59,-505.486 3220.42,-501.418 3233.28,-498.272 3591.58,-410.643 3733.71,-541.601 4050.28,-352.272 4059.72,-346.626 4067.74,-337.699 4073.94,-329.068"/>-<polygon fill="black" stroke="black" points="4076.91,-330.933 4079.53,-320.667 4071.08,-327.058 4076.91,-330.933"/>-</g>-<!-- u70&#45;&gt;u5 -->-<g id="edge32" class="edge"><title>u70&#45;&gt;u5</title>-<path fill="none" stroke="black" d="M3196.45,-509.737C3208.38,-506.009 3221.33,-501.974 3233.28,-498.272 3444.66,-432.826 3519.07,-465.349 3709.28,-352.272 3719.94,-345.936 3730.03,-336.813 3738.26,-328.219"/>-<polygon fill="black" stroke="black" points="3741.09,-330.313 3745.25,-320.57 3735.92,-325.59 3741.09,-330.313"/>-</g>-<!-- u13 -->-<g id="node13" class="node"><title>u13</title>-<ellipse fill="#ffbbbb" stroke="black" stroke-width="0" cx="2461.28" cy="-944.272" rx="55.7903" ry="18"/>-<text text-anchor="middle" x="2461.28" y="-940.572" font-family="Times,serif" font-size="14.00">Coordinates</text>-</g>-<!-- u13&#45;&gt;u14 -->-<g id="edge33" class="edge"><title>u13&#45;&gt;u14</title>-<path fill="none" stroke="black" d="M2513.66,-937.848C2618.18,-925.295 2857.71,-887.758 3034.28,-793.272 3046.03,-786.985 3057.33,-777.648 3066.53,-768.876"/>-<polygon fill="black" stroke="black" points="3069.1,-771.253 3073.72,-761.72 3064.16,-766.29 3069.1,-771.253"/>-</g>-<!-- u13&#45;&gt;u19 -->-<g id="edge34" class="edge"><title>u13&#45;&gt;u19</title>-<path fill="none" stroke="black" d="M2477.32,-926.732C2511.19,-891.805 2590.13,-810.399 2629.73,-769.554"/>-<polygon fill="black" stroke="black" points="2632.43,-771.801 2636.88,-762.186 2627.41,-766.928 2632.43,-771.801"/>-</g>-<!-- u22 -->-<g id="node15" class="node"><title>u22</title>-<ellipse fill="#ffbbbb" stroke="black" stroke-width="0" cx="2452.28" cy="-744.272" rx="42.7926" ry="18"/>-<text text-anchor="middle" x="2452.28" y="-740.572" font-family="Times,serif" font-size="14.00">Ordinate</text>-</g>-<!-- u13&#45;&gt;u22 -->-<g id="edge35" class="edge"><title>u13&#45;&gt;u22</title>-<path fill="none" stroke="black" d="M2460.5,-926.048C2458.93,-891.587 2455.4,-813.918 2453.52,-772.496"/>-<polygon fill="black" stroke="black" points="2457.01,-772.147 2453.06,-762.316 2450.01,-772.465 2457.01,-772.147"/>-</g>-<!-- u23 -->-<g id="node72" class="node"><title>u23</title>-<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2355.28" cy="-303.272" rx="45.4919" ry="18"/>-<text text-anchor="middle" x="2355.28" y="-299.572" font-family="Times,serif" font-size="14.00">Rotatable</text>-</g>-<!-- u13&#45;&gt;u23 -->-<g id="edge36" class="edge"><title>u13&#45;&gt;u23</title>-<path fill="none" stroke="black" d="M2452.43,-926.277C2438.68,-899.032 2412.53,-843.529 2400.28,-793.272 2358.34,-621.165 2354.84,-406.3 2355.01,-331.465"/>-<polygon fill="black" stroke="black" points="2358.51,-331.478 2355.05,-321.461 2351.51,-331.445 2358.51,-331.478"/>-</g>-<!-- u13&#45;&gt;u5 -->-<g id="edge37" class="edge"><title>u13&#45;&gt;u5</title>-<path fill="none" stroke="black" d="M2467.2,-925.939C2476.44,-898.231 2494.28,-842.106 2504.28,-793.272 2517.53,-728.546 2494.55,-544.981 2541.28,-498.272 2726.28,-313.349 3473.71,-465.983 3709.28,-352.272 3720.73,-346.747 3731.15,-337.485 3739.41,-328.563"/>-<polygon fill="black" stroke="black" points="3742.14,-330.749 3746.08,-320.912 3736.87,-326.148 3742.14,-330.749"/>-</g>-<!-- u20 -->-<g id="node14" class="node"><title>u20</title>-<ellipse fill="#ffbbbb" stroke="black" stroke-width="0" cx="2452.28" cy="-524.272" rx="42.7926" ry="18"/>-<text text-anchor="middle" x="2452.28" y="-520.572" font-family="Times,serif" font-size="14.00">Abscissa</text>-</g>-<!-- u20&#45;&gt;u21 -->-<g id="edge38" class="edge"><title>u20&#45;&gt;u21</title>-<path fill="none" stroke="black" d="M2479.79,-510.239C2489.04,-506.115 2499.5,-501.734 2509.28,-498.272 2758.1,-410.199 3067.66,-337.807 3177.4,-313.247"/>-<polygon fill="black" stroke="black" points="3178.38,-316.613 3187.38,-311.021 3176.86,-309.78 3178.38,-316.613"/>-</g>-<!-- u22&#45;&gt;u7 -->-<g id="edge39" class="edge"><title>u22&#45;&gt;u7</title>-<path fill="none" stroke="black" d="M2464.76,-726.887C2493.59,-689.026 2564.98,-595.273 2599.28,-550.223"/>-<polygon fill="black" stroke="black" points="2602.16,-552.224 2605.43,-542.148 2596.59,-547.983 2602.16,-552.224"/>-</g>-<!-- u22&#45;&gt;u20 -->-<g id="edge40" class="edge"><title>u22&#45;&gt;u20</title>-<path fill="none" stroke="black" d="M2452.28,-726.166C2452.28,-688.439 2452.28,-597.837 2452.28,-552.325"/>-<polygon fill="black" stroke="black" points="2455.78,-552.299 2452.28,-542.299 2448.78,-552.299 2455.78,-552.299"/>-</g>-<!-- u24 -->-<g id="node16" class="node"><title>u24</title>-<ellipse fill="#ffbbbb" stroke="black" stroke-width="0" cx="2443.28" cy="-1135.27" rx="36.2938" ry="18"/>-<text text-anchor="middle" x="2443.28" y="-1131.57" font-family="Times,serif" font-size="14.00">Vector</text>-</g>-<!-- u24&#45;&gt;u13 -->-<g id="edge41" class="edge"><title>u24&#45;&gt;u13</title>-<path fill="none" stroke="black" d="M2444.91,-1117.17C2448.04,-1084.29 2454.92,-1012.03 2458.69,-972.476"/>-<polygon fill="black" stroke="black" points="2462.18,-972.763 2459.64,-962.476 2455.21,-972.099 2462.18,-972.763"/>-</g>-<!-- u10 -->-<g id="node17" class="node"><title>u10</title>-<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1681.28" cy="-744.272" rx="32.4942" ry="18"/>-<text text-anchor="middle" x="1681.28" y="-740.572" font-family="Times,serif" font-size="14.00">Move</text>-</g>-<!-- u10&#45;&gt;u11 -->-<g id="edge42" class="edge"><title>u10&#45;&gt;u11</title>-<path fill="none" stroke="black" d="M1710.78,-752.003C1863.83,-791.445 2567.56,-964.384 2753.28,-859.772 2786.4,-841.12 2805.64,-799.783 2815.3,-771.965"/>-<polygon fill="black" stroke="black" points="2818.65,-772.988 2818.44,-762.396 2812,-770.81 2818.65,-772.988"/>-</g>-<!-- u10&#45;&gt;u24 -->-<g id="edge43" class="edge"><title>u10&#45;&gt;u24</title>-<path fill="none" stroke="black" d="M1712.89,-748.918C1804.82,-760.746 2077.34,-804.592 2263.28,-926.272 2338.82,-975.71 2400.96,-1065.57 2428.29,-1109.18"/>-<polygon fill="black" stroke="black" points="2425.35,-1111.09 2433.58,-1117.75 2431.31,-1107.41 2425.35,-1111.09"/>-</g>-<!-- u27 -->-<g id="node18" class="node"><title>u27</title>-<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1996.28" cy="-944.272" rx="31.6951" ry="18"/>-<text text-anchor="middle" x="1996.28" y="-940.572" font-family="Times,serif" font-size="14.00">Piece</text>-</g>-<!-- u27&#45;&gt;u12 -->-<g id="edge44" class="edge"><title>u27&#45;&gt;u12</title>-<path fill="none" stroke="black" d="M2011.09,-927.977C2050.35,-888.202 2161.75,-780.319 2273.28,-718.272 2445.49,-622.474 2530.86,-686.293 2692.28,-573.272 2701.25,-566.991 2709.27,-558.095 2715.66,-549.665"/>-<polygon fill="black" stroke="black" points="2718.53,-551.676 2721.49,-541.505 2712.83,-547.606 2718.53,-551.676"/>-</g>-<!-- u27&#45;&gt;u24 -->-<g id="edge45" class="edge"><title>u27&#45;&gt;u24</title>-<path fill="none" stroke="black" d="M2021.05,-955.744C2095.73,-987.32 2318.97,-1081.71 2407.01,-1118.94"/>-<polygon fill="black" stroke="black" points="2405.75,-1122.2 2416.33,-1122.88 2408.48,-1115.76 2405.75,-1122.2"/>-</g>-<!-- u28 -->-<g id="node19" class="node"><title>u28</title>-<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1681.28" cy="-944.272" rx="67.6881" ry="18"/>-<text text-anchor="middle" x="1681.28" y="-940.572" font-family="Times,serif" font-size="14.00">QualifiedMove</text>-</g>-<!-- u28&#45;&gt;u10 -->-<g id="edge46" class="edge"><title>u28&#45;&gt;u10</title>-<path fill="none" stroke="black" d="M1681.28,-926.048C1681.28,-891.587 1681.28,-813.918 1681.28,-772.496"/>-<polygon fill="black" stroke="black" points="1684.78,-772.316 1681.28,-762.316 1677.78,-772.316 1684.78,-772.316"/>-</g>-<!-- u29 -->-<g id="node20" class="node"><title>u29</title>-<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1736.28" cy="-1135.27" rx="28.6953" ry="18"/>-<text text-anchor="middle" x="1736.28" y="-1131.57" font-family="Times,serif" font-size="14.00">Turn</text>-</g>-<!-- u29&#45;&gt;u28 -->-<g id="edge47" class="edge"><title>u29&#45;&gt;u28</title>-<path fill="none" stroke="black" d="M1731.4,-1117.5C1721.84,-1084.66 1700.59,-1011.63 1689.07,-972.04"/>-<polygon fill="black" stroke="black" points="1692.38,-970.903 1686.23,-962.279 1685.66,-972.859 1692.38,-970.903"/>-</g>-<!-- u31 -->-<g id="node21" class="node"><title>u31</title>-<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1856.28" cy="-944.272" rx="89.8845" ry="18"/>-<text text-anchor="middle" x="1856.28" y="-940.572" font-family="Times,serif" font-size="14.00">EitherQualifiedMove</text>-</g>-<!-- u31&#45;&gt;u10 -->-<g id="edge48" class="edge"><title>u31&#45;&gt;u10</title>-<path fill="none" stroke="black" d="M1841.36,-926.391C1810.04,-890.957 1737.41,-808.778 1701.76,-768.446"/>-<polygon fill="black" stroke="black" points="1704.19,-765.909 1694.95,-760.734 1698.95,-770.545 1704.19,-765.909"/>-</g>-<!-- u32 -->-<g id="node22" class="node"><title>u32</title>-<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1652.28" cy="-1135.27" rx="37.0935" ry="18"/>-<text text-anchor="middle" x="1652.28" y="-1131.57" font-family="Times,serif" font-size="14.00">Zobrist</text>-</g>-<!-- u32&#45;&gt;u12 -->-<g id="edge49" class="edge"><title>u32&#45;&gt;u12</title>-<path fill="none" stroke="black" d="M1675.47,-1121.15C1682.71,-1117.2 1690.76,-1112.94 1698.28,-1109.27 1845.9,-1037.33 1893.56,-1041.73 2037.28,-962.272 2205.16,-869.468 2227.41,-814.613 2393.28,-718.272 2520.99,-644.095 2576.52,-664.987 2692.28,-573.272 2700.65,-566.641 2708.4,-557.918 2714.76,-549.729"/>-<polygon fill="black" stroke="black" points="2717.71,-551.622 2720.83,-541.499 2712.08,-547.463 2717.71,-551.622"/>-</g>-<!-- u32&#45;&gt;u13 -->-<g id="edge50" class="edge"><title>u32&#45;&gt;u13</title>-<path fill="none" stroke="black" d="M1674.14,-1120.73C1681.58,-1116.58 1690.1,-1112.3 1698.28,-1109.27 1949.34,-1016.27 2267.42,-969.129 2399.48,-952.462"/>-<polygon fill="black" stroke="black" points="2399.92,-955.934 2409.41,-951.221 2399.06,-948.987 2399.92,-955.934"/>-</g>-<!-- u44 -->-<g id="node23" class="node"><title>u44</title>-<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="1949.28" cy="-1135.27" rx="78.7863" ry="18"/>-<text text-anchor="middle" x="1949.28" y="-1131.57" font-family="Times,serif" font-size="14.00">PieceSquareArray</text>-</g>-<!-- u44&#45;&gt;u27 -->-<g id="edge51" class="edge"><title>u44&#45;&gt;u27</title>-<path fill="none" stroke="black" d="M1953.53,-1117.17C1961.75,-1084.13 1979.85,-1011.36 1989.65,-971.924"/>-<polygon fill="black" stroke="black" points="1993.05,-972.753 1992.07,-962.203 1986.26,-971.063 1993.05,-972.753"/>-</g>-<!-- u45 -->-<g id="node35" class="node"><title>u45</title>-<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4362.28" cy="-303.272" rx="28.6953" ry="18"/>-<text text-anchor="middle" x="4362.28" y="-299.572" font-family="Times,serif" font-size="14.00">Bool</text>-</g>-<!-- u44&#45;&gt;u45 -->-<g id="edge52" class="edge"><title>u44&#45;&gt;u45</title>-<path fill="none" stroke="black" d="M1995.87,-1120.73C2010.07,-1116.81 2025.76,-1112.67 2040.28,-1109.27 2759.25,-941.126 3002.51,-1106.21 3671.28,-793.272 3719.06,-770.914 3719.94,-748.343 3763.28,-718.272 3868.19,-645.494 3903.92,-642.38 4011.28,-573.272 4154.47,-481.1 4200.61,-469.34 4324.28,-352.272 4331.84,-345.114 4339.18,-336.405 4345.36,-328.38"/>-<polygon fill="black" stroke="black" points="4348.17,-330.468 4351.34,-320.359 4342.56,-326.284 4348.17,-330.468"/>-</g>-<!-- u2 -->-<g id="node24" class="node"><title>u2</title>-<ellipse fill="#ffbbff" stroke="black" stroke-width="0" cx="344.281" cy="-2217.27" rx="66.8882" ry="18"/>-<text text-anchor="middle" x="344.281" y="-2213.57" font-family="Times,serif" font-size="14.00">SignalHandlers</text>-</g>-<!-- u3 -->-<g id="node96" class="node"><title>u3</title>-<ellipse fill="#ff3333" stroke="black" stroke-width="0" cx="3746.28" cy="-524.272" rx="31.3957" ry="18"/>-<text text-anchor="middle" x="3746.28" y="-520.572" font-family="Times,serif" font-size="14.00">Show</text>-</g>-<!-- u2&#45;&gt;u3 -->-<g id="edge53" class="edge"><title>u2&#45;&gt;u3</title>-<path fill="none" stroke="black" d="M331.804,-2199.5C252.035,-2090.12 -174.418,-1471.47 105.281,-1109.27 595.063,-475.026 2910.52,-825.063 3671.28,-573.272 3689.39,-567.279 3707.47,-555.912 3721.33,-545.743"/>-<polygon fill="black" stroke="black" points="3723.54,-548.462 3729.39,-539.626 3719.31,-542.888 3723.54,-548.462"/>-</g>-<!-- u97 -->-<g id="node25" class="node"><title>u97</title>-<ellipse fill="#ffbbff" stroke="black" stroke-width="0" cx="478.281" cy="-2217.27" rx="49.2915" ry="18"/>-<text text-anchor="middle" x="478.281" y="-2213.57" font-family="Times,serif" font-size="14.00">Pondering</text>-</g>-<!-- u6 -->-<g id="node26" class="node"><title>u6</title>-<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3684.28" cy="-1577.27" rx="29.795" ry="18"/>-<text text-anchor="middle" x="3684.28" y="-1573.57" font-family="Times,serif" font-size="14.00">PGN</text>-</g>-<!-- u25 -->-<g id="node27" class="node"><title>u25</title>-<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3684.28" cy="-1356.27" rx="66.8882" ry="18"/>-<text text-anchor="middle" x="3684.28" y="-1352.57" font-family="Times,serif" font-size="14.00">PGNComment</text>-</g>-<!-- u6&#45;&gt;u25 -->-<g id="edge54" class="edge"><title>u6&#45;&gt;u25</title>-<path fill="none" stroke="black" d="M3684.28,-1559.09C3684.28,-1521.19 3684.28,-1430.17 3684.28,-1384.45"/>-<polygon fill="black" stroke="black" points="3687.78,-1384.38 3684.28,-1374.38 3680.78,-1384.38 3687.78,-1384.38"/>-</g>-<!-- u26 -->-<g id="node28" class="node"><title>u26</title>-<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3520.28" cy="-1356.27" rx="79.0865" ry="18"/>-<text text-anchor="middle" x="3520.28" y="-1352.57" font-family="Times,serif" font-size="14.00">StandardAlgebraic</text>-</g>-<!-- u6&#45;&gt;u26 -->-<g id="edge55" class="edge"><title>u6&#45;&gt;u26</title>-<path fill="none" stroke="black" d="M3672.49,-1560.52C3644.34,-1522.93 3573.03,-1427.71 3538.96,-1382.22"/>-<polygon fill="black" stroke="black" points="3541.66,-1379.98 3532.86,-1374.07 3536.05,-1384.17 3541.66,-1379.98"/>-</g>-<!-- u55 -->-<g id="node36" class="node"><title>u55</title>-<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4448.28" cy="-303.272" rx="38.9931" ry="18"/>-<text text-anchor="middle" x="4448.28" y="-299.572" font-family="Times,serif" font-size="14.00">Integral</text>-</g>-<!-- u6&#45;&gt;u55 -->-<g id="edge56" class="edge"><title>u6&#45;&gt;u55</title>-<path fill="none" stroke="black" d="M3709.28,-1567.33C3724.69,-1562.07 3744.95,-1555.63 3763.28,-1551.27 3961.69,-1504.16 4537.05,-1560.52 4669.28,-1405.27 4800.73,-1250.94 4657,-681.988 4571.28,-498.272 4541.12,-433.639 4493.07,-364.63 4466.85,-328.904"/>-<polygon fill="black" stroke="black" points="4469.44,-326.518 4460.67,-320.561 4463.81,-330.681 4469.44,-326.518"/>-</g>-<!-- u30 -->-<g id="node58" class="node"><title>u30</title>-<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1526.28" cy="-1577.27" rx="33.2948" ry="18"/>-<text text-anchor="middle" x="1526.28" y="-1573.57" font-family="Times,serif" font-size="14.00">Game</text>-</g>-<!-- u26&#45;&gt;u30 -->-<g id="edge57" class="edge"><title>u26&#45;&gt;u30</title>-<path fill="none" stroke="black" d="M3450.59,-1364.93C3132.33,-1399.88 1821.62,-1543.84 1568.65,-1571.62"/>-<polygon fill="black" stroke="black" points="1567.97,-1568.17 1558.41,-1572.74 1568.73,-1575.13 1567.97,-1568.17"/>-</g>-<!-- u56 -->-<g id="node29" class="node"><title>u56</title>-<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3651.28" cy="-1776.27" rx="62.2891" ry="18"/>-<text text-anchor="middle" x="3651.28" y="-1772.57" font-family="Times,serif" font-size="14.00">PGNDatabase</text>-</g>-<!-- u56&#45;&gt;u6 -->-<g id="edge58" class="edge"><title>u56&#45;&gt;u6</title>-<path fill="none" stroke="black" d="M3654.15,-1758.13C3659.91,-1723.77 3672.89,-1646.24 3679.79,-1605.1"/>-<polygon fill="black" stroke="black" points="3683.24,-1605.67 3681.44,-1595.23 3676.34,-1604.51 3683.24,-1605.67"/>-</g>-<!-- u57 -->-<g id="node30" class="node"><title>u57</title>-<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3617.28" cy="-1997.27" rx="90.9839" ry="18"/>-<text text-anchor="middle" x="3617.28" y="-1993.57" font-family="Times,serif" font-size="14.00">QualifiedMoveForest</text>-</g>-<!-- u57&#45;&gt;u56 -->-<g id="edge59" class="edge"><title>u57&#45;&gt;u56</title>-<path fill="none" stroke="black" d="M3619.95,-1979.09C3625.83,-1941.19 3639.96,-1850.17 3647.06,-1804.45"/>-<polygon fill="black" stroke="black" points="3650.55,-1804.8 3648.63,-1794.38 3643.63,-1803.72 3650.55,-1804.8"/>-</g>-<!-- u59 -->-<g id="node62" class="node"><title>u59</title>-<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1508.28" cy="-1776.27" rx="50.8918" ry="18"/>-<text text-anchor="middle" x="1508.28" y="-1772.57" font-family="Times,serif" font-size="14.00">GameTree</text>-</g>-<!-- u57&#45;&gt;u59 -->-<g id="edge60" class="edge"><title>u57&#45;&gt;u59</title>-<path fill="none" stroke="black" d="M3545.48,-1986.18C3510.46,-1981.4 3467.71,-1975.77 3429.28,-1971.27 2695.66,-1885.47 1801.74,-1803.65 1566.99,-1782.52"/>-<polygon fill="black" stroke="black" points="1567.23,-1779.03 1556.96,-1781.62 1566.6,-1786 1567.23,-1779.03"/>-</g>-<!-- u95 -->-<g id="node31" class="node"><title>u95</title>-<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="3617.28" cy="-2217.27" rx="133.776" ry="18"/>-<text text-anchor="middle" x="3617.28" y="-2213.57" font-family="Times,serif" font-size="14.00">PositionHashQualifiedMoveTree</text>-</g>-<!-- u95&#45;&gt;u57 -->-<g id="edge61" class="edge"><title>u95&#45;&gt;u57</title>-<path fill="none" stroke="black" d="M3617.28,-2199.17C3617.28,-2161.44 3617.28,-2070.84 3617.28,-2025.33"/>-<polygon fill="black" stroke="black" points="3620.78,-2025.3 3617.28,-2015.3 3613.78,-2025.3 3620.78,-2025.3"/>-</g>-<!-- u1 -->-<g id="node32" class="node"><title>u1</title>-<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4725.28" cy="-303.272" rx="29.795" ry="18"/>-<text text-anchor="middle" x="4725.28" y="-299.572" font-family="Times,serif" font-size="14.00">Float</text>-</g>-<!-- u58 -->-<g id="node37" class="node"><title>u58</title>-<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4552.28" cy="-303.272" rx="46.5926" ry="18"/>-<text text-anchor="middle" x="4552.28" y="-299.572" font-family="Times,serif" font-size="14.00">RoseTree</text>-</g>-<!-- u81 -->-<g id="node39" class="node"><title>u81</title>-<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4282.28" cy="-303.272" rx="33.2948" ry="18"/>-<text text-anchor="middle" x="4282.28" y="-299.572" font-family="Times,serif" font-size="14.00">Either</text>-</g>-<!-- u98 -->-<g id="node40" class="node"><title>u98</title>-<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4647.28" cy="-303.272" rx="30.5947" ry="18"/>-<text text-anchor="middle" x="4647.28" y="-299.572" font-family="Times,serif" font-size="14.00">Time</text>-</g>-<!-- u64 -->-<g id="node41" class="node"><title>u64</title>-<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="3279.28" cy="-1997.27" rx="138.375" ry="18"/>-<text text-anchor="middle" x="3279.28" y="-1993.57" font-family="Times,serif" font-size="14.00">PositionHashQuantifiedGameTree</text>-</g>-<!-- u74 -->-<g id="node43" class="node"><title>u74</title>-<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="3345.28" cy="-1776.27" rx="72.2875" ry="18"/>-<text text-anchor="middle" x="3345.28" y="-1772.57" font-family="Times,serif" font-size="14.00">QuantifiedGame</text>-</g>-<!-- u64&#45;&gt;u74 -->-<g id="edge62" class="edge"><title>u64&#45;&gt;u74</title>-<path fill="none" stroke="black" d="M3284.46,-1979.09C3295.91,-1941.11 3323.43,-1849.79 3337.18,-1804.16"/>-<polygon fill="black" stroke="black" points="3340.59,-1804.96 3340.13,-1794.38 3333.89,-1802.94 3340.59,-1804.96"/>-</g>-<!-- u75 -->-<g id="node47" class="node"><title>u75</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4029.28" cy="-1356.27" rx="64.189" ry="18"/>-<text text-anchor="middle" x="4029.28" y="-1352.57" font-family="Times,serif" font-size="14.00">SearchOptions</text>-</g>-<!-- u64&#45;&gt;u75 -->-<g id="edge63" class="edge"><title>u64&#45;&gt;u75</title>-<path fill="none" stroke="black" d="M3273.29,-1979.2C3251.42,-1913.45 3183.08,-1674.09 3300.28,-1551.27 3506.49,-1335.18 3681.21,-1521.68 3956.28,-1405.27 3971.83,-1398.69 3987.66,-1388.76 4000.58,-1379.63"/>-<polygon fill="black" stroke="black" points="4003,-1382.21 4009.03,-1373.5 3998.88,-1376.54 4003,-1382.21"/>-</g>-<!-- u64&#45;&gt;u59 -->-<g id="edge64" class="edge"><title>u64&#45;&gt;u59</title>-<path fill="none" stroke="black" d="M3182.81,-1984.34C2859.58,-1944.37 1820.87,-1815.93 1565.43,-1784.34"/>-<polygon fill="black" stroke="black" points="1565.62,-1780.84 1555.26,-1783.08 1564.76,-1787.78 1565.62,-1780.84"/>-</g>-<!-- u68 -->-<g id="node42" class="node"><title>u68</title>-<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="3345.28" cy="-1577.27" rx="36.2938" ry="18"/>-<text text-anchor="middle" x="3345.28" y="-1573.57" font-family="Times,serif" font-size="14.00">Fitness</text>-</g>-<!-- u72 -->-<g id="node45" class="node"><title>u72</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="3868.28" cy="-1356.27" rx="78.7863" ry="18"/>-<text text-anchor="middle" x="3868.28" y="-1352.57" font-family="Times,serif" font-size="14.00">EvaluationOptions</text>-</g>-<!-- u68&#45;&gt;u72 -->-<g id="edge65" class="edge"><title>u68&#45;&gt;u72</title>-<path fill="none" stroke="black" d="M3372.83,-1565.45C3439.96,-1538.98 3617.21,-1468.51 3763.28,-1405.27 3784.05,-1396.28 3806.93,-1385.88 3826.01,-1377.07"/>-<polygon fill="black" stroke="black" points="3827.73,-1380.13 3835.33,-1372.75 3824.79,-1373.78 3827.73,-1380.13"/>-</g>-<!-- u68&#45;&gt;u30 -->-<g id="edge66" class="edge"><title>u68&#45;&gt;u30</title>-<path fill="none" stroke="black" d="M3312.19,-1585C3164.54,-1618.46 2551.18,-1746.8 2049.28,-1692.27 1865.25,-1672.28 1651.1,-1613.82 1565.01,-1588.82"/>-<polygon fill="black" stroke="black" points="1565.98,-1585.46 1555.4,-1586.01 1564.02,-1592.18 1565.98,-1585.46"/>-</g>-<!-- u74&#45;&gt;u68 -->-<g id="edge67" class="edge"><title>u74&#45;&gt;u68</title>-<path fill="none" stroke="black" d="M3345.28,-1758.13C3345.28,-1723.93 3345.28,-1646.96 3345.28,-1605.67"/>-<polygon fill="black" stroke="black" points="3348.78,-1605.51 3345.28,-1595.51 3341.78,-1605.51 3348.78,-1605.51"/>-</g>-<!-- u71 -->-<g id="node44" class="node"><title>u71</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="3845.28" cy="-1135.27" rx="69.5877" ry="18"/>-<text text-anchor="middle" x="3845.28" y="-1131.57" font-family="Times,serif" font-size="14.00">CriteriaWeights</text>-</g>-<!-- u71&#45;&gt;u69 -->-<g id="edge68" class="edge"><title>u71&#45;&gt;u69</title>-<path fill="none" stroke="black" d="M3805.79,-1120.41C3686.39,-1077.93 3319.93,-943.319 3034.28,-793.272 3019.49,-785.504 3003.82,-775.741 2990.65,-767.052"/>-<polygon fill="black" stroke="black" points="2992.24,-763.898 2981.98,-761.245 2988.34,-769.716 2992.24,-763.898"/>-</g>-<!-- u72&#45;&gt;u66 -->-<g id="edge69" class="edge"><title>u72&#45;&gt;u66</title>-<path fill="none" stroke="black" d="M3850.23,-1338.64C3757.94,-1253.6 3338.99,-867.553 3231.48,-768.493"/>-<polygon fill="black" stroke="black" points="3233.73,-765.807 3224.01,-761.605 3228.99,-770.955 3233.73,-765.807"/>-</g>-<!-- u72&#45;&gt;u44 -->-<g id="edge70" class="edge"><title>u72&#45;&gt;u44</title>-<path fill="none" stroke="black" d="M3819.7,-1342.11C3802.05,-1337.75 3781.88,-1333.26 3763.28,-1330.27 3004.47,-1208.49 2777.81,-1400.32 2040.28,-1184.27 2020.03,-1178.34 1999.1,-1167.66 1982.42,-1157.88"/>-<polygon fill="black" stroke="black" points="1983.99,-1154.74 1973.62,-1152.58 1980.37,-1160.74 1983.99,-1154.74"/>-</g>-<!-- u72&#45;&gt;u71 -->-<g id="edge71" class="edge"><title>u72&#45;&gt;u71</title>-<path fill="none" stroke="black" d="M3866.48,-1338.09C3862.5,-1300.19 3852.94,-1209.17 3848.13,-1163.45"/>-<polygon fill="black" stroke="black" points="3851.6,-1162.96 3847.08,-1153.38 3844.64,-1163.69 3851.6,-1162.96"/>-</g>-<!-- u73 -->-<g id="node46" class="node"><title>u73</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4011.28" cy="-1135.27" rx="77.9862" ry="18"/>-<text text-anchor="middle" x="4011.28" y="-1131.57" font-family="Times,serif" font-size="14.00">PieceSquareTable</text>-</g>-<!-- u72&#45;&gt;u73 -->-<g id="edge72" class="edge"><title>u72&#45;&gt;u73</title>-<path fill="none" stroke="black" d="M3879.5,-1338.09C3904.51,-1299.79 3964.94,-1207.24 3994.47,-1162.02"/>-<polygon fill="black" stroke="black" points="3997.57,-1163.66 4000.11,-1153.38 3991.71,-1159.84 3997.57,-1163.66"/>-</g>-<!-- u73&#45;&gt;u12 -->-<g id="edge73" class="edge"><title>u73&#45;&gt;u12</title>-<path fill="none" stroke="black" d="M3965.36,-1120.57C3952.14,-1116.76 3937.67,-1112.73 3924.28,-1109.27 3315.02,-952.104 2936.41,-1285.35 2544.28,-793.272 2523.51,-767.204 2531.37,-749.003 2544.28,-718.272 2579.96,-633.378 2630.26,-641.338 2692.28,-573.272 2699.18,-565.696 2706.36,-557.094 2712.65,-549.287"/>-<polygon fill="black" stroke="black" points="2715.59,-551.218 2719.07,-541.212 2710.11,-546.862 2715.59,-551.218"/>-</g>-<!-- u73&#45;&gt;u13 -->-<g id="edge74" class="edge"><title>u73&#45;&gt;u13</title>-<path fill="none" stroke="black" d="M3967.82,-1120.23C3954.02,-1116.19 3938.62,-1112.11 3924.28,-1109.27 3390.21,-1003.39 2731.91,-960.161 2525.96,-948.633"/>-<polygon fill="black" stroke="black" points="2526.1,-945.136 2515.92,-948.076 2525.71,-952.125 2526.1,-945.136"/>-</g>-<!-- u73&#45;&gt;u45 -->-<g id="edge75" class="edge"><title>u73&#45;&gt;u45</title>-<path fill="none" stroke="black" d="M4037.14,-1118.2C4078.29,-1091.22 4158.3,-1032.8 4200.28,-962.272 4330.23,-743.963 4356.22,-425.744 4361.17,-331.518"/>-<polygon fill="black" stroke="black" points="4364.67,-331.558 4361.66,-321.4 4357.68,-331.217 4364.67,-331.558"/>-</g>-<!-- u73&#45;&gt;u67 -->-<g id="edge76" class="edge"><title>u73&#45;&gt;u67</title>-<path fill="none" stroke="black" d="M4038.27,-1118.38C4079.95,-1092.07 4158.4,-1035.06 4189.28,-962.272 4287.17,-731.56 4146.75,-419.577 4101.51,-329.547"/>-<polygon fill="black" stroke="black" points="4104.62,-327.93 4096.96,-320.604 4098.38,-331.104 4104.62,-327.93"/>-</g>-<!-- u73&#45;&gt;u40 -->-<g id="edge77" class="edge"><title>u73&#45;&gt;u40</title>-<path fill="none" stroke="black" d="M3973.64,-1119.42C3896.76,-1088.25 3726.18,-1014.62 3693.28,-962.272 3665.81,-918.575 3705.02,-537.331 3671.28,-498.272 3450.43,-242.604 3231.22,-495.597 2925.28,-352.272 2912.26,-346.173 2899.64,-336.577 2889.44,-327.564"/>-<polygon fill="black" stroke="black" points="2891.54,-324.74 2881.81,-320.538 2886.8,-329.888 2891.54,-324.74"/>-</g>-<!-- u75&#45;&gt;u60 -->-<g id="edge78" class="edge"><title>u75&#45;&gt;u60</title>-<path fill="none" stroke="black" d="M4000.14,-1340.03C3949.5,-1312.77 3843.32,-1252.13 3766.28,-1184.27 3609.93,-1046.54 3461.41,-841.821 3411.75,-770.704"/>-<polygon fill="black" stroke="black" points="3414.51,-768.542 3405.93,-762.328 3408.76,-772.537 3414.51,-768.542"/>-</g>-<!-- u75&#45;&gt;u10 -->-<g id="edge79" class="edge"><title>u75&#45;&gt;u10</title>-<path fill="none" stroke="black" d="M3993.74,-1341.22C3981.98,-1337.08 3968.72,-1332.94 3956.28,-1330.27 3615.21,-1257.03 2647.9,-1422.73 2393.28,-1184.27 2368.64,-1161.2 2400,-1137.36 2381.28,-1109.27 2295.5,-980.569 2221.93,-998.717 2085.28,-926.272 1952.65,-855.962 1787.24,-787.58 1716.27,-759.111"/>-<polygon fill="black" stroke="black" points="1717.48,-755.825 1706.89,-755.363 1714.88,-762.325 1717.48,-755.825"/>-</g>-<!-- u75&#45;&gt;u55 -->-<g id="edge80" class="edge"><title>u75&#45;&gt;u55</title>-<path fill="none" stroke="black" d="M4068.39,-1341.85C4079.64,-1338.05 4091.93,-1333.95 4103.28,-1330.27 4311.78,-1262.75 4444.26,-1360.7 4574.28,-1184.27 4779.11,-906.33 4529.73,-442.147 4463.56,-329.475"/>-<polygon fill="black" stroke="black" points="4466.54,-327.635 4458.43,-320.817 4460.52,-331.204 4466.54,-327.635"/>-</g>-<!-- u76 -->-<g id="node48" class="node"><title>u76</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4462.28" cy="-1135.27" rx="103.182" ry="18"/>-<text text-anchor="middle" x="4462.28" y="-1131.57" font-family="Times,serif" font-size="14.00">StandardOpeningOptions</text>-</g>-<!-- u75&#45;&gt;u76 -->-<g id="edge81" class="edge"><title>u75&#45;&gt;u76</title>-<path fill="none" stroke="black" d="M4059.04,-1340.22C4134.72,-1301.94 4334.62,-1200.84 4421.26,-1157.02"/>-<polygon fill="black" stroke="black" points="4422.93,-1160.1 4430.27,-1152.46 4419.77,-1153.85 4422.93,-1160.1"/>-</g>-<!-- u76&#45;&gt;u45 -->-<g id="edge82" class="edge"><title>u76&#45;&gt;u45</title>-<path fill="none" stroke="black" d="M4460.32,-1117.06C4451.86,-1042.97 4417.58,-743.79 4387.28,-498.272 4379.94,-438.762 4370.83,-369.053 4365.89,-331.525"/>-<polygon fill="black" stroke="black" points="4369.33,-330.849 4364.55,-321.392 4362.39,-331.764 4369.33,-330.849"/>-</g>-<!-- u76&#45;&gt;u5 -->-<g id="edge83" class="edge"><title>u76&#45;&gt;u5</title>-<path fill="none" stroke="black" d="M4402.6,-1120.51C4236.15,-1081.99 3778.29,-975.066 3768.28,-962.272 3640.58,-799.06 3843.3,-703.463 3814.28,-498.272 3805.6,-436.88 3782.18,-367.715 3768.54,-330.823"/>-<polygon fill="black" stroke="black" points="3771.75,-329.44 3764.97,-321.306 3765.2,-331.899 3771.75,-329.44"/>-</g>-<!-- u77 -->-<g id="node49" class="node"><title>u77</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4161.28" cy="-1356.27" rx="49.2915" ry="18"/>-<text text-anchor="middle" x="4161.28" y="-1352.57" font-family="Times,serif" font-size="14.00">IOOptions</text>-</g>-<!-- u79 -->-<g id="node51" class="node"><title>u79</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4282.28" cy="-1135.27" rx="58.4896" ry="18"/>-<text text-anchor="middle" x="4282.28" y="-1131.57" font-family="Times,serif" font-size="14.00">PGNOptions</text>-</g>-<!-- u77&#45;&gt;u79 -->-<g id="edge84" class="edge"><title>u77&#45;&gt;u79</title>-<path fill="none" stroke="black" d="M4170.57,-1338.45C4191.6,-1300.39 4242.94,-1207.47 4268.02,-1162.08"/>-<polygon fill="black" stroke="black" points="4271.18,-1163.6 4272.96,-1153.15 4265.06,-1160.21 4271.18,-1163.6"/>-</g>-<!-- u80 -->-<g id="node52" class="node"><title>u80</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4156.28" cy="-1135.27" rx="49.2915" ry="18"/>-<text text-anchor="middle" x="4156.28" y="-1131.57" font-family="Times,serif" font-size="14.00">UIOptions</text>-</g>-<!-- u77&#45;&gt;u80 -->-<g id="edge85" class="edge"><title>u77&#45;&gt;u80</title>-<path fill="none" stroke="black" d="M4160.89,-1338.09C4160.02,-1300.19 4157.94,-1209.17 4156.9,-1163.45"/>-<polygon fill="black" stroke="black" points="4160.4,-1163.29 4156.67,-1153.38 4153.4,-1163.45 4160.4,-1163.29"/>-</g>-<!-- u78 -->-<g id="node50" class="node"><title>u78</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="3990.28" cy="-744.272" rx="65.7887" ry="18"/>-<text text-anchor="middle" x="3990.28" y="-740.572" font-family="Times,serif" font-size="14.00">CECPFeatures</text>-</g>-<!-- u78&#45;&gt;u16 -->-<g id="edge86" class="edge"><title>u78&#45;&gt;u16</title>-<path fill="none" stroke="black" d="M3997.73,-726.332C4027.19,-659.322 4135.72,-412.456 4171.65,-330.737"/>-<polygon fill="black" stroke="black" points="4174.93,-331.962 4175.75,-321.399 4168.52,-329.145 4174.93,-331.962"/>-</g>-<!-- u78&#45;&gt;u45 -->-<g id="edge87" class="edge"><title>u78&#45;&gt;u45</title>-<path fill="none" stroke="black" d="M4016.88,-727.798C4061.43,-700.881 4152.05,-641.724 4211.28,-573.272 4279.15,-494.842 4330.74,-381.136 4351.85,-330.407"/>-<polygon fill="black" stroke="black" points="4355.21,-331.431 4355.77,-320.851 4348.74,-328.772 4355.21,-331.431"/>-</g>-<!-- u78&#45;&gt;u5 -->-<g id="edge88" class="edge"><title>u78&#45;&gt;u5</title>-<path fill="none" stroke="black" d="M3981.83,-726.244C3961.93,-686.248 3910.39,-583.264 3865.28,-498.272 3833.09,-437.61 3793.75,-367.199 3772.9,-330.144"/>-<polygon fill="black" stroke="black" points="3775.73,-328.034 3767.77,-321.04 3769.63,-331.471 3775.73,-328.034"/>-</g>-<!-- u79&#45;&gt;u6 -->-<g id="edge89" class="edge"><title>u79&#45;&gt;u6</title>-<path fill="none" stroke="black" d="M4262.73,-1152.39C4249.64,-1162.58 4231.68,-1175.44 4214.28,-1184.27 4032.8,-1276.36 3919.51,-1181.84 3780.28,-1330.27 3756.68,-1355.43 3771.77,-1372.74 3760.28,-1405.27 3741.58,-1458.25 3713.46,-1517.68 3697.19,-1550.68"/>-<polygon fill="black" stroke="black" points="3694.05,-1549.13 3692.73,-1559.64 3700.32,-1552.24 3694.05,-1549.13"/>-</g>-<!-- u80&#45;&gt;u55 -->-<g id="edge90" class="edge"><title>u80&#45;&gt;u55</title>-<path fill="none" stroke="black" d="M4187.6,-1121.29C4239.35,-1098 4341.5,-1043.8 4387.28,-962.272 4508.71,-746.003 4468.55,-425.745 4453.12,-331.37"/>-<polygon fill="black" stroke="black" points="4456.53,-330.523 4451.42,-321.243 4449.63,-331.685 4456.53,-330.523"/>-</g>-<!-- u80&#45;&gt;u81 -->-<g id="edge91" class="edge"><title>u80&#45;&gt;u81</title>-<path fill="none" stroke="black" d="M4125.75,-1121C4034.66,-1081.36 3770.94,-966.359 3768.28,-962.272 3759.56,-948.861 3763.44,-941.521 3768.28,-926.272 3814.18,-781.81 4219.03,-376.375 4240.28,-352.272 4247.27,-344.342 4254.89,-335.651 4261.69,-327.87"/>-<polygon fill="black" stroke="black" points="4264.75,-329.695 4268.69,-319.862 4259.47,-325.089 4264.75,-329.695"/>-</g>-<!-- u82 -->-<g id="node53" class="node"><title>u82</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="3841.28" cy="-944.272" rx="63.8893" ry="18"/>-<text text-anchor="middle" x="3841.28" y="-940.572" font-family="Times,serif" font-size="14.00">CECPOptions</text>-</g>-<!-- u80&#45;&gt;u82 -->-<g id="edge92" class="edge"><title>u80&#45;&gt;u82</title>-<path fill="none" stroke="black" d="M4131.83,-1119.6C4076.3,-1086.28 3940.56,-1004.84 3876.22,-966.233"/>-<polygon fill="black" stroke="black" points="3877.63,-963.002 3867.26,-960.859 3874.03,-969.005 3877.63,-963.002"/>-</g>-<!-- u83 -->-<g id="node54" class="node"><title>u83</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4107.28" cy="-944.272" rx="73.387" ry="18"/>-<text text-anchor="middle" x="4107.28" y="-940.572" font-family="Times,serif" font-size="14.00">NativeUIOptions</text>-</g>-<!-- u80&#45;&gt;u83 -->-<g id="edge93" class="edge"><title>u80&#45;&gt;u83</title>-<path fill="none" stroke="black" d="M4151.85,-1117.17C4143.3,-1084.22 4124.51,-1011.73 4114.27,-972.223"/>-<polygon fill="black" stroke="black" points="4117.64,-971.277 4111.74,-962.476 4110.86,-973.034 4117.64,-971.277"/>-</g>-<!-- u84 -->-<g id="node55" class="node"><title>u84</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="3969.28" cy="-944.272" rx="46.5926" ry="18"/>-<text text-anchor="middle" x="3969.28" y="-940.572" font-family="Times,serif" font-size="14.00">Verbosity</text>-</g>-<!-- u80&#45;&gt;u84 -->-<g id="edge94" class="edge"><title>u80&#45;&gt;u84</title>-<path fill="none" stroke="black" d="M4140.34,-1118.16C4107.22,-1084.68 4030.85,-1007.5 3992.35,-968.593"/>-<polygon fill="black" stroke="black" points="3994.71,-965.993 3985.18,-961.346 3989.73,-970.916 3994.71,-965.993"/>-</g>-<!-- u36 -->-<g id="node64" class="node"><title>u36</title>-<ellipse fill="#ff77ff" stroke="black" stroke-width="0" cx="430.281" cy="-1356.27" rx="64.9885" ry="18"/>-<text text-anchor="middle" x="430.281" y="-1352.57" font-family="Times,serif" font-size="14.00">MoveNotation</text>-</g>-<!-- u80&#45;&gt;u36 -->-<g id="edge95" class="edge"><title>u80&#45;&gt;u36</title>-<path fill="none" stroke="black" d="M4141.87,-1152.87C4131.11,-1163.98 4115.37,-1177.72 4098.28,-1184.27 3359.2,-1467.68 1323.82,-1225.13 539.281,-1330.27 521.345,-1332.68 502.02,-1336.64 484.696,-1340.72"/>-<polygon fill="black" stroke="black" points="483.652,-1337.37 474.752,-1343.12 485.294,-1344.17 483.652,-1337.37"/>-</g>-<!-- u62 -->-<g id="node76" class="node"><title>u62</title>-<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2963.28" cy="-303.272" rx="28.6953" ry="18"/>-<text text-anchor="middle" x="2963.28" y="-299.572" font-family="Times,serif" font-size="14.00">Tree</text>-</g>-<!-- u80&#45;&gt;u62 -->-<g id="edge96" class="edge"><title>u80&#45;&gt;u62</title>-<path fill="none" stroke="black" d="M4125.61,-1120.96C4116.8,-1117.16 4107.17,-1113.03 4098.28,-1109.27 3940.98,-1042.81 3847.09,-1097.87 3743.28,-962.272 3727.48,-941.634 3700.9,-517.379 3683.28,-498.272 3471.65,-268.812 3255.84,-525.671 2996.28,-352.272 2987.88,-346.662 2981.01,-338.123 2975.76,-329.795"/>-<polygon fill="black" stroke="black" points="2978.72,-327.914 2970.7,-320.989 2972.65,-331.403 2978.72,-327.914"/>-</g>-<!-- u82&#45;&gt;u78 -->-<g id="edge97" class="edge"><title>u82&#45;&gt;u78</title>-<path fill="none" stroke="black" d="M3853.98,-926.391C3880.27,-891.467 3940.72,-811.137 3971.51,-770.215"/>-<polygon fill="black" stroke="black" points="3974.39,-772.206 3977.61,-762.111 3968.8,-767.997 3974.39,-772.206"/>-</g>-<!-- u83&#45;&gt;u49 -->-<g id="edge98" class="edge"><title>u83&#45;&gt;u49</title>-<path fill="none" stroke="black" d="M4069.48,-928.713C3977.05,-893.104 3739.78,-801.707 3639.32,-763.008"/>-<polygon fill="black" stroke="black" points="3640.34,-759.65 3629.75,-759.321 3637.82,-766.182 3640.34,-759.65"/>-</g>-<!-- u85 -->-<g id="node56" class="node"><title>u85</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4029.28" cy="-1577.27" rx="39.7935" ry="18"/>-<text text-anchor="middle" x="4029.28" y="-1573.57" font-family="Times,serif" font-size="14.00">Options</text>-</g>-<!-- u85&#45;&gt;u72 -->-<g id="edge99" class="edge"><title>u85&#45;&gt;u72</title>-<path fill="none" stroke="black" d="M4017.18,-1559.81C3989.22,-1521.78 3919.98,-1427.59 3886.71,-1382.34"/>-<polygon fill="black" stroke="black" points="3889.49,-1380.21 3880.74,-1374.23 3883.85,-1384.36 3889.49,-1380.21"/>-</g>-<!-- u85&#45;&gt;u75 -->-<g id="edge100" class="edge"><title>u85&#45;&gt;u75</title>-<path fill="none" stroke="black" d="M4029.28,-1559.09C4029.28,-1521.19 4029.28,-1430.17 4029.28,-1384.45"/>-<polygon fill="black" stroke="black" points="4032.78,-1384.38 4029.28,-1374.38 4025.78,-1384.38 4032.78,-1384.38"/>-</g>-<!-- u85&#45;&gt;u77 -->-<g id="edge101" class="edge"><title>u85&#45;&gt;u77</title>-<path fill="none" stroke="black" d="M4039.2,-1559.81C4062.09,-1521.84 4118.7,-1427.92 4146.03,-1382.57"/>-<polygon fill="black" stroke="black" points="4149.08,-1384.3 4151.24,-1373.92 4143.08,-1380.68 4149.08,-1384.3"/>-</g>-<!-- u93 -->-<g id="node57" class="node"><title>u93</title>-<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4473.28" cy="-1577.27" rx="91.784" ry="18"/>-<text text-anchor="middle" x="4473.28" y="-1573.57" font-family="Times,serif" font-size="14.00">CommandLineOption</text>-</g>-<!-- u93&#45;&gt;u16 -->-<g id="edge102" class="edge"><title>u93&#45;&gt;u16</title>-<path fill="none" stroke="black" d="M4495.81,-1559.63C4530.98,-1532.1 4597.65,-1473.32 4624.28,-1405.27 4679.93,-1263.06 4686.59,-848.776 4607.28,-718.272 4545.69,-616.927 4469.81,-654.369 4383.28,-573.272 4300.53,-495.724 4227.87,-380.366 4197.89,-329.696"/>-<polygon fill="black" stroke="black" points="4200.88,-327.866 4192.8,-321.012 4194.84,-331.408 4200.88,-327.866"/>-</g>-<!-- u34 -->-<g id="node60" class="node"><title>u34</title>-<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1452.28" cy="-1356.27" rx="105.082" ry="18"/>-<text text-anchor="middle" x="1452.28" y="-1352.57" font-family="Times,serif" font-size="14.00">GameTerminationReason</text>-</g>-<!-- u30&#45;&gt;u34 -->-<g id="edge103" class="edge"><title>u30&#45;&gt;u34</title>-<path fill="none" stroke="black" d="M1520.6,-1559.45C1507.82,-1521.65 1476.75,-1429.7 1461.31,-1383.99"/>-<polygon fill="black" stroke="black" points="1464.6,-1382.81 1458.09,-1374.45 1457.97,-1385.05 1464.6,-1382.81"/>-</g>-<!-- u30&#45;&gt;u36 -->-<g id="edge104" class="edge"><title>u30&#45;&gt;u36</title>-<path fill="none" stroke="black" d="M1506.55,-1562.41C1499.77,-1558.23 1491.95,-1554.03 1484.28,-1551.27 1084.35,-1407.51 947.234,-1524.37 539.281,-1405.27 514.839,-1398.14 488.691,-1386.76 468.133,-1376.87"/>-<polygon fill="black" stroke="black" points="469.628,-1373.71 459.107,-1372.46 466.551,-1380 469.628,-1373.71"/>-</g>-<!-- u53 -->-<g id="node92" class="node"><title>u53</title>-<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1220.28" cy="-1997.27" rx="85.2851" ry="18"/>-<text text-anchor="middle" x="1220.28" y="-1993.57" font-family="Times,serif" font-size="14.00">InstancesByPosition</text>-</g>-<!-- u30&#45;&gt;u53 -->-<g id="edge105" class="edge"><title>u30&#45;&gt;u53</title>-<path fill="none" stroke="black" d="M1512.81,-1593.96C1480.78,-1631.35 1400.85,-1725.09 1376.28,-1758.27 1320.97,-1832.96 1262.71,-1926.4 1235.7,-1970.7"/>-<polygon fill="black" stroke="black" points="1232.63,-1969.02 1230.43,-1979.38 1238.61,-1972.65 1232.63,-1969.02"/>-</g>-<!-- u54 -->-<g id="node93" class="node"><title>u54</title>-<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="846.281" cy="-2217.27" rx="40.8928" ry="18"/>-<text text-anchor="middle" x="846.281" y="-2213.57" font-family="Times,serif" font-size="14.00">Position</text>-</g>-<!-- u30&#45;&gt;u54 -->-<g id="edge106" class="edge"><title>u30&#45;&gt;u54</title>-<path fill="none" stroke="black" d="M1518.97,-1594.87C1482.72,-1677.15 1323.56,-2037.68 1314.28,-2046.27 1192.16,-2159.35 989.015,-2198.5 895.795,-2210.96"/>-<polygon fill="black" stroke="black" points="895.255,-2207.5 885.785,-2212.25 896.15,-2214.44 895.255,-2207.5"/>-</g>-<!-- u33 -->-<g id="node59" class="node"><title>u33</title>-<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1478.28" cy="-1135.27" rx="57.3905" ry="18"/>-<text text-anchor="middle" x="1478.28" y="-1131.57" font-family="Times,serif" font-size="14.00">DrawReason</text>-</g>-<!-- u33&#45;&gt;u10 -->-<g id="edge107" class="edge"><title>u33&#45;&gt;u10</title>-<path fill="none" stroke="black" d="M1487.13,-1117.31C1519.2,-1055.87 1629.37,-844.751 1667.87,-770.971"/>-<polygon fill="black" stroke="black" points="1671.09,-772.374 1672.61,-761.89 1664.88,-769.136 1671.09,-772.374"/>-</g>-<!-- u34&#45;&gt;u33 -->-<g id="edge108" class="edge"><title>u34&#45;&gt;u33</title>-<path fill="none" stroke="black" d="M1454.32,-1338.09C1458.82,-1300.19 1469.63,-1209.17 1475.05,-1163.45"/>-<polygon fill="black" stroke="black" points="1478.55,-1163.72 1476.25,-1153.38 1471.6,-1162.89 1478.55,-1163.72"/>-</g>-<!-- u35 -->-<g id="node61" class="node"><title>u35</title>-<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1368.28" cy="-1135.27" rx="33.5952" ry="18"/>-<text text-anchor="middle" x="1368.28" y="-1131.57" font-family="Times,serif" font-size="14.00">Result</text>-</g>-<!-- u34&#45;&gt;u35 -->-<g id="edge109" class="edge"><title>u34&#45;&gt;u35</title>-<path fill="none" stroke="black" d="M1445.69,-1338.09C1431.05,-1299.93 1395.77,-1207.95 1378.35,-1162.54"/>-<polygon fill="black" stroke="black" points="1381.58,-1161.16 1374.73,-1153.08 1375.04,-1163.67 1381.58,-1161.16"/>-</g>-<!-- u35&#45;&gt;u7 -->-<g id="edge110" class="edge"><title>u35&#45;&gt;u7</title>-<path fill="none" stroke="black" d="M1372.15,-1117.2C1387.74,-1052.63 1452.44,-821.771 1601.28,-718.272 1944.01,-479.946 2133.66,-706.49 2529.28,-573.272 2548.93,-566.655 2569.4,-555.924 2585.74,-546.286"/>-<polygon fill="black" stroke="black" points="2587.62,-549.242 2594.37,-541.076 2584,-543.251 2587.62,-549.242"/>-</g>-<!-- u59&#45;&gt;u60 -->-<g id="edge111" class="edge"><title>u59&#45;&gt;u60</title>-<path fill="none" stroke="black" d="M1553.75,-1768.17C1742.86,-1738.76 2485.81,-1624.73 3099.28,-1551.27 3263.13,-1531.65 4466.48,-1527.56 4577.28,-1405.27 4621.45,-1356.53 4619.46,-1159.75 4577.28,-1109.27 4341.56,-827.164 4107.97,-1090.1 3763.28,-962.272 3627.79,-912.026 3485.25,-812.925 3424.53,-768.167"/>-<polygon fill="black" stroke="black" points="3426.29,-765.116 3416.17,-761.97 3422.12,-770.738 3426.29,-765.116"/>-</g>-<!-- u59&#45;&gt;u58 -->-<g id="edge112" class="edge"><title>u59&#45;&gt;u58</title>-<path fill="none" stroke="black" d="M1557.94,-1772.53C1781.72,-1759.83 2697.54,-1704 2973.28,-1626.27 3047.33,-1605.4 3055.2,-1572.03 3129.28,-1551.27 3447.72,-1462.04 4375.31,-1637.98 4610.28,-1405.27 4718.86,-1297.73 4663.61,-869.454 4641.28,-718.272 4619.5,-570.842 4576.41,-397.306 4559.41,-331.453"/>-<polygon fill="black" stroke="black" points="4562.72,-330.279 4556.82,-321.479 4555.95,-332.037 4562.72,-330.279"/>-</g>-<!-- u59&#45;&gt;u30 -->-<g id="edge113" class="edge"><title>u59&#45;&gt;u30</title>-<path fill="none" stroke="black" d="M1509.85,-1758.13C1512.97,-1723.93 1520,-1646.96 1523.78,-1605.67"/>-<polygon fill="black" stroke="black" points="1527.28,-1605.79 1524.71,-1595.51 1520.31,-1605.15 1527.28,-1605.79"/>-</g>-<!-- u61 -->-<g id="node63" class="node"><title>u61</title>-<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="1402.28" cy="-1577.27" rx="72.5877" ry="18"/>-<text text-anchor="middle" x="1402.28" y="-1573.57" font-family="Times,serif" font-size="14.00">MoveFrequency</text>-</g>-<!-- u59&#45;&gt;u61 -->-<g id="edge114" class="edge"><title>u59&#45;&gt;u61</title>-<path fill="none" stroke="black" d="M1499.24,-1758.48C1480.71,-1724.03 1438.29,-1645.2 1416.21,-1604.17"/>-<polygon fill="black" stroke="black" points="1419.27,-1602.45 1411.45,-1595.31 1413.1,-1605.77 1419.27,-1602.45"/>-</g>-<!-- u59&#45;&gt;u62 -->-<g id="edge115" class="edge"><title>u59&#45;&gt;u62</title>-<path fill="none" stroke="black" d="M1557.61,-1771.96C1731.19,-1759.83 2329.57,-1713.85 2816.28,-1626.27 2952.82,-1601.7 2982.56,-1574.82 3119.28,-1551.27 3444.32,-1495.28 4374.83,-1649.69 4596.28,-1405.27 4640.79,-1356.14 4604.43,-752.604 4577.28,-718.272 4467.95,-580.03 3986.94,-538.237 3815.28,-498.272 3455.17,-414.433 3307.07,-552.561 2996.28,-352.272 2987.79,-346.801 2980.9,-338.293 2975.66,-329.95"/>-<polygon fill="black" stroke="black" points="2978.61,-328.064 2970.62,-321.114 2972.53,-331.534 2978.61,-328.064"/>-</g>-<!-- u61&#45;&gt;u10 -->-<g id="edge116" class="edge"><title>u61&#45;&gt;u10</title>-<path fill="none" stroke="black" d="M1360.25,-1562.45C1346.66,-1558.37 1331.44,-1554.22 1317.28,-1551.27 1061.41,-1498 323.236,-1601.21 150.281,-1405.27 128.516,-1380.62 128.592,-1134 150.281,-1109.27 481.066,-732.191 854.484,-1244.32 1269.28,-962.272 1284.42,-951.981 1275.87,-938.724 1289.28,-926.272 1395.67,-827.528 1565.4,-774.606 1641.77,-754.682"/>-<polygon fill="black" stroke="black" points="1643.09,-757.957 1651.91,-752.089 1641.36,-751.176 1643.09,-757.957"/>-</g>-<!-- u41 -->-<g id="node74" class="node"><title>u41</title>-<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2256.28" cy="-303.272" rx="35.9954" ry="18"/>-<text text-anchor="middle" x="2256.28" y="-299.572" font-family="Times,serif" font-size="14.00">Empty</text>-</g>-<!-- u61&#45;&gt;u41 -->-<g id="edge117" class="edge"><title>u61&#45;&gt;u41</title>-<path fill="none" stroke="black" d="M1426.82,-1560.16C1465.12,-1533.36 1537.68,-1475.57 1566.28,-1405.27 1571.3,-1392.95 1570.1,-939.577 1570.28,-926.272 1571.56,-833.82 1559.41,-809.53 1574.28,-718.272 1590.77,-617.133 1568.95,-568.812 1643.28,-498.272 1832.35,-318.849 1987,-485.078 2211.28,-352.272 2221.41,-346.274 2230.68,-337.326 2238.13,-328.775"/>-<polygon fill="black" stroke="black" points="2241.04,-330.751 2244.7,-320.808 2235.64,-326.3 2241.04,-330.751"/>-</g>-<!-- u42 -->-<g id="node75" class="node"><title>u42</title>-<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="2175.28" cy="-303.272" rx="27" ry="18"/>-<text text-anchor="middle" x="2175.28" y="-299.572" font-family="Times,serif" font-size="14.00">Null</text>-</g>-<!-- u61&#45;&gt;u42 -->-<g id="edge118" class="edge"><title>u61&#45;&gt;u42</title>-<path fill="none" stroke="black" d="M1360.25,-1562.43C1346.66,-1558.36 1331.44,-1554.21 1317.28,-1551.27 1057.69,-1497.47 323.373,-1590.06 133.281,-1405.27 59.1384,-1333.2 63.2806,-1048.67 63.2806,-945.272 63.2806,-945.272 63.2806,-945.272 63.2806,-743.272 63.2806,-301.653 1855.77,-301.138 2138.06,-303.795"/>-<polygon fill="black" stroke="black" points="2138.16,-307.296 2148.19,-303.898 2138.23,-300.297 2138.16,-307.296"/>-</g>-<!-- u36&#45;&gt;u29 -->-<g id="edge119" class="edge"><title>u36&#45;&gt;u29</title>-<path fill="none" stroke="black" d="M476.481,-1343.6C495.799,-1339 518.539,-1333.95 539.281,-1330.27 1050.5,-1239.68 1245.99,-1439.19 1698.28,-1184.27 1707.86,-1178.87 1715.91,-1169.99 1722.09,-1161.33"/>-<polygon fill="black" stroke="black" points="1725.08,-1163.16 1727.65,-1152.88 1719.23,-1159.31 1725.08,-1163.16"/>-</g>-<!-- u36&#45;&gt;u31 -->-<g id="edge120" class="edge"><title>u36&#45;&gt;u31</title>-<path fill="none" stroke="black" d="M437.747,-1338.12C461.94,-1282.58 536.763,-1111.13 539.281,-1109.27 758.645,-947.015 1488.33,-1001.94 1758.28,-962.272 1765.97,-961.143 1773.98,-959.885 1781.97,-958.579"/>-<polygon fill="black" stroke="black" points="1782.75,-961.997 1792.04,-956.905 1781.61,-955.091 1782.75,-961.997"/>-</g>-<!-- u37 -->-<g id="node65" class="node"><title>u37</title>-<ellipse fill="#ff77ff" stroke="black" stroke-width="0" cx="214.281" cy="-1135.27" rx="51.9908" ry="18"/>-<text text-anchor="middle" x="214.281" y="-1131.57" font-family="Times,serif" font-size="14.00">Coordinate</text>-</g>-<!-- u36&#45;&gt;u37 -->-<g id="edge121" class="edge"><title>u36&#45;&gt;u37</title>-<path fill="none" stroke="black" d="M414.046,-1338.81C376.112,-1300.35 281.555,-1204.48 237.523,-1159.84"/>-<polygon fill="black" stroke="black" points="239.924,-1157.29 230.409,-1152.63 234.94,-1162.2 239.924,-1157.29"/>-</g>-<!-- u38 -->-<g id="node66" class="node"><title>u38</title>-<ellipse fill="#ff77ff" stroke="black" stroke-width="0" cx="348.281" cy="-1135.27" rx="64.189" ry="18"/>-<text text-anchor="middle" x="348.281" y="-1131.57" font-family="Times,serif" font-size="14.00">ICCFNumeric</text>-</g>-<!-- u36&#45;&gt;u38 -->-<g id="edge122" class="edge"><title>u36&#45;&gt;u38</title>-<path fill="none" stroke="black" d="M423.846,-1338.09C409.595,-1300.03 375.288,-1208.4 358.241,-1162.87"/>-<polygon fill="black" stroke="black" points="361.47,-1161.51 354.685,-1153.38 354.914,-1163.97 361.47,-1161.51"/>-</g>-<!-- u39 -->-<g id="node67" class="node"><title>u39</title>-<ellipse fill="#ff77ff" stroke="black" stroke-width="0" cx="463.281" cy="-1135.27" rx="32.4942" ry="18"/>-<text text-anchor="middle" x="463.281" y="-1131.57" font-family="Times,serif" font-size="14.00">Smith</text>-</g>-<!-- u36&#45;&gt;u39 -->-<g id="edge123" class="edge"><title>u36&#45;&gt;u39</title>-<path fill="none" stroke="black" d="M432.87,-1338.09C438.581,-1300.19 452.296,-1209.17 459.185,-1163.45"/>-<polygon fill="black" stroke="black" points="462.674,-1163.79 460.703,-1153.38 455.752,-1162.74 462.674,-1163.79"/>-</g>-<!-- u36&#45;&gt;u40 -->-<g id="edge124" class="edge"><title>u36&#45;&gt;u40</title>-<path fill="none" stroke="black" d="M390.854,-1341.91C297.07,-1308.03 74.2451,-1214 153.281,-1109.27 522.717,-619.728 2263.4,-635.701 2807.28,-352.272 2819.85,-345.724 2832.25,-336.231 2842.41,-327.413"/>-<polygon fill="black" stroke="black" points="2844.94,-329.842 2850.04,-320.555 2840.26,-324.635 2844.94,-329.842"/>-</g>-<!-- u37&#45;&gt;u10 -->-<g id="edge125" class="edge"><title>u37&#45;&gt;u10</title>-<path fill="none" stroke="black" d="M243.868,-1120.44C253.687,-1116.32 264.791,-1112.14 275.281,-1109.27 714.587,-989.362 914.429,-1220.84 1289.28,-962.272 1304.35,-951.88 1295.99,-938.859 1309.28,-926.272 1409.76,-831.105 1569.73,-776.657 1642.71,-755.546"/>-<polygon fill="black" stroke="black" points="1643.76,-758.888 1652.42,-752.788 1641.84,-752.155 1643.76,-758.888"/>-</g>-<!-- u38&#45;&gt;u10 -->-<g id="edge126" class="edge"><title>u38&#45;&gt;u10</title>-<path fill="none" stroke="black" d="M385.198,-1120.49C396.935,-1116.47 410.046,-1112.33 422.281,-1109.27 809.945,-1012.34 962.53,-1160.88 1309.28,-962.272 1327.35,-951.921 1323.1,-939.391 1339.28,-926.272 1438.79,-845.574 1579.83,-784.661 1645.31,-758.84"/>-<polygon fill="black" stroke="black" points="1646.74,-762.04 1654.78,-755.143 1644.19,-755.519 1646.74,-762.04"/>-</g>-<!-- u39&#45;&gt;u28 -->-<g id="edge127" class="edge"><title>u39&#45;&gt;u28</title>-<path fill="none" stroke="black" d="M487.933,-1123.45C500.162,-1118.47 515.278,-1112.87 529.281,-1109.27 927.479,-1006.85 1420.66,-963.627 1606.11,-950.21"/>-<polygon fill="black" stroke="black" points="1606.57,-953.686 1616.3,-949.48 1606.07,-946.703 1606.57,-953.686"/>-</g>-<!-- u23&#45;&gt;u18 -->-<g id="edge128" class="edge"><title>u23&#45;&gt;u18</title>-<path fill="none" stroke="black" d="M2378.19,-287.363C2429.86,-253.746 2555.55,-171.962 2615.04,-133.249"/>-<polygon fill="black" stroke="black" points="2617.19,-136.028 2623.66,-127.64 2613.37,-130.16 2617.19,-136.028"/>-</g>-<!-- u86 -->-<g id="node77" class="node"><title>u86</title>-<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2271.28" cy="-1776.27" rx="53.8905" ry="18"/>-<text text-anchor="middle" x="2271.28" y="-1772.57" font-family="Times,serif" font-size="14.00">SearchState</text>-</g>-<!-- u86&#45;&gt;u64 -->-<g id="edge129" class="edge"><title>u86&#45;&gt;u64</title>-<path fill="none" stroke="black" d="M2315.11,-1786.79C2471.2,-1820.71 3001.33,-1935.89 3201.71,-1979.42"/>-<polygon fill="black" stroke="black" points="3201.06,-1982.86 3211.58,-1981.56 3202.55,-1976.02 3201.06,-1982.86"/>-</g>-<!-- u87 -->-<g id="node78" class="node"><title>u87</title>-<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2253.28" cy="-1577.27" rx="83.3857" ry="18"/>-<text text-anchor="middle" x="2253.28" y="-1573.57" font-family="Times,serif" font-size="14.00">DynamicMoveData</text>-</g>-<!-- u86&#45;&gt;u87 -->-<g id="edge130" class="edge"><title>u86&#45;&gt;u87</title>-<path fill="none" stroke="black" d="M2269.71,-1758.13C2266.59,-1723.93 2259.56,-1646.96 2255.78,-1605.67"/>-<polygon fill="black" stroke="black" points="2259.25,-1605.15 2254.86,-1595.51 2252.28,-1605.79 2259.25,-1605.15"/>-</g>-<!-- u87&#45;&gt;u29 -->-<g id="edge131" class="edge"><title>u87&#45;&gt;u29</title>-<path fill="none" stroke="black" d="M2233.11,-1559.63C2196.26,-1529.18 2115.62,-1462.38 2048.28,-1405.27 1940.07,-1313.5 1812.2,-1202.42 1760.13,-1157.07"/>-<polygon fill="black" stroke="black" points="1762.28,-1154.3 1752.44,-1150.37 1757.68,-1159.58 1762.28,-1154.3"/>-</g>-<!-- u87&#45;&gt;u75 -->-<g id="edge132" class="edge"><title>u87&#45;&gt;u75</title>-<path fill="none" stroke="black" d="M2334.53,-1573.24C2630.71,-1561.42 3651.03,-1513.55 3956.28,-1405.27 3972.7,-1399.45 3989.08,-1389.19 4002.15,-1379.65"/>-<polygon fill="black" stroke="black" points="4004.36,-1382.36 4010.23,-1373.53 4000.14,-1376.78 4004.36,-1382.36"/>-</g>-<!-- u89 -->-<g id="node80" class="node"><title>u89</title>-<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2114.28" cy="-1356.27" rx="57.3905" ry="18"/>-<text text-anchor="middle" x="2114.28" y="-1352.57" font-family="Times,serif" font-size="14.00">KillerMoves</text>-</g>-<!-- u87&#45;&gt;u89 -->-<g id="edge133" class="edge"><title>u87&#45;&gt;u89</title>-<path fill="none" stroke="black" d="M2242.37,-1559.09C2218,-1520.69 2159.04,-1427.79 2130.41,-1382.68"/>-<polygon fill="black" stroke="black" points="2133.26,-1380.64 2124.95,-1374.08 2127.35,-1384.39 2133.26,-1380.64"/>-</g>-<!-- u90 -->-<g id="node81" class="node"><title>u90</title>-<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2253.28" cy="-1356.27" rx="63.8893" ry="18"/>-<text text-anchor="middle" x="2253.28" y="-1352.57" font-family="Times,serif" font-size="14.00">Transpositions</text>-</g>-<!-- u87&#45;&gt;u90 -->-<g id="edge134" class="edge"><title>u87&#45;&gt;u90</title>-<path fill="none" stroke="black" d="M2253.28,-1559.09C2253.28,-1521.19 2253.28,-1430.17 2253.28,-1384.45"/>-<polygon fill="black" stroke="black" points="2256.78,-1384.38 2253.28,-1374.38 2249.78,-1384.38 2256.78,-1384.38"/>-</g>-<!-- u88 -->-<g id="node79" class="node"><title>u88</title>-<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2120.28" cy="-1135.27" rx="67.6881" ry="18"/>-<text text-anchor="middle" x="2120.28" y="-1131.57" font-family="Times,serif" font-size="14.00">EphemeralData</text>-</g>-<!-- u88&#45;&gt;u10 -->-<g id="edge135" class="edge"><title>u88&#45;&gt;u10</title>-<path fill="none" stroke="black" d="M2117.63,-1117.01C2110.88,-1078.35 2089.72,-983.693 2037.28,-926.272 1947.71,-828.186 1792.83,-775.54 1720.55,-755.255"/>-<polygon fill="black" stroke="black" points="1721.07,-751.769 1710.5,-752.496 1719.22,-758.52 1721.07,-751.769"/>-</g>-<!-- u89&#45;&gt;u41 -->-<g id="edge136" class="edge"><title>u89&#45;&gt;u41</title>-<path fill="none" stroke="black" d="M2065.02,-1346.88C1944.58,-1325.27 1640.66,-1263.79 1581.28,-1184.27 1565.79,-1163.53 1575.51,-742.967 1583.28,-718.272 1618.3,-607.037 1632.98,-568.235 1726.28,-498.272 1906.38,-363.222 2019.96,-470.897 2211.28,-352.272 2221.29,-346.069 2230.53,-337.08 2238,-328.555"/>-<polygon fill="black" stroke="black" points="2240.89,-330.556 2244.59,-320.629 2235.51,-326.081 2240.89,-330.556"/>-</g>-<!-- u89&#45;&gt;u88 -->-<g id="edge137" class="edge"><title>u89&#45;&gt;u88</title>-<path fill="none" stroke="black" d="M2114.75,-1338.09C2115.79,-1300.19 2118.28,-1209.17 2119.54,-1163.45"/>-<polygon fill="black" stroke="black" points="2123.04,-1163.47 2119.81,-1153.38 2116.04,-1163.28 2123.04,-1163.47"/>-</g>-<!-- u90&#45;&gt;u41 -->-<g id="edge138" class="edge"><title>u90&#45;&gt;u41</title>-<path fill="none" stroke="black" d="M2215.58,-1341.7C2204.29,-1337.81 2191.84,-1333.7 2180.28,-1330.27 1925.86,-1254.77 1764.39,-1393.62 1601.28,-1184.27 1569.46,-1143.43 1575.77,-763.329 1601.28,-718.272 1757.06,-443.144 1965.25,-550.838 2211.28,-352.272 2220.17,-345.096 2228.99,-336.199 2236.42,-328.022"/>-<polygon fill="black" stroke="black" points="2239.09,-330.292 2243.09,-320.483 2233.85,-325.654 2239.09,-330.292"/>-</g>-<!-- u90&#45;&gt;u88 -->-<g id="edge139" class="edge"><title>u90&#45;&gt;u88</title>-<path fill="none" stroke="black" d="M2243.07,-1338.45C2219.9,-1300.31 2163.28,-1207.08 2135.78,-1161.79"/>-<polygon fill="black" stroke="black" points="2138.71,-1159.88 2130.53,-1153.15 2132.73,-1163.51 2138.71,-1159.88"/>-</g>-<!-- u91 -->-<g id="node82" class="node"><title>u91</title>-<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2287.28" cy="-1135.27" rx="81.7856" ry="18"/>-<text text-anchor="middle" x="2287.28" y="-1131.57" font-family="Times,serif" font-size="14.00">TranspositionValue</text>-</g>-<!-- u90&#45;&gt;u91 -->-<g id="edge140" class="edge"><title>u90&#45;&gt;u91</title>-<path fill="none" stroke="black" d="M2255.95,-1338.09C2261.83,-1300.19 2275.96,-1209.17 2283.06,-1163.45"/>-<polygon fill="black" stroke="black" points="2286.55,-1163.8 2284.63,-1153.38 2279.63,-1162.72 2286.55,-1163.8"/>-</g>-<!-- u91&#45;&gt;u10 -->-<g id="edge141" class="edge"><title>u91&#45;&gt;u10</title>-<path fill="none" stroke="black" d="M2271.73,-1117.42C2236.19,-1079.59 2145.13,-986.539 2055.28,-926.272 1939.66,-848.718 1785.79,-785.222 1717.07,-758.669"/>-<polygon fill="black" stroke="black" points="1718.15,-755.336 1707.56,-755.022 1715.64,-761.872 1718.15,-755.336"/>-</g>-<!-- u99 -->-<g id="node83" class="node"><title>u99</title>-<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2333.28" cy="-2217.27" rx="35.9954" ry="18"/>-<text text-anchor="middle" x="2333.28" y="-2213.57" font-family="Times,serif" font-size="14.00">Search</text>-</g>-<!-- u100 -->-<g id="node84" class="node"><title>u100</title>-<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="2307.28" cy="-1997.27" rx="49.2915" ry="18"/>-<text text-anchor="middle" x="2307.28" y="-1993.57" font-family="Times,serif" font-size="14.00">AlphaBeta</text>-</g>-<!-- u99&#45;&gt;u100 -->-<g id="edge142" class="edge"><title>u99&#45;&gt;u100</title>-<path fill="none" stroke="black" d="M2331.24,-2199.17C2326.74,-2161.44 2315.94,-2070.84 2310.51,-2025.33"/>-<polygon fill="black" stroke="black" points="2313.97,-2024.81 2309.31,-2015.3 2307.02,-2025.64 2313.97,-2024.81"/>-</g>-<!-- u100&#45;&gt;u86 -->-<g id="edge143" class="edge"><title>u100&#45;&gt;u86</title>-<path fill="none" stroke="black" d="M2304.46,-1979.09C2298.23,-1941.19 2283.26,-1850.17 2275.75,-1804.45"/>-<polygon fill="black" stroke="black" points="2279.17,-1803.68 2274.09,-1794.38 2272.26,-1804.81 2279.17,-1803.68"/>-</g>-<!-- u43 -->-<g id="node85" class="node"><title>u43</title>-<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="796.281" cy="-1776.27" rx="33.2948" ry="18"/>-<text text-anchor="middle" x="796.281" y="-1772.57" font-family="Times,serif" font-size="14.00">Board</text>-</g>-<!-- u47 -->-<g id="node87" class="node"><title>u47</title>-<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="870.281" cy="-1577.27" rx="150.273" ry="18"/>-<text text-anchor="middle" x="870.281" y="-1573.57" font-family="Times,serif" font-size="14.00">CoordinatesByRankByLogicalColour</text>-</g>-<!-- u43&#45;&gt;u47 -->-<g id="edge144" class="edge"><title>u43&#45;&gt;u47</title>-<path fill="none" stroke="black" d="M802.59,-1758.48C815.473,-1724.18 844.891,-1645.86 860.358,-1604.69"/>-<polygon fill="black" stroke="black" points="863.642,-1605.9 863.882,-1595.31 857.089,-1603.44 863.642,-1605.9"/>-</g>-<!-- u46 -->-<g id="node86" class="node"><title>u46</title>-<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1256.28" cy="-1135.27" rx="37.0935" ry="18"/>-<text text-anchor="middle" x="1256.28" y="-1131.57" font-family="Times,serif" font-size="14.00">Censor</text>-</g>-<!-- u46&#45;&gt;u27 -->-<g id="edge145" class="edge"><title>u46&#45;&gt;u27</title>-<path fill="none" stroke="black" d="M1279.91,-1121.26C1288.36,-1117 1298.08,-1112.52 1307.28,-1109.27 1585.75,-1010.95 1673.87,-1051.82 1955.28,-962.272 1957.57,-961.543 1959.92,-960.739 1962.26,-959.889"/>-<polygon fill="black" stroke="black" points="1963.74,-963.07 1971.82,-956.211 1961.23,-956.537 1963.74,-963.07"/>-</g>-<!-- u48 -->-<g id="node88" class="node"><title>u48</title>-<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1192.28" cy="-1356.27" rx="113.18" ry="18"/>-<text text-anchor="middle" x="1192.28" y="-1352.57" font-family="Times,serif" font-size="14.00">MaybePieceByCoordinates</text>-</g>-<!-- u47&#45;&gt;u48 -->-<g id="edge146" class="edge"><title>u47&#45;&gt;u48</title>-<path fill="none" stroke="black" d="M895.013,-1559.45C952.398,-1520.42 1094.62,-1423.69 1159.31,-1379.7"/>-<polygon fill="black" stroke="black" points="1161.6,-1382.37 1167.9,-1373.85 1157.67,-1376.58 1161.6,-1382.37"/>-</g>-<!-- u48&#45;&gt;u49 -->-<g id="edge147" class="edge"><title>u48&#45;&gt;u49</title>-<path fill="none" stroke="black" d="M1206.55,-1338.04C1230.24,-1308.5 1277.52,-1245.46 1302.28,-1184.27 1315.03,-1152.76 1292.9,-1132.96 1317.28,-1109.27 1404.26,-1024.77 2273.25,-943.564 2393.28,-926.272 2891.62,-854.485 3044.21,-962.835 3518.28,-793.272 3534.88,-787.336 3551.57,-777.165 3564.98,-767.71"/>-<polygon fill="black" stroke="black" points="3567.27,-770.373 3573.28,-761.651 3563.14,-764.718 3567.27,-770.373"/>-</g>-<!-- u48&#45;&gt;u10 -->-<g id="edge148" class="edge"><title>u48&#45;&gt;u10</title>-<path fill="none" stroke="black" d="M1189.04,-1338.16C1181.99,-1296.21 1169.04,-1186.04 1210.28,-1109.27 1262.63,-1011.82 1556.84,-822.783 1651.76,-763.506"/>-<polygon fill="black" stroke="black" points="1653.67,-766.44 1660.31,-758.182 1649.97,-760.498 1653.67,-766.44"/>-</g>-<!-- u48&#45;&gt;u32 -->-<g id="edge149" class="edge"><title>u48&#45;&gt;u32</title>-<path fill="none" stroke="black" d="M1231.42,-1339.31C1300.95,-1310.58 1450.07,-1247.28 1571.28,-1184.27 1588.34,-1175.41 1606.81,-1164.56 1621.81,-1155.42"/>-<polygon fill="black" stroke="black" points="1623.97,-1158.2 1630.65,-1149.98 1620.3,-1152.24 1623.97,-1158.2"/>-</g>-<!-- u48&#45;&gt;u44 -->-<g id="edge150" class="edge"><title>u48&#45;&gt;u44</title>-<path fill="none" stroke="black" d="M1244.31,-1340.22C1381.16,-1300.63 1750.34,-1193.82 1892.45,-1152.71"/>-<polygon fill="black" stroke="black" points="1893.65,-1156.01 1902.29,-1149.87 1891.71,-1149.28 1893.65,-1156.01"/>-</g>-<!-- u48&#45;&gt;u41 -->-<g id="edge151" class="edge"><title>u48&#45;&gt;u41</title>-<path fill="none" stroke="black" d="M1107.78,-1344.28C926.032,-1315.4 514.281,-1219.7 514.281,-945.272 514.281,-945.272 514.281,-945.272 514.281,-743.272 514.281,-436.622 862.198,-574.275 1159.28,-498.272 1616.59,-381.28 1792.1,-569.317 2211.28,-352.272 2222,-346.723 2231.53,-337.578 2239.04,-328.751"/>-<polygon fill="black" stroke="black" points="2241.84,-330.849 2245.33,-320.846 2236.37,-326.488 2241.84,-330.849"/>-</g>-<!-- u48&#45;&gt;u46 -->-<g id="edge152" class="edge"><title>u48&#45;&gt;u46</title>-<path fill="none" stroke="black" d="M1197.3,-1338.09C1208.4,-1300.11 1235.09,-1208.79 1248.42,-1163.16"/>-<polygon fill="black" stroke="black" points="1251.84,-1163.96 1251.28,-1153.38 1245.12,-1161.99 1251.84,-1163.96"/>-</g>-<!-- u50 -->-<g id="node89" class="node"><title>u50</title>-<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="689.281" cy="-1997.27" rx="137.576" ry="18"/>-<text text-anchor="middle" x="689.281" y="-1993.57" font-family="Times,serif" font-size="14.00">CastleableRooksByLogicalColour</text>-</g>-<!-- u50&#45;&gt;u29 -->-<g id="edge153" class="edge"><title>u50&#45;&gt;u29</title>-<path fill="none" stroke="black" d="M771.419,-1982.82C984.797,-1947.53 1542.16,-1853.15 1571.28,-1825.27 1765.87,-1638.97 1748.27,-1267.13 1739.13,-1163.59"/>-<polygon fill="black" stroke="black" points="1742.59,-1162.99 1738.17,-1153.36 1735.62,-1163.64 1742.59,-1162.99"/>-</g>-<!-- u50&#45;&gt;u43 -->-<g id="edge154" class="edge"><title>u50&#45;&gt;u43</title>-<path fill="none" stroke="black" d="M697.677,-1979.09C716.403,-1940.76 761.671,-1848.11 783.75,-1802.92"/>-<polygon fill="black" stroke="black" points="786.971,-1804.3 788.216,-1793.78 780.682,-1801.23 786.971,-1804.3"/>-</g>-<!-- u51 -->-<g id="node90" class="node"><title>u51</title>-<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="648.281" cy="-1776.27" rx="96.6831" ry="18"/>-<text text-anchor="middle" x="648.281" y="-1772.57" font-family="Times,serif" font-size="14.00">TurnsByLogicalColour</text>-</g>-<!-- u50&#45;&gt;u51 -->-<g id="edge155" class="edge"><title>u50&#45;&gt;u51</title>-<path fill="none" stroke="black" d="M686.063,-1979.09C678.968,-1941.19 661.928,-1850.17 653.369,-1804.45"/>-<polygon fill="black" stroke="black" points="656.763,-1803.56 651.483,-1794.38 649.883,-1804.85 656.763,-1803.56"/>-</g>-<!-- u51&#45;&gt;u10 -->-<g id="edge156" class="edge"><title>u51&#45;&gt;u10</title>-<path fill="none" stroke="black" d="M605.086,-1760.12C500.645,-1720.84 235.522,-1604.62 133.281,-1405.27 103.262,-1346.74 89.912,-1158.73 133.281,-1109.27 463.128,-733.128 835.626,-1243.65 1249.28,-962.272 1264.41,-951.978 1255.75,-938.598 1269.28,-926.272 1381.76,-823.809 1561.55,-772.491 1641.14,-753.801"/>-<polygon fill="black" stroke="black" points="1642.27,-757.131 1651.23,-751.479 1640.7,-750.309 1642.27,-757.131"/>-</g>-<!-- u51&#45;&gt;u41 -->-<g id="edge157" class="edge"><title>u51&#45;&gt;u41</title>-<path fill="none" stroke="black" d="M579.706,-1763.47C494.671,-1745.94 348.912,-1706.12 250.281,-1626.27 4.41424,-1427.22 43.2806,-1261.61 43.2806,-945.272 43.2806,-945.272 43.2806,-945.272 43.2806,-743.272 43.2806,-475.266 334.888,-565.673 594.281,-498.272 1292.68,-316.8 1562.74,-668.636 2211.28,-352.272 2222.28,-346.904 2231.96,-337.617 2239.5,-328.633"/>-<polygon fill="black" stroke="black" points="2242.38,-330.622 2245.79,-320.589 2236.87,-326.309 2242.38,-330.622"/>-</g>-<!-- u51&#45;&gt;u42 -->-<g id="edge158" class="edge"><title>u51&#45;&gt;u42</title>-<path fill="none" stroke="black" d="M571.336,-1765.28C431.925,-1745.6 145.725,-1697.46 78.2806,-1626.27 -5.64588,-1537.69 23.2806,-1479.3 23.2806,-1357.27 23.2806,-1357.27 23.2806,-1357.27 23.2806,-743.272 23.2806,-634.18 -37.7179,-576.538 38.2806,-498.272 190.82,-341.183 1865.63,-309.005 2137.96,-304.799"/>-<polygon fill="black" stroke="black" points="2138.17,-308.296 2148.11,-304.645 2138.06,-301.297 2138.17,-308.296"/>-</g>-<!-- u52 -->-<g id="node91" class="node"><title>u52</title>-<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1192.28" cy="-1577.27" rx="79.8859" ry="18"/>-<text text-anchor="middle" x="1192.28" y="-1573.57" font-family="Times,serif" font-size="14.00">EnPassantAbscissa</text>-</g>-<!-- u52&#45;&gt;u29 -->-<g id="edge159" class="edge"><title>u52&#45;&gt;u29</title>-<path fill="none" stroke="black" d="M1243.94,-1563.53C1322.32,-1542.05 1472.57,-1492.24 1571.28,-1405.27 1651.44,-1334.65 1705.22,-1215.54 1726.29,-1162.78"/>-<polygon fill="black" stroke="black" points="1729.68,-1163.74 1730.07,-1153.15 1723.16,-1161.18 1729.68,-1163.74"/>-</g>-<!-- u52&#45;&gt;u48 -->-<g id="edge160" class="edge"><title>u52&#45;&gt;u48</title>-<path fill="none" stroke="black" d="M1192.28,-1559.09C1192.28,-1521.19 1192.28,-1430.17 1192.28,-1384.45"/>-<polygon fill="black" stroke="black" points="1195.78,-1384.38 1192.28,-1374.38 1188.78,-1384.38 1195.78,-1384.38"/>-</g>-<!-- u53&#45;&gt;u43 -->-<g id="edge161" class="edge"><title>u53&#45;&gt;u43</title>-<path fill="none" stroke="black" d="M1189.45,-1980.35C1111.62,-1940.15 907.798,-1834.87 828.5,-1793.91"/>-<polygon fill="black" stroke="black" points="829.954,-1790.73 819.463,-1789.25 826.742,-1796.95 829.954,-1790.73"/>-</g>-<!-- u54&#45;&gt;u50 -->-<g id="edge162" class="edge"><title>u54&#45;&gt;u50</title>-<path fill="none" stroke="black" d="M834.48,-2199.89C807.337,-2162.2 740.305,-2069.12 707.693,-2023.84"/>-<polygon fill="black" stroke="black" points="710.336,-2021.52 701.651,-2015.45 704.655,-2025.61 710.336,-2021.52"/>-</g>-<!-- u54&#45;&gt;u52 -->-<g id="edge163" class="edge"><title>u54&#45;&gt;u52</title>-<path fill="none" stroke="black" d="M843.281,-2199.16C836.857,-2158.11 824.78,-2051.52 856.281,-1971.27 922.474,-1802.65 1093.09,-1655.67 1162.37,-1600.99"/>-<polygon fill="black" stroke="black" points="1164.59,-1603.7 1170.31,-1594.78 1160.27,-1598.19 1164.59,-1603.7"/>-</g>-<!-- u63 -->-<g id="node94" class="node"><title>u63</title>-<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1260.28" cy="-2217.27" rx="45.4919" ry="18"/>-<text text-anchor="middle" x="1260.28" y="-2213.57" font-family="Times,serif" font-size="14.00">PlayState</text>-</g>-<!-- u63&#45;&gt;u85 -->-<g id="edge164" class="edge"><title>u63&#45;&gt;u85</title>-<path fill="none" stroke="black" d="M1279.16,-2200.62C1362.26,-2132.8 1706.12,-1863 2040.28,-1758.27 2773.15,-1528.59 3001.49,-1723.93 3763.28,-1626.27 3841.39,-1616.26 3931.4,-1598.75 3984.14,-1587.87"/>-<polygon fill="black" stroke="black" points="3985.1,-1591.25 3994.18,-1585.79 3983.67,-1584.39 3985.1,-1591.25"/>-</g>-<!-- u63&#45;&gt;u86 -->-<g id="edge165" class="edge"><title>u63&#45;&gt;u86</title>-<path fill="none" stroke="black" d="M1301.83,-2209.63C1403.4,-2192.38 1670.93,-2140.78 1875.28,-2046.27 2026.22,-1976.47 2183.12,-1851.45 2244.46,-1800.17"/>-<polygon fill="black" stroke="black" points="2247.07,-1802.55 2252.47,-1793.44 2242.57,-1797.19 2247.07,-1802.55"/>-</g>-<!-- u92 -->-<g id="node95" class="node"><title>u92</title>-<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="991.281" cy="-1997.27" rx="126.178" ry="18"/>-<text text-anchor="middle" x="991.281" y="-1993.57" font-family="Times,serif" font-size="14.00">ApplicationTerminationReason</text>-</g>-<!-- u63&#45;&gt;u92 -->-<g id="edge166" class="edge"><title>u63&#45;&gt;u92</title>-<path fill="none" stroke="black" d="M1240.93,-2200.59C1194.3,-2162.8 1075.46,-2066.49 1020.27,-2021.76"/>-<polygon fill="black" stroke="black" points="1022.26,-2018.87 1012.29,-2015.3 1017.85,-2024.31 1022.26,-2018.87"/>-</g>-<!-- u3&#45;&gt;u4 -->-<g id="edge167" class="edge"><title>u3&#45;&gt;u4</title>-<path fill="none" stroke="black" d="M3714.99,-524.272C3606.05,-524.272 3497.12,-524.272 3388.18,-524.272"/>-<polygon fill="black" stroke="black" points="3387.98,-520.773 3377.98,-524.272 3387.98,-527.773 3387.98,-520.773"/>-</g>-<!-- u3&#45;&gt;u5 -->-<g id="edge168" class="edge"><title>u3&#45;&gt;u5</title>-<path fill="none" stroke="black" d="M3747.22,-506.088C3749.3,-468.188 3754.29,-377.17 3756.79,-331.449"/>-<polygon fill="black" stroke="black" points="3760.29,-331.554 3757.34,-321.377 3753.3,-331.171 3760.29,-331.554"/>-</g>-<!-- u96 -->-<g id="node98" class="node"><title>u96</title>-<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="3823.28" cy="-2417.27" rx="34.394" ry="18"/>-<text text-anchor="middle" x="3823.28" y="-2413.57" font-family="Times,serif" font-size="14.00">CECP</text>-</g>-<!-- u96&#45;&gt;u97 -->-<g id="edge169" class="edge"><title>u96&#45;&gt;u97</title>-<path fill="none" stroke="black" d="M3788.88,-2415.98C3458.95,-2412.96 859.811,-2385.52 539.281,-2266.27 525.19,-2261.03 511.796,-2251.24 501.167,-2241.86"/>-<polygon fill="black" stroke="black" points="503.324,-2239.09 493.613,-2234.86 498.563,-2244.22 503.324,-2239.09"/>-</g>-<!-- u96&#45;&gt;u95 -->-<g id="edge170" class="edge"><title>u96&#45;&gt;u95</title>-<path fill="none" stroke="black" d="M3807.46,-2401.06C3771.82,-2366.81 3685.03,-2283.39 3642.13,-2242.15"/>-<polygon fill="black" stroke="black" points="3644.53,-2239.61 3634.89,-2235.2 3639.68,-2244.65 3644.53,-2239.61"/>-</g>-<!-- u96&#45;&gt;u98 -->-<g id="edge171" class="edge"><title>u96&#45;&gt;u98</title>-<path fill="none" stroke="black" d="M3849.79,-2405.77C4000.47,-2345.91 4742.28,-2048.66 4742.28,-1998.27 4742.28,-1998.27 4742.28,-1998.27 4742.28,-743.272 4742.28,-583.432 4681.38,-398.111 4657.1,-330.588"/>-<polygon fill="black" stroke="black" points="4660.37,-329.342 4653.66,-321.14 4653.79,-331.735 4660.37,-329.342"/>-</g>-<!-- u96&#45;&gt;u99 -->-<g id="edge172" class="edge"><title>u96&#45;&gt;u99</title>-<path fill="none" stroke="black" d="M3790.07,-2411.86C3595.11,-2385.95 2600.29,-2253.75 2377.56,-2224.16"/>-<polygon fill="black" stroke="black" points="2377.92,-2220.67 2367.54,-2222.83 2377,-2227.61 2377.92,-2220.67"/>-</g>-<!-- u96&#45;&gt;u63 -->-<g id="edge173" class="edge"><title>u96&#45;&gt;u63</title>-<path fill="none" stroke="black" d="M3789.46,-2413.66C3515.26,-2392.48 1657.4,-2248.95 1314.6,-2222.47"/>-<polygon fill="black" stroke="black" points="1314.68,-2218.96 1304.44,-2221.68 1314.14,-2225.94 1314.68,-2218.96"/>-</g>-<!-- u101 -->-<g id="node99" class="node"><title>u101</title>-<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="3902.28" cy="-2217.27" rx="50.0912" ry="18"/>-<text text-anchor="middle" x="3902.28" y="-2213.57" font-family="Times,serif" font-size="14.00">Command</text>-</g>-<!-- u96&#45;&gt;u101 -->-<g id="edge174" class="edge"><title>u96&#45;&gt;u101</title>-<path fill="none" stroke="black" d="M3830.02,-2399.39C3843.8,-2364.83 3875.33,-2285.81 3891.81,-2244.51"/>-<polygon fill="black" stroke="black" points="3895.11,-2245.7 3895.56,-2235.11 3888.61,-2243.1 3895.11,-2245.7"/>-</g>-<!-- u101&#45;&gt;u85 -->-<g id="edge175" class="edge"><title>u101&#45;&gt;u85</title>-<path fill="none" stroke="black" d="M3918.87,-2199.81C3946.17,-2171.44 3999.59,-2110.19 4020.28,-2046.27 4072.05,-1886.32 4046.02,-1679.26 4034.13,-1605.68"/>-<polygon fill="black" stroke="black" points="4037.52,-1604.72 4032.42,-1595.43 4030.61,-1605.87 4037.52,-1604.72"/>-</g>-<!-- u102 -->-<g id="node100" class="node"><title>u102</title>-<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="3843.28" cy="-1997.27" rx="53.8905" ry="18"/>-<text text-anchor="middle" x="3843.28" y="-1993.57" font-family="Times,serif" font-size="14.00">PrintObject</text>-</g>-<!-- u101&#45;&gt;u102 -->-<g id="edge176" class="edge"><title>u101&#45;&gt;u102</title>-<path fill="none" stroke="black" d="M3897.65,-2199.17C3887.42,-2161.36 3862.82,-2070.45 3850.52,-2025.04"/>-<polygon fill="black" stroke="black" points="3853.88,-2024.04 3847.89,-2015.3 3847.12,-2025.87 3853.88,-2024.04"/>-</g>-<!-- u103 -->-<g id="node101" class="node"><title>u103</title>-<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="3963.28" cy="-1997.27" rx="48.1917" ry="18"/>-<text text-anchor="middle" x="3963.28" y="-1993.57" font-family="Times,serif" font-size="14.00">SetObject</text>-</g>-<!-- u101&#45;&gt;u103 -->-<g id="edge177" class="edge"><title>u101&#45;&gt;u103</title>-<path fill="none" stroke="black" d="M3907.07,-2199.17C3917.65,-2161.36 3943.08,-2070.45 3955.79,-2025.04"/>-<polygon fill="black" stroke="black" points="3959.19,-2025.87 3958.52,-2015.3 3952.45,-2023.99 3959.19,-2025.87"/>-</g>-<!-- u103&#45;&gt;u75 -->-<g id="edge178" class="edge"><title>u103&#45;&gt;u75</title>-<path fill="none" stroke="black" d="M3962.66,-1979.18C3960.75,-1919.73 3956.52,-1716.57 3980.28,-1551.27 3989.02,-1490.46 4009.08,-1421.07 4020.64,-1383.99"/>-<polygon fill="black" stroke="black" points="4023.98,-1385.01 4023.66,-1374.42 4017.31,-1382.9 4023.98,-1385.01"/>-</g>-<!-- u104 -->-<g id="node102" class="node"><title>u104</title>-<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="3902.28" cy="-2417.27" rx="27" ry="18"/>-<text text-anchor="middle" x="3902.28" y="-2413.57" font-family="Times,serif" font-size="14.00">Raw</text>-</g>-<!-- u104&#45;&gt;u97 -->-<g id="edge179" class="edge"><title>u104&#45;&gt;u97</title>-<path fill="none" stroke="black" d="M3882.25,-2405.08C3877.18,-2402.74 3871.65,-2400.59 3866.28,-2399.27 3147.66,-2222.98 1233.5,-2522.3 539.281,-2266.27 525.175,-2261.07 511.779,-2251.29 501.153,-2241.9"/>-<polygon fill="black" stroke="black" points="503.31,-2239.13 493.601,-2234.89 498.545,-2244.26 503.31,-2239.13"/>-</g>-<!-- u104&#45;&gt;u95 -->-<g id="edge180" class="edge"><title>u104&#45;&gt;u95</title>-<path fill="none" stroke="black" d="M3884.02,-2403.59C3836.83,-2370.8 3710.32,-2282.91 3650.06,-2241.05"/>-<polygon fill="black" stroke="black" points="3651.88,-2238.05 3641.67,-2235.22 3647.88,-2243.8 3651.88,-2238.05"/>-</g>-<!-- u104&#45;&gt;u98 -->-<g id="edge181" class="edge"><title>u104&#45;&gt;u98</title>-<path fill="none" stroke="black" d="M3929.33,-2415.78C4061.27,-2412.74 4635.44,-2392.38 4747.28,-2266.27 4786.86,-2221.65 4762.28,-2057.92 4762.28,-1998.27 4762.28,-1998.27 4762.28,-1998.27 4762.28,-743.272 4762.28,-634.18 4776.23,-603.455 4747.28,-498.272 4729.38,-433.211 4687.99,-364.788 4664.46,-329.165"/>-<polygon fill="black" stroke="black" points="4667.08,-326.788 4658.6,-320.426 4661.26,-330.683 4667.08,-326.788"/>-</g>-<!-- u104&#45;&gt;u99 -->-<g id="edge182" class="edge"><title>u104&#45;&gt;u99</title>-<path fill="none" stroke="black" d="M3881.79,-2405.2C3876.83,-2402.92 3871.46,-2400.76 3866.28,-2399.27 3296.79,-2235.91 2567.67,-2219.72 2379.3,-2218.34"/>-<polygon fill="black" stroke="black" points="2379.23,-2214.84 2369.21,-2218.27 2379.18,-2221.84 2379.23,-2214.84"/>-</g>-<!-- u104&#45;&gt;u63 -->-<g id="edge183" class="edge"><title>u104&#45;&gt;u63</title>-<path fill="none" stroke="black" d="M3882.22,-2405.2C3877.15,-2402.85 3871.63,-2400.67 3866.28,-2399.27 3802.2,-2382.55 1684.64,-2245.6 1315.04,-2221.79"/>-<polygon fill="black" stroke="black" points="1315.07,-2218.29 1304.86,-2221.14 1314.62,-2225.27 1315.07,-2218.29"/>-</g>-<!-- u104&#45;&gt;u3 -->-<g id="edge184" class="edge"><title>u104&#45;&gt;u3</title>-<path fill="none" stroke="black" d="M3894.28,-2399.72C3860.21,-2328.19 3731.25,-2045.93 3780.28,-1971.27 3992.18,-1648.65 4351.75,-1939.51 4577.28,-1626.27 4695.18,-1462.52 4709.74,-870.483 4577.28,-718.272 4349.82,-456.898 4128.84,-711.888 3811.28,-573.272 3796.28,-566.724 3781.45,-556.174 3769.75,-546.63"/>-<polygon fill="black" stroke="black" points="3771.73,-543.715 3761.83,-539.93 3767.21,-549.06 3771.73,-543.715"/>-</g>-<!-- u104&#45;&gt;u101 -->-<g id="edge185" class="edge"><title>u104&#45;&gt;u101</title>-<path fill="none" stroke="black" d="M3902.28,-2399.05C3902.28,-2364.59 3902.28,-2286.92 3902.28,-2245.5"/>-<polygon fill="black" stroke="black" points="3905.78,-2245.32 3902.28,-2235.32 3898.78,-2245.32 3905.78,-2245.32"/>-</g>-<!-- u94 -->-<g id="node104" class="node"><title>u94</title>-<ellipse fill="#ffffbb" stroke="black" stroke-width="0" cx="3902.28" cy="-2616.27" rx="27.0966" ry="18"/>-<text text-anchor="middle" x="3902.28" y="-2612.57" font-family="Times,serif" font-size="14.00">Play</text>-</g>-<!-- u94&#45;&gt;u96 -->-<g id="edge5" class="edge"><title>u94&#45;&gt;u96</title>-<path fill="none" stroke="black" d="M3895.55,-2598.48C3881.76,-2564.09 3850.23,-2485.47 3833.75,-2444.38"/>-<polygon fill="black" stroke="black" points="3836.97,-2443 3830,-2435.03 3830.47,-2445.61 3836.97,-2443"/>-</g>-<!-- u94&#45;&gt;u104 -->-<g id="edge6" class="edge"><title>u94&#45;&gt;u104</title>-<path fill="none" stroke="black" d="M3902.28,-2598.13C3902.28,-2563.93 3902.28,-2486.96 3902.28,-2445.67"/>-<polygon fill="black" stroke="black" points="3905.78,-2445.51 3902.28,-2435.51 3898.78,-2445.51 3905.78,-2445.51"/>-</g>-<!-- u0 -->-<g id="node105" class="node"><title>u0</title>-<ellipse fill="#bbffbb" stroke="black" stroke-width="0" cx="4346.28" cy="-2816.27" rx="29.795" ry="18"/>-<text text-anchor="middle" x="4346.28" y="-2812.57" font-family="Times,serif" font-size="14.00">Main</text>-</g>-<!-- u0&#45;&gt;u2 -->-<g id="edge2" class="edge"><title>u0&#45;&gt;u2</title>-<path fill="none" stroke="black" d="M4316.2,-2815.24C4118.05,-2814.61 2980.06,-2804.81 2067.28,-2665.27 1322.76,-2551.45 1113.85,-2559.92 420.281,-2266.27 404.248,-2259.48 387.756,-2249.5 374.249,-2240.39"/>-<polygon fill="black" stroke="black" points="376.055,-2237.38 365.84,-2234.57 372.073,-2243.14 376.055,-2237.38"/>-</g>-<!-- u0&#45;&gt;u1 -->-<g id="edge3" class="edge"><title>u0&#45;&gt;u1</title>-<path fill="none" stroke="black" d="M4376.23,-2815.78C4459.67,-2815.41 4695.8,-2801.8 4805.28,-2665.27 4874.28,-2579.23 4829.28,-2528.57 4829.28,-2418.27 4829.28,-2418.27 4829.28,-2418.27 4829.28,-743.272 4829.28,-582.724 4762.61,-397.828 4736.03,-330.504"/>-<polygon fill="black" stroke="black" points="4739.22,-329.073 4732.27,-321.085 4732.72,-331.67 4739.22,-329.073"/>-</g>-<!-- u0&#45;&gt;u93 -->-<g id="edge4" class="edge"><title>u0&#45;&gt;u93</title>-<path fill="none" stroke="black" d="M4376.27,-2815.19C4456.44,-2813.18 4676.38,-2795.49 4775.28,-2665.27 4841.82,-2577.67 4791.28,-2528.28 4791.28,-2418.27 4791.28,-2418.27 4791.28,-2418.27 4791.28,-1996.27 4791.28,-1810.64 4590.17,-1655.91 4507.82,-1600.32"/>-<polygon fill="black" stroke="black" points="4509.57,-1597.28 4499.3,-1594.64 4505.68,-1603.1 4509.57,-1597.28"/>-</g>-<!-- u0&#45;&gt;u94 -->-<g id="edge1" class="edge"><title>u0&#45;&gt;u94</title>-<path fill="none" stroke="black" d="M4323.03,-2804.91C4248.89,-2771.84 4017.94,-2668.85 3933.56,-2631.22"/>-<polygon fill="black" stroke="black" points="3934.8,-2627.94 3924.24,-2627.07 3931.95,-2634.34 3934.8,-2627.94"/>+<!-- Generated by graphviz version 2.40.1 (20161225.0304)+ -->+<!-- Title: G Pages: 1 -->+<svg width="2880pt" height="1723pt"+ viewBox="0.00 0.00 2880.00 1722.91" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">+<g id="graph0" class="graph" transform="scale(.7167 .7167) rotate(0) translate(4 2399.8)">+<title>G</title>+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-2399.8 4014.1679,-2399.8 4014.1679,4 -4,4"/>+<g id="clust1" class="cluster">+<title>cluster_0</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="16.1679,-17.7961 16.1679,-2297.9214 3952.1679,-2297.9214 3952.1679,-17.7961 16.1679,-17.7961"/>+<text text-anchor="middle" x="1984.1679" y="-2282.7214" font-family="Times,serif" font-size="14.00" fill="#000000">BishBosh</text>+</g>+<g id="clust2" class="cluster">+<title>cluster_1</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="1561.1679,-380.3916 1561.1679,-731.8646 2648.1679,-731.8646 2648.1679,-380.3916 1561.1679,-380.3916"/>+<text text-anchor="middle" x="2104.6679" y="-716.6646" font-family="Times,serif" font-size="14.00" fill="#000000">Attribute</text>+</g>+<g id="clust3" class="cluster">+<title>cluster_2</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="1399.1679,-380.3916 1399.1679,-1058.868 1521.1679,-1058.868 1521.1679,-380.3916 1399.1679,-380.3916"/>+<text text-anchor="middle" x="1460.1679" y="-1043.668" font-family="Times,serif" font-size="14.00" fill="#000000">Cartesian</text>+</g>+<g id="clust4" class="cluster">+<title>cluster_3</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2768.1679,-565.0262 2768.1679,-1058.868 3180.1679,-1058.868 3180.1679,-565.0262 2768.1679,-565.0262"/>+<text text-anchor="middle" x="2974.1679" y="-1043.668" font-family="Times,serif" font-size="14.00" fill="#000000">Component</text>+</g>+<g id="clust5" class="cluster">+<title>cluster_4</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="36.1679,-1797.4061 36.1679,-1964.2446 146.1679,-1964.2446 146.1679,-1797.4061 36.1679,-1797.4061"/>+<text text-anchor="middle" x="91.1679" y="-1949.0446" font-family="Times,serif" font-size="14.00" fill="#000000">Concurrent</text>+</g>+<g id="clust6" class="cluster">+<title>cluster_5</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="166.1679,-1076.6641 166.1679,-1964.2446 481.1679,-1964.2446 481.1679,-1076.6641 166.1679,-1076.6641"/>+<text text-anchor="middle" x="323.6679" y="-1949.0446" font-family="Times,serif" font-size="14.00" fill="#000000">ContextualNotation</text>+</g>+<g id="clust7" class="cluster">+<title>cluster_6</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="544.1679,-195.7571 544.1679,-362.5955 1239.1679,-362.5955 1239.1679,-195.7571 544.1679,-195.7571"/>+<text text-anchor="middle" x="891.6679" y="-347.3955" font-family="Times,serif" font-size="14.00" fill="#000000">Data</text>+</g>+<g id="clust8" class="cluster">+<title>cluster_7</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="1335.1679,-1261.2986 1335.1679,-1779.61 1615.1679,-1779.61 1615.1679,-1261.2986 1335.1679,-1261.2986"/>+<text text-anchor="middle" x="1475.1679" y="-1764.41" font-family="Times,serif" font-size="14.00" fill="#000000">Evaluation</text>+</g>+<g id="clust9" class="cluster">+<title>cluster_8</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="541.1679,-565.0262 541.1679,-1428.137 1319.1679,-1428.137 1319.1679,-565.0262 541.1679,-565.0262"/>+<text text-anchor="middle" x="930.1679" y="-1412.937" font-family="Times,serif" font-size="14.00" fill="#000000">Input</text>+</g>+<g id="clust10" class="cluster">+<title>cluster_9</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2524.1679,-892.0295 2524.1679,-1594.9755 2760.1679,-1594.9755 2760.1679,-892.0295 2524.1679,-892.0295"/>+<text text-anchor="middle" x="2642.1679" y="-1579.7755" font-family="Times,serif" font-size="14.00" fill="#000000">Model</text>+</g>+<g id="clust11" class="cluster">+<title>cluster_10</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2113.1679,-892.0295 2113.1679,-1243.5025 2484.1679,-1243.5025 2484.1679,-892.0295 2113.1679,-892.0295"/>+<text text-anchor="middle" x="2298.6679" y="-1228.3025" font-family="Times,serif" font-size="14.00" fill="#000000">Notation</text>+</g>+<g id="clust12" class="cluster">+<title>cluster_11</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="1594.1679,-35.5922 1594.1679,-362.5955 2427.1679,-362.5955 2427.1679,-35.5922 1594.1679,-35.5922"/>+<text text-anchor="middle" x="2010.6679" y="-347.3955" font-family="Times,serif" font-size="14.00" fill="#000000">Property</text>+</g>+<g id="clust13" class="cluster">+<title>cluster_12</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="1623.1679,-892.0295 1623.1679,-1964.2446 1947.1679,-1964.2446 1947.1679,-892.0295 1623.1679,-892.0295"/>+<text text-anchor="middle" x="1785.1679" y="-1949.0446" font-family="Times,serif" font-size="14.00" fill="#000000">Search</text>+</g>+<g id="clust14" class="cluster">+<title>cluster_13</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3188.1679,-892.0295 3188.1679,-1964.2446 3932.1679,-1964.2446 3932.1679,-892.0295 3188.1679,-892.0295"/>+<text text-anchor="middle" x="3560.1679" y="-1949.0446" font-family="Times,serif" font-size="14.00" fill="#000000">State</text>+</g>+<g id="clust15" class="cluster">+<title>cluster_14</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2868.1679,-195.7571 2868.1679,-547.2301 3052.1679,-547.2301 3052.1679,-195.7571 2868.1679,-195.7571"/>+<text text-anchor="middle" x="2960.1679" y="-532.0301" font-family="Times,serif" font-size="14.00" fill="#000000">Text</text>+</g>+<g id="clust16" class="cluster">+<title>cluster_15</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="577.1679,-1612.7716 577.1679,-2131.083 805.1679,-2131.083 805.1679,-1612.7716 577.1679,-1612.7716"/>+<text text-anchor="middle" x="691.1679" y="-2115.883" font-family="Times,serif" font-size="14.00" fill="#000000">UI</text>+</g>+<!-- u3 -->+<g id="node1" class="node">+<title>u3</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="2284.1679" cy="-437.7961" rx="61.99" ry="18"/>+<text text-anchor="middle" x="2284.1679" y="-434.0961" font-family="Times,serif" font-size="14.00" fill="#000000">LogicalColour</text>+</g>+<!-- u5 -->+<g id="node67" class="node">+<title>u5</title>+<ellipse fill="#33ff33" stroke="#000000" stroke-width="0" cx="2192.1679" cy="-253.7961" rx="68.4888" ry="18"/>+<text text-anchor="middle" x="2192.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">ForsythEdwards</text>+</g>+<!-- u3&#45;&gt;u5 -->+<g id="edge6" class="edge">+<title>u3&#45;&gt;u5</title>+<path fill="none" stroke="#000000" d="M2275.179,-419.8184C2258.9648,-387.39 2224.7408,-318.9419 2205.6896,-280.8396"/>+<polygon fill="#000000" stroke="#000000" points="2208.7959,-279.2258 2201.1932,-271.8468 2202.5349,-282.3563 2208.7959,-279.2258"/>+</g>+<!-- u6 -->+<g id="node68" class="node">+<title>u6</title>+<ellipse fill="#33ff33" stroke="#000000" stroke-width="0" cx="2058.1679" cy="-253.7961" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="2058.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Opposable</text>+</g>+<!-- u3&#45;&gt;u6 -->+<g id="edge7" class="edge">+<title>u3&#45;&gt;u6</title>+<path fill="none" stroke="#000000" d="M2262.3577,-420.7818C2229.9665,-395.4215 2167.3559,-346.0485 2115.1679,-302.7961 2105.1988,-294.534 2094.3951,-285.3157 2084.9012,-277.1236"/>+<polygon fill="#000000" stroke="#000000" points="2087.1327,-274.4262 2077.2814,-270.5271 2082.5511,-279.7185 2087.1327,-274.4262"/>+</g>+<!-- u8 -->+<g id="node2" class="node">+<title>u8</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="2591.1679" cy="-622.7961" rx="48.9926" ry="18"/>+<text text-anchor="middle" x="2591.1679" y="-619.0961" font-family="Times,serif" font-size="14.00" fill="#000000">MoveType</text>+</g>+<!-- u9 -->+<g id="node3" class="node">+<title>u9</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="2609.1679" cy="-437.7961" rx="29.4969" ry="18"/>+<text text-anchor="middle" x="2609.1679" y="-434.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Rank</text>+</g>+<!-- u8&#45;&gt;u9 -->+<g id="edge8" class="edge">+<title>u8&#45;&gt;u9</title>+<path fill="none" stroke="#000000" d="M2592.9265,-604.7207C2596.072,-572.3924 2602.6817,-504.4598 2606.4269,-465.9671"/>+<polygon fill="#000000" stroke="#000000" points="2609.9171,-466.2369 2607.402,-455.9449 2602.95,-465.5589 2609.9171,-466.2369"/>+</g>+<!-- u10 -->+<g id="node95" class="node">+<title>u10</title>+<ellipse fill="#ff3333" stroke="#000000" stroke-width="0" cx="2920.1679" cy="-253.7961" rx="44.393" ry="18"/>+<text text-anchor="middle" x="2920.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">ShowList</text>+</g>+<!-- u8&#45;&gt;u10 -->+<g id="edge9" class="edge">+<title>u8&#45;&gt;u10</title>+<path fill="none" stroke="#000000" d="M2611.422,-606.2641C2639.5383,-582.415 2690.5021,-535.8109 2722.1679,-486.7961 2741.6496,-456.6407 2731.9474,-441.4613 2752.1679,-411.7961 2790.6866,-355.2857 2852.5941,-303.8468 2889.5322,-275.8689"/>+<polygon fill="#000000" stroke="#000000" points="2891.9989,-278.3946 2897.9097,-269.6018 2887.8058,-272.7894 2891.9989,-278.3946"/>+</g>+<!-- u12 -->+<g id="node4" class="node">+<title>u12</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="1856.1679" cy="-622.7961" rx="44.393" ry="18"/>+<text text-anchor="middle" x="1856.1679" y="-619.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Direction</text>+</g>+<!-- u12&#45;&gt;u3 -->+<g id="edge10" class="edge">+<title>u12&#45;&gt;u3</title>+<path fill="none" stroke="#000000" d="M1883.686,-608.5908C1891.8082,-604.5908 1900.7721,-600.3619 1909.1679,-596.7961 2041.4184,-540.6274 2085.4321,-552.5891 2213.1679,-486.7961 2227.4477,-479.441 2242.2242,-469.6484 2254.5748,-460.7516"/>+<polygon fill="#000000" stroke="#000000" points="2256.7183,-463.5199 2262.7018,-454.7764 2252.5718,-457.8801 2256.7183,-463.5199"/>+</g>+<!-- u13 -->+<g id="node32" class="node">+<title>u13</title>+<ellipse fill="#ffff77" stroke="#000000" stroke-width="0" cx="1034.1679" cy="-253.7961" rx="46.2923" ry="18"/>+<text text-anchor="middle" x="1034.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Exception</text>+</g>+<!-- u12&#45;&gt;u13 -->+<g id="edge11" class="edge">+<title>u12&#45;&gt;u13</title>+<path fill="none" stroke="#000000" d="M1829.5591,-608.2451C1821.0102,-604.0472 1811.3679,-599.7957 1802.1679,-596.7961 1544.8263,-512.8932 1429.2489,-635.6307 1203.1679,-486.7961 1169.7062,-464.7675 1176.3394,-444.4766 1153.1679,-411.7961 1119.3987,-364.1691 1077.9972,-310.115 1053.9952,-279.177"/>+<polygon fill="#000000" stroke="#000000" points="1056.6082,-276.8356 1047.7076,-271.0884 1051.0816,-281.1317 1056.6082,-276.8356"/>+</g>+<!-- u14 -->+<g id="node69" class="node">+<title>u14</title>+<ellipse fill="#33ff33" stroke="#000000" stroke-width="0" cx="1828.1679" cy="-253.7961" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="1828.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Orientated</text>+</g>+<!-- u12&#45;&gt;u14 -->+<g id="edge12" class="edge">+<title>u12&#45;&gt;u14</title>+<path fill="none" stroke="#000000" d="M1837.3882,-606.1723C1812.2962,-582.5659 1769.0378,-536.6286 1752.1679,-486.7961 1726.7032,-411.5756 1778.7667,-322.1878 1808.8471,-279.2734"/>+<polygon fill="#000000" stroke="#000000" points="1811.7354,-281.2516 1814.7186,-271.0854 1806.0468,-277.1724 1811.7354,-281.2516"/>+</g>+<!-- u15 -->+<g id="node70" class="node">+<title>u15</title>+<ellipse fill="#33ff33" stroke="#000000" stroke-width="0" cx="1685.1679" cy="-93.7961" rx="50.0912" ry="18"/>+<text text-anchor="middle" x="1685.1679" y="-90.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Reflectable</text>+</g>+<!-- u12&#45;&gt;u15 -->+<g id="edge13" class="edge">+<title>u12&#45;&gt;u15</title>+<path fill="none" stroke="#000000" d="M1829.5419,-608.2974C1820.9922,-604.1019 1811.3538,-599.8386 1802.1679,-596.7961 1557.6596,-515.8108 1397.1047,-685.4607 1233.1679,-486.7961 1211.9521,-461.0861 1231.1857,-445.0704 1233.1679,-411.7961 1233.7801,-401.5193 1248.5841,-235.7108 1255.1679,-227.7961 1303.5615,-169.6191 1524.5848,-122.8136 1629.5325,-103.4409"/>+<polygon fill="#000000" stroke="#000000" points="1630.412,-106.8382 1639.6199,-101.5974 1629.1536,-99.9523 1630.412,-106.8382"/>+</g>+<!-- u16 -->+<g id="node5" class="node">+<title>u16</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="2284.1679" cy="-622.7961" rx="95.5831" ry="18"/>+<text text-anchor="middle" x="2284.1679" y="-619.0961" font-family="Times,serif" font-size="14.00" fill="#000000">LogicalColourOfSquare</text>+</g>+<!-- u16&#45;&gt;u3 -->+<g id="edge14" class="edge">+<title>u16&#45;&gt;u3</title>+<path fill="none" stroke="#000000" d="M2284.1679,-604.7207C2284.1679,-572.3924 2284.1679,-504.4598 2284.1679,-465.9671"/>+<polygon fill="#000000" stroke="#000000" points="2287.668,-465.9449 2284.1679,-455.9449 2280.668,-465.9449 2287.668,-465.9449"/>+</g>+<!-- u46 -->+<g id="node6" class="node">+<title>u46</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="2461.1679" cy="-622.7961" rx="63.8893" ry="18"/>+<text text-anchor="middle" x="2461.1679" y="-619.0961" font-family="Times,serif" font-size="14.00" fill="#000000">ColourScheme</text>+</g>+<!-- u47 -->+<g id="node7" class="node">+<title>u47</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="2479.1679" cy="-437.7961" rx="64.9885" ry="18"/>+<text text-anchor="middle" x="2479.1679" y="-434.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PhysicalColour</text>+</g>+<!-- u46&#45;&gt;u47 -->+<g id="edge15" class="edge">+<title>u46&#45;&gt;u47</title>+<path fill="none" stroke="#000000" d="M2462.9265,-604.7207C2466.072,-572.3924 2472.6817,-504.4598 2476.4269,-465.9671"/>+<polygon fill="#000000" stroke="#000000" points="2479.9171,-466.2369 2477.402,-455.9449 2472.95,-465.5589 2479.9171,-466.2369"/>+</g>+<!-- u46&#45;&gt;u13 -->+<g id="edge16" class="edge">+<title>u46&#45;&gt;u13</title>+<path fill="none" stroke="#000000" d="M2425.0436,-607.8644C2413.7256,-603.7007 2401.0772,-599.5642 2389.1679,-596.7961 1956.2339,-496.1683 1806.3927,-655.4729 1395.1679,-486.7961 1345.3977,-466.3813 1345.3829,-440.9411 1300.1679,-411.7961 1211.45,-354.6098 1176.146,-362.5952 1089.1679,-302.7961 1078.4651,-295.4377 1067.5979,-286.2057 1058.3812,-277.7447"/>+<polygon fill="#000000" stroke="#000000" points="1060.7531,-275.1707 1051.0673,-270.8769 1055.9614,-280.2737 1060.7531,-275.1707"/>+</g>+<!-- u46&#45;&gt;u10 -->+<g id="edge17" class="edge">+<title>u46&#45;&gt;u10</title>+<path fill="none" stroke="#000000" d="M2495.3928,-607.5346C2555.0082,-580.3189 2674.2276,-522.8848 2702.1679,-486.7961 2723.287,-459.5178 2703.2925,-440.6724 2722.1679,-411.7961 2763.7013,-348.2564 2839.2406,-298.571 2884.047,-272.9434"/>+<polygon fill="#000000" stroke="#000000" points="2885.8488,-275.9457 2892.8488,-267.9926 2882.4171,-269.8446 2885.8488,-275.9457"/>+</g>+<!-- u58 -->+<g id="node8" class="node">+<title>u58</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="1681.1679" cy="-622.7961" rx="112.3801" ry="18"/>+<text text-anchor="middle" x="1681.1679" y="-619.0961" font-family="Times,serif" font-size="14.00" fill="#000000">CaptureMoveSortAlgorithm</text>+</g>+<!-- u73 -->+<g id="node9" class="node">+<title>u73</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="2117.1679" cy="-622.7961" rx="53.0913" ry="18"/>+<text text-anchor="middle" x="2117.1679" y="-619.0961" font-family="Times,serif" font-size="14.00" fill="#000000">RankValues</text>+</g>+<!-- u73&#45;&gt;u9 -->+<g id="edge18" class="edge">+<title>u73&#45;&gt;u9</title>+<path fill="none" stroke="#000000" d="M2149.7221,-608.3459C2159.1393,-604.3841 2169.4898,-600.2366 2179.1679,-596.7961 2342.4214,-538.7596 2401.3188,-570.2335 2553.1679,-486.7961 2565.6751,-479.9237 2577.8158,-469.8582 2587.5773,-460.6351"/>+<polygon fill="#000000" stroke="#000000" points="2590.168,-462.9966 2594.8574,-453.4961 2585.2669,-457.9987 2590.168,-462.9966"/>+</g>+<!-- u73&#45;&gt;u13 -->+<g id="edge19" class="edge">+<title>u73&#45;&gt;u13</title>+<path fill="none" stroke="#000000" d="M2086.1503,-608.0765C2076.4078,-603.9213 2065.4957,-599.7364 2055.1679,-596.7961 1755.6527,-511.5247 1653.0005,-600.7153 1363.1679,-486.7961 1235.2214,-436.5065 1109.9345,-326.2246 1058.5454,-277.6134"/>+<polygon fill="#000000" stroke="#000000" points="1060.8771,-275.0006 1051.2252,-270.6311 1056.0456,-280.0659 1060.8771,-275.0006"/>+</g>+<!-- u74 -->+<g id="node37" class="node">+<title>u74</title>+<ellipse fill="#ffff77" stroke="#000000" stroke-width="0" cx="1127.1679" cy="-253.7961" rx="28.6953" ry="18"/>+<text text-anchor="middle" x="1127.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Num</text>+</g>+<!-- u73&#45;&gt;u74 -->+<g id="edge20" class="edge">+<title>u73&#45;&gt;u74</title>+<path fill="none" stroke="#000000" d="M2086.1366,-608.1242C2076.3935,-603.971 2065.4846,-599.7752 2055.1679,-596.7961 1769.4614,-514.2952 1666.8366,-607.7535 1395.1679,-486.7961 1275.2603,-433.4086 1255.7715,-396.8005 1164.1679,-302.7961 1157.0655,-295.5076 1150.1147,-286.8406 1144.1902,-278.837"/>+<polygon fill="#000000" stroke="#000000" points="1146.8836,-276.5873 1138.2057,-270.5091 1141.1991,-280.6723 1146.8836,-276.5873"/>+</g>+<!-- u37 -->+<g id="node72" class="node">+<title>u37</title>+<ellipse fill="#33ff33" stroke="#000000" stroke-width="0" cx="1943.1679" cy="-253.7961" rx="48.9926" ry="18"/>+<text text-anchor="middle" x="1943.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">ShowFloat</text>+</g>+<!-- u73&#45;&gt;u37 -->+<g id="edge21" class="edge">+<title>u73&#45;&gt;u37</title>+<path fill="none" stroke="#000000" d="M2083.7852,-608.5648C2074.5407,-604.6872 2064.4862,-600.5284 2055.1679,-596.7961 1927.9724,-545.8506 1844.8706,-599.6518 1767.1679,-486.7961 1748.2647,-459.341 1753.5874,-442.2376 1767.1679,-411.7961 1771.1791,-402.8046 1867.9949,-318.5782 1916.2858,-276.9125"/>+<polygon fill="#000000" stroke="#000000" points="1918.5864,-279.5502 1923.8754,-270.3699 1914.0159,-274.2483 1918.5864,-279.5502"/>+</g>+<!-- u73&#45;&gt;u10 -->+<g id="edge22" class="edge">+<title>u73&#45;&gt;u10</title>+<path fill="none" stroke="#000000" d="M2148.9638,-608.2694C2158.5474,-604.217 2169.1765,-600.0403 2179.1679,-596.7961 2382.3912,-530.8083 2468.9652,-604.6856 2647.1679,-486.7961 2681.6425,-463.9895 2672.8575,-440.943 2702.1679,-411.7961 2760.1526,-354.1347 2840.6953,-301.4945 2885.8843,-273.9416"/>+<polygon fill="#000000" stroke="#000000" points="2887.955,-276.7798 2894.7017,-268.6108 2884.3333,-270.7894 2887.955,-276.7798"/>+</g>+<!-- u76 -->+<g id="node10" class="node">+<title>u76</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="1982.1679" cy="-622.7961" rx="63.8893" ry="18"/>+<text text-anchor="middle" x="1982.1679" y="-619.0961" font-family="Times,serif" font-size="14.00" fill="#000000">CriterionValue</text>+</g>+<!-- u77 -->+<g id="node11" class="node">+<title>u77</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="1845.1679" cy="-437.7961" rx="68.7879" ry="18"/>+<text text-anchor="middle" x="1845.1679" y="-434.0961" font-family="Times,serif" font-size="14.00" fill="#000000">CriterionWeight</text>+</g>+<!-- u76&#45;&gt;u77 -->+<g id="edge24" class="edge">+<title>u76&#45;&gt;u77</title>+<path fill="none" stroke="#000000" d="M1969.0317,-605.0575C1944.6866,-572.1828 1892.4748,-501.6778 1864.2372,-463.5467"/>+<polygon fill="#000000" stroke="#000000" points="1867.0282,-461.4344 1858.2642,-455.481 1861.4028,-465.6003 1867.0282,-461.4344"/>+</g>+<!-- u78 -->+<g id="node12" class="node">+<title>u78</title>+<ellipse fill="#bbbbff" stroke="#000000" stroke-width="0" cx="2068.1679" cy="-437.7961" rx="136.4758" ry="18"/>+<text text-anchor="middle" x="2068.1679" y="-434.0961" font-family="Times,serif" font-size="14.00" fill="#000000">WeightedMeanAndCriterionValues</text>+</g>+<!-- u76&#45;&gt;u78 -->+<g id="edge25" class="edge">+<title>u76&#45;&gt;u78</title>+<path fill="none" stroke="#000000" d="M1990.5705,-604.7207C2005.663,-572.2542 2037.4485,-503.8785 2055.3008,-465.4752"/>+<polygon fill="#000000" stroke="#000000" points="2058.6895,-466.4884 2059.7311,-455.9449 2052.3418,-463.5376 2058.6895,-466.4884"/>+</g>+<!-- u18 -->+<g id="node103" class="node">+<title>u18</title>+<ellipse fill="#ffffbb" stroke="#000000" stroke-width="0" cx="1375.1679" cy="-253.7961" rx="31.3957" ry="18"/>+<text text-anchor="middle" x="1375.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Types</text>+</g>+<!-- u76&#45;&gt;u18 -->+<g id="edge23" class="edge">+<title>u76&#45;&gt;u18</title>+<path fill="none" stroke="#000000" d="M1944.208,-608.2114C1933.0194,-604.2031 1920.6867,-600.0647 1909.1679,-596.7961 1684.4237,-533.0227 1549.7022,-661.9992 1395.1679,-486.7961 1344.4827,-429.3319 1357.6594,-329.9628 1368.0849,-281.7054"/>+<polygon fill="#000000" stroke="#000000" points="1371.5616,-282.2016 1370.3743,-271.6735 1364.737,-280.6441 1371.5616,-282.2016"/>+</g>+<!-- u77&#45;&gt;u13 -->+<g id="edge26" class="edge">+<title>u77&#45;&gt;u13</title>+<path fill="none" stroke="#000000" d="M1781.4547,-430.9348C1622.4288,-413.0969 1212.014,-362.4772 1089.1679,-302.7961 1076.9461,-296.8585 1065.3952,-287.409 1056.0636,-278.3855"/>+<polygon fill="#000000" stroke="#000000" points="1058.2921,-275.6603 1048.781,-270.9924 1053.3052,-280.5727 1058.2921,-275.6603"/>+</g>+<!-- u77&#45;&gt;u74 -->+<g id="edge27" class="edge">+<title>u77&#45;&gt;u74</title>+<path fill="none" stroke="#000000" d="M1781.37,-431.002C1632.5902,-414.2397 1267.4447,-367.5267 1164.1679,-302.7961 1155.185,-297.1659 1147.5974,-288.515 1141.6768,-280.0401"/>+<polygon fill="#000000" stroke="#000000" points="1144.4759,-277.9221 1136.1216,-271.4061 1138.5891,-281.7097 1144.4759,-277.9221"/>+</g>+<!-- u77&#45;&gt;u10 -->+<g id="edge28" class="edge">+<title>u77&#45;&gt;u10</title>+<path fill="none" stroke="#000000" d="M1885.2821,-423.0206C1897.3421,-418.9611 1910.6877,-414.8431 1923.1679,-411.7961 2278.132,-325.1338 2716.2228,-274.8308 2866.5863,-259.1462"/>+<polygon fill="#000000" stroke="#000000" points="2867.3241,-262.5886 2876.9102,-258.0767 2866.6027,-255.6258 2867.3241,-262.5886"/>+</g>+<!-- u78&#45;&gt;u37 -->+<g id="edge29" class="edge">+<title>u78&#45;&gt;u37</title>+<path fill="none" stroke="#000000" d="M2055.9547,-419.8184C2033.7175,-387.0852 1986.5481,-317.6518 1960.8153,-279.7732"/>+<polygon fill="#000000" stroke="#000000" points="1963.5782,-277.6117 1955.0636,-271.3067 1957.788,-281.5453 1963.5782,-277.6117"/>+</g>+<!-- u78&#45;&gt;u10 -->+<g id="edge30" class="edge">+<title>u78&#45;&gt;u10</title>+<path fill="none" stroke="#000000" d="M2139.3435,-422.4248C2307.6778,-386.071 2726.9247,-295.5294 2870.7908,-264.4597"/>+<polygon fill="#000000" stroke="#000000" points="2871.6302,-267.8592 2880.666,-262.327 2870.1525,-261.0169 2871.6302,-267.8592"/>+</g>+<!-- u11 -->+<g id="node13" class="node">+<title>u11</title>+<ellipse fill="#ffbbbb" stroke="#000000" stroke-width="0" cx="1460.1679" cy="-789.7961" rx="53.0913" ry="18"/>+<text text-anchor="middle" x="1460.1679" y="-786.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Coordinates</text>+</g>+<!-- u11&#45;&gt;u12 -->+<g id="edge31" class="edge">+<title>u11&#45;&gt;u12</title>+<path fill="none" stroke="#000000" d="M1505.5596,-780.3244C1573.5244,-764.8172 1704.2073,-729.7953 1802.1679,-671.7961 1813.4015,-665.145 1824.3474,-655.9011 1833.4144,-647.2325"/>+<polygon fill="#000000" stroke="#000000" points="1835.9156,-649.6814 1840.5539,-640.1558 1830.9877,-644.7099 1835.9156,-649.6814"/>+</g>+<!-- u11&#45;&gt;u16 -->+<g id="edge32" class="edge">+<title>u11&#45;&gt;u16</title>+<path fill="none" stroke="#000000" d="M1507.8318,-781.7286C1526.3531,-778.6066 1547.7479,-775.0161 1567.1679,-771.7961 1839.0627,-726.7131 1915.8131,-753.0585 2179.1679,-671.7961 2201.4685,-664.9149 2225.1211,-654.2071 2244.3203,-644.5543"/>+<polygon fill="#000000" stroke="#000000" points="2246.0581,-647.5966 2253.3621,-639.9218 2242.8663,-641.3667 2246.0581,-647.5966"/>+</g>+<!-- u19 -->+<g id="node15" class="node">+<title>u19</title>+<ellipse fill="#ffbbbb" stroke="#000000" stroke-width="0" cx="1449.1679" cy="-622.7961" rx="41.6928" ry="18"/>+<text text-anchor="middle" x="1449.1679" y="-619.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Ordinate</text>+</g>+<!-- u11&#45;&gt;u19 -->+<g id="edge33" class="edge">+<title>u11&#45;&gt;u19</title>+<path fill="none" stroke="#000000" d="M1458.9697,-771.6063C1457.0604,-742.6195 1453.3122,-685.7153 1451.0445,-651.2877"/>+<polygon fill="#000000" stroke="#000000" points="1454.5143,-650.7118 1450.3645,-640.9635 1447.5294,-651.172 1454.5143,-650.7118"/>+</g>+<!-- u20 -->+<g id="node71" class="node">+<title>u20</title>+<ellipse fill="#33ff33" stroke="#000000" stroke-width="0" cx="1718.1679" cy="-253.7961" rx="44.393" ry="18"/>+<text text-anchor="middle" x="1718.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Rotatable</text>+</g>+<!-- u11&#45;&gt;u20 -->+<g id="edge34" class="edge">+<title>u11&#45;&gt;u20</title>+<path fill="none" stroke="#000000" d="M1467.7406,-771.7697C1476.9894,-748.9361 1492.3631,-708.1738 1500.1679,-671.7961 1512.344,-615.0433 1497.2097,-462.6634 1525.1679,-411.7961 1563.151,-342.6893 1605.0515,-353.8304 1665.1679,-302.7961 1674.6255,-294.7673 1684.6945,-285.6202 1693.4875,-277.4206"/>+<polygon fill="#000000" stroke="#000000" points="1695.9496,-279.9098 1700.8389,-270.5106 1691.1553,-274.8093 1695.9496,-279.9098"/>+</g>+<!-- u11&#45;&gt;u10 -->+<g id="edge35" class="edge">+<title>u11&#45;&gt;u10</title>+<path fill="none" stroke="#000000" d="M1513.1886,-787.2589C1731.4809,-776.4492 2553.8642,-732.022 2652.1679,-671.7961 2691.7511,-647.5454 2854.4596,-368.1714 2905.0715,-280.1704"/>+<polygon fill="#000000" stroke="#000000" points="2908.2007,-281.7494 2910.1461,-271.3347 2902.1306,-278.2631 2908.2007,-281.7494"/>+</g>+<!-- u17 -->+<g id="node14" class="node">+<title>u17</title>+<ellipse fill="#ffbbbb" stroke="#000000" stroke-width="0" cx="1449.1679" cy="-437.7961" rx="42.4939" ry="18"/>+<text text-anchor="middle" x="1449.1679" y="-434.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Abscissa</text>+</g>+<!-- u17&#45;&gt;u18 -->+<g id="edge36" class="edge">+<title>u17&#45;&gt;u18</title>+<path fill="none" stroke="#000000" d="M1441.9377,-419.8184C1428.9177,-387.4444 1401.4601,-319.1714 1386.1213,-281.0316"/>+<polygon fill="#000000" stroke="#000000" points="1389.297,-279.5477 1382.3184,-271.5759 1382.8025,-282.1597 1389.297,-279.5477"/>+</g>+<!-- u19&#45;&gt;u3 -->+<g id="edge37" class="edge">+<title>u19&#45;&gt;u3</title>+<path fill="none" stroke="#000000" d="M1485.027,-613.4959C1505.9801,-608.2292 1532.9801,-601.7292 1557.1679,-596.7961 1846.8309,-537.7192 1939.1941,-597.8507 2213.1679,-486.7961 2228.5052,-480.5791 2243.8304,-470.5998 2256.2963,-461.2644"/>+<polygon fill="#000000" stroke="#000000" points="2258.6737,-463.85 2264.4348,-454.9584 2254.3863,-458.3166 2258.6737,-463.85"/>+</g>+<!-- u19&#45;&gt;u17 -->+<g id="edge38" class="edge">+<title>u19&#45;&gt;u17</title>+<path fill="none" stroke="#000000" d="M1449.1679,-604.7207C1449.1679,-572.3924 1449.1679,-504.4598 1449.1679,-465.9671"/>+<polygon fill="#000000" stroke="#000000" points="1452.668,-465.9449 1449.1679,-455.9449 1445.668,-465.9449 1452.668,-465.9449"/>+</g>+<!-- u21 -->+<g id="node16" class="node">+<title>u21</title>+<ellipse fill="#ffbbbb" stroke="#000000" stroke-width="0" cx="1479.1679" cy="-949.7961" rx="34.394" ry="18"/>+<text text-anchor="middle" x="1479.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Vector</text>+</g>+<!-- u21&#45;&gt;u11 -->+<g id="edge39" class="edge">+<title>u21&#45;&gt;u11</title>+<path fill="none" stroke="#000000" d="M1477.0252,-931.7531C1473.7468,-904.1448 1467.4561,-851.1707 1463.5553,-818.3216"/>+<polygon fill="#000000" stroke="#000000" points="1466.9867,-817.5361 1462.3318,-808.0187 1460.0355,-818.3616 1466.9867,-817.5361"/>+</g>+<!-- u7 -->+<g id="node17" class="node">+<title>u7</title>+<ellipse fill="#bbffff" stroke="#000000" stroke-width="0" cx="2810.1679" cy="-622.7961" rx="31.6951" ry="18"/>+<text text-anchor="middle" x="2810.1679" y="-619.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Move</text>+</g>+<!-- u7&#45;&gt;u8 -->+<g id="edge40" class="edge">+<title>u7&#45;&gt;u8</title>+<path fill="none" stroke="#000000" d="M2778.2482,-622.7961C2735.5639,-622.7961 2692.8797,-622.7961 2650.1954,-622.7961"/>+<polygon fill="#000000" stroke="#000000" points="2649.9296,-619.2962 2639.9296,-622.7961 2649.9295,-626.2962 2649.9296,-619.2962"/>+</g>+<!-- u7&#45;&gt;u21 -->+<g id="edge41" class="edge">+<title>u7&#45;&gt;u21</title>+<path fill="none" stroke="#000000" d="M2789.9206,-636.9464C2773.0702,-648.064 2748.0596,-663.0792 2724.1679,-671.7961 2493.2298,-756.0541 2392.404,-647.7493 2180.1679,-771.7961 2162.1866,-782.3057 2168.0719,-797.1554 2150.1679,-807.7961 1923.0593,-942.7711 1823.6698,-860.5244 1567.1679,-923.7961 1551.0543,-927.7708 1533.482,-932.8164 1518.3068,-937.4029"/>+<polygon fill="#000000" stroke="#000000" points="1517.2592,-934.0632 1508.72,-940.3348 1519.3064,-940.7572 1517.2592,-934.0632"/>+</g>+<!-- u24 -->+<g id="node18" class="node">+<title>u24</title>+<ellipse fill="#bbffff" stroke="#000000" stroke-width="0" cx="3142.1679" cy="-789.7961" rx="29.795" ry="18"/>+<text text-anchor="middle" x="3142.1679" y="-786.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Piece</text>+</g>+<!-- u24&#45;&gt;u9 -->+<g id="edge42" class="edge">+<title>u24&#45;&gt;u9</title>+<path fill="none" stroke="#000000" d="M3122.215,-776.2181C3075.2893,-744.3609 2954.1197,-662.542 2851.1679,-596.7961 2772.4697,-546.5387 2748.9153,-539.9849 2672.1679,-486.7961 2659.5531,-478.0536 2646.0604,-467.7032 2634.811,-458.773"/>+<polygon fill="#000000" stroke="#000000" points="2636.6897,-455.7933 2626.6976,-452.2709 2632.3122,-461.2557 2636.6897,-455.7933"/>+</g>+<!-- u24&#45;&gt;u21 -->+<g id="edge43" class="edge">+<title>u24&#45;&gt;u21</title>+<path fill="none" stroke="#000000" d="M3119.5722,-801.8568C3114.3169,-804.1977 3108.6518,-806.3654 3103.1679,-807.7961 2463.0281,-974.8067 2275.0828,-837.4995 1619.1679,-923.7961 1586.0244,-928.1567 1548.8326,-935.165 1521.117,-940.8072"/>+<polygon fill="#000000" stroke="#000000" points="1520.0748,-937.4484 1510.9868,-942.8944 1521.4874,-944.3043 1520.0748,-937.4484"/>+</g>+<!-- u25 -->+<g id="node19" class="node">+<title>u25</title>+<ellipse fill="#bbffff" stroke="#000000" stroke-width="0" cx="2840.1679" cy="-789.7961" rx="64.189" ry="18"/>+<text text-anchor="middle" x="2840.1679" y="-786.0961" font-family="Times,serif" font-size="14.00" fill="#000000">QualifiedMove</text>+</g>+<!-- u25&#45;&gt;u7 -->+<g id="edge44" class="edge">+<title>u25&#45;&gt;u7</title>+<path fill="none" stroke="#000000" d="M2836.9002,-771.6063C2831.6567,-742.4174 2821.3279,-684.9205 2815.1573,-650.5709"/>+<polygon fill="#000000" stroke="#000000" points="2818.5991,-649.9343 2813.3861,-640.7107 2811.7094,-651.1721 2818.5991,-649.9343"/>+</g>+<!-- u26 -->+<g id="node20" class="node">+<title>u26</title>+<ellipse fill="#bbffff" stroke="#000000" stroke-width="0" cx="2840.1679" cy="-949.7961" rx="27.8951" ry="18"/>+<text text-anchor="middle" x="2840.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Turn</text>+</g>+<!-- u26&#45;&gt;u25 -->+<g id="edge45" class="edge">+<title>u26&#45;&gt;u25</title>+<path fill="none" stroke="#000000" d="M2840.1679,-931.7531C2840.1679,-904.1448 2840.1679,-851.1707 2840.1679,-818.3216"/>+<polygon fill="#000000" stroke="#000000" points="2843.668,-818.0186 2840.1679,-808.0187 2836.668,-818.0187 2843.668,-818.0186"/>+</g>+<!-- u28 -->+<g id="node21" class="node">+<title>u28</title>+<ellipse fill="#bbffff" stroke="#000000" stroke-width="0" cx="3008.1679" cy="-789.7961" rx="85.5853" ry="18"/>+<text text-anchor="middle" x="3008.1679" y="-786.0961" font-family="Times,serif" font-size="14.00" fill="#000000">EitherQualifiedMove</text>+</g>+<!-- u28&#45;&gt;u7 -->+<g id="edge46" class="edge">+<title>u28&#45;&gt;u7</title>+<path fill="none" stroke="#000000" d="M2987.3526,-772.2398C2950.8472,-741.4499 2875.4015,-677.8164 2835.7668,-644.3872"/>+<polygon fill="#000000" stroke="#000000" points="2838.0102,-641.7006 2828.1095,-637.9287 2833.497,-647.0515 2838.0102,-641.7006"/>+</g>+<!-- u29 -->+<g id="node22" class="node">+<title>u29</title>+<ellipse fill="#bbffff" stroke="#000000" stroke-width="0" cx="2965.1679" cy="-949.7961" rx="36.2938" ry="18"/>+<text text-anchor="middle" x="2965.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Zobrist</text>+</g>+<!-- u29&#45;&gt;u9 -->+<g id="edge47" class="edge">+<title>u29&#45;&gt;u9</title>+<path fill="none" stroke="#000000" d="M2989.2236,-936.1998C3052.019,-900.706 3216.0659,-807.971 3216.1679,-807.7961 3224.2284,-793.9748 3224.1767,-785.6474 3216.1679,-771.7961 3079.5435,-535.5024 2905.5166,-628.3916 2672.1679,-486.7961 2658.8226,-478.6982 2645.0225,-468.2384 2633.7523,-459.0636"/>+<polygon fill="#000000" stroke="#000000" points="2635.9669,-456.3531 2626.0357,-452.6622 2631.4976,-461.7407 2635.9669,-456.3531"/>+</g>+<!-- u29&#45;&gt;u11 -->+<g id="edge48" class="edge">+<title>u29&#45;&gt;u11</title>+<path fill="none" stroke="#000000" d="M2935.3835,-939.4361C2918.5021,-933.9604 2896.8763,-927.6024 2877.1679,-923.7961 2360.8702,-824.0823 1723.8034,-797.5518 1523.4959,-791.4373"/>+<polygon fill="#000000" stroke="#000000" points="1523.5469,-787.9374 1513.4467,-791.1366 1523.3375,-794.9342 1523.5469,-787.9374"/>+</g>+<!-- u41 -->+<g id="node23" class="node">+<title>u41</title>+<ellipse fill="#bbffff" stroke="#000000" stroke-width="0" cx="3095.1679" cy="-949.7961" rx="75.2868" ry="18"/>+<text text-anchor="middle" x="3095.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PieceSquareArray</text>+</g>+<!-- u41&#45;&gt;u24 -->+<g id="edge49" class="edge">+<title>u41&#45;&gt;u24</title>+<path fill="none" stroke="#000000" d="M3100.468,-931.7531C3108.6565,-903.8773 3124.4413,-850.1417 3134.0673,-817.3724"/>+<polygon fill="#000000" stroke="#000000" points="3137.4984,-818.1101 3136.9588,-807.529 3130.7822,-816.1372 3137.4984,-818.1101"/>+</g>+<!-- u42 -->+<g id="node33" class="node">+<title>u42</title>+<ellipse fill="#ffff77" stroke="#000000" stroke-width="0" cx="942.1679" cy="-253.7961" rx="27.8951" ry="18"/>+<text text-anchor="middle" x="942.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Bool</text>+</g>+<!-- u41&#45;&gt;u42 -->+<g id="edge50" class="edge">+<title>u41&#45;&gt;u42</title>+<path fill="none" stroke="#000000" d="M3122.9998,-933.0002C3168.0545,-903.4553 3249.4991,-838.9257 3224.1679,-771.7961 3187.5902,-674.8626 3154.9115,-656.3993 3070.1679,-596.7961 2961.4819,-520.3535 2912.7088,-542.7065 2792.1679,-486.7961 2728.1324,-457.0946 2720.0376,-431.1974 2652.1679,-411.7961 2293.9506,-309.3959 1307.094,-479.6289 979.1679,-302.7961 969.5977,-297.6354 961.7799,-288.8083 955.8373,-280.0557"/>+<polygon fill="#000000" stroke="#000000" points="958.7616,-278.1298 950.5244,-271.4665 952.8084,-281.8122 958.7616,-278.1298"/>+</g>+<!-- u97 -->+<g id="node24" class="node">+<title>u97</title>+<ellipse fill="#ffbbff" stroke="#000000" stroke-width="0" cx="91.1679" cy="-1854.7961" rx="47.3916" ry="18"/>+<text text-anchor="middle" x="91.1679" y="-1851.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Pondering</text>+</g>+<!-- u2 -->+<g id="node25" class="node">+<title>u2</title>+<ellipse fill="#77ff77" stroke="#000000" stroke-width="0" cx="238.1679" cy="-1318.7961" rx="28.6953" ry="18"/>+<text text-anchor="middle" x="238.1679" y="-1315.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PGN</text>+</g>+<!-- u22 -->+<g id="node26" class="node">+<title>u22</title>+<ellipse fill="#77ff77" stroke="#000000" stroke-width="0" cx="238.1679" cy="-1134.7961" rx="63.8893" ry="18"/>+<text text-anchor="middle" x="238.1679" y="-1131.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PGNComment</text>+</g>+<!-- u2&#45;&gt;u22 -->+<g id="edge51" class="edge">+<title>u2&#45;&gt;u22</title>+<path fill="none" stroke="#000000" d="M238.1679,-1300.4808C238.1679,-1268.3804 238.1679,-1201.7408 238.1679,-1163.4783"/>+<polygon fill="#000000" stroke="#000000" points="241.668,-1163.0373 238.1679,-1153.0373 234.668,-1163.0374 241.668,-1163.0373"/>+</g>+<!-- u23 -->+<g id="node27" class="node">+<title>u23</title>+<ellipse fill="#77ff77" stroke="#000000" stroke-width="0" cx="396.1679" cy="-1134.7961" rx="76.8869" ry="18"/>+<text text-anchor="middle" x="396.1679" y="-1131.0961" font-family="Times,serif" font-size="14.00" fill="#000000">StandardAlgebraic</text>+</g>+<!-- u2&#45;&gt;u23 -->+<g id="edge52" class="edge">+<title>u2&#45;&gt;u23</title>+<path fill="none" stroke="#000000" d="M251.9129,-1302.7892C279.3895,-1270.7912 341.2884,-1198.7063 374.3625,-1160.1897"/>+<polygon fill="#000000" stroke="#000000" points="377.1005,-1162.3736 380.9599,-1152.5066 371.7898,-1157.8132 377.1005,-1162.3736"/>+</g>+<!-- u53 -->+<g id="node34" class="node">+<title>u53</title>+<ellipse fill="#ffff77" stroke="#000000" stroke-width="0" cx="775.1679" cy="-253.7961" rx="38.1938" ry="18"/>+<text text-anchor="middle" x="775.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Integral</text>+</g>+<!-- u2&#45;&gt;u53 -->+<g id="edge53" class="edge">+<title>u2&#45;&gt;u53</title>+<path fill="none" stroke="#000000" d="M222.9202,-1303.4447C200.7816,-1280.0007 160.5924,-1232.8099 144.1679,-1183.7961 111.099,-1085.1125 135.1679,-1053.873 135.1679,-949.7961 135.1679,-949.7961 135.1679,-949.7961 135.1679,-622.7961 135.1679,-323.7065 488.2786,-482.7587 727.1679,-302.7961 736.6348,-295.6643 745.9961,-286.6713 753.9029,-278.3423"/>+<polygon fill="#000000" stroke="#000000" points="756.5111,-280.6768 760.7166,-270.9523 751.3647,-275.9317 756.5111,-280.6768"/>+</g>+<!-- u27 -->+<g id="node56" class="node">+<title>u27</title>+<ellipse fill="#77ffff" stroke="#000000" stroke-width="0" cx="2720.1679" cy="-1318.7961" rx="32.4942" ry="18"/>+<text text-anchor="middle" x="2720.1679" y="-1315.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Game</text>+</g>+<!-- u23&#45;&gt;u27 -->+<g id="edge54" class="edge">+<title>u23&#45;&gt;u27</title>+<path fill="none" stroke="#000000" d="M432.7781,-1150.7425C460.7835,-1162.1417 500.6675,-1176.6759 537.1679,-1183.7961 1004.9663,-1275.0504 2224.9801,-1148.3101 2679.1679,-1292.7961 2683.6256,-1294.2142 2688.0776,-1296.2394 2692.3167,-1298.5419"/>+<polygon fill="#000000" stroke="#000000" points="2690.8079,-1301.7196 2701.1765,-1303.8972 2694.4289,-1295.7289 2690.8079,-1301.7196"/>+</g>+<!-- u54 -->+<g id="node28" class="node">+<title>u54</title>+<ellipse fill="#77ff77" stroke="#000000" stroke-width="0" cx="292.1679" cy="-1485.7961" rx="60.3893" ry="18"/>+<text text-anchor="middle" x="292.1679" y="-1482.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PGNDatabase</text>+</g>+<!-- u54&#45;&gt;u2 -->+<g id="edge55" class="edge">+<title>u54&#45;&gt;u2</title>+<path fill="none" stroke="#000000" d="M286.2861,-1467.6063C276.823,-1438.3408 258.1583,-1380.6185 247.0616,-1346.3009"/>+<polygon fill="#000000" stroke="#000000" points="250.2863,-1344.8975 243.8793,-1336.4594 243.6259,-1347.0512 250.2863,-1344.8975"/>+</g>+<!-- u55 -->+<g id="node29" class="node">+<title>u55</title>+<ellipse fill="#77ff77" stroke="#000000" stroke-width="0" cx="346.1679" cy="-1670.7961" rx="86.3847" ry="18"/>+<text text-anchor="middle" x="346.1679" y="-1667.0961" font-family="Times,serif" font-size="14.00" fill="#000000">QualifiedMoveForest</text>+</g>+<!-- u55&#45;&gt;u54 -->+<g id="edge56" class="edge">+<title>u55&#45;&gt;u54</title>+<path fill="none" stroke="#000000" d="M340.8918,-1652.7207C331.4554,-1620.3924 311.6264,-1552.4598 300.3907,-1513.9671"/>+<polygon fill="#000000" stroke="#000000" points="303.6272,-1512.5636 297.4653,-1503.9449 296.9076,-1514.525 303.6272,-1512.5636"/>+</g>+<!-- u57 -->+<g id="node60" class="node">+<title>u57</title>+<ellipse fill="#77ffff" stroke="#000000" stroke-width="0" cx="2580.1679" cy="-1485.7961" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="2580.1679" y="-1482.0961" font-family="Times,serif" font-size="14.00" fill="#000000">GameTree</text>+</g>+<!-- u55&#45;&gt;u57 -->+<g id="edge57" class="edge">+<title>u55&#45;&gt;u57</title>+<path fill="none" stroke="#000000" d="M420.7329,-1661.5905C464.993,-1656.2924 522.2352,-1649.7289 573.1679,-1644.7961 672.8725,-1635.1397 2203.7642,-1515.2488 2522.3594,-1490.3184"/>+<polygon fill="#000000" stroke="#000000" points="2523.0457,-1493.7755 2532.7422,-1489.5059 2522.4996,-1486.7968 2523.0457,-1493.7755"/>+</g>+<!-- u83 -->+<g id="node30" class="node">+<title>u83</title>+<ellipse fill="#77ff77" stroke="#000000" stroke-width="0" cx="346.1679" cy="-1854.7961" rx="126.978" ry="18"/>+<text text-anchor="middle" x="346.1679" y="-1851.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PositionHashQualifiedMoveTree</text>+</g>+<!-- u83&#45;&gt;u55 -->+<g id="edge58" class="edge">+<title>u83&#45;&gt;u55</title>+<path fill="none" stroke="#000000" d="M346.1679,-1836.4808C346.1679,-1804.3804 346.1679,-1737.7408 346.1679,-1699.4783"/>+<polygon fill="#000000" stroke="#000000" points="349.668,-1699.0373 346.1679,-1689.0373 342.668,-1699.0374 349.668,-1699.0373"/>+</g>+<!-- u1 -->+<g id="node31" class="node">+<title>u1</title>+<ellipse fill="#ffff77" stroke="#000000" stroke-width="0" cx="1202.1679" cy="-253.7961" rx="28.6953" ry="18"/>+<text text-anchor="middle" x="1202.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Float</text>+</g>+<!-- u56 -->+<g id="node35" class="node">+<title>u56</title>+<ellipse fill="#ffff77" stroke="#000000" stroke-width="0" cx="674.1679" cy="-253.7961" rx="44.393" ry="18"/>+<text text-anchor="middle" x="674.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">RoseTree</text>+</g>+<!-- u67 -->+<g id="node36" class="node">+<title>u67</title>+<ellipse fill="#ffff77" stroke="#000000" stroke-width="0" cx="864.1679" cy="-253.7961" rx="32.4942" ry="18"/>+<text text-anchor="middle" x="864.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Either</text>+</g>+<!-- u98 -->+<g id="node38" class="node">+<title>u98</title>+<ellipse fill="#ffff77" stroke="#000000" stroke-width="0" cx="582.1679" cy="-253.7961" rx="29.795" ry="18"/>+<text text-anchor="middle" x="582.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Time</text>+</g>+<!-- u85 -->+<g id="node39" class="node">+<title>u85</title>+<ellipse fill="#7777ff" stroke="#000000" stroke-width="0" cx="1475.1679" cy="-1670.7961" rx="131.8766" ry="18"/>+<text text-anchor="middle" x="1475.1679" y="-1667.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PositionHashQuantifiedGameTree</text>+</g>+<!-- u87 -->+<g id="node41" class="node">+<title>u87</title>+<ellipse fill="#7777ff" stroke="#000000" stroke-width="0" cx="1475.1679" cy="-1485.7961" rx="69.5877" ry="18"/>+<text text-anchor="middle" x="1475.1679" y="-1482.0961" font-family="Times,serif" font-size="14.00" fill="#000000">QuantifiedGame</text>+</g>+<!-- u85&#45;&gt;u87 -->+<g id="edge59" class="edge">+<title>u85&#45;&gt;u87</title>+<path fill="none" stroke="#000000" d="M1475.1679,-1652.7207C1475.1679,-1620.3924 1475.1679,-1552.4598 1475.1679,-1513.9671"/>+<polygon fill="#000000" stroke="#000000" points="1478.668,-1513.9449 1475.1679,-1503.9449 1471.668,-1513.9449 1478.668,-1513.9449"/>+</g>+<!-- u80 -->+<g id="node54" class="node">+<title>u80</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="1077.1679" cy="-1134.7961" rx="62.2891" ry="18"/>+<text text-anchor="middle" x="1077.1679" y="-1131.0961" font-family="Times,serif" font-size="14.00" fill="#000000">SearchOptions</text>+</g>+<!-- u85&#45;&gt;u80 -->+<g id="edge60" class="edge">+<title>u85&#45;&gt;u80</title>+<path fill="none" stroke="#000000" d="M1461.6976,-1652.6553C1402.575,-1573.0328 1165.9213,-1254.3233 1096.4398,-1160.7503"/>+<polygon fill="#000000" stroke="#000000" points="1099.2034,-1158.6012 1090.4318,-1152.6591 1093.5834,-1162.7743 1099.2034,-1158.6012"/>+</g>+<!-- u85&#45;&gt;u57 -->+<g id="edge61" class="edge">+<title>u85&#45;&gt;u57</title>+<path fill="none" stroke="#000000" d="M1553.9787,-1656.351C1575.1379,-1652.5317 1598.0155,-1648.4553 1619.1679,-1644.7961 1963.7443,-1585.1863 2378.6821,-1518.1333 2525.4817,-1494.556"/>+<polygon fill="#000000" stroke="#000000" points="2526.2645,-1497.9752 2535.5832,-1492.9342 2525.1548,-1491.0637 2526.2645,-1497.9752"/>+</g>+<!-- u86 -->+<g id="node40" class="node">+<title>u86</title>+<ellipse fill="#7777ff" stroke="#000000" stroke-width="0" cx="1475.1679" cy="-1318.7961" rx="35.9954" ry="18"/>+<text text-anchor="middle" x="1475.1679" y="-1315.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Fitness</text>+</g>+<!-- u72 -->+<g id="node51" class="node">+<title>u72</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="1234.1679" cy="-1134.7961" rx="76.8869" ry="18"/>+<text text-anchor="middle" x="1234.1679" y="-1131.0961" font-family="Times,serif" font-size="14.00" fill="#000000">EvaluationOptions</text>+</g>+<!-- u86&#45;&gt;u72 -->+<g id="edge62" class="edge">+<title>u86&#45;&gt;u72</title>+<path fill="none" stroke="#000000" d="M1455.4458,-1303.7386C1413.5755,-1271.7712 1315.5263,-1196.9121 1265.1895,-1158.4806"/>+<polygon fill="#000000" stroke="#000000" points="1267.0247,-1155.4783 1256.9525,-1152.1918 1262.7768,-1161.0421 1267.0247,-1155.4783"/>+</g>+<!-- u86&#45;&gt;u27 -->+<g id="edge63" class="edge">+<title>u86&#45;&gt;u27</title>+<path fill="none" stroke="#000000" d="M1492.2867,-1334.7422C1518.9105,-1358.33 1572.944,-1401.4877 1628.1679,-1417.7961 1739.205,-1450.587 2571.5589,-1478.4654 2670.1679,-1417.7961 2695.168,-1402.4148 2708.1237,-1370.2474 2714.5145,-1346.7394"/>+<polygon fill="#000000" stroke="#000000" points="2717.9312,-1347.5027 2716.9382,-1336.9545 2711.1365,-1345.8196 2717.9312,-1347.5027"/>+</g>+<!-- u87&#45;&gt;u86 -->+<g id="edge64" class="edge">+<title>u87&#45;&gt;u86</title>+<path fill="none" stroke="#000000" d="M1475.1679,-1467.6063C1475.1679,-1438.6195 1475.1679,-1381.7153 1475.1679,-1347.2877"/>+<polygon fill="#000000" stroke="#000000" points="1478.668,-1346.9635 1475.1679,-1336.9635 1471.668,-1346.9635 1478.668,-1346.9635"/>+</g>+<!-- u61 -->+<g id="node42" class="node">+<title>u61</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="786.1679" cy="-1318.7961" rx="89.0842" ry="18"/>+<text text-anchor="middle" x="786.1679" y="-1315.0961" font-family="Times,serif" font-size="14.00" fill="#000000">CommandLineOption</text>+</g>+<!-- u61&#45;&gt;u13 -->+<g id="edge65" class="edge">+<title>u61&#45;&gt;u13</title>+<path fill="none" stroke="#000000" d="M757.4476,-1301.7255C677.5679,-1251.7987 460.8881,-1098.4992 496.1679,-923.7961 510.6772,-851.9468 520.6255,-833.5152 560.1679,-771.7961 631.6612,-660.2067 923.6603,-364.4814 1010.0085,-277.9204"/>+<polygon fill="#000000" stroke="#000000" points="1012.6638,-280.2146 1017.2531,-270.6653 1007.7104,-275.2685 1012.6638,-280.2146"/>+</g>+<!-- u62 -->+<g id="node43" class="node">+<title>u62</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="949.1679" cy="-1134.7961" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="949.1679" y="-1131.0961" font-family="Times,serif" font-size="14.00" fill="#000000">IOOptions</text>+</g>+<!-- u64 -->+<g id="node45" class="node">+<title>u64</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="1102.1679" cy="-949.7961" rx="55.7903" ry="18"/>+<text text-anchor="middle" x="1102.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PGNOptions</text>+</g>+<!-- u62&#45;&gt;u64 -->+<g id="edge66" class="edge">+<title>u62&#45;&gt;u64</title>+<path fill="none" stroke="#000000" d="M963.5617,-1117.3917C990.6719,-1084.6115 1049.413,-1013.5847 1081.0204,-975.3666"/>+<polygon fill="#000000" stroke="#000000" points="1084.0248,-977.2257 1087.7008,-967.289 1078.6305,-972.7645 1084.0248,-977.2257"/>+</g>+<!-- u66 -->+<g id="node46" class="node">+<title>u66</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="597.1679" cy="-949.7961" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="597.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">UIOptions</text>+</g>+<!-- u62&#45;&gt;u66 -->+<g id="edge67" class="edge">+<title>u62&#45;&gt;u66</title>+<path fill="none" stroke="#000000" d="M913.9366,-1122.2282C856.9167,-1101.099 741.9476,-1055.187 654.1679,-998.7961 643.0169,-991.6326 631.7424,-982.4407 622.1973,-973.9574"/>+<polygon fill="#000000" stroke="#000000" points="624.3756,-971.2072 614.627,-967.0582 619.6605,-976.381 624.3756,-971.2072"/>+</g>+<!-- u63 -->+<g id="node44" class="node">+<title>u63</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="896.1679" cy="-622.7961" rx="62.2891" ry="18"/>+<text text-anchor="middle" x="896.1679" y="-619.0961" font-family="Times,serif" font-size="14.00" fill="#000000">CECPFeatures</text>+</g>+<!-- u63&#45;&gt;u13 -->+<g id="edge68" class="edge">+<title>u63&#45;&gt;u13</title>+<path fill="none" stroke="#000000" d="M902.9173,-604.7487C925.2502,-545.0325 996.8577,-353.5602 1023.7927,-281.5383"/>+<polygon fill="#000000" stroke="#000000" points="1027.2067,-282.4013 1027.4314,-271.8088 1020.6502,-279.9492 1027.2067,-282.4013"/>+</g>+<!-- u63&#45;&gt;u42 -->+<g id="edge69" class="edge">+<title>u63&#45;&gt;u42</title>+<path fill="none" stroke="#000000" d="M898.4177,-604.7487C905.8467,-545.1549 929.6334,-354.3444 938.6541,-281.9826"/>+<polygon fill="#000000" stroke="#000000" points="942.1584,-282.165 939.9224,-271.8088 935.2121,-281.299 942.1584,-282.165"/>+</g>+<!-- u63&#45;&gt;u10 -->+<g id="edge70" class="edge">+<title>u63&#45;&gt;u10</title>+<path fill="none" stroke="#000000" d="M947.5263,-612.3999C1023.5067,-595.3007 1168.1795,-556.0382 1273.1679,-486.7961 1311.2312,-461.6925 1302.3084,-432.0327 1343.1679,-411.7961 1560.9132,-303.9527 2189.3903,-327.0208 2431.1679,-302.7961 2589.5933,-286.9228 2776.8895,-268.1541 2866.7834,-259.1458"/>+<polygon fill="#000000" stroke="#000000" points="2867.3941,-262.6022 2876.9952,-258.1225 2866.696,-255.6371 2867.3941,-262.6022"/>+</g>+<!-- u64&#45;&gt;u2 -->+<g id="edge71" class="edge">+<title>u64&#45;&gt;u2</title>+<path fill="none" stroke="#000000" d="M1084.7183,-966.9946C1072.4604,-977.991 1055.1062,-991.512 1037.1679,-998.7961 856.2046,-1072.2784 294.3441,-962.3009 165.1679,-1108.7961 116.5846,-1163.893 180.5796,-1253.1286 216.6195,-1295.2953"/>+<polygon fill="#000000" stroke="#000000" points="214.1998,-1297.8457 223.4131,-1303.077 219.473,-1293.2421 214.1998,-1297.8457"/>+</g>+<!-- u65 -->+<g id="node96" class="node">+<title>u65</title>+<ellipse fill="#ff3333" stroke="#000000" stroke-width="0" cx="2920.1679" cy="-437.7961" rx="44.393" ry="18"/>+<text text-anchor="middle" x="2920.1679" y="-434.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Encoding</text>+</g>+<!-- u64&#45;&gt;u65 -->+<g id="edge72" class="edge">+<title>u64&#45;&gt;u65</title>+<path fill="none" stroke="#000000" d="M1134.546,-934.9373C1144.5203,-930.8266 1155.6481,-926.7015 1166.1679,-923.7961 1492.1394,-833.7683 1584.539,-863.0612 1918.1679,-807.7961 1960.9158,-800.715 2647.7406,-691.818 2686.1679,-671.7961 2692.6745,-668.4059 2837.8624,-521.3596 2896.21,-462.1349"/>+<polygon fill="#000000" stroke="#000000" points="2898.9997,-464.2903 2903.5234,-454.7098 2894.0125,-459.3782 2898.9997,-464.2903"/>+</g>+<!-- u66&#45;&gt;u53 -->+<g id="edge73" class="edge">+<title>u66&#45;&gt;u53</title>+<path fill="none" stroke="#000000" d="M588.6084,-931.8775C574.3686,-899.8059 548.4779,-830.4551 560.1679,-771.7961 599.8609,-572.6209 717.5982,-354.1388 759.855,-280.0308"/>+<polygon fill="#000000" stroke="#000000" points="762.9081,-281.7423 764.8507,-271.3271 756.8371,-278.2577 762.9081,-281.7423"/>+</g>+<!-- u66&#45;&gt;u67 -->+<g id="edge74" class="edge">+<title>u66&#45;&gt;u67</title>+<path fill="none" stroke="#000000" d="M627.1614,-935.6186C635.8201,-931.6611 645.3203,-927.4477 654.1679,-923.7961 791.304,-867.1961 882.4293,-929.5715 967.1679,-807.7961 1028.0166,-720.352 910.7818,-380.7209 874.4322,-281.2902"/>+<polygon fill="#000000" stroke="#000000" points="877.6261,-279.8346 870.8884,-271.6581 871.0566,-282.2516 877.6261,-279.8346"/>+</g>+<!-- u68 -->+<g id="node47" class="node">+<title>u68</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="737.1679" cy="-789.7961" rx="60.3893" ry="18"/>+<text text-anchor="middle" x="737.1679" y="-786.0961" font-family="Times,serif" font-size="14.00" fill="#000000">CECPOptions</text>+</g>+<!-- u66&#45;&gt;u68 -->+<g id="edge75" class="edge">+<title>u66&#45;&gt;u68</title>+<path fill="none" stroke="#000000" d="M612.1503,-932.6733C636.8611,-904.4323 686.2826,-847.9507 715.0324,-815.0937"/>+<polygon fill="#000000" stroke="#000000" points="717.9177,-817.1114 721.8687,-807.2808 712.6496,-812.5018 717.9177,-817.1114"/>+</g>+<!-- u69 -->+<g id="node48" class="node">+<title>u69</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="887.1679" cy="-789.7961" rx="71.4873" ry="18"/>+<text text-anchor="middle" x="887.1679" y="-786.0961" font-family="Times,serif" font-size="14.00" fill="#000000">NativeUIOptions</text>+</g>+<!-- u66&#45;&gt;u69 -->+<g id="edge76" class="edge">+<title>u66&#45;&gt;u69</title>+<path fill="none" stroke="#000000" d="M624.1899,-934.8874C675.8154,-906.4044 788.6299,-844.1619 848.3297,-811.2241"/>+<polygon fill="#000000" stroke="#000000" points="850.0233,-814.2871 857.0883,-806.3917 846.6417,-808.158 850.0233,-814.2871"/>+</g>+<!-- u70 -->+<g id="node49" class="node">+<title>u70</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="614.1679" cy="-789.7961" rx="44.6926" ry="18"/>+<text text-anchor="middle" x="614.1679" y="-786.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Verbosity</text>+</g>+<!-- u66&#45;&gt;u70 -->+<g id="edge77" class="edge">+<title>u66&#45;&gt;u70</title>+<path fill="none" stroke="#000000" d="M599.0849,-931.7531C602.0183,-904.1448 607.6468,-851.1707 611.137,-818.3216"/>+<polygon fill="#000000" stroke="#000000" points="614.6555,-818.3325 612.2317,-808.0187 607.6947,-817.5929 614.6555,-818.3325"/>+</g>+<!-- u33 -->+<g id="node62" class="node">+<title>u33</title>+<ellipse fill="#ff77ff" stroke="#000000" stroke-width="0" cx="2373.1679" cy="-1134.7961" rx="62.2891" ry="18"/>+<text text-anchor="middle" x="2373.1679" y="-1131.0961" font-family="Times,serif" font-size="14.00" fill="#000000">MoveNotation</text>+</g>+<!-- u66&#45;&gt;u33 -->+<g id="edge78" class="edge">+<title>u66&#45;&gt;u33</title>+<path fill="none" stroke="#000000" d="M611.738,-967.019C622.2779,-978.1763 637.5426,-991.8744 654.1679,-998.7961 731.4521,-1030.9724 1986.3579,-1110.768 2301.7066,-1130.3863"/>+<polygon fill="#000000" stroke="#000000" points="2301.8872,-1133.9042 2312.0851,-1131.0314 2302.3215,-1126.9177 2301.8872,-1133.9042"/>+</g>+<!-- u60 -->+<g id="node75" class="node">+<title>u60</title>+<ellipse fill="#33ff33" stroke="#000000" stroke-width="0" cx="1629.1679" cy="-253.7961" rx="27" ry="18"/>+<text text-anchor="middle" x="1629.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Tree</text>+</g>+<!-- u66&#45;&gt;u60 -->+<g id="edge79" class="edge">+<title>u66&#45;&gt;u60</title>+<path fill="none" stroke="#000000" d="M627.1354,-935.555C635.7937,-931.5966 645.3002,-927.3985 654.1679,-923.7961 795.8721,-866.2297 850.7094,-892.3439 978.1679,-807.7961 1139.6358,-700.6886 1179.9487,-656.661 1273.1679,-486.7961 1289.7649,-456.5527 1269.8023,-437.1767 1293.1679,-411.7961 1390.6662,-305.8893 1485.781,-392.7482 1598.1679,-302.7961 1605.7052,-296.7633 1611.946,-288.3735 1616.8037,-280.2395"/>+<polygon fill="#000000" stroke="#000000" points="1619.9636,-281.756 1621.696,-271.3038 1613.8236,-278.3944 1619.9636,-281.756"/>+</g>+<!-- u68&#45;&gt;u63 -->+<g id="edge80" class="edge">+<title>u68&#45;&gt;u63</title>+<path fill="none" stroke="#000000" d="M753.8831,-772.2398C782.2732,-742.4213 839.9916,-681.7988 872.5147,-647.6393"/>+<polygon fill="#000000" stroke="#000000" points="875.0773,-650.0236 879.438,-640.3677 870.0076,-645.1968 875.0773,-650.0236"/>+</g>+<!-- u69&#45;&gt;u46 -->+<g id="edge81" class="edge">+<title>u69&#45;&gt;u46</title>+<path fill="none" stroke="#000000" d="M957.4854,-786.3996C1235.9751,-772.6586 2253.059,-719.6335 2389.1679,-671.7961 2405.316,-666.1206 2421.2616,-655.883 2434.0263,-646.2279"/>+<polygon fill="#000000" stroke="#000000" points="2436.2248,-648.9516 2441.9253,-640.0209 2431.8998,-643.4475 2436.2248,-648.9516"/>+</g>+<!-- u71 -->+<g id="node50" class="node">+<title>u71</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="1077.1679" cy="-1318.7961" rx="38.1938" ry="18"/>+<text text-anchor="middle" x="1077.1679" y="-1315.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Options</text>+</g>+<!-- u71&#45;&gt;u62 -->+<g id="edge82" class="edge">+<title>u71&#45;&gt;u62</title>+<path fill="none" stroke="#000000" d="M1065.1259,-1301.4858C1042.5984,-1269.1025 993.9641,-1199.1907 967.3978,-1161.0016"/>+<polygon fill="#000000" stroke="#000000" points="970.0426,-1158.6746 961.4587,-1152.4642 964.2962,-1162.672 970.0426,-1158.6746"/>+</g>+<!-- u71&#45;&gt;u72 -->+<g id="edge83" class="edge">+<title>u71&#45;&gt;u72</title>+<path fill="none" stroke="#000000" d="M1091.6566,-1301.8156C1119.367,-1269.3398 1180.0047,-1198.274 1212.5325,-1160.1522"/>+<polygon fill="#000000" stroke="#000000" points="1215.1965,-1162.4222 1219.0249,-1152.5432 1209.8715,-1157.8786 1215.1965,-1162.4222"/>+</g>+<!-- u71&#45;&gt;u80 -->+<g id="edge84" class="edge">+<title>u71&#45;&gt;u80</title>+<path fill="none" stroke="#000000" d="M1077.1679,-1300.4808C1077.1679,-1268.3804 1077.1679,-1201.7408 1077.1679,-1163.4783"/>+<polygon fill="#000000" stroke="#000000" points="1080.668,-1163.0373 1077.1679,-1153.0373 1073.668,-1163.0374 1080.668,-1163.0373"/>+</g>+<!-- u72&#45;&gt;u73 -->+<g id="edge85" class="edge">+<title>u72&#45;&gt;u73</title>+<path fill="none" stroke="#000000" d="M1278.2976,-1120.0389C1339.3632,-1098.5245 1451.756,-1054.9223 1537.1679,-998.7961 1578.4432,-971.6731 1579.3315,-952.9915 1619.1679,-923.7961 1799.6932,-791.4918 1869.9957,-797.5144 2055.1679,-671.7961 2066.7218,-663.9519 2078.8897,-654.5988 2089.3567,-646.177"/>+<polygon fill="#000000" stroke="#000000" points="2091.8015,-648.6997 2097.3421,-639.6691 2087.3792,-643.2735 2091.8015,-648.6997"/>+</g>+<!-- u72&#45;&gt;u41 -->+<g id="edge86" class="edge">+<title>u72&#45;&gt;u41</title>+<path fill="none" stroke="#000000" d="M1307.711,-1129.6102C1637.8517,-1106.2746 2968.7698,-1011.5877 3010.1679,-998.7961 3028.9417,-992.9952 3048.0558,-982.4724 3063.3914,-972.6611"/>+<polygon fill="#000000" stroke="#000000" points="3065.5367,-975.4388 3071.9529,-967.0077 3061.6795,-969.5974 3065.5367,-975.4388"/>+</g>+<!-- u75 -->+<g id="node52" class="node">+<title>u75</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="1243.1679" cy="-949.7961" rx="67.6881" ry="18"/>+<text text-anchor="middle" x="1243.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">CriteriaWeights</text>+</g>+<!-- u72&#45;&gt;u75 -->+<g id="edge87" class="edge">+<title>u72&#45;&gt;u75</title>+<path fill="none" stroke="#000000" d="M1235.0472,-1116.7207C1236.6199,-1084.3924 1239.9248,-1016.4598 1241.7974,-977.9671"/>+<polygon fill="#000000" stroke="#000000" points="1245.2948,-978.1032 1242.2849,-967.9449 1238.3031,-977.763 1245.2948,-978.1032"/>+</g>+<!-- u79 -->+<g id="node53" class="node">+<title>u79</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="955.1679" cy="-949.7961" rx="73.387" ry="18"/>+<text text-anchor="middle" x="955.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PieceSquareTable</text>+</g>+<!-- u72&#45;&gt;u79 -->+<g id="edge88" class="edge">+<title>u72&#45;&gt;u79</title>+<path fill="none" stroke="#000000" d="M1208.4203,-1117.7233C1157.9687,-1084.2698 1046.0962,-1010.0891 989.4522,-972.5294"/>+<polygon fill="#000000" stroke="#000000" points="991.1217,-969.4369 980.8532,-966.8276 987.2532,-975.2709 991.1217,-969.4369"/>+</g>+<!-- u75&#45;&gt;u76 -->+<g id="edge89" class="edge">+<title>u75&#45;&gt;u76</title>+<path fill="none" stroke="#000000" d="M1261.175,-932.3937C1287.4241,-906.5453 1337.0016,-855.8745 1373.1679,-807.7961 1384.4399,-792.8113 1379.7685,-782.4949 1395.1679,-771.7961 1586.2953,-639.0087 1694.0626,-760.6325 1909.1679,-671.7961 1924.6427,-665.4051 1940.2583,-655.4952 1953.053,-646.2551"/>+<polygon fill="#000000" stroke="#000000" points="1955.4972,-648.7987 1961.4239,-640.0166 1951.3142,-643.1859 1955.4972,-648.7987"/>+</g>+<!-- u79&#45;&gt;u9 -->+<g id="edge90" class="edge">+<title>u79&#45;&gt;u9</title>+<path fill="none" stroke="#000000" d="M997.385,-935.0599C1010.0648,-931.0016 1024.0839,-926.8742 1037.1679,-923.7961 1059.2264,-918.6066 2634.4336,-689.0127 2649.1679,-671.7961 2700.5446,-611.7638 2652.535,-510.4084 2625.1854,-463.293"/>+<polygon fill="#000000" stroke="#000000" points="2628.1473,-461.4261 2620.0265,-454.6215 2622.1314,-465.0051 2628.1473,-461.4261"/>+</g>+<!-- u79&#45;&gt;u11 -->+<g id="edge91" class="edge">+<title>u79&#45;&gt;u11</title>+<path fill="none" stroke="#000000" d="M1000.2806,-935.4897C1012.2696,-931.6884 1025.209,-927.5862 1037.1679,-923.7961 1172.7312,-880.8322 1332.7426,-830.1516 1411.4495,-805.2248"/>+<polygon fill="#000000" stroke="#000000" points="1412.6173,-808.5264 1421.0938,-802.1704 1410.5038,-801.853 1412.6173,-808.5264"/>+</g>+<!-- u79&#45;&gt;u42 -->+<g id="edge92" class="edge">+<title>u79&#45;&gt;u42</title>+<path fill="none" stroke="#000000" d="M963.1686,-931.883C974.5151,-905.3984 994.7293,-853.9429 1002.1679,-807.7961 1030.1763,-634.039 1033.9303,-584.9063 1002.1679,-411.7961 993.3283,-363.619 970.5041,-311.0891 955.6924,-280.3688"/>+<polygon fill="#000000" stroke="#000000" points="958.7386,-278.6314 951.1928,-271.1942 952.4538,-281.7138 958.7386,-278.6314"/>+</g>+<!-- u79&#45;&gt;u74 -->+<g id="edge93" class="edge">+<title>u79&#45;&gt;u74</title>+<path fill="none" stroke="#000000" d="M963.071,-931.7221C974.5017,-905.0372 995.7457,-853.3346 1009.1679,-807.7961 1067.571,-609.6466 1109.5807,-363.6556 1122.7754,-281.7628"/>+<polygon fill="#000000" stroke="#000000" points="1126.2545,-282.171 1124.3772,-271.7439 1119.3423,-281.0658 1126.2545,-282.171"/>+</g>+<!-- u79&#45;&gt;u37 -->+<g id="edge94" class="edge">+<title>u79&#45;&gt;u37</title>+<path fill="none" stroke="#000000" d="M964.0567,-931.8022C1002.9637,-855.0549 1166.5799,-552.5987 1395.1679,-411.7961 1585.1242,-294.7893 1685.276,-401.8782 1885.1679,-302.7961 1897.6557,-296.6062 1909.7221,-287.1705 1919.585,-278.2262"/>+<polygon fill="#000000" stroke="#000000" points="1922.1243,-280.6422 1926.9884,-271.2298 1917.3163,-275.5546 1922.1243,-280.6422"/>+</g>+<!-- u80&#45;&gt;u58 -->+<g id="edge95" class="edge">+<title>u80&#45;&gt;u58</title>+<path fill="none" stroke="#000000" d="M1114.956,-1120.4245C1125.6428,-1116.5058 1137.3181,-1112.3611 1148.1679,-1108.7961 1313.9883,-1054.3114 1413.8288,-1133.2156 1525.1679,-998.7961 1557.4967,-959.7655 1526.7557,-818.1845 1547.1679,-771.7961 1570.0317,-719.836 1618.1888,-673.58 1650.1071,-646.8662"/>+<polygon fill="#000000" stroke="#000000" points="1652.3442,-649.5579 1657.8467,-640.504 1647.8991,-644.1504 1652.3442,-649.5579"/>+</g>+<!-- u80&#45;&gt;u7 -->+<g id="edge96" class="edge">+<title>u80&#45;&gt;u7</title>+<path fill="none" stroke="#000000" d="M1114.9368,-1120.3655C1125.6233,-1116.4462 1137.3034,-1112.3159 1148.1679,-1108.7961 1319.0899,-1053.4213 1380.2067,-1086.2255 1537.1679,-998.7961 1580.3152,-974.7625 1575.2275,-946.3472 1619.1679,-923.7961 1841.8146,-809.529 1968.7817,-956.3632 2170.1679,-807.7961 2184.8969,-796.9302 2175.3182,-782.4966 2190.1679,-771.7961 2386.0655,-630.6347 2497.473,-754.9337 2724.1679,-671.7961 2744.3143,-664.4076 2765.2691,-652.5681 2781.4501,-642.3779"/>+<polygon fill="#000000" stroke="#000000" points="2783.4024,-645.2836 2789.9129,-636.9251 2779.611,-639.3993 2783.4024,-645.2836"/>+</g>+<!-- u80&#45;&gt;u53 -->+<g id="edge97" class="edge">+<title>u80&#45;&gt;u53</title>+<path fill="none" stroke="#000000" d="M1039.8643,-1120.1887C1029.0798,-1116.2245 1017.2325,-1112.115 1006.1679,-1108.7961 802.3372,-1047.6552 672.2312,-1165.6626 540.1679,-998.7961 353.9263,-763.4736 665.2266,-378.3447 753.0944,-278.2051"/>+<polygon fill="#000000" stroke="#000000" points="755.9549,-280.254 759.9591,-270.445 750.7119,-275.6159 755.9549,-280.254"/>+</g>+<!-- u81 -->+<g id="node55" class="node">+<title>u81</title>+<ellipse fill="#ff7777" stroke="#000000" stroke-width="0" cx="763.1679" cy="-949.7961" rx="100.1823" ry="18"/>+<text text-anchor="middle" x="763.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">StandardOpeningOptions</text>+</g>+<!-- u80&#45;&gt;u81 -->+<g id="edge98" class="edge">+<title>u80&#45;&gt;u81</title>+<path fill="none" stroke="#000000" d="M1049.5777,-1118.5407C993.3787,-1085.4299 865.5412,-1010.1116 801.3861,-972.3132"/>+<polygon fill="#000000" stroke="#000000" points="802.7913,-969.0788 792.3988,-967.0181 799.2379,-975.1099 802.7913,-969.0788"/>+</g>+<!-- u81&#45;&gt;u42 -->+<g id="edge99" class="edge">+<title>u81&#45;&gt;u42</title>+<path fill="none" stroke="#000000" d="M812.0215,-933.9909C864.8314,-913.9745 946.2521,-873.8889 982.1679,-807.7961 1032.2006,-715.725 968.4542,-380.7051 948.0548,-281.596"/>+<polygon fill="#000000" stroke="#000000" points="951.4652,-280.8045 946.0051,-271.725 944.6114,-282.2277 951.4652,-280.8045"/>+</g>+<!-- u81&#45;&gt;u10 -->+<g id="edge100" class="edge">+<title>u81&#45;&gt;u10</title>+<path fill="none" stroke="#000000" d="M795.5633,-932.7073C843.0837,-907.2496 933.9818,-857.0607 1007.1679,-807.7961 1089.174,-752.5944 1112.3586,-740.7765 1183.1679,-671.7961 1236.5679,-619.7752 1329.5657,-447.2092 1395.1679,-411.7961 1403.4834,-407.3072 2598.3668,-286.3211 2866.9753,-259.1696"/>+<polygon fill="#000000" stroke="#000000" points="2867.6425,-262.6201 2877.2399,-258.1322 2866.9386,-255.6556 2867.6425,-262.6201"/>+</g>+<!-- u31 -->+<g id="node58" class="node">+<title>u31</title>+<ellipse fill="#77ffff" stroke="#000000" stroke-width="0" cx="2650.1679" cy="-1134.7961" rx="102.0819" ry="18"/>+<text text-anchor="middle" x="2650.1679" y="-1131.0961" font-family="Times,serif" font-size="14.00" fill="#000000">GameTerminationReason</text>+</g>+<!-- u27&#45;&gt;u31 -->+<g id="edge101" class="edge">+<title>u27&#45;&gt;u31</title>+<path fill="none" stroke="#000000" d="M2713.456,-1301.1534C2701.2365,-1269.0337 2675.2769,-1200.797 2660.6869,-1162.446"/>+<polygon fill="#000000" stroke="#000000" points="2663.8928,-1161.0298 2657.0658,-1152.9278 2657.3503,-1163.5188 2663.8928,-1161.0298"/>+</g>+<!-- u27&#45;&gt;u33 -->+<g id="edge102" class="edge">+<title>u27&#45;&gt;u33</title>+<path fill="none" stroke="#000000" d="M2699.1069,-1304.9391C2692.7684,-1300.9054 2685.7476,-1296.5712 2679.1679,-1292.7961 2586.3771,-1239.5577 2473.8113,-1183.5549 2414.4429,-1154.6596"/>+<polygon fill="#000000" stroke="#000000" points="2415.9069,-1151.4797 2405.3825,-1150.2594 2412.8488,-1157.7764 2415.9069,-1151.4797"/>+</g>+<!-- u51 -->+<g id="node91" class="node">+<title>u51</title>+<ellipse fill="#3333ff" stroke="#000000" stroke-width="0" cx="3561.1679" cy="-1670.7961" rx="82.5854" ry="18"/>+<text text-anchor="middle" x="3561.1679" y="-1667.0961" font-family="Times,serif" font-size="14.00" fill="#000000">InstancesByPosition</text>+</g>+<!-- u27&#45;&gt;u51 -->+<g id="edge103" class="edge">+<title>u27&#45;&gt;u51</title>+<path fill="none" stroke="#000000" d="M2746.2668,-1329.7198C2865.2838,-1379.5343 3357.4715,-1585.5391 3513.495,-1650.8427"/>+<polygon fill="#000000" stroke="#000000" points="3512.2705,-1654.1243 3522.8465,-1654.7567 3514.9732,-1647.6671 3512.2705,-1654.1243"/>+</g>+<!-- u52 -->+<g id="node92" class="node">+<title>u52</title>+<ellipse fill="#3333ff" stroke="#000000" stroke-width="0" cx="3459.1679" cy="-1854.7961" rx="39.7935" ry="18"/>+<text text-anchor="middle" x="3459.1679" y="-1851.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Position</text>+</g>+<!-- u27&#45;&gt;u52 -->+<g id="edge104" class="edge">+<title>u27&#45;&gt;u52</title>+<path fill="none" stroke="#000000" d="M2735.9206,-1334.9632C2792.7159,-1392.6468 2993.8465,-1591.7229 3187.1679,-1719.7961 3265.1123,-1771.4334 3365.6047,-1816.3166 3419.9947,-1839.0208"/>+<polygon fill="#000000" stroke="#000000" points="3418.7,-1842.2729 3429.2782,-1842.8672 3421.3794,-1835.806 3418.7,-1842.2729"/>+</g>+<!-- u30 -->+<g id="node57" class="node">+<title>u30</title>+<ellipse fill="#77ffff" stroke="#000000" stroke-width="0" cx="2612.1679" cy="-949.7961" rx="55.7903" ry="18"/>+<text text-anchor="middle" x="2612.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">DrawReason</text>+</g>+<!-- u30&#45;&gt;u7 -->+<g id="edge105" class="edge">+<title>u30&#45;&gt;u7</title>+<path fill="none" stroke="#000000" d="M2623.0952,-931.7494C2656.2445,-877.0028 2755.7589,-712.6532 2794.4961,-648.6783"/>+<polygon fill="#000000" stroke="#000000" points="2797.5696,-650.3597 2799.7552,-639.9927 2791.5817,-646.7339 2797.5696,-650.3597"/>+</g>+<!-- u31&#45;&gt;u30 -->+<g id="edge106" class="edge">+<title>u31&#45;&gt;u30</title>+<path fill="none" stroke="#000000" d="M2646.4551,-1116.7207C2639.8147,-1084.3924 2625.8609,-1016.4598 2617.9543,-977.9671"/>+<polygon fill="#000000" stroke="#000000" points="2621.3363,-977.0361 2615.8957,-967.9449 2614.4794,-978.4446 2621.3363,-977.0361"/>+</g>+<!-- u32 -->+<g id="node59" class="node">+<title>u32</title>+<ellipse fill="#77ffff" stroke="#000000" stroke-width="0" cx="2719.1679" cy="-949.7961" rx="33.2948" ry="18"/>+<text text-anchor="middle" x="2719.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Result</text>+</g>+<!-- u31&#45;&gt;u32 -->+<g id="edge107" class="edge">+<title>u31&#45;&gt;u32</title>+<path fill="none" stroke="#000000" d="M2656.9095,-1116.7207C2669.0497,-1084.1708 2694.6521,-1015.5267 2708.9545,-977.1796"/>+<polygon fill="#000000" stroke="#000000" points="2712.2851,-978.2652 2712.5004,-967.6725 2705.7265,-975.8189 2712.2851,-978.2652"/>+</g>+<!-- u32&#45;&gt;u3 -->+<g id="edge108" class="edge">+<title>u32&#45;&gt;u3</title>+<path fill="none" stroke="#000000" d="M2740.5672,-935.9446C2747.8532,-931.6357 2756.1787,-927.1428 2764.1679,-923.7961 2942.7845,-848.9729 3066.8682,-961.8844 3184.1679,-807.7961 3198.3685,-789.1418 3199.543,-614.4949 3184.1679,-596.7961 3069.5132,-464.814 2574.0062,-532.1678 2405.1679,-486.7961 2377.9726,-479.488 2348.6724,-467.7311 2325.7167,-457.5655"/>+<polygon fill="#000000" stroke="#000000" points="2326.8472,-454.2362 2316.2917,-453.3238 2323.9744,-460.6195 2326.8472,-454.2362"/>+</g>+<!-- u57&#45;&gt;u58 -->+<g id="edge109" class="edge">+<title>u57&#45;&gt;u58</title>+<path fill="none" stroke="#000000" d="M2532.0862,-1483.9254C2227.0272,-1471.9474 572.5861,-1405.3191 537.1679,-1367.7961 503.3046,-1331.9205 504.9309,-961.1399 537.1679,-923.7961 652.5404,-790.1469 1160.9123,-877.4098 1323.1679,-807.7961 1347.0258,-797.5602 1347.1007,-785.4715 1369.1679,-771.7961 1456.2824,-717.8096 1565.9758,-669.5585 1629.382,-643.4059"/>+<polygon fill="#000000" stroke="#000000" points="1630.8474,-646.5879 1638.7716,-639.5552 1628.1913,-640.1114 1630.8474,-646.5879"/>+</g>+<!-- u57&#45;&gt;u56 -->+<g id="edge110" class="edge">+<title>u57&#45;&gt;u56</title>+<path fill="none" stroke="#000000" d="M2532.0534,-1484.2607C2195.7538,-1473.4313 208.9269,-1407.8205 162.1679,-1367.7961 81.9125,-1299.0999 115.1679,-1240.4375 115.1679,-1134.7961 115.1679,-1134.7961 115.1679,-1134.7961 115.1679,-622.7961 115.1679,-524.9275 107.2933,-479.2873 178.1679,-411.7961 325.0036,-271.9699 442.6222,-398.8874 621.1679,-302.7961 632.7198,-296.579 643.6869,-287.2525 652.6156,-278.3993"/>+<polygon fill="#000000" stroke="#000000" points="655.1818,-280.7803 659.6043,-271.1527 650.1432,-275.921 655.1818,-280.7803"/>+</g>+<!-- u57&#45;&gt;u27 -->+<g id="edge111" class="edge">+<title>u57&#45;&gt;u27</title>+<path fill="none" stroke="#000000" d="M2594.603,-1468.6051C2613.8863,-1445.6369 2649.1134,-1403.6667 2679.1679,-1367.7961 2685.9353,-1359.719 2693.3262,-1350.8888 2699.9459,-1342.9767"/>+<polygon fill="#000000" stroke="#000000" points="2702.7748,-1345.0498 2706.5066,-1335.1339 2697.4057,-1340.5584 2702.7748,-1345.0498"/>+</g>+<!-- u59 -->+<g id="node61" class="node">+<title>u59</title>+<ellipse fill="#77ffff" stroke="#000000" stroke-width="0" cx="2601.1679" cy="-1318.7961" rx="68.7879" ry="18"/>+<text text-anchor="middle" x="2601.1679" y="-1315.0961" font-family="Times,serif" font-size="14.00" fill="#000000">MoveFrequency</text>+</g>+<!-- u57&#45;&gt;u59 -->+<g id="edge112" class="edge">+<title>u57&#45;&gt;u59</title>+<path fill="none" stroke="#000000" d="M2582.4552,-1467.6063C2586.1002,-1438.6195 2593.2559,-1381.7153 2597.5851,-1347.2877"/>+<polygon fill="#000000" stroke="#000000" points="2601.1082,-1347.3221 2598.8833,-1336.9635 2594.1629,-1346.4487 2601.1082,-1347.3221"/>+</g>+<!-- u57&#45;&gt;u60 -->+<g id="edge113" class="edge">+<title>u57&#45;&gt;u60</title>+<path fill="none" stroke="#000000" d="M2532.0895,-1483.931C2225.2028,-1471.9195 551.9609,-1404.7971 515.1679,-1367.7961 480.3505,-1332.782 493.0903,-973.0786 496.1679,-923.7961 505.2967,-777.6096 441.4038,-707.6251 537.1679,-596.7961 617.1489,-504.233 1499.9381,-375.7058 1598.1679,-302.7961 1605.9201,-297.0421 1612.2147,-288.7222 1617.0558,-280.5665"/>+<polygon fill="#000000" stroke="#000000" points="1620.2393,-282.037 1621.9042,-271.5738 1614.0777,-278.715 1620.2393,-282.037"/>+</g>+<!-- u59&#45;&gt;u7 -->+<g id="edge114" class="edge">+<title>u59&#45;&gt;u7</title>+<path fill="none" stroke="#000000" d="M2589.8849,-1300.9033C2574.8248,-1275.8563 2548.919,-1228.3926 2539.1679,-1183.7961 2527.6925,-1131.3137 2530.9423,-964.3408 2547.1679,-923.7961 2560.6397,-890.1324 2727.4152,-710.8065 2788.194,-646.1002"/>+<polygon fill="#000000" stroke="#000000" points="2790.7627,-648.4777 2795.0632,-638.7949 2785.6631,-643.6825 2790.7627,-648.4777"/>+</g>+<!-- u38 -->+<g id="node73" class="node">+<title>u38</title>+<ellipse fill="#33ff33" stroke="#000000" stroke-width="0" cx="2313.1679" cy="-253.7961" rx="34.394" ry="18"/>+<text text-anchor="middle" x="2313.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Empty</text>+</g>+<!-- u59&#45;&gt;u38 -->+<g id="edge115" class="edge">+<title>u59&#45;&gt;u38</title>+<path fill="none" stroke="#000000" d="M2536.8991,-1312.2658C2407.8976,-1297.692 2124.8155,-1257.8313 2067.1679,-1183.7961 2045.8126,-1156.3702 2017.0043,-1025.636 2068.1679,-923.7961 2118.6069,-823.3983 2168.828,-820.3145 2270.1679,-771.7961 2433.5067,-693.5945 2553.9329,-814.7011 2665.1679,-671.7961 2695.6734,-632.6052 2707.9306,-486.0601 2652.1679,-411.7961 2567.9903,-299.6896 2471.7401,-382.1484 2356.1679,-302.7961 2346.8345,-296.3878 2338.2297,-287.506 2331.2092,-279.0623"/>+<polygon fill="#000000" stroke="#000000" points="2333.9384,-276.8709 2324.9915,-271.196 2328.4467,-281.2116 2333.9384,-276.8709"/>+</g>+<!-- u39 -->+<g id="node74" class="node">+<title>u39</title>+<ellipse fill="#33ff33" stroke="#000000" stroke-width="0" cx="2392.1679" cy="-253.7961" rx="27" ry="18"/>+<text text-anchor="middle" x="2392.1679" y="-250.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Null</text>+</g>+<!-- u59&#45;&gt;u39 -->+<g id="edge116" class="edge">+<title>u59&#45;&gt;u39</title>+<path fill="none" stroke="#000000" d="M2538.6702,-1311.025C2418.2678,-1294.6337 2161.4001,-1252.291 2109.1679,-1183.7961 2039.0974,-1091.9091 2050.7689,-1023.5089 2109.1679,-923.7961 2178.9584,-804.6328 2253.2575,-826.2422 2380.1679,-771.7961 2518.6634,-712.3798 2592.4304,-772.9201 2704.1679,-671.7961 2770.3279,-611.9203 2764.4838,-574.2578 2782.1679,-486.7961 2788.7739,-454.1239 2800.7945,-439.4395 2782.1679,-411.7961 2700.9056,-291.1968 2510.2097,-262.617 2429.4034,-255.8698"/>+<polygon fill="#000000" stroke="#000000" points="2429.4423,-252.3625 2419.2036,-255.0866 2428.9063,-259.342 2429.4423,-252.3625"/>+</g>+<!-- u33&#45;&gt;u26 -->+<g id="edge117" class="edge">+<title>u33&#45;&gt;u26</title>+<path fill="none" stroke="#000000" d="M2419.4367,-1122.58C2494.0925,-1102.023 2644.8196,-1056.9937 2764.1679,-998.7961 2781.2287,-990.4767 2799.1266,-979.0858 2813.2654,-969.3804"/>+<polygon fill="#000000" stroke="#000000" points="2815.3491,-972.1943 2821.5419,-963.5978 2811.3399,-966.4561 2815.3491,-972.1943"/>+</g>+<!-- u33&#45;&gt;u28 -->+<g id="edge118" class="edge">+<title>u33&#45;&gt;u28</title>+<path fill="none" stroke="#000000" d="M2389.9342,-1117.4379C2413.319,-1092.6073 2456.1195,-1044.8445 2485.1679,-998.7961 2504.7936,-967.6848 2492.0592,-947.5235 2520.1679,-923.7961 2552.5242,-896.4831 2812.8819,-834.3178 2939.5023,-805.2793"/>+<polygon fill="#000000" stroke="#000000" points="2940.5206,-808.6368 2949.4879,-802.9944 2938.9591,-801.8132 2940.5206,-808.6368"/>+</g>+<!-- u34 -->+<g id="node63" class="node">+<title>u34</title>+<ellipse fill="#ff77ff" stroke="#000000" stroke-width="0" cx="2332.1679" cy="-949.7961" rx="61.99" ry="18"/>+<text text-anchor="middle" x="2332.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">ICCFNumeric</text>+</g>+<!-- u33&#45;&gt;u34 -->+<g id="edge119" class="edge">+<title>u33&#45;&gt;u34</title>+<path fill="none" stroke="#000000" d="M2369.162,-1116.7207C2361.9973,-1084.3924 2346.942,-1016.4598 2338.4112,-977.9671"/>+<polygon fill="#000000" stroke="#000000" points="2341.7709,-976.9507 2336.19,-967.9449 2334.9367,-978.4653 2341.7709,-976.9507"/>+</g>+<!-- u35 -->+<g id="node64" class="node">+<title>u35</title>+<ellipse fill="#ff77ff" stroke="#000000" stroke-width="0" cx="2187.1679" cy="-949.7961" rx="65.7887" ry="18"/>+<text text-anchor="middle" x="2187.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PureCoordinate</text>+</g>+<!-- u33&#45;&gt;u35 -->+<g id="edge120" class="edge">+<title>u33&#45;&gt;u35</title>+<path fill="none" stroke="#000000" d="M2355.6694,-1117.3917C2322.435,-1084.336 2250.0984,-1012.3883 2211.9149,-974.4101"/>+<polygon fill="#000000" stroke="#000000" points="2214.3136,-971.8594 2204.7553,-967.289 2209.3772,-976.8225 2214.3136,-971.8594"/>+</g>+<!-- u36 -->+<g id="node65" class="node">+<title>u36</title>+<ellipse fill="#ff77ff" stroke="#000000" stroke-width="0" cx="2444.1679" cy="-949.7961" rx="32.4942" ry="18"/>+<text text-anchor="middle" x="2444.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Smith</text>+</g>+<!-- u33&#45;&gt;u36 -->+<g id="edge121" class="edge">+<title>u33&#45;&gt;u36</title>+<path fill="none" stroke="#000000" d="M2380.1049,-1116.7207C2392.597,-1084.1708 2418.9415,-1015.5267 2433.6585,-977.1796"/>+<polygon fill="#000000" stroke="#000000" points="2436.9917,-978.2627 2437.3072,-967.6725 2430.4565,-975.7545 2436.9917,-978.2627"/>+</g>+<!-- u33&#45;&gt;u37 -->+<g id="edge122" class="edge">+<title>u33&#45;&gt;u37</title>+<path fill="none" stroke="#000000" d="M2321.4849,-1124.6147C2259.3037,-1109.2934 2157.6121,-1073.7194 2112.1679,-998.7961 2094.8811,-970.2956 2095.3906,-952.5995 2112.1679,-923.7961 2181.0899,-805.4704 2255.5104,-828.4681 2380.1679,-771.7961 2502.3698,-716.2404 2587.5353,-781.3084 2665.1679,-671.7961 2696.2193,-627.9934 2709.2804,-474.6562 2652.1679,-411.7961 2454.8943,-194.6699 2267.3699,-426.0728 2001.1679,-302.7961 1988.3317,-296.8517 1976.0653,-287.2807 1966.1466,-278.1681"/>+<polygon fill="#000000" stroke="#000000" points="1968.3636,-275.4444 1958.7293,-271.0363 1963.5119,-280.4903 1968.3636,-275.4444"/>+</g>+<!-- u34&#45;&gt;u7 -->+<g id="edge123" class="edge">+<title>u34&#45;&gt;u7</title>+<path fill="none" stroke="#000000" d="M2343.4577,-932.0131C2366.7451,-896.6738 2423.5476,-817.1194 2490.1679,-771.7961 2597.3501,-698.8776 2655.9794,-743.2132 2764.1679,-671.7961 2774.1583,-665.2013 2783.5291,-656.0226 2791.1724,-647.3902"/>+<polygon fill="#000000" stroke="#000000" points="2793.8869,-649.6006 2797.6744,-639.7059 2788.5431,-645.0791 2793.8869,-649.6006"/>+</g>+<!-- u35&#45;&gt;u7 -->+<g id="edge124" class="edge">+<title>u35&#45;&gt;u7</title>+<path fill="none" stroke="#000000" d="M2207.565,-932.4858C2249.51,-897.651 2349.5516,-818.4393 2445.1679,-771.7961 2578.7069,-706.6535 2638.3114,-750.767 2764.1679,-671.7961 2774.3078,-665.4336 2783.7083,-656.301 2791.3336,-647.6405"/>+<polygon fill="#000000" stroke="#000000" points="2794.0686,-649.8259 2797.8075,-639.9127 2788.7027,-645.3306 2794.0686,-649.8259"/>+</g>+<!-- u36&#45;&gt;u25 -->+<g id="edge125" class="edge">+<title>u36&#45;&gt;u25</title>+<path fill="none" stroke="#000000" d="M2470.4572,-939.1741C2536.5077,-912.4871 2710.096,-842.3504 2793.767,-808.5439"/>+<polygon fill="#000000" stroke="#000000" points="2795.3099,-811.6955 2803.2705,-804.7041 2792.6875,-805.2052 2795.3099,-811.6955"/>+</g>+<!-- u4 -->+<g id="node66" class="node">+<title>u4</title>+<ellipse fill="#33ff33" stroke="#000000" stroke-width="0" cx="2192.1679" cy="-93.7961" rx="114.2798" ry="18"/>+<text text-anchor="middle" x="2192.1679" y="-90.0961" font-family="Times,serif" font-size="14.00" fill="#000000">ExtendedPositionDescription</text>+</g>+<!-- u5&#45;&gt;u4 -->+<g id="edge126" class="edge">+<title>u5&#45;&gt;u4</title>+<path fill="none" stroke="#000000" d="M2192.1679,-235.7531C2192.1679,-208.1448 2192.1679,-155.1707 2192.1679,-122.3216"/>+<polygon fill="#000000" stroke="#000000" points="2195.668,-122.0186 2192.1679,-112.0187 2188.668,-122.0187 2195.668,-122.0186"/>+</g>+<!-- u20&#45;&gt;u15 -->+<g id="edge127" class="edge">+<title>u20&#45;&gt;u15</title>+<path fill="none" stroke="#000000" d="M1714.4465,-235.7531C1708.7275,-208.0247 1697.7313,-154.7096 1690.9631,-121.8943"/>+<polygon fill="#000000" stroke="#000000" points="1694.3742,-121.1055 1688.9263,-112.0187 1687.5185,-122.5195 1694.3742,-121.1055"/>+</g>+<!-- u84 -->+<g id="node76" class="node">+<title>u84</title>+<ellipse fill="#bbff77" stroke="#000000" stroke-width="0" cx="1697.1679" cy="-1485.7961" rx="51.9908" ry="18"/>+<text text-anchor="middle" x="1697.1679" y="-1482.0961" font-family="Times,serif" font-size="14.00" fill="#000000">SearchState</text>+</g>+<!-- u84&#45;&gt;u85 -->+<g id="edge128" class="edge">+<title>u84&#45;&gt;u85</title>+<path fill="none" stroke="#000000" d="M1677.0031,-1502.6001C1637.6541,-1535.3909 1550.485,-1608.0318 1504.6483,-1646.229"/>+<polygon fill="#000000" stroke="#000000" points="1502.2999,-1643.63 1496.8584,-1652.7207 1506.7813,-1649.0076 1502.2999,-1643.63"/>+</g>+<!-- u88 -->+<g id="node77" class="node">+<title>u88</title>+<ellipse fill="#bbff77" stroke="#000000" stroke-width="0" cx="1712.1679" cy="-1318.7961" rx="81.4863" ry="18"/>+<text text-anchor="middle" x="1712.1679" y="-1315.0961" font-family="Times,serif" font-size="14.00" fill="#000000">DynamicMoveData</text>+</g>+<!-- u84&#45;&gt;u88 -->+<g id="edge129" class="edge">+<title>u84&#45;&gt;u88</title>+<path fill="none" stroke="#000000" d="M1698.8017,-1467.6063C1701.4053,-1438.6195 1706.5164,-1381.7153 1709.6087,-1347.2877"/>+<polygon fill="#000000" stroke="#000000" points="1713.1273,-1347.2366 1710.5361,-1336.9635 1706.1554,-1346.6103 1713.1273,-1347.2366"/>+</g>+<!-- u88&#45;&gt;u26 -->+<g id="edge130" class="edge">+<title>u88&#45;&gt;u26</title>+<path fill="none" stroke="#000000" d="M1791.2746,-1314.4723C1966.6037,-1303.4257 2380.8394,-1268.8065 2488.1679,-1183.7961 2516.5767,-1161.2946 2494.8027,-1134.6803 2520.1679,-1108.7961 2603.4257,-1023.8346 2659.6668,-1055.6279 2764.1679,-998.7961 2780.8427,-989.7277 2798.7192,-978.2953 2812.9428,-968.7546"/>+<polygon fill="#000000" stroke="#000000" points="2814.9728,-971.607 2821.2836,-963.0968 2811.0432,-965.814 2814.9728,-971.607"/>+</g>+<!-- u88&#45;&gt;u80 -->+<g id="edge131" class="edge">+<title>u88&#45;&gt;u80</title>+<path fill="none" stroke="#000000" d="M1662.5666,-1304.4817C1648.5675,-1300.5636 1633.2999,-1296.4048 1619.1679,-1292.7961 1410.9825,-1239.6345 1344.7301,-1270.575 1148.1679,-1183.7961 1133.2508,-1177.2105 1118.1799,-1167.3637 1105.7842,-1158.2207"/>+<polygon fill="#000000" stroke="#000000" points="1107.7447,-1155.3147 1097.6646,-1152.0522 1103.5101,-1160.8886 1107.7447,-1155.3147"/>+</g>+<!-- u90 -->+<g id="node79" class="node">+<title>u90</title>+<ellipse fill="#bbff77" stroke="#000000" stroke-width="0" cx="1687.1679" cy="-1134.7961" rx="55.7903" ry="18"/>+<text text-anchor="middle" x="1687.1679" y="-1131.0961" font-family="Times,serif" font-size="14.00" fill="#000000">KillerMoves</text>+</g>+<!-- u88&#45;&gt;u90 -->+<g id="edge132" class="edge">+<title>u88&#45;&gt;u90</title>+<path fill="none" stroke="#000000" d="M1709.6794,-1300.4808C1705.2992,-1268.2426 1696.1858,-1201.1682 1690.9982,-1162.9872"/>+<polygon fill="#000000" stroke="#000000" points="1694.4608,-1162.4751 1689.6463,-1153.0373 1687.5246,-1163.4175 1694.4608,-1162.4751"/>+</g>+<!-- u91 -->+<g id="node80" class="node">+<title>u91</title>+<ellipse fill="#bbff77" stroke="#000000" stroke-width="0" cx="1823.1679" cy="-1134.7961" rx="61.99" ry="18"/>+<text text-anchor="middle" x="1823.1679" y="-1131.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Transpositions</text>+</g>+<!-- u88&#45;&gt;u91 -->+<g id="edge133" class="edge">+<title>u88&#45;&gt;u91</title>+<path fill="none" stroke="#000000" d="M1723.0131,-1300.8184C1742.6262,-1268.3067 1784.0804,-1199.5897 1807.0305,-1161.5464"/>+<polygon fill="#000000" stroke="#000000" points="1810.2734,-1162.9464 1812.442,-1152.5759 1804.2796,-1159.3306 1810.2734,-1162.9464"/>+</g>+<!-- u89 -->+<g id="node78" class="node">+<title>u89</title>+<ellipse fill="#bbff77" stroke="#000000" stroke-width="0" cx="1697.1679" cy="-949.7961" rx="65.7887" ry="18"/>+<text text-anchor="middle" x="1697.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">EphemeralData</text>+</g>+<!-- u89&#45;&gt;u7 -->+<g id="edge134" class="edge">+<title>u89&#45;&gt;u7</title>+<path fill="none" stroke="#000000" d="M1737.1043,-935.4289C1748.3933,-931.5103 1760.7217,-927.3644 1772.1679,-923.7961 1956.2297,-866.4149 2008.1287,-871.3029 2190.1679,-807.7961 2228.9046,-794.2822 2236.0956,-784.3069 2275.1679,-771.7961 2469.875,-709.4513 2533.4488,-745.4437 2724.1679,-671.7961 2744.1857,-664.0661 2765.1374,-652.2182 2781.3489,-642.1091"/>+<polygon fill="#000000" stroke="#000000" points="2783.2754,-645.0317 2789.8315,-636.709 2779.5162,-639.1267 2783.2754,-645.0317"/>+</g>+<!-- u90&#45;&gt;u38 -->+<g id="edge135" class="edge">+<title>u90&#45;&gt;u38</title>+<path fill="none" stroke="#000000" d="M1672.0174,-1117.2467C1651.581,-1092.5663 1615.6213,-1045.3888 1597.1679,-998.7961 1512.7629,-785.6843 1538.8834,-715.9839 1535.1679,-486.7961 1534.6275,-453.4671 1513.3975,-437.0382 1535.1679,-411.7961 1750.5638,-162.0515 1978.6834,-458.9582 2269.1679,-302.7961 2279.6536,-297.159 2288.8886,-288.0012 2296.1557,-279.1193"/>+<polygon fill="#000000" stroke="#000000" points="2298.9574,-281.2173 2302.2556,-271.1489 2293.3985,-276.9629 2298.9574,-281.2173"/>+</g>+<!-- u90&#45;&gt;u89 -->+<g id="edge136" class="edge">+<title>u90&#45;&gt;u89</title>+<path fill="none" stroke="#000000" d="M1688.1449,-1116.7207C1689.8924,-1084.3924 1693.5644,-1016.4598 1695.6451,-977.9671"/>+<polygon fill="#000000" stroke="#000000" points="1699.1419,-978.1193 1696.1868,-967.9449 1692.1521,-977.7414 1699.1419,-978.1193"/>+</g>+<!-- u91&#45;&gt;u38 -->+<g id="edge137" class="edge">+<title>u91&#45;&gt;u38</title>+<path fill="none" stroke="#000000" d="M1784.5381,-1120.5203C1737.4683,-1100.9105 1659.6015,-1060.8484 1622.1679,-998.7961 1569.7389,-911.8868 1621.7967,-870.2615 1597.1679,-771.7961 1585.5526,-725.3586 1566.2201,-718.8005 1557.1679,-671.7961 1546.2416,-615.0608 1519.5308,-455.6335 1557.1679,-411.7961 1765.7049,-168.9046 1987.5401,-455.0122 2269.1679,-302.7961 2279.6409,-297.1355 2288.8736,-287.9733 2296.1423,-279.0945"/>+<polygon fill="#000000" stroke="#000000" points="2298.9417,-281.1955 2302.2447,-271.1286 2293.3849,-276.9385 2298.9417,-281.1955"/>+</g>+<!-- u91&#45;&gt;u89 -->+<g id="edge138" class="edge">+<title>u91&#45;&gt;u89</title>+<path fill="none" stroke="#000000" d="M1811.0864,-1117.0575C1788.8472,-1084.4046 1741.3234,-1014.6277 1715.2349,-976.3231"/>+<polygon fill="#000000" stroke="#000000" points="1717.9199,-974.0477 1709.3978,-967.7528 1712.1343,-977.9882 1717.9199,-974.0477"/>+</g>+<!-- u92 -->+<g id="node81" class="node">+<title>u92</title>+<ellipse fill="#bbff77" stroke="#000000" stroke-width="0" cx="1860.1679" cy="-949.7961" rx="79.0865" ry="18"/>+<text text-anchor="middle" x="1860.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">TranspositionValue</text>+</g>+<!-- u91&#45;&gt;u92 -->+<g id="edge139" class="edge">+<title>u91&#45;&gt;u92</title>+<path fill="none" stroke="#000000" d="M1826.7829,-1116.7207C1833.2486,-1084.3924 1846.8351,-1016.4598 1854.5337,-977.9671"/>+<polygon fill="#000000" stroke="#000000" points="1858.0089,-978.4371 1856.5381,-967.9449 1851.1448,-977.0643 1858.0089,-978.4371"/>+</g>+<!-- u92&#45;&gt;u7 -->+<g id="edge140" class="edge">+<title>u92&#45;&gt;u7</title>+<path fill="none" stroke="#000000" d="M1902.7473,-934.4623C1991.2317,-902.7653 2201.6243,-828.2714 2380.1679,-771.7961 2531.9725,-723.7786 2577.5431,-733.8567 2724.1679,-671.7961 2743.7956,-663.4884 2764.5916,-651.7287 2780.8165,-641.8121"/>+<polygon fill="#000000" stroke="#000000" points="2782.6769,-644.7767 2789.3235,-636.5261 2778.9824,-638.8311 2782.6769,-644.7767"/>+</g>+<!-- u99 -->+<g id="node82" class="node">+<title>u99</title>+<ellipse fill="#bbff77" stroke="#000000" stroke-width="0" cx="1665.1679" cy="-1854.7961" rx="34.394" ry="18"/>+<text text-anchor="middle" x="1665.1679" y="-1851.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Search</text>+</g>+<!-- u100 -->+<g id="node83" class="node">+<title>u100</title>+<ellipse fill="#bbff77" stroke="#000000" stroke-width="0" cx="1681.1679" cy="-1670.7961" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="1681.1679" y="-1667.0961" font-family="Times,serif" font-size="14.00" fill="#000000">AlphaBeta</text>+</g>+<!-- u99&#45;&gt;u100 -->+<g id="edge141" class="edge">+<title>u99&#45;&gt;u100</title>+<path fill="none" stroke="#000000" d="M1666.7605,-1836.4808C1669.5518,-1804.3804 1675.3466,-1737.7408 1678.6738,-1699.4783"/>+<polygon fill="#000000" stroke="#000000" points="1682.2021,-1699.303 1679.5817,-1689.0373 1675.2284,-1698.6965 1682.2021,-1699.303"/>+</g>+<!-- u100&#45;&gt;u84 -->+<g id="edge142" class="edge">+<title>u100&#45;&gt;u84</title>+<path fill="none" stroke="#000000" d="M1682.7311,-1652.7207C1685.5271,-1620.3924 1691.4023,-1552.4598 1694.7314,-1513.9671"/>+<polygon fill="#000000" stroke="#000000" points="1698.2235,-1514.2093 1695.5982,-1503.9449 1691.2495,-1513.6061 1698.2235,-1514.2093"/>+</g>+<!-- u40 -->+<g id="node84" class="node">+<title>u40</title>+<ellipse fill="#3333ff" stroke="#000000" stroke-width="0" cx="3524.1679" cy="-1485.7961" rx="32.4942" ry="18"/>+<text text-anchor="middle" x="3524.1679" y="-1482.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Board</text>+</g>+<!-- u44 -->+<g id="node86" class="node">+<title>u44</title>+<ellipse fill="#3333ff" stroke="#000000" stroke-width="0" cx="3514.1679" cy="-1318.7961" rx="143.7746" ry="18"/>+<text text-anchor="middle" x="3514.1679" y="-1315.0961" font-family="Times,serif" font-size="14.00" fill="#000000">CoordinatesByRankByLogicalColour</text>+</g>+<!-- u40&#45;&gt;u44 -->+<g id="edge143" class="edge">+<title>u40&#45;&gt;u44</title>+<path fill="none" stroke="#000000" d="M3523.0786,-1467.6063C3521.3429,-1438.6195 3517.9355,-1381.7153 3515.8739,-1347.2877"/>+<polygon fill="#000000" stroke="#000000" points="3519.3473,-1346.7364 3515.2557,-1336.9635 3512.3598,-1347.1549 3519.3473,-1346.7364"/>+</g>+<!-- u43 -->+<g id="node85" class="node">+<title>u43</title>+<ellipse fill="#3333ff" stroke="#000000" stroke-width="0" cx="3244.1679" cy="-949.7961" rx="35.9954" ry="18"/>+<text text-anchor="middle" x="3244.1679" y="-946.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Censor</text>+</g>+<!-- u43&#45;&gt;u24 -->+<g id="edge144" class="edge">+<title>u43&#45;&gt;u24</title>+<path fill="none" stroke="#000000" d="M3233.0579,-932.3687C3215.0291,-904.0882 3179.3185,-848.0716 3158.4283,-815.3027"/>+<polygon fill="#000000" stroke="#000000" points="3161.2831,-813.2698 3152.9562,-806.719 3155.3805,-817.0328 3161.2831,-813.2698"/>+</g>+<!-- u45 -->+<g id="node87" class="node">+<title>u45</title>+<ellipse fill="#3333ff" stroke="#000000" stroke-width="0" cx="3343.1679" cy="-1134.7961" rx="107.4815" ry="18"/>+<text text-anchor="middle" x="3343.1679" y="-1131.0961" font-family="Times,serif" font-size="14.00" fill="#000000">MaybePieceByCoordinates</text>+</g>+<!-- u44&#45;&gt;u45 -->+<g id="edge145" class="edge">+<title>u44&#45;&gt;u45</title>+<path fill="none" stroke="#000000" d="M3497.4603,-1300.8184C3466.94,-1267.9778 3402.0883,-1198.1959 3366.9641,-1160.4014"/>+<polygon fill="#000000" stroke="#000000" points="3369.3146,-1157.7893 3359.9432,-1152.8468 3364.187,-1162.5546 3369.3146,-1157.7893"/>+</g>+<!-- u45&#45;&gt;u46 -->+<g id="edge146" class="edge">+<title>u45&#45;&gt;u46</title>+<path fill="none" stroke="#000000" d="M3337.3872,-1116.4457C3329.3127,-1090.4364 3314.4898,-1041.2819 3304.1679,-998.7961 3296.1426,-965.7635 3303.5422,-954.6009 3289.1679,-923.7961 3261.2261,-863.9156 3227.7765,-865.8247 3196.1679,-807.7961 3188.1003,-792.9853 3197.0593,-782.6706 3184.1679,-771.7961 2960.416,-583.0523 2805.5539,-779.0105 2533.1679,-671.7961 2517.6211,-665.6767 2502.081,-655.7107 2489.4384,-646.3589"/>+<polygon fill="#000000" stroke="#000000" points="2491.2515,-643.339 2481.1842,-640.0376 2486.9954,-648.8965 2491.2515,-643.339"/>+</g>+<!-- u45&#45;&gt;u7 -->+<g id="edge147" class="edge">+<title>u45&#45;&gt;u7</title>+<path fill="none" stroke="#000000" d="M3342.4337,-1116.5389C3340.3654,-1079.0008 3332.6189,-991.0397 3304.1679,-923.7961 3271.8759,-847.4745 3261.5997,-822.653 3196.1679,-771.7961 3087.5601,-687.3807 2925.4538,-645.8836 2850.6546,-630.3305"/>+<polygon fill="#000000" stroke="#000000" points="2851.191,-626.8681 2840.6942,-628.3063 2849.7968,-633.7278 2851.191,-626.8681"/>+</g>+<!-- u45&#45;&gt;u29 -->+<g id="edge148" class="edge">+<title>u45&#45;&gt;u29</title>+<path fill="none" stroke="#000000" d="M3285.774,-1119.4805C3216.5212,-1099.2273 3098.5174,-1058.9248 3011.1679,-998.7961 3001.5537,-992.178 2992.4295,-983.2504 2984.8803,-974.8287"/>+<polygon fill="#000000" stroke="#000000" points="2987.3299,-972.3088 2978.1604,-967.0011 2982.0186,-976.8685 2987.3299,-972.3088"/>+</g>+<!-- u45&#45;&gt;u41 -->+<g id="edge149" class="edge">+<title>u45&#45;&gt;u41</title>+<path fill="none" stroke="#000000" d="M3319.3886,-1117.0575C3274.3488,-1083.4593 3176.6193,-1010.5562 3126.3768,-973.077"/>+<polygon fill="#000000" stroke="#000000" points="3128.2615,-970.1164 3118.1532,-966.9425 3124.076,-975.7272 3128.2615,-970.1164"/>+</g>+<!-- u45&#45;&gt;u38 -->+<g id="edge150" class="edge">+<title>u45&#45;&gt;u38</title>+<path fill="none" stroke="#000000" d="M3343.9502,-1116.5604C3346.1598,-1040.0967 3343.873,-742.5541 3184.1679,-596.7961 3063.1035,-486.3044 2963.3573,-585.0526 2832.1679,-486.7961 2800.1026,-462.7803 2814.8511,-434.9638 2782.1679,-411.7961 2622.7291,-298.7772 2522.7271,-405.0311 2356.1679,-302.7961 2346.3727,-296.7838 2337.5826,-287.8314 2330.5413,-279.2173"/>+<polygon fill="#000000" stroke="#000000" points="2333.2219,-276.9615 2324.3506,-271.1692 2327.6735,-281.2295 2333.2219,-276.9615"/>+</g>+<!-- u45&#45;&gt;u43 -->+<g id="edge151" class="edge">+<title>u45&#45;&gt;u43</title>+<path fill="none" stroke="#000000" d="M3333.4951,-1116.7207C3315.9575,-1083.9485 3278.8399,-1014.5873 3258.4035,-976.3981"/>+<polygon fill="#000000" stroke="#000000" points="3261.3935,-974.5674 3253.5893,-967.4018 3255.2217,-977.8702 3261.3935,-974.5674"/>+</g>+<!-- u48 -->+<g id="node88" class="node">+<title>u48</title>+<ellipse fill="#3333ff" stroke="#000000" stroke-width="0" cx="3793.1679" cy="-1670.7961" rx="131.077" ry="18"/>+<text text-anchor="middle" x="3793.1679" y="-1667.0961" font-family="Times,serif" font-size="14.00" fill="#000000">CastleableRooksByLogicalColour</text>+</g>+<!-- u48&#45;&gt;u26 -->+<g id="edge152" class="edge">+<title>u48&#45;&gt;u26</title>+<path fill="none" stroke="#000000" d="M3793.6592,-1652.5559C3794.2386,-1589.8951 3786.7506,-1382.3817 3667.1679,-1292.7961 3505.9288,-1172.0036 3413.3076,-1260.873 3227.1679,-1183.7961 3081.9716,-1123.6731 2927.2464,-1014.5202 2866.6522,-969.7599"/>+<polygon fill="#000000" stroke="#000000" points="2868.5224,-966.7892 2858.4075,-963.6367 2864.3488,-972.4089 2868.5224,-966.7892"/>+</g>+<!-- u48&#45;&gt;u40 -->+<g id="edge153" class="edge">+<title>u48&#45;&gt;u40</title>+<path fill="none" stroke="#000000" d="M3755.9437,-1653.4911C3708.6377,-1630.4478 3625.8472,-1586.5253 3565.1679,-1534.7961 3556.9378,-1527.78 3549.0295,-1519.0005 3542.3917,-1510.8186"/>+<polygon fill="#000000" stroke="#000000" points="3545.1321,-1508.6411 3536.2126,-1502.9233 3539.6196,-1512.9554 3545.1321,-1508.6411"/>+</g>+<!-- u49 -->+<g id="node89" class="node">+<title>u49</title>+<ellipse fill="#3333ff" stroke="#000000" stroke-width="0" cx="3667.1679" cy="-1485.7961" rx="92.8835" ry="18"/>+<text text-anchor="middle" x="3667.1679" y="-1482.0961" font-family="Times,serif" font-size="14.00" fill="#000000">TurnsByLogicalColour</text>+</g>+<!-- u48&#45;&gt;u49 -->+<g id="edge154" class="edge">+<title>u48&#45;&gt;u49</title>+<path fill="none" stroke="#000000" d="M3780.857,-1652.7207C3758.4992,-1619.8938 3711.1382,-1550.3557 3685.1559,-1512.2072"/>+<polygon fill="#000000" stroke="#000000" points="3687.8652,-1509.9674 3679.3431,-1503.6725 3682.0796,-1513.9079 3687.8652,-1509.9674"/>+</g>+<!-- u49&#45;&gt;u7 -->+<g id="edge155" class="edge">+<title>u49&#45;&gt;u7</title>+<path fill="none" stroke="#000000" d="M3671.1868,-1467.7768C3678.1421,-1432.7567 3689.6432,-1353.6119 3667.1679,-1292.7961 3561.5051,-1006.8846 3471.8242,-945.2361 3221.1679,-771.7961 3100.6587,-688.4106 2928.1329,-646.0486 2850.6065,-630.2625"/>+<polygon fill="#000000" stroke="#000000" points="2851.2437,-626.8207 2840.752,-628.2956 2849.8735,-633.6853 2851.2437,-626.8207"/>+</g>+<!-- u49&#45;&gt;u38 -->+<g id="edge156" class="edge">+<title>u49&#45;&gt;u38</title>+<path fill="none" stroke="#000000" d="M3671.0181,-1467.7914C3677.7417,-1433.4472 3689.8462,-1356.3374 3678.1679,-1292.7961 3611.1867,-928.3559 3523.8501,-807.6796 3219.1679,-596.7961 3083.3488,-502.79 2997.3912,-584.4459 2864.1679,-486.7961 2831.4533,-462.8171 2845.654,-434.6853 2812.1679,-411.7961 2640.14,-294.2076 2534.6172,-410.3902 2356.1679,-302.7961 2346.3254,-296.8617 2337.5254,-287.9253 2330.4896,-279.3023"/>+<polygon fill="#000000" stroke="#000000" points="2333.1699,-277.0459 2324.308,-271.2392 2327.6146,-281.3048 2333.1699,-277.0459"/>+</g>+<!-- u49&#45;&gt;u39 -->+<g id="edge157" class="edge">+<title>u49&#45;&gt;u39</title>+<path fill="none" stroke="#000000" d="M3597.9228,-1473.6164C3471.216,-1450.6411 3212.6471,-1400.2976 3187.1679,-1367.7961 3164.2261,-1338.5315 3103.3183,-1554.4157 3199.1679,-923.7961 3209.5417,-855.5436 3240.1988,-840.2393 3231.1679,-771.7961 3220.6329,-691.9541 3239.1242,-655.6648 3184.1679,-596.7961 3081.5415,-486.8638 2991.1856,-567.318 2864.1679,-486.7961 2824.8809,-461.8905 2829.8723,-437.5977 2791.1679,-411.7961 2669.7453,-330.8521 2500.5554,-281.2784 2427.7716,-262.4554"/>+<polygon fill="#000000" stroke="#000000" points="2428.3044,-258.9793 2417.7497,-259.9013 2426.5756,-265.7625 2428.3044,-258.9793"/>+</g>+<!-- u50 -->+<g id="node90" class="node">+<title>u50</title>+<ellipse fill="#3333ff" stroke="#000000" stroke-width="0" cx="3274.1679" cy="-1318.7961" rx="77.9862" ry="18"/>+<text text-anchor="middle" x="3274.1679" y="-1315.0961" font-family="Times,serif" font-size="14.00" fill="#000000">EnPassantAbscissa</text>+</g>+<!-- u50&#45;&gt;u26 -->+<g id="edge158" class="edge">+<title>u50&#45;&gt;u26</title>+<path fill="none" stroke="#000000" d="M3253.5271,-1301.2467C3181.6871,-1240.1661 2942.7444,-1037.0098 2864.91,-970.8327"/>+<polygon fill="#000000" stroke="#000000" points="2866.9451,-967.9688 2857.0594,-964.1578 2862.4108,-973.3018 2866.9451,-967.9688"/>+</g>+<!-- u50&#45;&gt;u45 -->+<g id="edge159" class="edge">+<title>u50&#45;&gt;u45</title>+<path fill="none" stroke="#000000" d="M3280.9095,-1300.8184C3293.0186,-1268.5274 3318.5209,-1200.5213 3332.8443,-1162.3256"/>+<polygon fill="#000000" stroke="#000000" points="3336.1647,-1163.439 3336.3989,-1152.8468 3329.6104,-1160.9811 3336.1647,-1163.439"/>+</g>+<!-- u51&#45;&gt;u40 -->+<g id="edge160" class="edge">+<title>u51&#45;&gt;u40</title>+<path fill="none" stroke="#000000" d="M3557.5528,-1652.7207C3551.0871,-1620.3924 3537.5006,-1552.4598 3529.8021,-1513.9671"/>+<polygon fill="#000000" stroke="#000000" points="3533.1909,-1513.0643 3527.7976,-1503.9449 3526.3268,-1514.4371 3533.1909,-1513.0643"/>+</g>+<!-- u52&#45;&gt;u48 -->+<g id="edge161" class="edge">+<title>u52&#45;&gt;u48</title>+<path fill="none" stroke="#000000" d="M3484.5463,-1840.8152C3542.0221,-1809.1519 3682.5483,-1731.7362 3752.3892,-1693.261"/>+<polygon fill="#000000" stroke="#000000" points="3754.2849,-1696.2127 3761.3549,-1688.3218 3750.9072,-1690.0815 3754.2849,-1696.2127"/>+</g>+<!-- u52&#45;&gt;u50 -->+<g id="edge162" class="edge">+<title>u52&#45;&gt;u50</title>+<path fill="none" stroke="#000000" d="M3460.9468,-1836.6761C3463.9999,-1799.7712 3468.2093,-1713.5654 3449.1679,-1644.7961 3415.7187,-1523.9927 3331.5829,-1397.9392 3293.4674,-1344.8297"/>+<polygon fill="#000000" stroke="#000000" points="3296.2457,-1342.6989 3287.5463,-1336.6516 3290.5758,-1346.8041 3296.2457,-1342.6989"/>+</g>+<!-- u93 -->+<g id="node93" class="node">+<title>u93</title>+<ellipse fill="#3333ff" stroke="#000000" stroke-width="0" cx="3240.1679" cy="-1854.7961" rx="44.393" ry="18"/>+<text text-anchor="middle" x="3240.1679" y="-1851.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PlayState</text>+</g>+<!-- u93&#45;&gt;u71 -->+<g id="edge163" class="edge">+<title>u93&#45;&gt;u71</title>+<path fill="none" stroke="#000000" d="M3195.5966,-1854.0325C2923.857,-1849.0648 1496.2566,-1818.3929 1331.1679,-1719.7961 1184.1966,-1632.0197 1108.4992,-1422.6599 1085.1781,-1346.8283"/>+<polygon fill="#000000" stroke="#000000" points="1088.466,-1345.6082 1082.233,-1337.0409 1081.7629,-1347.6253 1088.466,-1345.6082"/>+</g>+<!-- u93&#45;&gt;u84 -->+<g id="edge164" class="edge">+<title>u93&#45;&gt;u84</title>+<path fill="none" stroke="#000000" d="M3202.0261,-1845.6747C2993.5163,-1795.8107 1992.1192,-1556.3321 1749.9688,-1498.4232"/>+<polygon fill="#000000" stroke="#000000" points="1750.5488,-1494.9632 1740.0089,-1496.0413 1748.9206,-1501.7713 1750.5488,-1494.9632"/>+</g>+<!-- u94 -->+<g id="node94" class="node">+<title>u94</title>+<ellipse fill="#3333ff" stroke="#000000" stroke-width="0" cx="3318.1679" cy="-1670.7961" rx="121.5784" ry="18"/>+<text text-anchor="middle" x="3318.1679" y="-1667.0961" font-family="Times,serif" font-size="14.00" fill="#000000">ApplicationTerminationReason</text>+</g>+<!-- u93&#45;&gt;u94 -->+<g id="edge165" class="edge">+<title>u93&#45;&gt;u94</title>+<path fill="none" stroke="#000000" d="M3247.7888,-1836.8184C3261.4774,-1804.5274 3290.3061,-1736.5213 3306.4978,-1698.3256"/>+<polygon fill="#000000" stroke="#000000" points="3309.8354,-1699.4197 3310.5159,-1688.8468 3303.3905,-1696.6877 3309.8354,-1699.4197"/>+</g>+<!-- u95 -->+<g id="node97" class="node">+<title>u95</title>+<ellipse fill="#ff3333" stroke="#000000" stroke-width="0" cx="3013.1679" cy="-437.7961" rx="30.5947" ry="18"/>+<text text-anchor="middle" x="3013.1679" y="-434.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Show</text>+</g>+<!-- u95&#45;&gt;u47 -->+<g id="edge166" class="edge">+<title>u95&#45;&gt;u47</title>+<path fill="none" stroke="#000000" d="M3010.572,-455.9894C3006.0044,-480.401 2994.0007,-522.8737 2964.1679,-541.7961 2892.1075,-587.5026 2658.7645,-575.0277 2580.1679,-541.7961 2543.0488,-526.1017 2512.8508,-489.3537 2495.4376,-464.0288"/>+<polygon fill="#000000" stroke="#000000" points="2498.2792,-461.9814 2489.8211,-455.6008 2492.4541,-465.8632 2498.2792,-461.9814"/>+</g>+<!-- u95&#45;&gt;u10 -->+<g id="edge167" class="edge">+<title>u95&#45;&gt;u10</title>+<path fill="none" stroke="#000000" d="M3004.4186,-420.4858C2988.1201,-388.2392 2953.013,-318.78 2933.6582,-280.4867"/>+<polygon fill="#000000" stroke="#000000" points="2936.7326,-278.8102 2929.0979,-271.4642 2930.4852,-281.9679 2936.7326,-278.8102"/>+</g>+<!-- u96 -->+<g id="node98" class="node">+<title>u96</title>+<ellipse fill="#77bbff" stroke="#000000" stroke-width="0" cx="683.1679" cy="-2021.7961" rx="32.4942" ry="18"/>+<text text-anchor="middle" x="683.1679" y="-2018.0961" font-family="Times,serif" font-size="14.00" fill="#000000">CECP</text>+</g>+<!-- u96&#45;&gt;u97 -->+<g id="edge168" class="edge">+<title>u96&#45;&gt;u97</title>+<path fill="none" stroke="#000000" d="M650.6933,-2019.712C565.0796,-2013.161 327.7465,-1988.1134 152.1679,-1903.7961 138.8972,-1897.4232 125.9303,-1887.6645 115.3884,-1878.5288"/>+<polygon fill="#000000" stroke="#000000" points="117.609,-1875.8186 107.8347,-1871.7305 112.9263,-1881.0217 117.609,-1875.8186"/>+</g>+<!-- u96&#45;&gt;u83 -->+<g id="edge169" class="edge">+<title>u96&#45;&gt;u83</title>+<path fill="none" stroke="#000000" d="M658.9316,-2009.7859C602.6741,-1981.9075 462.5492,-1912.4688 390.4969,-1876.7633"/>+<polygon fill="#000000" stroke="#000000" points="391.7316,-1873.469 381.2173,-1872.1648 388.6234,-1879.7412 391.7316,-1873.469"/>+</g>+<!-- u96&#45;&gt;u98 -->+<g id="edge170" class="edge">+<title>u96&#45;&gt;u98</title>+<path fill="none" stroke="#000000" d="M650.6236,-2021.0639C530.3992,-2017.6199 114.0369,-1998.8988 32.1679,-1903.7961 -35.4232,-1825.2793 25.1679,-1774.3984 25.1679,-1670.7961 25.1679,-1670.7961 25.1679,-1670.7961 25.1679,-622.7961 25.1679,-524.6694 21.196,-481.5938 90.1679,-411.7961 155.7045,-345.4746 439.1791,-282.688 543.4718,-261.4202"/>+<polygon fill="#000000" stroke="#000000" points="544.4598,-264.7912 553.567,-259.3774 543.0714,-257.9303 544.4598,-264.7912"/>+</g>+<!-- u96&#45;&gt;u99 -->+<g id="edge171" class="edge">+<title>u96&#45;&gt;u99</title>+<path fill="none" stroke="#000000" d="M707.939,-2009.7086C713.2042,-2007.4849 718.7971,-2005.3717 724.1679,-2003.7961 1060.2199,-1905.2083 1484.0947,-1867.7751 1620.6351,-1857.7773"/>+<polygon fill="#000000" stroke="#000000" points="1620.9923,-1861.2607 1630.7149,-1857.0512 1620.4892,-1854.2788 1620.9923,-1861.2607"/>+</g>+<!-- u96&#45;&gt;u93 -->+<g id="edge172" class="edge">+<title>u96&#45;&gt;u93</title>+<path fill="none" stroke="#000000" d="M707.3908,-2009.4817C712.79,-2007.216 718.5753,-2005.1435 724.1679,-2003.7961 971.198,-1944.2801 2841.3162,-1870.0988 3185.7367,-1856.8636"/>+<polygon fill="#000000" stroke="#000000" points="3186.0882,-1860.3528 3195.9467,-1856.4719 3185.8198,-1853.3579 3186.0882,-1860.3528"/>+</g>+<!-- u101 -->+<g id="node99" class="node">+<title>u101</title>+<ellipse fill="#77bbff" stroke="#000000" stroke-width="0" cx="749.1679" cy="-1854.7961" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="749.1679" y="-1851.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Command</text>+</g>+<!-- u96&#45;&gt;u101 -->+<g id="edge173" class="edge">+<title>u96&#45;&gt;u101</title>+<path fill="none" stroke="#000000" d="M690.231,-2003.9242C701.7626,-1974.7458 724.709,-1916.6844 738.3184,-1882.2485"/>+<polygon fill="#000000" stroke="#000000" points="741.6352,-1883.3784 742.0557,-1872.7919 735.1252,-1880.8056 741.6352,-1883.3784"/>+</g>+<!-- u101&#45;&gt;u71 -->+<g id="edge174" class="edge">+<title>u101&#45;&gt;u71</title>+<path fill="none" stroke="#000000" d="M760.081,-1836.9624C808.4902,-1757.8547 1003.9566,-1438.4341 1061.2881,-1344.7459"/>+<polygon fill="#000000" stroke="#000000" points="1064.3111,-1346.5113 1066.5454,-1336.1547 1058.3404,-1342.8575 1064.3111,-1346.5113"/>+</g>+<!-- u102 -->+<g id="node100" class="node">+<title>u102</title>+<ellipse fill="#77bbff" stroke="#000000" stroke-width="0" cx="637.1679" cy="-1670.7961" rx="51.9908" ry="18"/>+<text text-anchor="middle" x="637.1679" y="-1667.0961" font-family="Times,serif" font-size="14.00" fill="#000000">PrintObject</text>+</g>+<!-- u101&#45;&gt;u102 -->+<g id="edge175" class="edge">+<title>u101&#45;&gt;u102</title>+<path fill="none" stroke="#000000" d="M738.4288,-1837.1534C718.744,-1804.814 676.7733,-1735.8622 653.522,-1697.6636"/>+<polygon fill="#000000" stroke="#000000" points="656.2282,-1695.3779 648.0389,-1688.6557 650.2488,-1699.0176 656.2282,-1695.3779"/>+</g>+<!-- u103 -->+<g id="node101" class="node">+<title>u103</title>+<ellipse fill="#77bbff" stroke="#000000" stroke-width="0" cx="752.1679" cy="-1670.7961" rx="45.4919" ry="18"/>+<text text-anchor="middle" x="752.1679" y="-1667.0961" font-family="Times,serif" font-size="14.00" fill="#000000">SetObject</text>+</g>+<!-- u101&#45;&gt;u103 -->+<g id="edge176" class="edge">+<title>u101&#45;&gt;u103</title>+<path fill="none" stroke="#000000" d="M749.4665,-1836.4808C749.9899,-1804.3804 751.0764,-1737.7408 751.7002,-1699.4783"/>+<polygon fill="#000000" stroke="#000000" points="755.2069,-1699.0931 751.8704,-1689.0373 748.2078,-1698.9789 755.2069,-1699.0931"/>+</g>+<!-- u103&#45;&gt;u80 -->+<g id="edge177" class="edge">+<title>u103&#45;&gt;u80</title>+<path fill="none" stroke="#000000" d="M740.8796,-1652.9703C705.7237,-1594.9696 605.3738,-1408.6979 688.1679,-1292.7961 775.0129,-1171.2234 872.7703,-1251.0795 1006.1679,-1183.7961 1020.5096,-1176.5624 1035.2961,-1166.7895 1047.6375,-1157.8746"/>+<polygon fill="#000000" stroke="#000000" points="1049.789,-1160.6367 1055.7554,-1151.8816 1045.6315,-1155.0051 1049.789,-1160.6367"/>+</g>+<!-- u104 -->+<g id="node102" class="node">+<title>u104</title>+<ellipse fill="#77bbff" stroke="#000000" stroke-width="0" cx="760.1679" cy="-2021.7961" rx="27" ry="18"/>+<text text-anchor="middle" x="760.1679" y="-2018.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Raw</text>+</g>+<!-- u104&#45;&gt;u97 -->+<g id="edge178" class="edge">+<title>u104&#45;&gt;u97</title>+<path fill="none" stroke="#000000" d="M739.2833,-2010.0789C734.4335,-2007.7201 729.2117,-2005.4584 724.1679,-2003.7961 479.0584,-1923.0148 387.2968,-2010.185 152.1679,-1903.7961 138.7554,-1897.7274 125.7668,-1888.0153 115.2469,-1878.8322"/>+<polygon fill="#000000" stroke="#000000" points="117.4696,-1876.1227 107.7173,-1871.9821 112.759,-1881.3005 117.4696,-1876.1227"/>+</g>+<!-- u104&#45;&gt;u83 -->+<g id="edge179" class="edge">+<title>u104&#45;&gt;u83</title>+<path fill="none" stroke="#000000" d="M738.6136,-2010.6326C733.8906,-2008.2952 728.8903,-2005.9025 724.1679,-2003.7961 611.6509,-1953.608 476.715,-1902.5464 402.3253,-1875.1646"/>+<polygon fill="#000000" stroke="#000000" points="403.2727,-1871.784 392.6791,-1871.6218 400.8594,-1878.3549 403.2727,-1871.784"/>+</g>+<!-- u104&#45;&gt;u98 -->+<g id="edge180" class="edge">+<title>u104&#45;&gt;u98</title>+<path fill="none" stroke="#000000" d="M739.2795,-2010.0902C734.43,-2007.7308 729.2091,-2005.466 724.1679,-2003.7961 483.3354,-1924.0215 334.4741,-2090.0078 162.1679,-1903.7961 152.0064,-1892.8147 110.3529,-1382.7106 109.1679,-1367.7961 100.9511,-1264.3797 95.1679,-1238.5384 95.1679,-1134.7961 95.1679,-1134.7961 95.1679,-1134.7961 95.1679,-622.7961 95.1679,-528.1962 63.273,-485.02 123.1679,-411.7961 178.3103,-344.3823 443.6066,-282.8331 543.7709,-261.6217"/>+<polygon fill="#000000" stroke="#000000" points="544.7005,-265.0029 553.768,-259.5228 543.2622,-258.1522 544.7005,-265.0029"/>+</g>+<!-- u104&#45;&gt;u99 -->+<g id="edge181" class="edge">+<title>u104&#45;&gt;u99</title>+<path fill="none" stroke="#000000" d="M786.2767,-2016.9782C912.9134,-1993.6099 1463.5422,-1892.0022 1622.2252,-1862.7203"/>+<polygon fill="#000000" stroke="#000000" points="1623.3339,-1866.0749 1632.5327,-1860.8183 1622.0636,-1859.1911 1623.3339,-1866.0749"/>+</g>+<!-- u104&#45;&gt;u93 -->+<g id="edge182" class="edge">+<title>u104&#45;&gt;u93</title>+<path fill="none" stroke="#000000" d="M787.1742,-2019.9775C1030.8407,-2003.5693 2848.955,-1881.1399 3186.371,-1858.4187"/>+<polygon fill="#000000" stroke="#000000" points="3186.6356,-1861.9089 3196.3778,-1857.7449 3186.1652,-1854.9247 3186.6356,-1861.9089"/>+</g>+<!-- u104&#45;&gt;u95 -->+<g id="edge183" class="edge">+<title>u104&#45;&gt;u95</title>+<path fill="none" stroke="#000000" d="M787.5708,-2021.2986C1094.49,-2015.6656 3877.3965,-1962.9864 3936.1679,-1903.7961 3972.6665,-1867.0373 3943.1679,-1722.5972 3943.1679,-1670.7961 3943.1679,-1670.7961 3943.1679,-1670.7961 3943.1679,-789.7961 3943.1679,-596.3054 3230.1212,-471.7804 3052.749,-443.7977"/>+<polygon fill="#000000" stroke="#000000" points="3053.2174,-440.3285 3042.7966,-442.2406 3052.1353,-447.2444 3053.2174,-440.3285"/>+</g>+<!-- u104&#45;&gt;u101 -->+<g id="edge184" class="edge">+<title>u104&#45;&gt;u101</title>+<path fill="none" stroke="#000000" d="M758.9697,-2003.6063C757.0604,-1974.6195 753.3122,-1917.7153 751.0445,-1883.2877"/>+<polygon fill="#000000" stroke="#000000" points="754.5143,-1882.7118 750.3645,-1872.9635 747.5294,-1883.172 754.5143,-1882.7118"/>+</g>+<!-- u82 -->+<g id="node104" class="node">+<title>u82</title>+<ellipse fill="#ffffbb" stroke="#000000" stroke-width="0" cx="760.1679" cy="-2188.7961" rx="27" ry="18"/>+<text text-anchor="middle" x="760.1679" y="-2185.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Play</text>+</g>+<!-- u82&#45;&gt;u96 -->+<g id="edge4" class="edge">+<title>u82&#45;&gt;u96</title>+<path fill="none" stroke="#000000" d="M752.2175,-2171.5532C738.8231,-2142.503 711.6601,-2083.591 695.6858,-2048.9455"/>+<polygon fill="#000000" stroke="#000000" points="698.6719,-2047.0628 691.3063,-2039.4471 692.3151,-2049.9938 698.6719,-2047.0628"/>+</g>+<!-- u82&#45;&gt;u104 -->+<g id="edge5" class="edge">+<title>u82&#45;&gt;u104</title>+<path fill="none" stroke="#000000" d="M760.1679,-2170.6063C760.1679,-2141.6195 760.1679,-2084.7153 760.1679,-2050.2877"/>+<polygon fill="#000000" stroke="#000000" points="763.668,-2049.9635 760.1679,-2039.9635 756.668,-2049.9635 763.668,-2049.9635"/>+</g>+<!-- u0 -->+<g id="node105" class="node">+<title>u0</title>+<ellipse fill="#bbffbb" stroke="#000000" stroke-width="0" cx="3972.1679" cy="-2355.7961" rx="29.795" ry="18"/>+<text text-anchor="middle" x="3972.1679" y="-2352.0961" font-family="Times,serif" font-size="14.00" fill="#000000">Main</text>+</g>+<!-- u0&#45;&gt;u1 -->+<g id="edge2" class="edge">+<title>u0&#45;&gt;u1</title>+<path fill="none" stroke="#000000" d="M3975.6747,-2337.7756C3985.0819,-2287.8092 4010.1679,-2143.1853 4010.1679,-2021.7961 4010.1679,-2021.7961 4010.1679,-2021.7961 4010.1679,-622.7961 4010.1679,-188.5493 3486.2427,-471.8452 3056.1679,-411.7961 2855.4197,-383.7667 1411.1773,-403.3254 1235.1679,-302.7961 1226.1784,-297.6617 1219.1475,-288.9585 1213.9283,-280.299"/>+<polygon fill="#000000" stroke="#000000" points="1216.9743,-278.5735 1209.1389,-271.442 1210.8168,-281.9032 1216.9743,-278.5735"/>+</g>+<!-- u0&#45;&gt;u61 -->+<g id="edge3" class="edge">+<title>u0&#45;&gt;u61</title>+<path fill="none" stroke="#000000" d="M3972.1679,-2337.6936C3972.1679,-2287.5175 3972.1679,-2142.4072 3972.1679,-2021.7961 3972.1679,-2021.7961 3972.1679,-2021.7961 3972.1679,-1670.7961 3972.1679,-1579.1661 4005.3667,-1527.8592 3936.1679,-1467.7961 3814.1731,-1361.9072 1190.6168,-1386.5394 1030.1679,-1367.7961 969.3421,-1360.6906 901.0752,-1346.433 852.2519,-1335.1209"/>+<polygon fill="#000000" stroke="#000000" points="852.981,-1331.697 842.4468,-1332.8281 851.3872,-1338.5132 852.981,-1331.697"/>+</g>+<!-- u0&#45;&gt;u82 -->+<g id="edge1" class="edge">+<title>u0&#45;&gt;u82</title>+<path fill="none" stroke="#000000" d="M3942.1694,-2354.2364C3638.9948,-2338.4736 1133.0187,-2208.1816 797.2993,-2190.7267"/>+<polygon fill="#000000" stroke="#000000" points="797.3043,-2187.2223 787.136,-2190.1982 796.9408,-2194.2128 797.3043,-2187.2223"/> </g> </g> </svg>
changelog.markdown view
@@ -24,3 +24,7 @@ ## 0.0.0.7 Rewrote function **BishBosh.Data.RoseTree.countTerminalNodes** in accordance with the suggestions of David Feuer. Amended function **BishBosh.State.EnPassantAbscissa.mkMaybeEnPassantAbscissa** to guard against exposing one's King after En-passant capture.++## 0.0.0.8+Corrected the parsing of FEN when an Enpassant-destination defined on file **b** was erroneously interpreted as a bishop in the previous **CastleableRooks** field.+Added parent class **BishBosh.Property.ExtendedPositionDescription.EPD** for **Property.ForsythEdwards.FEN**, for which the latter typically has a default implementation of both methods.
config/CECP/bishbosh_black.xml view
@@ -63,7 +63,7 @@ --> 		</pgnOptions> 		<persistence filePath="/dev/null" automatic="False"/>	<!-- replace *nix-specific path with 'nul' in Windows ? -->-		<uiOptions moveNotation="Coordinate" verbosity="Silent">+		<uiOptions moveNotation="PureCoordinate" verbosity="Silent"> 			<cecpOptions/> 		</uiOptions> 	</ioOptions>
config/bishbosh.dtd view
@@ -109,7 +109,7 @@ 			> 		<!ELEMENT uiOptions ((nativeUIOptions | cecpOptions)?)> 			<!ATTLIST uiOptions-				moveNotation	(Coordinate | ICCFNumeric | Smith)	#IMPLIED+				moveNotation	(ICCFNumeric | PureCoordinate | Smith)	#IMPLIED 				printMoveTree	CDATA					#IMPLIED 				nDecimalDigits	CDATA					#IMPLIED 				verbosity	(Silent | Normal | Verbose | Deafening)	#IMPLIED
config/bishbosh.rng view
@@ -183,8 +183,8 @@ 							<optional> 								<attribute name="moveNotation"> 									<choice>-										<value>Coordinate</value> 										<value>ICCFNumeric</value>+										<value>PureCoordinate</value> 										<value>Smith</value> 									</choice> 								</attribute>
man/man1/bishbosh.1 view
@@ -93,7 +93,7 @@ Command	Arguments	Description =======	=========	=========== :hint		Request a move-suggestion.-:print	object	Print the value of one of "\fBboard\fR", "\fBconfiguration\fR", "\fBFEN\fR", "\fBgame\fR", "\fBhelp\fR", "\fBmoves\fR", "\fBPGN\fR".+:print	object	Print the value of one of "\fBboard\fR", "\fBconfiguration\fR", "\fBEPD\fR", "\fBFEN\fR", "\fBgame\fR", "\fBhelp\fR", "\fBmoves\fR", "\fBPGN\fR". :quit		Exit the application. The current game-state will be saved, provided \fBpersistence\fR (see "\fBpgnOptions\fR" in \fBsection-5\fR of the man-pages) hasn't been disabled. :resign		Resign the game. :restart		Start a new game.
man/man5/bishbosh.5 view
@@ -176,7 +176,7 @@ .P "\fBioOptions\fR" has a sub-section "\fBuiOptions\fR", which defines the user-interface. .IP \(bu-\fBmoveNotation\fR (\fBCoordinate\fR|\fBICCFNumeric\fR|\fBSmith\fR), defaulting to "\fBSmith\fR"; <\fBhttps://en.wikipedia.org/wiki/Chess_notation\fR>. The expected syntax used to define a move.+\fBmoveNotation\fR (\fBICCFNumeric\fR|\fBPureCoordinate\fR|\fBSmith\fR), defaulting to "\fBSmith\fR"; <\fBhttps://en.wikipedia.org/wiki/Chess_notation\fR>. The expected syntax used to define a move. This application also understands \fBStandard Algebraic\fR notation, but it is only used to read the PGN-databases used to define standard openings. .IP \(bu \fBprintMoveTree\fR \fIInt\fR.
src-exe/BishBosh/State/PlayState.hs view
@@ -188,7 +188,7 @@  ) => Model.Game.Game x y -> Transformation column criterionValue criterionWeight pieceSquareValue positionHash rankValue row weightedMean x y updateWithManualMove game playState@MkPlayState { getSearchState = searchState }	= setPositionHashQuantifiedGameTree ( 	Data.Maybe.fromMaybe (-		Control.Exception.throw $ Data.Exception.mkIncompatibleData "BishBosh.State.PlayState.updateWithManualMove:\tData.RoseTree.reduce failed."+		Control.Exception.throw $ Data.Exception.mkIncompatibleData "BishBosh.State.PlayState.updateWithManualMove:\tEvaluation.PositionHashQuantifiedGameTree.reduce failed." 	) . Evaluation.PositionHashQuantifiedGameTree.reduce ( 		( 			== Data.Maybe.fromMaybe (
src-exe/BishBosh/UI/CECP.hs view
@@ -71,6 +71,7 @@ import qualified	BishBosh.Model.Game						as Model.Game import qualified	BishBosh.Model.GameTerminationReason				as Model.GameTerminationReason import qualified	BishBosh.Notation.MoveNotation					as Notation.MoveNotation+import qualified	BishBosh.Property.ExtendedPositionDescription			as Property.ExtendedPositionDescription import qualified	BishBosh.Property.ForsythEdwards				as Property.ForsythEdwards import qualified	BishBosh.Property.ShowFloat					as Property.ShowFloat import qualified	BishBosh.Search.Search						as Search.Search@@ -203,8 +204,6 @@ 	Integral		x, 	Integral		y, 	Ord			positionHash,-	Read			x,-	Read			y, 	Real			criterionValue, 	Real			criterionWeight, 	Real			pieceSquareValue,@@ -285,6 +284,7 @@ 				putStrLn . tellUser =<< case printObject of 					UI.PrintObject.Board		-> return {-to IO-monad-} . show $ Model.Game.getBoard game 					UI.PrintObject.Configuration	-> return {-to IO-monad-} $ Property.ShowFloat.showsFloatToN nDecimalDigits options "."+					UI.PrintObject.EPD		-> return {-to IO-monad-} $ Property.ExtendedPositionDescription.showEPD game 					UI.PrintObject.FEN		-> return {-to IO-monad-} $ Property.ForsythEdwards.showFEN game 					UI.PrintObject.Game		-> return {-to IO-monad-} $ show game 					UI.PrintObject.Help		-> return {-to IO-monad-} . showString "USAGE: " . showString UI.Command.printTag . showChar ' ' $ Text.ShowList.showsDelimitedList (showChar '|') (showChar '(') (showChar ')') (map shows UI.PrintObject.range) ""@@ -1066,8 +1066,6 @@ 	Integral		x, 	Integral		y, 	Ord			positionHash,-	Read			x,-	Read			y, 	Real			criterionValue, 	Real			criterionWeight, 	Real			pieceSquareValue,
src-exe/BishBosh/UI/Raw.hs view
@@ -51,6 +51,7 @@ import qualified	BishBosh.Input.UIOptions					as Input.UIOptions import qualified	BishBosh.Model.Game						as Model.Game import qualified	BishBosh.Notation.MoveNotation					as Notation.MoveNotation+import qualified	BishBosh.Property.ExtendedPositionDescription			as Property.ExtendedPositionDescription import qualified	BishBosh.Property.ForsythEdwards				as Property.ForsythEdwards import qualified	BishBosh.Property.ShowFloat					as Property.ShowFloat import qualified	BishBosh.Search.Search						as Search.Search@@ -193,6 +194,7 @@ 			case printObject of 				UI.PrintObject.Board		-> putStrLn $ show2D game 				UI.PrintObject.Configuration	-> putStrLn $ Property.ShowFloat.showsFloatToN nDecimalDigits options "."+				UI.PrintObject.EPD		-> putStrLn $ Property.ExtendedPositionDescription.showEPD game 				UI.PrintObject.FEN		-> putStrLn $ Property.ForsythEdwards.showFEN game 				UI.PrintObject.Game		-> print game 				UI.PrintObject.Help		-> putStrLn . showString "Enter either a move in " . shows moveNotation $ showString "-notation, or:\n" UI.Command.usageMessage
src-lib/BishBosh/Attribute/LogicalColour.hs view
@@ -44,8 +44,9 @@ --	isWhite ) where -import qualified	BishBosh.Property.ForsythEdwards	as Property.ForsythEdwards-import qualified	BishBosh.Property.Opposable		as Property.Opposable+import qualified	BishBosh.Property.ExtendedPositionDescription	as Property.ExtendedPositionDescription+import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards+import qualified	BishBosh.Property.Opposable			as Property.Opposable import qualified	Control.DeepSeq import qualified	Control.Exception import qualified	Data.Array.IArray@@ -93,16 +94,20 @@ 	getOpposite Black	= White 	getOpposite _		= Black -instance Property.ForsythEdwards.ReadsFEN LogicalColour where-	readsFEN s	= case Data.List.Extra.trimStart s of+instance Property.ExtendedPositionDescription.ReadsEPD LogicalColour where+	readsEPD s	= case Data.List.Extra.trimStart s of 		'b' : remainder	-> [(Black, remainder)] 		'w' : remainder	-> [(White, remainder)] 		_		-> [] -instance Property.ForsythEdwards.ShowsFEN LogicalColour where-	showsFEN logicalColour	= showChar $ case logicalColour of+instance Property.ExtendedPositionDescription.ShowsEPD LogicalColour where+	showsEPD logicalColour	= showChar $ case logicalColour of 		Black	-> 'b' 		White	-> 'w'++instance Property.ForsythEdwards.ReadsFEN LogicalColour++instance Property.ForsythEdwards.ShowsFEN LogicalColour  -- | Whether the specified /logical colour/ is @Black@. isBlack :: LogicalColour -> Bool
src-lib/BishBosh/Component/Piece.hs view
@@ -73,16 +73,17 @@  import			Control.Arrow((&&&), (***)) import			Data.Array.IArray((!))-import qualified	BishBosh.Attribute.Direction		as Attribute.Direction-import qualified	BishBosh.Attribute.LogicalColour	as Attribute.LogicalColour-import qualified	BishBosh.Attribute.Rank			as Attribute.Rank-import qualified	BishBosh.Cartesian.Abscissa		as Cartesian.Abscissa-import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates-import qualified	BishBosh.Cartesian.Ordinate		as Cartesian.Ordinate-import qualified	BishBosh.Cartesian.Vector		as Cartesian.Vector-import qualified	BishBosh.Property.ForsythEdwards	as Property.ForsythEdwards-import qualified	BishBosh.Property.Opposable		as Property.Opposable-import qualified	BishBosh.Types				as T+import qualified	BishBosh.Attribute.Direction			as Attribute.Direction+import qualified	BishBosh.Attribute.LogicalColour		as Attribute.LogicalColour+import qualified	BishBosh.Attribute.Rank				as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa			as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates			as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate			as Cartesian.Ordinate+import qualified	BishBosh.Cartesian.Vector			as Cartesian.Vector+import qualified	BishBosh.Property.ExtendedPositionDescription	as Property.ExtendedPositionDescription+import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards+import qualified	BishBosh.Property.Opposable			as Property.Opposable+import qualified	BishBosh.Types					as T import qualified	Control.DeepSeq import qualified	Control.Exception import qualified	Data.Array.IArray@@ -90,7 +91,7 @@ import qualified	Data.List.Extra import qualified	Data.Map import qualified	Data.Maybe-import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	Text.XML.HXT.Arrow.Pickle			as HXT import qualified	Text.XML.HXT.Arrow.Pickle.Schema  -- | Used to qualify XML.@@ -130,8 +131,8 @@ instance Show Piece where 	showsPrec _	= Property.ForsythEdwards.showsFEN -instance Property.ForsythEdwards.ReadsFEN Piece where-	readsFEN s	= case Data.List.Extra.trimStart s of+instance Property.ExtendedPositionDescription.ReadsEPD Piece where+	readsEPD s	= case Data.List.Extra.trimStart s of 		c : remainder	-> ( 			MkPiece ( 				if Data.Char.isUpper c@@ -141,12 +142,16 @@ 		 ) `map` reads [c] 		_		-> []	-- No parse. -instance Property.ForsythEdwards.ShowsFEN Piece where-	showsFEN piece@MkPiece { getRank = rank }	= showString . map (+instance Property.ExtendedPositionDescription.ShowsEPD Piece where+	showsEPD piece@MkPiece { getRank = rank }	= showString . map ( 		if isBlack piece 			then Data.Char.toLower	-- Only required for independence from the specific implementation of Read for Rank. 			else Data.Char.toUpper 	 ) $ show rank++instance Property.ForsythEdwards.ReadsFEN Piece++instance Property.ForsythEdwards.ShowsFEN Piece  instance HXT.XmlPickler Piece where 	xpickle	= HXT.xpWrap (read, show) . HXT.xpAttr tag . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range
src-lib/BishBosh/ContextualNotation/StandardAlgebraic.hs view
@@ -42,24 +42,13 @@ --	longCastleToken, --	shortCastleToken, --	moveSuffixAnnotations,---	xMin,---	yMin,---	xMax,---	yMax,---	xOrigin,---	yOrigin, -- * Functions---	encode,-	showsCoordinates, 	showsTurn, 	showTurn, 	showsMove, 	showMove, 	movePiece, --	rankParser,---	abscissaParser,---	ordinateParser,---	coordinatesParser, --	captureParser, --	moveSuffixAnnotationParser, 	parser,@@ -67,18 +56,13 @@ 	toRank, -- ** Constructors 	fromQualifiedMove--- ** Predicates---	inXRange,---	inYRange ) where -import			Control.Arrow((&&&), (***))+import			Control.Arrow((&&&)) import			Data.Array.IArray((!)) import qualified	BishBosh.Attribute.MoveType		as Attribute.MoveType import qualified	BishBosh.Attribute.Rank			as Attribute.Rank-import qualified	BishBosh.Cartesian.Abscissa		as Cartesian.Abscissa import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates-import qualified	BishBosh.Cartesian.Ordinate		as Cartesian.Ordinate import qualified	BishBosh.Component.Move			as Component.Move import qualified	BishBosh.Component.Piece		as Component.Piece import qualified	BishBosh.Component.QualifiedMove	as Component.QualifiedMove@@ -86,6 +70,7 @@ import qualified	BishBosh.Data.Exception			as Data.Exception import qualified	BishBosh.Model.Game			as Model.Game import qualified	BishBosh.Model.GameTerminationReason	as Model.GameTerminationReason+import qualified	BishBosh.Notation.PureCoordinate	as Notation.PureCoordinate import qualified	BishBosh.Property.ForsythEdwards	as Property.ForsythEdwards import qualified	BishBosh.State.Board			as State.Board import qualified	BishBosh.State.MaybePieceByCoordinates	as State.MaybePieceByCoordinates@@ -151,32 +136,6 @@ moveSuffixAnnotations :: String moveSuffixAnnotations	= "!?" --- | The minimum permissible values for /x/ & /y/ coordinates.-min' :: (Char, Char)-xMin, yMin :: Char-min'@(xMin, yMin)	= ('a', '1')---- | The origin of the coordinate-system.-origin :: (Int, Int)-xOrigin, yOrigin :: Int-origin@(xOrigin, yOrigin)	= Data.Char.ord *** Data.Char.ord $ min'---- | The maximum permissible values for /x/ & /y/ coordinates.-xMax, yMax :: Char-(xMax, yMax)	= Data.Char.chr . (-	+ pred {-fence-post-} (fromIntegral Cartesian.Abscissa.xLength)- ) *** Data.Char.chr . (-	+ pred {-fence-post-} (fromIntegral Cartesian.Ordinate.yLength)- ) $ origin---- | Whether the specified character is a valid abscissa.-inXRange :: Char -> Bool-inXRange	= uncurry (&&) . ((>= xMin) &&& (<= xMax))---- | Whether the specified character is a valid ordinate.-inYRange :: Char -> Bool-inYRange	= uncurry (&&) . ((>= yMin) &&& (<= yMax))- -- | Defines a /move/, to enable i/o in /StandardAlgebraic/-notation. newtype StandardAlgebraic x y	= MkStandardAlgebraic { 	getQualifiedMove	:: Component.QualifiedMove.QualifiedMove x y@@ -186,14 +145,6 @@ fromQualifiedMove :: Component.QualifiedMove.QualifiedMove x y -> StandardAlgebraic x y fromQualifiedMove	= MkStandardAlgebraic --- | Encodes the ordinate & abscissa.-encode :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> (ShowS, ShowS)-encode	= showChar . Data.Char.chr . (+ (xOrigin - Cartesian.Abscissa.xOrigin)) . fromEnum . Cartesian.Coordinates.getX &&& showChar . Data.Char.chr . (+ (yOrigin - Cartesian.Ordinate.yOrigin)) . fromEnum . Cartesian.Coordinates.getY---- | Shows the specified /coordinates/.-showsCoordinates :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> ShowS-showsCoordinates	= uncurry (.) . encode- -- | Whether en-passant moves are tagged, or implicit. type ExplicitEnPassant	= Bool @@ -254,7 +205,7 @@ 				else checkFlag 			else id 	)-	| otherwise	= Control.Exception.throw . Data.Exception.mkSearchFailure . showString "BishBosh.ContextualNotation.StandardAlgebraic.showsTurn:\tno piece exists at " . showsCoordinates source . showString "; " $ Property.ForsythEdwards.showsFEN game "."+	| otherwise	= Control.Exception.throw . Data.Exception.mkSearchFailure . showString "BishBosh.ContextualNotation.StandardAlgebraic.showsTurn:\tno piece exists at " . Notation.PureCoordinate.showsCoordinates source . showString "; " $ Property.ForsythEdwards.showsFEN game "." 	where 		((source, destination), moveType)	= (Component.Move.getSource &&& Component.Move.getDestination) . Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType $ Component.Turn.getQualifiedMove turn 		board					= Model.Game.getBoard game@@ -268,8 +219,8 @@  		showsCapture, showsX, showsY, showsDestination :: ShowS 		showsCapture		= showChar captureFlag-		(showsX, showsY)	= encode source-		showsDestination	= showsCoordinates destination+		(showsX, showsY)	= Notation.PureCoordinate.encode source+		showsDestination	= Notation.PureCoordinate.showsCoordinates destination  		game'	= Model.Game.takeTurn turn game @@ -342,34 +293,6 @@ rankParser :: Text.Poly.TextParser Attribute.Rank.Rank rankParser	= toRank `fmap` Poly.satisfyMsg (`elem` map fromRank Attribute.Rank.pieces) Attribute.Rank.tag --- | Parse an /x/-coordinate.-abscissaParser :: Enum x => Text.Poly.TextParser x-{-# SPECIALISE abscissaParser :: Text.Poly.TextParser T.X #-}-abscissaParser	= (-	toEnum . (+ (Cartesian.Abscissa.xOrigin - xOrigin)) . Data.Char.ord- ) `fmap` Poly.satisfyMsg inXRange "Abscissa"---- | Parse a /y/-coordinate.-ordinateParser :: Enum y => Text.Poly.TextParser y-{-# SPECIALISE ordinateParser :: Text.Poly.TextParser T.Y #-}-ordinateParser	= (-	toEnum . (+ (Cartesian.Ordinate.yOrigin - yOrigin)) . Data.Char.ord- ) `fmap` Poly.satisfyMsg inYRange "Ordinate"---- | Parse a pair of /coordinates/.-coordinatesParser :: (-	Enum	x,-	Enum	y,-	Ord	x,-	Ord	y- ) => Text.Poly.TextParser (Cartesian.Coordinates.Coordinates x y)-{-# SPECIALISE coordinatesParser :: Text.Poly.TextParser (Cartesian.Coordinates.Coordinates T.X T.Y) #-}-coordinatesParser	= do-	x	<- abscissaParser-	y	<- ordinateParser--	return {-to Parser-monad-} $ Cartesian.Coordinates.mkCoordinates x y- -- | Parse the flag which denotes capture. captureParser :: Text.Poly.TextParser Char captureParser	= Poly.satisfyMsg (== captureFlag) "Capture"@@ -378,30 +301,6 @@ rankParser :: Parsec.Parser Attribute.Rank.Rank rankParser	= toRank <$> Parsec.oneOf (map fromRank Attribute.Rank.pieces) <?> Attribute.Rank.tag --- | Parse an /x/-coordinate.-abscissaParser :: Enum x => Parsec.Parser x-{-# SPECIALISE abscissaParser :: Parsec.Parser T.X #-}-abscissaParser	= (-	toEnum . (+ (Cartesian.Abscissa.xOrigin - xOrigin)) . Data.Char.ord- ) <$> Parsec.satisfy inXRange <?> "Abscissa"---- | Parse a /y/-coordinate.-ordinateParser :: Enum y => Parsec.Parser y-{-# SPECIALISE ordinateParser :: Parsec.Parser T.X #-}-ordinateParser	= (-	toEnum . (+ (Cartesian.Ordinate.yOrigin - yOrigin)) . Data.Char.ord- ) <$> Parsec.satisfy inYRange <?> "Ordinate"---- | Parse a pair of /coordinates/.-coordinatesParser :: (-	Enum	x,-	Enum	y,-	Ord	x,-	Ord	y- ) => Parsec.Parser (Cartesian.Coordinates.Coordinates x y)-{-# SPECIALISE coordinatesParser :: Parsec.Parser (Cartesian.Coordinates.Coordinates T.X T.Y) #-}-coordinatesParser	= Cartesian.Coordinates.mkCoordinates <$> abscissaParser <*> ordinateParser- -- | Parse the flag which denotes capture. captureParser :: Parsec.Parser () captureParser	= Control.Monad.void (Parsec.char captureFlag <?> "Capture")@@ -461,7 +360,7 @@ 						( 							"Pawn-advance", 							do-								destination	<- coordinatesParser+								destination	<- Notation.PureCoordinate.coordinatesParser  								Data.Maybe.maybe ( 									do@@ -480,9 +379,9 @@ 						), ( 							"Pawn-capture", 							do-								x		<- abscissaParser+								x		<- Notation.PureCoordinate.abscissaParser 								_		<- captureParser-								destination	<- Poly.commit coordinatesParser+								destination	<- Poly.commit Notation.PureCoordinate.coordinatesParser  								let maybeDestinationRank	= getMaybeRank destination @@ -532,8 +431,8 @@ 						( 							"Fully qualified move",	-- N.B. this scenario occurs when there are identical pieces on both the same row & the same column, as the intended attacker; i.e. after a promotion. 							do-								source		<- coordinatesParser-								destination	<- Control.Applicative.optional captureParser >> coordinatesParser+								source		<- Notation.PureCoordinate.coordinatesParser+								destination	<- Control.Applicative.optional captureParser >> Notation.PureCoordinate.coordinatesParser  								return {-to Parser-monad-} . Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) $ mkNormalMoveType destination 						), (@@ -544,22 +443,22 @@ 										"Abscissa qualification", 										( 											\x -> filter $ (== x) . Cartesian.Coordinates.getX-										) `fmap` abscissaParser+										) `fmap` Notation.PureCoordinate.abscissaParser 									), ( 										"Ordinate qualification", 										( 											\y -> filter $ (== y) . Cartesian.Coordinates.getY-										) `fmap` ordinateParser+										) `fmap` Notation.PureCoordinate.ordinateParser 									) 								 ] -- Build a filter from the source-qualifier. -								destination	<- Control.Applicative.optional captureParser >> coordinatesParser+								destination	<- Control.Applicative.optional captureParser >> Notation.PureCoordinate.coordinatesParser  								resolveQualifiedMove destination . sourceFilter $ findAttacksBy destination 						), ( 							"Unqualified move",	-- The most likely scenario, where the intended attacker is unambiguous. 							Poly.commit $ do-								destination	<- Control.Applicative.optional captureParser >> coordinatesParser+								destination	<- Control.Applicative.optional captureParser >> Notation.PureCoordinate.coordinatesParser  								resolveQualifiedMove destination $ findAttacksBy destination 						)@@ -616,7 +515,7 @@ 					promotionParser	= (Parsec.char promotionFlag <?> "Promotion") >> rankParser 				in Parsec.try ( 					do-						destination	<- coordinatesParser	<?> "Destination"+						destination	<- Notation.PureCoordinate.coordinatesParser	<?> "Destination"  						Data.Maybe.maybe ( 							fail . showString "Failed to locate any " . shows piece . showString " which can advance to " $ shows destination "."@@ -630,8 +529,8 @@ 							>>= Cartesian.Coordinates.maybeRetreat nextLogicalColour 						 ) $ Just destination 				) <|> do-					x		<- abscissaParser <* captureParser-					destination	<- coordinatesParser	<?> "Destination"+					x		<- Notation.PureCoordinate.abscissaParser <* captureParser+					destination	<- Notation.PureCoordinate.coordinatesParser	<?> "Destination"  					let maybeDestinationRank	= getMaybeRank destination @@ -669,33 +568,33 @@ 						 ] -- List-comprehension. 				in Parsec.choice [ 					Parsec.try $ do -- N.B. this scenario occurs when there are identical pieces on both the same row & the same column, as the intended attacker; i.e. after a promotion.-						source		<- coordinatesParser	<?> "Source"+						source		<- Notation.PureCoordinate.coordinatesParser	<?> "Source"  						Parsec.optional captureParser		<?> "Optional capture" -						destination	<- coordinatesParser	<?> "Destination"+						destination	<- Notation.PureCoordinate.coordinatesParser	<?> "Destination"  						return {-to ParsecT-monad-} . Component.QualifiedMove.mkQualifiedMove (Component.Move.mkMove source destination) $ mkNormalMoveType destination, 					Parsec.try $ do	-- This scenario occurs if there's an identical piece on either the same row or the same column, as the intended attacker. 						sourceFilter	<- ( 							( 								\x -> filter $ (== x) . Cartesian.Coordinates.getX-							) <$> abscissaParser+							) <$> Notation.PureCoordinate.abscissaParser 						 ) <|> ( 							( 								\y -> filter $ (== y) . Cartesian.Coordinates.getY-							) <$> ordinateParser+							) <$> Notation.PureCoordinate.ordinateParser 						 ) -- Build a filter from the source-qualifier.  						Parsec.optional captureParser		<?> "Optional capture" -						destination	<- coordinatesParser	<?> "Destination"+						destination	<- Notation.PureCoordinate.coordinatesParser	<?> "Destination"  						resolveQualifiedMove destination . sourceFilter $ findAttacksBy destination, 					do	-- The most likely scenario, where the intended attacker is unambiguous. 						Parsec.optional captureParser		<?> "Optional capture" -						destination	<- coordinatesParser	<?> "Unqualified destination"+						destination	<- Notation.PureCoordinate.coordinatesParser	<?> "Unqualified destination"  						resolveQualifiedMove destination $ findAttacksBy destination 				],
src-lib/BishBosh/Input/CECPFeatures.hs view
@@ -180,7 +180,7 @@ reuseTag :: Key reuseTag	= "reuse" --- | Tags the feature which defines whether the GUI may send moves in "SAN" rather than "Coordinate" notation.+-- | Tags the feature which defines whether the GUI may send moves in "SAN" rather than "PureCoordinate" notation. sanTag :: Key sanTag		= "san" @@ -294,7 +294,7 @@ 			), ( 				reuseTag,	true			-- Whether xboard may reuse this engine for multiple games. 			), (-				sanTag,		false			-- Whether xboard sends moves in "Standard Algebraic Notation" rather than "Coordinate".+				sanTag,		false			-- Whether xboard sends moves in "Standard Algebraic Notation" rather than "PureCoordinate". 			), ( 				setboardTag,	true			-- Whether xboard may send the "setboard" command, to define the board. 			), (
src-lib/BishBosh/Input/UIOptions.hs view
@@ -205,7 +205,7 @@ 	| ( 		const False `either` const True 	) eitherNativeUIOrCECPOptions && not (-		Notation.MoveNotation.isCoordinate moveNotation+		Notation.MoveNotation.isPureCoordinate moveNotation 	)					= Control.Exception.throw . Data.Exception.mkIncompatibleData . showString "BishBosh.Input.UIOptions.mkUIOptions:\t" . shows Input.CECPOptions.tag . showString " is incompatible with " . showString Notation.MoveNotation.tag . Text.ShowList.showsAssociation $ shows moveNotation "." 	| otherwise	= MkUIOptions { 		getMoveNotation			= moveNotation,
src-lib/BishBosh/Model/Game.hs view
@@ -109,7 +109,9 @@ import qualified	BishBosh.Model.GameTerminationReason		as Model.GameTerminationReason import qualified	BishBosh.Model.Result				as Model.Result import qualified	BishBosh.Notation.MoveNotation			as Notation.MoveNotation+import qualified	BishBosh.Notation.PureCoordinate		as Notation.PureCoordinate import qualified	BishBosh.Property.Empty				as Property.Empty+import qualified	BishBosh.Property.ExtendedPositionDescription	as Property.ExtendedPositionDescription import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards import qualified	BishBosh.Property.Null				as Property.Null import qualified	BishBosh.Property.Opposable			as Property.Opposable@@ -324,29 +326,26 @@ 		) Attribute.LogicalColour.range 	} --- CAVEAT: some information is lost during 'showsFEN', which can't subsequently be recovered by 'readsFEN'. instance ( 	Enum	x, 	Enum	y, 	Ord	x, 	Ord	y,-	Read	x,-	Read	y, 	Show	x, 	Show	y- ) => Property.ForsythEdwards.ReadsFEN (Game x y) where-	{-# SPECIALISE instance Property.ForsythEdwards.ReadsFEN (Game T.X T.Y) #-}-	readsFEN s	= [+ ) => Property.ExtendedPositionDescription.ReadsEPD (Game x y) where+	{-# SPECIALISE instance Property.ExtendedPositionDescription.ReadsEPD (Game T.X T.Y) #-}+	readsEPD s	= [ 		( 			mkGame nextLogicalColour castleableRooksByLogicalColour board turnsByLogicalColour,-			remainder	-- En-passant target, half-move clock, full-move number.+			s4 		) |-			(board, s1)				<- Property.ForsythEdwards.readsFEN s,-			(nextLogicalColour, s2)			<- Property.ForsythEdwards.readsFEN s1,-			(castleableRooksByLogicalColour, s3)	<- Property.ForsythEdwards.readsFEN s2,-			(turnsByLogicalColour, remainder)	<- case Data.List.Extra.trimStart s3 of-				'-' : remainder	-> [(Property.Empty.empty {-TurnsByLogicalColour-}, remainder)]-				s4		-> Control.Arrow.first (+			(board, s1)				<- Property.ExtendedPositionDescription.readsEPD s,+			(nextLogicalColour, s2)			<- Property.ExtendedPositionDescription.readsEPD s1,+			(castleableRooksByLogicalColour, s3)	<- Property.ExtendedPositionDescription.readsEPD s2,+			(turnsByLogicalColour, s4)		<- case Data.List.Extra.trimStart s3 of+				'-' : s4'	-> [(Property.Empty.empty {-TurnsByLogicalColour-}, s4')]+				s3'		-> Control.Arrow.first ( 					\enPassantDestination -> let 						opponentsLogicalColour	= Property.Opposable.getOpposite nextLogicalColour 					 in State.TurnsByLogicalColour.fromAssocs [@@ -360,13 +359,15 @@ 									Component.QualifiedMove.mkQualifiedMove ( 										uncurry Component.Move.mkMove $ ( 											uncurry Cartesian.Coordinates.retreat &&& uncurry Cartesian.Coordinates.advance-										) (opponentsLogicalColour, enPassantDestination)	-- Construct a Pawn double-advance.+										) (opponentsLogicalColour, enPassantDestination)	-- Reconstruct the recent Pawn double-advance. 									) Data.Default.def {-move-type-} 								 ) Attribute.Rank.Pawn 							] -- Singleton. 						) -- Pair. 					]-				 ) `map` reads s4+				 ) `map` (+					Notation.PureCoordinate.readsCoordinates s3'+				 ) {-En-passant destination-} 	 ] -- List-comprehension.  instance (@@ -374,26 +375,23 @@ 	Enum	y, 	Ord	x, 	Ord	y- ) => Property.ForsythEdwards.ShowsFEN (Game x y) where-	showsFEN game@MkGame {+ ) => Property.ExtendedPositionDescription.ShowsEPD (Game x y) where+	showsEPD game@MkGame { 		getNextLogicalColour			= nextLogicalColour, 		getCastleableRooksByLogicalColour	= castleableRooksByLogicalColour,-		getBoard				= board,-		getTurnsByLogicalColour			= turnsByLogicalColour,-		getInstancesByPosition			= instancesByPosition-	 } = Text.ShowList.showsDelimitedList Property.ForsythEdwards.showsSeparator id id [-		Property.ForsythEdwards.showsFEN board,					-- Placement of pieces.-		Property.ForsythEdwards.showsFEN nextLogicalColour,			-- Active colour.-		Property.ForsythEdwards.showsFEN castleableRooksByLogicalColour,	-- Castling availability.-		Data.Maybe.maybe Property.ForsythEdwards.showsNullField (+		getBoard				= board+	 } = Text.ShowList.showsDelimitedList Property.ExtendedPositionDescription.showsSeparator id id [+		Property.ExtendedPositionDescription.showsEPD board,				-- 1. Placement of pieces.+		Property.ExtendedPositionDescription.showsEPD nextLogicalColour,		-- 2. Active colour.+		Property.ExtendedPositionDescription.showsEPD castleableRooksByLogicalColour,	-- 3. Castling availability.+		Data.Maybe.maybe Property.ExtendedPositionDescription.showsNullField ( 			\turn -> if Component.Turn.isPawnDoubleAdvance (Property.Opposable.getOpposite nextLogicalColour) turn 				then Notation.MoveNotation.showsNotation Data.Default.def {-Smith is the same as the required Algebraic notation in this limited role-} . Cartesian.Coordinates.advance nextLogicalColour . Component.Move.getDestination . Component.QualifiedMove.getMove $ Component.Turn.getQualifiedMove turn-				else Property.ForsythEdwards.showsNullField-		) $ maybeLastTurn game,	-- En-passant target square. CAVEAT: in contrast to X-FEN, the opponent isn't required to have a Pawn in position to take en-passant.-		shows $ State.InstancesByPosition.countConsecutiveRepeatablePlies instancesByPosition,	-- Half move clock.-		shows . succ {-the full-move count starts at '1', before any move has occurred-} . length $ State.TurnsByLogicalColour.dereference Attribute.LogicalColour.Black turnsByLogicalColour	-- Full move number.+				else Property.ExtendedPositionDescription.showsNullField+		) $ maybeLastTurn game	-- 4. En-passant target square. CAVEAT: in contrast to X-EPD, this is required even when there's no opposing Pawn in a suitable position to take en-passant. 	 ] +-- CAVEAT: some information is lost during 'showsFEN', which can't subsequently be recovered by 'readsFEN'. instance ( 	Enum	x, 	Enum	y,@@ -401,6 +399,37 @@ 	Ord	y, 	Show	x, 	Show	y+ ) => Property.ForsythEdwards.ReadsFEN (Game x y) where+	{-# SPECIALISE instance Property.ForsythEdwards.ReadsFEN (Game T.X T.Y) #-}+	readsFEN s	=  [+		(game, s3) |+			(game, s1)		<- Property.ExtendedPositionDescription.readsEPD s,+			(_halfMoveClock, s2)	<- reads s1 :: [(Int, String)],+			(_fullMoveCounter, s3)	<- reads s2 :: [(Int, String)]+	 ] -- List-comprehension.++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.ForsythEdwards.ShowsFEN (Game x y) where+	showsFEN game@MkGame {+		getTurnsByLogicalColour	= turnsByLogicalColour,+		getInstancesByPosition	= instancesByPosition+	 } = Text.ShowList.showsDelimitedList Property.ExtendedPositionDescription.showsSeparator id id [+		Property.ExtendedPositionDescription.showsEPD game,+		shows $ State.InstancesByPosition.countConsecutiveRepeatablePlies instancesByPosition, -- 5. Half move clock.+		shows . succ {-the full-move counter starts at '1', before any move has occurred-} . length $ State.TurnsByLogicalColour.dereference Attribute.LogicalColour.Black turnsByLogicalColour	-- 6. Full move counter.+	 ]++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y,+	Show	x,+	Show	y  ) => Property.Empty.Empty (Game x y) where 	{-# SPECIALISE instance Property.Empty.Empty (Game T.X T.Y) #-} 	empty	= Data.Default.def	-- i.e. zero turns have been taken, rather than zero pieces remain (which is illegal).@@ -986,7 +1015,7 @@ 					Attribute.Rank.Knight	-> [ 						( 							distance `notElem` Cartesian.Vector.attackVectorsForKnight,-							"the jump must be to the opposite corner of a 3 x 2 rectangle."+							"the jump must be to the opposite corner of a 3 x 2 rectangle" 						) -- Pair. 					 ] 					Attribute.Rank.Bishop	-> [
− src-lib/BishBosh/Notation/Coordinate.hs
@@ -1,153 +0,0 @@-{--	Copyright (C) 2018 Dr. Alistair Ward--	This file is part of BishBosh.--	BishBosh is free software: you can redistribute it and/or modify-	it under the terms of the GNU General Public License as published by-	the Free Software Foundation, either version 3 of the License, or-	(at your option) any later version.--	BishBosh is distributed in the hope that it will be useful,-	but WITHOUT ANY WARRANTY; without even the implied warranty of-	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-	GNU General Public License for more details.--	You should have received a copy of the GNU General Public License-	along with BishBosh.  If not, see <http://www.gnu.org/licenses/>.--}-{- |- [@AUTHOR@]	Dr. Alistair Ward-- [@DESCRIPTION@]--	* <https://www.chessprogramming.org/Algebraic_Chess_Notation#Pure_coordinate_notation>.--	* CAVEAT: <https://en.wikipedia.org/wiki/Chess_notation> defined a variant of this notation.--	* N.B.: used for communication via /CECP/ with /xboard/.--}--module BishBosh.Notation.Coordinate(--- * Types--- ** Data-types-	Coordinate(---		MkCoordinate,-		getMove---		getMaybePromotionRank-	),--- * Constants---	xOrigin,---	yOrigin,-	origin,-	regexSyntax,--- * Functions---	encode,-	showsCoordinates,--- ** Constructors-	mkCoordinate,-	mkCoordinate'-) where--import			Control.Arrow((&&&))-import qualified	BishBosh.Attribute.Rank		as Attribute.Rank-import qualified	BishBosh.Cartesian.Abscissa	as Cartesian.Abscissa-import qualified	BishBosh.Cartesian.Coordinates	as Cartesian.Coordinates-import qualified	BishBosh.Cartesian.Ordinate	as Cartesian.Ordinate-import qualified	BishBosh.Component.Move		as Component.Move-import qualified	BishBosh.Data.Exception		as Data.Exception-import qualified	Control.Arrow-import qualified	Control.Exception-import qualified	Data.Char-import qualified	Data.List.Extra-import qualified	Data.Maybe---- | The /x/-origin.-xOrigin :: Int-xOrigin	= Data.Char.ord 'a'---- | The /y/-origin.-yOrigin :: Int-yOrigin	= Data.Char.ord '1'---- | The origin.-origin :: (Int, Int)-origin	= (xOrigin, yOrigin)---- | Defines using a regex, the required syntax.-regexSyntax :: String-regexSyntax	= showString "([a-h][1-8]){2}[" $ showString (-	concatMap show Attribute.Rank.promotionProspects- ) "]?"---- | Defines a /move/, to enable i/o in /Coordinate/-notation.-data Coordinate x y	= MkCoordinate {-	getMove			:: Component.Move.Move x y,-	getMaybePromotionRank	:: Maybe Attribute.Rank.Rank-} deriving Eq---- | Smart constructor.-mkCoordinate :: Component.Move.Move x y -> Maybe Attribute.Rank.Rank -> Coordinate x y-mkCoordinate move maybePromotionRank-	| Just rank	<- maybePromotionRank-	, rank `notElem` Attribute.Rank.promotionProspects	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Notation.Coordinate.Coordinate:\tcan't promote to a " $ shows rank "."-	| otherwise						= MkCoordinate {-		getMove			= move,-		getMaybePromotionRank	= maybePromotionRank-	}---- | Smart constructor.-mkCoordinate' :: Attribute.Rank.Promotable promotable => Component.Move.Move x y -> promotable -> Coordinate x y-mkCoordinate' move	= mkCoordinate move . Attribute.Rank.getMaybePromotionRank---- | Encodes the ordinate & abscissa.-encode :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> (ShowS, ShowS)-encode	= showChar . Data.Char.chr . (+ (xOrigin - Cartesian.Abscissa.xOrigin)) . fromEnum . Cartesian.Coordinates.getX &&& showChar . Data.Char.chr . (+ (yOrigin - Cartesian.Ordinate.yOrigin)) . fromEnum . Cartesian.Coordinates.getY---- | Shows the specified /coordinates/.-showsCoordinates :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> ShowS-showsCoordinates	= uncurry (.) . encode--instance (Enum x, Enum y) => Show (Coordinate x y) where-	showsPrec _ MkCoordinate {-		getMove			= move,-		getMaybePromotionRank	= maybePromotionRank-	} = showsCoordinates (-		Component.Move.getSource move-	 ) . showsCoordinates (-		Component.Move.getDestination move-	 ) . Data.Maybe.maybe id shows maybePromotionRank---- N.B. this merely validates the syntax, leaving any semantic errors to 'Model.Game.validate'.-instance (-	Enum	x,-	Enum	y,-	Ord	x,-	Ord	y- ) => Read (Coordinate x y) where-	readsPrec _ s	= case Data.List.Extra.trimStart s of-		x : y : x' : y' : remainder	-> let-			translate x'' y''	= Cartesian.Coordinates.mkMaybeCoordinates (-				toEnum $ Data.Char.ord x'' + (Cartesian.Abscissa.xOrigin - xOrigin)-			 ) (-				toEnum $ Data.Char.ord y'' + (Cartesian.Ordinate.yOrigin - yOrigin)-			 )-		 in [-			Control.Arrow.first (-				mkCoordinate $ Component.Move.mkMove source destination-			) (-				case reads $ take 1 remainder of-					[(rank, "")]	-> if rank `elem` Attribute.Rank.promotionProspects-						then (Just rank, tail remainder)-						else (Nothing, remainder)-					_	-> (Nothing, remainder)-			) |-				source		<- Data.Maybe.maybeToList $ translate x y,-				destination	<- Data.Maybe.maybeToList $ translate x' y',-				source /= destination-		 ] -- List-comprehension.-		_					-> []	-- No parse.--instance Attribute.Rank.Promotable (Coordinate x y) where-	getMaybePromotionRank	= getMaybePromotionRank-
src-lib/BishBosh/Notation/MoveNotation.hs view
@@ -31,7 +31,7 @@ 	MoveNotation(), -- * Constants 	tag,-	coordinate,+	pureCoordinate, 	range, -- * Functions 	readsQualifiedMove,@@ -40,7 +40,7 @@ 	getOrigin, 	showsNotationFloatToNDecimals, -- ** Predicates-	isCoordinate+	isPureCoordinate ) where  import			Control.Arrow((&&&))@@ -49,8 +49,8 @@ import qualified	BishBosh.Component.EitherQualifiedMove	as Component.EitherQualifiedMove import qualified	BishBosh.Component.QualifiedMove	as Component.QualifiedMove import qualified	BishBosh.Component.Turn			as Component.Turn-import qualified	BishBosh.Notation.Coordinate		as Notation.Coordinate import qualified	BishBosh.Notation.ICCFNumeric		as Notation.ICCFNumeric+import qualified	BishBosh.Notation.PureCoordinate	as Notation.PureCoordinate import qualified	BishBosh.Notation.Smith			as Notation.Smith import qualified	BishBosh.Property.ShowFloat		as Property.ShowFloat import qualified	Control.Arrow@@ -70,9 +70,9 @@ 	* /Standard Algebraic/ isn't included here because conversion to or from a /QualifiedMove/ requires access to the /game/. -} data MoveNotation-	= Coordinate	-- ^ As used for communication with /xboard/.-	| ICCFNumeric	-- ^ <https://en.wikipedia.org/wiki/ICCF_numeric_notation>.-	| Smith		-- ^ <https://www.chessprogramming.org/Warren_D._Smith>.+	= ICCFNumeric		-- ^ <https://en.wikipedia.org/wiki/ICCF_numeric_notation>.+	| PureCoordinate	-- ^ As used for communication with /xboard/ & as the basis of Standard Algebraic.+	| Smith			-- ^ <https://www.chessprogramming.org/Warren_D._Smith>. 	deriving (Eq, Read, Show)  instance Control.DeepSeq.NFData MoveNotation where@@ -85,12 +85,12 @@ 	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpWrap (read, show) . HXT.xpAttr tag . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range	-- CAVEAT: whether it'll be used as an XML-attribute or an XML-element isn't currently known.  -- | Constant.-coordinate :: MoveNotation-coordinate	= Coordinate+pureCoordinate :: MoveNotation+pureCoordinate	= PureCoordinate  -- | The constant complete range of values. range :: [MoveNotation]-range	= [Coordinate, ICCFNumeric, Smith]+range	= [ICCFNumeric, PureCoordinate, Smith]  -- | Reads a /move/ & /move-type/ from the specified 'MoveNotation'. readsQualifiedMove :: (@@ -101,29 +101,29 @@  ) 	=> MoveNotation 	-> ReadS (Component.EitherQualifiedMove.EitherQualifiedMove x y)-readsQualifiedMove Coordinate	= map (Control.Arrow.first $ uncurry Component.EitherQualifiedMove.mkPartiallyQualifiedMove . (Notation.Coordinate.getMove &&& Attribute.Rank.getMaybePromotionRank)) . reads readsQualifiedMove ICCFNumeric	= map (Control.Arrow.first $ uncurry Component.EitherQualifiedMove.mkPartiallyQualifiedMove . (Notation.ICCFNumeric.getMove &&& Attribute.Rank.getMaybePromotionRank)) . reads+readsQualifiedMove PureCoordinate	= map (Control.Arrow.first $ uncurry Component.EitherQualifiedMove.mkPartiallyQualifiedMove . (Notation.PureCoordinate.getMove &&& Attribute.Rank.getMaybePromotionRank)) . reads readsQualifiedMove Smith	= map (Control.Arrow.first $ uncurry Component.EitherQualifiedMove.mkFullyQualifiedMove . (Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType) . Notation.Smith.getQualifiedMove) . reads  -- | Show the syntax required by a specific 'MoveNotation'. showsMoveSyntax :: MoveNotation -> ShowS showsMoveSyntax moveNotation	= showChar '/' . showString ( 	case moveNotation of-		Coordinate	-> Notation.Coordinate.regexSyntax 		ICCFNumeric	-> Notation.ICCFNumeric.regexSyntax+		PureCoordinate	-> Notation.PureCoordinate.regexSyntax 		Smith		-> Notation.Smith.regexSyntax  ) . showChar '/'  -- | Returns the origin of the specified coordinate-system. getOrigin :: MoveNotation -> (Int, Int)-getOrigin Coordinate	= Notation.Coordinate.origin-getOrigin ICCFNumeric	= Notation.ICCFNumeric.origin-getOrigin Smith		= Notation.Smith.origin+getOrigin ICCFNumeric		= Notation.ICCFNumeric.origin+getOrigin PureCoordinate	= Notation.PureCoordinate.origin+getOrigin Smith			= Notation.Smith.origin  -- | Predicate.-isCoordinate :: MoveNotation -> Bool-isCoordinate Coordinate	= True-isCoordinate _		= False+isPureCoordinate :: MoveNotation -> Bool+isPureCoordinate PureCoordinate	= True+isPureCoordinate _		= False  -- | An interface for types which can be rendered in a chess-notation. class ShowNotation a where@@ -131,8 +131,8 @@  instance (Enum x, Enum y) => ShowNotation (Component.QualifiedMove.QualifiedMove x y) where 	showsNotation moveNotation qualifiedMove	= case moveNotation of-		Coordinate	-> shows $ Notation.Coordinate.mkCoordinate' move moveType 		ICCFNumeric	-> shows $ Notation.ICCFNumeric.mkICCFNumeric' move moveType+		PureCoordinate	-> shows $ Notation.PureCoordinate.mkPureCoordinate' move moveType 		Smith		-> shows $ Notation.Smith.fromQualifiedMove qualifiedMove 		where 			(move, moveType)	= Component.QualifiedMove.getMove &&& Component.QualifiedMove.getMoveType $ qualifiedMove@@ -141,8 +141,8 @@ 	showsNotation moveNotation	= showsNotation moveNotation . Component.Turn.getQualifiedMove  instance (Enum x, Enum y) => ShowNotation (Cartesian.Coordinates.Coordinates x y) where-	showsNotation Coordinate	= Notation.Coordinate.showsCoordinates 	showsNotation ICCFNumeric	= Notation.ICCFNumeric.showsCoordinates+	showsNotation PureCoordinate	= Notation.PureCoordinate.showsCoordinates 	showsNotation Smith		= Notation.Smith.showsCoordinates  -- | Show an arbitrary datum using the specified notation.
+ src-lib/BishBosh/Notation/PureCoordinate.hs view
@@ -0,0 +1,266 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh is free software: you can redistribute it and/or modify+	it under the terms of the GNU General Public License as published by+	the Free Software Foundation, either version 3 of the License, or+	(at your option) any later version.++	BishBosh is distributed in the hope that it will be useful,+	but WITHOUT ANY WARRANTY; without even the implied warranty of+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+	GNU General Public License for more details.++	You should have received a copy of the GNU General Public License+	along with BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* <https://www.chessprogramming.org/Algebraic_Chess_Notation#Pure_coordinate_notation>.++	* CAVEAT: <https://en.wikipedia.org/wiki/Chess_notation> defined a variant of this notation.++	* N.B.: used for communication via /CECP/ with /xboard/.++	* N.B.: this minimal notation defines the coordinate-system on which Standard Algebraic is based.+-}++module BishBosh.Notation.PureCoordinate(+-- * Types+-- ** Data-types+	PureCoordinate(+--		MkPureCoordinate,+		getMove+--		getMaybePromotionRank+	),+-- * Constants+--	min',+--	xMin,+--	xMax,+--	yMin,+--	yMax,+--	xOrigin,+--	yOrigin,+	origin,+	regexSyntax,+-- * Functions+	encode,+	showsCoordinates,+	readsCoordinates,+	abscissaParser,+	ordinateParser,+	coordinatesParser,+-- ** Constructors+	mkPureCoordinate,+	mkPureCoordinate'+-- ** Predicates+--	inXRange,+--	inYRange+) where++import			Control.Arrow((&&&), (***))+import qualified	BishBosh.Attribute.Rank		as Attribute.Rank+import qualified	BishBosh.Cartesian.Abscissa	as Cartesian.Abscissa+import qualified	BishBosh.Cartesian.Coordinates	as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate	as Cartesian.Ordinate+import qualified	BishBosh.Component.Move		as Component.Move+import qualified	BishBosh.Data.Exception		as Data.Exception+import qualified	BishBosh.Types			as T+import qualified	Control.Arrow+import qualified	Control.Exception+import qualified	Data.Char+import qualified	Data.List.Extra+import qualified	Data.Maybe++#ifdef USE_POLYPARSE+import qualified	BishBosh.Text.Poly			as Text.Poly+#if USE_POLYPARSE == 1+import qualified	Text.ParserCombinators.Poly.Lazy	as Poly+#else /* Plain */+import qualified	Text.ParserCombinators.Poly.Plain	as Poly+#endif+#else /* Parsec */+import qualified	Text.ParserCombinators.Parsec		as Parsec+import			Text.ParserCombinators.Parsec((<?>))+#endif++-- | The minimum permissible values for /x/ & /y/ coordinates.+min' :: (Char, Char)+xMin, yMin :: Char+min'@(xMin, yMin)	= ('a', '1')++-- | The origin of the coordinate-system.+origin :: (Int, Int)+xOrigin, yOrigin :: Int+origin@(xOrigin, yOrigin)	= Data.Char.ord *** Data.Char.ord $ min'++-- | The maximum permissible values for /x/ & /y/ coordinates.+xMax, yMax :: Char+(xMax, yMax)	= Data.Char.chr . (+	+ pred {-fence-post-} (fromIntegral Cartesian.Abscissa.xLength)+ ) *** Data.Char.chr . (+	+ pred {-fence-post-} (fromIntegral Cartesian.Ordinate.yLength)+ ) $ origin++-- | Whether the specified character is a valid abscissa.+inXRange :: Char -> Bool+inXRange	= uncurry (&&) . ((>= xMin) &&& (<= xMax))++-- | Whether the specified character is a valid ordinate.+inYRange :: Char -> Bool+inYRange	= uncurry (&&) . ((>= yMin) &&& (<= yMax))++-- | Defines using a regex, the required syntax.+regexSyntax :: String+regexSyntax	= showString "([a-h][1-8]){2}[" $ showString (+	concatMap show Attribute.Rank.promotionProspects+ ) "]?"++#ifdef USE_POLYPARSE+-- | Parse an /x/-coordinate.+abscissaParser :: Enum x => Text.Poly.TextParser x+{-# SPECIALISE abscissaParser :: Text.Poly.TextParser T.X #-}+abscissaParser	= (+	toEnum . (+ (Cartesian.Abscissa.xOrigin - xOrigin)) . Data.Char.ord+ ) `fmap` Poly.satisfyMsg inXRange "Abscissa"++-- | Parse a /y/-coordinate.+ordinateParser :: Enum y => Text.Poly.TextParser y+{-# SPECIALISE ordinateParser :: Text.Poly.TextParser T.Y #-}+ordinateParser	= (+	toEnum . (+ (Cartesian.Ordinate.yOrigin - yOrigin)) . Data.Char.ord+ ) `fmap` Poly.satisfyMsg inYRange "Ordinate"++-- | Parse a pair of /coordinates/.+coordinatesParser :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Text.Poly.TextParser (Cartesian.Coordinates.Coordinates x y)+{-# SPECIALISE coordinatesParser :: Text.Poly.TextParser (Cartesian.Coordinates.Coordinates T.X T.Y) #-}+coordinatesParser	= do+	x	<- abscissaParser+	y	<- ordinateParser++	return {-to Parser-monad-} $ Cartesian.Coordinates.mkCoordinates x y+#else+-- | Parse an /x/-coordinate.+abscissaParser :: Enum x => Parsec.Parser x+{-# SPECIALISE abscissaParser :: Parsec.Parser T.X #-}+abscissaParser	= (+	toEnum . (+ (Cartesian.Abscissa.xOrigin - xOrigin)) . Data.Char.ord+ ) <$> Parsec.satisfy inXRange <?> "Abscissa"++-- | Parse a /y/-coordinate.+ordinateParser :: Enum y => Parsec.Parser y+{-# SPECIALISE ordinateParser :: Parsec.Parser T.X #-}+ordinateParser	= (+	toEnum . (+ (Cartesian.Ordinate.yOrigin - yOrigin)) . Data.Char.ord+ ) <$> Parsec.satisfy inYRange <?> "Ordinate"++-- | Parse a pair of /coordinates/.+coordinatesParser :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Parsec.Parser (Cartesian.Coordinates.Coordinates x y)+{-# SPECIALISE coordinatesParser :: Parsec.Parser (Cartesian.Coordinates.Coordinates T.X T.Y) #-}+coordinatesParser	= Cartesian.Coordinates.mkCoordinates <$> abscissaParser <*> ordinateParser+#endif++-- | Defines a /move/, to enable i/o in /PureCoordinate/-notation.+data PureCoordinate x y	= MkPureCoordinate {+	getMove			:: Component.Move.Move x y,+	getMaybePromotionRank	:: Maybe Attribute.Rank.Rank+} deriving Eq++-- | Smart constructor.+mkPureCoordinate :: Component.Move.Move x y -> Maybe Attribute.Rank.Rank -> PureCoordinate x y+mkPureCoordinate move maybePromotionRank+	| Just rank	<- maybePromotionRank+	, rank `notElem` Attribute.Rank.promotionProspects	= Control.Exception.throw . Data.Exception.mkInvalidDatum . showString "BishBosh.Notation.PureCoordinate.mkPureCoordinate:\tcan't promote to a " $ shows rank "."+	| otherwise						= MkPureCoordinate {+		getMove			= move,+		getMaybePromotionRank	= maybePromotionRank+	}++-- | Smart constructor.+mkPureCoordinate' :: Attribute.Rank.Promotable promotable => Component.Move.Move x y -> promotable -> PureCoordinate x y+mkPureCoordinate' move	= mkPureCoordinate move . Attribute.Rank.getMaybePromotionRank++-- | Encodes the ordinate & abscissa.+encode :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> (ShowS, ShowS)+encode	= showChar . Data.Char.chr . (+ (xOrigin - Cartesian.Abscissa.xOrigin)) . fromEnum . Cartesian.Coordinates.getX &&& showChar . Data.Char.chr . (+ (yOrigin - Cartesian.Ordinate.yOrigin)) . fromEnum . Cartesian.Coordinates.getY++-- | Shows the specified /coordinates/.+showsCoordinates :: (Enum x, Enum y) => Cartesian.Coordinates.Coordinates x y -> ShowS+showsCoordinates	= uncurry (.) . encode++-- | Reads coordinates.+readsCoordinates :: (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => ReadS (Cartesian.Coordinates.Coordinates x y)+readsCoordinates s	= case Data.List.Extra.trimStart s of+	x : y : remainder	-> map (+		flip (,) remainder+	 ) . Data.Maybe.maybeToList $ Cartesian.Coordinates.mkMaybeCoordinates (+		toEnum $ Data.Char.ord x + (Cartesian.Abscissa.xOrigin - xOrigin)+	 ) (+		toEnum $ Data.Char.ord y + (Cartesian.Ordinate.yOrigin - yOrigin)+	 )+	_			-> []	-- Mo parse.++instance (Enum x, Enum y) => Show (PureCoordinate x y) where+	showsPrec _ MkPureCoordinate {+		getMove			= move,+		getMaybePromotionRank	= maybePromotionRank+	} = showsCoordinates (+		Component.Move.getSource move+	 ) . showsCoordinates (+		Component.Move.getDestination move+	 ) . Data.Maybe.maybe id shows maybePromotionRank++-- N.B. this merely validates the syntax, leaving any semantic errors to 'Model.Game.validate'.+instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Read (PureCoordinate x y) where+	readsPrec _ s	= case Data.List.Extra.trimStart s of+		x : y : x' : y' : remainder	-> let+			translate x'' y''	= Cartesian.Coordinates.mkMaybeCoordinates (+				toEnum $ Data.Char.ord x'' + (Cartesian.Abscissa.xOrigin - xOrigin)+			 ) (+				toEnum $ Data.Char.ord y'' + (Cartesian.Ordinate.yOrigin - yOrigin)+			 )+		 in [+			Control.Arrow.first (+				mkPureCoordinate $ Component.Move.mkMove source destination+			) (+				case reads $ take 1 remainder of+					[(rank, "")]	-> if rank `elem` Attribute.Rank.promotionProspects+						then (Just rank, tail remainder)+						else (Nothing, remainder)+					_	-> (Nothing, remainder)+			) |+				source		<- Data.Maybe.maybeToList $ translate x y,+				destination	<- Data.Maybe.maybeToList $ translate x' y',+				source /= destination+		 ] -- List-comprehension.+		_					-> []	-- No parse.++instance Attribute.Rank.Promotable (PureCoordinate x y) where+	getMaybePromotionRank	= getMaybePromotionRank+
+ src-lib/BishBosh/Property/ExtendedPositionDescription.hs view
@@ -0,0 +1,64 @@+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh is free software: you can redistribute it and/or modify+	it under the terms of the GNU General Public License as published by+	the Free Software Foundation, either version 3 of the License, or+	(at your option) any later version.++	BishBosh is distributed in the hope that it will be useful,+	but WITHOUT ANY WARRANTY; without even the implied warranty of+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+	GNU General Public License for more details.++	You should have received a copy of the GNU General Public License+	along with BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* <https://www.chessprogramming.org/Extended_Position_Description>.+-}++module BishBosh.Property.ExtendedPositionDescription(+-- * Type-classes+	ReadsEPD(..),+	ShowsEPD(..),+-- * Constants+	showsNullField,+	showsSeparator,+-- * Functions+	readEPD,+	showEPD+) where++-- | An alternative to 'Read'.+class ReadsEPD a where+	readsEPD	:: ReadS a	-- ^ Read a datum from EPD.++-- | An alternative to 'Show'.+class ShowsEPD a where+	showsEPD	:: a -> ShowS	-- ^ Stringify a EPD-datum.++-- | Read from EPD.+readEPD	:: ReadsEPD a => String -> a+readEPD s	= case readsEPD s of+	[(a, _)]	-> a+	_		-> error . showString "BishBosh.Property.ExtendedPositionDescription.readEPD:\tfailed to parse " $ shows s "."++-- | Display in EPD.+showEPD	:: ShowsEPD a => a -> String+showEPD a	= showsEPD a ""++-- | The standard way to denote the absence of a field.+showsNullField :: ShowS+showsNullField	= showChar '-'++-- | The standard separator between fields in EPD.+showsSeparator :: ShowS+showsSeparator	= showChar ' '+
src-lib/BishBosh/Property/ForsythEdwards.hs view
@@ -30,21 +30,22 @@ -- * Type-classes 	ReadsFEN(..), 	ShowsFEN(..),--- * Constants-	showsNullField,-	showsSeparator, -- * Functions 	readFEN, 	showFEN ) where +import qualified	BishBosh.Property.ExtendedPositionDescription	as Property.ExtendedPositionDescription+ -- | An alternative to 'Read'.-class ReadsFEN a where+class Property.ExtendedPositionDescription.ReadsEPD a => ReadsFEN a where 	readsFEN	:: ReadS a	-- ^ Read a datum from FEN.+	readsFEN	= Property.ExtendedPositionDescription.readsEPD	-- Default implementation.  -- | An alternative to 'Show'.-class ShowsFEN a where+class Property.ExtendedPositionDescription.ShowsEPD a => ShowsFEN a where 	showsFEN	:: a -> ShowS	-- ^ Stringify a FEN-datum.+	showsFEN	= Property.ExtendedPositionDescription.showsEPD	-- Default implementation.  -- | Read from FEN. readFEN	:: ReadsFEN a => String -> a@@ -55,12 +56,4 @@ -- | Display in FEN. showFEN	:: ShowsFEN a => a -> String showFEN a	= showsFEN a ""---- | The standard way to denote the absence of a field.-showsNullField :: ShowS-showsNullField	= showChar '-'---- | The standard separator between fields in FEN.-showsSeparator :: ShowS-showsSeparator	= showChar ' ' 
src-lib/BishBosh/State/Board.hs view
@@ -83,6 +83,7 @@ import qualified	BishBosh.Component.Zobrist			as Component.Zobrist import qualified	BishBosh.Data.Exception				as Data.Exception import qualified	BishBosh.Property.Empty				as Property.Empty+import qualified	BishBosh.Property.ExtendedPositionDescription	as Property.ExtendedPositionDescription import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards import qualified	BishBosh.Property.Opposable			as Property.Opposable import qualified	BishBosh.Property.Reflectable			as Property.Reflectable@@ -176,17 +177,33 @@ 	Enum	y, 	Ord	x, 	Ord	y+ ) => Property.ExtendedPositionDescription.ReadsEPD (Board x y) where+	{-# SPECIALISE instance Property.ExtendedPositionDescription.ReadsEPD (Board T.X T.Y) #-}+	readsEPD	= map (Control.Arrow.first fromMaybePieceByCoordinates) . Property.ExtendedPositionDescription.readsEPD++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.ExtendedPositionDescription.ShowsEPD (Board x y) where+	showsEPD MkBoard { getMaybePieceByCoordinates = maybePieceByCoordinates }	= Property.ExtendedPositionDescription.showsEPD maybePieceByCoordinates++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y  ) => Property.ForsythEdwards.ReadsFEN (Board x y) where 	{-# SPECIALISE instance Property.ForsythEdwards.ReadsFEN (Board T.X T.Y) #-}-	readsFEN	= map (Control.Arrow.first fromMaybePieceByCoordinates) . Property.ForsythEdwards.readsFEN+	readsFEN	=  Property.ExtendedPositionDescription.readsEPD  instance ( 	Enum	x, 	Enum	y, 	Ord	x, 	Ord	y- ) => Property.ForsythEdwards.ShowsFEN (Board x y) where-	showsFEN MkBoard { getMaybePieceByCoordinates = maybePieceByCoordinates }	= Property.ForsythEdwards.showsFEN maybePieceByCoordinates+ ) => Property.ForsythEdwards.ShowsFEN (Board x y)  instance ( 	Enum	x,
src-lib/BishBosh/State/CastleableRooksByLogicalColour.hs view
@@ -67,6 +67,7 @@ import qualified	BishBosh.Component.Turn				as Component.Turn import qualified	BishBosh.Component.Zobrist			as Component.Zobrist import qualified	BishBosh.Data.Exception				as Data.Exception+import qualified	BishBosh.Property.ExtendedPositionDescription	as Property.ExtendedPositionDescription import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards import qualified	BishBosh.Property.Opposable			as Property.Opposable import qualified	BishBosh.Property.Reflectable			as Property.Reflectable@@ -78,6 +79,7 @@ import qualified	Control.DeepSeq import qualified	Control.Exception import qualified	Data.Array.IArray+import qualified	Data.Char import qualified	Data.Default import qualified	Data.List import qualified	Data.List.Extra@@ -159,42 +161,46 @@ 	Enum	x, 	Ord	x, 	Show	x- ) => Property.ForsythEdwards.ReadsFEN (CastleableRooksByLogicalColour x) where-	readsFEN s	= case Data.List.Extra.trimStart s of+ ) => Property.ExtendedPositionDescription.ReadsEPD (CastleableRooksByLogicalColour x) where+	readsEPD s	= case Data.List.Extra.trimStart s of 		'-' : remainder	-> [ 			(-				MkCastleableRooksByLogicalColour $ Attribute.LogicalColour.range `zip` repeat [],	-- CAVEAT: it could also be just '[]'.+				MkCastleableRooksByLogicalColour $ Attribute.LogicalColour.range `zip` repeat [],	-- CAVEAT: can't disambiguate between this potential value & '[]' which have different semantics for this application. 				remainder 			) -- Pair. 		 ] -- Singleton. 		s1		-> let-			readsAssocs s'	= case reads s' of-				[(piece, s'')]	-> let-					logicalColour	= Component.Piece.getLogicalColour piece-				 in case Component.Piece.getRank piece of-					Attribute.Rank.Queen	-> Control.Arrow.first (-						(-							logicalColour,-							Cartesian.Abscissa.xMin-						) :-					 ) `map` readsAssocs s''	-- Recurse.-					Attribute.Rank.King	-> Control.Arrow.first (-						(-							logicalColour,-							Cartesian.Abscissa.xMax-						) :-					 ) `map` readsAssocs s''	-- Recurse.-					_			-> []	-- Inappropriate rank => parse-failure.-				_		-> [([], s')]+			readsAssocs s'+				| null s' || Data.Char.isSpace (head s')	= terminate	-- CAVEAT: white space separates this field from the start of the En-passant destination, which should it begin with a 'b' might be interpreted as a Bishop.+				| otherwise					= case reads s' of+					[(piece, s'')]	-> case rank of+						Attribute.Rank.Queen	-> Control.Arrow.first (+							(+								logicalColour,+								Cartesian.Abscissa.xMin+							) : {-prepend-}+						 ) `map` readsAssocs s''	-- Recurse.+						Attribute.Rank.King	-> Control.Arrow.first (+							(+								logicalColour,+								Cartesian.Abscissa.xMax+							) : {-prepend-}+						 ) `map` readsAssocs s''	-- Recurse.+						_			-> []	-- Inappropriate rank => parse-failure.+						where+							(logicalColour, rank)	= Component.Piece.getLogicalColour &&& Component.Piece.getRank $ piece+					_		-> terminate+				where+					terminate	= [([], s')] 		 in case readsAssocs s1 of-			[([], _)]	-> []	-- Zero pieces were read => no parse.+			[([], _)]	-> []	-- Zero pieces were read => parse-failure. 			l		-> Control.Arrow.first (fromAssocs . Data.List.Extra.groupSort) `map` l -instance (Enum x, Eq x) => Property.ForsythEdwards.ShowsFEN (CastleableRooksByLogicalColour x) where-	showsFEN MkCastleableRooksByLogicalColour { getAssocs = assocs }-		| all (null . snd) assocs	= Property.ForsythEdwards.showsNullField+instance (Enum x, Eq x) => Property.ExtendedPositionDescription.ShowsEPD (CastleableRooksByLogicalColour x) where+	showsEPD MkCastleableRooksByLogicalColour { getAssocs = assocs }+		| all (null . snd) assocs	= Property.ExtendedPositionDescription.showsNullField 		| otherwise			= foldr (-			(.) . Property.ForsythEdwards.showsFEN+			(.) . Property.ExtendedPositionDescription.showsEPD 		) id [ 			pieceConstructor logicalColour | 				logicalColour			<- [Attribute.LogicalColour.White, Attribute.LogicalColour.Black],	-- N.B.: the order is standardised.@@ -202,6 +208,14 @@ 				canCastleWith' logicalColour rooksX assocs 		] -- List-comprehension. +instance (+	Enum	x,+	Ord	x,+	Show	x+ ) => Property.ForsythEdwards.ReadsFEN (CastleableRooksByLogicalColour x)++instance (Enum x, Eq x) => Property.ForsythEdwards.ShowsFEN (CastleableRooksByLogicalColour x)+ -- | Get the list of random numbers required to represent the current castling potential. instance Eq x => Component.Zobrist.Hashable1D CastleableRooksByLogicalColour x {-CAVEAT: FlexibleInstances, MultiParamTypeClasses-} where 	listRandoms1D MkCastleableRooksByLogicalColour { getAssocs = assocs } zobrist	= Data.Maybe.catMaybes [@@ -215,7 +229,7 @@ 	Enum	x, 	Ord	x, 	Show	x- ) => [(Attribute.LogicalColour.LogicalColour, [x])] -> CastleableRooksByLogicalColour x+ ) => AbscissaeByLogicalColour x -> CastleableRooksByLogicalColour x fromAssocs assocs 	| Data.List.Extra.anySame $ map fst {-logicalColour-} assocs	= Control.Exception.throw . Data.Exception.mkDuplicateData . showString "BishBosh.State.CastleableRooksByLogicalColour.fromAssocs:\tduplicate logical colours have been defined; " $ shows assocs "." 	| any (Data.List.Extra.anySame . snd) assocs			= Control.Exception.throw . Data.Exception.mkDuplicateData . showString "BishBosh.State.CastleableRooksByLogicalColour.fromAssocs:\tduplicate abscissae have been defined; " $ shows assocs "."
src-lib/BishBosh/State/MaybePieceByCoordinates.hs view
@@ -82,6 +82,7 @@ import qualified	BishBosh.Component.Zobrist			as Component.Zobrist import qualified	BishBosh.Data.Exception				as Data.Exception import qualified	BishBosh.Property.Empty				as Property.Empty+import qualified	BishBosh.Property.ExtendedPositionDescription	as Property.ExtendedPositionDescription import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards import qualified	BishBosh.Property.Opposable			as Property.Opposable import qualified	BishBosh.Property.Reflectable			as Property.Reflectable@@ -142,8 +143,8 @@ 	Enum	y, 	Ord	x, 	Ord	y- ) => Property.ForsythEdwards.ReadsFEN (MaybePieceByCoordinates x y) where-	readsFEN s+ ) => Property.ExtendedPositionDescription.ReadsEPD (MaybePieceByCoordinates x y) where+	readsEPD s 		| length rows /= fromIntegral Cartesian.Ordinate.yLength || any ( 			(/= fromIntegral Cartesian.Abscissa.xLength) . length 		) rows		= []	-- No parse.@@ -154,11 +155,11 @@ 					concatMap ( 						\c -> case reads [c] of 							[(i, "")]	-> replicate i Nothing	-- Expand the runlength-code so that each row has the same length.-							_		-> [Just piece | (piece, []) <- Property.ForsythEdwards.readsFEN [c]] -- List-comprehension.+							_		-> [Just piece | (piece, []) <- Property.ExtendedPositionDescription.readsEPD [c]] -- List-comprehension. 					) 				) . Text.ShowList.splitOn (== rankSeparator) 			 ) . span (-				`elem` rankSeparator : concatMap Property.ForsythEdwards.showFEN Component.Piece.range ++ concatMap show [1 .. Cartesian.Abscissa.xLength]+				`elem` rankSeparator : concatMap Property.ExtendedPositionDescription.showEPD Component.Piece.range ++ concatMap show [1 .. Cartesian.Abscissa.xLength] 			 ) $ Data.List.Extra.trimStart s  instance (@@ -166,8 +167,8 @@ 	Enum	y, 	Ord	x, 	Ord	y- ) => Property.ForsythEdwards.ShowsFEN (MaybePieceByCoordinates x y) where-	showsFEN MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= foldr1 (+ ) => Property.ExtendedPositionDescription.ShowsEPD (MaybePieceByCoordinates x y) where+	showsEPD MkMaybePieceByCoordinates { deconstruct = byCoordinates }	= foldr1 ( 		flip (.)	-- Render the line with the highest y-coordinate first. 	 ) . Data.List.intersperse ( 		showChar rankSeparator	-- Separate the lines.@@ -176,10 +177,24 @@ 			\(runLength, maybePiece) -> Data.Maybe.maybe [ 				shows runLength	-- Represent empty squares. 			] (-				replicate runLength . Property.ForsythEdwards.showsFEN	-- Render each piece.+				replicate runLength . Property.ExtendedPositionDescription.showsEPD	-- Render each piece. 			) maybePiece 		) . ToolShed.Data.List.Runlength.encode 	 ) . listToRaster $ Data.Array.IArray.elems byCoordinates++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.ForsythEdwards.ReadsFEN (MaybePieceByCoordinates x y)++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Property.ForsythEdwards.ShowsFEN (MaybePieceByCoordinates x y)  instance ( 	Enum	x,
src-lib/BishBosh/UI/Command.hs view
@@ -119,7 +119,7 @@ data Command x y 	= Hint						-- ^ Request a move-suggestion. 	| Print UI.PrintObject.PrintObject		-- ^ Show the value of the specified object.-	| Quit						-- ^ Terminate ths application.+	| Quit						-- ^ Terminate this application. 	| Resign					-- ^ Admit defeat. 	| Restart					-- ^ Abandon the current game, & start afresh. 	| RollBack (Maybe Component.Move.NMoves)	-- ^ Roll-back the specified number of plies.@@ -147,7 +147,7 @@ 	), ( 		quitTag, 		Nothing,-		"Terminate ths application"+		"Terminate this application" 	), ( 		resignTag, 		Nothing,
src-lib/BishBosh/UI/PrintObject.hs view
@@ -29,6 +29,7 @@ -- * Constants 	boardTag, 	configurationTag,+	epdTag, 	fenTag, 	gameTag, 	helpTag,@@ -54,6 +55,10 @@ configurationTag	= "configuration"  -- | Input-format.+epdTag :: String+epdTag			= "epd"++-- | Input-format. fenTag :: String fenTag			= "fen" @@ -77,6 +82,7 @@ data PrintObject 	= Board 	| Configuration+	| EPD 	| FEN 	| Game 	| Help@@ -91,6 +97,7 @@ 	showsPrec _ printObject	= showString $ case printObject of 		Board		-> boardTag 		Configuration	-> configurationTag+		EPD		-> epdTag 		FEN		-> fenTag 		Game		-> gameTag 		Help		-> helpTag@@ -101,6 +108,7 @@ 	readsPrec _ s	= case Control.Arrow.first Data.List.Extra.lower `map` lex s of 		[("board", remainder)]		-> [(Board, remainder)] 		[("configuration", remainder)]	-> [(Configuration, remainder)]+		[("epd", remainder)]		-> [(EPD, remainder)] 		[("fen", remainder)]		-> [(FEN, remainder)] 		[("game", remainder)]		-> [(Game, remainder)] 		[("help", remainder)]		-> [(Help, remainder)]@@ -110,7 +118,7 @@  -- | The constant unordered list of possible values. range :: [PrintObject]-range	= [Board, Configuration, FEN, Game, Help, Moves, PGN]+range	= [Board, Configuration, EPD, FEN, Game, Help, Moves, PGN]  -- | Replace the first word of the specified string with the name of a command of which it is an unambiguous case-insensitive prefix. autoComplete :: ShowS@@ -120,6 +128,7 @@ 			tag	<- [ 				boardTag, 				configurationTag,+				epdTag, 				fenTag, 				gameTag, 				helpTag,
src-test/BishBosh/Test/HUnit/Model/Game.hs view
@@ -45,6 +45,7 @@ import qualified	BishBosh.Model.Game				as Model.Game import qualified	BishBosh.Model.GameTerminationReason		as Model.GameTerminationReason import qualified	BishBosh.Notation.MoveNotation			as Notation.MoveNotation+import qualified	BishBosh.Property.ExtendedPositionDescription	as Property.ExtendedPositionDescription import qualified	BishBosh.Property.ForsythEdwards		as Property.ForsythEdwards import qualified	BishBosh.Test.HUnit.Cartesian.Coordinates	as Test.HUnit.Cartesian.Coordinates import qualified	BishBosh.Text.ShowList				as Text.ShowList@@ -267,6 +268,30 @@ 		[(eitherQualifiedMove, "")]	-> Model.Game.isValidEitherQualifiedMove eitherQualifiedMove ( 			Property.ForsythEdwards.readFEN "r2qkbnr/ppp1pppp/2np4/5b2/3P4/NQP5/PP1BPPPP/R3KBNR w KQkq - 5 6"	:: Game 		 ) ~? "long Castle through legal check failed."-		_				-> Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.Model.Game.testCases:\tfailed to parse " $ shows longCastle "."+		_				-> Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.Model.Game.testCases:\tfailed to parse " $ shows longCastle ".",+	let+		epds :: [String]+		epds	= [+			"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq -",			-- Initial position.+			"rnbqkbnr/pppp1ppp/8/3Pp3/8/8/PPP1PPPP/RNBQKBNR w KQkq e6",		-- Double Pawn-advance leading to en-passant option.+			"rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3",		-- Double Pawn-advance, but no actual en-passant option.+			"rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6",		-- Double Pawn-advance, but no actual en-passant option.+			" rnbqkbnr/pppppppp/8/8/1P6/8/P1PPPPPP/RNBQKBNR  w\t Kq \r  b3",	-- Extra white space & potential parser confusion between Casteable Rooks & En-passant destination fields.+			"rnbqkr2/p2pbp1p/1pp4n/6N1/PP2pRpP/2N5/R1PPPPP1/2BQKB2 b - -"		-- Neither Casteable Rooks nor En-passant destination are defined.+		 ]++		parseFailures :: [(String, String)]+		parseFailures	= filter (+			uncurry (/=)+		 ) $ map (+			\epd -> (+				epd,+				case Property.ExtendedPositionDescription.readsEPD epd of+					[(game, "")]		-> Property.ExtendedPositionDescription.showEPD (game :: Game)+					[(_, remainder)]	-> Control.Exception.throw . Data.Exception.mkRedundantData . showString "BishBosh.Test.HUnit.Model.Game.testCases:\tparsed EPD=" . shows epd . showString ", but leaving " $ shows remainder " unparsed."+					_			-> Control.Exception.throw . Data.Exception.mkParseFailure . showString "BishBosh.Test.HUnit.Model.Game.testCases:\tfailed to parse EPD=" $ shows epd "."+			) -- Pair.+		 ) epds+	in not (null parseFailures) ~? (showString "BishBosh.Test.HUnit.Model.Game.testCases:\tfailed to correctly parse EPDs=" $ shows parseFailures ".")  ] 
src-test/BishBosh/Test/HUnit/Model/GameTree.hs view
@@ -70,8 +70,6 @@ 	sortAvailableMoves :: ( 		Integral	x, 		Integral	y,-		Read		x,-		Read		y, 		Show		x, 		Show		y 	 ) => Maybe Attribute.CaptureMoveSortAlgorithm.CaptureMoveSortAlgorithm -> String -> [Component.Turn.Turn x y]
src-test/BishBosh/Test/QuickCheck/Input/UIOptions.hs view
@@ -41,7 +41,7 @@  ) => Test.QuickCheck.Arbitrary (Input.UIOptions.UIOptions row column) where 	arbitrary	= do 		eitherNativeUIOrCECPOptions	<- Test.QuickCheck.arbitrary-		moveNotation			<- const Test.QuickCheck.arbitrary `either` const (return {-to Gen-monad-} Notation.MoveNotation.coordinate) $ eitherNativeUIOrCECPOptions+		moveNotation			<- const Test.QuickCheck.arbitrary `either` const (return {-to Gen-monad-} Notation.MoveNotation.pureCoordinate) $ eitherNativeUIOrCECPOptions  		Input.UIOptions.mkUIOptions <$> return {-to Gen-monad-} moveNotation <*> fmap ( 			fmap $ succ . (`mod` 3)	-- maybePrintMoveTree.
src-test/BishBosh/Test/QuickCheck/Model/Game.hs view
@@ -119,12 +119,27 @@ 		f game	= Test.QuickCheck.label "Game.prop_fen/Half move clock" $ uncurry (&&) . ( 			(>= 0) &&& (<= Model.DrawReason.maximumConsecutiveRepeatablePlies) 		 ) . read . (-			!! 4+			!! 4	-- Half-move Clock. 		 ) . words $ Property.ForsythEdwards.showFEN game 	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f, 	let 		f :: Game -> Test.QuickCheck.Property-		f game	= Test.QuickCheck.label "Game.prop_fen/Full move number" $ (> (0 :: Component.Move.NMoves)) . read . (!! 5) . words $ Property.ForsythEdwards.showFEN game+		f game	= Test.QuickCheck.label "Game.prop_fen/Full move counter" $ (+			> (0 :: Component.Move.NMoves)+		 ) . read . (+			!! 5	-- Full Move Counter.+		 ) . words $ Property.ForsythEdwards.showFEN game+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: Game -> Test.QuickCheck.Property+		f game	= Test.QuickCheck.label "Game.prop_fen" . (+			\game'	-> and [+				uncurry (==) $ (($ game) &&& ($ game')) Model.Game.getNextLogicalColour,+				uncurry (==) . (($ game) &&& ($ game')) $ State.CastleableRooksByLogicalColour.unify . Model.Game.getCastleableRooksByLogicalColour,+				uncurry (==) $ (($ game) &&& ($ game')) Model.Game.getBoard,+				uncurry (==) $ (($ game) &&& ($ game')) Model.Game.getMaybeChecked+			]+		 ) . Property.ForsythEdwards.readFEN $ Property.ForsythEdwards.showFEN game 	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f, 	let 		f :: Game -> Test.QuickCheck.Property
− src-test/BishBosh/Test/QuickCheck/Notation/Coordinate.hs
@@ -1,97 +0,0 @@-{-# OPTIONS_GHC -fno-warn-orphans #-}-{--	Copyright (C) 2018 Dr. Alistair Ward--	This file is part of BishBosh.--	BishBosh is free software: you can redistribute it and/or modify-	it under the terms of the GNU General Public License as published by-	the Free Software Foundation, either version 3 of the License, or-	(at your option) any later version.--	BishBosh is distributed in the hope that it will be useful,-	but WITHOUT ANY WARRANTY; without even the implied warranty of-	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-	GNU General Public License for more details.--	You should have received a copy of the GNU General Public License-	along with BishBosh.  If not, see <http://www.gnu.org/licenses/>.--}-{- |- [@AUTHOR@]	Dr. Alistair Ward-- [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.--}--module BishBosh.Test.QuickCheck.Notation.Coordinate(--- * Types--- ** Type-synonyms---	Coordinate,--- * Constants-	results-) where--import			BishBosh.Test.QuickCheck.Component.Move()-import			Control.Arrow((&&&))-import qualified	BishBosh.Attribute.Rank		as Attribute.Rank-import qualified	BishBosh.Cartesian.Coordinates	as Cartesian.Coordinates-import qualified	BishBosh.Cartesian.Ordinate	as Cartesian.Ordinate-import qualified	BishBosh.Cartesian.Vector	as Cartesian.Vector-import qualified	BishBosh.Component.Move		as Component.Move-import qualified	BishBosh.Notation.Coordinate	as Notation.Coordinate-import qualified	BishBosh.Types			as T-import qualified	Data.Char-import qualified	Test.QuickCheck-import qualified	ToolShed.Test.ReversibleIO---- | Defines a concrete type for testing.-type Coordinate	= Notation.Coordinate.Coordinate T.X T.Y--instance (-	Enum	x,-	Enum	y,-	Ord	x,-	Ord	y- ) => Test.QuickCheck.Arbitrary (Notation.Coordinate.Coordinate x y) where-	{-# SPECIALISE instance Test.QuickCheck.Arbitrary Coordinate #-}-	arbitrary	= do-		move	<- Test.QuickCheck.arbitrary--		Notation.Coordinate.mkCoordinate move `fmap` if abs (-			Cartesian.Vector.getXDistance (Component.Move.measureDistance move :: Cartesian.Vector.VectorInt)-		 ) <= 1 && (-			Cartesian.Coordinates.getY . Component.Move.getSource &&& Cartesian.Coordinates.getY . Component.Move.getDestination $ move-		 ) `elem` [-			(succ Cartesian.Ordinate.yMin, Cartesian.Ordinate.yMin),	-- Black moving down.-			(pred Cartesian.Ordinate.yMax, Cartesian.Ordinate.yMax)		-- White moving up.-		 ]-			then Test.QuickCheck.oneof [-				return {-to Gen-monad-} Nothing,-				Test.QuickCheck.elements $ map Just Attribute.Rank.promotionProspects	-- CAVEAT: move & promotionRank are still unlikely to be compatible.-			]-			else return {-to Gen-monad-} Nothing---- | The constant test-results for this data-type.-results :: IO [Test.QuickCheck.Result]-results	= sequence [-	let-		f :: Coordinate -> Test.QuickCheck.Property-		f	= Test.QuickCheck.label "Coordinate.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace-	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,-	let-		f :: String -> Test.QuickCheck.Property-		f garbage	= Test.QuickCheck.label "Coordinate.prop_read" $ case (-			reads garbage :: [(Notation.Coordinate.Coordinate Int Int, String)]-		 ) of-			[_]	-> True-			_	-> True	-- Unless the read-implementation throws an exception.-	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,-	let-		f :: Coordinate -> String -> Test.QuickCheck.Property-		f coordinate	= Test.QuickCheck.label "Coordinate.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (-			(-				`elem` concatMap show Attribute.Rank.promotionProspects-			) . Data.Char.toLower-		 ) coordinate-	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 2048 } f- ]
+ src-test/BishBosh/Test/QuickCheck/Notation/PureCoordinate.hs view
@@ -0,0 +1,97 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2018 Dr. Alistair Ward++	This file is part of BishBosh.++	BishBosh is free software: you can redistribute it and/or modify+	it under the terms of the GNU General Public License as published by+	the Free Software Foundation, either version 3 of the License, or+	(at your option) any later version.++	BishBosh is distributed in the hope that it will be useful,+	but WITHOUT ANY WARRANTY; without even the implied warranty of+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+	GNU General Public License for more details.++	You should have received a copy of the GNU General Public License+	along with BishBosh.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties.+-}++module BishBosh.Test.QuickCheck.Notation.PureCoordinate(+-- * Types+-- ** Type-synonyms+--	PureCoordinate,+-- * Constants+	results+) where++import			BishBosh.Test.QuickCheck.Component.Move()+import			Control.Arrow((&&&))+import qualified	BishBosh.Attribute.Rank			as Attribute.Rank+import qualified	BishBosh.Cartesian.Coordinates		as Cartesian.Coordinates+import qualified	BishBosh.Cartesian.Ordinate		as Cartesian.Ordinate+import qualified	BishBosh.Cartesian.Vector		as Cartesian.Vector+import qualified	BishBosh.Component.Move			as Component.Move+import qualified	BishBosh.Notation.PureCoordinate	as Notation.PureCoordinate+import qualified	BishBosh.Types				as T+import qualified	Data.Char+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO++-- | Defines a concrete type for testing.+type PureCoordinate	= Notation.PureCoordinate.PureCoordinate T.X T.Y++instance (+	Enum	x,+	Enum	y,+	Ord	x,+	Ord	y+ ) => Test.QuickCheck.Arbitrary (Notation.PureCoordinate.PureCoordinate x y) where+	{-# SPECIALISE instance Test.QuickCheck.Arbitrary PureCoordinate #-}+	arbitrary	= do+		move	<- Test.QuickCheck.arbitrary++		Notation.PureCoordinate.mkPureCoordinate move `fmap` if abs (+			Cartesian.Vector.getXDistance (Component.Move.measureDistance move :: Cartesian.Vector.VectorInt)+		 ) <= 1 && (+			Cartesian.Coordinates.getY . Component.Move.getSource &&& Cartesian.Coordinates.getY . Component.Move.getDestination $ move+		 ) `elem` [+			(succ Cartesian.Ordinate.yMin, Cartesian.Ordinate.yMin),	-- Black moving down.+			(pred Cartesian.Ordinate.yMax, Cartesian.Ordinate.yMax)		-- White moving up.+		 ]+			then Test.QuickCheck.oneof [+				return {-to Gen-monad-} Nothing,+				Test.QuickCheck.elements $ map Just Attribute.Rank.promotionProspects	-- CAVEAT: move & promotionRank are still unlikely to be compatible.+			]+			else return {-to Gen-monad-} Nothing++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	let+		f :: PureCoordinate -> Test.QuickCheck.Property+		f	= Test.QuickCheck.label "PureCoordinate.prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: String -> Test.QuickCheck.Property+		f garbage	= Test.QuickCheck.label "PureCoordinate.prop_read" $ case (+			reads garbage :: [(Notation.PureCoordinate.PureCoordinate Int Int, String)]+		 ) of+			[_]	-> True+			_	-> True	-- Unless the read-implementation throws an exception.+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 256 } f,+	let+		f :: PureCoordinate -> String -> Test.QuickCheck.Property+		f coordinate	= Test.QuickCheck.label "PureCoordinate.prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (+			(+				`elem` concatMap show Attribute.Rank.promotionProspects+			) . Data.Char.toLower+		 ) coordinate+	in Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs { Test.QuickCheck.maxSuccess = 2048 } f+ ]
src-test/Main.hs view
@@ -68,8 +68,8 @@ import qualified	BishBosh.Test.QuickCheck.Model.GameTree						as Test.QuickCheck.Model.GameTree import qualified	BishBosh.Test.QuickCheck.Model.MoveFrequency					as Test.QuickCheck.Model.MoveFrequency import qualified	BishBosh.Test.QuickCheck.Model.Result						as Test.QuickCheck.Model.Result-import qualified	BishBosh.Test.QuickCheck.Notation.Coordinate					as Test.QuickCheck.Notation.Coordinate import qualified	BishBosh.Test.QuickCheck.Notation.ICCFNumeric					as Test.QuickCheck.Notation.ICCFNumeric+import qualified	BishBosh.Test.QuickCheck.Notation.PureCoordinate				as Test.QuickCheck.Notation.PureCoordinate import qualified	BishBosh.Test.QuickCheck.Notation.Smith						as Test.QuickCheck.Notation.Smith import qualified	BishBosh.Test.QuickCheck.Search.KillerMoves					as Test.QuickCheck.Search.KillerMoves -- import qualified	BishBosh.Test.QuickCheck.Search.Search						as Test.QuickCheck.Search.Search@@ -127,8 +127,8 @@ 	Test.QuickCheck.Component.Move.results, 	Test.QuickCheck.Component.QualifiedMove.results, 	Test.QuickCheck.Component.Turn.results,-	Test.QuickCheck.Notation.Coordinate.results, 	Test.QuickCheck.Notation.ICCFNumeric.results,+	Test.QuickCheck.Notation.PureCoordinate.results, 	Test.QuickCheck.Notation.Smith.results, 	Test.QuickCheck.Model.GameTerminationReason.results, 	Test.QuickCheck.Model.Result.results,