@knowvah/dot-engine 2.6.12 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README.md +1 -1
  2. package/dist/api.js +18 -4
  3. package/dist/api.js.map +3 -3
  4. package/dist/common/attr-get.d.ts +30 -0
  5. package/dist/common/attr-get.d.ts.map +1 -0
  6. package/dist/common/htmltable-emit-fill.d.ts +20 -2
  7. package/dist/common/htmltable-emit-fill.d.ts.map +1 -1
  8. package/dist/common/htmltable-emit.d.ts.map +1 -1
  9. package/dist/common/htmltable-lex-expat.d.ts.map +1 -1
  10. package/dist/common/htmltable-pos-runs.d.ts +7 -4
  11. package/dist/common/htmltable-pos-runs.d.ts.map +1 -1
  12. package/dist/common/htmltable.d.ts.map +1 -1
  13. package/dist/common/libm-trig.d.ts +5 -0
  14. package/dist/common/libm-trig.d.ts.map +1 -0
  15. package/dist/common/make-label.d.ts.map +1 -1
  16. package/dist/common/multicolor.d.ts +21 -13
  17. package/dist/common/multicolor.d.ts.map +1 -1
  18. package/dist/common/poly-gencode.d.ts +1 -2
  19. package/dist/common/poly-gencode.d.ts.map +1 -1
  20. package/dist/common/poly-init.d.ts +2 -12
  21. package/dist/common/poly-init.d.ts.map +1 -1
  22. package/dist/common/splines-clip.d.ts +7 -0
  23. package/dist/common/splines-clip.d.ts.map +1 -1
  24. package/dist/gvc/context.d.ts +6 -0
  25. package/dist/gvc/context.d.ts.map +1 -1
  26. package/dist/gvc/device-cluster.d.ts +15 -0
  27. package/dist/gvc/device-cluster.d.ts.map +1 -1
  28. package/dist/gvc/device.d.ts.map +1 -1
  29. package/dist/gvc/first-layer.d.ts +9 -0
  30. package/dist/gvc/first-layer.d.ts.map +1 -0
  31. package/dist/gvc/gvrender-set-style.d.ts +28 -0
  32. package/dist/gvc/gvrender-set-style.d.ts.map +1 -0
  33. package/dist/gvc/usershape.d.ts +18 -0
  34. package/dist/gvc/usershape.d.ts.map +1 -1
  35. package/dist/index.js +2478 -912
  36. package/dist/index.js.map +4 -4
  37. package/dist/layout/dot/compound.d.ts.map +1 -1
  38. package/dist/layout/dot/edge-route-clip.d.ts +14 -4
  39. package/dist/layout/dot/edge-route-clip.d.ts.map +1 -1
  40. package/dist/layout/dot/edge-route-routing.d.ts.map +1 -1
  41. package/dist/layout/dot/graph-label.d.ts.map +1 -1
  42. package/dist/layout/neato/__fixtures__/dijkstra-f.d.ts +11 -0
  43. package/dist/layout/neato/__fixtures__/dijkstra-f.d.ts.map +1 -0
  44. package/dist/layout/neato/__fixtures__/hier-imds.d.ts +36 -0
  45. package/dist/layout/neato/__fixtures__/hier-imds.d.ts.map +1 -0
  46. package/dist/layout/neato/__fixtures__/hier-majorization.d.ts +32 -0
  47. package/dist/layout/neato/__fixtures__/hier-majorization.d.ts.map +1 -0
  48. package/dist/layout/neato/cdt-surface.d.ts.map +1 -1
  49. package/dist/layout/neato/compute-hierarchy.d.ts +24 -0
  50. package/dist/layout/neato/compute-hierarchy.d.ts.map +1 -0
  51. package/dist/layout/neato/conjgrad-mkernel.d.ts +20 -0
  52. package/dist/layout/neato/conjgrad-mkernel.d.ts.map +1 -0
  53. package/dist/layout/neato/conjgrad.d.ts +19 -0
  54. package/dist/layout/neato/conjgrad.d.ts.map +1 -1
  55. package/dist/layout/neato/constrained-majorization.d.ts +26 -0
  56. package/dist/layout/neato/constrained-majorization.d.ts.map +1 -0
  57. package/dist/layout/neato/dijkstra.d.ts +33 -16
  58. package/dist/layout/neato/dijkstra.d.ts.map +1 -1
  59. package/dist/layout/neato/gts-triangle.d.ts +14 -0
  60. package/dist/layout/neato/gts-triangle.d.ts.map +1 -0
  61. package/dist/layout/neato/init.d.ts +2 -12
  62. package/dist/layout/neato/init.d.ts.map +1 -1
  63. package/dist/layout/neato/kkutils.d.ts +20 -0
  64. package/dist/layout/neato/kkutils.d.ts.map +1 -0
  65. package/dist/layout/neato/make-graph-data.d.ts +43 -0
  66. package/dist/layout/neato/make-graph-data.d.ts.map +1 -0
  67. package/dist/layout/neato/matrix-ops.d.ts +46 -0
  68. package/dist/layout/neato/matrix-ops.d.ts.map +1 -1
  69. package/dist/layout/neato/opt-arrangement.d.ts +20 -0
  70. package/dist/layout/neato/opt-arrangement.d.ts.map +1 -0
  71. package/dist/layout/neato/quad-prog-solve.d.ts +44 -0
  72. package/dist/layout/neato/quad-prog-solve.d.ts.map +1 -0
  73. package/dist/layout/neato/smart-ini-x.d.ts +9 -0
  74. package/dist/layout/neato/smart-ini-x.d.ts.map +1 -0
  75. package/dist/layout/neato/splines.d.ts +1 -1
  76. package/dist/layout/neato/splines.d.ts.map +1 -1
  77. package/dist/layout/neato/start.d.ts +4 -1
  78. package/dist/layout/neato/start.d.ts.map +1 -1
  79. package/dist/layout/neato/stress.d.ts +8 -0
  80. package/dist/layout/neato/stress.d.ts.map +1 -1
  81. package/dist/model/edge.d.ts +1 -1
  82. package/dist/model/edge.d.ts.map +1 -1
  83. package/dist/model/lazy-attrs.d.ts +10 -0
  84. package/dist/model/lazy-attrs.d.ts.map +1 -0
  85. package/dist/model/node.d.ts +1 -1
  86. package/dist/model/node.d.ts.map +1 -1
  87. package/dist/ortho/index.d.ts.map +1 -1
  88. package/dist/render/dot/edge-draw.d.ts +1 -1
  89. package/dist/render/dot/edge-draw.d.ts.map +1 -1
  90. package/dist/render/svg-multicolor.d.ts +2 -2
  91. package/dist/render/svg-multicolor.d.ts.map +1 -1
  92. package/dist/render.js +2358 -792
  93. package/dist/render.js.map +4 -4
  94. package/package.json +1 -1
  95. package/src/common/attr-get.ts +46 -0
  96. package/src/common/graph-init.ts +1 -1
  97. package/src/common/htmltable-emit-fill.ts +56 -11
  98. package/src/common/htmltable-emit.ts +4 -3
  99. package/src/common/htmltable-lex-expat.ts +21 -3
  100. package/src/common/htmltable-pos-runs.ts +11 -6
  101. package/src/common/htmltable.ts +28 -116
  102. package/src/common/libm-trig.ts +43 -0
  103. package/src/common/make-label.ts +14 -2
  104. package/src/common/multicolor.ts +88 -24
  105. package/src/common/poly-gencode.ts +16 -8
  106. package/src/common/poly-init.ts +23 -19
  107. package/src/common/postproc.ts +2 -2
  108. package/src/common/splines-clip.ts +15 -12
  109. package/src/common/splines-routespl.ts +2 -2
  110. package/src/common/textmeasure-lookup.ts +1 -1
  111. package/src/gvc/context.ts +8 -0
  112. package/src/gvc/device-cluster.ts +63 -8
  113. package/src/gvc/device.ts +16 -2
  114. package/src/gvc/first-layer.ts +26 -0
  115. package/src/gvc/gvrender-set-style.ts +114 -0
  116. package/src/gvc/usershape.ts +26 -0
  117. package/src/layout/dot/cluster.ts +1 -1
  118. package/src/layout/dot/compound.ts +3 -4
  119. package/src/layout/dot/conc.ts +1 -1
  120. package/src/layout/dot/edge-route-clip.ts +19 -7
  121. package/src/layout/dot/edge-route-routing.ts +11 -3
  122. package/src/layout/dot/fastgr.ts +2 -2
  123. package/src/layout/dot/graph-label.ts +1 -15
  124. package/src/layout/neato/__fixtures__/dijkstra-f.ts +17 -0
  125. package/src/layout/neato/__fixtures__/hier/c1554.gv +33 -0
  126. package/src/layout/neato/__fixtures__/hier/c1554.plain +26 -0
  127. package/src/layout/neato/__fixtures__/hier/c1554.xdot +161 -0
  128. package/src/layout/neato/__fixtures__/hier/cases/cycle.gv +1 -0
  129. package/src/layout/neato/__fixtures__/hier/cases/cycle.plain +10 -0
  130. package/src/layout/neato/__fixtures__/hier/cases/cycle.stderr +0 -0
  131. package/src/layout/neato/__fixtures__/hier/cases/dirnone.gv +1 -0
  132. package/src/layout/neato/__fixtures__/hier/cases/dirnone.plain +11 -0
  133. package/src/layout/neato/__fixtures__/hier/cases/dirnone.stderr +0 -0
  134. package/src/layout/neato/__fixtures__/hier/cases/epsilon.gv +1 -0
  135. package/src/layout/neato/__fixtures__/hier/cases/epsilon.plain +13 -0
  136. package/src/layout/neato/__fixtures__/hier/cases/epsilon.stderr +0 -0
  137. package/src/layout/neato/__fixtures__/hier/cases/levelsgap.gv +1 -0
  138. package/src/layout/neato/__fixtures__/hier/cases/levelsgap.plain +8 -0
  139. package/src/layout/neato/__fixtures__/hier/cases/levelsgap.stderr +0 -0
  140. package/src/layout/neato/__fixtures__/hier/cases/mds.gv +1 -0
  141. package/src/layout/neato/__fixtures__/hier/cases/mds.plain +10 -0
  142. package/src/layout/neato/__fixtures__/hier/cases/mds.stderr +0 -0
  143. package/src/layout/neato/__fixtures__/hier/cases/multiedge.gv +1 -0
  144. package/src/layout/neato/__fixtures__/hier/cases/multiedge.plain +10 -0
  145. package/src/layout/neato/__fixtures__/hier/cases/multiedge.stderr +0 -0
  146. package/src/layout/neato/__fixtures__/hier/cases/neglevelsgap.gv +1 -0
  147. package/src/layout/neato/__fixtures__/hier/cases/neglevelsgap.plain +8 -0
  148. package/src/layout/neato/__fixtures__/hier/cases/neglevelsgap.stderr +0 -0
  149. package/src/layout/neato/__fixtures__/hier/cases/startrandom.gv +1 -0
  150. package/src/layout/neato/__fixtures__/hier/cases/startrandom.plain +10 -0
  151. package/src/layout/neato/__fixtures__/hier/cases/startrandom.stderr +0 -0
  152. package/src/layout/neato/__fixtures__/hier/cases/startregular.gv +1 -0
  153. package/src/layout/neato/__fixtures__/hier/cases/startregular.plain +10 -0
  154. package/src/layout/neato/__fixtures__/hier/cases/startregular.stderr +0 -0
  155. package/src/layout/neato/__fixtures__/hier/cases/tdist.gv +1 -0
  156. package/src/layout/neato/__fixtures__/hier/cases/tdist.plain +13 -0
  157. package/src/layout/neato/__fixtures__/hier/cases/tdist.stderr +0 -0
  158. package/src/layout/neato/__fixtures__/hier/cases/undirected.gv +1 -0
  159. package/src/layout/neato/__fixtures__/hier/cases/undirected.plain +10 -0
  160. package/src/layout/neato/__fixtures__/hier/cases/undirected.stderr +0 -0
  161. package/src/layout/neato/__fixtures__/hier/hier-probe.gv +1 -0
  162. package/src/layout/neato/__fixtures__/hier/hier-probe.plain +16 -0
  163. package/src/layout/neato/__fixtures__/hier/hier-probe.xdot +62 -0
  164. package/src/layout/neato/__fixtures__/hier-imds.ts +151 -0
  165. package/src/layout/neato/__fixtures__/hier-majorization.ts +145 -0
  166. package/src/layout/neato/cdt-surface.ts +6 -16
  167. package/src/layout/neato/compute-hierarchy.ts +90 -0
  168. package/src/layout/neato/conjgrad-mkernel.ts +141 -0
  169. package/src/layout/neato/conjgrad.ts +208 -0
  170. package/src/layout/neato/constrained-majorization.ts +479 -0
  171. package/src/layout/neato/dijkstra.ts +218 -92
  172. package/src/layout/neato/edge-len.ts +2 -2
  173. package/src/layout/neato/fdp-adjust.ts +3 -3
  174. package/src/layout/neato/gts-triangle.ts +42 -0
  175. package/src/layout/neato/init.ts +57 -57
  176. package/src/layout/neato/kk.ts +2 -2
  177. package/src/layout/neato/kkutils.ts +96 -0
  178. package/src/layout/neato/make-graph-data.ts +166 -0
  179. package/src/layout/neato/matrix-ops.ts +138 -0
  180. package/src/layout/neato/opt-arrangement.ts +86 -0
  181. package/src/layout/neato/quad-prog-solve.ts +489 -0
  182. package/src/layout/neato/smart-ini-x.ts +503 -0
  183. package/src/layout/neato/splines.ts +4 -4
  184. package/src/layout/neato/start.ts +7 -6
  185. package/src/layout/neato/stress.ts +28 -0
  186. package/src/model/edge.ts +3 -2
  187. package/src/model/lazy-attrs.ts +36 -0
  188. package/src/model/node.ts +3 -2
  189. package/src/ortho/index.ts +2 -3
  190. package/src/parser/dot.js +1 -1
  191. package/src/parser/dot.pegjs +1 -1
  192. package/src/parser/index.ts +1 -1
  193. package/src/render/color-resolve.ts +2 -2
  194. package/src/render/dot/edge-draw.ts +6 -3
  195. package/src/render/dot.ts +1 -1
  196. package/src/render/svg-edge-split.ts +2 -2
  197. package/src/render/svg-multicolor.ts +4 -3
  198. package/src/render/svg-parallel-edge.ts +2 -2
