From 59f10060907c2054521619d659b23b1747a06f55 Mon Sep 17 00:00:00 2001
From: Alexander Wang <alex@terrastruct.com>
Date: Wed, 20 Mar 2024 15:52:15 -0700
Subject: [PATCH 1/5] make get writeable refs public

---
 d2oracle/edit.go | 32 +++++++-------------------------
 d2oracle/get.go  | 18 ++++++++++++++++++
 2 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/d2oracle/edit.go b/d2oracle/edit.go
index 376fb9e164..ec622e415a 100644
--- a/d2oracle/edit.go
+++ b/d2oracle/edit.go
@@ -199,7 +199,7 @@ func ReconnectEdge(g *d2graph.Graph, boardPath []string, edgeKey string, srcKey,
 
 	refs := edge.References
 	if baseAST != g.AST {
-		refs = getWriteableEdgeRefs(edge, baseAST)
+		refs = GetWriteableEdgeRefs(edge, baseAST)
 		if len(refs) == 0 || refs[0].ScopeAST != baseAST {
 			// TODO null
 			return nil, OutsideScopeError{}
@@ -387,7 +387,7 @@ func _set(g *d2graph.Graph, baseAST *d2ast.Map, key string, tag, value *string)
 
 			var maybeNewScope *d2ast.Map
 			if baseAST != g.AST || imported {
-				writeableRefs := getWriteableRefs(obj, baseAST)
+				writeableRefs := GetWriteableRefs(obj, baseAST)
 				for _, ref := range writeableRefs {
 					if ref.MapKey != nil && ref.MapKey.Value.Map != nil {
 						maybeNewScope = ref.MapKey.Value.Map
@@ -414,7 +414,7 @@ func _set(g *d2graph.Graph, baseAST *d2ast.Map, key string, tag, value *string)
 		writeableLabelMK := true
 		var objK *d2ast.Key
 		if baseAST != g.AST || imported {
-			writeableRefs := getWriteableRefs(obj, baseAST)
+			writeableRefs := GetWriteableRefs(obj, baseAST)
 			if len(writeableRefs) > 0 {
 				objK = writeableRefs[0].MapKey
 			}
@@ -497,7 +497,7 @@ func _set(g *d2graph.Graph, baseAST *d2ast.Map, key string, tag, value *string)
 		imported = IsImportedEdge(baseAST, edge)
 		refs := edge.References
 		if baseAST != g.AST || imported {
-			refs = getWriteableEdgeRefs(edge, baseAST)
+			refs = GetWriteableEdgeRefs(edge, baseAST)
 		}
 		onlyInChain := true
 		for _, ref := range refs {
@@ -920,7 +920,7 @@ func Delete(g *d2graph.Graph, boardPath []string, key string) (_ *d2graph.Graph,
 		} else {
 			refs := e.References
 			if len(boardPath) > 0 {
-				refs := getWriteableEdgeRefs(e, baseAST)
+				refs := GetWriteableEdgeRefs(e, baseAST)
 				if len(refs) != len(e.References) {
 					mk.Value = d2ast.MakeValueBox(&d2ast.Null{})
 				}
@@ -991,7 +991,7 @@ func Delete(g *d2graph.Graph, boardPath []string, key string) (_ *d2graph.Graph,
 			return g, nil
 		}
 		if len(boardPath) > 0 {
-			writeableRefs := getWriteableRefs(obj, baseAST)
+			writeableRefs := GetWriteableRefs(obj, baseAST)
 			if len(writeableRefs) != len(obj.References) {
 				mk.Value = d2ast.MakeValueBox(&d2ast.Null{})
 			}
@@ -1759,7 +1759,7 @@ func move(g *d2graph.Graph, boardPath []string, key, newKey string, includeDesce
 	}
 
 	if len(boardPath) > 0 {
-		writeableRefs := getWriteableRefs(obj, baseAST)
+		writeableRefs := GetWriteableRefs(obj, baseAST)
 		if len(writeableRefs) != len(obj.References) {
 			return nil, OutsideScopeError{}
 		}
@@ -3226,21 +3226,3 @@ func filterReservedPath(path []*d2ast.StringBox) (filtered []*d2ast.StringBox) {
 	}
 	return
 }
-
-func getWriteableRefs(obj *d2graph.Object, writeableAST *d2ast.Map) (out []d2graph.Reference) {
-	for i, ref := range obj.References {
-		if ref.ScopeAST == writeableAST && ref.Key.Range.Path == writeableAST.Range.Path {
-			out = append(out, obj.References[i])
-		}
-	}
-	return
-}
-
-func getWriteableEdgeRefs(edge *d2graph.Edge, writeableAST *d2ast.Map) (out []d2graph.EdgeReference) {
-	for i, ref := range edge.References {
-		if ref.ScopeAST == writeableAST {
-			out = append(out, edge.References[i])
-		}
-	}
-	return
-}
diff --git a/d2oracle/get.go b/d2oracle/get.go
index 6b8b2e259b..3883bc24e6 100644
--- a/d2oracle/get.go
+++ b/d2oracle/get.go
@@ -245,3 +245,21 @@ func GetID(key string) string {
 
 	return d2format.Format(d2ast.RawString(mk.Key.Path[len(mk.Key.Path)-1].Unbox().ScalarString(), true))
 }
+
+func GetWriteableRefs(obj *d2graph.Object, writeableAST *d2ast.Map) (out []d2graph.Reference) {
+	for i, ref := range obj.References {
+		if ref.ScopeAST == writeableAST && ref.Key.Range.Path == writeableAST.Range.Path {
+			out = append(out, obj.References[i])
+		}
+	}
+	return
+}
+
+func GetWriteableEdgeRefs(edge *d2graph.Edge, writeableAST *d2ast.Map) (out []d2graph.EdgeReference) {
+	for i, ref := range edge.References {
+		if ref.ScopeAST == writeableAST {
+			out = append(out, edge.References[i])
+		}
+	}
+	return
+}

From 600bc093bbf6631b0a3f4ef482c57d18de53f4cb Mon Sep 17 00:00:00 2001
From: Alexander Wang <alex@terrastruct.com>
Date: Wed, 20 Mar 2024 16:03:09 -0700
Subject: [PATCH 2/5] prevent cycle in d2chaos sequence diagram

---
 d2chaos/d2chaos.go | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/d2chaos/d2chaos.go b/d2chaos/d2chaos.go
index 96f9cd906c..bf6961d4e6 100644
--- a/d2chaos/d2chaos.go
+++ b/d2chaos/d2chaos.go
@@ -137,6 +137,9 @@ func (gs *dslGenState) edge() error {
 		if err != nil {
 			return err
 		}
+		if src == dst && gs.nodeShapes[dst] == d2target.ShapeSequenceDiagram {
+			break
+		}
 		if gs.findOuterSequenceDiagram(src) == gs.findOuterSequenceDiagram(dst) {
 			break
 		}

From b18e6ee0c4c1122d8b8fbf552c0e906d25ba8717 Mon Sep 17 00:00:00 2001
From: Alexander Wang <alex@terrastruct.com>
Date: Wed, 20 Mar 2024 16:10:48 -0700
Subject: [PATCH 3/5] ta

---
 .../testdata/TestCLI_E2E/empty-base.exp.svg   | 166 +++++++++---------
 1 file changed, 83 insertions(+), 83 deletions(-)

diff --git a/e2etests-cli/testdata/TestCLI_E2E/empty-base.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/empty-base.exp.svg
index 8606e515dc..9e791f1e1b 100644
--- a/e2etests-cli/testdata/TestCLI_E2E/empty-base.exp.svg
+++ b/e2etests-cli/testdata/TestCLI_E2E/empty-base.exp.svg
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.6.3-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 368 766"><svg id="d2-svg" width="368" height="766" viewBox="-101 -101 368 766"><style type="text/css"><![CDATA[
-.d2-1574744994 .text-bold {
-	font-family: "d2-1574744994-font-bold";
+.d2-368752464 .text-bold {
+	font-family: "d2-368752464-font-bold";
 }
 @font-face {
-	font-family: d2-1574744994-font-bold;
+	font-family: d2-368752464-font-bold;
 	src: url("data:application/font-woff;base64,d09GRgABAAAAAAeYAAoAAAAADIQAAguFAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAGAAAABgXxHXrmNtYXAAAAFUAAAAOAAAADgAFQCqZ2x5ZgAAAYwAAAIfAAACUCYVnJZoZWFkAAADrAAAADYAAAA2G38e1GhoZWEAAAPkAAAAJAAAACQKfwXFaG10eAAABAgAAAAYAAAAGA0UASpsb2NhAAAEIAAAAA4AAAAOAk4Btm1heHAAAAQwAAAAIAAAACAAHgD3bmFtZQAABFAAAAMoAAAIKgjwVkFwb3N0AAAHeAAAAB0AAAAg/9EAMgADAioCvAAFAAACigJYAAAASwKKAlgAAAFeADIBKQAAAgsHAwMEAwICBGAAAvcAAAADAAAAAAAAAABBREJPACAAIP//Au7/BgAAA9gBESAAAZ8AAAAAAfAClAAAACAAAwAAAAEAAwABAAAADAAEACwAAAAEAAQAAQAAAGX//wAAAGH///+gAAEAAAAAAAEAAgADAAQABQAAeJxMkE9P02Acx3/PQ2llaSBb/25SuvZhfSwgk3VtDQMKbmOaDAIYAaNS5eAFInEMMzwbL8bTOBgPnvRg4s2TJPMNcDXxbOIrMIunsZkukPgGvp/P9wODsAaAd/EJDMAQjEACJAAnbsQzDqWE8x3fJ8qAT1GcW8OJ7qeP1GZsm5lIv9NfhiFa2cEn5/sPVnZ3/4aFQvfDt9PuW3R4CoBhotdGP1AHkkAAFNNy855vWcRkOep5Tk6W4oQSlvVznu+yrCTK30trr5qY2PriuJvdmw2fNmKMXrmSzAirczq/FaxujxhUlZ5o489q3d/OKKkpwlZsUlMViHhLvTaWcQtE0AEGTYsSjsQdievDZElkWZrz3DwxOUmWUdkoagx/2GS0kjm3nZ0Lty1vc8oWr/FG2sWtL9WUtvC8eu84aCxXX18/SwwDAILxXhu1UAdSfUJ0KRpXuOiWJMpOzvMVlkXJ8sHS7Rel6cpomaTdILihTguzmU1+/mjjbn1+TAm16tLiijTyOH0V+u6010Yd3AIB0pet+sPUdf6rZF1g/jw8KIR5+2aSbTZiTGoZqzQhTIrEy/JvjtePFkbV6ufz4kyKNMTkWWK4WLlTBtx3/4U6oF70uYREaThDlp1c5D7g5CMK0iu1W8X9QuVRlsHdn7HlGdebsXbef6VTpscv1DfW60GwVxIyQ55j3E+NoVnbzQLAPwAAAP//AQAA//9bXX0SAAABAAAAAguFHqCSr18PPPUAAQPoAAAAANhdoIQAAAAA3WYvNv43/sQIbQPxAAEAAwACAAAAAAAAAAEAAAPY/u8AAAiY/jf+NwhtAAEAAAAAAAAAAAAAAAAAAAAGArIAUAIPACoCPQBBAdMAJAI9ACcCBgAkAAAALABkAJYAwgD0ASgAAAABAAAABgCQAAwAYwAHAAEAAAAAAAAAAAAAAAAABAADeJyclM9uG1UUxn9ObNMKwQJFVbqJ7oJFkejYVEnVNiuH1IpFFAePC0JCSBPP+I8ynhl5Jg7hCVjzFrxFVzwEz4FYo/l87NgF0SaKknx37vnznXO+c4Ed/mabSvUh8Ec9MVxhr35ueIsH9RPD27TrW4arPKn9abhGWJsbrvN5rWf4I95WfzP8gP3qT4YfslttG/6YZ9Udw59sO/4y/Cn7vF3gCrzgV8MVdskMb7HDj4a3eYTFrFR5RNNwjc/YM1xnD+gzoSBmQsIIx5AJI66YEZHjEzFjwpCIEEeHFjGFviYEQo7Rf34N8CmYESjimAJHjE9MQM7YIv4ir5RzZRzqNLO7FgVjAi7kcUlAgiNlREpCxKXiFBRkvKJBg5yB+GYU5HjkTIjxSJkxokGXNqf0GTMhx9FWpJKZT8qQgmsC5XdmUXZmQERCbqyuSAjF04lfJO8Opzi6ZLJdj3y6EeFLHN/Ju+SWyvYrPP26NWabeZdsAubqZ6yuxLq51gTHui3ztvhWuOAV7l792WTy/h6F+l8o8gVXmn+oSSVikuDcLi18Kch3j3Ec6dzBV0e+p0OfE7q8oa9zix49WpzRp8Nr+Xbp4fiaLmccy6MjvLhrSzFn/IDjGzqyKWNH1p/FxCJ+JjN15+I4Ux1TMvW8ZO6p1kgV3n3C5Q6lG+rI5TPQHpWWTvNLtGcBI1NFJoZT9XKpjdz6F5oipqqlnO3tfbkNc9u95RbfkGqHS7UuOJWTWzB631S9dzRzrR+PgJCUC1kMSJnSoOBGvM8JuCLGcazunWhLClornzLPjVQSMRWDDonizMj0NzDd+MZ9sKF7Z29JKP+S6eWqqvtkcerV7YzeqHvLO9+6HK1NoGFTTdfUNBDXxLQfaafW+fvyzfW6pTzliJSY8F8vwDM8muxzwCFjZRjoZm6vQ1MvRJOXHKr6SyJZDaXnyCIc4PGcAw54yfN3+rhk4oyLW3FZz93imCO6HH5QFQv7Lke8Xn37/6y/i2lTtTierk4v7j3FJ3dQ6xfas9v3sqeJlZOYW7TbrTgjYFpycbvrNbnHeP8AAAD//wEAAP//9LdPUXicYmBmAIP/5xiMGLAAAAAAAP//AQAA//8vAQIDAAAA");
 }]]></style><style type="text/css"><![CDATA[.shape {
   shape-rendering: geometricPrecision;
@@ -18,78 +18,78 @@
   opacity: 0.5;
 }
 
-		.d2-1574744994 .fill-N1{fill:#0A0F25;}
-		.d2-1574744994 .fill-N2{fill:#676C7E;}
-		.d2-1574744994 .fill-N3{fill:#9499AB;}
-		.d2-1574744994 .fill-N4{fill:#CFD2DD;}
-		.d2-1574744994 .fill-N5{fill:#DEE1EB;}
-		.d2-1574744994 .fill-N6{fill:#EEF1F8;}
-		.d2-1574744994 .fill-N7{fill:#FFFFFF;}
-		.d2-1574744994 .fill-B1{fill:#0D32B2;}
-		.d2-1574744994 .fill-B2{fill:#0D32B2;}
-		.d2-1574744994 .fill-B3{fill:#E3E9FD;}
-		.d2-1574744994 .fill-B4{fill:#E3E9FD;}
-		.d2-1574744994 .fill-B5{fill:#EDF0FD;}
-		.d2-1574744994 .fill-B6{fill:#F7F8FE;}
-		.d2-1574744994 .fill-AA2{fill:#4A6FF3;}
-		.d2-1574744994 .fill-AA4{fill:#EDF0FD;}
-		.d2-1574744994 .fill-AA5{fill:#F7F8FE;}
-		.d2-1574744994 .fill-AB4{fill:#EDF0FD;}
-		.d2-1574744994 .fill-AB5{fill:#F7F8FE;}
-		.d2-1574744994 .stroke-N1{stroke:#0A0F25;}
-		.d2-1574744994 .stroke-N2{stroke:#676C7E;}
-		.d2-1574744994 .stroke-N3{stroke:#9499AB;}
-		.d2-1574744994 .stroke-N4{stroke:#CFD2DD;}
-		.d2-1574744994 .stroke-N5{stroke:#DEE1EB;}
-		.d2-1574744994 .stroke-N6{stroke:#EEF1F8;}
-		.d2-1574744994 .stroke-N7{stroke:#FFFFFF;}
-		.d2-1574744994 .stroke-B1{stroke:#0D32B2;}
-		.d2-1574744994 .stroke-B2{stroke:#0D32B2;}
-		.d2-1574744994 .stroke-B3{stroke:#E3E9FD;}
-		.d2-1574744994 .stroke-B4{stroke:#E3E9FD;}
-		.d2-1574744994 .stroke-B5{stroke:#EDF0FD;}
-		.d2-1574744994 .stroke-B6{stroke:#F7F8FE;}
-		.d2-1574744994 .stroke-AA2{stroke:#4A6FF3;}
-		.d2-1574744994 .stroke-AA4{stroke:#EDF0FD;}
-		.d2-1574744994 .stroke-AA5{stroke:#F7F8FE;}
-		.d2-1574744994 .stroke-AB4{stroke:#EDF0FD;}
-		.d2-1574744994 .stroke-AB5{stroke:#F7F8FE;}
-		.d2-1574744994 .background-color-N1{background-color:#0A0F25;}
-		.d2-1574744994 .background-color-N2{background-color:#676C7E;}
-		.d2-1574744994 .background-color-N3{background-color:#9499AB;}
-		.d2-1574744994 .background-color-N4{background-color:#CFD2DD;}
-		.d2-1574744994 .background-color-N5{background-color:#DEE1EB;}
-		.d2-1574744994 .background-color-N6{background-color:#EEF1F8;}
-		.d2-1574744994 .background-color-N7{background-color:#FFFFFF;}
-		.d2-1574744994 .background-color-B1{background-color:#0D32B2;}
-		.d2-1574744994 .background-color-B2{background-color:#0D32B2;}
-		.d2-1574744994 .background-color-B3{background-color:#E3E9FD;}
-		.d2-1574744994 .background-color-B4{background-color:#E3E9FD;}
-		.d2-1574744994 .background-color-B5{background-color:#EDF0FD;}
-		.d2-1574744994 .background-color-B6{background-color:#F7F8FE;}
-		.d2-1574744994 .background-color-AA2{background-color:#4A6FF3;}
-		.d2-1574744994 .background-color-AA4{background-color:#EDF0FD;}
-		.d2-1574744994 .background-color-AA5{background-color:#F7F8FE;}
-		.d2-1574744994 .background-color-AB4{background-color:#EDF0FD;}
-		.d2-1574744994 .background-color-AB5{background-color:#F7F8FE;}
-		.d2-1574744994 .color-N1{color:#0A0F25;}
-		.d2-1574744994 .color-N2{color:#676C7E;}
-		.d2-1574744994 .color-N3{color:#9499AB;}
-		.d2-1574744994 .color-N4{color:#CFD2DD;}
-		.d2-1574744994 .color-N5{color:#DEE1EB;}
-		.d2-1574744994 .color-N6{color:#EEF1F8;}
-		.d2-1574744994 .color-N7{color:#FFFFFF;}
-		.d2-1574744994 .color-B1{color:#0D32B2;}
-		.d2-1574744994 .color-B2{color:#0D32B2;}
-		.d2-1574744994 .color-B3{color:#E3E9FD;}
-		.d2-1574744994 .color-B4{color:#E3E9FD;}
-		.d2-1574744994 .color-B5{color:#EDF0FD;}
-		.d2-1574744994 .color-B6{color:#F7F8FE;}
-		.d2-1574744994 .color-AA2{color:#4A6FF3;}
-		.d2-1574744994 .color-AA4{color:#EDF0FD;}
-		.d2-1574744994 .color-AA5{color:#F7F8FE;}
-		.d2-1574744994 .color-AB4{color:#EDF0FD;}
-		.d2-1574744994 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><style type="text/css"><![CDATA[@keyframes d2Transition-d2-1574744994-0 {
+		.d2-368752464 .fill-N1{fill:#0A0F25;}
+		.d2-368752464 .fill-N2{fill:#676C7E;}
+		.d2-368752464 .fill-N3{fill:#9499AB;}
+		.d2-368752464 .fill-N4{fill:#CFD2DD;}
+		.d2-368752464 .fill-N5{fill:#DEE1EB;}
+		.d2-368752464 .fill-N6{fill:#EEF1F8;}
+		.d2-368752464 .fill-N7{fill:#FFFFFF;}
+		.d2-368752464 .fill-B1{fill:#0D32B2;}
+		.d2-368752464 .fill-B2{fill:#0D32B2;}
+		.d2-368752464 .fill-B3{fill:#E3E9FD;}
+		.d2-368752464 .fill-B4{fill:#E3E9FD;}
+		.d2-368752464 .fill-B5{fill:#EDF0FD;}
+		.d2-368752464 .fill-B6{fill:#F7F8FE;}
+		.d2-368752464 .fill-AA2{fill:#4A6FF3;}
+		.d2-368752464 .fill-AA4{fill:#EDF0FD;}
+		.d2-368752464 .fill-AA5{fill:#F7F8FE;}
+		.d2-368752464 .fill-AB4{fill:#EDF0FD;}
+		.d2-368752464 .fill-AB5{fill:#F7F8FE;}
+		.d2-368752464 .stroke-N1{stroke:#0A0F25;}
+		.d2-368752464 .stroke-N2{stroke:#676C7E;}
+		.d2-368752464 .stroke-N3{stroke:#9499AB;}
+		.d2-368752464 .stroke-N4{stroke:#CFD2DD;}
+		.d2-368752464 .stroke-N5{stroke:#DEE1EB;}
+		.d2-368752464 .stroke-N6{stroke:#EEF1F8;}
+		.d2-368752464 .stroke-N7{stroke:#FFFFFF;}
+		.d2-368752464 .stroke-B1{stroke:#0D32B2;}
+		.d2-368752464 .stroke-B2{stroke:#0D32B2;}
+		.d2-368752464 .stroke-B3{stroke:#E3E9FD;}
+		.d2-368752464 .stroke-B4{stroke:#E3E9FD;}
+		.d2-368752464 .stroke-B5{stroke:#EDF0FD;}
+		.d2-368752464 .stroke-B6{stroke:#F7F8FE;}
+		.d2-368752464 .stroke-AA2{stroke:#4A6FF3;}
+		.d2-368752464 .stroke-AA4{stroke:#EDF0FD;}
+		.d2-368752464 .stroke-AA5{stroke:#F7F8FE;}
+		.d2-368752464 .stroke-AB4{stroke:#EDF0FD;}
+		.d2-368752464 .stroke-AB5{stroke:#F7F8FE;}
+		.d2-368752464 .background-color-N1{background-color:#0A0F25;}
+		.d2-368752464 .background-color-N2{background-color:#676C7E;}
+		.d2-368752464 .background-color-N3{background-color:#9499AB;}
+		.d2-368752464 .background-color-N4{background-color:#CFD2DD;}
+		.d2-368752464 .background-color-N5{background-color:#DEE1EB;}
+		.d2-368752464 .background-color-N6{background-color:#EEF1F8;}
+		.d2-368752464 .background-color-N7{background-color:#FFFFFF;}
+		.d2-368752464 .background-color-B1{background-color:#0D32B2;}
+		.d2-368752464 .background-color-B2{background-color:#0D32B2;}
+		.d2-368752464 .background-color-B3{background-color:#E3E9FD;}
+		.d2-368752464 .background-color-B4{background-color:#E3E9FD;}
+		.d2-368752464 .background-color-B5{background-color:#EDF0FD;}
+		.d2-368752464 .background-color-B6{background-color:#F7F8FE;}
+		.d2-368752464 .background-color-AA2{background-color:#4A6FF3;}
+		.d2-368752464 .background-color-AA4{background-color:#EDF0FD;}
+		.d2-368752464 .background-color-AA5{background-color:#F7F8FE;}
+		.d2-368752464 .background-color-AB4{background-color:#EDF0FD;}
+		.d2-368752464 .background-color-AB5{background-color:#F7F8FE;}
+		.d2-368752464 .color-N1{color:#0A0F25;}
+		.d2-368752464 .color-N2{color:#676C7E;}
+		.d2-368752464 .color-N3{color:#9499AB;}
+		.d2-368752464 .color-N4{color:#CFD2DD;}
+		.d2-368752464 .color-N5{color:#DEE1EB;}
+		.d2-368752464 .color-N6{color:#EEF1F8;}
+		.d2-368752464 .color-N7{color:#FFFFFF;}
+		.d2-368752464 .color-B1{color:#0D32B2;}
+		.d2-368752464 .color-B2{color:#0D32B2;}
+		.d2-368752464 .color-B3{color:#E3E9FD;}
+		.d2-368752464 .color-B4{color:#E3E9FD;}
+		.d2-368752464 .color-B5{color:#EDF0FD;}
+		.d2-368752464 .color-B6{color:#F7F8FE;}
+		.d2-368752464 .color-AA2{color:#4A6FF3;}
+		.d2-368752464 .color-AA4{color:#EDF0FD;}
+		.d2-368752464 .color-AA5{color:#F7F8FE;}
+		.d2-368752464 .color-AB4{color:#EDF0FD;}
+		.d2-368752464 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><style type="text/css"><![CDATA[@keyframes d2Transition-d2-368752464-0 {
 		0%, 0.000000% {
 				opacity: 0;
 		}
@@ -99,7 +99,7 @@
 		33.333333%, 100% {
 				opacity: 0;
 		}
-}@keyframes d2Transition-d2-1574744994-1 {
+}@keyframes d2Transition-d2-368752464-1 {
 		0%, 33.309524% {
 				opacity: 0;
 		}
@@ -109,24 +109,24 @@
 		66.666667%, 100% {
 				opacity: 0;
 		}
-}@keyframes d2Transition-d2-1574744994-2 {
+}@keyframes d2Transition-d2-368752464-2 {
 		0%, 66.642857% {
 				opacity: 0;
 		}
 		66.666667%, 100.000000% {
 				opacity: 1;
 		}
-}]]></style><g style="animation: d2Transition-d2-1574744994-0 4200ms infinite"  class="d2-1574744994" width="255" height="434" viewBox="-101 -101 255 434"><rect x="-101.000000" y="-101.000000" width="255.000000" height="434.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1919875308)" /></g><mask id="d2-1919875308" maskUnits="userSpaceOnUse" x="-101" y="-101" width="255" height="434">
+}]]></style><g style="animation: d2Transition-d2-368752464-0 4200ms infinite"  class="d2-368752464" width="255" height="434" viewBox="-101 -101 255 434"><rect x="-101.000000" y="-101.000000" width="255.000000" height="434.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1919875308)" /></g><mask id="d2-1919875308" maskUnits="userSpaceOnUse" x="-101" y="-101" width="255" height="434">
 <rect x="-101" y="-101" width="255" height="434" fill="white"></rect>
 <rect x="22.500000" y="22.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
 <rect x="22.500000" y="188.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
-</mask></g><g style="animation: d2Transition-d2-1574744994-1 4200ms infinite"  class="d2-1574744994" width="368" height="600" viewBox="-101 -101 368 600"><rect x="-101.000000" y="-101.000000" width="368.000000" height="600.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="d"><g class="shape" ><rect x="56.000000" y="332.000000" width="54.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="83.000000" y="370.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">d</text></g><g id="c"><g class="shape" ><rect x="113.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="139.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-483309782)" /></g><g id="(b -&gt; d)[0]"><path d="M 26.500000 234.000000 C 26.500000 272.000000 33.299999 292.000000 58.250760 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-483309782)" /></g><g id="(c -&gt; d)[0]"><path d="M 139.500000 234.000000 C 139.500000 272.000000 132.699997 292.000000 107.749240 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-483309782)" /></g><mask id="d2-483309782" maskUnits="userSpaceOnUse" x="-101" y="-101" width="368" height="600">
-<rect x="-101" y="-101" width="368" height="600" fill="white"></rect>
+</mask></g><g style="animation: d2Transition-d2-368752464-1 4200ms infinite"  class="d2-368752464" width="358" height="600" viewBox="-101 -101 358 600"><rect x="-101.000000" y="-101.000000" width="358.000000" height="600.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="d"><g class="shape" ><rect x="51.000000" y="332.000000" width="54.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="78.000000" y="370.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">d</text></g><g id="c"><g class="shape" ><rect x="103.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="129.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-3474616616)" /></g><g id="(b -&gt; d)[0]"><path d="M 26.500000 234.000000 C 26.500000 272.000000 32.700001 292.000000 55.392241 328.600389" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-3474616616)" /></g><g id="(c -&gt; d)[0]"><path d="M 129.500000 234.000000 C 129.500000 272.000000 123.300003 292.000000 100.607759 328.600389" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-3474616616)" /></g><mask id="d2-3474616616" maskUnits="userSpaceOnUse" x="-101" y="-101" width="358" height="600">
+<rect x="-101" y="-101" width="358" height="600" fill="white"></rect>
 <rect x="22.500000" y="22.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
 <rect x="22.500000" y="188.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
-<rect x="78.500000" y="354.500000" width="9" height="21" fill="rgba(0,0,0,0.75)"></rect>
-<rect x="135.500000" y="188.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
-</mask></g><g style="animation: d2Transition-d2-1574744994-2 4200ms infinite"  class="d2-1574744994" width="368" height="766" viewBox="-101 -101 368 766"><rect x="-101.000000" y="-101.000000" width="368.000000" height="766.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="d"><g class="shape" ><rect x="56.000000" y="332.000000" width="54.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="83.000000" y="370.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">d</text></g><g id="c"><g class="shape" ><rect x="113.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="139.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="e"><g class="shape" ><rect x="57.000000" y="498.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="83.500000" y="536.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">e</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(b -&gt; d)[0]"><path d="M 26.500000 234.000000 C 26.500000 272.000000 33.299999 292.000000 58.250760 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(c -&gt; d)[0]"><path d="M 139.500000 234.000000 C 139.500000 272.000000 132.699997 292.000000 107.749240 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(d -&gt; e)[0]"><path d="M 83.000000 400.000000 C 83.000000 438.000000 83.000000 458.000000 83.000000 494.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><mask id="d2-2079318802" maskUnits="userSpaceOnUse" x="-101" y="-101" width="368" height="766">
+<rect x="73.500000" y="354.500000" width="9" height="21" fill="rgba(0,0,0,0.75)"></rect>
+<rect x="125.500000" y="188.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
+</mask></g><g style="animation: d2Transition-d2-368752464-2 4200ms infinite"  class="d2-368752464" width="368" height="766" viewBox="-101 -101 368 766"><rect x="-101.000000" y="-101.000000" width="368.000000" height="766.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="d"><g class="shape" ><rect x="56.000000" y="332.000000" width="54.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="83.000000" y="370.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">d</text></g><g id="c"><g class="shape" ><rect x="113.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="139.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="e"><g class="shape" ><rect x="57.000000" y="498.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="83.500000" y="536.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">e</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(b -&gt; d)[0]"><path d="M 26.500000 234.000000 C 26.500000 272.000000 33.299999 292.000000 58.250760 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(c -&gt; d)[0]"><path d="M 139.500000 234.000000 C 139.500000 272.000000 132.699997 292.000000 107.749240 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(d -&gt; e)[0]"><path d="M 83.000000 400.000000 C 83.000000 438.000000 83.000000 458.000000 83.000000 494.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><mask id="d2-2079318802" maskUnits="userSpaceOnUse" x="-101" y="-101" width="368" height="766">
 <rect x="-101" y="-101" width="368" height="766" fill="white"></rect>
 <rect x="22.500000" y="22.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
 <rect x="22.500000" y="188.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>

From 07156b14b21c3a6ec5446e451b247b352ec112b4 Mon Sep 17 00:00:00 2001
From: Alexander Wang <alex@terrastruct.com>
Date: Wed, 20 Mar 2024 16:18:44 -0700
Subject: [PATCH 4/5] what

---
 .../testdata/TestCLI_E2E/empty-base.exp.svg   | 166 +++++++++---------
 1 file changed, 83 insertions(+), 83 deletions(-)

diff --git a/e2etests-cli/testdata/TestCLI_E2E/empty-base.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/empty-base.exp.svg
index 9e791f1e1b..8606e515dc 100644
--- a/e2etests-cli/testdata/TestCLI_E2E/empty-base.exp.svg
+++ b/e2etests-cli/testdata/TestCLI_E2E/empty-base.exp.svg
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.6.3-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 368 766"><svg id="d2-svg" width="368" height="766" viewBox="-101 -101 368 766"><style type="text/css"><![CDATA[
-.d2-368752464 .text-bold {
-	font-family: "d2-368752464-font-bold";
+.d2-1574744994 .text-bold {
+	font-family: "d2-1574744994-font-bold";
 }
 @font-face {
-	font-family: d2-368752464-font-bold;
+	font-family: d2-1574744994-font-bold;
 	src: url("data:application/font-woff;base64,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");
 }]]></style><style type="text/css"><![CDATA[.shape {
   shape-rendering: geometricPrecision;
@@ -18,78 +18,78 @@
   opacity: 0.5;
 }
 
-		.d2-368752464 .fill-N1{fill:#0A0F25;}
-		.d2-368752464 .fill-N2{fill:#676C7E;}
-		.d2-368752464 .fill-N3{fill:#9499AB;}
-		.d2-368752464 .fill-N4{fill:#CFD2DD;}
-		.d2-368752464 .fill-N5{fill:#DEE1EB;}
-		.d2-368752464 .fill-N6{fill:#EEF1F8;}
-		.d2-368752464 .fill-N7{fill:#FFFFFF;}
-		.d2-368752464 .fill-B1{fill:#0D32B2;}
-		.d2-368752464 .fill-B2{fill:#0D32B2;}
-		.d2-368752464 .fill-B3{fill:#E3E9FD;}
-		.d2-368752464 .fill-B4{fill:#E3E9FD;}
-		.d2-368752464 .fill-B5{fill:#EDF0FD;}
-		.d2-368752464 .fill-B6{fill:#F7F8FE;}
-		.d2-368752464 .fill-AA2{fill:#4A6FF3;}
-		.d2-368752464 .fill-AA4{fill:#EDF0FD;}
-		.d2-368752464 .fill-AA5{fill:#F7F8FE;}
-		.d2-368752464 .fill-AB4{fill:#EDF0FD;}
-		.d2-368752464 .fill-AB5{fill:#F7F8FE;}
-		.d2-368752464 .stroke-N1{stroke:#0A0F25;}
-		.d2-368752464 .stroke-N2{stroke:#676C7E;}
-		.d2-368752464 .stroke-N3{stroke:#9499AB;}
-		.d2-368752464 .stroke-N4{stroke:#CFD2DD;}
-		.d2-368752464 .stroke-N5{stroke:#DEE1EB;}
-		.d2-368752464 .stroke-N6{stroke:#EEF1F8;}
-		.d2-368752464 .stroke-N7{stroke:#FFFFFF;}
-		.d2-368752464 .stroke-B1{stroke:#0D32B2;}
-		.d2-368752464 .stroke-B2{stroke:#0D32B2;}
-		.d2-368752464 .stroke-B3{stroke:#E3E9FD;}
-		.d2-368752464 .stroke-B4{stroke:#E3E9FD;}
-		.d2-368752464 .stroke-B5{stroke:#EDF0FD;}
-		.d2-368752464 .stroke-B6{stroke:#F7F8FE;}
-		.d2-368752464 .stroke-AA2{stroke:#4A6FF3;}
-		.d2-368752464 .stroke-AA4{stroke:#EDF0FD;}
-		.d2-368752464 .stroke-AA5{stroke:#F7F8FE;}
-		.d2-368752464 .stroke-AB4{stroke:#EDF0FD;}
-		.d2-368752464 .stroke-AB5{stroke:#F7F8FE;}
-		.d2-368752464 .background-color-N1{background-color:#0A0F25;}
-		.d2-368752464 .background-color-N2{background-color:#676C7E;}
-		.d2-368752464 .background-color-N3{background-color:#9499AB;}
-		.d2-368752464 .background-color-N4{background-color:#CFD2DD;}
-		.d2-368752464 .background-color-N5{background-color:#DEE1EB;}
-		.d2-368752464 .background-color-N6{background-color:#EEF1F8;}
-		.d2-368752464 .background-color-N7{background-color:#FFFFFF;}
-		.d2-368752464 .background-color-B1{background-color:#0D32B2;}
-		.d2-368752464 .background-color-B2{background-color:#0D32B2;}
-		.d2-368752464 .background-color-B3{background-color:#E3E9FD;}
-		.d2-368752464 .background-color-B4{background-color:#E3E9FD;}
-		.d2-368752464 .background-color-B5{background-color:#EDF0FD;}
-		.d2-368752464 .background-color-B6{background-color:#F7F8FE;}
-		.d2-368752464 .background-color-AA2{background-color:#4A6FF3;}
-		.d2-368752464 .background-color-AA4{background-color:#EDF0FD;}
-		.d2-368752464 .background-color-AA5{background-color:#F7F8FE;}
-		.d2-368752464 .background-color-AB4{background-color:#EDF0FD;}
-		.d2-368752464 .background-color-AB5{background-color:#F7F8FE;}
-		.d2-368752464 .color-N1{color:#0A0F25;}
-		.d2-368752464 .color-N2{color:#676C7E;}
-		.d2-368752464 .color-N3{color:#9499AB;}
-		.d2-368752464 .color-N4{color:#CFD2DD;}
-		.d2-368752464 .color-N5{color:#DEE1EB;}
-		.d2-368752464 .color-N6{color:#EEF1F8;}
-		.d2-368752464 .color-N7{color:#FFFFFF;}
-		.d2-368752464 .color-B1{color:#0D32B2;}
-		.d2-368752464 .color-B2{color:#0D32B2;}
-		.d2-368752464 .color-B3{color:#E3E9FD;}
-		.d2-368752464 .color-B4{color:#E3E9FD;}
-		.d2-368752464 .color-B5{color:#EDF0FD;}
-		.d2-368752464 .color-B6{color:#F7F8FE;}
-		.d2-368752464 .color-AA2{color:#4A6FF3;}
-		.d2-368752464 .color-AA4{color:#EDF0FD;}
-		.d2-368752464 .color-AA5{color:#F7F8FE;}
-		.d2-368752464 .color-AB4{color:#EDF0FD;}
-		.d2-368752464 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><style type="text/css"><![CDATA[@keyframes d2Transition-d2-368752464-0 {
+		.d2-1574744994 .fill-N1{fill:#0A0F25;}
+		.d2-1574744994 .fill-N2{fill:#676C7E;}
+		.d2-1574744994 .fill-N3{fill:#9499AB;}
+		.d2-1574744994 .fill-N4{fill:#CFD2DD;}
+		.d2-1574744994 .fill-N5{fill:#DEE1EB;}
+		.d2-1574744994 .fill-N6{fill:#EEF1F8;}
+		.d2-1574744994 .fill-N7{fill:#FFFFFF;}
+		.d2-1574744994 .fill-B1{fill:#0D32B2;}
+		.d2-1574744994 .fill-B2{fill:#0D32B2;}
+		.d2-1574744994 .fill-B3{fill:#E3E9FD;}
+		.d2-1574744994 .fill-B4{fill:#E3E9FD;}
+		.d2-1574744994 .fill-B5{fill:#EDF0FD;}
+		.d2-1574744994 .fill-B6{fill:#F7F8FE;}
+		.d2-1574744994 .fill-AA2{fill:#4A6FF3;}
+		.d2-1574744994 .fill-AA4{fill:#EDF0FD;}
+		.d2-1574744994 .fill-AA5{fill:#F7F8FE;}
+		.d2-1574744994 .fill-AB4{fill:#EDF0FD;}
+		.d2-1574744994 .fill-AB5{fill:#F7F8FE;}
+		.d2-1574744994 .stroke-N1{stroke:#0A0F25;}
+		.d2-1574744994 .stroke-N2{stroke:#676C7E;}
+		.d2-1574744994 .stroke-N3{stroke:#9499AB;}
+		.d2-1574744994 .stroke-N4{stroke:#CFD2DD;}
+		.d2-1574744994 .stroke-N5{stroke:#DEE1EB;}
+		.d2-1574744994 .stroke-N6{stroke:#EEF1F8;}
+		.d2-1574744994 .stroke-N7{stroke:#FFFFFF;}
+		.d2-1574744994 .stroke-B1{stroke:#0D32B2;}
+		.d2-1574744994 .stroke-B2{stroke:#0D32B2;}
+		.d2-1574744994 .stroke-B3{stroke:#E3E9FD;}
+		.d2-1574744994 .stroke-B4{stroke:#E3E9FD;}
+		.d2-1574744994 .stroke-B5{stroke:#EDF0FD;}
+		.d2-1574744994 .stroke-B6{stroke:#F7F8FE;}
+		.d2-1574744994 .stroke-AA2{stroke:#4A6FF3;}
+		.d2-1574744994 .stroke-AA4{stroke:#EDF0FD;}
+		.d2-1574744994 .stroke-AA5{stroke:#F7F8FE;}
+		.d2-1574744994 .stroke-AB4{stroke:#EDF0FD;}
+		.d2-1574744994 .stroke-AB5{stroke:#F7F8FE;}
+		.d2-1574744994 .background-color-N1{background-color:#0A0F25;}
+		.d2-1574744994 .background-color-N2{background-color:#676C7E;}
+		.d2-1574744994 .background-color-N3{background-color:#9499AB;}
+		.d2-1574744994 .background-color-N4{background-color:#CFD2DD;}
+		.d2-1574744994 .background-color-N5{background-color:#DEE1EB;}
+		.d2-1574744994 .background-color-N6{background-color:#EEF1F8;}
+		.d2-1574744994 .background-color-N7{background-color:#FFFFFF;}
+		.d2-1574744994 .background-color-B1{background-color:#0D32B2;}
+		.d2-1574744994 .background-color-B2{background-color:#0D32B2;}
+		.d2-1574744994 .background-color-B3{background-color:#E3E9FD;}
+		.d2-1574744994 .background-color-B4{background-color:#E3E9FD;}
+		.d2-1574744994 .background-color-B5{background-color:#EDF0FD;}
+		.d2-1574744994 .background-color-B6{background-color:#F7F8FE;}
+		.d2-1574744994 .background-color-AA2{background-color:#4A6FF3;}
+		.d2-1574744994 .background-color-AA4{background-color:#EDF0FD;}
+		.d2-1574744994 .background-color-AA5{background-color:#F7F8FE;}
+		.d2-1574744994 .background-color-AB4{background-color:#EDF0FD;}
+		.d2-1574744994 .background-color-AB5{background-color:#F7F8FE;}
+		.d2-1574744994 .color-N1{color:#0A0F25;}
+		.d2-1574744994 .color-N2{color:#676C7E;}
+		.d2-1574744994 .color-N3{color:#9499AB;}
+		.d2-1574744994 .color-N4{color:#CFD2DD;}
+		.d2-1574744994 .color-N5{color:#DEE1EB;}
+		.d2-1574744994 .color-N6{color:#EEF1F8;}
+		.d2-1574744994 .color-N7{color:#FFFFFF;}
+		.d2-1574744994 .color-B1{color:#0D32B2;}
+		.d2-1574744994 .color-B2{color:#0D32B2;}
+		.d2-1574744994 .color-B3{color:#E3E9FD;}
+		.d2-1574744994 .color-B4{color:#E3E9FD;}
+		.d2-1574744994 .color-B5{color:#EDF0FD;}
+		.d2-1574744994 .color-B6{color:#F7F8FE;}
+		.d2-1574744994 .color-AA2{color:#4A6FF3;}
+		.d2-1574744994 .color-AA4{color:#EDF0FD;}
+		.d2-1574744994 .color-AA5{color:#F7F8FE;}
+		.d2-1574744994 .color-AB4{color:#EDF0FD;}
+		.d2-1574744994 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><style type="text/css"><![CDATA[@keyframes d2Transition-d2-1574744994-0 {
 		0%, 0.000000% {
 				opacity: 0;
 		}
@@ -99,7 +99,7 @@
 		33.333333%, 100% {
 				opacity: 0;
 		}
-}@keyframes d2Transition-d2-368752464-1 {
+}@keyframes d2Transition-d2-1574744994-1 {
 		0%, 33.309524% {
 				opacity: 0;
 		}
@@ -109,24 +109,24 @@
 		66.666667%, 100% {
 				opacity: 0;
 		}
-}@keyframes d2Transition-d2-368752464-2 {
+}@keyframes d2Transition-d2-1574744994-2 {
 		0%, 66.642857% {
 				opacity: 0;
 		}
 		66.666667%, 100.000000% {
 				opacity: 1;
 		}
-}]]></style><g style="animation: d2Transition-d2-368752464-0 4200ms infinite"  class="d2-368752464" width="255" height="434" viewBox="-101 -101 255 434"><rect x="-101.000000" y="-101.000000" width="255.000000" height="434.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1919875308)" /></g><mask id="d2-1919875308" maskUnits="userSpaceOnUse" x="-101" y="-101" width="255" height="434">
+}]]></style><g style="animation: d2Transition-d2-1574744994-0 4200ms infinite"  class="d2-1574744994" width="255" height="434" viewBox="-101 -101 255 434"><rect x="-101.000000" y="-101.000000" width="255.000000" height="434.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1919875308)" /></g><mask id="d2-1919875308" maskUnits="userSpaceOnUse" x="-101" y="-101" width="255" height="434">
 <rect x="-101" y="-101" width="255" height="434" fill="white"></rect>
 <rect x="22.500000" y="22.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
 <rect x="22.500000" y="188.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
-</mask></g><g style="animation: d2Transition-d2-368752464-1 4200ms infinite"  class="d2-368752464" width="358" height="600" viewBox="-101 -101 358 600"><rect x="-101.000000" y="-101.000000" width="358.000000" height="600.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="d"><g class="shape" ><rect x="51.000000" y="332.000000" width="54.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="78.000000" y="370.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">d</text></g><g id="c"><g class="shape" ><rect x="103.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="129.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-3474616616)" /></g><g id="(b -&gt; d)[0]"><path d="M 26.500000 234.000000 C 26.500000 272.000000 32.700001 292.000000 55.392241 328.600389" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-3474616616)" /></g><g id="(c -&gt; d)[0]"><path d="M 129.500000 234.000000 C 129.500000 272.000000 123.300003 292.000000 100.607759 328.600389" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-3474616616)" /></g><mask id="d2-3474616616" maskUnits="userSpaceOnUse" x="-101" y="-101" width="358" height="600">
-<rect x="-101" y="-101" width="358" height="600" fill="white"></rect>
+</mask></g><g style="animation: d2Transition-d2-1574744994-1 4200ms infinite"  class="d2-1574744994" width="368" height="600" viewBox="-101 -101 368 600"><rect x="-101.000000" y="-101.000000" width="368.000000" height="600.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="d"><g class="shape" ><rect x="56.000000" y="332.000000" width="54.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="83.000000" y="370.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">d</text></g><g id="c"><g class="shape" ><rect x="113.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="139.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-483309782)" /></g><g id="(b -&gt; d)[0]"><path d="M 26.500000 234.000000 C 26.500000 272.000000 33.299999 292.000000 58.250760 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-483309782)" /></g><g id="(c -&gt; d)[0]"><path d="M 139.500000 234.000000 C 139.500000 272.000000 132.699997 292.000000 107.749240 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-483309782)" /></g><mask id="d2-483309782" maskUnits="userSpaceOnUse" x="-101" y="-101" width="368" height="600">
+<rect x="-101" y="-101" width="368" height="600" fill="white"></rect>
 <rect x="22.500000" y="22.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
 <rect x="22.500000" y="188.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
-<rect x="73.500000" y="354.500000" width="9" height="21" fill="rgba(0,0,0,0.75)"></rect>
-<rect x="125.500000" y="188.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
-</mask></g><g style="animation: d2Transition-d2-368752464-2 4200ms infinite"  class="d2-368752464" width="368" height="766" viewBox="-101 -101 368 766"><rect x="-101.000000" y="-101.000000" width="368.000000" height="766.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="d"><g class="shape" ><rect x="56.000000" y="332.000000" width="54.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="83.000000" y="370.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">d</text></g><g id="c"><g class="shape" ><rect x="113.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="139.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="e"><g class="shape" ><rect x="57.000000" y="498.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="83.500000" y="536.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">e</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(b -&gt; d)[0]"><path d="M 26.500000 234.000000 C 26.500000 272.000000 33.299999 292.000000 58.250760 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(c -&gt; d)[0]"><path d="M 139.500000 234.000000 C 139.500000 272.000000 132.699997 292.000000 107.749240 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(d -&gt; e)[0]"><path d="M 83.000000 400.000000 C 83.000000 438.000000 83.000000 458.000000 83.000000 494.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><mask id="d2-2079318802" maskUnits="userSpaceOnUse" x="-101" y="-101" width="368" height="766">
+<rect x="78.500000" y="354.500000" width="9" height="21" fill="rgba(0,0,0,0.75)"></rect>
+<rect x="135.500000" y="188.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
+</mask></g><g style="animation: d2Transition-d2-1574744994-2 4200ms infinite"  class="d2-1574744994" width="368" height="766" viewBox="-101 -101 368 766"><rect x="-101.000000" y="-101.000000" width="368.000000" height="766.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><g id="a"><g class="shape" ><rect x="0.000000" y="0.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">a</text></g><g id="b"><g class="shape" ><rect x="0.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="26.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">b</text></g><g id="d"><g class="shape" ><rect x="56.000000" y="332.000000" width="54.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="83.000000" y="370.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">d</text></g><g id="c"><g class="shape" ><rect x="113.000000" y="166.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="139.500000" y="204.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">c</text></g><g id="e"><g class="shape" ><rect x="57.000000" y="498.000000" width="53.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="83.500000" y="536.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">e</text></g><g id="(a -&gt; b)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 26.500000 68.000000 C 26.500000 106.000000 26.500000 126.000000 26.500000 162.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(b -&gt; d)[0]"><path d="M 26.500000 234.000000 C 26.500000 272.000000 33.299999 292.000000 58.250760 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(c -&gt; d)[0]"><path d="M 139.500000 234.000000 C 139.500000 272.000000 132.699997 292.000000 107.749240 328.692294" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><g id="(d -&gt; e)[0]"><path d="M 83.000000 400.000000 C 83.000000 438.000000 83.000000 458.000000 83.000000 494.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-2079318802)" /></g><mask id="d2-2079318802" maskUnits="userSpaceOnUse" x="-101" y="-101" width="368" height="766">
 <rect x="-101" y="-101" width="368" height="766" fill="white"></rect>
 <rect x="22.500000" y="22.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>
 <rect x="22.500000" y="188.500000" width="8" height="21" fill="rgba(0,0,0,0.75)"></rect>

From 2187bf78a86a13d341844d4bb18cee26813a1e48 Mon Sep 17 00:00:00 2001
From: Alexander Wang <alex@terrastruct.com>
Date: Wed, 20 Mar 2024 16:21:40 -0700
Subject: [PATCH 5/5] fix

---
 d2chaos/d2chaos.go | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/d2chaos/d2chaos.go b/d2chaos/d2chaos.go
index bf6961d4e6..42445a9743 100644
--- a/d2chaos/d2chaos.go
+++ b/d2chaos/d2chaos.go
@@ -137,9 +137,6 @@ func (gs *dslGenState) edge() error {
 		if err != nil {
 			return err
 		}
-		if src == dst && gs.nodeShapes[dst] == d2target.ShapeSequenceDiagram {
-			break
-		}
 		if gs.findOuterSequenceDiagram(src) == gs.findOuterSequenceDiagram(dst) {
 			break
 		}
@@ -149,6 +146,10 @@ func (gs *dslGenState) edge() error {
 		}
 	}
 
+	if src == dst && gs.nodeShapes[dst] == d2target.ShapeSequenceDiagram {
+		return nil
+	}
+
 	srcArrow := "-"
 	if gs.randBool() {
 		srcArrow = "<"