@mark1russell7/highways 0.5.1 → 0.6.0

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.
package/build/index.js CHANGED
@@ -26872,19 +26872,6 @@ function formatActivation(report, candidates) {
26872
26872
  ].join("\n") + "\n";
26873
26873
  }
26874
26874
  // src/bench/exact/index.ts
26875
- /** This function gives the shortest distance from `start` to each node, with Dijkstra on an adjacency list. */
26876
- function distances(adj, start) {
26877
- const d = new Float64Array(adj.length).fill(Infinity);
26878
- d[start] = 0;
26879
- const done = new Uint8Array(adj.length);
26880
- for (;;) {
26881
- let u = -1;
26882
- for (let i = 0; i < adj.length; i++) if (!done[i] && d[i] < Infinity && (u < 0 || d[i] < d[u])) u = i;
26883
- if (u < 0) return d;
26884
- done[u] = 1;
26885
- for (const { to, len } of adj[u]) if (d[u] + len < d[to]) d[to] = d[u] + len;
26886
- }
26887
- }
26888
26875
  /** This function makes the network of the exact model for the edges of a graph. */
26889
26876
  function exactNetwork(graph, o) {
26890
26877
  const finder = new WayFinder(graph.nodes, {
@@ -26947,33 +26934,155 @@ function exactNetwork(graph, o) {
26947
26934
  margin: finder.margin
26948
26935
  };
26949
26936
  }
26937
+ /** A binary heap of node indexes by a key, smallest first. A node can be in the heap more than one time. The search skips an old entry. */
26938
+ var NodeHeap = class {
26939
+ #key = /* @__PURE__ */ new Float64Array(64);
26940
+ #node = /* @__PURE__ */ new Int32Array(64);
26941
+ size = 0;
26942
+ push(key, node) {
26943
+ if (this.size === this.#key.length) {
26944
+ const k = new Float64Array(2 * this.size);
26945
+ k.set(this.#key);
26946
+ this.#key = k;
26947
+ const n = new Int32Array(2 * this.size);
26948
+ n.set(this.#node);
26949
+ this.#node = n;
26950
+ }
26951
+ const keys = this.#key;
26952
+ const nodes = this.#node;
26953
+ let i = this.size++;
26954
+ while (i > 0) {
26955
+ const up = i - 1 >> 1;
26956
+ if (keys[up] <= key) break;
26957
+ keys[i] = keys[up];
26958
+ nodes[i] = nodes[up];
26959
+ i = up;
26960
+ }
26961
+ keys[i] = key;
26962
+ nodes[i] = node;
26963
+ }
26964
+ /** This method removes the node with the smallest key, and gives it. */
26965
+ pop() {
26966
+ const keys = this.#key;
26967
+ const nodes = this.#node;
26968
+ const top = nodes[0];
26969
+ const n = --this.size;
26970
+ const key = keys[n];
26971
+ const node = nodes[n];
26972
+ let i = 0;
26973
+ for (;;) {
26974
+ let c = 2 * i + 1;
26975
+ if (c >= n) break;
26976
+ if (c + 1 < n && keys[c + 1] < keys[c]) c++;
26977
+ if (keys[c] >= key) break;
26978
+ keys[i] = keys[c];
26979
+ nodes[i] = nodes[c];
26980
+ i = c;
26981
+ }
26982
+ keys[i] = key;
26983
+ nodes[i] = node;
26984
+ return top;
26985
+ }
26986
+ };
26950
26987
  /**
26951
- * This function gives the stretch of each route as the exact model counts it, by the edge id.
26952
- * The stretch of a route is its length without its two plug ends, divided by the shortest way in the network of the model.
26953
- * The function builds the network one time. The result function then measures each list of routes of the graph, so a portfolio pays for the network once.
26954
- * An edge without a route or without a way in the network has no value.
26988
+ * This function gives the shortest distance from `start` to each node of `targets` (A*). The search stops when it has each target.
26989
+ * The guide is the straight distance to the nearest target. Each link is a straight line, so the guide is not above the true distance at any time.
26990
+ * Thus the distances are the distances of Dijkstra. Only the order of the search changes.
26991
+ * A target that the search cannot reach gets `Infinity`.
26955
26992
  */
26956
- function exactStretches(graph, o = {}) {
26957
- const { adj, ends, margin } = exactNetwork(graph, o);
26958
- const best = /* @__PURE__ */ new Map();
26959
- const from = (a) => {
26960
- if (!best.has(a)) best.set(a, distances(adj, a));
26961
- return best.get(a);
26962
- };
26993
+ function distancesTo(points, adj, start, targets) {
26994
+ const d = new Float64Array(adj.length).fill(Infinity);
26995
+ const done = new Uint8Array(adj.length);
26996
+ const goal = new Set(targets);
26997
+ const ends = targets.map((t) => points[t]);
26998
+ const guide = (v) => {
26999
+ let h = Infinity;
27000
+ for (const t of ends) h = Math.min(h, dist(points[v], t));
27001
+ return h;
27002
+ };
27003
+ const heap = new NodeHeap();
27004
+ d[start] = 0;
27005
+ heap.push(guide(start), start);
27006
+ let left = goal.size;
27007
+ while (heap.size > 0 && left > 0) {
27008
+ const u = heap.pop();
27009
+ if (done[u]) continue;
27010
+ done[u] = 1;
27011
+ if (goal.has(u)) left--;
27012
+ for (const { to, len } of adj[u]) {
27013
+ const nd = d[u] + len;
27014
+ if (nd < d[to]) {
27015
+ d[to] = nd;
27016
+ done[to] = 0;
27017
+ heap.push(nd + guide(to), to);
27018
+ }
27019
+ }
27020
+ }
27021
+ return new Map(targets.map((t) => [t, d[t]]));
27022
+ }
27023
+ /**
27024
+ * This function gives the shortest distance in the network between the two end points of each edge, by the pair `a,b` of the end points.
27025
+ * The distance does not depend on the direction, so one search serves each edge between the same two points.
27026
+ * An end point of many edges starts one search to all its other end points. The function starts the searches from the end points with the most edges first.
27027
+ */
27028
+ function pairDistances(network) {
27029
+ const pairKey = (a, b) => a < b ? `${a},${b}` : `${b},${a}`;
27030
+ const partners = /* @__PURE__ */ new Map();
27031
+ const open = /* @__PURE__ */ new Set();
27032
+ for (const e of network.ends) {
27033
+ if (e.a === e.b) continue;
27034
+ const k = pairKey(e.a, e.b);
27035
+ if (open.has(k)) continue;
27036
+ open.add(k);
27037
+ for (const [u, v] of [[e.a, e.b], [e.b, e.a]]) {
27038
+ if (!partners.has(u)) partners.set(u, /* @__PURE__ */ new Set());
27039
+ partners.get(u).add(v);
27040
+ }
27041
+ }
27042
+ const out = /* @__PURE__ */ new Map();
27043
+ const order = [...partners.keys()].sort((u, v) => partners.get(v).size - partners.get(u).size || u - v);
27044
+ for (const u of order) {
27045
+ const targets = [...partners.get(u)].filter((v) => open.has(pairKey(u, v)));
27046
+ if (targets.length === 0) continue;
27047
+ for (const [v, len] of distancesTo(network.points, network.adj, u, targets)) {
27048
+ const k = pairKey(u, v);
27049
+ out.set(k, len);
27050
+ open.delete(k);
27051
+ }
27052
+ }
27053
+ return out;
27054
+ }
27055
+ /** This function gives the function of the stretch of each route of the graph, from the network and the shortest distance of each edge. */
27056
+ function stretchesOf(network, best) {
26963
27057
  return (routes) => {
26964
27058
  const byEdge = new Map(routes.map((r) => [r.edge, r]));
26965
27059
  const out = /* @__PURE__ */ new Map();
26966
- for (const e of ends) {
27060
+ for (const e of network.ends) {
26967
27061
  const r = byEdge.get(e.edge.id);
26968
27062
  if (!r || r.points.length < 2 || e.a === e.b) continue;
26969
- const b = from(e.a)[e.b];
27063
+ const b = best(e);
26970
27064
  if (!Number.isFinite(b) || b <= 1) continue;
26971
- out.set(e.edge.id, (polylineLength(r.points) - 2 * margin) / b);
27065
+ out.set(e.edge.id, (polylineLength(r.points) - 2 * network.margin) / b);
26972
27066
  }
26973
27067
  return out;
26974
27068
  };
26975
27069
  }
26976
27070
  /**
27071
+ * This function gives the stretch of each route as the exact model counts it, by the edge id.
27072
+ * The stretch of a route is its length without its two plug ends, divided by the shortest way in the network of the model.
27073
+ * The function builds the network one time. The result function then measures each list of routes of the graph, so a portfolio pays for the network once.
27074
+ * The first call finds the shortest ways with one A* search for each end point with edges (PORTFOLIO-SPEED). The later calls use them again.
27075
+ * An edge without a route or without a way in the network has no value.
27076
+ */
27077
+ function exactStretches(graph, o = {}) {
27078
+ const network = exactNetwork(graph, o);
27079
+ let best;
27080
+ return stretchesOf(network, (e) => {
27081
+ best ??= pairDistances(network);
27082
+ return best.get(e.a < e.b ? `${e.a},${e.b}` : `${e.b},${e.a}`) ?? Infinity;
27083
+ });
27084
+ }
27085
+ /**
26977
27086
  * This function gives the largest stretch of routes as the exact model counts it (`exactStretches`).
26978
27087
  * The cap of the model is a limit on this value.
26979
27088
  * An edge without a route or without a way in the network does not count. Without such an edge, the value is 1.
@@ -27774,7 +27883,10 @@ const PORTFOLIO_KS_API = [
27774
27883
  5,
27775
27884
  8
27776
27885
  ];
27777
- /** The size bands: up to 12 nodes, 13 to 24 nodes, and 25 to 40 nodes. An input above 40 nodes uses the band `n25-40`. */
27886
+ /**
27887
+ * The size bands: up to 12 nodes, 13 to 24 nodes, 25 to 40 nodes, 41 to 64 nodes and 65 to 128 nodes. An input above 128 nodes uses the band `n65-128`.
27888
+ * The two large bands come from PORTFOLIO-SPEED. Their boards have no optima, so their sets come from the B1 under the guard.
27889
+ */
27778
27890
  const PORTFOLIO_BANDS = [
27779
27891
  {
27780
27892
  id: "n1-12",
@@ -27787,6 +27899,14 @@ const PORTFOLIO_BANDS = [
27787
27899
  {
27788
27900
  id: "n25-40",
27789
27901
  maxNodes: 40
27902
+ },
27903
+ {
27904
+ id: "n41-64",
27905
+ maxNodes: 64
27906
+ },
27907
+ {
27908
+ id: "n65-128",
27909
+ maxNodes: 128
27790
27910
  }
27791
27911
  ];
27792
27912
  /** This function gives the band of a node count: the first band whose `maxNodes` is the count or more, else the last band. */
@@ -27796,7 +27916,7 @@ function portfolioBand(nodes, bands = PORTFOLIO_BANDS) {
27796
27916
  // src/portfolio/fit.ts
27797
27917
  /**
27798
27918
  * The fit of each rule, cap and size band, by the key `<rule>|<cap>|<band>`: the members of the default of the portfolio router, in their order.
27799
- * Each member has a node limit: it runs only on an input with that many nodes or fewer. The limits keep the model time at or below 40 ms.
27919
+ * Each member has a node limit: it runs only on an input with that many nodes or fewer. The limits keep the model time at or below 42 ms.
27800
27920
  * The base `shared` is not in a fit: the portfolio always runs it first.
27801
27921
  */
27802
27922
  const PORTFOLIO_FIT = {
@@ -27812,13 +27932,14 @@ const PORTFOLIO_FIT = {
27812
27932
  ],
27813
27933
  "collection|1.1|n13-24": [
27814
27934
  ["w3e:crossbars+stretch", 24],
27935
+ ["trunks-tree-bf08", 24],
27815
27936
  ["corners-side", 24],
27816
27937
  ["shared-p2", 24],
27817
- ["w2c:zipper+stretch-b1.1", 18],
27818
- ["trunks-tree-bf08", 18],
27819
- ["hw:weiszfeld", 18]
27938
+ ["w2c:zipper+stretch-b1.1", 18]
27820
27939
  ],
27821
- "collection|1.1|n25-40": [["w2a:shared-ways+breakeven", 32], ["w2b:weiszfeld-a1", 32]],
27940
+ "collection|1.1|n25-40": [["w2a:shared-ways+breakeven", 40], ["w2b:weiszfeld-a1", 32]],
27941
+ "collection|1.1|n41-64": [],
27942
+ "collection|1.1|n65-128": [],
27822
27943
  "collection|1.25|n1-12": [
27823
27944
  ["corners-side", 12],
27824
27945
  ["trunks-tree-bf06", 12],
@@ -27834,16 +27955,17 @@ const PORTFOLIO_FIT = {
27834
27955
  ["shared-p3", 24],
27835
27956
  ["trunks-gilbert-a07", 24],
27836
27957
  ["w3e:crossbars+stretch", 24],
27837
- ["trunks-tree-bf06", 18],
27958
+ ["trunks-tree-bf06", 24],
27838
27959
  ["w3c:hdbscan+stretch", 18],
27839
- ["shared-wind-p2-r1-e2", 18],
27840
- ["hw:stubs", 18]
27960
+ ["shared-wind-p2-r1-e2", 18]
27841
27961
  ],
27842
27962
  "collection|1.25|n25-40": [
27843
- ["w2a:shared-ways+stretch", 32],
27844
- ["shared-p3", 32],
27963
+ ["w2a:shared-ways+stretch", 40],
27964
+ ["shared-p3", 40],
27845
27965
  ["shared-order-shortest", 32]
27846
27966
  ],
27967
+ "collection|1.25|n41-64": [],
27968
+ "collection|1.25|n65-128": [],
27847
27969
  "collection|1.5|n1-12": [
27848
27970
  ["trunks-gilbert-a03", 12],
27849
27971
  ["w3e:areas-keys", 12],
@@ -27860,24 +27982,26 @@ const PORTFOLIO_FIT = {
27860
27982
  ["w3e:crossbars+stretch", 24],
27861
27983
  ["shared-wind-p2-r1-e2", 24],
27862
27984
  ["trunks-tree-bf06", 24],
27863
- ["shared-flow-a06-p3", 18],
27985
+ ["shared-flow-a06-p3", 24],
27864
27986
  ["shared-wind-p3-r1", 18],
27865
27987
  ["trunks-gilbert-a07", 18]
27866
27988
  ],
27867
27989
  "collection|1.5|n25-40": [
27868
27990
  ["shared-p3", 40],
27869
- ["hw:lanes", 32],
27991
+ ["hw:lanes", 40],
27870
27992
  ["shared-wind-p2-r1-e2", 32]
27871
27993
  ],
27994
+ "collection|1.5|n41-64": [["shared-flow-a06-p3", 64]],
27995
+ "collection|1.5|n65-128": [],
27872
27996
  "all|1.1|n1-12": [
27873
27997
  ["w2b:zipper-p2", 12],
27874
27998
  ["hw:cubu", 12],
27875
27999
  ["w3d:kdeeb+stretch", 12],
27876
28000
  ["w3c:hough-wide", 12],
27877
28001
  ["w3d:kdeeb-routes", 12],
27878
- ["hw:stubs", 12],
27879
- ["hw:spiral", 12],
27880
- ["w3b:growth-s0.7", 12]
28002
+ ["hw:stubs", 10],
28003
+ ["hw:spiral", 10],
28004
+ ["w3b:growth-s0.7", 10]
27881
28005
  ],
27882
28006
  "all|1.1|n13-24": [
27883
28007
  ["w3e:frechet-e0.5", 24],
@@ -27885,31 +28009,36 @@ const PORTFOLIO_FIT = {
27885
28009
  ["w2c:zipper+stretch-b1.1", 24],
27886
28010
  ["w3d:cubu+stretch", 18]
27887
28011
  ],
27888
- "all|1.1|n25-40": [["w2c:zipper+stretch-b1.1", 32], ["w3a:spiral-a15", 32]],
28012
+ "all|1.1|n25-40": [["w2c:zipper+stretch-b1.1", 40], ["w3a:spiral-a15", 32]],
28013
+ "all|1.1|n41-64": [],
28014
+ "all|1.1|n65-128": [],
27889
28015
  "all|1.25|n1-12": [
27890
28016
  ["w3d:kdeeb-routes", 12],
27891
28017
  ["w3e:mlseb+stretch", 12],
27892
28018
  ["hw:growth", 12],
27893
- ["hw:level-links", 12],
27894
- ["w3b:growth-input", 12],
27895
- ["w3e:confluent+stretch", 12],
27896
- ["w3d:kdeeb-nomask", 10],
27897
- ["w3a:diffusion-g2", 10]
28019
+ ["hw:level-links", 10],
28020
+ ["w3b:growth-input", 10],
28021
+ ["w3e:confluent+stretch", 10]
27898
28022
  ],
27899
- "all|1.25|n13-24": [["w3d:kdeeb-routes", 24], ["w3e:mlseb+stretch", 18]],
27900
- "all|1.25|n25-40": [["w3d:kdeeb-routes", 32]],
28023
+ "all|1.25|n13-24": [
28024
+ ["w3d:kdeeb-routes", 24],
28025
+ ["w3f:p-hub-a0.2", 18],
28026
+ ["w3d:kdeeb-nomask", 18]
28027
+ ],
28028
+ "all|1.25|n25-40": [],
28029
+ "all|1.25|n41-64": [],
28030
+ "all|1.25|n65-128": [],
27901
28031
  "all|1.5|n1-12": [
27902
28032
  ["w3b:growth-s0.3", 12],
27903
28033
  ["w3e:mlseb-a0", 12],
27904
28034
  ["w3e:mlseb-routes", 10],
27905
- ["w3c:edge-paths-k1.5", 10]
28035
+ ["w3c:edge-paths-k1.5", 10],
28036
+ ["w3f:territories-r2", 10]
27906
28037
  ],
27907
28038
  "all|1.5|n13-24": [["hw:growth", 24], ["w3b:growth-input", 24]],
27908
- "all|1.5|n25-40": [
27909
- ["hw:growth", 40],
27910
- ["w3b:growth-s0.7", 32],
27911
- ["w3b:growth-s0.3", 32]
27912
- ]
28039
+ "all|1.5|n25-40": [["hw:growth", 40], ["w3b:growth-s0.7", 40]],
28040
+ "all|1.5|n41-64": [],
28041
+ "all|1.5|n65-128": []
27913
28042
  };
27914
28043
  // src/portfolio/key.ts
27915
28044
  /** The id of the B1 level of the key of the portfolio router. */
@@ -28398,10 +28527,10 @@ const PORTFOLIO_SETS = {
28398
28527
  ],
28399
28528
  "collection|1.1|n13-24": [
28400
28529
  "w3e:crossbars+stretch",
28530
+ "trunks-tree-bf08",
28401
28531
  "corners-side",
28402
28532
  "shared-p2",
28403
28533
  "w2c:zipper+stretch-b1.1",
28404
- "trunks-tree-bf08",
28405
28534
  "hw:weiszfeld",
28406
28535
  "trunks-gilbert-a07",
28407
28536
  "hw:stubs"
@@ -28411,6 +28540,8 @@ const PORTFOLIO_SETS = {
28411
28540
  "w2b:weiszfeld-a1",
28412
28541
  "w2c:level-links+stretch-b1.1"
28413
28542
  ],
28543
+ "collection|1.1|n41-64": [],
28544
+ "collection|1.1|n65-128": [],
28414
28545
  "collection|1.25|n1-12": [
28415
28546
  "corners-side",
28416
28547
  "trunks-tree-bf06",
@@ -28441,6 +28572,13 @@ const PORTFOLIO_SETS = {
28441
28572
  "w2a:shared-ways+ambiguity",
28442
28573
  "w2b:weiszfeld-a0"
28443
28574
  ],
28575
+ "collection|1.25|n41-64": [
28576
+ "hw:lanes",
28577
+ "w3e:crossbars+stretch",
28578
+ "w2a:shared-ways+stretch",
28579
+ "shared-flow-a06-p3"
28580
+ ],
28581
+ "collection|1.25|n65-128": ["hw:lanes"],
28444
28582
  "collection|1.5|n1-12": [
28445
28583
  "trunks-gilbert-a03",
28446
28584
  "w3e:areas-keys",
@@ -28471,6 +28609,18 @@ const PORTFOLIO_SETS = {
28471
28609
  "shared-wind-p2-r1",
28472
28610
  "shared-wind-p2-r2"
28473
28611
  ],
28612
+ "collection|1.5|n41-64": [
28613
+ "shared-flow-a06-p3",
28614
+ "hw:lanes",
28615
+ "shared-p2",
28616
+ "trunks-tree-bf06"
28617
+ ],
28618
+ "collection|1.5|n65-128": [
28619
+ "shared-p2",
28620
+ "shared-p3",
28621
+ "shared-flow-a06-p3",
28622
+ "hw:lanes"
28623
+ ],
28474
28624
  "all|1.1|n1-12": [
28475
28625
  "w2b:zipper-p2",
28476
28626
  "hw:cubu",
@@ -28500,6 +28650,13 @@ const PORTFOLIO_SETS = {
28500
28650
  "w2c:road-classes-d0.3",
28501
28651
  "w3d:kdeeb-routes"
28502
28652
  ],
28653
+ "all|1.1|n41-64": [
28654
+ "hw:diffusion",
28655
+ "w3a:spiral-a15",
28656
+ "w2c:zipper+stretch-b1.1",
28657
+ "w3e:frechet-e0.5"
28658
+ ],
28659
+ "all|1.1|n65-128": ["hw:diffusion"],
28503
28660
  "all|1.25|n1-12": [
28504
28661
  "w3d:kdeeb-routes",
28505
28662
  "w3e:mlseb+stretch",
@@ -28512,13 +28669,13 @@ const PORTFOLIO_SETS = {
28512
28669
  ],
28513
28670
  "all|1.25|n13-24": [
28514
28671
  "w3d:kdeeb-routes",
28515
- "w3e:mlseb+stretch",
28516
28672
  "w3f:p-hub-a0.2",
28673
+ "w3d:kdeeb-nomask",
28517
28674
  "w3a:spiral-n3",
28518
- "w3a:diffusion-l3",
28519
- "trunks-tree-bf06",
28520
- "hw:cubu",
28521
- "w3a:spiral-a35"
28675
+ "w3b:growth-input",
28676
+ "w3d:cubu+stretch",
28677
+ "w3a:spiral-a35",
28678
+ "trunks-tree-bf06"
28522
28679
  ],
28523
28680
  "all|1.25|n25-40": [
28524
28681
  "w3d:kdeeb-routes",
@@ -28528,6 +28685,18 @@ const PORTFOLIO_SETS = {
28528
28685
  "w3e:frechet+stretch",
28529
28686
  "hw:cubu"
28530
28687
  ],
28688
+ "all|1.25|n41-64": [
28689
+ "w3e:frechet+stretch",
28690
+ "hw:cubu",
28691
+ "w3a:diffusion-wide",
28692
+ "w2a:shared-ways+stretch",
28693
+ "w3a:spiral-a35"
28694
+ ],
28695
+ "all|1.25|n65-128": [
28696
+ "hw:diffusion",
28697
+ "w3a:diffusion-wide",
28698
+ "w3a:diffusion-l3"
28699
+ ],
28531
28700
  "all|1.5|n1-12": [
28532
28701
  "w3b:growth-s0.3",
28533
28702
  "w3e:mlseb-a0",
@@ -28542,7 +28711,6 @@ const PORTFOLIO_SETS = {
28542
28711
  "hw:growth",
28543
28712
  "w3b:growth-input",
28544
28713
  "hw:mlseb",
28545
- "w3e:mlseb+stretch",
28546
28714
  "w3b:growth-s0.3"
28547
28715
  ],
28548
28716
  "all|1.5|n25-40": [
@@ -28551,6 +28719,20 @@ const PORTFOLIO_SETS = {
28551
28719
  "w3b:growth-s0.3",
28552
28720
  "w3b:growth-t1.2",
28553
28721
  "w3b:growth-input"
28722
+ ],
28723
+ "all|1.5|n41-64": [
28724
+ "hw:growth",
28725
+ "w3b:growth-s0.3",
28726
+ "w3a:diffusion-g2",
28727
+ "w3b:growth-s0.7",
28728
+ "w3a:diffusion-l3",
28729
+ "w3b:growth-input"
28730
+ ],
28731
+ "all|1.5|n65-128": [
28732
+ "hw:growth",
28733
+ "w3b:growth-s0.3",
28734
+ "hw:shared-ways-all",
28735
+ "w3a:diffusion-g2"
28554
28736
  ]
28555
28737
  };
28556
28738
  // src/portfolio/router.ts
@@ -28652,6 +28834,6 @@ const portfolioStrategy = defineStrategy({
28652
28834
  maxNodes: 1e4,
28653
28835
  run: (graph, options) => routePortfolio(graph, options).result
28654
28836
  });
28655
- export { AMBIGUITY_GUARD_DEFAULTS, ARC_SOURCES, AREA_DEFAULTS, AREA_WIDTHS, BACKTRACK_MIN, BACKTRACK_SHARE, BREAK, BREAK_EVEN, BREAK_EVEN_DEFAULTS, BUILT_IN_STRATEGIES, BoundaryWalk, CANDIDATE_SOURCES, CAP_SWEEP, CASES, CHANNEL_REACH, CLEARANCE_CAP, COMPARE_STEPS, CONFLUENT_DEFAULTS, CONSENSUS_DEFAULTS, CONSENSUS_LINKAGES, CORRIDOR_DEFAULTS, CROSSBAR_DEFAULTS, CUBU_DEFAULTS, CURVE_TYPES, CUT_DEFAULTS, CornerGraph, DENSITY_KERNELS, DIFFUSION_DEFAULTS, DIVIDED_DEFAULTS, EDGE_DISTANCES, EDGE_PATH_DEFAULTS, EXACT_CLASSES, EXACT_EDGES_PER_NODE, EXACT_V1, EXACT_V1_BOUNDS, EXACT_V1_BOUNDS_SIZES, EXACT_V1_SEEDS, EXACT_V1_SIZES, FDEB_DEFAULTS, FIXTURES, FLOW_CLUSTER_DEFAULTS, FLOW_FIELD_DEFAULTS, FRECHET_DEFAULTS, FRONT_OBJECTIVES, GAP_BASELINES, GAP_BOOTSTRAP, GAP_CAPS, GAP_RULES, GAP_VIEWS, GROUP_SCOPES, GROUP_SPINES, GROWTH_DEFAULTS, GROWTH_SWEEP, Grid, HDBSCAN_DEFAULTS, HIERARCHY_DEFAULTS, HIERARCHY_GROUPS, HIGHWAY_BASES, HIGHWAY_BASE_ROUTERS, HOUGH_DEFAULTS, HUB_ALLOCATIONS, HUB_ARC_DEFAULTS, HUB_CANDIDATES, HYSTERESIS_DEFAULTS, KDEEB_DEFAULTS, KD_DEFAULTS, KENDALL_EXACT, LANES_DEFAULTS, LANE_ORDERS, LANE_TRACKS, LEVEL_HIGHWAY_DEFAULTS, LINKAGES, LINK_COMMUNITY_DEFAULTS, MEASURES, MEASURE_LANE_WIDTH, MEET_DEFAULTS, MEMBER_FORMS, MESH_DEFAULTS, MINGLE_DEFAULTS, MIN_EFFECTS, MLSEB_DEFAULTS, MLS_FITS, MODULE_RULES, MOVE_NAMES, NESTED_DEFAULTS, OD_CELL_DEFAULTS, OUTSIDE_SLACK, Obstacles, PICK, PLAN_CHANGERS, PORTFOLIO_B1, PORTFOLIO_BANDS, PORTFOLIO_BASE_MEMBER, PORTFOLIO_CAPS, PORTFOLIO_FIT, PORTFOLIO_KS_API, PORTFOLIO_RULES, PORTFOLIO_SETS, POWER_DEFAULTS, PROPOSED_RULES, P_HUB_DEFAULTS, QUICKBUNDLES_DEFAULTS, RECORD_EPS, RESISTANCE_DEFAULTS, RIDGE_DEFAULTS, ROAD_CLASS_DEFAULTS, ROOM_FAMILIES, ROUTERS, SAME_HIGHWAY, SBEB_DEFAULTS, SCALE_SPACE_DEFAULTS, SCREEN_RULES, SCREEN_SETS, SCREEN_STEPS, SCREEN_V1, SCREEN_WRAPS, SECTION_DEFAULTS, SELECT_DEFAULTS, SIDE_NORMAL, SKELETON_GROUPS, SKELETON_TARGETS, SLACK_SWEEP, SOFT_KEY_DEFAULTS, SPACING_LIMIT, SPECTRAL_DEFAULTS, SPIRAL_DEFAULTS, STABLE_ID_DEFAULTS, STEPS, STRATEGIES, STRETCH_DEFAULTS, STRETCH_SWEEP, STUB_DEFAULTS, SUITE_COLUMNS, SoftGraph, SplitTree, TERRITORY_DEFAULTS, TERRITORY_POINTS, TOLERANCE, TRACLUS_DEFAULTS, TRAFFIC_RULES, WEISZFELD_DEFAULTS, WSPD_DEFAULTS, WayFinder, ZIPPER_DEFAULTS, activationBase, activationReport, adjustedRandIndex, allSections, ambiguity, ambiguityGate, ambiguityPlan, arcCurve, areaPlan, asRouter, backtrackOf, balance, basePlan, benchBendRoom, benchCurveStrategies, benchCurves, benchHighways, benchLevelRoom, benchOne, benchRoom, benchRun, benchTracks, bendCount, bendingEnergy, bicliqueGroups, bigGroups, boardGaps, boardUnit, boardWins, bootstrapMedian, boundsFamilyName, boxExit, boxPush, boxUnit, boxesOverlap, breakEvenGate, breakEvenPlan, buildSections, bundleStretch, bundledShare, byCollection, byDataGroup, candidateArcs, candidatePlan, candidateScore, canonicalJson, capSettings, cellSteps, center, chainClusters, changeGraph, channelOverflows, channelWidth, characteristicPoints, checkLevels, checkOptions, checkPlan, checkProperties, checkSchema, checkSections, clampOptions, clothoidCurve, clusters1d, coAssociation, commonEdges, compareMeasure, compareSpec, compareStep, compatibility, compatibilityMatrix, confluentPlan, consensusGroups, consensusLabels, consensusPlan, controlChain, cornersRouter, corpusManifest, corridorPlan, countCrossings, countOverlaps, createRegistry, crossbarPlan, crossesItself, crossingAngle, crossingAngles, cubicAt, cubuPlan, curveFaults, curveJoints, curveOf, curveRuns, curveSpace, curveStrategies, curvesHash, cutGroups, cutShare, defineStrategy, denseGroupsBoard, densityPlan, densityRidges, detourSpread, diffusionPlan, dist, distinctPoints, divideHighway, dividedPlan, documentHash, dominates, drawnSegments, edgeBlocks, edgeEnds, edgeLengths, edgePathPlan, edgePaths, edgePlugs, edgeResistance, exactBoard, exactFamily, exactGenerator, exactSeed, exercised, familyOf, familySeed, farLevel, fdebLines, fdebPlan, fft, findStrategy, finderOf, firstLines, fixedPortPoint, fixtureGroupOptions, flowClusterPlan, flowClusters, flowDistance, flowFieldPlan, fnv1a32, follow, formatActivation, formatBendRoom, formatCurves, formatFaults, formatFronts, formatGap, formatHighways, formatInput, formatLevelRoom, formatLevels, formatMeasureTime, formatRoom, formatRules, formatScreen, formatSections, formatSummaries, formatTable, formatTracks, frechet, frechetBundles, frechetPlan, g1Defect, g2Defect, gapBaselines, gapCap, gapClosed, gapLaneCounts, gapLanes, gapNames, gapValues, gateStrategy, getStrategy, goesOutAndBack, graphInput, greedyBicliques, greedyCrossbars, groupEdges, groupRun, groupSettings, groupStability, groupStrategies, groupedPlan, growthPlan, growthSettings, guardBreaks, hasCusp, hdbscanClusters, hdbscanLabels, hdbscanPlan, hierarchyPlan, highwayChurn, highwayCurve, highwayCurves, highwayEdits, highwayIdKeep, highwayMoves, highwayRouter, highwayRouterStrategy, highwayStrategies, houghLines, houghPeaks, houghPlan, hubArcPlan, hubCandidates, hubChainBoard, hysteresisGate, hysteresisPlan, inflate, inflectionCount, inflectionCurve, inflectionSector, inkSaved, innerPoints, inputGraph, inputId, itemSizes, jaccard, jaccardIndex, jogPeaks, joinReports, jsonSafe, kMeans, kdGroups, kdeebLines, kdeebPlan, keepMembers, kendallTau, keyGroups, keyedSections, keysPlan, labelGroups, laneArea, laneCrossings, laneFidelity, laneOrder, laneRoutes, laneSeparation, laneSettings, lanesPlan, lanesThrough, leafGroups, lengthBetween, levelCut, levelGrouping, levelHighwayPlan, levelMeasures, levelPairs, levelRoom, lineDensity, linePoint, linkAgreement, linkCommunities, linkCommunityGroups, linkCommunityPlan, linkDensity, listOptions, listStrategies, makeFixture, makeRoom, manyGroupsBoard, matchHighways, maxStretch, mdf, meanLine, measureBoard, measureByKey, measureByName, measureHighways, measureJogs, measureLevel, measureLevelFaults, measureLinks, measureName, measureQuality, measureRouteFaults, measureStability, meetMember, meetPlan, meetingPoints, memberAt, memberStrategy, mergeAngle, meshPlan, meshWaypoints, minEffectOf, minHash, mingleBundles, minglePlan, mixedSegments, mixesCollections, mlsPoint, mlsebLines, mlsebPlan, modularity, modulesOf, mulberry32, namedObjectives, nearestCentre, nearestOnBoundary, nearestOnLine, nearestSide, nearestSkeleton, nestedGridBoard, nestedGroups, nestedPlan, nestingFaults, nestingViolations, nextRow, nodeAmbiguity, nodeIndex, nodeLinks, occupiedArea, odCellPlan, odGroups, offsetLine, offsetPolyline, openGaps, openLanes, optimaFile, optimumKey, optionDefaults, orderChanges, orderFragility, orderLanes, orderRows, orderStability, orderSuiteRows, orthogonality, outOfBoxes, outputGroups, outputHash, pHubPlan, pMedian, packedGridBoard, paretoFront, parseLines, partWithin, passSettings, pathPoints, peakCurvature, pickLevel, pickMoves, placePlug, planMoves, planOfResult, plugSpacing, plugsRouter, pointAt, pointBoxDistance, pointDensity, pointGroups, pointOnSide, pointSegmentDistance, polylineLength, portfolio, portfolioB1Spec, portfolioBand, portfolioFacts, portfolioKey, portfolioMember, portfolioMembers, portfolioName, portfolioRouter, portfolioStrategy, positionStability, powerPlan, pullApart, quadtreeGroups, quantile, quickBundles, quickBundlesPlan, randomInt, rayToBox, recordLines, recordMoves, rectScattered, regionBounds, register, repairResult, repairStrategy, representative, resample, resistanceClusters, resistancePlan, resultForm, resultHash, ridgeLines, ridgePlan, rng, roadClassPlan, roomDemand, roomLinks, roomOrderFaults, roomStrategies, round3, roundCorners, roundedCurve, routeCrossings, routeInStableOrder, routeMeasures, routePortfolio, routeSeparation, routeStability, routerStrategies, routersOf, ruleCounts, runBenchmark, runKey, runProfile, runSuite, sameData, sampleCurve, samplesOf, sbebLines, sbebPlan, scaleClusters, scaleSpaceGroups, scaleSpacePlan, screen, screenInputs, sectionsRouter, segmentBounds, segmentBoxDistance, segmentClusters, segmentDistance, segmentHitsBox, segmentHitsRect, segmentKey, segmentsCross, segmentsOf, selectBest, selectPlan, sha256Hex, shapeSkeleton, sharedRouter, sharedStretches, sharedWaysAll, sharedWaysPlan, shuffleEdges, sideAngle, sideToward, skeletonGroups, skeletonPath, slackSettings, smoothCurve, snapPlan, softDistance, softKeyClusters, softKeyPlan, spectralClusters, spectralLabels, spectralPlan, spinePart, spiralJoin, spiralPlan, spiralTree, splineCurve, splitPoint, stableIdGate, stableIdPlan, stableOrder, stableOrderStrategy, stepSeed, straightCurve, straightRouter, stretchGate, stretchPlan, stretchSettings, stubPlan, suiteFronts, sumFaults, summarize, summarizeGap, summarizeRows, sweepGrid, sweepOf, sweepRoom, sweepSections, sweepValues, symmetricEigen, territoryPlan, toSvgPath, totalTurn, tracePlan, traclusPlan, treeCost, treeDepth, trunksRouter, turns, unwrappedName, utf8, waypointWay, weberPoint, weiszfeldPlan, withBends, withRepair, withStableOrder, wspdGroups, wspdPlan, zipLegs, zipperPlan };
28837
+ export { AMBIGUITY_GUARD_DEFAULTS, ARC_SOURCES, AREA_DEFAULTS, AREA_WIDTHS, BACKTRACK_MIN, BACKTRACK_SHARE, BREAK, BREAK_EVEN, BREAK_EVEN_DEFAULTS, BUILT_IN_STRATEGIES, BoundaryWalk, CANDIDATE_SOURCES, CAP_SWEEP, CASES, CHANNEL_REACH, CLEARANCE_CAP, COMPARE_STEPS, CONFLUENT_DEFAULTS, CONSENSUS_DEFAULTS, CONSENSUS_LINKAGES, CORRIDOR_DEFAULTS, CROSSBAR_DEFAULTS, CUBU_DEFAULTS, CURVE_TYPES, CUT_DEFAULTS, CornerGraph, DENSITY_KERNELS, DIFFUSION_DEFAULTS, DIVIDED_DEFAULTS, EDGE_DISTANCES, EDGE_PATH_DEFAULTS, EXACT_CLASSES, EXACT_EDGES_PER_NODE, EXACT_V1, EXACT_V1_BOUNDS, EXACT_V1_BOUNDS_SIZES, EXACT_V1_SEEDS, EXACT_V1_SIZES, FDEB_DEFAULTS, FIXTURES, FLOW_CLUSTER_DEFAULTS, FLOW_FIELD_DEFAULTS, FRECHET_DEFAULTS, FRONT_OBJECTIVES, GAP_BASELINES, GAP_BOOTSTRAP, GAP_CAPS, GAP_RULES, GAP_VIEWS, GROUP_SCOPES, GROUP_SPINES, GROWTH_DEFAULTS, GROWTH_SWEEP, Grid, HDBSCAN_DEFAULTS, HIERARCHY_DEFAULTS, HIERARCHY_GROUPS, HIGHWAY_BASES, HIGHWAY_BASE_ROUTERS, HOUGH_DEFAULTS, HUB_ALLOCATIONS, HUB_ARC_DEFAULTS, HUB_CANDIDATES, HYSTERESIS_DEFAULTS, KDEEB_DEFAULTS, KD_DEFAULTS, KENDALL_EXACT, LANES_DEFAULTS, LANE_ORDERS, LANE_TRACKS, LEVEL_HIGHWAY_DEFAULTS, LINKAGES, LINK_COMMUNITY_DEFAULTS, MEASURES, MEASURE_LANE_WIDTH, MEET_DEFAULTS, MEMBER_FORMS, MESH_DEFAULTS, MINGLE_DEFAULTS, MIN_EFFECTS, MLSEB_DEFAULTS, MLS_FITS, MODULE_RULES, MOVE_NAMES, NESTED_DEFAULTS, OD_CELL_DEFAULTS, OUTSIDE_SLACK, Obstacles, PICK, PLAN_CHANGERS, PORTFOLIO_B1, PORTFOLIO_BANDS, PORTFOLIO_BASE_MEMBER, PORTFOLIO_CAPS, PORTFOLIO_FIT, PORTFOLIO_KS_API, PORTFOLIO_RULES, PORTFOLIO_SETS, POWER_DEFAULTS, PROPOSED_RULES, P_HUB_DEFAULTS, QUICKBUNDLES_DEFAULTS, RECORD_EPS, RESISTANCE_DEFAULTS, RIDGE_DEFAULTS, ROAD_CLASS_DEFAULTS, ROOM_FAMILIES, ROUTERS, SAME_HIGHWAY, SBEB_DEFAULTS, SCALE_SPACE_DEFAULTS, SCREEN_RULES, SCREEN_SETS, SCREEN_STEPS, SCREEN_V1, SCREEN_WRAPS, SECTION_DEFAULTS, SELECT_DEFAULTS, SIDE_NORMAL, SKELETON_GROUPS, SKELETON_TARGETS, SLACK_SWEEP, SOFT_KEY_DEFAULTS, SPACING_LIMIT, SPECTRAL_DEFAULTS, SPIRAL_DEFAULTS, STABLE_ID_DEFAULTS, STEPS, STRATEGIES, STRETCH_DEFAULTS, STRETCH_SWEEP, STUB_DEFAULTS, SUITE_COLUMNS, SoftGraph, SplitTree, TERRITORY_DEFAULTS, TERRITORY_POINTS, TOLERANCE, TRACLUS_DEFAULTS, TRAFFIC_RULES, WEISZFELD_DEFAULTS, WSPD_DEFAULTS, WayFinder, ZIPPER_DEFAULTS, activationBase, activationReport, adjustedRandIndex, allSections, ambiguity, ambiguityGate, ambiguityPlan, arcCurve, areaPlan, asRouter, backtrackOf, balance, basePlan, benchBendRoom, benchCurveStrategies, benchCurves, benchHighways, benchLevelRoom, benchOne, benchRoom, benchRun, benchTracks, bendCount, bendingEnergy, bicliqueGroups, bigGroups, boardGaps, boardUnit, boardWins, bootstrapMedian, boundsFamilyName, boxExit, boxPush, boxUnit, boxesOverlap, breakEvenGate, breakEvenPlan, buildSections, bundleStretch, bundledShare, byCollection, byDataGroup, candidateArcs, candidatePlan, candidateScore, canonicalJson, capSettings, cellSteps, center, chainClusters, changeGraph, channelOverflows, channelWidth, characteristicPoints, checkLevels, checkOptions, checkPlan, checkProperties, checkSchema, checkSections, clampOptions, clothoidCurve, clusters1d, coAssociation, commonEdges, compareMeasure, compareSpec, compareStep, compatibility, compatibilityMatrix, confluentPlan, consensusGroups, consensusLabels, consensusPlan, controlChain, cornersRouter, corpusManifest, corridorPlan, countCrossings, countOverlaps, createRegistry, crossbarPlan, crossesItself, crossingAngle, crossingAngles, cubicAt, cubuPlan, curveFaults, curveJoints, curveOf, curveRuns, curveSpace, curveStrategies, curvesHash, cutGroups, cutShare, defineStrategy, denseGroupsBoard, densityPlan, densityRidges, detourSpread, diffusionPlan, dist, distinctPoints, divideHighway, dividedPlan, documentHash, dominates, drawnSegments, edgeBlocks, edgeEnds, edgeLengths, edgePathPlan, edgePaths, edgePlugs, edgeResistance, exactBoard, exactFamily, exactGenerator, exactSeed, exactStretch, exactStretches, exercised, familyOf, familySeed, farLevel, fdebLines, fdebPlan, fft, findStrategy, finderOf, firstLines, fixedPortPoint, fixtureGroupOptions, flowClusterPlan, flowClusters, flowDistance, flowFieldPlan, fnv1a32, follow, formatActivation, formatBendRoom, formatCurves, formatFaults, formatFronts, formatGap, formatHighways, formatInput, formatLevelRoom, formatLevels, formatMeasureTime, formatRoom, formatRules, formatScreen, formatSections, formatSummaries, formatTable, formatTracks, frechet, frechetBundles, frechetPlan, g1Defect, g2Defect, gapBaselines, gapCap, gapClosed, gapLaneCounts, gapLanes, gapNames, gapValues, gateStrategy, getStrategy, goesOutAndBack, graphInput, greedyBicliques, greedyCrossbars, groupEdges, groupRun, groupSettings, groupStability, groupStrategies, groupedPlan, growthPlan, growthSettings, guardBreaks, hasCusp, hdbscanClusters, hdbscanLabels, hdbscanPlan, hierarchyPlan, highwayChurn, highwayCurve, highwayCurves, highwayEdits, highwayIdKeep, highwayMoves, highwayRouter, highwayRouterStrategy, highwayStrategies, houghLines, houghPeaks, houghPlan, hubArcPlan, hubCandidates, hubChainBoard, hysteresisGate, hysteresisPlan, inflate, inflectionCount, inflectionCurve, inflectionSector, inkSaved, innerPoints, inputGraph, inputId, itemSizes, jaccard, jaccardIndex, jogPeaks, joinReports, jsonSafe, kMeans, kdGroups, kdeebLines, kdeebPlan, keepMembers, kendallTau, keyGroups, keyedSections, keysPlan, labelGroups, laneArea, laneCrossings, laneFidelity, laneOrder, laneRoutes, laneSeparation, laneSettings, lanesPlan, lanesThrough, leafGroups, lengthBetween, levelCut, levelGrouping, levelHighwayPlan, levelMeasures, levelPairs, levelRoom, lineDensity, linePoint, linkAgreement, linkCommunities, linkCommunityGroups, linkCommunityPlan, linkDensity, listOptions, listStrategies, makeFixture, makeRoom, manyGroupsBoard, matchHighways, maxStretch, mdf, meanLine, measureBoard, measureByKey, measureByName, measureHighways, measureJogs, measureLevel, measureLevelFaults, measureLinks, measureName, measureQuality, measureRouteFaults, measureStability, meetMember, meetPlan, meetingPoints, memberAt, memberStrategy, mergeAngle, meshPlan, meshWaypoints, minEffectOf, minHash, mingleBundles, minglePlan, mixedSegments, mixesCollections, mlsPoint, mlsebLines, mlsebPlan, modularity, modulesOf, mulberry32, namedObjectives, nearestCentre, nearestOnBoundary, nearestOnLine, nearestSide, nearestSkeleton, nestedGridBoard, nestedGroups, nestedPlan, nestingFaults, nestingViolations, nextRow, nodeAmbiguity, nodeIndex, nodeLinks, occupiedArea, odCellPlan, odGroups, offsetLine, offsetPolyline, openGaps, openLanes, optimaFile, optimumKey, optionDefaults, orderChanges, orderFragility, orderLanes, orderRows, orderStability, orderSuiteRows, orthogonality, outOfBoxes, outputGroups, outputHash, pHubPlan, pMedian, packedGridBoard, paretoFront, parseLines, partWithin, passSettings, pathPoints, peakCurvature, pickLevel, pickMoves, placePlug, planMoves, planOfResult, plugSpacing, plugsRouter, pointAt, pointBoxDistance, pointDensity, pointGroups, pointOnSide, pointSegmentDistance, polylineLength, portfolio, portfolioB1Spec, portfolioBand, portfolioFacts, portfolioKey, portfolioMember, portfolioMembers, portfolioName, portfolioRouter, portfolioStrategy, positionStability, powerPlan, pullApart, quadtreeGroups, quantile, quickBundles, quickBundlesPlan, randomInt, rayToBox, recordLines, recordMoves, rectScattered, regionBounds, register, repairResult, repairStrategy, representative, resample, resistanceClusters, resistancePlan, resultForm, resultHash, ridgeLines, ridgePlan, rng, roadClassPlan, roomDemand, roomLinks, roomOrderFaults, roomStrategies, round3, roundCorners, roundedCurve, routeCrossings, routeInStableOrder, routeMeasures, routePortfolio, routeSeparation, routeStability, routerStrategies, routersOf, ruleCounts, runBenchmark, runKey, runProfile, runSuite, sameData, sampleCurve, samplesOf, sbebLines, sbebPlan, scaleClusters, scaleSpaceGroups, scaleSpacePlan, screen, screenInputs, sectionsRouter, segmentBounds, segmentBoxDistance, segmentClusters, segmentDistance, segmentHitsBox, segmentHitsRect, segmentKey, segmentsCross, segmentsOf, selectBest, selectPlan, sha256Hex, shapeSkeleton, sharedRouter, sharedStretches, sharedWaysAll, sharedWaysPlan, shuffleEdges, sideAngle, sideToward, skeletonGroups, skeletonPath, slackSettings, smoothCurve, snapPlan, softDistance, softKeyClusters, softKeyPlan, spectralClusters, spectralLabels, spectralPlan, spinePart, spiralJoin, spiralPlan, spiralTree, splineCurve, splitPoint, stableIdGate, stableIdPlan, stableOrder, stableOrderStrategy, stepSeed, straightCurve, straightRouter, stretchGate, stretchPlan, stretchSettings, stubPlan, suiteFronts, sumFaults, summarize, summarizeGap, summarizeRows, sweepGrid, sweepOf, sweepRoom, sweepSections, sweepValues, symmetricEigen, territoryPlan, toSvgPath, totalTurn, tracePlan, traclusPlan, treeCost, treeDepth, trunksRouter, turns, unwrappedName, utf8, waypointWay, weberPoint, weiszfeldPlan, withBends, withRepair, withStableOrder, wspdGroups, wspdPlan, zipLegs, zipperPlan };
28656
28838
 
28657
28839
  //# sourceMappingURL=index.js.map