diagram-contracts 0.1.0 → 0.1.2

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/README.md CHANGED
@@ -10,19 +10,25 @@ AI can safely describe diagrams, layouts, and relationship structures; the engin
10
10
 
11
11
  ### AWS System Architecture (Draw TSX → SVG)
12
12
 
13
- Generated from `samples/system-architecture.draw.tsx`. A composite layout combining AWS icons, nested VPC, AlignConstraint, and Connectors.
13
+ [![AWS System Architecture](assets/readme/system-architecture.svg)](assets/readme/system-architecture.draw.tsx)
14
14
 
15
- ![AWS System Architecture](samples/system-architecture.svg)
15
+ Source:
16
+
17
+ - [`assets/readme/system-architecture.draw.tsx`](assets/readme/system-architecture.draw.tsx) — entry diagram
18
+ - [`assets/readme/system-parts.draw.tsx`](assets/readme/system-parts.draw.tsx) — VPC and service part components
19
+ - [`assets/readme/components/aws.draw.tsx`](assets/readme/components/aws.draw.tsx) — reusable AWS primitives (`AwsVpc`, `AwsService`, `AwsAccount`, …)
16
20
 
17
21
  ### ER Diagram (Draw TSX → SVG)
18
22
 
19
- ![ER Diagram](samples/showcase-tsx.svg)
23
+ [![ER Diagram](assets/readme/showcase-tsx.svg)](assets/readme/showcase-tsx.draw.tsx)
24
+
25
+ Source: [`assets/readme/showcase-tsx.draw.tsx`](assets/readme/showcase-tsx.draw.tsx)
20
26
 
21
27
  Regenerate:
22
28
 
23
29
  ```bash
24
- diagram-contracts render samples/system-architecture.draw.tsx -o samples/system-architecture.svg
25
- diagram-contracts render samples/showcase-tsx.draw.tsx -o samples/showcase-tsx.svg
30
+ diagram-contracts render assets/readme/system-architecture.draw.tsx -o assets/readme/system-architecture.svg
31
+ diagram-contracts render assets/readme/showcase-tsx.draw.tsx -o assets/readme/showcase-tsx.svg
26
32
  ```
27
33
 
28
34
  ## Input Formats