@@ -0,0 +1,26 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+ /**
3
+ * The `GVDEVICE_DOES_LAYERS` check of `firstlayer`: a device without it prints
4
+ * one layer and warns. The one-layer effect is `renderGraph`'s `layered` flag
5
+ * (only svg has `beginLayer`; the other native layer-capable devices, ps/pov,
6
+ * are not ported); this file owns the warning.
7
+ */
8
+ import { agwarningf } from '../common/agerr.js';
9
+
10
+ /** Port format ids that spell a native `-T` name differently (`output_langname`). */
11
+ const NATIVE_LANGNAME: ReadonlyMap<string, string> = new Map([
12
+ ['cmapx-np', 'cmapx_np'],
13
+ ['imap-np', 'imap_np'],
14
+ ]);
15
+
16
+ /**
17
+ * Print `layers not supported in <output_langname> output` when the graph has
18
+ * more than one layer and the device cannot draw layers. Called after
19
+ * beginGraph, as emit_graph calls firstlayer after emit_begin_graph: for
20
+ * `-Tjson` the nested xdot render in json_begin_graph therefore warns first.
21
+ * @see lib/common/emit.c:firstlayer
22
+ */
23
+ export function warnLayersUnsupported(format: string, numLayers: number, doesLayers: boolean): void {
24
+ if (numLayers <= 1 || doesLayers) return;
25
+ agwarningf(`layers not supported in ${NATIVE_LANGNAME.get(format) ?? format} output`);
26
+ }
@@ -0,0 +1,114 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+
3
+ /**
4
+ * The warning half of `gvrender_set_style`, plus the style-list filters its
5
+ * callers apply first. The pen/width/fill mapping of the same C function is
6
+ * not duplicated here: the port resolves it through style-resolve.ts
7
+ * (parseStyleFlags, resolvePenType, resolvePenWidth), which already mirrors
8
+ * the token cases below. Every caller in the port runs inside a render with a
9
+ * render engine (`if (gvre)` in C), so no engine test is needed here.
10
+ *
11
+ * @see lib/gvc/gvrender.c:480 gvrender_set_style
12
+ */
13
+
14
+ import { agwarningf } from '../common/agerr.js';
15
+ import { parseSegsSilent } from '../common/multicolor.js';
16
+ import type { PolygonT } from '../common/types.js';
17
+ import type { Edge } from '../model/edge.js';
18
+
19
+ /** Tokens gvrender_set_style maps to pen, pen width or fill state. */
20
+ const SUPPORTED_STYLES: ReadonlySet<string> = new Set([
21
+ 'solid', 'dashed', 'dotted', 'invis', 'invisible', 'bold', 'setlinewidth',
22
+ 'filled', 'unfilled', 'tapered',
23
+ ]);
24
+
25
+ /** `fmod(orientation, 90)` bound of shapes.c:isBox. @see lib/common/shapes.c:isBox */
26
+ const BOX_ORIENTATION_TOLERANCE = 0.5;
27
+ const BOX_ORIENTATION_STEP = 90;
28
+ const BOX_SIDES = 4;
29
+ /** polygon_t.sides bound of shapes.c:isEllipse. @see lib/common/shapes.c:isEllipse */
30
+ const ELLIPSE_MAX_SIDES = 2;
31
+
32
+ /** The name C compares: parse_style stores a token's `(args)` after its NUL. */
33
+ function styleName(token: string): string {
34
+ const paren = token.indexOf('(');
35
+ return paren < 0 ? token : token.slice(0, paren);
36
+ }
37
+
38
+ /**
39
+ * Warn for every token the render engine cannot map, on every call.
40
+ * @see lib/gvc/gvrender.c:480 gvrender_set_style
41
+ */
42
+ export function gvrenderSetStyle(styles: readonly string[] | null): void {
43
+ if (styles === null) return;
44
+ for (const token of styles) {
45
+ const name = styleName(token);
46
+ if (!SUPPORTED_STYLES.has(name)) {
47
+ agwarningf(`gvrender_set_style: unsupported style ${name} - ignoring`);
48
+ }
49
+ }
50
+ }
51
+
52
+ /** @see lib/common/shapes.c:isBox */
53
+ function isBox(p: PolygonT | null): boolean {
54
+ if (p === null) return false;
55
+ return p.sides === BOX_SIDES
56
+ && Math.abs(p.orientation % BOX_ORIENTATION_STEP) < BOX_ORIENTATION_TOLERANCE
57
+ && p.distortion === 0 && p.skew === 0;
58
+ }
59
+
60
+ /** @see lib/common/shapes.c:isEllipse */
61
+ function isEllipse(p: PolygonT | null): boolean {
62
+ return p !== null && p.sides <= ELLIPSE_MAX_SIDES;
63
+ }
64
+
65
+ /**
66
+ * The node style list passed to the renderer: checkStyle removes the tokens
67
+ * it turns into polygon flags. `shape` is `ND_shape(n)->polygon` (null for
68
+ * records).
69
+ * @see lib/common/shapes.c:465 checkStyle
70
+ */
71
+ export function checkStyleTokens(styles: readonly string[], shape: PolygonT | null): string[] {
72
+ return styles.filter((p) => {
73
+ if (p === 'rounded' || p === 'diagonals' || p === 'radial') return false;
74
+ if (p === 'striped') return !isBox(shape);
75
+ if (p === 'wedged') return !isEllipse(shape);
76
+ return true;
77
+ });
78
+ }
79
+
80
+ /**
81
+ * The cluster style list passed to the renderer.
82
+ * @see lib/common/emit.c:367 checkClusterStyle
83
+ */
84
+ export function checkClusterStyleTokens(styles: readonly string[]): string[] {
85
+ return styles.filter((p) => p !== 'radial' && p !== 'striped' && p !== 'rounded');
86
+ }
87
+
88
+ /** Count of `ch` in `s`. */
89
+ function countChar(s: string, ch: string): number {
90
+ return [...s].filter((c) => c === ch).length;
91
+ }
92
+
93
+ /** True when emit_edge_graphics' multicolor() accepts the colour list. */
94
+ function multicolorTaken(color: string): boolean {
95
+ if (countChar(color, ';') === 0 || countChar(color, ':') === 0) return false;
96
+ const { error } = parseSegsSilent(color);
97
+ return error !== 1 && error !== 2;
98
+ }
99
+
100
+ /**
101
+ * How many extra `gvrender_set_style(job, styles)` calls emit_edge_graphics
102
+ * makes: one per bezier carrying an arrow, when the spline has several
103
+ * beziers, in the `;` multicolor branch (when its colour list parses) and in
104
+ * the plain branch. The tapered and parallel `:` branches make none.
105
+ * @see lib/common/emit.c:2047 multicolor · :2677 emit_edge_graphics
106
+ */
107
+ export function edgeStyleResets(e: Edge, styles: readonly string[]): number {
108
+ const spl = e.info.spl;
109
+ if (spl === undefined || spl.size <= 1 || styles.length === 0) return 0;
110
+ const color = e.attrs.get('color') ?? '';
111
+ const otherBranch = styles.includes('tapered') || countChar(color, ':') > 0;
112
+ if (otherBranch && !multicolorTaken(color)) return 0;
113
+ return spl.list.filter((bz) => bz.sflag !== 0 || bz.eflag !== 0).length;
114
+ }
@@ -15,6 +15,7 @@
15
15
 
16
16
  import { invalidArgType } from '../errors.js';
17
17
  import type { ImageSizer } from '../common/htmltable-types.js';
18
+ import { findImageBytes, type ImageResolver } from './image-resolver.js';
18
19
 
19
20
  export type { ImageSizer } from '../common/htmltable-types.js';
20
21
 
