Files
the-biergarten-app/docs/website/diagrams-out/deployment.svg
Aaron Po c825d99b0a Refactor comments and update documentation for backend and pipeline (#246)
* Remove restating comments in backend

* Remove restating comments in frontend stories

* Remove restating comments in pipeline

* Remove restating comments in pipeline scripts

* Restore location-clear comment in BreweryRepository

* Remove stale/restating comments found in second pass

* Restore mock curated-data branch comment in main.cc

* Remove more restating/filler comments in backend

* Document account-management endpoints, compose files, and env generator

* Squashed commit of the following:

commit a8a5b8abd9969859c695092fae6990d03b2135ed
Author: Aaron Po <aaron.po97@gmail.com>
Date:   Sun Aug 23 23:53:56 2026 -0400

    Add reverse geocoding for brewery street addresses (#245)

    * Add geocoding to seed application, remove postal codes from generator

    Update comments

* Update pipeline class diagram for OpenAI generator

* Update pipeline activity diagram for brewery coordinates and OpenAI backend

* Add mailpit, production, db-only, and minimal environments to deployment diagram

* Fix authentication flow diagram for Identity migration

* Add account-management flows to authentication diagram

* Fix database schema diagram note referencing removed AuthRepository
2026-08-24 01:09:48 -04:00

1 line
107 KiB
XML

<?plantuml 1.2026.2?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="DESCRIPTION" height="1357px" preserveAspectRatio="none" style="width:6884px;height:1357px;background:#FFFFFF;" version="1.1" viewBox="0 0 6884 1357" width="6884px" zoomAndPan="magnify"><title>Docker Deployment Architecture</title><defs/><g><g class="title" data-source-line="6"><text fill="#000000" font-family="Arial" font-size="22" font-weight="bold" lengthAdjust="spacing" textLength="357.5011" x="3258.7495" y="38.5181">Docker Deployment Architecture</text></g><!--cluster Development Environment\n(docker-compose.dev.yaml)--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml." data-source-line="12" id="ent0004"><path d="M13.5,384.3761 L206.0788,384.3761 A3.75,3.75 0 0 1 208.5788,386.8761 L215.5788,428.5119 L1922.5,428.5119 A2.5,2.5 0 0 1 1925,431.0119 L1925,1347.8161 A2.5,2.5 0 0 1 1922.5,1350.3161 L13.5,1350.3161 A2.5,2.5 0 0 1 11,1347.8161 L11,386.8761 A2.5,2.5 0 0 1 13.5,384.3761" fill="#E3F2FD" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="11" x2="215.5788" y1="428.5119" y2="428.5119"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="186.5283" x="17.5253" y="401.342">Development Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="191.5788" x="15" y="420.4099">(docker-compose.dev.yaml)</text></g><!--cluster DevDB--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB" data-source-line="14" id="ent0005"><polygon fill="#FFFFFF" points="935,955.9661,945,945.9661,1329,945.9661,1329,1308.3161,1319,1318.3161,935,1318.3161,935,955.9661" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1319" x2="1329" y1="955.9661" y2="945.9661"/><line style="stroke:#000000;stroke-width:1;" x1="935" x2="1319" y1="955.9661" y2="955.9661"/><line style="stroke:#000000;stroke-width:1;" x1="1319" x2="1319" y1="955.9661" y2="1318.3161"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="75.6872" x="1090.1564" y="973.932">SQL Server</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="318.5269" x="968.7366" y="992.9999">(mcr.microsoft.com/mssql/server:2022-latest)</text></g><!--cluster DevDBInner--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB.DevDBInner" data-source-line="15" id="ent0006"><path d="M973,1092.9361 C973,1082.9361 1019.5,1082.9361 1019.5,1082.9361 C1019.5,1082.9361 1066,1082.9361 1066,1092.9361 L1066,1284.3161 C1066,1294.3161 1019.5,1294.3161 1019.5,1294.3161 C1019.5,1294.3161 973,1294.3161 973,1284.3161 L973,1092.9361" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M973,1092.9361 C973,1102.9361 1019.5,1102.9361 1019.5,1102.9361 C1019.5,1102.9361 1066,1102.9361 1066,1092.9361" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="74.6127" x="982.1936" y="1119.902">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="65.5478" x="986.7261" y="1138.9699">Database</text></g><!--cluster DevAPI--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI" data-source-line="29" id="ent0011"><polygon fill="#FFFFFF" points="600,485.3761,610,475.3761,1337,475.3761,1337,903.9661,1327,913.9661,600,913.9661,600,485.3761" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1327" x2="1337" y1="485.3761" y2="475.3761"/><line style="stroke:#000000;stroke-width:1;" x1="600" x2="1327" y1="485.3761" y2="485.3761"/><line style="stroke:#000000;stroke-width:1;" x1="1327" x2="1327" y1="485.3761" y2="913.9661"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="95.8717" x="916.5642" y="503.342">API Container</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="69.6848" x="929.6576" y="522.4099">(API.Core)</text></g><!--cluster DevMig--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMig" data-source-line="48" id="ent0018"><polygon fill="#FFFFFF" points="1369,711.8961,1379,701.8961,1613,701.8961,1613,1137.3461,1603,1147.3461,1369,1147.3461,1369,711.8961" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1603" x2="1613" y1="711.8961" y2="701.8961"/><line style="stroke:#000000;stroke-width:1;" x1="1369" x2="1603" y1="711.8961" y2="711.8961"/><line style="stroke:#000000;stroke-width:1;" x1="1603" x2="1603" y1="711.8961" y2="1147.3461"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="75.4247" x="1449.2876" y="729.862">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="72.1067" x="1450.9466" y="748.9299">(run-once)</text></g><!--cluster DevSeed--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevSeed" data-source-line="58" id="ent0023"><polygon fill="#FFFFFF" points="1653,711.8961,1663,701.8961,1893,701.8961,1893,1146.1961,1883,1156.1961,1653,1156.1961,1653,711.8961" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1883" x2="1893" y1="711.8961" y2="701.8961"/><line style="stroke:#000000;stroke-width:1;" x1="1653" x2="1883" y1="711.8961" y2="711.8961"/><line style="stroke:#000000;stroke-width:1;" x1="1883" x2="1883" y1="711.8961" y2="1156.1961"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="33.8379" x="1752.0811" y="729.862">Seed</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="72.1067" x="1732.9466" y="748.9299">(run-once)</text></g><!--cluster DevMailpit--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMailpit" data-source-line="69" id="ent0028"><polygon fill="#FFFFFF" points="35,806.4361,45,796.4361,576,796.4361,576,1137.3461,566,1147.3461,35,1147.3461,35,806.4361" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="566" x2="576" y1="806.4361" y2="796.4361"/><line style="stroke:#000000;stroke-width:1;" x1="35" x2="566" y1="806.4361" y2="806.4361"/><line style="stroke:#000000;stroke-width:1;" x1="566" x2="566" y1="806.4361" y2="1147.3461"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="48.1143" x="277.4428" y="824.402">Mailpit</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="110.5751" x="246.2124" y="843.4699">(axllent/mailpit)</text></g><!--cluster Test Environment\n(docker-compose.test.yaml)--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml." data-source-line="82" id="ent0034"><path d="M2294.5,62.5661 L2488.6083,62.5661 A3.75,3.75 0 0 1 2491.1083,65.0661 L2498.1083,106.7019 L3789.5,106.7019 A2.5,2.5 0 0 1 3792,109.2019 L3792,1180.4361 A2.5,2.5 0 0 1 3789.5,1182.9361 L2294.5,1182.9361 A2.5,2.5 0 0 1 2292,1180.4361 L2292,65.0661 A2.5,2.5 0 0 1 2294.5,62.5661" fill="#FFF3E0" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2292" x2="2498.1083" y1="106.7019" y2="106.7019"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="122.398" x="2331.3551" y="79.532">Test Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="193.1083" x="2296" y="98.5999">(docker-compose.test.yaml)</text></g><!--cluster TestDB--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB" data-source-line="84" id="ent0035"><polygon fill="#FFFFFF" points="2931,678.3161,2941,668.3161,3319,668.3161,3319,1140.9361,3309,1150.9361,2931,1150.9361,2931,678.3161" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="3309" x2="3319" y1="678.3161" y2="668.3161"/><line style="stroke:#000000;stroke-width:1;" x1="2931" x2="3309" y1="678.3161" y2="678.3161"/><line style="stroke:#000000;stroke-width:1;" x1="3309" x2="3309" y1="678.3161" y2="1150.9361"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="75.6872" x="3083.1564" y="696.282">SQL Server</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="126.8745" x="3057.5627" y="715.3499">(isolated instance)</text></g><!--cluster TestDBInner--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB.TestDBInner" data-source-line="85" id="ent0036"><path d="M2955,806.4361 C2955,796.4361 3010.5,796.4361 3010.5,796.4361 C3010.5,796.4361 3066,796.4361 3066,806.4361 L3066,1116.9361 C3066,1126.9361 3010.5,1126.9361 3010.5,1126.9361 C3010.5,1126.9361 2955,1126.9361 2955,1116.9361 L2955,806.4361" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2955,806.4361 C2955,816.4361 3010.5,816.4361 3010.5,816.4361 C3010.5,816.4361 3066,816.4361 3066,806.4361" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="74.6127" x="2973.1936" y="833.402">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="98.3777" x="2961.3112" y="852.4699">Test Database</text></g><!--cluster TestMig--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestMig" data-source-line="98" id="ent0041"><polygon fill="#FFFFFF" points="2569,390.8361,2579,380.8361,2813,380.8361,2813,513.9061,2803,523.9061,2569,523.9061,2569,390.8361" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2803" x2="2813" y1="390.8361" y2="380.8361"/><line style="stroke:#000000;stroke-width:1;" x1="2569" x2="2803" y1="390.8361" y2="390.8361"/><line style="stroke:#000000;stroke-width:1;" x1="2803" x2="2803" y1="390.8361" y2="523.9061"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="75.4247" x="2649.2876" y="408.802">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="35.7349" x="2669.1326" y="427.8699">(test)</text></g><!--cluster TestSeed--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestSeed" data-source-line="102" id="ent0043"><polygon fill="#FFFFFF" points="2324,145.5661,2334,135.5661,2529,135.5661,2529,520.9261,2519,530.9261,2324,530.9261,2324,145.5661" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2519" x2="2529" y1="145.5661" y2="135.5661"/><line style="stroke:#000000;stroke-width:1;" x1="2324" x2="2519" y1="145.5661" y2="145.5661"/><line style="stroke:#000000;stroke-width:1;" x1="2519" x2="2519" y1="145.5661" y2="530.9261"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="33.8379" x="2405.5811" y="163.532">Seed</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="35.7349" x="2404.6326" y="182.5999">(test)</text></g><!--cluster Specs--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..Specs" data-source-line="111" id="ent0048"><polygon fill="#FFFFFF" points="3359,339.5461,3369,329.5461,3760,329.5461,3760,565.1961,3750,575.1961,3359,575.1961,3359,339.5461" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="3750" x2="3760" y1="339.5461" y2="329.5461"/><line style="stroke:#000000;stroke-width:1;" x1="3359" x2="3750" y1="339.5461" y2="339.5461"/><line style="stroke:#000000;stroke-width:1;" x1="3750" x2="3750" y1="339.5461" y2="575.1961"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="67.4693" x="3521.7654" y="357.512">API.Specs</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="128.4426" x="3491.2787" y="376.5799">(Integration Tests)</text></g><!--cluster UnitTests--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..UnitTests" data-source-line="125" id="ent0053"><polygon fill="#FFFFFF" points="2866,304.1361,2876,294.1361,3319,294.1361,3319,600.6061,3309,610.6061,2866,610.6061,2866,304.1361" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="3309" x2="3319" y1="304.1361" y2="294.1361"/><line style="stroke:#000000;stroke-width:1;" x1="2866" x2="3309" y1="304.1361" y2="304.1361"/><line style="stroke:#000000;stroke-width:1;" x1="3309" x2="3309" y1="304.1361" y2="610.6061"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="65.5128" x="3055.7436" y="322.102">unit.tests</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="227.1737" x="2974.9132" y="341.1699">(Features.*.Tests, one container)</text></g><!--cluster Production Environment\n(docker-compose.prod.yaml)--><g class="cluster" data-qualified-name="Production Environment.n.docker-compose.prod.yaml." data-source-line="145" id="ent0058"><path d="M4844.5,139.1061 L5045.3703,139.1061 A3.75,3.75 0 0 1 5047.8703,141.6061 L5054.8703,183.2419 L5977.5,183.2419 A2.5,2.5 0 0 1 5980,185.7419 L5980,1136.8461 A2.5,2.5 0 0 1 5977.5,1139.3461 L4844.5,1139.3461 A2.5,2.5 0 0 1 4842,1136.8461 L4842,141.6061 A2.5,2.5 0 0 1 4844.5,139.1061" fill="#FCE4EC" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="4842" x2="5054.8703" y1="183.2419" y2="183.2419"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="170.0749" x="4860.8977" y="156.072">Production Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="199.8703" x="4846" y="175.1399">(docker-compose.prod.yaml)</text></g><!--cluster ProdDB--><g class="cluster" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdDB" data-source-line="147" id="ent0059"><polygon fill="#FFFFFF" points="5188,660.6061,5198,650.6061,5582,650.6061,5582,886.2561,5572,896.2561,5188,896.2561,5188,660.6061" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="5572" x2="5582" y1="660.6061" y2="650.6061"/><line style="stroke:#000000;stroke-width:1;" x1="5188" x2="5572" y1="660.6061" y2="660.6061"/><line style="stroke:#000000;stroke-width:1;" x1="5572" x2="5572" y1="660.6061" y2="896.2561"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="75.6872" x="5343.1564" y="678.572">SQL Server</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="318.5269" x="5221.7366" y="697.6399">(mcr.microsoft.com/mssql/server:2022-latest)</text></g><!--cluster ProdMig--><g class="cluster" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdMig" data-source-line="161" id="ent0064"><polygon fill="#FFFFFF" points="4874,390.8361,4884,380.8361,5148,380.8361,5148,833.1361,5138,843.1361,4874,843.1361,4874,390.8361" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="5138" x2="5148" y1="390.8361" y2="380.8361"/><line style="stroke:#000000;stroke-width:1;" x1="4874" x2="5138" y1="390.8361" y2="390.8361"/><line style="stroke:#000000;stroke-width:1;" x1="5138" x2="5138" y1="390.8361" y2="843.1361"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="75.4247" x="4969.2876" y="408.802">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="72.1067" x="4970.9466" y="427.8699">(run-once)</text></g><!--cluster ProdAPI--><g class="cluster" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdAPI" data-source-line="169" id="ent0069"><polygon fill="#FFFFFF" points="5312.67,240.1061,5322.67,230.1061,5956,230.1061,5956,565.1961,5946,575.1961,5312.67,575.1961,5312.67,240.1061" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="5946" x2="5956" y1="240.1061" y2="230.1061"/><line style="stroke:#000000;stroke-width:1;" x1="5312.67" x2="5946" y1="240.1061" y2="240.1061"/><line style="stroke:#000000;stroke-width:1;" x1="5946" x2="5946" y1="240.1061" y2="575.1961"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="95.8717" x="5582.3992" y="258.072">API Container</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="69.6848" x="5595.4926" y="277.1399">(API.Core)</text></g><!--cluster Database-only Environment\n(docker-compose.db.yaml)--><g class="cluster" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml." data-source-line="198" id="ent0085"><path d="M6006.5,139.0361 L6200.8253,139.0361 A3.75,3.75 0 0 1 6203.3253,141.5361 L6210.3253,183.1719 L6338.5,183.1719 A2.5,2.5 0 0 1 6341,185.6719 L6341,859.1961 A2.5,2.5 0 0 1 6338.5,861.6961 L6006.5,861.6961 A2.5,2.5 0 0 1 6004,859.1961 L6004,141.5361 A2.5,2.5 0 0 1 6006.5,139.0361" fill="#EDE7F6" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="6004" x2="6210.3253" y1="183.1719" y2="183.1719"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="193.3253" x="6008" y="156.002">Database-only Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="184.7433" x="6012.291" y="175.0699">(docker-compose.db.yaml)</text></g><!--cluster DbOnlyDB--><g class="cluster" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml..DbOnlyDB" data-source-line="200" id="ent0086"><polygon fill="#FFFFFF" points="6152,400.8061,6162,390.8061,6309,390.8061,6309,522.9361,6299,532.9361,6152,532.9361,6152,400.8061" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="6299" x2="6309" y1="400.8061" y2="390.8061"/><line style="stroke:#000000;stroke-width:1;" x1="6152" x2="6299" y1="400.8061" y2="400.8061"/><line style="stroke:#000000;stroke-width:1;" x1="6299" x2="6299" y1="400.8061" y2="532.9361"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="75.6872" x="6188.6564" y="418.772">SQL Server</text></g><!--cluster Minimal Environment\n(docker-compose.min.yaml)--><g class="cluster" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml." data-source-line="228" id="ent0099"><path d="M6367.5,139.0361 L6561.8148,139.0361 A3.75,3.75 0 0 1 6564.3148,141.5361 L6571.3148,183.1719 L6874.5,183.1719 A2.5,2.5 0 0 1 6877,185.6719 L6877,850.3461 A2.5,2.5 0 0 1 6874.5,852.8461 L6367.5,852.8461 A2.5,2.5 0 0 1 6365,850.3461 L6365,141.5361 A2.5,2.5 0 0 1 6367.5,139.0361" fill="#FFF9C4" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="6365" x2="6571.3148" y1="183.1719" y2="183.1719"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="149.4004" x="6390.9572" y="156.002">Minimal Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="193.3148" x="6369" y="175.0699">(docker-compose.min.yaml)</text></g><!--cluster MinDB--><g class="cluster" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinDB" data-source-line="230" id="ent0100"><polygon fill="#FFFFFF" points="6688,400.8061,6698,390.8061,6845,390.8061,6845,522.9361,6835,532.9361,6688,532.9361,6688,400.8061" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="6835" x2="6845" y1="400.8061" y2="390.8061"/><line style="stroke:#000000;stroke-width:1;" x1="6688" x2="6835" y1="400.8061" y2="400.8061"/><line style="stroke:#000000;stroke-width:1;" x1="6835" x2="6835" y1="400.8061" y2="532.9361"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="75.6872" x="6724.6564" y="418.772">SQL Server</text></g><!--cluster MinMailpit--><g class="cluster" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinMailpit" data-source-line="240" id="ent0103"><polygon fill="#FFFFFF" points="6434.75,240.1061,6444.75,230.1061,6552.75,230.1061,6552.75,494.8761,6542.75,504.8761,6434.75,504.8761,6434.75,240.1061" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="6542.75" x2="6552.75" y1="240.1061" y2="230.1061"/><line style="stroke:#000000;stroke-width:1;" x1="6434.75" x2="6542.75" y1="240.1061" y2="240.1061"/><line style="stroke:#000000;stroke-width:1;" x1="6542.75" x2="6542.75" y1="240.1061" y2="504.8761"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="48.1143" x="6465.6928" y="258.072">Mailpit</text></g><!--cluster Results--><g class="cluster" data-qualified-name="Results" data-source-line="261" id="ent0115"><path d="M4100.5,702.3661 L4229.358,702.3661 A3.75,3.75 0 0 1 4231.858,704.8661 L4238.858,746.5019 L4807.5,746.5019 A2.5,2.5 0 0 1 4810,749.0019 L4810,1153.6961 A2.5,2.5 0 0 1 4807.5,1156.1961 L4100.5,1156.1961 A2.5,2.5 0 0 1 4098,1153.6961 L4098,704.8661 A2.5,2.5 0 0 1 4100.5,702.3661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="4098" x2="4238.858" y1="746.5019" y2="746.5019"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="84.5212" x="4123.6684" y="719.332">test-results/</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="127.858" x="4102" y="738.3999">(mounted volume)</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB.GMN8" data-source-line="19" id="ent0009"><path d="M1103.38,1015.9661 L1103.38,1079.3161 L1054.38,1083.3161 L1103.38,1087.3161 L1103.38,1149.9082 A0,0 0 0 0 1103.38,1149.9082 L1272.6191,1149.9082 A0,0 0 0 0 1272.6191,1149.9082 L1272.6191,1025.9661 L1262.6191,1015.9661 L1103.38,1015.9661 A0,0 0 0 0 1103.38,1015.9661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1262.6191,1015.9661 L1262.6191,1025.9661 L1272.6191,1025.9661 L1262.6191,1015.9661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="82.1861" x="1109.38" y="1034.8631">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="107.0421" x="1109.38" y="1052.5691">- ACCEPT_EULA=Y</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="127.9721" x="1109.38" y="1070.2751">- SA_PASSWORD=***</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="148.2391" x="1109.38" y="1087.9811">- MSSQL_PID=Developer</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.38" x="1109.38" y="1105.6872">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="56.2511" x="1109.38" y="1123.3932">Volumes:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="129.9091" x="1109.38" y="1141.0992">- biergarten-dev-data</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB.DevDBInner.1433" data-source-line="16" id="ent0007"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="32.0319" x="1031.9841" y="1060.8341">1433</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="1042" y="1076.9361"/></g><!--entity API1--><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.API1" data-source-line="30" id="ent0012"><rect fill="#FFFFFF" height="49.0679" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="149.3536" x="1163.32" y="771.8961"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1292.6736" y="776.8961"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1290.6736" y="778.8961"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1290.6736" y="782.8961"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="109.3536" x="1178.32" y="806.862">ASP.NET Core 10</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.DevPort1" data-source-line="31" id="ent0013"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="114.2675" x="715.5362" y="453.2741">8080:8080 (HTTP)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="766.67" y="469.3761"/></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.DevPort2" data-source-line="32" id="ent0014"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="121.9535" x="839.5233" y="453.2741">8081:8081 (HTTPS)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="894.5" y="469.3761"/></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.GMN15" data-source-line="35" id="ent0016"><path d="M623.58,702.9061 L623.58,889.9662 A0,0 0 0 0 623.58,889.9662 L922.4292,889.9662 A0,0 0 0 0 922.4292,889.9662 L922.4292,712.9061 L912.4292,702.9061 L896.96,702.9061 L892.96,475.4261 L888.96,702.9061 L623.58,702.9061 A0,0 0 0 0 623.58,702.9061" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M912.4292,702.9061 L912.4292,712.9061 L922.4292,712.9061 L912.4292,702.9061" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="82.1861" x="629.58" y="721.8031">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="277.8492" x="629.58" y="739.5091">- ASPNETCORE_ENVIRONMENT=Development</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="144.2741" x="629.58" y="757.2151">- DB_SERVER=sql-server</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="141.1411" x="629.58" y="774.9211">- DB_NAME=Biergarten</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="138.3331" x="629.58" y="792.6272">- DB_USER/PASSWORD</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="81.3281" x="629.58" y="810.3332">- JWT_SECRET</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="146.2111" x="629.58" y="828.0392">- SMTP_* (10+ variables)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.38" x="629.58" y="845.7452">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="83.9671" x="629.58" y="863.4512">Health Check:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="102.2581" x="629.58" y="881.1572">/health endpoint</text></g><!--entity Mig1--><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMig.Mig1" data-source-line="49" id="ent0019"><rect fill="#FFFFFF" height="49.0679" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="176.8495" x="1412.58" y="771.8961"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1569.4295" y="776.8961"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1567.4295" y="778.8961"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1567.4295" y="782.8961"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="136.8495" x="1427.58" y="806.862">Database.Migrations</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMig.GMN20" data-source-line="51" id="ent0021"><path d="M1414.22,1042.5161 L1414.22,1123.3402 A0,0 0 0 0 1414.22,1123.3402 L1587.7751,1123.3402 A0,0 0 0 0 1587.7751,1123.3402 L1587.7751,1052.5161 L1577.7751,1042.5161 L1505,1042.5161 L1501,821.3561 L1497,1042.5161 L1414.22,1042.5161 A0,0 0 0 0 1414.22,1042.5161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1577.7751,1042.5161 L1577.7751,1052.5161 L1587.7751,1052.5161 L1577.7751,1042.5161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="141.9472" x="1420.22" y="1061.4131">Runs: DbUp migrations</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="82.1861" x="1420.22" y="1079.1191">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="152.5551" x="1420.22" y="1096.8251">- CLEAR_DATABASE=false</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="140.5431" x="1420.22" y="1114.5311">Depends on: sql-server</text></g><!--entity Seed1--><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevSeed.Seed1" data-source-line="59" id="ent0024"><rect fill="#FFFFFF" height="49.0679" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="137.8876" x="1708.06" y="771.8961"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1825.9476" y="776.8961"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1823.9476" y="778.8961"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1823.9476" y="782.8961"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="97.8876" x="1723.06" y="806.862">Database.Seed</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevSeed.GMN25" data-source-line="61" id="ent0026"><path d="M1684.6,1033.6661 L1684.6,1132.1962 A0,0 0 0 0 1684.6,1132.1962 L1869.4002,1132.1962 A0,0 0 0 0 1869.4002,1132.1962 L1869.4002,1043.6661 L1859.4002,1033.6661 L1781,1033.6661 L1777,821.3561 L1773,1033.6661 L1684.6,1033.6661 A0,0 0 0 0 1684.6,1033.6661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1859.4002,1033.6661 L1859.4002,1043.6661 L1869.4002,1043.6661 L1859.4002,1033.6661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="49.946" x="1690.6" y="1052.5631">Creates:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="92.7681" x="1690.6" y="1070.2691">- 100 test users</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="163.8002" x="1690.6" y="1087.9751">- Location data (US/CA/MX)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="112.7361" x="1690.6" y="1105.6811">- test.user account</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="146.8871" x="1690.6" y="1123.3872">Depends on: migrations</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMailpit.DevMailpitWeb" data-source-line="70" id="ent0029"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="92.2176" x="177.2212" y="774.3341">8025 (Web UI)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="217.33" y="790.4361"/></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMailpit.DevMailpitSmtp" data-source-line="71" id="ent0030"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="80.7097" x="281.9752" y="774.3341">1025 (SMTP)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="316.33" y="790.4361"/></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMailpit.GMN31" data-source-line="73" id="ent0032"><path d="M59.5,1042.5161 L59.5,1123.3402 A0,0 0 0 0 59.5,1123.3402 L330.5032,1123.3402 A0,0 0 0 0 330.5032,1123.3402 L330.5032,1052.5161 L320.5032,1042.5161 L318.75,1042.5161 L314.75,796.4861 L310.75,1042.5161 L59.5,1042.5161 A0,0 0 0 0 59.5,1042.5161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M320.5032,1042.5161 L320.5032,1052.5161 L330.5032,1052.5161 L320.5032,1042.5161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="250.0032" x="65.5" y="1061.4131">Local SMTP catcher for dev email testing.</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="82.1861" x="65.5" y="1079.1191">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="206.4792" x="65.5" y="1096.8251">- MP_SMTP_AUTH_ACCEPT_ANY=1</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="239.7332" x="65.5" y="1114.5311">- MP_SMTP_AUTH_ALLOW_INSECURE=1</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB.GMN38" data-source-line="89" id="ent0039"><path d="M3108.8,738.3161 L3108.8,792.3161 L3054.19,796.3161 L3108.8,800.3161 L3108.8,854.5522 A0,0 0 0 0 3108.8,854.5522 L3275.1921,854.5522 A0,0 0 0 0 3275.1921,854.5522 L3275.1921,748.3161 L3265.1921,738.3161 L3108.8,738.3161 A0,0 0 0 0 3108.8,738.3161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3265.1921,738.3161 L3265.1921,748.3161 L3275.1921,748.3161 L3265.1921,738.3161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="145.3921" x="3114.8" y="757.2131">Fresh instance each run</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="141.7392" x="3114.8" y="774.9191">CLEAR_DATABASE=true</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.38" x="3114.8" y="792.6251">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="56.2511" x="3114.8" y="810.3311">Volumes:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="130.9231" x="3114.8" y="828.0372">- biergarten-test-data</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="73.9961" x="3114.8" y="845.7432">(ephemeral)</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB.TestDBInner.1434" data-source-line="86" id="ent0037"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="32.0319" x="3031.9841" y="774.3341">1434</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="3042" y="790.4361"/></g><!--entity Database.Migrations--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestMig.Database.Migrations" data-source-line="99" id="ent0042"><rect fill="#FFFFFF" height="49.0679" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="176.8495" x="2592.58" y="450.8361"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2749.4295" y="455.8361"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2747.4295" y="457.8361"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2747.4295" y="461.8361"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="136.8495" x="2607.58" y="485.802">Database.Migrations</text></g><!--entity Database.Seed--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestSeed.Database.Seed" data-source-line="103" id="ent0044"><rect fill="#FFFFFF" height="49.0679" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="137.8876" x="2348.06" y="205.5661"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2465.9476" y="210.5661"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2463.9476" y="212.5661"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2463.9476" y="216.5661"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="97.8876" x="2363.06" y="240.532">Database.Seed</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestSeed.GMN45" data-source-line="105" id="ent0046"><path d="M2360.52,443.8161 L2360.52,506.9341 A0,0 0 0 0 2360.52,506.9341 L2473.4821,506.9341 A0,0 0 0 0 2473.4821,506.9341 L2473.4821,453.8161 L2463.4821,443.8161 L2421,443.8161 L2417,254.9661 L2413,443.8161 L2360.52,443.8161 A0,0 0 0 0 2360.52,443.8161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2463.4821,443.8161 L2463.4821,453.8161 L2473.4821,453.8161 L2463.4821,443.8161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="85.0851" x="2366.52" y="462.7131">Minimal seed:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="90.2201" x="2366.52" y="480.4191">- test.user only</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="91.9621" x="2366.52" y="498.1251">- Essential data</text></g><!--entity SpecsComp--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..Specs.SpecsComp" data-source-line="112" id="ent0049"><rect fill="#FFFFFF" height="49.0679" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="145.5876" x="3383.21" y="450.8361"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="3508.7976" y="455.8361"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="3506.7976" y="457.8361"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="3506.7976" y="461.8361"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="105.5876" x="3398.21" y="485.802">Reqnroll + xUnit</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..Specs.GMN50" data-source-line="114" id="ent0051"><path d="M3563.81,399.5461 L3563.81,471.3161 L3529.25,475.3161 L3563.81,479.3161 L3563.81,551.1942 A0,0 0 0 0 3563.81,551.1942 L3716.1881,551.1942 A0,0 0 0 0 3716.1881,551.1942 L3716.1881,409.5461 L3706.1881,399.5461 L3563.81,399.5461 A0,0 0 0 0 3563.81,399.5461" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3706.1881,399.5461 L3706.1881,409.5461 L3716.1881,409.5461 L3706.1881,399.5461" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.191" x="3569.81" y="418.4431">Tests:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="111.1501" x="3569.81" y="436.1491">- Registration flow</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="70.9151" x="3569.81" y="453.8551">- Login flow</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="102.2971" x="3569.81" y="471.5611">- Validation rules</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="87.3471" x="3569.81" y="489.2672">- 404 handling</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.38" x="3569.81" y="506.9732">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="126.1261" x="3569.81" y="524.6792">Uses: TestApiFactory</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="131.3781" x="3569.81" y="542.3852">Mocks: Email services</text></g><!--entity UnitComp--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..UnitTests.UnitComp" data-source-line="126" id="ent0054"><rect fill="#FFFFFF" height="49.0679" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="120.0237" x="2889.99" y="450.8361"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2990.0137" y="455.8361"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2988.0137" y="457.8361"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2988.0137" y="461.8361"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="80.0237" x="2904.99" y="485.802">xUnit + Moq</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..UnitTests.GMN55" data-source-line="128" id="ent0056"><path d="M3044.67,364.1361 L3044.67,471.3161 L3010.46,475.3161 L3044.67,479.3161 L3044.67,586.6083 A0,0 0 0 0 3044.67,586.6083 L3275.3212,586.6083 A0,0 0 0 0 3275.3212,586.6083 L3275.3212,374.1361 L3265.3212,364.1361 L3044.67,364.1361 A0,0 0 0 0 3044.67,364.1361" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3265.3212,364.1361 L3265.3212,374.1361 L3275.3212,374.1361 L3265.3212,364.1361" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="177.9442" x="3050.67" y="383.0331">Builds Dockerfile.tests, which</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="200.6162" x="3050.67" y="400.7391">restores/builds against Core.slnx</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="194.4932" x="3050.67" y="418.4451">then runs `dotnet test` for every</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="194.2072" x="3050.67" y="436.1511">Features/*.Tests project in turn:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="128.3361" x="3050.67" y="453.8572">- Features.Auth.Tests</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="160.2511" x="3050.67" y="471.5632">- Features.Breweries.Tests</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="209.6512" x="3050.67" y="489.2692">- Features.UserManagement.Tests</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="138.8791" x="3050.67" y="506.9752">- Features.Emails.Tests</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.38" x="3050.67" y="524.6812">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="208.5462" x="3050.67" y="542.3872">Uses: Moq to mock each handler's</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="198.5751" x="3050.67" y="560.0933">repository/service dependencies</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="153.3741" x="3050.67" y="577.7993">No real database needed</text></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..GMN82" data-source-line="191" id="ent0083"><path d="M5425.95,1042.5161 L5425.95,1123.3402 L5650.0589,1123.3402 L5650.0589,1052.5161 L5640.0589,1042.5161 L5425.95,1042.5161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M5640.0589,1042.5161 L5640.0589,1052.5161 L5650.0589,1052.5161 L5640.0589,1042.5161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="203.1089" x="5431.95" y="1061.4131">Prod Network (bridge: prodnet)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="199.0432" x="5431.95" y="1079.1191">Isolated from dev/test networks.</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="179.6082" x="5431.95" y="1096.8251">Volumes: sqlserverdata-prod,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="108.8231" x="5431.95" y="1114.5311">nuget-cache-prod</text></g><!--entity ProdDBInner--><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdDB.ProdDBInner" data-source-line="148" id="ent0060"><path d="M5211.88,772.8661 C5211.88,762.8661 5256.9989,762.8661 5256.9989,762.8661 C5256.9989,762.8661 5302.1177,762.8661 5302.1177,772.8661 L5302.1177,820.0019 C5302.1177,830.0019 5256.9989,830.0019 5256.9989,830.0019 C5256.9989,830.0019 5211.88,830.0019 5211.88,820.0019 L5211.88,772.8661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M5211.88,772.8661 C5211.88,782.8661 5256.9989,782.8661 5256.9989,782.8661 C5256.9989,782.8661 5302.1177,782.8661 5302.1177,772.8661" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="70.2377" x="5221.88" y="801.832">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="62.0478" x="5221.88" y="820.8999">Database</text></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdDB.GMN61" data-source-line="150" id="ent0062"><path d="M5337.28,720.6061 L5337.28,792.3161 L5302.4,796.3161 L5337.28,800.3161 L5337.28,872.2542 A0,0 0 0 0 5337.28,872.2542 L5502.7102,872.2542 A0,0 0 0 0 5502.7102,872.2542 L5502.7102,730.6061 L5492.7102,720.6061 L5337.28,720.6061 A0,0 0 0 0 5337.28,720.6061" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M5492.7102,720.6061 L5492.7102,730.6061 L5502.7102,730.6061 L5492.7102,720.6061" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="82.1861" x="5343.28" y="739.5031">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="107.0421" x="5343.28" y="757.2091">- ACCEPT_EULA=Y</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="127.9721" x="5343.28" y="774.9151">- SA_PASSWORD=***</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="132.8211" x="5343.28" y="792.6211">- MSSQL_PID=Express</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.38" x="5343.28" y="810.3272">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="56.2511" x="5343.28" y="828.0332">Volumes:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="124.0591" x="5343.28" y="845.7392">- sqlserverdata-prod</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="144.4302" x="5343.28" y="863.4452">No host port published.</text></g><!--entity ProdMig1--><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdMig.ProdMig1" data-source-line="162" id="ent0065"><rect fill="#FFFFFF" height="49.0679" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="176.8495" x="4918.58" y="450.8361"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="5075.4295" y="455.8361"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="5073.4295" y="457.8361"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="5073.4295" y="461.8361"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="136.8495" x="4933.58" y="485.802">Database.Migrations</text></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdMig.GMN66" data-source-line="164" id="ent0067"><path d="M4897.95,773.7261 L4897.95,819.1381 A0,0 0 0 0 4897.95,819.1381 L5116.0432,819.1381 A0,0 0 0 0 5116.0432,819.1381 L5116.0432,783.7261 L5106.0432,773.7261 L5011,773.7261 L5007,500.2961 L5003,773.7261 L4897.95,773.7261 A0,0 0 0 0 4897.95,773.7261" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M5106.0432,773.7261 L5106.0432,783.7261 L5116.0432,783.7261 L5106.0432,773.7261" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="197.0932" x="4903.95" y="792.6231">Depends on: sql-server (healthy)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="168.7142" x="4903.95" y="810.3291">No seed step in production.</text></g><!--entity ProdAPI1--><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdAPI.ProdAPI1" data-source-line="170" id="ent0070"><rect fill="#FFFFFF" height="49.0679" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="149.3536" x="5782.32" y="450.8361"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="5911.6736" y="455.8361"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="5909.6736" y="457.8361"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="5909.6736" y="461.8361"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="109.3536" x="5797.32" y="485.802">ASP.NET Core 10</text></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdAPI.ProdPort1" data-source-line="171" id="ent0071"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="114.2675" x="5273.5362" y="208.0041">8080:8080 (HTTP)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="5324.67" y="224.1061"/></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdAPI.ProdPort2" data-source-line="172" id="ent0072"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="121.9535" x="5397.5233" y="208.0041">8081:8081 (HTTPS)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="5452.5" y="224.1061"/></g><g class="entity" data-qualified-name="Production Environment.n.docker-compose.prod.yaml..ProdAPI.GMN73" data-source-line="174" id="ent0074"><path d="M5410.46,399.5461 L5410.46,551.1942 A0,0 0 0 0 5410.46,551.1942 L5747.5424,551.1942 A0,0 0 0 0 5747.5424,551.1942 L5747.5424,409.5461 L5737.5424,399.5461 L5474,399.5461 L5470,235.6861 L5466,399.5461 L5410.46,399.5461 A0,0 0 0 0 5410.46,399.5461" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M5737.5424,399.5461 L5737.5424,409.5461 L5747.5424,409.5461 L5737.5424,399.5461" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="82.1861" x="5416.46" y="418.4431">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="262.9773" x="5416.46" y="436.1491">- ASPNETCORE_ENVIRONMENT=Production</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="230.7762" x="5416.46" y="453.8551">- DB_SERVER/NAME/USER/PASSWORD</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="316.0824" x="5416.46" y="471.5611">- ACCESS/REFRESH/CONFIRMATION_TOKEN_SECRET</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="128.4012" x="5416.46" y="489.2672">- WEBSITE_BASE_URL</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.38" x="5416.46" y="506.9732">&#160;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="204.6592" x="5416.46" y="524.6792">Depends on: sql-server (healthy) -</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="208.5332" x="5416.46" y="542.3852">does not wait on migrations/seed.</text></g><g class="entity" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml..GMN90" data-source-line="215" id="ent0091"><path d="M6099.2,747.1661 L6099.2,845.6962 L6324.8072,845.6962 L6324.8072,757.1661 L6314.8072,747.1661 L6099.2,747.1661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M6314.8072,747.1661 L6314.8072,757.1661 L6324.8072,757.1661 L6314.8072,747.1661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="200.3302" x="6105.2" y="766.0631">Same devnet volumes/images as</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="204.6072" x="6105.2" y="783.7691">docker-compose.dev.yaml, minus</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="203.0212" x="6105.2" y="801.4751">api.core and mailpit - for working</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="178.1002" x="6105.2" y="819.1811">against the database without</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="99.7361" x="6105.2" y="836.8872">running the API.</text></g><!--entity DbOnlyDBInner--><g class="entity" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml..DbOnlyDB.DbOnlyDBInner" data-source-line="201" id="ent0087"><path d="M6175.88,451.8061 C6175.88,441.8061 6220.9989,441.8061 6220.9989,441.8061 C6220.9989,441.8061 6266.1177,441.8061 6266.1177,451.8061 L6266.1177,498.9419 C6266.1177,508.9419 6220.9989,508.9419 6220.9989,508.9419 C6220.9989,508.9419 6175.88,508.9419 6175.88,498.9419 L6175.88,451.8061" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M6175.88,451.8061 C6175.88,461.8061 6220.9989,461.8061 6220.9989,461.8061 C6220.9989,461.8061 6266.1177,461.8061 6266.1177,451.8061" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="70.2377" x="6185.88" y="480.772">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="62.0478" x="6185.88" y="499.8399">Database</text></g><!--entity DbOnlyMig--><g class="entity" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml..DbOnlyMig" data-source-line="206" id="ent0088"><polygon fill="#FFFFFF" points="6116.48,206.0361,6126.48,196.0361,6227.5297,196.0361,6227.5297,254.1719,6217.5297,264.1719,6116.48,264.1719,6116.48,206.0361" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="6217.5297" x2="6227.5297" y1="206.0361" y2="196.0361"/><line style="stroke:#000000;stroke-width:1;" x1="6116.48" x2="6217.5297" y1="206.0361" y2="206.0361"/><line style="stroke:#000000;stroke-width:1;" x1="6217.5297" x2="6217.5297" y1="206.0361" y2="264.1719"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="71.0497" x="6131.48" y="231.002">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="67.7317" x="6131.48" y="250.0699">(run-once)</text></g><!--entity DbOnlySeed--><g class="entity" data-qualified-name="Database-only Environment.n.docker-compose.db.yaml..DbOnlySeed" data-source-line="210" id="ent0089"><polygon fill="#FFFFFF" points="6020.13,451.3061,6030.13,441.3061,6127.8617,441.3061,6127.8617,499.4419,6117.8617,509.4419,6020.13,509.4419,6020.13,451.3061" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="6117.8617" x2="6127.8617" y1="451.3061" y2="441.3061"/><line style="stroke:#000000;stroke-width:1;" x1="6020.13" x2="6117.8617" y1="451.3061" y2="451.3061"/><line style="stroke:#000000;stroke-width:1;" x1="6117.8617" x2="6117.8617" y1="451.3061" y2="509.4419"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="32.0879" x="6035.13" y="476.272">Seed</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="67.7317" x="6035.13" y="495.3399">(run-once)</text></g><g class="entity" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..GMN106" data-source-line="249" id="ent0107"><path d="M6611.44,756.0161 L6611.44,836.8402 L6860.5512,836.8402 L6860.5512,766.0161 L6850.5512,756.0161 L6611.44,756.0161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M6850.5512,756.0161 L6850.5512,766.0161 L6860.5512,766.0161 L6850.5512,756.0161" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="189.9952" x="6617.44" y="774.9131">Database + mailpit only, no API</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="228.1112" x="6617.44" y="792.6191">container - for frontend development</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="195.2732" x="6617.44" y="810.3251">against an API.Core process run</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="95.6021" x="6617.44" y="828.0311">outside Docker.</text></g><!--entity MinDBInner--><g class="entity" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinDB.MinDBInner" data-source-line="231" id="ent0101"><path d="M6711.88,451.8061 C6711.88,441.8061 6756.9989,441.8061 6756.9989,441.8061 C6756.9989,441.8061 6802.1177,441.8061 6802.1177,451.8061 L6802.1177,498.9419 C6802.1177,508.9419 6756.9989,508.9419 6756.9989,508.9419 C6756.9989,508.9419 6711.88,508.9419 6711.88,498.9419 L6711.88,451.8061" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M6711.88,451.8061 C6711.88,461.8061 6756.9989,461.8061 6756.9989,461.8061 C6756.9989,461.8061 6802.1177,461.8061 6802.1177,451.8061" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="70.2377" x="6721.88" y="480.772">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="62.0478" x="6721.88" y="499.8399">Database</text></g><!--entity MinMig--><g class="entity" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinMig" data-source-line="236" id="ent0102"><polygon fill="#FFFFFF" points="6651.48,206.0361,6661.48,196.0361,6762.5297,196.0361,6762.5297,254.1719,6752.5297,264.1719,6651.48,264.1719,6651.48,206.0361" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="6752.5297" x2="6762.5297" y1="206.0361" y2="196.0361"/><line style="stroke:#000000;stroke-width:1;" x1="6651.48" x2="6752.5297" y1="206.0361" y2="206.0361"/><line style="stroke:#000000;stroke-width:1;" x1="6752.5297" x2="6752.5297" y1="206.0361" y2="264.1719"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="71.0497" x="6666.48" y="231.002">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="67.7317" x="6666.48" y="250.0699">(run-once)</text></g><g class="entity" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinMailpit.8025 . 1025" data-source-line="241" id="ent0104"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="76.5517" x="6416.7242" y="208.0041">8025 / 1025</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="6449" y="224.1061"/></g><!--entity MinSeed--><g class="entity" data-qualified-name="Minimal Environment.n.docker-compose.min.yaml..MinSeed" data-source-line="244" id="ent0105"><polygon fill="#FFFFFF" points="6556.13,451.3061,6566.13,441.3061,6663.8617,441.3061,6663.8617,499.4419,6653.8617,509.4419,6556.13,509.4419,6556.13,451.3061" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="6653.8617" x2="6663.8617" y1="451.3061" y2="441.3061"/><line style="stroke:#000000;stroke-width:1;" x1="6556.13" x2="6653.8617" y1="451.3061" y2="451.3061"/><line style="stroke:#000000;stroke-width:1;" x1="6653.8617" x2="6653.8617" y1="451.3061" y2="509.4419"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="32.0879" x="6571.13" y="476.272">Seed</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="67.7317" x="6571.13" y="495.3399">(run-once)</text></g><!--entity Result1--><g class="entity" data-qualified-name="Results.Result1" data-source-line="262" id="ent0116"><path d="M4178.16,769.8661 L4178.16,823.0019 A2.5,2.5 0 0 0 4180.66,825.5019 L4269.3417,825.5019 A2.5,2.5 0 0 0 4271.8417,823.0019 L4271.8417,777.3661 L4261.8417,767.3661 L4180.66,767.3661 A2.5,2.5 0 0 0 4178.16,769.8661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4261.8417,767.3661 L4261.8417,774.8661 A2.5,2.5 0 0 0 4264.3417,777.3661 L4271.8417,777.3661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="66.4297" x="4188.16" y="792.332">api-specs/</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="66.4018" x="4195.44" y="811.3999">results.trx</text></g><!--entity Result2--><g class="entity" data-qualified-name="Results.Result2" data-source-line="263" id="ent0117"><path d="M4306.97,779.3961 L4306.97,813.464 A2.5,2.5 0 0 0 4309.47,815.964 L4476.5234,815.964 A2.5,2.5 0 0 0 4479.0234,813.464 L4479.0234,786.8961 L4469.0234,776.8961 L4309.47,776.8961 A2.5,2.5 0 0 0 4306.97,779.3961" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4469.0234,776.8961 L4469.0234,784.3961 A2.5,2.5 0 0 0 4471.5234,786.8961 L4479.0234,786.8961" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="152.0534" x="4316.97" y="801.862">Features.Auth.Tests.trx</text></g><!--entity Result3--><g class="entity" data-qualified-name="Results.Result3" data-source-line="264" id="ent0118"><path d="M4121.79,1065.8961 L4121.79,1099.964 A2.5,2.5 0 0 0 4124.29,1102.464 L4325.7133,1102.464 A2.5,2.5 0 0 0 4328.2133,1099.964 L4328.2133,1073.3961 L4318.2133,1063.3961 L4124.29,1063.3961 A2.5,2.5 0 0 0 4121.79,1065.8961" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4318.2133,1063.3961 L4318.2133,1070.8961 A2.5,2.5 0 0 0 4320.7133,1073.3961 L4328.2133,1073.3961" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="186.4233" x="4131.79" y="1088.362">Features.Breweries.Tests.trx</text></g><!--entity Result4--><g class="entity" data-qualified-name="Results.Result4" data-source-line="265" id="ent0119"><path d="M4363.19,1065.8961 L4363.19,1099.964 A2.5,2.5 0 0 0 4365.69,1102.464 L4620.3131,1102.464 A2.5,2.5 0 0 0 4622.8131,1099.964 L4622.8131,1073.3961 L4612.8131,1063.3961 L4365.69,1063.3961 A2.5,2.5 0 0 0 4363.19,1065.8961" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4612.8131,1063.3961 L4612.8131,1070.8961 A2.5,2.5 0 0 0 4615.3131,1073.3961 L4622.8131,1073.3961" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="239.6231" x="4373.19" y="1088.362">Features.UserManagement.Tests.trx</text></g><!--entity Result5--><g class="entity" data-qualified-name="Results.Result5" data-source-line="266" id="ent0120"><path d="M4583.3,779.3961 L4583.3,813.464 A2.5,2.5 0 0 0 4585.8,815.964 L4764.2074,815.964 A2.5,2.5 0 0 0 4766.7074,813.464 L4766.7074,786.8961 L4756.7074,776.8961 L4585.8,776.8961 A2.5,2.5 0 0 0 4583.3,779.3961" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4756.7074,776.8961 L4756.7074,784.3961 A2.5,2.5 0 0 0 4759.2074,786.8961 L4766.7074,786.8961" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="163.4074" x="4593.3" y="801.862">Features.Emails.Tests.trx</text></g><g class="entity" data-qualified-name="Results.GMN121" data-source-line="269" id="ent0122"><path d="M4658.08,1033.6661 L4658.08,1132.1962 A0,0 0 0 0 4658.08,1132.1962 L4777.9191,1132.1962 A0,0 0 0 0 4777.9191,1132.1962 L4777.9191,1043.6661 L4767.9191,1033.6661 L4716.39,1033.6661 L4712.39,816.1261 L4708.39,1033.6661 L4658.08,1033.6661 A0,0 0 0 0 4658.08,1033.6661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4767.9191,1033.6661 L4767.9191,1043.6661 L4777.9191,1043.6661 L4767.9191,1033.6661" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="68.1591" x="4664.08" y="1052.5631">TRX format</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="78.1691" x="4664.08" y="1070.2691">Readable by:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="86.0861" x="4664.08" y="1087.9751">- Visual Studio</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="93.8991" x="4664.08" y="1105.6811">- Azure DevOps</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="98.8391" x="4664.08" y="1123.3872">- GitHub Actions</text></g><!--entity Developer--><g class="entity" data-qualified-name="Developer" data-source-line="9" id="ent0002"><ellipse cx="1995.9969" cy="199.0661" fill="#FFFFFF" rx="8" ry="8" style="stroke:#000000;stroke-width:1;"/><path d="M1995.9969,207.0661 L1995.9969,234.0661 M1982.9969,215.0661 L2008.9969,215.0661 M1995.9969,234.0661 L1982.9969,249.0661 M1995.9969,234.0661 L2008.9969,249.0661" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="67.4937" x="1962.25" y="266.032">Developer</text></g><!--entity Host--><g class="entity" data-qualified-name="Host" data-source-line="10" id="ent0003"><path d="M1949.4692,459.9075 C1953.4784,453.8503 1957.5734,453.9997 1961.0639,460.3906 C1963.587,453.9374 1969.3465,453.9568 1973.5291,458.5113 C1976.716,453.0488 1981.0145,452.8159 1984.6695,458.0225 C1988.7945,452.577 1994.2956,453.3349 1997.7491,458.8257 C2001.0015,453.3982 2004.9282,453.3468 2008.5397,458.458 C2012.8899,453.7428 2016.6111,453.2346 2019.8936,459.5564 C2024.1854,453.799 2029.2229,454.0687 2032.8883,460.2388 C2036.5651,454.0259 2042.4388,454.981 2045.5354,460.8463 C2054.6297,464.5648 2055.7786,470.1494 2048.2791,476.7337 C2054.76,483.6027 2052.8117,490.8737 2043.6903,493.4631 C2039.5615,498.5592 2034.9233,498.9777 2031.8662,492.3795 C2028.8424,498.3229 2024.8051,500.0574 2019.901,494.3028 C2015.7261,500.1818 2011.6832,500.1377 2008.1519,493.6894 C2004.9135,498.1149 2000.7832,498.0988 1997.7303,493.4758 C1994.1393,498.5854 1990.646,500.2696 1986.0536,494.5561 C1982.2406,501.1051 1975.9565,499.7848 1972.6036,494.0523 C1969.8618,498.6668 1964.9972,499.7561 1962.0633,494.2524 C1958.3121,499.7238 1953.395,499.3839 1950.5567,493.3401 C1941.3413,491.411 1939.172,484.0672 1944.8489,476.9515 C1936.8174,470.0509 1938.9828,461.7882 1949.4692,459.9075" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="80.8077" x="1955.6" y="480.802">Docker Host</text></g><g class="entity" data-qualified-name="GMN150" data-source-line="307" id="ent0151"><path d="M1940.76,1209.9061 L1940.76,1290.7302 L2203.2384,1290.7302 L2203.2384,1219.9061 L2193.2384,1209.9061 L1940.76,1209.9061" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2193.2384,1209.9061 L2193.2384,1219.9061 L2203.2384,1219.9061 L2193.2384,1209.9061" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="241.4784" x="1946.76" y="1228.8031">Dev Network (bridge: biergarten-dev)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="81.8871" x="1946.76" y="1246.5091">Internal DNS:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="234.0652" x="1946.76" y="1264.2151">- sql-server (resolves to SQL container)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="189.1892" x="1946.76" y="1281.9211">- api (resolves to API container)</text></g><g class="entity" data-qualified-name="GMN153" data-source-line="314" id="ent0154"><path d="M3807.82,1060.2261 L3807.82,1105.6381 L4074.179,1105.6381 L4074.179,1070.2261 L4064.179,1060.2261 L3807.82,1060.2261" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4064.179,1060.2261 L4064.179,1070.2261 L4074.179,1070.2261 L4064.179,1060.2261" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="245.359" x="3813.82" y="1079.1231">Test Network (bridge: biergarten-test)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="172.6532" x="3813.82" y="1096.8291">All test components isolated</text></g><g class="entity" data-qualified-name="GMN156" data-source-line="320" id="ent0157"><path d="M2085.99,426.1061 L2085.99,524.6362 L2276.0032,524.6362 L2276.0032,436.1061 L2266.0032,426.1061 L2085.99,426.1061" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2266.0032,426.1061 L2266.0032,436.1061 L2276.0032,436.1061 L2266.0032,426.1061" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="88.2961" x="2091.99" y="445.0031">Startup Order:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="169.0132" x="2091.99" y="462.7091">1. SQL Server (health check)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="146.5492" x="2091.99" y="480.4151">2. Migrations (run-once)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110.3701" x="2091.99" y="498.1211">3. Seed (run-once)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="126.3472" x="2091.99" y="515.8272">4. API (long-running)</text></g><g class="entity" data-qualified-name="GMN159" data-source-line="328" id="ent0160"><path d="M3807.56,198.5461 L3807.56,261.6641 L3964.4361,261.6641 L3964.4361,208.5461 L3954.4361,198.5461 L3807.56,198.5461" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3954.4361,198.5461 L3954.4361,208.5461 L3964.4361,208.5461 L3954.4361,198.5461" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="92.0011" x="3813.56" y="217.4431">Test Execution:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="135.8761" x="3813.56" y="235.1491">All tests run in parallel</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="118.6251" x="3813.56" y="252.8551">Results aggregated</text></g><!--link ProdMig to ProdDB--><g class="link" data-entity-1="ent0064" data-entity-2="ent0059" data-link-type="dependency" data-source-line="185" id="lnk76"><path d="M5148.0788,475.3161 C5148.1295,475.3161 5148.1804,475.3161 5148.2315,475.3161 C5148.3336,475.3161 5148.4363,475.3161 5148.5395,475.3161 C5148.746,475.3161 5148.9546,475.3161 5149.1652,475.3161 C5149.5864,475.3161 5150.0156,475.3161 5150.4513,475.3161 C5151.3226,475.3161 5152.2197,475.3161 5153.1309,475.3161 C5154.9531,475.3161 5156.8313,475.3161 5158.67,475.3161 C5166.025,475.3161 5172.75,475.3161 5172.75,475.3161 C5172.75,475.3161 5172.75,563.3161 5172.75,563.3161 C5172.75,563.3161 5538.33,563.3161 5538.33,563.3161 C5538.33,563.3161 5538.33,576.9892 5538.33,597.7126 C5538.33,608.0744 5538.33,620.1987 5538.33,633.2577 C5538.33,636.5224 5538.33,639.8456 5538.33,643.2143 C5538.33,644.8986 5538.33,646.5943 5538.33,648.2998 C5538.33,648.7261 5538.33,643.1531 5538.33,643.5807" fill="none" id="ProdMig-to-ProdDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="5538.33,649.5807,5542.33,640.5807,5538.33,644.5807,5534.33,640.5807,5538.33,649.5807" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="108.1731" x="5302.79" y="559.2131">1. Run migrations</text></g><!--reverse link ProdDB to ProdMig--><g class="link" data-entity-1="ent0059" data-entity-2="ent0064" data-link-type="dependency" data-source-line="187" id="lnk79"><path d="M5588.0376,796.3161 C5588.2115,796.3161 5582.6462,796.3161 5582.8177,796.3161 C5584.1899,796.3161 5585.4816,796.3161 5586.6703,796.3161 C5591.425,796.3161 5594.53,796.3161 5594.53,796.3161 C5594.53,796.3161 5594.53,708.3161 5594.53,708.3161 C5594.53,708.3161 5480.8975,708.3161 5367.265,708.3161 C5310.4488,708.3161 5253.6325,708.3161 5211.0203,708.3161 C5189.7142,708.3161 5171.9591,708.3161 5159.5306,708.3161 C5156.4234,708.3161 5153.6492,708.3161 5151.2356,708.3161 C5150.6322,708.3161 5150.0514,708.3161 5149.4935,708.3161 C5149.2146,708.3161 5148.9414,708.3161 5148.674,708.3161" fill="none" id="ProdDB-backto-ProdMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="5582.0376,796.3161,5591.0376,800.3161,5587.0376,796.3161,5591.0376,792.3161,5582.0376,796.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="5248.07" y="704.2131">depends_on</text></g><!--link ProdAPI to ProdDB--><g class="link" data-entity-1="ent0069" data-entity-2="ent0059" data-link-type="dependency" data-source-line="186" id="lnk77"><path d="M5519.86,575.3059 C5519.86,575.4361 5519.86,575.5788 5519.86,575.7337 C5519.86,576.0437 5519.86,576.4028 5519.86,576.8092 C5519.86,578.4352 5519.86,580.82 5519.86,583.8551 C5519.86,589.9255 5519.86,598.5973 5519.86,609.0036 C5519.86,619.4098 5519.86,631.5505 5519.86,644.5583 C5519.86,646.1842 5519.86,647.8238 5519.86,649.4752 C5519.86,649.6816 5519.86,649.8882 5519.86,650.095 C5519.86,650.1984 5519.86,644.3018 5519.86,644.4053" fill="none" id="ProdAPI-to-ProdDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="5519.86,650.4053,5523.86,641.4053,5519.86,645.4053,5515.86,641.4053,5519.86,650.4053" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="113.8541" x="5405.86" y="592.6031">2. Connect &amp; serve</text></g><!--reverse link ProdDB to ProdAPI--><g class="link" data-entity-1="ent0059" data-entity-2="ent0069" data-link-type="dependency" data-source-line="188" id="lnk81"><path d="M5350.02,644.1371 C5350.02,638.6353 5350.02,634.8628 5350.02,629.0648 C5350.02,617.4689 5350.02,605.4032 5350.02,593.3576 C5350.02,587.3348 5350.02,581.317 5350.02,575.3655" fill="none" id="ProdDB-backto-ProdAPI" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="5350.02,650.1371,5354.02,641.1371,5350.02,645.1371,5346.02,641.1371,5350.02,650.1371" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="5301.84" y="729.2131">depends_on</text></g><!--link ProdDB to GMN82--><g class="link" data-entity-1="ent0059" data-entity-2="ent0083" data-link-type="association" data-source-line="191" id="lnk84"><path d="M5538,897.178 C5538,897.5707 5538,897.964 5538,898.3577 C5538,899.145 5538,899.9343 5538,900.7252 C5538,902.307 5538,903.8957 5538,905.4904 C5538,908.6798 5538,911.8933 5538,915.1239 C5538,921.5851 5538,928.115 5538,934.659 C5538,947.7469 5538,960.8909 5538,973.6533 C5538,999.178 5538,1023.1761 5538,1042.1461" fill="none" id="ProdDB-GMN82" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link DbOnlyDB to GMN90--><g class="link" data-entity-1="ent0086" data-entity-2="ent0091" data-link-type="association" data-source-line="215" id="lnk92"><path d="M6301,533.3459 C6301,533.707 6301,534.0693 6301,534.4327 C6301,537.3403 6301,540.3232 6301,543.3738 C6301,555.576 6301,568.8614 6301,582.7448 C6301,638.2786 6301,703.3811 6301,747.0061" fill="none" id="DbOnlyDB-GMN90" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link DbOnlyMig to DbOnlyDB--><g class="link" data-entity-1="ent0088" data-entity-2="ent0086" data-link-type="dependency" data-source-line="222" id="lnk93"><path d="M6227.86,258.3161 C6255.51,258.3161 6283.06,258.3161 6283.06,258.3161 C6283.06,258.3161 6283.06,312.5661 6283.06,366.8161 C6283.06,373.5973 6283.06,380.3786 6283.06,387.0539 C6283.06,387.8883 6283.06,388.721 6283.06,389.5519 C6283.06,389.9674 6283.06,384.3824 6283.06,384.7969" fill="none" id="DbOnlyMig-to-DbOnlyDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="6283.06,390.7969,6287.06,381.7969,6283.06,385.7969,6279.06,381.7969,6283.06,390.7969" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="108.1731" x="6174.06" y="343.6931">1. Run migrations</text></g><!--reverse link DbOnlyDB to DbOnlyMig--><g class="link" data-entity-1="ent0086" data-entity-2="ent0088" data-link-type="dependency" data-source-line="224" id="lnk96"><path d="M6315.0554,475.3161 C6315.2118,475.3161 6309.4251,475.3161 6309.5774,475.3161 C6309.882,475.3161 6310.1776,475.3161 6310.4606,475.3161 C6311.0265,475.3161 6311.5417,475.3161 6311.9772,475.3161 C6312.8481,475.3161 6313.4,475.3161 6313.4,475.3161 C6313.4,475.3161 6313.4,253.3161 6313.4,253.3161 C6313.4,253.3161 6267.41,253.3161 6227.89,253.3161" fill="none" id="DbOnlyDB-backto-DbOnlyMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="6309.0554,475.3161,6318.0554,479.3161,6314.0554,475.3161,6318.0554,471.3161,6309.0554,475.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="6238.4" y="323.2531">depends_on</text></g><!--link DbOnlySeed to DbOnlyDB--><g class="link" data-entity-1="ent0089" data-entity-2="ent0086" data-link-type="dependency" data-source-line="223" id="lnk94"><path d="M6124.07,440.9561 C6124.07,433.2561 6124.07,427.3161 6124.07,427.3161 C6124.07,427.3161 6129.1281,427.3161 6145.7153,427.3161" fill="none" id="DbOnlySeed-to-DbOnlyDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="6151.7153,427.3161,6142.7153,423.3161,6146.7153,427.3161,6142.7153,431.3161,6151.7153,427.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.7501" x="6154.32" y="423.2131">2. Seed data</text></g><!--reverse link DbOnlyMig to DbOnlySeed--><g class="link" data-entity-1="ent0088" data-entity-2="ent0089" data-link-type="dependency" data-source-line="225" id="lnk98"><path d="M6120.27,270.4661 C6120.27,317.1361 6120.27,394.0961 6120.27,440.8461" fill="none" id="DbOnlyMig-backto-DbOnlySeed" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="6120.27,264.4661,6116.27,273.4661,6120.27,269.4661,6124.27,273.4661,6120.27,264.4661" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="6045.27" y="348.5531">depends_on</text></g><!--link MinDB to GMN106--><g class="link" data-entity-1="ent0100" data-entity-2="ent0107" data-link-type="association" data-source-line="249" id="lnk108"><path d="M6837,533.1968 C6837,534.6889 6837,536.2015 6837,537.7334 C6837,540.7971 6837,543.9384 6837,547.1487 C6837,559.9898 6837,573.9361 6837,588.4511 C6837,646.5111 6837,713.6711 6837,755.6061" fill="none" id="MinDB-GMN106" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link MinMig to MinDB--><g class="link" data-entity-1="ent0102" data-entity-2="ent0100" data-link-type="dependency" data-source-line="255" id="lnk109"><path d="M6762.7,241.3161 C6790.83,241.3161 6819.06,241.3161 6819.06,241.3161 C6819.06,241.3161 6819.06,299.8161 6819.06,358.3161 C6819.06,365.6286 6819.06,372.9411 6819.06,380.1393 C6819.06,381.9389 6819.06,383.7313 6819.06,385.5148 C6819.06,386.4065 6819.06,387.2961 6819.06,388.1831 C6819.06,388.6267 6819.06,383.0696 6819.06,383.5118" fill="none" id="MinMig-to-MinDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="6819.06,389.5118,6823.06,380.5118,6819.06,384.5118,6815.06,380.5118,6819.06,389.5118" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="108.1731" x="6710.06" y="334.6231">1. Run migrations</text></g><!--reverse link MinDB to MinMig--><g class="link" data-entity-1="ent0100" data-entity-2="ent0102" data-link-type="dependency" data-source-line="257" id="lnk112"><path d="M6851.038,475.3161 C6851.3395,475.3161 6846.0906,475.3161 6846.3706,475.3161 C6846.9307,475.3161 6847.4407,475.3161 6847.8717,475.3161 C6848.7337,475.3161 6849.28,475.3161 6849.28,475.3161 C6849.28,475.3161 6849.28,218.3161 6849.28,218.3161 C6849.28,218.3161 6802.68,218.3161 6762.82,218.3161" fill="none" id="MinDB-backto-MinMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="6845.038,475.3161,6854.038,479.3161,6850.038,475.3161,6854.038,471.3161,6845.038,475.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="6774.28" y="305.2231">depends_on</text></g><!--link MinSeed to MinDB--><g class="link" data-entity-1="ent0105" data-entity-2="ent0100" data-link-type="dependency" data-source-line="256" id="lnk110"><path d="M6659.74,441.0761 C6659.74,426.7261 6659.74,413.3161 6659.74,413.3161 C6659.74,413.3161 6664.8188,413.3161 6681.4369,413.3161" fill="none" id="MinSeed-to-MinDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="6687.4369,413.3161,6678.4369,409.3161,6682.4369,413.3161,6678.4369,417.3161,6687.4369,413.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.7501" x="6690.17" y="409.2131">2. Seed data</text></g><!--reverse link MinMig to MinSeed--><g class="link" data-entity-1="ent0102" data-entity-2="ent0105" data-link-type="dependency" data-source-line="258" id="lnk114"><path d="M6655.61,270.4661 C6655.61,317.1361 6655.61,394.0961 6655.61,440.8461" fill="none" id="MinMig-backto-MinSeed" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="6655.61,264.4661,6651.61,273.4661,6655.61,269.4661,6659.61,273.4661,6655.61,264.4661" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="6580.61" y="348.5531">depends_on</text></g><!--link Developer to Host--><g class="link" data-entity-1="ent0002" data-entity-2="ent0003" data-link-type="dependency" data-source-line="278" id="lnk124"><path d="M1996,270.6061 C1996,321.7661 1996,402.2161 1996,444.5361" fill="none" id="Developer-to-Host" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1996,450.5361,2000,441.5361,1996,445.5361,1992,441.5361,1996,450.5361" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="120.2111" x="1875" y="356.4631">docker compose up</text></g><!--link Host to DevAPI--><g class="link" data-entity-1="ent0003" data-entity-2="ent0011" data-link-type="dependency" data-source-line="279" id="lnk125"><path d="M1940.38,475.3161 C1736.86,475.3161 1044.5,475.3161 1044.5,475.3161 C1044.5,475.3161 1044.5,469.3297 1044.5,469.3569" fill="none" id="Host-to-DevAPI" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1044.5,475.3569,1048.5,466.3569,1044.5,470.3569,1040.5,466.3569,1044.5,475.3569" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="126.7241" x="1216.56" y="471.2131">http://localhost:8080</text></g><!--link DevMig to DevDB--><g class="link" data-entity-1="ent0018" data-entity-2="ent0005" data-link-type="dependency" data-source-line="282" id="lnk126"><path d="M1368.9143,1083.3161 C1368.3823,1083.3161 1367.8471,1083.3161 1367.3092,1083.3161 C1365.1573,1083.3161 1362.9617,1083.3161 1360.7538,1083.3161 C1351.9219,1083.3161 1342.8922,1083.3161 1335.6748,1083.3161 C1333.8705,1083.3161 1332.1794,1083.3161 1330.6331,1083.3161 C1330.2465,1083.3161 1329.8689,1083.3161 1329.5009,1083.3161 C1329.4089,1083.3161 1329.3175,1083.3161 1329.2267,1083.3161 C1329.1813,1083.3161 1335.136,1083.3161 1335.0909,1083.3161" fill="none" id="DevMig-to-DevDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1329.0909,1083.3161,1338.0909,1087.3161,1334.0909,1083.3161,1338.0909,1079.3161,1329.0909,1083.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="108.1731" x="1286.29" y="963.8731">1. Run migrations</text></g><!--reverse link DevDB to DevMig--><g class="link" data-entity-1="ent0005" data-entity-2="ent0018" data-link-type="dependency" data-source-line="286" id="lnk131"><path d="M1321,939.9185 C1321,935.5838 1321,937.2415 1321,932.9073 C1321,863.5611 1321,796.3161 1321,796.3161 C1321,796.3161 1333.305,796.3161 1346.3788,796.3161 C1352.9156,796.3161 1359.6447,796.3161 1365.1239,796.3161 C1366.4937,796.3161 1367.7854,796.3161 1368.9764,796.3161" fill="none" id="DevDB-backto-DevMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1321,945.9185,1325,936.9185,1321,940.9185,1317,936.9185,1321,945.9185" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="1246" y="907.4231">depends_on</text></g><!--link DevSeed to DevDB--><g class="link" data-entity-1="ent0023" data-entity-2="ent0005" data-link-type="dependency" data-source-line="283" id="lnk127"><path d="M1652.4803,755.3161 C1650.6501,755.3161 1648.5465,755.3161 1646.1904,755.3161 C1636.7661,755.3161 1623.3028,755.3161 1607.1469,755.3161 C1574.835,755.3161 1531.7525,755.3161 1488.67,755.3161 C1402.505,755.3161 1316.34,755.3161 1316.34,755.3161 C1316.34,755.3161 1316.34,837.3161 1316.34,919.3161 C1316.34,924.4411 1316.34,929.5661 1316.34,934.6711 C1316.34,937.2236 1316.34,939.771 1316.34,942.311 C1316.34,942.946 1316.34,937.5805 1316.34,938.2146" fill="none" id="DevSeed-to-DevDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1316.34,944.2146,1320.34,935.2146,1316.34,939.2146,1312.34,935.2146,1316.34,944.2146" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.7501" x="1267.9" y="751.2131">2. Seed data</text></g><!--link DevAPI to DevDB--><g class="link" data-entity-1="ent0011" data-entity-2="ent0005" data-link-type="dependency" data-source-line="284" id="lnk128"><path d="M1091.19,914.8977 C1091.19,916.0848 1091.19,917.2764 1091.19,918.4722 C1091.19,920.8637 1091.19,923.272 1091.19,925.6953 C1091.19,930.5418 1091.19,935.4483 1091.19,940.4002 C1091.19,941.6382 1091.19,942.879 1091.19,944.1225 C1091.19,944.4333 1091.19,944.7444 1091.19,945.0555 C1091.19,945.2111 1091.19,945.3668 1091.19,945.5224 C1091.19,945.6003 1091.19,945.6781 1091.19,945.756 C1091.19,945.7949 1091.19,939.8338 1091.19,939.8728" fill="none" id="DevAPI-to-DevDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1091.19,945.8728,1095.19,936.8728,1091.19,940.8728,1087.19,936.8728,1091.19,945.8728" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="113.8541" x="977.19" y="1159.2731">3. Connect &amp; serve</text></g><!--link DevAPI to DevMailpit--><g class="link" data-entity-1="ent0011" data-entity-2="ent0028" data-link-type="dependency" data-source-line="285" id="lnk129"><path d="M973.25,914.18 C973.25,915.0442 973.25,915.9094 973.25,916.7755 C973.25,920.2398 973.25,923.7178 973.25,927.2004 C973.25,941.1305 973.25,955.1333 973.25,968.6223 C973.25,1022.5786 973.25,1068.3161 973.25,1068.3161 C973.25,1068.3161 905.11,1068.3161 818.4363,1068.3161 C775.0994,1068.3161 727.1291,1068.3161 680.7261,1068.3161 C657.5246,1068.3161 634.715,1068.3161 613.0722,1068.3161 C602.2509,1068.3161 591.7213,1068.3161 581.5803,1068.3161 C580.3126,1068.3161 585.0511,1068.3161 583.7958,1068.3161" fill="none" id="DevAPI-to-DevMailpit" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="577.7958,1068.3161,586.7958,1072.3161,582.7958,1068.3161,586.7958,1064.3161,577.7958,1068.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="126.4122" x="760.19" y="1064.2131">4. SMTP_HOST/PORT</text></g><!--reverse link DevMig to DevSeed--><g class="link" data-entity-1="ent0018" data-entity-2="ent0023" data-link-type="dependency" data-source-line="287" id="lnk133"><path d="M1620.1032,843.3161 C1633.4157,843.3161 1641.0313,843.3161 1648.7969,843.3161 C1649.7676,843.3161 1650.6863,843.3161 1651.5508,843.3161 C1651.9831,843.3161 1652.4018,843.3161 1652.8067,843.3161 C1652.8573,843.3161 1652.9077,843.3161 1652.9579,843.3161" fill="none" id="DevMig-backto-DevSeed" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1614.1032,843.3161,1623.1032,847.3161,1619.1032,843.3161,1623.1032,839.3161,1614.1032,843.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="1444" y="839.2131">depends_on</text></g><!--reverse link DevSeed to DevAPI--><g class="link" data-entity-1="ent0023" data-entity-2="ent0011" data-link-type="dependency" data-source-line="288" id="lnk135"><path d="M1646.9695,796.3161 C1646.7415,796.3161 1652.1708,796.3161 1651.9372,796.3161 C1651.4699,796.3161 1650.9918,796.3161 1650.5046,796.3161 C1649.5304,796.3161 1648.5201,796.3161 1647.4883,796.3161 C1645.4248,796.3161 1643.2756,796.3161 1641.1575,796.3161 C1632.685,796.3161 1624.71,796.3161 1624.71,796.3161 C1624.71,796.3161 1624.71,832.3161 1624.71,832.3161 C1624.71,832.3161 1497.5175,832.3161 1370.325,832.3161 C1362.3755,832.3161 1354.4259,832.3161 1346.5075,832.3161 C1344.5278,832.3161 1342.5502,832.3161 1340.5749,832.3161 C1339.5873,832.3161 1338.6003,832.3161 1337.6139,832.3161" fill="none" id="DevSeed-backto-DevAPI" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1652.9695,796.3161,1643.9695,792.3161,1647.9695,796.3161,1643.9695,800.3161,1652.9695,796.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="1324.99" y="828.2131">depends_on</text></g><!--link TestMig to TestDB--><g class="link" data-entity-1="ent0041" data-entity-2="ent0035" data-link-type="dependency" data-source-line="291" id="lnk136"><path d="M2813.0301,475.3161 C2813.092,475.3161 2813.1542,475.3161 2813.2166,475.3161 C2813.7156,475.3161 2814.2304,475.3161 2814.7589,475.3161 C2818.9866,475.3161 2824.0881,475.3161 2829.0113,475.3161 C2838.8575,475.3161 2847.99,475.3161 2847.99,475.3161 C2847.99,475.3161 2847.99,644.3161 2847.99,644.3161 C2847.99,644.3161 3286.88,644.3161 3286.88,644.3161 C3286.88,644.3161 3286.88,647.8161 3286.88,662.0661" fill="none" id="TestMig-to-TestDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="3286.88,668.0661,3290.88,659.0661,3286.88,663.0661,3282.88,659.0661,3286.88,668.0661" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="62.1271" x="2986.58" y="640.2131">1. Migrate</text></g><!--reverse link TestDB to TestMig--><g class="link" data-entity-1="ent0035" data-entity-2="ent0041" data-link-type="dependency" data-source-line="296" id="lnk141"><path d="M2923.9971,863.3161 C2922.2769,863.3161 2923.9794,863.3161 2922.2819,863.3161 C2908.7019,863.3161 2895.8626,863.3161 2884.0109,863.3161 C2836.6044,863.3161 2805,863.3161 2805,863.3161 C2805,863.3161 2805,770.8236 2805,676.1623 C2805,628.8317 2805,580.9589 2805,543.8344 C2805,539.1938 2805,534.7212 2805,530.4385 C2805,528.2972 2805,526.2034 2805,524.1598" fill="none" id="TestDB-backto-TestMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="2929.9971,863.3161,2920.9971,859.3161,2924.9971,863.3161,2920.9971,867.3161,2929.9971,863.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="2822.24" y="859.2131">depends_on</text></g><!--link TestSeed to TestDB--><g class="link" data-entity-1="ent0043" data-entity-2="ent0035" data-link-type="dependency" data-source-line="292" id="lnk137"><path d="M2529.731,217.3161 C2535.4252,217.3161 2543.7766,217.3161 2554.4056,217.3161 C2575.6638,217.3161 2606.0325,217.3161 2642.475,217.3161 C2715.36,217.3161 2812.54,217.3161 2909.72,217.3161 C3104.08,217.3161 3298.44,217.3161 3298.44,217.3161 C3298.44,217.3161 3298.44,362.0661 3298.44,506.8161 C3298.44,543.0036 3298.44,579.1911 3298.44,613.1169 C3298.44,630.0798 3298.44,646.4772 3298.44,662.0265 C3298.44,663.9702 3298.44,659.9006 3298.44,661.8172" fill="none" id="TestSeed-to-TestDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="3298.44,667.8172,3302.44,658.8172,3298.44,662.8172,3294.44,658.8172,3298.44,667.8172" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="44.096" x="3154.11" y="213.2131">2. Seed</text></g><!--link Specs to TestDB--><g class="link" data-entity-1="ent0048" data-entity-2="ent0035" data-link-type="dependency" data-source-line="293" id="lnk138"><path d="M3752,576.6445 C3752,578.9386 3752,581.2514 3752,583.5807 C3752,602.2153 3752,621.9055 3752,641.4836 C3752,719.7961 3752,796.3161 3752,796.3161 C3752,796.3161 3646.8575,796.3161 3539.2513,796.3161 C3485.4481,796.3161 3431.0291,796.3161 3388.8289,796.3161 C3367.7288,796.3161 3349.6835,796.3161 3336.2972,796.3161 C3329.6041,796.3161 3324.0757,796.3161 3319.9127,796.3161 C3319.6525,796.3161 3325.3976,796.3161 3325.1481,796.3161" fill="none" id="Specs-to-TestDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="3319.1481,796.3161,3328.1481,800.3161,3324.1481,796.3161,3328.1481,792.3161,3319.1481,796.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="109.6941" x="3582.07" y="792.2131">3. Integration test</text></g><!--link UnitTests to TestDB--><g class="link" data-entity-1="ent0053" data-entity-2="ent0035" data-link-type="dependency" data-source-line="294" id="lnk139"><path d="M3311,611.0053 C3311,612.1885 3311,613.3735 3311,614.56 C3311,616.9332 3311,619.3127 3311,621.6965 C3311,626.4639 3311,631.2482 3311,636.0323 C3311,645.6006 3311,655.1683 3311,664.5994 C3311,665.7783 3311,660.955 3311,662.1294" fill="none" id="UnitTests-to-TestDB" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="3311,668.1294,3315,659.1294,3311,663.1294,3307,659.1294,3311,668.1294" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="143.3511" x="3157.2245" y="595.8131">depends_on for startup</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="163.8002" x="3147" y="613.5191">ordering only (Moq mocks,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="117.5981" x="3170.101" y="631.2251">no real connection)</text></g><!--reverse link TestMig to TestSeed--><g class="link" data-entity-1="ent0041" data-entity-2="ent0043" data-link-type="dependency" data-source-line="297" id="lnk143"><path d="M2805,374.276 C2805,370.6505 2805,372.9913 2805,369.312 C2805,361.9532 2805,354.5137 2805,347.1023 C2805,287.8111 2805,230.3161 2805,230.3161 C2805,230.3161 2738.3675,230.3161 2669.6525,230.3161 C2635.295,230.3161 2600.4169,230.3161 2573.0869,230.3161 C2559.4219,230.3161 2547.6439,230.3161 2538.7616,230.3161 C2536.541,230.3161 2534.5014,230.3161 2532.6585,230.3161 C2531.7371,230.3161 2530.8648,230.3161 2530.0437,230.3161 C2529.8384,230.3161 2529.6364,230.3161 2529.4375,230.3161" fill="none" id="TestMig-backto-TestSeed" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="2805,380.276,2809,371.276,2805,375.276,2801,371.276,2805,380.276" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="2710.58" y="226.2131">depends_on</text></g><!--reverse link TestSeed to Specs--><g class="link" data-entity-1="ent0043" data-entity-2="ent0048" data-link-type="dependency" data-source-line="298" id="lnk145"><path d="M2536.9854,257.3161 C2543.5201,257.3161 2547.4358,257.3161 2555.8482,257.3161 C2589.498,257.3161 2637.5691,257.3161 2695.2544,257.3161 C2810.625,257.3161 2964.4525,257.3161 3118.28,257.3161 C3425.935,257.3161 3733.59,257.3161 3733.59,257.3161 C3733.59,257.3161 3733.59,270.9411 3733.59,291.3786 C3733.59,301.5973 3733.59,313.5192 3733.59,326.2926 C3733.59,327.091 3733.59,327.8927 3733.59,328.6974" fill="none" id="TestSeed-backto-Specs" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="2530.9854,257.3161,2539.9854,261.3161,2535.9854,257.3161,2539.9854,253.3161,2530.9854,257.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="3138.96" y="253.2131">depends_on</text></g><!--reverse link TestSeed to UnitTests--><g class="link" data-entity-1="ent0043" data-entity-2="ent0053" data-link-type="dependency" data-source-line="299" id="lnk147"><path d="M2535.8721,243.3161 C2541.6582,243.3161 2544.1445,243.3161 2554.9453,243.3161 C2576.5469,243.3161 2607.4063,243.3161 2644.4375,243.3161 C2718.5,243.3161 2817.25,243.3161 2916,243.3161 C3113.5,243.3161 3311,243.3161 3311,243.3161 C3311,243.3161 3311,256.9273 3311,277.5569 C3311,280.1356 3311,282.8239 3311,285.609 C3311,287.0016 3311,288.4184 3311,289.8577 C3311,290.5774 3311,291.3027 3311,292.0335 C3311,292.3989 3311,292.7656 3311,293.1337" fill="none" id="TestSeed-backto-UnitTests" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="2529.8721,243.3161,2538.8721,247.3161,2534.8721,243.3161,2538.8721,239.3161,2529.8721,243.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.5811" x="2950.37" y="239.2131">depends_on</text></g><!--link Specs to Results--><g class="link" data-entity-1="ent0048" data-entity-2="ent0115" data-link-type="dependency" data-source-line="302" id="lnk148"><path d="M3760.8791,475.3161 C3761.7052,475.3161 3762.5867,475.3161 3763.5227,475.3161 C3765.3946,475.3161 3767.4842,475.3161 3769.7839,475.3161 C3778.9827,475.3161 3791.5426,475.3161 3806.9746,475.3161 C3837.8386,475.3161 3880.1909,475.3161 3930.1194,475.3161 C4029.9762,475.3161 4160.1375,475.3161 4289.305,475.3161 C4547.64,475.3161 4802,475.3161 4802,475.3161 C4802,475.3161 4802,551.8761 4802,630.2298 C4802,649.8183 4802,669.5188 4802,688.1633 C4802,692.8244 4802,735.5553 4802,740.0661" fill="none" id="Specs-to-Results" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="4802,746.0661,4806,737.0661,4802,741.0661,4798,737.0661,4802,746.0661" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="66.3391" x="4370.68" y="471.2131">Export TRX</text></g><!--link UnitTests to Results--><g class="link" data-entity-1="ent0053" data-entity-2="ent0115" data-link-type="dependency" data-source-line="303" id="lnk149"><path d="M3319.0987,475.3161 C3319.2122,475.3161 3319.3265,475.3161 3319.4415,475.3161 C3319.6714,475.3161 3319.9044,475.3161 3320.14,475.3161 C3320.6114,475.3161 3321.0937,475.3161 3321.585,475.3161 C3322.5677,475.3161 3323.5867,475.3161 3324.6273,475.3161 C3326.7086,475.3161 3328.8763,475.3161 3331.0125,475.3161 C3339.5575,475.3161 3347.6,475.3161 3347.6,475.3161 C3347.6,475.3161 3347.6,842.3161 3347.6,842.3161 C3347.6,842.3161 3711.2,842.3161 4074.8,842.3161 C4080.4813,842.3161 4080.1625,842.3161 4085.8424,842.3161" fill="none" id="UnitTests-to-Results" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="4091.8424,842.3161,4082.8424,838.3161,4086.8424,842.3161,4082.8424,846.3161,4091.8424,842.3161" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="178.5162" x="3716.75" y="838.2131">Export TRX (one .trx per slice)</text></g><!--link DevDB to GMN150--><g class="link" data-entity-1="ent0005" data-entity-2="ent0151" data-link-type="association" data-source-line="307" id="lnk152"><path d="M1330.2523,1216.3161 C1331.2892,1216.3161 1332.3453,1216.3161 1333.4201,1216.3161 C1342.0189,1216.3161 1351.8202,1216.3161 1362.6703,1216.3161 C1406.0706,1216.3161 1466.2513,1216.3161 1533.3725,1216.3161 C1667.615,1216.3161 1829.62,1216.3161 1940.67,1216.3161" fill="none" id="DevDB-GMN150" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link TestDB to GMN153--><g class="link" data-entity-1="ent0035" data-entity-2="ent0154" data-link-type="association" data-source-line="314" id="lnk155"><path d="M3319.1774,1083.3161 C3320.8812,1083.3161 3322.8489,1083.3161 3325.0672,1083.3161 C3333.9403,1083.3161 3346.8224,1083.3161 3362.8586,1083.3161 C3394.9309,1083.3161 3439.6194,1083.3161 3490.0838,1083.3161 C3591.0125,1083.3161 3715.045,1083.3161 3807.46,1083.3161" fill="none" id="TestDB-GMN153" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link GMN156 to DevMig--><g class="link" data-entity-1="ent0157" data-entity-2="ent0018" data-link-type="association" data-source-line="320" id="lnk158"><path d="M2085.61,512.3161 C1872.64,512.3161 1377,512.3161 1377,512.3161 C1377,512.3161 1377,578.9761 1377,647.7186 C1377,664.9042 1377,682.22 1377,698.6569 C1377,699.6842 1377,700.7081 1377,701.7283" fill="none" id="GMN156-DevMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link GMN159 to Specs--><g class="link" data-entity-1="ent0160" data-entity-2="ent0048" data-link-type="association" data-source-line="328" id="lnk161"><path d="M3807.28,259.3161 C3778.11,259.3161 3752,259.3161 3752,259.3161 C3752,259.3161 3752,271.9886 3752,291.1955 C3752,300.7989 3752,312.0359 3752,324.1393 C3752,325.6522 3752,327.1787 3752,328.7172" fill="none" id="GMN159-Specs" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><?plantuml-src lLbfSzl84VsENp7HLiMKrmH4IPjiM2jNKIGKCH6Fa9IzM-KgBWYCIAp16HWpq96K_tkwvy31oxITYZweICoRmNJtwvD_aYkwfYHDWfWvucFCqY0BrcGHX1-N6SzPrEK9pyWFD-glWeZeGv0dyeOpEGpWX4uM1qbbFOaPbIyf9JoJA-uuCfO99JqUVgGPwT4quIzhoYJi2rUnfA7CC-euhuZ_B6d6WeI85o7fMZX1A3dkUAG9JsdcX0dF8t9YJhhbGfwGGAWFZfF2lOCbXMMDLw_msMESSOQVFx16f3OsGxvEkQ1kH1_Tbs2Td9wG7_oBc_ER7lcFun32U0J7JFzrHwOqUwGPx5o7cRkEmumB_Y1TEC1R2_4fyOG2jC_Fpi-RII2faAVgId27tZMSHk0l2cIm20GSUHtJR1baah8Fh6UUbl0-Oo2LtaD82igB6JbfNLvSdAXddzL_nYKbMRnSIGEiYDWsZvgaq-twuzdSlx_hNFrMF9rsvkFETFf-DEbTlNxzkdW-c8Amyt6_TrNgsYo-uqc-fg8yUL78q0JzDL4ujKPPfExcu4KB9NR6VT85dW35b1xXkzlb6IsqX00jih8AGwETTAPZT-ZF2299wqnX0TXogehv-UpdipR-8utRsMnSd3Y6zIra2v4jZPpMeEVErwXrEePxTKSJV-uFt_Kde-707ywkAemheBth-TIVlFCdLy2JfkP9TN7O6VXN9I6gI_UmqRE6AXR-yNu69tOd_goqvs0sdhycZTRPZ-Gn02zS95ISMjFTqY2HAz9TqV2Z5S5RwOTWhPJ7vhgxJJU8braWOyu4s2tBMPEpiBGRh6xRpNBQBVSgF7njbLfUS2dvsbneaZFH9ht5VKhMnQP39kZU-Pt9lDUPTQuxK__g8KW4DOiGMa0KGJXhamsbxnPnIccqIpXyVa0wN5PG_B1Fi6v6CHwK5s-TdH4C42I7UudYyHqFbT0gJ936_TJhThp1hwS50FUuk8S4OGXXMUwGTaDrUmmQn4aQOnmCdfC4HFBM-abfLFtTY5wwp_bFfF6UBiXzVnCAJslObi8YBpUHqxLCTtiQQY1HN2QWYd05aZv0s8VeGYZUK6aWPalt42q6uxdoXixzx7Pkebzd-DjLQm_YxcxqVjuVWaFTJto3ggljSoMbpD1k1tE9if9D9f0kB_oplSaa5XnpHKHY9cHG40zVyeMaeUvHonnwqzxKSNamTTnaLAoAMn0QX2i2pc0PNFSqcUNqcAo0cYZJ0Y4DccATaGN9wR7HfioZADxHeMQdSzVFEiQpzpZq86Rn6eiJmBHtU2TdoKlns1S2JeQoY7mvGRhJb8OeTfz9QeHHbnNwtcfv-z8J-ebbF4d8Z-JvdiMon7O1jDlWwjJoyXEwZ8KqRtn8-5CbAYtZZKVlWYIED3JB8SyK2vTdbsGLi0ZAlgKboBq0TgZNTTBuHjLnLZa3S1nOyvLhOuYEGteeREKWct8lLD4D15Me5eNxsbMol06rKz2AgJ2qmb0RQdLRQKfJeB41_rH0zwlhEeyJYB2wtdo84-tcyDAdLHok30Xk0z9HuIqqEbW6w56gU755mfuD3gfjr1mJvFU8IwYG5NT-Lx4EweT2FrP4puX8qep_0KKo-2c11LQQhr169vSh3TvUkyxe4yrY-BG70ARA1W63E8UHRHzAcSkUKJCog998JjQW91r151TezaeK2e886IC3F6DkYEsOkoWBuu97Gmv0uoygy37mCnfz8J2FCnxbeIBbmV0CEepAyDprB_tk_wpMnpjyJR6lyIfa_nygUlyv1Vk9lP4R9DE2uSsRgAVI82jeh5Gs8Mc-I6Anef7xRHKZolnL9QFPiA-wsbtgaOOkRrzEInamN1De9rFqdxIWY_lDJGlUxEYknO2Fw5mGUMphOh7dtz-wb0wqtRbusADukxiHfEDqwatycua_lVMwe-5DVpBepFgZuNms-gS_tEnLtllNq_xCdsCjCR-Vt3b7Mf8q3J3YLA2iv2c040uENnQz7XfvjqKjyPhDjzPHswJbOjzHhvgjMMl0SnU9m33w_bdbAbevqirJjuBLCKtCbIRjQVinJetMX3yOb9BYbyLR_4Q6L3xnx2DfBB8uMjAs8Z2aZjDVlCLRXUpRMl8XupYPUVHKZy7qHg6LOfr-XxE_qHJAbrGsGuZUr8Q0Gf7LS6kzjOd5pXU6AujojjBp_thpbztnLdS9Yn6SzrK34xFZcCBto9vMdVXzjUQk4u-iE3_l88GLKcsUugGDx8k5mwEsfmVrw1AS8j0vTCzqwmtmdEKQ4gGn93G8Jv2YYUd-m3Un146wO06dOAQ4WPAbDCPJB5Syrp4616K0LW2CZbM-mETIb-XDXNLtErv5JHjey3xrs9JGvQdQgoh8ckzL3gm2SMCDMIMsBUuFKXhqM6tn_jQzFC1fEF5h2AtWnqm0ZsCp7FUDL3RjUd7A_f60Hx3RFyOJu9plS0Eb6hNJmg60j-J5GFG6TY0DpUacSHjUGro4jWh86MqCwIp90qPiWiVm2is8A9fWuBk88pkxtgIvKJAoLbjxDy6jz5NS1hNDIPgk5bCZjJsaWEoYymDF8X3yHBNWKFNbYHGULhGuDeBDEcvecqpqih89jZRa1893Ks3_25jKMuFhhioUA_XMWTxHV6nWpxUn6yt8neQBxGsxcfEDNPVRkwhDoWRwfms2AJFF9hyYLzQ1PiQ41X6EKidYHTTFqFp68iSXbSoZc9jddN_3ot32DKg5UVJtMDxc2z89hUshMRJo0qSG8isSOjgkk84_Ow19zQyR9kYGF7NKWegDUbxU9YifqxRd9JWvmo9TLPFuXkfl7xKcounipIbxk6f7drLKZQdc0jNrY-qIoQ1SzsrrgDWcbwwUMD-EfZDlF9hCxArCc3OdLZXjBrG0jbXltsK12bulj5wfEKHT7NQkX9AOkPjIY0wBr2bcHJM0qOMZ9pAr9L13TNo37kYKSmXKHG4jxwO2b92G3_Bq0-CPE2zcLLLSDR2lngPQlFd0c6cEGwrfUCEfKyYWPTznV2b52TbIe9Qb16mhi2B60PHLiuaRX3vZigYeoWQSDhY1wYd1wofdxuEG1avuq8i9Eef8OiWg-3PR6wDx2MUpT48kEQgGXe_RTNJzLonRJgC5bN_sXbFq_6Qj8m79UF88zPRa19DzENLIK0YVTGpoie8fCyV6NRNbz6ML2W_TLeqTp7KxYPwDbnbL43jRhhpk5OGjHJ5mpqyvnKblHMUIfqPXG0qur697o4PK0dX5MThOleo4-AiI2dvkdGOZ22aJFonTcD1HUmX101NJI3XRDaqTkQKSSob57aUFBO4IDCpnBUsAw2fLgyu-o88aeOb32XO5osL6btLb_1S0?></g></svg>