@knowvah/dot-engine 2.3.1 → 2.4.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 (115) hide show
  1. package/dist/common/arith.d.ts +12 -0
  2. package/dist/common/arith.d.ts.map +1 -1
  3. package/dist/common/edge-in-box.d.ts +31 -0
  4. package/dist/common/edge-in-box.d.ts.map +1 -0
  5. package/dist/common/htmltable-emit.d.ts +1 -1
  6. package/dist/common/htmltable-emit.d.ts.map +1 -1
  7. package/dist/common/make-label.d.ts +3 -1
  8. package/dist/common/make-label.d.ts.map +1 -1
  9. package/dist/common/poly-gencode.d.ts +12 -1
  10. package/dist/common/poly-gencode.d.ts.map +1 -1
  11. package/dist/gvc/device.d.ts.map +1 -1
  12. package/dist/gvc/emit-gates.d.ts +35 -0
  13. package/dist/gvc/emit-gates.d.ts.map +1 -0
  14. package/dist/gvc/job.d.ts +4 -0
  15. package/dist/gvc/job.d.ts.map +1 -1
  16. package/dist/gvc/viewport.d.ts +13 -0
  17. package/dist/gvc/viewport.d.ts.map +1 -1
  18. package/dist/index.js +821 -548
  19. package/dist/index.js.map +4 -4
  20. package/dist/layout/circo/blockpath.d.ts +1 -38
  21. package/dist/layout/circo/blockpath.d.ts.map +1 -1
  22. package/dist/layout/circo/crossings.d.ts +59 -0
  23. package/dist/layout/circo/crossings.d.ts.map +1 -0
  24. package/dist/layout/dot/edge-route-chain.d.ts +5 -3
  25. package/dist/layout/dot/edge-route-chain.d.ts.map +1 -1
  26. package/dist/layout/dot/edge-route.d.ts.map +1 -1
  27. package/dist/layout/dot/index.d.ts +10 -2
  28. package/dist/layout/dot/index.d.ts.map +1 -1
  29. package/dist/layout/dot/ortho-adapter.d.ts +6 -2
  30. package/dist/layout/dot/ortho-adapter.d.ts.map +1 -1
  31. package/dist/layout/dot/pack-components.d.ts +4 -1
  32. package/dist/layout/dot/pack-components.d.ts.map +1 -1
  33. package/dist/layout/dot/splines-flat-multi.d.ts +4 -4
  34. package/dist/layout/dot/splines-flat.d.ts +1 -11
  35. package/dist/layout/dot/splines-flat.d.ts.map +1 -1
  36. package/dist/layout/dot/splines-route.d.ts.map +1 -1
  37. package/dist/layout/neato/constraint-adjust.d.ts +32 -0
  38. package/dist/layout/neato/constraint-adjust.d.ts.map +1 -1
  39. package/dist/layout/neato/multispline.d.ts.map +1 -1
  40. package/dist/layout/neato/splines.d.ts.map +1 -1
  41. package/dist/layout/pack/poly-pack.d.ts +3 -0
  42. package/dist/layout/pack/poly-pack.d.ts.map +1 -1
  43. package/dist/layout/pack/poly-place.d.ts.map +1 -1
  44. package/dist/layout/sfdp/__fixtures__/pcp-rotate-native.d.ts +23 -0
  45. package/dist/layout/sfdp/__fixtures__/pcp-rotate-native.d.ts.map +1 -0
  46. package/dist/layout/sfdp/spring-driver.d.ts +6 -0
  47. package/dist/layout/sfdp/spring-driver.d.ts.map +1 -1
  48. package/dist/ortho/index.d.ts +4 -1
  49. package/dist/ortho/index.d.ts.map +1 -1
  50. package/dist/ortho/maze.d.ts +5 -2
  51. package/dist/ortho/maze.d.ts.map +1 -1
  52. package/dist/ortho/partition.d.ts +8 -1
  53. package/dist/ortho/partition.d.ts.map +1 -1
  54. package/dist/ortho/trap-segment.d.ts +2 -1
  55. package/dist/ortho/trap-segment.d.ts.map +1 -1
  56. package/dist/ortho/trapezoid.d.ts.map +1 -1
  57. package/dist/parser/index.d.ts +0 -7
  58. package/dist/parser/index.d.ts.map +1 -1
  59. package/dist/parser/number-scan.d.ts +31 -0
  60. package/dist/parser/number-scan.d.ts.map +1 -0
  61. package/dist/render/dot/edge-draw.d.ts +12 -0
  62. package/dist/render/dot/edge-draw.d.ts.map +1 -1
  63. package/dist/render/svg-graph.d.ts +6 -5
  64. package/dist/render/svg-graph.d.ts.map +1 -1
  65. package/dist/render/svg.d.ts +2 -21
  66. package/dist/render/svg.d.ts.map +1 -1
  67. package/dist/render.js +821 -548
  68. package/dist/render.js.map +4 -4
  69. package/dist/xdot/parse.d.ts.map +1 -1
  70. package/package.json +1 -1
  71. package/src/common/arith.ts +25 -0
  72. package/src/common/edge-in-box.ts +54 -0
  73. package/src/common/graph-init.ts +3 -3
  74. package/src/common/htmltable-emit.ts +4 -2
  75. package/src/common/make-label.ts +3 -1
  76. package/src/common/poly-gencode.ts +18 -4
  77. package/src/gvc/device.ts +8 -41
  78. package/src/gvc/edge-labels.ts +30 -13
  79. package/src/gvc/emit-gates.ts +89 -0
  80. package/src/gvc/job.ts +4 -0
  81. package/src/gvc/viewport.ts +29 -0
  82. package/src/layout/circo/blockpath.ts +6 -125
  83. package/src/layout/circo/crossings.ts +171 -0
  84. package/src/layout/dot/__fixtures__/2784.dot +1 -0
  85. package/src/layout/dot/__fixtures__/2784.native-16.1.svg +48 -0
  86. package/src/layout/dot/edge-route-chain.ts +11 -5
  87. package/src/layout/dot/edge-route.ts +2 -1
  88. package/src/layout/dot/index.ts +14 -4
  89. package/src/layout/dot/ortho-adapter.ts +7 -3
  90. package/src/layout/dot/pack-components.ts +11 -4
  91. package/src/layout/dot/splines-flat-multi.ts +4 -4
  92. package/src/layout/dot/splines-flat.ts +5 -32
  93. package/src/layout/dot/splines-route.ts +10 -2
  94. package/src/layout/dot/splines.ts +6 -6
  95. package/src/layout/neato/constraint-adjust.ts +10 -4
  96. package/src/layout/neato/multispline.ts +26 -9
  97. package/src/layout/neato/splines.ts +7 -7
  98. package/src/layout/pack/poly-pack.ts +19 -6
  99. package/src/layout/pack/poly-place.ts +9 -2
  100. package/src/layout/sfdp/__fixtures__/pcp-rotate-native.ts +94 -0
  101. package/src/layout/sfdp/spring-driver.ts +45 -13
  102. package/src/ortho/index.ts +22 -13
  103. package/src/ortho/maze.ts +8 -2
  104. package/src/ortho/partition.ts +17 -2
  105. package/src/ortho/trap-segment.ts +47 -24
  106. package/src/ortho/trapezoid.ts +24 -15
  107. package/src/parser/dot.js +334 -343
  108. package/src/parser/dot.pegjs +19 -5
  109. package/src/parser/index.ts +15 -0
  110. package/src/parser/number-scan.ts +118 -0
  111. package/src/render/dot/edge-draw.ts +25 -0
  112. package/src/render/svg-graph.ts +77 -47
  113. package/src/render/svg-helpers.ts +2 -2
  114. package/src/render/svg.ts +4 -41
  115. package/src/xdot/parse.ts +19 -5