@@ -0,0 +1,133 @@
1
+ export function AwsService({ id, service, label }: { id: string; service: string; label: string }) {
2
+ return (
3
+ <VStack id={id} gap={4} align="center" geometry={{ align: `${id}-icon`, connect: `${id}-icon` }}>
4
+ <Icon id={`${id}-icon`} name={`aws:${service}`} width={48} height={48} />
5
+ <Text fontSize={11}>{label}</Text>
6
+ </VStack>
7
+ );
8
+ }
9
+
10
+ export function AwsServiceH({ id, service, label }: { id: string; service: string; label: string }) {
11
+ return (
12
+ <HStack id={id} gap={8} align="center" geometry={{ align: `${id}-icon`, connect: `${id}-icon` }}>
13
+ <Icon id={`${id}-icon`} name={`aws:${service}`} width={40} height={40} />
14
+ <Text fontSize={11}>{label}</Text>
15
+ </HStack>
16
+ );
17
+ }
18
+
19
+ export function AwsServiceSm({ id, service, label }: { id: string; service: string; label: string }) {
20
+ return (
21
+ <VStack id={id} gap={2} align="center" geometry={{ align: `${id}-icon`, connect: `${id}-icon` }}>
22
+ <Icon id={`${id}-icon`} name={`aws:${service}`} width={36} height={36} />
23
+ <Text fontSize={9}>{label}</Text>
24
+ </VStack>
25
+ );
26
+ }
27
+
28
+ export function AwsVpc({ label, children }: { label: string }) {
29
+ return (
30
+ <Box shape="rect" padding={0} stroke="#8c4fff" strokeWidth={2} fill="white">
31
+ <VStack gap={0}>
32
+ <Box shape="rect" fill="#8c4fff" stroke="#8c4fff" strokeWidth={0} padding={8}>
33
+ <HStack gap={6} align="center">
34
+ <Icon name="aws:vpc-group" width={18} height={18} />
35
+ <Text fontWeight="bold" fontSize={12} foreground="white">{label}</Text>
36
+ </HStack>
37
+ </Box>
38
+ {children}
39
+ </VStack>
40
+ </Box>
41
+ );
42
+ }
43
+
44
+ export function AwsPublicSubnet({ label, children }: { label: string }) {
45
+ return (
46
+ <Box shape="rect" padding={0} stroke="#7aa116" strokeWidth={1} strokeStyle="dashed" fill="white">
47
+ <VStack gap={0}>
48
+ <Box shape="rect" fill="#7aa116" stroke="#7aa116" strokeWidth={0} padding={6}>
49
+ <HStack gap={4} align="center">
50
+ <Icon name="aws:subnet-public" width={14} height={14} />
51
+ <Text fontSize={10} foreground="white" fontWeight="bold">{label}</Text>
52
+ </HStack>
53
+ </Box>
54
+ {children}
55
+ </VStack>
56
+ </Box>
57
+ );
58
+ }
59
+
60
+ export function AwsPrivateSubnet({ label, children }: { label: string }) {
61
+ return (
62
+ <Box shape="rect" padding={0} stroke="#00a4a6" strokeWidth={1} strokeStyle="dashed" fill="white">
63
+ <VStack gap={0}>
64
+ <Box shape="rect" fill="#00a4a6" stroke="#00a4a6" strokeWidth={0} padding={6}>
65
+ <HStack gap={4} align="center">
66
+ <Icon name="aws:subnet-private" width={14} height={14} />
67
+ <Text fontSize={10} foreground="white" fontWeight="bold">{label}</Text>
68
+ </HStack>
69
+ </Box>
70
+ {children}
71
+ </VStack>
72
+ </Box>
73
+ );
74
+ }
75
+
76
+ export function AwsAutoScaling({ id, label, geometry, children }: { id: string; label: string; geometry?: Record<string, string> }) {
77
+ return (
78
+ <Box id={id} shape="rect" padding={0} stroke="#ed7100" strokeWidth={1} strokeStyle="dashed" fill="white" geometry={geometry}>
79
+ <VStack gap={0}>
80
+ <Box shape="rect" fill="#ed7100" stroke="#ed7100" strokeWidth={0} padding={6}>
81
+ <HStack gap={4} align="center">
82
+ <Icon name="aws:auto-scaling-group" width={14} height={14} />
83
+ <Text fontSize={10} foreground="white" fontWeight="bold">{label}</Text>
84
+ </HStack>
85
+ </Box>
86
+ {children}
87
+ </VStack>
88
+ </Box>
89
+ );
90
+ }
91
+
92
+ export function AwsAccount({ label, children }: { label: string }) {
93
+ return (
94
+ <Box shape="rect" padding={0} stroke="#e7157b" strokeWidth={2} fill="white">
95
+ <VStack gap={0}>
96
+ <Box shape="rect" fill="#e7157b" stroke="#e7157b" strokeWidth={0} padding={8}>
97
+ <HStack gap={6} align="center">
98
+ <Icon name="aws:aws-account" width={16} height={16} />
99
+ <Text fontWeight="bold" fontSize={12} foreground="white">{label}</Text>
100
+ </HStack>
101
+ </Box>
102
+ {children}
103
+ </VStack>
104
+ </Box>
105
+ );
106
+ }
107
+
108
+ export function AwsRegion({ label, children }: { label: string }) {
109
+ return (
110
+ <Box shape="rect" padding={0} stroke="#00a4a6" strokeWidth={1} strokeStyle="dashed" fill="white">
111
+ <VStack gap={0}>
112
+ <Box shape="rect" fill="#00a4a6" stroke="#00a4a6" strokeWidth={0} padding={6}>
113
+ <HStack gap={4} align="center">
114
+ <Icon name="aws:region-group" width={14} height={14} />
115
+ <Text fontSize={11} foreground="white">{label}</Text>
116
+ </HStack>
117
+ </Box>
118
+ {children}
119
+ </VStack>
120
+ </Box>
121
+ );
122
+ }
123
+
124
+ export function EcsFargateCluster({ id, label }: { id: string; label: string }) {
125
+ return (
126
+ <AwsAutoScaling id={id} label={label}>
127
+ <HStack padding={8} gap={8} align="start">
128
+ <AwsServiceSm id={`${id}-ecs`} service="ecs" label="ECS" />
129
+ <AwsServiceSm id={`${id}-fg`} service="fargate" label="Fargate" />
130
+ </HStack>
131
+ </AwsAutoScaling>
132
+ );
133
+ }
@@ -0,0 +1,137 @@
1
+ <Document id="doc" padding={24} background="white" fontFamily="Inter, sans-serif">
2
+ <VStack id="root" gap={20}>
3
+ <Text id="title" fontSize={18} fontWeight="bold">ER Diagram — E-Commerce</Text>
4
+
5
+ <HStack id="cols" gap={40}>
6
+ <VStack id="col_left" gap={32}>
7
+ <Table id="users">
8
+ <Row id="u_h" fill="#dbeafe">
9
+ <Cell id="u_h1" padding={6} colAlign="left"><Text fontWeight="bold" fontSize={11} foreground="#1e40af">users</Text></Cell>
10
+ <Cell id="u_h2" padding={6} colAlign="center"><Text fontWeight="bold" fontSize={10} foreground="#1e40af">type</Text></Cell>
11
+ </Row>
12
+ <Row id="u1"><Cell id="u1a" padding={5} colAlign="left"><Text fontSize={10} fontWeight="bold">id</Text></Cell><Cell id="u1b" padding={5} colAlign="left"><Text fontSize={10}>PK</Text></Cell></Row>
13
+ <Row id="u2"><Cell id="u2a" padding={5} colAlign="left"><Text fontSize={10}>name</Text></Cell><Cell id="u2b" padding={5} colAlign="left"><Text fontSize={10}>varchar</Text></Cell></Row>
14
+ <Row id="u3"><Cell id="u3a" padding={5} colAlign="left"><Text fontSize={10}>email</Text></Cell><Cell id="u3b" padding={5} colAlign="left"><Text fontSize={10}>varchar</Text></Cell></Row>
15
+ <Row id="u4"><Cell id="u4a" padding={5} colAlign="left"><Text fontSize={10}>created_at</Text></Cell><Cell id="u4b" padding={5} colAlign="left"><Text fontSize={10}>timestamp</Text></Cell></Row>
16
+ </Table>
17
+
18
+ <Table id="addresses">
19
+ <Row id="ad_h" fill="#e0e7ff">
20
+ <Cell id="ad_h1" padding={6} colAlign="left"><Text fontWeight="bold" fontSize={11} foreground="#3730a3">addresses</Text></Cell>
21
+ <Cell id="ad_h2" padding={6} colAlign="center"><Text fontWeight="bold" fontSize={10} foreground="#3730a3">type</Text></Cell>
22
+ </Row>
23
+ <Row id="ad1"><Cell id="ad1a" padding={5} colAlign="left"><Text fontSize={10} fontWeight="bold">id</Text></Cell><Cell id="ad1b" padding={5} colAlign="left"><Text fontSize={10}>PK</Text></Cell></Row>
24
+ <Row id="ad2"><Cell id="ad2a" padding={5} colAlign="left"><Text fontSize={10}>user_id</Text></Cell><Cell id="ad2b" padding={5} colAlign="left"><Text fontSize={10}>FK</Text></Cell></Row>
25
+ <Row id="ad3"><Cell id="ad3a" padding={5} colAlign="left"><Text fontSize={10}>zip</Text></Cell><Cell id="ad3b" padding={5} colAlign="left"><Text fontSize={10}>varchar</Text></Cell></Row>
26
+ <Row id="ad4"><Cell id="ad4a" padding={5} colAlign="left"><Text fontSize={10}>city</Text></Cell><Cell id="ad4b" padding={5} colAlign="left"><Text fontSize={10}>varchar</Text></Cell></Row>
27
+ <Row id="ad5"><Cell id="ad5a" padding={5} colAlign="left"><Text fontSize={10}>line</Text></Cell><Cell id="ad5b" padding={5} colAlign="left"><Text fontSize={10}>varchar</Text></Cell></Row>
28
+ </Table>
29
+ </VStack>
30
+
31
+ <VStack id="col_center" gap={32} align="center">
32
+ <Table id="reviews">
33
+ <Row id="rv_h" fill="#fef9c3">
34
+ <Cell id="rv_h1" padding={6} colAlign="left"><Text fontWeight="bold" fontSize={11} foreground="#854d0e">reviews</Text></Cell>
35
+ <Cell id="rv_h2" padding={6} colAlign="center"><Text fontWeight="bold" fontSize={10} foreground="#854d0e">type</Text></Cell>
36
+ </Row>
37
+ <Row id="rv1"><Cell id="rv1a" padding={5} colAlign="left"><Text fontSize={10} fontWeight="bold">id</Text></Cell><Cell id="rv1b" padding={5} colAlign="left"><Text fontSize={10}>PK</Text></Cell></Row>
38
+ <Row id="rv2"><Cell id="rv2a" padding={5} colAlign="left"><Text fontSize={10}>user_id</Text></Cell><Cell id="rv2b" padding={5} colAlign="left"><Text fontSize={10}>FK</Text></Cell></Row>
39
+ <Row id="rv3"><Cell id="rv3a" padding={5} colAlign="left"><Text fontSize={10}>product_id</Text></Cell><Cell id="rv3b" padding={5} colAlign="left"><Text fontSize={10}>FK</Text></Cell></Row>
40
+ <Row id="rv4"><Cell id="rv4a" padding={5} colAlign="left"><Text fontSize={10}>rating</Text></Cell><Cell id="rv4b" padding={5} colAlign="left"><Text fontSize={10}>int</Text></Cell></Row>
41
+ <Row id="rv5"><Cell id="rv5a" padding={5} colAlign="left"><Text fontSize={10}>comment</Text></Cell><Cell id="rv5b" padding={5} colAlign="left"><Text fontSize={10}>text</Text></Cell></Row>
42
+ </Table>
43
+
44
+ <Table id="orders">
45
+ <Row id="o_h" fill="#fef3c7">
46
+ <Cell id="o_h1" padding={6} colAlign="left"><Text fontWeight="bold" fontSize={11} foreground="#92400e">orders</Text></Cell>
47
+ <Cell id="o_h2" padding={6} colAlign="center"><Text fontWeight="bold" fontSize={10} foreground="#92400e">type</Text></Cell>
48
+ </Row>
49
+ <Row id="o1"><Cell id="o1a" padding={5} colAlign="left"><Text fontSize={10} fontWeight="bold">id</Text></Cell><Cell id="o1b" padding={5} colAlign="left"><Text fontSize={10}>PK</Text></Cell></Row>
50
+ <Row id="o2"><Cell id="o2a" padding={5} colAlign="left"><Text fontSize={10}>user_id</Text></Cell><Cell id="o2b" padding={5} colAlign="left"><Text fontSize={10}>FK</Text></Cell></Row>
51
+ <Row id="o3"><Cell id="o3a" padding={5} colAlign="left"><Text fontSize={10}>status</Text></Cell><Cell id="o3b" padding={5} colAlign="left"><Text fontSize={10}>enum</Text></Cell></Row>
52
+ <Row id="o4"><Cell id="o4a" padding={5} colAlign="left"><Text fontSize={10}>total</Text></Cell><Cell id="o4b" padding={5} colAlign="left"><Text fontSize={10}>decimal</Text></Cell></Row>
53
+ <Row id="o5"><Cell id="o5a" padding={5} colAlign="left"><Text fontSize={10}>ordered_at</Text></Cell><Cell id="o5b" padding={5} colAlign="left"><Text fontSize={10}>timestamp</Text></Cell></Row>
54
+ </Table>
55
+
56
+ <HStack id="order_children" gap={24}>
57
+ <Table id="shipments">
58
+ <Row id="sh_h" fill="#fce7f3">
59
+ <Cell id="sh_h1" padding={6} colAlign="left"><Text fontWeight="bold" fontSize={11} foreground="#9d174d">shipments</Text></Cell>
60
+ <Cell id="sh_h2" padding={6} colAlign="center"><Text fontWeight="bold" fontSize={10} foreground="#9d174d">type</Text></Cell>
61
+ </Row>
62
+ <Row id="sh1"><Cell id="sh1a" padding={5} colAlign="left"><Text fontSize={10} fontWeight="bold">id</Text></Cell><Cell id="sh1b" padding={5} colAlign="left"><Text fontSize={10}>PK</Text></Cell></Row>
63
+ <Row id="sh2"><Cell id="sh2a" padding={5} colAlign="left"><Text fontSize={10}>order_id</Text></Cell><Cell id="sh2b" padding={5} colAlign="left"><Text fontSize={10}>FK</Text></Cell></Row>
64
+ <Row id="sh3"><Cell id="sh3a" padding={5} colAlign="left"><Text fontSize={10}>address_id</Text></Cell><Cell id="sh3b" padding={5} colAlign="left"><Text fontSize={10}>FK</Text></Cell></Row>
65
+ <Row id="sh4"><Cell id="sh4a" padding={5} colAlign="left"><Text fontSize={10}>carrier</Text></Cell><Cell id="sh4b" padding={5} colAlign="left"><Text fontSize={10}>varchar</Text></Cell></Row>
66
+ <Row id="sh5"><Cell id="sh5a" padding={5} colAlign="left"><Text fontSize={10}>shipped_at</Text></Cell><Cell id="sh5b" padding={5} colAlign="left"><Text fontSize={10}>timestamp</Text></Cell></Row>
67
+ </Table>
68
+
69
+ <Table id="payments">
70
+ <Row id="pm_h" fill="#fce7f3">
71
+ <Cell id="pm_h1" padding={6} colAlign="left"><Text fontWeight="bold" fontSize={11} foreground="#9d174d">payments</Text></Cell>
72
+ <Cell id="pm_h2" padding={6} colAlign="center"><Text fontWeight="bold" fontSize={10} foreground="#9d174d">type</Text></Cell>
73
+ </Row>
74
+ <Row id="pm1"><Cell id="pm1a" padding={5} colAlign="left"><Text fontSize={10} fontWeight="bold">id</Text></Cell><Cell id="pm1b" padding={5} colAlign="left"><Text fontSize={10}>PK</Text></Cell></Row>
75
+ <Row id="pm2"><Cell id="pm2a" padding={5} colAlign="left"><Text fontSize={10}>order_id</Text></Cell><Cell id="pm2b" padding={5} colAlign="left"><Text fontSize={10}>FK</Text></Cell></Row>
76
+ <Row id="pm3"><Cell id="pm3a" padding={5} colAlign="left"><Text fontSize={10}>method</Text></Cell><Cell id="pm3b" padding={5} colAlign="left"><Text fontSize={10}>enum</Text></Cell></Row>
77
+ <Row id="pm4"><Cell id="pm4a" padding={5} colAlign="left"><Text fontSize={10}>amount</Text></Cell><Cell id="pm4b" padding={5} colAlign="left"><Text fontSize={10}>decimal</Text></Cell></Row>
78
+ <Row id="pm5"><Cell id="pm5a" padding={5} colAlign="left"><Text fontSize={10}>paid_at</Text></Cell><Cell id="pm5b" padding={5} colAlign="left"><Text fontSize={10}>timestamp</Text></Cell></Row>
79
+ </Table>
80
+
81
+ <Table id="order_items">
82
+ <Row id="oi_h" fill="#fef3c7">
83
+ <Cell id="oi_h1" padding={6} colAlign="left"><Text fontWeight="bold" fontSize={11} foreground="#92400e">order_items</Text></Cell>
84
+ <Cell id="oi_h2" padding={6} colAlign="center"><Text fontWeight="bold" fontSize={10} foreground="#92400e">type</Text></Cell>
85
+ </Row>
86
+ <Row id="oi1"><Cell id="oi1a" padding={5} colAlign="left"><Text fontSize={10} fontWeight="bold">id</Text></Cell><Cell id="oi1b" padding={5} colAlign="left"><Text fontSize={10}>PK</Text></Cell></Row>
87
+ <Row id="oi2"><Cell id="oi2a" padding={5} colAlign="left"><Text fontSize={10}>order_id</Text></Cell><Cell id="oi2b" padding={5} colAlign="left"><Text fontSize={10}>FK</Text></Cell></Row>
88
+ <Row id="oi3"><Cell id="oi3a" padding={5} colAlign="left"><Text fontSize={10}>product_id</Text></Cell><Cell id="oi3b" padding={5} colAlign="left"><Text fontSize={10}>FK</Text></Cell></Row>
89
+ <Row id="oi4"><Cell id="oi4a" padding={5} colAlign="left"><Text fontSize={10}>qty</Text></Cell><Cell id="oi4b" padding={5} colAlign="left"><Text fontSize={10}>int</Text></Cell></Row>
90
+ <Row id="oi5"><Cell id="oi5a" padding={5} colAlign="left"><Text fontSize={10}>unit_price</Text></Cell><Cell id="oi5b" padding={5} colAlign="left"><Text fontSize={10}>decimal</Text></Cell></Row>
91
+ </Table>
92
+ </HStack>
93
+ </VStack>
94
+
95
+ <VStack id="col_right" gap={32}>
96
+ <Table id="categories">
97
+ <Row id="c_h" fill="#dcfce7">
98
+ <Cell id="c_h1" padding={6} colAlign="left"><Text fontWeight="bold" fontSize={11} foreground="#166534">categories</Text></Cell>
99
+ <Cell id="c_h2" padding={6} colAlign="center"><Text fontWeight="bold" fontSize={10} foreground="#166534">type</Text></Cell>
100
+ </Row>
101
+ <Row id="c1"><Cell id="c1a" padding={5} colAlign="left"><Text fontSize={10} fontWeight="bold">id</Text></Cell><Cell id="c1b" padding={5} colAlign="left"><Text fontSize={10}>PK</Text></Cell></Row>
102
+ <Row id="c2"><Cell id="c2a" padding={5} colAlign="left"><Text fontSize={10}>name</Text></Cell><Cell id="c2b" padding={5} colAlign="left"><Text fontSize={10}>varchar</Text></Cell></Row>
103
+ <Row id="c3"><Cell id="c3a" padding={5} colAlign="left"><Text fontSize={10}>parent_id</Text></Cell><Cell id="c3b" padding={5} colAlign="left"><Text fontSize={10}>FK</Text></Cell></Row>
104
+ </Table>
105
+
106
+ <Table id="products">
107
+ <Row id="p_h" fill="#dcfce7">
108
+ <Cell id="p_h1" padding={6} colAlign="left"><Text fontWeight="bold" fontSize={11} foreground="#166534">products</Text></Cell>
109
+ <Cell id="p_h2" padding={6} colAlign="center"><Text fontWeight="bold" fontSize={10} foreground="#166534">type</Text></Cell>
110
+ </Row>
111
+ <Row id="p1"><Cell id="p1a" padding={5} colAlign="left"><Text fontSize={10} fontWeight="bold">id</Text></Cell><Cell id="p1b" padding={5} colAlign="left"><Text fontSize={10}>PK</Text></Cell></Row>
112
+ <Row id="p2"><Cell id="p2a" padding={5} colAlign="left"><Text fontSize={10}>name</Text></Cell><Cell id="p2b" padding={5} colAlign="left"><Text fontSize={10}>varchar</Text></Cell></Row>
113
+ <Row id="p3"><Cell id="p3a" padding={5} colAlign="left"><Text fontSize={10}>category_id</Text></Cell><Cell id="p3b" padding={5} colAlign="left"><Text fontSize={10}>FK</Text></Cell></Row>
114
+ <Row id="p4"><Cell id="p4a" padding={5} colAlign="left"><Text fontSize={10}>price</Text></Cell><Cell id="p4b" padding={5} colAlign="left"><Text fontSize={10}>decimal</Text></Cell></Row>
115
+ <Row id="p5"><Cell id="p5a" padding={5} colAlign="left"><Text fontSize={10}>stock</Text></Cell><Cell id="p5b" padding={5} colAlign="left"><Text fontSize={10}>int</Text></Cell></Row>
116
+ </Table>
117
+ </VStack>
118
+ </HStack>
119
+ </VStack>
120
+
121
+ <EqualizeWidth targets={["users", "addresses"]} strategy="max" />
122
+ <EqualizeWidth targets={["products", "categories"]} strategy="max" />
123
+ <AlignConstraint targets={["addresses", "shipments"]} anchor="shipments" axis="horizontal" align="start" />
124
+ <AlignConstraint targets={["orders", "products"]} anchor="orders" axis="horizontal" align="start" />
125
+
126
+ <Connector from="users" to="addresses" fromAnchor="bottom" toAnchor="top" route="orthogonal" cornerRadius={6} endArrow="filledArrow" arrowSize={0.7}><Label>1:N</Label></Connector>
127
+ <Connector from="u1" to="rv2" fromAnchor="right" toAnchor="left" route="curved" endArrow="arrow" arrowSize={0.7}><Label>1:N</Label></Connector>
128
+ <Connector from="u1" to="o2" fromAnchor="right" toAnchor="left" route="curved" endArrow="arrow" arrowSize={0.7}><Label>1:N</Label></Connector>
129
+ <Connector from="orders" to="order_items" fromAnchor="bottom" toAnchor="top" route="orthogonal" cornerRadius={6} endArrow="arrow" arrowSize={0.7}><Label>1:N</Label></Connector>
130
+ <Connector from="orders" to="payments" fromAnchor="bottom" toAnchor="top" route="orthogonal" cornerRadius={6} endArrow="arrow" arrowSize={0.7}><Label>1:1</Label></Connector>
131
+ <Connector from="orders" to="shipments" fromAnchor="bottom" toAnchor="top" route="orthogonal" cornerRadius={6} endArrow="arrow" arrowSize={0.7}><Label>1:N</Label></Connector>
132
+ <Connector from="ad1" to="sh3" fromAnchor="right" toAnchor="left" route="orthogonal" cornerRadius={6} endArrow="arrow" arrowSize={0.7}><Label>1:N</Label></Connector>
133
+ <Connector from="p1" to="oi3" fromAnchor="left" toAnchor="right" route="orthogonal" cornerRadius={6} endArrow="arrow" arrowSize={0.7}><Label>1:N</Label></Connector>
134
+ <Connector from="p1" to="rv3" fromAnchor="left" toAnchor="right" route="curved" endArrow="arrow" arrowSize={0.7}><Label>1:N</Label></Connector>
135
+ <Connector from="categories" to="products" fromAnchor="bottom" toAnchor="top" route="orthogonal" cornerRadius={6} endArrow="filledArrow" arrowSize={0.7}><Label>1:N</Label></Connector>
136
+ <Connector from="c1" to="c3" fromAnchor="right" toAnchor="right" route="orthogonal" cornerRadius={6} stroke="#16a34a" strokeDasharray="4 2" endArrow="arrow" arrowSize={0.7}><Label>self</Label></Connector>
137
+ </Document>
@@ -0,0 +1,20 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 847.68447265625 599.4000000000001" width="847.68447265625" height="599.4000000000001" font-family="Inter, sans-serif">
2
+ <defs>
3
+ <marker id="marker-filledArrow-6b7280-s0.7" markerWidth="4.8999999999999995" markerHeight="4.8999999999999995" refX="4.8999999999999995" refY="2.4499999999999997" orient="auto-start-reverse"><path d="M 0,0 L 7,3.5 L 0,7 Z" fill="#6b7280" transform="scale(0.7)"/></marker>
4
+ <marker id="marker-arrow-6b7280-s0.7" markerWidth="4.8999999999999995" markerHeight="4.8999999999999995" refX="4.8999999999999995" refY="2.4499999999999997" orient="auto-start-reverse"><path d="M 0,0 L 7,3.5 L 0,7" fill="none" stroke="#6b7280" stroke-width="1" transform="scale(0.7)"/></marker>
5
+ <marker id="marker-arrow-16a34a-s0.7" markerWidth="4.8999999999999995" markerHeight="4.8999999999999995" refX="4.8999999999999995" refY="2.4499999999999997" orient="auto-start-reverse"><path d="M 0,0 L 7,3.5 L 0,7" fill="none" stroke="#16a34a" stroke-width="1" transform="scale(0.7)"/></marker>
6
+ </defs>
7
+ <rect x="0" y="0" width="847.68447265625" height="599.4000000000001" fill="white"/>
8
+ <g id="root"><g id="title"><text x="157.857861328125" y="42.9" text-anchor="middle" fill="#111827" font-size="18" font-weight="bold"><tspan x="157.857861328125" dy="0">ER Diagram — E-Commerce</tspan></text></g><g id="cols"><g id="col_left"><g id="users"><defs><clipPath id="table-clip-1"><rect x="24" y="69.2" width="128.818359375" height="123.4" rx="6" ry="6"/></clipPath></defs><rect x="24" y="69.2" width="128.818359375" height="123.4" rx="6" ry="6" fill="white"/><g clip-path="url(#table-clip-1)"><g id="u_h"><g id="u_h1"><rect x="24" y="69.2" width="64.55419921875" height="27.4" fill="#dbeafe" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_1"><text x="46.6109130859375" y="86.75" text-anchor="middle" fill="#1e40af" font-size="11" font-weight="bold"><tspan x="46.6109130859375" dy="0">users</tspan></text></g></g><g id="u_h2"><rect x="88.55419921875" y="69.2" width="64.26416015625" height="27.4" fill="#dbeafe" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_2"><text x="120.686279296875" y="85.7" text-anchor="middle" fill="#1e40af" font-size="10" font-weight="bold"><tspan x="120.686279296875" dy="0">type</tspan></text></g></g></g><g id="u1"><g id="u1a"><rect x="24" y="96.6" width="64.55419921875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_3"><text x="33.95751953125" y="112.1" text-anchor="middle" fill="#111827" font-size="10" font-weight="bold"><tspan x="33.95751953125" dy="0">id</tspan></text></g></g><g id="u1b"><rect x="88.55419921875" y="96.6" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_4"><text x="100.76220703125" y="112.1" text-anchor="middle" fill="#111827" font-size="10"><tspan x="100.76220703125" dy="0">PK</tspan></text></g></g></g><g id="u2"><g id="u2a"><rect x="24" y="120.6" width="64.55419921875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_5"><text x="43.3623046875" y="136.1" text-anchor="middle" fill="#111827" font-size="10"><tspan x="43.3623046875" dy="0">name</tspan></text></g></g><g id="u2b"><rect x="88.55419921875" y="120.6" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_6"><text x="113.357421875" y="136.1" text-anchor="middle" fill="#111827" font-size="10"><tspan x="113.357421875" dy="0">varchar</tspan></text></g></g></g><g id="u3"><g id="u3a"><rect x="24" y="144.60000000000002" width="64.55419921875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_7"><text x="42.77685546875" y="160.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="42.77685546875" dy="0">email</tspan></text></g></g><g id="u3b"><rect x="88.55419921875" y="144.60000000000002" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_8"><text x="113.357421875" y="160.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="113.357421875" dy="0">varchar</tspan></text></g></g></g><g id="u4"><g id="u4a"><rect x="24" y="168.60000000000002" width="64.55419921875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_9"><text x="56.277099609375" y="184.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="56.277099609375" dy="0">created_at</tspan></text></g></g><g id="u4b"><rect x="88.55419921875" y="168.60000000000002" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_10"><text x="120.686279296875" y="184.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="120.686279296875" dy="0">timestamp</tspan></text></g></g></g></g><rect x="24" y="69.2" width="128.818359375" height="123.4" rx="6" ry="6" fill="none" stroke="#d1d5db" stroke-width="1"/></g><g id="addresses"><defs><clipPath id="table-clip-2"><rect x="24" y="428" width="128.818359375" height="147.4" rx="6" ry="6"/></clipPath></defs><rect x="24" y="428" width="128.818359375" height="147.4" rx="6" ry="6" fill="white"/><g clip-path="url(#table-clip-2)"><g id="ad_h"><g id="ad_h1"><rect x="24" y="428" width="76.582666015625" height="27.4" fill="#e0e7ff" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_11"><text x="60.976708984375" y="445.55" text-anchor="middle" fill="#3730a3" font-size="11" font-weight="bold"><tspan x="60.976708984375" dy="0">addresses</tspan></text></g></g><g id="ad_h2"><rect x="100.582666015625" y="428" width="52.235693359375" height="27.4" fill="#e0e7ff" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_12"><text x="126.7005126953125" y="444.5" text-anchor="middle" fill="#3730a3" font-size="10" font-weight="bold"><tspan x="126.7005126953125" dy="0">type</tspan></text></g></g></g><g id="ad1"><g id="ad1a"><rect x="24" y="455.4" width="76.582666015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_13"><text x="33.95751953125" y="470.9" text-anchor="middle" fill="#111827" font-size="10" font-weight="bold"><tspan x="33.95751953125" dy="0">id</tspan></text></g></g><g id="ad1b"><rect x="100.582666015625" y="455.4" width="52.235693359375" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_14"><text x="112.790673828125" y="470.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="112.790673828125" dy="0">PK</tspan></text></g></g></g><g id="ad2"><g id="ad2a"><rect x="24" y="479.4" width="76.582666015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_15"><text x="47.640380859375" y="494.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="47.640380859375" dy="0">user_id</tspan></text></g></g><g id="ad2b"><rect x="100.582666015625" y="479.4" width="52.235693359375" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_16"><text x="112.5248046875" y="494.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="112.5248046875" dy="0">FK</tspan></text></g></g></g><g id="ad3"><g id="ad3a"><rect x="24" y="503.4" width="76.582666015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_17"><text x="36.737060546875" y="518.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="36.737060546875" dy="0">zip</tspan></text></g></g><g id="ad3b"><rect x="100.582666015625" y="503.4" width="52.235693359375" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_18"><text x="125.385888671875" y="518.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="125.385888671875" dy="0">varchar</tspan></text></g></g></g><g id="ad4"><g id="ad4a"><rect x="24" y="527.4" width="76.582666015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_19"><text x="38.364501953125" y="542.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="38.364501953125" dy="0">city</tspan></text></g></g><g id="ad4b"><rect x="100.582666015625" y="527.4" width="52.235693359375" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_20"><text x="125.385888671875" y="542.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="125.385888671875" dy="0">varchar</tspan></text></g></g></g><g id="ad5"><g id="ad5a"><rect x="24" y="551.4" width="76.582666015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_21"><text x="38.1201171875" y="566.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="38.1201171875" dy="0">line</tspan></text></g></g><g id="ad5b"><rect x="100.582666015625" y="551.4" width="52.235693359375" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_22"><text x="125.385888671875" y="566.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="125.385888671875" dy="0">varchar</tspan></text></g></g></g></g><rect x="24" y="428" width="128.818359375" height="147.4" rx="6" ry="6" fill="none" stroke="#d1d5db" stroke-width="1"/></g></g><g id="col_center"><g id="reviews"><defs><clipPath id="table-clip-3"><rect x="369.667333984375" y="69.2" width="101.1484375" height="147.4" rx="6" ry="6"/></clipPath></defs><rect x="369.667333984375" y="69.2" width="101.1484375" height="147.4" rx="6" ry="6" fill="white"/><g clip-path="url(#table-clip-3)"><g id="rv_h"><g id="rv_h1"><rect x="369.667333984375" y="69.2" width="65.0107421875" height="27.4" fill="#fef9c3" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_23"><text x="399.1376708984375" y="86.75" text-anchor="middle" fill="#854d0e" font-size="11" font-weight="bold"><tspan x="399.1376708984375" dy="0">reviews</tspan></text></g></g><g id="rv_h2"><rect x="434.678076171875" y="69.2" width="36.1376953125" height="27.4" fill="#fef9c3" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_24"><text x="452.746923828125" y="85.7" text-anchor="middle" fill="#854d0e" font-size="10" font-weight="bold"><tspan x="452.746923828125" dy="0">type</tspan></text></g></g></g><g id="rv1"><g id="rv1a"><rect x="369.667333984375" y="96.6" width="65.0107421875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_25"><text x="379.624853515625" y="112.1" text-anchor="middle" fill="#111827" font-size="10" font-weight="bold"><tspan x="379.624853515625" dy="0">id</tspan></text></g></g><g id="rv1b"><rect x="434.678076171875" y="96.6" width="36.1376953125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_26"><text x="446.886083984375" y="112.1" text-anchor="middle" fill="#111827" font-size="10"><tspan x="446.886083984375" dy="0">PK</tspan></text></g></g></g><g id="rv2"><g id="rv2a"><rect x="369.667333984375" y="120.6" width="65.0107421875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_27"><text x="393.30771484375" y="136.1" text-anchor="middle" fill="#111827" font-size="10"><tspan x="393.30771484375" dy="0">user_id</tspan></text></g></g><g id="rv2b"><rect x="434.678076171875" y="120.6" width="36.1376953125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_28"><text x="446.62021484375" y="136.1" text-anchor="middle" fill="#111827" font-size="10"><tspan x="446.62021484375" dy="0">FK</tspan></text></g></g></g><g id="rv3"><g id="rv3a"><rect x="369.667333984375" y="144.60000000000002" width="65.0107421875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_29"><text x="402.172705078125" y="160.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="402.172705078125" dy="0">product_id</tspan></text></g></g><g id="rv3b"><rect x="434.678076171875" y="144.60000000000002" width="36.1376953125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_30"><text x="446.62021484375" y="160.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="446.62021484375" dy="0">FK</tspan></text></g></g></g><g id="rv4"><g id="rv4a"><rect x="369.667333984375" y="168.60000000000002" width="65.0107421875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_31"><text x="389.58017578125" y="184.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="389.58017578125" dy="0">rating</tspan></text></g></g><g id="rv4b"><rect x="434.678076171875" y="168.60000000000002" width="36.1376953125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_32"><text x="446.058935546875" y="184.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="446.058935546875" dy="0">int</tspan></text></g></g></g><g id="rv5"><g id="rv5a"><rect x="369.667333984375" y="192.60000000000002" width="65.0107421875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_33"><text x="398.998388671875" y="208.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="398.998388671875" dy="0">comment</tspan></text></g></g><g id="rv5b"><rect x="434.678076171875" y="192.60000000000002" width="36.1376953125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_34"><text x="449.485693359375" y="208.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="449.485693359375" dy="0">text</tspan></text></g></g></g></g><rect x="369.667333984375" y="69.2" width="101.1484375" height="147.4" rx="6" ry="6" fill="none" stroke="#d1d5db" stroke-width="1"/></g><g id="orders"><defs><clipPath id="table-clip-4"><rect x="355.12607421875" y="248.60000000000002" width="130.23095703125" height="147.4" rx="6" ry="6"/></clipPath></defs><rect x="355.12607421875" y="248.60000000000002" width="130.23095703125" height="147.4" rx="6" ry="6" fill="white"/><g clip-path="url(#table-clip-4)"><g id="o_h"><g id="o_h1"><rect x="355.12607421875" y="248.60000000000002" width="65.966796875" height="27.4" fill="#fef3c7" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_35"><text x="380.56997070312497" y="266.15000000000003" text-anchor="middle" fill="#92400e" font-size="11" font-weight="bold"><tspan x="380.56997070312497" dy="0">orders</tspan></text></g></g><g id="o_h2"><rect x="421.09287109375" y="248.60000000000002" width="64.26416015625" height="27.4" fill="#fef3c7" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_36"><text x="453.224951171875" y="265.1" text-anchor="middle" fill="#92400e" font-size="10" font-weight="bold"><tspan x="453.224951171875" dy="0">type</tspan></text></g></g></g><g id="o1"><g id="o1a"><rect x="355.12607421875" y="276" width="65.966796875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_37"><text x="365.08359375" y="291.5" text-anchor="middle" fill="#111827" font-size="10" font-weight="bold"><tspan x="365.08359375" dy="0">id</tspan></text></g></g><g id="o1b"><rect x="421.09287109375" y="276" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_38"><text x="433.30087890625" y="291.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="433.30087890625" dy="0">PK</tspan></text></g></g></g><g id="o2"><g id="o2a"><rect x="355.12607421875" y="300" width="65.966796875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_39"><text x="378.766455078125" y="315.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="378.766455078125" dy="0">user_id</tspan></text></g></g><g id="o2b"><rect x="421.09287109375" y="300" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_40"><text x="433.035009765625" y="315.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="433.035009765625" dy="0">FK</tspan></text></g></g></g><g id="o3"><g id="o3a"><rect x="355.12607421875" y="324" width="65.966796875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_41"><text x="375.871435546875" y="339.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="375.871435546875" dy="0">status</tspan></text></g></g><g id="o3b"><rect x="421.09287109375" y="324" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_42"><text x="440.618994140625" y="339.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="440.618994140625" dy="0">enum</tspan></text></g></g></g><g id="o4"><g id="o4a"><rect x="355.12607421875" y="348" width="65.966796875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_43"><text x="371.44296875" y="363.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="371.44296875" dy="0">total</tspan></text></g></g><g id="o4b"><rect x="421.09287109375" y="348" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_44"><text x="446.3794921875" y="363.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="446.3794921875" dy="0">decimal</tspan></text></g></g></g><g id="o5"><g id="o5a"><rect x="355.12607421875" y="372" width="65.966796875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_45"><text x="388.10947265625" y="387.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="388.10947265625" dy="0">ordered_at</tspan></text></g></g><g id="o5b"><rect x="421.09287109375" y="372" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_46"><text x="453.224951171875" y="387.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="453.224951171875" dy="0">timestamp</tspan></text></g></g></g></g><rect x="355.12607421875" y="248.60000000000002" width="130.23095703125" height="147.4" rx="6" ry="6" fill="none" stroke="#d1d5db" stroke-width="1"/></g><g id="order_children"><g id="shipments"><defs><clipPath id="table-clip-5"><rect x="192.818359375" y="428" width="138.471630859375" height="147.4" rx="6" ry="6"/></clipPath></defs><rect x="192.818359375" y="428" width="138.471630859375" height="147.4" rx="6" ry="6" fill="white"/><g clip-path="url(#table-clip-5)"><g id="sh_h"><g id="sh_h1"><rect x="192.818359375" y="428" width="74.20747070312501" height="27.4" fill="#fce7f3" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_47"><text x="229.9220947265625" y="445.55" text-anchor="middle" fill="#9d174d" font-size="11" font-weight="bold"><tspan x="229.9220947265625" dy="0">shipments</tspan></text></g></g><g id="sh_h2"><rect x="267.025830078125" y="428" width="64.26416015625" height="27.4" fill="#fce7f3" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_48"><text x="299.15791015625" y="444.5" text-anchor="middle" fill="#9d174d" font-size="10" font-weight="bold"><tspan x="299.15791015625" dy="0">type</tspan></text></g></g></g><g id="sh1"><g id="sh1a"><rect x="192.818359375" y="455.4" width="74.20747070312501" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_49"><text x="202.77587890625" y="470.9" text-anchor="middle" fill="#111827" font-size="10" font-weight="bold"><tspan x="202.77587890625" dy="0">id</tspan></text></g></g><g id="sh1b"><rect x="267.025830078125" y="455.4" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_50"><text x="279.233837890625" y="470.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="279.233837890625" dy="0">PK</tspan></text></g></g></g><g id="sh2"><g id="sh2a"><rect x="192.818359375" y="479.4" width="74.20747070312501" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_51"><text x="219.03955078125" y="494.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="219.03955078125" dy="0">order_id</tspan></text></g></g><g id="sh2b"><rect x="267.025830078125" y="479.4" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_52"><text x="278.96796875" y="494.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="278.96796875" dy="0">FK</tspan></text></g></g></g><g id="sh3"><g id="sh3a"><rect x="192.818359375" y="503.4" width="74.20747070312501" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_53"><text x="225.933349609375" y="518.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="225.933349609375" dy="0">address_id</tspan></text></g></g><g id="sh3b"><rect x="267.025830078125" y="503.4" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_54"><text x="278.96796875" y="518.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="278.96796875" dy="0">FK</tspan></text></g></g></g><g id="sh4"><g id="sh4a"><rect x="192.818359375" y="527.4" width="74.20747070312501" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_55"><text x="214.799072265625" y="542.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="214.799072265625" dy="0">carrier</tspan></text></g></g><g id="sh4b"><rect x="267.025830078125" y="527.4" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_56"><text x="291.829052734375" y="542.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="291.829052734375" dy="0">varchar</tspan></text></g></g></g><g id="sh5"><g id="sh5a"><rect x="192.818359375" y="551.4" width="74.20747070312501" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_57"><text x="226.01123046875" y="566.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="226.01123046875" dy="0">shipped_at</tspan></text></g></g><g id="sh5b"><rect x="267.025830078125" y="551.4" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_58"><text x="299.15791015625" y="566.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="299.15791015625" dy="0">timestamp</tspan></text></g></g></g></g><rect x="192.818359375" y="428" width="138.471630859375" height="147.4" rx="6" ry="6" fill="none" stroke="#d1d5db" stroke-width="1"/></g><g id="payments"><defs><clipPath id="table-clip-6"><rect x="355.289990234375" y="428" width="135.192578125" height="147.4" rx="6" ry="6"/></clipPath></defs><rect x="355.289990234375" y="428" width="135.192578125" height="147.4" rx="6" ry="6" fill="white"/><g clip-path="url(#table-clip-6)"><g id="pm_h"><g id="pm_h1"><rect x="355.289990234375" y="428" width="70.92841796875001" height="27.4" fill="#fce7f3" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_59"><text x="390.75419921875" y="445.55" text-anchor="middle" fill="#9d174d" font-size="11" font-weight="bold"><tspan x="390.75419921875" dy="0">payments</tspan></text></g></g><g id="pm_h2"><rect x="426.218408203125" y="428" width="64.26416015625" height="27.4" fill="#fce7f3" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_60"><text x="458.35048828125" y="444.5" text-anchor="middle" fill="#9d174d" font-size="10" font-weight="bold"><tspan x="458.35048828125" dy="0">type</tspan></text></g></g></g><g id="pm1"><g id="pm1a"><rect x="355.289990234375" y="455.4" width="70.92841796875001" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_61"><text x="365.247509765625" y="470.9" text-anchor="middle" fill="#111827" font-size="10" font-weight="bold"><tspan x="365.247509765625" dy="0">id</tspan></text></g></g><g id="pm1b"><rect x="426.218408203125" y="455.4" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_62"><text x="438.426416015625" y="470.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="438.426416015625" dy="0">PK</tspan></text></g></g></g><g id="pm2"><g id="pm2a"><rect x="355.289990234375" y="479.4" width="70.92841796875001" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_63"><text x="381.511181640625" y="494.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="381.511181640625" dy="0">order_id</tspan></text></g></g><g id="pm2b"><rect x="426.218408203125" y="479.4" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_64"><text x="438.160546875" y="494.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="438.160546875" dy="0">FK</tspan></text></g></g></g><g id="pm3"><g id="pm3a"><rect x="355.289990234375" y="503.4" width="70.92841796875001" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_65"><text x="380.0314453125" y="518.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="380.0314453125" dy="0">method</tspan></text></g></g><g id="pm3b"><rect x="426.218408203125" y="503.4" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_66"><text x="445.74453125" y="518.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="445.74453125" dy="0">enum</tspan></text></g></g></g><g id="pm4"><g id="pm4a"><rect x="355.289990234375" y="527.4" width="70.92841796875001" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_67"><text x="379.7951171875" y="542.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="379.7951171875" dy="0">amount</tspan></text></g></g><g id="pm4b"><rect x="426.218408203125" y="527.4" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_68"><text x="451.505029296875" y="542.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="451.505029296875" dy="0">decimal</tspan></text></g></g></g><g id="pm5"><g id="pm5a"><rect x="355.289990234375" y="551.4" width="70.92841796875001" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_69"><text x="378.841748046875" y="566.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="378.841748046875" dy="0">paid_at</tspan></text></g></g><g id="pm5b"><rect x="426.218408203125" y="551.4" width="64.26416015625" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_70"><text x="458.35048828125" y="566.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="458.35048828125" dy="0">timestamp</tspan></text></g></g></g></g><rect x="355.289990234375" y="428" width="135.192578125" height="147.4" rx="6" ry="6" fill="none" stroke="#d1d5db" stroke-width="1"/></g><g id="order_items"><defs><clipPath id="table-clip-7"><rect x="514.482568359375" y="428" width="133.182177734375" height="147.4" rx="6" ry="6"/></clipPath></defs><rect x="514.482568359375" y="428" width="133.182177734375" height="147.4" rx="6" ry="6" fill="white"/><g clip-path="url(#table-clip-7)"><g id="oi_h"><g id="oi_h1"><rect x="514.482568359375" y="428" width="82.608935546875" height="27.4" fill="#fef3c7" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_71"><text x="555.7870361328125" y="445.55" text-anchor="middle" fill="#92400e" font-size="11" font-weight="bold"><tspan x="555.7870361328125" dy="0">order_items</tspan></text></g></g><g id="oi_h2"><rect x="597.0915039062501" y="428" width="50.5732421875" height="27.4" fill="#fef3c7" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_72"><text x="622.3781250000001" y="444.5" text-anchor="middle" fill="#92400e" font-size="10" font-weight="bold"><tspan x="622.3781250000001" dy="0">type</tspan></text></g></g></g><g id="oi1"><g id="oi1a"><rect x="514.482568359375" y="455.4" width="82.608935546875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_73"><text x="524.440087890625" y="470.9" text-anchor="middle" fill="#111827" font-size="10" font-weight="bold"><tspan x="524.440087890625" dy="0">id</tspan></text></g></g><g id="oi1b"><rect x="597.0915039062501" y="455.4" width="50.5732421875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_74"><text x="609.2995117187501" y="470.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="609.2995117187501" dy="0">PK</tspan></text></g></g></g><g id="oi2"><g id="oi2a"><rect x="514.482568359375" y="479.4" width="82.608935546875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_75"><text x="540.703759765625" y="494.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="540.703759765625" dy="0">order_id</tspan></text></g></g><g id="oi2b"><rect x="597.0915039062501" y="479.4" width="50.5732421875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_76"><text x="609.0336425781251" y="494.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="609.0336425781251" dy="0">FK</tspan></text></g></g></g><g id="oi3"><g id="oi3a"><rect x="514.482568359375" y="503.4" width="82.608935546875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_77"><text x="546.987939453125" y="518.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="546.987939453125" dy="0">product_id</tspan></text></g></g><g id="oi3b"><rect x="597.0915039062501" y="503.4" width="50.5732421875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_78"><text x="609.0336425781251" y="518.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="609.0336425781251" dy="0">FK</tspan></text></g></g></g><g id="oi4"><g id="oi4a"><rect x="514.482568359375" y="527.4" width="82.608935546875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_79"><text x="527.740625" y="542.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="527.740625" dy="0">qty</tspan></text></g></g><g id="oi4b"><rect x="597.0915039062501" y="527.4" width="50.5732421875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_80"><text x="608.4723632812501" y="542.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="608.4723632812501" dy="0">int</tspan></text></g></g></g><g id="oi5"><g id="oi5a"><rect x="514.482568359375" y="551.4" width="82.608935546875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_81"><text x="544.742822265625" y="566.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="544.742822265625" dy="0">unit_price</tspan></text></g></g><g id="oi5b"><rect x="597.0915039062501" y="551.4" width="50.5732421875" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_82"><text x="622.3781250000001" y="566.9" text-anchor="middle" fill="#111827" font-size="10"><tspan x="622.3781250000001" dy="0">decimal</tspan></text></g></g></g></g><rect x="514.482568359375" y="428" width="133.182177734375" height="147.4" rx="6" ry="6" fill="none" stroke="#d1d5db" stroke-width="1"/></g></g></g><g id="col_right"><g id="categories"><defs><clipPath id="table-clip-8"><rect x="687.66474609375" y="69.2" width="124.64697265625" height="99.4" rx="6" ry="6"/></clipPath></defs><rect x="687.66474609375" y="69.2" width="124.64697265625" height="99.4" rx="6" ry="6" fill="white"/><g clip-path="url(#table-clip-8)"><g id="c_h"><g id="c_h1"><rect x="687.66474609375" y="69.2" width="75.04052734375" height="27.4" fill="#dcfce7" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_83"><text x="725.185009765625" y="86.75" text-anchor="middle" fill="#166534" font-size="11" font-weight="bold"><tspan x="725.185009765625" dy="0">categories</tspan></text></g></g><g id="c_h2"><rect x="762.7052734375" y="69.2" width="49.6064453125" height="27.4" fill="#dcfce7" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_84"><text x="787.50849609375" y="85.7" text-anchor="middle" fill="#166534" font-size="10" font-weight="bold"><tspan x="787.50849609375" dy="0">type</tspan></text></g></g></g><g id="c1"><g id="c1a"><rect x="687.66474609375" y="96.6" width="75.04052734375" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_85"><text x="697.622265625" y="112.1" text-anchor="middle" fill="#111827" font-size="10" font-weight="bold"><tspan x="697.622265625" dy="0">id</tspan></text></g></g><g id="c1b"><rect x="762.7052734375" y="96.6" width="49.6064453125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_86"><text x="774.91328125" y="112.1" text-anchor="middle" fill="#111827" font-size="10"><tspan x="774.91328125" dy="0">PK</tspan></text></g></g></g><g id="c2"><g id="c2a"><rect x="687.66474609375" y="120.6" width="75.04052734375" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_87"><text x="707.02705078125" y="136.1" text-anchor="middle" fill="#111827" font-size="10"><tspan x="707.02705078125" dy="0">name</tspan></text></g></g><g id="c2b"><rect x="762.7052734375" y="120.6" width="49.6064453125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_88"><text x="787.50849609375" y="136.1" text-anchor="middle" fill="#111827" font-size="10"><tspan x="787.50849609375" dy="0">varchar</tspan></text></g></g></g><g id="c3"><g id="c3a"><rect x="687.66474609375" y="144.60000000000002" width="75.04052734375" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_89"><text x="716.654736328125" y="160.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="716.654736328125" dy="0">parent_id</tspan></text></g></g><g id="c3b"><rect x="762.7052734375" y="144.60000000000002" width="49.6064453125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_90"><text x="774.647412109375" y="160.10000000000002" text-anchor="middle" fill="#111827" font-size="10"><tspan x="774.647412109375" dy="0">FK</tspan></text></g></g></g></g><rect x="687.66474609375" y="69.2" width="124.64697265625" height="99.4" rx="6" ry="6" fill="none" stroke="#d1d5db" stroke-width="1"/></g><g id="products"><defs><clipPath id="table-clip-9"><rect x="687.66474609375" y="248.60000000000002" width="124.64697265625" height="147.4" rx="6" ry="6"/></clipPath></defs><rect x="687.66474609375" y="248.60000000000002" width="124.64697265625" height="147.4" rx="6" ry="6" fill="white"/><g clip-path="url(#table-clip-9)"><g id="p_h"><g id="p_h1"><rect x="687.66474609375" y="248.60000000000002" width="72.313720703125" height="27.4" fill="#dcfce7" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_91"><text x="720.3964111328124" y="266.15000000000003" text-anchor="middle" fill="#166534" font-size="11" font-weight="bold"><tspan x="720.3964111328124" dy="0">products</tspan></text></g></g><g id="p_h2"><rect x="759.978466796875" y="248.60000000000002" width="52.333251953125" height="27.4" fill="#dcfce7" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_92"><text x="786.1450927734375" y="265.1" text-anchor="middle" fill="#166534" font-size="10" font-weight="bold"><tspan x="786.1450927734375" dy="0">type</tspan></text></g></g></g><g id="p1"><g id="p1a"><rect x="687.66474609375" y="276" width="72.313720703125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_93"><text x="697.622265625" y="291.5" text-anchor="middle" fill="#111827" font-size="10" font-weight="bold"><tspan x="697.622265625" dy="0">id</tspan></text></g></g><g id="p1b"><rect x="759.978466796875" y="276" width="52.333251953125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_94"><text x="772.186474609375" y="291.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="772.186474609375" dy="0">PK</tspan></text></g></g></g><g id="p2"><g id="p2a"><rect x="687.66474609375" y="300" width="72.313720703125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_95"><text x="707.02705078125" y="315.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="707.02705078125" dy="0">name</tspan></text></g></g><g id="p2b"><rect x="759.978466796875" y="300" width="52.333251953125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_96"><text x="784.781689453125" y="315.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="784.781689453125" dy="0">varchar</tspan></text></g></g></g><g id="p3"><g id="p3a"><rect x="687.66474609375" y="324" width="72.313720703125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_97"><text x="722.9416015625" y="339.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="722.9416015625" dy="0">category_id</tspan></text></g></g><g id="p3b"><rect x="759.978466796875" y="324" width="52.333251953125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_98"><text x="771.92060546875" y="339.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="771.92060546875" dy="0">FK</tspan></text></g></g></g><g id="p4"><g id="p4a"><rect x="687.66474609375" y="348" width="72.313720703125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_99"><text x="705.783642578125" y="363.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="705.783642578125" dy="0">price</tspan></text></g></g><g id="p4b"><rect x="759.978466796875" y="348" width="52.333251953125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_100"><text x="785.265087890625" y="363.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="785.265087890625" dy="0">decimal</tspan></text></g></g></g><g id="p5"><g id="p5a"><rect x="687.66474609375" y="372" width="72.313720703125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_101"><text x="706.825634765625" y="387.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="706.825634765625" dy="0">stock</tspan></text></g></g><g id="p5b"><rect x="759.978466796875" y="372" width="52.333251953125" height="24" fill="none" stroke="#e5e7eb" stroke-width="0.5"/><g id="text_102"><text x="771.359326171875" y="387.5" text-anchor="middle" fill="#111827" font-size="10"><tspan x="771.359326171875" dy="0">int</tspan></text></g></g></g></g><rect x="687.66474609375" y="248.60000000000002" width="124.64697265625" height="147.4" rx="6" ry="6" fill="none" stroke="#d1d5db" stroke-width="1"/></g></g></g></g>
9
+ <g id="connector_1"><path d="M 88.4091796875 192.60000000000002 L 88.4091796875 310.3 L 88.4091796875 310.3 L 88.4091796875 428" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-filledArrow-6b7280-s0.7)"/><g id="label_1"><rect x="76.85078125" y="299.90000000000003" width="23.116796875000002" height="20.799999999999997" fill="#ffffff"/><text x="88.4091796875" y="314.5" text-anchor="middle" fill="#111827" font-size="12"><tspan x="88.4091796875" dy="0">1:N</tspan></text></g></g>
10
+ <g id="connector_2"><path d="M 152.818359375 104.6 C 224.97259924513554 104.6, 297.51309411423944 132.6, 369.667333984375 132.6" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/><g id="label_2"><rect x="249.6844482421875" y="108.19999999999999" width="23.116796875000002" height="20.799999999999997" fill="#ffffff"/><text x="261.2428466796875" y="122.79999999999998" text-anchor="middle" fill="#111827" font-size="12"><tspan x="261.2428466796875" dy="0">1:N</tspan></text></g></g>
11
+ <g id="connector_3"><path d="M 152.818359375 112.6 C 246.55739721276092 112.6, 261.38703638098906 312, 355.12607421875 312" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/><g id="label_3"><rect x="242.413818359375" y="201.9" width="23.116796875000002" height="20.799999999999997" fill="#ffffff"/><text x="253.972216796875" y="216.5" text-anchor="middle" fill="#111827" font-size="12"><tspan x="253.972216796875" dy="0">1:N</tspan></text></g></g>
12
+ <g id="connector_4"><path d="M 452.7992919921875 396 L 452.7992919921875 406 A 6 6 0 0 0 458.7992919921875 412 L 575.0736572265625 412 A 6 6 0 0 1 581.0736572265625 418 L 581.0736572265625 428" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/><g id="label_4"><rect x="505.37807617187497" y="401.6" width="23.116796875000002" height="20.799999999999997" fill="#ffffff"/><text x="516.936474609375" y="416.20000000000005" text-anchor="middle" fill="#111827" font-size="12"><tspan x="516.936474609375" dy="0">1:N</tspan></text></g></g>
13
+ <g id="connector_5"><path d="M 420.241552734375 396 L 420.241552734375 410.67763671874997 A 1.322363281250034 1.322363281250034 0 0 0 421.563916015625 412 L 421.563916015625 412 A 1.322363281250034 1.322363281250034 0 0 1 422.88627929687505 413.32236328125003 L 422.88627929687505 428" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/><g id="label_5"><rect x="412.293603515625" y="401.6" width="18.540625" height="20.799999999999997" fill="#ffffff"/><text x="421.563916015625" y="416.20000000000005" text-anchor="middle" fill="#111827" font-size="12"><tspan x="421.563916015625" dy="0">1:1</tspan></text></g></g>
14
+ <g id="connector_6"><path d="M 387.6838134765625 396 L 387.6838134765625 406 A 6 6 0 0 1 381.6838134765625 412 L 268.0541748046875 412 A 6 6 0 0 0 262.0541748046875 418 L 262.0541748046875 428" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/><g id="label_6"><rect x="313.310595703125" y="401.6" width="23.116796875000002" height="20.799999999999997" fill="#ffffff"/><text x="324.868994140625" y="416.20000000000005" text-anchor="middle" fill="#111827" font-size="12"><tspan x="324.868994140625" dy="0">1:N</tspan></text></g></g>
15
+ <g id="connector_7"><path d="M 152.818359375 467.4 L 166.818359375 467.4 A 6 6 0 0 1 172.818359375 473.4 L 172.818359375 509.4 A 6 6 0 0 0 178.818359375 515.4 L 192.818359375 515.4" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/><g id="label_7"><rect x="161.2599609375" y="481" width="23.116796875000002" height="20.799999999999997" fill="#ffffff"/><text x="172.818359375" y="495.6" text-anchor="middle" fill="#111827" font-size="12"><tspan x="172.818359375" dy="0">1:N</tspan></text></g></g>
16
+ <g id="connector_8"><path d="M 687.66474609375 292 L 673.66474609375 292 A 6 6 0 0 0 667.66474609375 298 L 667.66474609375 509.4 A 6 6 0 0 1 661.66474609375 515.4 L 647.66474609375 515.4" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/><g id="label_8"><rect x="656.1063476562499" y="393.3" width="23.116796875000002" height="20.799999999999997" fill="#ffffff"/><text x="667.66474609375" y="407.9" text-anchor="middle" fill="#111827" font-size="12"><tspan x="667.66474609375" dy="0">1:N</tspan></text></g></g>
17
+ <g id="connector_9"><path d="M 687.66474609375 284 C 604.6684419878618 284, 553.812075590263 156.60000000000002, 470.815771484375 156.60000000000002" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/><g id="label_9"><rect x="567.6818603515624" y="209.9" width="23.116796875000002" height="20.799999999999997" fill="#ffffff"/><text x="579.2402587890624" y="224.5" text-anchor="middle" fill="#111827" font-size="12"><tspan x="579.2402587890624" dy="0">1:N</tspan></text></g></g>
18
+ <g id="connector_10"><path d="M 749.988232421875 168.60000000000002 L 749.988232421875 208.60000000000002 L 749.988232421875 208.60000000000002 L 749.988232421875 248.60000000000002" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-filledArrow-6b7280-s0.7)"/><g id="label_10"><rect x="738.4298339843749" y="198.20000000000002" width="23.116796875000002" height="20.799999999999997" fill="#ffffff"/><text x="749.988232421875" y="212.8" text-anchor="middle" fill="#111827" font-size="12"><tspan x="749.988232421875" dy="0">1:N</tspan></text></g></g>
19
+ <g id="connector_11"><path d="M 812.31171875 108.6 L 826.31171875 108.6 A 6 6 0 0 1 832.31171875 114.6 L 832.31171875 150.60000000000002 A 6 6 0 0 1 826.31171875 156.60000000000002 L 812.31171875 156.60000000000002" fill="none" stroke="#16a34a" stroke-width="1.5" stroke-dasharray="4 2" marker-end="url(#marker-arrow-16a34a-s0.7)"/><g id="label_11"><rect x="798.93896484375" y="122.20000000000002" width="26.7455078125" height="20.799999999999997" fill="#ffffff"/><text x="812.31171875" y="136.8" text-anchor="middle" fill="#111827" font-size="12"><tspan x="812.31171875" dy="0">self</tspan></text></g></g>
20
+ </svg>
@@ -0,0 +1,77 @@
1
+ import { AwsAccount, AwsRegion } from "./components/aws.draw.tsx";
2
+ import {
3
+ PlatformVpc, ManagementVpc, BffVpc, EdgeServices,
4
+ EventProcessing, SharedServices, ExternalActor, AnalyticsServices
5
+ } from "./system-parts.draw.tsx";
6
+
7
+ <Document id="sys" padding={20} background="white" fontFamily="Inter, sans-serif">
8
+ <HStack gap={24} align="start">
9
+ {/* Left: External actors (Box allows free Y positioning via AlignConstraint) */}
10
+ <Box shape="rect" fill="none" stroke="none" width={100}>
11
+ <ExternalActor id="users" label="Users / Mobile" />
12
+ <ExternalActor id="ops-user" label="Operations" />
13
+ </Box>
14
+
15
+ {/* Right: AWS */}
16
+ <AwsAccount label="AWS Account">
17
+ <VStack padding={14} gap={14}>
18
+ <AwsRegion label="ap-northeast-1">
19
+ <HStack padding={14} gap={30} align="start">
20
+ <EdgeServices />
21
+ <VStack gap={14}>
22
+ <HStack gap={16} align="center">
23
+ <VStack align="center" height="fill"><BffVpc /></VStack>
24
+ <PlatformVpc />
25
+ </HStack>
26
+ <HStack gap={16} align="start">
27
+ <ManagementVpc />
28
+ <EventProcessing />
29
+ </HStack>
30
+ <SharedServices />
31
+ </VStack>
32
+ <AnalyticsServices />
33
+ </HStack>
34
+ </AwsRegion>
35
+ </VStack>
36
+ </AwsAccount>
37
+ </HStack>
38
+
39
+ {/* User row: plat-alb anchors the line; users + bff-vpc align to it */}
40
+ <AlignConstraint targets={["edge-row1", "users", "bff-vpc", "plat-alb"]} anchor="plat-alb" axis="horizontal" align="center" />
41
+ {/* Management row: mgmt-alb anchors the line; ops-user aligns to it */}
42
+ <AlignConstraint targets={["mgmt-alb", "ops-user", "edge-row2"]} anchor="mgmt-alb" axis="horizontal" align="center" />
43
+ <AlignConstraint targets={["redshift", "cms-admin"]} anchor="cms-admin" axis="horizontal" align="center" />
44
+ <AlignConstraint targets={["dms", "aurora"]} anchor="aurora" axis="horizontal" align="center" />
45
+ <AlignConstraint targets={["evt-row", "dynamo"]} anchor="dynamo" axis="vertical" align="center" />
46
+ <AlignConstraint targets={["s3-data", "s3-logs"]} anchor="s3-logs" axis="horizontal" align="center" />
47
+ <AlignConstraint targets={["s3-static", "edge-col"]} anchor="edge-col" axis="vertical" align="center" />
48
+ <AlignConstraint targets={["bff-alb", "bff"]} anchor="bff-alb" axis="horizontal" align="center" />
49
+
50
+ {/* --- Connections (geometry roles resolve implicitly via "connect" role) --- */}
51
+ <Connector from="users" to="cf" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
52
+ <Connector from="cf" to="waf" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
53
+ <Connector from="waf" to="bff-alb" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
54
+ <Connector from="bff-alb" to="bff" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
55
+ <Connector from="bff" to="plat-alb" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
56
+ <Connector from="plat-alb" to="api-a" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
57
+ <Connector from="plat-alb" to="api-b" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
58
+ <Connector from="api-a" to="cache" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
59
+ <Connector from="api-a" to="aurora" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
60
+ <Connector from="api-b" to="aurora" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
61
+ <Connector from="api-b" to="dynamo" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
62
+ <Connector from="api-b" to="eb" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
63
+ <Connector from="eb" to="evt-handler" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
64
+ <Connector from="ops-user" to="mcf" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
65
+ <Connector from="mcf" to="mwaf" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
66
+ <Connector from="mwaf" to="mgmt-alb" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
67
+ <Connector from="mgmt-alb" to="cms-app" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
68
+ <Connector from="mgmt-alb" to="cms-admin" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
69
+ <Connector from="cms-app" to="s3-static" endArrow="arrow" toAnchor="right" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
70
+ <Connector from="cf" to="s3-static" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} strokeStyle="dashed" />
71
+ <Connector from="aurora" to="dms" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
72
+ <Connector from="dms" to="redshift" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
73
+ <Connector from="evt-handler" to="redshift" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
74
+ <Connector from="redshift" to="s3-data" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
75
+ <Connector from="cms-admin" to="redshift" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
76
+ <Connector from="mgmt-batch" to="redshift" fromAnchor="right" toAnchor="left" endArrow="arrow" route="orthogonal" cornerRadius={6} arrowSize={0.7} />
77
+ </Document>
@@ -0,0 +1,33 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 932.113427734375 759.1999999999999" width="932.113427734375" height="759.1999999999999" font-family="Inter, sans-serif">
2
+ <defs>
3
+ <marker id="marker-arrow-6b7280-s0.7" markerWidth="4.8999999999999995" markerHeight="4.8999999999999995" refX="4.8999999999999995" refY="2.4499999999999997" orient="auto-start-reverse"><path d="M 0,0 L 7,3.5 L 0,7" fill="none" stroke="#6b7280" stroke-width="1" transform="scale(0.7)"/></marker>
4
+ </defs>
5
+ <rect x="0" y="0" width="932.113427734375" height="759.1999999999999" fill="white"/>
6
+ <g id="hstack_1"><g id="box_1"><rect x="20" y="20" width="100" height="62" fill="none" stroke="none" stroke-width="1"/><g id="users"><rect x="19.336181640625" y="232.5" width="101.32763671875" height="38" fill="#f3f4f6" stroke="#9ca3af" stroke-width="1"/><g id="text_1"><text x="70" y="255" text-anchor="middle" fill="#111827" font-size="10" font-weight="bold"><tspan x="70" dy="0">Users / Mobile</tspan></text></g></g><g id="ops-user"><rect x="28.203857421875" y="508.70000000000005" width="83.59228515625" height="38" fill="#f3f4f6" stroke="#9ca3af" stroke-width="1"/><g id="text_2"><text x="70" y="531.2" text-anchor="middle" fill="#111827" font-size="10" font-weight="bold"><tspan x="70" dy="0">Operations</tspan></text></g></g></g><g id="box_2"><rect x="144" y="20" width="768.113427734375" height="719.1999999999999" fill="white" stroke="#e7157b" stroke-width="2"/><g id="vstack_1"><g id="box_3"><rect x="144" y="20" width="128.0732421875" height="32.8" fill="#e7157b" stroke="#e7157b" stroke-width="0"/><g id="hstack_2"><g id="icon_1"><svg x="152" y="28.4" width="16" height="16" viewBox="0 0 40 40"><title>Icon-Architecture-Group/32/AWS-Account_32</title><g fill="none" fill-rule="evenodd"><path fill="#e7157b" d="M0 0h40v40H0z"/><path fill="#fff" d="M24.5 22c1.93 0 3.5 1.57 3.5 3.5S26.43 29 24.5 29 21 27.43 21 25.5s1.57-3.5 3.5-3.5m0 8c2.481 0 4.5-2.019 4.5-4.5S26.981 21 24.5 21a4.505 4.505 0 0 0-4.5 4.5c0 2.481 2.019 4.5 4.5 4.5m1.523-19.12L29.084 17h-6.121zM22.154 18h7.739a.502.502 0 0 0 .447-.724l-3.869-7.738c-.17-.338-.725-.338-.895 0l-3.869 7.738a.503.503 0 0 0 .447.724M11 23h7v-7h-7zm-.5 1h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5M8 32h24V8H8zM32.5 7h-25a.5.5 0 0 0-.5.5v25a.5.5 0 0 0 .5.5h25a.5.5 0 0 0 .5-.5v-25a.5.5 0 0 0-.5-.5"/></g></svg></g><g id="text_3"><text x="219.03662109375" y="40.599999999999994" text-anchor="middle" fill="white" font-size="12" font-weight="bold"><tspan x="219.03662109375" dy="0">AWS Account</tspan></text></g></g></g><g id="vstack_2"><g id="box_4"><rect x="158" y="66.8" width="740.113427734375" height="658.4" fill="white" stroke="#00a4a6" stroke-width="1" stroke-dasharray="6 4"/><g id="vstack_3"><g id="box_5"><rect x="158" y="66.8" width="114.52275390625" height="27.4" fill="#00a4a6" stroke="#00a4a6" stroke-width="0"/><g id="hstack_3"><g id="icon_2"><svg x="164" y="73.5" width="14" height="14" viewBox="0 0 40 40"><title>Icon-Architecture-Group/32/Region_32</title><g fill="none" fill-rule="evenodd"><path fill="#00a4a6" d="M0 0h40v40H0z"/><path fill="#fff" d="M14 20.026v-9h15.293l-4.147 4.146a.5.5 0 0 0 0 .708l4.147 4.146zm12.207-4.5 4.647-4.646a.5.5 0 0 0-.354-.854H14V8.97A1.528 1.528 0 0 0 13.495 6c-.845 0-1.532.687-1.532 1.531 0 .67.435 1.235 1.037 1.442v24.053h-3v1h7v-1h-3v-12h16.5a.5.5 0 0 0 .354-.854z"/></g></svg></g><g id="text_4"><text x="224.261376953125" y="84.35" text-anchor="middle" fill="white" font-size="11"><tspan x="224.261376953125" dy="0">ap-northeast-1</tspan></text></g></g></g><g id="hstack_4"><g id="edge-col"><rect x="172" y="108.19999999999999" width="106" height="603" fill="#f9f5ff" stroke="#c084fc" stroke-width="1" stroke-dasharray="6 4"/><g id="vstack_4"><g id="r53"><g id="r53-icon"><svg x="207" y="158.5" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-Route-53_48</title><g fill="none" fill-rule="evenodd"><path fill="#8c4fff" d="M0 0h64v64H0z"/><path fill="#fff" d="M38.761 32.527q.862.796.862 2.137 0 1.46-1.049 2.33t-2.82.871a6.9 6.9 0 0 1-2.768-.595v-1.192q1.622.536 2.768.536 1.13 0 1.741-.506.611-.507.611-1.444 0-1.802-2.278-1.802-.714 0-1.414.074v-.983l3.126-3.41h-4.406v-1.221h6.059v1.177l-3.067 3.246a1 1 0 0 1 .149-.015h.149q1.474 0 2.337.797m-8.647-.26q.906.848.907 2.337 0 1.46-1.057 2.36-1.058.901-2.783.901-1.518 0-2.843-.595v-1.192q1.653.536 2.828.536 1.131 0 1.734-.513.603-.514.602-1.482.001-1.057-.565-1.534-.565-.476-1.846-.476-.922 0-2.307.149v-.983l.284-4.453H30.5v1.222h-4.182l-.195 3.023q.819-.15 1.474-.15 1.608 0 2.517.85m11.147 10.697c-3.745.672-7.028 2.182-9.261 3.431-2.232-1.25-5.515-2.76-9.26-3.431-1.032-.185-6.174-1.256-6.174-4.14 0-1.361.497-2.282 1.451-3.924 1.116-1.926 2.646-4.564 2.646-8.226 0-2.564-.659-5.023-1.96-7.32l.269-.331c1.955.95 3.987 1.43 6.053 1.43 2.546 0 4.889-.657 6.975-1.951 2.086 1.294 4.43 1.95 6.976 1.95 2.065 0 4.097-.48 6.053-1.43l.268.331c-1.301 2.298-1.96 4.757-1.96 7.32 0 3.663 1.53 6.3 2.647 8.227.954 1.642 1.451 2.563 1.451 3.925 0 2.883-5.143 3.954-6.174 4.139m4.076-16.29c0-2.415.682-4.73 2.025-6.882a1 1 0 0 0-.074-1.162c-.395-.485-.809-.994-1.218-1.5a1 1 0 0 0-1.261-.246c-1.883 1.04-3.846 1.568-5.833 1.568-2.4 0-4.494-.644-6.406-1.97a1 1 0 0 0-1.139 0c-1.912 1.326-4.007 1.97-6.406 1.97-1.988 0-3.951-.528-5.833-1.568a1 1 0 0 0-1.261.246c-.409.506-.823 1.015-1.219 1.5a1 1 0 0 0-.073 1.162c1.343 2.152 2.024 4.467 2.024 6.882 0 3.124-1.262 5.3-2.377 7.221-1.066 1.84-1.72 3.06-1.72 4.93 0 4.363 5.985 5.778 7.82 6.108 3.75.674 7.024 2.265 9.111 3.48a1 1 0 0 0 1.006 0c2.087-1.215 5.362-2.806 9.112-3.48 1.834-.33 7.82-1.745 7.82-6.108 0-1.87-.654-3.09-1.721-4.93-1.114-1.92-2.377-4.097-2.377-7.221m-3.269 20.785c-4.666.838-8.6 3.296-10.068 4.309-1.468-1.013-5.401-3.47-10.067-4.31-2.33-.418-9.933-2.28-9.933-8.633 0-2.655 1.004-4.387 2.068-6.22.998-1.72 2.03-3.498 2.03-5.931 0-3.667-2.027-6.302-3.157-7.487 1.154-1.405 3.695-4.506 5.088-6.29 2.122 1.935 4.571 2.988 6.996 2.988 2.701 0 4.942-1.065 6.975-3.336 2.033 2.27 4.275 3.336 6.976 3.336 2.425 0 4.874-1.053 6.996-2.988 1.393 1.784 3.934 4.885 5.088 6.29-1.13 1.185-3.157 3.82-3.157 7.487 0 2.433 1.032 4.212 2.03 5.932C50.996 34.438 52 36.17 52 38.825c0 6.354-7.602 8.215-9.932 8.634M51.662 31.6c-.944-1.627-1.759-3.033-1.759-4.927 0-4.002 3.121-6.603 3.15-6.627a1 1 0 0 0 .143-1.414c-.052-.062-5.147-6.24-6.311-7.835a1 1 0 0 0-1.538-.094c-1.917 2.05-4.18 3.18-6.371 3.18-2.416 0-4.322-1.083-6.182-3.513-.379-.495-1.209-.495-1.588 0-1.859 2.43-3.765 3.513-6.181 3.513-2.192 0-4.454-1.13-6.371-3.18a1 1 0 0 0-1.539.094c-1.164 1.596-6.258 7.773-6.31 7.835-.17.206-.25.47-.224.737.028.266.159.51.367.677.032.026 3.15 2.595 3.15 6.627 0 1.894-.816 3.3-1.76 4.927C11.242 33.49 10 35.631 10 38.825c0 5.336 4.328 9.3 11.579 10.604 5.316.954 9.768 4.33 9.813 4.365a1 1 0 0 0 1.218-.001c.044-.034 4.478-3.406 9.811-4.364C49.672 48.125 54 44.16 54 38.825c0-3.194-1.242-5.335-2.338-7.224"/></g></svg></g><g id="text_5"><text x="225" y="205.95" text-anchor="middle" fill="#111827" font-size="9"><tspan x="225" dy="0">Route 53</tspan></text></g></g><g id="edge-row1"><g id="cf"><g id="cf-icon"><svg x="182" y="233.5" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-CloudFront_48</title><g fill="none" fill-rule="evenodd"><path fill="#8c4fff" d="M0 0h64v64H0z"/><path fill="#fff" d="M41.5 43.5c-1.103 0-2-.897-2-2s.897-2 2-2 2 .897 2 2-.897 2-2 2m0-6c-2.206 0-4 1.794-4 4s1.794 4 4 4 4-1.794 4-4-1.794-4-4-4m-19-5c-1.103 0-2-.897-2-2s.897-2 2-2 2 .897 2 2-.897 2-2 2m0-6c-2.206 0-4 1.794-4 4s1.794 4 4 4 4-1.794 4-4-1.794-4-4-4m22.889 20.624a29 29 0 0 0-.704-1.533l-1.789.895c.274.549.524 1.113.76 1.679a19 19 0 0 1-2.628 1.575c.356-.875.666-1.765.946-2.728l-1.92-.558a25.2 25.2 0 0 1-1.87 4.679A19.2 19.2 0 0 1 32.5 52c-3.035 0-5.933-.686-8.629-2.024-1.368-3.361-2.033-6.442-2.033-9.417 0-1.292.225-2.363.484-3.603q.096-.455.192-.932l-1.963-.386q-.092.465-.186.907c-.271 1.293-.527 2.515-.527 4.014 0 2.515.436 5.085 1.316 7.795A19.46 19.46 0 0 1 13 32.5c0-.111.01-.227.012-.339a24 24 0 0 1 4.842-.59l-.05-1.999c-1.635.04-3.11.207-4.641.512.918-7.401 6.049-13.69 13.16-16.065 1.55.799 2.697 1.505 3.812 2.351l1.209-1.594a24 24 0 0 0-2.198-1.477A19.6 19.6 0 0 1 32.5 13c2.532 0 5.032.494 7.349 1.439a33 33 0 0 0-1.606.532l.68 1.881c1.393-.503 2.485-.812 3.648-1.031C48.399 19.341 52 25.667 52 32.5a19.36 19.36 0 0 1-6.611 14.624m-2.381-33.375A21.4 21.4 0 0 0 32.5 11c-2.108 0-4.176.301-6.143.895-8.634 2.569-14.789 10.335-15.312 19.301-.035.429-.045.866-.045 1.304a21.47 21.47 0 0 0 11.354 18.955A21.54 21.54 0 0 0 32.5 54a21.1 21.1 0 0 0 6.937-1.157 21 21 0 0 0 6.209-3.336C50.955 45.399 54 39.2 54 32.5a21.52 21.52 0 0 0-10.992-18.751m-4.624 23.662-1.381 1.447c-2.981-2.843-5.956-4.712-9.366-5.883l.65-1.892c3.692 1.268 6.901 3.279 10.097 6.328m.06-15.047c2.838 4.328 4.436 9.08 4.749 14.124l-1.996.124c-.292-4.693-1.78-9.117-4.425-13.152zm-11.993 4.433-1.678-1.089c1.543-2.376 2.866-3.95 4.563-5.43l1.314 1.508c-1.547 1.349-2.764 2.801-4.199 5.011M34.5 16.5c1.103 0 2 .897 2 2s-.897 2-2 2-2-.897-2-2 .897-2 2-2m0 6c2.206 0 4-1.794 4-4s-1.794-4-4-4-4 1.794-4 4 1.794 4 4 4"/></g></svg></g><g id="text_6"><text x="200" y="280.95" text-anchor="middle" fill="#111827" font-size="9"><tspan x="200" dy="0">CF</tspan></text></g></g><g id="waf"><g id="waf-icon"><svg x="232" y="233.5" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_AWS-WAF_48</title><g fill="none" fill-rule="evenodd"><path fill="#dd344c" d="M0 0h64v64H0z"/><path fill="#fff" d="M26.929 40.397a18.6 18.6 0 0 0 3.04 1.692c-.477-2.376-.794-6.487 1.343-10.418 1.593-2.928 1.856-6.254.688-8.681a5.9 5.9 0 0 0-1.922-2.292c.762 1.759 1.19 4.299.038 7.572a1 1 0 0 1-1.825.142c-.331-.616-1.242-2.004-2.283-2.833.408 1.876.667 4.683-.673 6.788a8 8 0 0 0-.201.334c-1.47 2.589-.682 5.97 1.795 7.696m7.542-16.242c.565 2.649.092 5.725-1.401 8.471-2.165 3.981-1.363 8.319-.91 10.025 1.957-.329 6.903-1.557 7.959-5.649 1.014-3.926.4-6.199-.31-7.424-.708 2.544-2.007 3.615-2.074 3.669a1.002 1.002 0 0 1-1.614-.938c.606-3.768-.36-6.39-1.65-8.154M23.65 31.29c1.609-2.527-.074-6.965-.091-7.01a1 1 0 0 1 .932-1.361c1.75 0 3.248 1.355 4.25 2.593.529-3.989-1.877-6.084-1.997-6.184a1.004 1.004 0 0 1-.26-1.191.99.99 0 0 1 1.077-.561c1.474.261 2.773.822 3.85 1.633.955.427 5.726 2.839 6.714 8.7q.04-.264.072-.55a1 1 0 0 1 1.474-.774c.187.103 4.533 2.595 2.384 10.917-1.675 6.488-10.18 7.227-10.541 7.255l-.001-.01c-.022.002-.041.013-.063.013a1 1 0 0 1-.335-.059c-2.054-.734-3.847-1.63-5.33-2.663-3.314-2.31-4.364-6.847-2.39-10.327a10 10 0 0 1 .255-.421m-8.16 12.66 1.62-1.173A18.2 18.2 0 0 1 13.677 33H16v-2h-2.321a18.16 18.16 0 0 1 3.432-9.719l-1.621-1.173A20.16 20.16 0 0 0 11.679 31h-1.68v2h1.677c.186 3.962 1.484 7.731 3.814 10.95m27.257 2.968A18.2 18.2 0 0 1 33 50.351V48h-2v2.351a18.2 18.2 0 0 1-9.75-3.433l-1.172 1.621A20.2 20.2 0 0 0 31 52.351V54h2v-1.649c3.95-.191 7.709-1.489 10.919-3.812zM21.25 17.14A18.2 18.2 0 0 1 31 13.708V16h2v-2.292a18.2 18.2 0 0 1 9.747 3.432l1.172-1.62a20.15 20.15 0 0 0-10.92-3.812V10h-2v1.708a20.16 20.16 0 0 0-10.921 3.812zM52.32 31a20.2 20.2 0 0 0-3.811-10.892l-1.621 1.173A18.2 18.2 0 0 1 50.32 31H48v2h2.323a18.2 18.2 0 0 1-3.435 9.777l1.62 1.173c2.33-3.219 3.629-6.988 3.815-10.95H54v-2zm-7.293-10.584 6.159-6.16-1.414-1.414-6.16 6.16zM18.972 43.642l-6.16 6.16 1.414 1.414 6.16-6.16zm3.442-22.641L11.586 10.173l-1.414 1.414L21 22.415zM43 41.586l10.826 10.827-1.414 1.414L41.586 43z"/></g></svg></g><g id="text_7"><text x="250" y="280.95" text-anchor="middle" fill="#111827" font-size="9"><tspan x="250" dy="0">WAF</tspan></text></g></g></g><g id="s3-static"><g id="s3-static-icon"><svg x="207" y="439.7" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-Simple-Storage-Service_48</title><g fill="none" fill-rule="evenodd"><path fill="#7aa116" d="M0 0h64v64H0z"/><path fill="#fff" d="m47.759 33.948.234-1.817c2.173 1.254 2.849 1.99 3.044 2.293-.324.061-1.205.085-3.278-.476M30.499 21c-10.374 0-17.117-2.512-17.5-4.304v-.185c.35-1.119 6.14-4.51 17.5-4.51 11.34 0 17.133 3.38 17.5 4.504v.111C47.725 18.446 40.962 21 30.5 21m15.319 12.362c-4.765-1.565-10.906-4.383-13.224-5.474a2.09 2.09 0 0 0-2.082-1.982A2.097 2.097 0 0 0 28.418 28c0 1.154.94 2.094 2.094 2.094.457 0 .877-.152 1.22-.4 2.4 1.128 8.887 4.104 13.826 5.686l-1.721 13.344C43.583 50.352 38.919 52 30.497 52c-8.425 0-13.092-1.648-13.342-3.249l-3.72-28.937C16.945 21.915 23.749 23 30.5 23c6.75 0 13.554-1.085 17.065-3.185zM50 16.5c0-3.069-8.34-6.5-19.5-6.5S11 13.431 11 16.5v.543l4.174 31.99C15.874 53.516 26.123 54 30.497 54c4.372 0 14.616-.484 15.32-4.993l1.684-13.06c1.277.332 2.31.51 3.115.508.99 0 1.657-.252 2.08-.758.35-.416.489-.94.389-1.476-.228-1.22-1.682-2.509-4.715-4.177l-.1-.055L50 17.044z"/></g></svg></g><g id="text_8"><text x="225" y="487.15" text-anchor="middle" fill="#111827" font-size="9"><tspan x="225" dy="0">Static S3</tspan></text></g></g><g id="edge-row2"><g id="mcf"><g id="mcf-icon"><svg x="182" y="509.70000000000005" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-CloudFront_48</title><g fill="none" fill-rule="evenodd"><path fill="#8c4fff" d="M0 0h64v64H0z"/><path fill="#fff" d="M41.5 43.5c-1.103 0-2-.897-2-2s.897-2 2-2 2 .897 2 2-.897 2-2 2m0-6c-2.206 0-4 1.794-4 4s1.794 4 4 4 4-1.794 4-4-1.794-4-4-4m-19-5c-1.103 0-2-.897-2-2s.897-2 2-2 2 .897 2 2-.897 2-2 2m0-6c-2.206 0-4 1.794-4 4s1.794 4 4 4 4-1.794 4-4-1.794-4-4-4m22.889 20.624a29 29 0 0 0-.704-1.533l-1.789.895c.274.549.524 1.113.76 1.679a19 19 0 0 1-2.628 1.575c.356-.875.666-1.765.946-2.728l-1.92-.558a25.2 25.2 0 0 1-1.87 4.679A19.2 19.2 0 0 1 32.5 52c-3.035 0-5.933-.686-8.629-2.024-1.368-3.361-2.033-6.442-2.033-9.417 0-1.292.225-2.363.484-3.603q.096-.455.192-.932l-1.963-.386q-.092.465-.186.907c-.271 1.293-.527 2.515-.527 4.014 0 2.515.436 5.085 1.316 7.795A19.46 19.46 0 0 1 13 32.5c0-.111.01-.227.012-.339a24 24 0 0 1 4.842-.59l-.05-1.999c-1.635.04-3.11.207-4.641.512.918-7.401 6.049-13.69 13.16-16.065 1.55.799 2.697 1.505 3.812 2.351l1.209-1.594a24 24 0 0 0-2.198-1.477A19.6 19.6 0 0 1 32.5 13c2.532 0 5.032.494 7.349 1.439a33 33 0 0 0-1.606.532l.68 1.881c1.393-.503 2.485-.812 3.648-1.031C48.399 19.341 52 25.667 52 32.5a19.36 19.36 0 0 1-6.611 14.624m-2.381-33.375A21.4 21.4 0 0 0 32.5 11c-2.108 0-4.176.301-6.143.895-8.634 2.569-14.789 10.335-15.312 19.301-.035.429-.045.866-.045 1.304a21.47 21.47 0 0 0 11.354 18.955A21.54 21.54 0 0 0 32.5 54a21.1 21.1 0 0 0 6.937-1.157 21 21 0 0 0 6.209-3.336C50.955 45.399 54 39.2 54 32.5a21.52 21.52 0 0 0-10.992-18.751m-4.624 23.662-1.381 1.447c-2.981-2.843-5.956-4.712-9.366-5.883l.65-1.892c3.692 1.268 6.901 3.279 10.097 6.328m.06-15.047c2.838 4.328 4.436 9.08 4.749 14.124l-1.996.124c-.292-4.693-1.78-9.117-4.425-13.152zm-11.993 4.433-1.678-1.089c1.543-2.376 2.866-3.95 4.563-5.43l1.314 1.508c-1.547 1.349-2.764 2.801-4.199 5.011M34.5 16.5c1.103 0 2 .897 2 2s-.897 2-2 2-2-.897-2-2 .897-2 2-2m0 6c2.206 0 4-1.794 4-4s-1.794-4-4-4-4 1.794-4 4 1.794 4 4 4"/></g></svg></g><g id="text_9"><text x="200" y="557.1500000000001" text-anchor="middle" fill="#111827" font-size="9"><tspan x="200" dy="0">CF</tspan></text></g></g><g id="mwaf"><g id="mwaf-icon"><svg x="232" y="509.70000000000005" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_AWS-WAF_48</title><g fill="none" fill-rule="evenodd"><path fill="#dd344c" d="M0 0h64v64H0z"/><path fill="#fff" d="M26.929 40.397a18.6 18.6 0 0 0 3.04 1.692c-.477-2.376-.794-6.487 1.343-10.418 1.593-2.928 1.856-6.254.688-8.681a5.9 5.9 0 0 0-1.922-2.292c.762 1.759 1.19 4.299.038 7.572a1 1 0 0 1-1.825.142c-.331-.616-1.242-2.004-2.283-2.833.408 1.876.667 4.683-.673 6.788a8 8 0 0 0-.201.334c-1.47 2.589-.682 5.97 1.795 7.696m7.542-16.242c.565 2.649.092 5.725-1.401 8.471-2.165 3.981-1.363 8.319-.91 10.025 1.957-.329 6.903-1.557 7.959-5.649 1.014-3.926.4-6.199-.31-7.424-.708 2.544-2.007 3.615-2.074 3.669a1.002 1.002 0 0 1-1.614-.938c.606-3.768-.36-6.39-1.65-8.154M23.65 31.29c1.609-2.527-.074-6.965-.091-7.01a1 1 0 0 1 .932-1.361c1.75 0 3.248 1.355 4.25 2.593.529-3.989-1.877-6.084-1.997-6.184a1.004 1.004 0 0 1-.26-1.191.99.99 0 0 1 1.077-.561c1.474.261 2.773.822 3.85 1.633.955.427 5.726 2.839 6.714 8.7q.04-.264.072-.55a1 1 0 0 1 1.474-.774c.187.103 4.533 2.595 2.384 10.917-1.675 6.488-10.18 7.227-10.541 7.255l-.001-.01c-.022.002-.041.013-.063.013a1 1 0 0 1-.335-.059c-2.054-.734-3.847-1.63-5.33-2.663-3.314-2.31-4.364-6.847-2.39-10.327a10 10 0 0 1 .255-.421m-8.16 12.66 1.62-1.173A18.2 18.2 0 0 1 13.677 33H16v-2h-2.321a18.16 18.16 0 0 1 3.432-9.719l-1.621-1.173A20.16 20.16 0 0 0 11.679 31h-1.68v2h1.677c.186 3.962 1.484 7.731 3.814 10.95m27.257 2.968A18.2 18.2 0 0 1 33 50.351V48h-2v2.351a18.2 18.2 0 0 1-9.75-3.433l-1.172 1.621A20.2 20.2 0 0 0 31 52.351V54h2v-1.649c3.95-.191 7.709-1.489 10.919-3.812zM21.25 17.14A18.2 18.2 0 0 1 31 13.708V16h2v-2.292a18.2 18.2 0 0 1 9.747 3.432l1.172-1.62a20.15 20.15 0 0 0-10.92-3.812V10h-2v1.708a20.16 20.16 0 0 0-10.921 3.812zM52.32 31a20.2 20.2 0 0 0-3.811-10.892l-1.621 1.173A18.2 18.2 0 0 1 50.32 31H48v2h2.323a18.2 18.2 0 0 1-3.435 9.777l1.62 1.173c2.33-3.219 3.629-6.988 3.815-10.95H54v-2zm-7.293-10.584 6.159-6.16-1.414-1.414-6.16 6.16zM18.972 43.642l-6.16 6.16 1.414 1.414 6.16-6.16zm3.442-22.641L11.586 10.173l-1.414 1.414L21 22.415zM43 41.586l10.826 10.827-1.414 1.414L41.586 43z"/></g></svg></g><g id="text_10"><text x="250" y="557.1500000000001" text-anchor="middle" fill="#111827" font-size="9"><tspan x="250" dy="0">WAF</tspan></text></g></g></g></g></g><g id="vstack_5"><g id="hstack_5"><g id="vstack_6"><g id="box_6"><rect x="308" y="164.5" width="190" height="154.6" fill="white" stroke="#8c4fff" stroke-width="2"/><g id="vstack_7"><g id="box_7"><rect x="308" y="164.5" width="95.5263671875" height="34" fill="#8c4fff" stroke="#8c4fff" stroke-width="0"/><g id="hstack_6"><g id="icon_3"><svg x="316" y="172.5" width="18" height="18" viewBox="0 0 40 40"><title>Icon-Architecture-Group/32/Virtual-private-cloud-VPC_32</title><g fill="none" fill-rule="evenodd"><path fill="#8c4fff" d="M0 0h40v40H0z"/><path fill="#fff" d="m30.97 21.03-2.943-1.264v10.49c2.545-.353 2.932-2.969 2.948-3.088zm-3.943 9.24V19.76l-3.035 1.272v6.201c.013.054.445 2.767 3.035 3.036m.306-11.723a.5.5 0 0 1 .39.001l3.945 1.692a.5.5 0 0 1 .303.46v6.533c-.183 1.447-1.357 4.063-4.527 4.063-3.075 0-4.254-2.612-4.448-3.994l-.004-6.603c0-.2.12-.383.306-.46zm5.65.637-5.461-2.406-5.53 2.327v7.128c-.001.042-.054 2.868 1.657 4.623.917.941 2.194 1.42 3.795 1.42 1.602 0 2.887-.48 3.819-1.423 1.735-1.758 1.72-4.585 1.72-4.613zM31.98 31.55c-1.127 1.144-2.654 1.725-4.536 1.725-1.884 0-3.404-.58-4.517-1.727-2.005-2.063-1.94-5.197-1.935-5.329v-7.446a.5.5 0 0 1 .305-.46l6.035-2.54a.5.5 0 0 1 .396.003l5.956 2.625c.182.08.299.26.299.457v7.375c.002.125.027 3.255-2.003 5.317m-20.988-7.314h8v1h-8c-2.811 0-4.811-2.016-4.98-5.016A4 4 0 0 1 6 19.841c0-2.509 1.318-4.223 3.817-4.979a8 8 0 0 1-.032-.647c0-2.916 1.577-5.445 4.017-6.445 3.298-1.348 7.042-.894 9.106 1.104a8.2 8.2 0 0 1 1.76 2.485c.609-.45 1.4-.66 2.349-.614 1.78.09 3.149 1.713 3.433 4.007 1.498.124 2.485.883 3.01 2.308l-.937.346c-.428-1.157-1.208-1.673-2.531-1.673a.5.5 0 0 1-.5-.47c-.138-2.338-1.406-3.463-2.526-3.519-.945-.053-1.645.22-2.08.791a.5.5 0 0 1-.472.193.5.5 0 0 1-.395-.323 7.4 7.4 0 0 0-1.807-2.814c-1.788-1.73-5.09-2.099-8.031-.895-2.063.845-3.396 3.011-3.396 5.52 0 .272.035.695.066.958a.5.5 0 0 1-.376.544C8.169 16.29 7 17.678 7 19.841c0 .101-.001.201.009.302.14 2.495 1.703 4.093 3.983 4.093"/></g></svg></g><g id="text_11"><text x="367.76318359375" y="185.7" text-anchor="middle" fill="white" font-size="12" font-weight="bold"><tspan x="367.76318359375" dy="0">BFF VPC</tspan></text></g></g></g><g id="bff-vpc"><g id="bff-alb"><g id="bff-alb-icon"><svg x="322" y="233.5" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Elastic-Load-Balancing_48</title><g fill="none" fill-rule="evenodd"><path fill="#8c4fff" d="M0 0h64v64H0z"/><path fill="#fff" d="M23.5 42C17.71 42 13 37.29 13 31.5S17.71 21 23.5 21 34 25.71 34 31.5 29.29 42 23.5 42M48 48c0 1.654-1.346 3-3 3s-3-1.346-3-3 1.346-3 3-3 3 1.346 3 3m-3-35c1.654 0 3 1.346 3 3s-1.346 3-3 3-3-1.346-3-3 1.346-3 3-3m3 16c1.654 0 3 1.346 3 3s-1.346 3-3 3-3-1.346-3-3 1.346-3 3-3m-12.099 4h7.201A5.01 5.01 0 0 0 48 37c2.757 0 5-2.243 5-5s-2.243-5-5-5a5.01 5.01 0 0 0-4.898 4h-7.127a12.5 12.5 0 0 0-.879-4.144l7.703-6.389A4.94 4.94 0 0 0 45 21c2.757 0 5-2.243 5-5s-2.243-5-5-5-5 2.243-5 5c0 1.224.459 2.331 1.191 3.201l-7.019 5.823C31.977 21.42 28.021 19 23.5 19 16.607 19 11 24.607 11 31.5S16.607 44 23.5 44c4.243 0 7.993-2.129 10.254-5.371l7.437 6.17C40.459 45.669 40 46.776 40 48c0 2.757 2.243 5 5 5s5-2.243 5-5-2.243-5-5-5a4.94 4.94 0 0 0-2.201.533l-8.029-6.66c.574-1.2.966-2.5 1.131-3.873"/></g></svg></g><g id="text_12"><text x="340" y="280.95" text-anchor="middle" fill="#111827" font-size="9"><tspan x="340" dy="0">ALB</tspan></text></g></g><g id="bff"><rect x="388" y="205.2" width="96" height="92.6" fill="white" stroke="#ed7100" stroke-width="1" stroke-dasharray="6 4"/><g id="vstack_8"><g id="box_8"><rect x="388" y="205.2" width="74.87548828125" height="26" fill="#ed7100" stroke="#ed7100" stroke-width="0"/><g id="hstack_7"><g id="icon_4"><svg x="394" y="211.2" width="14" height="14" viewBox="0 0 40 40"><title>Icon-Architecture-Group/32/Auto-Scaling-group_32</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h40v40H0z"/><path fill="#fff" d="M18.021 19.495a.5.5 0 0 0-.188-.39l-2.954-2.954-.707.707 2.138 2.137H7v1h9.314l-2.142 2.142.707.707 2.969-2.969a.5.5 0 0 0 .173-.38m15.965-.5h-9.311l2.138-2.137-.707-.707-2.969 2.97a.5.5 0 0 0 .016.77l2.953 2.953.707-.707-2.142-2.142h9.315zm-12.99 12.33V22.01h-1v9.31l-2.138-2.137-.707.707 2.969 2.967a.5.5 0 0 0 .773-.016l2.951-2.95-.707-.708zM17.858 9.836l-.707-.707 2.952-2.95c.182-.233.58-.24.774-.018l2.967 2.968-.707.707-2.141-2.14v9.313h-1V7.7z"/></g></svg></g><g id="text_13"><text x="434.437744140625" y="221.7" text-anchor="middle" fill="white" font-size="10" font-weight="bold"><tspan x="434.437744140625" dy="0">BFF App</tspan></text></g></g></g><g id="hstack_8"><g id="bff-ecs"><g id="bff-ecs-icon"><svg x="396" y="239.2" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-Elastic-Container-Service_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="m50 36.382-6-3V25a1 1 0 0 0-.515-.874L35 19.412V12.75l15 8.822zm1.507-16.244-17-10a1.001 1.001 0 0 0-1.507.863v9c0 .362.197.697.515.873L42 25.588V34c0 .38.214.725.553.895l8 4a1 1 0 0 0 .972-.044c.295-.183.475-.504.475-.85V21c0-.355-.188-.683-.493-.863M32 51.828 15 41.439V21.554l14-8.75v6.642l-7.53 4.706A1 1 0 0 0 21 25v13a1 1 0 0 0 .485.857l10 6a1 1 0 0 0 .994.021l10.509-5.732 5.047 2.883zm18.496-10.696-7-4a1 1 0 0 0-.975-.01l-10.498 5.726L23 37.434v-11.88l7.53-4.706A1 1 0 0 0 31 20v-9a1 1 0 0 0-1.53-.847l-16 10A1 1 0 0 0 13 21v21c0 .348.182.671.479.854l18 11a1 1 0 0 0 1.042 0l18-11a1 1 0 0 0-.025-1.722"/></g></svg></g><g id="text_14"><text x="414" y="286.65" text-anchor="middle" fill="#111827" font-size="9"><tspan x="414" dy="0">ECS</tspan></text></g></g><g id="bff-fg"><g id="bff-fg-icon"><svg x="440" y="239.2" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_AWS-Fargate_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="M42.467 46.382v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm-4.983 9.764v-3.764l1.993-1v3.764zm-3.987-4.764 1.993 1v3.764l-1.993-1zm-4.984-.236v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm2.99-2.5 1.759.882-1.758.882L21.77 40zm8.971 5 1.758.882-1.758.882L30.742 45zm8.97-5L43.23 40l-1.759.882L39.712 40zm4.433-.012-3.987-2a.99.99 0 0 0-.891 0l-3.987 2a1 1 0 0 0-.551.894v3.882l-3.541-1.776a.99.99 0 0 0-.892 0l-3.54 1.776V40a1 1 0 0 0-.552-.894l-3.987-2a.99.99 0 0 0-.89 0l-3.988 2a1 1 0 0 0-.55.894v6c0 .379.212.725.55.895l3.987 2a1 1 0 0 0 .891 0l3.541-1.777V51c0 .379.214.725.552.895l3.986 2a1 1 0 0 0 .892 0l3.986-2c.338-.17.552-.516.552-.895v-3.882l3.54 1.777a1 1 0 0 0 .892 0l3.987-2c.338-.17.55-.516.55-.895v-6a1 1 0 0 0-.55-.894M54 28.09c0 5.103-11.077 7.856-21.5 7.856S11 33.193 11 28.09c0-2.461 2.68-4.616 7.547-6.067l.568 1.917c-3.776 1.126-6.122 2.716-6.122 4.15 0 2.764 8.343 5.856 19.507 5.856s19.507-3.092 19.507-5.856c0-1.434-2.346-3.024-6.122-4.15l.568-1.917C51.32 23.474 54 25.629 54 28.09M32.5 12.064 40.547 15 32.5 17.936 24.453 15zm8.868 16.584c-1.556.7-4.155 1.516-7.871 1.645V19.701l8.97-3.273v10.485c0 .754-.431 1.435-1.1 1.735m-18.835-1.735V16.428l8.97 3.273v10.592c-3.716-.129-6.315-.945-7.87-1.645-.669-.3-1.1-.981-1.1-1.735m.283 3.56c1.87.842 5.07 1.846 9.684 1.846 4.615 0 7.813-1.004 9.684-1.846 1.383-.622 2.277-2.019 2.277-3.56V15a1 1 0 0 0-.656-.94l-10.964-4a1 1 0 0 0-.682 0l-10.964 4a1 1 0 0 0-.656.94v11.913c0 1.541.894 2.938 2.277 3.56"/></g></svg></g><g id="text_15"><text x="458" y="286.65" text-anchor="middle" fill="#111827" font-size="9"><tspan x="458" dy="0">Fargate</tspan></text></g></g></g></g></g></g></g></g></g><g id="box_9"><rect x="514" y="108.19999999999999" width="301.528564453125" height="267.2" fill="white" stroke="#8c4fff" stroke-width="2"/><g id="vstack_9"><g id="box_10"><rect x="514" y="108.19999999999999" width="126.6958984375" height="34" fill="#8c4fff" stroke="#8c4fff" stroke-width="0"/><g id="hstack_9"><g id="icon_5"><svg x="522" y="116.19999999999999" width="18" height="18" viewBox="0 0 40 40"><title>Icon-Architecture-Group/32/Virtual-private-cloud-VPC_32</title><g fill="none" fill-rule="evenodd"><path fill="#8c4fff" d="M0 0h40v40H0z"/><path fill="#fff" d="m30.97 21.03-2.943-1.264v10.49c2.545-.353 2.932-2.969 2.948-3.088zm-3.943 9.24V19.76l-3.035 1.272v6.201c.013.054.445 2.767 3.035 3.036m.306-11.723a.5.5 0 0 1 .39.001l3.945 1.692a.5.5 0 0 1 .303.46v6.533c-.183 1.447-1.357 4.063-4.527 4.063-3.075 0-4.254-2.612-4.448-3.994l-.004-6.603c0-.2.12-.383.306-.46zm5.65.637-5.461-2.406-5.53 2.327v7.128c-.001.042-.054 2.868 1.657 4.623.917.941 2.194 1.42 3.795 1.42 1.602 0 2.887-.48 3.819-1.423 1.735-1.758 1.72-4.585 1.72-4.613zM31.98 31.55c-1.127 1.144-2.654 1.725-4.536 1.725-1.884 0-3.404-.58-4.517-1.727-2.005-2.063-1.94-5.197-1.935-5.329v-7.446a.5.5 0 0 1 .305-.46l6.035-2.54a.5.5 0 0 1 .396.003l5.956 2.625c.182.08.299.26.299.457v7.375c.002.125.027 3.255-2.003 5.317m-20.988-7.314h8v1h-8c-2.811 0-4.811-2.016-4.98-5.016A4 4 0 0 1 6 19.841c0-2.509 1.318-4.223 3.817-4.979a8 8 0 0 1-.032-.647c0-2.916 1.577-5.445 4.017-6.445 3.298-1.348 7.042-.894 9.106 1.104a8.2 8.2 0 0 1 1.76 2.485c.609-.45 1.4-.66 2.349-.614 1.78.09 3.149 1.713 3.433 4.007 1.498.124 2.485.883 3.01 2.308l-.937.346c-.428-1.157-1.208-1.673-2.531-1.673a.5.5 0 0 1-.5-.47c-.138-2.338-1.406-3.463-2.526-3.519-.945-.053-1.645.22-2.08.791a.5.5 0 0 1-.472.193.5.5 0 0 1-.395-.323 7.4 7.4 0 0 0-1.807-2.814c-1.788-1.73-5.09-2.099-8.031-.895-2.063.845-3.396 3.011-3.396 5.52 0 .272.035.695.066.958a.5.5 0 0 1-.376.544C8.169 16.29 7 17.678 7 19.841c0 .101-.001.201.009.302.14 2.495 1.703 4.093 3.983 4.093"/></g></svg></g><g id="text_16"><text x="589.34794921875" y="129.39999999999998" text-anchor="middle" fill="white" font-size="12" font-weight="bold"><tspan x="589.34794921875" dy="0">Platform VPC</tspan></text></g></g></g><g id="hstack_10"><g id="plat-alb"><g id="plat-alb-icon"><svg x="528" y="233.5" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Elastic-Load-Balancing_48</title><g fill="none" fill-rule="evenodd"><path fill="#8c4fff" d="M0 0h64v64H0z"/><path fill="#fff" d="M23.5 42C17.71 42 13 37.29 13 31.5S17.71 21 23.5 21 34 25.71 34 31.5 29.29 42 23.5 42M48 48c0 1.654-1.346 3-3 3s-3-1.346-3-3 1.346-3 3-3 3 1.346 3 3m-3-35c1.654 0 3 1.346 3 3s-1.346 3-3 3-3-1.346-3-3 1.346-3 3-3m3 16c1.654 0 3 1.346 3 3s-1.346 3-3 3-3-1.346-3-3 1.346-3 3-3m-12.099 4h7.201A5.01 5.01 0 0 0 48 37c2.757 0 5-2.243 5-5s-2.243-5-5-5a5.01 5.01 0 0 0-4.898 4h-7.127a12.5 12.5 0 0 0-.879-4.144l7.703-6.389A4.94 4.94 0 0 0 45 21c2.757 0 5-2.243 5-5s-2.243-5-5-5-5 2.243-5 5c0 1.224.459 2.331 1.191 3.201l-7.019 5.823C31.977 21.42 28.021 19 23.5 19 16.607 19 11 24.607 11 31.5S16.607 44 23.5 44c4.243 0 7.993-2.129 10.254-5.371l7.437 6.17C40.459 45.669 40 46.776 40 48c0 2.757 2.243 5 5 5s5-2.243 5-5-2.243-5-5-5a4.94 4.94 0 0 0-2.201.533l-8.029-6.66c.574-1.2.966-2.5 1.131-3.873"/></g></svg></g><g id="text_17"><text x="546" y="280.95" text-anchor="middle" fill="#111827" font-size="9"><tspan x="546" dy="0">ALB</tspan></text></g></g><g id="vstack_10"><g id="api-a"><rect x="604" y="156.2" width="102.68701171875" height="92.6" fill="white" stroke="#ed7100" stroke-width="1" stroke-dasharray="6 4"/><g id="vstack_11"><g id="box_11"><rect x="604" y="156.2" width="102.68701171875" height="26" fill="#ed7100" stroke="#ed7100" stroke-width="0"/><g id="hstack_11"><g id="icon_6"><svg x="610" y="162.2" width="14" height="14" viewBox="0 0 40 40"><title>Icon-Architecture-Group/32/Auto-Scaling-group_32</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h40v40H0z"/><path fill="#fff" d="M18.021 19.495a.5.5 0 0 0-.188-.39l-2.954-2.954-.707.707 2.138 2.137H7v1h9.314l-2.142 2.142.707.707 2.969-2.969a.5.5 0 0 0 .173-.38m15.965-.5h-9.311l2.138-2.137-.707-.707-2.969 2.97a.5.5 0 0 0 .016.77l2.953 2.953.707-.707-2.142-2.142h9.315zm-12.99 12.33V22.01h-1v9.31l-2.138-2.137-.707.707 2.969 2.967a.5.5 0 0 0 .773-.016l2.951-2.95-.707-.708zM17.858 9.836l-.707-.707 2.952-2.95c.182-.233.58-.24.774-.018l2.967 2.968-.707.707-2.141-2.14v9.313h-1V7.7z"/></g></svg></g><g id="text_18"><text x="664.343505859375" y="172.7" text-anchor="middle" fill="white" font-size="10" font-weight="bold"><tspan x="664.343505859375" dy="0">API Service A</tspan></text></g></g></g><g id="hstack_12"><g id="api-a-ecs"><g id="api-a-ecs-icon"><svg x="612" y="190.2" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-Elastic-Container-Service_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="m50 36.382-6-3V25a1 1 0 0 0-.515-.874L35 19.412V12.75l15 8.822zm1.507-16.244-17-10a1.001 1.001 0 0 0-1.507.863v9c0 .362.197.697.515.873L42 25.588V34c0 .38.214.725.553.895l8 4a1 1 0 0 0 .972-.044c.295-.183.475-.504.475-.85V21c0-.355-.188-.683-.493-.863M32 51.828 15 41.439V21.554l14-8.75v6.642l-7.53 4.706A1 1 0 0 0 21 25v13a1 1 0 0 0 .485.857l10 6a1 1 0 0 0 .994.021l10.509-5.732 5.047 2.883zm18.496-10.696-7-4a1 1 0 0 0-.975-.01l-10.498 5.726L23 37.434v-11.88l7.53-4.706A1 1 0 0 0 31 20v-9a1 1 0 0 0-1.53-.847l-16 10A1 1 0 0 0 13 21v21c0 .348.182.671.479.854l18 11a1 1 0 0 0 1.042 0l18-11a1 1 0 0 0-.025-1.722"/></g></svg></g><g id="text_19"><text x="630" y="237.64999999999998" text-anchor="middle" fill="#111827" font-size="9"><tspan x="630" dy="0">ECS</tspan></text></g></g><g id="api-a-fg"><g id="api-a-fg-icon"><svg x="656" y="190.2" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_AWS-Fargate_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="M42.467 46.382v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm-4.983 9.764v-3.764l1.993-1v3.764zm-3.987-4.764 1.993 1v3.764l-1.993-1zm-4.984-.236v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm2.99-2.5 1.759.882-1.758.882L21.77 40zm8.971 5 1.758.882-1.758.882L30.742 45zm8.97-5L43.23 40l-1.759.882L39.712 40zm4.433-.012-3.987-2a.99.99 0 0 0-.891 0l-3.987 2a1 1 0 0 0-.551.894v3.882l-3.541-1.776a.99.99 0 0 0-.892 0l-3.54 1.776V40a1 1 0 0 0-.552-.894l-3.987-2a.99.99 0 0 0-.89 0l-3.988 2a1 1 0 0 0-.55.894v6c0 .379.212.725.55.895l3.987 2a1 1 0 0 0 .891 0l3.541-1.777V51c0 .379.214.725.552.895l3.986 2a1 1 0 0 0 .892 0l3.986-2c.338-.17.552-.516.552-.895v-3.882l3.54 1.777a1 1 0 0 0 .892 0l3.987-2c.338-.17.55-.516.55-.895v-6a1 1 0 0 0-.55-.894M54 28.09c0 5.103-11.077 7.856-21.5 7.856S11 33.193 11 28.09c0-2.461 2.68-4.616 7.547-6.067l.568 1.917c-3.776 1.126-6.122 2.716-6.122 4.15 0 2.764 8.343 5.856 19.507 5.856s19.507-3.092 19.507-5.856c0-1.434-2.346-3.024-6.122-4.15l.568-1.917C51.32 23.474 54 25.629 54 28.09M32.5 12.064 40.547 15 32.5 17.936 24.453 15zm8.868 16.584c-1.556.7-4.155 1.516-7.871 1.645V19.701l8.97-3.273v10.485c0 .754-.431 1.435-1.1 1.735m-18.835-1.735V16.428l8.97 3.273v10.592c-3.716-.129-6.315-.945-7.87-1.645-.669-.3-1.1-.981-1.1-1.735m.283 3.56c1.87.842 5.07 1.846 9.684 1.846 4.615 0 7.813-1.004 9.684-1.846 1.383-.622 2.277-2.019 2.277-3.56V15a1 1 0 0 0-.656-.94l-10.964-4a1 1 0 0 0-.682 0l-10.964 4a1 1 0 0 0-.656.94v11.913c0 1.541.894 2.938 2.277 3.56"/></g></svg></g><g id="text_20"><text x="674" y="237.64999999999998" text-anchor="middle" fill="#111827" font-size="9"><tspan x="674" dy="0">Fargate</tspan></text></g></g></g></g></g><g id="api-b"><rect x="604" y="268.79999999999995" width="101.75244140625" height="92.6" fill="white" stroke="#ed7100" stroke-width="1" stroke-dasharray="6 4"/><g id="vstack_12"><g id="box_12"><rect x="604" y="268.79999999999995" width="101.75244140625" height="26" fill="#ed7100" stroke="#ed7100" stroke-width="0"/><g id="hstack_13"><g id="icon_7"><svg x="610" y="274.79999999999995" width="14" height="14" viewBox="0 0 40 40"><title>Icon-Architecture-Group/32/Auto-Scaling-group_32</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h40v40H0z"/><path fill="#fff" d="M18.021 19.495a.5.5 0 0 0-.188-.39l-2.954-2.954-.707.707 2.138 2.137H7v1h9.314l-2.142 2.142.707.707 2.969-2.969a.5.5 0 0 0 .173-.38m15.965-.5h-9.311l2.138-2.137-.707-.707-2.969 2.97a.5.5 0 0 0 .016.77l2.953 2.953.707-.707-2.142-2.142h9.315zm-12.99 12.33V22.01h-1v9.31l-2.138-2.137-.707.707 2.969 2.967a.5.5 0 0 0 .773-.016l2.951-2.95-.707-.708zM17.858 9.836l-.707-.707 2.952-2.95c.182-.233.58-.24.774-.018l2.967 2.968-.707.707-2.141-2.14v9.313h-1V7.7z"/></g></svg></g><g id="text_21"><text x="663.876220703125" y="285.29999999999995" text-anchor="middle" fill="white" font-size="10" font-weight="bold"><tspan x="663.876220703125" dy="0">API Service B</tspan></text></g></g></g><g id="hstack_14"><g id="api-b-ecs"><g id="api-b-ecs-icon"><svg x="612" y="302.79999999999995" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-Elastic-Container-Service_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="m50 36.382-6-3V25a1 1 0 0 0-.515-.874L35 19.412V12.75l15 8.822zm1.507-16.244-17-10a1.001 1.001 0 0 0-1.507.863v9c0 .362.197.697.515.873L42 25.588V34c0 .38.214.725.553.895l8 4a1 1 0 0 0 .972-.044c.295-.183.475-.504.475-.85V21c0-.355-.188-.683-.493-.863M32 51.828 15 41.439V21.554l14-8.75v6.642l-7.53 4.706A1 1 0 0 0 21 25v13a1 1 0 0 0 .485.857l10 6a1 1 0 0 0 .994.021l10.509-5.732 5.047 2.883zm18.496-10.696-7-4a1 1 0 0 0-.975-.01l-10.498 5.726L23 37.434v-11.88l7.53-4.706A1 1 0 0 0 31 20v-9a1 1 0 0 0-1.53-.847l-16 10A1 1 0 0 0 13 21v21c0 .348.182.671.479.854l18 11a1 1 0 0 0 1.042 0l18-11a1 1 0 0 0-.025-1.722"/></g></svg></g><g id="text_22"><text x="630" y="350.24999999999994" text-anchor="middle" fill="#111827" font-size="9"><tspan x="630" dy="0">ECS</tspan></text></g></g><g id="api-b-fg"><g id="api-b-fg-icon"><svg x="656" y="302.79999999999995" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_AWS-Fargate_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="M42.467 46.382v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm-4.983 9.764v-3.764l1.993-1v3.764zm-3.987-4.764 1.993 1v3.764l-1.993-1zm-4.984-.236v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm2.99-2.5 1.759.882-1.758.882L21.77 40zm8.971 5 1.758.882-1.758.882L30.742 45zm8.97-5L43.23 40l-1.759.882L39.712 40zm4.433-.012-3.987-2a.99.99 0 0 0-.891 0l-3.987 2a1 1 0 0 0-.551.894v3.882l-3.541-1.776a.99.99 0 0 0-.892 0l-3.54 1.776V40a1 1 0 0 0-.552-.894l-3.987-2a.99.99 0 0 0-.89 0l-3.988 2a1 1 0 0 0-.55.894v6c0 .379.212.725.55.895l3.987 2a1 1 0 0 0 .891 0l3.541-1.777V51c0 .379.214.725.552.895l3.986 2a1 1 0 0 0 .892 0l3.986-2c.338-.17.552-.516.552-.895v-3.882l3.54 1.777a1 1 0 0 0 .892 0l3.987-2c.338-.17.55-.516.55-.895v-6a1 1 0 0 0-.55-.894M54 28.09c0 5.103-11.077 7.856-21.5 7.856S11 33.193 11 28.09c0-2.461 2.68-4.616 7.547-6.067l.568 1.917c-3.776 1.126-6.122 2.716-6.122 4.15 0 2.764 8.343 5.856 19.507 5.856s19.507-3.092 19.507-5.856c0-1.434-2.346-3.024-6.122-4.15l.568-1.917C51.32 23.474 54 25.629 54 28.09M32.5 12.064 40.547 15 32.5 17.936 24.453 15zm8.868 16.584c-1.556.7-4.155 1.516-7.871 1.645V19.701l8.97-3.273v10.485c0 .754-.431 1.435-1.1 1.735m-18.835-1.735V16.428l8.97 3.273v10.592c-3.716-.129-6.315-.945-7.87-1.645-.669-.3-1.1-.981-1.1-1.735m.283 3.56c1.87.842 5.07 1.846 9.684 1.846 4.615 0 7.813-1.004 9.684-1.846 1.383-.622 2.277-2.019 2.277-3.56V15a1 1 0 0 0-.656-.94l-10.964-4a1 1 0 0 0-.682 0l-10.964 4a1 1 0 0 0-.656.94v11.913c0 1.541.894 2.938 2.277 3.56"/></g></svg></g><g id="text_23"><text x="674" y="350.24999999999994" text-anchor="middle" fill="#111827" font-size="9"><tspan x="674" dy="0">Fargate</tspan></text></g></g></g></g></g></g><g id="vstack_13"><g id="cache"><g id="cache-icon"><svg x="756.1077880859375" y="162.89999999999998" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-ElastiCache_48</title><g fill="none" fill-rule="evenodd"><path fill="#c925d1" d="M0 0h64v64H0z"/><path fill="#fff" d="M40.05 35.279V30.62c-1.988 1.103-5.194 1.62-8.386 1.62-3.35 0-6.025-.554-7.714-1.517v4.555c0 .953 2.452 2.364 7.714 2.364 5.506 0 8.386-1.54 8.386-2.364m0 6.73v-3.984c-1.988 1.103-5.194 1.62-8.386 1.62-3.35 0-6.025-.554-7.714-1.518v3.882c0 .953 2.452 2.363 7.714 2.363 5.506 0 8.386-1.54 8.386-2.364m0 6.655v-3.91c-1.988 1.103-5.194 1.62-8.386 1.62-3.35 0-6.025-.554-7.714-1.517v3.807c0 .978 2.682 2.334 7.717 2.334 5.504 0 8.383-1.52 8.383-2.334m-16.1-20.79c0 .992 2.681 2.365 7.714 2.365 5.506 0 8.386-1.54 8.386-2.364 0-.825-2.88-2.364-8.386-2.364-5.033 0-7.714 1.373-7.714 2.364m18.1 0c0 .05-.013.097-.016.146h.016v20.644c0 2.995-5.215 4.336-10.383 4.336-5.902 0-9.717-1.702-9.717-4.336V28.019h.013c-.002-.048-.013-.095-.013-.144 0-2.652 3.813-4.366 9.714-4.366 5.17 0 10.386 1.35 10.386 4.366M53 18.005a1 1 0 0 0 1-1v-4.003A1 1 0 0 0 53 12H11a1 1 0 0 0-1 1v4.004a1 1 0 0 0 1 1 1.502 1.502 0 0 1 0 3.003 1 1 0 0 0-1 1.001v16.013a1 1 0 0 0 1 1h8v-2h-4v-2.002h4v-2.002h-5a1 1 0 0 0-1 1v3.003h-1V22.863a3.51 3.51 0 0 0 2.5-3.357 3.51 3.51 0 0 0-2.5-3.358v-2.146h40v2.146a3.51 3.51 0 0 0-2.5 3.358 3.51 3.51 0 0 0 2.5 3.357V37.02h-1v-3.002a1 1 0 0 0-1-1.001h-5v2.002h4v2.001h-4v2.002h8a1 1 0 0 0 1-1.001V22.008a1 1 0 0 0-1-1 1.502 1.502 0 0 1 0-3.003M22 23.01v-6.005a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v13.01a1 1 0 0 0 1 1.001h2v-2.001h-1v-11.01h2v5.005zm24 6.005h-1v2.001h2a1 1 0 0 0 1-1V17.003a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v6.005h2v-5.004h2zm-6-7.006v-5.004a1 1 0 0 0-1-1h-5a1 1 0 0 0-1 1v4.003h2v-3.002h3v4.003zm-11-1v-3.003h-3v4.003h-2v-5.004a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v4.003z"/></g></svg></g><g id="text_24"><text x="774.1077880859375" y="210.34999999999997" text-anchor="middle" fill="#111827" font-size="9"><tspan x="774.1077880859375" dy="0">ElastiCache</tspan></text></g></g><g id="aurora"><g id="aurora-icon"><svg x="756.1077880859375" y="233.49999999999997" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-Aurora_48</title><g fill="none" fill-rule="evenodd"><path fill="#c925d1" d="M0 0h64v64H0z"/><path fill="#fff" d="M36.213 16.011h-2.016v-2.005h2.016V12h2.017v2.006h2.016v2.005H38.23v2.006h-2.017zm9.074 8.023h-2.016v-2.006h2.016v-2.005h2.016v2.005h2.017v2.006h-2.017v2.006h-2.016v-2.006m-3.434 22.64c-1.495-3.292-4.482-6.263-7.792-7.75 3.31-1.487 6.297-4.459 7.792-7.75 1.494 3.291 4.482 6.263 7.791 7.75-3.31 1.487-6.297 4.458-7.79 7.75m12.139-8.753c-5.202 0-11.13-5.898-11.13-11.071 0-.555-.452-1.003-1.009-1.003s-1.008.448-1.008 1.003c0 5.173-5.93 11.071-11.13 11.071-.558 0-1.009.448-1.009 1.003s.45 1.003 1.008 1.003c5.202 0 11.13 5.898 11.13 11.07 0 .554.452 1.003 1.01 1.003.556 0 1.007-.45 1.007-1.003 0-5.172 5.93-11.07 11.13-11.07.558 0 1.009-.45 1.009-1.003 0-.555-.45-1.003-1.008-1.003m-31.39-19.904c6.85 0 10.587 1.988 10.587 3.008s-3.737 3.009-10.586 3.009-10.587-1.988-10.587-3.009 3.737-3.008 10.587-3.008m-.35 15.15c-5.012 0-8.62-1.063-10.236-2.19v-7.113c2.367 1.433 6.487 2.176 10.587 2.176s8.22-.743 10.586-2.176v6.484c-1.016 1.406-5.247 2.819-10.936 2.819M33.19 45.975c0 1.435-4.126 3.52-10.59 3.52-6.46 0-10.583-2.085-10.583-3.52v-4.407c2.258 1.354 6.014 2.192 10.276 2.192 2.942 0 5.786-.413 8.01-1.166l-.651-1.898c-2.019.682-4.633 1.058-7.359 1.058-5.39 0-9.252-1.402-10.276-2.76v-5.707c2.411 1.176 6.113 1.885 10.237 1.885 3.92 0 8.34-.725 10.936-2.269v2.162h2.016v-14.04c0-3.292-6.34-5.014-12.602-5.014S10 17.733 10 21.025v24.95c0 3.59 6.49 5.526 12.598 5.526 6.112 0 12.607-1.937 12.607-5.526v-2.887h-2.016z"/></g></svg></g><g id="text_25"><text x="774.1077880859375" y="280.95" text-anchor="middle" fill="#111827" font-size="9"><tspan x="774.1077880859375" dy="0">Aurora</tspan></text></g></g><g id="dynamo"><g id="dynamo-icon"><svg x="756.1077880859375" y="304.09999999999997" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-DynamoDB_48</title><g fill="none" fill-rule="evenodd"><path fill="#c925d1" d="M0 0h64v64H0z"/><path fill="#fff" d="M46.586 25.25H43a1 1 0 0 1-.822-.435 1.02 1.02 0 0 1-.114-.931l2.493-6.722h-8.913l-4.091 9.098H36c.32 0 .623.156.812.42.187.264.239.602.136.91l-3.66 11.101zm3.12-.297L31.709 43.15a.99.99 0 0 1-1.232.146 1.014 1.014 0 0 1-.423-1.18l4.56-13.833H30a1 1 0 0 1-.841-.463 1.02 1.02 0 0 1-.07-.966l5-11.12a1 1 0 0 1 .91-.593h11c.329 0 .636.163.823.435.187.273.23.62.115.931l-2.494 6.721H49a1 1 0 0 1 .924.624c.155.378.069.813-.217 1.102M41.002 44.22c-2.71 1.886-7.687 2.882-12.468 2.882-4.816 0-9.837-1.01-12.533-2.924l.001 3.816c0 1.664 4.768 3.984 12.532 3.984 7.495 0 12.468-2.702 12.468-4.49zm2.064-3.27c0 .187-.032.367-.064.546v5.993C43 51.079 36.51 54 28.533 54c-6.903 0-13.871-1.89-14.473-5.5h-.059L14 43.445V16.151h.001c0-3.996 7.487-6.151 14.532-6.151 3.94 0 7.73.64 10.397 1.756l-.766 1.868c-2.432-1.019-5.943-1.602-9.631-1.602-7.764 0-12.532 2.405-12.532 4.13 0 1.724 4.768 4.129 12.532 4.129.195 0 .399 0 .596-.007l.078 2.02c-.225.009-.45.009-.674.009-4.817 0-9.837-1.01-12.533-2.924v4.358h.001v.017c.005.53.489 1.143 1.364 1.72 1.982 1.288 5.55 2.168 9.539 2.351l-.091 2.02c-4.126-.19-7.75-1.069-10.086-2.416-.31.298-.726 1.056-.726 1.467 0 1.724 4.768 4.129 12.532 4.129.738 0 1.465-.025 2.162-.075l.14 2.017c-.743.054-1.518.08-2.302.08-4.817 0-9.837-1.009-12.533-2.924v3.67h.001c.005.547.489 1.16 1.364 1.737 2.268 1.474 6.549 2.393 11.168 2.393h.33v2.022h-.33c-4.778 0-9.86-1.008-12.532-2.543-.322.298 0 1.01 0 1.548 0 1.725 4.768 4.13 12.532 4.13s12.532-2.405 12.532-4.13c0-.61-.6-1.174-1.092-1.538-.41.247-.86.483-1.372.7l-.768-1.868c.53-.223.99-.463 1.364-.711 1.1-.734 1.804-1.779 1.804-2.175h2c0 .94-.621 1.947-1.417 2.775 1.192 1.04 1.48 2.078 1.48 2.817M17.142 48.39c.791.408 1.716.772 2.752 1.08l.564-1.94a14 14 0 0 1-2.406-.94zm2.752-11.05.564-1.94c-.916-.272-1.726-.589-2.406-.94l-.91 1.799c.791.41 1.716.772 2.752 1.08m-2.752-13.21.91-1.801c.68.352 1.49.668 2.406.94l-.564 1.94a16 16 0 0 1-2.752-1.08"/></g></svg></g><g id="text_26"><text x="774.1077880859375" y="351.54999999999995" text-anchor="middle" fill="#111827" font-size="9"><tspan x="774.1077880859375" dy="0">DynamoDB</tspan></text></g></g></g></g></g></g></g><g id="hstack_15"><g id="box_13"><rect x="308" y="389.4" width="257.5146484375" height="257.2" fill="white" stroke="#8c4fff" stroke-width="2"/><g id="vstack_14"><g id="box_14"><rect x="308" y="389.4" width="156.3056640625" height="34" fill="#8c4fff" stroke="#8c4fff" stroke-width="0"/><g id="hstack_16"><g id="icon_8"><svg x="316" y="397.4" width="18" height="18" viewBox="0 0 40 40"><title>Icon-Architecture-Group/32/Virtual-private-cloud-VPC_32</title><g fill="none" fill-rule="evenodd"><path fill="#8c4fff" d="M0 0h40v40H0z"/><path fill="#fff" d="m30.97 21.03-2.943-1.264v10.49c2.545-.353 2.932-2.969 2.948-3.088zm-3.943 9.24V19.76l-3.035 1.272v6.201c.013.054.445 2.767 3.035 3.036m.306-11.723a.5.5 0 0 1 .39.001l3.945 1.692a.5.5 0 0 1 .303.46v6.533c-.183 1.447-1.357 4.063-4.527 4.063-3.075 0-4.254-2.612-4.448-3.994l-.004-6.603c0-.2.12-.383.306-.46zm5.65.637-5.461-2.406-5.53 2.327v7.128c-.001.042-.054 2.868 1.657 4.623.917.941 2.194 1.42 3.795 1.42 1.602 0 2.887-.48 3.819-1.423 1.735-1.758 1.72-4.585 1.72-4.613zM31.98 31.55c-1.127 1.144-2.654 1.725-4.536 1.725-1.884 0-3.404-.58-4.517-1.727-2.005-2.063-1.94-5.197-1.935-5.329v-7.446a.5.5 0 0 1 .305-.46l6.035-2.54a.5.5 0 0 1 .396.003l5.956 2.625c.182.08.299.26.299.457v7.375c.002.125.027 3.255-2.003 5.317m-20.988-7.314h8v1h-8c-2.811 0-4.811-2.016-4.98-5.016A4 4 0 0 1 6 19.841c0-2.509 1.318-4.223 3.817-4.979a8 8 0 0 1-.032-.647c0-2.916 1.577-5.445 4.017-6.445 3.298-1.348 7.042-.894 9.106 1.104a8.2 8.2 0 0 1 1.76 2.485c.609-.45 1.4-.66 2.349-.614 1.78.09 3.149 1.713 3.433 4.007 1.498.124 2.485.883 3.01 2.308l-.937.346c-.428-1.157-1.208-1.673-2.531-1.673a.5.5 0 0 1-.5-.47c-.138-2.338-1.406-3.463-2.526-3.519-.945-.053-1.645.22-2.08.791a.5.5 0 0 1-.472.193.5.5 0 0 1-.395-.323 7.4 7.4 0 0 0-1.807-2.814c-1.788-1.73-5.09-2.099-8.031-.895-2.063.845-3.396 3.011-3.396 5.52 0 .272.035.695.066.958a.5.5 0 0 1-.376.544C8.169 16.29 7 17.678 7 19.841c0 .101-.001.201.009.302.14 2.495 1.703 4.093 3.983 4.093"/></g></svg></g><g id="text_27"><text x="398.15283203125" y="410.6" text-anchor="middle" fill="white" font-size="12" font-weight="bold"><tspan x="398.15283203125" dy="0">Management VPC</tspan></text></g></g></g><g id="hstack_17"><g id="mgmt-alb"><g id="mgmt-alb-icon"><svg x="322" y="509.7" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Elastic-Load-Balancing_48</title><g fill="none" fill-rule="evenodd"><path fill="#8c4fff" d="M0 0h64v64H0z"/><path fill="#fff" d="M23.5 42C17.71 42 13 37.29 13 31.5S17.71 21 23.5 21 34 25.71 34 31.5 29.29 42 23.5 42M48 48c0 1.654-1.346 3-3 3s-3-1.346-3-3 1.346-3 3-3 3 1.346 3 3m-3-35c1.654 0 3 1.346 3 3s-1.346 3-3 3-3-1.346-3-3 1.346-3 3-3m3 16c1.654 0 3 1.346 3 3s-1.346 3-3 3-3-1.346-3-3 1.346-3 3-3m-12.099 4h7.201A5.01 5.01 0 0 0 48 37c2.757 0 5-2.243 5-5s-2.243-5-5-5a5.01 5.01 0 0 0-4.898 4h-7.127a12.5 12.5 0 0 0-.879-4.144l7.703-6.389A4.94 4.94 0 0 0 45 21c2.757 0 5-2.243 5-5s-2.243-5-5-5-5 2.243-5 5c0 1.224.459 2.331 1.191 3.201l-7.019 5.823C31.977 21.42 28.021 19 23.5 19 16.607 19 11 24.607 11 31.5S16.607 44 23.5 44c4.243 0 7.993-2.129 10.254-5.371l7.437 6.17C40.459 45.669 40 46.776 40 48c0 2.757 2.243 5 5 5s5-2.243 5-5-2.243-5-5-5a4.94 4.94 0 0 0-2.201.533l-8.029-6.66c.574-1.2.966-2.5 1.131-3.873"/></g></svg></g><g id="text_28"><text x="340" y="557.1500000000001" text-anchor="middle" fill="#111827" font-size="9"><tspan x="340" dy="0">ALB</tspan></text></g></g><g id="vstack_15"><g id="cms-app"><rect x="388" y="437.4" width="96" height="92.6" fill="white" stroke="#ed7100" stroke-width="1" stroke-dasharray="6 4"/><g id="vstack_16"><g id="box_15"><rect x="388" y="437.4" width="80.2734375" height="26" fill="#ed7100" stroke="#ed7100" stroke-width="0"/><g id="hstack_18"><g id="icon_9"><svg x="394" y="443.4" width="14" height="14" viewBox="0 0 40 40"><title>Icon-Architecture-Group/32/Auto-Scaling-group_32</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h40v40H0z"/><path fill="#fff" d="M18.021 19.495a.5.5 0 0 0-.188-.39l-2.954-2.954-.707.707 2.138 2.137H7v1h9.314l-2.142 2.142.707.707 2.969-2.969a.5.5 0 0 0 .173-.38m15.965-.5h-9.311l2.138-2.137-.707-.707-2.969 2.97a.5.5 0 0 0 .016.77l2.953 2.953.707-.707-2.142-2.142h9.315zm-12.99 12.33V22.01h-1v9.31l-2.138-2.137-.707.707 2.969 2.967a.5.5 0 0 0 .773-.016l2.951-2.95-.707-.708zM17.858 9.836l-.707-.707 2.952-2.95c.182-.233.58-.24.774-.018l2.967 2.968-.707.707-2.141-2.14v9.313h-1V7.7z"/></g></svg></g><g id="text_29"><text x="437.13671875" y="453.9" text-anchor="middle" fill="white" font-size="10" font-weight="bold"><tspan x="437.13671875" dy="0">CMS App</tspan></text></g></g></g><g id="hstack_19"><g id="cms-app-ecs"><g id="cms-app-ecs-icon"><svg x="396" y="471.4" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-Elastic-Container-Service_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="m50 36.382-6-3V25a1 1 0 0 0-.515-.874L35 19.412V12.75l15 8.822zm1.507-16.244-17-10a1.001 1.001 0 0 0-1.507.863v9c0 .362.197.697.515.873L42 25.588V34c0 .38.214.725.553.895l8 4a1 1 0 0 0 .972-.044c.295-.183.475-.504.475-.85V21c0-.355-.188-.683-.493-.863M32 51.828 15 41.439V21.554l14-8.75v6.642l-7.53 4.706A1 1 0 0 0 21 25v13a1 1 0 0 0 .485.857l10 6a1 1 0 0 0 .994.021l10.509-5.732 5.047 2.883zm18.496-10.696-7-4a1 1 0 0 0-.975-.01l-10.498 5.726L23 37.434v-11.88l7.53-4.706A1 1 0 0 0 31 20v-9a1 1 0 0 0-1.53-.847l-16 10A1 1 0 0 0 13 21v21c0 .348.182.671.479.854l18 11a1 1 0 0 0 1.042 0l18-11a1 1 0 0 0-.025-1.722"/></g></svg></g><g id="text_30"><text x="414" y="518.85" text-anchor="middle" fill="#111827" font-size="9"><tspan x="414" dy="0">ECS</tspan></text></g></g><g id="cms-app-fg"><g id="cms-app-fg-icon"><svg x="440" y="471.4" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_AWS-Fargate_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="M42.467 46.382v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm-4.983 9.764v-3.764l1.993-1v3.764zm-3.987-4.764 1.993 1v3.764l-1.993-1zm-4.984-.236v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm2.99-2.5 1.759.882-1.758.882L21.77 40zm8.971 5 1.758.882-1.758.882L30.742 45zm8.97-5L43.23 40l-1.759.882L39.712 40zm4.433-.012-3.987-2a.99.99 0 0 0-.891 0l-3.987 2a1 1 0 0 0-.551.894v3.882l-3.541-1.776a.99.99 0 0 0-.892 0l-3.54 1.776V40a1 1 0 0 0-.552-.894l-3.987-2a.99.99 0 0 0-.89 0l-3.988 2a1 1 0 0 0-.55.894v6c0 .379.212.725.55.895l3.987 2a1 1 0 0 0 .891 0l3.541-1.777V51c0 .379.214.725.552.895l3.986 2a1 1 0 0 0 .892 0l3.986-2c.338-.17.552-.516.552-.895v-3.882l3.54 1.777a1 1 0 0 0 .892 0l3.987-2c.338-.17.55-.516.55-.895v-6a1 1 0 0 0-.55-.894M54 28.09c0 5.103-11.077 7.856-21.5 7.856S11 33.193 11 28.09c0-2.461 2.68-4.616 7.547-6.067l.568 1.917c-3.776 1.126-6.122 2.716-6.122 4.15 0 2.764 8.343 5.856 19.507 5.856s19.507-3.092 19.507-5.856c0-1.434-2.346-3.024-6.122-4.15l.568-1.917C51.32 23.474 54 25.629 54 28.09M32.5 12.064 40.547 15 32.5 17.936 24.453 15zm8.868 16.584c-1.556.7-4.155 1.516-7.871 1.645V19.701l8.97-3.273v10.485c0 .754-.431 1.435-1.1 1.735m-18.835-1.735V16.428l8.97 3.273v10.592c-3.716-.129-6.315-.945-7.87-1.645-.669-.3-1.1-.981-1.1-1.735m.283 3.56c1.87.842 5.07 1.846 9.684 1.846 4.615 0 7.813-1.004 9.684-1.846 1.383-.622 2.277-2.019 2.277-3.56V15a1 1 0 0 0-.656-.94l-10.964-4a1 1 0 0 0-.682 0l-10.964 4a1 1 0 0 0-.656.94v11.913c0 1.541.894 2.938 2.277 3.56"/></g></svg></g><g id="text_31"><text x="458" y="518.85" text-anchor="middle" fill="#111827" font-size="9"><tspan x="458" dy="0">Fargate</tspan></text></g></g></g></g></g><g id="cms-admin"><rect x="388" y="540" width="97.5146484375" height="92.6" fill="white" stroke="#ed7100" stroke-width="1" stroke-dasharray="6 4"/><g id="vstack_17"><g id="box_16"><rect x="388" y="540" width="97.5146484375" height="26" fill="#ed7100" stroke="#ed7100" stroke-width="0"/><g id="hstack_20"><g id="icon_10"><svg x="394" y="546" width="14" height="14" viewBox="0 0 40 40"><title>Icon-Architecture-Group/32/Auto-Scaling-group_32</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h40v40H0z"/><path fill="#fff" d="M18.021 19.495a.5.5 0 0 0-.188-.39l-2.954-2.954-.707.707 2.138 2.137H7v1h9.314l-2.142 2.142.707.707 2.969-2.969a.5.5 0 0 0 .173-.38m15.965-.5h-9.311l2.138-2.137-.707-.707-2.969 2.97a.5.5 0 0 0 .016.77l2.953 2.953.707-.707-2.142-2.142h9.315zm-12.99 12.33V22.01h-1v9.31l-2.138-2.137-.707.707 2.969 2.967a.5.5 0 0 0 .773-.016l2.951-2.95-.707-.708zM17.858 9.836l-.707-.707 2.952-2.95c.182-.233.58-.24.774-.018l2.967 2.968-.707.707-2.141-2.14v9.313h-1V7.7z"/></g></svg></g><g id="text_32"><text x="445.75732421875" y="556.5" text-anchor="middle" fill="white" font-size="10" font-weight="bold"><tspan x="445.75732421875" dy="0">Admin Panel</tspan></text></g></g></g><g id="hstack_21"><g id="cms-admin-ecs"><g id="cms-admin-ecs-icon"><svg x="396" y="574" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-Elastic-Container-Service_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="m50 36.382-6-3V25a1 1 0 0 0-.515-.874L35 19.412V12.75l15 8.822zm1.507-16.244-17-10a1.001 1.001 0 0 0-1.507.863v9c0 .362.197.697.515.873L42 25.588V34c0 .38.214.725.553.895l8 4a1 1 0 0 0 .972-.044c.295-.183.475-.504.475-.85V21c0-.355-.188-.683-.493-.863M32 51.828 15 41.439V21.554l14-8.75v6.642l-7.53 4.706A1 1 0 0 0 21 25v13a1 1 0 0 0 .485.857l10 6a1 1 0 0 0 .994.021l10.509-5.732 5.047 2.883zm18.496-10.696-7-4a1 1 0 0 0-.975-.01l-10.498 5.726L23 37.434v-11.88l7.53-4.706A1 1 0 0 0 31 20v-9a1 1 0 0 0-1.53-.847l-16 10A1 1 0 0 0 13 21v21c0 .348.182.671.479.854l18 11a1 1 0 0 0 1.042 0l18-11a1 1 0 0 0-.025-1.722"/></g></svg></g><g id="text_33"><text x="414" y="621.45" text-anchor="middle" fill="#111827" font-size="9"><tspan x="414" dy="0">ECS</tspan></text></g></g><g id="cms-admin-fg"><g id="cms-admin-fg-icon"><svg x="440" y="574" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_AWS-Fargate_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="M42.467 46.382v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm-4.983 9.764v-3.764l1.993-1v3.764zm-3.987-4.764 1.993 1v3.764l-1.993-1zm-4.984-.236v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm2.99-2.5 1.759.882-1.758.882L21.77 40zm8.971 5 1.758.882-1.758.882L30.742 45zm8.97-5L43.23 40l-1.759.882L39.712 40zm4.433-.012-3.987-2a.99.99 0 0 0-.891 0l-3.987 2a1 1 0 0 0-.551.894v3.882l-3.541-1.776a.99.99 0 0 0-.892 0l-3.54 1.776V40a1 1 0 0 0-.552-.894l-3.987-2a.99.99 0 0 0-.89 0l-3.988 2a1 1 0 0 0-.55.894v6c0 .379.212.725.55.895l3.987 2a1 1 0 0 0 .891 0l3.541-1.777V51c0 .379.214.725.552.895l3.986 2a1 1 0 0 0 .892 0l3.986-2c.338-.17.552-.516.552-.895v-3.882l3.54 1.777a1 1 0 0 0 .892 0l3.987-2c.338-.17.55-.516.55-.895v-6a1 1 0 0 0-.55-.894M54 28.09c0 5.103-11.077 7.856-21.5 7.856S11 33.193 11 28.09c0-2.461 2.68-4.616 7.547-6.067l.568 1.917c-3.776 1.126-6.122 2.716-6.122 4.15 0 2.764 8.343 5.856 19.507 5.856s19.507-3.092 19.507-5.856c0-1.434-2.346-3.024-6.122-4.15l.568-1.917C51.32 23.474 54 25.629 54 28.09M32.5 12.064 40.547 15 32.5 17.936 24.453 15zm8.868 16.584c-1.556.7-4.155 1.516-7.871 1.645V19.701l8.97-3.273v10.485c0 .754-.431 1.435-1.1 1.735m-18.835-1.735V16.428l8.97 3.273v10.592c-3.716-.129-6.315-.945-7.87-1.645-.669-.3-1.1-.981-1.1-1.735m.283 3.56c1.87.842 5.07 1.846 9.684 1.846 4.615 0 7.813-1.004 9.684-1.846 1.383-.622 2.277-2.019 2.277-3.56V15a1 1 0 0 0-.656-.94l-10.964-4a1 1 0 0 0-.682 0l-10.964 4a1 1 0 0 0-.656.94v11.913c0 1.541.894 2.938 2.277 3.56"/></g></svg></g><g id="text_34"><text x="458" y="621.45" text-anchor="middle" fill="#111827" font-size="9"><tspan x="458" dy="0">Fargate</tspan></text></g></g></g></g></g></g><g id="mgmt-batch"><g id="mgmt-batch-icon"><svg x="515.5146484375" y="509.7" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_AWS-Fargate_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="M42.467 46.382v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm-4.983 9.764v-3.764l1.993-1v3.764zm-3.987-4.764 1.993 1v3.764l-1.993-1zm-4.984-.236v-3.764l1.994-1v3.764zm-3.987-4.764 1.994 1v3.764l-1.994-1zm2.99-2.5 1.759.882-1.758.882L21.77 40zm8.971 5 1.758.882-1.758.882L30.742 45zm8.97-5L43.23 40l-1.759.882L39.712 40zm4.433-.012-3.987-2a.99.99 0 0 0-.891 0l-3.987 2a1 1 0 0 0-.551.894v3.882l-3.541-1.776a.99.99 0 0 0-.892 0l-3.54 1.776V40a1 1 0 0 0-.552-.894l-3.987-2a.99.99 0 0 0-.89 0l-3.988 2a1 1 0 0 0-.55.894v6c0 .379.212.725.55.895l3.987 2a1 1 0 0 0 .891 0l3.541-1.777V51c0 .379.214.725.552.895l3.986 2a1 1 0 0 0 .892 0l3.986-2c.338-.17.552-.516.552-.895v-3.882l3.54 1.777a1 1 0 0 0 .892 0l3.987-2c.338-.17.55-.516.55-.895v-6a1 1 0 0 0-.55-.894M54 28.09c0 5.103-11.077 7.856-21.5 7.856S11 33.193 11 28.09c0-2.461 2.68-4.616 7.547-6.067l.568 1.917c-3.776 1.126-6.122 2.716-6.122 4.15 0 2.764 8.343 5.856 19.507 5.856s19.507-3.092 19.507-5.856c0-1.434-2.346-3.024-6.122-4.15l.568-1.917C51.32 23.474 54 25.629 54 28.09M32.5 12.064 40.547 15 32.5 17.936 24.453 15zm8.868 16.584c-1.556.7-4.155 1.516-7.871 1.645V19.701l8.97-3.273v10.485c0 .754-.431 1.435-1.1 1.735m-18.835-1.735V16.428l8.97 3.273v10.592c-3.716-.129-6.315-.945-7.87-1.645-.669-.3-1.1-.981-1.1-1.735m.283 3.56c1.87.842 5.07 1.846 9.684 1.846 4.615 0 7.813-1.004 9.684-1.846 1.383-.622 2.277-2.019 2.277-3.56V15a1 1 0 0 0-.656-.94l-10.964-4a1 1 0 0 0-.682 0l-10.964 4a1 1 0 0 0-.656.94v11.913c0 1.541.894 2.938 2.277 3.56"/></g></svg></g><g id="text_35"><text x="533.5146484375" y="557.1500000000001" text-anchor="middle" fill="#111827" font-size="9"><tspan x="533.5146484375" dy="0">Batch</tspan></text></g></g></g></g></g><g id="box_17"><rect x="581.5146484375" y="389.4" width="76.881494140625" height="131.2" fill="none" stroke="none" stroke-width="1"/><g id="evt-row"><g id="eb"><g id="eb-icon"><svg x="756.1077880859375" y="399.4" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-EventBridge_48</title><g fill="none" fill-rule="evenodd"><path fill="#e7157b" d="M0 0h64v64H0z"/><path fill="#fff" d="M43.262 52c-1.566 0-2.84-1.264-2.84-2.818s1.274-2.818 2.84-2.818 2.839 1.264 2.839 2.818S44.827 52 43.26 52m-6.718-13H28.4l-4.072-7 4.072-7h8.144l4.072 7zM22.746 17.636c-1.566 0-2.84-1.264-2.84-2.818S21.18 12 22.746 12s2.84 1.264 2.84 2.818-1.275 2.818-2.84 2.818m20.516 26.728c-.542 0-1.055.109-1.543.272l-3.103-5.198 4.036-6.938c.18-.31.18-.69 0-1l-4.654-8c-.18-.31-.512-.5-.873-.5h-8.324l-2.777-4.651c.963-.881 1.576-2.132 1.576-3.531 0-2.656-2.177-4.818-4.854-4.818s-4.855 2.162-4.855 4.818c0 2.657 2.177 4.818 4.855 4.818.542 0 1.055-.109 1.542-.272l2.566 4.295-4.561 7.841c-.18.31-.18.69 0 1l4.653 8c.18.31.512.5.873.5h9.306c.026 0 .05-.008.075-.01l2.783 4.661c-.962.881-1.575 2.132-1.575 3.531 0 2.656 2.177 4.818 4.854 4.818s4.854-2.162 4.854-4.818c0-2.657-2.177-4.818-4.854-4.818m4.672-18.728c-1.566 0-2.84-1.264-2.84-2.818S46.367 20 47.933 20c1.564 0 2.839 1.264 2.839 2.818s-1.275 2.818-2.84 2.818m3.045.903c1.094-.884 1.809-2.214 1.809-3.721 0-2.656-2.177-4.818-4.854-4.818a4.8 4.8 0 0 0-1.8.353l-2.73-3.921c-.189-.27-.499-.432-.83-.432h-9.067v2h8.54l2.41 3.466a4.78 4.78 0 0 0-1.379 3.352c0 2.657 2.178 4.818 4.856 4.818.434 0 .848-.075 1.25-.182L51.83 32l-3.85 6.616 1.746 1 4.139-7.116c.18-.31.18-.69 0-1zM17.71 43.636c-1.566 0-2.84-1.264-2.84-2.818S16.142 38 17.708 38c1.564 0 2.839 1.264 2.839 2.818s-1.275 2.818-2.84 2.818m2.913 1.011c1.17-.88 1.94-2.261 1.94-3.829 0-2.656-2.177-4.818-4.854-4.818-.7 0-1.364.155-1.965.421L13.17 32l4.472-7.689-1.745-1-4.763 8.189c-.18.31-.18.69 0 1l2.974 5.114c-.771.854-1.256 1.969-1.256 3.204 0 2.657 2.178 4.818 4.855 4.818.368 0 .723-.048 1.066-.125l2.821 4.057c.189.27.498.432.83.432h9.067v-2h-8.537z"/></g></svg></g><g id="text_36"><text x="774.1077880859375" y="446.84999999999997" text-anchor="middle" fill="#111827" font-size="9"><tspan x="774.1077880859375" dy="0">EventBridge</tspan></text></g></g><g id="evt-handler"><g id="evt-handler-icon"><svg x="756.1077880859375" y="460" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_AWS-Lambda_48</title><g fill="none" fill-rule="evenodd"><path fill="#ed7100" d="M0 0h64v64H0z"/><path fill="#fff" d="M22.68 52h-9.106l10.264-21.59 4.562 9.451zm2.047-24.333a.99.99 0 0 0-.896-.564h-.003a.99.99 0 0 0-.896.569L11.097 52.569c-.147.31-.126.674.057.965.181.29.5.466.842.466H23.31a1 1 0 0 0 .9-.572l6.194-13.144a1 1 0 0 0-.005-.864zM51.008 52h-9.022L26.955 19.578a1 1 0 0 0-.903-.578h-5.924l.007-7h11.68l14.96 32.42c.163.354.516.58.904.58h3.33zm.996-9h-3.69l-14.96-32.42a1 1 0 0 0-.903-.58H19.14a1 1 0 0 0-.996.999l-.008 9A.993.993 0 0 0 19.131 21h6.286l15.03 32.422a1 1 0 0 0 .903.578h10.654c.55 0 .996-.448.996-1v-9c0-.552-.445-1-.996-1"/></g></svg></g><g id="text_37"><text x="774.1077880859375" y="507.45" text-anchor="middle" fill="#111827" font-size="9"><tspan x="774.1077880859375" dy="0">Handler</tspan></text></g></g></g></g></g><g id="hstack_22"><g id="s3-logs"><g id="s3-logs-icon"><svg x="308" y="660.5999999999999" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-Simple-Storage-Service_48</title><g fill="none" fill-rule="evenodd"><path fill="#7aa116" d="M0 0h64v64H0z"/><path fill="#fff" d="m47.759 33.948.234-1.817c2.173 1.254 2.849 1.99 3.044 2.293-.324.061-1.205.085-3.278-.476M30.499 21c-10.374 0-17.117-2.512-17.5-4.304v-.185c.35-1.119 6.14-4.51 17.5-4.51 11.34 0 17.133 3.38 17.5 4.504v.111C47.725 18.446 40.962 21 30.5 21m15.319 12.362c-4.765-1.565-10.906-4.383-13.224-5.474a2.09 2.09 0 0 0-2.082-1.982A2.097 2.097 0 0 0 28.418 28c0 1.154.94 2.094 2.094 2.094.457 0 .877-.152 1.22-.4 2.4 1.128 8.887 4.104 13.826 5.686l-1.721 13.344C43.583 50.352 38.919 52 30.497 52c-8.425 0-13.092-1.648-13.342-3.249l-3.72-28.937C16.945 21.915 23.749 23 30.5 23c6.75 0 13.554-1.085 17.065-3.185zM50 16.5c0-3.069-8.34-6.5-19.5-6.5S11 13.431 11 16.5v.543l4.174 31.99C15.874 53.516 26.123 54 30.497 54c4.372 0 14.616-.484 15.32-4.993l1.684-13.06c1.277.332 2.31.51 3.115.508.99 0 1.657-.252 2.08-.758.35-.416.489-.94.389-1.476-.228-1.22-1.682-2.509-4.715-4.177l-.1-.055L50 17.044z"/></g></svg></g><g id="text_38"><text x="326" y="708.05" text-anchor="middle" fill="#111827" font-size="9"><tspan x="326" dy="0">Log S3</tspan></text></g></g></g></g><g id="vstack_18"><g id="dms"><g id="dms-icon"><svg x="846.82099609375" y="233.49999999999997" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_AWS-Database-Migration-Service_48</title><g fill="none" fill-rule="evenodd"><path fill="#c925d1" d="M0 0h64v64H0z"/><path fill="#fff" d="M34.995 53h1.996v-5h-1.996zm-7.987 0h1.996v-5h-1.996zm14.995-2H44v-4h-1.997zM20.02 51h1.997v-4h-1.997zm11.98-23c-6.197 0-10.002-1.967-10.002-3.376v-5.628C24.339 20.429 28.364 21 32 21s7.661-.571 10.003-2.004v5.628C42.003 26.033 38.197 28 32 28m0 8c-6.44 0-10.002-1.9-10.002-3.214v-5.072C24.09 29.125 27.676 30 32 30s7.909-.875 10.003-2.286v5.072C42.003 34.1 38.441 36 32 36m0 8c-6.177 0-10.002-1.557-10.002-3v-5.178C24.072 37.177 27.626 38 32 38c4.373 0 7.928-.823 10.003-2.178V41c0 1.443-3.825 3-10.003 3m0-31c6.527 0 10.004 1.742 10.004 3S38.526 19 32 19c-6.527 0-10.003-1.742-10.003-3S25.473 13 32 13m0-2C26.464 11 20 12.31 20 16v25c0 3.69 6.463 5 12 5 5.536 0 12-1.31 12-5V16c0-3.69-6.464-5-12-5"/></g></svg></g><g id="text_39"><text x="864.82099609375" y="280.95" text-anchor="middle" fill="#111827" font-size="9"><tspan x="864.82099609375" dy="0">DMS</tspan></text></g></g><g id="redshift"><g id="redshift-icon"><svg x="846.82099609375" y="568.3" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-Redshift_48</title><g fill="none" fill-rule="evenodd"><path fill="#8c4fff" d="M0 0h64v64H0z"/><path fill="#fff" d="M40.419 28.025c-.7 0-1.271-.569-1.271-1.269a1.271 1.271 0 0 1 2.542 0c0 .7-.571 1.269-1.271 1.269m-3.784 9.063c-.7 0-1.27-.569-1.27-1.268a1.27 1.27 0 0 1 2.54 0 1.27 1.27 0 0 1-1.27 1.268m-9.081-1.511c-.7 0-1.27-.568-1.27-1.268a1.27 1.27 0 0 1 2.54 0c0 .7-.57 1.268-1.27 1.268m-3.783 8.308a1.27 1.27 0 0 1-1.271-1.267 1.271 1.271 0 0 1 2.541 0 1.27 1.27 0 0 1-1.27 1.267m16.648-20.392a3.27 3.27 0 0 0-3.271 3.263c0 1.04.499 1.957 1.259 2.555l-1.301 3.293c-.155-.023-.31-.047-.471-.047a3.27 3.27 0 0 0-3.022 2.026l-2.826-.642a3.26 3.26 0 0 0-6.503.368c0 .79.293 1.504.762 2.07l-1.273 2.974h-.002a3.27 3.27 0 0 0-3.271 3.265 3.27 3.27 0 0 0 6.541 0c0-1.087-.54-2.045-1.36-2.638l1.075-2.516c.257.064.521.109.798.109 1.222 0 2.278-.68 2.839-1.674l3.076.698a3.27 3.27 0 0 0 3.166 2.487 3.27 3.27 0 0 0 3.27-3.264c0-.917-.383-1.744-.996-2.337l1.373-3.476c.046.002.09.014.137.014a3.27 3.27 0 0 0 3.271-3.265 3.27 3.27 0 0 0-3.271-3.263M32 52.004c-8.055 0-13-2.376-13-4.08V19.354c2.768 1.946 7.991 2.972 13 2.972s10.232-1.026 13-2.972v28.568c0 1.705-4.945 4.081-13 4.081m0-40.008c8.055 0 13 2.428 13 4.168s-4.945 4.167-13 4.167-13-2.427-13-4.167 4.945-4.168 13-4.168m15 4.168C47 12.16 39.272 10 32 10c-7.271 0-15 2.16-15 6.164l.002.02H17v31.74C17 51.87 24.729 54 32 54c7.272 0 15-2.13 15-6.077v-31.74h-.002z"/></g></svg></g><g id="text_40"><text x="864.82099609375" y="615.75" text-anchor="middle" fill="#111827" font-size="9"><tspan x="864.82099609375" dy="0">Redshift</tspan></text></g></g><g id="s3-data"><g id="s3-data-icon"><svg x="846.8209960937501" y="660.5999999999999" width="36" height="36" viewBox="0 0 64 64"><title>Icon-Architecture/48/Arch_Amazon-Simple-Storage-Service_48</title><g fill="none" fill-rule="evenodd"><path fill="#7aa116" d="M0 0h64v64H0z"/><path fill="#fff" d="m47.759 33.948.234-1.817c2.173 1.254 2.849 1.99 3.044 2.293-.324.061-1.205.085-3.278-.476M30.499 21c-10.374 0-17.117-2.512-17.5-4.304v-.185c.35-1.119 6.14-4.51 17.5-4.51 11.34 0 17.133 3.38 17.5 4.504v.111C47.725 18.446 40.962 21 30.5 21m15.319 12.362c-4.765-1.565-10.906-4.383-13.224-5.474a2.09 2.09 0 0 0-2.082-1.982A2.097 2.097 0 0 0 28.418 28c0 1.154.94 2.094 2.094 2.094.457 0 .877-.152 1.22-.4 2.4 1.128 8.887 4.104 13.826 5.686l-1.721 13.344C43.583 50.352 38.919 52 30.497 52c-8.425 0-13.092-1.648-13.342-3.249l-3.72-28.937C16.945 21.915 23.749 23 30.5 23c6.75 0 13.554-1.085 17.065-3.185zM50 16.5c0-3.069-8.34-6.5-19.5-6.5S11 13.431 11 16.5v.543l4.174 31.99C15.874 53.516 26.123 54 30.497 54c4.372 0 14.616-.484 15.32-4.993l1.684-13.06c1.277.332 2.31.51 3.115.508.99 0 1.657-.252 2.08-.758.35-.416.489-.94.389-1.476-.228-1.22-1.682-2.509-4.715-4.177l-.1-.055L50 17.044z"/></g></svg></g><g id="text_41"><text x="864.8209960937501" y="708.05" text-anchor="middle" fill="#111827" font-size="9"><tspan x="864.8209960937501" dy="0">Data S3</tspan></text></g></g></g></g></g></g></g></g></g></g>
7
+ <g id="connector_1"><path d="M 120.663818359375 251.5 L 151.3319091796875 251.5 L 151.3319091796875 251.5 L 182 251.5" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
8
+ <g id="connector_2"><path d="M 218 251.5 L 225 251.5 L 225 251.5 L 232 251.5" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
9
+ <g id="connector_3"><path d="M 268 251.5 L 295 251.5 L 295 251.5 L 322 251.5" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
10
+ <g id="connector_4"><path d="M 358 251.5 L 373 251.5 L 373 251.5 L 388 251.5" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
11
+ <g id="connector_5"><path d="M 484 251.5 L 506 251.5 L 506 251.5 L 528 251.5" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
12
+ <g id="connector_6"><path d="M 564 245.5 L 578 245.5 A 6 6 0 0 0 584 239.5 L 584 208.5 A 6 6 0 0 1 590 202.5 L 604 202.5" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
13
+ <g id="connector_7"><path d="M 564 257.5 L 578 257.5 A 6 6 0 0 1 584 263.5 L 584 309.09999999999997 A 6 6 0 0 0 590 315.09999999999997 L 604 315.09999999999997" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
14
+ <g id="connector_8"><path d="M 706.68701171875 187.06666666666666 L 728.3140665690104 187.06666666666666 A 3.083333333333343 3.083333333333343 0 0 0 731.3973999023438 183.98333333333332 L 731.3973999023438 183.98333333333332 A 3.083333333333343 3.083333333333343 0 0 1 734.4807332356771 180.89999999999998 L 756.1077880859375 180.89999999999998" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
15
+ <g id="connector_9"><path d="M 706.68701171875 217.9333333333333 L 725.3973999023438 217.9333333333333 A 6 6 0 0 1 731.3973999023438 223.9333333333333 L 731.3973999023438 239.49999999999997 A 6 6 0 0 0 737.3973999023438 245.49999999999997 L 756.1077880859375 245.49999999999997" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
16
+ <g id="connector_10"><path d="M 705.75244140625 291.94999999999993 L 724.9301147460938 291.94999999999993 A 6 6 0 0 0 730.9301147460938 285.94999999999993 L 730.9301147460938 263.5 A 6 6 0 0 1 736.9301147460938 257.5 L 756.1077880859375 257.5" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
17
+ <g id="connector_11"><path d="M 705.75244140625 315.09999999999997 L 727.4301147460938 315.09999999999997 A 3.5 3.5 0 0 1 730.9301147460938 318.59999999999997 L 730.9301147460938 318.59999999999997 A 3.5 3.5 0 0 0 734.4301147460938 322.09999999999997 L 756.1077880859375 322.09999999999997" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
18
+ <g id="connector_12"><path d="M 705.75244140625 338.24999999999994 L 724.9301147460938 338.24999999999994 A 6 6 0 0 1 730.9301147460938 344.24999999999994 L 730.9301147460938 411.4 A 6 6 0 0 0 736.9301147460938 417.4 L 756.1077880859375 417.4" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
19
+ <g id="connector_13"><path d="M 774.1077880859375 435.4 L 774.1077880859375 447.7 L 774.1077880859375 447.7 L 774.1077880859375 460" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
20
+ <g id="connector_14"><path d="M 111.796142578125 527.7 L 146.8980712890625 527.7 L 146.8980712890625 527.7 L 182 527.7" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
21
+ <g id="connector_15"><path d="M 218 527.7 L 225 527.7 L 225 527.7 L 232 527.7" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
22
+ <g id="connector_16"><path d="M 268 527.7 L 295 527.7 L 295 527.7 L 322 527.7" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
23
+ <g id="connector_17"><path d="M 358 521.7 L 367 521.7 A 6 6 0 0 0 373 515.7 L 373 505.1333333333333 A 6 6 0 0 1 379 499.1333333333333 L 388 499.1333333333333" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
24
+ <g id="connector_18"><path d="M 358 533.7 L 367 533.7 A 6 6 0 0 1 373 539.7 L 373 580.3 A 6 6 0 0 0 379 586.3 L 388 586.3" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
25
+ <g id="connector_19"><path d="M 388 468.26666666666665 L 320.7833333333333 468.26666666666665 A 5.283333333333331 5.283333333333331 0 0 1 315.5 462.98333333333335 L 315.5 462.98333333333335 A 5.283333333333331 5.283333333333331 0 0 0 310.2166666666667 457.7 L 243 457.7" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
26
+ <g id="connector_20"><path d="M 200 269.5 L 200 348.6 A 6 6 0 0 0 206 354.6 L 219 354.6 A 6 6 0 0 1 225 360.6 L 225 439.7" fill="none" stroke="#6b7280" stroke-width="1.5" stroke-dasharray="6 4" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
27
+ <g id="connector_21"><path d="M 792.1077880859375 251.49999999999997 L 819.4643920898437 251.49999999999997 L 819.4643920898437 251.49999999999997 L 846.82099609375 251.49999999999997" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
28
+ <g id="connector_22"><path d="M 864.82099609375 269.5 L 864.82099609375 418.9 L 864.82099609375 418.9 L 864.82099609375 568.3" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
29
+ <g id="connector_23"><path d="M 774.1077880859375 496 L 774.1077880859375 577.3 L 774.1077880859375 577.3 L 846.82099609375 577.3" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
30
+ <g id="connector_24"><path d="M 864.82099609375 604.3 L 864.82099609375 632.4499999999999 L 864.8209960937501 632.4499999999999 L 864.8209960937501 660.5999999999999" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
31
+ <g id="connector_25"><path d="M 485.5146484375 586.3 L 661.667822265625 586.3 A 4.5 4.5 0 0 1 666.167822265625 590.8 L 666.167822265625 590.8 A 4.5 4.5 0 0 0 670.667822265625 595.3 L 846.82099609375 595.3" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
32
+ <g id="connector_26"><path d="M 551.5146484375 527.7 L 693.167822265625 527.7 A 6 6 0 0 1 699.167822265625 533.7 L 699.167822265625 580.3 A 6 6 0 0 0 705.167822265625 586.3 L 846.82099609375 586.3" fill="none" stroke="#6b7280" stroke-width="1.5" marker-end="url(#marker-arrow-6b7280-s0.7)"/></g>
33
+ </svg>
@@ -0,0 +1,125 @@
1
+ import {
2
+ AwsServiceSm, AwsService, AwsVpc, AwsAutoScaling,
3
+ EcsFargateCluster, AwsAccount, AwsRegion
4
+ } from "./components/aws.draw.tsx";
5
+
6
+ // --- Edge Services (single box, CF/WAF outside VPCs) ---
7
+
8
+ export function EdgeServices() {
9
+ return (
10
+ <Box id="edge-col" shape="rect" fill="#f9f5ff" stroke="#c084fc" strokeWidth={1} strokeStyle="dashed" padding={10} height="fill">
11
+ <VStack gap={60} align="center">
12
+ <AwsServiceSm id="r53" service="route53" label="Route 53" />
13
+ <Spacer />
14
+ <HStack id="edge-row1" gap={14} align="start" geometry={{ align: "cf" }}>
15
+ <AwsServiceSm id="cf" service="cloudfront" label="CF" />
16
+ <AwsServiceSm id="waf" service="waf" label="WAF" />
17
+ </HStack>
18
+ <AwsServiceSm id="s3-static" service="s3" label="Static S3" />
19
+ <HStack id="edge-row2" gap={14} align="start" geometry={{ align: "mcf" }}>
20
+ <AwsServiceSm id="mcf" service="cloudfront" label="CF" />
21
+ <AwsServiceSm id="mwaf" service="waf" label="WAF" />
22
+ </HStack>
23
+ <Spacer />
24
+ </VStack>
25
+ </Box>
26
+ );
27
+ }
28
+
29
+ // --- Platform VPC ---
30
+
31
+ export function PlatformVpc() {
32
+ return (
33
+ <AwsVpc label="Platform VPC">
34
+ <HStack padding={14} gap={40} align="center">
35
+ <AwsServiceSm id="plat-alb" service="elasticloadbalancing" label="ALB" />
36
+ <VStack gap={20}>
37
+ <EcsFargateCluster id="api-a" label="API Service A" />
38
+ <EcsFargateCluster id="api-b" label="API Service B" />
39
+ </VStack>
40
+ <VStack gap={20} align="center">
41
+ <AwsServiceSm id="cache" service="elasticache" label="ElastiCache" />
42
+ <AwsServiceSm id="aurora" service="aurora" label="Aurora" />
43
+ <AwsServiceSm id="dynamo" service="dynamodb" label="DynamoDB" />
44
+ </VStack>
45
+ </HStack>
46
+ </AwsVpc>
47
+ );
48
+ }
49
+
50
+ // --- Management VPC ---
51
+
52
+ export function ManagementVpc() {
53
+ return (
54
+ <AwsVpc label="Management VPC">
55
+ <HStack padding={14} gap={30} align="center">
56
+ <AwsServiceSm id="mgmt-alb" service="elasticloadbalancing" label="ALB" />
57
+ <VStack gap={10}>
58
+ <EcsFargateCluster id="cms-app" label="CMS App" />
59
+ <EcsFargateCluster id="cms-admin" label="Admin Panel" />
60
+ </VStack>
61
+ <AwsServiceSm id="mgmt-batch" service="fargate" label="Batch" />
62
+ </HStack>
63
+ </AwsVpc>
64
+ );
65
+ }
66
+
67
+ // --- Analytics (outside VPCs) ---
68
+
69
+ export function AnalyticsServices() {
70
+ return (
71
+ <VStack gap={10} align="center" height="fill">
72
+ <AwsServiceSm id="dms" service="dms" label="DMS" />
73
+ <Spacer />
74
+ <AwsServiceSm id="redshift" service="redshift" label="Redshift" />
75
+ <Spacer />
76
+ <AwsServiceSm id="s3-data" service="s3" label="Data S3" />
77
+ </VStack>
78
+ );
79
+ }
80
+
81
+ // --- BFF VPC ---
82
+
83
+ export function BffVpc() {
84
+ return (
85
+ <AwsVpc label="BFF VPC">
86
+ <HStack id="bff-vpc" padding={14} gap={30} align="center" geometry={{ align: "bff-alb" }}>
87
+ <AwsServiceSm id="bff-alb" service="elasticloadbalancing" label="ALB" />
88
+ <EcsFargateCluster id="bff" label="BFF App" />
89
+ </HStack>
90
+ </AwsVpc>
91
+ );
92
+ }
93
+
94
+ // --- Event Processing (serverless, outside VPCs) ---
95
+
96
+ export function EventProcessing() {
97
+ return (
98
+ <Box shape="rect" fill="none" stroke="none" padding={10}>
99
+ <VStack id="evt-row" gap={10} align="center">
100
+ <AwsServiceSm id="eb" service="eventbridge" label="EventBridge" />
101
+ <AwsServiceSm id="evt-handler" service="lambda" label="Handler" />
102
+ </VStack>
103
+ </Box>
104
+ );
105
+ }
106
+
107
+ // --- Shared Services ---
108
+
109
+ export function SharedServices() {
110
+ return (
111
+ <HStack gap={18} align="start">
112
+ <AwsServiceSm id="s3-logs" service="s3" label="Log S3" />
113
+ </HStack>
114
+ );
115
+ }
116
+
117
+ // --- External Actors ---
118
+
119
+ export function ExternalActor({ id, label }: { id: string; label: string }) {
120
+ return (
121
+ <Box id={id} shape="rect" fill="#f3f4f6" stroke="#9ca3af" padding={12}>
122
+ <Text fontSize={10} fontWeight="bold">{label}</Text>
123
+ </Box>
124
+ );
125
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "diagram-contracts",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "description": "Rule Catalog driven layout runtime — compile diagrams to deterministic SVG from Draw TSX, Draw Text, or Layout IR",
6
6
  "keywords": [
@@ -37,6 +37,7 @@
37
37
  "files": [
38
38
  "dist",
39
39
  "tokens",
40
+ "assets/readme",
40
41
  "LICENSE",
41
42
  "README.md"
42
43
  ],