Files
the-biergarten-app/docs/pipeline/diagrams/planned/output/class.svg

1 line
257 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="CLASS" height="3502px" preserveAspectRatio="none" style="width:21522px;height:3502px;background:#FCFCF7;" version="1.1" viewBox="0 0 21522 3502" width="21522px" zoomAndPan="magnify"><?plantuml 1.2026.3?><defs/><g><rect fill="#FCFCF7" height="3502" style="stroke:none;stroke-width:1;" width="21522" x="0" y="0"/><g class="title" data-source-line="10"><text fill="#14180C" font-family="'Volkhov'" font-size="30" font-weight="700" lengthAdjust="spacing" textLength="625.41" x="10444.795" y="39.13">Biergarten Data Pipeline &#8212; Class Diagram</text></g><!--cluster Domain: Models--><g class="cluster" data-qualified-name="Domain. Models" data-source-line="12" id="ent0002"><rect fill="#F1F3EA" height="2046.6" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:1.5;" width="5441" x="7" y="962.15"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" font-weight="700" lengthAdjust="spacing" textLength="194.3639" x="2630.3181" y="988.95">Domain: Models</text></g><!--cluster Domain: Application Configuration--><g class="cluster" data-qualified-name="Domain. Application Configuration" data-source-line="220" id="ent0038"><rect fill="#F1F3EA" height="1364.32" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:1.5;" width="1001" x="6762" y="2075.2"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" font-weight="700" lengthAdjust="spacing" textLength="422.3181" x="7051.3409" y="2102">Domain: Application Configuration</text></g><!--cluster Domain: Policy--><g class="cluster" data-qualified-name="Domain. Policy" data-source-line="250" id="ent0046"><rect fill="#F1F3EA" height="751.62" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:1.5;" width="6914" x="9962" y="2736.73"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" font-weight="700" lengthAdjust="spacing" textLength="179.9894" x="13329.0053" y="2763.53">Domain: Policy</text></g><!--cluster Infrastructure: Logging--><g class="cluster" data-qualified-name="Infrastructure. Logging" data-source-line="328" id="ent0060"><rect fill="#F1F3EA" height="2712.12" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:1.5;" width="1143" x="20365" y="361.73"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" font-weight="700" lengthAdjust="spacing" textLength="281.1926" x="20795.9037" y="388.53">Infrastructure: Logging</text></g><!--cluster Infrastructure: Pipeline Channel--><g class="cluster" data-qualified-name="Infrastructure. Pipeline Channel" data-source-line="376" id="ent0072"><rect fill="#F1F3EA" height="418.5" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:1.5;" width="492" x="5472" y="2687.9"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" font-weight="700" lengthAdjust="spacing" textLength="389.5849" x="5523.2076" y="2714.7">Infrastructure: Pipeline Channel</text></g><!--cluster Infrastructure: Data Preloading--><g class="cluster" data-qualified-name="Infrastructure. Data Preloading" data-source-line="392" id="ent0074"><rect fill="#F1F3EA" height="1148.95" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:1.5;" width="4519" x="10225" y="1165.73"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" font-weight="700" lengthAdjust="spacing" textLength="379.4096" x="12294.7952" y="1192.53">Infrastructure: Data Preloading</text></g><!--cluster Infrastructure: Enrichment--><g class="cluster" data-qualified-name="Infrastructure. Enrichment" data-source-line="433" id="ent0084"><rect fill="#F1F3EA" height="2176.15" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:1.5;" width="772" x="9166" y="1214.55"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" font-weight="700" lengthAdjust="spacing" textLength="327.4847" x="9388.2577" y="1241.35">Infrastructure: Enrichment</text></g><!--cluster Infrastructure: Postal Code Generation--><g class="cluster" data-qualified-name="Infrastructure. Postal Code Generation" data-source-line="458" id="ent0089"><rect fill="#F1F3EA" height="1084.3" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:1.5;" width="2607" x="17734" y="361.73"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" font-weight="700" lengthAdjust="spacing" textLength="476.0886" x="18799.4557" y="388.53">Infrastructure: Postal Code Generation</text></g><!--cluster Infrastructure: Prompting--><g class="cluster" data-qualified-name="Infrastructure. Prompting" data-source-line="491" id="ent0101"><rect fill="#F1F3EA" height="621.42" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:1.5;" width="750" x="5988" y="2801.83"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" font-weight="700" lengthAdjust="spacing" textLength="313.7122" x="6206.1439" y="2828.63">Infrastructure: Prompting</text></g><!--cluster Infrastructure: Data Generation--><g class="cluster" data-qualified-name="Infrastructure. Data Generation" data-source-line="507" id="ent0105"><rect fill="#F1F3EA" height="2387.72" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:1.5;" width="1355" x="7787" y="1002.98"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" font-weight="700" lengthAdjust="spacing" textLength="386.8423" x="8271.0789" y="1029.78">Infrastructure: Data Generation</text></g><!--cluster Infrastructure: Data Export--><g class="cluster" data-qualified-name="Infrastructure. Data Export" data-source-line="554" id="ent0111"><rect fill="#F1F3EA" height="2257.53" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:1.5;" width="810" x="16900" y="1116.9"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" font-weight="700" lengthAdjust="spacing" textLength="330.2099" x="17139.895" y="1143.7">Infrastructure: Data Export</text></g><!--class City--><g class="entity" data-qualified-name="Domain. Models.City" data-source-line="14" id="ent0003"><rect fill="#EBECE3" height="384.05" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="587.007" x="2126.5" y="1996"/><ellipse cx="2391.1941" cy="2017.275" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M2394.8899,2026.0001 Q2394.0354,2026.4396 2393.0955,2026.6593 Q2392.1555,2026.879 2391.1179,2026.879 Q2387.4314,2026.879 2385.4905,2024.4498 Q2383.5496,2022.0206 2383.5496,2017.4308 Q2383.5496,2012.8287 2385.4905,2010.3995 Q2387.4314,2007.9703 2391.1179,2007.9703 Q2392.1555,2007.9703 2393.1077,2008.19 Q2394.0598,2008.4098 2394.8899,2008.8492 L2394.8899,2012.8531 Q2393.9622,2011.9986 2393.0894,2011.6019 Q2392.2166,2011.2052 2391.2888,2011.2052 Q2389.3113,2011.2052 2388.3042,2012.7738 Q2387.2971,2014.3424 2387.2971,2017.4308 Q2387.2971,2020.5069 2388.3042,2022.0755 Q2389.3113,2023.6441 2391.2888,2023.6441 Q2392.2166,2023.6441 2393.0894,2023.2474 Q2393.9622,2022.8507 2394.8899,2021.9962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="47.6188" x="2416.1941" y="2025.8">City</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="2127.5" x2="2712.507" y1="2038.55" y2="2038.55"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2137.5" cy="2060.325" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="176.3005" x="2149.5" y="2067.35">city : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2137.5" cy="2092.875" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="310.5132" x="2149.5" y="2099.9">state_province : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2137.5" cy="2125.425" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="250.5943" x="2149.5" y="2132.45">iso3166_2 : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2137.5" cy="2157.975" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="223.0569" x="2149.5" y="2165">country : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2137.5" cy="2190.525" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="243.9881" x="2149.5" y="2197.55">iso3166_1 : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2137.5" cy="2223.075" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="436.0072" x="2149.5" y="2230.1">postal_regex : std::vector&lt;std::string&gt;</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2137.5" cy="2255.625" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="558.007" x="2149.5" y="2262.65">postal_code_examples : std::vector&lt;std::string&gt;</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2137.5" cy="2288.175" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="469.9635" x="2149.5" y="2295.2">local_languages : std::vector&lt;std::string&gt;</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2137.5" cy="2320.725" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="187.5939" x="2149.5" y="2327.75">latitude : double</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2137.5" cy="2353.275" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="207.3065" x="2149.5" y="2360.3">longitude : double</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="2127.5" x2="2712.507" y1="2372.05" y2="2372.05"/></g><g class="entity" data-qualified-name="Domain. Models.GMN4" data-source-line="28" id="ent0005"><path d="M2748.04,2069.1 L2748.04,2184.03 L2713.9,2188.03 L2748.04,2192.03 L2748.04,2306.95 A0,0 0 0 0 2748.04,2306.95 L3373.9528,2306.95 A0,0 0 0 0 3373.9528,2306.95 L3373.9528,2079.1 L3363.9528,2069.1 L2748.04,2069.1 A0,0 0 0 0 2748.04,2069.1" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3363.9528,2069.1 L3363.9528,2079.1 L3373.9528,2079.1 L3363.9528,2069.1" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="493.8688" x="2754.04" y="2098.9">postal_regex / postal_code_examples are</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="426.6321" x="2754.04" y="2131.45">sourced from each cities.json entry's</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="563.0627" x="2754.04" y="2164">postal_code.city_regex / postal_code.examples</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="527.407" x="2754.04" y="2196.55">(implemented today, ahead of the rest of this</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="604.9128" x="2754.04" y="2229.1">diagram -- see ROADMAP.md &#167;1/&#167;2). Renamed from</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="522.7944" x="2754.04" y="2261.65">Location to City to match the web backend's</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="546.5191" x="2754.04" y="2294.2">City/CityId vocabulary -- see ROADMAP.md &#167;1.</text></g><!--class Address--><g class="entity" data-qualified-name="Domain. Models.Address" data-source-line="37" id="ent0007"><rect fill="#EBECE3" height="91.1" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="308.8567" x="1160.57" y="2142.48"/><ellipse cx="1261.7389" cy="2163.755" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M1265.4347,2172.4801 Q1264.5802,2172.9196 1263.6403,2173.1393 Q1262.7003,2173.359 1261.6627,2173.359 Q1257.9762,2173.359 1256.0353,2170.9298 Q1254.0944,2168.5006 1254.0944,2163.9108 Q1254.0944,2159.3087 1256.0353,2156.8795 Q1257.9762,2154.4503 1261.6627,2154.4503 Q1262.7003,2154.4503 1263.6525,2154.67 Q1264.6046,2154.8898 1265.4347,2155.3292 L1265.4347,2159.3331 Q1264.507,2158.4786 1263.6342,2158.0819 Q1262.7614,2157.6852 1261.8336,2157.6852 Q1259.8561,2157.6852 1258.849,2159.2538 Q1257.8419,2160.8224 1257.8419,2163.9108 Q1257.8419,2166.9869 1258.849,2168.5555 Q1259.8561,2170.1241 1261.8336,2170.1241 Q1262.7614,2170.1241 1263.6342,2169.7274 Q1264.507,2169.3307 1265.4347,2168.4762 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="96.5188" x="1286.7389" y="2172.28">Address</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="1161.57" x2="1468.4267" y1="2185.03" y2="2185.03"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1171.57" cy="2206.805" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="279.8567" x="1183.57" y="2213.83">postal_code : std::string</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="1161.57" x2="1468.4267" y1="2225.58" y2="2225.58"/></g><g class="entity" data-qualified-name="Domain. Models.GMN8" data-source-line="42" id="ent0009"><path d="M1504.81,2117.93 L1504.81,2184.03 L1469.71,2188.03 L1504.81,2192.03 L1504.81,2258.13 A0,0 0 0 0 1504.81,2258.13 L2091.186,2258.13 A0,0 0 0 0 2091.186,2258.13 L2091.186,2127.93 L2081.186,2117.93 L1504.81,2117.93 A0,0 0 0 0 1504.81,2117.93" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M2081.186,2117.93 L2081.186,2127.93 L2091.186,2127.93 L2081.186,2117.93" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="565.376" x="1510.81" y="2147.73">Mirrors the web backend's BreweryPostLocation.</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="466.719" x="1510.81" y="2180.28">Only postal_code is populated today --</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="511.1882" x="1510.81" y="2212.83">address_line1/address_line2 have no fixture</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="514.2443" x="1510.81" y="2245.38">data or generator yet. See ROADMAP.md &#167;9.</text></g><!--class LocationContext--><g class="entity" data-qualified-name="Domain. Models.LocationContext" data-source-line="48" id="ent0011"><rect fill="#EBECE3" height="156.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="379.9814" x="346.01" y="2109.93"/><ellipse cx="433.9287" cy="2131.205" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M437.6245,2139.9301 Q436.77,2140.3696 435.83,2140.5893 Q434.8901,2140.809 433.8525,2140.809 Q430.166,2140.809 428.2251,2138.3798 Q426.2841,2135.9506 426.2841,2131.3608 Q426.2841,2126.7587 428.2251,2124.3295 Q430.166,2121.9003 433.8525,2121.9003 Q434.8901,2121.9003 435.8423,2122.12 Q436.7944,2122.3398 437.6245,2122.7792 L437.6245,2126.7831 Q436.6967,2125.9286 435.8239,2125.5319 Q434.9511,2125.1352 434.0234,2125.1352 Q432.0459,2125.1352 431.0388,2126.7038 Q430.0317,2128.2724 430.0317,2131.3608 Q430.0317,2134.4369 431.0388,2136.0055 Q432.0459,2137.5741 434.0234,2137.5741 Q434.9511,2137.5741 435.8239,2137.1774 Q436.6967,2136.7807 437.6245,2135.9262 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="194.144" x="458.9287" y="2139.73">LocationContext</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="347.01" x2="724.9914" y1="2152.48" y2="2152.48"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="357.01" cy="2174.255" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="178.5193" x="369.01" y="2181.28">text : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="357.01" cy="2206.805" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="350.9814" x="369.01" y="2213.83">completeness : Completeness</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="357.01" cy="2239.355" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="224.4503" x="369.01" y="2246.38">char_count : size_t</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="347.01" x2="724.9914" y1="2258.13" y2="2258.13"/></g><!--class Completeness--><g class="entity" data-qualified-name="Domain. Models.Completeness" data-source-line="54" id="ent0012"><rect fill="#EBECE3" height="156.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="206.1375" x="432.93" y="2836.55"/><ellipse cx="450.93" cy="2857.825" fill="#EB937F" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M456.8333,2867.325 L445.4808,2867.325 L445.4808,2849.0999 L456.8333,2849.0999 L456.8333,2852.2737 L449.0819,2852.2737 L449.0819,2856.2044 L456.1009,2856.2044 L456.1009,2859.3782 L449.0819,2859.3782 L449.0819,2864.1512 L456.8333,2864.1512 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="168.1375" x="467.93" y="2866.35">Completeness</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="433.93" x2="638.0675" y1="2879.1" y2="2879.1"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="38.8626" x="438.93" y="2907.9">Full</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="72.319" x="438.93" y="2940.45">Partial</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="83.1626" x="438.93" y="2973">Absent</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="433.93" x2="638.0675" y1="2984.75" y2="2984.75"/></g><!--class EnrichedCity--><g class="entity" data-qualified-name="Domain. Models.EnrichedCity" data-source-line="60" id="ent0013"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="331.1505" x="1020.42" y="1281.83"/><ellipse cx="1106.067" cy="1303.105" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M1109.7628,1311.8301 Q1108.9083,1312.2696 1107.9684,1312.4893 Q1107.0284,1312.709 1105.9908,1312.709 Q1102.3043,1312.709 1100.3634,1310.2798 Q1098.4225,1307.8506 1098.4225,1303.2608 Q1098.4225,1298.6587 1100.3634,1296.2295 Q1102.3043,1293.8003 1105.9908,1293.8003 Q1107.0284,1293.8003 1107.9806,1294.02 Q1108.9327,1294.2398 1109.7628,1294.6792 L1109.7628,1298.6831 Q1108.8351,1297.8286 1107.9623,1297.4319 Q1107.0895,1297.0352 1106.1617,1297.0352 Q1104.1842,1297.0352 1103.1771,1298.6038 Q1102.17,1300.1724 1102.17,1303.2608 Q1102.17,1306.3369 1103.1771,1307.9055 Q1104.1842,1309.4741 1106.1617,1309.4741 Q1107.0895,1309.4741 1107.9623,1309.0774 Q1108.8351,1308.6807 1109.7628,1307.8262 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="149.8564" x="1131.067" y="1311.63">EnrichedCity</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="1021.42" x2="1350.5705" y1="1324.38" y2="1324.38"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1031.42" cy="1346.155" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="159.219" x="1043.42" y="1353.18">location : City</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1031.42" cy="1378.705" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="302.1505" x="1043.42" y="1385.73">context : LocationContext</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="1021.42" x2="1350.5705" y1="1397.48" y2="1397.48"/></g><!--class BeerStyle--><g class="entity" data-qualified-name="Domain. Models.BeerStyle" data-source-line="65" id="ent0014"><rect fill="#EBECE3" height="253.85" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="293.8943" x="3808.05" y="2061.1"/><ellipse cx="3894.6408" cy="2082.375" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M3898.3366,2091.1001 Q3897.4822,2091.5396 3896.5422,2091.7593 Q3895.6023,2091.979 3894.5647,2091.979 Q3890.8781,2091.979 3888.9372,2089.5498 Q3886.9963,2087.1206 3886.9963,2082.5308 Q3886.9963,2077.9287 3888.9372,2075.4995 Q3890.8781,2073.0703 3894.5647,2073.0703 Q3895.6023,2073.0703 3896.5544,2073.29 Q3897.5066,2073.5098 3898.3366,2073.9492 L3898.3366,2077.9531 Q3897.4089,2077.0986 3896.5361,2076.7019 Q3895.6633,2076.3052 3894.7356,2076.3052 Q3892.758,2076.3052 3891.751,2077.8738 Q3890.7439,2079.4424 3890.7439,2082.5308 Q3890.7439,2085.6069 3891.751,2087.1755 Q3892.758,2088.7441 3894.7356,2088.7441 Q3895.6633,2088.7441 3896.5361,2088.3474 Q3897.4089,2087.9507 3898.3366,2087.0962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="110.7127" x="3919.6408" y="2090.9">BeerStyle</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="3809.05" x2="4100.9443" y1="2103.65" y2="2103.65"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3819.05" cy="2125.425" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="196.7442" x="3831.05" y="2132.45">name : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3819.05" cy="2157.975" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="264.8943" x="3831.05" y="2165">description : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3819.05" cy="2190.525" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="172.194" x="3831.05" y="2197.55">min_abv : float</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3819.05" cy="2223.075" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="177.8814" x="3831.05" y="2230.1">max_abv : float</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3819.05" cy="2255.625" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="143.55" x="3831.05" y="2262.65">min_ibu : int</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3819.05" cy="2288.175" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="149.2375" x="3831.05" y="2295.2">max_ibu : int</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="3809.05" x2="4100.9443" y1="2306.95" y2="2306.95"/></g><!--class BreweryResult--><g class="entity" data-qualified-name="Domain. Models.BreweryResult" data-source-line="74" id="ent0015"><rect fill="#EBECE3" height="188.75" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="364.2819" x="760.86" y="2093.65"/><ellipse cx="854.8695" cy="2114.925" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M858.5653,2123.6501 Q857.7108,2124.0896 856.7709,2124.3093 Q855.8309,2124.529 854.7933,2124.529 Q851.1068,2124.529 849.1659,2122.0998 Q847.225,2119.6706 847.225,2115.0808 Q847.225,2110.4787 849.1659,2108.0495 Q851.1068,2105.6203 854.7933,2105.6203 Q855.8309,2105.6203 856.7831,2105.84 Q857.7352,2106.0598 858.5653,2106.4992 L858.5653,2110.5031 Q857.6376,2109.6486 856.7648,2109.2519 Q855.892,2108.8552 854.9642,2108.8552 Q852.9867,2108.8552 851.9796,2110.4238 Q850.9725,2111.9924 850.9725,2115.0808 Q850.9725,2118.1569 851.9796,2119.7255 Q852.9867,2121.2941 854.9642,2121.2941 Q855.892,2121.2941 856.7648,2120.8974 Q857.6376,2120.5007 858.5653,2119.6462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="166.2629" x="879.8695" y="2123.45">BreweryResult</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="761.86" x2="1124.1419" y1="2136.2" y2="2136.2"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="771.86" cy="2157.975" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="241.7941" x="783.86" y="2165">name_en : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="771.86" cy="2190.525" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="309.9443" x="783.86" y="2197.55">description_en : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="771.86" cy="2223.075" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="267.1317" x="783.86" y="2230.1">name_local : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="771.86" cy="2255.625" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="335.2819" x="783.86" y="2262.65">description_local : std::string</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="761.86" x2="1124.1419" y1="2274.4" y2="2274.4"/></g><!--class BeerResult--><g class="entity" data-qualified-name="Domain. Models.BeerResult" data-source-line="81" id="ent0016"><rect fill="#EBECE3" height="286.4" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="364.2819" x="3408.86" y="2044.83"/><ellipse cx="3523.9758" cy="2066.105" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M3527.6716,2074.8301 Q3526.8171,2075.2696 3525.8772,2075.4893 Q3524.9373,2075.709 3523.8997,2075.709 Q3520.2131,2075.709 3518.2722,2073.2798 Q3516.3313,2070.8506 3516.3313,2066.2608 Q3516.3313,2061.6587 3518.2722,2059.2295 Q3520.2131,2056.8003 3523.8997,2056.8003 Q3524.9373,2056.8003 3525.8894,2057.02 Q3526.8416,2057.2398 3527.6716,2057.6792 L3527.6716,2061.6831 Q3526.7439,2060.8286 3525.8711,2060.4319 Q3524.9983,2060.0352 3524.0706,2060.0352 Q3522.093,2060.0352 3521.0859,2061.6038 Q3520.0789,2063.1724 3520.0789,2066.2608 Q3520.0789,2069.3369 3521.0859,2070.9055 Q3522.093,2072.4741 3524.0706,2072.4741 Q3524.9983,2072.4741 3525.8711,2072.0774 Q3526.7439,2071.6807 3527.6716,2070.8262 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="124.0502" x="3548.9758" y="2074.63">BeerResult</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="3409.86" x2="3772.1419" y1="2087.38" y2="2087.38"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3419.86" cy="2109.155" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="241.7941" x="3431.86" y="2116.18">name_en : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3419.86" cy="2141.705" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="309.9443" x="3431.86" y="2148.73">description_en : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3419.86" cy="2174.255" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="267.1317" x="3431.86" y="2181.28">name_local : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3419.86" cy="2206.805" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="335.2819" x="3431.86" y="2213.83">description_local : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3419.86" cy="2239.355" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="188.3568" x="3431.86" y="2246.38">style : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3419.86" cy="2271.905" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="113.0878" x="3431.86" y="2278.93">abv : float</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3419.86" cy="2304.455" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="84.4439" x="3431.86" y="2311.48">ibu : int</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="3409.86" x2="3772.1419" y1="2323.23" y2="2323.23"/></g><!--class UserResult--><g class="entity" data-qualified-name="Domain. Models.UserResult" data-source-line="91" id="ent0017"><rect fill="#EBECE3" height="253.85" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="288.3318" x="4136.83" y="2061.1"/><ellipse cx="4214.1395" cy="2082.375" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M4217.8353,2091.1001 Q4216.9808,2091.5396 4216.0409,2091.7593 Q4215.101,2091.979 4214.0634,2091.979 Q4210.3768,2091.979 4208.4359,2089.5498 Q4206.495,2087.1206 4206.495,2082.5308 Q4206.495,2077.9287 4208.4359,2075.4995 Q4210.3768,2073.0703 4214.0634,2073.0703 Q4215.101,2073.0703 4216.0531,2073.29 Q4217.0053,2073.5098 4217.8353,2073.9492 L4217.8353,2077.9531 Q4216.9076,2077.0986 4216.0348,2076.7019 Q4215.162,2076.3052 4214.2343,2076.3052 Q4212.2567,2076.3052 4211.2496,2077.8738 Q4210.2426,2079.4424 4210.2426,2082.5308 Q4210.2426,2085.6069 4211.2496,2087.1755 Q4212.2567,2088.7441 4214.2343,2088.7441 Q4215.162,2088.7441 4216.0348,2088.3474 Q4216.9076,2087.9507 4217.8353,2087.0962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="123.7127" x="4239.1395" y="2090.9">UserResult</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4137.83" x2="4424.1618" y1="2103.65" y2="2103.65"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4147.83" cy="2125.425" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="259.3318" x="4159.83" y="2132.45">first_name : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4147.83" cy="2157.975" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="254.7817" x="4159.83" y="2165">last_name : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4147.83" cy="2190.525" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="213.9318" x="4159.83" y="2197.55">gender : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4147.83" cy="2223.075" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="247.0818" x="4159.83" y="2230.1">username : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4147.83" cy="2255.625" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="168.8004" x="4159.83" y="2262.65">bio : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4147.83" cy="2288.175" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="251.0506" x="4159.83" y="2295.2">activity_weight : float</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4137.83" x2="4424.1618" y1="2306.95" y2="2306.95"/></g><!--class Name--><g class="entity" data-qualified-name="Domain. Models.Name" data-source-line="100" id="ent0018"><rect fill="#EBECE3" height="156.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="288.3318" x="22.83" y="2109.93"/><ellipse cx="128.3209" cy="2131.205" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M132.0167,2139.9301 Q131.1622,2140.3696 130.2223,2140.5893 Q129.2823,2140.809 128.2447,2140.809 Q124.5582,2140.809 122.6173,2138.3798 Q120.6764,2135.9506 120.6764,2131.3608 Q120.6764,2126.7587 122.6173,2124.3295 Q124.5582,2121.9003 128.2447,2121.9003 Q129.2823,2121.9003 130.2345,2122.12 Q131.1866,2122.3398 132.0167,2122.7792 L132.0167,2126.7831 Q131.089,2125.9286 130.2162,2125.5319 Q129.3434,2125.1352 128.4156,2125.1352 Q126.4381,2125.1352 125.431,2126.7038 Q124.4239,2128.2724 124.4239,2131.3608 Q124.4239,2134.4369 125.431,2136.0055 Q126.4381,2137.5741 128.4156,2137.5741 Q129.3434,2137.5741 130.2162,2137.1774 Q131.089,2136.7807 132.0167,2135.9262 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="67.35" x="153.3209" y="2139.73">Name</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="23.83" x2="310.1618" y1="2152.48" y2="2152.48"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="33.83" cy="2174.255" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="259.3318" x="45.83" y="2181.28">first_name : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="33.83" cy="2206.805" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="254.7817" x="45.83" y="2213.83">last_name : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="33.83" cy="2239.355" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="213.9318" x="45.83" y="2246.38">gender : std::string</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="23.83" x2="310.1618" y1="2258.13" y2="2258.13"/></g><!--class ForenameEntry--><g class="entity" data-qualified-name="Domain. Models.ForenameEntry" data-source-line="106" id="ent0019"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="242.9318" x="38.53" y="1281.83"/><ellipse cx="68.8742" cy="1303.105" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M72.57,1311.8301 Q71.7155,1312.2696 70.7756,1312.4893 Q69.8356,1312.709 68.798,1312.709 Q65.1115,1312.709 63.1706,1310.2798 Q61.2297,1307.8506 61.2297,1303.2608 Q61.2297,1298.6587 63.1706,1296.2295 Q65.1115,1293.8003 68.798,1293.8003 Q69.8356,1293.8003 70.7878,1294.02 Q71.7399,1294.2398 72.57,1294.6792 L72.57,1298.6831 Q71.6423,1297.8286 70.7695,1297.4319 Q69.8967,1297.0352 68.9689,1297.0352 Q66.9914,1297.0352 65.9843,1298.6038 Q64.9772,1300.1724 64.9772,1303.2608 Q64.9772,1306.3369 65.9843,1307.9055 Q66.9914,1309.4741 68.9689,1309.4741 Q69.8967,1309.4741 70.7695,1309.0774 Q71.6423,1308.6807 72.57,1307.8262 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="177.5003" x="88.6173" y="1311.63">ForenameEntry</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="39.53" x2="280.4618" y1="1324.38" y2="1324.38"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="49.53" cy="1346.155" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="196.7442" x="61.53" y="1353.18">name : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="49.53" cy="1378.705" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="213.9318" x="61.53" y="1385.73">gender : std::string</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="39.53" x2="280.4618" y1="1397.48" y2="1397.48"/></g><g class="entity" data-qualified-name="Domain. Models.GMN20" data-source-line="112" id="ent0021"><path d="M316.35,1013.15 L316.35,1339.65 L281.79,1343.65 L316.35,1347.65 L316.35,1674.15 A0,0 0 0 0 316.35,1674.15 L985.6562,1674.15 A0,0 0 0 0 985.6562,1674.15 L985.6562,1023.15 L975.6562,1013.15 L316.35,1013.15 A0,0 0 0 0 316.35,1013.15" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M975.6562,1013.15 L975.6562,1023.15 L985.6562,1023.15 L975.6562,1013.15" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="616.6007" x="322.35" y="1042.95">forename_list = std::unordered_set&lt;ForenameEntry&gt;</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="542.4258" x="322.35" y="1075.5">surname_list = std::unordered_set&lt;std::string&gt;</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="524.2569" x="322.35" y="1108.05">(aliases declared in curated_data_service.h).</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="594.8633" x="322.35" y="1140.6">ICuratedDataService::LoadForenamesByCountry() /</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="519.6198" x="322.35" y="1173.15">LoadSurnamesByCountry() each return a flat</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="552.2133" x="322.35" y="1205.7">std::unordered_map&lt;std::string, forename_list&gt;</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="494.1944" x="322.35" y="1238.25">or &lt;std::string, surname_list&gt; keyed by ISO</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="517.7883" x="322.35" y="1270.8">3166-1 country code -- no NamesByCountry</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="617.6506" x="322.35" y="1303.35">wrapper class. SampleName(forenames_by_country,</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="545.5947" x="322.35" y="1335.9">surnames_by_country, iso3166_1, rng) is a free</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="522.8508" x="322.35" y="1368.45">function, not a method, so it can be called by</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="535.645" x="322.35" y="1401">any per-city worker without owning the maps.</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="594.7695" x="322.35" y="1433.55">Sourced from popular-names-by-country-dataset</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="648.3062" x="322.35" y="1466.1">(CC0) -- see ETHICS-AND-KNOWN-ISSUES.md. Gender</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="562.2759" x="322.35" y="1498.65">is preserved per forename so it can be threaded</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="585.1638" x="322.35" y="1531.2">through to persona/bio generation later; surnames</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="491.0262" x="322.35" y="1563.75">carry no gender in the source data. Pairing</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="565.1822" x="322.35" y="1596.3">happens at sample time, not at fixture-authoring</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="555.5637" x="322.35" y="1628.85">time, so no information from the source dataset</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="247.0692" x="322.35" y="1661.4">is discarded up front.</text></g><!--class CheckinResult--><g class="entity" data-qualified-name="Domain. Models.CheckinResult" data-source-line="136" id="ent0024"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="337.7003" x="4845.15" y="2126.2"/><ellipse cx="4926.4782" cy="2147.475" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M4930.174,2156.2001 Q4929.3195,2156.6396 4928.3796,2156.8593 Q4927.4396,2157.079 4926.4021,2157.079 Q4922.7155,2157.079 4920.7746,2154.6498 Q4918.8337,2152.2206 4918.8337,2147.6308 Q4918.8337,2143.0287 4920.7746,2140.5995 Q4922.7155,2138.1703 4926.4021,2138.1703 Q4927.4396,2138.1703 4928.3918,2138.39 Q4929.3439,2138.6098 4930.174,2139.0492 L4930.174,2143.0531 Q4929.2463,2142.1986 4928.3735,2141.8019 Q4927.5007,2141.4052 4926.573,2141.4052 Q4924.5954,2141.4052 4923.5883,2142.9738 Q4922.5813,2144.5424 4922.5813,2147.6308 Q4922.5813,2150.7069 4923.5883,2152.2755 Q4924.5954,2153.8441 4926.573,2153.8441 Q4927.5007,2153.8441 4928.3735,2153.4474 Q4929.2463,2153.0507 4930.174,2152.1962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="165.0439" x="4951.4782" y="2156">CheckinResult</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4846.15" x2="5181.8503" y1="2168.75" y2="2168.75"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4856.15" cy="2190.525" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="308.7003" x="4868.15" y="2197.55">checked_in_at : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4856.15" cy="2223.075" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="185.488" x="4868.15" y="2230.1">note : std::string</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4846.15" x2="5181.8503" y1="2241.85" y2="2241.85"/></g><!--class RatingResult--><g class="entity" data-qualified-name="Domain. Models.RatingResult" data-source-line="141" id="ent0025"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="214.488" x="5217.76" y="2126.2"/><ellipse cx="5250.4498" cy="2147.475" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M5254.1456,2156.2001 Q5253.2911,2156.6396 5252.3512,2156.8593 Q5251.4112,2157.079 5250.3736,2157.079 Q5246.6871,2157.079 5244.7462,2154.6498 Q5242.8053,2152.2206 5242.8053,2147.6308 Q5242.8053,2143.0287 5244.7462,2140.5995 Q5246.6871,2138.1703 5250.3736,2138.1703 Q5251.4112,2138.1703 5252.3634,2138.39 Q5253.3155,2138.6098 5254.1456,2139.0492 L5254.1456,2143.0531 Q5253.2179,2142.1986 5252.3451,2141.8019 Q5251.4723,2141.4052 5250.5445,2141.4052 Q5248.567,2141.4052 5247.5599,2142.9738 Q5246.5528,2144.5424 5246.5528,2147.6308 Q5246.5528,2150.7069 5247.5599,2152.2755 Q5248.567,2153.8441 5250.5445,2153.8441 Q5251.4723,2153.8441 5252.3451,2153.4474 Q5253.2179,2153.0507 5254.1456,2152.1962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="143.8441" x="5270.7142" y="2156">RatingResult</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="5218.76" x2="5431.248" y1="2168.75" y2="2168.75"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="5228.76" cy="2190.525" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="135.7816" x="5240.76" y="2197.55">score : float</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="5228.76" cy="2223.075" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="185.488" x="5240.76" y="2230.1">note : std::string</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="5218.76" x2="5431.248" y1="2241.85" y2="2241.85"/></g><!--class GenerationMetadata--><g class="entity" data-qualified-name="Domain. Models.GenerationMetadata" data-source-line="146" id="ent0026"><rect fill="#EBECE3" height="188.75" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="349.3068" x="4460.35" y="2093.65"/><ellipse cx="4510.0638" cy="2114.925" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M4513.7596,2123.6501 Q4512.9052,2124.0896 4511.9652,2124.3093 Q4511.0253,2124.529 4509.9877,2124.529 Q4506.3011,2124.529 4504.3602,2122.0998 Q4502.4193,2119.6706 4502.4193,2115.0808 Q4502.4193,2110.4787 4504.3602,2108.0495 Q4506.3011,2105.6203 4509.9877,2105.6203 Q4511.0253,2105.6203 4511.9774,2105.84 Q4512.9296,2106.0598 4513.7596,2106.4992 L4513.7596,2110.5031 Q4512.8319,2109.6486 4511.9591,2109.2519 Q4511.0863,2108.8552 4510.1586,2108.8552 Q4508.181,2108.8552 4507.1739,2110.4238 Q4506.1669,2111.9924 4506.1669,2115.0808 Q4506.1669,2118.1569 4507.1739,2119.7255 Q4508.181,2121.2941 4510.1586,2121.2941 Q4511.0863,2121.2941 4511.9591,2120.8974 Q4512.8319,2120.5007 4513.7596,2119.6462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="240.8316" x="4534.1114" y="2123.45">GenerationMetadata</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4461.35" x2="4808.6568" y1="2136.2" y2="2136.2"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4471.35" cy="2157.975" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="282.6502" x="4483.35" y="2165">generation_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4471.35" cy="2190.525" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="320.3068" x="4483.35" y="2197.55">generated_time : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4471.35" cy="2223.075" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="279.8627" x="4483.35" y="2230.1">context_provided : bool</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4471.35" cy="2255.625" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="317.2507" x="4483.35" y="2262.65">generated_with : std::string</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4461.35" x2="4808.6568" y1="2274.4" y2="2274.4"/></g><!--class GeneratedBrewery--><g class="entity" data-qualified-name="Domain. Models.GeneratedBrewery" data-source-line="153" id="ent0027"><rect fill="#EBECE3" height="253.85" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="690.3818" x="1386.81" y="1216.73"/><ellipse cx="1617.4132" cy="1238.005" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M1621.109,1246.7301 Q1620.2545,1247.1696 1619.3146,1247.3893 Q1618.3746,1247.609 1617.337,1247.609 Q1613.6505,1247.609 1611.7096,1245.1798 Q1609.7687,1242.7506 1609.7687,1238.1608 Q1609.7687,1233.5587 1611.7096,1231.1295 Q1613.6505,1228.7003 1617.337,1228.7003 Q1618.3746,1228.7003 1619.3268,1228.92 Q1620.2789,1229.1398 1621.109,1229.5792 L1621.109,1233.5831 Q1620.1813,1232.7286 1619.3085,1232.3319 Q1618.4356,1231.9352 1617.5079,1231.9352 Q1615.5304,1231.9352 1614.5233,1233.5038 Q1613.5162,1235.0724 1613.5162,1238.1608 Q1613.5162,1241.2369 1614.5233,1242.8055 Q1615.5304,1244.3741 1617.5079,1244.3741 Q1618.4356,1244.3741 1619.3085,1243.9774 Q1620.1813,1243.5807 1621.109,1242.7262 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="219.1754" x="1642.4132" y="1246.53">GeneratedBrewery</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="1387.81" x2="2076.1918" y1="1259.28" y2="1259.28"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1397.81" cy="1281.055" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="253.6877" x="1409.81" y="1288.08">brewery_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1397.81" cy="1313.605" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="159.219" x="1409.81" y="1320.63">location : City</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1397.81" cy="1346.155" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="208.3815" x="1409.81" y="1353.18">address : Address</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1397.81" cy="1378.705" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="280.1382" x="1409.81" y="1385.73">brewery : BreweryResult</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1397.81" cy="1411.255" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="661.3818" x="1409.81" y="1418.28">context_completeness : LocationContext::Completeness</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="1397.81" cy="1443.805" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="371.738" x="1409.81" y="1450.83">metadata : GenerationMetadata</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="1387.81" x2="2076.1918" y1="1462.58" y2="1462.58"/></g><!--class GeneratedBeer--><g class="entity" data-qualified-name="Domain. Models.GeneratedBeer" data-source-line="162" id="ent0028"><rect fill="#EBECE3" height="253.85" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="400.738" x="2112.63" y="1216.73"/><ellipse cx="2219.5176" cy="1238.005" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M2223.2134,1246.7301 Q2222.3589,1247.1696 2221.419,1247.3893 Q2220.4791,1247.609 2219.4415,1247.609 Q2215.7549,1247.609 2213.814,1245.1798 Q2211.8731,1242.7506 2211.8731,1238.1608 Q2211.8731,1233.5587 2213.814,1231.1295 Q2215.7549,1228.7003 2219.4415,1228.7003 Q2220.4791,1228.7003 2221.4312,1228.92 Q2222.3834,1229.1398 2223.2134,1229.5792 L2223.2134,1233.5831 Q2222.2857,1232.7286 2221.4129,1232.3319 Q2220.5401,1231.9352 2219.6124,1231.9352 Q2217.6348,1231.9352 2216.6277,1233.5038 Q2215.6207,1235.0724 2215.6207,1238.1608 Q2215.6207,1241.2369 2216.6277,1242.8055 Q2217.6348,1244.3741 2219.6124,1244.3741 Q2220.5401,1244.3741 2221.4129,1243.9774 Q2222.2857,1243.5807 2223.2134,1242.7262 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="176.9627" x="2244.5176" y="1246.53">GeneratedBeer</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="2113.63" x2="2512.368" y1="1259.28" y2="1259.28"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2123.63" cy="1281.055" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="211.475" x="2135.63" y="1288.08">beer_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2123.63" cy="1313.605" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="253.6877" x="2135.63" y="1320.63">brewery_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2123.63" cy="1346.155" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="159.219" x="2135.63" y="1353.18">location : City</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2123.63" cy="1378.705" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="185.0941" x="2135.63" y="1385.73">style : BeerStyle</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2123.63" cy="1411.255" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="195.7128" x="2135.63" y="1418.28">beer : BeerResult</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2123.63" cy="1443.805" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="371.738" x="2135.63" y="1450.83">metadata : GenerationMetadata</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="2113.63" x2="2512.368" y1="1462.58" y2="1462.58"/></g><!--class GeneratedUser--><g class="entity" data-qualified-name="Domain. Models.GeneratedUser" data-source-line="171" id="ent0029"><rect fill="#EBECE3" height="286.4" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="400.738" x="2548.63" y="1200.45"/><ellipse cx="2655.6864" cy="1221.725" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M2659.3822,1230.4501 Q2658.5277,1230.8896 2657.5877,1231.1093 Q2656.6478,1231.329 2655.6102,1231.329 Q2651.9237,1231.329 2649.9828,1228.8998 Q2648.0418,1226.4706 2648.0418,1221.8808 Q2648.0418,1217.2787 2649.9828,1214.8495 Q2651.9237,1212.4203 2655.6102,1212.4203 Q2656.6478,1212.4203 2657.5999,1212.64 Q2658.5521,1212.8598 2659.3822,1213.2992 L2659.3822,1217.3031 Q2658.4544,1216.4486 2657.5816,1216.0519 Q2656.7088,1215.6552 2655.7811,1215.6552 Q2653.8036,1215.6552 2652.7965,1217.2238 Q2651.7894,1218.7924 2651.7894,1221.8808 Q2651.7894,1224.9569 2652.7965,1226.5255 Q2653.8036,1228.0941 2655.7811,1228.0941 Q2656.7088,1228.0941 2657.5816,1227.6974 Q2658.4544,1227.3007 2659.3822,1226.4462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="176.6252" x="2680.6864" y="1230.25">GeneratedUser</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="2549.63" x2="2948.368" y1="1243" y2="1243"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2559.63" cy="1264.775" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="208.4938" x="2571.63" y="1271.8">user_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2559.63" cy="1297.325" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="159.219" x="2571.63" y="1304.35">location : City</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2559.63" cy="1329.875" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="192.3941" x="2571.63" y="1336.9">user : UserResult</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2559.63" cy="1362.425" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="193.9692" x="2571.63" y="1369.45">email : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2559.63" cy="1394.975" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="296.9943" x="2571.63" y="1402">date_of_birth : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2559.63" cy="1427.525" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="245.5132" x="2571.63" y="1434.55">password : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="2559.63" cy="1460.075" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="371.738" x="2571.63" y="1467.1">metadata : GenerationMetadata</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="2549.63" x2="2948.368" y1="1478.85" y2="1478.85"/></g><g class="entity" data-qualified-name="Domain. Models.GMN30" data-source-line="182" id="ent0031"><path d="M2984.77,1257.28 L2984.77,1339.65 L2949.78,1343.65 L2984.77,1347.65 L2984.77,1430.03 A0,0 0 0 0 2984.77,1430.03 L3611.2334,1430.03 A0,0 0 0 0 3611.2334,1430.03 L3611.2334,1267.28 L3601.2334,1257.28 L2984.77,1257.28 A0,0 0 0 0 2984.77,1257.28" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3601.2334,1257.28 L3601.2334,1267.28 L3611.2334,1267.28 L3601.2334,1257.28" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="455.8943" x="2990.77" y="1287.08">email, date_of_birth, and password are</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="563.1824" x="2990.77" y="1319.63">programmatically generated by the orchestrator</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="605.4634" x="2990.77" y="1352.18">(not LLM-authored) so a downstream auth-account</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="583.8323" x="2990.77" y="1384.73">seeding consumer can register real accounts from</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="383.8003" x="2990.77" y="1417.28">this export. See ROADMAP.md &#167;1.</text></g><!--class GeneratedCheckin--><g class="entity" data-qualified-name="Domain. Models.GeneratedCheckin" data-source-line="189" id="ent0033"><rect fill="#EBECE3" height="221.3" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="400.738" x="4082.63" y="1233"/><ellipse cx="4169.0208" cy="1254.275" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M4172.7166,1263.0001 Q4171.8621,1263.4396 4170.9221,1263.6593 Q4169.9822,1263.879 4168.9446,1263.879 Q4165.2581,1263.879 4163.3172,1261.4498 Q4161.3762,1259.0206 4161.3762,1254.4308 Q4161.3762,1249.8287 4163.3172,1247.3995 Q4165.2581,1244.9703 4168.9446,1244.9703 Q4169.9822,1244.9703 4170.9343,1245.19 Q4171.8865,1245.4098 4172.7166,1245.8492 L4172.7166,1249.8531 Q4171.7888,1248.9986 4170.916,1248.6019 Q4170.0432,1248.2052 4169.1155,1248.2052 Q4167.138,1248.2052 4166.1309,1249.7738 Q4165.1238,1251.3424 4165.1238,1254.4308 Q4165.1238,1257.5069 4166.1309,1259.0755 Q4167.138,1260.6441 4169.1155,1260.6441 Q4170.0432,1260.6441 4170.916,1260.2474 Q4171.7888,1259.8507 4172.7166,1258.9962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="217.9564" x="4194.0208" y="1262.8">GeneratedCheckin</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4083.63" x2="4482.368" y1="1275.55" y2="1275.55"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4093.63" cy="1297.325" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="248.2438" x="4105.63" y="1304.35">checkin_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4093.63" cy="1329.875" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="208.4938" x="4105.63" y="1336.9">user_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4093.63" cy="1362.425" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="253.6877" x="4105.63" y="1369.45">brewery_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4093.63" cy="1394.975" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="273.4753" x="4105.63" y="1402">checkin : CheckinResult</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4093.63" cy="1427.525" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="371.738" x="4105.63" y="1434.55">metadata : GenerationMetadata</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4083.63" x2="4482.368" y1="1446.3" y2="1446.3"/></g><!--class GeneratedRating--><g class="entity" data-qualified-name="Domain. Models.GeneratedRating" data-source-line="197" id="ent0034"><rect fill="#EBECE3" height="221.3" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="400.738" x="4518.63" y="1233"/><ellipse cx="4615.6207" cy="1254.275" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M4619.3165,1263.0001 Q4618.462,1263.4396 4617.5221,1263.6593 Q4616.5821,1263.879 4615.5445,1263.879 Q4611.858,1263.879 4609.9171,1261.4498 Q4607.9762,1259.0206 4607.9762,1254.4308 Q4607.9762,1249.8287 4609.9171,1247.3995 Q4611.858,1244.9703 4615.5445,1244.9703 Q4616.5821,1244.9703 4617.5343,1245.19 Q4618.4864,1245.4098 4619.3165,1245.8492 L4619.3165,1249.8531 Q4618.3888,1248.9986 4617.516,1248.6019 Q4616.6432,1248.2052 4615.7154,1248.2052 Q4613.7379,1248.2052 4612.7308,1249.7738 Q4611.7237,1251.3424 4611.7237,1254.4308 Q4611.7237,1257.5069 4612.7308,1259.0755 Q4613.7379,1260.6441 4615.7154,1260.6441 Q4616.6432,1260.6441 4617.516,1260.2474 Q4618.3888,1259.8507 4619.3165,1258.9962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="196.7566" x="4640.6207" y="1262.8">GeneratedRating</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4519.63" x2="4918.368" y1="1275.55" y2="1275.55"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4529.63" cy="1297.325" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="208.4938" x="4541.63" y="1304.35">user_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4529.63" cy="1329.875" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="211.475" x="4541.63" y="1336.9">beer_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4529.63" cy="1362.425" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="248.2438" x="4541.63" y="1369.45">checkin_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4529.63" cy="1394.975" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="229.1006" x="4541.63" y="1402">rating : RatingResult</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4529.63" cy="1427.525" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="371.738" x="4541.63" y="1434.55">metadata : GenerationMetadata</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4519.63" x2="4918.368" y1="1446.3" y2="1446.3"/></g><!--class GeneratedFollow--><g class="entity" data-qualified-name="Domain. Models.GeneratedFollow" data-source-line="205" id="ent0035"><rect fill="#EBECE3" height="156.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="400.738" x="3646.63" y="1265.55"/><ellipse cx="3743.2551" cy="1286.825" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M3746.9509,1295.5501 Q3746.0964,1295.9896 3745.1564,1296.2093 Q3744.2165,1296.429 3743.1789,1296.429 Q3739.4924,1296.429 3737.5515,1293.9998 Q3735.6105,1291.5706 3735.6105,1286.9808 Q3735.6105,1282.3787 3737.5515,1279.9495 Q3739.4924,1277.5203 3743.1789,1277.5203 Q3744.2165,1277.5203 3745.1687,1277.74 Q3746.1208,1277.9598 3746.9509,1278.3992 L3746.9509,1282.4031 Q3746.0231,1281.5486 3745.1503,1281.1519 Q3744.2775,1280.7552 3743.3498,1280.7552 Q3741.3723,1280.7552 3740.3652,1282.3238 Q3739.3581,1283.8924 3739.3581,1286.9808 Q3739.3581,1290.0569 3740.3652,1291.6255 Q3741.3723,1293.1941 3743.3498,1293.1941 Q3744.2775,1293.1941 3745.1503,1292.7974 Q3746.0231,1292.4007 3746.9509,1291.5462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="197.4878" x="3768.2551" y="1295.35">GeneratedFollow</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="3647.63" x2="4046.368" y1="1308.1" y2="1308.1"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3657.63" cy="1329.875" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="249.9815" x="3669.63" y="1336.9">follower_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3657.63" cy="1362.425" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="256.4127" x="3669.63" y="1369.45">followed_id : uint64_t</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="3657.63" cy="1394.975" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="371.738" x="3669.63" y="1402">metadata : GenerationMetadata</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="3647.63" x2="4046.368" y1="1413.75" y2="1413.75"/></g><!--class UserPersona--><g class="entity" data-qualified-name="Domain. Models.UserPersona" data-source-line="211" id="ent0036"><rect fill="#EBECE3" height="156.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="477.8261" x="4954.09" y="1265.55"/><ellipse cx="5115.1623" cy="1286.825" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M5118.8581,1295.5501 Q5118.0036,1295.9896 5117.0637,1296.2093 Q5116.1237,1296.429 5115.0861,1296.429 Q5111.3996,1296.429 5109.4587,1293.9998 Q5107.5178,1291.5706 5107.5178,1286.9808 Q5107.5178,1282.3787 5109.4587,1279.9495 Q5111.3996,1277.5203 5115.0861,1277.5203 Q5116.1237,1277.5203 5117.0759,1277.74 Q5118.028,1277.9598 5118.8581,1278.3992 L5118.8581,1282.4031 Q5117.9304,1281.5486 5117.0576,1281.1519 Q5116.1848,1280.7552 5115.257,1280.7552 Q5113.2795,1280.7552 5112.2724,1282.3238 Q5111.2653,1283.8924 5111.2653,1286.9808 Q5111.2653,1290.0569 5112.2724,1291.6255 Q5113.2795,1293.1941 5115.257,1293.1941 Q5116.1848,1293.1941 5117.0576,1292.7974 Q5117.9304,1292.4007 5118.8581,1291.5462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="145.6815" x="5140.1623" y="1295.35">UserPersona</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4955.09" x2="5430.9161" y1="1308.1" y2="1308.1"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4965.09" cy="1329.875" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="190.0942" x="4977.09" y="1336.9">name: std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4965.09" cy="1362.425" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="258.2444" x="4977.09" y="1369.45">description: std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="4965.09" cy="1394.975" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="448.8261" x="4977.09" y="1402">style_affinities: std::vector&lt;std::string&gt;</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="4955.09" x2="5430.9161" y1="1413.75" y2="1413.75"/></g><!--class SamplingOptions--><g class="entity" data-qualified-name="Domain. Application Configuration.SamplingOptions" data-source-line="221" id="ent0039"><rect fill="#EBECE3" height="221.3" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="309.8506" x="7335.07" y="3202.23"/><ellipse cx="7386.1143" cy="3223.505" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M7389.8101,3232.2301 Q7388.9556,3232.6696 7388.0156,3232.8893 Q7387.0757,3233.109 7386.0381,3233.109 Q7382.3516,3233.109 7380.4107,3230.6798 Q7378.4697,3228.2506 7378.4697,3223.6608 Q7378.4697,3219.0587 7380.4107,3216.6295 Q7382.3516,3214.2003 7386.0381,3214.2003 Q7387.0757,3214.2003 7388.0279,3214.42 Q7388.98,3214.6398 7389.8101,3215.0792 L7389.8101,3219.0831 Q7388.8823,3218.2286 7388.0095,3217.8319 Q7387.1367,3217.4352 7386.209,3217.4352 Q7384.2315,3217.4352 7383.2244,3219.0038 Q7382.2173,3220.5724 7382.2173,3223.6608 Q7382.2173,3226.7369 7383.2244,3228.3055 Q7384.2315,3229.8741 7386.209,3229.8741 Q7387.1367,3229.8741 7388.0095,3229.4774 Q7388.8823,3229.0807 7389.8101,3228.2262 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="198.4188" x="7410.4575" y="3232.03">SamplingOptions</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="7336.07" x2="7643.9206" y1="3244.78" y2="3244.78"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="7346.07" cy="3266.555" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="280.8506" x="7358.07" y="3273.58">temperature: float = 1.0F</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="7346.07" cy="3299.105" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="229.9126" x="7358.07" y="3306.13">top_p: float = 0.95F</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="7346.07" cy="3331.655" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="238.9564" x="7358.07" y="3338.68">top_k: uint32_t = 64</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="7346.07" cy="3364.205" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="259.1315" x="7358.07" y="3371.23">n_ctx: uint32_t = 8192</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="7346.07" cy="3396.755" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="146.8315" x="7358.07" y="3403.78">seed: int = -1</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="7336.07" x2="7643.9206" y1="3415.53" y2="3415.53"/></g><!--class GeneratorOptions--><g class="entity" data-qualified-name="Domain. Application Configuration.GeneratorOptions" data-source-line="229" id="ent0040"><rect fill="#EBECE3" height="156.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="513.2943" x="7233.35" y="2836.55"/><ellipse cx="7379.5189" cy="2857.825" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M7383.2147,2866.5501 Q7382.3602,2866.9896 7381.4202,2867.2093 Q7380.4803,2867.429 7379.4427,2867.429 Q7375.7562,2867.429 7373.8152,2864.9998 Q7371.8743,2862.5706 7371.8743,2857.9808 Q7371.8743,2853.3787 7373.8152,2850.9495 Q7375.7562,2848.5203 7379.4427,2848.5203 Q7380.4803,2848.5203 7381.4324,2848.74 Q7382.3846,2848.9598 7383.2147,2849.3992 L7383.2147,2853.4031 Q7382.2869,2852.5486 7381.4141,2852.1519 Q7380.5413,2851.7552 7379.6136,2851.7552 Q7377.636,2851.7552 7376.629,2853.3238 Q7375.6219,2854.8924 7375.6219,2857.9808 Q7375.6219,2861.0569 7376.629,2862.6255 Q7377.636,2864.1941 7379.6136,2864.1941 Q7380.5413,2864.1941 7381.4141,2863.7974 Q7382.2869,2863.4007 7383.2147,2862.5462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="210.9565" x="7404.5189" y="2866.35">GeneratorOptions</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="7234.35" x2="7745.6443" y1="2879.1" y2="2879.1"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="7244.35" cy="2900.875" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="385.3754" x="7256.35" y="2907.9">model_path: std::filesystem::path</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="7244.35" cy="2933.425" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="295.5751" x="7256.35" y="2940.45">use_mocked: bool = false</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="7244.35" cy="2965.975" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="484.2943" x="7256.35" y="2973">sampling: std::optional&lt;SamplingOptions&gt;</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="7234.35" x2="7745.6443" y1="2984.75" y2="2984.75"/></g><!--class PipelineOptions--><g class="entity" data-qualified-name="Domain. Application Configuration.PipelineOptions" data-source-line="235" id="ent0041"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="420.5569" x="6777.72" y="2852.83"/><ellipse cx="6891.4984" cy="2874.105" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M6895.1942,2882.8301 Q6894.3397,2883.2696 6893.3998,2883.4893 Q6892.4598,2883.709 6891.4222,2883.709 Q6887.7357,2883.709 6885.7948,2881.2798 Q6883.8539,2878.8506 6883.8539,2874.2608 Q6883.8539,2869.6587 6885.7948,2867.2295 Q6887.7357,2864.8003 6891.4222,2864.8003 Q6892.4598,2864.8003 6893.412,2865.02 Q6894.3641,2865.2398 6895.1942,2865.6792 L6895.1942,2869.6831 Q6894.2665,2868.8286 6893.3937,2868.4319 Q6892.5209,2868.0352 6891.5931,2868.0352 Q6889.6156,2868.0352 6888.6085,2869.6038 Q6887.6014,2871.1724 6887.6014,2874.2608 Q6887.6014,2877.3369 6888.6085,2878.9055 Q6889.6156,2880.4741 6891.5931,2880.4741 Q6892.5209,2880.4741 6893.3937,2880.0774 Q6894.2665,2879.6807 6895.1942,2878.8262 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="183" x="6916.4984" y="2882.63">PipelineOptions</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="6778.72" x2="7197.2769" y1="2895.38" y2="2895.38"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="6788.72" cy="2917.155" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="391.5569" x="6800.72" y="2924.18">output_path: std::filesystem::path</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="6788.72" cy="2949.705" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="347.1631" x="6800.72" y="2956.73">log_path: std::filesystem::path</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="6778.72" x2="7197.2769" y1="2968.48" y2="2968.48"/></g><!--class ApplicationOptions--><g class="entity" data-qualified-name="Domain. Application Configuration.ApplicationOptions" data-source-line="240" id="ent0042"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="365.0632" x="7307.47" y="2126.2"/><ellipse cx="7372.564" cy="2147.475" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M7376.2598,2156.2001 Q7375.4053,2156.6396 7374.4654,2156.8593 Q7373.5255,2157.079 7372.4879,2157.079 Q7368.8013,2157.079 7366.8604,2154.6498 Q7364.9195,2152.2206 7364.9195,2147.6308 Q7364.9195,2143.0287 7366.8604,2140.5995 Q7368.8013,2138.1703 7372.4879,2138.1703 Q7373.5255,2138.1703 7374.4776,2138.39 Q7375.4297,2138.6098 7376.2598,2139.0492 L7376.2598,2143.0531 Q7375.3321,2142.1986 7374.4593,2141.8019 Q7373.5865,2141.4052 7372.6588,2141.4052 Q7370.6812,2141.4052 7369.6741,2142.9738 Q7368.6671,2144.5424 7368.6671,2147.6308 Q7368.6671,2150.7069 7369.6741,2152.2755 Q7370.6812,2153.8441 7372.6588,2153.8441 Q7373.5865,2153.8441 7374.4593,2153.4474 Q7375.3321,2153.0507 7376.2598,2152.1962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="224.8751" x="7397.564" y="2156">ApplicationOptions</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="7308.47" x2="7671.5332" y1="2168.75" y2="2168.75"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="7318.47" cy="2190.525" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="336.0632" x="7330.47" y="2197.55">generator: GeneratorOptions</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="7318.47" cy="2223.075" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="286.3188" x="7330.47" y="2230.1">pipeline: PipelineOptions</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="7308.47" x2="7671.5332" y1="2241.85" y2="2241.85"/></g><!--class ContextStrategy--><g class="entity" data-qualified-name="Domain. Policy.ContextStrategy" data-source-line="252" id="ent0047"><rect fill="#EBECE3" height="156.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="649.9075" x="9978.05" y="2836.55"/><ellipse cx="10201.9538" cy="2874.1" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M10196.5534,2868.5487 L10196.5534,2865.3749 L10207.4054,2865.3749 L10207.4054,2868.5487 L10203.7799,2868.5487 L10203.7799,2880.4262 L10207.4054,2880.4262 L10207.4054,2883.6 L10196.5534,2883.6 L10196.5534,2880.4262 L10200.1789,2880.4262 L10200.1789,2868.5487 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="10259.4788" y="2866.35">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="192.1" x="10226.9538" y="2898.9">ContextStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="9979.05" x2="10626.9575" y1="2911.65" y2="2911.65"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="9979.05" x2="10626.9575" y1="2919.65" y2="2919.65"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="9989.05" cy="2941.425" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="620.9075" x="10001.05" y="2948.45">QueriesFor(loc : const City&amp;) : std::vector&lt;std::string&gt;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="9989.05" cy="2973.975" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="315.5253" x="10001.05" y="2981">MaxContextChars() : size_t</text></g><!--class BreweryContextStrategy--><g class="entity" data-qualified-name="Domain. Policy.BreweryContextStrategy" data-source-line="257" id="ent0048"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="649.9075" x="9978.05" y="3251.05"/><ellipse cx="10154.3847" cy="3272.325" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M10158.0805,3281.0501 Q10157.226,3281.4896 10156.286,3281.7093 Q10155.3461,3281.929 10154.3085,3281.929 Q10150.622,3281.929 10148.6811,3279.4998 Q10146.7401,3277.0706 10146.7401,3272.4808 Q10146.7401,3267.8787 10148.6811,3265.4495 Q10150.622,3263.0203 10154.3085,3263.0203 Q10155.3461,3263.0203 10156.2982,3263.24 Q10157.2504,3263.4598 10158.0805,3263.8992 L10158.0805,3267.9031 Q10157.1527,3267.0486 10156.2799,3266.6519 Q10155.4071,3266.2552 10154.4794,3266.2552 Q10152.5019,3266.2552 10151.4948,3267.8238 Q10150.4877,3269.3924 10150.4877,3272.4808 Q10150.4877,3275.5569 10151.4948,3277.1255 Q10152.5019,3278.6941 10154.4794,3278.6941 Q10155.4071,3278.6941 10156.2799,3278.2974 Q10157.1527,3277.9007 10158.0805,3277.0462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="287.2382" x="10179.3847" y="3280.85">BreweryContextStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="9979.05" x2="10626.9575" y1="3293.6" y2="3293.6"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="9979.05" x2="10626.9575" y1="3301.6" y2="3301.6"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="9989.05" cy="3323.375" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="620.9075" x="10001.05" y="3330.4">QueriesFor(loc : const City&amp;) : std::vector&lt;std::string&gt;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="9989.05" cy="3355.925" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="315.5253" x="10001.05" y="3362.95">MaxContextChars() : size_t</text></g><!--class BeerContextStrategy--><g class="entity" data-qualified-name="Domain. Policy.BeerContextStrategy" data-source-line="262" id="ent0049"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="649.9075" x="10663.05" y="3251.05"/><ellipse cx="10860.491" cy="3272.325" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M10864.1868,3281.0501 Q10863.3323,3281.4896 10862.3924,3281.7093 Q10861.4525,3281.929 10860.4149,3281.929 Q10856.7283,3281.929 10854.7874,3279.4998 Q10852.8465,3277.0706 10852.8465,3272.4808 Q10852.8465,3267.8787 10854.7874,3265.4495 Q10856.7283,3263.0203 10860.4149,3263.0203 Q10861.4525,3263.0203 10862.4046,3263.24 Q10863.3567,3263.4598 10864.1868,3263.8992 L10864.1868,3267.9031 Q10863.2591,3267.0486 10862.3863,3266.6519 Q10861.5135,3266.2552 10860.5858,3266.2552 Q10858.6082,3266.2552 10857.6011,3267.8238 Q10856.5941,3269.3924 10856.5941,3272.4808 Q10856.5941,3275.5569 10857.6011,3277.1255 Q10858.6082,3278.6941 10860.5858,3278.6941 Q10861.5135,3278.6941 10862.3863,3278.2974 Q10863.2591,3277.9007 10864.1868,3277.0462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="245.0255" x="10885.491" y="3280.85">BeerContextStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="10664.05" x2="11311.9575" y1="3293.6" y2="3293.6"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="10664.05" x2="11311.9575" y1="3301.6" y2="3301.6"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10674.05" cy="3323.375" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="620.9075" x="10686.05" y="3330.4">QueriesFor(loc : const City&amp;) : std::vector&lt;std::string&gt;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10674.05" cy="3355.925" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="315.5253" x="10686.05" y="3362.95">MaxContextChars() : size_t</text></g><!--class SamplingStrategy--><g class="entity" data-qualified-name="Domain. Policy.SamplingStrategy" data-source-line="267" id="ent0050"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="764.2888" x="10834.86" y="2852.83"/><ellipse cx="11109.6294" cy="2890.38" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M11104.229,2884.8287 L11104.229,2881.6549 L11115.0811,2881.6549 L11115.0811,2884.8287 L11111.4556,2884.8287 L11111.4556,2896.7062 L11115.0811,2896.7062 L11115.0811,2899.88 L11104.229,2899.88 L11104.229,2896.7062 L11107.8545,2896.7062 L11107.8545,2884.8287 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="11173.4794" y="2882.63">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="204.75" x="11134.6294" y="2915.18">SamplingStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="10835.86" x2="11598.1488" y1="2927.93" y2="2927.93"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="10835.86" x2="11598.1488" y1="2935.93" y2="2935.93"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10845.86" cy="2957.705" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="735.2888" x="10857.86" y="2964.73">Sample(locations : const std::vector&lt;City&gt;&amp;) : std::vector&lt;City&gt;</text></g><!--class UniformSamplingStrategy--><g class="entity" data-qualified-name="Domain. Policy.UniformSamplingStrategy" data-source-line="271" id="ent0051"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="764.2888" x="11347.86" y="3251.05"/><ellipse cx="11576.7823" cy="3272.325" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M11580.4781,3281.0501 Q11579.6236,3281.4896 11578.6836,3281.7093 Q11577.7437,3281.929 11576.7061,3281.929 Q11573.0196,3281.929 11571.0786,3279.4998 Q11569.1377,3277.0706 11569.1377,3272.4808 Q11569.1377,3267.8787 11571.0786,3265.4495 Q11573.0196,3263.0203 11576.7061,3263.0203 Q11577.7437,3263.0203 11578.6958,3263.24 Q11579.648,3263.4598 11580.4781,3263.8992 L11580.4781,3267.9031 Q11579.5503,3267.0486 11578.6775,3266.6519 Q11577.8047,3266.2552 11576.877,3266.2552 Q11574.8994,3266.2552 11573.8924,3267.8238 Q11572.8853,3269.3924 11572.8853,3272.4808 Q11572.8853,3275.5569 11573.8924,3277.1255 Q11574.8994,3278.6941 11576.877,3278.6941 Q11577.8047,3278.6941 11578.6775,3278.2974 Q11579.5503,3277.9007 11580.4781,3277.0462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="296.4443" x="11601.7823" y="3280.85">UniformSamplingStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="11348.86" x2="12111.1488" y1="3293.6" y2="3293.6"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="11355.86" y="3312.375"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="249.9499" x="11370.86" y="3322.4">sample_size_ : size_t</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="11348.86" x2="12111.1488" y1="3334.15" y2="3334.15"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="11358.86" cy="3355.925" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="735.2888" x="11370.86" y="3362.95">Sample(locations : const std::vector&lt;City&gt;&amp;) : std::vector&lt;City&gt;</text></g><!--class BeerSelectionStrategy--><g class="entity" data-qualified-name="Domain. Policy.BeerSelectionStrategy" data-source-line="276" id="ent0052"><rect fill="#EBECE3" height="156.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="747.9575" x="11976.02" y="2836.55"/><ellipse cx="12215.1113" cy="2874.1" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M12209.7109,2868.5487 L12209.7109,2865.3749 L12220.5629,2865.3749 L12220.5629,2868.5487 L12216.9374,2868.5487 L12216.9374,2880.4262 L12220.5629,2880.4262 L12220.5629,2883.6 L12209.7109,2883.6 L12209.7109,2880.4262 L12213.3364,2880.4262 L12213.3364,2868.5487 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="12306.4738" y="2866.35">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="259.775" x="12240.1113" y="2898.9">BeerSelectionStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="11977.02" x2="12722.9775" y1="2911.65" y2="2911.65"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="11977.02" x2="12722.9775" y1="2919.65" y2="2919.65"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="11987.02" cy="2957.7" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="580.8262" x="11999.02" y="2948.45">SelectStyles(brewery : const GeneratedBrewery&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="705.6575" x="12012.32" y="2981">palette : std::span&lt;const BeerStyle&gt;) : std::vector&lt;BeerStyle&gt;</text></g><!--class RandomBeerSelectionStrategy--><g class="entity" data-qualified-name="Domain. Policy.RandomBeerSelectionStrategy" data-source-line="280" id="ent0053"><rect fill="#EBECE3" height="221.3" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="747.9575" x="12147.02" y="3202.23"/><ellipse cx="12338.4797" cy="3223.505" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M12342.1755,3232.2301 Q12341.321,3232.6696 12340.3811,3232.8893 Q12339.4412,3233.109 12338.4036,3233.109 Q12334.717,3233.109 12332.7761,3230.6798 Q12330.8352,3228.2506 12330.8352,3223.6608 Q12330.8352,3219.0587 12332.7761,3216.6295 Q12334.717,3214.2003 12338.4036,3214.2003 Q12339.4412,3214.2003 12340.3933,3214.42 Q12341.3455,3214.6398 12342.1755,3215.0792 L12342.1755,3219.0831 Q12341.2478,3218.2286 12340.375,3217.8319 Q12339.5022,3217.4352 12338.5745,3217.4352 Q12336.5969,3217.4352 12335.5898,3219.0038 Q12334.5828,3220.5724 12334.5828,3223.6608 Q12334.5828,3226.7369 12335.5898,3228.3055 Q12336.5969,3229.8741 12338.5745,3229.8741 Q12339.5022,3229.8741 12340.375,3229.4774 Q12341.2478,3229.0807 12342.1755,3228.2262 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="355.0381" x="12363.4797" y="3232.03">RandomBeerSelectionStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="12148.02" x2="12893.9775" y1="3244.78" y2="3244.78"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="12155.02" y="3263.555"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="219.9004" x="12170.02" y="3273.58">rng_ : std::mt19937</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="12155.02" y="3296.105"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="230.3374" x="12170.02" y="3306.13">min_beers_ : size_t</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="12155.02" y="3328.655"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="236.0249" x="12170.02" y="3338.68">max_beers_ : size_t</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="12148.02" x2="12893.9775" y1="3350.43" y2="3350.43"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12158.02" cy="3388.48" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="580.8262" x="12170.02" y="3379.23">SelectStyles(brewery : const GeneratedBrewery&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="705.6575" x="12183.32" y="3411.78">palette : std::span&lt;const BeerStyle&gt;) : std::vector&lt;BeerStyle&gt;</text></g><!--class CheckinDistributionStrategy--><g class="entity" data-qualified-name="Domain. Policy.CheckinDistributionStrategy" data-source-line="287" id="ent0054"><rect fill="#EBECE3" height="253.85" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="803.5516" x="12930.22" y="2787.73"/><ellipse cx="13162.5833" cy="2825.28" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M13157.1829,2819.7287 L13157.1829,2816.5549 L13168.035,2816.5549 L13168.035,2819.7287 L13164.4095,2819.7287 L13164.4095,2831.6062 L13168.035,2831.6062 L13168.035,2834.78 L13157.1829,2834.78 L13157.1829,2831.6062 L13160.8084,2831.6062 L13160.8084,2819.7287 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="13288.4708" y="2817.53">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="328.825" x="13187.5833" y="2850.08">CheckinDistributionStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="12931.22" x2="13732.7716" y1="2862.83" y2="2862.83"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="12931.22" x2="13732.7716" y1="2870.83" y2="2870.83"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12941.22" cy="2892.605" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="774.5516" x="12953.22" y="2899.63">AssignActivityWeights(users : std::vector&lt;GeneratedUser&gt;&amp;) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12941.22" cy="2941.43" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="546.101" x="12953.22" y="2932.18">CheckinsForUser(user : const GeneratedUser&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="366.638" x="12966.52" y="2964.73">brewery_count : size_t) : size_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12941.22" cy="3006.53" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="517.8133" x="12953.22" y="2997.28">TimestampFor(user : const GeneratedUser&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="293.0942" x="12966.52" y="3029.83">index : size_t) : std::string</text></g><!--class JCurveCheckinStrategy--><g class="entity" data-qualified-name="Domain. Policy.JCurveCheckinStrategy" data-source-line="293" id="ent0055"><rect fill="#EBECE3" height="253.85" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="803.5516" x="12930.22" y="3185.95"/><ellipse cx="13189.933" cy="3207.225" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M13193.6288,3215.9501 Q13192.7743,3216.3896 13191.8344,3216.6093 Q13190.8945,3216.829 13189.8569,3216.829 Q13186.1703,3216.829 13184.2294,3214.3998 Q13182.2885,3211.9706 13182.2885,3207.3808 Q13182.2885,3202.7787 13184.2294,3200.3495 Q13186.1703,3197.9203 13189.8569,3197.9203 Q13190.8945,3197.9203 13191.8466,3198.14 Q13192.7988,3198.3598 13193.6288,3198.7992 L13193.6288,3202.8031 Q13192.7011,3201.9486 13191.8283,3201.5519 Q13190.9555,3201.1552 13190.0278,3201.1552 Q13188.0502,3201.1552 13187.0431,3202.7238 Q13186.0361,3204.2924 13186.0361,3207.3808 Q13186.0361,3210.4569 13187.0431,3212.0255 Q13188.0502,3213.5941 13190.0278,3213.5941 Q13190.9555,3213.5941 13191.8283,3213.1974 Q13192.7011,3212.8007 13193.6288,3211.9462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="274.1255" x="13214.933" y="3215.75">JCurveCheckinStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="12931.22" x2="13732.7716" y1="3228.5" y2="3228.5"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="12938.22" y="3247.275"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="219.9004" x="12953.22" y="3257.3">rng_ : std::mt19937</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="12931.22" x2="13732.7716" y1="3269.05" y2="3269.05"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12941.22" cy="3290.825" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="774.5516" x="12953.22" y="3297.85">AssignActivityWeights(users : std::vector&lt;GeneratedUser&gt;&amp;) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12941.22" cy="3339.65" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="546.101" x="12953.22" y="3330.4">CheckinsForUser(user : const GeneratedUser&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="366.638" x="12966.52" y="3362.95">brewery_count : size_t) : size_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12941.22" cy="3404.75" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="517.8133" x="12953.22" y="3395.5">TimestampFor(user : const GeneratedUser&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="293.0942" x="12966.52" y="3428.05">index : size_t) : std::string</text></g><!--class RandomCheckinStrategy--><g class="entity" data-qualified-name="Domain. Policy.RandomCheckinStrategy" data-source-line="300" id="ent0056"><rect fill="#EBECE3" height="318.95" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="803.5516" x="13769.22" y="3153.4"/><ellipse cx="14021.8456" cy="3174.675" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M14025.5414,3183.4001 Q14024.6869,3183.8396 14023.747,3184.0593 Q14022.807,3184.279 14021.7694,3184.279 Q14018.0829,3184.279 14016.142,3181.8498 Q14014.2011,3179.4206 14014.2011,3174.8308 Q14014.2011,3170.2287 14016.142,3167.7995 Q14018.0829,3165.3703 14021.7694,3165.3703 Q14022.807,3165.3703 14023.7592,3165.59 Q14024.7113,3165.8098 14025.5414,3166.2492 L14025.5414,3170.2531 Q14024.6137,3169.3986 14023.7409,3169.0019 Q14022.8681,3168.6052 14021.9403,3168.6052 Q14019.9628,3168.6052 14018.9557,3170.1738 Q14017.9486,3171.7424 14017.9486,3174.8308 Q14017.9486,3177.9069 14018.9557,3179.4755 Q14019.9628,3181.0441 14021.9403,3181.0441 Q14022.8681,3181.0441 14023.7409,3180.6474 Q14024.6137,3180.2507 14025.5414,3179.3962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="288.3004" x="14046.8456" y="3183.2">RandomCheckinStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="13770.22" x2="14571.7716" y1="3195.95" y2="3195.95"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="13777.22" y="3214.725"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="219.9004" x="13792.22" y="3224.75">rng_ : std::mt19937</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="13777.22" y="3247.275"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="267.1062" x="13792.22" y="3257.3">min_checkins_ : size_t</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="13777.22" y="3279.825"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="272.7936" x="13792.22" y="3289.85">max_checkins_ : size_t</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="13770.22" x2="14571.7716" y1="3301.6" y2="3301.6"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="13780.22" cy="3323.375" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="774.5516" x="13792.22" y="3330.4">AssignActivityWeights(users : std::vector&lt;GeneratedUser&gt;&amp;) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="13780.22" cy="3372.2" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="546.101" x="13792.22" y="3362.95">CheckinsForUser(user : const GeneratedUser&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="366.638" x="13805.52" y="3395.5">brewery_count : size_t) : size_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="13780.22" cy="3437.3" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="517.8133" x="13792.22" y="3428.05">TimestampFor(user : const GeneratedUser&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="293.0942" x="13805.52" y="3460.6">index : size_t) : std::string</text></g><!--class FollowGenerationStrategy--><g class="entity" data-qualified-name="Domain. Policy.FollowGenerationStrategy" data-source-line="309" id="ent0057"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="1108.7897" x="14607.61" y="2852.83"/><ellipse cx="15005.9548" cy="2890.38" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M15000.5545,2884.8287 L15000.5545,2881.6549 L15011.4065,2881.6549 L15011.4065,2884.8287 L15007.781,2884.8287 L15007.781,2896.7062 L15011.4065,2896.7062 L15011.4065,2899.88 L15000.5545,2899.88 L15000.5545,2896.7062 L15004.1799,2896.7062 L15004.1799,2884.8287 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="15118.4798" y="2882.63">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="302.1" x="15030.9548" y="2915.18">FollowGenerationStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="14608.61" x2="15715.3997" y1="2927.93" y2="2927.93"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="14608.61" x2="15715.3997" y1="2935.93" y2="2935.93"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="14618.61" cy="2957.705" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1079.7897" x="14630.61" y="2964.73">GenerateFollows(users : const std::vector&lt;GeneratedUser&gt;&amp;) : std::vector&lt;GeneratedFollow&gt;</text></g><!--class RandomFollowStrategy--><g class="entity" data-qualified-name="Domain. Policy.RandomFollowStrategy" data-source-line="313" id="ent0058"><rect fill="#EBECE3" height="188.75" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="1108.7897" x="14607.61" y="3218.5"/><ellipse cx="15023.089" cy="3239.775" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M15026.7848,3248.5001 Q15025.9303,3248.9396 15024.9903,3249.1593 Q15024.0504,3249.379 15023.0128,3249.379 Q15019.3263,3249.379 15017.3853,3246.9498 Q15015.4444,3244.5206 15015.4444,3239.9308 Q15015.4444,3235.3287 15017.3853,3232.8995 Q15019.3263,3230.4703 15023.0128,3230.4703 Q15024.0504,3230.4703 15025.0025,3230.69 Q15025.9547,3230.9098 15026.7848,3231.3492 L15026.7848,3235.3531 Q15025.857,3234.4986 15024.9842,3234.1019 Q15024.1114,3233.7052 15023.1837,3233.7052 Q15021.2061,3233.7052 15020.1991,3235.2738 Q15019.192,3236.8424 15019.192,3239.9308 Q15019.192,3243.0069 15020.1991,3244.5755 Q15021.2061,3246.1441 15023.1837,3246.1441 Q15024.1114,3246.1441 15024.9842,3245.7474 Q15025.857,3245.3507 15026.7848,3244.4962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="267.8318" x="15048.089" y="3248.3">RandomFollowStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="14608.61" x2="15715.3997" y1="3261.05" y2="3261.05"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="14615.61" y="3279.825"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="219.9004" x="14630.61" y="3289.85">rng_ : std::mt19937</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="14615.61" y="3312.375"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="245.3938" x="14630.61" y="3322.4">min_follows_ : size_t</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="14615.61" y="3344.925"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="251.0813" x="14630.61" y="3354.95">max_follows_ : size_t</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="14608.61" x2="15715.3997" y1="3366.7" y2="3366.7"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="14618.61" cy="3388.475" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1079.7897" x="14630.61" y="3395.5">GenerateFollows(users : const std::vector&lt;GeneratedUser&gt;&amp;) : std::vector&lt;GeneratedFollow&gt;</text></g><!--class ActivityWeightedFollowStrategy--><g class="entity" data-qualified-name="Domain. Policy.ActivityWeightedFollowStrategy" data-source-line="320" id="ent0059"><rect fill="#EBECE3" height="188.75" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="1108.7897" x="15751.61" y="3218.5"/><ellipse cx="16113.9263" cy="3239.775" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M16117.6221,3248.5001 Q16116.7676,3248.9396 16115.8277,3249.1593 Q16114.8877,3249.379 16113.8501,3249.379 Q16110.1636,3249.379 16108.2227,3246.9498 Q16106.2818,3244.5206 16106.2818,3239.9308 Q16106.2818,3235.3287 16108.2227,3232.8995 Q16110.1636,3230.4703 16113.8501,3230.4703 Q16114.8877,3230.4703 16115.8399,3230.69 Q16116.792,3230.9098 16117.6221,3231.3492 L16117.6221,3235.3531 Q16116.6944,3234.4986 16115.8216,3234.1019 Q16114.9488,3233.7052 16114.021,3233.7052 Q16112.0435,3233.7052 16111.0364,3235.2738 Q16110.0293,3236.8424 16110.0293,3239.9308 Q16110.0293,3243.0069 16111.0364,3244.5755 Q16112.0435,3246.1441 16114.021,3246.1441 Q16114.9488,3246.1441 16115.8216,3245.7474 Q16116.6944,3245.3507 16117.6221,3244.4962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="374.1571" x="16138.9263" y="3248.3">ActivityWeightedFollowStrategy</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="15752.61" x2="16859.3997" y1="3261.05" y2="3261.05"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="15759.61" y="3279.825"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="219.9004" x="15774.61" y="3289.85">rng_ : std::mt19937</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="15759.61" y="3312.375"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="245.3938" x="15774.61" y="3322.4">min_follows_ : size_t</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="15759.61" y="3344.925"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="251.0813" x="15774.61" y="3354.95">max_follows_ : size_t</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="15752.61" x2="16859.3997" y1="3366.7" y2="3366.7"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="15762.61" cy="3388.475" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1079.7897" x="15774.61" y="3395.5">GenerateFollows(users : const std::vector&lt;GeneratedUser&gt;&amp;) : std::vector&lt;GeneratedFollow&gt;</text></g><!--class LogLevel--><g class="entity" data-qualified-name="Infrastructure. Logging.LogLevel" data-source-line="329" id="ent0061"><rect fill="#EBECE3" height="188.75" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="140.2564" x="20773.87" y="2820.28"/><ellipse cx="20791.87" cy="2841.555" fill="#EB937F" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M20797.7733,2851.055 L20786.4208,2851.055 L20786.4208,2832.8299 L20797.7733,2832.8299 L20797.7733,2836.0037 L20790.0219,2836.0037 L20790.0219,2839.9344 L20797.0409,2839.9344 L20797.0409,2843.1082 L20790.0219,2843.1082 L20790.0219,2847.8812 L20797.7733,2847.8812 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="102.2564" x="20808.87" y="2850.08">LogLevel</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="20774.87" x2="20913.1264" y1="2862.83" y2="2862.83"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="75.3437" x="20779.87" y="2891.63">Debug</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="43.5064" x="20779.87" y="2924.18">Info</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="61.3814" x="20779.87" y="2956.73">Warn</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="56.694" x="20779.87" y="2989.28">Error</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="20774.87" x2="20913.1264" y1="3001.03" y2="3001.03"/></g><!--class PipelinePhase--><g class="entity" data-qualified-name="Infrastructure. Logging.PipelinePhase" data-source-line="336" id="ent0062"><rect fill="#EBECE3" height="286.4" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="335.8006" x="20949.1" y="2771.45"/><ellipse cx="21032.1471" cy="2792.725" fill="#EB937F" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M21038.0504,2802.225 L21026.6979,2802.225 L21026.6979,2783.9999 L21038.0504,2783.9999 L21038.0504,2787.1737 L21030.299,2787.1737 L21030.299,2791.1044 L21037.318,2791.1044 L21037.318,2794.2782 L21030.299,2794.2782 L21030.299,2799.0512 L21038.0504,2799.0512 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="159.7064" x="21057.1471" y="2801.25">PipelinePhase</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="20950.1" x2="21283.9006" y1="2814" y2="2814"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="86.9315" x="20955.1" y="2842.8">Startup</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="181.9003" x="20955.1" y="2875.35">UserGeneration</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="323.8006" x="20955.1" y="2907.9">BreweryAndBeerGeneration</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="223.2315" x="20955.1" y="2940.45">CheckinGeneration</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="202.0317" x="20955.1" y="2973">RatingGeneration</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="202.7629" x="20955.1" y="3005.55">FollowGeneration</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="114.9877" x="20955.1" y="3038.1">Teardown</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="20950.1" x2="21283.9006" y1="3049.85" y2="3049.85"/></g><!--class LogEntry--><g class="entity" data-qualified-name="Infrastructure. Logging.LogEntry" data-source-line="346" id="ent0063"><rect fill="#EBECE3" height="221.3" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="616.4693" x="20638.77" y="2077.38"/><ellipse cx="20890.3295" cy="2098.655" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M20894.0253,2107.3801 Q20893.1708,2107.8196 20892.2309,2108.0393 Q20891.2909,2108.259 20890.2533,2108.259 Q20886.5668,2108.259 20884.6259,2105.8298 Q20882.685,2103.4006 20882.685,2098.8108 Q20882.685,2094.2087 20884.6259,2091.7795 Q20886.5668,2089.3503 20890.2533,2089.3503 Q20891.2909,2089.3503 20892.2431,2089.57 Q20893.1952,2089.7898 20894.0253,2090.2292 L20894.0253,2094.2331 Q20893.0976,2093.3786 20892.2248,2092.9819 Q20891.352,2092.5852 20890.4242,2092.5852 Q20888.4467,2092.5852 20887.4396,2094.1538 Q20886.4325,2095.7224 20886.4325,2098.8108 Q20886.4325,2101.8869 20887.4396,2103.4555 Q20888.4467,2105.0241 20890.4242,2105.0241 Q20891.352,2105.0241 20892.2248,2104.6274 Q20893.0976,2104.2307 20894.0253,2103.3762 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="103.3503" x="20915.3295" y="2107.18">LogEntry</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="20639.77" x2="21254.2393" y1="2119.93" y2="2119.93"/><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="20649.77" cy="2141.705" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="587.4693" x="20661.77" y="2148.73">timestamp : std::chrono::system_clock::time_point</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="20649.77" cy="2174.255" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="173.3316" x="20661.77" y="2181.28">level : LogLevel</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="20649.77" cy="2206.805" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="248.444" x="20661.77" y="2213.83">phase : PipelinePhase</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="20649.77" cy="2239.355" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="235.6693" x="20661.77" y="2246.38">message : std::string</text><g data-visibility-modifier="PUBLIC_FIELD"><ellipse cx="20649.77" cy="2271.905" fill="none" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="381.751" x="20661.77" y="2278.93">worker : std::optional&lt;std::string&gt;</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="20639.77" x2="21254.2393" y1="2290.68" y2="2290.68"/></g><!--class ILogger--><g class="entity" data-qualified-name="Infrastructure. Logging.ILogger" data-source-line="354" id="ent0064"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="431.551" x="20416.22" y="412.73"/><ellipse cx="20565.4705" cy="450.28" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M20560.0701,444.7287 L20560.0701,441.5549 L20570.9222,441.5549 L20570.9222,444.7287 L20567.2967,444.7287 L20567.2967,456.6062 L20570.9222,456.6062 L20570.9222,459.78 L20560.0701,459.78 L20560.0701,456.6062 L20563.6956,456.6062 L20563.6956,444.7287 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="20588.4705" y="442.53">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="85.15" x="20609.4205" y="475.08">ILogger</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="20417.22" x2="20846.771" y1="487.83" y2="487.83"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="20417.22" x2="20846.771" y1="495.83" y2="495.83"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="20427.22" cy="517.605" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="402.551" x="20439.22" y="524.63">Log(entry : const LogEntry&amp;) : void</text></g><!--class LogProducer--><g class="entity" data-qualified-name="Infrastructure. Logging.LogProducer" data-source-line="358" id="ent0065"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="502.2441" x="20380.88" y="1281.83"/><ellipse cx="20552.8675" cy="1303.105" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M20556.5633,1311.8301 Q20555.7088,1312.2696 20554.7689,1312.4893 Q20553.829,1312.709 20552.7914,1312.709 Q20549.1048,1312.709 20547.1639,1310.2798 Q20545.223,1307.8506 20545.223,1303.2608 Q20545.223,1298.6587 20547.1639,1296.2295 Q20549.1048,1293.8003 20552.7914,1293.8003 Q20553.829,1293.8003 20554.7811,1294.02 Q20555.7333,1294.2398 20556.5633,1294.6792 L20556.5633,1298.6831 Q20555.6356,1297.8286 20554.7628,1297.4319 Q20553.89,1297.0352 20552.9623,1297.0352 Q20550.9847,1297.0352 20549.9776,1298.6038 Q20548.9706,1300.1724 20548.9706,1303.2608 Q20548.9706,1306.3369 20549.9776,1307.9055 Q20550.9847,1309.4741 20552.9623,1309.4741 Q20553.89,1309.4741 20554.7628,1309.0774 Q20555.6356,1308.6807 20556.5633,1307.8262 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="148.2691" x="20577.8675" y="1311.63">LogProducer</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="20381.88" x2="20882.1241" y1="1324.38" y2="1324.38"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="20388.88" y="1343.155"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="473.2441" x="20403.88" y="1353.18">channel_ : BoundedChannel&lt;LogEntry&gt;&amp;</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="20381.88" x2="20882.1241" y1="1364.93" y2="1364.93"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="20391.88" cy="1386.705" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="402.551" x="20403.88" y="1393.73">Log(entry : const LogEntry&amp;) : void</text></g><!--class LogDispatcher--><g class="entity" data-qualified-name="Infrastructure. Logging.LogDispatcher" data-source-line="363" id="ent0066"><rect fill="#EBECE3" height="156.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="573.6006" x="20918.2" y="1265.55"/><ellipse cx="21115.5752" cy="1286.825" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M21119.271,1295.5501 Q21118.4165,1295.9896 21117.4765,1296.2093 Q21116.5366,1296.429 21115.499,1296.429 Q21111.8125,1296.429 21109.8716,1293.9998 Q21107.9306,1291.5706 21107.9306,1286.9808 Q21107.9306,1282.3787 21109.8716,1279.9495 Q21111.8125,1277.5203 21115.499,1277.5203 Q21116.5366,1277.5203 21117.4887,1277.74 Q21118.4409,1277.9598 21119.271,1278.3992 L21119.271,1282.4031 Q21118.3432,1281.5486 21117.4704,1281.1519 Q21116.5976,1280.7552 21115.6699,1280.7552 Q21113.6924,1280.7552 21112.6853,1282.3238 Q21111.6782,1283.8924 21111.6782,1286.9808 Q21111.6782,1290.0569 21112.6853,1291.6255 Q21113.6924,1293.1941 21115.6699,1293.1941 Q21116.5976,1293.1941 21117.4704,1292.7974 Q21118.3432,1292.4007 21119.271,1291.5462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="168.8502" x="21140.5752" y="1295.35">LogDispatcher</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="20919.2" x2="21490.8006" y1="1308.1" y2="1308.1"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="20926.2" y="1326.875"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="473.2441" x="20941.2" y="1336.9">channel_ : BoundedChannel&lt;LogEntry&gt;&amp;</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="20919.2" x2="21490.8006" y1="1348.65" y2="1348.65"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="20929.2" cy="1370.425" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="130.1564" x="20941.2" y="1377.45">Run() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="20926.2" y="1399.975"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="544.6006" x="20941.2" y="1410">ToSpdlogLevel(level) : spdlog::level::level_enum</text></g><!--class BoundedChannel--><g class="entity" data-qualified-name="Infrastructure. Pipeline Channel.BoundedChannel" data-source-line="378" id="ent0073"><rect fill="#EBECE3" height="351.5" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="460.9128" x="5487.54" y="2738.9"/><ellipse cx="5604.7526" cy="2760.175" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M5608.4484,2768.9001 Q5607.5939,2769.3396 5606.654,2769.5593 Q5605.7141,2769.779 5604.6765,2769.779 Q5600.9899,2769.779 5599.049,2767.3498 Q5597.1081,2764.9206 5597.1081,2760.3308 Q5597.1081,2755.7287 5599.049,2753.2995 Q5600.9899,2750.8703 5604.6765,2750.8703 Q5605.7141,2750.8703 5606.6662,2751.09 Q5607.6184,2751.3098 5608.4484,2751.7492 L5608.4484,2755.7531 Q5607.5207,2754.8986 5606.6479,2754.5019 Q5605.7751,2754.1052 5604.8474,2754.1052 Q5602.8698,2754.1052 5601.8627,2755.6738 Q5600.8557,2757.2424 5600.8557,2760.3308 Q5600.8557,2763.4069 5601.8627,2764.9755 Q5602.8698,2766.5441 5604.8474,2766.5441 Q5605.7751,2766.5441 5606.6479,2766.1474 Q5607.5207,2765.7507 5608.4484,2764.8962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="198.4876" x="5629.7526" y="2768.7">BoundedChannel</text><rect fill="#EBECE3" height="34.55" style="stroke:#4A5837;stroke-width:1;stroke-dasharray:2,2;" width="16" x="5935.4528" y="2735.9"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="14" x="5936.4528" y="2761.7">T</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="5488.54" x2="5947.4528" y1="2781.45" y2="2781.45"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5495.54" y="2800.225"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="269.9875" x="5510.54" y="2810.25">queue_ : std::queue&lt;T&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5495.54" y="2832.775"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="228.9875" x="5510.54" y="2842.8">mutex_ : std::mutex</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5495.54" y="2865.325"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="390.0504" x="5510.54" y="2875.35">not_full_ : std::condition_variable</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5495.54" y="2897.875"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="431.9128" x="5510.54" y="2907.9">not_empty_ : std::condition_variable</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5495.54" y="2930.425"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="206.5063" x="5510.54" y="2940.45">capacity_ : size_t</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="5495.54" y="2962.975"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="162.8875" x="5510.54" y="2973">closed_ : bool</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="5488.54" x2="5947.4528" y1="2984.75" y2="2984.75"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="5498.54" cy="3006.525" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="229.9814" x="5510.54" y="3013.55">Send(item : T) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="5498.54" cy="3039.075" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="312.1567" x="5510.54" y="3046.1">Receive() : std::optional&lt;T&gt;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="5498.54" cy="3071.625" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="151.7314" x="5510.54" y="3078.65">Close() : void</text></g><!--class ICuratedDataService--><g class="entity" data-qualified-name="Infrastructure. Data Preloading.ICuratedDataService" data-source-line="394" id="ent0075"><rect fill="#EBECE3" height="253.85" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="1586.5524" x="10240.72" y="1216.73"/><ellipse cx="10908.2337" cy="1254.28" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M10902.8333,1248.7287 L10902.8333,1245.5549 L10913.6853,1245.5549 L10913.6853,1248.7287 L10910.0599,1248.7287 L10910.0599,1260.6062 L10913.6853,1260.6062 L10913.6853,1263.78 L10902.8333,1263.78 L10902.8333,1260.6062 L10906.4588,1260.6062 L10906.4588,1248.7287 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="10990.4712" y="1246.53">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="241.525" x="10933.2337" y="1279.08">ICuratedDataService</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="10241.72" x2="11826.2724" y1="1291.83" y2="1291.83"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="10241.72" x2="11826.2724" y1="1299.83" y2="1299.83"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10251.72" cy="1321.605" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="878.3016" x="10263.72" y="1328.63">LoadCities(filepath : const std::filesystem::path&amp;) : const std::vector&lt;City&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10251.72" cy="1354.155" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="998.2018" x="10263.72" y="1361.18">LoadBeerStyles(filepath : const std::filesystem::path&amp;) : const std::vector&lt;BeerStyle&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10251.72" cy="1386.705" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1015.7458" x="10263.72" y="1393.73">LoadPersonas(filepath : const std::filesystem::path&amp;) : const std::vector&lt;UserPersona&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10251.72" cy="1419.255" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1557.5524" x="10263.72" y="1426.28">LoadForenamesByCountry(forenames_filepath : const std::filesystem::path&amp;) : const std::unordered_map&lt;std::string, forename_list&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10251.72" cy="1451.805" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1522.6647" x="10263.72" y="1458.83">LoadSurnamesByCountry(surnames_filepath : const std::filesystem::path&amp;) : const std::unordered_map&lt;std::string, surname_list&gt;&amp;</text></g><!--class JsonLoader--><g class="entity" data-qualified-name="Infrastructure. Data Preloading.JsonLoader" data-source-line="402" id="ent0076"><rect fill="#EBECE3" height="221.3" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="1586.5524" x="12526.72" y="2077.38"/><ellipse cx="13247.5086" cy="2098.655" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M13251.2044,2107.3801 Q13250.3499,2107.8196 13249.41,2108.0393 Q13248.47,2108.259 13247.4324,2108.259 Q13243.7459,2108.259 13241.805,2105.8298 Q13239.8641,2103.4006 13239.8641,2098.8108 Q13239.8641,2094.2087 13241.805,2091.7795 Q13243.7459,2089.3503 13247.4324,2089.3503 Q13248.47,2089.3503 13249.4222,2089.57 Q13250.3743,2089.7898 13251.2044,2090.2292 L13251.2044,2094.2331 Q13250.2767,2093.3786 13249.4039,2092.9819 Q13248.5311,2092.5852 13247.6033,2092.5852 Q13245.6258,2092.5852 13244.6187,2094.1538 Q13243.6116,2095.7224 13243.6116,2098.8108 Q13243.6116,2101.8869 13244.6187,2103.4555 Q13245.6258,2105.0241 13247.6033,2105.0241 Q13248.5311,2105.0241 13249.4039,2104.6274 Q13250.2767,2104.2307 13251.2044,2103.3762 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="134.9752" x="13272.5086" y="2107.18">JsonLoader</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="12527.72" x2="14112.2724" y1="2119.93" y2="2119.93"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="12527.72" x2="14112.2724" y1="2127.93" y2="2127.93"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12537.72" cy="2149.705" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="878.3016" x="12549.72" y="2156.73">LoadCities(filepath : const std::filesystem::path&amp;) : const std::vector&lt;City&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12537.72" cy="2182.255" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="998.2018" x="12549.72" y="2189.28">LoadBeerStyles(filepath : const std::filesystem::path&amp;) : const std::vector&lt;BeerStyle&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12537.72" cy="2214.805" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1015.7458" x="12549.72" y="2221.83">LoadPersonas(filepath : const std::filesystem::path&amp;) : const std::vector&lt;UserPersona&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12537.72" cy="2247.355" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1557.5524" x="12549.72" y="2254.38">LoadForenamesByCountry(forenames_filepath : const std::filesystem::path&amp;) : const std::unordered_map&lt;std::string, forename_list&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="12537.72" cy="2279.905" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1522.6647" x="12549.72" y="2286.93">LoadSurnamesByCountry(surnames_filepath : const std::filesystem::path&amp;) : const std::unordered_map&lt;std::string, surname_list&gt;&amp;</text></g><g class="entity" data-qualified-name="Infrastructure. Data Preloading.GMN77" data-source-line="411" id="ent0078"><path d="M14147.79,2134.2 L14147.79,2184.03 L14113.74,2188.03 L14147.79,2192.03 L14147.79,2241.85 A0,0 0 0 0 14147.79,2241.85 L14728.2034,2241.85 A0,0 0 0 0 14728.2034,2241.85 L14728.2034,2144.2 L14718.2034,2134.2 L14147.79,2134.2 A0,0 0 0 0 14147.79,2134.2" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M14718.2034,2134.2 L14718.2034,2144.2 L14728.2034,2144.2 L14718.2034,2134.2" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="480.4885" x="14153.79" y="2164">Each Load* call is memoized after its first</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="544.3882" x="14153.79" y="2196.55">parse -- implemented today, ahead of the rest</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="559.4134" x="14153.79" y="2229.1">of this package (LoadBeerStyles is still planned).</text></g><!--class MockCuratedDataService--><g class="entity" data-qualified-name="Infrastructure. Data Preloading.MockCuratedDataService" data-source-line="416" id="ent0080"><rect fill="#EBECE3" height="221.3" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="1586.5524" x="10240.72" y="2077.38"/><ellipse cx="10880.3117" cy="2098.655" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M10884.0075,2107.3801 Q10883.153,2107.8196 10882.213,2108.0393 Q10881.2731,2108.259 10880.2355,2108.259 Q10876.549,2108.259 10874.608,2105.8298 Q10872.6671,2103.4006 10872.6671,2098.8108 Q10872.6671,2094.2087 10874.608,2091.7795 Q10876.549,2089.3503 10880.2355,2089.3503 Q10881.2731,2089.3503 10882.2252,2089.57 Q10883.1774,2089.7898 10884.0075,2090.2292 L10884.0075,2094.2331 Q10883.0797,2093.3786 10882.2069,2092.9819 Q10881.3341,2092.5852 10880.4064,2092.5852 Q10878.4288,2092.5852 10877.4218,2094.1538 Q10876.4147,2095.7224 10876.4147,2098.8108 Q10876.4147,2101.8869 10877.4218,2103.4555 Q10878.4288,2105.0241 10880.4064,2105.0241 Q10881.3341,2105.0241 10882.2069,2104.6274 Q10883.0797,2104.2307 10884.0075,2103.3762 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="297.369" x="10905.3117" y="2107.18">MockCuratedDataService</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="10241.72" x2="11826.2724" y1="2119.93" y2="2119.93"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="10241.72" x2="11826.2724" y1="2127.93" y2="2127.93"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10251.72" cy="2149.705" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="878.3016" x="10263.72" y="2156.73">LoadCities(filepath : const std::filesystem::path&amp;) : const std::vector&lt;City&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10251.72" cy="2182.255" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="998.2018" x="10263.72" y="2189.28">LoadBeerStyles(filepath : const std::filesystem::path&amp;) : const std::vector&lt;BeerStyle&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10251.72" cy="2214.805" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1015.7458" x="10263.72" y="2221.83">LoadPersonas(filepath : const std::filesystem::path&amp;) : const std::vector&lt;UserPersona&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10251.72" cy="2247.355" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1557.5524" x="10263.72" y="2254.38">LoadForenamesByCountry(forenames_filepath : const std::filesystem::path&amp;) : const std::unordered_map&lt;std::string, forename_list&gt;&amp;</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="10251.72" cy="2279.905" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="1522.6647" x="10263.72" y="2286.93">LoadSurnamesByCountry(surnames_filepath : const std::filesystem::path&amp;) : const std::unordered_map&lt;std::string, surname_list&gt;&amp;</text></g><g class="entity" data-qualified-name="Infrastructure. Data Preloading.GMN81" data-source-line="425" id="ent0082"><path d="M11862.59,2117.93 L11862.59,2184.03 L11827.63,2188.03 L11862.59,2192.03 L11862.59,2258.13 A0,0 0 0 0 11862.59,2258.13 L12491.4032,2258.13 A0,0 0 0 0 12491.4032,2258.13 L12491.4032,2127.93 L12481.4032,2117.93 L11862.59,2117.93 A0,0 0 0 0 11862.59,2117.93" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M12481.4032,2117.93 L12481.4032,2127.93 L12491.4032,2127.93 L12481.4032,2117.93" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="590.9502" x="11868.59" y="2147.73">Fixed in-memory dataset used in --mocked mode,</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="513.3569" x="11868.59" y="2180.28">implemented today for Locations/Personas/</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="607.8132" x="11868.59" y="2212.83">Forenames/Surnames; would need a LoadBeerStyles</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="527.8945" x="11868.59" y="2245.38">fixture too once that method is implemented.</text></g><!--class EnrichmentService--><g class="entity" data-qualified-name="Infrastructure. Enrichment.EnrichmentService" data-source-line="435" id="ent0085"><rect fill="#EBECE3" height="156.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="662.5888" x="9200.71" y="1265.55"/><ellipse cx="9417.7169" cy="1303.1" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M9412.3165,1297.5487 L9412.3165,1294.3749 L9423.1686,1294.3749 L9423.1686,1297.5487 L9419.5431,1297.5487 L9419.5431,1309.4262 L9423.1686,1309.4262 L9423.1686,1312.6 L9412.3165,1312.6 L9412.3165,1309.4262 L9415.942,1309.4262 L9415.942,1297.5487 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="9488.4794" y="1295.35">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="218.575" x="9442.7169" y="1327.9">EnrichmentService</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="9201.71" x2="9862.2988" y1="1340.65" y2="1340.65"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="9201.71" x2="9862.2988" y1="1348.65" y2="1348.65"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="9211.71" cy="1386.7" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="442.4257" x="9223.71" y="1377.45">GetLocationContext(loc : const City&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="620.2888" x="9237.01" y="1410">strategy : const ContextStrategy&amp;) : LocationContext</text></g><!--class WikipediaService--><g class="entity" data-qualified-name="Infrastructure. Enrichment.WikipediaService" data-source-line="439" id="ent0086"><rect fill="#EBECE3" height="221.3" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="739.0262" x="9182.49" y="2077.38"/><ellipse cx="9447.2436" cy="2098.655" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M9450.9394,2107.3801 Q9450.0849,2107.8196 9449.145,2108.0393 Q9448.205,2108.259 9447.1675,2108.259 Q9443.4809,2108.259 9441.54,2105.8298 Q9439.5991,2103.4006 9439.5991,2098.8108 Q9439.5991,2094.2087 9441.54,2091.7795 Q9443.4809,2089.3503 9447.1675,2089.3503 Q9448.205,2089.3503 9449.1572,2089.57 Q9450.1093,2089.7898 9450.9394,2090.2292 L9450.9394,2094.2331 Q9450.0117,2093.3786 9449.1389,2092.9819 Q9448.2661,2092.5852 9447.3384,2092.5852 Q9445.3608,2092.5852 9444.3537,2094.1538 Q9443.3467,2095.7224 9443.3467,2098.8108 Q9443.3467,2101.8869 9444.3537,2103.4555 Q9445.3608,2105.0241 9447.3384,2105.0241 Q9448.2661,2105.0241 9449.1389,2104.6274 Q9450.0117,2104.2307 9450.9394,2103.3762 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="199.5189" x="9472.2436" y="2107.18">WikipediaService</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="9183.49" x2="9920.5162" y1="2119.93" y2="2119.93"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="9190.49" y="2138.705"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="426.6252" x="9205.49" y="2148.73">client_ : std::unique_ptr&lt;WebClient&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="9190.49" y="2171.255"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="710.0262" x="9205.49" y="2181.28">extract_cache_ : std::unordered_map&lt;std::string, std::string&gt;</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="9183.49" x2="9920.5162" y1="2193.03" y2="2193.03"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="9193.49" cy="2231.08" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="442.4257" x="9205.49" y="2221.83">GetLocationContext(loc : const City&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="620.2888" x="9218.79" y="2254.38">strategy : const ContextStrategy&amp;) : LocationContext</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="9190.49" y="2276.905"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="568.864" x="9205.49" y="2286.93">FetchExtract(query : std::string_view) : std::string</text></g><!--class WebClient--><g class="entity" data-qualified-name="Infrastructure. Enrichment.WebClient" data-source-line="446" id="ent0087"><rect fill="#EBECE3" height="156.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="582.6328" x="9260.68" y="2836.55"/><ellipse cx="9485.4714" cy="2874.1" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M9480.071,2868.5487 L9480.071,2865.3749 L9490.923,2865.3749 L9490.923,2868.5487 L9487.2975,2868.5487 L9487.2975,2880.4262 L9490.923,2880.4262 L9490.923,2883.6 L9480.071,2883.6 L9480.071,2880.4262 L9483.6965,2880.4262 L9483.6965,2868.5487 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="9508.4714" y="2866.35">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="121.825" x="9511.0839" y="2898.9">WebClient</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="9261.68" x2="9842.3128" y1="2911.65" y2="2911.65"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="9261.68" x2="9842.3128" y1="2919.65" y2="2919.65"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="9271.68" cy="2941.425" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="446.1701" x="9283.68" y="2948.45">Get(url : const std::string&amp;) : std::string</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="9271.68" cy="2973.975" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="553.6328" x="9283.68" y="2981">UrlEncode(value : const std::string&amp;) : std::string</text></g><!--class HttpWebClient--><g class="entity" data-qualified-name="Infrastructure. Enrichment.HttpWebClient" data-source-line="451" id="ent0088"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="582.6328" x="9260.68" y="3251.05"/><ellipse cx="9459.9182" cy="3272.325" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M9463.614,3281.0501 Q9462.7595,3281.4896 9461.8195,3281.7093 Q9460.8796,3281.929 9459.842,3281.929 Q9456.1555,3281.929 9454.2146,3279.4998 Q9452.2736,3277.0706 9452.2736,3272.4808 Q9452.2736,3267.8787 9454.2146,3265.4495 Q9456.1555,3263.0203 9459.842,3263.0203 Q9460.8796,3263.0203 9461.8317,3263.24 Q9462.7839,3263.4598 9463.614,3263.8992 L9463.614,3267.9031 Q9462.6862,3267.0486 9461.8134,3266.6519 Q9460.9406,3266.2552 9460.0129,3266.2552 Q9458.0354,3266.2552 9457.0283,3267.8238 Q9456.0212,3269.3924 9456.0212,3272.4808 Q9456.0212,3275.5569 9457.0283,3277.1255 Q9458.0354,3278.6941 9460.0129,3278.6941 Q9460.9406,3278.6941 9461.8134,3278.2974 Q9462.6862,3277.9007 9463.614,3277.0462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="174.1564" x="9484.9182" y="3280.85">HttpWebClient</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="9261.68" x2="9842.3128" y1="3293.6" y2="3293.6"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="9261.68" x2="9842.3128" y1="3301.6" y2="3301.6"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="9271.68" cy="3323.375" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="446.1701" x="9283.68" y="3330.4">Get(url : const std::string&amp;) : std::string</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="9271.68" cy="3355.925" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="553.6328" x="9283.68" y="3362.95">UrlEncode(value : const std::string&amp;) : std::string</text></g><!--class IPostalCodeService--><g class="entity" data-qualified-name="Infrastructure. Postal Code Generation.IPostalCodeService" data-source-line="460" id="ent0090"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="672.0325" x="18402.98" y="412.73"/><ellipse cx="18621.0213" cy="450.28" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M18615.6209,444.7287 L18615.6209,441.5549 L18626.4729,441.5549 L18626.4729,444.7287 L18622.8474,444.7287 L18622.8474,456.6062 L18626.4729,456.6062 L18626.4729,459.78 L18615.6209,459.78 L18615.6209,456.6062 L18619.2464,456.6062 L18619.2464,444.7287 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="18695.4713" y="442.53">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="225.95" x="18646.0213" y="475.08">IPostalCodeService</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="18403.98" x2="19074.0125" y1="487.83" y2="487.83"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="18403.98" x2="19074.0125" y1="495.83" y2="495.83"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="18413.98" cy="517.605" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="643.0325" x="18425.98" y="524.63">GeneratePostalCode(location : const City&amp;) : std::string</text></g><!--class MockPostalCodeService--><g class="entity" data-qualified-name="Infrastructure. Postal Code Generation.MockPostalCodeService" data-source-line="464" id="ent0091"><rect fill="#EBECE3" height="91.1" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="672.0325" x="17749.98" y="1298.1"/><ellipse cx="17940.0524" cy="1319.375" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M17943.7482,1328.1001 Q17942.8937,1328.5396 17941.9538,1328.7593 Q17941.0138,1328.979 17939.9762,1328.979 Q17936.2897,1328.979 17934.3488,1326.5498 Q17932.4079,1324.1206 17932.4079,1319.5308 Q17932.4079,1314.9287 17934.3488,1312.4995 Q17936.2897,1310.0703 17939.9762,1310.0703 Q17941.0138,1310.0703 17941.966,1310.29 Q17942.9181,1310.5098 17943.7482,1310.9492 L17943.7482,1314.9531 Q17942.8205,1314.0986 17941.9477,1313.7019 Q17941.0748,1313.3052 17940.1471,1313.3052 Q17938.1696,1313.3052 17937.1625,1314.8738 Q17936.1554,1316.4424 17936.1554,1319.5308 Q17936.1554,1322.6069 17937.1625,1324.1755 Q17938.1696,1325.7441 17940.1471,1325.7441 Q17941.0748,1325.7441 17941.9477,1325.3474 Q17942.8205,1324.9507 17943.7482,1324.0962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="281.8878" x="17965.0524" y="1327.9">MockPostalCodeService</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="17750.98" x2="18421.0125" y1="1340.65" y2="1340.65"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="17750.98" x2="18421.0125" y1="1348.65" y2="1348.65"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="17760.98" cy="1370.425" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="643.0325" x="17772.98" y="1377.45">GeneratePostalCode(location : const City&amp;) : std::string</text></g><!--class XegerPostalCodeService--><g class="entity" data-qualified-name="Infrastructure. Postal Code Generation.XegerPostalCodeService" data-source-line="468" id="ent0092"><rect fill="#EBECE3" height="91.1" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="672.0325" x="19055.98" y="1298.1"/><ellipse cx="19244.1054" cy="1319.375" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M19247.8012,1328.1001 Q19246.9467,1328.5396 19246.0068,1328.7593 Q19245.0669,1328.979 19244.0293,1328.979 Q19240.3427,1328.979 19238.4018,1326.5498 Q19236.4609,1324.1206 19236.4609,1319.5308 Q19236.4609,1314.9287 19238.4018,1312.4995 Q19240.3427,1310.0703 19244.0293,1310.0703 Q19245.0669,1310.0703 19246.019,1310.29 Q19246.9711,1310.5098 19247.8012,1310.9492 L19247.8012,1314.9531 Q19246.8735,1314.0986 19246.0007,1313.7019 Q19245.1279,1313.3052 19244.2002,1313.3052 Q19242.2226,1313.3052 19241.2155,1314.8738 Q19240.2085,1316.4424 19240.2085,1319.5308 Q19240.2085,1322.6069 19241.2155,1324.1755 Q19242.2226,1325.7441 19244.2002,1325.7441 Q19245.1279,1325.7441 19246.0007,1325.3474 Q19246.8735,1324.9507 19247.8012,1324.0962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="285.7817" x="19269.1054" y="1327.9">XegerPostalCodeService</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="19056.98" x2="19727.0125" y1="1340.65" y2="1340.65"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="19056.98" x2="19727.0125" y1="1348.65" y2="1348.65"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="19066.98" cy="1370.425" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="643.0325" x="19078.98" y="1377.45">GeneratePostalCode(location : const City&amp;) : std::string</text></g><g class="entity" data-qualified-name="Infrastructure. Postal Code Generation.GMN93" data-source-line="473" id="ent0094"><path d="M18456.88,1273.55 L18456.88,1339.65 L18422.38,1343.65 L18456.88,1347.65 L18456.88,1413.75 A0,0 0 0 0 18456.88,1413.75 L19021.1182,1413.75 A0,0 0 0 0 19021.1182,1413.75 L19021.1182,1283.55 L19011.1182,1273.55 L18456.88,1273.55 A0,0 0 0 0 18456.88,1273.55" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M19011.1182,1273.55 L19011.1182,1283.55 L19021.1182,1283.55 L19011.1182,1273.55" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="534.7692" x="18462.88" y="1303.35">Implemented today: ignores postal_regex and</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="543.2382" x="18462.88" y="1335.9">returns postal_code_examples.front(). Not yet</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="448.2505" x="18462.88" y="1368.45">bound in main.cc's DI graph or used by</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="365.607" x="18462.88" y="1401">BiergartenPipelineOrchestrator.</text></g><g class="entity" data-qualified-name="Infrastructure. Postal Code Generation.GMN96" data-source-line="480" id="ent0097"><path d="M19763.18,1257.28 L19763.18,1339.65 L19728.51,1343.65 L19763.18,1347.65 L19763.18,1430.03 A0,0 0 0 0 19763.18,1430.03 L20324.8246,1430.03 A0,0 0 0 0 20324.8246,1430.03 L20324.8246,1267.28 L20314.8246,1257.28 L19763.18,1257.28 A0,0 0 0 0 19763.18,1257.28" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M20314.8246,1257.28 L20314.8246,1267.28 L20324.8246,1267.28 L20314.8246,1257.28" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="398.8567" x="19769.18" y="1287.08">Not implemented yet. Picks one of</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="540.6446" x="19769.18" y="1319.63">location.postal_regex and generates a random</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="517.3451" x="19769.18" y="1352.18">string matching it (a "xeger" -- the inverse of</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="529.701" x="19769.18" y="1384.73">regex matching) instead of always replaying a</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="427.5811" x="19769.18" y="1417.28">fixed example. See ROADMAP.md &#167;9.</text></g><!--class IPromptDirectory--><g class="entity" data-qualified-name="Infrastructure. Prompting.IPromptDirectory" data-source-line="493" id="ent0102"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="479.1885" x="6212.41" y="2852.83"/><ellipse cx="6346.5668" cy="2890.38" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M6341.1664,2884.8287 L6341.1664,2881.6549 L6352.0184,2881.6549 L6352.0184,2884.8287 L6348.3929,2884.8287 L6348.3929,2896.7062 L6352.0184,2896.7062 L6352.0184,2899.88 L6341.1664,2899.88 L6341.1664,2896.7062 L6344.7919,2896.7062 L6344.7919,2884.8287 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="6408.4793" y="2882.63">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="200.875" x="6371.5668" y="2915.18">IPromptDirectory</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="6213.41" x2="6690.5985" y1="2927.93" y2="2927.93"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="6213.41" x2="6690.5985" y1="2935.93" y2="2935.93"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="6223.41" cy="2957.705" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="450.1885" x="6235.41" y="2964.73">Load(key : std::string_view) : std::string</text></g><!--class PromptDirectory--><g class="entity" data-qualified-name="Infrastructure. Prompting.PromptDirectory" data-source-line="497" id="ent0103"><rect fill="#EBECE3" height="188.75" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="717.8574" x="6004.07" y="3218.5"/><ellipse cx="6260.4892" cy="3239.775" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M6264.185,3248.5001 Q6263.3305,3248.9396 6262.3905,3249.1593 Q6261.4506,3249.379 6260.413,3249.379 Q6256.7265,3249.379 6254.7856,3246.9498 Q6252.8446,3244.5206 6252.8446,3239.9308 Q6252.8446,3235.3287 6254.7856,3232.8995 Q6256.7265,3230.4703 6260.413,3230.4703 Q6261.4506,3230.4703 6262.4027,3230.69 Q6263.3549,3230.9098 6264.185,3231.3492 L6264.185,3235.3531 Q6263.2572,3234.4986 6262.3844,3234.1019 Q6261.5116,3233.7052 6260.5839,3233.7052 Q6258.6064,3233.7052 6257.5993,3235.2738 Q6256.5922,3236.8424 6256.5922,3239.9308 Q6256.5922,3243.0069 6257.5993,3244.5755 Q6258.6064,3246.1441 6260.5839,3246.1441 Q6261.5116,3246.1441 6262.3844,3245.7474 Q6263.2572,3245.3507 6264.185,3244.4962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="195.019" x="6285.4892" y="3248.3">PromptDirectory</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="6005.07" x2="6720.9274" y1="3261.05" y2="3261.05"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="6012.07" y="3279.825"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="400.9191" x="6027.07" y="3289.85">prompt_dir_ : std::filesystem::path</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="6012.07" y="3312.375"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="610.1761" x="6027.07" y="3322.4">cache_ : std::unordered_map&lt;std::string, std::string&gt;</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="6005.07" x2="6720.9274" y1="3334.15" y2="3334.15"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="6015.07" cy="3355.925" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="688.8574" x="6027.07" y="3362.95">PromptDirectory(prompt_dir : const std::filesystem::path&amp;)</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="6015.07" cy="3388.475" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="450.1885" x="6027.07" y="3395.5">Load(key : std::string_view) : std::string</text></g><!--class DataGenerator--><g class="entity" data-qualified-name="Infrastructure. Data Generation.DataGenerator" data-source-line="509" id="ent0106"><rect fill="#EBECE3" height="579.35" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="629.1699" x="8171.42" y="1053.98"/><ellipse cx="8394.3424" cy="1091.53" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M8388.942,1085.9787 L8388.942,1082.8049 L8399.7941,1082.8049 L8399.7941,1085.9787 L8396.1686,1085.9787 L8396.1686,1097.8562 L8399.7941,1097.8562 L8399.7941,1101.03 L8388.942,1101.03 L8388.942,1097.8562 L8392.5675,1097.8562 L8392.5675,1085.9787 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="8442.4799" y="1083.78">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="173.325" x="8419.3424" y="1116.33">DataGenerator</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="8172.42" x2="8799.5899" y1="1129.08" y2="1129.08"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="8172.42" x2="8799.5899" y1="1137.08" y2="1137.08"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="8182.42" cy="1175.13" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="467.3823" x="8194.42" y="1165.88">GenerateBrewery(location : const City&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="586.8698" x="8207.72" y="1198.43">context : const LocationContext&amp;) : BreweryResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="8182.42" cy="1272.78" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="428.8381" x="8194.42" y="1230.98">GenerateBeer(brewery_id : uint64_t,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="254.5692" x="8207.72" y="1263.53">location : const City&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="397.5007" x="8207.72" y="1296.08">context : const LocationContext&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="427.6008" x="8207.72" y="1328.63">style : const BeerStyle&amp;) : BeerResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="8182.42" cy="1386.705" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="477.7946" x="8194.42" y="1361.18">GenerateUser(city : const EnrichedCity&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="353.8195" x="8207.72" y="1393.73">persona : const UserPersona&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="392.288" x="8207.72" y="1426.28">name : const Name&amp;) : UserResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="8182.42" cy="1484.355" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="552.251" x="8194.42" y="1458.83">GenerateCheckin(user : const GeneratedUser&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="428.401" x="8207.72" y="1491.38">brewery : const GeneratedBrewery&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="541.976" x="8207.72" y="1523.93">timestamp : const std::string&amp;) : CheckinResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="8182.42" cy="1582.005" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="531.051" x="8194.42" y="1556.48">GenerateRating(user : const GeneratedUser&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="343.9756" x="8207.72" y="1589.03">beer : const GeneratedBeer&amp;,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="419.7442" x="8207.72" y="1621.58">checkin_id : uint64_t) : RatingResult</text></g><!--class MockGenerator--><g class="entity" data-qualified-name="Infrastructure. Data Generation.MockGenerator" data-source-line="517" id="ent0107"><rect fill="#EBECE3" height="253.85" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="599.9008" x="8526.05" y="2061.1"/><ellipse cx="8730.4034" cy="2082.375" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M8734.0992,2091.1001 Q8733.2447,2091.5396 8732.3048,2091.7593 Q8731.3648,2091.979 8730.3272,2091.979 Q8726.6407,2091.979 8724.6998,2089.5498 Q8722.7589,2087.1206 8722.7589,2082.5308 Q8722.7589,2077.9287 8724.6998,2075.4995 Q8726.6407,2073.0703 8730.3272,2073.0703 Q8731.3648,2073.0703 8732.317,2073.29 Q8733.2691,2073.5098 8734.0992,2073.9492 L8734.0992,2077.9531 Q8733.1715,2077.0986 8732.2987,2076.7019 Q8731.4259,2076.3052 8730.4981,2076.3052 Q8728.5206,2076.3052 8727.5135,2077.8738 Q8726.5064,2079.4424 8726.5064,2082.5308 Q8726.5064,2085.6069 8727.5135,2087.1755 Q8728.5206,2088.7441 8730.4981,2088.7441 Q8731.4259,2088.7441 8732.2987,2088.3474 Q8733.1715,2087.9507 8734.0992,2087.0962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="181.194" x="8755.4034" y="2090.9">MockGenerator</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="8527.05" x2="9124.9508" y1="2103.65" y2="2103.65"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="8527.05" x2="9124.9508" y1="2111.65" y2="2111.65"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="8537.05" cy="2133.425" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="421.601" x="8549.05" y="2140.45">GenerateBrewery(...) : BreweryResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="8537.05" cy="2165.975" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="337.1756" x="8549.05" y="2173">GenerateBeer(...) : BeerResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="8537.05" cy="2198.525" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="336.5006" x="8549.05" y="2205.55">GenerateUser(...) : UserResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="8537.05" cy="2231.075" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="419.163" x="8549.05" y="2238.1">GenerateCheckin(...) : CheckinResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="8537.05" cy="2263.625" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="376.7633" x="8549.05" y="2270.65">GenerateRating(...) : RatingResult</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8534.05" y="2293.175"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="570.9008" x="8549.05" y="2303.2">DeterministicHash(location : const City&amp;) : size_t</text></g><!--class LlamaGenerator--><g class="entity" data-qualified-name="Infrastructure. Data Generation.LlamaGenerator" data-source-line="526" id="ent0108"><rect fill="#EBECE3" height="514.25" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="687.6946" x="7803.15" y="1930.9"/><ellipse cx="8048.6722" cy="1952.175" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M8052.368,1960.9001 Q8051.5135,1961.3396 8050.5735,1961.5593 Q8049.6336,1961.779 8048.596,1961.779 Q8044.9095,1961.779 8042.9685,1959.3498 Q8041.0276,1956.9206 8041.0276,1952.3308 Q8041.0276,1947.7287 8042.9685,1945.2995 Q8044.9095,1942.8703 8048.596,1942.8703 Q8049.6336,1942.8703 8050.5857,1943.09 Q8051.5379,1943.3098 8052.368,1943.7492 L8052.368,1947.7531 Q8051.4402,1946.8986 8050.5674,1946.5019 Q8049.6946,1946.1052 8048.7669,1946.1052 Q8046.7893,1946.1052 8045.7823,1947.6738 Q8044.7752,1949.2424 8044.7752,1952.3308 Q8044.7752,1955.4069 8045.7823,1956.9755 Q8046.7893,1958.5441 8048.7669,1958.5441 Q8049.6946,1958.5441 8050.5674,1958.1474 Q8051.4402,1957.7507 8052.368,1956.8962 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="186.6503" x="8073.6722" y="1960.7">LlamaGenerator</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="7804.15" x2="8489.8446" y1="1973.45" y2="1973.45"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="7811.15" y="1992.225"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="259.1498" x="7826.15" y="2002.25">model_ : ModelHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="7811.15" y="2024.775"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="298.2252" x="7826.15" y="2034.8">context_ : ContextHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="7811.15" y="2057.325"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="658.6946" x="7826.15" y="2067.35">prompt_formatter_ : std::unique_ptr&lt;PromptFormatter&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="7811.15" y="2089.875"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="652.5506" x="7826.15" y="2099.9">prompt_directory_ : std::unique_ptr&lt;IPromptDirectory&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="7811.15" y="2122.425"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="219.9004" x="7826.15" y="2132.45">rng_ : std::mt19937</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="7804.15" x2="8489.8446" y1="2144.2" y2="2144.2"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7814.15" cy="2165.975" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="421.601" x="7826.15" y="2173">GenerateBrewery(...) : BreweryResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7814.15" cy="2198.525" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="337.1756" x="7826.15" y="2205.55">GenerateBeer(...) : BeerResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7814.15" cy="2231.075" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="336.5006" x="7826.15" y="2238.1">GenerateUser(...) : UserResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7814.15" cy="2263.625" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="419.163" x="7826.15" y="2270.65">GenerateCheckin(...) : CheckinResult</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7814.15" cy="2296.175" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="376.7633" x="7826.15" y="2303.2">GenerateRating(...) : RatingResult</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="7811.15" y="2325.725"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="516.8508" x="7826.15" y="2335.75">Load(opts : const GeneratorOptions&amp;) : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="7811.15" y="2374.55"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="420.7691" x="7826.15" y="2368.3">Infer(system_prompt, user_prompt,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="400.1508" x="7839.45" y="2400.85">max_tokens, grammar) : std::string</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="7811.15" y="2423.375"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="399.4818" x="7826.15" y="2433.4">ValidateModelArchitecture() : void</text></g><!--class PromptFormatter--><g class="entity" data-qualified-name="Infrastructure. Data Generation.PromptFormatter" data-source-line="542" id="ent0109"><rect fill="#EBECE3" height="188.75" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="539.4949" x="7877.25" y="2820.28"/><ellipse cx="8040.9349" cy="2857.83" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M8035.5346,2852.2787 L8035.5346,2849.1049 L8046.3866,2849.1049 L8046.3866,2852.2787 L8042.7611,2852.2787 L8042.7611,2864.1562 L8046.3866,2864.1562 L8046.3866,2867.33 L8035.5346,2867.33 L8035.5346,2864.1562 L8039.16,2864.1562 L8039.16,2852.2787 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="8103.4724" y="2850.08">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="202.125" x="8065.9349" y="2882.63">PromptFormatter</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="7878.25" x2="8415.7449" y1="2895.38" y2="2895.38"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="7878.25" x2="8415.7449" y1="2903.38" y2="2903.38"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7888.25" cy="2941.43" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="487.5133" x="7900.25" y="2932.18">Format(system_prompt : std::string_view,</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="497.1948" x="7913.55" y="2964.73">user_prompt : std::string_view) : std::string</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7888.25" cy="2990.255" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="476.6135" x="7900.25" y="2997.28">ExpectedArchitecture() : std::string_view</text></g><!--class Gemma4JinjaPromptFormatter--><g class="entity" data-qualified-name="Infrastructure. Data Generation.Gemma4JinjaPromptFormatter" data-source-line="547" id="ent0110"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="505.6135" x="7894.19" y="3251.05"/><ellipse cx="7961.1434" cy="3272.325" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M7964.8392,3281.0501 Q7963.9847,3281.4896 7963.0448,3281.7093 Q7962.1048,3281.929 7961.0672,3281.929 Q7957.3807,3281.929 7955.4398,3279.4998 Q7953.4989,3277.0706 7953.4989,3272.4808 Q7953.4989,3267.8787 7955.4398,3265.4495 Q7957.3807,3263.0203 7961.0672,3263.0203 Q7962.1048,3263.0203 7963.057,3263.24 Q7964.0091,3263.4598 7964.8392,3263.8992 L7964.8392,3267.9031 Q7963.9115,3267.0486 7963.0386,3266.6519 Q7962.1658,3266.2552 7961.2381,3266.2552 Q7959.2606,3266.2552 7958.2535,3267.8238 Q7957.2464,3269.3924 7957.2464,3272.4808 Q7957.2464,3275.5569 7958.2535,3277.1255 Q7959.2606,3278.6941 7961.2381,3278.6941 Q7962.1658,3278.6941 7963.0386,3278.2974 Q7963.9115,3277.9007 7964.8392,3277.0462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="361.7067" x="7986.1434" y="3280.85">Gemma4JinjaPromptFormatter</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="7895.19" x2="8398.8035" y1="3293.6" y2="3293.6"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="7895.19" x2="8398.8035" y1="3301.6" y2="3301.6"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7905.19" cy="3323.375" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="248.9445" x="7917.19" y="3330.4">Format(...) : std::string</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="7905.19" cy="3355.925" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="476.6135" x="7917.19" y="3362.95">ExpectedArchitecture() : std::string_view</text></g><!--class ExportService--><g class="entity" data-qualified-name="Infrastructure. Data Export.ExportService" data-source-line="556" id="ent0112"><rect fill="#EBECE3" height="351.5" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="778.6015" x="16915.7" y="1167.9"/><ellipse cx="17219.2007" cy="1205.45" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M17213.8004,1199.8987 L17213.8004,1196.7249 L17224.6524,1196.7249 L17224.6524,1199.8987 L17221.0269,1199.8987 L17221.0269,1211.7762 L17224.6524,1211.7762 L17224.6524,1214.95 L17213.8004,1214.95 L17213.8004,1211.7762 L17217.4258,1211.7762 L17217.4258,1199.8987 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="17261.4757" y="1197.7">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="161.6" x="17244.2007" y="1230.25">ExportService</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="16916.7" x2="17693.3015" y1="1243" y2="1243"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="16916.7" x2="17693.3015" y1="1251" y2="1251"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16926.7" cy="1272.775" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="179.4066" x="16938.7" y="1279.8">Initialize() : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16926.7" cy="1305.325" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="749.6015" x="16938.7" y="1312.35">ProcessBrewery(brewery : const GeneratedBrewery&amp;) : uint64_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16926.7" cy="1337.875" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="622.9633" x="16938.7" y="1344.9">ProcessBeer(beer : const GeneratedBeer&amp;) : uint64_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16926.7" cy="1370.425" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="619.3073" x="16938.7" y="1377.45">ProcessUser(user : const GeneratedUser&amp;) : uint64_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16926.7" cy="1402.975" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="741.7197" x="16938.7" y="1410">ProcessCheckin(checkin : const GeneratedCheckin&amp;) : uint64_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16926.7" cy="1435.525" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="624.1639" x="16938.7" y="1442.55">ProcessRating(rating : const GeneratedRating&amp;) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16926.7" cy="1468.075" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="627.0888" x="16938.7" y="1475.1">ProcessFollow(follow : const GeneratedFollow&amp;) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16926.7" cy="1500.625" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="171.169" x="16938.7" y="1507.65">Finalize() : void</text></g><!--class SqliteExportService--><g class="entity" data-qualified-name="Infrastructure. Data Export.SqliteExportService" data-source-line="567" id="ent0113"><rect fill="#EBECE3" height="839.75" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="766.7638" x="16921.62" y="1768.15"/><ellipse cx="17186.2955" cy="1789.425" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M17189.9913,1798.1501 Q17189.1368,1798.5896 17188.1968,1798.8093 Q17187.2569,1799.029 17186.2193,1799.029 Q17182.5328,1799.029 17180.5918,1796.5998 Q17178.6509,1794.1706 17178.6509,1789.5808 Q17178.6509,1784.9787 17180.5918,1782.5495 Q17182.5328,1780.1203 17186.2193,1780.1203 Q17187.2569,1780.1203 17188.209,1780.34 Q17189.1612,1780.5598 17189.9913,1780.9992 L17189.9913,1785.0031 Q17189.0635,1784.1486 17188.1907,1783.7519 Q17187.3179,1783.3552 17186.3902,1783.3552 Q17184.4126,1783.3552 17183.4056,1784.9238 Q17182.3985,1786.4924 17182.3985,1789.5808 Q17182.3985,1792.6569 17183.4056,1794.2255 Q17184.4126,1795.7941 17186.3902,1795.7941 Q17187.3179,1795.7941 17188.1907,1795.3974 Q17189.0635,1795.0007 17189.9913,1794.1462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="227.4129" x="17211.2955" y="1797.95">SqliteExportService</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="16922.62" x2="17687.3838" y1="1810.7" y2="1810.7"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="1829.475"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="685.2754" x="16944.62" y="1839.5">date_time_provider_ : std::unique_ptr&lt;DateTimeProvider&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="1862.025"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="416.8437" x="16944.62" y="1872.05">db_handle_ : SqliteDatabaseHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="1894.575"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="550.3255" x="16944.62" y="1904.6">insert_location_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="1927.125"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="552.6006" x="16944.62" y="1937.15">insert_brewery_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="1959.675"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="510.3878" x="16944.62" y="1969.7">insert_beer_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="1992.225"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="507.4067" x="16944.62" y="2002.25">insert_user_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="2024.775"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="547.1567" x="16944.62" y="2034.8">insert_checkin_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="2057.325"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="523.9818" x="16944.62" y="2067.35">insert_rating_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="2089.875"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="525.4443" x="16944.62" y="2099.9">insert_follow_stmt_ : SqliteStatementHandle</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="2122.425"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="293.6815" x="16944.62" y="2132.45">transaction_open_ : bool</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="2154.975"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="707.607" x="16944.62" y="2165">location_cache_ : std::unordered_map&lt;std::string, uint64_t&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="2187.525"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="709.882" x="16944.62" y="2197.55">brewery_cache_ : std::unordered_map&lt;std::string, uint64_t&gt;</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="16922.62" x2="17687.3838" y1="2209.3" y2="2209.3"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16932.62" cy="2231.075" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="179.4066" x="16944.62" y="2238.1">Initialize() : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16932.62" cy="2263.625" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="737.7638" x="16944.62" y="2270.65">ProcessRecord(brewery : const GeneratedBrewery&amp;) : uint64_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16932.62" cy="2296.175" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="653.3384" x="16944.62" y="2303.2">ProcessRecord(beer : const GeneratedBeer&amp;) : uint64_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16932.62" cy="2328.725" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="650.0197" x="16944.62" y="2335.75">ProcessRecord(user : const GeneratedUser&amp;) : uint64_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16932.62" cy="2361.275" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="731.101" x="16944.62" y="2368.3">ProcessRecord(checkin : const GeneratedCheckin&amp;) : uint64_t</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16932.62" cy="2393.825" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="634.7451" x="16944.62" y="2400.85">ProcessRecord(rating : const GeneratedRating&amp;) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16932.62" cy="2426.375" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="636.9388" x="16944.62" y="2433.4">ProcessRecord(follow : const GeneratedFollow&amp;) : void</text><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="16932.62" cy="2458.925" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="171.169" x="16944.62" y="2465.95">Finalize() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="2488.475"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="272.6504" x="16944.62" y="2498.5">InitializeSchema() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="2521.025"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="312.3755" x="16944.62" y="2531.05">PrepareStatements() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="2553.575"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="398.9756" x="16944.62" y="2563.6">RollbackAndCloseNoThrow() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="16929.62" y="2586.125"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="306.238" x="16944.62" y="2596.15">FinalizeStatements() : void</text></g><!--class DateTimeProvider--><g class="entity" data-qualified-name="Infrastructure. Data Export.DateTimeProvider" data-source-line="594" id="ent0114"><rect fill="#EBECE3" height="123.65" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="393.7631" x="17108.12" y="2852.83"/><ellipse cx="17195.6391" cy="2890.38" fill="#B4A7E5" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M17190.2387,2884.8287 L17190.2387,2881.6549 L17201.0907,2881.6549 L17201.0907,2884.8287 L17197.4652,2884.8287 L17197.4652,2896.7062 L17201.0907,2896.7062 L17201.0907,2899.88 L17190.2387,2899.88 L17190.2387,2896.7062 L17193.8642,2896.7062 L17193.8642,2884.8287 Z " fill="#14180C"/><text fill="#4A5837" font-family="DM Sans" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="127.05" x="17261.4766" y="2882.63">&#171;interface&#187;</text><text fill="#3F4724" font-family="'DM Sans'" font-size="25" font-style="italic" lengthAdjust="spacing" textLength="208.725" x="17220.6391" y="2915.18">DateTimeProvider</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="17109.12" x2="17500.8831" y1="2927.93" y2="2927.93"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="17109.12" x2="17500.8831" y1="2935.93" y2="2935.93"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="17119.12" cy="2957.705" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="364.7631" x="17131.12" y="2964.73">GetUtcTimestamp() : std::string</text></g><!--class SystemDateTimeProvider--><g class="entity" data-qualified-name="Infrastructure. Data Export.SystemDateTimeProvider" data-source-line="598" id="ent0115"><rect fill="#EBECE3" height="91.1" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="393.7631" x="17108.12" y="3267.32"/><ellipse cx="17153.2833" cy="3288.595" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M17156.9791,3297.3201 Q17156.1246,3297.7596 17155.1847,3297.9793 Q17154.2447,3298.199 17153.2071,3298.199 Q17149.5206,3298.199 17147.5797,3295.7698 Q17145.6388,3293.3406 17145.6388,3288.7508 Q17145.6388,3284.1487 17147.5797,3281.7195 Q17149.5206,3279.2903 17153.2071,3279.2903 Q17154.2447,3279.2903 17155.1969,3279.51 Q17156.149,3279.7298 17156.9791,3280.1692 L17156.9791,3284.1731 Q17156.0514,3283.3186 17155.1786,3282.9219 Q17154.3058,3282.5252 17153.378,3282.5252 Q17151.4005,3282.5252 17150.3934,3284.0938 Q17149.3863,3285.6624 17149.3863,3288.7508 Q17149.3863,3291.8269 17150.3934,3293.3955 Q17151.4005,3294.9641 17153.378,3294.9641 Q17154.3058,3294.9641 17155.1786,3294.5674 Q17156.0514,3294.1707 17156.9791,3293.3162 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="295.4002" x="17176.3196" y="3297.12">SystemDateTimeProvider</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="17109.12" x2="17500.8831" y1="3309.87" y2="3309.87"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="17109.12" x2="17500.8831" y1="3317.87" y2="3317.87"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="17119.12" cy="3339.645" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="364.7631" x="17131.12" y="3346.67">GetUtcTimestamp() : std::string</text></g><!--class BiergartenPipelineOrchestrator--><g class="entity" data-qualified-name="BiergartenPipelineOrchestrator" data-source-line="604" id="ent0116"><rect fill="#EBECE3" height="815.2" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="836.4139" x="8067.79" y="66.95"/><ellipse cx="8300.6716" cy="88.225" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M8304.3674,96.9501 Q8303.5129,97.3896 8302.573,97.6093 Q8301.633,97.829 8300.5954,97.829 Q8296.9089,97.829 8294.968,95.3998 Q8293.0271,92.9706 8293.0271,88.3808 Q8293.0271,83.7787 8294.968,81.3495 Q8296.9089,78.9203 8300.5954,78.9203 Q8301.633,78.9203 8302.5852,79.14 Q8303.5373,79.3598 8304.3674,79.7992 L8304.3674,83.8031 Q8303.4397,82.9486 8302.5669,82.5519 Q8301.6941,82.1552 8300.7663,82.1552 Q8298.7888,82.1552 8297.7817,83.7238 Q8296.7746,85.2924 8296.7746,88.3808 Q8296.7746,91.4569 8297.7817,93.0255 Q8298.7888,94.5941 8300.7663,94.5941 Q8301.6941,94.5941 8302.5669,94.1974 Q8303.4397,93.8007 8304.3674,92.9462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="360.6507" x="8325.6716" y="96.75">BiergartenPipelineOrchestrator</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="8068.79" x2="8903.2039" y1="109.5" y2="109.5"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="128.275"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="741.4819" x="8090.79" y="138.3">curated_data_service_ : std::unique_ptr&lt;ICuratedDataService&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="160.825"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="692.3258" x="8090.79" y="170.85">enrichment_service_ : std::unique_ptr&lt;EnrichmentService&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="193.375"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="526.5819" x="8090.79" y="203.4">generator_ : std::unique_ptr&lt;DataGenerator&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="225.925"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="391.613" x="8090.79" y="235.95">logger_ : std::unique_ptr&lt;Logger&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="258.475"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="501.8068" x="8090.79" y="268.5">exporter_ : std::unique_ptr&lt;ExportService&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="291.025"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="748.0886" x="8090.79" y="301.05">brewery_context_strategy_ : std::unique_ptr&lt;ContextStrategy&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="323.575"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="662.9197" x="8090.79" y="333.6">sampling_strategy_ : std::unique_ptr&lt;SamplingStrategy&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="356.125"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="789.1635" x="8090.79" y="366.15">beer_selection_strategy_ : std::unique_ptr&lt;BeerSelectionStrategy&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="388.675"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="772.6134" x="8090.79" y="398.7">checkin_strategy_ : std::unique_ptr&lt;CheckinDistributionStrategy&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="421.225"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="724.2263" x="8090.79" y="431.25">follow_strategy_ : std::unique_ptr&lt;FollowGenerationStrategy&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="453.775"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="521.9255" x="8090.79" y="463.8">beer_style_palette_ : std::vector&lt;BeerStyle&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="486.325"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="347.7252" x="8090.79" y="496.35">options_ : ApplicationOptions</text><line style="stroke:#4A5837;stroke-width:1;" x1="8068.79" x2="8903.2039" y1="508.1" y2="508.1"/><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="526.875"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="480.3693" x="8090.79" y="536.9">user_pool_ : std::vector&lt;GeneratedUser&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="559.425"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="568.1133" x="8090.79" y="569.45">brewery_pool_ : std::vector&lt;GeneratedBrewery&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="591.975"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="483.688" x="8090.79" y="602">beer_pool_ : std::vector&lt;GeneratedBeer&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="624.525"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="561.4505" x="8090.79" y="634.55">checkin_pool_ : std::vector&lt;GeneratedCheckin&gt;</text><g data-visibility-modifier="PRIVATE_FIELD"><rect fill="none" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="657.075"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="519.2695" x="8090.79" y="667.1">follow_pool_ : std::vector&lt;GeneratedFollow&gt;</text><line style="stroke:#4A5837;stroke-width:1;" x1="8068.79" x2="8903.2039" y1="678.85" y2="678.85"/><g data-visibility-modifier="PUBLIC_METHOD"><ellipse cx="8078.79" cy="700.625" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1;"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="131.3939" x="8090.79" y="707.65">Run() : bool</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="730.175"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="665.5138" x="8090.79" y="740.2">RunUserPhase(locations : const std::vector&lt;City&gt;&amp;) : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="762.725"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="807.4139" x="8090.79" y="772.75">RunBreweryAndBeerPhase(locations : const std::vector&lt;City&gt;&amp;) : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="795.275"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="293.119" x="8090.79" y="805.3">RunCheckinPhase() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="827.825"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="271.9192" x="8090.79" y="837.85">RunRatingPhase() : void</text><g data-visibility-modifier="PRIVATE_METHOD"><rect fill="#F24D5C" height="6" style="stroke:#C82930;stroke-width:1;" width="6" x="8075.79" y="860.375"/></g><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="272.6505" x="8090.79" y="870.4">RunFollowPhase() : void</text></g><!--class Logger--><g class="entity" data-qualified-name="Logger" data-source-line="642" id="ent0126"><rect fill="#EBECE3" height="58.55" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="117.3315" x="6902.33" y="1314.38"/><ellipse cx="6920.33" cy="1335.655" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M6924.0258,1344.3801 Q6923.1713,1344.8196 6922.2314,1345.0393 Q6921.2914,1345.259 6920.2538,1345.259 Q6916.5673,1345.259 6914.6264,1342.8298 Q6912.6855,1340.4006 6912.6855,1335.8108 Q6912.6855,1331.2087 6914.6264,1328.7795 Q6916.5673,1326.3503 6920.2538,1326.3503 Q6921.2914,1326.3503 6922.2436,1326.57 Q6923.1957,1326.7898 6924.0258,1327.2292 L6924.0258,1331.2331 Q6923.0981,1330.3786 6922.2253,1329.9819 Q6921.3525,1329.5852 6920.4247,1329.5852 Q6918.4472,1329.5852 6917.4401,1331.1538 Q6916.433,1332.7224 6916.433,1335.8108 Q6916.433,1338.8869 6917.4401,1340.4555 Q6918.4472,1342.0241 6920.4247,1342.0241 Q6921.3525,1342.0241 6922.2253,1341.6274 Q6923.0981,1341.2307 6924.0258,1340.3762 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="79.3315" x="6937.33" y="1344.18">Logger</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="6903.33" x2="7018.6615" y1="1356.93" y2="1356.93"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="6903.33" x2="7018.6615" y1="1364.93" y2="1364.93"/></g><!--class PipelineLogger--><g class="entity" data-qualified-name="PipelineLogger" data-source-line="654" id="ent0135"><rect fill="#EBECE3" height="58.55" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="207.8003" x="5614.1" y="2158.75"/><ellipse cx="5632.1" cy="2180.025" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M5635.7958,2188.7501 Q5634.9413,2189.1896 5634.0014,2189.4093 Q5633.0614,2189.629 5632.0238,2189.629 Q5628.3373,2189.629 5626.3964,2187.1998 Q5624.4555,2184.7706 5624.4555,2180.1808 Q5624.4555,2175.5787 5626.3964,2173.1495 Q5628.3373,2170.7203 5632.0238,2170.7203 Q5633.0614,2170.7203 5634.0136,2170.94 Q5634.9657,2171.1598 5635.7958,2171.5992 L5635.7958,2175.6031 Q5634.8681,2174.7486 5633.9953,2174.3519 Q5633.1225,2173.9552 5632.1947,2173.9552 Q5630.2172,2173.9552 5629.2101,2175.5238 Q5628.203,2177.0924 5628.203,2180.1808 Q5628.203,2183.2569 5629.2101,2184.8255 Q5630.2172,2186.3941 5632.1947,2186.3941 Q5633.1225,2186.3941 5633.9953,2185.9974 Q5634.8681,2185.6007 5635.7958,2184.7462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="169.8003" x="5649.1" y="2188.55">PipelineLogger</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="5615.1" x2="5820.9003" y1="2201.3" y2="2201.3"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="5615.1" x2="5820.9003" y1="2209.3" y2="2209.3"/></g><!--class LogWorker--><g class="entity" data-qualified-name="LogWorker" data-source-line="681" id="ent0159"><rect fill="#EBECE3" height="58.55" rx="2.5" ry="2.5" style="stroke:#4A5837;stroke-width:0.5;" width="164.2628" x="5856.87" y="2158.75"/><ellipse cx="5874.87" cy="2180.025" fill="#ADD1B2" rx="14" ry="14" style="stroke:#181818;stroke-width:1;"/><path d="M5878.5658,2188.7501 Q5877.7113,2189.1896 5876.7714,2189.4093 Q5875.8314,2189.629 5874.7938,2189.629 Q5871.1073,2189.629 5869.1664,2187.1998 Q5867.2255,2184.7706 5867.2255,2180.1808 Q5867.2255,2175.5787 5869.1664,2173.1495 Q5871.1073,2170.7203 5874.7938,2170.7203 Q5875.8314,2170.7203 5876.7836,2170.94 Q5877.7357,2171.1598 5878.5658,2171.5992 L5878.5658,2175.6031 Q5877.6381,2174.7486 5876.7653,2174.3519 Q5875.8925,2173.9552 5874.9647,2173.9552 Q5872.9872,2173.9552 5871.9801,2175.5238 Q5870.973,2177.0924 5870.973,2180.1808 Q5870.973,2183.2569 5871.9801,2184.8255 Q5872.9872,2186.3941 5874.9647,2186.3941 Q5875.8925,2186.3941 5876.7653,2185.9974 Q5877.6381,2185.6007 5878.5658,2184.7462 Z " fill="#14180C"/><text fill="#3F4724" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="126.2628" x="5891.87" y="2188.55">LogWorker</text><line style="stroke:#4A5837;stroke-width:0.5;" x1="5857.87" x2="6020.1328" y1="2201.3" y2="2201.3"/><line style="stroke:#4A5837;stroke-width:0.5;" x1="5857.87" x2="6020.1328" y1="2209.3" y2="2209.3"/></g><!--link ForenameEntry to Name--><g class="link" data-entity-1="ent0019" data-entity-2="ent0018" data-link-type="dependency" data-source-line="134" id="lnk23"><path codeLine="134" d="M160.51,1405.91 C161.76,1556.31 164.9301,1937.5502 166.3101,2103.5702" fill="none" id="ForenameEntry-to-Name" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#656F33" points="166.36,2109.57,170.2851,2100.5371,166.3184,2104.5702,162.2853,2100.6036,166.36,2109.57" style="stroke:#656F33;stroke-width:1;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="289.2501" x="164.08" y="1729.95">SampleName() produces</text></g><!--reverse link LocationContext to Completeness--><g class="link" data-entity-1="ent0011" data-entity-2="ent0012" data-link-type="composition" data-source-line="217" id="lnk37"><path codeLine="217" d="M536,2278.57 C536,2417.86 536,2696.83 536,2836.11" fill="none" id="LocationContext-backto-Completeness" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="536,2266.57,532,2272.57,536,2278.57,540,2272.57,536,2266.57" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link ApplicationOptions to GeneratorOptions--><g class="link" data-entity-1="ent0042" data-entity-2="ent0040" data-link-type="composition" data-source-line="245" id="lnk43"><path codeLine="245" d="M7490,2262.18 C7490,2393.72 7490,2691.3 7490,2836.25" fill="none" id="ApplicationOptions-backto-GeneratorOptions" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="7490,2250.18,7486,2256.18,7490,2262.18,7494,2256.18,7490,2250.18" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link ApplicationOptions to PipelineOptions--><g class="link" data-entity-1="ent0042" data-entity-2="ent0041" data-link-type="composition" data-source-line="246" id="lnk44"><path codeLine="246" d="M7440.7963,2260.0441 C7346.1263,2396.6941 7125.16,2715.66 7030.43,2852.4" fill="none" id="ApplicationOptions-backto-PipelineOptions" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="7447.63,2250.18,7440.9251,2252.8341,7440.7963,2260.0441,7447.5011,2257.39,7447.63,2250.18" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratorOptions to SamplingOptions--><g class="link" data-entity-1="ent0040" data-entity-2="ent0039" data-link-type="aggregation" data-source-line="247" id="lnk45"><path codeLine="247" d="M7490,3004.99 C7490,3064.44 7490,3135.37 7490,3201.75" fill="none" id="GeneratorOptions-backto-SamplingOptions" style="stroke:#656F33;stroke-width:1;"/><polygon fill="none" points="7490,2992.99,7486,2998.99,7490,3004.99,7494,2998.99,7490,2992.99" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link LogEntry to LogLevel--><g class="link" data-entity-1="ent0063" data-entity-2="ent0061" data-link-type="composition" data-source-line="369" id="lnk67"><path codeLine="369" d="M20929.6708,2310.9605 C20909.4608,2453.1005 20876.33,2686.18 20857.33,2819.89" fill="none" id="LogEntry-backto-LogLevel" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="20931.36,2299.08,20926.5552,2304.4572,20929.6708,2310.9605,20934.4756,2305.5833,20931.36,2299.08" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link LogEntry to PipelinePhase--><g class="link" data-entity-1="ent0063" data-entity-2="ent0062" data-link-type="composition" data-source-line="370" id="lnk68"><path codeLine="370" d="M20975.5611,2310.7627 C21005.1711,2436.9627 21051.05,2632.54 21083.54,2771.02" fill="none" id="LogEntry-backto-PipelinePhase" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="20972.82,2299.08,20970.2963,2305.8351,20975.5611,2310.7627,20978.0848,2304.0077,20972.82,2299.08" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link ILogger to LogProducer--><g class="link" data-entity-1="ent0064" data-entity-2="ent0065" data-link-type="extension" data-source-line="371" id="lnk69"><path codeLine="371" d="M20632,554.87 C20632,714.27 20632,1122.33 20632,1281.52" fill="none" id="ILogger-backto-LogProducer" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="20632,536.87,20626,554.87,20638,554.87,20632,536.87" style="stroke:#656F33;stroke-width:1;"/></g><!--link LogProducer to LogEntry--><g class="link" data-entity-1="ent0065" data-entity-2="ent0063" data-link-type="dependency" data-source-line="372" id="lnk70"><path codeLine="372" d="M20654.91,1405.91 C20707.75,1547.22 20836.6784,1892.0001 20903.8184,2071.5401" fill="none" id="LogProducer-to-LogEntry" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#656F33" points="20905.92,2077.16,20906.5142,2067.3291,20904.1687,2072.4767,20899.021,2070.1312,20905.92,2077.16" style="stroke:#656F33;stroke-width:1;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="64.8188" x="20771.64" y="1729.95">emits</text></g><!--link LogDispatcher to LogEntry--><g class="link" data-entity-1="ent0066" data-entity-2="ent0063" data-link-type="dependency" data-source-line="373" id="lnk71"><path codeLine="373" d="M21181.31,1422.01 C21135.28,1572.3 21035.407,1898.363 20982.407,2071.423" fill="none" id="LogDispatcher-to-LogEntry" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#656F33" points="20980.65,2077.16,20987.1101,2069.7258,20982.1141,2072.3792,20979.4608,2067.3832,20980.65,2077.16" style="stroke:#656F33;stroke-width:1;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="119.3876" x="21092.45" y="1729.95">consumes</text></g><!--reverse link IPostalCodeService to MockPostalCodeService--><g class="link" data-entity-1="ent0090" data-entity-2="ent0091" data-link-type="extension" data-source-line="487" id="lnk99"><path codeLine="487" d="M18681.9916,551.2487 C18557.5816,716.4487 18228.33,1153.65 18119.78,1297.8" fill="none" id="IPostalCodeService-backto-MockPostalCodeService" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="18692.82,536.87,18677.1987,547.6392,18686.7845,554.8581,18692.82,536.87" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link IPostalCodeService to XegerPostalCodeService--><g class="link" data-entity-1="ent0090" data-entity-2="ent0092" data-link-type="extension" data-source-line="488" id="lnk100"><path codeLine="488" d="M18796.0084,551.2487 C18920.4184,716.4487 19249.67,1153.65 19358.22,1297.8" fill="none" id="IPostalCodeService-backto-XegerPostalCodeService" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="18785.18,536.87,18791.2155,554.8581,18800.8013,547.6392,18785.18,536.87" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link IPromptDirectory to PromptDirectory--><g class="link" data-entity-1="ent0102" data-entity-2="ent0103" data-link-type="extension" data-source-line="504" id="lnk104"><path codeLine="504" d="M6434.3455,2994.2525 C6419.8655,3058.7225 6400.79,3143.62 6384.02,3218.31" fill="none" id="IPromptDirectory-backto-PromptDirectory" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="6438.29,2976.69,6428.4913,2992.9376,6440.1996,2995.5673,6438.29,2976.69" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BiergartenPipelineOrchestrator to ICuratedDataService--><g class="link" data-entity-1="ent0116" data-entity-2="ent0075" data-link-type="composition" data-source-line="633" id="lnk117"><path codeLine="633" d="M8916.4708,554.8341 C9271.7908,626.8641 9779.79,746 10214,912.15 C10431.18,995.26 10664.68,1121.86 10826.75,1216.29" fill="none" id="BiergartenPipelineOrchestrator-backto-ICuratedDataService" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8904.71,552.45,8909.7957,557.5623,8916.4708,554.8341,8911.3851,549.7218,8904.71,552.45" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BiergartenPipelineOrchestrator to EnrichmentService--><g class="link" data-entity-1="ent0116" data-entity-2="ent0085" data-link-type="composition" data-source-line="634" id="lnk118"><path codeLine="634" d="M8914.2023,773.3301 C8994.7223,833.3301 9067.5,890.52 9142,954.15 C9260.09,1055.01 9385.4,1184.36 9461.19,1265.4" fill="none" id="BiergartenPipelineOrchestrator-backto-EnrichmentService" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8904.58,766.16,8907.0011,772.9525,8914.2023,773.3301,8911.7812,766.5376,8904.58,766.16" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BiergartenPipelineOrchestrator to DataGenerator--><g class="link" data-entity-1="ent0116" data-entity-2="ent0106" data-link-type="composition" data-source-line="635" id="lnk119"><path codeLine="635" d="M8486,894.44 C8486,952.19 8486,998.58 8486,1053.48" fill="none" id="BiergartenPipelineOrchestrator-backto-DataGenerator" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8486,882.44,8482,888.44,8486,894.44,8490,888.44,8486,882.44" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BiergartenPipelineOrchestrator to ExportService--><g class="link" data-entity-1="ent0116" data-entity-2="ent0112" data-link-type="composition" data-source-line="636" id="lnk120"><path codeLine="636" d="M8916.4431,497.4362 C9923.9931,550.9262 12551.68,704.38 14744,954.15 C15516.85,1042.2 16414.47,1188.62 16915.44,1274.34" fill="none" id="BiergartenPipelineOrchestrator-backto-ExportService" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8904.46,496.8,8910.2395,501.1125,8916.4431,497.4362,8910.6636,493.1237,8904.46,496.8" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BiergartenPipelineOrchestrator to CheckinDistributionStrategy--><g class="link" data-entity-1="ent0116" data-entity-2="ent0054" data-link-type="composition" data-source-line="637" id="lnk121"><path codeLine="637" d="M8916.4225,524.4177 C9238.3825,577.0977 9670.01,685.17 9996,912.15 C10015.04,925.41 10018.89,932.41 10027,954.15 C10093.93,1133.52 10021.62,2541.72 10162,2671.9 C10175.13,2684.08 12723.41,2676.52 12741,2679.9 C12853.82,2701.58 12972.64,2744.3 13073.91,2787.35" fill="none" id="BiergartenPipelineOrchestrator-backto-CheckinDistributionStrategy" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8904.58,522.48,8909.8554,527.3964,8916.4225,524.4177,8911.1472,519.5013,8904.58,522.48" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BiergartenPipelineOrchestrator to FollowGenerationStrategy--><g class="link" data-entity-1="ent0116" data-entity-2="ent0057" data-link-type="composition" data-source-line="638" id="lnk122"><path codeLine="638" d="M8916.0655,532.1464 C9353.9655,600.7164 9979.12,734.73 10072,954.15 C10143.94,1124.09 10089.91,2482.18 10225,2607.9 C10296.71,2674.64 13653.45,2670.87 13751,2679.9 C14140.11,2715.91 14584.04,2795.99 14868.35,2852.34" fill="none" id="BiergartenPipelineOrchestrator-backto-FollowGenerationStrategy" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8904.21,530.29,8909.519,535.1701,8916.0655,532.1464,8910.7566,527.2664,8904.21,530.29" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BiergartenPipelineOrchestrator to SamplingStrategy--><g class="link" data-entity-1="ent0116" data-entity-2="ent0050" data-link-type="composition" data-source-line="639" id="lnk123"><path codeLine="639" d="M8916.003,561.1788 C9298.213,646.3088 9810.94,787.03 9938,954.15 C10053.65,1106.26 9882.55,2539.17 10020,2671.9 C10032.49,2683.96 10627.98,2676.44 10645,2679.9 C10811.5,2713.72 10990.91,2795.15 11103.53,2852.35" fill="none" id="BiergartenPipelineOrchestrator-backto-SamplingStrategy" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8904.29,558.57,8909.2769,563.7787,8916.003,561.1788,8911.0161,555.9701,8904.29,558.57" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BiergartenPipelineOrchestrator to BeerSelectionStrategy--><g class="link" data-entity-1="ent0116" data-entity-2="ent0052" data-link-type="composition" data-source-line="640" id="lnk124"><path codeLine="640" d="M8916.077,542.3837 C9326.247,616.8537 9891.58,753.18 9985,954.15 C10065.61,1127.55 9952.03,2540.55 10091,2671.9 C10098.7,2679.18 11606.53,2678.24 11617,2679.9 C11807.31,2710.02 12015.88,2780.41 12161.71,2836.13" fill="none" id="BiergartenPipelineOrchestrator-backto-BeerSelectionStrategy" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8904.27,540.24,8909.4589,545.2475,8916.077,542.3837,8910.888,537.3762,8904.27,540.24" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BiergartenPipelineOrchestrator to ApplicationOptions--><g class="link" data-entity-1="ent0116" data-entity-2="ent0042" data-link-type="composition" data-source-line="641" id="lnk125"><path codeLine="641" d="M8057.5064,696.127 C7952.4764,767.537 7859.19,849.4 7787,954.15 C7521.36,1339.61 7492.1,1935.26 7489.81,2126.04" fill="none" id="BiergartenPipelineOrchestrator-backto-ApplicationOptions" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8067.43,689.38,8060.2192,689.4457,8057.5064,696.127,8064.7172,696.0614,8067.43,689.38" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BiergartenPipelineOrchestrator to Logger--><g class="link" data-entity-1="ent0116" data-entity-2="ent0126" data-link-type="composition" data-source-line="642" id="lnk127"><path codeLine="642" d="M8056.5616,670.8725 C7905.2816,743.4825 7745.55,824.73 7595,912.15 C7359.71,1048.77 7095.76,1241.83 6999.08,1313.98" fill="none" id="BiergartenPipelineOrchestrator-backto-Logger" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8067.38,665.68,8060.24,664.6701,8056.5616,670.8725,8063.7016,671.8824,8067.38,665.68" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BiergartenPipelineOrchestrator to GeneratedUser--><g class="link" data-entity-1="ent0116" data-entity-2="ent0029" data-link-type="composition" data-source-line="645" id="lnk128"><path codeLine="645" d="M8055.7465,545.6193 C7356.5765,655.8793 5917.31,867.04 4680,946.15 C4668.13,946.91 2977.25,948.12 2967,954.15 C2876.86,1007.22 2821.11,1112.65 2788.58,1200.3" fill="none" id="BiergartenPipelineOrchestrator-backto-GeneratedUser" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8067.6,543.75,8061.0501,540.7335,8055.7465,545.6193,8062.2964,548.6358,8067.6,543.75" style="stroke:#656F33;stroke-width:1;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="134.2499" x="5095.7" y="937.95">user_pool_</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="39" x="2751.667" y="1184.8977">0..*</text></g><!--reverse link BiergartenPipelineOrchestrator to GeneratedBrewery--><g class="link" data-entity-1="ent0116" data-entity-2="ent0027" data-link-type="composition" data-source-line="646" id="lnk129"><path codeLine="646" d="M8055.7639,495.2875 C7065.5439,542.9975 4512.83,679.71 2381,912.15 C2253.28,926.08 2208.8,894.53 2095,954.15 C1978.89,1014.98 1879.9,1127.86 1814.77,1216.33" fill="none" id="BiergartenPipelineOrchestrator-backto-GeneratedBrewery" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8067.75,494.71,8061.5645,491.0034,8055.7639,495.2875,8061.9495,498.9941,8067.75,494.71" style="stroke:#656F33;stroke-width:1;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="179.4438" x="2382" y="937.95">brewery_pool_</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="39" x="1780.4856" y="1200.8599">0..*</text></g><!--reverse link BiergartenPipelineOrchestrator to GeneratedBeer--><g class="link" data-entity-1="ent0116" data-entity-2="ent0028" data-link-type="composition" data-source-line="647" id="lnk130"><path codeLine="647" d="M8055.395,486.9459 C6777.055,523.8059 2994.77,657 2531,954.15 C2438.2,1013.61 2381.17,1127.25 2348.83,1216.33" fill="none" id="BiergartenPipelineOrchestrator-backto-GeneratedBeer" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8067.39,486.6,8061.2772,482.7746,8055.395,486.9459,8061.5078,490.7713,8067.39,486.6" style="stroke:#656F33;stroke-width:1;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="137.2311" x="2621.63" y="937.95">beer_pool_</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="39" x="2311.8319" y="1200.8599">0..*</text></g><!--reverse link BiergartenPipelineOrchestrator to GeneratedCheckin--><g class="link" data-entity-1="ent0116" data-entity-2="ent0033" data-link-type="composition" data-source-line="648" id="lnk131"><path codeLine="648" d="M8056.3326,632.8141 C7725.7926,745.5641 7261.37,885.4 6831,946.15 C6814.98,948.41 4514.95,945.95 4501,954.15 C4399.32,1013.92 4341.42,1140.35 4311.23,1232.8" fill="none" id="BiergartenPipelineOrchestrator-backto-GeneratedCheckin" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8067.69,628.94,8060.7199,627.0912,8056.3326,632.8141,8063.3027,634.6629,8067.69,628.94" style="stroke:#656F33;stroke-width:1;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="173.9999" x="7015.9" y="937.95">checkin_pool_</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="39" x="4273.8838" y="1217.0957">0..*</text></g><!--reverse link BiergartenPipelineOrchestrator to GeneratedFollow--><g class="link" data-entity-1="ent0116" data-entity-2="ent0035" data-link-type="composition" data-source-line="649" id="lnk132"><path codeLine="649" d="M8055.7605,583.6669 C7571.9805,699.6169 6761.73,876.09 6043,946.15 C6029.33,947.48 4076.84,947.19 4065,954.15 C3950.84,1021.31 3891.86,1172.46 3865.32,1265.19" fill="none" id="BiergartenPipelineOrchestrator-backto-GeneratedFollow" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8067.43,580.87,8060.6629,578.3786,8055.7605,583.6669,8062.5275,586.1583,8067.43,580.87" style="stroke:#656F33;stroke-width:1;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="152.2875" x="6311.96" y="937.95">follow_pool_</text><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="39" x="3827.3046" y="1249.896">0..*</text></g><!--reverse link ICuratedDataService to JsonLoader--><g class="link" data-entity-1="ent0075" data-entity-2="ent0076" data-link-type="extension" data-source-line="652" id="lnk133"><path codeLine="652" d="M11586.3804,1475.5811 C11870.1904,1549.4011 12204.77,1647.28 12509,1768.15 C12730.46,1856.14 12971.58,1985.29 13132.84,2076.88" fill="none" id="ICuratedDataService-backto-JsonLoader" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="11568.96,1471.05,11584.87,1481.3879,11587.8907,1469.7743,11568.96,1471.05" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link ICuratedDataService to MockCuratedDataService--><g class="link" data-entity-1="ent0075" data-entity-2="ent0080" data-link-type="extension" data-source-line="653" id="lnk134"><path codeLine="653" d="M11034,1488.76 C11034,1653.42 11034,1920.99 11034,2077.18" fill="none" id="ICuratedDataService-backto-MockCuratedDataService" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="11034,1470.76,11028,1488.76,11040,1488.76,11034,1470.76" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link Logger to PipelineLogger--><g class="link" data-entity-1="ent0126" data-entity-2="ent0135" data-link-type="extension" data-source-line="654" id="lnk136"><path codeLine="654" d="M6884.2019,1350.5068 C6698.8719,1367.1168 6139.84,1442.32 5839,1768.15 C5733.22,1882.72 5719.33,2084.13 5717.94,2158.44" fill="none" id="Logger-backto-PipelineLogger" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="6902.13,1348.9,6883.6663,1344.5307,6884.7375,1356.4828,6902.13,1348.9" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link ContextStrategy to BreweryContextStrategy--><g class="link" data-entity-1="ent0047" data-entity-2="ent0048" data-link-type="extension" data-source-line="655" id="lnk137"><path codeLine="655" d="M10303,3010.99 C10303,3086.32 10303,3181.33 10303,3250.63" fill="none" id="ContextStrategy-backto-BreweryContextStrategy" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="10303,2992.99,10297,3010.99,10309,3010.99,10303,2992.99" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link ContextStrategy to BeerContextStrategy--><g class="link" data-entity-1="ent0047" data-entity-2="ent0049" data-link-type="extension" data-source-line="656" id="lnk138"><path codeLine="656" d="M10452.6909,3002.233 C10582.8809,3077.543 10762.29,3181.32 10881.98,3250.55" fill="none" id="ContextStrategy-backto-BeerContextStrategy" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="10437.11,2993.22,10449.6866,3007.4266,10455.6953,2997.0393,10437.11,2993.22" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link SamplingStrategy to UniformSamplingStrategy--><g class="link" data-entity-1="ent0050" data-entity-2="ent0051" data-link-type="extension" data-source-line="657" id="lnk139"><path codeLine="657" d="M11310.5556,2987.9128 C11407.0256,3062.4228 11554.63,3176.43 11650.97,3250.84" fill="none" id="SamplingStrategy-backto-UniformSamplingStrategy" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="11296.31,2976.91,11306.888,2992.6614,11314.2232,2983.1643,11296.31,2976.91" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link BeerSelectionStrategy to RandomBeerSelectionStrategy--><g class="link" data-entity-1="ent0052" data-entity-2="ent0053" data-link-type="extension" data-source-line="658" id="lnk140"><path codeLine="658" d="M12390.5131,3009.5163 C12416.1731,3068.9663 12444.82,3135.37 12473.47,3201.75" fill="none" id="BeerSelectionStrategy-backto-RandomBeerSelectionStrategy" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="12383.38,2992.99,12385.0044,3011.894,12396.0219,3007.1386,12383.38,2992.99" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link CheckinDistributionStrategy to JCurveCheckinStrategy--><g class="link" data-entity-1="ent0054" data-entity-2="ent0055" data-link-type="extension" data-source-line="659" id="lnk141"><path codeLine="659" d="M13332,3059.83 C13332,3105.82 13332,3139.79 13332,3185.77" fill="none" id="CheckinDistributionStrategy-backto-JCurveCheckinStrategy" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="13332,3041.83,13326,3059.83,13338,3059.83,13332,3041.83" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link CheckinDistributionStrategy to RandomCheckinStrategy--><g class="link" data-entity-1="ent0054" data-entity-2="ent0056" data-link-type="extension" data-source-line="660" id="lnk142"><path codeLine="660" d="M13615.7565,3049.6562 C13690.4665,3084.9362 13756.33,3116.04 13834.47,3152.94" fill="none" id="CheckinDistributionStrategy-backto-RandomCheckinStrategy" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="13599.48,3041.97,13613.1944,3055.0816,13618.3185,3044.2307,13599.48,3041.97" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link FollowGenerationStrategy to RandomFollowStrategy--><g class="link" data-entity-1="ent0057" data-entity-2="ent0058" data-link-type="extension" data-source-line="661" id="lnk143"><path codeLine="661" d="M15162,2994.69 C15162,3059.16 15162,3143.62 15162,3218.31" fill="none" id="FollowGenerationStrategy-backto-RandomFollowStrategy" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="15162,2976.69,15156,2994.69,15168,2994.69,15162,2976.69" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link FollowGenerationStrategy to ActivityWeightedFollowStrategy--><g class="link" data-entity-1="ent0057" data-entity-2="ent0059" data-link-type="extension" data-source-line="662" id="lnk144"><path codeLine="662" d="M15355.8786,2982.8012 C15541.8386,3047.2112 15819.74,3143.46 16035.06,3218.03" fill="none" id="FollowGenerationStrategy-backto-ActivityWeightedFollowStrategy" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="15338.87,2976.91,15353.9149,2988.4707,15357.8424,2977.1316,15338.87,2976.91" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link EnrichmentService to WikipediaService--><g class="link" data-entity-1="ent0085" data-entity-2="ent0086" data-link-type="extension" data-source-line="663" id="lnk145"><path codeLine="663" d="M9534.2663,1440.005 C9537.8263,1590.295 9545.28,1904.1 9549.39,2077.16" fill="none" id="EnrichmentService-backto-WikipediaService" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="9533.84,1422.01,9528.2679,1440.147,9540.2646,1439.8629,9533.84,1422.01" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link WebClient to HttpWebClient--><g class="link" data-entity-1="ent0087" data-entity-2="ent0088" data-link-type="extension" data-source-line="664" id="lnk146"><path codeLine="664" d="M9552,3010.99 C9552,3086.32 9552,3181.33 9552,3250.63" fill="none" id="WebClient-backto-HttpWebClient" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="9552,2992.99,9546,3010.99,9558,3010.99,9552,2992.99" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link DataGenerator to MockGenerator--><g class="link" data-entity-1="ent0106" data-entity-2="ent0107" data-link-type="extension" data-source-line="665" id="lnk147"><path codeLine="665" d="M8609.3874,1650.3515 C8668.1574,1795.9515 8729.64,1948.3 8775.08,2060.86" fill="none" id="DataGenerator-backto-MockGenerator" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="8602.65,1633.66,8603.8235,1652.5973,8614.9512,1648.1058,8602.65,1633.66" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link DataGenerator to LlamaGenerator--><g class="link" data-entity-1="ent0106" data-entity-2="ent0108" data-link-type="extension" data-source-line="666" id="lnk148"><path codeLine="666" d="M8362.9709,1650.3589 C8324.1709,1746.7889 8287.94,1836.8 8250.2,1930.58" fill="none" id="DataGenerator-backto-LlamaGenerator" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="8369.69,1633.66,8357.4046,1648.1192,8368.5373,1652.5986,8369.69,1633.66" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link PromptFormatter to Gemma4JinjaPromptFormatter--><g class="link" data-entity-1="ent0109" data-entity-2="ent0110" data-link-type="extension" data-source-line="667" id="lnk149"><path codeLine="667" d="M8147,3027.3 C8147,3101.89 8147,3186.16 8147,3250.63" fill="none" id="PromptFormatter-backto-Gemma4JinjaPromptFormatter" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="8147,3009.3,8141,3027.3,8153,3027.3,8147,3009.3" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link ExportService to SqliteExportService--><g class="link" data-entity-1="ent0112" data-entity-2="ent0113" data-link-type="extension" data-source-line="668" id="lnk150"><path codeLine="668" d="M17305,1537.7 C17305,1610.37 17305,1680.1 17305,1767.72" fill="none" id="ExportService-backto-SqliteExportService" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="17305,1519.7,17299,1537.7,17311,1537.7,17305,1519.7" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link DateTimeProvider to SystemDateTimeProvider--><g class="link" data-entity-1="ent0114" data-entity-2="ent0115" data-link-type="extension" data-source-line="669" id="lnk151"><path codeLine="669" d="M17305,2994.69 C17305,3074.9 17305,3195.91 17305,3267.08" fill="none" id="DateTimeProvider-backto-SystemDateTimeProvider" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="none" points="17305,2976.69,17299,2994.69,17311,2994.69,17305,2976.69" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link WikipediaService to WebClient--><g class="link" data-entity-1="ent0086" data-entity-2="ent0087" data-link-type="composition" data-source-line="672" id="lnk152"><path codeLine="672" d="M9552,2311.08 C9552,2459.25 9552,2707.17 9552,2836.31" fill="none" id="WikipediaService-backto-WebClient" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="9552,2299.08,9548,2305.08,9552,2311.08,9556,2305.08,9552,2299.08" style="stroke:#656F33;stroke-width:1;"/></g><!--link WikipediaService to ContextStrategy--><g class="link" data-entity-1="ent0086" data-entity-2="ent0047" data-link-type="dependency" data-source-line="673" id="lnk153"><path codeLine="673" d="M9628.15,2298.71 C9702.83,2401.83 9823.48,2557.08 9949,2671.9 C10016.82,2733.94 10096.5149,2789.1794 10166.0949,2833.0594" fill="none" id="WikipediaService-to-ContextStrategy" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#656F33" points="10171.17,2836.26,10165.6911,2828.0758,10166.9408,2833.5929,10161.4237,2834.8426,10171.17,2836.26" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link LlamaGenerator to PromptFormatter--><g class="link" data-entity-1="ent0108" data-entity-2="ent0109" data-link-type="composition" data-source-line="674" id="lnk154"><path codeLine="674" d="M8147,2457.52 C8147,2587.6 8147,2725.63 8147,2820.05" fill="none" id="LlamaGenerator-backto-PromptFormatter" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="8147,2445.52,8143,2451.52,8147,2457.52,8151,2451.52,8147,2445.52" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link LlamaGenerator to IPromptDirectory--><g class="link" data-entity-1="ent0108" data-entity-2="ent0102" data-link-type="composition" data-source-line="675" id="lnk155"><path codeLine="675" d="M7960.1194,2454.3388 C7902.3194,2518.2288 7840.83,2570.27 7763,2607.9 C7361.43,2802.03 7179.61,2523.21 6762,2679.9 C6662.92,2717.07 6568.77,2796.57 6510.77,2852.49" fill="none" id="LlamaGenerator-backto-IPromptDirectory" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="7968.17,2445.44,7961.1785,2447.2059,7960.1194,2454.3388,7967.111,2452.5729,7968.17,2445.44" style="stroke:#656F33;stroke-width:1;"/></g><!--link LlamaGenerator to GeneratorOptions--><g class="link" data-entity-1="ent0108" data-entity-2="ent0040" data-link-type="dependency" data-source-line="676" id="lnk156"><path codeLine="676" d="M8070.62,2445.47 C8031.95,2531.47 7975.58,2618.89 7895,2671.9 C7874.89,2685.13 7809.43,2671.19 7787,2679.9 C7699.99,2713.68 7622.2732,2777.9188 7566.5732,2832.0388" fill="none" id="LlamaGenerator-to-GeneratorOptions" style="stroke:#656F33;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#656F33" points="7562.27,2836.22,7571.5123,2832.8171,7565.856,2832.7357,7565.9374,2827.0794,7562.27,2836.22" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link SqliteExportService to DateTimeProvider--><g class="link" data-entity-1="ent0113" data-entity-2="ent0114" data-link-type="composition" data-source-line="677" id="lnk157"><path codeLine="677" d="M17305,2620.18 C17305,2716.49 17305,2795.3 17305,2852.47" fill="none" id="SqliteExportService-backto-DateTimeProvider" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="17305,2608.18,17301,2614.18,17305,2620.18,17309,2614.18,17305,2608.18" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link PipelineLogger to BoundedChannel--><g class="link" data-entity-1="ent0135" data-entity-2="ent0073" data-link-type="aggregation" data-source-line="680" id="lnk158"><path codeLine="680" d="M5718,2229.43 C5718,2314.73 5718,2561.66 5718,2738.53" fill="none" id="PipelineLogger-backto-BoundedChannel" style="stroke:#656F33;stroke-width:1;"/><polygon fill="none" points="5718,2217.43,5714,2223.43,5718,2229.43,5722,2223.43,5718,2217.43" style="stroke:#656F33;stroke-width:1;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="78.1815" x="5719" y="2663.7">logs to</text></g><!--reverse link LogWorker to BoundedChannel--><g class="link" data-entity-1="ent0159" data-entity-2="ent0073" data-link-type="aggregation" data-source-line="681" id="lnk160"><path codeLine="681" d="M5931.3763,2229.3845 C5918.2563,2297.6845 5884.49,2463.69 5839,2607.9 C5825.47,2650.77 5808.82,2696.2 5792.24,2738.56" fill="none" id="LogWorker-backto-BoundedChannel" style="stroke:#656F33;stroke-width:1;"/><polygon fill="none" points="5933.64,2217.6,5928.5799,2222.7377,5931.3763,2229.3845,5936.4363,2224.2469,5933.64,2217.6" style="stroke:#656F33;stroke-width:1;"/><text fill="#14180C" font-family="'DM Sans'" font-size="25" lengthAdjust="spacing" textLength="132.9065" x="5828.87" y="2663.7">drains from</text></g><!--reverse link EnrichedCity to City--><g class="link" data-entity-1="ent0013" data-entity-2="ent0003" data-link-type="composition" data-source-line="684" id="lnk161"><path codeLine="684" d="M1205.0186,1417.2538 C1227.9386,1493.6438 1275.12,1610.6 1369,1674.15 C1643.54,1860 1822.83,1600.77 2109,1768.15 C2199.59,1821.14 2271.89,1911.98 2323.9,1995.54" fill="none" id="EnrichedCity-backto-City" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="1201.57,1405.76,1199.463,1412.6564,1205.0186,1417.2538,1207.1256,1410.3574,1201.57,1405.76" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link EnrichedCity to LocationContext--><g class="link" data-entity-1="ent0013" data-entity-2="ent0011" data-link-type="composition" data-source-line="685" id="lnk162"><path codeLine="685" d="M1162.9554,1417.1492 C1137.0854,1490.6392 1088.07,1601.71 1003,1674.15 C909.45,1753.81 834.62,1686.27 743,1768.15 C639.58,1860.59 581.96,2016.43 555.1,2109.73" fill="none" id="EnrichedCity-backto-LocationContext" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="1166.94,1405.83,1161.1747,1410.1614,1162.9554,1417.1492,1168.7208,1412.8178,1166.94,1405.83" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedBrewery to City--><g class="link" data-entity-1="ent0027" data-entity-2="ent0003" data-link-type="composition" data-source-line="686" id="lnk163"><path codeLine="686" d="M1857.7962,1479.7382 C1933.7262,1562.6182 2025.44,1665.45 2109,1768.15 C2168.17,1840.86 2230.32,1923.25 2283.39,1995.6" fill="none" id="GeneratedBrewery-backto-City" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="1849.69,1470.89,1850.7937,1478.0161,1857.7962,1479.7382,1856.6925,1472.612,1849.69,1470.89" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedBrewery to Address--><g class="link" data-entity-1="ent0027" data-entity-2="ent0007" data-link-type="composition" data-source-line="687" id="lnk164"><path codeLine="687" d="M1646.6578,1481.2647 C1596.2578,1564.1947 1537.42,1665.63 1487,1768.15 C1421.78,1900.77 1359.59,2064.51 1331.15,2142.14" fill="none" id="GeneratedBrewery-backto-Address" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="1652.89,1471.01,1646.3556,1474.06,1646.6578,1481.2647,1653.1921,1478.2148,1652.89,1471.01" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedBrewery to BreweryResult--><g class="link" data-entity-1="ent0027" data-entity-2="ent0015" data-link-type="composition" data-source-line="688" id="lnk165"><path codeLine="688" d="M1605.7694,1479.2599 C1538.6094,1546.0199 1458.64,1617.25 1369,1674.15 C1277.16,1732.45 1221.87,1693.22 1143,1768.15 C1049.08,1857.37 994.25,1999.7 966.45,2093.27" fill="none" id="GeneratedBrewery-backto-BreweryResult" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="1614.28,1470.8,1607.2047,1472.1931,1605.7694,1479.2599,1612.8447,1477.8668,1614.28,1470.8" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedBrewery to GenerationMetadata--><g class="link" data-entity-1="ent0027" data-entity-2="ent0026" data-link-type="composition" data-source-line="689" id="lnk166"><path codeLine="689" d="M1840.8403,1479.62 C1907.0003,1552.59 1992.07,1629.67 2095,1674.15 C2426.9,1817.58 2544.87,1720.39 2906,1738.15 C2948.65,1740.25 4407.29,1744.74 4443,1768.15 C4553.39,1840.52 4601.24,1993.61 4621.31,2093.3" fill="none" id="GeneratedBrewery-backto-GenerationMetadata" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="1832.78,1470.73,1833.8468,1477.8618,1840.8403,1479.62,1839.7735,1472.4882,1832.78,1470.73" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedBeer to City--><g class="link" data-entity-1="ent0028" data-entity-2="ent0003" data-link-type="composition" data-source-line="690" id="lnk167"><path codeLine="690" d="M2330.532,1482.6644 C2348.182,1621.6244 2375.26,1834.78 2395.68,1995.53" fill="none" id="GeneratedBeer-backto-City" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="2329.02,1470.76,2325.8079,1477.2162,2330.532,1482.6644,2333.7441,1476.2082,2329.02,1470.76" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedBeer to BeerStyle--><g class="link" data-entity-1="ent0028" data-entity-2="ent0014" data-link-type="composition" data-source-line="691" id="lnk168"><path codeLine="691" d="M2369.5802,1481.6313 C2405.4102,1553.2313 2455.14,1626.96 2531,1674.15 C2722.36,1793.17 2809.42,1719.45 3034,1738.15 C3075.94,1741.64 3756.71,1743.74 3791,1768.15 C3884.85,1834.95 3924.99,1963.83 3942.17,2061.08" fill="none" id="GeneratedBeer-backto-BeerStyle" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="2364.21,1470.9,2363.318,1478.0557,2369.5802,1481.6313,2370.4722,1474.4756,2364.21,1470.9" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedBeer to BeerResult--><g class="link" data-entity-1="ent0028" data-entity-2="ent0016" data-link-type="composition" data-source-line="692" id="lnk169"><path codeLine="692" d="M2311.8695,1482.7927 C2317.9295,1572.4227 2341.54,1675.6 2421,1738.15 C2505.72,1804.85 3300.69,1709.23 3391,1768.15 C3485.32,1829.69 3536.26,1948.87 3563.08,2044.42" fill="none" id="GeneratedBeer-backto-BeerResult" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="2311.06,1470.82,2307.4739,1477.0762,2311.8695,1482.7927,2315.4556,1476.5365,2311.06,1470.82" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedBeer to GenerationMetadata--><g class="link" data-entity-1="ent0028" data-entity-2="ent0026" data-link-type="composition" data-source-line="693" id="lnk170"><path codeLine="693" d="M2367.7854,1481.4882 C2403.2654,1553.9782 2453.32,1628.65 2531,1674.15 C2541.47,1680.28 3389.89,1737.53 3402,1738.15 C3459.78,1741.1 4394.76,1736.21 4443,1768.15 C4553.05,1841.03 4601,1993.97 4621.18,2093.49" fill="none" id="GeneratedBeer-backto-GenerationMetadata" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="2362.51,1470.71,2361.5549,1477.8576,2367.7854,1481.4882,2368.7404,1474.3407,2362.51,1470.71" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedUser to City--><g class="link" data-entity-1="ent0029" data-entity-2="ent0003" data-link-type="composition" data-source-line="694" id="lnk171"><path codeLine="694" d="M2689.014,1498.2476 C2634.404,1638.0576 2555.12,1841.06 2494.73,1995.67" fill="none" id="GeneratedUser-backto-City" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="2693.38,1487.07,2687.4712,1491.2035,2689.014,1498.2476,2694.9229,1494.1141,2693.38,1487.07" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedUser to UserResult--><g class="link" data-entity-1="ent0029" data-entity-2="ent0017" data-link-type="composition" data-source-line="695" id="lnk172"><path codeLine="695" d="M2813.8135,1497.5966 C2849.6035,1565.5266 2896.5,1630.68 2967,1674.15 C3171.21,1800.08 3263.93,1718.08 3503,1738.15 C3571.29,1743.88 4063.44,1728.04 4119,1768.15 C4212.09,1835.35 4251.69,1963.82 4268.53,2060.86" fill="none" id="GeneratedUser-backto-UserResult" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="2808.22,1486.98,2807.4779,1494.1528,2813.8135,1497.5966,2814.5556,1490.4238,2808.22,1486.98" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedUser to GenerationMetadata--><g class="link" data-entity-1="ent0029" data-entity-2="ent0026" data-link-type="composition" data-source-line="696" id="lnk173"><path codeLine="696" d="M2811.8674,1497.5915 C2847.4074,1566.3915 2894.73,1632.3 2967,1674.15 C3002.55,1694.74 4409.15,1744.87 4443,1768.15 C4551.44,1842.7 4599.79,1994.4 4620.51,2093.32" fill="none" id="GeneratedUser-backto-GenerationMetadata" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="2806.36,1486.93,2805.5599,1494.0966,2811.8674,1497.5915,2812.6676,1490.425,2806.36,1486.93" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedCheckin to CheckinResult--><g class="link" data-entity-1="ent0033" data-entity-2="ent0024" data-link-type="composition" data-source-line="697" id="lnk174"><path codeLine="697" d="M4336.0592,1465.1216 C4372.7492,1537.4416 4424.71,1618.12 4501,1674.15 C4622.53,1763.42 4713.22,1669.19 4827,1768.15 C4936.22,1863.14 4984.61,2034.38 5003.5,2125.73" fill="none" id="GeneratedCheckin-backto-CheckinResult" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="4330.63,1454.42,4329.7774,1461.5805,4336.0592,1465.1216,4336.9118,1457.961,4330.63,1454.42" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedCheckin to GenerationMetadata--><g class="link" data-entity-1="ent0033" data-entity-2="ent0026" data-link-type="composition" data-source-line="698" id="lnk175"><path codeLine="698" d="M4333.6465,1465.8523 C4403.4765,1632.9723 4530.38,1936.66 4595.88,2093.41" fill="none" id="GeneratedCheckin-backto-GenerationMetadata" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="4329.02,1454.78,4327.6425,1461.8583,4333.6465,1465.8523,4335.024,1458.774,4329.02,1454.78" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedRating to RatingResult--><g class="link" data-entity-1="ent0034" data-entity-2="ent0025" data-link-type="composition" data-source-line="699" id="lnk176"><path codeLine="699" d="M4774.127,1465.111 C4811.357,1536.531 4863.04,1616.18 4937,1674.15 C5034.7,1750.72 5114.59,1678.07 5200,1768.15 C5294.51,1867.83 5317.86,2035.95 5323.44,2125.9" fill="none" id="GeneratedRating-backto-RatingResult" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="4768.58,1454.47,4767.8065,1461.6395,4774.127,1465.111,4774.9005,1457.9415,4768.58,1454.47" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedRating to GenerationMetadata--><g class="link" data-entity-1="ent0034" data-entity-2="ent0026" data-link-type="composition" data-source-line="700" id="lnk177"><path codeLine="700" d="M4706.8289,1466.7207 C4690.1589,1633.8407 4659.97,1936.66 4644.34,2093.41" fill="none" id="GeneratedRating-backto-GenerationMetadata" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="4708.02,1454.78,4703.4442,1460.3533,4706.8289,1466.7207,4711.4047,1461.1474,4708.02,1454.78" style="stroke:#656F33;stroke-width:1;"/></g><!--reverse link GeneratedFollow to GenerationMetadata--><g class="link" data-entity-1="ent0035" data-entity-2="ent0026" data-link-type="composition" data-source-line="701" id="lnk178"><path codeLine="701" d="M3883.1285,1433.1131 C3917.5885,1508.8731 3975.36,1610.83 4065,1674.15 C4206.4,1774.03 4309.75,1657.64 4443,1768.15 C4543.06,1851.13 4593.45,1997.54 4616.92,2093.42" fill="none" id="GeneratedFollow-backto-GenerationMetadata" style="stroke:#656F33;stroke-width:1;"/><polygon fill="#656F33" points="3878.16,1422.19,3877.0032,1429.3077,3883.1285,1433.1131,3884.2853,1425.9954,3878.16,1422.19" style="stroke:#656F33;stroke-width:1;"/></g><?plantuml-src xJpjSjmuSl_dAH3_i4Txdf7btTl4SpvLoP8_TB5bHIF7ILMgM1WIci69Gyu1fAIvorRb8V8EznxtAFSawSO7IO0WXv9sRvFSJhci8T7TQ3GQ_G4qvXdvxU3Fw1av_dpsxlJzbukZozFFP-GfcL_--yVJi_VGSWyo_y2pE2qJHgRJ_GLdOab5mRB9BUD_X3_5YgtPT5Ekqv6yvjc62hecSKgbF2eAmHTbmTxbMJ47OFAg0PAmArgcHTNsyjUDne8NQOtsxOlHIBqXRwhkoGajA3dd6vRoZ96__jT_asFib9nmkWGIez66njTqoSYJatnDUJOZd_A4fV89-TDeH3I7v9WNMtWcyFaLYV5XHcIHp6OIMC-Mfa4Mj63HHkGt80aM1E4o__RW---Zby7ME2-pGcnxCG-2hPiSEayZmPRipWBSiBZ8nUi6yA4B7SD08tP7rvkKoTrOQHu3KagpPGdo6e90OJPG8MOaoSj5oYf2sRBLy0DAEyiBHWHVhWgINocfAnHdTFjXzgdGv6LUYfWbv4haQy9elCBvuanEVo_pZ32KxpFPf8fafZYd8VfJIrzXZ3b-NmCHwA384xfzJkYAqGIv1GKdWib2V-SQ8z5QHYOJ8XaZ5v-FJZuTdK_N2VdBdm_s__BdbtjJSi4okZOSAwIF8EY20xT5hZKF_gvf0KF1FcxPWYn0PrcMc84Wp3x-TvgG6y1Tb2a5BGhsEGKCm5IIhlNxA4c0TLcfU4C2BNKBJ9H1LyYVk12va6rMoHl1RfdOdWDjEyAfGlcSfLkdIoxXSGEZgEGCWr6WLFSKuM8-s6y-lIGhUiE0CNB5xuhIQ4E2gpyNPCao9YZeATcoOahclbnUXULY-Jm64yFkYae-wY6yWb53mEwWD6VakF5e8LPKH6gX8m4mMr5XXSgoSksWcFxUbMcglfo3IUDKVpzQID13YwhPVPi97gzOufYhr6hJh5vGo6Xc1k6DqQNuXZ4nBxPWKYqvrDNWq1CcOy4tfgjs-vfd4LtSGDjLcjF2lgLteRS02ou1tlAi2Tbyr-HIQzO5a-0f74uZbkrYjWj4eIkRjvD26CeJu_yoxhJ3mfaDjRIdf4FqNsHhP5TSo2Bgr1D0wsc5XPem4MmgeQjEl0NFmmE92tw3nXt24BHMzQ0QWpX3gZyb-us-tkL2sVktojFlN5Lz15qZx11Ms5Vc3TX7S4k_rIJAB1T0aIMHPCLh1qdxRLcA7KWjLp-cAQSId732O9001df2ubAW_OxG10EQkE4ncwxsjCa_FTQj69tDTTjizZ6dYML8ljaUwsXel4VsZLkaoLmpvxGg9oyOsFoCK9XUex8UuskwQJB-t9ME7WUu1nUcAOj3SissCBJ5bfpEFoju3CWc1rNOfdmNU5tmGMSEamhuLj3D1gPIgG6u81LN8DpOSYAZnJOon9utvy9fg2F1vqHaoptqbZ1imRJ7kogp69VzSrGFQ5YpOfKdC9ISy8B4D2CB1d_IL0r5EzKCt2yJ4nNOtkRY6hYyvO1MWcBTPY09vSr1WbBFthmPOsbFBIQAqSbYEp6CJd3YGLsqXXmVlzYp4SdRom-dn_F9qTd9v9_FFdyzcvpEvr_Upi4JJybxfUyA1wC0SE-W7T0LIixAoHrBiH8GWR54uS13NYvN63411aHyT1yjWt7_w9emg12_gIIhi68gOFgotAusq5uSi0ubLGmn1T_BgsMvmfdCGEm5aMeQ8H5PCoFnmWOW4rg232ia3GAiGpyyWx6iDKDAY5vtLcmWWeHBO0_6HyeDmcQ57wgu5cKwFTJsRDPKiJqGPPwKCGouJcfMB8PCohFUCRw5zOBUEXpZABFJO-4kO5pPqYChO-3ISocx2BslPkqJAwWAvVvKcqNJ5F44Q9JWcBx_BYhSPXW6IhqZKbFXZaxNKBmpiiZpj4K05y809bbYWf2AnOL-3l8NZibCE0ilcm5rHGdUEu6EDn0lzFJ2kjai48kkhLXd0Lbt3HD2cNgCy10SuFq7RsEHAk9iT65UEyD-2EyOh5IyOpXn3_uG7DxKyOvvpzQKTyHWk1kGNqKBBW8gfD8iu0xiRHAEbuSCq0q1d84gCegxvouhaBE2zQZwjeapB0HCLT4geNlOrci0NHuQg5o0SG0UCO_ILXqDtiUFduobOyaUsZSAIVrj1d0C4bzicT1O-GJjqXXBqAE0sifoZVuGp3Xatk1XuG5mKcB0PPqHOpvDsDqc5w7ahIEfhQHX39rhudZOSdHgHPz66uAeC4sR-WXDrJPqjwvsBi2-CGfDVEPOwaSm-ovFq_os3g3LOmTVfZ49DjwZSzJmS-tXdI1wHpBKcGL5zEgAPsgdg7TVIx7WRmjy0u6DOrv_26mh7cqsAJUM1H2l-BBK0toY1g27fLmsTFLPSIiR6mxh3Se3mWhZGo4qFvY-U6VRyqsqgLjUJ5_zkjbqhKNzxSi8Mx__pWeiYeixf-cV3bwzj6A1XQeIFdWzEGXEVIvyFjUuTnfjQB4oKhpYAPDRMDlhsGnVrmeThNCCDBJRXJwkQ2gjqPT638P8hdgXwMjFF8SkLtQNrsSAujXDMGpWAisNEw0QlJNcq--mscsQjIHbBRzXTUOpRVi8K4Sj2v3hW6pJRKrQ3c2UH8EQUvv31rkp8GuAmSGLXK3LQFyS7G9RRidhrrNRuM4bYtyfcO151K7g61mhh6mq_8Noh4_tTkyXVw9tff_Z5HLolDVQDNEsW7oU_jPSW3d-sLYePyPEwewfqVd1sCOxikAfoGhoTzXYKBtrB7B6CQbfzQrxcvXCAL8yDtd_CJcfHQ32I9OobGllaeE2Kq6d7DV1jkR0Z--VFl-F388b2hQ-aRriQFPQmrVnww7FQTtYvqjPag_335lXGQ8VMNBhuk3Lgs__qRJWLYb60T8JwaHjc8PQViO1Duo7ZazEkDI7VxjdwKXAlioEp7xULxMT9ySO6Vb7KKuOh3Nc9kU9eMDwneM8xMCJs7k3noOzSXlukNlsUxvCBo7Hb0NeCIxmNJHvbkXpkffMLtxvk-DIt333z62z-BiLbrvCznMNNaOcPWwlf8x6lqD1rujO1_vrgBvZ1TiEDLejexQf3qWgsAmf1UsfRhgd1kZi9Am0uRQ_sQXS1RD0_-V7rumtJxChGK7NobZdEH_pvHBqJkT7wd0KtdnaDomrmprXYr9dSO2QgozVgSZKbxTu3EsShDg8-7n5fJtkcHTK5EL6VKUkQrrMhumBFChKjfVNQ1QizrRdrDvBVw6ebvUC2jmfSUSPXkWU3HLs0LjnnYkHPpciIfMQH354JTUp6O95cxm-BqsLe6QLp6pceKO_SwLHvTzIuao4icHpBk1dPA7qk3OGfpY5W1Ms1z0uPgRWHMkJ7NpJDhgoETVRsA9I-7X5imnoJjmZ14kOu7QFUlFQ4Zjy-eZ-843POEd5mtgyABEnO-Odv3AVRvBKpCbOJP9QAEhbRAPUc3yHgcszvs3qGdymnMjERQZPds8x6-Rp-Z-dqwP8DPLAmF31imIVyeomDI-a1cv8fmFORFF9teLUbMSPGJgrLqyy8LyUFY5KUgAl9kSF9IjPPG7L4s1OCrT2_bIRHtmoBLbUH5TbcbQDm7V2rVd23HMSsk8b3SdMcsAx6pIcC69k89lc5fQiP4da7ZdCMPQCEQneU7tfnGONB6RyXettMkllqkQ7nqXpxEfndynrNPnWQKuJOsJTfTi-eUrSnXGhJY2t7UEE2UwKkEx1tqTHgwqhlsiGhVA7HnAkyv0cTRDx-4ZQZNr8XthW7Bi-vdrOZuFFifjyj0_CgpFb7vqBvxJygPV6W8IGdyO1p2zwyulUzEYDUxHLwu-Exh3c0v-_KRKCU52-PkiSZ6n2w1MU974yFy9I7dsuHOLKjHb3AZXrBOYkuYJMW8vTpS8UPS6XwqsA7YZP2nz2VOBWB619Vra3lwo1Uw-1i2xf18FVgQgh2Qu22BzC4GcUiwXYhCb4dxQe0nfTMzHQ2IY9wcXBxjivtZSPZ9c0VIkLtq1AKAQWxmpNdATqkXH9ry40zPpaM15Vh6XX2f9m_JGuS1TFNzoYQrmHgnMor4tz0SjxLdWdUEqTURKT8crsNJMvU_jgVdlhPx_oQuXj4-ujV0m1EV1PnP1bnY5MZJQ5UFsLBOvLeurQWQYWSH75OFDO0wDRbzgd1p_ra97FTmmoWRUQsJ6Cnh_84DrmThjpJwaQVlVaZKkHkWjB4tkw5ynSluZqROQrUUCRcfPi86PZ4ZyKnQPcwsTWf3TtKdNpC4q9QnoQjyDv3OTWknQ7tgMfuSUDWfZGcLL8P6YgsZt-k7ty6uDazgVhf6rxMttfhIVVZiu8NyBYPDAzjq8pdStfIbKPlCKoLGL-uxqfESiBlAgWC1QOwg8Ln-FOQHm_a-Jab2m5tQomP5NPU5FAMLzygiv_6qKxVeZY3Z4iJqKMkMdw2tM9ufp7rn8CEmDa1MN5E_N7NPKIOQMgKDkpfaGN1Qxljk0NNf0n9K_ka94d6ArXHCQp6uR1c-b44xKeUz0C_bR7RpIzfLi9412IRP4UjMu8M3OY7dBt8xHMSA-aImUwu3i4shkQHRxU5C5yN3UTSA62fsrFCZw-PlSmlQPsmgDk_TH6lOyIBYhF4ooUmDsEXxidh_TntUkk0El1msxB4wVCUxbx1wN7v69xLNEnmzgQZUOE2wKyStrZn-vTEavOcR5GVMZL1GHdus0LcoB_Y9vDuA3hDxr3OSsMNxnfUL87NUO-fKPiNc4o9y-coij2DB863M3kJkXMh7PMVROADMsVPjj-wFdQZdFnvkvys9k7IW8jBNrOi9iL5cf7gPe92XNxxRKB_3m7NIjdbpfEfzD1QcNXUkVP0EsS60CtG6u6ibN6E24d3DRQccUGJV7u0vMhFjyVAEJvcD8rzUKpCULjnDmH_W2UhDxiDMNOwjQV-keq6ukco_w1jr3ahutFEmjos3B1sYY5K7rhThYpFk3_pLGhqvzl2kclaAhGxQbt10E677WqnsTQkizrYQrvm3M5Hw95Viqo-PpekcWHYkedv5zfoh6-Mgd44KHRl63AGupzGwNQDNWptU4STBlBQC31ANORx0_oWKZ_xTq6E6L9YsaVtI_-165yzpkU_Pxwu_0uDvFsw9vtUk6tgZIylI6WNlVdEwTOz0jJ-4SszWvTO70naz8ka9t-OAzTq6n9ADVRRSIxCNTLWdHZsYLMrwPx-0QWXuHPUbMvk4T0DpyDIqsVU8zrKK4RLpVxkEzurfg9XkBD_v22ihYJQYspkk6Wpy3rXPwWXGLbOLWGSsvWh9bC5j5AMMj4qjsWNYseP8uLXsI3YIAolYIInRgeKURu-m-O8OLmREHr7nGixhy7lB81zu2tOSCzKBGkt0T3Qy0W34XICqbL0MIKRrZc791EgWXr-4QOLMixpLN9rCC8330M5om6Oe-n5PR2Gwo5mNsGlJ2uZp4NciA3p8N1VRovqFxTpj8SXhEcVlkvO1igQYMKFi05T8U_Mt6K9UfO_Io_N0cmPXwOxJzCw8TMDkYOdkxjpIz5N1NjZNkJzhcA35gKxqKB_fdQzTwj8qLq4hpK7On7s-SKXue0g_Re-z1RE_aQkRfNqM7RwuXTmwUgtYK4h2jX34lAeOJX76UZmUkwIntmsntp4BgtUQu9sCijlPX-6RtfMta4MoNUIo1OJwwfr7Q_X_Fk-cnDfBBhtJIwoaEROr5thqnnUTHNFpuXkkP55IYsxxmWn4I1wKWOt4RKMtxhp6KlkB7P3QxxmPcbRkNS2su4xGYr5w6kdbG3helCZAkSu0krIO9bNuFlL1YhfR3TiiU7qp5ZqmJyHkqFmcrwZ5uRMAfdCEO9gUqIvlD7owLWIyFRs2nLYJzYfjMDCuc_F30PxJ1mgcGkOBS6uRKCrY0insGDwwTfZmPXz2paGVXTYtWGic_51Y45BTSWp81P68AcdS4GxT95Sx3EXglKanVJwJTFl3legZIoDbGFeVEc2Z4T8_OWKiooL5ktXz0vhcF7fkLx22bpfHX_CA9X4kqKdTh02PTvTVvc9Wdd9LIysFYehVv6HT4Gy8xY2xUajlNHXmfcr4RF_0k28PJmTSPXgEqxYAFMfRm0NiVzlL7uOfgBstE5RTHtqwkQYz0bfq6OmVi-eywBAIsUtMiKWn3xRsACsbKeRLdxPI6ZkhoWMusSCeIHUxeKnd0s-GTXkFlU8tz_BuJIlHquShTgmZq6DdL6hOmcX1VCVQo5i7tYhVnSScqPdf8Jji5V-CbY20gKeMZLvxWVvHvgcU-0LXNm_jBpJX98g0TVRaDm_1t_NKYAkTRryT2McjzJbuoFHIxbH4auGyrrNUK7bYRaWbqn0UAs8PXh2LiyvihzkuNzCypY92boDBLVzIMKu2UCd0ZAC_DB8ePlVQrTJHJynOMgU7D-F964XQv-3sO8e5yXrNBRNSI70DfV1ne2wvxd3C48_F96ArBOpNqtOFq3FqEXMyntW_SnRoEldSpt03PEj8Q0zx5ZewKGEyvvs12ClexCRyc4q9pZj248VVtOc6qOsly0?></g></svg>