circuit-to-svg 0.0.69 → 0.0.71
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/dist/index.js +86 -41
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1283,7 +1283,7 @@ import { su } from "@tscircuit/soup-util";
|
|
|
1283
1283
|
import { symbols } from "schematic-symbols";
|
|
1284
1284
|
import "svgson";
|
|
1285
1285
|
import {
|
|
1286
|
-
applyToPoint as
|
|
1286
|
+
applyToPoint as applyToPoint17,
|
|
1287
1287
|
compose as compose5
|
|
1288
1288
|
} from "transformation-matrix";
|
|
1289
1289
|
|
|
@@ -1369,12 +1369,45 @@ function pointPairsToMatrix(a1, a2, b1, b2) {
|
|
|
1369
1369
|
// lib/utils/get-sch-font-size.ts
|
|
1370
1370
|
import "transformation-matrix";
|
|
1371
1371
|
var getSchMmFontSize = (textType) => {
|
|
1372
|
-
return textType === "pin_number" ? 0.15 : 0.18;
|
|
1372
|
+
return textType === "error" ? 0.05 : textType === "pin_number" ? 0.15 : 0.18;
|
|
1373
1373
|
};
|
|
1374
1374
|
var getSchScreenFontSize = (transform, textType) => {
|
|
1375
1375
|
return Math.abs(transform.a) * getSchMmFontSize(textType);
|
|
1376
1376
|
};
|
|
1377
1377
|
|
|
1378
|
+
// lib/sch/svg-object-fns/create-svg-error-text.ts
|
|
1379
|
+
import { applyToPoint as applyToPoint16 } from "transformation-matrix";
|
|
1380
|
+
var createSvgSchErrorText = ({
|
|
1381
|
+
text,
|
|
1382
|
+
realCenter,
|
|
1383
|
+
realToScreenTransform
|
|
1384
|
+
}) => {
|
|
1385
|
+
const screenCenter = applyToPoint16(realToScreenTransform, realCenter);
|
|
1386
|
+
return {
|
|
1387
|
+
type: "element",
|
|
1388
|
+
name: "text",
|
|
1389
|
+
value: "",
|
|
1390
|
+
attributes: {
|
|
1391
|
+
x: screenCenter.x.toString(),
|
|
1392
|
+
y: screenCenter.y.toString(),
|
|
1393
|
+
fill: "red",
|
|
1394
|
+
"text-anchor": "middle",
|
|
1395
|
+
"dominant-baseline": "middle",
|
|
1396
|
+
"font-family": "sans-serif",
|
|
1397
|
+
"font-size": `${getSchScreenFontSize(realToScreenTransform, "error")}px`
|
|
1398
|
+
},
|
|
1399
|
+
children: [
|
|
1400
|
+
{
|
|
1401
|
+
type: "text",
|
|
1402
|
+
value: text,
|
|
1403
|
+
name: "",
|
|
1404
|
+
attributes: {},
|
|
1405
|
+
children: []
|
|
1406
|
+
}
|
|
1407
|
+
]
|
|
1408
|
+
};
|
|
1409
|
+
};
|
|
1410
|
+
|
|
1378
1411
|
// lib/sch/svg-object-fns/create-svg-objects-from-sch-component-with-symbol.ts
|
|
1379
1412
|
var ninePointAnchorToTextAnchor = {
|
|
1380
1413
|
top_left: "start",
|
|
@@ -1405,7 +1438,15 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1405
1438
|
}) => {
|
|
1406
1439
|
const svgObjects = [];
|
|
1407
1440
|
const symbol = symbols[schComponent.symbol_name];
|
|
1408
|
-
if (!symbol)
|
|
1441
|
+
if (!symbol) {
|
|
1442
|
+
return [
|
|
1443
|
+
createSvgSchErrorText({
|
|
1444
|
+
text: `Symbol not found: ${schComponent.symbol_name}`,
|
|
1445
|
+
realCenter: schComponent.center,
|
|
1446
|
+
realToScreenTransform
|
|
1447
|
+
})
|
|
1448
|
+
];
|
|
1449
|
+
}
|
|
1409
1450
|
const schPorts = su(circuitJson).schematic_port.list({
|
|
1410
1451
|
schematic_component_id: schComponent.schematic_component_id
|
|
1411
1452
|
});
|
|
@@ -1417,7 +1458,15 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1417
1458
|
symbol,
|
|
1418
1459
|
schComponent
|
|
1419
1460
|
});
|
|
1420
|
-
if (!schPortsWithSymbolPorts[0])
|
|
1461
|
+
if (!schPortsWithSymbolPorts[0]) {
|
|
1462
|
+
return [
|
|
1463
|
+
createSvgSchErrorText({
|
|
1464
|
+
text: `Could not match ports for symbol ${schComponent.symbol_name}`,
|
|
1465
|
+
realCenter: schComponent.center,
|
|
1466
|
+
realToScreenTransform
|
|
1467
|
+
})
|
|
1468
|
+
];
|
|
1469
|
+
}
|
|
1421
1470
|
const transformFromSymbolToReal = pointPairsToMatrix(
|
|
1422
1471
|
schPortsWithSymbolPorts[1]?.symbolPort ?? symbol.center,
|
|
1423
1472
|
schPortsWithSymbolPorts[1]?.schPort.center ?? schComponent.center,
|
|
@@ -1435,7 +1484,7 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1435
1484
|
name: "path",
|
|
1436
1485
|
attributes: {
|
|
1437
1486
|
d: points.map((p, i) => {
|
|
1438
|
-
const [x, y] =
|
|
1487
|
+
const [x, y] = applyToPoint17(
|
|
1439
1488
|
compose5(realToScreenTransform, transformFromSymbolToReal),
|
|
1440
1489
|
[p.x, p.y]
|
|
1441
1490
|
);
|
|
@@ -1450,7 +1499,7 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1450
1499
|
});
|
|
1451
1500
|
}
|
|
1452
1501
|
for (const text of texts) {
|
|
1453
|
-
const screenTextPos =
|
|
1502
|
+
const screenTextPos = applyToPoint17(
|
|
1454
1503
|
compose5(realToScreenTransform, transformFromSymbolToReal),
|
|
1455
1504
|
text
|
|
1456
1505
|
);
|
|
@@ -1484,7 +1533,7 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1484
1533
|
});
|
|
1485
1534
|
}
|
|
1486
1535
|
for (const box of boxes) {
|
|
1487
|
-
const screenBoxPos =
|
|
1536
|
+
const screenBoxPos = applyToPoint17(
|
|
1488
1537
|
compose5(realToScreenTransform, transformFromSymbolToReal),
|
|
1489
1538
|
box
|
|
1490
1539
|
);
|
|
@@ -1507,7 +1556,7 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1507
1556
|
});
|
|
1508
1557
|
}
|
|
1509
1558
|
for (const port of symbol.ports) {
|
|
1510
|
-
const screenPortPos =
|
|
1559
|
+
const screenPortPos = applyToPoint17(
|
|
1511
1560
|
compose5(realToScreenTransform, transformFromSymbolToReal),
|
|
1512
1561
|
port
|
|
1513
1562
|
);
|
|
@@ -1532,14 +1581,14 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1532
1581
|
import { su as su4 } from "@tscircuit/soup-util";
|
|
1533
1582
|
import "schematic-symbols";
|
|
1534
1583
|
import "svgson";
|
|
1535
|
-
import { applyToPoint as
|
|
1584
|
+
import { applyToPoint as applyToPoint22 } from "transformation-matrix";
|
|
1536
1585
|
|
|
1537
1586
|
// lib/sch/svg-object-fns/create-svg-objects-from-sch-port-on-box.ts
|
|
1538
1587
|
import "transformation-matrix";
|
|
1539
1588
|
import "@tscircuit/soup-util";
|
|
1540
1589
|
|
|
1541
1590
|
// lib/sch/svg-object-fns/create-svg-objects-for-sch-port-box-line.ts
|
|
1542
|
-
import { applyToPoint as
|
|
1591
|
+
import { applyToPoint as applyToPoint18 } from "transformation-matrix";
|
|
1543
1592
|
import { su as su2 } from "@tscircuit/soup-util";
|
|
1544
1593
|
var PIN_CIRCLE_RADIUS_MM = 0.02;
|
|
1545
1594
|
var createSvgObjectsForSchPortBoxLine = ({
|
|
@@ -1569,8 +1618,8 @@ var createSvgObjectsForSchPortBoxLine = ({
|
|
|
1569
1618
|
realEdgePos.y += realPinLineLength;
|
|
1570
1619
|
break;
|
|
1571
1620
|
}
|
|
1572
|
-
const screenSchPortPos =
|
|
1573
|
-
const screenRealEdgePos =
|
|
1621
|
+
const screenSchPortPos = applyToPoint18(transform, schPort.center);
|
|
1622
|
+
const screenRealEdgePos = applyToPoint18(transform, realEdgePos);
|
|
1574
1623
|
const realLineEnd = { ...schPort.center };
|
|
1575
1624
|
switch (schPort.side_of_component) {
|
|
1576
1625
|
case "left":
|
|
@@ -1586,7 +1635,7 @@ var createSvgObjectsForSchPortBoxLine = ({
|
|
|
1586
1635
|
realLineEnd.y += PIN_CIRCLE_RADIUS_MM;
|
|
1587
1636
|
break;
|
|
1588
1637
|
}
|
|
1589
|
-
const screenLineEnd =
|
|
1638
|
+
const screenLineEnd = applyToPoint18(transform, realLineEnd);
|
|
1590
1639
|
svgObjects.push({
|
|
1591
1640
|
name: "line",
|
|
1592
1641
|
type: "element",
|
|
@@ -1633,13 +1682,10 @@ var getUnitVectorFromOutsideToEdge = (side) => {
|
|
|
1633
1682
|
};
|
|
1634
1683
|
|
|
1635
1684
|
// lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-number-text.ts
|
|
1636
|
-
import { applyToPoint as
|
|
1685
|
+
import { applyToPoint as applyToPoint19 } from "transformation-matrix";
|
|
1637
1686
|
var createSvgObjectsForSchPortPinNumberText = (params) => {
|
|
1638
1687
|
const svgObjects = [];
|
|
1639
1688
|
const { schPort, schComponent, transform, circuitJson } = params;
|
|
1640
|
-
const sourcePort = circuitJson.find(
|
|
1641
|
-
(element) => element.type === "source_port" && element.source_port_id === schPort.source_port_id
|
|
1642
|
-
);
|
|
1643
1689
|
const realPinNumberPos = {
|
|
1644
1690
|
x: schPort.center.x,
|
|
1645
1691
|
y: schPort.center.y
|
|
@@ -1649,13 +1695,12 @@ var createSvgObjectsForSchPortPinNumberText = (params) => {
|
|
|
1649
1695
|
const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4;
|
|
1650
1696
|
realPinNumberPos.x += vecToEdge.x * realPinEdgeDistance / 2;
|
|
1651
1697
|
realPinNumberPos.y += vecToEdge.y * realPinEdgeDistance / 2;
|
|
1652
|
-
const screenPinNumberTextPos =
|
|
1698
|
+
const screenPinNumberTextPos = applyToPoint19(transform, realPinNumberPos);
|
|
1653
1699
|
if (schPort.side_of_component === "top" || schPort.side_of_component === "bottom") {
|
|
1654
1700
|
screenPinNumberTextPos.x -= 2;
|
|
1655
1701
|
} else {
|
|
1656
1702
|
screenPinNumberTextPos.y -= 2;
|
|
1657
1703
|
}
|
|
1658
|
-
const pinLabel = sourcePort.name.replace("pin", "");
|
|
1659
1704
|
svgObjects.push({
|
|
1660
1705
|
name: "text",
|
|
1661
1706
|
type: "element",
|
|
@@ -1673,7 +1718,7 @@ var createSvgObjectsForSchPortPinNumberText = (params) => {
|
|
|
1673
1718
|
children: [
|
|
1674
1719
|
{
|
|
1675
1720
|
type: "text",
|
|
1676
|
-
value:
|
|
1721
|
+
value: schPort.pin_number?.toString() || "",
|
|
1677
1722
|
name: "",
|
|
1678
1723
|
attributes: {},
|
|
1679
1724
|
children: []
|
|
@@ -1685,7 +1730,7 @@ var createSvgObjectsForSchPortPinNumberText = (params) => {
|
|
|
1685
1730
|
};
|
|
1686
1731
|
|
|
1687
1732
|
// lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-label.ts
|
|
1688
|
-
import { applyToPoint as
|
|
1733
|
+
import { applyToPoint as applyToPoint20 } from "transformation-matrix";
|
|
1689
1734
|
var LABEL_DIST_FROM_EDGE_MM = 0.1;
|
|
1690
1735
|
var createSvgObjectsForSchPortPinLabel = (params) => {
|
|
1691
1736
|
const svgObjects = [];
|
|
@@ -1699,7 +1744,7 @@ var createSvgObjectsForSchPortPinLabel = (params) => {
|
|
|
1699
1744
|
const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4;
|
|
1700
1745
|
realPinNumberPos.x += vecToEdge.x * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM);
|
|
1701
1746
|
realPinNumberPos.y += vecToEdge.y * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM);
|
|
1702
|
-
const screenPinNumberTextPos =
|
|
1747
|
+
const screenPinNumberTextPos = applyToPoint20(transform, realPinNumberPos);
|
|
1703
1748
|
const label = schPort.display_pin_label ?? schComponent.port_labels?.[`pin${schPort.pin_number}`];
|
|
1704
1749
|
if (!label) return [];
|
|
1705
1750
|
svgObjects.push({
|
|
@@ -1750,11 +1795,11 @@ var createSvgObjectsFromSchematicComponentWithBox = ({
|
|
|
1750
1795
|
schComponent.source_component_id
|
|
1751
1796
|
);
|
|
1752
1797
|
const svgObjects = [];
|
|
1753
|
-
const componentScreenTopLeft =
|
|
1798
|
+
const componentScreenTopLeft = applyToPoint22(transform, {
|
|
1754
1799
|
x: schComponent.center.x - schComponent.size.width / 2,
|
|
1755
1800
|
y: schComponent.center.y + schComponent.size.height / 2
|
|
1756
1801
|
});
|
|
1757
|
-
const componentScreenBottomRight =
|
|
1802
|
+
const componentScreenBottomRight = applyToPoint22(transform, {
|
|
1758
1803
|
x: schComponent.center.x + schComponent.size.width / 2,
|
|
1759
1804
|
y: schComponent.center.y - schComponent.size.height / 2
|
|
1760
1805
|
});
|
|
@@ -1774,7 +1819,7 @@ var createSvgObjectsFromSchematicComponentWithBox = ({
|
|
|
1774
1819
|
},
|
|
1775
1820
|
children: []
|
|
1776
1821
|
});
|
|
1777
|
-
const screenManufacturerNumberPos =
|
|
1822
|
+
const screenManufacturerNumberPos = applyToPoint22(transform, {
|
|
1778
1823
|
x: schComponent.center.x + schComponent.size.width / 2,
|
|
1779
1824
|
y: schComponent.center.y + schComponent.size.height / 2 + 0.5
|
|
1780
1825
|
// Above the component top edge
|
|
@@ -1858,14 +1903,14 @@ function createSvgObjectsFromSchematicComponent(params) {
|
|
|
1858
1903
|
}
|
|
1859
1904
|
|
|
1860
1905
|
// lib/sch/svg-object-fns/create-svg-objects-from-sch-debug-object.ts
|
|
1861
|
-
import { applyToPoint as
|
|
1906
|
+
import { applyToPoint as applyToPoint23 } from "transformation-matrix";
|
|
1862
1907
|
function createSvgObjectsFromSchDebugObject(debugObject, transform) {
|
|
1863
1908
|
if (debugObject.shape === "rect") {
|
|
1864
|
-
let [screenLeft, screenTop] =
|
|
1909
|
+
let [screenLeft, screenTop] = applyToPoint23(transform, [
|
|
1865
1910
|
debugObject.center.x - debugObject.size.width / 2,
|
|
1866
1911
|
debugObject.center.y - debugObject.size.height / 2
|
|
1867
1912
|
]);
|
|
1868
|
-
let [screenRight, screenBottom] =
|
|
1913
|
+
let [screenRight, screenBottom] = applyToPoint23(transform, [
|
|
1869
1914
|
debugObject.center.x + debugObject.size.width / 2,
|
|
1870
1915
|
debugObject.center.y + debugObject.size.height / 2
|
|
1871
1916
|
]);
|
|
@@ -1875,7 +1920,7 @@ function createSvgObjectsFromSchDebugObject(debugObject, transform) {
|
|
|
1875
1920
|
];
|
|
1876
1921
|
const width = Math.abs(screenRight - screenLeft);
|
|
1877
1922
|
const height = Math.abs(screenBottom - screenTop);
|
|
1878
|
-
const [screenCenterX, screenCenterY] =
|
|
1923
|
+
const [screenCenterX, screenCenterY] = applyToPoint23(transform, [
|
|
1879
1924
|
debugObject.center.x,
|
|
1880
1925
|
debugObject.center.y
|
|
1881
1926
|
]);
|
|
@@ -1921,11 +1966,11 @@ function createSvgObjectsFromSchDebugObject(debugObject, transform) {
|
|
|
1921
1966
|
];
|
|
1922
1967
|
}
|
|
1923
1968
|
if (debugObject.shape === "line") {
|
|
1924
|
-
const [screenStartX, screenStartY] =
|
|
1969
|
+
const [screenStartX, screenStartY] = applyToPoint23(transform, [
|
|
1925
1970
|
debugObject.start.x,
|
|
1926
1971
|
debugObject.start.y
|
|
1927
1972
|
]);
|
|
1928
|
-
const [screenEndX, screenEndY] =
|
|
1973
|
+
const [screenEndX, screenEndY] = applyToPoint23(transform, [
|
|
1929
1974
|
debugObject.end.x,
|
|
1930
1975
|
debugObject.end.y
|
|
1931
1976
|
]);
|
|
@@ -1975,7 +2020,7 @@ function createSvgObjectsFromSchDebugObject(debugObject, transform) {
|
|
|
1975
2020
|
}
|
|
1976
2021
|
|
|
1977
2022
|
// lib/sch/svg-object-fns/create-svg-objects-from-sch-trace.ts
|
|
1978
|
-
import { applyToPoint as
|
|
2023
|
+
import { applyToPoint as applyToPoint24 } from "transformation-matrix";
|
|
1979
2024
|
function createSchematicTrace(trace, transform) {
|
|
1980
2025
|
const edges = trace.edges;
|
|
1981
2026
|
if (edges.length === 0) return [];
|
|
@@ -1984,11 +2029,11 @@ function createSchematicTrace(trace, transform) {
|
|
|
1984
2029
|
for (let edgeIndex = 0; edgeIndex < edges.length; edgeIndex++) {
|
|
1985
2030
|
const edge = edges[edgeIndex];
|
|
1986
2031
|
if (edge.is_crossing) continue;
|
|
1987
|
-
const [screenFromX, screenFromY] =
|
|
2032
|
+
const [screenFromX, screenFromY] = applyToPoint24(transform, [
|
|
1988
2033
|
edge.from.x,
|
|
1989
2034
|
edge.from.y
|
|
1990
2035
|
]);
|
|
1991
|
-
const [screenToX, screenToY] =
|
|
2036
|
+
const [screenToX, screenToY] = applyToPoint24(transform, [
|
|
1992
2037
|
edge.to.x,
|
|
1993
2038
|
edge.to.y
|
|
1994
2039
|
]);
|
|
@@ -2000,11 +2045,11 @@ function createSchematicTrace(trace, transform) {
|
|
|
2000
2045
|
}
|
|
2001
2046
|
for (const edge of edges) {
|
|
2002
2047
|
if (!edge.is_crossing) continue;
|
|
2003
|
-
const [screenFromX, screenFromY] =
|
|
2048
|
+
const [screenFromX, screenFromY] = applyToPoint24(transform, [
|
|
2004
2049
|
edge.from.x,
|
|
2005
2050
|
edge.from.y
|
|
2006
2051
|
]);
|
|
2007
|
-
const [screenToX, screenToY] =
|
|
2052
|
+
const [screenToX, screenToY] = applyToPoint24(transform, [
|
|
2008
2053
|
edge.to.x,
|
|
2009
2054
|
edge.to.y
|
|
2010
2055
|
]);
|
|
@@ -2063,7 +2108,7 @@ function createSchematicTrace(trace, transform) {
|
|
|
2063
2108
|
}
|
|
2064
2109
|
if (trace.junctions) {
|
|
2065
2110
|
for (const junction of trace.junctions) {
|
|
2066
|
-
const [screenX, screenY] =
|
|
2111
|
+
const [screenX, screenY] = applyToPoint24(transform, [
|
|
2067
2112
|
junction.x,
|
|
2068
2113
|
junction.y
|
|
2069
2114
|
]);
|
|
@@ -2086,7 +2131,7 @@ function createSchematicTrace(trace, transform) {
|
|
|
2086
2131
|
|
|
2087
2132
|
// lib/sch/svg-object-fns/create-svg-objects-for-sch-net-label.ts
|
|
2088
2133
|
import {
|
|
2089
|
-
applyToPoint as
|
|
2134
|
+
applyToPoint as applyToPoint25,
|
|
2090
2135
|
compose as compose6,
|
|
2091
2136
|
rotate as rotate3,
|
|
2092
2137
|
scale as scale3,
|
|
@@ -2882,14 +2927,14 @@ var createSvgObjectsForSchNetLabel = (schNetLabel, realToScreenTransform) => {
|
|
|
2882
2927
|
const fontSizePx = getSchScreenFontSize(realToScreenTransform, "net_label");
|
|
2883
2928
|
const fontSizeMm = getSchMmFontSize("net_label");
|
|
2884
2929
|
const textWidthFSR = estimateTextWidth(schNetLabel.text || "");
|
|
2885
|
-
const screenCenter =
|
|
2930
|
+
const screenCenter = applyToPoint25(realToScreenTransform, schNetLabel.center);
|
|
2886
2931
|
const realTextGrowthVec = getUnitVectorFromOutsideToEdge(
|
|
2887
2932
|
schNetLabel.anchor_side
|
|
2888
2933
|
);
|
|
2889
2934
|
const screenTextGrowthVec = { ...realTextGrowthVec };
|
|
2890
2935
|
screenTextGrowthVec.y *= -1;
|
|
2891
2936
|
const fullWidthFsr = textWidthFSR + ARROW_POINT_WIDTH_FSR * 2 + END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length + END_PADDING_FSR;
|
|
2892
|
-
const screenAnchorPosition = schNetLabel.anchor_position ?
|
|
2937
|
+
const screenAnchorPosition = schNetLabel.anchor_position ? applyToPoint25(realToScreenTransform, schNetLabel.anchor_position) : {
|
|
2893
2938
|
x: screenCenter.x - screenTextGrowthVec.x * fullWidthFsr * fontSizePx / 2,
|
|
2894
2939
|
y: screenCenter.y - screenTextGrowthVec.y * fullWidthFsr * fontSizePx / 2
|
|
2895
2940
|
};
|
|
@@ -2930,7 +2975,7 @@ var createSvgObjectsForSchNetLabel = (schNetLabel, realToScreenTransform) => {
|
|
|
2930
2975
|
y: -0.6
|
|
2931
2976
|
}
|
|
2932
2977
|
].map(
|
|
2933
|
-
(fontRelativePoint) =>
|
|
2978
|
+
(fontRelativePoint) => applyToPoint25(
|
|
2934
2979
|
compose6(
|
|
2935
2980
|
realToScreenTransform,
|
|
2936
2981
|
translate6(realAnchorPosition.x, realAnchorPosition.y),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/pcb/convert-circuit-json-to-pcb-svg.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-trace-error.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-plated-hole.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-text.ts","../lib/utils/pairs.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-trace.ts","../lib/pcb/layer-name-to-color.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-smt-pads.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-board.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-via.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-hole.ts","../lib/pcb/colors.ts","../lib/utils/colors.ts","../lib/sch/convert-circuit-json-to-schematic-svg.ts","../lib/sch/draw-schematic-grid.ts","../lib/sch/draw-schematic-labeled-points.ts","../lib/sch/get-schematic-bounds-from-circuit-json.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component-with-symbol.ts","../lib/utils/get-sch-stroke-size.ts","../lib/utils/match-sch-ports-with-symbol-ports.ts","../lib/utils/point-pairs-to-matrix.ts","../lib/utils/get-sch-font-size.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component-with-box.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-port-on-box.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-box-line.ts","../lib/utils/get-unit-vector-from-outside-to-edge.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-number-text.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-label.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-debug-object.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-trace.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-net-label.ts","../lib/sch/arial-text-metrics.ts","../lib/sch/estimate-text-width.ts"],"sourcesContent":["import type { Point, AnyCircuitElement } from \"circuit-json\"\nimport { type INode as SvgObject, stringify } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n scale,\n translate,\n} from \"transformation-matrix\"\nimport { createSvgObjectsFromPcbTraceError } from \"./svg-object-fns/create-svg-objects-from-pcb-trace-error\"\nimport { createSvgObjectsFromPcbFabricationNotePath } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path\"\nimport { createSvgObjectsFromPcbFabricationNoteText } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text\"\nimport { createSvgObjectsFromPcbPlatedHole } from \"./svg-object-fns/create-svg-objects-from-pcb-plated-hole\"\nimport { createSvgObjectsFromPcbSilkscreenPath } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-path\"\nimport { createSvgObjectsFromPcbSilkscreenText } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-text\"\nimport { createSvgObjectsFromPcbTrace } from \"./svg-object-fns/create-svg-objects-from-pcb-trace\"\nimport { createSvgObjectsFromSmtPad } from \"./svg-object-fns/create-svg-objects-from-smt-pads\"\nimport { createSvgObjectsFromPcbBoard } from \"./svg-object-fns/create-svg-objects-from-pcb-board\"\nimport { createSvgObjectsFromPcbVia } from \"./svg-object-fns/create-svg-objects-from-pcb-via\"\nimport { createSvgObjectsFromPcbHole } from \"./svg-object-fns/create-svg-objects-from-pcb-hole\"\n\nconst OBJECT_ORDER: AnyCircuitElement[\"type\"][] = [\n \"pcb_trace_error\",\n \"pcb_plated_hole\",\n \"pcb_fabrication_note_text\",\n \"pcb_fabrication_note_path\",\n \"pcb_silkscreen_text\",\n \"pcb_silkscreen_path\",\n \"pcb_via\",\n \"pcb_trace\",\n \"pcb_smtpad\",\n \"pcb_component\",\n \"pcb_board\",\n]\n\ninterface PointObjectNotation {\n x: number\n y: number\n}\n\ninterface Options {\n width?: number\n height?: number\n shouldDrawErrors?: boolean\n}\n\nexport function convertCircuitJsonToPcbSvg(\n soup: AnyCircuitElement[],\n options?: Options,\n): string {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n // Process all elements to determine bounds\n for (const item of soup) {\n if (item.type === \"pcb_board\") {\n if (\n item.outline &&\n Array.isArray(item.outline) &&\n item.outline.length >= 3\n )\n updateBoundsToIncludeOutline(item.outline)\n else if (\"center\" in item && \"width\" in item && \"height\" in item)\n updateBounds(item.center, item.width, item.height)\n } else if (\"x\" in item && \"y\" in item) {\n updateBounds({ x: item.x, y: item.y }, 0, 0)\n } else if (\"route\" in item) {\n updateTraceBounds(item.route)\n }\n }\n\n const padding = 1 // Reduced padding for tighter boundary\n const circuitWidth = maxX - minX + 2 * padding\n const circuitHeight = maxY - minY + 2 * padding\n\n const svgWidth = options?.width ?? 800\n const svgHeight = options?.height ?? 600\n const paths: PointObjectNotation[][] = []\n for (const item of soup) {\n if (\"route\" in item && item.route !== undefined) {\n paths.push(item.route as PointObjectNotation[])\n }\n }\n\n // Calculate scale factor to fit the circuit within the SVG, maintaining aspect ratio\n const scaleX = svgWidth / circuitWidth\n const scaleY = svgHeight / circuitHeight\n const scaleFactor = Math.min(scaleX, scaleY)\n\n // Calculate centering offsets\n const offsetX = (svgWidth - circuitWidth * scaleFactor) / 2\n const offsetY = (svgHeight - circuitHeight * scaleFactor) / 2\n\n const transform = compose(\n translate(\n offsetX - minX * scaleFactor + padding * scaleFactor,\n svgHeight - offsetY + minY * scaleFactor - padding * scaleFactor,\n ),\n scale(scaleFactor, -scaleFactor), // Flip in y-direction\n )\n\n const svgObjects = soup\n .sort(\n (a, b) =>\n (OBJECT_ORDER.indexOf(b.type) ?? 9999) -\n (OBJECT_ORDER.indexOf(a.type) ?? 9999),\n )\n .flatMap((item) =>\n createSvgObjects(item, transform, soup, options?.shouldDrawErrors),\n )\n\n let strokeWidth = String(0.05 * scaleFactor)\n\n for (const element of soup) {\n if (\"stroke_width\" in element) {\n strokeWidth = String(scaleFactor * element.stroke_width)\n break\n }\n }\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n value: \"\",\n children: [\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n value: `\n .boundary { fill: #000; }\n .pcb-board { fill: none; }\n .pcb-trace { fill: none; }\n .pcb-hole-outer { fill: rgb(200, 52, 52); }\n .pcb-hole-inner { fill: rgb(255, 38, 226); }\n .pcb-pad { }\n .pcb-boundary { fill: none; stroke: #fff; stroke-width: 0.3; }\n .pcb-silkscreen { fill: none; }\n .pcb-silkscreen-top { stroke: #f2eda1; }\n .pcb-silkscreen-bottom { stroke: #f2eda1; }\n .pcb-silkscreen-text { fill: #f2eda1; }\n `,\n },\n ],\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n },\n createSvgObjectFromPcbBoundary(transform, minX, minY, maxX, maxY),\n ...svgObjects,\n ].filter((child): child is SvgObject => child !== null),\n }\n\n try {\n return stringify(svgObject as SvgObject)\n } catch (error) {\n console.error(\"Error stringifying SVG object:\", error)\n throw error\n }\n\n function updateBounds(center: any, width: any, height: any) {\n const halfWidth = width / 2\n const halfHeight = height / 2\n minX = Math.min(minX, center.x - halfWidth)\n minY = Math.min(minY, center.y - halfHeight)\n maxX = Math.max(maxX, center.x + halfWidth)\n maxY = Math.max(maxY, center.y + halfHeight)\n }\n\n function updateBoundsToIncludeOutline(outline: Point[]) {\n for (const point of outline) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n\n function updateTraceBounds(route: any[]) {\n for (const point of route) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n}\n\nfunction createSvgObjects(\n elm: AnyCircuitElement,\n transform: Matrix,\n soup: AnyCircuitElement[],\n shouldDrawErrors?: boolean,\n): SvgObject[] {\n switch (elm.type) {\n case \"pcb_trace_error\":\n return createSvgObjectsFromPcbTraceError(\n elm,\n transform,\n soup,\n shouldDrawErrors,\n ).filter(Boolean)\n case \"pcb_component\":\n return [createSvgObjectsFromPcbComponent(elm, transform)].filter(Boolean)\n case \"pcb_trace\":\n return createSvgObjectsFromPcbTrace(elm, transform)\n case \"pcb_plated_hole\":\n return createSvgObjectsFromPcbPlatedHole(elm, transform).filter(Boolean)\n case \"pcb_hole\":\n return createSvgObjectsFromPcbHole(elm, transform)\n case \"pcb_smtpad\":\n return createSvgObjectsFromSmtPad(elm, transform)\n case \"pcb_silkscreen_text\":\n return createSvgObjectsFromPcbSilkscreenText(elm, transform)\n case \"pcb_fabrication_note_path\":\n return createSvgObjectsFromPcbFabricationNotePath(elm, transform)\n case \"pcb_fabrication_note_text\":\n return createSvgObjectsFromPcbFabricationNoteText(elm, transform)\n case \"pcb_silkscreen_path\":\n return createSvgObjectsFromPcbSilkscreenPath(elm, transform)\n case \"pcb_board\":\n return createSvgObjectsFromPcbBoard(elm, transform)\n case \"pcb_via\":\n return createSvgObjectsFromPcbVia(elm, transform)\n default:\n return []\n }\n}\n\nfunction createSvgObjectsFromPcbComponent(component: any, transform: any): any {\n const { center, width, height, rotation = 0 } = component\n const [x, y] = applyToPoint(transform, [center.x, center.y])\n const scaledWidth = width * Math.abs(transform.a)\n const scaledHeight = height * Math.abs(transform.d)\n const transformStr = `translate(${x}, ${y}) rotate(${-rotation}) scale(1, -1)`\n\n return {\n name: \"g\",\n type: \"element\",\n attributes: { transform: transformStr },\n children: [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component-outline\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n ],\n }\n}\n\nfunction createSvgObjectFromPcbBoundary(\n transform: any,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n): SvgObject {\n const [x1, y1] = applyToPoint(transform, [minX, minY])\n const [x2, y2] = applyToPoint(transform, [maxX, maxY])\n const width = Math.abs(x2 - x1)\n const height = Math.abs(y2 - y1)\n const x = Math.min(x1, x2)\n const y = Math.min(y1, y2)\n return {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-boundary\",\n x: x.toString(),\n y: y.toString(),\n width: width.toString(),\n height: height.toString(),\n },\n }\n}\n\n/**\n * @deprecated use `convertCircuitJsonToPcbSvg` instead\n */\nexport const circuitJsonToPcbSvg = convertCircuitJsonToPcbSvg\n","import type { PcbTraceError, PcbPort, AnyCircuitElement } from \"circuit-json\"\nimport type { SvgObject } from \"../../../lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbTraceError(\n pcbTraceError: PcbTraceError,\n transform: Matrix,\n circuitJson: AnyCircuitElement[],\n shouldDrawErrors?: boolean,\n): SvgObject[] {\n if (!shouldDrawErrors) return []\n const { pcb_port_ids } = pcbTraceError\n\n const port1 = circuitJson.find(\n (el): el is PcbPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[0],\n )\n const port2 = circuitJson.find(\n (el): el is PcbPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[1],\n )\n\n if (!port1 || !port2) return []\n\n const screenPort1 = applyToPoint(transform, {\n x: port1.x,\n y: port1.y,\n })\n const screenPort2 = applyToPoint(transform, {\n x: port2.x,\n y: port2.y,\n })\n\n const errorCenter = {\n x: (screenPort1.x + screenPort2.x) / 2,\n y: (screenPort1.y + screenPort2.y) / 2,\n }\n\n if (\n isNaN(screenPort1.x) ||\n isNaN(screenPort1.y) ||\n isNaN(screenPort2.x) ||\n isNaN(screenPort2.y) ||\n isNaN(errorCenter.x) ||\n isNaN(errorCenter.y)\n ) {\n return []\n }\n\n const svgObjects: SvgObject[] = [\n {\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: screenPort1.x.toString(),\n y1: screenPort1.y.toString(),\n x2: errorCenter.x.toString(),\n y2: errorCenter.y.toString(),\n stroke: \"red\",\n \"stroke-width\": \"1.5\",\n \"stroke-dasharray\": \"2,2\",\n },\n children: [],\n value: \"\",\n },\n {\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: errorCenter.x.toString(),\n y1: errorCenter.y.toString(),\n x2: screenPort2.x.toString(),\n y2: screenPort2.y.toString(),\n stroke: \"red\",\n \"stroke-width\": \"1.5\",\n \"stroke-dasharray\": \"2,2\",\n },\n children: [],\n value: \"\",\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n x: (errorCenter.x - 5).toString(),\n y: (errorCenter.y - 5).toString(),\n width: \"10\",\n height: \"10\",\n fill: \"red\",\n transform: `rotate(45 ${errorCenter.x} ${errorCenter.y})`,\n },\n children: [],\n value: \"\",\n },\n {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: errorCenter.x.toString(),\n y: (errorCenter.y - 15).toString(),\n fill: \"red\",\n \"font-family\": \"sans-serif\",\n \"font-size\": \"12\",\n \"text-anchor\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: pcbTraceError.message || \"Pcb Trace Error\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n },\n ]\n\n return svgObjects\n}\n","import type { PcbSilkscreenPath, PcbFabricationNotePath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbFabricationNotePath(\n fabNotePath: PcbFabricationNotePath,\n transform: Matrix,\n): SvgObject[] {\n if (!fabNotePath.route || !Array.isArray(fabNotePath.route)) return []\n\n // Close the path if the first and last points are the same\n const firstPoint = fabNotePath.route[0]\n const lastPoint = fabNotePath.route[fabNotePath.route.length - 1]\n const isClosed =\n firstPoint!.x === lastPoint!.x && firstPoint!.y === lastPoint!.y\n\n const path =\n fabNotePath.route\n .slice(0, isClosed ? -1 : undefined)\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \") + (isClosed ? \" Z\" : \"\")\n\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-fabrication-note-path\",\n stroke: fabNotePath.color || \"rgba(255,255,255,0.5)\",\n fill: \"none\",\n d: path,\n \"stroke-width\": (\n fabNotePath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": fabNotePath.pcb_component_id,\n \"data-pcb-fabrication-note-path-id\":\n fabNotePath.pcb_fabrication_note_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbFabricationNoteText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { toString as matrixToString } from \"transformation-matrix\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbFabricationNoteText(\n pcbFabNoteText: PcbFabricationNoteText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n anchor_alignment,\n text,\n font_size = 1,\n layer = \"top\",\n color,\n } = pcbFabNoteText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY), // TODO do anchor_alignment\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: \"pcb-fabrication-note-text\",\n fill: color || \"rgba(255,255,255,0.5)\",\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","import type { PCBPlatedHole } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbPlatedHole(\n hole: PCBPlatedHole,\n transform: any,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.shape === \"pill\") {\n const scaledOuterWidth = hole.outer_width * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_height * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_height * Math.abs(transform.a)\n\n const outerRadiusX = scaledOuterWidth / 2\n const outerRadiusY = scaledOuterHeight / 2\n const innerRadiusX = scaledHoleWidth / 2\n const innerRadiusY = scaledHoleHeight / 2\n const straightLength = scaledOuterHeight - scaledOuterWidth\n\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n // Outer pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n d:\n `M${x - outerRadiusX},${y - straightLength / 2} ` +\n `v${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 ${scaledOuterWidth},0 ` +\n `v-${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 -${scaledOuterWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n // Inner pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n d:\n `M${x - innerRadiusX},${y - (scaledHoleHeight - scaledHoleWidth) / 2} ` +\n `v${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 ${scaledHoleWidth},0 ` +\n `v-${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 -${scaledHoleWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n // Fallback to circular hole if not pill-shaped\n if (hole.shape === \"circle\") {\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n return []\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbSilkscreenPath(\n silkscreenPath: PcbSilkscreenPath,\n transform: Matrix,\n): SvgObject[] {\n if (!silkscreenPath.route || !Array.isArray(silkscreenPath.route)) return []\n\n let path = silkscreenPath.route\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n\n // Close the path if the first and last points match\n const firstPoint = silkscreenPath.route[0]\n const lastPoint = silkscreenPath.route[silkscreenPath.route.length - 1]\n if (\n firstPoint &&\n lastPoint &&\n firstPoint.x === lastPoint.x &&\n firstPoint.y === lastPoint.y\n ) {\n path += \" Z\"\n }\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: `pcb-silkscreen pcb-silkscreen-${silkscreenPath.layer}`,\n d: path,\n \"stroke-width\": (\n silkscreenPath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": silkscreenPath.pcb_component_id,\n \"data-pcb-silkscreen-path-id\": silkscreenPath.pcb_silkscreen_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n toString as matrixToString,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbSilkscreenText(\n pcbSilkscreenText: PcbSilkscreenText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n text,\n font_size = 1,\n layer = \"top\",\n } = pcbSilkscreenText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY),\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: `pcb-silkscreen-text pcb-silkscreen-${layer}`,\n \"data-pcb-silkscreen-text-id\": pcbSilkscreenText.pcb_component_id,\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","/**\n * Return pairs of adjacent elements in an array.\n */\nexport function pairs<T>(arr: Array<T>): Array<[T, T]> {\n const result: Array<[T, T]> = []\n for (let i = 0; i < arr.length - 1; i++) {\n result.push([arr[i]!, arr[i + 1]!])\n }\n return result\n}\n","import type { PCBTrace } from \"circuit-json\"\nimport { pairs } from \"lib/utils/pairs\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { LAYER_NAME_TO_COLOR } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromPcbTrace(\n trace: PCBTrace,\n transform: Matrix,\n): SvgObject[] {\n if (!trace.route || !Array.isArray(trace.route) || trace.route.length < 2)\n return []\n\n const segments = pairs(trace.route)\n const svgObjects: SvgObject[] = []\n\n for (const [start, end] of segments) {\n const startPoint = applyToPoint(transform, [start.x, start.y])\n const endPoint = applyToPoint(transform, [end.x, end.y])\n\n const layer =\n \"layer\" in start ? start.layer : \"layer\" in end ? end.layer : null\n if (!layer) continue\n\n const layerColor =\n LAYER_NAME_TO_COLOR[layer as keyof typeof LAYER_NAME_TO_COLOR] ?? \"white\"\n\n const traceWidth =\n \"width\" in start ? start.width : \"width\" in end ? end.width : null\n\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-trace\",\n stroke: layerColor,\n d: `M ${startPoint[0]} ${startPoint[1]} L ${endPoint[0]} ${endPoint[1]}`,\n \"stroke-width\": traceWidth\n ? (traceWidth * Math.abs(transform.a)).toString()\n : \"0.3\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"shape-rendering\": \"crispEdges\",\n },\n })\n }\n return svgObjects\n}\n","/**\n * TODO use @tscircuit/pcb-colors when it's published\n */\nexport const LAYER_NAME_TO_COLOR = {\n top: \"rgb(200, 52, 52)\",\n bottom: \"rgb(77, 127, 196)\",\n}\n\nexport function layerNameToColor(layerName: string) {\n return (\n LAYER_NAME_TO_COLOR[layerName as keyof typeof LAYER_NAME_TO_COLOR] ??\n \"white\"\n )\n}\n","import type { PCBSMTPad } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { layerNameToColor } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromSmtPad(\n pad: PCBSMTPad,\n transform: Matrix,\n): any {\n const [x, y] = applyToPoint(transform, [pad.x, pad.y])\n\n if (pad.shape === \"rect\") {\n const width = pad.width * Math.abs(transform.a)\n const height = pad.height * Math.abs(transform.d)\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-pad\",\n fill: layerNameToColor(pad.layer),\n x: (x - width / 2).toString(),\n y: (y - height / 2).toString(),\n width: width.toString(),\n height: height.toString(),\n },\n },\n ]\n }\n // TODO implement smtpad circles/ovals etc.\n return []\n}\n","import type { PCBBoard, Point } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbBoard(\n pcbBoard: PCBBoard,\n transform: Matrix,\n): SvgObject[] {\n const { width, height, center, outline } = pcbBoard\n\n let path: string\n if (outline && Array.isArray(outline) && outline.length >= 3) {\n path = outline\n .map((point: Point, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n } else {\n const halfWidth = width / 2\n const halfHeight = height / 2\n\n const topLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y - halfHeight,\n ])\n const topRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y - halfHeight,\n ])\n const bottomRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y + halfHeight,\n ])\n const bottomLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y + halfHeight,\n ])\n\n path =\n `M ${topLeft[0]} ${topLeft[1]} ` +\n `L ${topRight[0]} ${topRight[1]} ` +\n `L ${bottomRight[0]} ${bottomRight[1]} ` +\n `L ${bottomLeft[0]} ${bottomLeft[1]}`\n }\n\n path += \" Z\"\n\n return [\n {\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-board\",\n d: path,\n stroke: \"rgba(255, 255, 255, 0.5)\",\n \"stroke-width\": (0.1 * Math.abs(transform.a)).toString(),\n },\n },\n ]\n}\n","import type { PCBVia } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbVia(hole: PCBVia, transform: any): any {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n },\n ],\n }\n}\n","import type { PCBHole } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { HOLE_COLOR } from \"../colors\"\n\nexport function createSvgObjectsFromPcbHole(\n hole: PCBHole,\n transform: Matrix,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.hole_shape === \"circle\" || hole.hole_shape === \"square\") {\n const scaledDiameter = hole.hole_diameter * Math.abs(transform.a)\n const radius = scaledDiameter / 2\n\n if (hole.hole_shape === \"circle\") {\n return [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n r: radius.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n // Square hole\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n x: (x - radius).toString(),\n y: (y - radius).toString(),\n width: scaledDiameter.toString(),\n height: scaledDiameter.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n if (hole.hole_shape === \"oval\") {\n const scaledWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHeight = hole.hole_height * Math.abs(transform.a)\n const rx = scaledWidth / 2\n const ry = scaledHeight / 2\n\n return [\n {\n name: \"ellipse\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n rx: rx.toString(),\n ry: ry.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n\n return []\n}\n","export const HOLE_COLOR = \"#FF26E2\"\n","// Kicad-2020 color scheme\nexport const colorMap = {\n \"3d_viewer\": {\n background_bottom: \"rgb(102, 102, 128)\",\n background_top: \"rgb(204, 204, 230)\",\n board: \"rgb(51, 43, 23)\",\n copper: \"rgb(179, 156, 0)\",\n silkscreen_bottom: \"rgb(230, 230, 230)\",\n silkscreen_top: \"rgb(230, 230, 230)\",\n soldermask: \"rgb(20, 51, 36)\",\n solderpaste: \"rgb(128, 128, 128)\",\n },\n board: {\n anchor: \"rgb(255, 38, 226)\",\n aux_items: \"rgb(255, 255, 255)\",\n b_adhes: \"rgb(0, 0, 132)\",\n b_crtyd: \"rgb(255, 38, 226)\",\n b_fab: \"rgb(88, 93, 132)\",\n b_mask: \"rgba(2, 255, 238, 0.400)\",\n b_paste: \"rgb(0, 194, 194)\",\n b_silks: \"rgb(232, 178, 167)\",\n background: \"rgb(0, 16, 35)\",\n cmts_user: \"rgb(89, 148, 220)\",\n copper: {\n b: \"rgb(77, 127, 196)\",\n f: \"rgb(200, 52, 52)\",\n in1: \"rgb(127, 200, 127)\",\n in10: \"rgb(237, 124, 51)\",\n in11: \"rgb(91, 195, 235)\",\n in12: \"rgb(247, 111, 142)\",\n in13: \"rgb(167, 165, 198)\",\n in14: \"rgb(40, 204, 217)\",\n in15: \"rgb(232, 178, 167)\",\n in16: \"rgb(242, 237, 161)\",\n in17: \"rgb(237, 124, 51)\",\n in18: \"rgb(91, 195, 235)\",\n in19: \"rgb(247, 111, 142)\",\n in2: \"rgb(206, 125, 44)\",\n in20: \"rgb(167, 165, 198)\",\n in21: \"rgb(40, 204, 217)\",\n in22: \"rgb(232, 178, 167)\",\n in23: \"rgb(242, 237, 161)\",\n in24: \"rgb(237, 124, 51)\",\n in25: \"rgb(91, 195, 235)\",\n in26: \"rgb(247, 111, 142)\",\n in27: \"rgb(167, 165, 198)\",\n in28: \"rgb(40, 204, 217)\",\n in29: \"rgb(232, 178, 167)\",\n in3: \"rgb(79, 203, 203)\",\n in30: \"rgb(242, 237, 161)\",\n in4: \"rgb(219, 98, 139)\",\n in5: \"rgb(167, 165, 198)\",\n in6: \"rgb(40, 204, 217)\",\n in7: \"rgb(232, 178, 167)\",\n in8: \"rgb(242, 237, 161)\",\n in9: \"rgb(141, 203, 129)\",\n },\n cursor: \"rgb(255, 255, 255)\",\n drc: \"rgb(194, 194, 194)\",\n drc_error: \"rgba(215, 91, 107, 0.800)\",\n drc_exclusion: \"rgb(255, 255, 255)\",\n drc_warning: \"rgba(255, 208, 66, 0.902)\",\n dwgs_user: \"rgb(194, 194, 194)\",\n eco1_user: \"rgb(180, 219, 210)\",\n eco2_user: \"rgb(216, 200, 82)\",\n edge_cuts: \"rgb(208, 210, 205)\",\n f_adhes: \"rgb(132, 0, 132)\",\n f_crtyd: \"rgb(255, 0, 245)\",\n f_fab: \"rgb(175, 175, 175)\",\n f_mask: \"rgba(216, 100, 255, 0.400)\",\n f_paste: \"rgba(180, 160, 154, 0.902)\",\n f_silks: \"rgb(242, 237, 161)\",\n footprint_text_back: \"rgb(0, 0, 132)\",\n footprint_text_front: \"rgb(194, 194, 194)\",\n footprint_text_invisible: \"rgb(132, 132, 132)\",\n grid: \"rgb(132, 132, 132)\",\n grid_axes: \"rgb(194, 194, 194)\",\n margin: \"rgb(255, 38, 226)\",\n microvia: \"rgb(0, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n pad_back: \"rgb(77, 127, 196)\",\n pad_front: \"rgb(200, 52, 52)\",\n pad_plated_hole: \"rgb(194, 194, 0)\",\n pad_through_hole: \"rgb(227, 183, 46)\",\n plated_hole: \"rgb(26, 196, 210)\",\n ratsnest: \"rgba(245, 255, 213, 0.702)\",\n select_overlay: \"rgb(4, 255, 67)\",\n through_via: \"rgb(236, 236, 236)\",\n user_1: \"rgb(194, 194, 194)\",\n user_2: \"rgb(89, 148, 220)\",\n user_3: \"rgb(180, 219, 210)\",\n user_4: \"rgb(216, 200, 82)\",\n user_5: \"rgb(194, 194, 194)\",\n user_6: \"rgb(89, 148, 220)\",\n user_7: \"rgb(180, 219, 210)\",\n user_8: \"rgb(216, 200, 82)\",\n user_9: \"rgb(232, 178, 167)\",\n via_blind_buried: \"rgb(187, 151, 38)\",\n via_hole: \"rgb(227, 183, 46)\",\n via_micro: \"rgb(0, 132, 132)\",\n via_through: \"rgb(236, 236, 236)\",\n worksheet: \"rgb(200, 114, 171)\",\n },\n gerbview: {\n axes: \"rgb(0, 0, 132)\",\n background: \"rgb(0, 0, 0)\",\n dcodes: \"rgb(255, 255, 255)\",\n grid: \"rgb(132, 132, 132)\",\n layers: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n ],\n negative_objects: \"rgb(132, 132, 132)\",\n worksheet: \"rgb(0, 0, 132)\",\n },\n meta: {\n filename: \"kicad_2020\",\n name: \"KiCad 2020\",\n version: 2,\n },\n palette: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n ],\n schematic: {\n aux_items: \"rgb(46, 46, 46)\",\n background: \"rgb(245, 241, 237)\",\n brightened: \"rgb(255, 0, 255)\",\n bus: \"rgb(0, 0, 132)\",\n bus_junction: \"rgb(0, 0, 132)\",\n component_body: \"rgb(255, 255, 194)\",\n component_outline: \"rgb(132, 0, 0)\",\n cursor: \"rgb(15, 15, 15)\",\n erc_error: \"rgba(230, 9, 13, 0.800)\",\n erc_warning: \"rgba(209, 146, 0, 0.800)\",\n fields: \"rgb(132, 0, 132)\",\n grid: \"rgb(181, 181, 181)\",\n grid_axes: \"rgb(0, 0, 132)\",\n hidden: \"rgb(194, 194, 194)\",\n junction: \"rgb(0, 150, 0)\",\n label_global: \"rgb(132, 0, 0)\",\n label_hier: \"rgb(114, 86, 0)\",\n label_local: \"rgb(15, 15, 15)\",\n net_name: \"rgb(132, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n note: \"rgb(0, 0, 194)\",\n override_item_colors: false,\n pin: \"rgb(132, 0, 0)\",\n pin_name: \"rgb(0, 100, 100)\",\n pin_number: \"rgb(169, 0, 0)\",\n reference: \"rgb(0, 100, 100)\",\n shadow: \"rgba(102, 179, 255, 0.800)\",\n sheet: \"rgb(132, 0, 0)\",\n sheet_background: \"rgba(253, 255, 231, 0.000)\",\n sheet_fields: \"rgb(132, 0, 132)\",\n sheet_filename: \"rgb(114, 86, 0)\",\n sheet_label: \"rgb(0, 100, 100)\",\n sheet_name: \"rgb(0, 100, 100)\",\n value: \"rgb(0, 100, 100)\",\n wire: \"rgb(0, 150, 0)\",\n wire_crossing: \"rgb(30, 180, 30)\",\n worksheet: \"rgb(132, 0, 0)\",\n },\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { stringify } from \"svgson\"\nimport {\n applyToPoint,\n compose,\n scale,\n translate,\n fromTriangles,\n type Matrix,\n fromTwoMovingPoints,\n} from \"transformation-matrix\"\nimport { drawSchematicGrid } from \"./draw-schematic-grid\"\nimport { drawSchematicLabeledPoints } from \"./draw-schematic-labeled-points\"\nimport { getSchematicBoundsFromCircuitJson } from \"./get-schematic-bounds-from-circuit-json\"\nimport { createSvgObjectsFromSchematicComponent } from \"./svg-object-fns/create-svg-objects-from-sch-component\"\nimport { createSvgObjectsFromSchDebugObject } from \"./svg-object-fns/create-svg-objects-from-sch-debug-object\"\nimport { createSchematicTrace } from \"./svg-object-fns/create-svg-objects-from-sch-trace\"\nimport { createSvgObjectsForSchNetLabel } from \"./svg-object-fns/create-svg-objects-for-sch-net-label\"\n\ninterface Options {\n width?: number\n height?: number\n grid?: boolean | { cellSize?: number; labelCells?: boolean }\n labeledPoints?: Array<{ x: number; y: number; label: string }>\n}\n\nexport function convertCircuitJsonToSchematicSvg(\n circuitJson: AnyCircuitElement[],\n options?: Options,\n): string {\n // Get bounds with padding\n const realBounds = getSchematicBoundsFromCircuitJson(circuitJson)\n const realWidth = realBounds.maxX - realBounds.minX\n const realHeight = realBounds.maxY - realBounds.minY\n\n const svgWidth = options?.width ?? 1200\n const svgHeight = options?.height ?? 600\n\n // Compute the padding such that we maintain the same aspect ratio\n const circuitAspectRatio = realWidth / realHeight\n const containerAspectRatio = svgWidth / svgHeight\n\n let screenPaddingPx: { x: number; y: number }\n if (circuitAspectRatio > containerAspectRatio) {\n // Circuit is wider than container - fit to width\n const newHeight = svgWidth / circuitAspectRatio\n screenPaddingPx = {\n x: 0,\n y: (svgHeight - newHeight) / 2,\n }\n } else {\n // Circuit is taller than container - fit to height\n const newWidth = svgHeight * circuitAspectRatio\n screenPaddingPx = {\n x: (svgWidth - newWidth) / 2,\n y: 0,\n }\n }\n\n // Calculate projection using REAL points and SCREEN points\n // We're saying to map the real bounds to the screen bounds by giving 3 points\n // for each coordinate space\n const transform = fromTriangles(\n [\n { x: realBounds.minX, y: realBounds.maxY },\n { x: realBounds.maxX, y: realBounds.maxY },\n { x: realBounds.maxX, y: realBounds.minY },\n ],\n [\n { x: screenPaddingPx.x, y: screenPaddingPx.y },\n { x: svgWidth - screenPaddingPx.x, y: screenPaddingPx.y },\n { x: svgWidth - screenPaddingPx.x, y: svgHeight - screenPaddingPx.y },\n ],\n )\n const svgChildren: SvgObject[] = []\n\n // Add background rectangle\n svgChildren.push({\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n children: [],\n value: \"\",\n })\n\n // Add grid if enabled\n if (options?.grid) {\n const gridConfig = typeof options.grid === \"object\" ? options.grid : {}\n svgChildren.push(\n drawSchematicGrid({ bounds: realBounds, transform, ...gridConfig }),\n )\n }\n\n const schDebugObjectSvgs: SvgObject[] = []\n const schComponentSvgs: SvgObject[] = []\n const schTraceSvgs: SvgObject[] = []\n const schNetLabel: SvgObject[] = []\n\n for (const elm of circuitJson) {\n if (elm.type === \"schematic_debug_object\") {\n schDebugObjectSvgs.push(\n ...createSvgObjectsFromSchDebugObject(elm, transform),\n )\n } else if (elm.type === \"schematic_component\") {\n schComponentSvgs.push(\n ...createSvgObjectsFromSchematicComponent({\n component: elm,\n transform,\n circuitJson,\n }),\n )\n } else if (elm.type === \"schematic_trace\") {\n schTraceSvgs.push(...createSchematicTrace(elm, transform))\n } else if (elm.type === \"schematic_net_label\") {\n schNetLabel.push(...createSvgObjectsForSchNetLabel(elm, transform))\n }\n }\n\n // Add elements in correct order\n svgChildren.push(\n ...schDebugObjectSvgs,\n ...schComponentSvgs,\n ...schTraceSvgs,\n ...schNetLabel,\n )\n\n // Add labeled points if provided\n if (options?.labeledPoints) {\n svgChildren.push(\n drawSchematicLabeledPoints({\n points: options.labeledPoints,\n transform,\n }),\n )\n }\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n style: `background-color: ${colorMap.schematic.background}`,\n },\n children: [\n // Add styles\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n\n // DO NOT USE THESE CLASSES!!!!\n // PUT STYLES IN THE SVG OBJECTS THEMSELVES\n value: `\n .boundary { fill: ${colorMap.schematic.background}; }\n .schematic-boundary { fill: none; stroke: #fff; }\n .component { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .chip { fill: ${colorMap.schematic.component_body}; stroke: ${colorMap.schematic.component_outline}; }\n .component-pin { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .trace { stroke: ${colorMap.schematic.wire}; }\n .text { font-family: sans-serif; fill: ${colorMap.schematic.wire}; }\n .pin-number { fill: ${colorMap.schematic.pin_number}; }\n .port-label { fill: ${colorMap.schematic.reference}; }\n .component-name { fill: ${colorMap.schematic.reference}; }\n `,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ...svgChildren,\n ],\n value: \"\",\n }\n\n return stringify(svgObject)\n}\n\n/**\n * @deprecated use `convertCircuitJsonToSchematicSvg` instead\n */\nexport const circuitJsonToSchematicSvg = convertCircuitJsonToSchematicSvg\n","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function drawSchematicGrid(params: {\n bounds: {\n minX: number\n minY: number\n maxX: number\n maxY: number\n }\n transform: Matrix\n cellSize?: number\n labelCells?: boolean\n}): SvgObject {\n const { minX, minY, maxX, maxY } = params.bounds\n const cellSize = params.cellSize ?? 1\n const labelCells = params.labelCells ?? false\n const gridLines: any[] = []\n\n // Helper function to transform points\n const transformPoint = (x: number, y: number) => {\n const [transformedX, transformedY] = applyToPoint(params.transform, [x, y])\n return { x: transformedX, y: transformedY }\n }\n\n // Vertical lines\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n const start = transformPoint(x, minY)\n const end = transformPoint(x, maxY)\n\n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Horizontal lines\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const start = transformPoint(minX, y)\n const end = transformPoint(maxX, y)\n\n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Add cell labels if enabled\n if (labelCells) {\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const point = transformPoint(x, y)\n\n gridLines.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: (point.x - 2.5).toString(),\n y: (point.y - 5).toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": (\n (cellSize / 5) *\n Math.abs(params.transform.a)\n ).toString(),\n \"fill-opacity\": \"0.5\",\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": \"sans-serif\",\n },\n children: [\n {\n type: \"text\",\n value: `${x},${y}`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n }\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"grid\" },\n children: gridLines,\n }\n}\n","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\ninterface LabeledPoint {\n x: number\n y: number\n label?: string\n}\n\nexport function drawSchematicLabeledPoints(params: {\n points: LabeledPoint[]\n transform: Matrix\n}): SvgObject {\n const { points, transform } = params\n const labeledPointsGroup: any[] = []\n\n for (const point of points) {\n // Transform offset points for X marker\n const [x1, y1] = applyToPoint(transform, [point.x - 0.1, point.y - 0.1])\n const [x2, y2] = applyToPoint(transform, [point.x + 0.1, point.y + 0.1])\n const [x3, y3] = applyToPoint(transform, [point.x - 0.1, point.y + 0.1])\n const [x4, y4] = applyToPoint(transform, [point.x + 0.1, point.y - 0.1])\n\n // Add X marker\n labeledPointsGroup.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M${x1},${y1} L${x2},${y2} M${x3},${y3} L${x4},${y4}`,\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-opacity\": \"0.7\",\n },\n })\n\n // Transform label position\n const [labelX, labelY] = applyToPoint(transform, [\n point.x + 0.15,\n point.y - 0.15,\n ])\n\n // Add label\n labeledPointsGroup.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: labelX.toString(),\n y: labelY.toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": (0.1 * Math.abs(transform.a)).toString(),\n \"fill-opacity\": \"0.7\",\n \"text-anchor\": \"start\",\n \"font-family\": \"sans-serif\",\n \"dominant-baseline\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: point.label || `(${point.x},${point.y})`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"labeled-points\" },\n children: labeledPointsGroup,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\ninterface Bounds {\n minX: number\n minY: number\n maxX: number\n maxY: number\n}\n\nexport function getSchematicBoundsFromCircuitJson(\n soup: AnyCircuitElement[],\n padding = 0.5,\n): Bounds {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n const portSize = 0.2\n\n // Find the bounds\n for (const item of soup) {\n if (item.type === \"schematic_component\") {\n updateBounds(item.center, item.size, item.rotation || 0)\n } else if (item.type === \"schematic_port\") {\n updateBounds(item.center, { width: portSize, height: portSize }, 0)\n } else if (item.type === \"schematic_debug_object\") {\n if (item.shape === \"rect\") {\n updateBounds(item.center, item.size, 0)\n } else if (item.shape === \"line\") {\n updateBounds(item.start, { width: 0.1, height: 0.1 }, 0)\n updateBounds(item.end, { width: 0.1, height: 0.1 }, 0)\n }\n } else if (item.type === \"schematic_net_label\") {\n updateBounds(item.center, { width: 1, height: 1 }, 0)\n }\n }\n\n // Add padding to bounds\n minX -= padding\n minY -= padding\n maxX += padding\n maxY += padding\n\n return { minX, minY, maxX, maxY }\n\n function updateBounds(center: any, size: any, rotation: number) {\n const corners = [\n { x: -size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: size.height / 2 },\n { x: -size.width / 2, y: size.height / 2 },\n ]\n\n for (const corner of corners) {\n const rotatedX =\n corner.x * Math.cos(rotation) - corner.y * Math.sin(rotation) + center.x\n const rotatedY =\n corner.x * Math.sin(rotation) + corner.y * Math.cos(rotation) + center.y\n minX = Math.min(minX, rotatedX)\n minY = Math.min(minY, rotatedY)\n maxX = Math.max(maxX, rotatedX)\n maxY = Math.max(maxY, rotatedY)\n }\n }\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSvg, symbols, type SchSymbol } from \"schematic-symbols\"\nimport { parseSync } from \"svgson\"\nimport {\n applyToPoint,\n compose,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { matchSchPortsToSymbolPorts } from \"lib/utils/match-sch-ports-with-symbol-ports\"\nimport { pointPairsToMatrix } from \"lib/utils/point-pairs-to-matrix\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport type { TextPrimitive } from \"schematic-symbols\"\n\nconst ninePointAnchorToTextAnchor: Record<\n TextPrimitive[\"anchor\"],\n \"middle\" | \"start\" | \"end\"\n> = {\n top_left: \"start\",\n top_right: \"end\",\n middle_left: \"start\",\n middle_right: \"end\",\n bottom_left: \"start\",\n bottom_right: \"end\",\n center: \"middle\",\n middle_top: \"middle\",\n middle_bottom: \"middle\",\n}\n\nconst ninePointAnchorToDominantBaseline: Record<\n TextPrimitive[\"anchor\"],\n \"auto\" | \"hanging\" | \"middle\"\n> = {\n top_left: \"auto\",\n top_right: \"auto\",\n bottom_left: \"hanging\",\n bottom_right: \"hanging\",\n center: \"auto\",\n middle_left: \"middle\",\n middle_right: \"middle\",\n middle_top: \"auto\",\n middle_bottom: \"hanging\",\n}\n\nexport const createSvgObjectsFromSchematicComponentWithSymbol = ({\n component: schComponent,\n transform: realToScreenTransform,\n circuitJson,\n}: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n\n const symbol: SchSymbol = (symbols as any)[schComponent.symbol_name!]\n\n if (!symbol) return []\n\n const schPorts = su(circuitJson as any).schematic_port.list({\n schematic_component_id: schComponent.schematic_component_id,\n }) as SchematicPort[]\n\n const srcComponent = su(circuitJson as any).source_component.get(\n schComponent.source_component_id,\n )\n // Match schPorts to symbol ports using angle from schematic component center\n const schPortsWithSymbolPorts = matchSchPortsToSymbolPorts({\n schPorts,\n symbol,\n schComponent,\n })\n\n if (!schPortsWithSymbolPorts[0]) return []\n\n const transformFromSymbolToReal = pointPairsToMatrix(\n schPortsWithSymbolPorts[1]?.symbolPort ?? symbol.center,\n schPortsWithSymbolPorts[1]?.schPort.center ?? schComponent.center,\n schPortsWithSymbolPorts[0].symbolPort,\n schPortsWithSymbolPorts[0].schPort.center,\n )\n\n const paths = symbol.primitives.filter((p) => p.type === \"path\")\n const texts = symbol.primitives.filter((p) => p.type === \"text\")\n const circles = symbol.primitives.filter((p) => p.type === \"circle\")\n const boxes = symbol.primitives.filter((p) => p.type === \"box\")\n\n for (const path of paths) {\n const { points, color, closed, fill } = path\n svgObjects.push({\n type: \"element\",\n name: \"path\",\n attributes: {\n d:\n points\n .map((p, i) => {\n const [x, y] = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n [p.x, p.y],\n )\n return `${i === 0 ? \"M\" : \"L\"} ${x} ${y}`\n })\n .join(\" \") + (closed ? \" Z\" : \"\"),\n stroke: colorMap.schematic.component_outline,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(realToScreenTransform)}px`,\n },\n value: \"\",\n children: [],\n })\n }\n\n for (const text of texts) {\n const screenTextPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n text,\n )\n let textValue = \"\"\n if (text.text === \"{REF}\") {\n textValue = srcComponent?.name ?? \"\"\n } else if (text.text === \"{VAL}\") {\n textValue = schComponent.symbol_display_value ?? \"\"\n }\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: screenTextPos.x.toString(),\n y: screenTextPos.y.toString(),\n \"dominant-baseline\": ninePointAnchorToDominantBaseline[text.anchor],\n \"text-anchor\": ninePointAnchorToTextAnchor[text.anchor],\n \"font-family\": \"sans-serif\",\n \"font-size\": `${getSchScreenFontSize(realToScreenTransform, \"reference_designator\")}px`,\n },\n value: \"\",\n children: [\n {\n type: \"text\",\n value: textValue,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n\n // Draw Boxes\n\n for (const box of boxes) {\n const screenBoxPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n box,\n )\n const symbolToScreenScale = compose(\n realToScreenTransform,\n transformFromSymbolToReal,\n ).a\n\n svgObjects.push({\n name: \"rect\",\n type: \"element\",\n attributes: {\n x: screenBoxPos.x.toString(),\n y: screenBoxPos.y.toString(),\n width: (box.width * symbolToScreenScale).toString(),\n height: (box.height * symbolToScreenScale).toString(),\n fill: \"red\",\n },\n value: \"\",\n children: [],\n })\n }\n\n // Draw Ports for debugging\n for (const port of symbol.ports) {\n const screenPortPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n port,\n )\n svgObjects.push({\n type: \"element\",\n name: \"circle\",\n attributes: {\n cx: screenPortPos.x.toString(),\n cy: screenPortPos.y.toString(),\n r: `${realToScreenTransform.a * 0.02}px`,\n fill: \"none\",\n stroke: colorMap.schematic.component_outline,\n },\n value: \"\",\n children: [],\n })\n }\n\n return svgObjects\n}\n","import type { Matrix } from \"transformation-matrix\"\n\n// 0.02mm -> 2px\nexport const getSchStrokeSize = (transform: Matrix) => {\n return Math.abs(transform.a) * 0.02\n}\n","import type { SchematicComponent, SchematicPort } from \"circuit-json\"\nimport type { SchSymbol } from \"schematic-symbols\"\n\n// export const matchSchPortsToSymbolPorts = ({\n// schPorts,\n// symbol,\n// schComponent,\n// }: {\n// schPorts: SchematicPort[]\n// schComponent: SchematicComponent\n// symbol: SchSymbol\n// }): Array<{\n// schPort: SchematicPort\n// symbolPort: SchSymbol[\"ports\"][number]\n// }> => {\n// // schPorts is Array<{ center: { x: number; y: number } }>\n// // schComponent.center is { x: number; y: number }\n// // symbol.ports is Array<{ x: number; y: number }>\n// // symbol.center is { x: number; y: number }\n// // Use the angles from the schComponent center to the schPorts to match with the angles from the symbol center to the symbol ports\n// // If a port isn't matched because there are more schPorts than symbolPorts (or vice versa), then the unmatched ports should be ignored (not returned)\n// }\n\n// Helper function to calculate smallest angular difference accounting for wraparound\nconst getAngularDifference = (angle1: number, angle2: number): number => {\n // Convert from [-π, π] to [0, 2π] for easier comparison\n const a1 = angle1 < 0 ? angle1 + 2 * Math.PI : angle1\n const a2 = angle2 < 0 ? angle2 + 2 * Math.PI : angle2\n\n // Calculate direct difference\n let diff = Math.abs(a1 - a2)\n // If the difference is greater than π, then the smaller angle is going the other way around\n if (diff > Math.PI) {\n diff = 2 * Math.PI - diff\n }\n return diff\n}\n\nexport const matchSchPortsToSymbolPorts = ({\n schPorts,\n symbol,\n schComponent,\n}: {\n schPorts: SchematicPort[]\n schComponent: SchematicComponent\n symbol: SchSymbol\n}): Array<{\n schPort: SchematicPort\n symbolPort: SchSymbol[\"ports\"][number]\n}> => {\n // Calculate angles for schematic ports\n const schPortAngles = schPorts.map((port) => {\n const dx = port.center.x - schComponent.center.x\n const dy = port.center.y - schComponent.center.y\n return {\n port,\n angle: Math.atan2(dy, dx),\n }\n })\n\n // Calculate angles for symbol ports\n const symbolPortAngles = symbol.ports.map((port) => {\n const dx = port.x - symbol.center.x\n const dy = port.y - symbol.center.y\n return {\n port,\n angle: Math.atan2(dy, dx),\n }\n })\n\n // Sort both arrays by angle to help with initial matching\n // Note: The sorting is less critical now that we handle wraparound properly\n schPortAngles.sort((a, b) => a.angle - b.angle)\n symbolPortAngles.sort((a, b) => a.angle - b.angle)\n\n const matches: Array<{\n schPort: SchematicPort\n symbolPort: SchSymbol[\"ports\"][number]\n }> = []\n\n // Keep track of used symbol ports to avoid duplicate matches\n const usedSymbolPorts = new Set<SchSymbol[\"ports\"][number]>()\n\n // For each schematic port, find the best matching symbol port\n for (const schPortAngle of schPortAngles) {\n let bestMatch: {\n symbolPort: SchSymbol[\"ports\"][number]\n angleDiff: number\n } | null = null\n\n // Compare against all available symbol ports\n for (const symbolPortAngle of symbolPortAngles) {\n // Skip if this symbol port is already matched\n if (usedSymbolPorts.has(symbolPortAngle.port)) continue\n\n const angleDiff = getAngularDifference(\n schPortAngle.angle,\n symbolPortAngle.angle,\n )\n\n if (bestMatch === null || angleDiff < bestMatch.angleDiff) {\n bestMatch = {\n symbolPort: symbolPortAngle.port,\n angleDiff,\n }\n }\n }\n\n // If we found a match and the angular difference is reasonable (e.g., less than 45 degrees)\n if (bestMatch && bestMatch.angleDiff < Math.PI / 4) {\n matches.push({\n schPort: schPortAngle.port,\n symbolPort: bestMatch.symbolPort,\n })\n usedSymbolPorts.add(bestMatch.symbolPort)\n }\n }\n\n return matches\n}\n","import { type Matrix, compose, scale, translate } from \"transformation-matrix\"\n\ntype Point = { x: number; y: number }\n\nexport function pointPairsToMatrix(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n): Matrix {\n // Calculate the translation based on the first point pair (A -> A')\n const tx = a2.x - a1.x\n const ty = a2.y - a1.y\n\n // Calculate scaling factors using the distances between points\n const originalDistance = Math.sqrt((b1.x - a1.x) ** 2 + (b1.y - a1.y) ** 2)\n const transformedDistance = Math.sqrt((b2.x - a2.x) ** 2 + (b2.y - a2.y) ** 2)\n\n const a = transformedDistance / originalDistance\n\n // Create and compose the transformations\n const translateMatrix = translate(tx, ty)\n const scaleMatrix = scale(a, a)\n\n return compose(translateMatrix, scaleMatrix)\n}\n","import type { Matrix } from \"transformation-matrix\"\nimport { applyToPoint } from \"transformation-matrix\"\n\ntype SchTextType =\n | \"pin_number\"\n | \"reference_designator\"\n | \"manufacturer_number\"\n | \"net_label\"\n\nexport const getSchMmFontSize = (textType: SchTextType) => {\n return textType === \"pin_number\" ? 0.15 : 0.18\n}\n\nexport const getSchScreenFontSize = (\n transform: Matrix,\n textType: SchTextType,\n) => {\n return Math.abs(transform.a) * getSchMmFontSize(textType)\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n SourceSimpleChip,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSvg, symbols } from \"schematic-symbols\"\nimport { parseSync } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { createSvgObjectsFromSchematicComponentWithSymbol } from \"./create-svg-objects-from-sch-component-with-symbol\"\nimport { createSvgObjectsFromSchPortOnBox } from \"./create-svg-objects-from-sch-port-on-box\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\n\nexport const createSvgObjectsFromSchematicComponentWithBox = ({\n component: schComponent,\n transform,\n circuitJson,\n}: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const srcComponent = su(circuitJson as any).source_component.get(\n schComponent.source_component_id,\n )\n const svgObjects: SvgObject[] = []\n\n const componentScreenTopLeft = applyToPoint(transform, {\n x: schComponent.center.x - schComponent.size.width / 2,\n y: schComponent.center.y + schComponent.size.height / 2,\n })\n const componentScreenBottomRight = applyToPoint(transform, {\n x: schComponent.center.x + schComponent.size.width / 2,\n y: schComponent.center.y - schComponent.size.height / 2,\n })\n const componentScreenWidth =\n componentScreenBottomRight.x - componentScreenTopLeft.x\n const componentScreenHeight =\n componentScreenBottomRight.y - componentScreenTopLeft.y\n\n // Add basic rectangle for component body\n svgObjects.push({\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n class: \"component chip\",\n x: componentScreenTopLeft.x.toString(),\n y: componentScreenTopLeft.y.toString(),\n width: componentScreenWidth.toString(),\n height: componentScreenHeight.toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n children: [],\n })\n // Calculate position for top center of component\n const screenManufacturerNumberPos = applyToPoint(transform, {\n x: schComponent.center.x + schComponent.size.width / 2,\n y: schComponent.center.y + schComponent.size.height / 2 + 0.5, // Above the component top edge\n })\n const fontSizePx = getSchScreenFontSize(transform, \"manufacturer_number\")\n\n // Add manufacturer number and component name text\n if (srcComponent?.manufacturer_part_number) {\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: screenManufacturerNumberPos.x.toString(),\n y: screenManufacturerNumberPos.y.toString(),\n \"font-family\": \"sans-serif\",\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${fontSizePx}px`,\n },\n children: [\n {\n type: \"text\",\n value: srcComponent.manufacturer_part_number,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // Component name below manufacturer number\n if (srcComponent?.name) {\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: screenManufacturerNumberPos.x.toString(),\n y: (screenManufacturerNumberPos.y + fontSizePx * 1.1).toString(),\n \"font-family\": \"sans-serif\",\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${fontSizePx}px`,\n },\n children: [\n {\n type: \"text\",\n value: srcComponent.name || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // // Process ports\n const schematicPorts = su(circuitJson as any).schematic_port.list({\n schematic_component_id: schComponent.schematic_component_id,\n }) as SchematicPort[]\n\n for (const schPort of schematicPorts) {\n svgObjects.push(\n ...createSvgObjectsFromSchPortOnBox({\n schPort,\n schComponent,\n transform,\n circuitJson,\n }),\n )\n }\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { createSvgObjectsForSchPortBoxLine } from \"./create-svg-objects-for-sch-port-box-line\"\nimport { createSvgObjectsForSchPortPinNumberText } from \"./create-svg-objects-for-sch-port-pin-number-text\"\nimport { createSvgObjectsForSchPortPinLabel } from \"./create-svg-objects-for-sch-port-pin-label\"\n\nexport const createSvgObjectsFromSchPortOnBox = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n svgObjects.push(...createSvgObjectsForSchPortBoxLine(params))\n svgObjects.push(...createSvgObjectsForSchPortPinNumberText(params))\n svgObjects.push(...createSvgObjectsForSchPortPinLabel(params))\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\n\nconst PIN_CIRCLE_RADIUS_MM = 0.02\n\n/**\n * The schematic port box line is the line and circle that goes from the edge\n * of the component box to the port.\n */\nexport const createSvgObjectsForSchPortBoxLine = ({\n schPort,\n schComponent,\n transform,\n circuitJson,\n}: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n\n const srcPort = su(circuitJson as any).source_port.get(schPort.source_port_id)\n\n const realEdgePos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n // schPort.distance_from_component_edge is currently calculated incorrectly\n // in core\n const realPinLineLength = schPort.distance_from_component_edge ?? 0.4\n\n switch (schPort.side_of_component) {\n case \"left\":\n realEdgePos.x += realPinLineLength\n break\n case \"right\":\n realEdgePos.x -= realPinLineLength\n break\n case \"top\":\n realEdgePos.y -= realPinLineLength\n break\n case \"bottom\":\n realEdgePos.y += realPinLineLength\n break\n }\n\n const screenSchPortPos = applyToPoint(transform, schPort.center)\n const screenRealEdgePos = applyToPoint(transform, realEdgePos)\n\n // Subtract the pin circle radius from the pin line length to get the end\n const realLineEnd = { ...schPort.center }\n\n switch (schPort.side_of_component) {\n case \"left\":\n realLineEnd.x += PIN_CIRCLE_RADIUS_MM\n break\n case \"right\":\n realLineEnd.x -= PIN_CIRCLE_RADIUS_MM\n break\n case \"top\":\n realLineEnd.y -= PIN_CIRCLE_RADIUS_MM\n break\n case \"bottom\":\n realLineEnd.y += PIN_CIRCLE_RADIUS_MM\n break\n }\n const screenLineEnd = applyToPoint(transform, realLineEnd)\n\n // Add port line\n svgObjects.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n x1: screenLineEnd.x.toString(),\n y1: screenLineEnd.y.toString(),\n x2: screenRealEdgePos.x.toString(),\n y2: screenRealEdgePos.y.toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n // Add port circle\n svgObjects.push({\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n cx: screenSchPortPos.x.toString(),\n cy: screenSchPortPos.y.toString(),\n r: (Math.abs(transform.a) * PIN_CIRCLE_RADIUS_MM).toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n return svgObjects\n}\n","/**\n * Given a side, gives you the unit vector you would move in if you were coming\n * towards that edge from the outside. This is the same as the unit vector from\n * a port to the edge of a schematic box. This function assumes cartesian\n * coordinates (Y positive is up)\n */\nexport const getUnitVectorFromOutsideToEdge = (\n side: \"top\" | \"bottom\" | \"left\" | \"right\",\n) => {\n switch (side) {\n case \"top\":\n return { x: 0, y: -1 }\n case \"bottom\":\n return { x: 0, y: 1 }\n case \"left\":\n return { x: 1, y: 0 }\n case \"right\":\n return { x: -1, y: 0 }\n }\n throw new Error(`Invalid side: ${side}`)\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n SourcePort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport const createSvgObjectsForSchPortPinNumberText = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n // Find the source port using the source_port_id from the schematic port\n const sourcePort = circuitJson.find(\n (element) =>\n element.type === \"source_port\" &&\n element.source_port_id === schPort.source_port_id,\n )\n\n const realPinNumberPos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n if (!schPort.side_of_component) return []\n const vecToEdge = getUnitVectorFromOutsideToEdge(schPort.side_of_component)\n\n const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4\n\n // Move the pin number halfway to the edge of the box component so it sits\n // between the edge and the port, exactly in the middle\n realPinNumberPos.x += (vecToEdge.x * realPinEdgeDistance) / 2\n realPinNumberPos.y += (vecToEdge.y * realPinEdgeDistance) / 2\n\n // Transform the pin position from local to global coordinates\n const screenPinNumberTextPos = applyToPoint(transform, realPinNumberPos)\n\n if (\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ) {\n // Move the pin number text to the left a bit so it doesn't hit the port line\n screenPinNumberTextPos.x -= 2 //px\n } else {\n // Move the pin number text up a bit so it doesn't hit the port line\n screenPinNumberTextPos.y -= 2 //px\n }\n\n const pinLabel = (sourcePort as SourcePort).name.replace(\"pin\", \"\")\n\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"pin-number\",\n x: screenPinNumberTextPos.x.toString(),\n y: screenPinNumberTextPos.y.toString(),\n style: \"font-family: sans-serif;\",\n fill: colorMap.schematic.pin_number,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${getSchScreenFontSize(transform, \"pin_number\")}px`,\n transform:\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ? `rotate(-90 ${screenPinNumberTextPos.x} ${screenPinNumberTextPos.y})`\n : \"\",\n },\n children: [\n {\n type: \"text\",\n value: pinLabel,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nconst LABEL_DIST_FROM_EDGE_MM = 0.1\n\nexport const createSvgObjectsForSchPortPinLabel = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n const realPinNumberPos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n if (!schPort.side_of_component) return []\n const vecToEdge = getUnitVectorFromOutsideToEdge(schPort.side_of_component)\n\n const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4\n\n // Move the pin number halfway to the edge of the box component so it sits\n // between the edge and the port, exactly in the middle\n realPinNumberPos.x +=\n vecToEdge.x * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM)\n realPinNumberPos.y +=\n vecToEdge.y * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM)\n\n // Transform the pin position from local to global coordinates\n const screenPinNumberTextPos = applyToPoint(transform, realPinNumberPos)\n\n const label =\n schPort.display_pin_label ??\n schComponent.port_labels?.[`pin${schPort.pin_number}`]\n\n if (!label) return []\n\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"pin-number\",\n x: screenPinNumberTextPos.x.toString(),\n y: screenPinNumberTextPos.y.toString(),\n style: \"font-family: sans-serif;\",\n fill: colorMap.schematic.pin_number,\n \"text-anchor\":\n schPort.side_of_component === \"left\" ||\n schPort.side_of_component === \"bottom\"\n ? \"start\"\n : \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-size\": `${getSchScreenFontSize(transform, \"pin_number\")}px`,\n transform:\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ? `rotate(-90 ${screenPinNumberTextPos.x} ${screenPinNumberTextPos.y})`\n : \"\",\n },\n children: [\n {\n type: \"text\",\n value: label || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","import type { AnyCircuitElement, SchematicComponent } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { createSvgObjectsFromSchematicComponentWithSymbol } from \"./create-svg-objects-from-sch-component-with-symbol\"\nimport { createSvgObjectsFromSchematicComponentWithBox } from \"./create-svg-objects-from-sch-component-with-box\"\nimport type { Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromSchematicComponent(params: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] {\n const { component } = params\n\n if (component.symbol_name) {\n return createSvgObjectsFromSchematicComponentWithSymbol(params)\n }\n\n return createSvgObjectsFromSchematicComponentWithBox(params)\n}\n","import type { SchematicDebugObject } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromSchDebugObject(\n debugObject: SchematicDebugObject,\n transform: Matrix,\n): SvgObject[] {\n if (debugObject.shape === \"rect\") {\n // Transform all corners\n let [screenLeft, screenTop] = applyToPoint(transform, [\n debugObject.center.x - debugObject.size.width / 2,\n debugObject.center.y - debugObject.size.height / 2,\n ])\n let [screenRight, screenBottom] = applyToPoint(transform, [\n debugObject.center.x + debugObject.size.width / 2,\n debugObject.center.y + debugObject.size.height / 2,\n ])\n ;[screenTop, screenBottom] = [\n Math.min(screenTop, screenBottom),\n Math.max(screenTop, screenBottom),\n ]\n\n // Calculate screen width and height\n const width = Math.abs(screenRight - screenLeft)\n const height = Math.abs(screenBottom - screenTop)\n\n const [screenCenterX, screenCenterY] = applyToPoint(transform, [\n debugObject.center.x,\n debugObject.center.y,\n ])\n\n return [\n {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenLeft.toString(),\n y: screenTop.toString(),\n width: width.toString(),\n height: height.toString(),\n fill: \"none\",\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenCenterX.toString(),\n y: (screenCenterY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n if (debugObject.shape === \"line\") {\n // Transform start and end points - flip Y coordinates\n const [screenStartX, screenStartY] = applyToPoint(transform, [\n debugObject.start.x,\n debugObject.start.y,\n ])\n const [screenEndX, screenEndY] = applyToPoint(transform, [\n debugObject.end.x,\n debugObject.end.y,\n ])\n\n // Calculate midpoint for label\n const screenMidX = (screenStartX + screenEndX) / 2\n const screenMidY = (screenStartY + screenEndY) / 2\n\n return [\n {\n name: \"line\",\n type: \"element\",\n value: \"\",\n attributes: {\n x1: screenStartX.toString(),\n y1: screenStartY.toString(),\n x2: screenEndX.toString(),\n y2: screenEndY.toString(),\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenMidX.toString(),\n y: (screenMidY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n return []\n}\n","import type { SchematicTrace } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSchematicTrace(\n trace: SchematicTrace,\n transform: Matrix,\n): SvgObject[] {\n const edges = trace.edges\n if (edges.length === 0) return []\n const svgObjects: SvgObject[] = []\n\n let path = \"\"\n\n // Process edges into an SVG path\n for (let edgeIndex = 0; edgeIndex < edges.length; edgeIndex++) {\n const edge = edges[edgeIndex]!\n\n if (edge.is_crossing) continue\n\n // Transform the points using the matrix\n const [screenFromX, screenFromY] = applyToPoint(transform, [\n edge.from.x,\n edge.from.y,\n ])\n const [screenToX, screenToY] = applyToPoint(transform, [\n edge.to.x,\n edge.to.y,\n ])\n\n // Regular straight line for non-crossing traces\n if (edgeIndex === 0 || edges[edgeIndex - 1]?.is_crossing) {\n path += `M ${screenFromX} ${screenFromY} L ${screenToX} ${screenToY}`\n } else {\n path += ` L ${screenToX} ${screenToY}`\n }\n }\n\n // Process wire crossings with little \"hops\" or arcs\n for (const edge of edges) {\n if (!edge.is_crossing) continue\n\n // Transform the points using the matrix\n const [screenFromX, screenFromY] = applyToPoint(transform, [\n edge.from.x,\n edge.from.y,\n ])\n const [screenToX, screenToY] = applyToPoint(transform, [\n edge.to.x,\n edge.to.y,\n ])\n // For crossing traces, create a small arc/hop\n const midX = (screenFromX + screenToX) / 2\n const midY = (screenFromY + screenToY) / 2\n\n // Calculate perpendicular offset for the arc\n const dx = screenToX - screenFromX\n const dy = screenToY - screenFromY\n const len = Math.sqrt(dx * dx + dy * dy)\n const hopHeight = len * 0.7\n\n // Perpendicular vector\n const perpX = (-dy / len) * hopHeight\n const perpY = (dx / len) * hopHeight\n\n // Control point for the quadratic curve\n const controlX = midX + perpX\n const controlY = midY - Math.abs(perpY)\n\n // Arc Shadow\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M ${screenFromX} ${screenFromY} Q ${controlX} ${controlY} ${screenToX} ${screenToY}`,\n stroke: colorMap.schematic.background,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform) + 1.5}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M ${screenFromX} ${screenFromY} Q ${controlX} ${controlY} ${screenToX} ${screenToY}`,\n stroke: colorMap.schematic.wire,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n }\n\n if (path) {\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"trace\",\n d: path,\n stroke: colorMap.schematic.wire,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n }\n\n // Add junction circles\n if (trace.junctions) {\n for (const junction of trace.junctions) {\n const [screenX, screenY] = applyToPoint(transform, [\n junction.x,\n junction.y,\n ])\n svgObjects.push({\n name: \"circle\",\n type: \"element\",\n attributes: {\n cx: screenX.toString(),\n cy: screenY.toString(),\n r: (Math.abs(transform.a) * 0.03).toString(),\n fill: colorMap.schematic.junction,\n },\n value: \"\",\n children: [],\n })\n }\n }\n\n return svgObjects\n}\n","import type { AnyCircuitElement, SchematicNetLabel } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport {\n getSchMmFontSize,\n getSchScreenFontSize,\n} from \"lib/utils/get-sch-font-size\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { getUnitVectorFromEdgeToOutside } from \"lib/utils/get-unit-vector-from-edge-to-outside\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport {\n applyToPoint,\n compose,\n rotate,\n scale,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport { estimateTextWidth } from \"../estimate-text-width\"\n\n/**\n * Arrow point width as a fraction of font size (Font Size Ratio)\n */\nconst ARROW_POINT_WIDTH_FSR = 0.3\n\n/**\n * End padding as a fraction of font size (Font Size Ratio)\n */\nconst END_PADDING_FSR = 0.3\nconst END_PADDING_EXTRA_PER_CHARACTER_FSR = 0.06\n\nexport const createSvgObjectsForSchNetLabel = (\n schNetLabel: SchematicNetLabel,\n realToScreenTransform: Matrix,\n): SvgObject[] => {\n if (!schNetLabel.text) return []\n const svgObjects: SvgObject[] = []\n\n const fontSizePx = getSchScreenFontSize(realToScreenTransform, \"net_label\")\n const fontSizeMm = getSchMmFontSize(\"net_label\")\n const textWidthFSR = estimateTextWidth(schNetLabel.text || \"\")\n\n // Transform the center position to screen coordinates\n const screenCenter = applyToPoint(realToScreenTransform, schNetLabel.center)\n\n const realTextGrowthVec = getUnitVectorFromOutsideToEdge(\n schNetLabel.anchor_side,\n )\n\n const screenTextGrowthVec = { ...realTextGrowthVec }\n screenTextGrowthVec.y *= -1 // Invert y direction because anchor_side is pre-transform\n\n const fullWidthFsr =\n textWidthFSR +\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n END_PADDING_FSR\n const screenAnchorPosition = schNetLabel.anchor_position\n ? applyToPoint(realToScreenTransform, schNetLabel.anchor_position)\n : {\n x:\n screenCenter.x -\n (screenTextGrowthVec.x * fullWidthFsr * fontSizePx) / 2,\n y:\n screenCenter.y -\n (screenTextGrowthVec.y * fullWidthFsr * fontSizePx) / 2,\n }\n const realAnchorPosition = schNetLabel.anchor_position ?? {\n x:\n schNetLabel.center.x -\n (realTextGrowthVec.x * fullWidthFsr * fontSizeMm) / 2,\n y:\n schNetLabel.center.y -\n (realTextGrowthVec.y * fullWidthFsr * fontSizeMm) / 2,\n }\n\n // Get rotation angle based on anchor_side\n const pathRotation = {\n left: 0,\n top: -90,\n bottom: 90,\n right: 180,\n }[schNetLabel.anchor_side]\n\n // Calculate the points for the outline\n const screenOutlinePoints: Array<{ x: number; y: number }> = [\n // Arrow point in font-relative coordinates\n {\n x: 0,\n y: 0,\n },\n // Top left corner in font-relative coordinates\n {\n x: ARROW_POINT_WIDTH_FSR,\n y: 0.6,\n },\n // Top right corner in font-relative coordinates\n {\n x:\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_FSR +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n textWidthFSR,\n y: 0.6,\n },\n // Bottom right corner in font-relative coordinates\n {\n x:\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_FSR +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n textWidthFSR,\n y: -0.6,\n },\n // Bottom left corner in font-relative coordinates\n {\n x: ARROW_POINT_WIDTH_FSR,\n y: -0.6,\n },\n ].map((fontRelativePoint) =>\n applyToPoint(\n compose(\n realToScreenTransform,\n translate(realAnchorPosition.x, realAnchorPosition.y),\n scale(fontSizeMm),\n rotate((pathRotation / 180) * Math.PI),\n ),\n fontRelativePoint,\n ),\n )\n\n // Create the label path\n const pathD = `\n M ${screenOutlinePoints[0]!.x},${screenOutlinePoints[0]!.y}\n L ${screenOutlinePoints[1]!.x},${screenOutlinePoints[1]!.y}\n L ${screenOutlinePoints[2]!.x},${screenOutlinePoints[2]!.y}\n L ${screenOutlinePoints[3]!.x},${screenOutlinePoints[3]!.y}\n L ${screenOutlinePoints[4]!.x},${screenOutlinePoints[4]!.y}\n Z\n `\n\n // Add the label container path\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"net-label\",\n d: pathD,\n fill: \"white\",\n stroke: colorMap.schematic.label_global,\n \"stroke-width\": `${getSchStrokeSize(realToScreenTransform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n const screenTextPos = {\n x: screenAnchorPosition.x + screenTextGrowthVec.x * fontSizePx * 0.5,\n y: screenAnchorPosition.y + screenTextGrowthVec.y * fontSizePx * 0.5,\n }\n\n const textAnchor = {\n left: \"start\",\n top: \"start\",\n bottom: \"start\",\n right: \"end\",\n }[schNetLabel.anchor_side]\n\n const textTransformString = {\n left: \"\",\n right: \"\",\n top: `rotate(90 ${screenTextPos.x} ${screenTextPos.y})`,\n bottom: `rotate(-90 ${screenTextPos.x} ${screenTextPos.y})`,\n }[schNetLabel.anchor_side]\n\n // Add the label text\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"net-label-text\",\n x: screenTextPos.x.toString(),\n y: screenTextPos.y.toString(),\n fill: colorMap.schematic.label_global,\n \"text-anchor\": textAnchor,\n \"dominant-baseline\": \"central\",\n \"font-family\": \"sans-serif\",\n \"font-variant-numeric\": \"tabular-nums\",\n \"font-size\": `${fontSizePx}px`,\n transform: textTransformString,\n },\n children: [\n {\n type: \"text\",\n value: schNetLabel.text || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","// https://claude.ai/share/5e327d90-627f-48d5-9a51-ba6117479007\nexport const arialTextMetrics = {\n \"0\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"1\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -3,\n right: 9,\n },\n \"2\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"3\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"4\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n \"5\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"6\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"7\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"8\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"9\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \" \": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 0,\n },\n \"!\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n '\"': {\n width: 9,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"#\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 13,\n },\n $: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"%\": {\n width: 21,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 20,\n },\n \"&\": {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 15,\n },\n \"'\": {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 3,\n },\n \"(\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \")\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"*\": {\n width: 9,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 8,\n },\n \"+\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \",\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"-\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \".\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"/\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 7,\n },\n \":\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \";\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"<\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \"=\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \">\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \"?\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"@\": {\n width: 24,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 23,\n },\n A: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n B: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n C: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 16,\n },\n D: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 16,\n },\n E: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n F: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 14,\n },\n G: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 17,\n },\n H: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n I: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n J: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 10,\n },\n K: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 16,\n },\n L: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n M: {\n width: 20,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 18,\n },\n N: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n O: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 18,\n },\n P: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n Q: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 18,\n },\n R: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 17,\n },\n S: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 15,\n },\n T: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 14,\n },\n U: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n V: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n W: {\n width: 23,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 22,\n },\n X: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n Y: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n Z: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 14,\n },\n \"[\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 6,\n },\n \"\\\\\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 7,\n },\n \"]\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 5,\n },\n \"^\": {\n width: 11,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 11,\n },\n _: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 14,\n },\n \"`\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 5,\n },\n a: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n b: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n c: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n d: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n e: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n f: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 8,\n },\n g: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n h: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n i: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n j: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 1,\n right: 4,\n },\n k: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n l: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n m: {\n width: 20,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 18,\n },\n n: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n o: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n p: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n q: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n r: {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 8,\n },\n s: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 11,\n },\n t: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 6,\n },\n u: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n v: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n w: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 17,\n },\n x: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n y: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n z: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 11,\n },\n \"{\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"|\": {\n width: 6,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n \"}\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"~\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n}\n","import { arialTextMetrics } from \"./arial-text-metrics\"\n\nexport const estimateTextWidth = (text: string): number => {\n if (!text) return 0\n\n let totalWidth = 0\n for (const char of text) {\n const metrics = arialTextMetrics[char as keyof typeof arialTextMetrics]\n if (metrics) {\n totalWidth += metrics.width\n } else {\n // Default width for unknown characters\n totalWidth += arialTextMetrics[\"?\"].width\n }\n }\n\n // Return width normalized to font size 1\n return totalWidth / 27 // Normalize by font height from metrics\n}\n"],"mappings":"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","names":["applyToPoint","compose","translate","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","rotate","translate","matrixToString","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","translate","applyToPoint","stringify","applyToPoint","applyToPoint","applyToPoint","compose","compose","scale","translate","applyToPoint","compose","su","applyToPoint","applyToPoint","su","su","applyToPoint","applyToPoint","applyToPoint","su","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","rotate","scale","translate","applyToPoint","compose","translate","scale","rotate","stringify"]}
|
|
1
|
+
{"version":3,"sources":["../lib/pcb/convert-circuit-json-to-pcb-svg.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-trace-error.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-plated-hole.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-text.ts","../lib/utils/pairs.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-trace.ts","../lib/pcb/layer-name-to-color.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-smt-pads.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-board.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-via.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-hole.ts","../lib/pcb/colors.ts","../lib/utils/colors.ts","../lib/sch/convert-circuit-json-to-schematic-svg.ts","../lib/sch/draw-schematic-grid.ts","../lib/sch/draw-schematic-labeled-points.ts","../lib/sch/get-schematic-bounds-from-circuit-json.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component-with-symbol.ts","../lib/utils/get-sch-stroke-size.ts","../lib/utils/match-sch-ports-with-symbol-ports.ts","../lib/utils/point-pairs-to-matrix.ts","../lib/utils/get-sch-font-size.ts","../lib/sch/svg-object-fns/create-svg-error-text.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component-with-box.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-port-on-box.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-box-line.ts","../lib/utils/get-unit-vector-from-outside-to-edge.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-number-text.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-label.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-debug-object.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-trace.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-net-label.ts","../lib/sch/arial-text-metrics.ts","../lib/sch/estimate-text-width.ts"],"sourcesContent":["import type { Point, AnyCircuitElement } from \"circuit-json\"\nimport { type INode as SvgObject, stringify } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n scale,\n translate,\n} from \"transformation-matrix\"\nimport { createSvgObjectsFromPcbTraceError } from \"./svg-object-fns/create-svg-objects-from-pcb-trace-error\"\nimport { createSvgObjectsFromPcbFabricationNotePath } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path\"\nimport { createSvgObjectsFromPcbFabricationNoteText } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text\"\nimport { createSvgObjectsFromPcbPlatedHole } from \"./svg-object-fns/create-svg-objects-from-pcb-plated-hole\"\nimport { createSvgObjectsFromPcbSilkscreenPath } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-path\"\nimport { createSvgObjectsFromPcbSilkscreenText } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-text\"\nimport { createSvgObjectsFromPcbTrace } from \"./svg-object-fns/create-svg-objects-from-pcb-trace\"\nimport { createSvgObjectsFromSmtPad } from \"./svg-object-fns/create-svg-objects-from-smt-pads\"\nimport { createSvgObjectsFromPcbBoard } from \"./svg-object-fns/create-svg-objects-from-pcb-board\"\nimport { createSvgObjectsFromPcbVia } from \"./svg-object-fns/create-svg-objects-from-pcb-via\"\nimport { createSvgObjectsFromPcbHole } from \"./svg-object-fns/create-svg-objects-from-pcb-hole\"\n\nconst OBJECT_ORDER: AnyCircuitElement[\"type\"][] = [\n \"pcb_trace_error\",\n \"pcb_plated_hole\",\n \"pcb_fabrication_note_text\",\n \"pcb_fabrication_note_path\",\n \"pcb_silkscreen_text\",\n \"pcb_silkscreen_path\",\n \"pcb_via\",\n \"pcb_trace\",\n \"pcb_smtpad\",\n \"pcb_component\",\n \"pcb_board\",\n]\n\ninterface PointObjectNotation {\n x: number\n y: number\n}\n\ninterface Options {\n width?: number\n height?: number\n shouldDrawErrors?: boolean\n}\n\nexport function convertCircuitJsonToPcbSvg(\n soup: AnyCircuitElement[],\n options?: Options,\n): string {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n // Process all elements to determine bounds\n for (const item of soup) {\n if (item.type === \"pcb_board\") {\n if (\n item.outline &&\n Array.isArray(item.outline) &&\n item.outline.length >= 3\n )\n updateBoundsToIncludeOutline(item.outline)\n else if (\"center\" in item && \"width\" in item && \"height\" in item)\n updateBounds(item.center, item.width, item.height)\n } else if (\"x\" in item && \"y\" in item) {\n updateBounds({ x: item.x, y: item.y }, 0, 0)\n } else if (\"route\" in item) {\n updateTraceBounds(item.route)\n }\n }\n\n const padding = 1 // Reduced padding for tighter boundary\n const circuitWidth = maxX - minX + 2 * padding\n const circuitHeight = maxY - minY + 2 * padding\n\n const svgWidth = options?.width ?? 800\n const svgHeight = options?.height ?? 600\n const paths: PointObjectNotation[][] = []\n for (const item of soup) {\n if (\"route\" in item && item.route !== undefined) {\n paths.push(item.route as PointObjectNotation[])\n }\n }\n\n // Calculate scale factor to fit the circuit within the SVG, maintaining aspect ratio\n const scaleX = svgWidth / circuitWidth\n const scaleY = svgHeight / circuitHeight\n const scaleFactor = Math.min(scaleX, scaleY)\n\n // Calculate centering offsets\n const offsetX = (svgWidth - circuitWidth * scaleFactor) / 2\n const offsetY = (svgHeight - circuitHeight * scaleFactor) / 2\n\n const transform = compose(\n translate(\n offsetX - minX * scaleFactor + padding * scaleFactor,\n svgHeight - offsetY + minY * scaleFactor - padding * scaleFactor,\n ),\n scale(scaleFactor, -scaleFactor), // Flip in y-direction\n )\n\n const svgObjects = soup\n .sort(\n (a, b) =>\n (OBJECT_ORDER.indexOf(b.type) ?? 9999) -\n (OBJECT_ORDER.indexOf(a.type) ?? 9999),\n )\n .flatMap((item) =>\n createSvgObjects(item, transform, soup, options?.shouldDrawErrors),\n )\n\n let strokeWidth = String(0.05 * scaleFactor)\n\n for (const element of soup) {\n if (\"stroke_width\" in element) {\n strokeWidth = String(scaleFactor * element.stroke_width)\n break\n }\n }\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n value: \"\",\n children: [\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n value: `\n .boundary { fill: #000; }\n .pcb-board { fill: none; }\n .pcb-trace { fill: none; }\n .pcb-hole-outer { fill: rgb(200, 52, 52); }\n .pcb-hole-inner { fill: rgb(255, 38, 226); }\n .pcb-pad { }\n .pcb-boundary { fill: none; stroke: #fff; stroke-width: 0.3; }\n .pcb-silkscreen { fill: none; }\n .pcb-silkscreen-top { stroke: #f2eda1; }\n .pcb-silkscreen-bottom { stroke: #f2eda1; }\n .pcb-silkscreen-text { fill: #f2eda1; }\n `,\n },\n ],\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n },\n createSvgObjectFromPcbBoundary(transform, minX, minY, maxX, maxY),\n ...svgObjects,\n ].filter((child): child is SvgObject => child !== null),\n }\n\n try {\n return stringify(svgObject as SvgObject)\n } catch (error) {\n console.error(\"Error stringifying SVG object:\", error)\n throw error\n }\n\n function updateBounds(center: any, width: any, height: any) {\n const halfWidth = width / 2\n const halfHeight = height / 2\n minX = Math.min(minX, center.x - halfWidth)\n minY = Math.min(minY, center.y - halfHeight)\n maxX = Math.max(maxX, center.x + halfWidth)\n maxY = Math.max(maxY, center.y + halfHeight)\n }\n\n function updateBoundsToIncludeOutline(outline: Point[]) {\n for (const point of outline) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n\n function updateTraceBounds(route: any[]) {\n for (const point of route) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n}\n\nfunction createSvgObjects(\n elm: AnyCircuitElement,\n transform: Matrix,\n soup: AnyCircuitElement[],\n shouldDrawErrors?: boolean,\n): SvgObject[] {\n switch (elm.type) {\n case \"pcb_trace_error\":\n return createSvgObjectsFromPcbTraceError(\n elm,\n transform,\n soup,\n shouldDrawErrors,\n ).filter(Boolean)\n case \"pcb_component\":\n return [createSvgObjectsFromPcbComponent(elm, transform)].filter(Boolean)\n case \"pcb_trace\":\n return createSvgObjectsFromPcbTrace(elm, transform)\n case \"pcb_plated_hole\":\n return createSvgObjectsFromPcbPlatedHole(elm, transform).filter(Boolean)\n case \"pcb_hole\":\n return createSvgObjectsFromPcbHole(elm, transform)\n case \"pcb_smtpad\":\n return createSvgObjectsFromSmtPad(elm, transform)\n case \"pcb_silkscreen_text\":\n return createSvgObjectsFromPcbSilkscreenText(elm, transform)\n case \"pcb_fabrication_note_path\":\n return createSvgObjectsFromPcbFabricationNotePath(elm, transform)\n case \"pcb_fabrication_note_text\":\n return createSvgObjectsFromPcbFabricationNoteText(elm, transform)\n case \"pcb_silkscreen_path\":\n return createSvgObjectsFromPcbSilkscreenPath(elm, transform)\n case \"pcb_board\":\n return createSvgObjectsFromPcbBoard(elm, transform)\n case \"pcb_via\":\n return createSvgObjectsFromPcbVia(elm, transform)\n default:\n return []\n }\n}\n\nfunction createSvgObjectsFromPcbComponent(component: any, transform: any): any {\n const { center, width, height, rotation = 0 } = component\n const [x, y] = applyToPoint(transform, [center.x, center.y])\n const scaledWidth = width * Math.abs(transform.a)\n const scaledHeight = height * Math.abs(transform.d)\n const transformStr = `translate(${x}, ${y}) rotate(${-rotation}) scale(1, -1)`\n\n return {\n name: \"g\",\n type: \"element\",\n attributes: { transform: transformStr },\n children: [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component-outline\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n ],\n }\n}\n\nfunction createSvgObjectFromPcbBoundary(\n transform: any,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n): SvgObject {\n const [x1, y1] = applyToPoint(transform, [minX, minY])\n const [x2, y2] = applyToPoint(transform, [maxX, maxY])\n const width = Math.abs(x2 - x1)\n const height = Math.abs(y2 - y1)\n const x = Math.min(x1, x2)\n const y = Math.min(y1, y2)\n return {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-boundary\",\n x: x.toString(),\n y: y.toString(),\n width: width.toString(),\n height: height.toString(),\n },\n }\n}\n\n/**\n * @deprecated use `convertCircuitJsonToPcbSvg` instead\n */\nexport const circuitJsonToPcbSvg = convertCircuitJsonToPcbSvg\n","import type { PcbTraceError, PcbPort, AnyCircuitElement } from \"circuit-json\"\nimport type { SvgObject } from \"../../../lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbTraceError(\n pcbTraceError: PcbTraceError,\n transform: Matrix,\n circuitJson: AnyCircuitElement[],\n shouldDrawErrors?: boolean,\n): SvgObject[] {\n if (!shouldDrawErrors) return []\n const { pcb_port_ids } = pcbTraceError\n\n const port1 = circuitJson.find(\n (el): el is PcbPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[0],\n )\n const port2 = circuitJson.find(\n (el): el is PcbPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[1],\n )\n\n if (!port1 || !port2) return []\n\n const screenPort1 = applyToPoint(transform, {\n x: port1.x,\n y: port1.y,\n })\n const screenPort2 = applyToPoint(transform, {\n x: port2.x,\n y: port2.y,\n })\n\n const errorCenter = {\n x: (screenPort1.x + screenPort2.x) / 2,\n y: (screenPort1.y + screenPort2.y) / 2,\n }\n\n if (\n isNaN(screenPort1.x) ||\n isNaN(screenPort1.y) ||\n isNaN(screenPort2.x) ||\n isNaN(screenPort2.y) ||\n isNaN(errorCenter.x) ||\n isNaN(errorCenter.y)\n ) {\n return []\n }\n\n const svgObjects: SvgObject[] = [\n {\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: screenPort1.x.toString(),\n y1: screenPort1.y.toString(),\n x2: errorCenter.x.toString(),\n y2: errorCenter.y.toString(),\n stroke: \"red\",\n \"stroke-width\": \"1.5\",\n \"stroke-dasharray\": \"2,2\",\n },\n children: [],\n value: \"\",\n },\n {\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: errorCenter.x.toString(),\n y1: errorCenter.y.toString(),\n x2: screenPort2.x.toString(),\n y2: screenPort2.y.toString(),\n stroke: \"red\",\n \"stroke-width\": \"1.5\",\n \"stroke-dasharray\": \"2,2\",\n },\n children: [],\n value: \"\",\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n x: (errorCenter.x - 5).toString(),\n y: (errorCenter.y - 5).toString(),\n width: \"10\",\n height: \"10\",\n fill: \"red\",\n transform: `rotate(45 ${errorCenter.x} ${errorCenter.y})`,\n },\n children: [],\n value: \"\",\n },\n {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: errorCenter.x.toString(),\n y: (errorCenter.y - 15).toString(),\n fill: \"red\",\n \"font-family\": \"sans-serif\",\n \"font-size\": \"12\",\n \"text-anchor\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: pcbTraceError.message || \"Pcb Trace Error\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n },\n ]\n\n return svgObjects\n}\n","import type { PcbSilkscreenPath, PcbFabricationNotePath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbFabricationNotePath(\n fabNotePath: PcbFabricationNotePath,\n transform: Matrix,\n): SvgObject[] {\n if (!fabNotePath.route || !Array.isArray(fabNotePath.route)) return []\n\n // Close the path if the first and last points are the same\n const firstPoint = fabNotePath.route[0]\n const lastPoint = fabNotePath.route[fabNotePath.route.length - 1]\n const isClosed =\n firstPoint!.x === lastPoint!.x && firstPoint!.y === lastPoint!.y\n\n const path =\n fabNotePath.route\n .slice(0, isClosed ? -1 : undefined)\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \") + (isClosed ? \" Z\" : \"\")\n\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-fabrication-note-path\",\n stroke: fabNotePath.color || \"rgba(255,255,255,0.5)\",\n fill: \"none\",\n d: path,\n \"stroke-width\": (\n fabNotePath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": fabNotePath.pcb_component_id,\n \"data-pcb-fabrication-note-path-id\":\n fabNotePath.pcb_fabrication_note_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbFabricationNoteText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { toString as matrixToString } from \"transformation-matrix\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbFabricationNoteText(\n pcbFabNoteText: PcbFabricationNoteText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n anchor_alignment,\n text,\n font_size = 1,\n layer = \"top\",\n color,\n } = pcbFabNoteText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY), // TODO do anchor_alignment\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: \"pcb-fabrication-note-text\",\n fill: color || \"rgba(255,255,255,0.5)\",\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","import type { PCBPlatedHole } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbPlatedHole(\n hole: PCBPlatedHole,\n transform: any,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.shape === \"pill\") {\n const scaledOuterWidth = hole.outer_width * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_height * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_height * Math.abs(transform.a)\n\n const outerRadiusX = scaledOuterWidth / 2\n const outerRadiusY = scaledOuterHeight / 2\n const innerRadiusX = scaledHoleWidth / 2\n const innerRadiusY = scaledHoleHeight / 2\n const straightLength = scaledOuterHeight - scaledOuterWidth\n\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n // Outer pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n d:\n `M${x - outerRadiusX},${y - straightLength / 2} ` +\n `v${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 ${scaledOuterWidth},0 ` +\n `v-${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 -${scaledOuterWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n // Inner pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n d:\n `M${x - innerRadiusX},${y - (scaledHoleHeight - scaledHoleWidth) / 2} ` +\n `v${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 ${scaledHoleWidth},0 ` +\n `v-${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 -${scaledHoleWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n // Fallback to circular hole if not pill-shaped\n if (hole.shape === \"circle\") {\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n return []\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbSilkscreenPath(\n silkscreenPath: PcbSilkscreenPath,\n transform: Matrix,\n): SvgObject[] {\n if (!silkscreenPath.route || !Array.isArray(silkscreenPath.route)) return []\n\n let path = silkscreenPath.route\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n\n // Close the path if the first and last points match\n const firstPoint = silkscreenPath.route[0]\n const lastPoint = silkscreenPath.route[silkscreenPath.route.length - 1]\n if (\n firstPoint &&\n lastPoint &&\n firstPoint.x === lastPoint.x &&\n firstPoint.y === lastPoint.y\n ) {\n path += \" Z\"\n }\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: `pcb-silkscreen pcb-silkscreen-${silkscreenPath.layer}`,\n d: path,\n \"stroke-width\": (\n silkscreenPath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": silkscreenPath.pcb_component_id,\n \"data-pcb-silkscreen-path-id\": silkscreenPath.pcb_silkscreen_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n toString as matrixToString,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbSilkscreenText(\n pcbSilkscreenText: PcbSilkscreenText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n text,\n font_size = 1,\n layer = \"top\",\n } = pcbSilkscreenText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY),\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: `pcb-silkscreen-text pcb-silkscreen-${layer}`,\n \"data-pcb-silkscreen-text-id\": pcbSilkscreenText.pcb_component_id,\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","/**\n * Return pairs of adjacent elements in an array.\n */\nexport function pairs<T>(arr: Array<T>): Array<[T, T]> {\n const result: Array<[T, T]> = []\n for (let i = 0; i < arr.length - 1; i++) {\n result.push([arr[i]!, arr[i + 1]!])\n }\n return result\n}\n","import type { PCBTrace } from \"circuit-json\"\nimport { pairs } from \"lib/utils/pairs\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { LAYER_NAME_TO_COLOR } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromPcbTrace(\n trace: PCBTrace,\n transform: Matrix,\n): SvgObject[] {\n if (!trace.route || !Array.isArray(trace.route) || trace.route.length < 2)\n return []\n\n const segments = pairs(trace.route)\n const svgObjects: SvgObject[] = []\n\n for (const [start, end] of segments) {\n const startPoint = applyToPoint(transform, [start.x, start.y])\n const endPoint = applyToPoint(transform, [end.x, end.y])\n\n const layer =\n \"layer\" in start ? start.layer : \"layer\" in end ? end.layer : null\n if (!layer) continue\n\n const layerColor =\n LAYER_NAME_TO_COLOR[layer as keyof typeof LAYER_NAME_TO_COLOR] ?? \"white\"\n\n const traceWidth =\n \"width\" in start ? start.width : \"width\" in end ? end.width : null\n\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-trace\",\n stroke: layerColor,\n d: `M ${startPoint[0]} ${startPoint[1]} L ${endPoint[0]} ${endPoint[1]}`,\n \"stroke-width\": traceWidth\n ? (traceWidth * Math.abs(transform.a)).toString()\n : \"0.3\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"shape-rendering\": \"crispEdges\",\n },\n })\n }\n return svgObjects\n}\n","/**\n * TODO use @tscircuit/pcb-colors when it's published\n */\nexport const LAYER_NAME_TO_COLOR = {\n top: \"rgb(200, 52, 52)\",\n bottom: \"rgb(77, 127, 196)\",\n}\n\nexport function layerNameToColor(layerName: string) {\n return (\n LAYER_NAME_TO_COLOR[layerName as keyof typeof LAYER_NAME_TO_COLOR] ??\n \"white\"\n )\n}\n","import type { PCBSMTPad } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { layerNameToColor } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromSmtPad(\n pad: PCBSMTPad,\n transform: Matrix,\n): any {\n const [x, y] = applyToPoint(transform, [pad.x, pad.y])\n\n if (pad.shape === \"rect\") {\n const width = pad.width * Math.abs(transform.a)\n const height = pad.height * Math.abs(transform.d)\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-pad\",\n fill: layerNameToColor(pad.layer),\n x: (x - width / 2).toString(),\n y: (y - height / 2).toString(),\n width: width.toString(),\n height: height.toString(),\n },\n },\n ]\n }\n // TODO implement smtpad circles/ovals etc.\n return []\n}\n","import type { PCBBoard, Point } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbBoard(\n pcbBoard: PCBBoard,\n transform: Matrix,\n): SvgObject[] {\n const { width, height, center, outline } = pcbBoard\n\n let path: string\n if (outline && Array.isArray(outline) && outline.length >= 3) {\n path = outline\n .map((point: Point, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n } else {\n const halfWidth = width / 2\n const halfHeight = height / 2\n\n const topLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y - halfHeight,\n ])\n const topRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y - halfHeight,\n ])\n const bottomRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y + halfHeight,\n ])\n const bottomLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y + halfHeight,\n ])\n\n path =\n `M ${topLeft[0]} ${topLeft[1]} ` +\n `L ${topRight[0]} ${topRight[1]} ` +\n `L ${bottomRight[0]} ${bottomRight[1]} ` +\n `L ${bottomLeft[0]} ${bottomLeft[1]}`\n }\n\n path += \" Z\"\n\n return [\n {\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-board\",\n d: path,\n stroke: \"rgba(255, 255, 255, 0.5)\",\n \"stroke-width\": (0.1 * Math.abs(transform.a)).toString(),\n },\n },\n ]\n}\n","import type { PCBVia } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbVia(hole: PCBVia, transform: any): any {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n },\n ],\n }\n}\n","import type { PCBHole } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { HOLE_COLOR } from \"../colors\"\n\nexport function createSvgObjectsFromPcbHole(\n hole: PCBHole,\n transform: Matrix,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.hole_shape === \"circle\" || hole.hole_shape === \"square\") {\n const scaledDiameter = hole.hole_diameter * Math.abs(transform.a)\n const radius = scaledDiameter / 2\n\n if (hole.hole_shape === \"circle\") {\n return [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n r: radius.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n // Square hole\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n x: (x - radius).toString(),\n y: (y - radius).toString(),\n width: scaledDiameter.toString(),\n height: scaledDiameter.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n if (hole.hole_shape === \"oval\") {\n const scaledWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHeight = hole.hole_height * Math.abs(transform.a)\n const rx = scaledWidth / 2\n const ry = scaledHeight / 2\n\n return [\n {\n name: \"ellipse\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n rx: rx.toString(),\n ry: ry.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n\n return []\n}\n","export const HOLE_COLOR = \"#FF26E2\"\n","// Kicad-2020 color scheme\nexport const colorMap = {\n \"3d_viewer\": {\n background_bottom: \"rgb(102, 102, 128)\",\n background_top: \"rgb(204, 204, 230)\",\n board: \"rgb(51, 43, 23)\",\n copper: \"rgb(179, 156, 0)\",\n silkscreen_bottom: \"rgb(230, 230, 230)\",\n silkscreen_top: \"rgb(230, 230, 230)\",\n soldermask: \"rgb(20, 51, 36)\",\n solderpaste: \"rgb(128, 128, 128)\",\n },\n board: {\n anchor: \"rgb(255, 38, 226)\",\n aux_items: \"rgb(255, 255, 255)\",\n b_adhes: \"rgb(0, 0, 132)\",\n b_crtyd: \"rgb(255, 38, 226)\",\n b_fab: \"rgb(88, 93, 132)\",\n b_mask: \"rgba(2, 255, 238, 0.400)\",\n b_paste: \"rgb(0, 194, 194)\",\n b_silks: \"rgb(232, 178, 167)\",\n background: \"rgb(0, 16, 35)\",\n cmts_user: \"rgb(89, 148, 220)\",\n copper: {\n b: \"rgb(77, 127, 196)\",\n f: \"rgb(200, 52, 52)\",\n in1: \"rgb(127, 200, 127)\",\n in10: \"rgb(237, 124, 51)\",\n in11: \"rgb(91, 195, 235)\",\n in12: \"rgb(247, 111, 142)\",\n in13: \"rgb(167, 165, 198)\",\n in14: \"rgb(40, 204, 217)\",\n in15: \"rgb(232, 178, 167)\",\n in16: \"rgb(242, 237, 161)\",\n in17: \"rgb(237, 124, 51)\",\n in18: \"rgb(91, 195, 235)\",\n in19: \"rgb(247, 111, 142)\",\n in2: \"rgb(206, 125, 44)\",\n in20: \"rgb(167, 165, 198)\",\n in21: \"rgb(40, 204, 217)\",\n in22: \"rgb(232, 178, 167)\",\n in23: \"rgb(242, 237, 161)\",\n in24: \"rgb(237, 124, 51)\",\n in25: \"rgb(91, 195, 235)\",\n in26: \"rgb(247, 111, 142)\",\n in27: \"rgb(167, 165, 198)\",\n in28: \"rgb(40, 204, 217)\",\n in29: \"rgb(232, 178, 167)\",\n in3: \"rgb(79, 203, 203)\",\n in30: \"rgb(242, 237, 161)\",\n in4: \"rgb(219, 98, 139)\",\n in5: \"rgb(167, 165, 198)\",\n in6: \"rgb(40, 204, 217)\",\n in7: \"rgb(232, 178, 167)\",\n in8: \"rgb(242, 237, 161)\",\n in9: \"rgb(141, 203, 129)\",\n },\n cursor: \"rgb(255, 255, 255)\",\n drc: \"rgb(194, 194, 194)\",\n drc_error: \"rgba(215, 91, 107, 0.800)\",\n drc_exclusion: \"rgb(255, 255, 255)\",\n drc_warning: \"rgba(255, 208, 66, 0.902)\",\n dwgs_user: \"rgb(194, 194, 194)\",\n eco1_user: \"rgb(180, 219, 210)\",\n eco2_user: \"rgb(216, 200, 82)\",\n edge_cuts: \"rgb(208, 210, 205)\",\n f_adhes: \"rgb(132, 0, 132)\",\n f_crtyd: \"rgb(255, 0, 245)\",\n f_fab: \"rgb(175, 175, 175)\",\n f_mask: \"rgba(216, 100, 255, 0.400)\",\n f_paste: \"rgba(180, 160, 154, 0.902)\",\n f_silks: \"rgb(242, 237, 161)\",\n footprint_text_back: \"rgb(0, 0, 132)\",\n footprint_text_front: \"rgb(194, 194, 194)\",\n footprint_text_invisible: \"rgb(132, 132, 132)\",\n grid: \"rgb(132, 132, 132)\",\n grid_axes: \"rgb(194, 194, 194)\",\n margin: \"rgb(255, 38, 226)\",\n microvia: \"rgb(0, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n pad_back: \"rgb(77, 127, 196)\",\n pad_front: \"rgb(200, 52, 52)\",\n pad_plated_hole: \"rgb(194, 194, 0)\",\n pad_through_hole: \"rgb(227, 183, 46)\",\n plated_hole: \"rgb(26, 196, 210)\",\n ratsnest: \"rgba(245, 255, 213, 0.702)\",\n select_overlay: \"rgb(4, 255, 67)\",\n through_via: \"rgb(236, 236, 236)\",\n user_1: \"rgb(194, 194, 194)\",\n user_2: \"rgb(89, 148, 220)\",\n user_3: \"rgb(180, 219, 210)\",\n user_4: \"rgb(216, 200, 82)\",\n user_5: \"rgb(194, 194, 194)\",\n user_6: \"rgb(89, 148, 220)\",\n user_7: \"rgb(180, 219, 210)\",\n user_8: \"rgb(216, 200, 82)\",\n user_9: \"rgb(232, 178, 167)\",\n via_blind_buried: \"rgb(187, 151, 38)\",\n via_hole: \"rgb(227, 183, 46)\",\n via_micro: \"rgb(0, 132, 132)\",\n via_through: \"rgb(236, 236, 236)\",\n worksheet: \"rgb(200, 114, 171)\",\n },\n gerbview: {\n axes: \"rgb(0, 0, 132)\",\n background: \"rgb(0, 0, 0)\",\n dcodes: \"rgb(255, 255, 255)\",\n grid: \"rgb(132, 132, 132)\",\n layers: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n ],\n negative_objects: \"rgb(132, 132, 132)\",\n worksheet: \"rgb(0, 0, 132)\",\n },\n meta: {\n filename: \"kicad_2020\",\n name: \"KiCad 2020\",\n version: 2,\n },\n palette: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n ],\n schematic: {\n aux_items: \"rgb(46, 46, 46)\",\n background: \"rgb(245, 241, 237)\",\n brightened: \"rgb(255, 0, 255)\",\n bus: \"rgb(0, 0, 132)\",\n bus_junction: \"rgb(0, 0, 132)\",\n component_body: \"rgb(255, 255, 194)\",\n component_outline: \"rgb(132, 0, 0)\",\n cursor: \"rgb(15, 15, 15)\",\n erc_error: \"rgba(230, 9, 13, 0.800)\",\n erc_warning: \"rgba(209, 146, 0, 0.800)\",\n fields: \"rgb(132, 0, 132)\",\n grid: \"rgb(181, 181, 181)\",\n grid_axes: \"rgb(0, 0, 132)\",\n hidden: \"rgb(194, 194, 194)\",\n junction: \"rgb(0, 150, 0)\",\n label_global: \"rgb(132, 0, 0)\",\n label_hier: \"rgb(114, 86, 0)\",\n label_local: \"rgb(15, 15, 15)\",\n net_name: \"rgb(132, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n note: \"rgb(0, 0, 194)\",\n override_item_colors: false,\n pin: \"rgb(132, 0, 0)\",\n pin_name: \"rgb(0, 100, 100)\",\n pin_number: \"rgb(169, 0, 0)\",\n reference: \"rgb(0, 100, 100)\",\n shadow: \"rgba(102, 179, 255, 0.800)\",\n sheet: \"rgb(132, 0, 0)\",\n sheet_background: \"rgba(253, 255, 231, 0.000)\",\n sheet_fields: \"rgb(132, 0, 132)\",\n sheet_filename: \"rgb(114, 86, 0)\",\n sheet_label: \"rgb(0, 100, 100)\",\n sheet_name: \"rgb(0, 100, 100)\",\n value: \"rgb(0, 100, 100)\",\n wire: \"rgb(0, 150, 0)\",\n wire_crossing: \"rgb(30, 180, 30)\",\n worksheet: \"rgb(132, 0, 0)\",\n },\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { stringify } from \"svgson\"\nimport {\n applyToPoint,\n compose,\n scale,\n translate,\n fromTriangles,\n type Matrix,\n fromTwoMovingPoints,\n} from \"transformation-matrix\"\nimport { drawSchematicGrid } from \"./draw-schematic-grid\"\nimport { drawSchematicLabeledPoints } from \"./draw-schematic-labeled-points\"\nimport { getSchematicBoundsFromCircuitJson } from \"./get-schematic-bounds-from-circuit-json\"\nimport { createSvgObjectsFromSchematicComponent } from \"./svg-object-fns/create-svg-objects-from-sch-component\"\nimport { createSvgObjectsFromSchDebugObject } from \"./svg-object-fns/create-svg-objects-from-sch-debug-object\"\nimport { createSchematicTrace } from \"./svg-object-fns/create-svg-objects-from-sch-trace\"\nimport { createSvgObjectsForSchNetLabel } from \"./svg-object-fns/create-svg-objects-for-sch-net-label\"\n\ninterface Options {\n width?: number\n height?: number\n grid?: boolean | { cellSize?: number; labelCells?: boolean }\n labeledPoints?: Array<{ x: number; y: number; label: string }>\n}\n\nexport function convertCircuitJsonToSchematicSvg(\n circuitJson: AnyCircuitElement[],\n options?: Options,\n): string {\n // Get bounds with padding\n const realBounds = getSchematicBoundsFromCircuitJson(circuitJson)\n const realWidth = realBounds.maxX - realBounds.minX\n const realHeight = realBounds.maxY - realBounds.minY\n\n const svgWidth = options?.width ?? 1200\n const svgHeight = options?.height ?? 600\n\n // Compute the padding such that we maintain the same aspect ratio\n const circuitAspectRatio = realWidth / realHeight\n const containerAspectRatio = svgWidth / svgHeight\n\n let screenPaddingPx: { x: number; y: number }\n if (circuitAspectRatio > containerAspectRatio) {\n // Circuit is wider than container - fit to width\n const newHeight = svgWidth / circuitAspectRatio\n screenPaddingPx = {\n x: 0,\n y: (svgHeight - newHeight) / 2,\n }\n } else {\n // Circuit is taller than container - fit to height\n const newWidth = svgHeight * circuitAspectRatio\n screenPaddingPx = {\n x: (svgWidth - newWidth) / 2,\n y: 0,\n }\n }\n\n // Calculate projection using REAL points and SCREEN points\n // We're saying to map the real bounds to the screen bounds by giving 3 points\n // for each coordinate space\n const transform = fromTriangles(\n [\n { x: realBounds.minX, y: realBounds.maxY },\n { x: realBounds.maxX, y: realBounds.maxY },\n { x: realBounds.maxX, y: realBounds.minY },\n ],\n [\n { x: screenPaddingPx.x, y: screenPaddingPx.y },\n { x: svgWidth - screenPaddingPx.x, y: screenPaddingPx.y },\n { x: svgWidth - screenPaddingPx.x, y: svgHeight - screenPaddingPx.y },\n ],\n )\n const svgChildren: SvgObject[] = []\n\n // Add background rectangle\n svgChildren.push({\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n children: [],\n value: \"\",\n })\n\n // Add grid if enabled\n if (options?.grid) {\n const gridConfig = typeof options.grid === \"object\" ? options.grid : {}\n svgChildren.push(\n drawSchematicGrid({ bounds: realBounds, transform, ...gridConfig }),\n )\n }\n\n const schDebugObjectSvgs: SvgObject[] = []\n const schComponentSvgs: SvgObject[] = []\n const schTraceSvgs: SvgObject[] = []\n const schNetLabel: SvgObject[] = []\n\n for (const elm of circuitJson) {\n if (elm.type === \"schematic_debug_object\") {\n schDebugObjectSvgs.push(\n ...createSvgObjectsFromSchDebugObject(elm, transform),\n )\n } else if (elm.type === \"schematic_component\") {\n schComponentSvgs.push(\n ...createSvgObjectsFromSchematicComponent({\n component: elm,\n transform,\n circuitJson,\n }),\n )\n } else if (elm.type === \"schematic_trace\") {\n schTraceSvgs.push(...createSchematicTrace(elm, transform))\n } else if (elm.type === \"schematic_net_label\") {\n schNetLabel.push(...createSvgObjectsForSchNetLabel(elm, transform))\n }\n }\n\n // Add elements in correct order\n svgChildren.push(\n ...schDebugObjectSvgs,\n ...schComponentSvgs,\n ...schTraceSvgs,\n ...schNetLabel,\n )\n\n // Add labeled points if provided\n if (options?.labeledPoints) {\n svgChildren.push(\n drawSchematicLabeledPoints({\n points: options.labeledPoints,\n transform,\n }),\n )\n }\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n style: `background-color: ${colorMap.schematic.background}`,\n },\n children: [\n // Add styles\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n\n // DO NOT USE THESE CLASSES!!!!\n // PUT STYLES IN THE SVG OBJECTS THEMSELVES\n value: `\n .boundary { fill: ${colorMap.schematic.background}; }\n .schematic-boundary { fill: none; stroke: #fff; }\n .component { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .chip { fill: ${colorMap.schematic.component_body}; stroke: ${colorMap.schematic.component_outline}; }\n .component-pin { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .trace { stroke: ${colorMap.schematic.wire}; }\n .text { font-family: sans-serif; fill: ${colorMap.schematic.wire}; }\n .pin-number { fill: ${colorMap.schematic.pin_number}; }\n .port-label { fill: ${colorMap.schematic.reference}; }\n .component-name { fill: ${colorMap.schematic.reference}; }\n `,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ...svgChildren,\n ],\n value: \"\",\n }\n\n return stringify(svgObject)\n}\n\n/**\n * @deprecated use `convertCircuitJsonToSchematicSvg` instead\n */\nexport const circuitJsonToSchematicSvg = convertCircuitJsonToSchematicSvg\n","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function drawSchematicGrid(params: {\n bounds: {\n minX: number\n minY: number\n maxX: number\n maxY: number\n }\n transform: Matrix\n cellSize?: number\n labelCells?: boolean\n}): SvgObject {\n const { minX, minY, maxX, maxY } = params.bounds\n const cellSize = params.cellSize ?? 1\n const labelCells = params.labelCells ?? false\n const gridLines: any[] = []\n\n // Helper function to transform points\n const transformPoint = (x: number, y: number) => {\n const [transformedX, transformedY] = applyToPoint(params.transform, [x, y])\n return { x: transformedX, y: transformedY }\n }\n\n // Vertical lines\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n const start = transformPoint(x, minY)\n const end = transformPoint(x, maxY)\n\n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Horizontal lines\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const start = transformPoint(minX, y)\n const end = transformPoint(maxX, y)\n\n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Add cell labels if enabled\n if (labelCells) {\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const point = transformPoint(x, y)\n\n gridLines.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: (point.x - 2.5).toString(),\n y: (point.y - 5).toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": (\n (cellSize / 5) *\n Math.abs(params.transform.a)\n ).toString(),\n \"fill-opacity\": \"0.5\",\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": \"sans-serif\",\n },\n children: [\n {\n type: \"text\",\n value: `${x},${y}`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n }\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"grid\" },\n children: gridLines,\n }\n}\n","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\ninterface LabeledPoint {\n x: number\n y: number\n label?: string\n}\n\nexport function drawSchematicLabeledPoints(params: {\n points: LabeledPoint[]\n transform: Matrix\n}): SvgObject {\n const { points, transform } = params\n const labeledPointsGroup: any[] = []\n\n for (const point of points) {\n // Transform offset points for X marker\n const [x1, y1] = applyToPoint(transform, [point.x - 0.1, point.y - 0.1])\n const [x2, y2] = applyToPoint(transform, [point.x + 0.1, point.y + 0.1])\n const [x3, y3] = applyToPoint(transform, [point.x - 0.1, point.y + 0.1])\n const [x4, y4] = applyToPoint(transform, [point.x + 0.1, point.y - 0.1])\n\n // Add X marker\n labeledPointsGroup.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M${x1},${y1} L${x2},${y2} M${x3},${y3} L${x4},${y4}`,\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-opacity\": \"0.7\",\n },\n })\n\n // Transform label position\n const [labelX, labelY] = applyToPoint(transform, [\n point.x + 0.15,\n point.y - 0.15,\n ])\n\n // Add label\n labeledPointsGroup.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: labelX.toString(),\n y: labelY.toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": (0.1 * Math.abs(transform.a)).toString(),\n \"fill-opacity\": \"0.7\",\n \"text-anchor\": \"start\",\n \"font-family\": \"sans-serif\",\n \"dominant-baseline\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: point.label || `(${point.x},${point.y})`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"labeled-points\" },\n children: labeledPointsGroup,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\ninterface Bounds {\n minX: number\n minY: number\n maxX: number\n maxY: number\n}\n\nexport function getSchematicBoundsFromCircuitJson(\n soup: AnyCircuitElement[],\n padding = 0.5,\n): Bounds {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n const portSize = 0.2\n\n // Find the bounds\n for (const item of soup) {\n if (item.type === \"schematic_component\") {\n updateBounds(item.center, item.size, item.rotation || 0)\n } else if (item.type === \"schematic_port\") {\n updateBounds(item.center, { width: portSize, height: portSize }, 0)\n } else if (item.type === \"schematic_debug_object\") {\n if (item.shape === \"rect\") {\n updateBounds(item.center, item.size, 0)\n } else if (item.shape === \"line\") {\n updateBounds(item.start, { width: 0.1, height: 0.1 }, 0)\n updateBounds(item.end, { width: 0.1, height: 0.1 }, 0)\n }\n } else if (item.type === \"schematic_net_label\") {\n updateBounds(item.center, { width: 1, height: 1 }, 0)\n }\n }\n\n // Add padding to bounds\n minX -= padding\n minY -= padding\n maxX += padding\n maxY += padding\n\n return { minX, minY, maxX, maxY }\n\n function updateBounds(center: any, size: any, rotation: number) {\n const corners = [\n { x: -size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: size.height / 2 },\n { x: -size.width / 2, y: size.height / 2 },\n ]\n\n for (const corner of corners) {\n const rotatedX =\n corner.x * Math.cos(rotation) - corner.y * Math.sin(rotation) + center.x\n const rotatedY =\n corner.x * Math.sin(rotation) + corner.y * Math.cos(rotation) + center.y\n minX = Math.min(minX, rotatedX)\n minY = Math.min(minY, rotatedY)\n maxX = Math.max(maxX, rotatedX)\n maxY = Math.max(maxY, rotatedY)\n }\n }\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSvg, symbols, type SchSymbol } from \"schematic-symbols\"\nimport { parseSync } from \"svgson\"\nimport {\n applyToPoint,\n compose,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { matchSchPortsToSymbolPorts } from \"lib/utils/match-sch-ports-with-symbol-ports\"\nimport { pointPairsToMatrix } from \"lib/utils/point-pairs-to-matrix\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport type { TextPrimitive } from \"schematic-symbols\"\nimport { createSvgSchErrorText } from \"./create-svg-error-text\"\n\nconst ninePointAnchorToTextAnchor: Record<\n TextPrimitive[\"anchor\"],\n \"middle\" | \"start\" | \"end\"\n> = {\n top_left: \"start\",\n top_right: \"end\",\n middle_left: \"start\",\n middle_right: \"end\",\n bottom_left: \"start\",\n bottom_right: \"end\",\n center: \"middle\",\n middle_top: \"middle\",\n middle_bottom: \"middle\",\n}\n\nconst ninePointAnchorToDominantBaseline: Record<\n TextPrimitive[\"anchor\"],\n \"auto\" | \"hanging\" | \"middle\"\n> = {\n top_left: \"auto\",\n top_right: \"auto\",\n bottom_left: \"hanging\",\n bottom_right: \"hanging\",\n center: \"auto\",\n middle_left: \"middle\",\n middle_right: \"middle\",\n middle_top: \"auto\",\n middle_bottom: \"hanging\",\n}\n\nexport const createSvgObjectsFromSchematicComponentWithSymbol = ({\n component: schComponent,\n transform: realToScreenTransform,\n circuitJson,\n}: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n\n const symbol: SchSymbol = (symbols as any)[schComponent.symbol_name!]\n\n if (!symbol) {\n return [\n createSvgSchErrorText({\n text: `Symbol not found: ${schComponent.symbol_name}`,\n realCenter: schComponent.center,\n realToScreenTransform,\n }),\n ]\n }\n\n const schPorts = su(circuitJson as any).schematic_port.list({\n schematic_component_id: schComponent.schematic_component_id,\n }) as SchematicPort[]\n\n const srcComponent = su(circuitJson as any).source_component.get(\n schComponent.source_component_id,\n )\n // Match schPorts to symbol ports using angle from schematic component center\n const schPortsWithSymbolPorts = matchSchPortsToSymbolPorts({\n schPorts,\n symbol,\n schComponent,\n })\n\n if (!schPortsWithSymbolPorts[0]) {\n return [\n createSvgSchErrorText({\n text: `Could not match ports for symbol ${schComponent.symbol_name}`,\n realCenter: schComponent.center,\n realToScreenTransform,\n }),\n ]\n }\n\n const transformFromSymbolToReal = pointPairsToMatrix(\n schPortsWithSymbolPorts[1]?.symbolPort ?? symbol.center,\n schPortsWithSymbolPorts[1]?.schPort.center ?? schComponent.center,\n schPortsWithSymbolPorts[0].symbolPort,\n schPortsWithSymbolPorts[0].schPort.center,\n )\n\n const paths = symbol.primitives.filter((p) => p.type === \"path\")\n const texts = symbol.primitives.filter((p) => p.type === \"text\")\n const circles = symbol.primitives.filter((p) => p.type === \"circle\")\n const boxes = symbol.primitives.filter((p) => p.type === \"box\")\n\n for (const path of paths) {\n const { points, color, closed, fill } = path\n svgObjects.push({\n type: \"element\",\n name: \"path\",\n attributes: {\n d:\n points\n .map((p, i) => {\n const [x, y] = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n [p.x, p.y],\n )\n return `${i === 0 ? \"M\" : \"L\"} ${x} ${y}`\n })\n .join(\" \") + (closed ? \" Z\" : \"\"),\n stroke: colorMap.schematic.component_outline,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(realToScreenTransform)}px`,\n },\n value: \"\",\n children: [],\n })\n }\n\n for (const text of texts) {\n const screenTextPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n text,\n )\n let textValue = \"\"\n if (text.text === \"{REF}\") {\n textValue = srcComponent?.name ?? \"\"\n } else if (text.text === \"{VAL}\") {\n textValue = schComponent.symbol_display_value ?? \"\"\n }\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: screenTextPos.x.toString(),\n y: screenTextPos.y.toString(),\n \"dominant-baseline\": ninePointAnchorToDominantBaseline[text.anchor],\n \"text-anchor\": ninePointAnchorToTextAnchor[text.anchor],\n \"font-family\": \"sans-serif\",\n \"font-size\": `${getSchScreenFontSize(realToScreenTransform, \"reference_designator\")}px`,\n },\n value: \"\",\n children: [\n {\n type: \"text\",\n value: textValue,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n\n // Draw Boxes\n\n for (const box of boxes) {\n const screenBoxPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n box,\n )\n const symbolToScreenScale = compose(\n realToScreenTransform,\n transformFromSymbolToReal,\n ).a\n\n svgObjects.push({\n name: \"rect\",\n type: \"element\",\n attributes: {\n x: screenBoxPos.x.toString(),\n y: screenBoxPos.y.toString(),\n width: (box.width * symbolToScreenScale).toString(),\n height: (box.height * symbolToScreenScale).toString(),\n fill: \"red\",\n },\n value: \"\",\n children: [],\n })\n }\n\n // Draw Ports for debugging\n for (const port of symbol.ports) {\n const screenPortPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n port,\n )\n svgObjects.push({\n type: \"element\",\n name: \"circle\",\n attributes: {\n cx: screenPortPos.x.toString(),\n cy: screenPortPos.y.toString(),\n r: `${realToScreenTransform.a * 0.02}px`,\n fill: \"none\",\n stroke: colorMap.schematic.component_outline,\n },\n value: \"\",\n children: [],\n })\n }\n\n return svgObjects\n}\n","import type { Matrix } from \"transformation-matrix\"\n\n// 0.02mm -> 2px\nexport const getSchStrokeSize = (transform: Matrix) => {\n return Math.abs(transform.a) * 0.02\n}\n","import type { SchematicComponent, SchematicPort } from \"circuit-json\"\nimport type { SchSymbol } from \"schematic-symbols\"\n\n// export const matchSchPortsToSymbolPorts = ({\n// schPorts,\n// symbol,\n// schComponent,\n// }: {\n// schPorts: SchematicPort[]\n// schComponent: SchematicComponent\n// symbol: SchSymbol\n// }): Array<{\n// schPort: SchematicPort\n// symbolPort: SchSymbol[\"ports\"][number]\n// }> => {\n// // schPorts is Array<{ center: { x: number; y: number } }>\n// // schComponent.center is { x: number; y: number }\n// // symbol.ports is Array<{ x: number; y: number }>\n// // symbol.center is { x: number; y: number }\n// // Use the angles from the schComponent center to the schPorts to match with the angles from the symbol center to the symbol ports\n// // If a port isn't matched because there are more schPorts than symbolPorts (or vice versa), then the unmatched ports should be ignored (not returned)\n// }\n\n// Helper function to calculate smallest angular difference accounting for wraparound\nconst getAngularDifference = (angle1: number, angle2: number): number => {\n // Convert from [-π, π] to [0, 2π] for easier comparison\n const a1 = angle1 < 0 ? angle1 + 2 * Math.PI : angle1\n const a2 = angle2 < 0 ? angle2 + 2 * Math.PI : angle2\n\n // Calculate direct difference\n let diff = Math.abs(a1 - a2)\n // If the difference is greater than π, then the smaller angle is going the other way around\n if (diff > Math.PI) {\n diff = 2 * Math.PI - diff\n }\n return diff\n}\n\nexport const matchSchPortsToSymbolPorts = ({\n schPorts,\n symbol,\n schComponent,\n}: {\n schPorts: SchematicPort[]\n schComponent: SchematicComponent\n symbol: SchSymbol\n}): Array<{\n schPort: SchematicPort\n symbolPort: SchSymbol[\"ports\"][number]\n}> => {\n // Calculate angles for schematic ports\n const schPortAngles = schPorts.map((port) => {\n const dx = port.center.x - schComponent.center.x\n const dy = port.center.y - schComponent.center.y\n return {\n port,\n angle: Math.atan2(dy, dx),\n }\n })\n\n // Calculate angles for symbol ports\n const symbolPortAngles = symbol.ports.map((port) => {\n const dx = port.x - symbol.center.x\n const dy = port.y - symbol.center.y\n return {\n port,\n angle: Math.atan2(dy, dx),\n }\n })\n\n // Sort both arrays by angle to help with initial matching\n // Note: The sorting is less critical now that we handle wraparound properly\n schPortAngles.sort((a, b) => a.angle - b.angle)\n symbolPortAngles.sort((a, b) => a.angle - b.angle)\n\n const matches: Array<{\n schPort: SchematicPort\n symbolPort: SchSymbol[\"ports\"][number]\n }> = []\n\n // Keep track of used symbol ports to avoid duplicate matches\n const usedSymbolPorts = new Set<SchSymbol[\"ports\"][number]>()\n\n // For each schematic port, find the best matching symbol port\n for (const schPortAngle of schPortAngles) {\n let bestMatch: {\n symbolPort: SchSymbol[\"ports\"][number]\n angleDiff: number\n } | null = null\n\n // Compare against all available symbol ports\n for (const symbolPortAngle of symbolPortAngles) {\n // Skip if this symbol port is already matched\n if (usedSymbolPorts.has(symbolPortAngle.port)) continue\n\n const angleDiff = getAngularDifference(\n schPortAngle.angle,\n symbolPortAngle.angle,\n )\n\n if (bestMatch === null || angleDiff < bestMatch.angleDiff) {\n bestMatch = {\n symbolPort: symbolPortAngle.port,\n angleDiff,\n }\n }\n }\n\n // If we found a match and the angular difference is reasonable (e.g., less than 45 degrees)\n if (bestMatch && bestMatch.angleDiff < Math.PI / 4) {\n matches.push({\n schPort: schPortAngle.port,\n symbolPort: bestMatch.symbolPort,\n })\n usedSymbolPorts.add(bestMatch.symbolPort)\n }\n }\n\n return matches\n}\n","import { type Matrix, compose, scale, translate } from \"transformation-matrix\"\n\ntype Point = { x: number; y: number }\n\nexport function pointPairsToMatrix(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n): Matrix {\n // Calculate the translation based on the first point pair (A -> A')\n const tx = a2.x - a1.x\n const ty = a2.y - a1.y\n\n // Calculate scaling factors using the distances between points\n const originalDistance = Math.sqrt((b1.x - a1.x) ** 2 + (b1.y - a1.y) ** 2)\n const transformedDistance = Math.sqrt((b2.x - a2.x) ** 2 + (b2.y - a2.y) ** 2)\n\n const a = transformedDistance / originalDistance\n\n // Create and compose the transformations\n const translateMatrix = translate(tx, ty)\n const scaleMatrix = scale(a, a)\n\n return compose(translateMatrix, scaleMatrix)\n}\n","import type { Matrix } from \"transformation-matrix\"\nimport { applyToPoint } from \"transformation-matrix\"\n\ntype SchTextType =\n | \"pin_number\"\n | \"reference_designator\"\n | \"manufacturer_number\"\n | \"net_label\"\n | \"error\"\n\nexport const getSchMmFontSize = (textType: SchTextType) => {\n return textType === \"error\" ? 0.05 : textType === \"pin_number\" ? 0.15 : 0.18\n}\n\nexport const getSchScreenFontSize = (\n transform: Matrix,\n textType: SchTextType,\n) => {\n return Math.abs(transform.a) * getSchMmFontSize(textType)\n}\n","import type { SvgObject } from \"lib/svg-object\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport { applyToPoint, type Point, type Matrix } from \"transformation-matrix\"\n\nexport const createSvgSchErrorText = ({\n text,\n realCenter,\n realToScreenTransform,\n}: {\n text: string\n realCenter: { x: number; y: number }\n realToScreenTransform: Matrix\n}): SvgObject => {\n const screenCenter = applyToPoint(realToScreenTransform, realCenter)\n\n return {\n type: \"element\",\n name: \"text\",\n value: \"\",\n attributes: {\n x: screenCenter.x.toString(),\n y: screenCenter.y.toString(),\n fill: \"red\",\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": \"sans-serif\",\n \"font-size\": `${getSchScreenFontSize(realToScreenTransform, \"error\")}px`,\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n }\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n SourceSimpleChip,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSvg, symbols } from \"schematic-symbols\"\nimport { parseSync } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { createSvgObjectsFromSchematicComponentWithSymbol } from \"./create-svg-objects-from-sch-component-with-symbol\"\nimport { createSvgObjectsFromSchPortOnBox } from \"./create-svg-objects-from-sch-port-on-box\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\n\nexport const createSvgObjectsFromSchematicComponentWithBox = ({\n component: schComponent,\n transform,\n circuitJson,\n}: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const srcComponent = su(circuitJson as any).source_component.get(\n schComponent.source_component_id,\n )\n const svgObjects: SvgObject[] = []\n\n const componentScreenTopLeft = applyToPoint(transform, {\n x: schComponent.center.x - schComponent.size.width / 2,\n y: schComponent.center.y + schComponent.size.height / 2,\n })\n const componentScreenBottomRight = applyToPoint(transform, {\n x: schComponent.center.x + schComponent.size.width / 2,\n y: schComponent.center.y - schComponent.size.height / 2,\n })\n const componentScreenWidth =\n componentScreenBottomRight.x - componentScreenTopLeft.x\n const componentScreenHeight =\n componentScreenBottomRight.y - componentScreenTopLeft.y\n\n // Add basic rectangle for component body\n svgObjects.push({\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n class: \"component chip\",\n x: componentScreenTopLeft.x.toString(),\n y: componentScreenTopLeft.y.toString(),\n width: componentScreenWidth.toString(),\n height: componentScreenHeight.toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n children: [],\n })\n // Calculate position for top center of component\n const screenManufacturerNumberPos = applyToPoint(transform, {\n x: schComponent.center.x + schComponent.size.width / 2,\n y: schComponent.center.y + schComponent.size.height / 2 + 0.5, // Above the component top edge\n })\n const fontSizePx = getSchScreenFontSize(transform, \"manufacturer_number\")\n\n // Add manufacturer number and component name text\n if (srcComponent?.manufacturer_part_number) {\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: screenManufacturerNumberPos.x.toString(),\n y: screenManufacturerNumberPos.y.toString(),\n \"font-family\": \"sans-serif\",\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${fontSizePx}px`,\n },\n children: [\n {\n type: \"text\",\n value: srcComponent.manufacturer_part_number,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // Component name below manufacturer number\n if (srcComponent?.name) {\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: screenManufacturerNumberPos.x.toString(),\n y: (screenManufacturerNumberPos.y + fontSizePx * 1.1).toString(),\n \"font-family\": \"sans-serif\",\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${fontSizePx}px`,\n },\n children: [\n {\n type: \"text\",\n value: srcComponent.name || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // // Process ports\n const schematicPorts = su(circuitJson as any).schematic_port.list({\n schematic_component_id: schComponent.schematic_component_id,\n }) as SchematicPort[]\n\n for (const schPort of schematicPorts) {\n svgObjects.push(\n ...createSvgObjectsFromSchPortOnBox({\n schPort,\n schComponent,\n transform,\n circuitJson,\n }),\n )\n }\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { createSvgObjectsForSchPortBoxLine } from \"./create-svg-objects-for-sch-port-box-line\"\nimport { createSvgObjectsForSchPortPinNumberText } from \"./create-svg-objects-for-sch-port-pin-number-text\"\nimport { createSvgObjectsForSchPortPinLabel } from \"./create-svg-objects-for-sch-port-pin-label\"\n\nexport const createSvgObjectsFromSchPortOnBox = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n svgObjects.push(...createSvgObjectsForSchPortBoxLine(params))\n svgObjects.push(...createSvgObjectsForSchPortPinNumberText(params))\n svgObjects.push(...createSvgObjectsForSchPortPinLabel(params))\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\n\nconst PIN_CIRCLE_RADIUS_MM = 0.02\n\n/**\n * The schematic port box line is the line and circle that goes from the edge\n * of the component box to the port.\n */\nexport const createSvgObjectsForSchPortBoxLine = ({\n schPort,\n schComponent,\n transform,\n circuitJson,\n}: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n\n const srcPort = su(circuitJson as any).source_port.get(schPort.source_port_id)\n\n const realEdgePos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n // schPort.distance_from_component_edge is currently calculated incorrectly\n // in core\n const realPinLineLength = schPort.distance_from_component_edge ?? 0.4\n\n switch (schPort.side_of_component) {\n case \"left\":\n realEdgePos.x += realPinLineLength\n break\n case \"right\":\n realEdgePos.x -= realPinLineLength\n break\n case \"top\":\n realEdgePos.y -= realPinLineLength\n break\n case \"bottom\":\n realEdgePos.y += realPinLineLength\n break\n }\n\n const screenSchPortPos = applyToPoint(transform, schPort.center)\n const screenRealEdgePos = applyToPoint(transform, realEdgePos)\n\n // Subtract the pin circle radius from the pin line length to get the end\n const realLineEnd = { ...schPort.center }\n\n switch (schPort.side_of_component) {\n case \"left\":\n realLineEnd.x += PIN_CIRCLE_RADIUS_MM\n break\n case \"right\":\n realLineEnd.x -= PIN_CIRCLE_RADIUS_MM\n break\n case \"top\":\n realLineEnd.y -= PIN_CIRCLE_RADIUS_MM\n break\n case \"bottom\":\n realLineEnd.y += PIN_CIRCLE_RADIUS_MM\n break\n }\n const screenLineEnd = applyToPoint(transform, realLineEnd)\n\n // Add port line\n svgObjects.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n x1: screenLineEnd.x.toString(),\n y1: screenLineEnd.y.toString(),\n x2: screenRealEdgePos.x.toString(),\n y2: screenRealEdgePos.y.toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n // Add port circle\n svgObjects.push({\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n cx: screenSchPortPos.x.toString(),\n cy: screenSchPortPos.y.toString(),\n r: (Math.abs(transform.a) * PIN_CIRCLE_RADIUS_MM).toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n return svgObjects\n}\n","/**\n * Given a side, gives you the unit vector you would move in if you were coming\n * towards that edge from the outside. This is the same as the unit vector from\n * a port to the edge of a schematic box. This function assumes cartesian\n * coordinates (Y positive is up)\n */\nexport const getUnitVectorFromOutsideToEdge = (\n side: \"top\" | \"bottom\" | \"left\" | \"right\",\n) => {\n switch (side) {\n case \"top\":\n return { x: 0, y: -1 }\n case \"bottom\":\n return { x: 0, y: 1 }\n case \"left\":\n return { x: 1, y: 0 }\n case \"right\":\n return { x: -1, y: 0 }\n }\n throw new Error(`Invalid side: ${side}`)\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport const createSvgObjectsForSchPortPinNumberText = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n const realPinNumberPos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n if (!schPort.side_of_component) return []\n const vecToEdge = getUnitVectorFromOutsideToEdge(schPort.side_of_component)\n\n const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4\n\n // Move the pin number halfway to the edge of the box component so it sits\n // between the edge and the port, exactly in the middle\n realPinNumberPos.x += (vecToEdge.x * realPinEdgeDistance) / 2\n realPinNumberPos.y += (vecToEdge.y * realPinEdgeDistance) / 2\n\n // Transform the pin position from local to global coordinates\n const screenPinNumberTextPos = applyToPoint(transform, realPinNumberPos)\n\n if (\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ) {\n // Move the pin number text to the left a bit so it doesn't hit the port line\n screenPinNumberTextPos.x -= 2 //px\n } else {\n // Move the pin number text up a bit so it doesn't hit the port line\n screenPinNumberTextPos.y -= 2 //px\n }\n\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"pin-number\",\n x: screenPinNumberTextPos.x.toString(),\n y: screenPinNumberTextPos.y.toString(),\n style: \"font-family: sans-serif;\",\n fill: colorMap.schematic.pin_number,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${getSchScreenFontSize(transform, \"pin_number\")}px`,\n transform:\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ? `rotate(-90 ${screenPinNumberTextPos.x} ${screenPinNumberTextPos.y})`\n : \"\",\n },\n children: [\n {\n type: \"text\",\n value: schPort.pin_number?.toString() || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nconst LABEL_DIST_FROM_EDGE_MM = 0.1\n\nexport const createSvgObjectsForSchPortPinLabel = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n const realPinNumberPos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n if (!schPort.side_of_component) return []\n const vecToEdge = getUnitVectorFromOutsideToEdge(schPort.side_of_component)\n\n const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4\n\n // Move the pin number halfway to the edge of the box component so it sits\n // between the edge and the port, exactly in the middle\n realPinNumberPos.x +=\n vecToEdge.x * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM)\n realPinNumberPos.y +=\n vecToEdge.y * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM)\n\n // Transform the pin position from local to global coordinates\n const screenPinNumberTextPos = applyToPoint(transform, realPinNumberPos)\n\n const label =\n schPort.display_pin_label ??\n schComponent.port_labels?.[`pin${schPort.pin_number}`]\n\n if (!label) return []\n\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"pin-number\",\n x: screenPinNumberTextPos.x.toString(),\n y: screenPinNumberTextPos.y.toString(),\n style: \"font-family: sans-serif;\",\n fill: colorMap.schematic.pin_number,\n \"text-anchor\":\n schPort.side_of_component === \"left\" ||\n schPort.side_of_component === \"bottom\"\n ? \"start\"\n : \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-size\": `${getSchScreenFontSize(transform, \"pin_number\")}px`,\n transform:\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ? `rotate(-90 ${screenPinNumberTextPos.x} ${screenPinNumberTextPos.y})`\n : \"\",\n },\n children: [\n {\n type: \"text\",\n value: label || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","import type { AnyCircuitElement, SchematicComponent } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { createSvgObjectsFromSchematicComponentWithSymbol } from \"./create-svg-objects-from-sch-component-with-symbol\"\nimport { createSvgObjectsFromSchematicComponentWithBox } from \"./create-svg-objects-from-sch-component-with-box\"\nimport type { Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromSchematicComponent(params: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] {\n const { component } = params\n\n if (component.symbol_name) {\n return createSvgObjectsFromSchematicComponentWithSymbol(params)\n }\n\n return createSvgObjectsFromSchematicComponentWithBox(params)\n}\n","import type { SchematicDebugObject } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromSchDebugObject(\n debugObject: SchematicDebugObject,\n transform: Matrix,\n): SvgObject[] {\n if (debugObject.shape === \"rect\") {\n // Transform all corners\n let [screenLeft, screenTop] = applyToPoint(transform, [\n debugObject.center.x - debugObject.size.width / 2,\n debugObject.center.y - debugObject.size.height / 2,\n ])\n let [screenRight, screenBottom] = applyToPoint(transform, [\n debugObject.center.x + debugObject.size.width / 2,\n debugObject.center.y + debugObject.size.height / 2,\n ])\n ;[screenTop, screenBottom] = [\n Math.min(screenTop, screenBottom),\n Math.max(screenTop, screenBottom),\n ]\n\n // Calculate screen width and height\n const width = Math.abs(screenRight - screenLeft)\n const height = Math.abs(screenBottom - screenTop)\n\n const [screenCenterX, screenCenterY] = applyToPoint(transform, [\n debugObject.center.x,\n debugObject.center.y,\n ])\n\n return [\n {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenLeft.toString(),\n y: screenTop.toString(),\n width: width.toString(),\n height: height.toString(),\n fill: \"none\",\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenCenterX.toString(),\n y: (screenCenterY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n if (debugObject.shape === \"line\") {\n // Transform start and end points - flip Y coordinates\n const [screenStartX, screenStartY] = applyToPoint(transform, [\n debugObject.start.x,\n debugObject.start.y,\n ])\n const [screenEndX, screenEndY] = applyToPoint(transform, [\n debugObject.end.x,\n debugObject.end.y,\n ])\n\n // Calculate midpoint for label\n const screenMidX = (screenStartX + screenEndX) / 2\n const screenMidY = (screenStartY + screenEndY) / 2\n\n return [\n {\n name: \"line\",\n type: \"element\",\n value: \"\",\n attributes: {\n x1: screenStartX.toString(),\n y1: screenStartY.toString(),\n x2: screenEndX.toString(),\n y2: screenEndY.toString(),\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenMidX.toString(),\n y: (screenMidY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n return []\n}\n","import type { SchematicTrace } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSchematicTrace(\n trace: SchematicTrace,\n transform: Matrix,\n): SvgObject[] {\n const edges = trace.edges\n if (edges.length === 0) return []\n const svgObjects: SvgObject[] = []\n\n let path = \"\"\n\n // Process edges into an SVG path\n for (let edgeIndex = 0; edgeIndex < edges.length; edgeIndex++) {\n const edge = edges[edgeIndex]!\n\n if (edge.is_crossing) continue\n\n // Transform the points using the matrix\n const [screenFromX, screenFromY] = applyToPoint(transform, [\n edge.from.x,\n edge.from.y,\n ])\n const [screenToX, screenToY] = applyToPoint(transform, [\n edge.to.x,\n edge.to.y,\n ])\n\n // Regular straight line for non-crossing traces\n if (edgeIndex === 0 || edges[edgeIndex - 1]?.is_crossing) {\n path += `M ${screenFromX} ${screenFromY} L ${screenToX} ${screenToY}`\n } else {\n path += ` L ${screenToX} ${screenToY}`\n }\n }\n\n // Process wire crossings with little \"hops\" or arcs\n for (const edge of edges) {\n if (!edge.is_crossing) continue\n\n // Transform the points using the matrix\n const [screenFromX, screenFromY] = applyToPoint(transform, [\n edge.from.x,\n edge.from.y,\n ])\n const [screenToX, screenToY] = applyToPoint(transform, [\n edge.to.x,\n edge.to.y,\n ])\n // For crossing traces, create a small arc/hop\n const midX = (screenFromX + screenToX) / 2\n const midY = (screenFromY + screenToY) / 2\n\n // Calculate perpendicular offset for the arc\n const dx = screenToX - screenFromX\n const dy = screenToY - screenFromY\n const len = Math.sqrt(dx * dx + dy * dy)\n const hopHeight = len * 0.7\n\n // Perpendicular vector\n const perpX = (-dy / len) * hopHeight\n const perpY = (dx / len) * hopHeight\n\n // Control point for the quadratic curve\n const controlX = midX + perpX\n const controlY = midY - Math.abs(perpY)\n\n // Arc Shadow\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M ${screenFromX} ${screenFromY} Q ${controlX} ${controlY} ${screenToX} ${screenToY}`,\n stroke: colorMap.schematic.background,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform) + 1.5}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M ${screenFromX} ${screenFromY} Q ${controlX} ${controlY} ${screenToX} ${screenToY}`,\n stroke: colorMap.schematic.wire,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n }\n\n if (path) {\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"trace\",\n d: path,\n stroke: colorMap.schematic.wire,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n }\n\n // Add junction circles\n if (trace.junctions) {\n for (const junction of trace.junctions) {\n const [screenX, screenY] = applyToPoint(transform, [\n junction.x,\n junction.y,\n ])\n svgObjects.push({\n name: \"circle\",\n type: \"element\",\n attributes: {\n cx: screenX.toString(),\n cy: screenY.toString(),\n r: (Math.abs(transform.a) * 0.03).toString(),\n fill: colorMap.schematic.junction,\n },\n value: \"\",\n children: [],\n })\n }\n }\n\n return svgObjects\n}\n","import type { AnyCircuitElement, SchematicNetLabel } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport {\n getSchMmFontSize,\n getSchScreenFontSize,\n} from \"lib/utils/get-sch-font-size\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { getUnitVectorFromEdgeToOutside } from \"lib/utils/get-unit-vector-from-edge-to-outside\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport {\n applyToPoint,\n compose,\n rotate,\n scale,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport { estimateTextWidth } from \"../estimate-text-width\"\n\n/**\n * Arrow point width as a fraction of font size (Font Size Ratio)\n */\nconst ARROW_POINT_WIDTH_FSR = 0.3\n\n/**\n * End padding as a fraction of font size (Font Size Ratio)\n */\nconst END_PADDING_FSR = 0.3\nconst END_PADDING_EXTRA_PER_CHARACTER_FSR = 0.06\n\nexport const createSvgObjectsForSchNetLabel = (\n schNetLabel: SchematicNetLabel,\n realToScreenTransform: Matrix,\n): SvgObject[] => {\n if (!schNetLabel.text) return []\n const svgObjects: SvgObject[] = []\n\n const fontSizePx = getSchScreenFontSize(realToScreenTransform, \"net_label\")\n const fontSizeMm = getSchMmFontSize(\"net_label\")\n const textWidthFSR = estimateTextWidth(schNetLabel.text || \"\")\n\n // Transform the center position to screen coordinates\n const screenCenter = applyToPoint(realToScreenTransform, schNetLabel.center)\n\n const realTextGrowthVec = getUnitVectorFromOutsideToEdge(\n schNetLabel.anchor_side,\n )\n\n const screenTextGrowthVec = { ...realTextGrowthVec }\n screenTextGrowthVec.y *= -1 // Invert y direction because anchor_side is pre-transform\n\n const fullWidthFsr =\n textWidthFSR +\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n END_PADDING_FSR\n const screenAnchorPosition = schNetLabel.anchor_position\n ? applyToPoint(realToScreenTransform, schNetLabel.anchor_position)\n : {\n x:\n screenCenter.x -\n (screenTextGrowthVec.x * fullWidthFsr * fontSizePx) / 2,\n y:\n screenCenter.y -\n (screenTextGrowthVec.y * fullWidthFsr * fontSizePx) / 2,\n }\n const realAnchorPosition = schNetLabel.anchor_position ?? {\n x:\n schNetLabel.center.x -\n (realTextGrowthVec.x * fullWidthFsr * fontSizeMm) / 2,\n y:\n schNetLabel.center.y -\n (realTextGrowthVec.y * fullWidthFsr * fontSizeMm) / 2,\n }\n\n // Get rotation angle based on anchor_side\n const pathRotation = {\n left: 0,\n top: -90,\n bottom: 90,\n right: 180,\n }[schNetLabel.anchor_side]\n\n // Calculate the points for the outline\n const screenOutlinePoints: Array<{ x: number; y: number }> = [\n // Arrow point in font-relative coordinates\n {\n x: 0,\n y: 0,\n },\n // Top left corner in font-relative coordinates\n {\n x: ARROW_POINT_WIDTH_FSR,\n y: 0.6,\n },\n // Top right corner in font-relative coordinates\n {\n x:\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_FSR +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n textWidthFSR,\n y: 0.6,\n },\n // Bottom right corner in font-relative coordinates\n {\n x:\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_FSR +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n textWidthFSR,\n y: -0.6,\n },\n // Bottom left corner in font-relative coordinates\n {\n x: ARROW_POINT_WIDTH_FSR,\n y: -0.6,\n },\n ].map((fontRelativePoint) =>\n applyToPoint(\n compose(\n realToScreenTransform,\n translate(realAnchorPosition.x, realAnchorPosition.y),\n scale(fontSizeMm),\n rotate((pathRotation / 180) * Math.PI),\n ),\n fontRelativePoint,\n ),\n )\n\n // Create the label path\n const pathD = `\n M ${screenOutlinePoints[0]!.x},${screenOutlinePoints[0]!.y}\n L ${screenOutlinePoints[1]!.x},${screenOutlinePoints[1]!.y}\n L ${screenOutlinePoints[2]!.x},${screenOutlinePoints[2]!.y}\n L ${screenOutlinePoints[3]!.x},${screenOutlinePoints[3]!.y}\n L ${screenOutlinePoints[4]!.x},${screenOutlinePoints[4]!.y}\n Z\n `\n\n // Add the label container path\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"net-label\",\n d: pathD,\n fill: \"white\",\n stroke: colorMap.schematic.label_global,\n \"stroke-width\": `${getSchStrokeSize(realToScreenTransform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n const screenTextPos = {\n x: screenAnchorPosition.x + screenTextGrowthVec.x * fontSizePx * 0.5,\n y: screenAnchorPosition.y + screenTextGrowthVec.y * fontSizePx * 0.5,\n }\n\n const textAnchor = {\n left: \"start\",\n top: \"start\",\n bottom: \"start\",\n right: \"end\",\n }[schNetLabel.anchor_side]\n\n const textTransformString = {\n left: \"\",\n right: \"\",\n top: `rotate(90 ${screenTextPos.x} ${screenTextPos.y})`,\n bottom: `rotate(-90 ${screenTextPos.x} ${screenTextPos.y})`,\n }[schNetLabel.anchor_side]\n\n // Add the label text\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"net-label-text\",\n x: screenTextPos.x.toString(),\n y: screenTextPos.y.toString(),\n fill: colorMap.schematic.label_global,\n \"text-anchor\": textAnchor,\n \"dominant-baseline\": \"central\",\n \"font-family\": \"sans-serif\",\n \"font-variant-numeric\": \"tabular-nums\",\n \"font-size\": `${fontSizePx}px`,\n transform: textTransformString,\n },\n children: [\n {\n type: \"text\",\n value: schNetLabel.text || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","// https://claude.ai/share/5e327d90-627f-48d5-9a51-ba6117479007\nexport const arialTextMetrics = {\n \"0\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"1\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -3,\n right: 9,\n },\n \"2\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"3\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"4\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n \"5\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"6\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"7\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"8\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"9\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \" \": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 0,\n },\n \"!\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n '\"': {\n width: 9,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"#\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 13,\n },\n $: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"%\": {\n width: 21,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 20,\n },\n \"&\": {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 15,\n },\n \"'\": {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 3,\n },\n \"(\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \")\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"*\": {\n width: 9,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 8,\n },\n \"+\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \",\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"-\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \".\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"/\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 7,\n },\n \":\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \";\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"<\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \"=\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \">\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \"?\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"@\": {\n width: 24,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 23,\n },\n A: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n B: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n C: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 16,\n },\n D: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 16,\n },\n E: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n F: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 14,\n },\n G: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 17,\n },\n H: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n I: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n J: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 10,\n },\n K: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 16,\n },\n L: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n M: {\n width: 20,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 18,\n },\n N: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n O: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 18,\n },\n P: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n Q: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 18,\n },\n R: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 17,\n },\n S: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 15,\n },\n T: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 14,\n },\n U: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n V: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n W: {\n width: 23,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 22,\n },\n X: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n Y: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n Z: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 14,\n },\n \"[\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 6,\n },\n \"\\\\\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 7,\n },\n \"]\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 5,\n },\n \"^\": {\n width: 11,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 11,\n },\n _: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 14,\n },\n \"`\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 5,\n },\n a: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n b: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n c: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n d: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n e: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n f: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 8,\n },\n g: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n h: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n i: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n j: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 1,\n right: 4,\n },\n k: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n l: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n m: {\n width: 20,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 18,\n },\n n: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n o: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n p: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n q: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n r: {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 8,\n },\n s: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 11,\n },\n t: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 6,\n },\n u: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n v: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n w: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 17,\n },\n x: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n y: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n z: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 11,\n },\n \"{\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"|\": {\n width: 6,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n \"}\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"~\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n}\n","import { arialTextMetrics } from \"./arial-text-metrics\"\n\nexport const estimateTextWidth = (text: string): number => {\n if (!text) return 0\n\n let totalWidth = 0\n for (const char of text) {\n const metrics = arialTextMetrics[char as keyof typeof arialTextMetrics]\n if (metrics) {\n totalWidth += metrics.width\n } else {\n // Default width for unknown characters\n totalWidth += arialTextMetrics[\"?\"].width\n }\n }\n\n // Return width normalized to font size 1\n return totalWidth / 27 // Normalize by font height from metrics\n}\n"],"mappings":";AACA,SAAkC,iBAAiB;AACnD;AAAA,EAEE,gBAAAA;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,OACK;;;ACNP,SAAS,oBAAiC;AAEnC,SAAS,kCACd,eACA,WACA,aACA,kBACa;AACb,MAAI,CAAC,iBAAkB,QAAO,CAAC;AAC/B,QAAM,EAAE,aAAa,IAAI;AAEzB,QAAM,QAAQ,YAAY;AAAA,IACxB,CAAC,OACC,GAAG,SAAS,cAAc,GAAG,gBAAgB,eAAe,CAAC;AAAA,EACjE;AACA,QAAM,QAAQ,YAAY;AAAA,IACxB,CAAC,OACC,GAAG,SAAS,cAAc,GAAG,gBAAgB,eAAe,CAAC;AAAA,EACjE;AAEA,MAAI,CAAC,SAAS,CAAC,MAAO,QAAO,CAAC;AAE9B,QAAM,cAAc,aAAa,WAAW;AAAA,IAC1C,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,EACX,CAAC;AACD,QAAM,cAAc,aAAa,WAAW;AAAA,IAC1C,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,EACX,CAAC;AAED,QAAM,cAAc;AAAA,IAClB,IAAI,YAAY,IAAI,YAAY,KAAK;AAAA,IACrC,IAAI,YAAY,IAAI,YAAY,KAAK;AAAA,EACvC;AAEA,MACE,MAAM,YAAY,CAAC,KACnB,MAAM,YAAY,CAAC,KACnB,MAAM,YAAY,CAAC,KACnB,MAAM,YAAY,CAAC,KACnB,MAAM,YAAY,CAAC,KACnB,MAAM,YAAY,CAAC,GACnB;AACA,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAA0B;AAAA,IAC9B;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,YAAY,EAAE,SAAS;AAAA,QAC3B,IAAI,YAAY,EAAE,SAAS;AAAA,QAC3B,IAAI,YAAY,EAAE,SAAS;AAAA,QAC3B,IAAI,YAAY,EAAE,SAAS;AAAA,QAC3B,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,MACtB;AAAA,MACA,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,YAAY,EAAE,SAAS;AAAA,QAC3B,IAAI,YAAY,EAAE,SAAS;AAAA,QAC3B,IAAI,YAAY,EAAE,SAAS;AAAA,QAC3B,IAAI,YAAY,EAAE,SAAS;AAAA,QAC3B,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,MACtB;AAAA,MACA,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,YAAY,IAAI,GAAG,SAAS;AAAA,QAChC,IAAI,YAAY,IAAI,GAAG,SAAS;AAAA,QAChC,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,WAAW,aAAa,YAAY,CAAC,IAAI,YAAY,CAAC;AAAA,MACxD;AAAA,MACA,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,GAAG,YAAY,EAAE,SAAS;AAAA,QAC1B,IAAI,YAAY,IAAI,IAAI,SAAS;AAAA,QACjC,MAAM;AAAA,QACN,eAAe;AAAA,QACf,aAAa;AAAA,QACb,eAAe;AAAA,MACjB;AAAA,MACA,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,OAAO,cAAc,WAAW;AAAA,UAChC,MAAM;AAAA,UACN,YAAY,CAAC;AAAA,UACb,UAAU,CAAC;AAAA,QACb;AAAA,MACF;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;ACtHA,SAAS,gBAAAC,qBAAiC;AAGnC,SAAS,2CACd,aACA,WACa;AACb,MAAI,CAAC,YAAY,SAAS,CAAC,MAAM,QAAQ,YAAY,KAAK,EAAG,QAAO,CAAC;AAGrE,QAAM,aAAa,YAAY,MAAM,CAAC;AACtC,QAAM,YAAY,YAAY,MAAM,YAAY,MAAM,SAAS,CAAC;AAChE,QAAM,WACJ,WAAY,MAAM,UAAW,KAAK,WAAY,MAAM,UAAW;AAEjE,QAAM,OACJ,YAAY,MACT,MAAM,GAAG,WAAW,KAAK,MAAS,EAClC,IAAI,CAAC,OAAY,UAAkB;AAClC,UAAM,CAAC,GAAG,CAAC,IAAIA,cAAa,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AACzD,WAAO,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC;AAAA,EAClD,CAAC,EACA,KAAK,GAAG,KAAK,WAAW,OAAO;AAEpC,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO;AAAA,QACP,QAAQ,YAAY,SAAS;AAAA,QAC7B,MAAM;AAAA,QACN,GAAG;AAAA,QACH,iBACE,YAAY,eAAe,KAAK,IAAI,UAAU,CAAC,GAC/C,SAAS;AAAA,QACX,yBAAyB,YAAY;AAAA,QACrC,qCACE,YAAY;AAAA,MAChB;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AACF;;;AC3CA,SAAS,YAAY,sBAAsB;AAC3C;AAAA,EAEE,gBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,SAAS,2CACd,gBACA,WACa;AACb,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR;AAAA,EACF,IAAI;AAEJ,MACE,CAAC,mBACD,OAAO,gBAAgB,MAAM,YAC7B,OAAO,gBAAgB,MAAM,UAC7B;AACA,YAAQ,MAAM,4BAA4B,eAAe;AACzD,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,CAAC,cAAc,YAAY,IAAIA,cAAa,WAAW;AAAA,IAC3D,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB,CAAC;AACD,QAAM,sBAAsB,YAAY,KAAK,IAAI,UAAU,CAAC;AAK5D,QAAM,gBAAgB;AAAA,IACpB,UAAU,cAAc,YAAY;AAAA;AAAA,IACpC,OAAO,KAAK,KAAK,GAAG;AAAA;AAAA,EACtB;AAEA,QAAM,YAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,GAAG;AAAA,MACH,GAAG;AAAA,MACH,eAAe;AAAA,MACf,aAAa,oBAAoB,SAAS;AAAA,MAC1C,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,WAAW,eAAe,aAAa;AAAA,MACvC,OAAO;AAAA,MACP,MAAM,SAAS;AAAA,IACjB;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAEA,SAAO,CAAC,SAAS;AACnB;;;ACzEA,SAAS,gBAAAC,qBAAoB;AAGtB,SAAS,kCACd,MACA,WACa;AACb,QAAM,CAAC,GAAG,CAAC,IAAIA,cAAa,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;AAEvD,MAAI,KAAK,UAAU,QAAQ;AACzB,UAAM,mBAAmB,KAAK,cAAc,KAAK,IAAI,UAAU,CAAC;AAChE,UAAM,oBAAoB,KAAK,eAAe,KAAK,IAAI,UAAU,CAAC;AAClE,UAAM,kBAAkB,KAAK,aAAa,KAAK,IAAI,UAAU,CAAC;AAC9D,UAAM,mBAAmB,KAAK,cAAc,KAAK,IAAI,UAAU,CAAC;AAEhE,UAAM,eAAe,mBAAmB;AACxC,UAAM,eAAe,oBAAoB;AACzC,UAAM,eAAe,kBAAkB;AACvC,UAAM,eAAe,mBAAmB;AACxC,UAAM,iBAAiB,oBAAoB;AAE3C,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA;AAAA,UAER;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,cACV,OAAO;AAAA,cACP,GACE,IAAI,IAAI,YAAY,IAAI,IAAI,iBAAiB,CAAC,KAC1C,cAAc,KACd,YAAY,IAAI,YAAY,UAAU,gBAAgB,QACrD,cAAc,KACf,YAAY,IAAI,YAAY,WAAW,gBAAgB;AAAA,YAC/D;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC;AAAA,UACb;AAAA;AAAA,UAEA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,cACV,OAAO;AAAA,cACP,GACE,IAAI,IAAI,YAAY,IAAI,KAAK,mBAAmB,mBAAmB,CAAC,KAChE,mBAAmB,eAAe,KAClC,YAAY,IAAI,YAAY,UAAU,eAAe,QACpD,mBAAmB,eAAe,KACnC,YAAY,IAAI,YAAY,WAAW,eAAe;AAAA,YAC9D;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC;AAAA,UACb;AAAA,QACF;AAAA,QACA,OAAO;AAAA,QACP,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,UAAU,UAAU;AAC3B,UAAM,mBAAmB,KAAK,iBAAiB,KAAK,IAAI,UAAU,CAAC;AACnE,UAAM,oBAAoB,KAAK,iBAAiB,KAAK,IAAI,UAAU,CAAC;AACpE,UAAM,kBAAkB,KAAK,gBAAgB,KAAK,IAAI,UAAU,CAAC;AACjE,UAAM,mBAAmB,KAAK,gBAAgB,KAAK,IAAI,UAAU,CAAC;AAElE,UAAM,cAAc,KAAK,IAAI,kBAAkB,iBAAiB,IAAI;AACpE,UAAM,cAAc,KAAK,IAAI,iBAAiB,gBAAgB,IAAI;AAClE,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,cACV,OAAO;AAAA,cACP,IAAI,EAAE,SAAS;AAAA,cACf,IAAI,EAAE,SAAS;AAAA,cACf,GAAG,YAAY,SAAS;AAAA,YAC1B;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC;AAAA,UACb;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,cACV,OAAO;AAAA,cACP,IAAI,EAAE,SAAS;AAAA,cACf,IAAI,EAAE,SAAS;AAAA,cACf,GAAG,YAAY,SAAS;AAAA,YAC1B;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC;AAAA,UACb;AAAA,QACF;AAAA,QACA,OAAO;AAAA,QACP,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC;AACV;;;AC7GA,SAAS,gBAAAC,qBAAiC;AAGnC,SAAS,sCACd,gBACA,WACa;AACb,MAAI,CAAC,eAAe,SAAS,CAAC,MAAM,QAAQ,eAAe,KAAK,EAAG,QAAO,CAAC;AAE3E,MAAI,OAAO,eAAe,MACvB,IAAI,CAAC,OAAY,UAAkB;AAClC,UAAM,CAAC,GAAG,CAAC,IAAIA,cAAa,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AACzD,WAAO,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC;AAAA,EAClD,CAAC,EACA,KAAK,GAAG;AAGX,QAAM,aAAa,eAAe,MAAM,CAAC;AACzC,QAAM,YAAY,eAAe,MAAM,eAAe,MAAM,SAAS,CAAC;AACtE,MACE,cACA,aACA,WAAW,MAAM,UAAU,KAC3B,WAAW,MAAM,UAAU,GAC3B;AACA,YAAQ;AAAA,EACV;AACA,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,iCAAiC,eAAe,KAAK;AAAA,QAC5D,GAAG;AAAA,QACH,iBACE,eAAe,eAAe,KAAK,IAAI,UAAU,CAAC,GAClD,SAAS;AAAA,QACX,yBAAyB,eAAe;AAAA,QACxC,+BAA+B,eAAe;AAAA,MAChD;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AACF;;;AC3CA;AAAA,EAEE,gBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAYC;AAAA,OACP;AAEA,SAAS,sCACd,mBACA,WACa;AACb,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV,IAAI;AAEJ,MACE,CAAC,mBACD,OAAO,gBAAgB,MAAM,YAC7B,OAAO,gBAAgB,MAAM,UAC7B;AACA,YAAQ,MAAM,4BAA4B,eAAe;AACzD,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,CAAC,cAAc,YAAY,IAAIJ,cAAa,WAAW;AAAA,IAC3D,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB,CAAC;AACD,QAAM,sBAAsB,YAAY,KAAK,IAAI,UAAU,CAAC;AAK5D,QAAM,gBAAgBC;AAAA,IACpBE,WAAU,cAAc,YAAY;AAAA,IACpCD,QAAO,KAAK,KAAK,GAAG;AAAA;AAAA,EACtB;AAEA,QAAM,YAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,GAAG;AAAA,MACH,GAAG;AAAA,MACH,eAAe;AAAA,MACf,aAAa,oBAAoB,SAAS;AAAA,MAC1C,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,WAAWE,gBAAe,aAAa;AAAA,MACvC,OAAO,sCAAsC,KAAK;AAAA,MAClD,+BAA+B,kBAAkB;AAAA,IACnD;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAEA,SAAO,CAAC,SAAS;AACnB;;;ACrEO,SAAS,MAAS,KAA8B;AACrD,QAAM,SAAwB,CAAC;AAC/B,WAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;AACvC,WAAO,KAAK,CAAC,IAAI,CAAC,GAAI,IAAI,IAAI,CAAC,CAAE,CAAC;AAAA,EACpC;AACA,SAAO;AACT;;;ACNA,SAAS,gBAAAC,qBAAiC;;;ACAnC,IAAM,sBAAsB;AAAA,EACjC,KAAK;AAAA,EACL,QAAQ;AACV;AAEO,SAAS,iBAAiB,WAAmB;AAClD,SACE,oBAAoB,SAA6C,KACjE;AAEJ;;;ADPO,SAAS,6BACd,OACA,WACa;AACb,MAAI,CAAC,MAAM,SAAS,CAAC,MAAM,QAAQ,MAAM,KAAK,KAAK,MAAM,MAAM,SAAS;AACtE,WAAO,CAAC;AAEV,QAAM,WAAW,MAAM,MAAM,KAAK;AAClC,QAAM,aAA0B,CAAC;AAEjC,aAAW,CAAC,OAAO,GAAG,KAAK,UAAU;AACnC,UAAM,aAAaC,cAAa,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AAC7D,UAAM,WAAWA,cAAa,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AAEvD,UAAM,QACJ,WAAW,QAAQ,MAAM,QAAQ,WAAW,MAAM,IAAI,QAAQ;AAChE,QAAI,CAAC,MAAO;AAEZ,UAAM,aACJ,oBAAoB,KAAyC,KAAK;AAEpE,UAAM,aACJ,WAAW,QAAQ,MAAM,QAAQ,WAAW,MAAM,IAAI,QAAQ;AAEhE,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,MACX,YAAY;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,GAAG,KAAK,WAAW,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC;AAAA,QACtE,gBAAgB,cACX,aAAa,KAAK,IAAI,UAAU,CAAC,GAAG,SAAS,IAC9C;AAAA,QACJ,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;AEhDA,SAAS,gBAAAC,qBAAiC;AAGnC,SAAS,2BACd,KACA,WACK;AACL,QAAM,CAAC,GAAG,CAAC,IAAIC,cAAa,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AAErD,MAAI,IAAI,UAAU,QAAQ;AACxB,UAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI,UAAU,CAAC;AAC9C,UAAM,SAAS,IAAI,SAAS,KAAK,IAAI,UAAU,CAAC;AAChD,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,UACP,MAAM,iBAAiB,IAAI,KAAK;AAAA,UAChC,IAAI,IAAI,QAAQ,GAAG,SAAS;AAAA,UAC5B,IAAI,IAAI,SAAS,GAAG,SAAS;AAAA,UAC7B,OAAO,MAAM,SAAS;AAAA,UACtB,QAAQ,OAAO,SAAS;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC;AACV;;;AC7BA,SAAS,gBAAAC,qBAAiC;AAGnC,SAAS,6BACd,UACA,WACa;AACb,QAAM,EAAE,OAAO,QAAQ,QAAQ,QAAQ,IAAI;AAE3C,MAAI;AACJ,MAAI,WAAW,MAAM,QAAQ,OAAO,KAAK,QAAQ,UAAU,GAAG;AAC5D,WAAO,QACJ,IAAI,CAAC,OAAc,UAAkB;AACpC,YAAM,CAAC,GAAG,CAAC,IAAIA,cAAa,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AACzD,aAAO,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC;AAAA,IAClD,CAAC,EACA,KAAK,GAAG;AAAA,EACb,OAAO;AACL,UAAM,YAAY,QAAQ;AAC1B,UAAM,aAAa,SAAS;AAE5B,UAAM,UAAUA,cAAa,WAAW;AAAA,MACtC,OAAO,IAAI;AAAA,MACX,OAAO,IAAI;AAAA,IACb,CAAC;AACD,UAAM,WAAWA,cAAa,WAAW;AAAA,MACvC,OAAO,IAAI;AAAA,MACX,OAAO,IAAI;AAAA,IACb,CAAC;AACD,UAAM,cAAcA,cAAa,WAAW;AAAA,MAC1C,OAAO,IAAI;AAAA,MACX,OAAO,IAAI;AAAA,IACb,CAAC;AACD,UAAM,aAAaA,cAAa,WAAW;AAAA,MACzC,OAAO,IAAI;AAAA,MACX,OAAO,IAAI;AAAA,IACb,CAAC;AAED,WACE,KAAK,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,MACxB,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,MAC1B,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,MAChC,WAAW,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC;AAAA,EACvC;AAEA,UAAQ;AAER,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,MACX,YAAY;AAAA,QACV,OAAO;AAAA,QACP,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,iBAAiB,MAAM,KAAK,IAAI,UAAU,CAAC,GAAG,SAAS;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AACF;;;AC7DA,SAAS,gBAAAC,sBAAoB;AAEtB,SAAS,2BAA2B,MAAc,WAAqB;AAC5E,QAAM,CAAC,GAAG,CAAC,IAAIA,eAAa,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;AACvD,QAAM,mBAAmB,KAAK,iBAAiB,KAAK,IAAI,UAAU,CAAC;AACnE,QAAM,oBAAoB,KAAK,iBAAiB,KAAK,IAAI,UAAU,CAAC;AACpE,QAAM,kBAAkB,KAAK,gBAAgB,KAAK,IAAI,UAAU,CAAC;AACjE,QAAM,mBAAmB,KAAK,gBAAgB,KAAK,IAAI,UAAU,CAAC;AAElE,QAAM,cAAc,KAAK,IAAI,kBAAkB,iBAAiB,IAAI;AACpE,QAAM,cAAc,KAAK,IAAI,iBAAiB,gBAAgB,IAAI;AAClE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,UACP,IAAI,EAAE,SAAS;AAAA,UACf,IAAI,EAAE,SAAS;AAAA,UACf,GAAG,YAAY,SAAS;AAAA,QAC1B;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,UACP,IAAI,EAAE,SAAS;AAAA,UACf,IAAI,EAAE,SAAS;AAAA,UACf,GAAG,YAAY,SAAS;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACrCA,SAAS,gBAAAC,sBAAiC;;;ACDnC,IAAM,aAAa;;;ADKnB,SAAS,4BACd,MACA,WACa;AACb,QAAM,CAAC,GAAG,CAAC,IAAIC,eAAa,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;AAEvD,MAAI,KAAK,eAAe,YAAY,KAAK,eAAe,UAAU;AAChE,UAAM,iBAAiB,KAAK,gBAAgB,KAAK,IAAI,UAAU,CAAC;AAChE,UAAM,SAAS,iBAAiB;AAEhC,QAAI,KAAK,eAAe,UAAU;AAChC,aAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,YAAY;AAAA,YACV,OAAO;AAAA,YACP,IAAI,EAAE,SAAS;AAAA,YACf,IAAI,EAAE,SAAS;AAAA,YACf,GAAG,OAAO,SAAS;AAAA,YACnB,MAAM;AAAA,UACR;AAAA,UACA,UAAU,CAAC;AAAA,UACX,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,UACP,IAAI,IAAI,QAAQ,SAAS;AAAA,UACzB,IAAI,IAAI,QAAQ,SAAS;AAAA,UACzB,OAAO,eAAe,SAAS;AAAA,UAC/B,QAAQ,eAAe,SAAS;AAAA,UAChC,MAAM;AAAA,QACR;AAAA,QACA,UAAU,CAAC;AAAA,QACX,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,eAAe,QAAQ;AAC9B,UAAM,cAAc,KAAK,aAAa,KAAK,IAAI,UAAU,CAAC;AAC1D,UAAM,eAAe,KAAK,cAAc,KAAK,IAAI,UAAU,CAAC;AAC5D,UAAM,KAAK,cAAc;AACzB,UAAM,KAAK,eAAe;AAE1B,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,UACP,IAAI,EAAE,SAAS;AAAA,UACf,IAAI,EAAE,SAAS;AAAA,UACf,IAAI,GAAG,SAAS;AAAA,UAChB,IAAI,GAAG,SAAS;AAAA,UAChB,MAAM;AAAA,QACR;AAAA,QACA,UAAU,CAAC;AAAA,QACX,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC;AACV;;;AbtDA,IAAM,eAA4C;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAaO,SAAS,2BACd,MACA,SACQ;AACR,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,OAAO;AAGlB,aAAW,QAAQ,MAAM;AACvB,QAAI,KAAK,SAAS,aAAa;AAC7B,UACE,KAAK,WACL,MAAM,QAAQ,KAAK,OAAO,KAC1B,KAAK,QAAQ,UAAU;AAEvB,qCAA6B,KAAK,OAAO;AAAA,eAClC,YAAY,QAAQ,WAAW,QAAQ,YAAY;AAC1D,qBAAa,KAAK,QAAQ,KAAK,OAAO,KAAK,MAAM;AAAA,IACrD,WAAW,OAAO,QAAQ,OAAO,MAAM;AACrC,mBAAa,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,CAAC;AAAA,IAC7C,WAAW,WAAW,MAAM;AAC1B,wBAAkB,KAAK,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,UAAU;AAChB,QAAM,eAAe,OAAO,OAAO,IAAI;AACvC,QAAM,gBAAgB,OAAO,OAAO,IAAI;AAExC,QAAM,WAAW,SAAS,SAAS;AACnC,QAAM,YAAY,SAAS,UAAU;AACrC,QAAM,QAAiC,CAAC;AACxC,aAAW,QAAQ,MAAM;AACvB,QAAI,WAAW,QAAQ,KAAK,UAAU,QAAW;AAC/C,YAAM,KAAK,KAAK,KAA8B;AAAA,IAChD;AAAA,EACF;AAGA,QAAM,SAAS,WAAW;AAC1B,QAAM,SAAS,YAAY;AAC3B,QAAM,cAAc,KAAK,IAAI,QAAQ,MAAM;AAG3C,QAAM,WAAW,WAAW,eAAe,eAAe;AAC1D,QAAM,WAAW,YAAY,gBAAgB,eAAe;AAE5D,QAAM,YAAYC;AAAA,IAChBC;AAAA,MACE,UAAU,OAAO,cAAc,UAAU;AAAA,MACzC,YAAY,UAAU,OAAO,cAAc,UAAU;AAAA,IACvD;AAAA,IACA,MAAM,aAAa,CAAC,WAAW;AAAA;AAAA,EACjC;AAEA,QAAM,aAAa,KAChB;AAAA,IACC,CAAC,GAAG,OACD,aAAa,QAAQ,EAAE,IAAI,KAAK,SAChC,aAAa,QAAQ,EAAE,IAAI,KAAK;AAAA,EACrC,EACC;AAAA,IAAQ,CAAC,SACR,iBAAiB,MAAM,WAAW,MAAM,SAAS,gBAAgB;AAAA,EACnE;AAEF,MAAI,cAAc,OAAO,OAAO,WAAW;AAE3C,aAAW,WAAW,MAAM;AAC1B,QAAI,kBAAkB,SAAS;AAC7B,oBAAc,OAAO,cAAc,QAAQ,YAAY;AACvD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,MACP,OAAO,SAAS,SAAS;AAAA,MACzB,QAAQ,UAAU,SAAS;AAAA,IAC7B;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAaT;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,UACP,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO,SAAS,SAAS;AAAA,UACzB,QAAQ,UAAU,SAAS;AAAA,QAC7B;AAAA,MACF;AAAA,MACA,+BAA+B,WAAW,MAAM,MAAM,MAAM,IAAI;AAAA,MAChE,GAAG;AAAA,IACL,EAAE,OAAO,CAAC,UAA8B,UAAU,IAAI;AAAA,EACxD;AAEA,MAAI;AACF,WAAO,UAAU,SAAsB;AAAA,EACzC,SAAS,OAAO;AACd,YAAQ,MAAM,kCAAkC,KAAK;AACrD,UAAM;AAAA,EACR;AAEA,WAAS,aAAa,QAAa,OAAY,QAAa;AAC1D,UAAM,YAAY,QAAQ;AAC1B,UAAM,aAAa,SAAS;AAC5B,WAAO,KAAK,IAAI,MAAM,OAAO,IAAI,SAAS;AAC1C,WAAO,KAAK,IAAI,MAAM,OAAO,IAAI,UAAU;AAC3C,WAAO,KAAK,IAAI,MAAM,OAAO,IAAI,SAAS;AAC1C,WAAO,KAAK,IAAI,MAAM,OAAO,IAAI,UAAU;AAAA,EAC7C;AAEA,WAAS,6BAA6B,SAAkB;AACtD,eAAW,SAAS,SAAS;AAC3B,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,WAAS,kBAAkB,OAAc;AACvC,eAAW,SAAS,OAAO;AACzB,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,SAAS,iBACP,KACA,WACA,MACA,kBACa;AACb,UAAQ,IAAI,MAAM;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,OAAO,OAAO;AAAA,IAClB,KAAK;AACH,aAAO,CAAC,iCAAiC,KAAK,SAAS,CAAC,EAAE,OAAO,OAAO;AAAA,IAC1E,KAAK;AACH,aAAO,6BAA6B,KAAK,SAAS;AAAA,IACpD,KAAK;AACH,aAAO,kCAAkC,KAAK,SAAS,EAAE,OAAO,OAAO;AAAA,IACzE,KAAK;AACH,aAAO,4BAA4B,KAAK,SAAS;AAAA,IACnD,KAAK;AACH,aAAO,2BAA2B,KAAK,SAAS;AAAA,IAClD,KAAK;AACH,aAAO,sCAAsC,KAAK,SAAS;AAAA,IAC7D,KAAK;AACH,aAAO,2CAA2C,KAAK,SAAS;AAAA,IAClE,KAAK;AACH,aAAO,2CAA2C,KAAK,SAAS;AAAA,IAClE,KAAK;AACH,aAAO,sCAAsC,KAAK,SAAS;AAAA,IAC7D,KAAK;AACH,aAAO,6BAA6B,KAAK,SAAS;AAAA,IACpD,KAAK;AACH,aAAO,2BAA2B,KAAK,SAAS;AAAA,IAClD;AACE,aAAO,CAAC;AAAA,EACZ;AACF;AAEA,SAAS,iCAAiC,WAAgB,WAAqB;AAC7E,QAAM,EAAE,QAAQ,OAAO,QAAQ,WAAW,EAAE,IAAI;AAChD,QAAM,CAAC,GAAG,CAAC,IAAIC,eAAa,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;AAC3D,QAAM,cAAc,QAAQ,KAAK,IAAI,UAAU,CAAC;AAChD,QAAM,eAAe,SAAS,KAAK,IAAI,UAAU,CAAC;AAClD,QAAM,eAAe,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ;AAE9D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,EAAE,WAAW,aAAa;AAAA,IACtC,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,UACP,IAAI,CAAC,cAAc,GAAG,SAAS;AAAA,UAC/B,IAAI,CAAC,eAAe,GAAG,SAAS;AAAA,UAChC,OAAO,YAAY,SAAS;AAAA,UAC5B,QAAQ,aAAa,SAAS;AAAA,QAChC;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,UACP,IAAI,CAAC,cAAc,GAAG,SAAS;AAAA,UAC/B,IAAI,CAAC,eAAe,GAAG,SAAS;AAAA,UAChC,OAAO,YAAY,SAAS;AAAA,UAC5B,QAAQ,aAAa,SAAS;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,+BACP,WACA,MACA,MACA,MACA,MACW;AACX,QAAM,CAAC,IAAI,EAAE,IAAIA,eAAa,WAAW,CAAC,MAAM,IAAI,CAAC;AACrD,QAAM,CAAC,IAAI,EAAE,IAAIA,eAAa,WAAW,CAAC,MAAM,IAAI,CAAC;AACrD,QAAM,QAAQ,KAAK,IAAI,KAAK,EAAE;AAC9B,QAAM,SAAS,KAAK,IAAI,KAAK,EAAE;AAC/B,QAAM,IAAI,KAAK,IAAI,IAAI,EAAE;AACzB,QAAM,IAAI,KAAK,IAAI,IAAI,EAAE;AACzB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU,CAAC;AAAA,IACX,YAAY;AAAA,MACV,OAAO;AAAA,MACP,GAAG,EAAE,SAAS;AAAA,MACd,GAAG,EAAE,SAAS;AAAA,MACd,OAAO,MAAM,SAAS;AAAA,MACtB,QAAQ,OAAO,SAAS;AAAA,IAC1B;AAAA,EACF;AACF;AAKO,IAAM,sBAAsB;;;Ae1T5B,IAAM,WAAW;AAAA,EACtB,aAAa;AAAA,IACX,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa;AAAA,IACb,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,0BAA0B;AAAA,IAC1B,MAAM;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,kBAAkB;AAAA,IAClB,WAAW;AAAA,EACb;AAAA,EACA,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,sBAAsB;AAAA,IACtB,KAAK;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,eAAe;AAAA,IACf,WAAW;AAAA,EACb;AACF;;;ACxOA,SAAS,aAAAC,kBAAiB;AAC1B;AAAA,EAKE;AAAA,OAGK;;;ACVP,SAAS,gBAAAC,sBAAiC;AAEnC,SAAS,kBAAkB,QAUpB;AACZ,QAAM,EAAE,MAAM,MAAM,MAAM,KAAK,IAAI,OAAO;AAC1C,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,aAAa,OAAO,cAAc;AACxC,QAAM,YAAmB,CAAC;AAG1B,QAAM,iBAAiB,CAAC,GAAW,MAAc;AAC/C,UAAM,CAAC,cAAc,YAAY,IAAIA,eAAa,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;AAC1E,WAAO,EAAE,GAAG,cAAc,GAAG,aAAa;AAAA,EAC5C;AAGA,WAAS,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU;AAClE,UAAM,QAAQ,eAAe,GAAG,IAAI;AACpC,UAAM,MAAM,eAAe,GAAG,IAAI;AAElC,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,MAAM,EAAE,SAAS;AAAA,QACrB,IAAI,MAAM,EAAE,SAAS;AAAA,QACrB,IAAI,IAAI,EAAE,SAAS;AAAA,QACnB,IAAI,IAAI,EAAE,SAAS;AAAA,QACnB,QAAQ,SAAS,UAAU;AAAA,QAC3B,iBAAiB,OAAO,KAAK,IAAI,OAAO,UAAU,CAAC,GAAG,SAAS;AAAA,QAC/D,kBAAkB;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AAGA,WAAS,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU;AAClE,UAAM,QAAQ,eAAe,MAAM,CAAC;AACpC,UAAM,MAAM,eAAe,MAAM,CAAC;AAElC,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,MAAM,EAAE,SAAS;AAAA,QACrB,IAAI,MAAM,EAAE,SAAS;AAAA,QACrB,IAAI,IAAI,EAAE,SAAS;AAAA,QACnB,IAAI,IAAI,EAAE,SAAS;AAAA,QACnB,QAAQ,SAAS,UAAU;AAAA,QAC3B,iBAAiB,OAAO,KAAK,IAAI,OAAO,UAAU,CAAC,GAAG,SAAS;AAAA,QAC/D,kBAAkB;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,YAAY;AACd,aAAS,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU;AAClE,eAAS,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU;AAClE,cAAM,QAAQ,eAAe,GAAG,CAAC;AAEjC,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,MAAM;AAAA,UACN,YAAY;AAAA,YACV,IAAI,MAAM,IAAI,KAAK,SAAS;AAAA,YAC5B,IAAI,MAAM,IAAI,GAAG,SAAS;AAAA,YAC1B,MAAM,SAAS,UAAU;AAAA,YACzB,cACG,WAAW,IACZ,KAAK,IAAI,OAAO,UAAU,CAAC,GAC3B,SAAS;AAAA,YACX,gBAAgB;AAAA,YAChB,eAAe;AAAA,YACf,qBAAqB;AAAA,YACrB,eAAe;AAAA,UACjB;AAAA,UACA,UAAU;AAAA,YACR;AAAA,cACE,MAAM;AAAA,cACN,OAAO,GAAG,CAAC,IAAI,CAAC;AAAA,cAChB,MAAM;AAAA,cACN,YAAY,CAAC;AAAA,cACb,UAAU,CAAC;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY,EAAE,OAAO,OAAO;AAAA,IAC5B,UAAU;AAAA,EACZ;AACF;;;AC3GA,SAAS,gBAAAC,sBAAiC;AAQnC,SAAS,2BAA2B,QAG7B;AACZ,QAAM,EAAE,QAAQ,UAAU,IAAI;AAC9B,QAAM,qBAA4B,CAAC;AAEnC,aAAW,SAAS,QAAQ;AAE1B,UAAM,CAAC,IAAI,EAAE,IAAIA,eAAa,WAAW,CAAC,MAAM,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC;AACvE,UAAM,CAAC,IAAI,EAAE,IAAIA,eAAa,WAAW,CAAC,MAAM,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC;AACvE,UAAM,CAAC,IAAI,EAAE,IAAIA,eAAa,WAAW,CAAC,MAAM,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC;AACvE,UAAM,CAAC,IAAI,EAAE,IAAIA,eAAa,WAAW,CAAC,MAAM,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC;AAGvE,uBAAmB,KAAK;AAAA,MACtB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;AAAA,QACtD,QAAQ,SAAS,UAAU;AAAA,QAC3B,iBAAiB,OAAO,KAAK,IAAI,UAAU,CAAC,GAAG,SAAS;AAAA,QACxD,kBAAkB;AAAA,MACpB;AAAA,IACF,CAAC;AAGD,UAAM,CAAC,QAAQ,MAAM,IAAIA,eAAa,WAAW;AAAA,MAC/C,MAAM,IAAI;AAAA,MACV,MAAM,IAAI;AAAA,IACZ,CAAC;AAGD,uBAAmB,KAAK;AAAA,MACtB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,GAAG,OAAO,SAAS;AAAA,QACnB,GAAG,OAAO,SAAS;AAAA,QACnB,MAAM,SAAS,UAAU;AAAA,QACzB,cAAc,MAAM,KAAK,IAAI,UAAU,CAAC,GAAG,SAAS;AAAA,QACpD,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,qBAAqB;AAAA,MACvB;AAAA,MACA,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,OAAO,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC;AAAA,UAC5C,MAAM;AAAA,UACN,YAAY,CAAC;AAAA,UACb,UAAU,CAAC;AAAA,QACb;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY,EAAE,OAAO,iBAAiB;AAAA,IACtC,UAAU;AAAA,EACZ;AACF;;;AClEO,SAAS,kCACd,MACA,UAAU,KACF;AACR,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,OAAO;AAClB,MAAI,OAAO,OAAO;AAElB,QAAM,WAAW;AAGjB,aAAW,QAAQ,MAAM;AACvB,QAAI,KAAK,SAAS,uBAAuB;AACvC,mBAAa,KAAK,QAAQ,KAAK,MAAM,KAAK,YAAY,CAAC;AAAA,IACzD,WAAW,KAAK,SAAS,kBAAkB;AACzC,mBAAa,KAAK,QAAQ,EAAE,OAAO,UAAU,QAAQ,SAAS,GAAG,CAAC;AAAA,IACpE,WAAW,KAAK,SAAS,0BAA0B;AACjD,UAAI,KAAK,UAAU,QAAQ;AACzB,qBAAa,KAAK,QAAQ,KAAK,MAAM,CAAC;AAAA,MACxC,WAAW,KAAK,UAAU,QAAQ;AAChC,qBAAa,KAAK,OAAO,EAAE,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC;AACvD,qBAAa,KAAK,KAAK,EAAE,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC;AAAA,MACvD;AAAA,IACF,WAAW,KAAK,SAAS,uBAAuB;AAC9C,mBAAa,KAAK,QAAQ,EAAE,OAAO,GAAG,QAAQ,EAAE,GAAG,CAAC;AAAA,IACtD;AAAA,EACF;AAGA,UAAQ;AACR,UAAQ;AACR,UAAQ;AACR,UAAQ;AAER,SAAO,EAAE,MAAM,MAAM,MAAM,KAAK;AAEhC,WAAS,aAAa,QAAa,MAAW,UAAkB;AAC9D,UAAM,UAAU;AAAA,MACd,EAAE,GAAG,CAAC,KAAK,QAAQ,GAAG,GAAG,CAAC,KAAK,SAAS,EAAE;AAAA,MAC1C,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,CAAC,KAAK,SAAS,EAAE;AAAA,MACzC,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,SAAS,EAAE;AAAA,MACxC,EAAE,GAAG,CAAC,KAAK,QAAQ,GAAG,GAAG,KAAK,SAAS,EAAE;AAAA,IAC3C;AAEA,eAAW,UAAU,SAAS;AAC5B,YAAM,WACJ,OAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,OAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,OAAO;AACzE,YAAM,WACJ,OAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,OAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,OAAO;AACzE,aAAO,KAAK,IAAI,MAAM,QAAQ;AAC9B,aAAO,KAAK,IAAI,MAAM,QAAQ;AAC9B,aAAO,KAAK,IAAI,MAAM,QAAQ;AAC9B,aAAO,KAAK,IAAI,MAAM,QAAQ;AAAA,IAChC;AAAA,EACF;AACF;;;ACjEA,SAAS,UAAU;AAQnB,SAAiB,eAA+B;AAChD,OAA0B;AAC1B;AAAA,EACE,gBAAAC;AAAA,EACA,WAAAC;AAAA,OAGK;;;ACZA,IAAM,mBAAmB,CAAC,cAAsB;AACrD,SAAO,KAAK,IAAI,UAAU,CAAC,IAAI;AACjC;;;ACmBA,IAAM,uBAAuB,CAAC,QAAgB,WAA2B;AAEvE,QAAM,KAAK,SAAS,IAAI,SAAS,IAAI,KAAK,KAAK;AAC/C,QAAM,KAAK,SAAS,IAAI,SAAS,IAAI,KAAK,KAAK;AAG/C,MAAI,OAAO,KAAK,IAAI,KAAK,EAAE;AAE3B,MAAI,OAAO,KAAK,IAAI;AAClB,WAAO,IAAI,KAAK,KAAK;AAAA,EACvB;AACA,SAAO;AACT;AAEO,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,MAOM;AAEJ,QAAM,gBAAgB,SAAS,IAAI,CAAC,SAAS;AAC3C,UAAM,KAAK,KAAK,OAAO,IAAI,aAAa,OAAO;AAC/C,UAAM,KAAK,KAAK,OAAO,IAAI,aAAa,OAAO;AAC/C,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAK,MAAM,IAAI,EAAE;AAAA,IAC1B;AAAA,EACF,CAAC;AAGD,QAAM,mBAAmB,OAAO,MAAM,IAAI,CAAC,SAAS;AAClD,UAAM,KAAK,KAAK,IAAI,OAAO,OAAO;AAClC,UAAM,KAAK,KAAK,IAAI,OAAO,OAAO;AAClC,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAK,MAAM,IAAI,EAAE;AAAA,IAC1B;AAAA,EACF,CAAC;AAID,gBAAc,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC9C,mBAAiB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEjD,QAAM,UAGD,CAAC;AAGN,QAAM,kBAAkB,oBAAI,IAAgC;AAG5D,aAAW,gBAAgB,eAAe;AACxC,QAAI,YAGO;AAGX,eAAW,mBAAmB,kBAAkB;AAE9C,UAAI,gBAAgB,IAAI,gBAAgB,IAAI,EAAG;AAE/C,YAAM,YAAY;AAAA,QAChB,aAAa;AAAA,QACb,gBAAgB;AAAA,MAClB;AAEA,UAAI,cAAc,QAAQ,YAAY,UAAU,WAAW;AACzD,oBAAY;AAAA,UACV,YAAY,gBAAgB;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,aAAa,UAAU,YAAY,KAAK,KAAK,GAAG;AAClD,cAAQ,KAAK;AAAA,QACX,SAAS,aAAa;AAAA,QACtB,YAAY,UAAU;AAAA,MACxB,CAAC;AACD,sBAAgB,IAAI,UAAU,UAAU;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO;AACT;;;ACvHA,SAAsB,WAAAC,UAAS,SAAAC,QAAO,aAAAC,kBAAiB;AAIhD,SAAS,mBACd,IACA,IACA,IACA,IACQ;AAER,QAAM,KAAK,GAAG,IAAI,GAAG;AACrB,QAAM,KAAK,GAAG,IAAI,GAAG;AAGrB,QAAM,mBAAmB,KAAK,MAAM,GAAG,IAAI,GAAG,MAAM,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAC1E,QAAM,sBAAsB,KAAK,MAAM,GAAG,IAAI,GAAG,MAAM,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAE7E,QAAM,IAAI,sBAAsB;AAGhC,QAAM,kBAAkBA,WAAU,IAAI,EAAE;AACxC,QAAM,cAAcD,OAAM,GAAG,CAAC;AAE9B,SAAOD,SAAQ,iBAAiB,WAAW;AAC7C;;;ACxBA,OAA6B;AAStB,IAAM,mBAAmB,CAAC,aAA0B;AACzD,SAAO,aAAa,UAAU,OAAO,aAAa,eAAe,OAAO;AAC1E;AAEO,IAAM,uBAAuB,CAClC,WACA,aACG;AACH,SAAO,KAAK,IAAI,UAAU,CAAC,IAAI,iBAAiB,QAAQ;AAC1D;;;ACjBA,SAAS,gBAAAG,sBAA6C;AAE/C,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,MAIiB;AACf,QAAM,eAAeA,eAAa,uBAAuB,UAAU;AAEnE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,MACV,GAAG,aAAa,EAAE,SAAS;AAAA,MAC3B,GAAG,aAAa,EAAE,SAAS;AAAA,MAC3B,MAAM;AAAA,MACN,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,MACf,aAAa,GAAG,qBAAqB,uBAAuB,OAAO,CAAC;AAAA,IACtE;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;;;ALfA,IAAM,8BAGF;AAAA,EACF,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,eAAe;AACjB;AAEA,IAAM,oCAGF;AAAA,EACF,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AACjB;AAEO,IAAM,mDAAmD,CAAC;AAAA,EAC/D,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AACF,MAImB;AACjB,QAAM,aAA0B,CAAC;AAEjC,QAAM,SAAqB,QAAgB,aAAa,WAAY;AAEpE,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,sBAAsB;AAAA,QACpB,MAAM,qBAAqB,aAAa,WAAW;AAAA,QACnD,YAAY,aAAa;AAAA,QACzB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,WAAW,GAAG,WAAkB,EAAE,eAAe,KAAK;AAAA,IAC1D,wBAAwB,aAAa;AAAA,EACvC,CAAC;AAED,QAAM,eAAe,GAAG,WAAkB,EAAE,iBAAiB;AAAA,IAC3D,aAAa;AAAA,EACf;AAEA,QAAM,0BAA0B,2BAA2B;AAAA,IACzD;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,CAAC,wBAAwB,CAAC,GAAG;AAC/B,WAAO;AAAA,MACL,sBAAsB;AAAA,QACpB,MAAM,oCAAoC,aAAa,WAAW;AAAA,QAClE,YAAY,aAAa;AAAA,QACzB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,4BAA4B;AAAA,IAChC,wBAAwB,CAAC,GAAG,cAAc,OAAO;AAAA,IACjD,wBAAwB,CAAC,GAAG,QAAQ,UAAU,aAAa;AAAA,IAC3D,wBAAwB,CAAC,EAAE;AAAA,IAC3B,wBAAwB,CAAC,EAAE,QAAQ;AAAA,EACrC;AAEA,QAAM,QAAQ,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAC/D,QAAM,QAAQ,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAC/D,QAAM,UAAU,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ;AACnE,QAAM,QAAQ,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK;AAE9D,aAAW,QAAQ,OAAO;AACxB,UAAM,EAAE,QAAQ,OAAO,QAAQ,KAAK,IAAI;AACxC,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,GACE,OACG,IAAI,CAAC,GAAG,MAAM;AACb,gBAAM,CAAC,GAAG,CAAC,IAAIC;AAAA,YACbC,SAAQ,uBAAuB,yBAAyB;AAAA,YACxD,CAAC,EAAE,GAAG,EAAE,CAAC;AAAA,UACX;AACA,iBAAO,GAAG,MAAM,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;AAAA,QACzC,CAAC,EACA,KAAK,GAAG,KAAK,SAAS,OAAO;AAAA,QAClC,QAAQ,SAAS,UAAU;AAAA,QAC3B,MAAM;AAAA,QACN,gBAAgB,GAAG,iBAAiB,qBAAqB,CAAC;AAAA,MAC5D;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb,CAAC;AAAA,EACH;AAEA,aAAW,QAAQ,OAAO;AACxB,UAAM,gBAAgBD;AAAA,MACpBC,SAAQ,uBAAuB,yBAAyB;AAAA,MACxD;AAAA,IACF;AACA,QAAI,YAAY;AAChB,QAAI,KAAK,SAAS,SAAS;AACzB,kBAAY,cAAc,QAAQ;AAAA,IACpC,WAAW,KAAK,SAAS,SAAS;AAChC,kBAAY,aAAa,wBAAwB;AAAA,IACnD;AACA,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,GAAG,cAAc,EAAE,SAAS;AAAA,QAC5B,GAAG,cAAc,EAAE,SAAS;AAAA,QAC5B,qBAAqB,kCAAkC,KAAK,MAAM;AAAA,QAClE,eAAe,4BAA4B,KAAK,MAAM;AAAA,QACtD,eAAe;AAAA,QACf,aAAa,GAAG,qBAAqB,uBAAuB,sBAAsB,CAAC;AAAA,MACrF;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,UACN,YAAY,CAAC;AAAA,UACb,UAAU,CAAC;AAAA,QACb;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAIA,aAAW,OAAO,OAAO;AACvB,UAAM,eAAeD;AAAA,MACnBC,SAAQ,uBAAuB,yBAAyB;AAAA,MACxD;AAAA,IACF;AACA,UAAM,sBAAsBA;AAAA,MAC1B;AAAA,MACA;AAAA,IACF,EAAE;AAEF,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,GAAG,aAAa,EAAE,SAAS;AAAA,QAC3B,GAAG,aAAa,EAAE,SAAS;AAAA,QAC3B,QAAQ,IAAI,QAAQ,qBAAqB,SAAS;AAAA,QAClD,SAAS,IAAI,SAAS,qBAAqB,SAAS;AAAA,QACpD,MAAM;AAAA,MACR;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb,CAAC;AAAA,EACH;AAGA,aAAW,QAAQ,OAAO,OAAO;AAC/B,UAAM,gBAAgBD;AAAA,MACpBC,SAAQ,uBAAuB,yBAAyB;AAAA,MACxD;AAAA,IACF;AACA,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,cAAc,EAAE,SAAS;AAAA,QAC7B,IAAI,cAAc,EAAE,SAAS;AAAA,QAC7B,GAAG,GAAG,sBAAsB,IAAI,IAAI;AAAA,QACpC,MAAM;AAAA,QACN,QAAQ,SAAS,UAAU;AAAA,MAC7B;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AM7NA,SAAS,MAAAC,WAAU;AASnB,OAAgC;AAChC,OAA0B;AAC1B,SAAS,gBAAAC,sBAAiC;;;ACL1C,OAA0C;AAC1C,OAAmB;;;ACDnB,SAAS,gBAAAC,sBAAiC;AAC1C,SAAS,MAAAC,WAAU;AAGnB,IAAM,uBAAuB;AAMtB,IAAM,oCAAoC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKmB;AACjB,QAAM,aAA0B,CAAC;AAEjC,QAAM,UAAUC,IAAG,WAAkB,EAAE,YAAY,IAAI,QAAQ,cAAc;AAE7E,QAAM,cAAc;AAAA,IAClB,GAAG,QAAQ,OAAO;AAAA,IAClB,GAAG,QAAQ,OAAO;AAAA,EACpB;AAIA,QAAM,oBAAoB,QAAQ,gCAAgC;AAElE,UAAQ,QAAQ,mBAAmB;AAAA,IACjC,KAAK;AACH,kBAAY,KAAK;AACjB;AAAA,IACF,KAAK;AACH,kBAAY,KAAK;AACjB;AAAA,IACF,KAAK;AACH,kBAAY,KAAK;AACjB;AAAA,IACF,KAAK;AACH,kBAAY,KAAK;AACjB;AAAA,EACJ;AAEA,QAAM,mBAAmBC,eAAa,WAAW,QAAQ,MAAM;AAC/D,QAAM,oBAAoBA,eAAa,WAAW,WAAW;AAG7D,QAAM,cAAc,EAAE,GAAG,QAAQ,OAAO;AAExC,UAAQ,QAAQ,mBAAmB;AAAA,IACjC,KAAK;AACH,kBAAY,KAAK;AACjB;AAAA,IACF,KAAK;AACH,kBAAY,KAAK;AACjB;AAAA,IACF,KAAK;AACH,kBAAY,KAAK;AACjB;AAAA,IACF,KAAK;AACH,kBAAY,KAAK;AACjB;AAAA,EACJ;AACA,QAAM,gBAAgBA,eAAa,WAAW,WAAW;AAGzD,aAAW,KAAK;AAAA,IACd,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,MACP,IAAI,cAAc,EAAE,SAAS;AAAA,MAC7B,IAAI,cAAc,EAAE,SAAS;AAAA,MAC7B,IAAI,kBAAkB,EAAE,SAAS;AAAA,MACjC,IAAI,kBAAkB,EAAE,SAAS;AAAA,MACjC,gBAAgB,GAAG,iBAAiB,SAAS,CAAC;AAAA,IAChD;AAAA,IACA,OAAO;AAAA,IACP,UAAU,CAAC;AAAA,EACb,CAAC;AAGD,aAAW,KAAK;AAAA,IACd,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,MACP,IAAI,iBAAiB,EAAE,SAAS;AAAA,MAChC,IAAI,iBAAiB,EAAE,SAAS;AAAA,MAChC,IAAI,KAAK,IAAI,UAAU,CAAC,IAAI,sBAAsB,SAAS;AAAA,MAC3D,gBAAgB,GAAG,iBAAiB,SAAS,CAAC;AAAA,IAChD;AAAA,IACA,OAAO;AAAA,IACP,UAAU,CAAC;AAAA,EACb,CAAC;AAED,SAAO;AACT;;;ACvGO,IAAM,iCAAiC,CAC5C,SACG;AACH,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,EAAE,GAAG,GAAG,GAAG,GAAG;AAAA,IACvB,KAAK;AACH,aAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACtB,KAAK;AACH,aAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACtB,KAAK;AACH,aAAO,EAAE,GAAG,IAAI,GAAG,EAAE;AAAA,EACzB;AACA,QAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AACzC;;;ACXA,SAAS,gBAAAC,sBAAiC;AAEnC,IAAM,0CAA0C,CAAC,WAKrC;AACjB,QAAM,aAA0B,CAAC;AACjC,QAAM,EAAE,SAAS,cAAc,WAAW,YAAY,IAAI;AAE1D,QAAM,mBAAmB;AAAA,IACvB,GAAG,QAAQ,OAAO;AAAA,IAClB,GAAG,QAAQ,OAAO;AAAA,EACpB;AAEA,MAAI,CAAC,QAAQ,kBAAmB,QAAO,CAAC;AACxC,QAAM,YAAY,+BAA+B,QAAQ,iBAAiB;AAE1E,QAAM,sBAAsB,QAAQ,gCAAgC;AAIpE,mBAAiB,KAAM,UAAU,IAAI,sBAAuB;AAC5D,mBAAiB,KAAM,UAAU,IAAI,sBAAuB;AAG5D,QAAM,yBAAyBA,eAAa,WAAW,gBAAgB;AAEvE,MACE,QAAQ,sBAAsB,SAC9B,QAAQ,sBAAsB,UAC9B;AAEA,2BAAuB,KAAK;AAAA,EAC9B,OAAO;AAEL,2BAAuB,KAAK;AAAA,EAC9B;AAEA,aAAW,KAAK;AAAA,IACd,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,MACP,GAAG,uBAAuB,EAAE,SAAS;AAAA,MACrC,GAAG,uBAAuB,EAAE,SAAS;AAAA,MACrC,OAAO;AAAA,MACP,MAAM,SAAS,UAAU;AAAA,MACzB,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,aAAa,GAAG,qBAAqB,WAAW,YAAY,CAAC;AAAA,MAC7D,WACE,QAAQ,sBAAsB,SAC9B,QAAQ,sBAAsB,WAC1B,cAAc,uBAAuB,CAAC,IAAI,uBAAuB,CAAC,MAClE;AAAA,IACR;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,OAAO,QAAQ,YAAY,SAAS,KAAK;AAAA,QACzC,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AAED,SAAO;AACT;;;ACvEA,SAAS,gBAAAC,sBAAiC;AAE1C,IAAM,0BAA0B;AAEzB,IAAM,qCAAqC,CAAC,WAKhC;AACjB,QAAM,aAA0B,CAAC;AACjC,QAAM,EAAE,SAAS,cAAc,WAAW,YAAY,IAAI;AAE1D,QAAM,mBAAmB;AAAA,IACvB,GAAG,QAAQ,OAAO;AAAA,IAClB,GAAG,QAAQ,OAAO;AAAA,EACpB;AAEA,MAAI,CAAC,QAAQ,kBAAmB,QAAO,CAAC;AACxC,QAAM,YAAY,+BAA+B,QAAQ,iBAAiB;AAE1E,QAAM,sBAAsB,QAAQ,gCAAgC;AAIpE,mBAAiB,KACf,UAAU,KAAK,sBAAsB;AACvC,mBAAiB,KACf,UAAU,KAAK,sBAAsB;AAGvC,QAAM,yBAAyBA,eAAa,WAAW,gBAAgB;AAEvE,QAAM,QACJ,QAAQ,qBACR,aAAa,cAAc,MAAM,QAAQ,UAAU,EAAE;AAEvD,MAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,aAAW,KAAK;AAAA,IACd,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,MACP,GAAG,uBAAuB,EAAE,SAAS;AAAA,MACrC,GAAG,uBAAuB,EAAE,SAAS;AAAA,MACrC,OAAO;AAAA,MACP,MAAM,SAAS,UAAU;AAAA,MACzB,eACE,QAAQ,sBAAsB,UAC9B,QAAQ,sBAAsB,WAC1B,UACA;AAAA,MACN,qBAAqB;AAAA,MACrB,aAAa,GAAG,qBAAqB,WAAW,YAAY,CAAC;AAAA,MAC7D,WACE,QAAQ,sBAAsB,SAC9B,QAAQ,sBAAsB,WAC1B,cAAc,uBAAuB,CAAC,IAAI,uBAAuB,CAAC,MAClE;AAAA,IACR;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,OAAO,SAAS;AAAA,QAChB,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AAED,SAAO;AACT;;;AJvEO,IAAM,mCAAmC,CAAC,WAK9B;AACjB,QAAM,aAA0B,CAAC;AACjC,QAAM,EAAE,SAAS,cAAc,WAAW,YAAY,IAAI;AAE1D,aAAW,KAAK,GAAG,kCAAkC,MAAM,CAAC;AAC5D,aAAW,KAAK,GAAG,wCAAwC,MAAM,CAAC;AAClE,aAAW,KAAK,GAAG,mCAAmC,MAAM,CAAC;AAE7D,SAAO;AACT;;;ADTO,IAAM,gDAAgD,CAAC;AAAA,EAC5D,WAAW;AAAA,EACX;AAAA,EACA;AACF,MAImB;AACjB,QAAM,eAAeC,IAAG,WAAkB,EAAE,iBAAiB;AAAA,IAC3D,aAAa;AAAA,EACf;AACA,QAAM,aAA0B,CAAC;AAEjC,QAAM,yBAAyBC,eAAa,WAAW;AAAA,IACrD,GAAG,aAAa,OAAO,IAAI,aAAa,KAAK,QAAQ;AAAA,IACrD,GAAG,aAAa,OAAO,IAAI,aAAa,KAAK,SAAS;AAAA,EACxD,CAAC;AACD,QAAM,6BAA6BA,eAAa,WAAW;AAAA,IACzD,GAAG,aAAa,OAAO,IAAI,aAAa,KAAK,QAAQ;AAAA,IACrD,GAAG,aAAa,OAAO,IAAI,aAAa,KAAK,SAAS;AAAA,EACxD,CAAC;AACD,QAAM,uBACJ,2BAA2B,IAAI,uBAAuB;AACxD,QAAM,wBACJ,2BAA2B,IAAI,uBAAuB;AAGxD,aAAW,KAAK;AAAA,IACd,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,MACV,OAAO;AAAA,MACP,GAAG,uBAAuB,EAAE,SAAS;AAAA,MACrC,GAAG,uBAAuB,EAAE,SAAS;AAAA,MACrC,OAAO,qBAAqB,SAAS;AAAA,MACrC,QAAQ,sBAAsB,SAAS;AAAA,MACvC,gBAAgB,GAAG,iBAAiB,SAAS,CAAC;AAAA,IAChD;AAAA,IACA,UAAU,CAAC;AAAA,EACb,CAAC;AAED,QAAM,8BAA8BA,eAAa,WAAW;AAAA,IAC1D,GAAG,aAAa,OAAO,IAAI,aAAa,KAAK,QAAQ;AAAA,IACrD,GAAG,aAAa,OAAO,IAAI,aAAa,KAAK,SAAS,IAAI;AAAA;AAAA,EAC5D,CAAC;AACD,QAAM,aAAa,qBAAqB,WAAW,qBAAqB;AAGxE,MAAI,cAAc,0BAA0B;AAC1C,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO;AAAA,QACP,GAAG,4BAA4B,EAAE,SAAS;AAAA,QAC1C,GAAG,4BAA4B,EAAE,SAAS;AAAA,QAC1C,eAAe;AAAA,QACf,eAAe;AAAA;AAAA,QACf,qBAAqB;AAAA,QACrB,aAAa,GAAG,UAAU;AAAA,MAC5B;AAAA,MACA,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,OAAO,aAAa;AAAA,UACpB,MAAM;AAAA,UACN,YAAY,CAAC;AAAA,UACb,UAAU,CAAC;AAAA,QACb;AAAA,MACF;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,MAAI,cAAc,MAAM;AACtB,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO;AAAA,QACP,GAAG,4BAA4B,EAAE,SAAS;AAAA,QAC1C,IAAI,4BAA4B,IAAI,aAAa,KAAK,SAAS;AAAA,QAC/D,eAAe;AAAA,QACf,eAAe;AAAA;AAAA,QACf,qBAAqB;AAAA,QACrB,aAAa,GAAG,UAAU;AAAA,MAC5B;AAAA,MACA,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,OAAO,aAAa,QAAQ;AAAA,UAC5B,MAAM;AAAA,UACN,YAAY,CAAC;AAAA,UACb,UAAU,CAAC;AAAA,QACb;AAAA,MACF;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,QAAM,iBAAiBD,IAAG,WAAkB,EAAE,eAAe,KAAK;AAAA,IAChE,wBAAwB,aAAa;AAAA,EACvC,CAAC;AAED,aAAW,WAAW,gBAAgB;AACpC,eAAW;AAAA,MACT,GAAG,iCAAiC;AAAA,QAClC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AMnIO,SAAS,uCAAuC,QAIvC;AACd,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,UAAU,aAAa;AACzB,WAAO,iDAAiD,MAAM;AAAA,EAChE;AAEA,SAAO,8CAA8C,MAAM;AAC7D;;;AChBA,SAAS,gBAAAE,sBAAiC;AAEnC,SAAS,mCACd,aACA,WACa;AACb,MAAI,YAAY,UAAU,QAAQ;AAEhC,QAAI,CAAC,YAAY,SAAS,IAAIA,eAAa,WAAW;AAAA,MACpD,YAAY,OAAO,IAAI,YAAY,KAAK,QAAQ;AAAA,MAChD,YAAY,OAAO,IAAI,YAAY,KAAK,SAAS;AAAA,IACnD,CAAC;AACD,QAAI,CAAC,aAAa,YAAY,IAAIA,eAAa,WAAW;AAAA,MACxD,YAAY,OAAO,IAAI,YAAY,KAAK,QAAQ;AAAA,MAChD,YAAY,OAAO,IAAI,YAAY,KAAK,SAAS;AAAA,IACnD,CAAC;AACA,KAAC,WAAW,YAAY,IAAI;AAAA,MAC3B,KAAK,IAAI,WAAW,YAAY;AAAA,MAChC,KAAK,IAAI,WAAW,YAAY;AAAA,IAClC;AAGA,UAAM,QAAQ,KAAK,IAAI,cAAc,UAAU;AAC/C,UAAM,SAAS,KAAK,IAAI,eAAe,SAAS;AAEhD,UAAM,CAAC,eAAe,aAAa,IAAIA,eAAa,WAAW;AAAA,MAC7D,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,IACrB,CAAC;AAED,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,YAAY;AAAA,UACV,GAAG,WAAW,SAAS;AAAA,UACvB,GAAG,UAAU,SAAS;AAAA,UACtB,OAAO,MAAM,SAAS;AAAA,UACtB,QAAQ,OAAO,SAAS;AAAA,UACxB,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,iBAAiB,OAAO,KAAK,IAAI,UAAU,CAAC,GAAG,SAAS;AAAA,UACxD,oBAAoB;AAAA,QACtB;AAAA,QACA,UAAU,YAAY,QAClB;AAAA,UACE;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,OAAO;AAAA,YACP,YAAY;AAAA,cACV,GAAG,cAAc,SAAS;AAAA,cAC1B,IAAI,gBAAgB,IAAI,SAAS;AAAA,cACjC,eAAe;AAAA,cACf,cAAc,MAAM,KAAK,IAAI,UAAU,CAAC,GAAG,SAAS;AAAA,cACpD,MAAM;AAAA,YACR;AAAA,YACA,UAAU;AAAA,cACR;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO,YAAY;AAAA,gBACnB,MAAM;AAAA,gBACN,YAAY,CAAC;AAAA,gBACb,UAAU,CAAC;AAAA,cACb;AAAA,YACF;AAAA,UACF;AAAA,QACF,IACA,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACA,MAAI,YAAY,UAAU,QAAQ;AAEhC,UAAM,CAAC,cAAc,YAAY,IAAIA,eAAa,WAAW;AAAA,MAC3D,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,UAAM,CAAC,YAAY,UAAU,IAAIA,eAAa,WAAW;AAAA,MACvD,YAAY,IAAI;AAAA,MAChB,YAAY,IAAI;AAAA,IAClB,CAAC;AAGD,UAAM,cAAc,eAAe,cAAc;AACjD,UAAM,cAAc,eAAe,cAAc;AAEjD,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,YAAY;AAAA,UACV,IAAI,aAAa,SAAS;AAAA,UAC1B,IAAI,aAAa,SAAS;AAAA,UAC1B,IAAI,WAAW,SAAS;AAAA,UACxB,IAAI,WAAW,SAAS;AAAA,UACxB,QAAQ;AAAA,UACR,iBAAiB,OAAO,KAAK,IAAI,UAAU,CAAC,GAAG,SAAS;AAAA,UACxD,oBAAoB;AAAA,QACtB;AAAA,QACA,UAAU,YAAY,QAClB;AAAA,UACE;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,OAAO;AAAA,YACP,YAAY;AAAA,cACV,GAAG,WAAW,SAAS;AAAA,cACvB,IAAI,aAAa,IAAI,SAAS;AAAA,cAC9B,eAAe;AAAA,cACf,cAAc,MAAM,KAAK,IAAI,UAAU,CAAC,GAAG,SAAS;AAAA,cACpD,MAAM;AAAA,YACR;AAAA,YACA,UAAU;AAAA,cACR;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO,YAAY;AAAA,gBACnB,MAAM;AAAA,gBACN,YAAY,CAAC;AAAA,gBACb,UAAU,CAAC;AAAA,cACb;AAAA,YACF;AAAA,UACF;AAAA,QACF,IACA,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC;AACV;;;ACjIA,SAAS,gBAAAC,sBAAiC;AAEnC,SAAS,qBACd,OACA,WACa;AACb,QAAM,QAAQ,MAAM;AACpB,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,QAAM,aAA0B,CAAC;AAEjC,MAAI,OAAO;AAGX,WAAS,YAAY,GAAG,YAAY,MAAM,QAAQ,aAAa;AAC7D,UAAM,OAAO,MAAM,SAAS;AAE5B,QAAI,KAAK,YAAa;AAGtB,UAAM,CAAC,aAAa,WAAW,IAAIA,eAAa,WAAW;AAAA,MACzD,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,IACZ,CAAC;AACD,UAAM,CAAC,WAAW,SAAS,IAAIA,eAAa,WAAW;AAAA,MACrD,KAAK,GAAG;AAAA,MACR,KAAK,GAAG;AAAA,IACV,CAAC;AAGD,QAAI,cAAc,KAAK,MAAM,YAAY,CAAC,GAAG,aAAa;AACxD,cAAQ,KAAK,WAAW,IAAI,WAAW,MAAM,SAAS,IAAI,SAAS;AAAA,IACrE,OAAO;AACL,cAAQ,MAAM,SAAS,IAAI,SAAS;AAAA,IACtC;AAAA,EACF;AAGA,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,YAAa;AAGvB,UAAM,CAAC,aAAa,WAAW,IAAIA,eAAa,WAAW;AAAA,MACzD,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,IACZ,CAAC;AACD,UAAM,CAAC,WAAW,SAAS,IAAIA,eAAa,WAAW;AAAA,MACrD,KAAK,GAAG;AAAA,MACR,KAAK,GAAG;AAAA,IACV,CAAC;AAED,UAAM,QAAQ,cAAc,aAAa;AACzC,UAAM,QAAQ,cAAc,aAAa;AAGzC,UAAM,KAAK,YAAY;AACvB,UAAM,KAAK,YAAY;AACvB,UAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AACvC,UAAM,YAAY,MAAM;AAGxB,UAAM,QAAS,CAAC,KAAK,MAAO;AAC5B,UAAM,QAAS,KAAK,MAAO;AAG3B,UAAM,WAAW,OAAO;AACxB,UAAM,WAAW,OAAO,KAAK,IAAI,KAAK;AAGtC,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,GAAG,KAAK,WAAW,IAAI,WAAW,MAAM,QAAQ,IAAI,QAAQ,IAAI,SAAS,IAAI,SAAS;AAAA,QACtF,QAAQ,SAAS,UAAU;AAAA,QAC3B,MAAM;AAAA,QACN,gBAAgB,GAAG,iBAAiB,SAAS,IAAI,GAAG;AAAA,QACpD,kBAAkB;AAAA,MACpB;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb,CAAC;AACD,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,GAAG,KAAK,WAAW,IAAI,WAAW,MAAM,QAAQ,IAAI,QAAQ,IAAI,SAAS,IAAI,SAAS;AAAA,QACtF,QAAQ,SAAS,UAAU;AAAA,QAC3B,MAAM;AAAA,QACN,gBAAgB,GAAG,iBAAiB,SAAS,CAAC;AAAA,QAC9C,kBAAkB;AAAA,MACpB;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb,CAAC;AAAA,EACH;AAEA,MAAI,MAAM;AACR,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO;AAAA,QACP,GAAG;AAAA,QACH,QAAQ,SAAS,UAAU;AAAA,QAC3B,MAAM;AAAA,QACN,gBAAgB,GAAG,iBAAiB,SAAS,CAAC;AAAA,QAC9C,kBAAkB;AAAA,MACpB;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,IACb,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,WAAW;AACnB,eAAW,YAAY,MAAM,WAAW;AACtC,YAAM,CAAC,SAAS,OAAO,IAAIA,eAAa,WAAW;AAAA,QACjD,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,IAAI,QAAQ,SAAS;AAAA,UACrB,IAAI,QAAQ,SAAS;AAAA,UACrB,IAAI,KAAK,IAAI,UAAU,CAAC,IAAI,MAAM,SAAS;AAAA,UAC3C,MAAM,SAAS,UAAU;AAAA,QAC3B;AAAA,QACA,OAAO;AAAA,QACP,UAAU,CAAC;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AClIA;AAAA,EACE,gBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC;AAAA,OAEK;;;AChBA,IAAM,mBAAmB;AAAA,EAC9B,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,GAAG;AAAA,IACD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;;;ACxvBO,IAAM,oBAAoB,CAAC,SAAyB;AACzD,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI,aAAa;AACjB,aAAW,QAAQ,MAAM;AACvB,UAAM,UAAU,iBAAiB,IAAqC;AACtE,QAAI,SAAS;AACX,oBAAc,QAAQ;AAAA,IACxB,OAAO;AAEL,oBAAc,iBAAiB,GAAG,EAAE;AAAA,IACtC;AAAA,EACF;AAGA,SAAO,aAAa;AACtB;;;AFKA,IAAM,wBAAwB;AAK9B,IAAM,kBAAkB;AACxB,IAAM,sCAAsC;AAErC,IAAM,iCAAiC,CAC5C,aACA,0BACgB;AAChB,MAAI,CAAC,YAAY,KAAM,QAAO,CAAC;AAC/B,QAAM,aAA0B,CAAC;AAEjC,QAAM,aAAa,qBAAqB,uBAAuB,WAAW;AAC1E,QAAM,aAAa,iBAAiB,WAAW;AAC/C,QAAM,eAAe,kBAAkB,YAAY,QAAQ,EAAE;AAG7D,QAAM,eAAeC,eAAa,uBAAuB,YAAY,MAAM;AAE3E,QAAM,oBAAoB;AAAA,IACxB,YAAY;AAAA,EACd;AAEA,QAAM,sBAAsB,EAAE,GAAG,kBAAkB;AACnD,sBAAoB,KAAK;AAEzB,QAAM,eACJ,eACA,wBAAwB,IACxB,sCAAsC,YAAY,KAAK,SACvD;AACF,QAAM,uBAAuB,YAAY,kBACrCA,eAAa,uBAAuB,YAAY,eAAe,IAC/D;AAAA,IACE,GACE,aAAa,IACZ,oBAAoB,IAAI,eAAe,aAAc;AAAA,IACxD,GACE,aAAa,IACZ,oBAAoB,IAAI,eAAe,aAAc;AAAA,EAC1D;AACJ,QAAM,qBAAqB,YAAY,mBAAmB;AAAA,IACxD,GACE,YAAY,OAAO,IAClB,kBAAkB,IAAI,eAAe,aAAc;AAAA,IACtD,GACE,YAAY,OAAO,IAClB,kBAAkB,IAAI,eAAe,aAAc;AAAA,EACxD;AAGA,QAAM,eAAe;AAAA,IACnB,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,EACT,EAAE,YAAY,WAAW;AAGzB,QAAM,sBAAuD;AAAA;AAAA,IAE3D;AAAA,MACE,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA;AAAA,IAEA;AAAA,MACE,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA;AAAA,IAEA;AAAA,MACE,GACE,wBAAwB,IACxB,kBACA,sCAAsC,YAAY,KAAK,SACvD;AAAA,MACF,GAAG;AAAA,IACL;AAAA;AAAA,IAEA;AAAA,MACE,GACE,wBAAwB,IACxB,kBACA,sCAAsC,YAAY,KAAK,SACvD;AAAA,MACF,GAAG;AAAA,IACL;AAAA;AAAA,IAEA;AAAA,MACE,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF,EAAE;AAAA,IAAI,CAAC,sBACLA;AAAA,MACEC;AAAA,QACE;AAAA,QACAC,WAAU,mBAAmB,GAAG,mBAAmB,CAAC;AAAA,QACpDC,OAAM,UAAU;AAAA,QAChBC,QAAQ,eAAe,MAAO,KAAK,EAAE;AAAA,MACvC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ;AAAA,QACR,oBAAoB,CAAC,EAAG,CAAC,IAAI,oBAAoB,CAAC,EAAG,CAAC;AAAA,QACtD,oBAAoB,CAAC,EAAG,CAAC,IAAI,oBAAoB,CAAC,EAAG,CAAC;AAAA,QACtD,oBAAoB,CAAC,EAAG,CAAC,IAAI,oBAAoB,CAAC,EAAG,CAAC;AAAA,QACtD,oBAAoB,CAAC,EAAG,CAAC,IAAI,oBAAoB,CAAC,EAAG,CAAC;AAAA,QACtD,oBAAoB,CAAC,EAAG,CAAC,IAAI,oBAAoB,CAAC,EAAG,CAAC;AAAA;AAAA;AAK5D,aAAW,KAAK;AAAA,IACd,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,MACP,GAAG;AAAA,MACH,MAAM;AAAA,MACN,QAAQ,SAAS,UAAU;AAAA,MAC3B,gBAAgB,GAAG,iBAAiB,qBAAqB,CAAC;AAAA,IAC5D;AAAA,IACA,OAAO;AAAA,IACP,UAAU,CAAC;AAAA,EACb,CAAC;AAED,QAAM,gBAAgB;AAAA,IACpB,GAAG,qBAAqB,IAAI,oBAAoB,IAAI,aAAa;AAAA,IACjE,GAAG,qBAAqB,IAAI,oBAAoB,IAAI,aAAa;AAAA,EACnE;AAEA,QAAM,aAAa;AAAA,IACjB,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,EACT,EAAE,YAAY,WAAW;AAEzB,QAAM,sBAAsB;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK,aAAa,cAAc,CAAC,IAAI,cAAc,CAAC;AAAA,IACpD,QAAQ,cAAc,cAAc,CAAC,IAAI,cAAc,CAAC;AAAA,EAC1D,EAAE,YAAY,WAAW;AAGzB,aAAW,KAAK;AAAA,IACd,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,MACP,GAAG,cAAc,EAAE,SAAS;AAAA,MAC5B,GAAG,cAAc,EAAE,SAAS;AAAA,MAC5B,MAAM,SAAS,UAAU;AAAA,MACzB,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,eAAe;AAAA,MACf,wBAAwB;AAAA,MACxB,aAAa,GAAG,UAAU;AAAA,MAC1B,WAAW;AAAA,IACb;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,OAAO,YAAY,QAAQ;AAAA,QAC3B,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AAED,SAAO;AACT;;;AnBhLO,SAAS,iCACd,aACA,SACQ;AAER,QAAM,aAAa,kCAAkC,WAAW;AAChE,QAAM,YAAY,WAAW,OAAO,WAAW;AAC/C,QAAM,aAAa,WAAW,OAAO,WAAW;AAEhD,QAAM,WAAW,SAAS,SAAS;AACnC,QAAM,YAAY,SAAS,UAAU;AAGrC,QAAM,qBAAqB,YAAY;AACvC,QAAM,uBAAuB,WAAW;AAExC,MAAI;AACJ,MAAI,qBAAqB,sBAAsB;AAE7C,UAAM,YAAY,WAAW;AAC7B,sBAAkB;AAAA,MAChB,GAAG;AAAA,MACH,IAAI,YAAY,aAAa;AAAA,IAC/B;AAAA,EACF,OAAO;AAEL,UAAM,WAAW,YAAY;AAC7B,sBAAkB;AAAA,MAChB,IAAI,WAAW,YAAY;AAAA,MAC3B,GAAG;AAAA,IACL;AAAA,EACF;AAKA,QAAM,YAAY;AAAA,IAChB;AAAA,MACE,EAAE,GAAG,WAAW,MAAM,GAAG,WAAW,KAAK;AAAA,MACzC,EAAE,GAAG,WAAW,MAAM,GAAG,WAAW,KAAK;AAAA,MACzC,EAAE,GAAG,WAAW,MAAM,GAAG,WAAW,KAAK;AAAA,IAC3C;AAAA,IACA;AAAA,MACE,EAAE,GAAG,gBAAgB,GAAG,GAAG,gBAAgB,EAAE;AAAA,MAC7C,EAAE,GAAG,WAAW,gBAAgB,GAAG,GAAG,gBAAgB,EAAE;AAAA,MACxD,EAAE,GAAG,WAAW,gBAAgB,GAAG,GAAG,YAAY,gBAAgB,EAAE;AAAA,IACtE;AAAA,EACF;AACA,QAAM,cAA2B,CAAC;AAGlC,cAAY,KAAK;AAAA,IACf,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO,SAAS,SAAS;AAAA,MACzB,QAAQ,UAAU,SAAS;AAAA,IAC7B;AAAA,IACA,UAAU,CAAC;AAAA,IACX,OAAO;AAAA,EACT,CAAC;AAGD,MAAI,SAAS,MAAM;AACjB,UAAM,aAAa,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO,CAAC;AACtE,gBAAY;AAAA,MACV,kBAAkB,EAAE,QAAQ,YAAY,WAAW,GAAG,WAAW,CAAC;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,qBAAkC,CAAC;AACzC,QAAM,mBAAgC,CAAC;AACvC,QAAM,eAA4B,CAAC;AACnC,QAAM,cAA2B,CAAC;AAElC,aAAW,OAAO,aAAa;AAC7B,QAAI,IAAI,SAAS,0BAA0B;AACzC,yBAAmB;AAAA,QACjB,GAAG,mCAAmC,KAAK,SAAS;AAAA,MACtD;AAAA,IACF,WAAW,IAAI,SAAS,uBAAuB;AAC7C,uBAAiB;AAAA,QACf,GAAG,uCAAuC;AAAA,UACxC,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,WAAW,IAAI,SAAS,mBAAmB;AACzC,mBAAa,KAAK,GAAG,qBAAqB,KAAK,SAAS,CAAC;AAAA,IAC3D,WAAW,IAAI,SAAS,uBAAuB;AAC7C,kBAAY,KAAK,GAAG,+BAA+B,KAAK,SAAS,CAAC;AAAA,IACpE;AAAA,EACF;AAGA,cAAY;AAAA,IACV,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAGA,MAAI,SAAS,eAAe;AAC1B,gBAAY;AAAA,MACV,2BAA2B;AAAA,QACzB,QAAQ,QAAQ;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,YAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO;AAAA,MACP,OAAO,SAAS,SAAS;AAAA,MACzB,QAAQ,UAAU,SAAS;AAAA,MAC3B,OAAO,qBAAqB,SAAS,UAAU,UAAU;AAAA,IAC3D;AAAA,IACA,UAAU;AAAA;AAAA,MAER;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA;AAAA;AAAA,YAIN,OAAO;AAAA,kCACe,SAAS,UAAU,UAAU;AAAA;AAAA,iDAEd,SAAS,UAAU,iBAAiB;AAAA,8BACvD,SAAS,UAAU,cAAc,aAAa,SAAS,UAAU,iBAAiB;AAAA,qDAC3D,SAAS,UAAU,iBAAiB;AAAA,iCACxD,SAAS,UAAU,IAAI;AAAA,uDACD,SAAS,UAAU,IAAI;AAAA,oCAC1C,SAAS,UAAU,UAAU;AAAA,oCAC7B,SAAS,UAAU,SAAS;AAAA,wCACxB,SAAS,UAAU,SAAS;AAAA;AAAA,YAExD,MAAM;AAAA,YACN,YAAY,CAAC;AAAA,YACb,UAAU,CAAC;AAAA,UACb;AAAA,QACF;AAAA,QACA,OAAO;AAAA,QACP,YAAY,CAAC;AAAA,MACf;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA,OAAO;AAAA,EACT;AAEA,SAAOC,WAAU,SAAS;AAC5B;AAKO,IAAM,4BAA4B;","names":["applyToPoint","compose","translate","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","rotate","translate","matrixToString","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","translate","applyToPoint","stringify","applyToPoint","applyToPoint","applyToPoint","compose","compose","scale","translate","applyToPoint","applyToPoint","compose","su","applyToPoint","applyToPoint","su","su","applyToPoint","applyToPoint","applyToPoint","su","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","rotate","scale","translate","applyToPoint","compose","translate","scale","rotate","stringify"]}
|