package/dist/index.js CHANGED
@@ -110,9 +110,9 @@ function peg$parse(input, options) {
110
110
  const peg$c0 = "{";
111
111
  const peg$c1 = "}";
112
112
  const peg$c2 = ";";
113
- const peg$c3 = "[";
114
- const peg$c4 = "]";
115
- const peg$c5 = "=";
113
+ const peg$c3 = "=";
114
+ const peg$c4 = "[";
115
+ const peg$c5 = "]";
116
116
  const peg$c6 = ":";
117
117
  const peg$c7 = "->";
118
118
  const peg$c8 = "--";
@@ -136,32 +136,30 @@ function peg$parse(input, options) {
136
136
  const peg$r3 = /^[A-Za-z_\x80-\uFFFF]/;
137
137
  const peg$r4 = /^[A-Za-z_0-9\x80-\uFFFF]/;
138
138
  const peg$r5 = /^[0-9]/;
139
- const peg$r6 = /^[eE]/;
140
- const peg$r7 = /^[+\-]/;
141
- const peg$r8 = /^[Ss]/;
142
- const peg$r9 = /^[Tt]/;
143
- const peg$r10 = /^[Rr]/;
144
- const peg$r11 = /^[Ii]/;
145
- const peg$r12 = /^[Cc]/;
146
- const peg$r13 = /^[Gg]/;
147
- const peg$r14 = /^[Aa]/;
148
- const peg$r15 = /^[Pp]/;
149
- const peg$r16 = /^[Hh]/;
150
- const peg$r17 = /^[Dd]/;
151
- const peg$r18 = /^[Nn]/;
152
- const peg$r19 = /^[Oo]/;
153
- const peg$r20 = /^[Ee]/;
154
- const peg$r21 = /^[Uu]/;
155
- const peg$r22 = /^[Bb]/;
156
- const peg$r23 = /^[ \t\r\n]/;
157
- const peg$r24 = /^[^\n]/;
139
+ const peg$r6 = /^[Ss]/;
140
+ const peg$r7 = /^[Tt]/;
141
+ const peg$r8 = /^[Rr]/;
142
+ const peg$r9 = /^[Ii]/;
143
+ const peg$r10 = /^[Cc]/;
144
+ const peg$r11 = /^[Gg]/;
145
+ const peg$r12 = /^[Aa]/;
146
+ const peg$r13 = /^[Pp]/;
147
+ const peg$r14 = /^[Hh]/;
148
+ const peg$r15 = /^[Dd]/;
149
+ const peg$r16 = /^[Nn]/;
150
+ const peg$r17 = /^[Oo]/;
151
+ const peg$r18 = /^[Ee]/;
152
+ const peg$r19 = /^[Uu]/;
153
+ const peg$r20 = /^[Bb]/;
154
+ const peg$r21 = /^[ \t\r\n]/;
155
+ const peg$r22 = /^[^\n]/;
158
156
  const peg$e0 = peg$literalExpectation("{", false);
159
157
  const peg$e1 = peg$literalExpectation("}", false);
160
158
  const peg$e2 = peg$literalExpectation(";", false);
161
- const peg$e3 = peg$literalExpectation("[", false);
162
- const peg$e4 = peg$literalExpectation("]", false);
163
- const peg$e5 = peg$classExpectation([";", ","], false, false, false);
164
- const peg$e6 = peg$literalExpectation("=", false);
159
+ const peg$e3 = peg$literalExpectation("=", false);
160
+ const peg$e4 = peg$literalExpectation("[", false);
161
+ const peg$e5 = peg$literalExpectation("]", false);
162
+ const peg$e6 = peg$classExpectation([";", ","], false, false, false);
165
163
  const peg$e7 = peg$literalExpectation(":", false);
166
164
  const peg$e8 = peg$otherExpectation("edge operator");
167
165
  const peg$e9 = peg$literalExpectation("->", false);
@@ -181,30 +179,28 @@ function peg$parse(input, options) {
181
179
  const peg$e23 = peg$literalExpectation("-", false);
182
180
  const peg$e24 = peg$classExpectation([["0", "9"]], false, false, false);
183
181
  const peg$e25 = peg$literalExpectation(".", false);
184
- const peg$e26 = peg$classExpectation(["e", "E"], false, false, false);
185
- const peg$e27 = peg$classExpectation(["+", "-"], false, false, false);
186
- const peg$e28 = peg$classExpectation(["S", "s"], false, false, false);
187
- const peg$e29 = peg$classExpectation(["T", "t"], false, false, false);
188
- const peg$e30 = peg$classExpectation(["R", "r"], false, false, false);
189
- const peg$e31 = peg$classExpectation(["I", "i"], false, false, false);
190
- const peg$e32 = peg$classExpectation(["C", "c"], false, false, false);
191
- const peg$e33 = peg$classExpectation(["G", "g"], false, false, false);
192
- const peg$e34 = peg$classExpectation(["A", "a"], false, false, false);
193
- const peg$e35 = peg$classExpectation(["P", "p"], false, false, false);
194
- const peg$e36 = peg$classExpectation(["H", "h"], false, false, false);
195
- const peg$e37 = peg$classExpectation(["D", "d"], false, false, false);
196
- const peg$e38 = peg$classExpectation(["N", "n"], false, false, false);
197
- const peg$e39 = peg$classExpectation(["O", "o"], false, false, false);
198
- const peg$e40 = peg$classExpectation(["E", "e"], false, false, false);
199
- const peg$e41 = peg$classExpectation(["U", "u"], false, false, false);
200
- const peg$e42 = peg$classExpectation(["B", "b"], false, false, false);
201
- const peg$e43 = peg$classExpectation([" ", " ", "\r", "\n"], false, false, false);
202
- const peg$e44 = peg$literalExpectation("/*", false);
203
- const peg$e45 = peg$literalExpectation("*/", false);
204
- const peg$e46 = peg$literalExpectation("//", false);
205
- const peg$e47 = peg$classExpectation(["\n"], true, false, false);
206
- const peg$e48 = peg$literalExpectation("\n", false);
207
- const peg$e49 = peg$literalExpectation("#", false);
182
+ const peg$e26 = peg$classExpectation(["S", "s"], false, false, false);
183
+ const peg$e27 = peg$classExpectation(["T", "t"], false, false, false);
184
+ const peg$e28 = peg$classExpectation(["R", "r"], false, false, false);
185
+ const peg$e29 = peg$classExpectation(["I", "i"], false, false, false);
186
+ const peg$e30 = peg$classExpectation(["C", "c"], false, false, false);
187
+ const peg$e31 = peg$classExpectation(["G", "g"], false, false, false);
188
+ const peg$e32 = peg$classExpectation(["A", "a"], false, false, false);
189
+ const peg$e33 = peg$classExpectation(["P", "p"], false, false, false);
190
+ const peg$e34 = peg$classExpectation(["H", "h"], false, false, false);
191
+ const peg$e35 = peg$classExpectation(["D", "d"], false, false, false);
192
+ const peg$e36 = peg$classExpectation(["N", "n"], false, false, false);
193
+ const peg$e37 = peg$classExpectation(["O", "o"], false, false, false);
194
+ const peg$e38 = peg$classExpectation(["E", "e"], false, false, false);
195
+ const peg$e39 = peg$classExpectation(["U", "u"], false, false, false);
196
+ const peg$e40 = peg$classExpectation(["B", "b"], false, false, false);
197
+ const peg$e41 = peg$classExpectation([" ", " ", "\r", "\n"], false, false, false);
198
+ const peg$e42 = peg$literalExpectation("/*", false);
199
+ const peg$e43 = peg$literalExpectation("*/", false);
200
+ const peg$e44 = peg$literalExpectation("//", false);
201
+ const peg$e45 = peg$classExpectation(["\n"], true, false, false);
202
+ const peg$e46 = peg$literalExpectation("\n", false);
203
+ const peg$e47 = peg$literalExpectation("#", false);
208
204
  function peg$f0(s, t, id, stmts) {
209
205
  return {
210
206
  type: "graph",
@@ -247,37 +243,44 @@ function peg$parse(input, options) {
247
243
  function peg$f11(s) {
248
244
  return s;
249
245
  }
250
- function peg$f12(t, attrs) {
246
+ function peg$f12(t, m, attrs) {
247
+ if (m) console.error("Warning: attribute macros not implemented");
251
248
  return { type: "attr", target: t, attrs };
252
249
  }
253
250
  function peg$f13(a) {
254
251
  return { type: "assign", key: a.key, value: a.value };
255
252
  }
256
253
  function peg$f14() {
257
- return "graph";
254
+ return true;
258
255
  }
259
256
  function peg$f15() {
260
- return "node";
257
+ return false;
261
258
  }
262
259
  function peg$f16() {
260
+ return "graph";
261
+ }
262
+ function peg$f17() {
263
+ return "node";
264
+ }
265
+ function peg$f18() {
263
266
  return "edge";
264
267
  }
265
- function peg$f17(defs, rest) {
268
+ function peg$f19(defs, rest) {
266
269
  return defs.concat(rest);
267
270
  }
268
- function peg$f18() {
271
+ function peg$f20() {
269
272
  return [];
270
273
  }
271
- function peg$f19(a) {
274
+ function peg$f21(a) {
272
275
  return a;
273
276
  }
274
- function peg$f20(pairs) {
277
+ function peg$f22(pairs) {
275
278
  return pairs;
276
279
  }
277
- function peg$f21(k, v) {
280
+ function peg$f23(k, v) {
278
281
  return { key: k, value: v };
279
282
  }
280
- function peg$f22(head, chain, attrs) {
283
+ function peg$f24(head, chain, attrs) {
281
284
  if (chain.length > 0) {
282
285
  const nodes = [head].concat(chain);
283
286
  return { type: "edge", nodes, attrs };
@@ -288,70 +291,70 @@ function peg$parse(input, options) {
288
291
  return { type: "node", id: head, attrs };
289
292
  }
290
293
  }
291
- function peg$f23(s) {
294
+ function peg$f25(s) {
292
295
  return s;
293
296
  }
294
- function peg$f24(n) {
297
+ function peg$f26(n) {
295
298
  return n;
296
299
  }
297
- function peg$f25(id, port, compass) {
300
+ function peg$f27(id, port, compass) {
298
301
  return { id, port, compass };
299
302
  }
300
- function peg$f26(id, port) {
303
+ function peg$f28(id, port) {
301
304
  return { id, port, compass: null };
302
305
  }
303
- function peg$f27(id) {
306
+ function peg$f29(id) {
304
307
  return { id, port: null, compass: null };
305
308
  }
306
- function peg$f28(s, rest) {
309
+ function peg$f30(s, rest) {
307
310
  return [s].concat(rest);
308
311
  }
309
- function peg$f29() {
312
+ function peg$f31() {
310
313
  return [];
311
314
  }
312
- function peg$f30(id, stmts) {
315
+ function peg$f32(id, stmts) {
313
316
  return { type: "subgraph", id, stmts };
314
317
  }
315
- function peg$f31(stmts) {
318
+ function peg$f33(stmts) {
316
319
  return { type: "subgraph", id: null, stmts };
317
320
  }
318
- function peg$f32(stmts) {
321
+ function peg$f34(stmts) {
319
322
  return { type: "subgraph", id: null, stmts };
320
323
  }
321
- function peg$f33(first, s) {
324
+ function peg$f35(first, s) {
322
325
  return s;
323
326
  }
324
- function peg$f34(first, rest) {
327
+ function peg$f36(first, rest) {
325
328
  return rest.length > 0 ? first + rest.join("") : first;
326
329
  }
327
- function peg$f35(chars) {
330
+ function peg$f37(chars) {
328
331
  return chars.join("");
329
332
  }
330
- function peg$f36() {
333
+ function peg$f38() {
331
334
  return '"';
332
335
  }
333
- function peg$f37() {
336
+ function peg$f39() {
334
337
  return "";
335
338
  }
336
- function peg$f38(c) {
339
+ function peg$f40(c) {
337
340
  return "\\" + c;
338
341
  }
339
- function peg$f39(content) {
342
+ function peg$f41(content) {
340
343
  return "" + content;
341
344
  }
342
- function peg$f40(chars) {
345
+ function peg$f42(chars) {
343
346
  return chars.join("");
344
347
  }
345
- function peg$f41(nested2, content) {
348
+ function peg$f43(nested2, content) {
346
349
  return "<" + content + ">";
347
350
  }
348
- function peg$f42(n) {
351
+ function peg$f44(n) {
349
352
  return n;
350
353
  }
351
- function peg$f43(first, rest) {
354
+ function peg$f45(first, rest) {
352
355
  return first + rest.join("");
353
356
  }
354
- function peg$f44(s) {
357
+ function peg$f46(s) {
355
358
  return Array.isArray(s) ? s.flat(Infinity).filter((x) => x !== null && x !== void 0).join("") : String(s);
356
359
  }
357
360
  let peg$currPos = options.peg$currPos | 0;
@@ -722,15 +725,21 @@ function peg$parse(input, options) {
722
725
  return s0;
723
726
  }
724
727
  function peg$parseAttrStmt() {
725
- let s0, s12, s2, s3;
728
+ let s0, s12, s2, s3, s4;
726
729
  s0 = peg$currPos;
727
730
  s12 = peg$parseAttrType();
728
731
  if (s12 !== peg$FAILED) {
729
732
  s2 = peg$parse_();
730
- s3 = peg$parseAttrListReq();
733
+ s3 = peg$parseOptMacroName();
731
734
  if (s3 !== peg$FAILED) {
732
- peg$savedPos = s0;
733
- s0 = peg$f12(s12, s3);
735
+ s4 = peg$parseAttrListReq();
736
+ if (s4 !== peg$FAILED) {
737
+ peg$savedPos = s0;
738
+ s0 = peg$f12(s12, s3, s4);
739
+ } else {
740
+ peg$currPos = s0;
741
+ s0 = peg$FAILED;
742
+ }
734
743
  } else {
735
744
  peg$currPos = s0;
736
745
  s0 = peg$FAILED;
@@ -750,13 +759,49 @@ function peg$parse(input, options) {
750
759
  }
751
760
  return s0;
752
761
  }
762
+ function peg$parseOptMacroName() {
763
+ let s0, s12, s2, s3, s4;
764
+ s0 = peg$currPos;
765
+ s12 = peg$parseAtom();
766
+ if (s12 !== peg$FAILED) {
767
+ s2 = peg$parse_();
768
+ if (input.charCodeAt(peg$currPos) === 61) {
769
+ s3 = peg$c3;
770
+ peg$currPos++;
771
+ } else {
772
+ s3 = peg$FAILED;
773
+ if (peg$silentFails === 0) {
774
+ peg$fail(peg$e3);
775
+ }
776
+ }
777
+ if (s3 !== peg$FAILED) {
778
+ s4 = peg$parse_();
779
+ peg$savedPos = s0;
780
+ s0 = peg$f14();
781
+ } else {
782
+ peg$currPos = s0;
783
+ s0 = peg$FAILED;
784
+ }
785
+ } else {
786
+ peg$currPos = s0;
787
+ s0 = peg$FAILED;
788
+ }
789
+ if (s0 === peg$FAILED) {
790
+ s0 = peg$currPos;
791
+ s12 = "";
792
+ peg$savedPos = s0;
793
+ s12 = peg$f15();
794
+ s0 = s12;
795
+ }
796
+ return s0;
797
+ }
753
798
  function peg$parseAttrType() {
754
799
  let s0, s12;
755
800
  s0 = peg$currPos;
756
801
  s12 = peg$parseGraphKw();
757
802
  if (s12 !== peg$FAILED) {
758
803
  peg$savedPos = s0;
759
- s12 = peg$f14();
804
+ s12 = peg$f16();
760
805
  }
761
806
  s0 = s12;
762
807
  if (s0 === peg$FAILED) {
@@ -764,7 +809,7 @@ function peg$parse(input, options) {
764
809
  s12 = peg$parseNodeKw();
765
810
  if (s12 !== peg$FAILED) {
766
811
  peg$savedPos = s0;
767
- s12 = peg$f15();
812
+ s12 = peg$f17();
768
813
  }
769
814
  s0 = s12;
770
815
  if (s0 === peg$FAILED) {
@@ -772,7 +817,7 @@ function peg$parse(input, options) {
772
817
  s12 = peg$parseEdgeKw();
773
818
  if (s12 !== peg$FAILED) {
774
819
  peg$savedPos = s0;
775
- s12 = peg$f16();
820
+ s12 = peg$f18();
776
821
  }
777
822
  s0 = s12;
778
823
  }
@@ -784,12 +829,12 @@ function peg$parse(input, options) {
784
829
  s0 = peg$currPos;
785
830
  s12 = peg$parse_();
786
831
  if (input.charCodeAt(peg$currPos) === 91) {
787
- s2 = peg$c3;
832
+ s2 = peg$c4;
788
833
  peg$currPos++;
789
834
  } else {
790
835
  s2 = peg$FAILED;
791
836
  if (peg$silentFails === 0) {
792
- peg$fail(peg$e3);
837
+ peg$fail(peg$e4);
793
838
  }
794
839
  }
795
840
  if (s2 !== peg$FAILED) {
@@ -797,19 +842,19 @@ function peg$parse(input, options) {
797
842
  s4 = peg$parseAttrDefs();
798
843
  s5 = peg$parse_();
799
844
  if (input.charCodeAt(peg$currPos) === 93) {
800
- s6 = peg$c4;
845
+ s6 = peg$c5;
801
846
  peg$currPos++;
802
847
  } else {
803
848
  s6 = peg$FAILED;
804
849
  if (peg$silentFails === 0) {
805
- peg$fail(peg$e4);
850
+ peg$fail(peg$e5);
806
851
  }
807
852
  }
808
853
  if (s6 !== peg$FAILED) {
809
854
  s7 = peg$parseAttrList();
810
855
  if (s7 !== peg$FAILED) {
811
856
  peg$savedPos = s0;
812
- s0 = peg$f17(s4, s7);
857
+ s0 = peg$f19(s4, s7);
813
858
  } else {
814
859
  peg$currPos = s0;
815
860
  s0 = peg$FAILED;
@@ -831,7 +876,7 @@ function peg$parse(input, options) {
831
876
  s0 = peg$currPos;
832
877
  s12 = "";
833
878
  peg$savedPos = s0;
834
- s12 = peg$f18();
879
+ s12 = peg$f20();
835
880
  s0 = s12;
836
881
  }
837
882
  return s0;
@@ -851,7 +896,7 @@ function peg$parse(input, options) {
851
896
  } else {
852
897
  s6 = peg$FAILED;
853
898
  if (peg$silentFails === 0) {
854
- peg$fail(peg$e5);
899
+ peg$fail(peg$e6);
855
900
  }
856
901
  }
857
902
  if (s6 !== peg$FAILED) {
@@ -866,7 +911,7 @@ function peg$parse(input, options) {
866
911
  s5 = null;
867
912
  }
868
913
  peg$savedPos = s2;
869
- s2 = peg$f19(s3);
914
+ s2 = peg$f21(s3);
870
915
  } else {
871
916
  peg$currPos = s2;
872
917
  s2 = peg$FAILED;
@@ -884,7 +929,7 @@ function peg$parse(input, options) {
884
929
  } else {
885
930
  s6 = peg$FAILED;
886
931
  if (peg$silentFails === 0) {
887
- peg$fail(peg$e5);
932
+ peg$fail(peg$e6);
888
933
  }
889
934
  }
890
935
  if (s6 !== peg$FAILED) {
@@ -899,14 +944,14 @@ function peg$parse(input, options) {
899
944
  s5 = null;
900
945
  }
901
946
  peg$savedPos = s2;
902
- s2 = peg$f19(s3);
947
+ s2 = peg$f21(s3);
903
948
  } else {
904
949
  peg$currPos = s2;
905
950
  s2 = peg$FAILED;
906
951
  }
907
952
  }
908
953
  peg$savedPos = s0;
909
- s12 = peg$f20(s12);
954
+ s12 = peg$f22(s12);
910
955
  s0 = s12;
911
956
  return s0;
912
957
  }
@@ -917,12 +962,12 @@ function peg$parse(input, options) {
917
962
  if (s12 !== peg$FAILED) {
918
963
  s2 = peg$parse_();
919
964
  if (input.charCodeAt(peg$currPos) === 61) {
920
- s3 = peg$c5;
965
+ s3 = peg$c3;
921
966
  peg$currPos++;
922
967
  } else {
923
968
  s3 = peg$FAILED;
924
969
  if (peg$silentFails === 0) {
925
- peg$fail(peg$e6);
970
+ peg$fail(peg$e3);
926
971
  }
927
972
  }
928
973
  if (s3 !== peg$FAILED) {
@@ -930,7 +975,7 @@ function peg$parse(input, options) {
930
975
  s5 = peg$parseAtom();
931
976
  if (s5 !== peg$FAILED) {
932
977
  peg$savedPos = s0;
933
- s0 = peg$f21(s12, s5);
978
+ s0 = peg$f23(s12, s5);
934
979
  } else {
935
980
  peg$currPos = s0;
936
981
  s0 = peg$FAILED;
@@ -957,7 +1002,7 @@ function peg$parse(input, options) {
957
1002
  s5 = peg$parseAttrList();
958
1003
  if (s5 !== peg$FAILED) {
959
1004
  peg$savedPos = s0;
960
- s0 = peg$f22(s12, s3, s5);
1005
+ s0 = peg$f24(s12, s3, s5);
961
1006
  } else {
962
1007
  peg$currPos = s0;
963
1008
  s0 = peg$FAILED;
@@ -978,7 +1023,7 @@ function peg$parse(input, options) {
978
1023
  s12 = peg$parseSubgraph();
979
1024
  if (s12 !== peg$FAILED) {
980
1025
  peg$savedPos = s0;
981
- s12 = peg$f23(s12);
1026
+ s12 = peg$f25(s12);
982
1027
  }
983
1028
  s0 = s12;
984
1029
  if (s0 === peg$FAILED) {
@@ -986,7 +1031,7 @@ function peg$parse(input, options) {
986
1031
  s12 = peg$parseNode();
987
1032
  if (s12 !== peg$FAILED) {
988
1033
  peg$savedPos = s0;
989
- s12 = peg$f24(s12);
1034
+ s12 = peg$f26(s12);
990
1035
  }
991
1036
  s0 = s12;
992
1037
  }
@@ -1026,7 +1071,7 @@ function peg$parse(input, options) {
1026
1071
  s9 = peg$parseAtom();
1027
1072
  if (s9 !== peg$FAILED) {
1028
1073
  peg$savedPos = s0;
1029
- s0 = peg$f25(s12, s5, s9);
1074
+ s0 = peg$f27(s12, s5, s9);
1030
1075
  } else {
1031
1076
  peg$currPos = s0;
1032
1077
  s0 = peg$FAILED;
@@ -1066,7 +1111,7 @@ function peg$parse(input, options) {
1066
1111
  s5 = peg$parseAtom();
1067
1112
  if (s5 !== peg$FAILED) {
1068
1113
  peg$savedPos = s0;
1069
- s0 = peg$f26(s12, s5);
1114
+ s0 = peg$f28(s12, s5);
1070
1115
  } else {
1071
1116
  peg$currPos = s0;
1072
1117
  s0 = peg$FAILED;
@@ -1084,7 +1129,7 @@ function peg$parse(input, options) {
1084
1129
  s12 = peg$parseAtom();
1085
1130
  if (s12 !== peg$FAILED) {
1086
1131
  peg$savedPos = s0;
1087
- s12 = peg$f27(s12);
1132
+ s12 = peg$f29(s12);
1088
1133
  }
1089
1134
  s0 = s12;
1090
1135
  }
@@ -1103,7 +1148,7 @@ function peg$parse(input, options) {
1103
1148
  s5 = peg$parseEdgeChain();
1104
1149
  if (s5 !== peg$FAILED) {
1105
1150
  peg$savedPos = s0;
1106
- s0 = peg$f28(s3, s5);
1151
+ s0 = peg$f30(s3, s5);
1107
1152
  } else {
1108
1153
  peg$currPos = s0;
1109
1154
  s0 = peg$FAILED;
@@ -1120,7 +1165,7 @@ function peg$parse(input, options) {
1120
1165
  s0 = peg$currPos;
1121
1166
  s12 = "";
1122
1167
  peg$savedPos = s0;
1123
- s12 = peg$f29();
1168
+ s12 = peg$f31();
1124
1169
  s0 = s12;
1125
1170
  }
1126
1171
  return s0;
@@ -1191,7 +1236,7 @@ function peg$parse(input, options) {
1191
1236
  }
1192
1237
  if (s9 !== peg$FAILED) {
1193
1238
  peg$savedPos = s0;
1194
- s0 = peg$f30(s3, s7);
1239
+ s0 = peg$f32(s3, s7);
1195
1240
  } else {
1196
1241
  peg$currPos = s0;
1197
1242
  s0 = peg$FAILED;
@@ -1242,7 +1287,7 @@ function peg$parse(input, options) {
1242
1287
  }
1243
1288
  if (s7 !== peg$FAILED) {
1244
1289
  peg$savedPos = s0;
1245
- s0 = peg$f31(s5);
1290
+ s0 = peg$f33(s5);
1246
1291
  } else {
1247
1292
  peg$currPos = s0;
1248
1293
  s0 = peg$FAILED;
@@ -1286,7 +1331,7 @@ function peg$parse(input, options) {
1286
1331
  }
1287
1332
  if (s5 !== peg$FAILED) {
1288
1333
  peg$savedPos = s0;
1289
- s0 = peg$f32(s3);
1334
+ s0 = peg$f34(s3);
1290
1335
  } else {
1291
1336
  peg$currPos = s0;
1292
1337
  s0 = peg$FAILED;
@@ -1325,7 +1370,7 @@ function peg$parse(input, options) {
1325
1370
  s7 = peg$parseQAtom();
1326
1371
  if (s7 !== peg$FAILED) {
1327
1372
  peg$savedPos = s3;
1328
- s3 = peg$f33(s12, s7);
1373
+ s3 = peg$f35(s12, s7);
1329
1374
  } else {
1330
1375
  peg$currPos = s3;
1331
1376
  s3 = peg$FAILED;
@@ -1352,7 +1397,7 @@ function peg$parse(input, options) {
1352
1397
  s7 = peg$parseQAtom();
1353
1398
  if (s7 !== peg$FAILED) {
1354
1399
  peg$savedPos = s3;
1355
- s3 = peg$f33(s12, s7);
1400
+ s3 = peg$f35(s12, s7);
1356
1401
  } else {
1357
1402
  peg$currPos = s3;
1358
1403
  s3 = peg$FAILED;
@@ -1363,7 +1408,7 @@ function peg$parse(input, options) {
1363
1408
  }
1364
1409
  }
1365
1410
  peg$savedPos = s0;
1366
- s0 = peg$f34(s12, s2);
1411
+ s0 = peg$f36(s12, s2);
1367
1412
  } else {
1368
1413
  peg$currPos = s0;
1369
1414
  s0 = peg$FAILED;
@@ -1411,7 +1456,7 @@ function peg$parse(input, options) {
1411
1456
  }
1412
1457
  if (s3 !== peg$FAILED) {
1413
1458
  peg$savedPos = s0;
1414
- s0 = peg$f35(s2);
1459
+ s0 = peg$f37(s2);
1415
1460
  } else {
1416
1461
  peg$currPos = s0;
1417
1462
  s0 = peg$FAILED;
@@ -1436,7 +1481,7 @@ function peg$parse(input, options) {
1436
1481
  }
1437
1482
  if (s12 !== peg$FAILED) {
1438
1483
  peg$savedPos = s0;
1439
- s12 = peg$f36();
1484
+ s12 = peg$f38();
1440
1485
  }
1441
1486
  s0 = s12;
1442
1487
  if (s0 === peg$FAILED) {
@@ -1452,7 +1497,7 @@ function peg$parse(input, options) {
1452
1497
  }
1453
1498
  if (s12 !== peg$FAILED) {
1454
1499
  peg$savedPos = s0;
1455
- s12 = peg$f37();
1500
+ s12 = peg$f39();
1456
1501
  }
1457
1502
  s0 = s12;
1458
1503
  if (s0 === peg$FAILED) {
@@ -1478,7 +1523,7 @@ function peg$parse(input, options) {
1478
1523
  }
1479
1524
  if (s2 !== peg$FAILED) {
1480
1525
  peg$savedPos = s0;
1481
- s0 = peg$f38(s2);
1526
+ s0 = peg$f40(s2);
1482
1527
  } else {
1483
1528
  peg$currPos = s0;
1484
1529
  s0 = peg$FAILED;
@@ -1527,7 +1572,7 @@ function peg$parse(input, options) {
1527
1572
  }
1528
1573
  if (s3 !== peg$FAILED) {
1529
1574
  peg$savedPos = s0;
1530
- s0 = peg$f39(s2);
1575
+ s0 = peg$f41(s2);
1531
1576
  } else {
1532
1577
  peg$currPos = s0;
1533
1578
  s0 = peg$FAILED;
@@ -1548,7 +1593,7 @@ function peg$parse(input, options) {
1548
1593
  s2 = peg$parseHtmlChar();
1549
1594
  }
1550
1595
  peg$savedPos = s0;
1551
- s12 = peg$f40(s12);
1596
+ s12 = peg$f42(s12);
1552
1597
  s0 = s12;
1553
1598
  return s0;
1554
1599
  }
@@ -1578,7 +1623,7 @@ function peg$parse(input, options) {
1578
1623
  }
1579
1624
  if (s3 !== peg$FAILED) {
1580
1625
  peg$savedPos = s0;
1581
- s0 = peg$f41(s12, s2);
1626
+ s0 = peg$f43(s12, s2);
1582
1627
  } else {
1583
1628
  peg$currPos = s0;
1584
1629
  s0 = peg$FAILED;
@@ -1623,7 +1668,7 @@ function peg$parse(input, options) {
1623
1668
  s2 = peg$parseName();
1624
1669
  if (s2 !== peg$FAILED) {
1625
1670
  peg$savedPos = s0;
1626
- s0 = peg$f42(s2);
1671
+ s0 = peg$f44(s2);
1627
1672
  } else {
1628
1673
  peg$currPos = s0;
1629
1674
  s0 = peg$FAILED;
@@ -1671,7 +1716,7 @@ function peg$parse(input, options) {
1671
1716
  }
1672
1717
  }
1673
1718
  peg$savedPos = s0;
1674
- s0 = peg$f43(s12, s2);
1719
+ s0 = peg$f45(s12, s2);
1675
1720
  } else {
1676
1721
  peg$currPos = s0;
1677
1722
  s0 = peg$FAILED;
@@ -1821,70 +1866,7 @@ function peg$parse(input, options) {
1821
1866
  }
1822
1867
  }
1823
1868
  if (s3 !== peg$FAILED) {
1824
- s4 = peg$currPos;
1825
- s5 = input.charAt(peg$currPos);
1826
- if (peg$r6.test(s5)) {
1827
- peg$currPos++;
1828
- } else {
1829
- s5 = peg$FAILED;
1830
- if (peg$silentFails === 0) {
1831
- peg$fail(peg$e26);
1832
- }
1833
- }
1834
- if (s5 !== peg$FAILED) {
1835
- s6 = input.charAt(peg$currPos);
1836
- if (peg$r7.test(s6)) {
1837
- peg$currPos++;
1838
- } else {
1839
- s6 = peg$FAILED;
1840
- if (peg$silentFails === 0) {
1841
- peg$fail(peg$e27);
1842
- }
1843
- }
1844
- if (s6 === peg$FAILED) {
1845
- s6 = null;
1846
- }
1847
- s7 = [];
1848
- s8 = input.charAt(peg$currPos);
1849
- if (peg$r5.test(s8)) {
1850
- peg$currPos++;
1851
- } else {
1852
- s8 = peg$FAILED;
1853
- if (peg$silentFails === 0) {
1854
- peg$fail(peg$e24);
1855
- }
1856
- }
1857
- if (s8 !== peg$FAILED) {
1858
- while (s8 !== peg$FAILED) {
1859
- s7.push(s8);
1860
- s8 = input.charAt(peg$currPos);
1861
- if (peg$r5.test(s8)) {
1862
- peg$currPos++;
1863
- } else {
1864
- s8 = peg$FAILED;
1865
- if (peg$silentFails === 0) {
1866
- peg$fail(peg$e24);
1867
- }
1868
- }
1869
- }
1870
- } else {
1871
- s7 = peg$FAILED;
1872
- }
1873
- if (s7 !== peg$FAILED) {
1874
- s5 = [s5, s6, s7];
1875
- s4 = s5;
1876
- } else {
1877
- peg$currPos = s4;
1878
- s4 = peg$FAILED;
1879
- }
1880
- } else {
1881
- peg$currPos = s4;
1882
- s4 = peg$FAILED;
1883
- }
1884
- if (s4 === peg$FAILED) {
1885
- s4 = null;
1886
- }
1887
- s2 = [s2, s3, s4];
1869
+ s2 = [s2, s3];
1888
1870
  s12 = s2;
1889
1871
  } else {
1890
1872
  peg$currPos = s12;
@@ -1892,7 +1874,7 @@ function peg$parse(input, options) {
1892
1874
  }
1893
1875
  if (s12 !== peg$FAILED) {
1894
1876
  peg$savedPos = s0;
1895
- s12 = peg$f44(s12);
1877
+ s12 = peg$f46(s12);
1896
1878
  }
1897
1879
  s0 = s12;
1898
1880
  return s0;
@@ -1901,62 +1883,62 @@ function peg$parse(input, options) {
1901
1883
  let s0, s12, s2, s3, s4, s5, s6, s7, s8;
1902
1884
  s0 = peg$currPos;
1903
1885
  s12 = input.charAt(peg$currPos);
1904
- if (peg$r8.test(s12)) {
1886
+ if (peg$r6.test(s12)) {
1905
1887
  peg$currPos++;
1906
1888
  } else {
1907
1889
  s12 = peg$FAILED;
1908
1890
  if (peg$silentFails === 0) {
1909
- peg$fail(peg$e28);
1891
+ peg$fail(peg$e26);
1910
1892
  }
1911
1893
  }
1912
1894
  if (s12 !== peg$FAILED) {
1913
1895
  s2 = input.charAt(peg$currPos);
1914
- if (peg$r9.test(s2)) {
1896
+ if (peg$r7.test(s2)) {
1915
1897
  peg$currPos++;
1916
1898
  } else {
1917
1899
  s2 = peg$FAILED;
1918
1900
  if (peg$silentFails === 0) {
1919
- peg$fail(peg$e29);
1901
+ peg$fail(peg$e27);
1920
1902
  }
1921
1903
  }
1922
1904
  if (s2 !== peg$FAILED) {
1923
1905
  s3 = input.charAt(peg$currPos);
1924
- if (peg$r10.test(s3)) {
1906
+ if (peg$r8.test(s3)) {
1925
1907
  peg$currPos++;
1926
1908
  } else {
1927
1909
  s3 = peg$FAILED;
1928
1910
  if (peg$silentFails === 0) {
1929
- peg$fail(peg$e30);
1911
+ peg$fail(peg$e28);
1930
1912
  }
1931
1913
  }
1932
1914
  if (s3 !== peg$FAILED) {
1933
1915
  s4 = input.charAt(peg$currPos);
1934
- if (peg$r11.test(s4)) {
1916
+ if (peg$r9.test(s4)) {
1935
1917
  peg$currPos++;
1936
1918
  } else {
1937
1919
  s4 = peg$FAILED;
1938
1920
  if (peg$silentFails === 0) {
1939
- peg$fail(peg$e31);
1921
+ peg$fail(peg$e29);
1940
1922
  }
1941
1923
  }
1942
1924
  if (s4 !== peg$FAILED) {
1943
1925
  s5 = input.charAt(peg$currPos);
1944
- if (peg$r12.test(s5)) {
1926
+ if (peg$r10.test(s5)) {
1945
1927
  peg$currPos++;
1946
1928
  } else {
1947
1929
  s5 = peg$FAILED;
1948
1930
  if (peg$silentFails === 0) {
1949
- peg$fail(peg$e32);
1931
+ peg$fail(peg$e30);
1950
1932
  }
1951
1933
  }
1952
1934
  if (s5 !== peg$FAILED) {
1953
1935
  s6 = input.charAt(peg$currPos);
1954
- if (peg$r9.test(s6)) {
1936
+ if (peg$r7.test(s6)) {
1955
1937
  peg$currPos++;
1956
1938
  } else {
1957
1939
  s6 = peg$FAILED;
1958
1940
  if (peg$silentFails === 0) {
1959
- peg$fail(peg$e29);
1941
+ peg$fail(peg$e27);
1960
1942
  }
1961
1943
  }
1962
1944
  if (s6 !== peg$FAILED) {
@@ -2007,52 +1989,52 @@ function peg$parse(input, options) {
2007
1989
  let s0, s12, s2, s3, s4, s5, s6, s7;
2008
1990
  s0 = peg$currPos;
2009
1991
  s12 = input.charAt(peg$currPos);
2010
- if (peg$r13.test(s12)) {
1992
+ if (peg$r11.test(s12)) {
2011
1993
  peg$currPos++;
2012
1994
  } else {
2013
1995
  s12 = peg$FAILED;
2014
1996
  if (peg$silentFails === 0) {
2015
- peg$fail(peg$e33);
1997
+ peg$fail(peg$e31);
2016
1998
  }
2017
1999
  }
2018
2000
  if (s12 !== peg$FAILED) {
2019
2001
  s2 = input.charAt(peg$currPos);
2020
- if (peg$r10.test(s2)) {
2002
+ if (peg$r8.test(s2)) {
2021
2003
  peg$currPos++;
2022
2004
  } else {
2023
2005
  s2 = peg$FAILED;
2024
2006
  if (peg$silentFails === 0) {
2025
- peg$fail(peg$e30);
2007
+ peg$fail(peg$e28);
2026
2008
  }
2027
2009
  }
2028
2010
  if (s2 !== peg$FAILED) {
2029
2011
  s3 = input.charAt(peg$currPos);
2030
- if (peg$r14.test(s3)) {
2012
+ if (peg$r12.test(s3)) {
2031
2013
  peg$currPos++;
2032
2014
  } else {
2033
2015
  s3 = peg$FAILED;
2034
2016
  if (peg$silentFails === 0) {
2035
- peg$fail(peg$e34);
2017
+ peg$fail(peg$e32);
2036
2018
  }
2037
2019
  }
2038
2020
  if (s3 !== peg$FAILED) {
2039
2021
  s4 = input.charAt(peg$currPos);
2040
- if (peg$r15.test(s4)) {
2022
+ if (peg$r13.test(s4)) {
2041
2023
  peg$currPos++;
2042
2024
  } else {
2043
2025
  s4 = peg$FAILED;
2044
2026
  if (peg$silentFails === 0) {
2045
- peg$fail(peg$e35);
2027
+ peg$fail(peg$e33);
2046
2028
  }
2047
2029
  }
2048
2030
  if (s4 !== peg$FAILED) {
2049
2031
  s5 = input.charAt(peg$currPos);
2050
- if (peg$r16.test(s5)) {
2032
+ if (peg$r14.test(s5)) {
2051
2033
  peg$currPos++;
2052
2034
  } else {
2053
2035
  s5 = peg$FAILED;
2054
2036
  if (peg$silentFails === 0) {
2055
- peg$fail(peg$e36);
2037
+ peg$fail(peg$e34);
2056
2038
  }
2057
2039
  }
2058
2040
  if (s5 !== peg$FAILED) {
@@ -2099,72 +2081,72 @@ function peg$parse(input, options) {
2099
2081
  let s0, s12, s2, s3, s4, s5, s6, s7, s8, s9;
2100
2082
  s0 = peg$currPos;
2101
2083
  s12 = input.charAt(peg$currPos);
2102
- if (peg$r17.test(s12)) {
2084
+ if (peg$r15.test(s12)) {
2103
2085
  peg$currPos++;
2104
2086
  } else {
2105
2087
  s12 = peg$FAILED;
2106
2088
  if (peg$silentFails === 0) {
2107
- peg$fail(peg$e37);
2089
+ peg$fail(peg$e35);
2108
2090
  }
2109
2091
  }
2110
2092
  if (s12 !== peg$FAILED) {
2111
2093
  s2 = input.charAt(peg$currPos);
2112
- if (peg$r11.test(s2)) {
2094
+ if (peg$r9.test(s2)) {
2113
2095
  peg$currPos++;
2114
2096
  } else {
2115
2097
  s2 = peg$FAILED;
2116
2098
  if (peg$silentFails === 0) {
2117
- peg$fail(peg$e31);
2099
+ peg$fail(peg$e29);
2118
2100
  }
2119
2101
  }
2120
2102
  if (s2 !== peg$FAILED) {
2121
2103
  s3 = input.charAt(peg$currPos);
2122
- if (peg$r13.test(s3)) {
2104
+ if (peg$r11.test(s3)) {
2123
2105
  peg$currPos++;
2124
2106
  } else {
2125
2107
  s3 = peg$FAILED;
2126
2108
  if (peg$silentFails === 0) {
2127
- peg$fail(peg$e33);
2109
+ peg$fail(peg$e31);
2128
2110
  }
2129
2111
  }
2130
2112
  if (s3 !== peg$FAILED) {
2131
2113
  s4 = input.charAt(peg$currPos);
2132
- if (peg$r10.test(s4)) {
2114
+ if (peg$r8.test(s4)) {
2133
2115
  peg$currPos++;
2134
2116
  } else {
2135
2117
  s4 = peg$FAILED;
2136
2118
  if (peg$silentFails === 0) {
2137
- peg$fail(peg$e30);
2119
+ peg$fail(peg$e28);
2138
2120
  }
2139
2121
  }
2140
2122
  if (s4 !== peg$FAILED) {
2141
2123
  s5 = input.charAt(peg$currPos);
2142
- if (peg$r14.test(s5)) {
2124
+ if (peg$r12.test(s5)) {
2143
2125
  peg$currPos++;
2144
2126
  } else {
2145
2127
  s5 = peg$FAILED;
2146
2128
  if (peg$silentFails === 0) {
2147
- peg$fail(peg$e34);
2129
+ peg$fail(peg$e32);
2148
2130
  }
2149
2131
  }
2150
2132
  if (s5 !== peg$FAILED) {
2151
2133
  s6 = input.charAt(peg$currPos);
2152
- if (peg$r15.test(s6)) {
2134
+ if (peg$r13.test(s6)) {
2153
2135
  peg$currPos++;
2154
2136
  } else {
2155
2137
  s6 = peg$FAILED;
2156
2138
  if (peg$silentFails === 0) {
2157
- peg$fail(peg$e35);
2139
+ peg$fail(peg$e33);
2158
2140
  }
2159
2141
  }
2160
2142
  if (s6 !== peg$FAILED) {
2161
2143
  s7 = input.charAt(peg$currPos);
2162
- if (peg$r16.test(s7)) {
2144
+ if (peg$r14.test(s7)) {
2163
2145
  peg$currPos++;
2164
2146
  } else {
2165
2147
  s7 = peg$FAILED;
2166
2148
  if (peg$silentFails === 0) {
2167
- peg$fail(peg$e36);
2149
+ peg$fail(peg$e34);
2168
2150
  }
2169
2151
  }
2170
2152
  if (s7 !== peg$FAILED) {
@@ -2219,42 +2201,42 @@ function peg$parse(input, options) {
2219
2201
  let s0, s12, s2, s3, s4, s5, s6;
2220
2202
  s0 = peg$currPos;
2221
2203
  s12 = input.charAt(peg$currPos);
2222
- if (peg$r18.test(s12)) {
2204
+ if (peg$r16.test(s12)) {
2223
2205
  peg$currPos++;
2224
2206
  } else {
2225
2207
  s12 = peg$FAILED;
2226
2208
  if (peg$silentFails === 0) {
2227
- peg$fail(peg$e38);
2209
+ peg$fail(peg$e36);
2228
2210
  }
2229
2211
  }
2230
2212
  if (s12 !== peg$FAILED) {
2231
2213
  s2 = input.charAt(peg$currPos);
2232
- if (peg$r19.test(s2)) {
2214
+ if (peg$r17.test(s2)) {
2233
2215
  peg$currPos++;
2234
2216
  } else {
2235
2217
  s2 = peg$FAILED;
2236
2218
  if (peg$silentFails === 0) {
2237
- peg$fail(peg$e39);
2219
+ peg$fail(peg$e37);
2238
2220
  }
2239
2221
  }
2240
2222
  if (s2 !== peg$FAILED) {
2241
2223
  s3 = input.charAt(peg$currPos);
2242
- if (peg$r17.test(s3)) {
2224
+ if (peg$r15.test(s3)) {
2243
2225
  peg$currPos++;
2244
2226
  } else {
2245
2227
  s3 = peg$FAILED;
2246
2228
  if (peg$silentFails === 0) {
2247
- peg$fail(peg$e37);
2229
+ peg$fail(peg$e35);
2248
2230
  }
2249
2231
  }
2250
2232
  if (s3 !== peg$FAILED) {
2251
2233
  s4 = input.charAt(peg$currPos);
2252
- if (peg$r20.test(s4)) {
2234
+ if (peg$r18.test(s4)) {
2253
2235
  peg$currPos++;
2254
2236
  } else {
2255
2237
  s4 = peg$FAILED;
2256
2238
  if (peg$silentFails === 0) {
2257
- peg$fail(peg$e40);
2239
+ peg$fail(peg$e38);
2258
2240
  }
2259
2241
  }
2260
2242
  if (s4 !== peg$FAILED) {
@@ -2297,42 +2279,42 @@ function peg$parse(input, options) {
2297
2279
  let s0, s12, s2, s3, s4, s5, s6;
2298
2280
  s0 = peg$currPos;
2299
2281
  s12 = input.charAt(peg$currPos);
2300
- if (peg$r20.test(s12)) {
2282
+ if (peg$r18.test(s12)) {
2301
2283
  peg$currPos++;
2302
2284
  } else {
2303
2285
  s12 = peg$FAILED;
2304
2286
  if (peg$silentFails === 0) {
2305
- peg$fail(peg$e40);
2287
+ peg$fail(peg$e38);
2306
2288
  }
2307
2289
  }
2308
2290
  if (s12 !== peg$FAILED) {
2309
2291
  s2 = input.charAt(peg$currPos);
2310
- if (peg$r17.test(s2)) {
2292
+ if (peg$r15.test(s2)) {
2311
2293
  peg$currPos++;
2312
2294
  } else {
2313
2295
  s2 = peg$FAILED;
2314
2296
  if (peg$silentFails === 0) {
2315
- peg$fail(peg$e37);
2297
+ peg$fail(peg$e35);
2316
2298
  }
2317
2299
  }
2318
2300
  if (s2 !== peg$FAILED) {
2319
2301
  s3 = input.charAt(peg$currPos);
2320
- if (peg$r13.test(s3)) {
2302
+ if (peg$r11.test(s3)) {
2321
2303
  peg$currPos++;
2322
2304
  } else {
2323
2305
  s3 = peg$FAILED;
2324
2306
  if (peg$silentFails === 0) {
2325
- peg$fail(peg$e33);
2307
+ peg$fail(peg$e31);
2326
2308
  }
2327
2309
  }
2328
2310
  if (s3 !== peg$FAILED) {
2329
2311
  s4 = input.charAt(peg$currPos);
2330
- if (peg$r20.test(s4)) {
2312
+ if (peg$r18.test(s4)) {
2331
2313
  peg$currPos++;
2332
2314
  } else {
2333
2315
  s4 = peg$FAILED;
2334
2316
  if (peg$silentFails === 0) {
2335
- peg$fail(peg$e40);
2317
+ peg$fail(peg$e38);
2336
2318
  }
2337
2319
  }
2338
2320
  if (s4 !== peg$FAILED) {
@@ -2375,82 +2357,82 @@ function peg$parse(input, options) {
2375
2357
  let s0, s12, s2, s3, s4, s5, s6, s7, s8, s9, s10;
2376
2358
  s0 = peg$currPos;
2377
2359
  s12 = input.charAt(peg$currPos);
2378
- if (peg$r8.test(s12)) {
2360
+ if (peg$r6.test(s12)) {
2379
2361
  peg$currPos++;
2380
2362
  } else {
2381
2363
  s12 = peg$FAILED;
2382
2364
  if (peg$silentFails === 0) {
2383
- peg$fail(peg$e28);
2365
+ peg$fail(peg$e26);
2384
2366
  }
2385
2367
  }
2386
2368
  if (s12 !== peg$FAILED) {
2387
2369
  s2 = input.charAt(peg$currPos);
2388
- if (peg$r21.test(s2)) {
2370
+ if (peg$r19.test(s2)) {
2389
2371
  peg$currPos++;
2390
2372
  } else {
2391
2373
  s2 = peg$FAILED;
2392
2374
  if (peg$silentFails === 0) {
2393
- peg$fail(peg$e41);
2375
+ peg$fail(peg$e39);
2394
2376
  }
2395
2377
  }
2396
2378
  if (s2 !== peg$FAILED) {
2397
2379
  s3 = input.charAt(peg$currPos);
2398
- if (peg$r22.test(s3)) {
2380
+ if (peg$r20.test(s3)) {
2399
2381
  peg$currPos++;
2400
2382
  } else {
2401
2383
  s3 = peg$FAILED;
2402
2384
  if (peg$silentFails === 0) {
2403
- peg$fail(peg$e42);
2385
+ peg$fail(peg$e40);
2404
2386
  }
2405
2387
  }
2406
2388
  if (s3 !== peg$FAILED) {
2407
2389
  s4 = input.charAt(peg$currPos);
2408
- if (peg$r13.test(s4)) {
2390
+ if (peg$r11.test(s4)) {
2409
2391
  peg$currPos++;
2410
2392
  } else {
2411
2393
  s4 = peg$FAILED;
2412
2394
  if (peg$silentFails === 0) {
2413
- peg$fail(peg$e33);
2395
+ peg$fail(peg$e31);
2414
2396
  }
2415
2397
  }
2416
2398
  if (s4 !== peg$FAILED) {
2417
2399
  s5 = input.charAt(peg$currPos);
2418
- if (peg$r10.test(s5)) {
2400
+ if (peg$r8.test(s5)) {
2419
2401
  peg$currPos++;
2420
2402
  } else {
2421
2403
  s5 = peg$FAILED;
2422
2404
  if (peg$silentFails === 0) {
2423
- peg$fail(peg$e30);
2405
+ peg$fail(peg$e28);
2424
2406
  }
2425
2407
  }
2426
2408
  if (s5 !== peg$FAILED) {
2427
2409
  s6 = input.charAt(peg$currPos);
2428
- if (peg$r14.test(s6)) {
2410
+ if (peg$r12.test(s6)) {
2429
2411
  peg$currPos++;
2430
2412
  } else {
2431
2413
  s6 = peg$FAILED;
2432
2414
  if (peg$silentFails === 0) {
2433
- peg$fail(peg$e34);
2415
+ peg$fail(peg$e32);
2434
2416
  }
2435
2417
  }
2436
2418
  if (s6 !== peg$FAILED) {
2437
2419
  s7 = input.charAt(peg$currPos);
2438
- if (peg$r15.test(s7)) {
2420
+ if (peg$r13.test(s7)) {
2439
2421
  peg$currPos++;
2440
2422
  } else {
2441
2423
  s7 = peg$FAILED;
2442
2424
  if (peg$silentFails === 0) {
2443
- peg$fail(peg$e35);
2425
+ peg$fail(peg$e33);
2444
2426
  }
2445
2427
  }
2446
2428
  if (s7 !== peg$FAILED) {
2447
2429
  s8 = input.charAt(peg$currPos);
2448
- if (peg$r16.test(s8)) {
2430
+ if (peg$r14.test(s8)) {
2449
2431
  peg$currPos++;
2450
2432
  } else {
2451
2433
  s8 = peg$FAILED;
2452
2434
  if (peg$silentFails === 0) {
2453
- peg$fail(peg$e36);
2435
+ peg$fail(peg$e34);
2454
2436
  }
2455
2437
  }
2456
2438
  if (s8 !== peg$FAILED) {
@@ -2523,62 +2505,62 @@ function peg$parse(input, options) {
2523
2505
  s0 = peg$currPos;
2524
2506
  s12 = peg$currPos;
2525
2507
  s2 = input.charAt(peg$currPos);
2526
- if (peg$r8.test(s2)) {
2508
+ if (peg$r6.test(s2)) {
2527
2509
  peg$currPos++;
2528
2510
  } else {
2529
2511
  s2 = peg$FAILED;
2530
2512
  if (peg$silentFails === 0) {
2531
- peg$fail(peg$e28);
2513
+ peg$fail(peg$e26);
2532
2514
  }
2533
2515
  }
2534
2516
  if (s2 !== peg$FAILED) {
2535
2517
  s3 = input.charAt(peg$currPos);
2536
- if (peg$r9.test(s3)) {
2518
+ if (peg$r7.test(s3)) {
2537
2519
  peg$currPos++;
2538
2520
  } else {
2539
2521
  s3 = peg$FAILED;
2540
2522
  if (peg$silentFails === 0) {
2541
- peg$fail(peg$e29);
2523
+ peg$fail(peg$e27);
2542
2524
  }
2543
2525
  }
2544
2526
  if (s3 !== peg$FAILED) {
2545
2527
  s4 = input.charAt(peg$currPos);
2546
- if (peg$r10.test(s4)) {
2528
+ if (peg$r8.test(s4)) {
2547
2529
  peg$currPos++;
2548
2530
  } else {
2549
2531
  s4 = peg$FAILED;
2550
2532
  if (peg$silentFails === 0) {
2551
- peg$fail(peg$e30);
2533
+ peg$fail(peg$e28);
2552
2534
  }
2553
2535
  }
2554
2536
  if (s4 !== peg$FAILED) {
2555
2537
  s5 = input.charAt(peg$currPos);
2556
- if (peg$r11.test(s5)) {
2538
+ if (peg$r9.test(s5)) {
2557
2539
  peg$currPos++;
2558
2540
  } else {
2559
2541
  s5 = peg$FAILED;
2560
2542
  if (peg$silentFails === 0) {
2561
- peg$fail(peg$e31);
2543
+ peg$fail(peg$e29);
2562
2544
  }
2563
2545
  }
2564
2546
  if (s5 !== peg$FAILED) {
2565
2547
  s6 = input.charAt(peg$currPos);
2566
- if (peg$r12.test(s6)) {
2548
+ if (peg$r10.test(s6)) {
2567
2549
  peg$currPos++;
2568
2550
  } else {
2569
2551
  s6 = peg$FAILED;
2570
2552
  if (peg$silentFails === 0) {
2571
- peg$fail(peg$e32);
2553
+ peg$fail(peg$e30);
2572
2554
  }
2573
2555
  }
2574
2556
  if (s6 !== peg$FAILED) {
2575
2557
  s7 = input.charAt(peg$currPos);
2576
- if (peg$r9.test(s7)) {
2558
+ if (peg$r7.test(s7)) {
2577
2559
  peg$currPos++;
2578
2560
  } else {
2579
2561
  s7 = peg$FAILED;
2580
2562
  if (peg$silentFails === 0) {
2581
- peg$fail(peg$e29);
2563
+ peg$fail(peg$e27);
2582
2564
  }
2583
2565
  }
2584
2566
  if (s7 !== peg$FAILED) {
@@ -2611,72 +2593,72 @@ function peg$parse(input, options) {
2611
2593
  if (s12 === peg$FAILED) {
2612
2594
  s12 = peg$currPos;
2613
2595
  s2 = input.charAt(peg$currPos);
2614
- if (peg$r17.test(s2)) {
2596
+ if (peg$r15.test(s2)) {
2615
2597
  peg$currPos++;
2616
2598
  } else {
2617
2599
  s2 = peg$FAILED;
2618
2600
  if (peg$silentFails === 0) {
2619
- peg$fail(peg$e37);
2601
+ peg$fail(peg$e35);
2620
2602
  }
2621
2603
  }
2622
2604
  if (s2 !== peg$FAILED) {
2623
2605
  s3 = input.charAt(peg$currPos);
2624
- if (peg$r11.test(s3)) {
2606
+ if (peg$r9.test(s3)) {
2625
2607
  peg$currPos++;
2626
2608
  } else {
2627
2609
  s3 = peg$FAILED;
2628
2610
  if (peg$silentFails === 0) {
2629
- peg$fail(peg$e31);
2611
+ peg$fail(peg$e29);
2630
2612
  }
2631
2613
  }
2632
2614
  if (s3 !== peg$FAILED) {
2633
2615
  s4 = input.charAt(peg$currPos);
2634
- if (peg$r13.test(s4)) {
2616
+ if (peg$r11.test(s4)) {
2635
2617
  peg$currPos++;
2636
2618
  } else {
2637
2619
  s4 = peg$FAILED;
2638
2620
  if (peg$silentFails === 0) {
2639
- peg$fail(peg$e33);
2621
+ peg$fail(peg$e31);
2640
2622
  }
2641
2623
  }
2642
2624
  if (s4 !== peg$FAILED) {
2643
2625
  s5 = input.charAt(peg$currPos);
2644
- if (peg$r10.test(s5)) {
2626
+ if (peg$r8.test(s5)) {
2645
2627
  peg$currPos++;
2646
2628
  } else {
2647
2629
  s5 = peg$FAILED;
2648
2630
  if (peg$silentFails === 0) {
2649
- peg$fail(peg$e30);
2631
+ peg$fail(peg$e28);
2650
2632
  }
2651
2633
  }
2652
2634
  if (s5 !== peg$FAILED) {
2653
2635
  s6 = input.charAt(peg$currPos);
2654
- if (peg$r14.test(s6)) {
2636
+ if (peg$r12.test(s6)) {
2655
2637
  peg$currPos++;
2656
2638
  } else {
2657
2639
  s6 = peg$FAILED;
2658
2640
  if (peg$silentFails === 0) {
2659
- peg$fail(peg$e34);
2641
+ peg$fail(peg$e32);
2660
2642
  }
2661
2643
  }
2662
2644
  if (s6 !== peg$FAILED) {
2663
2645
  s7 = input.charAt(peg$currPos);
2664
- if (peg$r15.test(s7)) {
2646
+ if (peg$r13.test(s7)) {
2665
2647
  peg$currPos++;
2666
2648
  } else {
2667
2649
  s7 = peg$FAILED;
2668
2650
  if (peg$silentFails === 0) {
2669
- peg$fail(peg$e35);
2651
+ peg$fail(peg$e33);
2670
2652
  }
2671
2653
  }
2672
2654
  if (s7 !== peg$FAILED) {
2673
2655
  s8 = input.charAt(peg$currPos);
2674
- if (peg$r16.test(s8)) {
2656
+ if (peg$r14.test(s8)) {
2675
2657
  peg$currPos++;
2676
2658
  } else {
2677
2659
  s8 = peg$FAILED;
2678
2660
  if (peg$silentFails === 0) {
2679
- peg$fail(peg$e36);
2661
+ peg$fail(peg$e34);
2680
2662
  }
2681
2663
  }
2682
2664
  if (s8 !== peg$FAILED) {
@@ -2713,52 +2695,52 @@ function peg$parse(input, options) {
2713
2695
  if (s12 === peg$FAILED) {
2714
2696
  s12 = peg$currPos;
2715
2697
  s2 = input.charAt(peg$currPos);
2716
- if (peg$r13.test(s2)) {
2698
+ if (peg$r11.test(s2)) {
2717
2699
  peg$currPos++;
2718
2700
  } else {
2719
2701
  s2 = peg$FAILED;
2720
2702
  if (peg$silentFails === 0) {
2721
- peg$fail(peg$e33);
2703
+ peg$fail(peg$e31);
2722
2704
  }
2723
2705
  }
2724
2706
  if (s2 !== peg$FAILED) {
2725
2707
  s3 = input.charAt(peg$currPos);
2726
- if (peg$r10.test(s3)) {
2708
+ if (peg$r8.test(s3)) {
2727
2709
  peg$currPos++;
2728
2710
  } else {
2729
2711
  s3 = peg$FAILED;
2730
2712
  if (peg$silentFails === 0) {
2731
- peg$fail(peg$e30);
2713
+ peg$fail(peg$e28);
2732
2714
  }
2733
2715
  }
2734
2716
  if (s3 !== peg$FAILED) {
2735
2717
  s4 = input.charAt(peg$currPos);
2736
- if (peg$r14.test(s4)) {
2718
+ if (peg$r12.test(s4)) {
2737
2719
  peg$currPos++;
2738
2720
  } else {
2739
2721
  s4 = peg$FAILED;
2740
2722
  if (peg$silentFails === 0) {
2741
- peg$fail(peg$e34);
2723
+ peg$fail(peg$e32);
2742
2724
  }
2743
2725
  }
2744
2726
  if (s4 !== peg$FAILED) {
2745
2727
  s5 = input.charAt(peg$currPos);
2746
- if (peg$r15.test(s5)) {
2728
+ if (peg$r13.test(s5)) {
2747
2729
  peg$currPos++;
2748
2730
  } else {
2749
2731
  s5 = peg$FAILED;
2750
2732
  if (peg$silentFails === 0) {
2751
- peg$fail(peg$e35);
2733
+ peg$fail(peg$e33);
2752
2734
  }
2753
2735
  }
2754
2736
  if (s5 !== peg$FAILED) {
2755
2737
  s6 = input.charAt(peg$currPos);
2756
- if (peg$r16.test(s6)) {
2738
+ if (peg$r14.test(s6)) {
2757
2739
  peg$currPos++;
2758
2740
  } else {
2759
2741
  s6 = peg$FAILED;
2760
2742
  if (peg$silentFails === 0) {
2761
- peg$fail(peg$e36);
2743
+ peg$fail(peg$e34);
2762
2744
  }
2763
2745
  }
2764
2746
  if (s6 !== peg$FAILED) {
@@ -2787,42 +2769,42 @@ function peg$parse(input, options) {
2787
2769
  if (s12 === peg$FAILED) {
2788
2770
  s12 = peg$currPos;
2789
2771
  s2 = input.charAt(peg$currPos);
2790
- if (peg$r18.test(s2)) {
2772
+ if (peg$r16.test(s2)) {
2791
2773
  peg$currPos++;
2792
2774
  } else {
2793
2775
  s2 = peg$FAILED;
2794
2776
  if (peg$silentFails === 0) {
2795
- peg$fail(peg$e38);
2777
+ peg$fail(peg$e36);
2796
2778
  }
2797
2779
  }
2798
2780
  if (s2 !== peg$FAILED) {
2799
2781
  s3 = input.charAt(peg$currPos);
2800
- if (peg$r19.test(s3)) {
2782
+ if (peg$r17.test(s3)) {
2801
2783
  peg$currPos++;
2802
2784
  } else {
2803
2785
  s3 = peg$FAILED;
2804
2786
  if (peg$silentFails === 0) {
2805
- peg$fail(peg$e39);
2787
+ peg$fail(peg$e37);
2806
2788
  }
2807
2789
  }
2808
2790
  if (s3 !== peg$FAILED) {
2809
2791
  s4 = input.charAt(peg$currPos);
2810
- if (peg$r17.test(s4)) {
2792
+ if (peg$r15.test(s4)) {
2811
2793
  peg$currPos++;
2812
2794
  } else {
2813
2795
  s4 = peg$FAILED;
2814
2796
  if (peg$silentFails === 0) {
2815
- peg$fail(peg$e37);
2797
+ peg$fail(peg$e35);
2816
2798
  }
2817
2799
  }
2818
2800
  if (s4 !== peg$FAILED) {
2819
2801
  s5 = input.charAt(peg$currPos);
2820
- if (peg$r20.test(s5)) {
2802
+ if (peg$r18.test(s5)) {
2821
2803
  peg$currPos++;
2822
2804
  } else {
2823
2805
  s5 = peg$FAILED;
2824
2806
  if (peg$silentFails === 0) {
2825
- peg$fail(peg$e40);
2807
+ peg$fail(peg$e38);
2826
2808
  }
2827
2809
  }
2828
2810
  if (s5 !== peg$FAILED) {
@@ -2847,42 +2829,42 @@ function peg$parse(input, options) {
2847
2829
  if (s12 === peg$FAILED) {
2848
2830
  s12 = peg$currPos;
2849
2831
  s2 = input.charAt(peg$currPos);
2850
- if (peg$r20.test(s2)) {
2832
+ if (peg$r18.test(s2)) {
2851
2833
  peg$currPos++;
2852
2834
  } else {
2853
2835
  s2 = peg$FAILED;
2854
2836
  if (peg$silentFails === 0) {
2855
- peg$fail(peg$e40);
2837
+ peg$fail(peg$e38);
2856
2838
  }
2857
2839
  }
2858
2840
  if (s2 !== peg$FAILED) {
2859
2841
  s3 = input.charAt(peg$currPos);
2860
- if (peg$r17.test(s3)) {
2842
+ if (peg$r15.test(s3)) {
2861
2843
  peg$currPos++;
2862
2844
  } else {
2863
2845
  s3 = peg$FAILED;
2864
2846
  if (peg$silentFails === 0) {
2865
- peg$fail(peg$e37);
2847
+ peg$fail(peg$e35);
2866
2848
  }
2867
2849
  }
2868
2850
  if (s3 !== peg$FAILED) {
2869
2851
  s4 = input.charAt(peg$currPos);
2870
- if (peg$r13.test(s4)) {
2852
+ if (peg$r11.test(s4)) {
2871
2853
  peg$currPos++;
2872
2854
  } else {
2873
2855
  s4 = peg$FAILED;
2874
2856
  if (peg$silentFails === 0) {
2875
- peg$fail(peg$e33);
2857
+ peg$fail(peg$e31);
2876
2858
  }
2877
2859
  }
2878
2860
  if (s4 !== peg$FAILED) {
2879
2861
  s5 = input.charAt(peg$currPos);
2880
- if (peg$r20.test(s5)) {
2862
+ if (peg$r18.test(s5)) {
2881
2863
  peg$currPos++;
2882
2864
  } else {
2883
2865
  s5 = peg$FAILED;
2884
2866
  if (peg$silentFails === 0) {
2885
- peg$fail(peg$e40);
2867
+ peg$fail(peg$e38);
2886
2868
  }
2887
2869
  }
2888
2870
  if (s5 !== peg$FAILED) {
@@ -2907,82 +2889,82 @@ function peg$parse(input, options) {
2907
2889
  if (s12 === peg$FAILED) {
2908
2890
  s12 = peg$currPos;
2909
2891
  s2 = input.charAt(peg$currPos);
2910
- if (peg$r8.test(s2)) {
2892
+ if (peg$r6.test(s2)) {
2911
2893
  peg$currPos++;
2912
2894
  } else {
2913
2895
  s2 = peg$FAILED;
2914
2896
  if (peg$silentFails === 0) {
2915
- peg$fail(peg$e28);
2897
+ peg$fail(peg$e26);
2916
2898
  }
2917
2899
  }
2918
2900
  if (s2 !== peg$FAILED) {
2919
2901
  s3 = input.charAt(peg$currPos);
2920
- if (peg$r21.test(s3)) {
2902
+ if (peg$r19.test(s3)) {
2921
2903
  peg$currPos++;
2922
2904
  } else {
2923
2905
  s3 = peg$FAILED;
2924
2906
  if (peg$silentFails === 0) {
2925
- peg$fail(peg$e41);
2907
+ peg$fail(peg$e39);
2926
2908
  }
2927
2909
  }
2928
2910
  if (s3 !== peg$FAILED) {
2929
2911
  s4 = input.charAt(peg$currPos);
2930
- if (peg$r22.test(s4)) {
2912
+ if (peg$r20.test(s4)) {
2931
2913
  peg$currPos++;
2932
2914
  } else {
2933
2915
  s4 = peg$FAILED;
2934
2916
  if (peg$silentFails === 0) {
2935
- peg$fail(peg$e42);
2917
+ peg$fail(peg$e40);
2936
2918
  }
2937
2919
  }
2938
2920
  if (s4 !== peg$FAILED) {
2939
2921
  s5 = input.charAt(peg$currPos);
2940
- if (peg$r13.test(s5)) {
2922
+ if (peg$r11.test(s5)) {
2941
2923
  peg$currPos++;
2942
2924
  } else {
2943
2925
  s5 = peg$FAILED;
2944
2926
  if (peg$silentFails === 0) {
2945
- peg$fail(peg$e33);
2927
+ peg$fail(peg$e31);
2946
2928
  }
2947
2929
  }
2948
2930
  if (s5 !== peg$FAILED) {
2949
2931
  s6 = input.charAt(peg$currPos);
2950
- if (peg$r10.test(s6)) {
2932
+ if (peg$r8.test(s6)) {
2951
2933
  peg$currPos++;
2952
2934
  } else {
2953
2935
  s6 = peg$FAILED;
2954
2936
  if (peg$silentFails === 0) {
2955
- peg$fail(peg$e30);
2937
+ peg$fail(peg$e28);
2956
2938
  }
2957
2939
  }
2958
2940
  if (s6 !== peg$FAILED) {
2959
2941
  s7 = input.charAt(peg$currPos);
2960
- if (peg$r14.test(s7)) {
2942
+ if (peg$r12.test(s7)) {
2961
2943
  peg$currPos++;
2962
2944
  } else {
2963
2945
  s7 = peg$FAILED;
2964
2946
  if (peg$silentFails === 0) {
2965
- peg$fail(peg$e34);
2947
+ peg$fail(peg$e32);
2966
2948
  }
2967
2949
  }
2968
2950
  if (s7 !== peg$FAILED) {
2969
2951
  s8 = input.charAt(peg$currPos);
2970
- if (peg$r15.test(s8)) {
2952
+ if (peg$r13.test(s8)) {
2971
2953
  peg$currPos++;
2972
2954
  } else {
2973
2955
  s8 = peg$FAILED;
2974
2956
  if (peg$silentFails === 0) {
2975
- peg$fail(peg$e35);
2957
+ peg$fail(peg$e33);
2976
2958
  }
2977
2959
  }
2978
2960
  if (s8 !== peg$FAILED) {
2979
2961
  s9 = input.charAt(peg$currPos);
2980
- if (peg$r16.test(s9)) {
2962
+ if (peg$r14.test(s9)) {
2981
2963
  peg$currPos++;
2982
2964
  } else {
2983
2965
  s9 = peg$FAILED;
2984
2966
  if (peg$silentFails === 0) {
2985
- peg$fail(peg$e36);
2967
+ peg$fail(peg$e34);
2986
2968
  }
2987
2969
  }
2988
2970
  if (s9 !== peg$FAILED) {
@@ -3054,24 +3036,24 @@ function peg$parse(input, options) {
3054
3036
  s0 = [];
3055
3037
  s12 = [];
3056
3038
  s2 = input.charAt(peg$currPos);
3057
- if (peg$r23.test(s2)) {
3039
+ if (peg$r21.test(s2)) {
3058
3040
  peg$currPos++;
3059
3041
  } else {
3060
3042
  s2 = peg$FAILED;
3061
3043
  if (peg$silentFails === 0) {
3062
- peg$fail(peg$e43);
3044
+ peg$fail(peg$e41);
3063
3045
  }
3064
3046
  }
3065
3047
  if (s2 !== peg$FAILED) {
3066
3048
  while (s2 !== peg$FAILED) {
3067
3049
  s12.push(s2);
3068
3050
  s2 = input.charAt(peg$currPos);
3069
- if (peg$r23.test(s2)) {
3051
+ if (peg$r21.test(s2)) {
3070
3052
  peg$currPos++;
3071
3053
  } else {
3072
3054
  s2 = peg$FAILED;
3073
3055
  if (peg$silentFails === 0) {
3074
- peg$fail(peg$e43);
3056
+ peg$fail(peg$e41);
3075
3057
  }
3076
3058
  }
3077
3059
  }
@@ -3091,24 +3073,24 @@ function peg$parse(input, options) {
3091
3073
  s0.push(s12);
3092
3074
  s12 = [];
3093
3075
  s2 = input.charAt(peg$currPos);
3094
- if (peg$r23.test(s2)) {
3076
+ if (peg$r21.test(s2)) {
3095
3077
  peg$currPos++;
3096
3078
  } else {
3097
3079
  s2 = peg$FAILED;
3098
3080
  if (peg$silentFails === 0) {
3099
- peg$fail(peg$e43);
3081
+ peg$fail(peg$e41);
3100
3082
  }
3101
3083
  }
3102
3084
  if (s2 !== peg$FAILED) {
3103
3085
  while (s2 !== peg$FAILED) {
3104
3086
  s12.push(s2);
3105
3087
  s2 = input.charAt(peg$currPos);
3106
- if (peg$r23.test(s2)) {
3088
+ if (peg$r21.test(s2)) {
3107
3089
  peg$currPos++;
3108
3090
  } else {
3109
3091
  s2 = peg$FAILED;
3110
3092
  if (peg$silentFails === 0) {
3111
- peg$fail(peg$e43);
3093
+ peg$fail(peg$e41);
3112
3094
  }
3113
3095
  }
3114
3096
  }
@@ -3136,7 +3118,7 @@ function peg$parse(input, options) {
3136
3118
  } else {
3137
3119
  s12 = peg$FAILED;
3138
3120
  if (peg$silentFails === 0) {
3139
- peg$fail(peg$e44);
3121
+ peg$fail(peg$e42);
3140
3122
  }
3141
3123
  }
3142
3124
  if (s12 !== peg$FAILED) {
@@ -3150,7 +3132,7 @@ function peg$parse(input, options) {
3150
3132
  } else {
3151
3133
  s5 = peg$FAILED;
3152
3134
  if (peg$silentFails === 0) {
3153
- peg$fail(peg$e45);
3135
+ peg$fail(peg$e43);
3154
3136
  }
3155
3137
  }
3156
3138
  peg$silentFails--;
@@ -3192,7 +3174,7 @@ function peg$parse(input, options) {
3192
3174
  } else {
3193
3175
  s5 = peg$FAILED;
3194
3176
  if (peg$silentFails === 0) {
3195
- peg$fail(peg$e45);
3177
+ peg$fail(peg$e43);
3196
3178
  }
3197
3179
  }
3198
3180
  peg$silentFails--;
@@ -3230,7 +3212,7 @@ function peg$parse(input, options) {
3230
3212
  } else {
3231
3213
  s3 = peg$FAILED;
3232
3214
  if (peg$silentFails === 0) {
3233
- peg$fail(peg$e45);
3215
+ peg$fail(peg$e43);
3234
3216
  }
3235
3217
  }
3236
3218
  if (s3 !== peg$FAILED) {
@@ -3255,29 +3237,29 @@ function peg$parse(input, options) {
3255
3237
  } else {
3256
3238
  s12 = peg$FAILED;
3257
3239
  if (peg$silentFails === 0) {
3258
- peg$fail(peg$e46);
3240
+ peg$fail(peg$e44);
3259
3241
  }
3260
3242
  }
3261
3243
  if (s12 !== peg$FAILED) {
3262
3244
  s2 = [];
3263
3245
  s3 = input.charAt(peg$currPos);
3264
- if (peg$r24.test(s3)) {
3246
+ if (peg$r22.test(s3)) {
3265
3247
  peg$currPos++;
3266
3248
  } else {
3267
3249
  s3 = peg$FAILED;
3268
3250
  if (peg$silentFails === 0) {
3269
- peg$fail(peg$e47);
3251
+ peg$fail(peg$e45);
3270
3252
  }
3271
3253
  }
3272
3254
  while (s3 !== peg$FAILED) {
3273
3255
  s2.push(s3);
3274
3256
  s3 = input.charAt(peg$currPos);
3275
- if (peg$r24.test(s3)) {
3257
+ if (peg$r22.test(s3)) {
3276
3258
  peg$currPos++;
3277
3259
  } else {
3278
3260
  s3 = peg$FAILED;
3279
3261
  if (peg$silentFails === 0) {
3280
- peg$fail(peg$e47);
3262
+ peg$fail(peg$e45);
3281
3263
  }
3282
3264
  }
3283
3265
  }
@@ -3287,7 +3269,7 @@ function peg$parse(input, options) {
3287
3269
  } else {
3288
3270
  s3 = peg$FAILED;
3289
3271
  if (peg$silentFails === 0) {
3290
- peg$fail(peg$e48);
3272
+ peg$fail(peg$e46);
3291
3273
  }
3292
3274
  }
3293
3275
  if (s3 === peg$FAILED) {
@@ -3332,29 +3314,29 @@ function peg$parse(input, options) {
3332
3314
  } else {
3333
3315
  s12 = peg$FAILED;
3334
3316
  if (peg$silentFails === 0) {
3335
- peg$fail(peg$e49);
3317
+ peg$fail(peg$e47);
3336
3318
  }
3337
3319
  }
3338
3320
  if (s12 !== peg$FAILED) {
3339
3321
  s2 = [];
3340
3322
  s3 = input.charAt(peg$currPos);
3341
- if (peg$r24.test(s3)) {
3323
+ if (peg$r22.test(s3)) {
3342
3324
  peg$currPos++;
3343
3325
  } else {
3344
3326
  s3 = peg$FAILED;
3345
3327
  if (peg$silentFails === 0) {
3346
- peg$fail(peg$e47);
3328
+ peg$fail(peg$e45);
3347
3329
  }
3348
3330
  }
3349
3331
  while (s3 !== peg$FAILED) {
3350
3332
  s2.push(s3);
3351
3333
  s3 = input.charAt(peg$currPos);
3352
- if (peg$r24.test(s3)) {
3334
+ if (peg$r22.test(s3)) {
3353
3335
  peg$currPos++;
3354
3336
  } else {
3355
3337
  s3 = peg$FAILED;
3356
3338
  if (peg$silentFails === 0) {
3357
- peg$fail(peg$e47);
3339
+ peg$fail(peg$e45);
3358
3340
  }
3359
3341
  }
3360
3342
  }
@@ -3364,7 +3346,7 @@ function peg$parse(input, options) {
3364
3346
  } else {
3365
3347
  s3 = peg$FAILED;
3366
3348
  if (peg$silentFails === 0) {
3367
- peg$fail(peg$e48);
3349
+ peg$fail(peg$e46);
3368
3350
  }
3369
3351
  }
3370
3352
  if (s3 === peg$FAILED) {
@@ -4266,6 +4248,75 @@ function buildFromAst(ast) {
4266
4248
  return graph;
4267
4249
  }
4268
4250
 
4251
+ // src/parser/number-scan.ts
4252
+ var ASCII_DEL = 127;
4253
+ function isLetter(c) {
4254
+ if (c === void 0) return false;
4255
+ return c >= "A" && c <= "Z" || c >= "a" && c <= "z" || c === "_" || c.charCodeAt(0) > ASCII_DEL;
4256
+ }
4257
+ function isDigit(c) {
4258
+ return c !== void 0 && c >= "0" && c <= "9";
4259
+ }
4260
+ function startsNumber(s, i) {
4261
+ const c = s[i];
4262
+ if (isDigit(c)) return true;
4263
+ if (c === ".") return isDigit(s[i + 1]);
4264
+ if (c !== "-") return false;
4265
+ return isDigit(s[i + 1]) || s[i + 1] === "." && isDigit(s[i + 2]);
4266
+ }
4267
+ function matchNumber(s, i) {
4268
+ let j = s[i] === "-" ? i + 1 : i;
4269
+ if (s[j] === ".") {
4270
+ j++;
4271
+ while (isDigit(s[j])) j++;
4272
+ } else {
4273
+ while (isDigit(s[j])) j++;
4274
+ if (s[j] === ".") {
4275
+ j++;
4276
+ while (isDigit(s[j])) j++;
4277
+ }
4278
+ }
4279
+ if (s[j] === "." || isLetter(s[j])) j++;
4280
+ return j;
4281
+ }
4282
+ function twoDots(text) {
4283
+ const dot = text.indexOf(".");
4284
+ return dot !== -1 && dot !== text.length - 1;
4285
+ }
4286
+ function chkNum(text) {
4287
+ const c = text[text.length - 1];
4288
+ return !isDigit(c) && c !== "." || c === "." && twoDots(text);
4289
+ }
4290
+ function lexToken(s, i) {
4291
+ if (isLetter(s[i])) {
4292
+ let j2 = i + 1;
4293
+ while (isLetter(s[j2]) || isDigit(s[j2])) j2++;
4294
+ return { next: j2, bad: null };
4295
+ }
4296
+ if (s[i] === "-" && (s[i + 1] === "-" || s[i + 1] === ">")) return { next: i + 2, bad: null };
4297
+ if (!startsNumber(s, i)) return { next: i + 1, bad: null };
4298
+ const j = matchNumber(s, i);
4299
+ const text = s.slice(i, j);
4300
+ return chkNum(text) ? { next: j - 1, bad: text } : { next: j, bad: null };
4301
+ }
4302
+ function scanNumberAmbiguities(src, stripped) {
4303
+ const out = [];
4304
+ let line = 1;
4305
+ let lineAt = 0;
4306
+ for (let i = 0; i < stripped.length; ) {
4307
+ const { next, bad } = lexToken(stripped, i);
4308
+ if (bad !== null) {
4309
+ for (; lineAt < i; lineAt++) if (src[lineAt] === "\n") line++;
4310
+ out.push({ text: bad, line, offset: i });
4311
+ }
4312
+ i = next;
4313
+ }
4314
+ return out;
4315
+ }
4316
+ function numberAmbiguityMessage(a) {
4317
+ return `Warning: syntax ambiguity - badly delimited number '${a.text}' in line ${a.line} of input splits into two tokens`;
4318
+ }
4319
+
4269
4320
  // src/errors.ts
4270
4321
  var FRIENDLY_MESSAGES = {
4271
4322
  SYNTAX_ERROR: "There is a syntax error in the DOT source.",
@@ -4542,6 +4593,12 @@ function isPeggyError(err) {
4542
4593
  if (typeof e["location"] !== "object" || e["location"] === null) return false;
4543
4594
  return "start" in e["location"];
4544
4595
  }
4596
+ function warnNumberAmbiguities(src, upTo) {
4597
+ for (const a of scanNumberAmbiguities(src, Stripper.strip(src))) {
4598
+ if (a.offset > upTo) break;
4599
+ console.error(numberAmbiguityMessage(a));
4600
+ }
4601
+ }
4545
4602
  function parse(src) {
4546
4603
  if (typeof src !== "string") {
4547
4604
  throw invalidArgType("dotSource", "string", src);
@@ -4552,6 +4609,7 @@ function parse(src) {
4552
4609
  } catch (err) {
4553
4610
  if (isPeggyError(err)) {
4554
4611
  const start = err.location.start;
4612
+ warnNumberAmbiguities(src, start.offset);
4555
4613
  const code = err.found === null ? "SYNTAX_UNEXPECTED_EOF" : "SYNTAX_ERROR";
4556
4614
  throw new ParseError(
4557
4615
  err instanceof Error ? err.message : String(err),
@@ -4569,6 +4627,7 @@ function parse(src) {
4569
4627
  }
4570
4628
  throw err;
4571
4629
  }
4630
+ warnNumberAmbiguities(src, src.length);
4572
4631
  validateEdgeOperators(src, ast.directed);
4573
4632
  return buildFromAst(ast);
4574
4633
  }
@@ -5552,6 +5611,10 @@ var RenderJob = class {
5552
5611
  format;
5553
5612
  bb = { ll: { x: 0, y: 0 }, ur: { x: 0, y: 0 } };
5554
5613
  pad = { x: 0, y: 0 };
5614
+ /** Current page clip in graph units, as setup_page computes it from the
5615
+ * viewport focus/view (see setupPageClip). Read by the SVG page translate and
5616
+ * background. @see lib/gvc/gvcjob.h:GVJ_s.clip; lib/common/emit.c:setup_page */
5617
+ clip = { ll: { x: 0, y: 0 }, ur: { x: 0, y: 0 } };
5555
5618
  /** Graph-level `margin=` (init_job_margin); page-pagination margin, distinct
5556
5619
  * from node/cluster label margin. @see lib/common/emit.c:3309-3331 */
5557
5620
  margin = { x: 0, y: 0 };
@@ -5721,6 +5784,8 @@ function gvrenderTextspan(renderer, pos, span, job) {
5721
5784
  }
5722
5785
 
5723
5786
  // src/util/math.ts
5787
+ var INT32_MAX = 2147483647;
5788
+ var INT32_MIN = -2147483648;
5724
5789
  function isExactlyEqual(a, b) {
5725
5790
  const buf = new ArrayBuffer(16);
5726
5791
  const dv = new DataView(buf);
@@ -5732,6 +5797,11 @@ function isExactlyEqual(a, b) {
5732
5797
  }
5733
5798
  return true;
5734
5799
  }
5800
+ function d2i(v) {
5801
+ if (v > INT32_MAX) return INT32_MAX;
5802
+ if (v < INT32_MIN) return INT32_MIN;
5803
+ return Math.trunc(v);
5804
+ }
5735
5805
 
5736
5806
  // src/common/colorData.ts
5737
5807
  var COLOR_LIB = [
@@ -9881,11 +9951,11 @@ function emitHtmlLabel(placed, pos, renderer, job) {
9881
9951
  style: placed.style
9882
9952
  });
9883
9953
  }
9884
- for (const cell2 of placed.cells) emitHtmlCell(cell2, pos, renderer, job);
9885
9954
  emitTableRules(placed, pos, renderer, job);
9886
9955
  if (placed.border > 0) {
9887
9956
  emitBorder({ box: placed.box, pos, border: placed.border, color: placed.color, sides: placed.sides, style: placed.style }, renderer, job);
9888
9957
  }
9958
+ for (const cell2 of placed.cells) emitHtmlCell(cell2, pos, renderer, job);
9889
9959
  }
9890
9960
  if (inAnchor) endHtmlAnchor(renderer, job);
9891
9961
  if (clustersLast && initHtmlAnchor(anchorData, tblBox, renderer, job)) {
@@ -15743,8 +15813,8 @@ function normalizeFontName(name) {
15743
15813
  for (let i = 0; i < name.length; i++) {
15744
15814
  const ch = name[i];
15745
15815
  const code = ch.charCodeAt(0);
15746
- const isLetter = code >= 65 && code <= 90 || code >= 97 && code <= 122;
15747
- if (isLetter) result += ch.toLowerCase();
15816
+ const isLetter2 = code >= 65 && code <= 90 || code >= 97 && code <= 122;
15817
+ if (isLetter2) result += ch.toLowerCase();
15748
15818
  }
15749
15819
  return result;
15750
15820
  }
@@ -16603,7 +16673,7 @@ function interpretCRNL(str) {
16603
16673
 
16604
16674
  // src/common/make-label.ts
16605
16675
  var DEFAULT_FONTSIZE2 = 14;
16606
- var DEFAULT_FONTNAME = "Times,serif";
16676
+ var DEFAULT_FONTNAME = "Times-Roman";
16607
16677
  var DEFAULT_COLOR2 = "black";
16608
16678
  function getPenColor(obj) {
16609
16679
  if (obj === void 0) return void 0;
@@ -16870,6 +16940,18 @@ function fms(a, b, c) {
16870
16940
  function cround(v) {
16871
16941
  return v >= 0 ? Math.floor(v + 0.5) : Math.ceil(v - 0.5);
16872
16942
  }
16943
+ var INT64_MAX = 2n ** 63n - 1n;
16944
+ var INT64_MIN = -(2n ** 63n);
16945
+ var TWO_POW_63 = 2 ** 63;
16946
+ function croundNarrow32(v) {
16947
+ const r = cround(v);
16948
+ let i64;
16949
+ if (Number.isNaN(r)) i64 = 0n;
16950
+ else if (r >= TWO_POW_63) i64 = INT64_MAX;
16951
+ else if (r < -TWO_POW_63) i64 = INT64_MIN;
16952
+ else i64 = BigInt(r);
16953
+ return Number(BigInt.asIntN(32, i64));
16954
+ }
16873
16955
  function RADIANS(deg) {
16874
16956
  return deg / 180 * Math.PI;
16875
16957
  }
@@ -23576,9 +23658,12 @@ function isMulticolor(fillcolor) {
23576
23658
  return fillcolor.includes(":");
23577
23659
  }
23578
23660
  function renderEllipse(ring, coord, renderer, job, filled) {
23579
- const rx = Math.abs((ring[1].x - ring[0].x) / 2);
23580
- const ry = Math.abs((ring[1].y - ring[0].y) / 2);
23581
- const center = transformPoint(coord, job);
23661
+ const af0 = { x: ring[0].x + coord.x, y: ring[0].y + coord.y };
23662
+ const af1 = { x: ring[1].x + coord.x, y: ring[1].y + coord.y };
23663
+ const mid = { x: (af0.x + af1.x) / 2, y: (af0.y + af1.y) / 2 };
23664
+ const rx = af1.x - mid.x;
23665
+ const ry = af1.y - mid.y;
23666
+ const center = transformPoint(mid, job);
23582
23667
  renderer.ellipse(center, rx, ry, filled, job);
23583
23668
  }
23584
23669
  function renderPolygon(ring, coord, renderer, job, filled) {
@@ -25420,7 +25505,7 @@ var BGCOLOR_TRANSPARENT = "\0transparent";
25420
25505
  function formatG(n) {
25421
25506
  return String(parseFloat(n.toPrecision(6)));
25422
25507
  }
25423
- function emitSvgTag(job) {
25508
+ function emitSvgTag(job, svgid = "") {
25424
25509
  const bb = job.bb;
25425
25510
  const szx = bb.ur.x - bb.ll.x + 2 * job.pad.x;
25426
25511
  const szy = bb.ur.y - bb.ll.y + 2 * job.pad.y;
@@ -25429,16 +25514,20 @@ function emitSvgTag(job) {
25429
25514
  const rotated = job.rotation !== 0;
25430
25515
  const pageX = rotated ? viewY : viewX;
25431
25516
  const pageY = rotated ? viewX : viewY;
25432
- const w = cround(pageX + 2 * job.margin.x);
25433
- const h = cround(pageY + 2 * job.margin.y);
25517
+ const w = croundNarrow32(pageX + 2 * job.margin.x);
25518
+ const h = croundNarrow32(pageY + 2 * job.margin.y);
25434
25519
  job.write('<svg width="' + String(w) + 'pt" height="' + String(h) + 'pt"\n');
25435
- const vbLLx = cround(job.margin.x);
25436
- const vbLLy = cround(job.margin.y);
25437
- const vbURx = cround(job.margin.x + pageX);
25438
- const vbURy = cround(job.margin.y + pageY);
25520
+ const vbLLx = croundNarrow32(job.margin.x);
25521
+ const vbLLy = croundNarrow32(job.margin.y);
25522
+ const vbURx = croundNarrow32(job.margin.x + pageX);
25523
+ const vbURy = croundNarrow32(job.margin.y + pageY);
25439
25524
  job.write(' viewBox="' + String(vbLLx) + ".00 " + String(vbLLy) + ".00 " + String(vbURx) + ".00 " + String(vbURy) + '.00"\n');
25440
25525
  job.write(' xmlns="http://www.w3.org/2000/svg"');
25441
- job.write(' xmlns:xlink="http://www.w3.org/1999/xlink">\n');
25526
+ job.write(' xmlns:xlink="http://www.w3.org/1999/xlink"');
25527
+ if (svgid !== void 0 && svgid.length > 0) {
25528
+ job.write(' id="' + escapeXmlTitle(svgid) + '"');
25529
+ }
25530
+ job.write(">\n");
25442
25531
  }
25443
25532
  function emitGraphGroupOpen(graphId, classStr, tx, ty, job) {
25444
25533
  const sx = formatG(job.scale.x);
@@ -25462,12 +25551,12 @@ function resolveGraphBgcolor(bgcolorAttr) {
25462
25551
  const solid = grad !== null ? grad[0] : bgcolorAttr;
25463
25552
  return colorPaint(resolveRenderColor(solid));
25464
25553
  }
25465
- function emitGraphBackground(bb, resolvedColor, job) {
25554
+ function emitGraphBackground(clip, resolvedColor, job) {
25466
25555
  if (resolvedColor === BGCOLOR_TRANSPARENT) return;
25467
- const left2 = bb.ll.x - job.pad.x;
25468
- const right2 = bb.ur.x + job.pad.x;
25469
- const top = -(bb.ur.y + job.pad.y);
25470
- const bottom = -(bb.ll.y - job.pad.y);
25556
+ const left2 = clip.ll.x;
25557
+ const right2 = clip.ur.x;
25558
+ const top = -clip.ur.y;
25559
+ const bottom = -clip.ll.y;
25471
25560
  const corners = [
25472
25561
  [left2, bottom],
25473
25562
  [left2, top],
@@ -25484,11 +25573,11 @@ function emitGraphBackground(bb, resolvedColor, job) {
25484
25573
  });
25485
25574
  job.write('"/>\n');
25486
25575
  }
25487
- function bgGradientPts(bb, pad) {
25488
- const left2 = bb.ll.x - pad.x;
25489
- const right2 = bb.ur.x + pad.x;
25490
- const bottom = bb.ll.y - pad.y;
25491
- const top = bb.ur.y + pad.y;
25576
+ function bgGradientPts(clip) {
25577
+ const left2 = clip.ll.x;
25578
+ const right2 = clip.ur.x;
25579
+ const bottom = clip.ll.y;
25580
+ const top = clip.ur.y;
25492
25581
  return [
25493
25582
  { x: left2, y: bottom },
25494
25583
  { x: left2, y: top },
@@ -25496,11 +25585,11 @@ function bgGradientPts(bb, pad) {
25496
25585
  { x: right2, y: bottom }
25497
25586
  ];
25498
25587
  }
25499
- function writeGradientPolygon(bb, id, job) {
25500
- const left2 = bb.ll.x - job.pad.x;
25501
- const right2 = bb.ur.x + job.pad.x;
25502
- const top = -(bb.ur.y + job.pad.y);
25503
- const bottom = -(bb.ll.y - job.pad.y);
25588
+ function writeGradientPolygon(clip, id, job) {
25589
+ const left2 = clip.ll.x;
25590
+ const right2 = clip.ur.x;
25591
+ const top = -clip.ur.y;
25592
+ const bottom = -clip.ll.y;
25504
25593
  const corners = [
25505
25594
  [left2, bottom],
25506
25595
  [left2, top],
@@ -25517,7 +25606,7 @@ function writeGradientPolygon(bb, id, job) {
25517
25606
  });
25518
25607
  job.write('"/>\n');
25519
25608
  }
25520
- function emitGradientBackground(bb, spec, job) {
25609
+ function emitGradientBackground(clip, spec, job) {
25521
25610
  const obj = createObjState(0 /* RootGraph */);
25522
25611
  obj.id = "graph0";
25523
25612
  obj.fillColor = resolveRenderColor(spec.fillColor);
@@ -25532,10 +25621,10 @@ function emitGradientBackground(bb, spec, job) {
25532
25621
  emitRadialGradient(job, gid);
25533
25622
  } else {
25534
25623
  gid = gradientId("graph0", "l", job.linearGradId++);
25535
- emitLinearGradient(job, bgGradientPts(bb, job.pad), gid);
25624
+ emitLinearGradient(job, bgGradientPts(clip), gid);
25536
25625
  }
25537
25626
  job.popObj();
25538
- writeGradientPolygon(bb, gid, job);
25627
+ writeGradientPolygon(clip, gid, job);
25539
25628
  }
25540
25629
  function resolveBgGradientSpec(g, bgcolorAttr) {
25541
25630
  const stop = findStopColor(bgcolorAttr);
@@ -25545,17 +25634,17 @@ function resolveBgGradientSpec(g, bgcolorAttr) {
25545
25634
  const angle = angleStr ? parseInt(angleStr, 10) || 0 : 0;
25546
25635
  return { fillColor: stop.fillColor, stopColor: stop.stopColor, frac: stop.frac, angle, radial: flags.radial };
25547
25636
  }
25548
- function emitBgcolorBackground(g, bb, bgcolorAttr, job) {
25637
+ function emitBgcolorBackground(g, clip, bgcolorAttr, job) {
25549
25638
  if (!bgcolorAttr || bgcolorAttr.length === 0 || bgcolorAttr === "transparent") {
25550
- emitGraphBackground(bb, resolveGraphBgcolor(bgcolorAttr), job);
25639
+ emitGraphBackground(clip, resolveGraphBgcolor(bgcolorAttr), job);
25551
25640
  return;
25552
25641
  }
25553
25642
  const spec = resolveBgGradientSpec(g, bgcolorAttr);
25554
25643
  if (spec !== null) {
25555
- emitGradientBackground(bb, spec, job);
25644
+ emitGradientBackground(clip, spec, job);
25556
25645
  return;
25557
25646
  }
25558
- emitGraphBackground(bb, resolveGraphBgcolor(bgcolorAttr), job);
25647
+ emitGraphBackground(clip, resolveGraphBgcolor(bgcolorAttr), job);
25559
25648
  }
25560
25649
  function svgBeginGraph(g, job) {
25561
25650
  job.devscale = { x: 1, y: -1 };
@@ -25569,13 +25658,23 @@ function svgBeginGraph(g, job) {
25569
25658
  }
25570
25659
  job.write(SVG_DOCTYPE);
25571
25660
  job.write(SVG_GENERATOR_COMMENT);
25572
- emitSvgTag(job);
25661
+ const comment = g.attrs.get("comment");
25662
+ if (comment !== void 0 && comment.length > 0) svgComment(comment, job);
25663
+ emitTitlePagesComment(g, job);
25664
+ emitSvgTag(job, g.attrs.get("svgid"));
25665
+ }
25666
+ function emitTitlePagesComment(g, job) {
25667
+ job.write("<!--");
25668
+ if (g.name.length > 0 && g.name[0] !== "%") {
25669
+ job.write(" Title: " + escapeXmlTitle(g.name));
25670
+ }
25671
+ job.write(" Pages: 1 -->\n");
25573
25672
  }
25574
25673
  function svgBeginPage(g, job) {
25575
- const bb = job.bb;
25674
+ const clip = job.clip;
25576
25675
  const z = job.scale.x;
25577
- const tx = job.rotation !== 0 ? -(bb.ur.x + job.pad.x) - job.margin.x / z : job.pad.x + job.margin.x / z;
25578
- const ty = bb.ur.y + job.pad.y + job.margin.y / z;
25676
+ const tx = job.rotation !== 0 ? -clip.ur.x - job.margin.x / z : -clip.ll.x + job.margin.x / z;
25677
+ const ty = clip.ur.y + job.margin.y / z;
25579
25678
  emitGraphGroupOpen(
25580
25679
  job.idLayerPrefix() + svgGraphId(g, job),
25581
25680
  svgGraphClass(g),
@@ -25586,7 +25685,7 @@ function svgBeginPage(g, job) {
25586
25685
  emitGraphTitle(g, job);
25587
25686
  }
25588
25687
  function svgPageBackground(g, job) {
25589
- emitBgcolorBackground(g, job.bb, g.attrs.get("bgcolor"), job);
25688
+ emitBgcolorBackground(g, job.clip, g.attrs.get("bgcolor"), job);
25590
25689
  }
25591
25690
  function svgEndPage(job) {
25592
25691
  job.write("</g>\n");
@@ -25922,7 +26021,7 @@ function svgPolyline(pts, job) {
25922
26021
  job.write('"/>\n');
25923
26022
  }
25924
26023
  function svgComment(text, job) {
25925
- job.write("<!-- " + escapeXml(text) + " -->\n");
26024
+ job.write("<!-- " + escapeXmlTitle(text) + " -->\n");
25926
26025
  }
25927
26026
  function svgEdgePath(e, job) {
25928
26027
  const spl = e.info.spl;
@@ -26109,6 +26208,22 @@ function initJobViewportZoom(bb, size, pad) {
26109
26208
  if (drawingNeedsFit(size, szx, szy)) return Math.min(size.x / szx, size.y / szy);
26110
26209
  return 1;
26111
26210
  }
26211
+ function setupPageClip(bb, size, pad, z) {
26212
+ const jbLL = { x: bb.ll.x - pad.x, y: bb.ll.y - pad.y };
26213
+ const jbUR = { x: bb.ur.x + pad.x, y: bb.ur.y + pad.y };
26214
+ const sz = { x: jbUR.x - jbLL.x, y: jbUR.y - jbLL.y };
26215
+ if (size !== null && size.x > 1e-3 && size.y > 1e-3) {
26216
+ if (sz.x <= 1e-3) sz.x = size.x;
26217
+ if (sz.y <= 1e-3) sz.y = size.y;
26218
+ }
26219
+ const focus = { x: 0.5 * (bb.ll.x + bb.ur.x), y: 0.5 * (bb.ll.y + bb.ur.y) };
26220
+ const pageSize = { x: z * sz.x / z, y: z * sz.y / z };
26221
+ const ll = {
26222
+ x: focus.x + pageSize.x * (0 - 1 / 2),
26223
+ y: focus.y + pageSize.y * (0 - 1 / 2)
26224
+ };
26225
+ return { ll, ur: { x: ll.x + pageSize.x, y: ll.y + pageSize.y } };
26226
+ }
26112
26227
 
26113
26228
  // src/gvc/anchor.ts
26114
26229
  function attr(attrs, key) {
@@ -26620,10 +26735,22 @@ function renderClusterLabel(sg, renderer, job) {
26620
26735
  renderOneLabel(sg.info.label, renderer, job, false);
26621
26736
  }
26622
26737
 
26623
- // src/gvc/device.ts
26624
- function labelTextOf2(lp) {
26625
- return lp?.text ?? null;
26738
+ // src/common/edge-in-box.ts
26739
+ function overlapLabel(lp, b) {
26740
+ const sx = lp.dimen.x / 2;
26741
+ const sy = lp.dimen.y / 2;
26742
+ const bb = {
26743
+ ll: { x: lp.pos.x - sx, y: lp.pos.y - sy },
26744
+ ur: { x: lp.pos.x + sx, y: lp.pos.y + sy }
26745
+ };
26746
+ return boxOverlap(b, bb);
26626
26747
  }
26748
+ function edgeHasDrawableContent(e, clip) {
26749
+ const i = e.info;
26750
+ return i.spl !== void 0 || i.label !== void 0 && i.label.set && overlapLabel(i.label, clip) || i.xlabel !== void 0 || i.head_label !== void 0 || i.tail_label !== void 0;
26751
+ }
26752
+
26753
+ // src/gvc/emit-gates.ts
26627
26754
  function nodeBBox(n) {
26628
26755
  const { coord, lw, rw, ht } = n.info;
26629
26756
  return {
@@ -26638,6 +26765,26 @@ function nodeInBox(n, job) {
26638
26765
  };
26639
26766
  return boxOverlap(nodeBBox(n), clip);
26640
26767
  }
26768
+ function gvrenderComment(renderer, job, str) {
26769
+ if (str === void 0 || str.length === 0) return;
26770
+ renderer.comment?.(str, job);
26771
+ }
26772
+ function emitNodeComments(n, renderer, job) {
26773
+ gvrenderComment(renderer, job, n.name);
26774
+ gvrenderComment(renderer, job, nodeAttr(n, n.root, "comment"));
26775
+ }
26776
+ function emitEdgeComments(e, renderer, job) {
26777
+ if (!edgeHasDrawableContent(e, job.bb)) return;
26778
+ const kind = e.head.root.kind;
26779
+ const op = kind === "directed" || kind === "strict-directed" ? "->" : "--";
26780
+ gvrenderComment(renderer, job, e.tail.name + op + e.head.name);
26781
+ gvrenderComment(renderer, job, e.attrs.get("comment"));
26782
+ }
26783
+
26784
+ // src/gvc/device.ts
26785
+ function labelTextOf2(lp) {
26786
+ return lp?.text ?? null;
26787
+ }
26641
26788
  function emitNodeBody(n, renderer, job) {
26642
26789
  setHtmlAnchorObj(svgNodeId(n, job), labelTextOf2(n.info.label), job.obj ?? void 0);
26643
26790
  setHtmlObjImgscale(nodeAttr(n, n.root, "imagescale"));
@@ -26653,6 +26800,7 @@ function renderNode(n, renderer, job, done) {
26653
26800
  if (done.has(n)) return;
26654
26801
  done.add(n);
26655
26802
  if (!nodeInBox(n, job)) return;
26803
+ emitNodeComments(n, renderer, job);
26656
26804
  const nodeStyle = nodeAttr(n, n.root, "style");
26657
26805
  if (parseStyleFlags(nodeStyle).invis) return;
26658
26806
  if (!isPointNode(n) && styleHasInvisibleAlias(nodeStyle)) return;
@@ -26678,6 +26826,7 @@ function setEdgePen(e, job) {
26678
26826
  obj.rawStyle = styleTokens(e.attrs.get("style"));
26679
26827
  }
26680
26828
  function renderEdge(e, renderer, job) {
26829
+ emitEdgeComments(e, renderer, job);
26681
26830
  const edgeStyle = e.attrs.get("style");
26682
26831
  if (parseStyleFlags(edgeStyle).invis || styleHasInvisibleAlias(edgeStyle)) return;
26683
26832
  const obj = createObjState(3 /* Edge */);
@@ -26791,7 +26940,9 @@ function render(ctx, g, format, inlineImages = false) {
26791
26940
  job.bb = g.info.bb;
26792
26941
  job.pad = parseGraphPad(g.attrs.get("pad"));
26793
26942
  job.margin = parseGraphMargin(g.attrs.get("margin"));
26794
- const z = initJobViewportZoom(job.bb, parseDrawingSize(g.attrs.get("size")), job.pad);
26943
+ const drawingSize = parseDrawingSize(g.attrs.get("size"));
26944
+ const z = initJobViewportZoom(job.bb, drawingSize, job.pad);
26945
+ job.clip = setupPageClip(job.bb, drawingSize, job.pad, z);
26795
26946
  const drawingDpi = lateDouble(
26796
26947
  g.attrs.get("dpi"),
26797
26948
  lateDouble(g.attrs.get("resolution"), 0, 0),
@@ -31136,7 +31287,7 @@ function routeMultiRankEdgeFaithful(g, e) {
31136
31287
  }
31137
31288
  const segs = chainSegments(e);
31138
31289
  if (segs.length === 0 || segs[segs.length - 1].head !== e.head) return null;
31139
- return routeChainSegmented(g, segs[0], segs[segs.length - 1], segs);
31290
+ return routeChainSegmented(g, segs[0], segs[segs.length - 1], segs) ?? "lost";
31140
31291
  }
31141
31292
  function entryRunSegments(e) {
31142
31293
  const segs = [e];
@@ -31208,7 +31359,10 @@ function routeBackEdge(e, _tailBox, _headBox, g) {
31208
31359
  if (segs.length < 2 || segs[segs.length - 1].head !== e.tail) return;
31209
31360
  const fwdEdge = makeFwdEdge(e);
31210
31361
  const fwd = routeChainSegmented(g, segs[0], segs[segs.length - 1], segs);
31211
- if (fwd === null) return;
31362
+ if (fwd === null) {
31363
+ e.info.lost = true;
31364
+ return;
31365
+ }
31212
31366
  clipAndInstall(fwdEdge, fwdEdge.head, fwd, fwd.length, buildDotSinfo());
31213
31367
  if (swapEndsP(e)) swapEdgeSpline(e);
31214
31368
  }
@@ -31360,7 +31514,7 @@ function baseSplineForGroup(g, e0) {
31360
31514
  const orig = resolveOrigEdge(e0);
31361
31515
  const fe = isBackEdgeMember(orig) ? makeFwdEdge(orig) : orig;
31362
31516
  const pts = routeRegularEdgeFaithful(g, fe);
31363
- if (pts === "lost") return null;
31517
+ if (pts === "lost") return "lost";
31364
31518
  return pts ?? routeMultiRankEdgeFaithful(g, fe);
31365
31519
  }
31366
31520
  function isBackEdgeMember(e) {
@@ -31389,6 +31543,10 @@ function routeParallelEdgeGroup(g, edges, multisep) {
31389
31543
  return o.info.head_port?.defined || o.info.tail_port?.defined;
31390
31544
  }) ?? edges[0];
31391
31545
  const base = baseSplineForGroup(g, baseEdge);
31546
+ if (base === "lost") {
31547
+ for (const e of edges) resolveOrigEdge(e).info.lost = true;
31548
+ return;
31549
+ }
31392
31550
  if (base === null) return;
31393
31551
  if (cnt === 1) {
31394
31552
  installShiftedEdge(edges[0], base);
@@ -34294,6 +34452,10 @@ function routeOneEdge(e, g) {
34294
34452
  function routeFaithfulMultiRank(e, g) {
34295
34453
  const pts = routeMultiRankEdgeFaithful(g, e);
34296
34454
  if (pts === null) return false;
34455
+ if (pts === "lost") {
34456
+ e.info.lost = true;
34457
+ return true;
34458
+ }
34297
34459
  clipAndInstall(e, e.head, pts, pts.length, buildDotSinfo());
34298
34460
  return true;
34299
34461
  }
@@ -34802,24 +34964,28 @@ function addSegment(segnum, seg2, tr, qs) {
34802
34964
  swapSegEndpoints(s);
34803
34965
  isSwapped = true;
34804
34966
  }
34805
- let tfirst;
34806
- if (!inserted(segnum, seg2, isSwapped ? LASTPT : FIRSTPT)) {
34807
- tfirst = insertV0(s, seg2, tr, qs, segnum);
34808
- } else {
34809
- tfirst = locateEndpoint(s.v0, s.v1, s.root0, seg2, qs);
34967
+ const ctx = { s, seg: seg2, tr, qs, segnum, tribot: false, isSwapped };
34968
+ const tfirst = firstTrap(ctx);
34969
+ const tlast = lastTrap(ctx);
34970
+ if (threadSegment(ctx, tfirst, tlast) !== 0) return -1;
34971
+ seg2[segnum].isInserted = true;
34972
+ return 0;
34973
+ }
34974
+ function firstTrap(c) {
34975
+ if (!inserted(c.segnum, c.seg, c.isSwapped ? LASTPT : FIRSTPT)) {
34976
+ return insertV0(c.s, c.seg, c.tr, c.qs, c.segnum);
34810
34977
  }
34811
- let tlast;
34812
- let tribot = false;
34813
- if (!inserted(segnum, seg2, isSwapped ? FIRSTPT : LASTPT)) {
34814
- tlast = insertV1(s, seg2, tr, qs, segnum);
34815
- } else {
34816
- tlast = locateEndpoint(s.v1, s.v0, s.root1, seg2, qs);
34817
- tribot = true;
34978
+ return locateEndpoint(c.s.v0, c.s.v1, c.s.root0, c.seg, c.qs);
34979
+ }
34980
+ function lastTrap(c) {
34981
+ if (!inserted(c.segnum, c.seg, c.isSwapped ? FIRSTPT : LASTPT)) {
34982
+ return insertV1(c.s, c.seg, c.tr, c.qs, c.segnum);
34818
34983
  }
34819
- threadSegment(s, seg2, tr, qs, segnum, tfirst, tlast, tribot, isSwapped);
34820
- seg2[segnum].isInserted = true;
34984
+ c.tribot = true;
34985
+ return locateEndpoint(c.s.v1, c.s.v0, c.s.root1, c.seg, c.qs);
34821
34986
  }
34822
- function threadSegment(s, seg2, tr, qs, segnum, tfirst, tlast, tribot, isSwapped) {
34987
+ function threadSegment(c, tfirst, tlast) {
34988
+ const { s, seg: seg2, tr, qs, segnum, tribot, isSwapped } = c;
34823
34989
  let tfirstr = INVALID_TRAP;
34824
34990
  let tlastr = INVALID_TRAP;
34825
34991
  let t = tfirst;
@@ -34846,17 +35012,20 @@ function threadSegment(s, seg2, tr, qs, segnum, tfirst, tlast, tribot, isSwapped
34846
35012
  if (equalTo(tr[t].lo, tr[tlast].lo)) tlastr = tn;
34847
35013
  const tSav = t;
34848
35014
  const tnSav = tn;
35015
+ if (!isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
35016
+ console.error("trapezoid segment construction failed");
35017
+ return -1;
35018
+ }
34849
35019
  t = advanceT(s, seg2, tr, t, tn, tlast, segnum, isSwapped, tribot);
34850
35020
  tr[tSav].rseg = segnum;
34851
35021
  tr[tnSav].lseg = segnum;
34852
35022
  }
34853
35023
  mergeTrapezoids(segnum, tfirst, tlast, S_LEFT, tr, qs);
34854
35024
  mergeTrapezoids(segnum, tfirstr, tlastr, S_RIGHT, tr, qs);
35025
+ return 0;
34855
35026
  }
34856
35027
  function advanceT(s, seg2, tr, t, tn, tlast, segnum, isSwapped, tribot) {
34857
- if (!isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
34858
- return INVALID_TRAP;
34859
- } else if (isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
35028
+ if (isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
34860
35029
  handleD0Only(s, seg2, tr, t, tn, tlast, segnum, isSwapped, tribot);
34861
35030
  return tr[t].d0;
34862
35031
  } else if (!isValidTrap(tr[t].d0) && isValidTrap(tr[t].d1)) {
@@ -34876,33 +35045,16 @@ function findNewRoots(segnum, seg2, tr, qs) {
34876
35045
  // src/ortho/trapezoid.ts
34877
35046
  function constructTrapezoids(nseg, seg2, permute) {
34878
35047
  const qs = [];
34879
- const tr = [];
34880
- tr.push({
34881
- lseg: 0,
34882
- rseg: 0,
34883
- hi: { x: 0, y: 0 },
34884
- lo: { x: 0, y: 0 },
34885
- u0: 0,
34886
- u1: 0,
34887
- d0: 0,
34888
- d1: 0,
34889
- sink: 0,
34890
- usave: 0,
34891
- uside: 0,
34892
- isValid: false
34893
- });
35048
+ const tr = [sentinelTrap()];
34894
35049
  let segi = 0;
34895
35050
  const root = initQueryStructure(permute[segi++], seg2, tr, qs);
34896
- for (let i = 1; i <= nseg; i++) {
34897
- seg2[i].root0 = root;
34898
- seg2[i].root1 = root;
34899
- }
35051
+ seedRoots(nseg, seg2, root);
34900
35052
  const logstar = mathLogstarN(nseg);
34901
35053
  for (let h = 1; h <= logstar; h++) {
34902
35054
  const lo = mathN(nseg, h - 1) + 1;
34903
35055
  const hi = mathN(nseg, h);
34904
35056
  for (let i = lo; i <= hi; i++) {
34905
- addSegment(permute[segi++], seg2, tr, qs);
35057
+ if (addSegment(permute[segi++], seg2, tr, qs) !== 0) return [];
34906
35058
  }
34907
35059
  for (let i = 1; i <= nseg; i++) {
34908
35060
  findNewRoots(i, seg2, tr, qs);
@@ -34910,10 +35062,32 @@ function constructTrapezoids(nseg, seg2, permute) {
34910
35062
  }
34911
35063
  const remaining = mathN(nseg, logstar) + 1;
34912
35064
  for (let i = remaining; i <= nseg; i++) {
34913
- addSegment(permute[segi++], seg2, tr, qs);
35065
+ if (addSegment(permute[segi++], seg2, tr, qs) !== 0) return [];
34914
35066
  }
34915
35067
  return tr;
34916
35068
  }
35069
+ function sentinelTrap() {
35070
+ return {
35071
+ lseg: 0,
35072
+ rseg: 0,
35073
+ hi: { x: 0, y: 0 },
35074
+ lo: { x: 0, y: 0 },
35075
+ u0: 0,
35076
+ u1: 0,
35077
+ d0: 0,
35078
+ d1: 0,
35079
+ sink: 0,
35080
+ usave: 0,
35081
+ uside: 0,
35082
+ isValid: false
35083
+ };
35084
+ }
35085
+ function seedRoots(nseg, seg2, root) {
35086
+ for (let i = 1; i <= nseg; i++) {
35087
+ seg2[i].root0 = root;
35088
+ seg2[i].root1 = root;
35089
+ }
35090
+ }
34917
35091
  function initQueryStructure(segnum, seg2, tr, qs) {
34918
35092
  const s = seg2[segnum];
34919
35093
  const i1 = newQNode(qs);
@@ -35217,10 +35391,18 @@ function partition(cells, bb) {
35217
35391
  const hSeg = h.genSegments(cells, bb, false);
35218
35392
  const hPerm = h.generateRandomOrdering(nsegs);
35219
35393
  const hTr = constructTrapezoids(nsegs, hSeg, hPerm);
35394
+ if (hTr.length === 0) {
35395
+ console.error("horizontal trapezoid construction failed");
35396
+ return null;
35397
+ }
35220
35398
  const hDecomp = h.monotonateTrapezoids(hTr, hSeg, false);
35221
35399
  const vSeg = h.genSegments(cells, bb, true);
35222
35400
  const vPerm = h.generateRandomOrdering(nsegs);
35223
35401
  const vTr = constructTrapezoids(nsegs, vSeg, vPerm);
35402
+ if (vTr.length === 0) {
35403
+ console.error("vertical trapezoid construction failed");
35404
+ return null;
35405
+ }
35224
35406
  const vDecomp = h.monotonateTrapezoids(vTr, vSeg, true);
35225
35407
  const result = [];
35226
35408
  for (const v of vDecomp) {
@@ -35229,7 +35411,7 @@ function partition(cells, bb) {
35229
35411
  if (isect) result.push(isect);
35230
35412
  }
35231
35413
  }
35232
- return result;
35414
+ return result.length === 0 ? null : result;
35233
35415
  }
35234
35416
 
35235
35417
  // src/ortho/rawgraph.ts
@@ -36077,6 +36259,7 @@ function mkMaze(g) {
36077
36259
  UR: { x: BB.UR.x + MARGIN, y: BB.UR.y + MARGIN }
36078
36260
  };
36079
36261
  const rects = partition(gcells, BB);
36262
+ if (rects === null) return null;
36080
36263
  const cells = rects.map((bb) => ({
36081
36264
  flags: 0,
36082
36265
  nedges: 0,
@@ -36558,6 +36741,24 @@ function buildSpline(e, rte, mp) {
36558
36741
  pts.push({ ...p });
36559
36742
  return pts;
36560
36743
  }
36744
+ function ensureDummyNodes(sg, gstart) {
36745
+ while (sg.nodes.length < gstart + 2) {
36746
+ sg.nodes.push({
36747
+ nVal: 0,
36748
+ nIdx: 0,
36749
+ nDad: null,
36750
+ nEdge: null,
36751
+ nAdj: 0,
36752
+ saveNAdj: 0,
36753
+ cells: [null, null],
36754
+ adjEdgeList: [],
36755
+ index: sg.nodes.length,
36756
+ isVert: false,
36757
+ x: 0,
36758
+ y: 0
36759
+ });
36760
+ }
36761
+ }
36561
36762
  function orthoEdges(g, useLbls, clipAndInstall2) {
36562
36763
  if (useLbls) {
36563
36764
  console.warn(
@@ -36567,6 +36768,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
36567
36768
  }
36568
36769
  void useLbls;
36569
36770
  const mp = mkMaze(g);
36771
+ if (mp === null) return -1;
36570
36772
  const sg = mp.sg;
36571
36773
  const es = g.edges.map((e) => ({ e, d: edgeLen(e) }));
36572
36774
  gvQsort(es, edgeCmp);
@@ -36576,22 +36778,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
36576
36778
  const pq = pqGenForGraph(sg);
36577
36779
  const sn = sg.nodes[gstart];
36578
36780
  const dn = sg.nodes[gstart + 1];
36579
- while (sg.nodes.length < gstart + 2) {
36580
- sg.nodes.push({
36581
- nVal: 0,
36582
- nIdx: 0,
36583
- nDad: null,
36584
- nEdge: null,
36585
- nAdj: 0,
36586
- saveNAdj: 0,
36587
- cells: [null, null],
36588
- adjEdgeList: [],
36589
- index: sg.nodes.length,
36590
- isVert: false,
36591
- x: 0,
36592
- y: 0
36593
- });
36594
- }
36781
+ ensureDummyNodes(sg, gstart);
36595
36782
  for (let i = 0; i < nEdges; i++) {
36596
36783
  const e = es[i].e;
36597
36784
  const start = mp.gcells[g.nodes.indexOf(e.tail)];
@@ -36605,7 +36792,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
36605
36792
  if (shortPath(pq, sg, dn, sn) !== 0) {
36606
36793
  pqFree(pq);
36607
36794
  freeMaze(mp);
36608
- return;
36795
+ return 0;
36609
36796
  }
36610
36797
  routeList[i] = convertSPtoRoute(sg, sn, dn);
36611
36798
  reset(sg);
@@ -36616,7 +36803,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
36616
36803
  assignSegs(routeList, mp);
36617
36804
  if (assignTracks(mp) !== 0) {
36618
36805
  freeMaze(mp);
36619
- return;
36806
+ return 0;
36620
36807
  }
36621
36808
  if (clipAndInstall2) {
36622
36809
  for (let i = 0; i < nEdges; i++) {
@@ -36627,6 +36814,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
36627
36814
  }
36628
36815
  }
36629
36816
  freeMaze(mp);
36817
+ return 0;
36630
36818
  }
36631
36819
 
36632
36820
  // src/layout/dot/ortho-adapter.ts
@@ -36697,7 +36885,7 @@ function installOrthoResult(oe, pts) {
36697
36885
  clipAndInstall(origEdge, origEdge.head, pts, pts.length, ORTHO_SINFO);
36698
36886
  }
36699
36887
  function dispatchOrthoEdges(g, useLbls) {
36700
- orthoEdges(
36888
+ return orthoEdges(
36701
36889
  buildOrthoGraph(g),
36702
36890
  useLbls,
36703
36891
  (_og, oe, pts) => installOrthoResult(oe, pts)
@@ -37234,12 +37422,12 @@ function resetRW(g) {
37234
37422
  }
37235
37423
  function orthoDispatch(g) {
37236
37424
  resetRW(g);
37425
+ let rc;
37237
37426
  if (((g.root.info.has_labels ?? 0) & EDGE_LABEL) !== 0) {
37238
37427
  setEdgeLabelPos(g);
37239
- dispatchOrthoEdges(g, true);
37240
- } else {
37241
- dispatchOrthoEdges(g, false);
37242
- }
37428
+ rc = dispatchOrthoEdges(g, true);
37429
+ } else rc = dispatchOrthoEdges(g, false);
37430
+ if (rc !== 0) return rc;
37243
37431
  placePortLabels(g);
37244
37432
  g.info.edgeLabelsDone = true;
37245
37433
  return 0;
@@ -37765,12 +37953,14 @@ function computeStep(ng, bbs, margin) {
37765
37953
  c -= W * H;
37766
37954
  }
37767
37955
  const d = b * b - 4 * a * c;
37768
- if (d < 0) return 1;
37769
- const root = Math.floor((-b + Math.sqrt(d)) / (2 * a));
37770
- return root <= 0 ? 1 : root;
37956
+ const r = Math.sqrt(d);
37957
+ const l1 = (-b + r) / (2 * a);
37958
+ let root = Number.isNaN(l1) ? 0 : d2i(l1);
37959
+ if (root === 0) root = 1;
37960
+ return root;
37771
37961
  }
37772
37962
  function gridCells(x, s) {
37773
- return Math.ceil(x / s);
37963
+ return d2i(Math.ceil(x / s));
37774
37964
  }
37775
37965
  function cval(v, s) {
37776
37966
  return v >= 0 ? v / s : (v + 1) / s - 1;
@@ -37811,8 +38001,8 @@ function fits(x, y, info, ctx) {
37811
38001
  const bb = ctx.bbs[info.index];
37812
38002
  if (bb === void 0) return null;
37813
38003
  const place = {
37814
- x: ctx.step * x - cround(bb.ll.x),
37815
- y: ctx.step * y - cround(bb.ll.y)
38004
+ x: Math.imul(ctx.step, x) - cround(bb.ll.x),
38005
+ y: Math.imul(ctx.step, y) - cround(bb.ll.y)
37816
38006
  };
37817
38007
  markCells(info.cells, x, y, ctx.ps);
37818
38008
  return place;
@@ -37895,7 +38085,7 @@ function computeStep2(bbs, margin) {
37895
38085
  c -= W * H;
37896
38086
  }
37897
38087
  const r = Math.sqrt(b * b - 4 * a * c);
37898
- const root = Math.trunc((-b + r) / (2 * a));
38088
+ const root = d2i((-b + r) / (2 * a));
37899
38089
  return root === 0 ? 1 : root;
37900
38090
  }
37901
38091
  function lineXDominant(st, ps) {
@@ -38041,7 +38231,7 @@ function fits2(x, y, info, ctx) {
38041
38231
  }
38042
38232
  const bb = ctx.bbs[info.index];
38043
38233
  const LL = { x: cround(bb.ll.x), y: cround(bb.ll.y) };
38044
- ctx.places[info.index] = { x: ctx.step * x - LL.x, y: ctx.step * y - LL.y };
38234
+ ctx.places[info.index] = { x: Math.imul(ctx.step, x) - LL.x, y: Math.imul(ctx.step, y) - LL.y };
38045
38235
  for (const c of info.cells) ctx.ps.add(c.x + x, c.y + y);
38046
38236
  return true;
38047
38237
  }
@@ -38527,7 +38717,7 @@ function dotLayoutComponent(sg, root) {
38527
38717
  dotRank(sg);
38528
38718
  dotMincross(sg);
38529
38719
  dotPosition(sg);
38530
- dotPhasePostNoFinish(sg);
38720
+ return dotPhasePostNoFinish(sg);
38531
38721
  }
38532
38722
  function mapClust(clone, origOf) {
38533
38723
  const orig = origOf.get(clone);
@@ -38613,7 +38803,9 @@ function packComponentsClusterAware(root, comps, pinfo) {
38613
38803
  }
38614
38804
  function layoutAndPack(root, comps, pinfo, origOf) {
38615
38805
  dotGraphInit(root);
38616
- for (const sg of comps) dotLayoutComponent(sg, root);
38806
+ for (const sg of comps) {
38807
+ if (dotLayoutComponent(sg, root) !== 0) return;
38808
+ }
38617
38809
  packComponentsClusterAware(root, comps, pinfo);
38618
38810
  copyClusterInfo(comps, root, origOf);
38619
38811
  expandRootBbForClusters(root);
@@ -38645,11 +38837,13 @@ function dotPhaseInit(g) {
38645
38837
  function dotPhasePostNoFinish(g) {
38646
38838
  removeFill(g);
38647
38839
  dotSameports(g);
38648
- dotSplines(g);
38840
+ const r = dotSplines(g);
38841
+ if (r !== 0) return r;
38649
38842
  if (mapbool2(g.attrs.get("compound") ?? g.root.attrs.get("compound"))) dotCompoundEdges(g);
38843
+ return 0;
38650
38844
  }
38651
38845
  function dotPhasePost(g) {
38652
- dotPhasePostNoFinish(g);
38846
+ if (dotPhasePostNoFinish(g) !== 0) return;
38653
38847
  gvPostprocess(g);
38654
38848
  }
38655
38849
  function graphPhase(g) {
@@ -41535,10 +41729,10 @@ function raySegIntersect(v, w, a, b) {
41535
41729
  const mv = { x: w.x - v.x, y: w.y - v.y };
41536
41730
  const lv = { x: b.x - a.x, y: b.y - a.y };
41537
41731
  const ln = { x: -lv.y, y: lv.x };
41538
- const lc = -(ln.x * a.x + ln.y * a.y);
41539
- const dt = ln.x * mv.x + ln.y * mv.y;
41732
+ const lc = -fma(ln.x, a.x, ln.y * a.y);
41733
+ const dt = fma(ln.x, mv.x, ln.y * mv.y);
41540
41734
  if (Math.abs(dt) < SMALL3) return null;
41541
- const s = (ln.x * v.x + ln.y * v.y + lc) / dt;
41735
+ const s = (fma(ln.x, v.x, ln.y * v.y) + lc) / dt;
41542
41736
  return { x: v.x - s * mv.x, y: v.y - s * mv.y };
41543
41737
  }
41544
41738
  function triPoint(trip, vx, v, w) {
@@ -41556,36 +41750,44 @@ function ctrlPtIdx(v, ps) {
41556
41750
  return -1;
41557
41751
  }
41558
41752
  var SEP = 15;
41753
+ function bisectorTarget(v, cosTheta, sinTheta) {
41754
+ return { x: fma(cosTheta, 100, v.x), y: fma(sinTheta, 100, v.y) };
41755
+ }
41756
+ function distFused(p, q) {
41757
+ const dx = p.x - q.x;
41758
+ const dy = p.y - q.y;
41759
+ return Math.sqrt(fma(dx, dx, dy * dy));
41760
+ }
41559
41761
  function mkCtrlPts(s, mult, prev, v, nxt, trip) {
41560
41762
  const idx = ctrlPtIdx(v, trip.ps);
41561
41763
  if (idx < 0) return null;
41562
41764
  const theta = bisect(prev, v, nxt);
41563
41765
  let sinTheta = Math.sin(theta);
41564
41766
  let cosTheta = Math.cos(theta);
41565
- let w = { x: v.x + 100 * cosTheta, y: v.y + 100 * sinTheta };
41767
+ let w = bisectorTarget(v, cosTheta, sinTheta);
41566
41768
  if (idx > s) {
41567
41769
  if (wind(prev, v, w) !== 1) {
41568
41770
  sinTheta *= -1;
41569
41771
  cosTheta *= -1;
41570
- w = { x: v.x + 100 * cosTheta, y: v.y + 100 * sinTheta };
41772
+ w = bisectorTarget(v, cosTheta, sinTheta);
41571
41773
  }
41572
41774
  } else if (wind(prev, v, w) !== -1) {
41573
41775
  sinTheta *= -1;
41574
41776
  cosTheta *= -1;
41575
- w = { x: v.x + 100 * cosTheta, y: v.y + 100 * sinTheta };
41777
+ w = bisectorTarget(v, cosTheta, sinTheta);
41576
41778
  }
41577
41779
  const q = triPoint(trip, idx, v, w);
41578
41780
  if (q === null) return null;
41579
- const d = Math.hypot(q.x - v.x, q.y - v.y);
41781
+ const d = distFused(q, v);
41580
41782
  const sep = d >= mult * SEP ? SEP : d / mult;
41581
41783
  const ps = new Array(mult);
41582
41784
  if (idx < s) {
41583
41785
  for (let i = 0; i < mult; i++) {
41584
- ps[i] = { x: v.x + i * sep * cosTheta, y: v.y + i * sep * sinTheta };
41786
+ ps[i] = { x: fma(i * sep, cosTheta, v.x), y: fma(i * sep, sinTheta, v.y) };
41585
41787
  }
41586
41788
  } else {
41587
41789
  for (let i = 0; i < mult; i++) {
41588
- ps[mult - i - 1] = { x: v.x + i * sep * cosTheta, y: v.y + i * sep * sinTheta };
41790
+ ps[mult - i - 1] = { x: fma(i * sep, cosTheta, v.x), y: fma(i * sep, sinTheta, v.y) };
41589
41791
  }
41590
41792
  }
41591
41793
  return ps;
@@ -42019,7 +42221,7 @@ var ObstacleHelper = class {
42019
42221
  };
42020
42222
  function ellipseTangentSlope(a, b, p) {
42021
42223
  const signY = p.y >= 0 ? 1 : -1;
42022
- return -signY * (b * p.x) / (a * Math.sqrt(a * a - p.x * p.x));
42224
+ return -signY * (b * p.x) / (a * Math.sqrt(fma(a, a, -(p.x * p.x))));
42023
42225
  }
42024
42226
  function circumscribedCorner(a, b, i, nsides) {
42025
42227
  const angle0 = 2 * Math.PI * (i - 0.5) / nsides;
@@ -42028,8 +42230,8 @@ function circumscribedCorner(a, b, i, nsides) {
42028
42230
  const p1 = { x: a * Math.cos(angle1), y: b * Math.sin(angle1) };
42029
42231
  const m0 = ellipseTangentSlope(a, b, p0);
42030
42232
  const m1 = ellipseTangentSlope(a, b, p1);
42031
- const x = (m0 * p0.x - p0.y - m1 * p1.x + p1.y) / (m0 - m1);
42032
- const y = p0.y + m0 * (x - p0.x);
42233
+ const x = (fms(p1.x, m1, fma(m0, p0.x, -p0.y)) + p1.y) / (m0 - m1);
42234
+ const y = fma(m0, x - p0.x, p0.y);
42033
42235
  return { x, y };
42034
42236
  }
42035
42237
  function boxCornerMargin(j, m) {
@@ -46106,8 +46308,8 @@ function initItem(n, margin) {
46106
46308
  let w2;
46107
46309
  let h2;
46108
46310
  if (margin.doAdd) {
46109
- w2 = Math.trunc(SCALE * (cround(width / 2 * POINTS_PER_INCH6) + margin.x));
46110
- h2 = Math.trunc(SCALE * (cround(height / 2 * POINTS_PER_INCH6) + margin.y));
46311
+ w2 = d2i(SCALE * (cround(width / 2 * POINTS_PER_INCH6) + margin.x));
46312
+ h2 = d2i(SCALE * (cround(height / 2 * POINTS_PER_INCH6) + margin.y));
46111
46313
  } else {
46112
46314
  w2 = cround(margin.x * SCALE2 * width * POINTS_PER_INCH6);
46113
46315
  h2 = cround(margin.y * SCALE2 * height * POINTS_PER_INCH6);
@@ -50115,6 +50317,20 @@ function powerLawGraph(A3) {
50115
50317
  }
50116
50318
  return mask[1] > 0.8 * max && mask[1] > 0.3 * m;
50117
50319
  }
50320
+ var PCP_COVARIANCE_LANES = 4;
50321
+ function pcpCovariance(n, dim, x, y) {
50322
+ const nUnfused = n - n % PCP_COVARIANCE_LANES;
50323
+ for (let i = 0; i < n; i++) {
50324
+ for (let k = 0; k < dim; k++) {
50325
+ for (let l = 0; l < dim; l++) {
50326
+ const a = x[i * dim + k];
50327
+ const b = x[i * dim + l];
50328
+ const acc = y[dim * k + l];
50329
+ y[dim * k + l] = i < nUnfused ? acc + a * b : fma(a, b, acc);
50330
+ }
50331
+ }
50332
+ }
50333
+ }
50118
50334
  function pcpRotate(n, dim, x) {
50119
50335
  const y = [0, 0, 0, 0];
50120
50336
  const center = [0, 0];
@@ -50125,24 +50341,23 @@ function pcpRotate(n, dim, x) {
50125
50341
  for (let i = 0; i < n; i++) {
50126
50342
  for (let k = 0; k < dim; k++) x[dim * i + k] -= center[k];
50127
50343
  }
50128
- for (let i = 0; i < n; i++) {
50129
- for (let k = 0; k < dim; k++) {
50130
- for (let l = 0; l < dim; l++) {
50131
- y[dim * k + l] = fma(x[i * dim + k], x[i * dim + l], y[dim * k + l]);
50132
- }
50133
- }
50134
- }
50344
+ pcpCovariance(n, dim, x, y);
50135
50345
  const axis = [0, 1];
50136
50346
  if (y[1] !== 0) {
50137
- axis[0] = -(-y[0] + y[3] - Math.sqrt(y[0] * y[0] + 4 * y[1] * y[1] - 2 * y[0] * y[3] + y[3] * y[3])) / (2 * y[1]);
50347
+ const radicand = fma(
50348
+ y[3],
50349
+ y[3],
50350
+ fma(-2 * y[0], y[3], fma(y[0], y[0], 4 * y[1] * y[1]))
50351
+ );
50352
+ axis[0] = -(-y[0] + y[3] - Math.sqrt(radicand)) / (2 * y[1]);
50138
50353
  axis[1] = 1;
50139
50354
  }
50140
- const dist4 = Math.sqrt(1 + axis[0] * axis[0]);
50355
+ const dist4 = Math.sqrt(fma(axis[0], axis[0], 1));
50141
50356
  axis[0] = axis[0] / dist4;
50142
50357
  axis[1] = axis[1] / dist4;
50143
50358
  for (let i = 0; i < n; i++) {
50144
- const x0 = x[dim * i] * axis[0] + x[dim * i + 1] * axis[1];
50145
- const x1 = -x[dim * i] * axis[1] + x[dim * i + 1] * axis[0];
50359
+ const x0 = fma(x[dim * i], axis[0], x[dim * i + 1] * axis[1]);
50360
+ const x1 = fma(-x[dim * i], axis[1], x[dim * i + 1] * axis[0]);
50146
50361
  x[dim * i] = x0;
50147
50362
  x[dim * i + 1] = x1;
50148
50363
  }
@@ -50405,16 +50620,7 @@ function makeCData(dn) {
50405
50620
  };
50406
50621
  }
50407
50622
 
50408
- // src/layout/circo/blockpath.ts
50409
- function blockGraph(allEdges3, sn) {
50410
- const ns = new Set(sn.subGraph.nodes);
50411
- for (const n of sn.subGraph.nodes) {
50412
- for (const e of allEdges3) {
50413
- if (e.tail === n && ns.has(e.head) && !sn.subGraph.edges.includes(e))
50414
- sn.subGraph.edges.push(e);
50415
- }
50416
- }
50417
- }
50623
+ // src/layout/circo/crossings.ts
50418
50624
  function derivedOf(n) {
50419
50625
  return n.info.alg?.derivedNode ?? null;
50420
50626
  }
@@ -50425,27 +50631,51 @@ function closeOpenEdge(e, d, opened) {
50425
50631
  }
50426
50632
  return cross2;
50427
50633
  }
50428
- function openEdgesAt(d, edges, opened, order) {
50634
+ function agfstedgeLists(edges) {
50635
+ const seq2 = /* @__PURE__ */ new Map();
50636
+ edges.forEach((e, i) => seq2.set(e, i));
50637
+ const by = (end) => (a, b) => end(a).orig.id - end(b).orig.id || seq2.get(a) - seq2.get(b);
50638
+ const out = /* @__PURE__ */ new Map();
50639
+ const inn = /* @__PURE__ */ new Map();
50429
50640
  for (const e of edges) {
50430
- if (e.order === 0 && (e.tail === d || e.head === d)) {
50431
- e.order = order;
50432
- opened.push(e);
50433
- }
50641
+ out.set(e.tail, [...out.get(e.tail) ?? [], e]);
50642
+ inn.set(e.head, [...inn.get(e.head) ?? [], e]);
50434
50643
  }
50644
+ const lists = /* @__PURE__ */ new Map();
50645
+ for (const d of /* @__PURE__ */ new Set([...out.keys(), ...inn.keys()])) {
50646
+ const o = (out.get(d) ?? []).sort(by((e) => e.head));
50647
+ const i = (inn.get(d) ?? []).sort(by((e) => e.tail));
50648
+ lists.set(d, [...o, ...i]);
50649
+ }
50650
+ return lists;
50435
50651
  }
50436
50652
  function countCrossings(list, edges) {
50437
50653
  for (const e of edges) e.order = 0;
50438
- const opened = [];
50654
+ const incident = agfstedgeLists(edges);
50655
+ const opened = /* @__PURE__ */ new Map();
50439
50656
  let crossings = 0;
50440
50657
  let order = 1;
50441
50658
  for (const n of list) {
50442
50659
  const d = derivedOf(n);
50443
50660
  if (!d) continue;
50444
- for (const e of edges) {
50445
- if (e.order > 0 && (e.tail === d || e.head === d))
50446
- crossings += closeOpenEdge(e, d, opened);
50661
+ const es = incident.get(d) ?? [];
50662
+ crossings += closeEdgesAt(d, es, opened);
50663
+ for (const e of es) {
50664
+ if (e.order === 0) {
50665
+ e.order = order;
50666
+ opened.set(e, d);
50667
+ }
50447
50668
  }
50448
- openEdgesAt(d, edges, opened, order++);
50669
+ order++;
50670
+ }
50671
+ return crossings;
50672
+ }
50673
+ function closeEdgesAt(d, es, opened) {
50674
+ let crossings = 0;
50675
+ for (const e of es) {
50676
+ if (e.order === 0) continue;
50677
+ crossings += closeOpenEdge(e, d, opened.keys());
50678
+ if (opened.get(e) === d) opened.delete(e);
50449
50679
  }
50450
50680
  return crossings;
50451
50681
  }
@@ -50498,6 +50728,17 @@ function spanIncident(dn, edges, ord, seq2) {
50498
50728
  const inn = edges.filter((e) => e.head === dn).sort((a, b) => (ord.get(a.tail) ?? 0) - (ord.get(b.tail) ?? 0) || (seq2.get(a) ?? 0) - (seq2.get(b) ?? 0));
50499
50729
  return [...out, ...inn];
50500
50730
  }
50731
+
50732
+ // src/layout/circo/blockpath.ts
50733
+ function blockGraph(allEdges3, sn) {
50734
+ const ns = new Set(sn.subGraph.nodes);
50735
+ for (const n of sn.subGraph.nodes) {
50736
+ for (const e of allEdges3) {
50737
+ if (e.tail === n && ns.has(e.head) && !sn.subGraph.edges.includes(e))
50738
+ sn.subGraph.edges.push(e);
50739
+ }
50740
+ }
50741
+ }
50501
50742
  function dfsSpan(sn, map, edges, ord, seq2) {
50502
50743
  sn.visited = true;
50503
50744
  for (const e of spanIncident(sn.dn, edges, ord, seq2)) {
@@ -51976,17 +52217,30 @@ function renderEdgeLabels(e, renderer, job) {
51976
52217
  }
51977
52218
  function emitEdgeLabel(lp, id, hs, renderer, job, spl, emitState) {
51978
52219
  if (!lp?.set) return;
51979
- const open = hs.url !== null || hs.explicit;
51980
- if (open) openAnchorWith(renderer, job, hs.url, hs.tooltip, hs.target, id);
51981
- const savedOverride = job.labelEmitOverride;
51982
- if (emitState !== void 0) job.labelEmitOverride = emitState;
51983
- try {
51984
- renderOneLabel(lp, renderer, job);
51985
- } finally {
51986
- job.labelEmitOverride = savedOverride;
52220
+ withObjEmitState(job, emitState ?? 11 /* ELabel */, () => {
52221
+ const open = hs.url !== null || hs.explicit;
52222
+ if (open) openAnchorWith(renderer, job, hs.url, hs.tooltip, hs.target, id);
52223
+ const savedOverride = job.labelEmitOverride;
52224
+ if (emitState !== void 0) job.labelEmitOverride = emitState;
52225
+ try {
52226
+ renderOneLabel(lp, renderer, job);
52227
+ } finally {
52228
+ job.labelEmitOverride = savedOverride;
52229
+ }
52230
+ if (spl) emitAttachment(lp, spl, renderer, job);
52231
+ if (open) renderer.endAnchor?.(job);
52232
+ });
52233
+ }
52234
+ function withObjEmitState(job, lkind, fn) {
52235
+ const obj = job.obj;
52236
+ if (obj === null) {
52237
+ fn();
52238
+ return;
51987
52239
  }
51988
- if (spl) emitAttachment(lp, spl, renderer, job);
51989
- if (open) renderer.endAnchor?.(job);
52240
+ const oldEmitState = obj.emitState;
52241
+ obj.emitState = lkind;
52242
+ fn();
52243
+ obj.emitState = oldEmitState;
51990
52244
  }
51991
52245
  function emitAttachment(lp, spl, renderer, job) {
51992
52246
  if (!lp?.set) return;
@@ -53572,6 +53826,7 @@ var DotWriterBase = class {
53572
53826
 
53573
53827
  // src/render/dot/edge-draw.ts
53574
53828
  var DEFAULT_COLOR5 = "black";
53829
+ var DEFAULT_LINE_STYLE = ["solid", "setlinewidth(1)"];
53575
53830
  function emitArrowOp(buf, op, pen) {
53576
53831
  switch (op.kind) {
53577
53832
  case "polygon":
@@ -53595,6 +53850,25 @@ function emitArrowOp(buf, op, pen) {
53595
53850
  var EdgeDrawBase = class extends DotWriterBase {
53596
53851
  /** setlinewidth state per emit_state. @see gvrender_core_dot.c penwidth[] */
53597
53852
  penwidth = new Array(12).fill(1);
53853
+ /**
53854
+ * emit_attachment's draw calls (decorate=true): gvrender_set_style with the
53855
+ * default line style sets the obj's rawstyle/pen/penwidth (setlinewidth 1),
53856
+ * gvrender_set_pencolor sets the pen to the label fontcolor (first entry of
53857
+ * a color list), then gvrender_polyline → xdot_polyline emits the style ops
53858
+ * (`S 5 -solid`; setlinewidth is filtered), the pen color and `L 3`.
53859
+ * @see lib/common/emit.c:emit_attachment (1886-1893)
53860
+ * @see lib/gvc/gvrender.c:gvrender_set_style / gvrender_set_pencolor
53861
+ */
53862
+ attachmentPolyline(pts, pencolor, job) {
53863
+ const obj = job.obj;
53864
+ if (obj !== null) {
53865
+ obj.rawStyle = [...DEFAULT_LINE_STYLE];
53866
+ obj.pen = 3 /* Solid */;
53867
+ obj.penWidth = 1;
53868
+ obj.penColor = resolveRenderColor(pencolor.split(":")[0]);
53869
+ }
53870
+ this.polyline(pts, job);
53871
+ }
53598
53872
  /**
53599
53873
  * The plain single-colour spline branch of beginEdge — lifted verbatim so the
53600
53874
  * four-way spline-kind chain above stays readable; no branch was reordered or
@@ -54134,19 +54408,6 @@ function emitMulticolorArrows(e, job, headColor, tailColor) {
54134
54408
  emitArrowOps(headOps, headColor, job, pw, colorOpacity(resolveRenderColor(headColor)));
54135
54409
  }
54136
54410
  }
54137
- function overlapLabel(lp, b) {
54138
- const sx = lp.dimen.x / 2;
54139
- const sy = lp.dimen.y / 2;
54140
- const bb = {
54141
- ll: { x: lp.pos.x - sx, y: lp.pos.y - sy },
54142
- ur: { x: lp.pos.x + sx, y: lp.pos.y + sy }
54143
- };
54144
- return boxOverlap(b, bb);
54145
- }
54146
- function edgeHasDrawableContent(e, clip) {
54147
- const i = e.info;
54148
- return i.spl !== void 0 || i.label !== void 0 && i.label.set && overlapLabel(i.label, clip) || i.xlabel !== void 0 || i.head_label !== void 0 || i.tail_label !== void 0;
54149
- }
54150
54411
  var SvgRenderer = class {
54151
54412
  type = "svg";
54152
54413
  /** @see plugin/core/gvplugin_core.c registration table */
@@ -54303,6 +54564,7 @@ function createSvgRenderer() {
54303
54564
  var XDOT_PARSE_ERROR = 1;
54304
54565
 
54305
54566
  // src/xdot/parse.ts
54567
+ var ULONG_MAX = 0xffffffffffffffffn;
54306
54568
  var XdotParser = class _XdotParser {
54307
54569
  static isWs(c) {
54308
54570
  return c === " " || c === " " || c === "\n" || c === "\r";
@@ -54346,12 +54608,23 @@ var XdotParser = class _XdotParser {
54346
54608
  if (i === digStart) return null;
54347
54609
  return { val: parseInt(s.slice(start, i), 10), pos: i };
54348
54610
  }
54611
+ /**
54612
+ * strtoul(s, &endp, 10) cast to unsigned int: optional sign, a leading "-"
54613
+ * negates modulo 2^64, magnitude overflow saturates to ULONG_MAX, and the
54614
+ * result keeps the low 32 bits.
54615
+ * @see lib/xdot/xdot.c:parseUInt
54616
+ */
54349
54617
  static parseUInt_(s, pos) {
54350
54618
  const i = _XdotParser.skipWs(s, pos);
54351
- const start = i;
54352
- const end = _XdotParser.consumeDigits(s, i);
54619
+ let start = i;
54620
+ const negative = i < s.length && s[i] === "-";
54621
+ if (i < s.length && (s[i] === "-" || s[i] === "+")) start++;
54622
+ const end = _XdotParser.consumeDigits(s, start);
54353
54623
  if (end === start) return null;
54354
- return { val: parseInt(s.slice(start, end), 10), pos: end };
54624
+ const mag = BigInt(s.slice(start, end));
54625
+ const clamped = mag > ULONG_MAX ? ULONG_MAX : mag;
54626
+ const wrapped = negative && mag <= ULONG_MAX ? BigInt.asUintN(64, -clamped) : clamped;
54627
+ return { val: Number(BigInt.asUintN(32, wrapped)), pos: end };
54355
54628
  }
54356
54629
  static parseRect(s, pos) {
54357
54630
  const rx = _XdotParser.parseReal(s, pos);
@@ -54448,7 +54721,7 @@ var XdotParser = class _XdotParser {
54448
54721
  if (!rx1) return null;
54449
54722
  const ry1 = _XdotParser.parseReal(s, rx1.pos);
54450
54723
  if (!ry1) return null;
54451
- const rn = _XdotParser.parseInt_(s, ry1.pos);
54724
+ const rn = _XdotParser.parseUInt_(s, ry1.pos);
54452
54725
  if (!rn) return null;
54453
54726
  const rs = _XdotParser.parseStops(s, rn.pos, rn.val);
54454
54727
  if (!rs) return null;
@@ -54467,7 +54740,7 @@ var XdotParser = class _XdotParser {
54467
54740
  if (!ry1) return null;
54468
54741
  const rr1 = _XdotParser.parseReal(s, ry1.pos);
54469
54742
  if (!rr1) return null;
54470
- const rn = _XdotParser.parseInt_(s, rr1.pos);
54743
+ const rn = _XdotParser.parseUInt_(s, rr1.pos);
54471
54744
  if (!rn) return null;
54472
54745
  const rs = _XdotParser.parseStops(s, rn.pos, rn.val);
54473
54746
  if (!rs) return null;