@@ -37,3 +38,28 @@ export function setImageSizer(sizer: ImageSizer | null): void {
37
38
  export function findImageSize(src: string): { w: number; h: number } | null {
38
39
  return activeSizer !== null ? activeSizer(src) : null;
39
40
  }
41
+
42
+ /**
43
+ * `strerror(ENOENT)`: the port has no filesystem, so an image the caller
44
+ * cannot supply is C's missing file (AD-11).
45
+ */
46
+ export const STRERROR_ENOENT = 'No such file or directory';
47
+
48
+ /**
49
+ * Whether the caller supplies `name` at all: a size from `sizer` (default: the
50
+ * global one) or resolver bytes (a per-context `resolver` replaces the global). Mirrors gvusershape_open
51
+ * finding the file.
52
+ */
53
+ export function imageIsSupplied(name: string, sizer?: ImageSizer, resolver?: ImageResolver): boolean {
54
+ const size = sizer !== undefined ? sizer(name) : findImageSize(name);
55
+ return size !== null || findImageBytes(name, resolver) !== null;
56
+ }
57
+
58
+ /**
59
+ * The `agwarningf` text `gvusershape_file_access` prints when it cannot open
60
+ * `name`. C does not cache a failed open, so every sizing request repeats it.
61
+ * @see lib/gvc/gvusershape.c:gvusershape_file_access
62
+ */
63
+ export function imageOpenWarning(name: string): string {
64
+ return `${STRERROR_ENOENT} while opening ${name}`;
65
+ }
@@ -298,7 +298,7 @@ export function markClusterNode(clust: Graph, n: Node, g: Graph): void {
298
298
  if ((n.info.ranktype ?? 0) !== 0) {
299
299
  // C warns with the ENCLOSING graph's name, not the cluster's.
300
300
  // @see lib/dotgen/cluster.c:317-320
301
- agwarningf(`${n.name} was already in a rankset, deleted from cluster ${g.name}`, 'error');
301
+ agwarningf(`${n.name} was already in a rankset, deleted from cluster ${g.name}`);
302
302
  agDeleteFromCluster(clust, n);
303
303
  return;
304
304
  }
@@ -12,10 +12,9 @@ import type { Edge } from '../../model/edge.js';
12
12
  import {
13
13
  inBoxf, midPointf, splineIntersectf, boxIntersectf,
14
14
  } from './compound-clip.js';
15
- import { arrowEndClip, tailArrowEndClip, arrowClipLength } from './edge-route-clip.js';
15
+ import { arrowEndClip, tailArrowEndClip, arrowClipLength, distFused } from './edge-route-clip.js';
16
16
  import { arrowDrawOpsForEnd, edgeArrowName, edgeArrowsize } from './edge-route-arrow.js';
17
17
  import { edgePenwidthAttr, edgeRenderPenwidth } from './edge-route-helpers.js';
18
- import { dist } from '../../common/arrows-geometry.js';
19
18
 
20
19
  // Re-export geometry helpers so existing callers (tests) import from one place.
21
20
  export {
@@ -67,7 +66,7 @@ function arrowEndClipIdx(state: ClipState, endp: number): number {
67
66
  const elen = arrowClipLength(edgeArrowName(e, 'head'), edgeArrowsize(e), edgePenwidthAttr(e));
68
67
  bez.eflag = bez.eflag || 1;
69
68
  bez.ep = { ...bez.list[endp + 3] };
70
- if (endp > state.starti && dist(bez.list[endp], bez.list[endp + 3]) < elen) endp -= 3;
69
+ if (endp > state.starti && distFused(bez.list[endp], bez.list[endp + 3]) < elen) endp -= 3;
71
70
  const seg = [bez.list[endp], bez.list[endp + 1], bez.list[endp + 2], bez.list[endp + 3]];
72
71
  const clipped = arrowEndClip(seg, bez.ep, elen);
73
72
  for (let k = 0; k < 4; k++) bez.list[endp + k] = clipped[k];
@@ -83,7 +82,7 @@ function arrowStartClipIdx(state: ClipState, startp: number, endp: number): numb
83
82
  const slen = arrowClipLength(edgeArrowName(e, 'tail'), edgeArrowsize(e), edgePenwidthAttr(e));
84
83
  bez.sflag = bez.sflag || 1;
85
84
  bez.sp = { ...bez.list[startp] };
86
- if (endp > startp && dist(bez.list[startp], bez.list[startp + 3]) < slen) startp += 3;
85
+ if (endp > startp && distFused(bez.list[startp], bez.list[startp + 3]) < slen) startp += 3;
87
86
  const seg = [bez.list[startp], bez.list[startp + 1], bez.list[startp + 2], bez.list[startp + 3]];
88
87
  const clipped = tailArrowEndClip(seg, bez.sp, slen);
89
88
  for (let k = 0; k < 4; k++) bez.list[startp + k] = clipped[k];
@@ -293,7 +293,7 @@ export function fillRankVlist(g: Graph, r: number, root: Graph): number {
293
293
  rankArr[r].v = rootRank.v;
294
294
  rankArr[r].vStart = lead.info.order ?? 0;
295
295
  const maxi = computeMaxi(g, r);
296
- if (maxi === -1) agwarningf(`degenerate concentrated rank ${g.name},${r}`, 'error');
296
+ if (maxi === -1) agwarningf(`degenerate concentrated rank ${g.name},${r}`);
297
297
  rankArr[r].n = maxi + 1;
298
298
  return 0;
299
299
  }
@@ -218,19 +218,31 @@ export function makeEllipseInsideFn(
218
218
  }
219
219
 
220
220
  /**
221
- * Clip path START to the tail arrowhead base (symmetric to arrowEndClip).
221
+ * Clip path START to the tail arrowhead base (the arrowEndClip counterpart).
222
222
  *
223
- * path4[0] = tail node boundary (inside arrowhead sphere); after clip,
224
- * path4[0] = arrowhead base (elen from tailTip).
223
+ * Ports the bezier part of lib/common/arrows.c:arrowStartClip (:313-339); the
224
+ * `spl->sflag/sp` bookkeeping and the `startp += 3` step live in the caller
225
+ * (compound.ts:arrowStartClipIdx). Line map (C -> here):
226
+ * :323-326 sp[0..2] = ps[startp+3..], sp[3] = spl->sp -> `sp` below
227
+ * :328 if (slen > 0) -> `elen > 0`
228
+ * :329-330 inside_context {p = &sp[3], r = &slen} -> `inside` (centre = tip)
229
+ * :331 bezier_clip(&ctx, inside, sp, false) -> bezierClipNode, right
230
+ * inside, in ABSOLUTE coordinates (centre 0,0), as C does
231
+ * :334-337 ps[startp..startp+3] = sp[3..0] -> returned array
232
+ * :281-283 inside(): DIST(p, a.p[0]) <= a.r[0] -> distFused <= elen
233
+ * path4[0] is the tip (spl->sp) at every call site, so elen <= 0 returns the
234
+ * same points.
225
235
  *
226
- * @see lib/common/arrows.c:arrowEndClip
236
+ * @see lib/common/arrows.c:arrowStartClip
227
237
  */
228
238
  export function tailArrowEndClip(
229
239
  path4: Point[],
230
240
  tailTip: Point,
231
241
  elen: number,
232
242
  ): Point[] {
233
- if (elen <= 0) return path4;
234
- const inside = (lx: number, ly: number): boolean => Math.hypot(lx, ly) <= elen;
235
- return bezierClipNode(path4, tailTip.x, tailTip.y, inside, true);
243
+ const sp: Point[] = [path4[3]!, path4[2]!, path4[1]!, tailTip];
244
+ const clipped = elen > 0
245
+ ? bezierClipNode(sp, 0, 0, (x, y) => distFused({ x, y }, tailTip) <= elen, false)
246
+ : sp;
247
+ return [clipped[3]!, clipped[2]!, clipped[1]!, clipped[0]!];
236
248
  }
@@ -14,7 +14,7 @@ import {
14
14
  normalizeVec, negateVec, offsetPoint, clipToNodeBox,
15
15
  } from './edge-route-geom.js';
16
16
  import type { NodeBox } from './edge-route-geom.js';
17
- import { bezierClipNode, makeBoxInsideFn, makeEllipseInsideFn, arrowEndClip, DEFAULT_NODEPENWIDTH } from './edge-route-clip.js';
17
+ import { bezierClipNode, makeBoxInsideFn, makeEllipseInsideFn, arrowEndClip, distFused, DEFAULT_NODEPENWIDTH } from './edge-route-clip.js';
18
18
  import { computeSpline } from './edge-route-poly.js';
19
19
  import {
20
20
  makeTailBox, makeHeadBox, makeRankBox, makeMaximalBbox,
@@ -154,9 +154,17 @@ export function clipToNodes(
154
154
  const step2 = clip.head
155
155
  ? bezierClipNode(step1, headBox.center.x, headBox.center.y, nodeInsideFn(headBox), false)
156
156
  : step1;
157
- const arrowTip = step2[3] as Point;
157
+ // arrows.c:arrowEndClip(e, ps, startp, endp, ...) with startp = endp = 0 for this
158
+ // single-segment spline: spl->ep = ps[endp + 3]; the back-up fires only when
159
+ // endp > startp && DIST(ps[endp], ps[endp + 3]) < elen.
160
+ const startp = 0;
161
+ let endp = 0;
162
+ const arrowTip = step2[endp + 3] as Point;
158
163
  const elen = normalArrowLen(penwidth);
159
- const clipped = arrowEndClip(step2, arrowTip, elen);
164
+ if (endp > startp && distFused(step2[endp] as Point, step2[endp + 3] as Point) < elen) {
165
+ endp -= 3;
166
+ }
167
+ const clipped = arrowEndClip(step2.slice(endp, endp + 4), arrowTip, elen);
160
168
  const arrowDir = normalizeVec({
161
169
  x: (clipped[3] as Point).x - arrowTip.x,
162
170
  y: (clipped[3] as Point).y - arrowTip.y,
@@ -167,7 +167,7 @@ export function copyVirtualEdgeInfo(e: Edge, orig: Edge): void {
167
167
  * @see lib/dotgen/fastgr.c:new_virtual_edge
168
168
  */
169
169
  export function newVirtualEdge(u: Node, v: Node, orig: Edge | null): Edge {
170
- const e = new EdgeClass(u, v, '');
170
+ const e = new EdgeClass(u, v, '', true);
171
171
  e.info.edge_type = VIRTUAL;
172
172
  if (orig) {
173
173
  copyVirtualEdgeInfo(e, orig);
@@ -353,7 +353,7 @@ export function removeFromRank(g: Graph, n: Node): void {
353
353
  * @see lib/dotgen/fastgr.c:virtual_node
354
354
  */
355
355
  export function virtualNode(g: Graph): Node {
356
- const n = new NodeClass(0, '', g.root);
356
+ const n = new NodeClass(0, '', g.root, true);
357
357
  n.info.node_type = VIRTUAL;
358
358
  // C: ND_lw(n) = ND_rw(n) = 1; ND_ht(n) = 1; ND_UF_size(n) = 1
359
359
  // @see lib/dotgen/fastgr.c:virtual_node
@@ -9,6 +9,7 @@
9
9
  import type { Graph } from '../../model/graph.js';
10
10
  import type { Point } from '../../model/geom.js';
11
11
  import type { TextMeasurer } from '../../common/textmeasure.js';
12
+ import { graphAttrInherited } from '../../common/attr-get.js';
12
13
  import { makeAnyLabel, DEFAULT_FONTSIZE, DEFAULT_FONTNAME, DEFAULT_COLOR } from '../../common/make-label.js';
13
14
  import { isHtmlValue, htmlValueContent } from '../../common/html-string.js';
14
15
  import { BOTTOM_IX, TOP_IX, RIGHT_IX, LEFT_IX } from './position-aux.js';
@@ -45,21 +46,6 @@ function readLabelPos(sg: Graph): number {
45
46
  return pos;
46
47
  }
47
48
 
48
- /**
49
- * Read a graph attribute with subgraph→root inheritance, mirroring C's
50
- * agxget (late_nnstring(sg, agfindgraphattr(sg, key), ...) in do_graph_label):
51
- * a cluster inherits `fontname`/`fontsize`/`fontcolor` set on an ancestor
52
- * (e.g. root `graph[fontname=Arial]`) when it sets none of its own.
53
- * @see lib/common/input.c:do_graph_label
54
- */
55
- function graphAttrInherited(sg: Graph, key: string): string | undefined {
56
- // Own value wins; otherwise the ancestor defaults SNAPSHOTTED when this
57
- // subgraph opened (not a live parent walk) — so an ancestor attribute set
58
- // later in statement order does not retroactively apply (2184).
59
- // @see lib/cgraph/graph.c:agsubg (parse-time defval copy)
60
- return sg.attrs.get(key) ?? sg.graphDefaultsSnapshot?.get(key);
61
- }
62
-
63
49
  /**
64
50
  * Graph/cluster label font, read through graphAttrInherited.
65
51
  * @internal also used by src/async/collect.ts to request the same face.
@@ -0,0 +1,17 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+ // Native 16.1 dijkstra_f rows (clang -O3, libneatogen.a of the oracle build), one hex
3
+ // float32 bit pattern per entry. Graphs: g9 = hierarchy graph from T22; r2/r5 =
4
+ // random weighted graphs (r5 is disconnected). Generated data: do not hand-edit.
5
+
6
+ export interface DijkstraFFixture {
7
+ n: number;
8
+ rows: { edges: number[]; ewgts: number[] }[];
9
+ /** expected[s][j] = float32 bits of dist(s -> j), as 8-digit hex */
10
+ expected: string[][];
11
+ }
12
+
13
+ export const DIJKSTRA_F_FIXTURES: Record<'g9' | 'r2' | 'r5', DijkstraFFixture> = {
14
+ g9: {"n":9,"rows":[{"edges":[0,1,2,4,8],"ewgts":[0,1,1,1,1]},{"edges":[1,0,3],"ewgts":[0,1,1]},{"edges":[2,0],"ewgts":[0,1]},{"edges":[3,1,4,5,6,7],"ewgts":[0,1,1,1,1,1]},{"edges":[4,0,3,6],"ewgts":[0,1,1,1]},{"edges":[5,3],"ewgts":[0,1]},{"edges":[6,3,4,8],"ewgts":[0,1,1,1]},{"edges":[7,3,8],"ewgts":[0,1,1]},{"edges":[8,0,6,7],"ewgts":[0,1,1,1]}],"expected":[["00000000","3f800000","3f800000","40000000","3f800000","40400000","40000000","40000000","3f800000"],["3f800000","00000000","40000000","3f800000","40000000","40000000","40000000","40000000","40000000"],["3f800000","40000000","00000000","40400000","40000000","40800000","40400000","40400000","40000000"],["40000000","3f800000","40400000","00000000","3f800000","3f800000","3f800000","3f800000","40000000"],["3f800000","40000000","40000000","3f800000","00000000","40000000","3f800000","40000000","40000000"],["40400000","40000000","40800000","3f800000","40000000","00000000","40000000","40000000","40400000"],["40000000","40000000","40400000","3f800000","3f800000","40000000","00000000","40000000","3f800000"],["40000000","40000000","40400000","3f800000","40000000","40000000","40000000","00000000","3f800000"],["3f800000","40000000","40000000","40000000","40000000","40400000","3f800000","3f800000","00000000"]]},
15
+ r2: {"n":50,"rows":[{"edges":[0,16,20,37,42],"ewgts":[0,0.6107177734375,0.779015064239502,1.5925718545913696,3.0918211936950684]},{"edges":[1,6,48,37,47,17,16],"ewgts":[0,2.5686447620391846,2.177841901779175,3.3810622692108154,2.657801628112793,1.791579246520996,1.6641427278518677]},{"edges":[2,9,49,46,36,35,3],"ewgts":[0,1.3611153364181519,4.08108377456665,2.2942681312561035,0.229284405708313,3.4956467151641846,4.5992937088012695]},{"edges":[3,33,2,6],"ewgts":[0,1.4863576889038086,4.5992937088012695,1.7348114252090454]},{"edges":[4,27,12,29,13,26,17],"ewgts":[0,4.651636123657227,1.8243635892868042,2.942603826522827,1.0076578855514526,4.7854084968566895,3.3405096530914307]},{"edges":[5,28,15,33,14,24],"ewgts":[0,4.146543025970459,3.035921812057495,0.8667697906494141,4.322223663330078,4.680764198303223]},{"edges":[6,13,1,10,33,29,3],"ewgts":[0,3.947115182876587,2.5686447620391846,1.2223533391952515,4.070518493652344,3.6621010303497314,1.7348114252090454]},{"edges":[7,27,41,47],"ewgts":[0,1.6796417236328125,0.9393562078475952,0.12917423248291016]},{"edges":[8,18,42],"ewgts":[0,4.590372562408447,2.572849988937378]},{"edges":[9,2,34,40],"ewgts":[0,1.3611153364181519,4.2000226974487305,0.41423046588897705]},{"edges":[10,6,32,44,19],"ewgts":[0,1.2223533391952515,2.507539749145508,4.895442008972168,3.69148325920105]},{"edges":[11,38,39,46,18,42],"ewgts":[0,0.8708902597427368,1.083899974822998,4.015132427215576,2.2474334239959717,1.0065081119537354]},{"edges":[12,4,29],"ewgts":[0,1.8243635892868042,2.315244674682617]},{"edges":[13,6,44,14,32,4,15,42],"ewgts":[0,3.947115182876587,0.3132797181606293,0.3442717492580414,0.8580286502838135,1.0076578855514526,2.0123953819274902,0.44054099917411804]},{"edges":[14,26,47,41,13,5,23],"ewgts":[0,3.7372684478759766,3.688253164291382,3.7473089694976807,0.3442717492580414,4.322223663330078,0.7705272436141968]},{"edges":[15,36,29,5,13,37,39,30],"ewgts":[0,4.194822311401367,4.76489782333374,3.035921812057495,2.0123953819274902,0.5969126224517822,4.6500020027160645,1.0265476703643799]},{"edges":[16,42,31,0,1],"ewgts":[0,3.977947235107422,4.627945899963379,0.6107177734375,1.6641427278518677]},{"edges":[17,33,48,4,1],"ewgts":[0,2.579831600189209,1.602760672569275,3.3405096530914307,1.791579246520996]},{"edges":[18,23,8,38,43,11,19],"ewgts":[0,3.5923361778259277,4.590372562408447,1.202156662940979,2.4953603744506836,2.2474334239959717,0.6456948518753052]},{"edges":[19,20,24,10,18],"ewgts":[0,4.786898612976074,2.2527260780334473,3.69148325920105,0.6456948518753052]},{"edges":[20,19,49,42,0,41,43],"ewgts":[0,4.786898612976074,2.322394847869873,4.407115459442139,0.779015064239502,4.914223670959473,0.46865829825401306]},{"edges":[21,31],"ewgts":[0,3.2177133560180664]},{"edges":[22,24,38],"ewgts":[0,2.4678618907928467,2.29884934425354]},{"edges":[23,18,24,48,34,45,40,14,37],"ewgts":[0,3.5923361778259277,0.41297802329063416,3.471560478210449,2.743868827819824,0.26242920756340027,2.520932674407959,0.7705272436141968,3.433049440383911]},{"edges":[24,23,39,5,22,19,31],"ewgts":[0,0.41297802329063416,3.2836198806762695,4.680764198303223,2.4678618907928467,2.2527260780334473,2.867274284362793]},{"edges":[25,35],"ewgts":[0,3.687930107116699]},{"edges":[26,14,34,47,4,32,39],"ewgts":[0,3.7372684478759766,3.5176753997802734,4.536037921905518,4.7854084968566895,0.2583629786968231,0.12705513834953308]},{"edges":[27,4,38,7,41],"ewgts":[0,4.651636123657227,2.2154366970062256,1.6796417236328125,4.684259414672852]},{"edges":[28,31,5,43,40],"ewgts":[0,1.828391671180725,4.146543025970459,3.884444236755371,4.2690839767456055]},{"edges":[29,48,15,39,4,6,12,37],"ewgts":[0,1.3676930665969849,4.76489782333374,3.2299411296844482,2.942603826522827,3.6621010303497314,2.315244674682617,0.303432434797287]},{"edges":[30,46,15],"ewgts":[0,2.108924388885498,1.0265476703643799]},{"edges":[31,28,16,21,49,24],"ewgts":[0,1.828391671180725,4.627945899963379,3.2177133560180664,4.039309024810791,2.867274284362793]},{"edges":[32,13,10,26],"ewgts":[0,0.8580286502838135,2.507539749145508,0.2583629786968231]},{"edges":[33,44,46,6,17,5,3],"ewgts":[0,1.6364134550094604,2.133212089538574,4.070518493652344,2.579831600189209,0.8667697906494141,1.4863576889038086]},{"edges":[34,26,35,23,9,46],"ewgts":[0,3.5176753997802734,1.0942078828811646,2.743868827819824,4.2000226974487305,3.9099462032318115]},{"edges":[35,34,25,2],"ewgts":[0,1.0942078828811646,3.687930107116699,3.4956467151641846]},{"edges":[36,15,2],"ewgts":[0,4.194822311401367,0.229284405708313]},{"edges":[37,1,0,23,15,29],"ewgts":[0,3.3810622692108154,1.5925718545913696,3.433049440383911,0.5969126224517822,0.303432434797287]},{"edges":[38,11,27,18,22],"ewgts":[0,0.8708902597427368,2.2154366970062256,1.202156662940979,2.29884934425354]},{"edges":[39,49,29,45,24,11,48,40,26,15],"ewgts":[0,2.435215711593628,3.2299411296844482,1.4467240571975708,3.2836198806762695,1.083899974822998,3.706386089324951,2.385258197784424,0.12705513834953308,4.6500020027160645]},{"edges":[40,49,9,23,39,28],"ewgts":[0,3.032205104827881,0.41423046588897705,2.520932674407959,2.385258197784424,4.2690839767456055]},{"edges":[41,14,49,20,27,7],"ewgts":[0,3.7473089694976807,3.3405661582946777,4.914223670959473,4.684259414672852,0.9393562078475952]},{"edges":[42,16,8,20,13,0,11],"ewgts":[0,3.977947235107422,2.572849988937378,4.407115459442139,0.44054099917411804,3.0918211936950684,1.0065081119537354]},{"edges":[43,28,18,20],"ewgts":[0,3.884444236755371,2.4953603744506836,0.46865829825401306]},{"edges":[44,13,33,10],"ewgts":[0,0.3132797181606293,1.6364134550094604,4.895442008972168]},{"edges":[45,39,23],"ewgts":[0,1.4467240571975708,0.26242920756340027]},{"edges":[46,30,33,2,11,34],"ewgts":[0,2.108924388885498,2.133212089538574,2.2942681312561035,4.015132427215576,3.9099462032318115]},{"edges":[47,14,26,1,7],"ewgts":[0,3.688253164291382,4.536037921905518,2.657801628112793,0.12917423248291016]},{"edges":[48,29,1,23,39,17],"ewgts":[0,1.3676930665969849,2.177841901779175,3.471560478210449,3.706386089324951,1.602760672569275]},{"edges":[49,39,2,40,41,20,31],"ewgts":[0,2.435215711593628,4.08108377456665,3.032205104827881,3.3405661582946777,2.322394847869873,4.039309024810791]}],"expected":[["00000000","40119750","40d3a28a","40d28191","409147d8","40a73688","409afdfe","40a1fa90","40b544fc","40d187f3","40c21b83","40832584","4086c28d","40621239","40781ac5","400c2084","3f1c5800","40822046","406f8dde","408c7077","3f476d88","41074d52","40e7cf2c","4094b58b","40a1eca9","4142c54c","4094c297","40d7ba30","40a43a4f","3ff2b045","404dd379","40a7a322","408c7e15","40af6cff","40ec8351","4107c389","40cc4c3e","3fcbd965","409e3f00","4098d36d","40c44693","40b62f03","4045e066","3f9fb3c3","40761eff","409d1b5d","40aa660c","409dd85e","4050e06b","40467d80"],["40119750","00000000","41066eed","4089b5ea","40a43a12","40a79f2d","402464ad","40325dd0","40fe10a4","41095a62","40729fb6","40cbf12c","40bb8b82","40b9d4c4","40c4d90a","407e9724","3fd502a1","3fe55278","40c09296","40d53c1e","404372b2","41182826","41087be0","40b4c7e8","40c1ff06","4152ce7a","40c05c6e","408eee88","40ed05f6","4062ea0c","40a0250c","40c958ca","40c8a0f0","408be299","41064ad7","4117ccb7","4102c3c7","40586353","40d5d364","40bc4b98","4102b9b2","406e7c3a","40abbbdb","40617131","40c04019","40bd2dba","40d025df","402a196c","400b61c3","40ac0a68"],["40d3a289","41066eed","00000000","40932d6a","40cd2cb8","40a96a7f","40cab0fd","4105c6ae","4106add7","3fae3907","40e1b6c7","40a7d2fa","40f47864","40acedfc","40a22346","408d9248","40e72d89","40e03be6","40ea2960","40dec890","40cce94c","412cb53a","40e5aaf4","40897b1d","4096b23b","40e5dfdc","40893481","41054b15","40c16bf8","40aa61e8","408ce6f4","40f272f1","40917903","408dadeb","4092e017","405fb8ad","3e6ac988","40a0ac30","40c3b14f","408523ab","3fe33e88","40ed7e28","40bb06e5","40dbe88c","40b6f45f","4091e0ef","4012d54a","4107d7c7","40d6260c","4082983d"],["40d28192","4089b5ea","40932d6a","00000000","408e32dd","401699a4","3fde0e4d","40e2e4d2","40ce61d4","40bebbac","403d4230","409c425b","40c8940d","405be842","4071f0ce","40ac7318","40bef692","40821e39","40de98c1","40d4c1ba","40eb6f43","4130c7f3","40edd068","4091a090","409ed7ae","413c86a3","4091ad9c","40ff058c","40cffd4d","40acb382","40b74fd3","40fa9864","4089691a","3fbe40f8","40e96e56","410184e0","409a83b6","40b6693a","40b820b0","4095be72","40cbfd0c","40f0e25c","40781a15","40fa6e83","4047db7c","409a0662","4067a708","40dec2a0","40b5680a","40e3abbc"],["409147d8","40a43a12","40cd2cb8","408e32dd","00000000","4074be66","409e8d80","40a56b60","4080ac6f","40a19e76","408bf178","401d19ec","3fe984bf","3f80faef","3fad0c08","4041488e","40a4d2d8","4055cae9","4090e35c","4099389e","40aa3589","4109ed40","40a01b02","4007d656","40224491","411a601c","4007f06d","4094da34","40e7652d","403c539f","40817dc2","40ace2fe","3feeced1","403d453e","409bb8f1","40bebcb1","40d48304","404fbf0f","4054d696","40101219","40945d16","40a32cf6","3fb95e95","40b934c9","3fa9147c","4018a1fa","40a2e5e5","40a1492e","4089edf4","4095f656"],["40a73687","40a79f2d","40a96a7f","401699a4","4074be66","00000000","4082d065","40df4d1a","40ba8e2a","40d4f8c1","40a9edea","40886eb1","40b4c063","403440ee","404a497a","40424c8b","40bac187","405c951e","40cac517","40d31a59","40c02438","41131516","40d9fcbe","407b99cc","408b0404","413750f9","407bb3e4","40eb31e2","4084b07b","407bebcc","4081ffc0","40bf32aa","406b2adf","3f5de4a0","40d59aac","40f89e6c","40b0c0cb","4068805c","40a44d06","4081eac8","40ce3ed1","40dd0eb2","405072c1","40cf2378","40203428","408632b8","403fffb4","40db2ae8","40a19460","40cfd812"],["409afdff","402464ad","40cab0fd","3fde0e4d","409e8d80","4082d065","00000000","40ab613e","40debc78","40dd460a","3f9c7613","40a65ff0","40bf466a","407c9d89","4089530b","4091ff8f","408772ff","408b86f4","40b1e7ae","409d3e26","40b3ebb0","4138f545","40fe2b0c","40a1fb34","40af3252","41449bef","407f3f97","40e120de","4103c070","406a5fdd","40b2d90a","41057984","406eb692","404e27a2","40f03098","41099a2c","40d20749","407dcb4d","40c23e45","4083b0a1","40d004aa","40c97073","408c67ae","40c2eaf0","40885528","40aa6106","40ab5717","40a73f0c","4097e338","40d19dea"],["40a1fa90","40325dd0","4105c6ae","40e2e4d1","40a56b60","40df4d1b","40ab613e","00000000","40e59a56","40f0bd61","40d27ec3","409882d1","40dfcc90","40852ca4","407450bb","40c5922f","408e6f90","40928386","40a31c8d","40b7c615","40bae841","41315fee","40c634a8","4092d086","40a007a4","4141d2c9","4095496b","3fd6fe80","411b2545","40caa3ee","40e66baa","40fbc85a","409d8ded","40c39087","40ea9e4c","4106d106","410971d4","40c56092","407948f7","40995a41","40e37c01","3f7079a6","4093458d","40c9e781","408f3307","409b3658","4103e9e6","3e044640","409edfca","4088f520"],["40b544fc","40fe10a4","4106add7","40ce61d4","4080ac6f","40ba8e2a","40debc78","40e59a56","00000000","40e1cd6d","40cc2070","40651434","40bb0d9f","4040db66","4056e3f2","40a0d33e","40c8cffc","40eb91e4","4092e455","40a78ddd","40ce32ad","412a04bc","40d7f89c","40841a22","40915140","413a7797","4084272e","40d54d4a","4113ca13","40bda2de","40c1acb8","40ed11f6","4077c557","409ed196","40dbe7e8","40feeba8","410a58fd","40b3ed26","408e686f","40883804","40d48c0d","40e35bee","4024a993","40dd31ed","4054e82c","408c7ff4","40e314dc","40e17824","40e96702","40d6254e"],["40d187f3","41095a61","3fae3907","40bebbac","40a19e76","40d4f8c1","40dd460b","40f0bd62","40e1cd6c","00000000","40b62886","40788970","40dbffa6","40815fba","406d2a08","40b9208a","40e512f3","410026d9","40be9b1e","40b33a4e","40b89a42","4116ee18","40ba1cb2","403bd9b6","405647f1","4108b70f","403b4c7e","40df07e8","4095ddb6","40c0f116","40b87536","40c6e4ae","404bd583","40b93c2d","40866696","409b6a98","3fcb9238","40caa6ce","4098230d","40332ad2","3ed41604","40d92f1e","408f78a3","40c79982","408b661d","404ca55a","4069f1ce","40ec9b30","40cd03e1","405c9266"],["40c21b83","40729fb6","40e1b6c8","403d4230","408bf178","40a9edea","3f9c7613","40d27ec3","40cc2070","40b62886","00000000","407e84d7","40c652a8","40576579","406d6e05","40ac1848","40ae9083","40b2a479","408aca2a","406c4143","40db0934","412fa740","40e4b0ee","408f5f2b","409c9649","41310d2c","4031048d","40e2059c","41174f32","409c4d73","40ccf1c2","40f856ff","40207b88","408e3156","40c91312","40ec16d2","40e90d14","40a6032b","409b20c1","40392639","40a8e726","40eea0f7","4073974c","40daa428","406b723f","408adead","40d2749c","40ce5c91","40bf00bc","40aa8066"],["40832584","40cbf12c","40a7d2fa","409c425b","401d19ec","40886eb1","40a65ff0","409882d1","40651434","40788970","407e84d7","00000000","4088ee26","3fb938e8","3fe54a01","405d678a","4096b084","40b9726a","4004accd","402dffde","409c1335","4110f4ff","404add04","4023f552","403e638d","41182c1c","3f9b0094","40458662","40f574ab","408a0afc","408f8d40","40baf27c","3fbc129e","4059643a","409750f1","40ba54b1","40af2946","4081cdae","3f5ef2aa","3f8abd3c","405e06b0","40b13c75","3f80d542","40923064","3fe15275","4021f5be","40807bf7","409ca503","40994a06","40613931"],["4086c28d","40bb8b82","40f47864","40c8940c","3fe984bf","40b4c062","40bf466a","40dfcc8f","40bb0d9e","40dbffa5","40c652a8","4088ee26","00000000","40353fd7","404b4863","404dcc39","409a4d8d","40a546a4","40cb448c","40d399cd","409fb03e","41271dd8","40da7c32","407c98b4","408b8378","413790b3","407cb2cd","40cf3b64","4110e32f","40142cf8","4087bf97","40e7442e","406c29c8","409903ce","40d61a20","40f91de0","40ed2218","40279868","40a4cc7b","40826a3c","40cebe45","40dd8e26","405171aa","40aeaf7e","40494c9d","4086b22c","40cb3be6","40dbaa5d","406bb540","40d05786"],["40621239","40b9d4c4","40acedfc","405be842","3f80faef","403440ee","407c9d89","40852ca4","4040db66","40815fba","40576579","3fb938e8","40353fd7","00000000","3eb04463","4000cb16","4084941c","408b2430","40614940","4071f3c4","4089f6ce","40f39bc5","407fb88c","3f8eb1bc","3fc38e33","410a40be","3f8ee5ec","4091116a","40c72672","403a6a57","40427e0b","408ca443","3f5ba7c4","3ff98f8c","4076f46a","409e7df5","40b44448","4026fee7","4014591e","3f9f2944","40683cb4","4082ee3b","3ee18e97","4098f60e","3ea06633","3fb04904","4082a729","40810a72","4088f950","406b6f35"],["40781ac5","40c4d90a","40a22346","4071f0ce","3fad0c08","404a497a","4089530b","407450bb","4056e3f2","406d2a08","406d6e06","3fe54a00","404b4864","3eb04463","00000000","4016d3a2","408f9862","40962876","407751cc","405beb37","4094fb14","40e8977e","4069b000","3f454146","3f977d1a","4104be9a","3fbaf705","409c15b0","40bc222b","405072e3","40588697","40819ffc","3f99e4fb","4012d052","4060ebde","409379af","40a97992","403d0773","402a61aa","3fcb3a5d","4052a748","406fd3e9","3f48e97d","40a3fa54","3f28554b","3f8437eb","408dab6f","406c0c57","4087bf2f","4080bbe1"],["400c2084","407e9724","408d9248","40ac7318","4041488e","40424c8b","4091ff8f","40c5922e","40a0d33e","40b9208a","40ac1848","405d678a","404dcc39","4000cb16","4016d3a2","00000000","40333684","4077bb2c","40b10a2b","40b95f6c","403dfbe6","411a00a8","40c041d1","404823f4","4062922f","412a7383","40483e0c","40d176f6","40e5d6c0","3f667d04","3f8365ea","40cd09ce","4037b507","4079c5b3","40bbdfc0","40dee380","40863bfc","3f18cf44","408a921a","40505fb8","40b483e5","40c353c6","401cfce9","405bfa65","4014d7dc","4058ef98","4048ab93","40c16ffc","4011278a","40a94f02"],["3f1c5800","3fd502a1","40e72d8a","40bef692","40a4d2d8","40bac187","408772ff","408e6f90","40c8cffc","40e512f3","40ae9084","4096b084","409a4d8d","4084941c","408f9862","40333683","00000000","405d2a8c","408b51ef","409ffb77","3fb1e2c4","40fb0fa4","40fb5a2c","40a8408b","40b577a9","414c8acb","40a84d96","40c42f30","40b7c54f","40206e22","4074e978","40941822","40a00914","40c12341","41000728","41118908","40dfd73e","400d02b2","40b1ca00","40ac5e6c","40d7d193","40ac7ec5","406cf666","3feddfc3","408e9a7f","40b0a65d","40bdf10b","408a4d5e","4075e314","406d9380"],["40822046","3fe55278","40e03be6","40821e39","4055cae9","405c951e","408b86f4","40928386","40eb91e2","410026d9","40b2a479","40b9726a","40a546a4","408b2430","40962876","4077bb2b","405d2a8c","00000000","40f9e735","40f7ae4a","409b0df7","4134d275","40fe90ae","40a260d7","40af97f5","41499af2","40adf55e","40c84326","40f2fb0a","403e1bea","409cb710","410156b4","40a69928","40251bf6","40fa2e9d","410e992f","40e79232","4051875a","40d550bf","40a9e488","40f30c52","40b092bb","40993d19","40aa0d37","4086eb7b","40aac6a9","4096d141","408e6154","3fcd2743","40e55f06"],["406f8ddd","40c09296","40ea2960","40de98c1","4090e35c","40cac517","40b1e7af","40a31c8d","4092e455","40be9b1e","408aca2a","4004accd","40cb448c","40614941","407751cd","40b10a2c","408b51ee","40f9e734","00000000","3f254c42","403db27b","410fbc0a","4060107c","4053edf5","40397fba","412d6603","40522d17","405ab9da","40cc275c","40b47300","40d1e3a6","40b88093","4062b61c","40af0883","40c1c4c0","40e4c880","40f17fac","40aabd48","3f99e045","404a0b6b","40b159be","40c12bc2","4045176e","401fb3fc","40755607","4064b999","40c2d25e","40a73ebf","40d90e00","40a92a4c"],["408c7076","40d53c1e","40dec890","40d4c1b9","4099389d","40d31a58","409d3e26","40b7c615","40a78ddd","40b33a4e","406c4143","402dffde","40d399cd","4071f3c2","405beb36","40b95f6c","409ffb76","40f7ae49","3f254c42","00000000","4067058b","41056746","4084b1c6","402a9ae5","40102caa","4123113f","407b8028","40820675","40de593a","40c91c87","40da38e6","40a3d70b","40860496","40b75dc4","40ad1b38","40d01ef8","40e61edc","40bf66cf","3fec8666","40735e7c","40a5f8ee","40d5d54a","406e6a7f","4049070c","40830044","403b6689","40d77be6","40bbe847","40c46478","40bdd3d4"],["3f476d88","404372b2","40cce94c","40eb6f43","40aa3589","40c02438","40b3ebb0","40bae841","40ce32ae","40b89a42","40db0935","409c1334","409fb03e","4089f6cd","4094fb13","403dfbe5","3fb1e2c4","409b0df7","403db27b","4067058c","00000000","4113c42a","40cee17c","40ada33c","40bada5a","414f3c24","409c4f2e","40cc362a","408b4c9e","402b3384","407faeda","40c090d3","40a493b0","40c85ab0","4102b881","41143a61","40d43f98","4017c814","4085514f","40983e58","40ab58e2","409d4152","4077bbc8","3eeff3fb","4093fd30","40b6090e","40c353bc","40b6c60f","40815de6","4014a21e"],["41074d52","41182826","412cb539","4130c7f3","4109ed40","41131516","4138f545","41315fee","412a04bc","4116ee18","412fa741","4110f4ff","41271dd8","40f39bc5","40e8977f","411a00a8","40fb0fa4","4134d275","410fbc0a","41056746","4113c42a","00000000","4108d879","40cfef56","40c2b838","41606231","410558c7","41425698","40a179b1","4123c04c","412a6d65","404def04","4107885f","4118ffd4","4113de8e","4125606e","4130605f","411ee570","411ee42a","4103505c","41104d68","41298fb9","4100da57","410ee388","40fda228","40d85528","413b2177","412f4ed5","411f832e","40e83987"],["40e7cf2d","41087bdf","40e5aaf4","40edd067","40a01b02","40d9fcbd","40fe2b0a","40c634a8","40d7f89c","40ba1cb2","40e4b0ed","404add04","40da7c32","407fb88c","4069b000","40c041d1","40fb5a2d","40fe90ae","4060107c","4084b1c6","40cee17c","4108d879","00000000","40385fae","401df173","41268272","408c2ea7","40907508","40e53b9f","40d3c11a","40e11b4c","40aab970","40947329","40be4029","40b3fd9d","40d7015d","40ed0140","40ca0b62","40132059","40881dd1","40acdb52","40e443dd","4085a3d2","40bfe23c","4089e2a9","40492b52","40e5ea79","40ca56da","40cb46dd","40d60b1a"],["4094b58c","40b4c7e8","40897b1d","4091a090","4007d656","407b99cc","40a1fb34","4092d086","40841a22","403bd9b6","408f5f2c","4023f552","407c98b6","3f8eb1bc","3f454146","404823f4","40a8408c","40a260d7","4053edf6","402a9ae5","40ada33d","40cfef56","40385fae","00000000","3ed371db","40f0d50c","3feb08e1","40b4bdda","40a37a03","406f2285","4084eb74","4051efa7","3ffc859e","404420a4","402f9b8c","4075a30c","4090d169","405bb715","405bb1fc","3fdac589","402156f6","4090921d","3fc71562","40b9d0f9","3fb6cb49","3e865d1f","40a65398","408eae54","405e2e0c","40849eac"],["40a1eca9","40c1ff05","4096b23b","409ed7ae","40224491","408b0404","40af3251","40a007a4","40915140","405647f2","409c9649","403e638e","408b8378","3fc38e33","3f977d1a","40629230","40b577a9","40af97f4","40397fba","40102caa","40bada5a","40c2b838","401df173","3ed371db","00000000","40fe0c2a","400ff2ac","40c1f4f8","409642e5","4084c860","40922292","4037816c","4018b10a","405e8ee0","404a09c7","408808a4","409e0887","40762550","40762038","4007d100","403bc531","409dc93b","3ffbf1d9","40ac99db","3feba7c0","3f2ce77d","40b38ab6","409be572","40789c47","4091d5ca"],["4142c54c","4152ce7a","40e5dfdc","413c86a3","411a601b","413750f9","41449bee","4141d2c9","413a7797","4108b70f","41310d2c","41182c1c","413790b3","410a40bd","4104be9a","412a7382","414c8acc","41499af1","412d6604","41231140","414f3c24","41606231","41268272","40f0d50c","40fe0c2a","00000000","4104cc09","41498db5","414a2788","41343327","412cd0ee","412ce670","4108ee4a","412972af","40990746","406c070c","40ed3628","412f584b","41261b47","4106d474","410f57bf","4140b394","41114d32","41555303","410f43ef","40f93ade","410b12c7","413fc1b0","412ff609","412dcb19"],["4094c298","40c05c6e","40893481","4091ad9c","4007f06e","407bb3e4","407f3f96","4095496b","4084272e","403b4c7e","4031048d","3f9b0094","407cb2ce","3f8ee5ec","3fbaf705","40483e0c","40a84d98","40adf55e","40522d16","407b8026","409c4f2e","410558c7","408c2ea6","3feb08e1","400ff2ac","4104cc09","00000000","40898356","40d90135","4056d907","4084f880","40a3ba0c","3e844827","40443abc","40612198","4093948c","40908acd","406a4477","40053cf4","3e021abe","4020c9be","40a6a7b6","3fc74992","40ab4e6e","3fb6ff79","3fc97199","40a660a4","40912739","4075571a","4023fc3f"],["40d7ba30","408eee88","41054b15","40ff058c","4094da34","40eb31e2","40e120de","3fd6fe80","40d54d4c","40df07e9","40e2059c","40458662","40cf3b64","4091116b","409c15b1","40d176f6","40c42f30","40c84326","405ab9da","40820675","40cc362b","41425698","40907508","40b4bdda","40c1f4f8","41498db4","40898356","00000000","411cc224","40ecce2e","40f25070","410edad7","4091c7d8","40cf754e","40fa1422","410e8bf1","4108f63b","40e490de","400dc9b7","40857280","40d1c689","40279daa","4082f882","40bd36eb","409b17ce","40b3be10","40e33f28","3fe78748","40d49f6a","40beb4c0"],["40a43a4f","40ed05f7","40c16bf8","40cffd4d","40e7652e","4084b07b","4103c070","411b2545","4113ca12","4095ddb6","41174f32","40f574ac","4110e32f","40c72672","40bc222c","40e5d6c0","40b7c54f","40f2fb0a","40cc275c","40de593a","408b4c9e","40a179b1","40e53b9e","40a37a03","409642e5","414a2788","40d90135","411cc224","00000000","40e0e660","4103581d","3fea08bd","40e145b7","40a06d0f","40fb47c9","410f25c5","40c8c244","40d730a8","40f29f6d","40d4f05f","40889c56","41135510","40d53f5b","40789abc","40d12cd5","40abdfd5","40e4b055","4119142c","41065542","40bbc434"],["3ff2b045","4062ea0c","40aa61e8","40acb382","403c539f","407bebcc","406a5fdd","40caa3ee","40bda2de","40c0f116","409c4d73","408a0afc","40142cf8","403a6a57","405072e3","3f667d04","40206e22","403e1bea","40b47300","40c91c88","402b3384","4123c04c","40d3c11a","406f2285","4084c860","41343327","4056d907","40ecce2c","40e0e660","00000000","3ff6a46c","40e08916","4067620c","4099b27a","40cf5f08","40f262c8","40a30b9c","3e9b5b7f","40a5e951","404eb75b","40b3afb6","40e02366","40569c2a","40493203","404e771d","407fee29","4081256a","40c681bc","3faf1091","409fead1"],["404dd378","40a0250c","408ce6f4","40b74fd3","40817dc1","4081ffc0","40b2d90a","40e66ba9","40c1acb8","40b87536","40ccf1c2","408f8d40","4087bf97","40427e0b","40588697","3f8365ea","4074e978","409cb710","40d1e3a6","40da38e7","407faeda","412a6d65","40e11b4c","4084eb74","40922292","412cd0ee","4084f880","40f25070","4103581e","3ff6a46c","00000000","40ede348","407967fc","4087bf95","40c09a96","40e39e56","40943d40","3fcfcd8c","40ab6b95","40890956","40c5b696","40e42d40","405eafde","408ed6ad","40568ad1","408d5146","4006f89e","40e24977","4052da7e","40ca287c"],["40a7a322","40c958ca","40f272f0","40fa9863","40ace2fe","40bf32aa","41057983","40fbc85a","40ed11f4","40c6e4ae","40f856fe","40baf27c","40e7442e","408ca442","40819ffc","40cd09cd","40941822","410156b4","40b88093","40a3d70b","40c090d3","404def04","40aab970","4051efa7","4037816c","412ce670","40a3ba0c","410edad6","3fea08bd","40e08916","40ede348","00000000","40a8193a","40cb0825","40c0c59a","40e3c95a","40f9c93c","40d6d35e","40d6d0d1","409fa936","40b9a34e","40ec27f0","409abd2b","40b6cf8d","4096aaa5","4062bb4b","4107a5b6","40f7a628","40d80eda","40814205"],["408c7e15","40c8a0f0","40917904","4089691a","3feeced1","406b2adf","406eb692","409d8ded","4077c557","404bd584","40207b88","3fbc129e","406c29c8","3f5ba7c4","3f99e4fb","4037b507","40a00915","40a69929","4062b61c","40860496","40a493b1","4107885e","4094732a","3ffc859e","4018b10a","4108ee4a","3e844827","4091c7d8","40e145b8","4067620c","407967fc","40a8193b","00000000","4033b1b7","4071aa9d","409bd90f","4098cf50","405de8d8","4015c5fa","3ec55586","403152c3","409e6333","3fa63788","40b392f1","3f95ed6f","3fea83a2","409e1c22","40996bbb","4082f00f","40348544"],["40af6d00","408be299","408dadeb","3fbe40f8","403d453e","3f5de4a0","404e27a2","40c39086","409ed196","40b93c2d","408e3156","4059643a","409903cf","3ff98f8c","4012d052","4079c5b3","40c12341","40251bf6","40af0883","40b75dc4","40c85ab1","4118ffd4","40be4029","404420a4","405e8edf","412972af","40443abc","40cf754e","40a06d0f","4099b27a","4087bf95","40cb0826","4033b1b7","00000000","40b9de18","40dce1d8","40950437","408ffcc2","40889072","404c5c68","40b2823d","40c1521e","4018f999","40d759f1","3fd175ff","4054ec48","4008868c","40bf6e54","4085d7cc","40b41b7e"],["40ec8351","41064ad7","4092e017","40e96e56","409bb8f1","40d59aac","40f03097","40ea9e4c","40dbe7e8","40866696","40c91312","409750f1","40d61a21","4076f46a","4060ebde","40bbdfc0","41000728","40fa2e9d","40c1c4c0","40ad1b38","4102b881","4113de8e","40b3fd9d","402f9b8c","404a09c7","40990746","40612198","40fa1422","40fb47c9","40cf5f08","40c09a96","40c0c59a","4071aa9d","40b9de18","00000000","3f8c0f01","409a3663","40c5a950","40b32f46","40694344","4093a7f6","40e85fe4","4089931e","4108cf5f","40858098","40406730","407a3c8f","40e67c1a","40c6e4cc","40c28eec"],["4107c388","4117ccb7","405fb8ad","410184e0","40bebcb1","40f89e6c","41099a2b","4106d106","40feeba8","409b6a98","40ec16d2","40ba54b1","40f91de1","409e7df5","409379af","40dee380","41118908","410e992e","40e4c881","40d01ef9","41143a60","4125606e","40d7015e","4075a30c","408808a4","406c070c","4093948c","410e8bf1","410f25c5","40f262c8","40e39e57","40e3c95a","409bd90e","40dce1d8","3f8c0f01","00000000","406e6546","40e8ad10","40d63306","4097a562","40a8abf8","4105b1d2","40ac96de","411a5140","40a88458","40833758","40a02208","4104bfed","40e9e88c","40e592ac"],["40cc4c3d","4102c3c7","3e6ac988","409a83b6","40d48304","40b0c0cb","40d20749","410971d4","410a58fd","3fcb9238","40e90d13","40af2946","40ed2218","40b44448","40a97992","40863bfc","40dfd73d","40e79232","40f17fac","40e61edc","40d43f98","41306060","40ed0140","4090d169","409e0887","40ed3629","40908acd","4108f63b","40c8c244","40a30b9c","40943d40","40f9c93d","4098cf4f","40950437","409a3663","406e6546","00000000","409955e4","40cb079b","408c79f7","40004bdc","40f4d474","40c25d31","40e33ed8","40be4aab","4099373b","402181e2","410b82ed","40cecfc0","4089ee89"],["3fcbd965","40586353","40a0ac30","40b6693a","404fbf0f","4068805c","407dcb4d","40c56092","40b3ed26","40caa6ce","40a6032b","4081cdae","40279868","4026fee7","403d0773","3f18cf44","400d02b2","4051875a","40aabd48","40bf66d0","4017c814","411ee570","40ca0b62","405bb715","40762550","412f584b","406a4477","40e490de","40d730a8","3e9b5b7f","3fcfcd8c","40d6d35e","405de8d8","408ffcc2","40c5a950","40e8ad10","409955e4","00000000","409dac03","406222cb","40bd656e","40d66dae","404330ba","4035c693","403b0bad","406c82b9","406edf64","40c13e60","3fd5e771","40963519"],["409e3f00","40d5d364","40c3b14f","40b820b0","4054d696","40a44d06","40c23e45","407948f7","408e686f","4098230d","409b20c0","3f5ef2aa","40a4cc7b","4014591e","402a61aa","408a921a","40b1ca00","40d550c0","3f99e045","3fec8666","4085514f","411ee42a","40132059","405bb1fc","40762037","41261b46","40053cf4","400dc9b7","40f29f6d","40a5e952","40ab6b94","40d6d0d2","4015c5f9","40889072","40b32f46","40d63306","40cb079b","409dac02","00000000","3ffa3691","408ae1ad","409ab3b0","3ff04e97","406ca41e","402865e4","4059b269","409c5a4c","4080c6ae","40b5285b","408c7aee"],["4098d36e","40bc4b98","408523ab","4095be72","4010121a","4081eac8","4083b0a1","40995a41","40883804","40332ad2","40392639","3f8abd3c","40826a3d","3f9f2944","3fcb3a5d","40505fb8","40ac5e6e","40a9e488","404a0b6b","40735e7c","40983e58","4103505c","40881dd1","3fdac589","4007d100","4106d474","3e021abe","40857280","40d4f05f","404eb75b","40890956","409fa936","3ec55586","404c5c68","40694344","4097a562","408c79f7","406222cb","3ffa3691","00000000","4018a812","40aab88c","3fd78cea","40a73d98","3fc742d1","3fb92e41","40a32b46","4095380f","406d356e","401bda93"],["40c44693","4102b9b1","3fe33e88","40cbfd0c","40945d16","40ce3ed1","40d004ab","40e37c02","40d48c0c","3ed41604","40a8e726","405e06b0","40cebe46","40683cb4","4052a748","40b483e5","40d7d193","40f30c52","40b159be","40a5f8ee","40ab58e2","41104d68","40acdb52","402156f6","403bc531","410f57bf","4020c9be","40d1c688","40889c56","40b3afb6","40c5b696","40b9a34e","403152c3","40b2823d","4093a7f6","40a8abf8","40004bdc","40bd656e","408ae1ad","4018a812","00000000","40cbedbe","40823743","40ba5822","407c497a","4032229a","40823a47","40df59d0","40bfc281","40420fa6"],["40b62f03","406e7c3a","40ed7e28","40f0e25c","40a32cf7","40dd0eb2","40c97074","3f7079a6","40e35bee","40d92f1e","40eea0f8","40b13c74","40dd8e27","4082ee3b","406fd3e9","40c353c6","40ac7ec5","40b092bb","40c12bc1","40d5d549","409d4152","41298fb9","40e443dc","4090921d","409dc93b","4140b395","40a6a7b6","40279daa","41135510","40e02366","40e42d40","40ec27f0","409e6334","40c1521e","40e85fe3","4105b1d2","40f4d474","40d66dae","409ab3b0","40aab88c","40cbedbe","00000000","40910724","40ac4092","408cf49e","4098f7ef","4102cab2","3f88c59b","40bceefe","4055cbd6"],["4045e066","40abbbdb","40bb06e6","40781a15","3fb95e95","405072c1","408c67ae","4093458d","4024a993","408f78a4","4073974c","3f80d542","405171aa","3ee18e97","3f48e97d","401cfce9","406cf666","40993d1a","4045176e","406e6a7e","4077bbc8","4100da57","4085a3d2","3fc71562","3ffbf1d9","41114d32","3fc74992","4082f881","40d53f5b","40569c2a","405eafde","409abd2c","3fa63788","4018f999","4089931e","40ac96de","40c25d32","404330ba","3ff04e97","3fd78cea","40823744","40910724","00000000","408add24","3f40fa65","3fe8acaa","4090c012","408f235b","40971239","4083d084"],["3f9fb3c3","40617132","40dbe88c","40fa6e83","40b934c9","40cf2378","40c2eaf0","40c9e781","40dd31ee","40c79982","40daa428","40923064","40aeaf7e","4098f60d","40a3fa53","405bfa65","3feddfc3","40aa0d37","401fb3fc","4049070c","3eeff3fb","410ee388","40bfe23c","40b9d0f9","40ac99db","41555303","40ab4e6e","40bd36ea","40789abc","40493204","408ed6ad","40b6cf8d","40b392f0","40d759f0","4108cf60","411a5140","40e33ed8","4035c694","406ca41e","40a73d98","40ba5822","40ac4092","408add24","00000000","40a2fc70","40c236cb","40d252fc","40c5c54f","40905d26","4032a09d"],["40761eff","40c04019","40b6f45f","4047db7c","3fa9147c","40203428","40885528","408f3307","4054e82c","408b661d","406b7240","3fe15274","40494c9e","3ea06633","3f28554b","4014d7dc","408e9a80","4086eb7b","40755606","40830045","4093fd30","40fda228","4089e2a9","3fb6cb48","3feba7bf","410f43ef","3fb6ff79","409b17ce","40d12cd5","404e771d","40568ad1","4096aaa6","3f95ed6f","3fd175ff","40858098","40a88458","40be4aab","403b0bad","402865e4","3fc742d1","407c497a","408cf49e","3f40fa65","40a2fc70","00000000","3fd86290","4071418c","408b10d5","4092ffb3","407f7bfc"],["409d1b5e","40bd2dba","4091e0ef","409a0662","4018a1fa","408632b8","40aa6106","409b3658","408c7ff4","404ca55a","408adead","4021f5be","4086b22d","3fb04904","3f8437eb","4058ef98","40b0a65e","40aac6a9","4064b99a","403b6689","40b6090f","40d85528","40492b52","3e865d1f","3f2ce77d","40f93ade","3fc97199","40b3be10","40abdfd5","407fee29","408d5146","4062bb4b","3fea83a3","4054ec48","40406730","40833758","4099373b","406c82b9","4059b268","3fb92e41","4032229a","4098f7ef","3fe8acaa","40c236cb","3fd86291","00000000","40aeb96a","40971426","406ef9b0","407871b4"],["40aa660b","40d025df","4012d54a","4067a708","40a2e5e5","403fffb4","40ab5717","4103e9e6","40e314dc","4069f1ce","40d2749c","40807bf7","40cb3be6","4082a729","408dab6f","4048ab93","40bdf10b","4096d141","40c2d25d","40d77be5","40c353bc","413b2177","40e5ea78","40a65398","40b38ab6","410b12c7","40a660a4","40e33f28","40e4b055","4081256a","4006f89e","4107a5b6","409e1c22","4008868c","407a3c8f","40a02208","402181e2","406edf64","409c5a4c","40a32b46","40823a47","4102cab2","4090c012","40d252fc","4071418c","40aeb96a","00000000","4101d8cd","40ace98e","40cc02e2"],["409dd85e","402a196c","4107d7c8","40dec29f","40a1492e","40db2ae9","40a73f0c","3e044640","40e17824","40ec9b2f","40ce5c91","409ca503","40dbaa5e","40810a72","406c0c57","40c16ffd","408a4d5e","408e6154","40a73ebf","40bbe847","40b6c60f","412f4ed5","40ca56da","408eae54","409be572","413fc1b0","40912739","3fe78748","4119142c","40c681bc","40e24978","40f7a628","40996bbb","40bf6e55","40e67c1a","4104bfed","410b82ee","40c13e60","4080c6ae","4095380f","40df59cf","3f88c59b","408f235b","40c5c54f","408b10d5","40971426","4101d8ce","00000000","409abd98","408d1752"],["4050e06b","400b61c3","40d6260d","40b5680a","4089edf4","40a19460","4097e338","409edfca","40e96702","40cd03e1","40bf00bd","40994a06","406bb540","4088f950","4087bf2f","4011278a","4075e314","3fcd2743","40d90e00","40c46478","40815de6","411f832e","40cb46dd","405e2e0c","40789c47","412ff609","4075571a","40d49f6a","41065542","3faf1091","4052da7f","40d80eda","4082f00f","4085d7cc","40c6e4cc","40e9e88c","40cecfc1","3fd5e771","40b5285b","406d356e","40bfc281","40bceeff","40971239","40905d26","4092ffb3","406ef9b0","40ace98e","409abd98","00000000","40c48800"],["40467d80","40ac0a68","4082983d","40e3abbb","4095f656","40cfd811","40d19deb","4088f520","40d6254e","405c9266","40aa8066","40613931","40d05786","406b6f35","4080bbe1","40a94f02","406d9380","40e55f06","40a92a4c","40bdd3d4","4014a21e","40e83987","40d60b1a","40849eac","4091d5ca","412dcb19","4023fc3f","40beb4c0","40bbc434","409fead1","40ca287c","40814205","40348544","40b41b7d","40c28eec","40e592ac","4089ee89","40963519","408c7aee","401bda93","40420fa6","4055cbd6","4083d084","4032a09d","407f7bfb","407871b4","40cc02e2","408d1752","40c48800","00000000"]]},
16
+ r5: {"n":25,"rows":[{"edges":[0,3],"ewgts":[0,3.9199373722076416]},{"edges":[1],"ewgts":[0]},{"edges":[2,18,17,9],"ewgts":[0,5.021393775939941,1.7459399700164795,2.1801998615264893]},{"edges":[3,0,23],"ewgts":[0,3.9199373722076416,4.35283899307251]},{"edges":[4,13],"ewgts":[0,2.3971364498138428]},{"edges":[5],"ewgts":[0]},{"edges":[6,9],"ewgts":[0,5.078029632568359]},{"edges":[7,23,11],"ewgts":[0,0.6949235200881958,3.4458720684051514]},{"edges":[8],"ewgts":[0]},{"edges":[9,6,2],"ewgts":[0,5.078029632568359,2.1801998615264893]},{"edges":[10,20,14,15],"ewgts":[0,1.060785174369812,0.5572922229766846,2.9808664321899414]},{"edges":[11,7],"ewgts":[0,3.4458720684051514]},{"edges":[12],"ewgts":[0]},{"edges":[13,23,4],"ewgts":[0,4.583548545837402,2.3971364498138428]},{"edges":[14,10],"ewgts":[0,0.5572922229766846]},{"edges":[15,10],"ewgts":[0,2.9808664321899414]},{"edges":[16],"ewgts":[0]},{"edges":[17,18,2],"ewgts":[0,1.7297555208206177,1.7459399700164795]},{"edges":[18,2,24,17],"ewgts":[0,5.021393775939941,4.9747467041015625,1.7297555208206177]},{"edges":[19],"ewgts":[0]},{"edges":[20,10],"ewgts":[0,1.060785174369812]},{"edges":[21],"ewgts":[0]},{"edges":[22],"ewgts":[0]},{"edges":[23,13,3,7],"ewgts":[0,4.583548545837402,4.35283899307251,0.6949235200881958]},{"edges":[24,18],"ewgts":[0,4.9747467041015625]}],"expected":[["00000000","7f7fffff","7f7fffff","407ae041","41740e2e","7f7fffff","7f7fffff","410f7bb3","7f7fffff","7f7fffff","7f7fffff","41469dfe","7f7fffff","414db382","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","41045d4b","7f7fffff"],["7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff"],["7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","40e8436a","7f7fffff","7f7fffff","400b8865","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","3fdf7af6","405e71cc","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","41073503"],["407ae041","7f7fffff","7f7fffff","00000000","4135561e","7f7fffff","7f7fffff","40a18745","7f7fffff","7f7fffff","7f7fffff","4107e5ed","7f7fffff","410efb72","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","408b4a75","7f7fffff"],["41740e2e","7f7fffff","7f7fffff","4135561e","00000000","7f7fffff","7f7fffff","40f59e96","7f7fffff","7f7fffff","7f7fffff","4131f196","7f7fffff","40196aaf","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","40df61c6","7f7fffff"],["7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff"],["7f7fffff","7f7fffff","40e8436a","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","40a27f38","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","41101114","412bbe28","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","417b56b8"],["410f7bb3","7f7fffff","7f7fffff","40a18745","40f59e96","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","405c892b","7f7fffff","40a8e93e","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","3f31e682","7f7fffff"],["7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff"],["7f7fffff","7f7fffff","400b8865","7f7fffff","7f7fffff","7f7fffff","40a27f38","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","407b45e0","40b4fd18","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","412a171c"],["7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","3f0eaab4","403ec684","7f7fffff","7f7fffff","7f7fffff","7f7fffff","3f87c7cf","7f7fffff","7f7fffff","7f7fffff","7f7fffff"],["41469dfe","7f7fffff","7f7fffff","4107e5ee","4131f196","7f7fffff","7f7fffff","405c892b","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff","410b96ea","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","40848166","7f7fffff"],["7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff"],["414db382","7f7fffff","7f7fffff","410efb72","40196aaf","7f7fffff","7f7fffff","40a8e93e","7f7fffff","7f7fffff","7f7fffff","410b96ea","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","4092ac6e","7f7fffff"],["7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","3f0eaab4","7f7fffff","7f7fffff","7f7fffff","00000000","40627131","7f7fffff","7f7fffff","7f7fffff","7f7fffff","3fcf1d29","7f7fffff","7f7fffff","7f7fffff","7f7fffff"],["7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","403ec684","7f7fffff","7f7fffff","7f7fffff","40627131","00000000","7f7fffff","7f7fffff","7f7fffff","7f7fffff","40815536","7f7fffff","7f7fffff","7f7fffff","7f7fffff"],["7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff"],["7f7fffff","7f7fffff","3fdf7af6","7f7fffff","7f7fffff","7f7fffff","41101114","7f7fffff","7f7fffff","407b45e0","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000","3fdd68a1","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","40d68b48"],["7f7fffff","7f7fffff","405e71cc","7f7fffff","7f7fffff","7f7fffff","412bbe28","7f7fffff","7f7fffff","40b4fd18","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","3fdd68a1","00000000","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","409f3120"],["7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff"],["7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","3f87c7cf","7f7fffff","7f7fffff","7f7fffff","3fcf1d29","40815536","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff","7f7fffff"],["7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff","7f7fffff"],["7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff","7f7fffff"],["41045d4b","7f7fffff","7f7fffff","408b4a75","40df61c6","7f7fffff","7f7fffff","3f31e682","7f7fffff","7f7fffff","7f7fffff","40848166","7f7fffff","4092ac6e","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000","7f7fffff"],["7f7fffff","7f7fffff","41073503","7f7fffff","7f7fffff","7f7fffff","417b56b8","7f7fffff","7f7fffff","412a171c","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","40d68b48","409f3120","7f7fffff","7f7fffff","7f7fffff","7f7fffff","7f7fffff","00000000"]]},
17
+ };
@@ -0,0 +1,33 @@
1
+ digraph fsm {
2
+ node [fontsize=9];
3
+ edge [fontsize=9];
4
+
5
+ overlap=false;
6
+
7
+ splines=curved;
8
+
9
+ layout=neato;
10
+ nodesep=0.3;
11
+ model=mds;
12
+ mode="hier";
13
+
14
+ hidden [shape=point, style=invis];
15
+
16
+ hidden -> "power on" [len=0.2 tailport=_ headport=_];
17
+ "power on" -> "sign in" [label="critical\nsettings\nnot\nmissing" len=0.4];
18
+ "power on" -> "wait for\nbecoming\noffline" [label="critical\nsettings\nmissing" len=0.2];
19
+ "wait for\nbecoming\noffline" -> "critical\nsettings" [label="we are\noffline" len=0.3];
20
+ "critical\nsettings" -> "critical\nsettings" [label="incorrect\ninput" tailport=e headport=e];
21
+ "critical\nsettings" -> "sign in" [label="correct\ninput" len=0.4];
22
+ "sign in" -> dashboard [label="correct\nsecrets"];
23
+ "sign in" -> "sign in" [label="incorrect\nsecrets" tailport=e headport=e];
24
+ dashboard -> settings [label="click\n\"Settings\""];
25
+ dashboard -> dashboard [label="correct\ninput" tailport=w headport=w];
26
+ dashboard -> dashboard [label="incorrect\ninput" tailport=e headport=e];
27
+ dashboard -> "sign in" [label="click\n\"Sign out\""];
28
+ settings -> settings [label="correct\ninput" tailport=w headport=w];
29
+ settings -> settings [label="incorrect\ninput" tailport=e headport=e];
30
+ settings -> dashboard [label="click\n\"Dashboard\""];
31
+ settings -> "sign in" [label="click\n\"Sign out\""];
32
+ settings -> "wait for\nbecoming\noffline" [label="complete\nwipe" len=1.6];
33
+ }
@@ -0,0 +1,26 @@
1
+ graph 1 8.3515 1.05
2
+ node hidden 0.025 0.45 0.05 0.05 hidden invis point black lightgrey
3
+ node "power on" 1.6893 0.45 0.81009 0.5 "power on" solid ellipse black lightgrey
4
+ node "sign in" 3.547 0.45 0.75 0.5 "sign in" solid ellipse black lightgrey
5
+ node "wait for\nbecoming\noffline" 0.66743 0.45 1.0114 0.79353 "wait for\nbecoming\noffline" solid ellipse black lightgrey
6
+ node "critical\nsettings" 2.6328 0.45 0.85444 0.5814 "critical\nsettings" solid ellipse black lightgrey
7
+ node dashboard 7.1703 0.45 0.86298 0.5 dashboard solid ellipse black lightgrey
8
+ node settings 5.8395 0.45 0.75 0.5 settings solid ellipse black lightgrey
9
+ edge hidden "power on" 4 0.053697 0.45 0.42937 0.45 0.51963 0.45 1.1202 0.45 solid black
10
+ edge "power on" "sign in" 4 2.1007 0.45 2.3079 0.45 2.5196 0.45 3.0139 0.45 "critical\nsettings\nnot\nmissing" 2.4384 0.75 solid black
11
+ edge "power on" "wait for\nbecoming\noffline" 4 1.281 0.45 1.2798 0.45 1.2786 0.45 1.2774 0.45 "critical\nsettings\nmissing" 1.3755 0.225 solid black
12
+ edge "sign in" "sign in" 7 3.9256 0.45 4.0239 0.60278 4.2276 0.60278 4.2276 0.45 4.2276 0.34735 4.1356 0.31367 4.0455 0.34896 "incorrect\nsecrets" 4.4497 0.45 solid black
13
+ edge "sign in" dashboard 4 3.9077 0.52203 4.538 0.57356 5.8447 0.57829 6.5992 0.53621 "correct\nsecrets" 5.1567 0.71457 solid black
14
+ edge "wait for\nbecoming\noffline" "critical\nsettings" 4 1.1757 0.45 1.3718 0.45 1.5964 0.45 2.0473 0.45 "we are\noffline" 1.526 0.6 solid black
15
+ edge "critical\nsettings" "sign in" 4 3.0661 0.45 3.068 0.45 3.0699 0.45 3.0718 0.45 "correct\ninput" 3.0711 0.3 solid black
16
+ edge "critical\nsettings" "critical\nsettings" 7 3.064 0.45 3.1619 0.60278 3.3656 0.60278 3.3656 0.45 3.3656 0.34735 3.2736 0.31367 3.1836 0.34896 "incorrect\ninput" 3.5876 0.45 solid black
17
+ edge dashboard "sign in" 4 6.7546 0.37371 6.0907 0.32509 4.7921 0.32277 4.0674 0.36673 "click\n\"Sign out\"" 5.1981 0.18543 solid black
18
+ edge dashboard dashboard 7 6.7347 0.45 6.6369 0.60278 6.4332 0.60278 6.4332 0.45 6.4332 0.34735 6.5252 0.31367 6.6152 0.34896 "correct\ninput" 6.2598 0.45 solid black
19
+ edge dashboard dashboard 7 7.6058 0.45 7.7036 0.60278 7.9073 0.60278 7.9073 0.45 7.9073 0.34735 7.8154 0.31367 7.7253 0.34896 "incorrect\ninput" 8.1294 0.45 solid black
20
+ edge dashboard settings 4 6.771 0.34398 6.6378 0.33495 6.4876 0.33306 6.3473 0.33832 "click\n\"Settings\"" 6.4809 0.18548 solid black
21
+ edge settings "sign in" 4 5.4598 0.45 4.6733 0.45 4.3676 0.45 4.085 0.45 "click\n\"Sign out\"" 4.322 0.6 solid black
22
+ edge settings "wait for\nbecoming\noffline" 4 5.4609 0.45 2.7727 0.45 2.2751 0.45 1.3323 0.45 "complete\nwipe" 2.5129 0.3 solid black
23
+ edge settings dashboard 4 6.1891 0.55225 6.3189 0.56321 6.4696 0.56686 6.6133 0.56322 "click\n\"Dashboard\"" 6.1624 0.71453 solid black
24
+ edge settings settings 7 5.4609 0.45 5.3626 0.60278 5.1589 0.60278 5.1589 0.45 5.1589 0.34735 5.2509 0.31367 5.341 0.34896 "correct\ninput" 4.9854 0.45 solid black
25
+ edge settings settings 7 6.218 0.45 6.3163 0.60278 6.52 0.60278 6.52 0.45 6.52 0.34735 6.4281 0.31367 6.3379 0.34896 "incorrect\ninput" 6.7421 0.45 solid black
26
+ stop