Files
the-biergarten-app/pipeline/diagrams/activity-diagram.svg

1 line
47 KiB
XML

<?plantuml 1.2026.2?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="ACTIVITY" height="2645px" preserveAspectRatio="none" style="width:3331px;height:2645px;background:#FAFCF9;" version="1.1" viewBox="0 0 3331 2645" width="3331px" zoomAndPan="magnify"><title>The Biergarten Data Pipeline</title><defs/><g><rect fill="#FAFCF9" height="2645" style="stroke:none;stroke-width:1;" width="3331" x="0" y="0"/><g class="title" data-source-line="20"><text fill="#28342A" font-family="'Volkhov'" font-size="20" font-weight="bold" lengthAdjust="spacing" textLength="285.4" x="1521.7588" y="39.42">The Biergarten Data Pipeline</text></g><rect fill="none" height="18.228" style="stroke:none;stroke-width:1;" width="3276.7797" x="15" y="59.64"/><rect fill="#F2F6F0" height="2573.458" style="stroke:#F2F6F0;stroke-width:1;" width="548.0008" x="15" y="59.64"/><ellipse cx="173.0898" cy="92.868" fill="#222222" rx="10" ry="10" style="stroke:#222222;stroke-width:1;"/><path d="M293.3305,118.754 L293.3305,137.982 L273.3305,141.982 L293.3305,145.982 L293.3305,165.21 A0,0 0 0 0 293.3305,165.21 L480.4091,165.21 A0,0 0 0 0 480.4091,165.21 L480.4091,128.754 L470.4091,118.754 L293.3305,118.754 A0,0 0 0 0 293.3305,118.754" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M470.4091,118.754 L470.4091,128.754 L480.4091,128.754 L470.4091,118.754" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="60.3226" x="299.3305" y="137.642">Validates</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" text-decoration="line-through" textLength="55.125" x="363.3771" y="137.642">mocked,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="43.183" x="422.2261" y="137.642">model,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" text-decoration="line-through" textLength="84.6267" x="299.3305" y="155.87">temperature,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="69.3981" x="387.6812" y="155.87">top-p, etc.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="200.4815" x="72.849" y="122.868"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="180.4815" x="82.849" y="146.756">ParseArguments(argc, argv)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="171.5924" x="87.2936" y="236.324"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="151.5924" x="97.2936" y="260.212">spdlog::error usage info</text><ellipse cx="173.0898" cy="311.938" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1;"/><ellipse cx="173.0898" cy="311.938" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1;"/><polygon fill="#FAFCF9" points="104.5596,185.21,241.6199,185.21,253.6199,197.21,241.6199,209.21,104.5596,209.21,92.5596,197.21,104.5596,185.21" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="177.0898" y="223.098">no</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="137.0603" x="104.5596" y="201.984">Are arguments valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="253.6199" y="192.87">yes</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="292.9199" x="26.6298" y="364.938"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="272.9199" x="36.6298" y="388.826">Init CurlGlobalState &amp; LlamaBackendState</text><path d="M268.3858,413.166 L268.3858,441.508 L248.3858,445.508 L268.3858,449.508 L268.3858,477.85 A0,0 0 0 0 268.3858,477.85 L558.0008,477.85 A0,0 0 0 0 558.0008,477.85 L558.0008,423.166 L548.0008,413.166 L268.3858,413.166 A0,0 0 0 0 268.3858,413.166" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M548.0008,413.166 L548.0008,423.166 L558.0008,423.166 L548.0008,413.166" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="263.0777" x="274.3858" y="432.054">Binds CURLWebClient, WikipediaService,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="233.2543" x="274.3858" y="450.282">Gemma4JinjaPromptFormatter, and</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="268.615" x="274.3858" y="468.51">either MockGenerator or LlamaGenerator</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="150.5921" x="97.7937" y="426.394"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="130.5921" x="107.7937" y="450.282">di::make_injector(...)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="304.1796" x="21" y="497.85"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="284.1796" x="31" y="521.738">injector.create&lt;BiergartenDataGenerator&gt;()</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="224.1274" x="61.0261" y="556.078"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="204.1274" x="71.0261" y="579.966">BiergartenDataGenerator::Run()</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="76.287" x="134.9463" y="2552.87"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="56.287" x="144.9463" y="2576.758">Return 0</text><ellipse cx="173.0898" cy="2622.098" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1;"/><ellipse cx="173.0898" cy="2622.098" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1;"/><line x1="15" x2="15" y1="59.64" y2="2633.098"/><rect fill="#EAF0E8" height="2573.458" style="stroke:#EAF0E8;stroke-width:1;" width="687.1087" x="563.0008" y="59.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="201.2686" x="771.9788" y="614.306"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="181.2686" x="781.9788" y="638.194">QueryCitiesWithCountries()</text><polygon fill="#FAFCF9" points="825.3735,1083.062,919.8527,1083.062,931.8527,1095.062,919.8527,1107.062,825.3735,1107.062,813.3735,1095.062,825.3735,1083.062" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="94.4791" x="825.3735" y="1099.836">Lookup failed?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="790.599" y="1090.722">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="931.8527" y="1090.722">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="249.66" x="596.0008" y="1117.062"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="229.66" x="606.0008" y="1140.95">spdlog::warn "context lookup failed"</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="317.469" x="865.6609" y="1117.062"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="297.469" x="875.6609" y="1140.95">Store EnrichedCity{Location, region_context}</text><polygon fill="#FAFCF9" points="872.6131,1161.29,884.6131,1173.29,872.6131,1185.29,860.6131,1173.29,872.6131,1161.29" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="780.9515,788.99,964.2747,788.99,976.2747,800.99,964.2747,812.99,780.9515,812.99,768.9515,800.99,780.9515,788.99" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.8471" x="876.6131" y="826.878">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="183.3233" x="780.9515" y="805.764">For each sampled Location?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="33.922" x="735.0295" y="796.65">Done</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="256.6633" x="744.2815" y="1227.29"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="236.6633" x="754.2815" y="1251.178">GenerateBreweries(enriched_cities)</text><polygon fill="#FAFCF9" points="811.8477,2350.414,933.3785,2350.414,945.3785,2362.414,933.3785,2374.414,811.8477,2374.414,799.8477,2362.414,811.8477,2350.414" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="121.5308" x="811.8477" y="2367.188">Exception thrown?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="777.0732" y="2358.074">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="945.3785" y="2358.074">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="279.0742" x="607.9314" y="2384.414"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="259.0742" x="617.9314" y="2408.302">spdlog::warn "brewery generation failed"</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="181.5043" x="907.0056" y="2384.414"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="161.5043" x="917.0056" y="2408.302">Store GeneratedBrewery</text><polygon fill="#FAFCF9" points="872.6131,2428.642,884.6131,2440.642,872.6131,2452.642,860.6131,2440.642,872.6131,2428.642" style="stroke:#628A5B;stroke-width:0.5;"/><path d="M943.0557,2499.642 L943.0557,2509.756 L923.0557,2513.756 L943.0557,2517.756 L943.0557,2527.87 A0,0 0 0 0 943.0557,2527.87 L1245.1095,2527.87 A0,0 0 0 0 1245.1095,2527.87 L1245.1095,2509.642 L1235.1095,2499.642 L943.0557,2499.642 A0,0 0 0 0 943.0557,2499.642" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M1235.1095,2499.642 L1235.1095,2509.642 L1245.1095,2509.642 L1235.1095,2499.642" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="281.0539" x="949.0557" y="2518.53">spdlog::info dump of generated JSON fields</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="100.8851" x="822.1705" y="2494.642"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="80.8851" x="832.1705" y="2518.53">LogResults()</text><line x1="563.0008" x2="563.0008" y1="59.64" y2="2633.098"/><rect fill="#E2EBDC" height="2573.458" style="stroke:#E2EBDC;stroke-width:1;" width="314.169" x="1250.1095" y="59.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="304.169" x="1256.1095" y="672.534"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="284.169" x="1266.1095" y="696.422">JsonLoader::LoadLocations("locations.json")</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="260.3698" x="1278.0092" y="730.762"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="240.3698" x="1288.0092" y="754.65">std::ranges::sample(all_locations, 50)</text><line x1="1250.1095" x2="1250.1095" y1="59.64" y2="2633.098"/><rect fill="#DCE8D8" height="2573.458" style="stroke:#DCE8D8;stroke-width:1;" width="467.3623" x="1564.2786" y="59.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="182.6382" x="1590.8167" y="848.378"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="162.6382" x="1600.8167" y="872.266">GetLocationContext(loc)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="207.9644" x="1578.1536" y="906.606"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="187.9644" x="1588.1536" y="930.494">FetchExtract("City, Country")</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="223.7145" x="1570.2786" y="964.834"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="203.7145" x="1580.2786" y="988.722">FetchExtract("beer in Country")</text><path d="M1800.9013,1029.834 L1800.9013,1039.948 L1780.9013,1043.948 L1800.9013,1047.948 L1800.9013,1058.062 A0,0 0 0 0 1800.9013,1058.062 L2026.6409,1058.062 A0,0 0 0 0 2026.6409,1058.062 L2026.6409,1039.834 L2016.6409,1029.834 L1800.9013,1029.834 A0,0 0 0 0 1800.9013,1029.834" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M2016.6409,1029.834 L2016.6409,1039.834 L2026.6409,1039.834 L2016.6409,1029.834" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="204.7396" x="1806.9013" y="1048.722">Backed by CURLWebClient::Get</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="197.5309" x="1583.3704" y="1024.834"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="177.5309" x="1593.3704" y="1048.722">FetchExtract("beer in City")</text><line x1="1564.2786" x2="1564.2786" y1="59.64" y2="2633.098"/><rect fill="#E5EDE1" height="2573.458" style="stroke:#E5EDE1;stroke-width:1;" width="1259.2768" x="2031.6409" y="59.64"/><polygon fill="#FAFCF9" points="2405.2282,1344.906,2512.0903,1344.906,2524.0903,1356.906,2512.0903,1368.906,2405.2282,1368.906,2393.2282,1356.906,2405.2282,1344.906" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="106.8621" x="2405.2282" y="1361.68">Generator Mode</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="101.4686" x="2291.7596" y="1352.566">MockGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="104.5242" x="2524.0903" y="1352.566">LlamaGenerator</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="202.1612" x="2132.4466" y="1378.906"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="182.1612" x="2142.4466" y="1402.794">DeterministicHash(location)</text><rect fill="#FAFCF9" height="56.456" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="337.7727" x="2064.6409" y="1437.134"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="317.7727" x="2074.6409" y="1461.022">Select from kBreweryAdjectives, kBreweryNouns,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="142.3557" x="2074.6409" y="1479.25">kBreweryDescriptions</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="163.3848" x="2151.8348" y="1528.59"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="143.3848" x="2161.8348" y="1552.478">Format BreweryResult</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="277.3098" x="2545.1364" y="1378.906"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="257.3098" x="2555.1364" y="1402.794">PrepareRegionContext(region_context)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="354.2819" x="2506.6504" y="1437.134"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="334.2819" x="2516.6504" y="1461.022">LoadBrewerySystemPrompt("prompts/system.md")</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="156.6926" x="2605.445" y="1510.362"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="136.6926" x="2615.445" y="1534.25">Format user_prompt</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="99.674" x="2633.9543" y="1583.59"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="79.674" x="2643.9543" y="1607.478">Attempt = 0</text><path d="M2955.1691,1681.704 L2955.1691,1700.932 L2935.1691,1704.932 L2955.1691,1708.932 L2955.1691,1728.16 A0,0 0 0 0 2955.1691,1728.16 L3259.9177,1728.16 A0,0 0 0 0 3259.9177,1728.16 L3259.9177,1691.704 L3249.9177,1681.704 L2955.1691,1681.704 A0,0 0 0 0 2955.1691,1681.704" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3249.9177,1681.704 L3249.9177,1691.704 L3259.9177,1691.704 L3249.9177,1681.704" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="240.0233" x="2961.1691" y="1700.592">Uses Gemma4JinjaPromptFormatter,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="283.7486" x="2961.1691" y="1718.82">llama_tokenize, and llama_sampler_sample</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="502.7556" x="2432.4135" y="1685.818"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="482.7556" x="2442.4135" y="1709.706">Infer(system_prompt, user_prompt, max_tokens, kBreweryJsonGrammar)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="250.5106" x="2558.536" y="1748.16"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="230.5106" x="2568.536" y="1772.048">ValidateBreweryJson(raw, brewery)</text><polygon fill="#FAFCF9" points="2637.3148,1806.388,2730.2679,1806.388,2742.2679,1818.388,2730.2679,1830.388,2637.3148,1830.388,2625.3148,1818.388,2637.3148,1806.388" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="92.9531" x="2637.3148" y="1823.162">Is JSON Valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="2602.5403" y="1814.048">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="2742.2679" y="1814.048">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="149.6224" x="2699.3505" y="1891.502"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="129.6224" x="2709.3505" y="1915.39">max_tokens += 700</text><polygon fill="#FAFCF9" points="2686.3851,1840.388,2861.9383,1840.388,2873.9383,1852.388,2861.9383,1864.388,2686.3851,1864.388,2674.3851,1852.388,2686.3851,1840.388" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="2778.1617" y="1878.276">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="175.5533" x="2686.3851" y="1857.162">Error == "incomplete JSON"</text><polygon fill="#FAFCF9" points="2774.1617,1949.73,2786.1617,1961.73,2774.1617,1973.73,2762.1617,1961.73,2774.1617,1949.73" style="stroke:#628A5B;stroke-width:0.5;"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="291.4815" x="2628.421" y="1993.73"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="271.4815" x="2638.421" y="2017.618">Update user_prompt with validation error</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="90.3536" x="2728.9849" y="2051.958"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="70.3536" x="2738.9849" y="2075.846">Attempt++</text><polygon fill="#FAFCF9" points="2683.7913,1641.818,2695.7913,1653.818,2683.7913,1665.818,2671.7913,1653.818,2683.7913,1641.818" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="2640.9425,2110.186,2726.6401,2110.186,2738.6401,2122.186,2726.6401,2134.186,2640.9425,2134.186,2628.9425,2122.186,2640.9425,2110.186" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="85.6976" x="2640.9425" y="2126.96">Attempt &lt; 3?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="2738.6401" y="2117.846">yes</text><polygon fill="#FAFCF9" points="2683.7913,2154.186,2695.7913,2166.186,2683.7913,2178.186,2671.7913,2166.186,2683.7913,2154.186" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="2645.8915,2198.186,2721.6912,2198.186,2733.6912,2210.186,2721.6912,2222.186,2645.8915,2222.186,2633.8915,2210.186,2645.8915,2198.186" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="75.7997" x="2645.8915" y="2214.96">Still Invalid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="2611.117" y="2205.846">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="2733.6912" y="2205.846">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="179.8839" x="2498.923" y="2232.186"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="159.8839" x="2508.923" y="2256.074">throw std::runtime_error</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="159.8218" x="2698.8068" y="2232.186"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="139.8218" x="2708.8068" y="2256.074">Return BreweryResult</text><polygon fill="#FAFCF9" points="2683.7913,2276.414,2695.7913,2288.414,2683.7913,2300.414,2671.7913,2288.414,2683.7913,2276.414" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="2458.6593,2306.414,2470.6593,2318.414,2458.6593,2330.414,2446.6593,2318.414,2458.6593,2306.414" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="2383.0119,1285.518,2534.3066,1285.518,2546.3066,1297.518,2534.3066,1309.518,2383.0119,1309.518,2371.0119,1297.518,2383.0119,1285.518" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.8471" x="2462.6593" y="1323.406">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="151.2948" x="2383.0119" y="1302.292">For each EnrichedCity?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="33.922" x="2337.0899" y="1293.178">Done</text><line x1="2031.6409" x2="2031.6409" y1="59.64" y2="2633.098"/><line x1="3290.9177" x2="3290.9177" y1="59.64" y2="2633.098"/><polygon fill="#628A5B" points="3301.9177,1893.66,3305.9177,1883.66,3309.9177,1893.66" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="173.0898" y1="102.868" y2="122.868"/><polygon fill="#628A5B" points="169.0898,112.868,177.0898,112.868,173.0898,122.868" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="173.0898" y1="274.552" y2="300.938"/><polygon fill="#628A5B" points="169.0898,290.938,177.0898,290.938,173.0898,300.938" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="173.0898" y1="209.21" y2="236.324"/><polygon fill="#628A5B" points="169.0898,226.324,177.0898,226.324,173.0898,236.324" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="253.6199" x2="268.886" y1="197.21" y2="197.21"/><polygon fill="#628A5B" points="264.886,270.938,272.886,270.938,268.886,280.938" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="268.886" x2="268.886" y1="197.21" y2="344.938"/><line style="stroke:#628A5B;stroke-width:1;" x1="268.886" x2="173.0898" y1="344.938" y2="344.938"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="173.0898" y1="344.938" y2="364.938"/><polygon fill="#628A5B" points="169.0898,354.938,177.0898,354.938,173.0898,364.938" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="173.0898" y1="161.096" y2="185.21"/><polygon fill="#628A5B" points="169.0898,175.21,177.0898,175.21,173.0898,185.21" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="173.0898" y1="403.166" y2="426.394"/><polygon fill="#628A5B" points="169.0898,416.394,177.0898,416.394,173.0898,426.394" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="173.0898" y1="464.622" y2="497.85"/><polygon fill="#628A5B" points="169.0898,487.85,177.0898,487.85,173.0898,497.85" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="173.0898" y1="536.078" y2="556.078"/><polygon fill="#628A5B" points="169.0898,546.078,177.0898,546.078,173.0898,556.078" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="173.0898" y1="2591.098" y2="2611.098"/><polygon fill="#628A5B" points="169.0898,2601.098,177.0898,2601.098,173.0898,2611.098" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="813.3735" x2="720.8308" y1="1095.062" y2="1095.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="720.8308" x2="720.8308" y1="1095.062" y2="1117.062"/><polygon fill="#628A5B" points="716.8308,1107.062,724.8308,1107.062,720.8308,1117.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="931.8527" x2="1024.3954" y1="1095.062" y2="1095.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="1024.3954" x2="1024.3954" y1="1095.062" y2="1117.062"/><polygon fill="#628A5B" points="1020.3954,1107.062,1028.3954,1107.062,1024.3954,1117.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="720.8308" x2="720.8308" y1="1155.29" y2="1173.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="720.8308" x2="860.6131" y1="1173.29" y2="1173.29"/><polygon fill="#628A5B" points="850.6131,1169.29,860.6131,1173.29,850.6131,1177.29" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1024.3954" x2="1024.3954" y1="1155.29" y2="1173.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="1024.3954" x2="884.6131" y1="1173.29" y2="1173.29"/><polygon fill="#628A5B" points="894.6131,1169.29,884.6131,1173.29,894.6131,1177.29" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="1185.29" y2="1195.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="1229.1182" y1="1195.29" y2="1195.29"/><polygon fill="#628A5B" points="1225.1182,1004.834,1229.1182,994.834,1233.1182,1004.834" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1229.1182" x2="1229.1182" y1="800.99" y2="1195.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="1229.1182" x2="976.2747" y1="800.99" y2="800.99"/><polygon fill="#628A5B" points="986.2747,796.99,976.2747,800.99,986.2747,804.99" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="768.9515" x2="582.0008" y1="800.99" y2="800.99"/><polygon fill="#628A5B" points="578.0008,990.834,586.0008,990.834,582.0008,1000.834" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="582.0008" x2="582.0008" y1="800.99" y2="1207.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="582.0008" x2="872.6131" y1="1207.29" y2="1207.29"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="1207.29" y2="1227.29"/><polygon fill="#628A5B" points="868.6131,1217.29,876.6131,1217.29,872.6131,1227.29" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="799.8477" x2="747.4685" y1="2362.414" y2="2362.414"/><line style="stroke:#628A5B;stroke-width:1;" x1="747.4685" x2="747.4685" y1="2362.414" y2="2384.414"/><polygon fill="#628A5B" points="743.4685,2374.414,751.4685,2374.414,747.4685,2384.414" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="945.3785" x2="997.7577" y1="2362.414" y2="2362.414"/><line style="stroke:#628A5B;stroke-width:1;" x1="997.7577" x2="997.7577" y1="2362.414" y2="2384.414"/><polygon fill="#628A5B" points="993.7577,2374.414,1001.7577,2374.414,997.7577,2384.414" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="747.4685" x2="747.4685" y1="2422.642" y2="2440.642"/><line style="stroke:#628A5B;stroke-width:1;" x1="747.4685" x2="860.6131" y1="2440.642" y2="2440.642"/><polygon fill="#628A5B" points="850.6131,2436.642,860.6131,2440.642,850.6131,2444.642" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="997.7577" x2="997.7577" y1="2422.642" y2="2440.642"/><line style="stroke:#628A5B;stroke-width:1;" x1="997.7577" x2="884.6131" y1="2440.642" y2="2440.642"/><polygon fill="#628A5B" points="894.6131,2436.642,884.6131,2440.642,894.6131,2444.642" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1408.1941" x2="1408.1941" y1="710.762" y2="730.762"/><polygon fill="#628A5B" points="1404.1941,720.762,1412.1941,720.762,1408.1941,730.762" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1682.1358" x2="1682.1358" y1="886.606" y2="906.606"/><polygon fill="#628A5B" points="1678.1358,896.606,1686.1358,896.606,1682.1358,906.606" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1682.1358" x2="1682.1358" y1="944.834" y2="964.834"/><polygon fill="#628A5B" points="1678.1358,954.834,1686.1358,954.834,1682.1358,964.834" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1682.1358" x2="1682.1358" y1="1003.062" y2="1024.834"/><polygon fill="#628A5B" points="1678.1358,1014.834,1686.1358,1014.834,1682.1358,1024.834" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2233.5272" x2="2233.5272" y1="1417.134" y2="1437.134"/><polygon fill="#628A5B" points="2229.5272,1427.134,2237.5272,1427.134,2233.5272,1437.134" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2233.5272" x2="2233.5272" y1="1493.59" y2="1528.59"/><polygon fill="#628A5B" points="2229.5272,1518.59,2237.5272,1518.59,2233.5272,1528.59" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="1417.134" y2="1437.134"/><polygon fill="#628A5B" points="2679.7913,1427.134,2687.7913,1427.134,2683.7913,1437.134" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="1475.362" y2="1510.362"/><polygon fill="#628A5B" points="2679.7913,1500.362,2687.7913,1500.362,2683.7913,1510.362" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="1548.59" y2="1583.59"/><polygon fill="#628A5B" points="2679.7913,1573.59,2687.7913,1573.59,2683.7913,1583.59" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="1724.046" y2="1748.16"/><polygon fill="#628A5B" points="2679.7913,1738.16,2687.7913,1738.16,2683.7913,1748.16" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2774.1617" x2="2774.1617" y1="1864.388" y2="1891.502"/><polygon fill="#628A5B" points="2770.1617,1881.502,2778.1617,1881.502,2774.1617,1891.502" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2873.9383" x2="2885.9383" y1="1852.388" y2="1852.388"/><polygon fill="#628A5B" points="2881.9383,1900.616,2889.9383,1900.616,2885.9383,1910.616" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2885.9383" x2="2885.9383" y1="1852.388" y2="1961.73"/><line style="stroke:#628A5B;stroke-width:1;" x1="2885.9383" x2="2786.1617" y1="1961.73" y2="1961.73"/><polygon fill="#628A5B" points="2796.1617,1957.73,2786.1617,1961.73,2796.1617,1965.73" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2774.1617" x2="2774.1617" y1="1929.73" y2="1949.73"/><polygon fill="#628A5B" points="2770.1617,1939.73,2778.1617,1939.73,2774.1617,1949.73" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2774.1617" x2="2774.1617" y1="1973.73" y2="1993.73"/><polygon fill="#628A5B" points="2770.1617,1983.73,2778.1617,1983.73,2774.1617,1993.73" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2774.1617" x2="2774.1617" y1="2031.958" y2="2051.958"/><polygon fill="#628A5B" points="2770.1617,2041.958,2778.1617,2041.958,2774.1617,2051.958" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2625.3148" x2="2593.421" y1="1818.388" y2="1818.388"/><line style="stroke:#628A5B;stroke-width:1;" x1="2593.421" x2="2593.421" y1="1818.388" y2="2166.186"/><line style="stroke:#628A5B;stroke-width:1;" x1="2593.421" x2="2671.7913" y1="2166.186" y2="2166.186"/><polygon fill="#628A5B" points="2661.7913,2162.186,2671.7913,2166.186,2661.7913,2170.186" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2742.2679" x2="2774.1617" y1="1818.388" y2="1818.388"/><line style="stroke:#628A5B;stroke-width:1;" x1="2774.1617" x2="2774.1617" y1="1818.388" y2="1840.388"/><polygon fill="#628A5B" points="2770.1617,1830.388,2778.1617,1830.388,2774.1617,1840.388" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2774.1617" x2="2774.1617" y1="2090.186" y2="2095.186"/><line style="stroke:#628A5B;stroke-width:1;" x1="2774.1617" x2="2683.7913" y1="2095.186" y2="2095.186"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="2095.186" y2="2110.186"/><polygon fill="#628A5B" points="2679.7913,2100.186,2687.7913,2100.186,2683.7913,2110.186" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="1786.388" y2="1806.388"/><polygon fill="#628A5B" points="2679.7913,1796.388,2687.7913,1796.388,2683.7913,1806.388" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="1665.818" y2="1685.818"/><polygon fill="#628A5B" points="2679.7913,1675.818,2687.7913,1675.818,2683.7913,1685.818" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2738.6401" x2="3271.9177" y1="2122.186" y2="2122.186"/><polygon fill="#628A5B" points="3267.9177,1902.502,3271.9177,1892.502,3275.9177,1902.502" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3271.9177" x2="3271.9177" y1="1653.818" y2="2122.186"/><line style="stroke:#628A5B;stroke-width:1;" x1="3271.9177" x2="2695.7913" y1="1653.818" y2="1653.818"/><polygon fill="#628A5B" points="2705.7913,1649.818,2695.7913,1653.818,2705.7913,1657.818" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="2134.186" y2="2154.186"/><polygon fill="#628A5B" points="2679.7913,2144.186,2687.7913,2144.186,2683.7913,2154.186" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="1621.818" y2="1641.818"/><polygon fill="#628A5B" points="2679.7913,1631.818,2687.7913,1631.818,2683.7913,1641.818" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2633.8915" x2="2588.8649" y1="2210.186" y2="2210.186"/><line style="stroke:#628A5B;stroke-width:1;" x1="2588.8649" x2="2588.8649" y1="2210.186" y2="2232.186"/><polygon fill="#628A5B" points="2584.8649,2222.186,2592.8649,2222.186,2588.8649,2232.186" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2733.6912" x2="2778.7178" y1="2210.186" y2="2210.186"/><line style="stroke:#628A5B;stroke-width:1;" x1="2778.7178" x2="2778.7178" y1="2210.186" y2="2232.186"/><polygon fill="#628A5B" points="2774.7178,2222.186,2782.7178,2222.186,2778.7178,2232.186" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2588.8649" x2="2588.8649" y1="2270.414" y2="2288.414"/><line style="stroke:#628A5B;stroke-width:1;" x1="2588.8649" x2="2671.7913" y1="2288.414" y2="2288.414"/><polygon fill="#628A5B" points="2661.7913,2284.414,2671.7913,2288.414,2661.7913,2292.414" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2778.7178" x2="2778.7178" y1="2270.414" y2="2288.414"/><line style="stroke:#628A5B;stroke-width:1;" x1="2778.7178" x2="2695.7913" y1="2288.414" y2="2288.414"/><polygon fill="#628A5B" points="2705.7913,2284.414,2695.7913,2288.414,2705.7913,2292.414" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="2178.186" y2="2198.186"/><polygon fill="#628A5B" points="2679.7913,2188.186,2687.7913,2188.186,2683.7913,2198.186" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2393.2282" x2="2233.5272" y1="1356.906" y2="1356.906"/><line style="stroke:#628A5B;stroke-width:1;" x1="2233.5272" x2="2233.5272" y1="1356.906" y2="1378.906"/><polygon fill="#628A5B" points="2229.5272,1368.906,2237.5272,1368.906,2233.5272,1378.906" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2524.0903" x2="2683.7913" y1="1356.906" y2="1356.906"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="1356.906" y2="1378.906"/><polygon fill="#628A5B" points="2679.7913,1368.906,2687.7913,1368.906,2683.7913,1378.906" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2233.5272" x2="2233.5272" y1="1566.818" y2="2318.414"/><line style="stroke:#628A5B;stroke-width:1;" x1="2233.5272" x2="2446.6593" y1="2318.414" y2="2318.414"/><polygon fill="#628A5B" points="2436.6593,2314.414,2446.6593,2318.414,2436.6593,2322.414" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2683.7913" y1="2300.414" y2="2318.414"/><line style="stroke:#628A5B;stroke-width:1;" x1="2683.7913" x2="2470.6593" y1="2318.414" y2="2318.414"/><polygon fill="#628A5B" points="2480.6593,2314.414,2470.6593,2318.414,2480.6593,2322.414" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2458.6593" x2="2458.6593" y1="1309.518" y2="1344.906"/><polygon fill="#628A5B" points="2454.6593,1334.906,2462.6593,1334.906,2458.6593,1344.906" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2371.0119" x2="2050.6409" y1="1297.518" y2="1297.518"/><polygon fill="#628A5B" points="2046.6409,1894.41,2054.6409,1894.41,2050.6409,1904.41" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2050.6409" x2="2050.6409" y1="1297.518" y2="2479.642"/><line style="stroke:#628A5B;stroke-width:1;" x1="2050.6409" x2="872.6131" y1="2479.642" y2="2479.642"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="2479.642" y2="2494.642"/><polygon fill="#628A5B" points="868.6131,2484.642,876.6131,2484.642,872.6131,2494.642" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="173.0898" y1="594.306" y2="599.306"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="872.6131" y1="599.306" y2="599.306"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="599.306" y2="614.306"/><polygon fill="#628A5B" points="868.6131,604.306,876.6131,604.306,872.6131,614.306" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="652.534" y2="657.534"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="1408.1941" y1="657.534" y2="657.534"/><line style="stroke:#628A5B;stroke-width:1;" x1="1408.1941" x2="1408.1941" y1="657.534" y2="672.534"/><polygon fill="#628A5B" points="1404.1941,662.534,1412.1941,662.534,1408.1941,672.534" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1682.1358" x2="1682.1358" y1="1063.062" y2="1068.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="1682.1358" x2="872.6131" y1="1068.062" y2="1068.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="1068.062" y2="1083.062"/><polygon fill="#628A5B" points="868.6131,1073.062,876.6131,1073.062,872.6131,1083.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="812.99" y2="833.378"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="1682.1358" y1="833.378" y2="833.378"/><line style="stroke:#628A5B;stroke-width:1;" x1="1682.1358" x2="1682.1358" y1="833.378" y2="848.378"/><polygon fill="#628A5B" points="1678.1358,838.378,1686.1358,838.378,1682.1358,848.378" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1408.1941" x2="1408.1941" y1="768.99" y2="773.99"/><line style="stroke:#628A5B;stroke-width:1;" x1="1408.1941" x2="872.6131" y1="773.99" y2="773.99"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="773.99" y2="788.99"/><polygon fill="#628A5B" points="868.6131,778.99,876.6131,778.99,872.6131,788.99" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2458.6593" x2="2458.6593" y1="2330.414" y2="2335.414"/><line style="stroke:#628A5B;stroke-width:1;" x1="2458.6593" x2="872.6131" y1="2335.414" y2="2335.414"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="2335.414" y2="2350.414"/><polygon fill="#628A5B" points="868.6131,2340.414,876.6131,2340.414,872.6131,2350.414" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="2452.642" y2="2462.642"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="3305.9177" y1="2462.642" y2="2462.642"/><line style="stroke:#628A5B;stroke-width:1;" x1="3305.9177" x2="3305.9177" y1="1297.518" y2="2462.642"/><line style="stroke:#628A5B;stroke-width:1;" x1="3305.9177" x2="2546.3066" y1="1297.518" y2="1297.518"/><polygon fill="#628A5B" points="2556.3066,1293.518,2546.3066,1297.518,2556.3066,1301.518" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="1265.518" y2="1270.518"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="2458.6593" y1="1270.518" y2="1270.518"/><line style="stroke:#628A5B;stroke-width:1;" x1="2458.6593" x2="2458.6593" y1="1270.518" y2="1285.518"/><polygon fill="#628A5B" points="2454.6593,1275.518,2462.6593,1275.518,2458.6593,1285.518" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="872.6131" y1="2532.87" y2="2537.87"/><line style="stroke:#628A5B;stroke-width:1;" x1="872.6131" x2="173.0898" y1="2537.87" y2="2537.87"/><line style="stroke:#628A5B;stroke-width:1;" x1="173.0898" x2="173.0898" y1="2537.87" y2="2552.87"/><polygon fill="#628A5B" points="169.0898,2542.87,177.0898,2542.87,173.0898,2552.87" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="50.26" x="263.8704" y="73.528">main.cc</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="163.6743" x="824.718" y="73.528">BiergartenDataGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="75.5861" x="1369.401" y="73.528">JsonLoader</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="111.7306" x="1742.0944" y="73.528">WikipediaService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="96.6737" x="2612.9424" y="73.528">DataGenerator</text><?plantuml-src ZLPjJ-Cu4FwUNp4AqYdLbbwN1POBovtwoh9YEOxkovUJAfDCMsyTkxBTbjxr_lkDdQHDeImWrBJsUFpCpFFCn4ovd37DCZ1s9P0-DK_iF1E1sUoaE69pOVjAsXkM8OJTpp1WqeJxRGRy7uItnvLDowt0xV5lIamdQX7ki_27ZvgLhNkMJCTQpMNQKK9fEEYt-ft-R_llBaoEpjuT7xNs-N_EeAMrMXQRfqTdhPDsPVD6MMm_Xj5hzPkziyTMIgUe2ukJu_V7fs-hboIMBxXTjLyCQMFvAdzTpZ8bqzUxBGzKlJ-9UelsMPF1acU2oPsmhIPgq3PA-wpbbmbFfXADWMOG-Dh0bmb2cwCUCsrHGfTP1hTyXe9B38BrGV-eVzflhZF6PID9re6nP1Z4jqmRREdnFAFxJCJqEAa3VIvgvu6aWe3cuuaD0BunmLDcqS3XOQQIAQPr_or5KQVjmqEBsGmritEDRiUgsU6i3cYJHe0o1USi2FW8efP6TqD-8ooStpzgO2U4EfAgHivYCqk56iSn4giqp0qR8t0vKkUqQSXpWC8WH2iqDUUSZu8WlfBSGcUknQLGzqmCB865N-1Qi8ovofATNpiFufJ7SSQcEEJo1oPMwQZHQ3mEkCrbQg3pzUxwEzvt12UqTVZEfvJJbBC1wWLFq8L-YLd6ZZ-HBtQhLJOZ8UcCMOkQCYbJia1EqMduJ6cxHEcIH57HlyUsMTccAIvnDHAD1Fd3jh2khfiJlqS4EdvcCuxlvj8PKF5phQsViLm7yLzprAiEjnpDTmBR8H5G8qDJdZ_gjRkTzIUZvBLYH40wilqHn-vvhH9ckP8c2aNvjV63Z487qjWqZedPOpHnR5Ws4nWn8OORqpgSD5y7TZdXnFU8iWp8aWdatb8e0H2Pk87e3XtNkHn3ukDon5eVT3kzi-xP-d4TruvrbsXB7nrgTVXW8u9NSwIB-qJaIU-1n9dOAAHChUgGPsaLxhEuHoeubw-p8M-vmPQ0CNZEfd2_skLWx606FfQN4WNWv7Qjr7G-Wn6Zh6s5jieJKj7Qaca9OP873g9wAdJOSidb0gLZ0xe2eITft4qmTI7yMoQl3Xh7z1mMplxpnxrCwRCeNrT9h95i2xpOrhX4JpaiV0wBkkMaEEbrUs_NBr2X2kSdD71fsGhnC_MmCYqx4YqYxI99EICVnlBa8pEJg2IjhvdB1GgIAun8_J3D0rcrKYTXla1YThbsGsGmzRzb-RkB9j5yvlbVkCfx1nG6TsXeC6-plzim2dot6jsukFCvBucxMu4IgDDfuNgmCjInyuOLXJF_DByQlzh8qh2s2sXkK0zpgsAZPLt7jt01pNo5O52pybzf-qgEK4Uvl-9WlUgb3Xbx65f5VRcI8TTKBcdUPKmN0AgYA1O0lXgQGp_fknj3uHAMtq8lHhuV5sjvrz35ipYmwS154ENGgw2BD5lMuJvVSDpCJHsbhWny6lnvau_AfqfpVtIEJSlBTWHLEkdvaNTn0I6NYNBOA7hdDjpha41kymXlBk1zitc-sSr5jx7yEdF1LAi0I-hs-GpsZ0O_SRSEoYg_UNCUL5rM2Ww524i-V81tXVGyqA0CR62v470b5yzb9xOJUeU4V59Gr-GP3Yjm7gShlaDwrv1FfR8DUuFrjRsozv2WboDuBFB5Tbdm0CQv9tVofPPPDhnIYDlcw77kxNDFskOhHlgr6kSvyKEyEbdA4DmR5QJpR0PgL4P04yTpUCHHf6RVYsEPTwAPVnNx7m00?></g></svg>