<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Exofactory Dev Blog</title>
      <link>https://exofactory.net</link>
      <description>Development updates and insights on Exofactory</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://exofactory.net/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sun, 06 Sep 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>New Demo, New Buildings, New Architecture</title>
          <pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-09-06/</link>
          <guid>https://exofactory.net/blog/2026-09-06/</guid>
          <description xml:base="https://exofactory.net/blog/2026-09-06/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;Lots of work was done over the month. Proper architecture was added, including walls, doors, ladders, roofs, and floors. This really brings the game to the point where players can build &quot;factories&quot; proper. Additionally, a few buildings were added. These buildings, along with the architecture, &lt;em&gt;&quot;complete&quot;&lt;/em&gt; the vertical slice I am targeting here. In this post I cover these new systems, buildings, and how they all fit together. Robot (Exoframe) navigation was very interesting to implement given the above-mentioned ladders.&lt;/p&gt;
&lt;p&gt;Naturally, this vertical slice is a good break point for a new public playable version of the game. I am &lt;strong&gt;aiming to release a public &quot;Demo 2&quot; in early November 2026.&lt;/strong&gt; More details below.&lt;/p&gt;
&lt;p&gt;If you are interested in playing Demo 2, or if you find this post interesting, I would recommend wishlisting Exofactory on Steam. It helps a ton.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;h1 id=&quot;demo-2&quot;&gt;Demo 2!&lt;/h1&gt;
&lt;p&gt;With the work done in August, the game is &lt;em&gt;&quot;mechanically complete&quot;&lt;/em&gt; as far as the currently scoped vertical slice goes. Just in case you don&#39;t know (I didn&#39;t know until more recently than I would like to admit), a vertical slice is &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Vertical_slice&quot;&gt;a type of milestone, benchmark, or deadline, with emphasis on demonstrating progress across all components of a project.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the case of Exofactory, this means that the player should be able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build deep, complex, and emotionally satisfying (in and out of the game) factories.&lt;/li&gt;
&lt;li&gt;Learn more about the AI that the player plays as, starting to establish wants, needs, and moral values based on what is done in game.&lt;/li&gt;
&lt;li&gt;Play with friends, working together or apart, coming and going without issue.&lt;/li&gt;
&lt;li&gt;Learn more about the world the player finds themselves in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This being said, a &lt;em&gt;&quot;mechanically complete&quot;&lt;/em&gt; vertical slice does not a fun game make. Over the next two months, much polishing, testing, playing, and refinement is to be done.&lt;/p&gt;
&lt;p&gt;Demo 2 is targeting Linux and Windows via Steam, and, if possible, Linux via &lt;a rel=&quot;external&quot; href=&quot;https://flathub.org&quot;&gt;Flathub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Of course, there will be &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/AArch64&quot;&gt;aarch64&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/RISC-V&quot;&gt;RISC-V&lt;/a&gt; builds as well for Linux.&lt;/p&gt;
&lt;h1 id=&quot;architecture&quot;&gt;Architecture&lt;/h1&gt;
&lt;p&gt;The new architecture elements really add a lot of life to the game, to the point where the trailers, screenshots, and press kit will all need to be redone. I would even say that in most 3D factory games, migrating from machines under the open sky to buildings is THE milestone that separates the very beginning from early to mid-game play. Really cool to see this now in Exofactory.&lt;/p&gt;
&lt;h2 id=&quot;walls-doors&quot;&gt;Walls &amp;amp; Doors&lt;/h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/spawn_wall.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/spawn_wall.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;We can build walls in groups, on a platform or on the ground.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;From a coding perspective, adding &lt;em&gt;&quot;raw&quot;&lt;/em&gt; walls to the game was not too hard. I extended the preexisting baseplate code to support vertical &lt;em&gt;&quot;walls&quot;&lt;/em&gt;. I am a huge fan of Bevy&#39;s &lt;a rel=&quot;external&quot; href=&quot;https://taintedcoders.com/bevy/relationships&quot;&gt;relationship system&lt;/a&gt;, and by using it here and in the baseplates, we get bulk deletion, groups, and group joining/splitting all for free. Really convenient. Technically, when you build a segment of wall or baseplate, there is an entity that forms a relationship with the grid of placed wall or baseplate segments. When you go to delete that wall, you can get the entity of the wall section that the selection raycast hit, then get the relationship to the &lt;em&gt;&quot;complete&quot;&lt;/em&gt; wall entity, then get all its members through those relationships. Then you can delete, merge, or do whatever you want with all members.&lt;/p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-09-06/door.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-09-06/door.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2026-09-06/door.webp&quot; alt=&quot;Simple doors are basically holes in the walls. For both exoframes and belts.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;Simple doors are basically holes in the walls. For both exoframes and belts.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Doors are pretty simple. They&#39;re just walls with a hole through them, sans all the &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/learn/quick-start/getting-started/ecs/&quot;&gt;components&lt;/a&gt; that let walls do the fancy wall stuff.&lt;/p&gt;
&lt;p&gt;Both the walls and the doors are my custom, definitely unskilled Blender work, and these assets are temporary filler assets.&lt;/p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-09-06/wall_sensor.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-09-06/wall_sensor.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2026-09-06/wall_sensor.webp&quot; alt=&quot;Here we can see the Avian3D sensors.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;Here we can see the Avian3D sensors.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;There was an interesting hitch I did have to address, though. When constructing a building, you often can&#39;t directly see the face of the surface you want to extend a floor/wall/ceiling from. As the code stood, you could only extend from a surface whose relevant edge you could see.&lt;/p&gt;
&lt;p&gt;The solution was actually quite elegant. Along relevant faces, as the architectural elements are placed, we use an extended &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/avian3d/latest/avian3d/collision/collider/struct.Sensor.html&quot;&gt;Avian3D Sensor&lt;/a&gt; along with more relationships to allow the player to extend their building without too much frustration.&lt;/p&gt;
&lt;h2 id=&quot;ladders&quot;&gt;Ladders&lt;/h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/spawn_ladder.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/spawn_ladder.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Ladders now work, and aren&#39;t visibly for humans.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Ladders were shockingly fun to design. The principle here, as with all the assets, is to ask how an AI created by humans, but not human itself, would design such a thing without human physical constraints.&lt;/p&gt;
&lt;p&gt;In machines, this means no control panels, or human-sized access hatches, or safety systems built around protecting squishy human bodies.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/climb_ladder.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/climb_ladder.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Climbing ladders is done just by walking into them.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Here with the ladder, this principle applies. The ladder is built around the needs of the base Exoframe worker robot with its four legs.&lt;/p&gt;
&lt;p&gt;While designing the ladder was fun, there was a lot to learn on the implementation side, particularly around &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy-tnua/latest/bevy_tnua/builtins/struct.TnuaBuiltinClimb.html&quot;&gt;the Tnua character controller&#39;s climbing functionality&lt;/a&gt; and wiring it into &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/bevy_landmass&quot;&gt;bevy_landmass&lt;/a&gt; for autonomous navigation.&lt;/p&gt;
&lt;p&gt;The issue is that in a building with many floors connected by ladders, there is an &quot;archipelago&quot; of navigable regions. Each floor is isolated from the others.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/fetch_climb_ladder.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/fetch_climb_ladder.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Autonomous Exoframes can use ladders too using the same underlying systems.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Landmass provides &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy_landmass/latest/bevy_landmass/struct.AnimationLink.html&quot;&gt;animation links&lt;/a&gt; for exactly this. Basically, I define an entrance and exit at either end of the ladder connecting two islands in the archipelago and Landmass can include it when planning a route.&lt;/p&gt;
&lt;p&gt;When an Exoframe reaches the link, I add a &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy_landmass/latest/bevy_landmass/struct.UsingAnimationLink.html&quot;&gt;UsingAnimationLink&lt;/a&gt; component to take over, then feed the approach and climb inputs into the existing controller. &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy-tnua/latest/bevy_tnua/struct.TnuaObstacleRadar.html&quot;&gt;Tnua&#39;s obstacle radar&lt;/a&gt; finds an anchor point on the ladder collider, and its climb action moves the robot up or down. The actual climbing code is shared between manually controlled and automated Exoframe robots.&lt;/p&gt;
&lt;p&gt;Once an Exoframe is off a ladder, the &lt;code&gt;UsingAnimationLink&lt;/code&gt; component is removed and Landmass resumes the trip.&lt;/p&gt;
&lt;h1 id=&quot;buildings&quot;&gt;Buildings&lt;/h1&gt;
&lt;p&gt;My plan was to add as few new buildings as possible to the game. After thinking through what is essential to really highlighting Exofactory&#39;s unique systems, I narrowed it down to 2.5 buildings.&lt;/p&gt;
&lt;p&gt;With these, I think the demo will have enough evident (and emergent) complexity to be a fun game on its own.&lt;/p&gt;
&lt;h2 id=&quot;resource-bank&quot;&gt;Resource Bank&lt;/h2&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-09-06/resource_bank.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-09-06/resource_bank.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2026-09-06/resource_bank.webp&quot; alt=&quot;The resource bank. A very temporary-looking asset.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;The resource bank. A very temporary-looking asset.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;The Resource Bank is another temporary asset I created to enable a core bit of functionality in the game.&lt;/p&gt;
&lt;p&gt;In the game, sending items to the resource bank brings about a sense of security and wellbeing. In the Freudian self-actualization framework of the game, sending items to the resource bank satisfies a longing of the &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Id,_ego_and_superego#Id&quot;&gt;Id&lt;/a&gt; and frees up the resources of the &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Id,_ego_and_superego#Ego&quot;&gt;Ego&lt;/a&gt; to do things the player might appreciate.&lt;/p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-09-06/resource_bank_ui.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-09-06/resource_bank_ui.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2026-09-06/resource_bank_ui.webp&quot; alt=&quot;The resource bank interface. You can see what is being banked and what unlocks are available.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;The resource bank interface. You can see what is being banked and what unlocks are available.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Mechanically, outside of the lore / game design, the resource bank unlocks quality-of-life features based on what is being sunk. Uniquely, though, unlike other factory games, these unlocks are only retained for as long as the sink rate is met. If the production chain breaks, you can lose those quality-of-life benefits.&lt;/p&gt;
&lt;h2 id=&quot;integrator&quot;&gt;Integrator&lt;/h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/integrator.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/integrator.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;The integrator. This building lets you automate recipes with 2 inputs and 1 output.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The second building is the Integrator, a.k.a. the two-input, one-output building. In the demo, the only way to craft &lt;a rel=&quot;external&quot; href=&quot;https://wiki.exofactory.net/index.php/Galvanized_Iron&quot;&gt;Galvanized Iron&lt;/a&gt; was by hand. It requires structural iron and zinc ingots to craft.&lt;/p&gt;
&lt;p&gt;This machine, while not a filler asset created by me, is not one I am fully happy with and is subject to change.&lt;/p&gt;
&lt;p&gt;Adding this lets the player fully automate all available recipes.&lt;/p&gt;
&lt;h2 id=&quot;tier-2-belts&quot;&gt;Tier 2 Belts&lt;/h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/tier_2_belt.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-09-06/tier_2_belt.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;The green tier 2 belt on the right runs at 128 items / min. The tier 1 belt on the left runs at 64 items / min.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The final half building is a faster 128 items / min belt. For now, it&#39;s the tier 1 belt with a different color. This was added because you can&#39;t really build a proper factory of any size with only the base 64 items / min tier 1 belt.&lt;/p&gt;
&lt;h1 id=&quot;what-s-next&quot;&gt;What&#39;s Next?&lt;/h1&gt;
&lt;p&gt;While the mechanics for Demo 2 are fully in place, the game is not nearly ready. There are two areas that I intend to refine, namely the pace of the intro and the terrain.&lt;/p&gt;
&lt;p&gt;Feedback from Demo 1 and from friends and family testing showed that the intro and tutorial sections were painfully slowly paced. Cinematic and mysterious for sure, but painful. The goal here will be to rewrite those sections such that they don&#39;t feel so slow or forced. The challenge will be balancing the needs of veteran factory game players and those of first-time factory players.&lt;/p&gt;
&lt;p&gt;The second area of focus will be the terrain.&lt;/p&gt;
&lt;p&gt;The current terrain v3 &quot;engine&quot; that I built &lt;a rel=&quot;external&quot; href=&quot;https://exofactory.net/blog/2025-08-07/&quot;&gt;in 2025&lt;/a&gt; should suffice here. The issue is the terrain itself is pretty bad.&lt;/p&gt;
&lt;p&gt;Some time ago, but after the current demo map was created, Exofactory fully moved away from voxels. The current map &lt;a rel=&quot;external&quot; href=&quot;https://exofactory.net/blog/2026-05-03/&quot;&gt;was designed fully around focusing on avoiding voxel issues&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now that I don&#39;t need to worry about flatness or lining up buildings on a grid, I think designing a map that is aesthetically interesting, pleasant to explore, and full of surprises should be &lt;del&gt;easier&lt;/del&gt; possible.&lt;/p&gt;
&lt;p&gt;I suspect the majority of the work over the next several months will be focused around terrain design.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Mixed feelings about reaching this milestone. On one hand, the game dev in me is really proud to get to this point. On the other hand, the backend dev in me is sad to see the hiatus in my favorite type of work (a.k.a. fun new prototype features).&lt;/p&gt;
&lt;p&gt;Overall, though, I&#39;m really happy to be at this point. Polishing will be all about building and refining the feel of the game. The experience and feel of the game are really what it is all about in the end.&lt;/p&gt;
&lt;p&gt;Once again, if you are interested in playing Demo 2, or if you find this post interesting, I would recommend wishlisting Exofactory on Steam. It really does help.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
</description>
      </item>
      <item>
          <title>Bevy 0.19 Migration &amp; Better Buildings</title>
          <pubDate>Sun, 02 Aug 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-08-02/</link>
          <guid>https://exofactory.net/blog/2026-08-02/</guid>
          <description xml:base="https://exofactory.net/blog/2026-08-02/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;Over the last month a large amount of work was focused on &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/learn/migration-guides/0-18-to-0-19/&quot;&gt;migrating Exofactory from Bevy 0.18&lt;/a&gt; to &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/news/bevy-0-19/&quot;&gt;Bevy 0.19&lt;/a&gt;. Beyond an additional cursed &lt;em&gt;&quot;I implemented a worse version of a feature before Bevy implemented a better version x months later&quot;&lt;/em&gt; situation the port itself went swimmingly.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;HUGE&lt;/strong&gt; win of Bevy 0.19 is &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/news/bevy-0-19/#next-generation-scenes&quot;&gt;bsn!&lt;/a&gt; I did a lot of work here and cover it below.&lt;/p&gt;
&lt;p&gt;Additionally I did some work in Blender with &lt;a rel=&quot;external&quot; href=&quot;https://bevyskein.dev/&quot;&gt;Skein&lt;/a&gt; to fix a few visual bugs, also addressed below.&lt;/p&gt;
&lt;p&gt;Overall, I did wish to get more done, particularly with the Steam&#39;s October Nextfest once again quickly approaching. This being said it couldn&#39;t be avoided. More than a week was spent at &lt;a rel=&quot;external&quot; href=&quot;https://bornhack.dk/bornhack-2026/&quot;&gt;Bornhack 2026&lt;/a&gt;, an amazing hacker campout. Too many fun distractions to be seen and too much to do. This being said, I did manage to sneak in a &lt;a rel=&quot;external&quot; href=&quot;https://bornhack.dk/bornhack-2026/program/bornsong-from-0-to-a-game-in-rust-with-bevy/&quot;&gt;fun little Bevy workshop&lt;/a&gt; while I was there.&lt;/p&gt;
&lt;p&gt;As always, if you find this post interesting, or if you are interested in the game, I would recommend wishlisting it on Steam. It helps a ton.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;h1 id=&quot;proper-building-shadows&quot;&gt;Proper Building Shadows&lt;/h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-08-02/portal_shadow.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-08-02/portal_shadow.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Item entry/exit points no longer react to light and shadow.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you&#39;ve ever played a 3D factory game you may be aware of the &lt;em&gt;&quot;item coming out of a dark tunnel/portal/hole&quot;&lt;/em&gt; trope. Exofactory also uses this.&lt;/p&gt;
&lt;p&gt;The issue was that these item entry/exit points interacted with light and shadows normally. This resulted in emotional disconnect when a shadow passed over the point or when harsh bright light shined over said surface.&lt;/p&gt;
&lt;p&gt;It looked like an item was passing through a solid surface of the building. Not emotionally nice.&lt;/p&gt;
&lt;p&gt;The solution was to change the material of said surface to not interact with light. Given that I prefer to go with a data oriented approach whenever I can I opted to open up Blender, modify the building asset files, and add the appropriate Bevy Components via Skein to the freshly isolated surface.&lt;/p&gt;
&lt;p&gt;If you are working on any 3D Bevy game and use Blender I strongly recommend using Skein. It eliminates a ton of boilerplate code.&lt;/p&gt;
&lt;h1 id=&quot;bevy-0-19-migration&quot;&gt;Bevy 0.19 Migration&lt;/h1&gt;
&lt;p&gt;Ok, funny story. I seemingly have a cursed situation where I implement a feature only to find out that a better version of said feature will soon be added to the Bevy engine natively.&lt;/p&gt;
&lt;p&gt;Here this happened with Bevy&#39;s new 0.19 &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/learn/migration-guides/0-18-to-0-19/#resources-as-components&quot;&gt;resources as components&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Exofactory&#39;s multiplayer functionality is largely based on syncing of components via the excellent &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/bevy_replicon&quot;&gt;bevy_replicon&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A limitation of replicon is that it EXCLUSIVELY syncs components. Not resources. Resultingly it did not sync resources prior to Bevy 0.19.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2026-08-02/singleton2.webp&quot; alt=&quot;Component definition showing the pseudo resources.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;What I had been doing is using semi-cursed Bevy component singletons as pseudo resources. For any &quot;resources&quot; that need to be synced from the server game instance to client instances.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2026-08-02/singleton1.webp&quot; alt=&quot;Use of a singleton as a pseudo resource&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I would then access these pseudo resources in systems and would treat them as if they were resources.&lt;/p&gt;
&lt;p&gt;With Bevy 0.19 this is a bit redundant, but I thought it was funny enough to share. For now I am keeping the pseudo resources that I have, but going forward things should be simpler.&lt;/p&gt;
&lt;h2 id=&quot;bsn-boiler-plate-reduction&quot;&gt;BSN Boiler Plate Reduction&lt;/h2&gt;
&lt;p&gt;This is where I spent most of my time. Prior to Bevy 0.19 when people would ask me what it&#39;s like to work in Bevy I would say:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;Bevy is amazing, but the Bevy UI system is &lt;del&gt;miserable&lt;/del&gt; very unfun to work in.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Prior to Bevy 0.19 I would have described it as the verbosity of Rust mixed with the alignment fun of CSS. Now it&#39;s just the CSS part which frankly is acceptable once you drop the verbosity element.&lt;/p&gt;
&lt;p&gt;How much of a verbosity difference do you ask? Well for Exofactory my codebase was &lt;strong&gt;7,364 lines of code smaller&lt;/strong&gt; after switching to bsn. Just under 10% of the total code base.&lt;/p&gt;
&lt;p&gt;20,673 lines of imperative UI code swapped out for 13,309 lines of descriptive bsn. Amazing.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; diff&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; 837c64ca...01bb5769&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-stat-width=55&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Cargo.toml&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                          |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    4&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; assets/fast.assets.ron&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;              |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    5&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_base_ui/src/lib.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;       |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    4&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;         |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  463&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_base_ui/src/ui/mod.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  104&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_base_ui/src/ui/topbar.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  405&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   30&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    6&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;      |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  250&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  189&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_building_ui/src/lib.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  343&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    6&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  101&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   18&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  505&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; 1329&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +++----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;       |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   11&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;          |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  166&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  202&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   15&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;       |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  707&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;          |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    7&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                 |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  241&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   15&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  681&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;     |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    7&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   37&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   37&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;          |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   27&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   27&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                 |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   52&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  426&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  114&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    9&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;              |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  240&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;               |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  893&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  100&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; 1100&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++++++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;     |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  102&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  179&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;     |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  574&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;       |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  419&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;          |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   66&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;      |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  412&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;       |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  705&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   16&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;     |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  317&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_exoframe_ui/Cargo.toml&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;     |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  704&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;          |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  285&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;             |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; 1073&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;           |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  422&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  755&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;       |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; 1819&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++--------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;              |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; 1420&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_exoframe_ui/src/lib.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   29&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;             |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  221&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_exoframes/src/lib.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;     |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    4&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_exoframes/src/mining.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  387&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_fast_assets/src/lib.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    2&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   75&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  153&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_main_menu/Cargo.toml&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;     |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    8&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;             |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  481&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  624&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;          |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  455&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  630&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;         |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  753&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; 1345&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++++---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;          |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  369&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;           |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  242&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_main_menu/src/lib.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;     |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  139&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;             |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; 1749&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++++-----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;         |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  672&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;         |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  338&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_placement/src/input.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   13&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_placement/src/menu.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; 1021&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +++---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;             |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  771&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_placement/src/plugin.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   46&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_placement/src/states.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   52&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;               |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    2&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;             |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    2&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; crates/exo_save_runtime/src/lib.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   77&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;               |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                  |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  597&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;               |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   31&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  900&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  643&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  768&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;              |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  630&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ++--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;              |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; 1299&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +++----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;  196&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; src/core_game/mod.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   27&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; src/lib.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                          |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    2&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; src/splash_screen/mod.rs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;   83&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; +-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; 95&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; files&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; changed,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; 13309&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; insertions&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; 20673&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; deletions&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;-&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;/media/2026-08-02/full_git_diff_width.txt&quot;&gt;full_git_diff_width.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What I am &lt;em&gt;REALLY&lt;/em&gt; looking forward to is separate &lt;code&gt;.bsn&lt;/code&gt; files along with hopefully, an appropriate LSP.&lt;/p&gt;
&lt;p&gt;I imagine I could do a further 13,000 line of code &quot;reduction&quot; simply by moving all of my bsn! macros to &lt;code&gt;*.bsn&lt;/code&gt; files. Playing around with &lt;code&gt;.bsn&lt;/code&gt; files could be done recompile free. Additionally &lt;code&gt;.bsn&lt;/code&gt; files could make game modding ergonomically feasible. Whole levels, scenarios, settings, and the like could be player defined in hot loadable community written bsn files.&lt;/p&gt;
&lt;h2 id=&quot;bsn-ui-ergonomic-improvements&quot;&gt;BSN UI Ergonomic Improvements&lt;/h2&gt;
&lt;p&gt;Line of code reduction alone isn&#39;t the only benefit though. Once you have bsn you can write performant &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Retained_mode&quot;&gt;retained mode (UI retained between frames) UIs&lt;/a&gt; with the ease of &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Immediate_mode_%28computer_graphics%29&quot;&gt;immediate mode (whole UI regenerated every frame)&lt;/a&gt; toolkits like &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/bevy_egui&quot;&gt;bevy_egui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As of Bevy 0.19 I don&#39;t think it makes sense to write any immediate mode UIs unless you have a very special use case.&lt;/p&gt;
&lt;hr /&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; Bevy 0.18 &amp;quot;traditional&amp;quot; UI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; setup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;mut&lt;/span&gt;&lt;span&gt; commands&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Commands&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    commands&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;        Button&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;        Node&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Val&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;Px&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;150&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; height&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Val&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;Px&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;65&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ..&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;default&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    .&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;with_children&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span&gt;parent&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        parent&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;spawn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;Text&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Press me&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; button_system&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    query&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Query&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;Interaction&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Changed&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;Interaction&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    for&lt;/span&gt;&lt;span&gt; interaction&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; *&lt;/span&gt;&lt;span&gt;interaction&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Interaction&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;Pressed&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;            info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Above we can see that pre Bevy 0.19 UI code can be pretty boilerplate heavy and tedious. Less fun.&lt;/p&gt;
&lt;hr /&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; bevy_egui style UI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; ui_system&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;mut&lt;/span&gt;&lt;span&gt; contexts&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; EguiContexts&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Ok&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span&gt; contexts&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;ctx_mut&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; return&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;    egui&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;CentralPanel&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;default&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;show&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span&gt;ui&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        let&lt;/span&gt;&lt;span&gt; press_me&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span&gt; ui&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;add_sized&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;150&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; 65&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; egui&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;Button&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Press me&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        if&lt;/span&gt;&lt;span&gt; press_me&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;clicked&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;            info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Above we have an immediate mode UI. Much more ergonomic than traditional 0.18 style Rust but re-generated every frame.&lt;/p&gt;
&lt;hr /&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; Bevy 0.19 with bsn! macros&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; setup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;mut&lt;/span&gt;&lt;span&gt; commands&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Commands&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    commands&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;spawn_scene&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;bsn!&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;        Button&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;        Node&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; px&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;150&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; height&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; px&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;65&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;        on&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span&gt;_event&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; On&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;Pointer&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;Press&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; info!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;        Children&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Text&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Press me&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lastly we have our &lt;code&gt;bsn!&lt;/code&gt; macro. I would say this is simpler and even more intuitive than bevy_egui. You get the ease of simple UI without the need to regenerate the UI every frame.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The built in &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/examples/ecs-entity-component-system/observers/&quot;&gt;observer style&lt;/a&gt; &lt;code&gt;on(...)&lt;/code&gt; syntax makes making the UI properly interactive easy.&lt;/p&gt;
&lt;p&gt;Bevy Scene Notation is really a nice jump for Bevy devs. I see why stabilizing it has been the priority as a prerequisite for a lot of upcoming Bevy work.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;The past month was a bit less feature driven than I would have liked to have seen, but essential work has been done regardless. I think part of working with Bevy is accepting that as you work on your game new Bevy releases will happen. Personally I think that the &lt;em&gt;&quot;tax&quot;&lt;/em&gt; of migrating and modernizing your game, like certain real world taxes, is worth it. I think not migrating to the latest release of Bevy only puts Bevy games at risk of failure. That and you miss out on the latest ergonomic niceties that make Bevy ever nicer to use.&lt;/p&gt;
&lt;p&gt;And once again, if you found this enjoyable, informative, or just like the game, I would suggest giving the game a wishlist.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
</description>
      </item>
      <item>
          <title>Exoframe Autonavigation and Refactoring into a Workspace</title>
          <pubDate>Sun, 05 Jul 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-07-05/</link>
          <guid>https://exofactory.net/blog/2026-07-05/</guid>
          <description xml:base="https://exofactory.net/blog/2026-07-05/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;The past month has been full of excitement and tedium. Excitement due to a very cool, essential game feature being added. Tedium due to the massive amount of work that was needed in order to refactor Exofactory from a single crate to a workspace-based project.&lt;/p&gt;
&lt;p&gt;On top of this, I did plan to do a bit more, but with the &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/2026_European_heatwaves&quot;&gt;massive historic June heatwave&lt;/a&gt; it was difficult to muster the will to do more than the &lt;em&gt;&quot;don&#39;t starve today&quot;&lt;/em&gt; work in a hot office in which the overworked, underpaid AC was not keeping up.&lt;/p&gt;
&lt;p&gt;Regardless, the Exoframes as Agents feature, I think, counts towards the quality-over-quantity style of blog post. I&#39;m pretty proud of it.&lt;/p&gt;
&lt;p&gt;In addition to this, I cover the efforts I made in refactoring the game from a single Rust crate into a workspace. I cover the steps I took, why I took them, how I took them, and I give my thoughts on how others might go about it.&lt;/p&gt;
&lt;p&gt;As always, if you find this post interesting, I would encourage you to wishlist the game on Steam.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;h1 id=&quot;exoframes-as-agents&quot;&gt;Exoframes as Agents&lt;/h1&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-07-05/exoframe_ui.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-07-05/exoframe_ui.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2026-07-05/exoframe_ui.webp&quot; alt=&quot;The Exoframe UI. Now with custom naming ability!&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;The Exoframe UI. Now with custom naming ability!&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;In Exofactory, quality-of-life upgrades are unlocked as the player makes progress building up their infrastructure.&lt;/p&gt;
&lt;p&gt;In a &lt;a href=&quot;/blog/2026-06-03/&quot;&gt;previous post&lt;/a&gt;, I covered placing buildings in global mode. Having Exoframes act as agents is a class of quality-of-life upgrades that can be unlocked as things proceed.&lt;/p&gt;
&lt;p&gt;Basically, Exoframes can be tasked to do several things automatically, navigating the world and interacting with it without the need for &quot;conscious&quot; control.&lt;/p&gt;
&lt;p&gt;Technically, this was done with the help of two excellent Bevy ecosystem crates, namely &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/bevy_rerecast&quot;&gt;bevy_rerecast&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/bevy_landmass&quot;&gt;bevy_landmass&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bevy Rerecast builds and updates a navigation graph based on the &lt;a rel=&quot;external&quot; href=&quot;https://github.com/recastnavigation/recastnavigation&quot;&gt;recast algorithm&lt;/a&gt; and, amazingly, can &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/avian_rerecast&quot;&gt;just straight up use the existing Avian meshes.&lt;/a&gt; Mind-blowingly convenient.&lt;/p&gt;
&lt;p&gt;With the navigation graph &quot;solved,&quot; the next step was to actually use this graph to move things around.&lt;/p&gt;
&lt;p&gt;Looking again at the ecosystem, I considered two potential libraries: &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/vleue_navigator&quot;&gt;vleue_navigator&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/landmass_rerecast&quot;&gt;landmass_rerecast&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To the best of my understanding, vleue_navigator is a lower-level navigation library giving fine-grained control, while landmass_rerecast is a higher-level navigation library that abstracts the control away into a higher-level &quot;agents&quot; concept where the user of the library focuses more on goals and destinations rather than the details of navigation.&lt;/p&gt;
&lt;p&gt;Given the name and heading of this section, you may have correctly guessed I went with landmass_rerecast, because it matches the approach I wanted to take while fitting the in-game understanding of how Exoframes might be controlled. (aka subconscious subprocess agents)&lt;/p&gt;
&lt;p&gt;It worked quite smoothly, even wiring properly into &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/bevy-tnua&quot;&gt;bevy-tnua&lt;/a&gt;. It&#39;s cool because that means agent Exoframes navigate and move around using the same code path as players would.&lt;/p&gt;
&lt;p&gt;From here I wired up some simple components to mark Exoframes that should act as agents and did some testing.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-07-05/relocate_exoframe.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-07-05/relocate_exoframe.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Exoframes can be summoned or moved automatically.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Progress.&lt;/p&gt;
&lt;p&gt;From there, item fetching and requesting was implemented along with a basic UI around it.&lt;/p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-07-05/request_ui.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-07-05/request_ui.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2026-07-05/request_ui.webp&quot; alt=&quot;We can request goods in some Exoframes and have them delivered by others.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;We can request goods in some Exoframes and have them delivered by others.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Then the last bit, a new dashboard where players can configure all existing Exoframes. Hopefully this will be the last UI I ever write without &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/examples/scene/bsn/&quot;&gt;Bevy Scene Notation, aka BSN&lt;/a&gt;.&lt;/p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-07-05/fleet_ui.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-07-05/fleet_ui.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2026-07-05/fleet_ui.webp&quot; alt=&quot;We can toggle Exoframe settings globally.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;We can toggle Exoframe settings globally.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;In the end, we can now summon, request, and designate a pool of Exoframes to be switched around to or used as fetchers.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-07-05/exoframe_global.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-07-05/exoframe_global.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Exoframes can deliver resources to other Exoframes.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is all very cool for sure, but I think the main takeaway point here is that all of this work was only possible because of the excellent, highly interoperable Bevy ecosystem. Crate authors know of other crates and work to ensure there is a smooth, highly ergonomic developer experience.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-07-05/exoframe_move.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-07-05/exoframe_move.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Even if an Exoframe moves, that is handled.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;There are a ton of amazing Bevy crates out there. I recommend you explore them through either &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/assets/&quot;&gt;the official Bevy asset site&lt;/a&gt; or, secondarily, &lt;a rel=&quot;external&quot; href=&quot;https://bevydex.dev&quot;&gt;my personal BevyDex project&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&quot;codebase-refactor&quot;&gt;Codebase Refactor&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/media/2026-07-05/refactor_before.webp&quot; alt=&quot;A chart showing Exofactory build times. We see that almost all of the time goes into the Exofactory lib&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The other large chunk of work I did revolved around a major refactor of the game from a single crate to a workspace of crates. The reason why I did this was because I got to the point where even making a small change, even a single const change, would result in annoyingly long compile times, even with dev builds. You can only wait 45 seconds for a dev build while tuning walking wobble constants so many times before you decide something needs to be done. Make that 1:10 for release builds to actually confirm that those consts look good.&lt;/p&gt;
&lt;p&gt;Feels even worse seeing all of the idle cores sitting there while one is pegged at 100%. Feels like a waste.&lt;/p&gt;
&lt;p&gt;Below is a simplified description of the approach I took to address this.&lt;/p&gt;
&lt;h2 id=&quot;my-strategy&quot;&gt;My Strategy&lt;/h2&gt;
&lt;p&gt;My plan was to just pull out each of the &quot;root level&quot; Bevy plugins into its own workspace crate. I had been focusing on proper root-level plugin isolation so most of the plugins were pretty easy to move. Just a lot of import changes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2026-07-05/refactor_exofactory_1.webp&quot; alt=&quot;Refactor - Pre refactor. Circular imports.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The issue was that there were several sets of Bevy plugins that imported components and resources from each other. The above is an example of the sort of thing I would see. These exceptions that I made were the cause of much pain and suffering. There were a few potential circular dependencies that needed to be prevented. BUT I really wanted to allow as much parallel compilation as possible so I wanted to keep the workspace as flat as possible. Workspace crates should have the absolute minimum intra-workspace dependencies.&lt;/p&gt;
&lt;p&gt;Here I took a staged approach. Stage 0 was to just move all the easy, no-changes-needed root-level plugins into their own workspace crates.&lt;/p&gt;
&lt;h3 id=&quot;stage-1-isolate-shared-components&quot;&gt;Stage 1 - Isolate Shared Components&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/media/2026-07-05/refactor_exofactory_2.webp&quot; alt=&quot;Refactor - Moved Components and Messages Out&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The first step was to move the shared components/resources/message types, etc. out of the plugins into their own workspace crates, just modifying imports as needed. I did this because I wanted to incrementally split things out without needing to break the game for a long time.&lt;/p&gt;
&lt;p&gt;I added the workspace, added the &lt;code&gt;exo_*&lt;/code&gt; crates, and moved the relevant items over.&lt;/p&gt;
&lt;h3 id=&quot;stage-2-move-systems&quot;&gt;Stage 2 - Move Systems&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/media/2026-07-05/refactor_exofactory_3.webp&quot; alt=&quot;Refactor - Post refactor. Split into several crates&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here things got a little tricky. I needed to move the systems out of the main crate. The issue was that the shared components would still be needed everywhere, resulting in reduced parallel compilation.&lt;/p&gt;
&lt;p&gt;The result I went with was to keep the highly shared components in the relevant crates and to just add dependencies for them everywhere as needed. As long as I don&#39;t change these on sequential compiles I still get that parallel work. Given that these core components don&#39;t change often (or at all in some cases) this was acceptable.&lt;/p&gt;
&lt;p&gt;The plugins and systems that are more subject to change were moved into &lt;code&gt;exo_*_runtime&lt;/code&gt; crates.&lt;/p&gt;
&lt;p&gt;This resulted in a small handful of Bevy plugins that were split across runtime/non-runtime crates, which feels annoying, but it&#39;s a compromise I was ok with.&lt;/p&gt;
&lt;p&gt;Also, notably, the workspace crate dependency graph is definitely not flat. I did aim for as flat as possible, but I wanted to avoid rewriting too much. It&#39;s definitely MUCH better though.&lt;/p&gt;
&lt;h2 id=&quot;post-refactor-results&quot;&gt;Post Refactor Results&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/2026-07-05/refactor_after.webp&quot; alt=&quot;A chart showing the build times after the refactor. Much more parallel work.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The above graph is a fresh rebuild after a &lt;code&gt;cargo clean&lt;/code&gt;. Down from 1:10 to 45 seconds for a full release build from scratch. Since recording these compile times, even more has been split out of the &quot;main&quot; Exofactory crate, but I have since added features so it&#39;s less apples-to-apples.&lt;/p&gt;
&lt;p&gt;The bigger win, though, comes when doing actual work on the game. It&#39;s rare that I ever touch more than one, or at worst a few crates at a time when working. This means that I get dev builds in a few seconds and release builds in a few more seconds.&lt;/p&gt;
&lt;p&gt;A huge quality-of-life improvement. That and it lets me actually get work done on my much weaker laptop.&lt;/p&gt;
&lt;p&gt;I&#39;m not sure I went through this refactor in the most efficient way, or even in the way that produced the best possible results. If anyone sees anything dumb I did, please let me know. This all being said, I did meet my goals, these being:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast compile times&lt;/li&gt;
&lt;li&gt;Minimal logic changes&lt;/li&gt;
&lt;li&gt;Crate separation at the Bevy plugin level (mostly)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;my-advice&quot;&gt;My Advice&lt;/h2&gt;
&lt;p&gt;Keeping the caveats above in mind, if I had to give advice to my earlier self (or others) I would narrow it down to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start with one crate and do everything there. No need for preemptive optimization.&lt;/li&gt;
&lt;li&gt;Be 100%, fully, completely, no-joking-around strict about plugin isolation. No plugin should import anything from any other plugin ever.&lt;/li&gt;
&lt;li&gt;All plugin imports should be from either that plugin, or non-plugin, independent structs that are independent of other plugins.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Doing these three points would have let me work on the game at the velocity I wanted while allowing me to refactor the game into a workspace at a later date without pain.&lt;/p&gt;
&lt;p&gt;As for when to migrate from a single game crate to a workspace, I think the main thing is to not overthink it. When compiling and testing feels annoying it&#39;s time. You know it when you feel it.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Really cool to see the little Exoframes moving around in the game. For me, it was a &lt;em&gt;&quot;This is really cool&quot;&lt;/em&gt; moment. I think the interplay between all of the Bevy ecosystem crates made it much easier than it had any right to be.&lt;/p&gt;
&lt;p&gt;Really glad to be done with the refactor. I&#39;ll be coding, camping, and &lt;a rel=&quot;external&quot; href=&quot;https://bornhack.dk/bornhack-2026/program/bornsong-from-0-to-a-game-in-rust-with-bevy/&quot;&gt;running a Bevy workshop&lt;/a&gt; at &lt;a rel=&quot;external&quot; href=&quot;https://bornhack.dk/bornhack-2026/&quot;&gt;Bornhack&lt;/a&gt; so it&#39;s a good time to be able to work on the game from my laptop.&lt;/p&gt;
&lt;p&gt;If we see each other there say hi!&lt;/p&gt;
&lt;p&gt;Last off, once again, if you think you are interested in the game or just want to show your support for the game, wishlisting the game on Steam helps a ton.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
</description>
      </item>
      <item>
          <title>A Really Big One: Exoframe Feel, Finished Belts, &amp; Baseplates</title>
          <pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-06-03/</link>
          <guid>https://exofactory.net/blog/2026-06-03/</guid>
          <description xml:base="https://exofactory.net/blog/2026-06-03/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;This was an inspired month and I think it shows.&lt;/p&gt;
&lt;p&gt;A ton was added, from finishing up proper-looking spline-based belts, to a very nice building snapping implementation, to a new unique power system that I think Bevy uniquely enables, to a lot of additional &quot;feel&quot; that really enhances the emotional feel of the game. FYI, the belt section is more technical. If that isn&#39;t your thing, it might be worth skipping.&lt;/p&gt;
&lt;p&gt;Additionally, there is more detail below, but I will be giving a talk and running a workshop at &lt;a rel=&quot;external&quot; href=&quot;https://entropia.de/GPN24&quot;&gt;GPN24&lt;/a&gt;, so if you are interested take a look.&lt;/p&gt;
&lt;p&gt;So without further ado here we go.&lt;/p&gt;
&lt;p&gt;As always, if you find this post interesting, or if you are interested in the game, I would recommend wishlisting it on Steam. It helps a ton.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;h1 id=&quot;fully-finished-spline-belts&quot;&gt;Fully Finished Spline Belts&lt;/h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/belt_header.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/belt_header.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Left: straight belt, center: slight &#39;s&#39; bend, right: 90 bend with complex curve.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;After a lot of work, I can finally say I have a belt system that I am happy with. Pretty important in a factory game.&lt;/p&gt;
&lt;p&gt;The best part of it is that the belt routing system behaves predictably, preferring 90-degree turns and straight runs, while at the same time being able to handle odd angles and tight placement. The belt router will even bend its own rules to ensure players can connect to buildings under almost any circumstances.&lt;/p&gt;
&lt;p&gt;That and the belts looking nice is just icing on the cake.&lt;/p&gt;
&lt;h2 id=&quot;proper-geometry&quot;&gt;Proper Geometry&lt;/h2&gt;
&lt;p&gt;I am very happy to have excellent-looking spline-based belts based on the original tile-based belts. It took a few shots, but it turns out I could not avoid the &quot;correct&quot; approach regardless of my efforts.&lt;/p&gt;
&lt;p&gt;The first approach I took (as seen in the last blog post) was to just take a &lt;a rel=&quot;external&quot; href=&quot;https://wiki.freecad.org/Part_Slice&quot;&gt;&quot;slice&quot;&lt;/a&gt; from the original tile-based belt and build geometry on it. Easy but looked really bad.&lt;/p&gt;
&lt;p&gt;The next approach I took was an evolution on this whereby I would take multiple &quot;slices&quot; or profiles from the original at key points and loop them along the spline, constructing triangles along the spline to hook everything up. This was much better, and if you were at the RustWeek Bevy Workshop you saw these in action.&lt;/p&gt;
&lt;p&gt;The issue here was that the textures would look okay in some circumstances, but were misaligned in other circumstances, particularly on longer sections of CubicHermite spline with changes along multiple axes.&lt;/p&gt;
&lt;p&gt;The hopefully final, and likely &quot;correct&quot;, approach was just extracting the triangles, &lt;a rel=&quot;external&quot; href=&quot;https://github.com/NiklasEi/bevy_common_assets/blob/main/examples/ron.rs&quot;&gt;baking them into a custom *.belt_geometry.ron type&lt;/a&gt;, and &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/prelude/struct.Mesh.html&quot;&gt;reconstructing the mesh along the spline manually&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We have the original good mesh from Blender, and we just adjust the whole thing, normals and all, to be consistent with the spline. The only downside is that sometimes the last repeated &quot;segment&quot; of belt can look squished. But at this point I am happy.&lt;/p&gt;
&lt;p&gt;The cool thing is that since we have &lt;code&gt;*.belt_geometry.ron&lt;/code&gt;, adding additional faster/better belts will be easier. I can ask an artist to just make a 1m segment of the new proposed belt and I should be able to rebake it.&lt;/p&gt;
&lt;p&gt;I did something similar for the legs and feet of the belt, but used &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/avian3d/latest/avian3d/spatial_query/struct.RayCaster.html&quot;&gt;Avian3D raycasting&lt;/a&gt; to ensure all feet touch the ground even on uneven terrain.&lt;/p&gt;
&lt;h2 id=&quot;item-alignment&quot;&gt;Item Alignment&lt;/h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/belt_surface_match.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/belt_surface_match.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Items on the belt now follow the surface smoothly, even across compound curves.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Shorter one, but with the compound curves in the belt this just looks so elegant. (Or so I think at least.) After the belt stuff, this was easy: just keep the things on the belt tangent to the spline that defines the belt.&lt;/p&gt;
&lt;h2 id=&quot;belt-elevation&quot;&gt;Belt Elevation&lt;/h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/belt_elevation.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/belt_elevation.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;We can now change the belt elevation as we place them.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Lastly for belts, we can now adjust the belt elevation as we place them. Adding the UI was simple, but adding elevation rules was trickier than one might think. We can&#39;t just check for validity based on a downward ray cast. What if we are crossing a deep but short gap?&lt;/p&gt;
&lt;p&gt;The solution I implemented boils down to &lt;code&gt;IF all other conditions are met except for elevation_too_high, AND both ends of the belt are connected to an existing structure THEN we place the belt anyway. All legs that would be too long under the elevation_too_high rule are not generated&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The in-game justification might be that the belt is supported by the connecting structures.&lt;/p&gt;
&lt;h1 id=&quot;building-alignment-snapping&quot;&gt;Building Alignment Snapping&lt;/h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/snapping.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/snapping.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Buildings can snap not just to themselves but to any input or output of any building.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This one is a cool quality-of-life change that really makes building organized and clean-looking factories possible.&lt;/p&gt;
&lt;p&gt;Having played many 3D factory games I wanted to make it universal enough to handle things like snapping to inputs or outputs or both, or to enable snapping inputs to outputs and vice versa.&lt;/p&gt;
&lt;p&gt;I think the goal was achieved pretty well.&lt;/p&gt;
&lt;p&gt;While I did consider taking an Avian Raycasting approach, I went with an ECS approach where we query for input and output ports and just match against the potential building&#39;s input and output global x, y, and z locations + margin.&lt;/p&gt;
&lt;p&gt;This lets us do clever things like prioritize &quot;stronger&quot; lineups and the like. I&#39;m not doing anything that fancy yet, but I could foresee a world where you get your local snaps, but also snaps against 40 machines even if the nearest one is 200m away, just because 40 machines all in a line would be a meaningful signal.&lt;/p&gt;
&lt;p&gt;All in all the building snapping system is what I would want in a factory game. That being said, once people start testing it, I suspect changes will have to be made.&lt;/p&gt;
&lt;h1 id=&quot;fully-working-baseplates&quot;&gt;Fully Working Baseplates&lt;/h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/baseplate_grid.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/baseplate_grid.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Placing a grid of baseplates all at once.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;So far the game has involved placing factory machines on the ground. While on the perfectly flat ground of the small demo world this might be okay, as you scale your factory more organization becomes necessary.&lt;/p&gt;
&lt;p&gt;The game now lets players place a grid of baseplates, grow the existing grid, or shrink it, all with snapping and the like working as one might expect.&lt;/p&gt;
&lt;p&gt;What makes baseplates special in Exofactory is that they are not just &quot;something to build on&quot;. They also act as power transmission for all buildings on top without the need for wires and manual hookup.&lt;/p&gt;
&lt;p&gt;A grid of baseplates is also an independent power grid that hooks up to the &quot;traditional&quot; power grid via a number of substations that can be placed on the grid. Unlike traditional power grids, these substations can only transfer so much power to the baseplate grid. If you have only a few buildings you may get away with just one, but as more and more buildings are placed on the grid, more substations will have to be placed to keep up.&lt;/p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-06-03/power_relay_substation.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-06-03/power_relay_substation.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2026-06-03/power_relay_substation.webp&quot; alt=&quot;The temporary Power Relay and Power Substation assets.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;The temporary Power Relay and Power Substation assets.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;This brings up my &quot;clearly made by a backend dev&quot; new assets. After finishing the &lt;a rel=&quot;external&quot; href=&quot;https://www.youtube.com/watch?v=z-Xl9tGqH14&quot;&gt;classic Blender doughnut tutorial&lt;/a&gt; I set out to make temporary assets that would not actively detract or distract from the feel of the game. This is what I made. The Power Substation and the smaller Power Relay.&lt;/p&gt;
&lt;p&gt;I do intend to replace these eventually, and I would rather work with someone who knows more about Blender than I do, but due to outside circumstances resources are tight.&lt;/p&gt;
&lt;p&gt;The game must go on, so self-created assets are the way. (For now.)&lt;/p&gt;
&lt;p&gt;Under the hood this is all ECS and Bevy-idiomatic code. When we place or delete a baseplate, we add components that define a &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/examples/3d-rendering/parenting/&quot;&gt;Bevy relationship&lt;/a&gt; between that baseplate and a baseplate grid entity.&lt;/p&gt;
&lt;p&gt;This way we can easily query for the set of relevant baseplates, even when there could potentially be tens of thousands or more.&lt;/p&gt;
&lt;p&gt;Buildings placed on top of the baseplates in turn get a relationship with that baseplate grid.&lt;/p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-06-03/grid_power.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-06-03/grid_power.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2026-06-03/grid_power.webp&quot; alt=&quot;The baseplate grid power UI shows the buildings powered by that grid.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;The baseplate grid power UI shows the buildings powered by that grid.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;For power calculations, we just query the relevant relationships. Fast and idiomatic. What I really like is that the power UI for a baseplate grid shows all of the building details, but if you look in the &quot;main&quot; grid you only see the power draw of the substations.&lt;/p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-06-03/main_power.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-06-03/main_power.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2026-06-03/main_power.webp&quot; alt=&quot;The main power grid UI only sees the substations feeding the baseplate grid.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;The main power grid UI only sees the substations feeding the baseplate grid.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;I haven&#39;t added it yet, but I could imagine being able to name baseplate grids and for that name to show up in the main power grid stats. Something like &lt;code&gt;Screw Factory 1: 18.5MW/30.0MW&lt;/code&gt;, and in order to see the fine details you would need to check the UI of the substations.&lt;/p&gt;
&lt;h1 id=&quot;major-game-feel-improvements&quot;&gt;Major Game Feel Improvements&lt;/h1&gt;
&lt;p&gt;During &lt;a rel=&quot;external&quot; href=&quot;https://2026.rustweek.org/&quot;&gt;RustWeek 2026&lt;/a&gt; (strong recommendation by the way) I volunteered to help with the Bevy workshop. As part of that workshop I ended up giving an impromptu demonstration of the game.&lt;/p&gt;
&lt;p&gt;As a result, I got a ton of feedback from new and experienced Bevy devs, and new and expert game devs. Really useful, informative stuff.&lt;/p&gt;
&lt;p&gt;Mostly it broke down to the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Play around with BEING the little robot guy. The game should visually and auditorily signal this to players. You should feel a little connection to it.&lt;/li&gt;
&lt;li&gt;The global mode needs to be more visually distinctive; a little dialogue in the beginning explaining it is not enough.&lt;/li&gt;
&lt;li&gt;The transition between the two should be distinct and meaningful.&lt;/li&gt;
&lt;li&gt;Add some signals as to what the player can do, even if it&#39;s &quot;new speed record achieved&quot; when you run on top of a belt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There was much more, but these are some of the bigger things.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/global_slow_entry.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/global_slow_entry.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Entering global mode with the new transition effect.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;For the global mode I worked quite hard on several fullscreen material shaders and a few easier add-ons. Now we have a very cool loading effect when you transition. The goal is to sort of show the digital nature of the mode.&lt;/p&gt;
&lt;p&gt;I noticed something when I was playing &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Hollow_Knight%3A_Silksong&quot;&gt;Silksong&lt;/a&gt; that I implemented here. In Silksong, when you first load up the game or fight a boss for the first time in a while, you get the full boss fight start animation. When you are losing the fight and try over and over again, that intro animation is skipped.&lt;/p&gt;
&lt;p&gt;I do something similar here. If you haven&#39;t switched in a while, you get the full transition effect. If you are switching frequently you get a MUCH shorter one. Out of game, this leads to less annoyance. In game, I imagine it&#39;s that the rendering is still cached.&lt;/p&gt;
&lt;p&gt;Quite happy with it so far. But more is still to be done.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/exoframe_slow_entry.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/exoframe_slow_entry.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Entering the Exoframe with the full transition effect.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;For the Exoframe (robot mode) we already had chromatic aberration, but I also added lens flare in the shape of the Exoframe lens, some camera grit, some lens focus animation, walk waddle, an Exoframe-specific HUD, and more distinct sounds.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/exoframe_walk.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/exoframe_walk.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;We can walk around in the exoframe and the HUD shows some info. More to come for sure.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This all REALLY makes the Exoframe feel more connected. With the Silksong-style animation cooldown it&#39;s all upside and no downside.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/fast_back_and_forth.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-06-03/fast_back_and_forth.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;When we switch between the global mode and entering an exoframe rapidly the effects are shorter.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Once again thanks everyone who gave feedback.&lt;/p&gt;
&lt;h1 id=&quot;rustweek-2026-upcoming-gpn-presentation&quot;&gt;RustWeek 2026 &amp;amp; Upcoming GPN Presentation&lt;/h1&gt;
&lt;p&gt;All of the feedback above was given at RustWeek 2026, and despite some social exhaustion on my part, it was a ton of fun. I had the chance to work with the excellent &lt;a rel=&quot;external&quot; href=&quot;https://www.christopherbiscardi.com&quot;&gt;Chris Biscardi&lt;/a&gt; and hash some things out on the glTF code I want to contribute to Bevy.&lt;/p&gt;
&lt;p&gt;Hopefully we should see some fruit there soon.&lt;/p&gt;
&lt;p&gt;If anyone asks me &quot;Why did you choose Bevy? Isn&#39;t that a risk over Corpo-engine?&quot; I would respond with, &quot;Bevy is the only game engine I know of that has a culture wherein I can spot a problem, submit a patch and have it fixed upstream in under a month.&quot; It&#39;s the only engine where I, an indie dev, can submit an architectural change, have that change reviewed by the core team and submitted without a ritualistic dance.&lt;/p&gt;
&lt;p&gt;Stepping back though, I do plan on being at &lt;a rel=&quot;external&quot; href=&quot;https://entropia.de/GPN24&quot;&gt;GPN24&lt;/a&gt; from June 4th through June 7th and will give a talk on writing games in Bevy in Rust and run a workshop. Details can be found at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://cfp.gulas.ch/gpn24/talk/LEXE73/&quot;&gt;Making games in Rust with Bevy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://cfp.gulas.ch/gpn24/talk/LBZUFU/&quot;&gt;Making a Game in Bevy for Real!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are interested, I encourage you to come.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;RustWeek was a source of inspiration and drive, even as a relative introvert. Super happy with the progress I made and excited to contribute more to Bevy. Exciting month for sure.&lt;/p&gt;
&lt;p&gt;And once again, if you found this enjoyable, informative, or just like the game, I would suggest giving the game a wishlist.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
</description>
      </item>
      <item>
          <title>Technical Rework of Belts, and Global Planning Mode</title>
          <pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-05-03/</link>
          <guid>https://exofactory.net/blog/2026-05-03/</guid>
          <description xml:base="https://exofactory.net/blog/2026-05-03/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;This month a few important developments were brought together.&lt;/p&gt;
&lt;p&gt;The first of these is that &quot;purpose&quot; was, in a sense, introduced to the game. The October 2025 demo did receive some feedback around players not knowing what to do, even if they understood the game mechanically. This was valid and, to a point, expected. How does one &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Self-actualization&quot;&gt;self-actualize&lt;/a&gt; as an AI in a game, and how is that reflected mechanically? By adding the global planning mode, we address both, and there are details below.&lt;/p&gt;
&lt;p&gt;The second of these was addressing the inherent tension between the &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Voxel&quot;&gt;tile/voxel&lt;/a&gt; based approach taken between the belts, the buildings, and the world. The strongest personification of this being &lt;em&gt;&lt;strong&gt;&quot;How do we build a factory on a smooth organic hillside if belts are tiles in a voxel-based space?&quot;&lt;/strong&gt;&lt;/em&gt; After avoiding the topic for too long, the answer, I suspect, is that we can&#39;t. Below is an overview of the new (not fully done) &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Spline_(mathematics)&quot;&gt;spline-based&lt;/a&gt; system.&lt;/p&gt;
&lt;p&gt;As always, if you find this post interesting, or if you are interested in the game, I would recommend wishlisting it on Steam. It helps a ton.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;h1 id=&quot;global-planning-mode&quot;&gt;Global Planning Mode&lt;/h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-05-03/global.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-05-03/global.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Placing buildings in Global View mode and building them in the Exoframe.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In Exofactory there is the spider web tech &quot;tree&quot; that you grow into based on how you play. But there is also a quality-of-life tree that is climbed as the player ascends the AI&#39;s &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Maslow%27s_hierarchy_of_needs&quot;&gt;hierarchy of needs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Global planning mode is the first of those quality-of-life unlocks. It allows the player to place and plan factories in the unconstrained global view mode. Then, after entering an Exoframe, those plans can be quickly turned into real buildings and production chains.&lt;/p&gt;
&lt;p&gt;The exact conditions of the &quot;unlock&quot; are a cool story moment that I think is worth experiencing unspoiled. I will say that maintaining access to global planning mode requires, among other things, a consistent 64/min of structural iron be available.&lt;/p&gt;
&lt;p&gt;Excited to see people experience this.&lt;/p&gt;
&lt;h1 id=&quot;stranger-2-5d-belts-in-a-strange-3d-land&quot;&gt;Stranger 2.5D Belts in a Strange 3D Land&lt;/h1&gt;
&lt;figure style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem auto; max-width: 1280px;&quot;&gt;
  &lt;picture style=&quot;width: 100%; display: block;&quot;&gt;
    &lt;img src=&quot;/media/2025-04-19/movement.webp&quot; alt=&quot;Animated movement sample&quot; style=&quot;width: 100%; height: auto; border-radius: var(--border-radius);&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
  &lt;/picture&gt;
  &lt;figcaption style=&quot;margin-top: 0.25rem; font-style: italic; font-size: 0.9rem; color: var(--muted-color); text-align: center;&quot;&gt;Back when Exofactory was a 2D prototype.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Exofactory has always had a sort of internal tension between the free-flowing organic world and the internal voxel-based grid system that belts, buildings, and basically everything use. To a degree, I think all factory games suffer from this tension, but with Exofactory, this really was a growing problem that needed to be addressed.&lt;/p&gt;
&lt;h2 id=&quot;thought-process&quot;&gt;Thought Process&lt;/h2&gt;
&lt;p&gt;Exofactory initially started as a &lt;a href=&quot;https://exofactory.net/blog/2025-04-19/&quot;&gt;2D prototype factory game&lt;/a&gt; based around the excellent &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/bevy_ecs_tilemap&quot;&gt;bevy_ecs_tilemap&lt;/a&gt;. As time went on and the game went from 2D prototype to 3D game, a lot of the initial logic was preserved (and, at the time, effort saved) by moving to a voxel-based system.&lt;/p&gt;
&lt;p&gt;This works quite well as long as the terrain is flat, or is voxel-based itself, Minecraft-style. The problem was that I didn&#39;t want the terrain to be flat or voxel-based.&lt;/p&gt;
&lt;p&gt;When playing with even slightly not-flat terrain, things got really bad. In order to have everything fit in the voxel grid, buildings would either float in the air or sink into the ground.&lt;/p&gt;
&lt;p&gt;I did consider a few options, namely shrinking the voxel height to be smaller so the effect would be less bad, only having a horizontal grid and no voxels with additional vertical checking code, having dynamic voxel splitting/joining, or a few other frankly worse ideas.&lt;/p&gt;
&lt;p&gt;After some tests and reflection, ultimately I decided that any solution around voxels would just be a hack given the game direction.&lt;/p&gt;
&lt;p&gt;Going forward, the voxel system will be gradually removed and replaced with more 3D-native approaches, namely &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/examples/math/cubic-splines/&quot;&gt;Bevy splines&lt;/a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/avian3d/latest/avian3d/collision/collider/struct.Collider.html&quot;&gt;avian3d colliders&lt;/a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/avian3d/latest/avian3d/collision/collider/struct.Sensor.html&quot;&gt;sensors&lt;/a&gt;, and the like.&lt;/p&gt;
&lt;h2 id=&quot;spline-belt-work&quot;&gt;Spline Belt Work&lt;/h2&gt;
&lt;p&gt;The first area where I did this was with the belts, namely because without spline belts, unless the buildings are exactly 1m offset vertically, or on mathematically flawless level ground, they would be impossible to connect.&lt;/p&gt;
&lt;p&gt;I took a step-by-step piecewise approach to this.&lt;/p&gt;
&lt;h3 id=&quot;step-1-most-basic-spline-belt-possible&quot;&gt;Step 1 - Most Basic Spline Belt Possible&lt;/h3&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-05-03/mvp.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-05-03/mvp.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Simplest Spline Belt Possible&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is as simple of a spline belt as I could manage. The head of the spline is the first click, the tail is the second. As you move the focus point around, the spline tail snaps to the nearest grid point. I generated a few basic rectangles, then used &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/examples/3d-rendering/generate-custom-mesh/&quot;&gt;Bevy&#39;s Mesh Builder&lt;/a&gt; to &quot;extrude&quot; the mesh along the spline.&lt;/p&gt;
&lt;p&gt;At this point everything is just visual. Most of the work here was done around adding the boilerplate for a new building, etc.&lt;/p&gt;
&lt;h3 id=&quot;step-2-refine-belt-visuals-geometry&quot;&gt;Step 2 - Refine Belt Visuals &amp;amp; Geometry&lt;/h3&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-05-03/surface.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-05-03/surface.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;The updated belt surface and profile with a clean bend.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Next up I refined the belt extrusion profiles to match the profile of the old tile-based belts and added some special belt head/tail logic so we don&#39;t just have square ends. I wanted to use the unmodified textures from the old belt, so matching the geometry was necessary.&lt;/p&gt;
&lt;p&gt;Being better with &lt;a rel=&quot;external&quot; href=&quot;https://www.freecad.org&quot;&gt;FreeCAD&lt;/a&gt; than I am with &lt;a rel=&quot;external&quot; href=&quot;https://www.blender.org&quot;&gt;Blender&lt;/a&gt;, I actually opened the old belt glb file in FreeCAD, took a cross section, and used the FreeCAD measurement tools to get the dimensions.&lt;/p&gt;
&lt;p&gt;I modified the old shader I used with the old belts to get the belt surface working correctly and began work on the belt rail texture. I need a bit of clarification on the belt rail texture, so that is yet to be done. For now we have default gray rails.&lt;/p&gt;
&lt;p&gt;The geometry is where it gets interesting. I wanted the default Exofactory belt to be one that looks clean when you place a lot of them together. Visual satisfaction is the goal. The case I tested against is that if you have 12 belts placed on a platform above the ground, you should be able to extend them through a 90-degree turn while descending in a clean way. They should all line up next to each other in a predictable pattern with no clipping. Happy with what I have here.&lt;/p&gt;
&lt;p&gt;Technically speaking, horizontally, the belt is a cardinal X/Z route with a clamped Hermite quarter-turn and a minimum bend radius. Vertically, it is a smoothstep ramp layered on after route construction.&lt;/p&gt;
&lt;p&gt;The final meshes are produced by sweeping a 2D cross-section along the spline through the 2D profiles.&lt;/p&gt;
&lt;p&gt;At this point the belt is looking a lot better but is still just visual.&lt;/p&gt;
&lt;h3 id=&quot;step-3-making-the-belt-do-belting&quot;&gt;Step 3 - Making the Belt Do Belting&lt;/h3&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-05-03/3d.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-05-03/3d.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;A working belt carrying ore along a complex path.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Here major work was done. The good news is that I could reuse many of the components (with their corresponding logic) that were used by the old tile belt chain system.&lt;/p&gt;
&lt;p&gt;Ironically enough, this was a VAST simplification. No longer do I have to worry about placing chains of belts, splitting or merging chains, updating the motion spline of items across many chains, or keeping those motion splines in sync with the underlying (rather complicated and full of &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/examples/3d-rendering/parenting/&quot;&gt;relationships&lt;/a&gt;) chain component mappings.&lt;/p&gt;
&lt;p&gt;Now each Belt has a single authoritative spline that everything is deterministically driven from, including item motion across the belt. Between that and a few other basic spline belt components, things are much easier to maintain and debug.&lt;/p&gt;
&lt;p&gt;I did need to do some refactoring around building inputs and outputs, which had used voxel-based logic to check for valid connections. While in buildings, they still use voxel logic to determine where input and output ports are and how they should be oriented, actual connections are checked via a combination of avian sensors and component checking. Once the connection code marks a valid connection, we build a relationship that makes placing and removing things from the belts performant and ergonomically simple from a coding perspective.&lt;/p&gt;
&lt;p&gt;Belt cost went through a minor rework. Instead of costing one iron per belt tile, belts cost 1 iron per meter rounded up. Same with checking belt capacity, but rounded down.&lt;/p&gt;
&lt;p&gt;After adding a few things like maximum allowed belt build length and maximum belt grade, we have a working replacement for the old tile-based belts.&lt;/p&gt;
&lt;p&gt;Removing the old belt tile system was very satisfying, to say the least, after this.&lt;/p&gt;
&lt;h3 id=&quot;work-to-be-done&quot;&gt;Work to Be Done&lt;/h3&gt;
&lt;p&gt;The spline-based belt system is working, but it isn&#39;t fully done yet. At least I want to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use the actual texture for the belt rails. Simple in theory, but annoying to do cleanly.&lt;/li&gt;
&lt;li&gt;Add belt supports. Right now the belts just float. I suspect this won&#39;t be toooo bad. I just need to do a bit of design work.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Really happy with finally addressing the internal 2.5D/3D tension of the game. I have been stalling on fixing it for too long.&lt;/p&gt;
&lt;p&gt;Also super happy to have my first cool in-game story element fully coded out. Feels weird to not give all the details.&lt;/p&gt;
&lt;p&gt;Regardless, not a bad month. And once again, if you found this enjoyable, informative, or just like the game, I would suggest giving the game a wishlist.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
</description>
      </item>
      <item>
          <title>Building Animation, Trailer, &amp; Pitch Deck Stuff</title>
          <pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-04-06/</link>
          <guid>https://exofactory.net/blog/2026-04-06/</guid>
          <description xml:base="https://exofactory.net/blog/2026-04-06/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;The past month has been a mix of a little technical work and a lot of pitch deck work, planning, and legal compliance. I am not in a place where too much can be said yet, but work is being done here.&lt;/p&gt;
&lt;p&gt;So while I have less to show than usual, a lot of underlying work has been done. I do have two cool things to show off though. This month I added a new building animation when placing buildings, and put together a new more gameplay focused trailer.&lt;/p&gt;
&lt;p&gt;If you are interested in the game I would encourage you to consider wishlisting it on Steam.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;h1 id=&quot;new-building-animation&quot;&gt;New Building Animation&lt;/h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-04-06/fade_fab.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-04-06/fade_fab.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;The fabricator being spawned in.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I really wanted to have a &quot;building&quot; animation that reflected the digital nature of the AI you play as. I had considered a few things including pixelation, &quot;spawning from the void&quot;, and a matrix inspired approach. Ultimately, I went with something partially inspired from the &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Revelation_Space_series&quot;&gt;Revelation Space&lt;/a&gt; sci-fi series, particularly my interpretation of how the &lt;a rel=&quot;external&quot; href=&quot;https://revelationspace.fandom.com/wiki/Inhibitors&quot;&gt;&quot;Inhibitors&quot; (spoiler warning)&lt;/a&gt; might have looked. That mixed with some of the skin shader logic I have been playing around with led me to an effect that I think is quite cool, and uniquely Exofactory.&lt;/p&gt;
&lt;p&gt;Larger buildings take longer to spawn and smaller ones take less time. It ends up being a pretty elegant shader/loading system.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-04-06/fade_belt.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2026-04-06/fade_belt.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Short belt segments have no spawning animation, long do.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The effect scales really well to belts too. Pretty happy with it. The good news is that shorter belt segments do not need any loading animation, so worry not.&lt;/p&gt;
&lt;h1 id=&quot;trailer&quot;&gt;Trailer&lt;/h1&gt;
&lt;div class=&quot;youtube-embed&quot;&gt;
  &lt;iframe
    src=&quot;https://www.youtube-nocookie.com/embed/wyFvr91OSk4&quot;
    title=&quot;YouTube video player&quot;
    loading=&quot;lazy&quot;
    referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
    webkitallowfullscreen
    mozallowfullscreen
    allowfullscreen&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;As part of the pitch deck work, my partner helped me put together a new faster paced trailer that shows off gameplay and highlights the narrative elements in a more clear way. Much better I think, and definitely needed for the pitch deck.&lt;/p&gt;
&lt;h1 id=&quot;publishing-resource-management&quot;&gt;Publishing &amp;amp; Resource Management&lt;/h1&gt;
&lt;p&gt;Most of the past month was dedicated to working on what I will call &quot;pitch deck stuff&quot;. Definitely not an area of my specialty, but I think I now have something that reflects Exofactory in a fair way.&lt;/p&gt;
&lt;p&gt;Also I have started a bit of work around legal compliance. Not too exciting, but a necessity, particularly in Germany. Hopefully soon we should have a small GmbH that will become the indie studio.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Not too much to be said in terms of technical advancement beyond the cool shader, but a lot of important background work is now in motion.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Optimizations, PRs, Tooling, &amp; Funds</title>
          <pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-03-05/</link>
          <guid>https://exofactory.net/blog/2026-03-05/</guid>
          <description xml:base="https://exofactory.net/blog/2026-03-05/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;The past month has been full of a diverse set of work. From major optimizations, to a few issues found in those efforts, to new tooling, to the official start of work in looking for a partner publisher / investor a ton of programming and non-programming work has been done.&lt;/p&gt;
&lt;p&gt;If you find this interesting and find the game interesting I would encourage you to give the game a &lt;a rel=&quot;external&quot; href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot;&gt;wishlist on steam&lt;/a&gt;. It helps a ton.&lt;/p&gt;
&lt;h1 id=&quot;optimizations&quot;&gt;Optimizations&lt;/h1&gt;
&lt;p&gt;The main technical area of focus this month was around optimization. Over the past year a combination &quot;don&#39;t preemptively optimize mindset&quot; mixed with a (un?)healthy dose of me missing Bevy domain knowledge, mixed in with a few genuine bevy bugs has resulted in an extremely unoptimized game when it came to memory usage.&lt;/p&gt;
&lt;p&gt;Looking at the last pre-optimization build of the game we were looking at 7GB of system memory with just about the same amount of VRAM usage. (hint here) Given the complexity of Exofactory I knew the game would never be one of those 200MB runtime games, but this was atrocious, and frankly embarrassing. It was to the point where I could hardly run &lt;code&gt;--release&lt;/code&gt; builds on my (admittedly old) 11th Gen Intel Framework.&lt;/p&gt;
&lt;p&gt;Given this situation I set out to learn &lt;a rel=&quot;external&quot; href=&quot;https://github.com/bevyengine/bevy/blob/main/docs/profiling.md&quot;&gt;tracy and how it works in bevy&lt;/a&gt;, and to take the time to actually clean things up.&lt;/p&gt;
&lt;p&gt;Long story short I somewhat know how to use tracy even though I would describe myself as a total beginner. But I also fixed the issue, the process basically boiled down to these 4 areas:&lt;/p&gt;
&lt;h2 id=&quot;storing-everything-in-system-memory&quot;&gt;Storing Everything in System Memory&lt;/h2&gt;
&lt;p&gt;By default when you do a &lt;code&gt;asset_server.load(&quot;my_thing.png&quot;)&lt;/code&gt; the asset is loaded into system ram and when spawned it is loaded into VRAM. With a smaller image this isn&#39;t too bad, but when you load a complicated &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/examples/tools/scene-viewer/&quot;&gt;&lt;code&gt;.glb/.gltf&lt;/code&gt;&lt;/a&gt; file things can get heavy fast. If you have a GLB with 6 RGBA 4096x4096 textures in it. (i.e. norm, metallic, roughness, etc) that would use ~384MB of system memory. With &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Mipmap&quot;&gt;mipmaps&lt;/a&gt; make that ~512MB per GLB asset. This alone was responsible for the GREAT MAJORITY of the crazy amount of RAM Exofactory was using.&lt;/p&gt;
&lt;p&gt;The good news is that you don&#39;t have to store this all in system memory. In Bevy you can store things in &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy_render/latest/bevy_render/struct.MainWorld.html&quot;&gt;MainWorld&lt;/a&gt; or in &lt;a rel=&quot;external&quot; href=&quot;https://github.com/bevyengine/bevy/discussions/13494&quot;&gt;RenderWorld&lt;/a&gt; or both. MainWorld is the the game as you might think of it. Just everything all in system memory. RenderWorld on the other hand is a sort of tag that marks things such as to only live on the GPU.&lt;/p&gt;
&lt;p&gt;I could reduce system memory usage by simply not storing textures outside of the GPU when I don&#39;t intend to do anything with them.&lt;/p&gt;
&lt;p&gt;Bevy has several ways to do this, but the simplest for me was to use &lt;code&gt;.meta&lt;/code&gt; files.&lt;/p&gt;
&lt;p&gt;In Bevy, &lt;code&gt;.meta&lt;/code&gt; files sit alongside your assets and let you override how the asset loader handles them. They use &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/asset/meta/struct.AssetMeta.html&quot;&gt;Bevy&#39;s RON-like format&lt;/a&gt; and are named after the asset file they configure. So for &lt;code&gt;fabricator_01_icon.ktx2&lt;/code&gt; you would have a &lt;code&gt;fabricator_01_icon.ktx2.meta&lt;/code&gt; file right next to it.&lt;/p&gt;
&lt;p&gt;For a simple image asset the meta file looks like this:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;ron&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    meta_format_version&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    asset&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        loader&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;bevy_image::image_loader::ImageLoader&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        settings&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            format&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; FromExtension&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            is_srgb&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            sampler&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Default&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            asset_usage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; RenderAssetUsages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;RENDER_WORLD&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        )&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The key line is &lt;code&gt;asset_usage: RenderAssetUsages(&quot;RENDER_WORLD&quot;)&lt;/code&gt;. This tells Bevy to only keep the texture on the GPU, freeing up the system memory copy entirely.&lt;/p&gt;
&lt;p&gt;For GLB files we can get more granular. Here is an example from one of the belt building models:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;ron&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    meta_format_version&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    asset&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        loader&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;bevy_gltf::loader::GltfLoader&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        settings&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            load_meshes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; RenderAssetUsages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;MAIN_WORLD | RENDER_WORLD&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            load_materials&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; RenderAssetUsages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;RENDER_WORLD&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            load_cameras&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            load_lights&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            load_animations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            include_source&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            default_sampler&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; None&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            override_sampler&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            convert_coordinates&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; None&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        )&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice that &lt;code&gt;load_meshes&lt;/code&gt; keeps both &lt;code&gt;MAIN_WORLD | RENDER_WORLD&lt;/code&gt;. This is because I need mesh data in system memory for things like &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/avian3d/latest/avian3d/collision/index.html&quot;&gt;collision detection&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/avian3d/latest/avian3d/spatial_query/struct.SpatialQuery.html&quot;&gt;raycasting&lt;/a&gt;. But &lt;code&gt;load_materials&lt;/code&gt; (which includes the textures) is set to only &lt;code&gt;RENDER_WORLD&lt;/code&gt;. This gives us the best of both worlds. Meshes stay accessible in system memory where we need them, while the textures that make up the bulk of the memory usage only live on the GPU.&lt;/p&gt;
&lt;p&gt;The nice thing about meta files is that they don&#39;t require any code changes. You just drop them next to your assets and the loader picks them up automatically. One small &lt;a rel=&quot;external&quot; href=&quot;https://fishshell.com/&quot;&gt;fish&lt;/a&gt; script later and I was done.&lt;/p&gt;
&lt;h2 id=&quot;using-non-gpu-native-bitmap-formats&quot;&gt;Using non GPU native bitmap formats&lt;/h2&gt;
&lt;p&gt;The meta file changes above helped with system memory, but VRAM was still a problem. Exofactory was using PNG for standalone textures and embedded PNGs inside GLB files which was the root cause of the high VRAM usage.&lt;/p&gt;
&lt;p&gt;Moving to &lt;a rel=&quot;external&quot; href=&quot;https://www.khronos.org/ktx/&quot;&gt;KTX2&lt;/a&gt; for textures was the solution. It&#39;s a container format from Khronos that can hold &lt;a rel=&quot;external&quot; href=&quot;https://github.com/BinomialLLC/basis_universal/wiki/KTX2-File-Format-Support-Technical-Details&quot;&gt;many GPU native compressed formats&lt;/a&gt;.
Of the formats available I considered UASTC and ETC1S because of native Bevy support. They have different tradeoffs:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;UASTC&lt;/th&gt;&lt;th&gt;ETC1S&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Quality&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Near lossless&lt;/td&gt;&lt;td&gt;Lossy, lower quality&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;VRAM Usage&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;~1 byte/pixel&lt;/td&gt;&lt;td&gt;~0.5 bytes/pixel&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Disk Size&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Larger (with Zstd)&lt;/td&gt;&lt;td&gt;Much smaller&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Transcode Speed&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Fast&lt;/td&gt;&lt;td&gt;Very fast&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Normal maps, UI elements, detailed textures&lt;/td&gt;&lt;td&gt;Textures where quality is less critical&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For Exofactory I went with UASTC across the board mostly out of laziness. I should really be using ETC1S for textures where a lower quality would not be noticeable and the VRAM savings would be nice. That&#39;s a TODO for later.&lt;/p&gt;
&lt;h2 id=&quot;finding-a-bug-in-bevy-around-ktx2&quot;&gt;Finding a bug in Bevy around KTX2&lt;/h2&gt;
&lt;p&gt;In moving to KTX2 files one of the bugs I noticed is that Bevy was not honoring the &lt;code&gt;.meta&lt;/code&gt; files for ktx2 files. &lt;a rel=&quot;external&quot; href=&quot;https://github.com/bevyengine/bevy/pull/22992&quot;&gt;One small PR later&lt;/a&gt; and it was fixed. This fix will be included in Bevy 0.18.1&lt;/p&gt;
&lt;h2 id=&quot;using-ktx2-properly-in-glb-files&quot;&gt;Using KTX2 properly in GLB files&lt;/h2&gt;
&lt;p&gt;A larger more serious problem I found is that Bevy does not properly support KTX2 textures in GLTF/GLB files. While you can just hack the ktx texture into the file and it will work in Bevy the problem is that the resulting file is not a compliant GLTF/GLB file.&lt;/p&gt;
&lt;p&gt;The root cause of this problem is that Bevy is using &lt;a rel=&quot;external&quot; href=&quot;https://github.com/gltf-rs/gltf&quot;&gt;gltf-rs&lt;/a&gt; as part of its GLB/GLTF pipeline. While the library is robust when it comes strictly to the official GLTF 2.0 spec. It is deeply deficient in those &lt;a rel=&quot;external&quot; href=&quot;https://github.com/KhronosGroup/glTF/blob/main/extensions/README.md&quot;&gt;defacto mandatory extensions including ktx2&lt;/a&gt; I have &lt;a rel=&quot;external&quot; href=&quot;https://github.com/gltf-rs/gltf/pull/467&quot;&gt;submitted a PR&lt;/a&gt; but the last code change was in November 2025 and I am not hopeful.&lt;/p&gt;
&lt;p&gt;For now Exofactory is using my fork of the library, but a longer term solution needs to be found.&lt;/p&gt;
&lt;p&gt;I am currently working on a document with a few ideas to be pitched to the Bevy core team based on a their request.&lt;/p&gt;
&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;
&lt;p&gt;After implementing improvements in the above 4 areas the game is massively more optimized. The game went from 7GB of system ram to under 1GB. From 7GB of VRAM to under 2GB. My old laptop now gets 60fps on low which makes mobile development possible again. It was a big push but totally worth it.&lt;/p&gt;
&lt;h1 id=&quot;tooling&quot;&gt;Tooling&lt;/h1&gt;
&lt;p&gt;As a small side project I worked on &lt;a rel=&quot;external&quot; href=&quot;https://bevydex.dev/&quot;&gt;BevyDex.dev&lt;/a&gt; this month. It&#39;s basically a thin wrapper around the &lt;a rel=&quot;external&quot; href=&quot;https://crates.io&quot;&gt;crates.io&lt;/a&gt; api and a postgres database.&lt;/p&gt;
&lt;p&gt;But it&#39;s always up to date, shows important details and is lightning fast(tm).&lt;/p&gt;
&lt;p&gt;It&#39;s a side project unrelated to Exofactory. But it was made so I could sort through the ecosystem and I hope others find it useful too.&lt;/p&gt;
&lt;h1 id=&quot;funds&quot;&gt;Funds&lt;/h1&gt;
&lt;p&gt;Last but not least, Exofactory will soon officially be reaching out to several publishers. With recent personal events, while I can code, I can not finance the whole game on my own. Hopefully some interesting news comes out of that area soon. If you have any advice here I would be glad to hear it.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;I like programming more than I like working on pitch decks. I prefer fixing bugs upstream when I can. And I am happy to put out things I think may be useful.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Multiplayer, Bevy 0.18, and Fosdem</title>
          <pubDate>Wed, 04 Feb 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-02-04/</link>
          <guid>https://exofactory.net/blog/2026-02-04/</guid>
          <description xml:base="https://exofactory.net/blog/2026-02-04/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;This month was basically solely focused on adding multiplayer functionality with a small break for a bevy 0.18 migration.&lt;/p&gt;
&lt;p&gt;If you find this interesting and find the game interesting I would encourage you to give the game a &lt;a rel=&quot;external&quot; href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot;&gt;wishlist on steam&lt;/a&gt;. It helps a ton.&lt;/p&gt;
&lt;p&gt;I will say that I regret not starting the multiplayer code earlier. Like internationalization, and saving, multiplayer is something that should be architected for from the beginning. The good news is that the code was clean enough that it wasn&#39;t &lt;em&gt;too&lt;/em&gt; hard to refactor.&lt;/p&gt;
&lt;p&gt;In other news &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/learn/migration-guides/0-17-to-0-18/&quot;&gt;migrating from 0.17 to 0.18&lt;/a&gt; was pretty painless. I had to drop a few more less maintained crates, but the core migration itself was simple.&lt;/p&gt;
&lt;p&gt;Lastly, I took the time to head out to Fosdem to hang out with the Bevy community. While I didn&#39;t give a talk &lt;a rel=&quot;external&quot; href=&quot;https://mastodon.gamedev.place/@Vrixyz&quot;&gt;Thierry Berger&lt;/a&gt; gave an &lt;a rel=&quot;external&quot; href=&quot;https://fosdem.org/2026/schedule/event/NKVSUJ-bevy_engine_bof_-_demo_and_chat/&quot;&gt;excellent one on mobile bevy game development&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&quot;multiplayer&quot;&gt;Multiplayer&lt;/h1&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-02-04/join_menu.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2026-02-04/join_menu.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2026-02-04/join_menu.webp&quot; alt=&quot;The game supports simultaneous Direct Connect, LAN, and Steam multiplayer hosting and joining.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;The game supports simultaneous Direct Connect, LAN, and Steam multiplayer hosting and joining.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;For people writing games in Bevy I had been giving the advice to consider your internationalization, gamepad, and save stories early. I now regret that I missed likely the most important factor to consider early this being multiplayer and netcode.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So with that my updated list of things to consider early are your:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Multiplayer / Netcode Story&lt;/li&gt;
&lt;li&gt;Gamepad Story&lt;/li&gt;
&lt;li&gt;Save Story&lt;/li&gt;
&lt;li&gt;Internationalization Story&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Adding these later will be annoying and painful. (Ask me how I know! /s)&lt;/p&gt;
&lt;h2 id=&quot;exofactory-specifics&quot;&gt;Exofactory Specifics&lt;/h2&gt;
&lt;p&gt;Exofactory is a Factory game where the player plays as an AI who interacts with the world via little robots called &quot;Exoframes&quot; that must be built by the player. While not occupying an Exoframe the player can zip around their factories in the global camera mode.&lt;/p&gt;
&lt;p&gt;This leads to a sort of natural co-optative approach where players can join the game in the global mode where they can look around, and can configure existing machines. Once there is an Exoframe that is not being occupied the new player can &quot;inhabit&quot; it building and exploring the world beyond the factory sensor range.&lt;/p&gt;
&lt;p&gt;This leads to a nice sort of multiplayer metaplot while at the same time providing a clear technical story about what must be done in the netcode these being:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Interact with the world in Global mode including building interaction.&lt;/li&gt;
&lt;li&gt;Selecting and controlling one of a Pool of Exoframes.&lt;/li&gt;
&lt;li&gt;Running the rest of the world to update the relevant components.&lt;/li&gt;
&lt;li&gt;Ensuring the client sees the world in an accurate way.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Personally, I think this naturally leads to a server authoritative model. The server instance of the game runs the world, and the client instances just participate in it.&lt;/p&gt;
&lt;h2 id=&quot;picking-a-library&quot;&gt;Picking a Library&lt;/h2&gt;
&lt;p&gt;At the time on Bevy 0.18 there seem to be two well supported crates these being &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/bevy_replicon&quot;&gt;bevy_replicon&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/lightyear&quot;&gt;lightyear&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I encourage you to take a look at both as both have their unique advantages. In my (potentially flawed) understanding, lightyear adds more features like &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Client-side_prediction&quot;&gt;client side prediction&lt;/a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https://github.com/cBournhonesque/lightyear/tree/main/examples/deterministic_replication&quot;&gt;deterministic replication&lt;/a&gt; and interest management (only syncing relevant data), at the expense of initial overhead and complexity, while replicon omits these features by default, but is simpler to setup with less dev time overhead. If my understanding is wrong here I would be happy to correct this if anyone reaches out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; Someone did reach out! Turns out bevy_replicon &lt;em&gt;does&lt;/em&gt; support deterministic replication and interest management. The features it lacks compared to lightyear are client-&amp;gt;server replication, lag compensation, client-side prediction, and interpolation. Also lightyear is planning to re-use replicon for replication.&lt;/p&gt;
&lt;p&gt;For Exofactory, given that the game is definitively &lt;em&gt;NOT&lt;/em&gt; a twitchy shooter, and my planned pace of feature development, and my relative newness to game dev net code I decided to go with the simpler to set up replicon.&lt;/p&gt;
&lt;p&gt;This all being said, I suspect that if your game architecture is already well structured switching later would not be a painful process.&lt;/p&gt;
&lt;h2 id=&quot;from-single-player-to-multi&quot;&gt;From Single Player to Multi&lt;/h2&gt;
&lt;p&gt;At the heart of it replicon does two things. Replicate components, and handle network events/messages to/from clients.&lt;/p&gt;
&lt;p&gt;In order to enable multiplayer I had to refactor several systems and logically group them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2026-02-04/multiplayer_architecture.webp&quot; alt=&quot;Exofactory Multiplayer Architecture&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;authoritative-core-systems&quot;&gt;Authoritative Core Systems&lt;/h3&gt;
&lt;p&gt;These only run on the server instance and update the world (all the components that store game state) for everything not directly manipulated by the player.&lt;/p&gt;
&lt;p&gt;This includes things like the machine cycle that turns iron ore into iron ingots, what sounds should be played, and even the rate of mining that any exoframe is doing while the player watches. There are many many more systems but these are the type that run in the group.&lt;/p&gt;
&lt;p&gt;These systems are allowed to write to components directly. &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy_replicon/latest/bevy_replicon/#replication&quot;&gt;Replicon automatically replicates these changes to the client instance of the components.&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;player-ui-systems&quot;&gt;Player UI Systems&lt;/h3&gt;
&lt;p&gt;These run only on game instances where a player plays. These play the sound, show the building UIs, and let the player know the state of the world. These systems read the state of the world by reading the local components that are kept in sync automatically.&lt;/p&gt;
&lt;p&gt;The part that required major refactor work is that in these systems no direct manipulation of components is allowed. The clients must send &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy_replicon/latest/bevy_replicon/#network-messages-and-events&quot;&gt;an event/message to the server&lt;/a&gt; which then manipulates the components on behalf of the client and updates the components which are replicated to the client.&lt;/p&gt;
&lt;h3 id=&quot;network-messages-events&quot;&gt;Network Messages &amp;amp; Events&lt;/h3&gt;
&lt;p&gt;In the above diagram I only included one example, but in reality basically everything you do in the game beyond &lt;em&gt;&quot;looking at stuff&quot;&lt;/em&gt; happens via event or message. This includes the player on the server instance of the game.&lt;/p&gt;
&lt;p&gt;This I would say is the MOST important factor to consider when working on a bevy game that might eventually support multiplayer. If I had done this from the beginning adding the multiplayer functionality would have been easy. Even if you don&#39;t want to think about networking at the beginning, just ensuring all player manipulations of the world go through the native &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/ecs/event/trait.Event.html&quot;&gt;bevy event systems&lt;/a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/prelude/struct.Messages.html&quot;&gt;message systems&lt;/a&gt; will save you time later.&lt;/p&gt;
&lt;h2 id=&quot;ramifications-outcomes&quot;&gt;Ramifications &amp;amp; Outcomes&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/2026-02-04/multiplayer_architecture_headless.webp&quot; alt=&quot;Exofactory Multiplayer Architecture Headless&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There were two sorts of artifacts that came out of this. The first one, was something that I was planning on working on later, but due to said refactoring became much easier. That being a headless server instance that the player can self host in docker/podman etc. This would allow the factory to continuously run without anyone needing to keep the game running on their PC.&lt;/p&gt;
&lt;p&gt;With the refactoring and a new feature based build of the game that uses &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/struct.MinimalPlugins.html&quot;&gt;MinimalPlugins&lt;/a&gt; instead of &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/struct.DefaultPlugins.html&quot;&gt;DefaultPlugins&lt;/a&gt; we get a clean lean headless server instance of the game that can run basically anywhere including most RISC-V SBCs!&lt;/p&gt;
&lt;p&gt;This still needs testing but things are looking good. Above is a similar diagram but for the headless version of the game.&lt;/p&gt;
&lt;p&gt;The second interesting outcome is that I am using way fewer &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/learn/quick-start/getting-started/resources/&quot;&gt;Bevy resources&lt;/a&gt; namely because Replicon does not replicate resources. Resultingly I am using way more &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Singleton_pattern&quot;&gt;pseudo-singletons&lt;/a&gt; (aka an &quot;empty&quot; entity that just has the component that holds the data the resource used to.)&lt;/p&gt;
&lt;p&gt;I am not a huge fan of object oriented design patterns, so it&#39;s a bit funny and feels a bit dirty.&lt;/p&gt;
&lt;h1 id=&quot;bevy-0-18-migration&quot;&gt;Bevy 0.18 Migration&lt;/h1&gt;
&lt;p&gt;I have seen the light! For real though any Bevy game that has light should prioritize migrating. Major work has been done and the game looks notably better. This being said, even if your game does not use light you should still prioritize migrating.&lt;/p&gt;
&lt;p&gt;Overall beyond a few shader bind group things (i.e. BindGroupLayout -&amp;gt; &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/render/render_resource/struct.BindGroupLayoutDescriptor.html&quot;&gt;BindGroupLayoutDescriptor&lt;/a&gt;) and &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/examples/3d-rendering/atmosphere/&quot;&gt;Atmosphere&lt;/a&gt; changes it was a simple migration.&lt;/p&gt;
&lt;p&gt;Glad to see the release schedule back on track.&lt;/p&gt;
&lt;p&gt;I will say though, with each upgrade I see more and more plugins falling by the wayside. This makes me appreciate the maintainers of plugins even more. Keeping up with Bevy&#39;s release schedule is a major task compared to any other game engine.&lt;/p&gt;
&lt;h1 id=&quot;fosdem&quot;&gt;Fosdem!&lt;/h1&gt;
&lt;p&gt;Speaking of, I had the privilege to attend &lt;a rel=&quot;external&quot; href=&quot;https://fosdem.org/&quot;&gt;Fosdem&lt;/a&gt; a libre get together that is hosted in Brussels every year.&lt;/p&gt;
&lt;p&gt;If you are interested in open source game engines, or in reality open source anything at all I would highly recommend going. There are a ton of fun and interesting talks, but the best part (in my book anyways) is being able to meet and see and hang out with the people whom you normally only talk to online. I know the Bevy dinner with &lt;a rel=&quot;external&quot; href=&quot;https://mastodon.gamedev.place/@Vrixyz&quot;&gt;Thierry Berger&lt;/a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https://friz64.de/&quot;&gt;Gee&lt;/a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https://mastodon.online/@nikl_me&quot;&gt;Niklas Eicker&lt;/a&gt;,  &lt;a rel=&quot;external&quot; href=&quot;https://github.com/Firestar99/&quot;&gt;Firestar99&lt;/a&gt; and several other charming individuals was very fun.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;I thought I could get multiplayer done in a week, but it took a month as somehow expected. I am a better game dev for the experience. You can&#39;t just depend on back end patterns for everything.&lt;/p&gt;
&lt;p&gt;Bevy 0.18 was simple to migrate to.&lt;/p&gt;
&lt;p&gt;I strongly recommend going to Fosdem if you have the chance.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Real Time Settings, Save Overhaul, &amp; a Wiki</title>
          <pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-12-30/</link>
          <guid>https://exofactory.net/blog/2025-12-30/</guid>
          <description xml:base="https://exofactory.net/blog/2025-12-30/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;Happy holidays! This month a good amount got done bringing yet more quality of life changes to the game. Namely an overhaul of the saving system, logging, crash reporting, and live settings! Those along with a new but empty wiki.&lt;/p&gt;
&lt;p&gt;I am quite proud of the live settings stuff. Like it&#39;s not anything I&#39;ve seen elsewhere. If you find this interesting and find the game interesting I would encourage you to give the game a &lt;a rel=&quot;external&quot; href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot;&gt;wishlist on steam&lt;/a&gt;. It helps a ton.&lt;/p&gt;
&lt;p&gt;Also, I recently took the public demo down from Steam. At this point it &lt;em&gt;REALLY&lt;/em&gt; does not reflect the quality and polish of the current state of the game. I eventually plan on putting up a &quot;Demo 2&quot; build on steam the reflects the work that will happen in the next upcoming months.&lt;/p&gt;
&lt;p&gt;So without further ado here are the latest areas of work.&lt;/p&gt;
&lt;h2 id=&quot;save-overhaul&quot;&gt;Save Overhaul&lt;/h2&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-12-30/save_screen.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-12-30/save_screen.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2025-12-30/save_screen.webp&quot; alt=&quot;We can now continue the last game or load a specific save file.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;We can now continue the last game or load a specific save file.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;The most demotivating thing that can happen in a factory game is that you get a ton of work done, then lose the progress. I had a few players experience this and I wanted to come up with a solid approach that works. I ended up keeping things simple and used a looping timer to automatically save the game every 5 minutes with a looping set of 5 saves each new save overwriting the last. This was pretty trivial to do with just a &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/time/struct.Timer.html&quot;&gt;Bevy timer&lt;/a&gt; and a a baby state machine.&lt;/p&gt;
&lt;p&gt;This auto saves the game while allowing for manual saves when needed.&lt;/p&gt;
&lt;p&gt;Additionally the player can continue the most recent save OR manually pick an existing save. For now the load screen is just a minimal Bevy UI window. Lot safer to play for not too much effort in coding.&lt;/p&gt;
&lt;p&gt;Right now the default is 5 saves each 5 min apart, but if you edit the &lt;code&gt;config.toml&lt;/code&gt; file you can change that.&lt;/p&gt;
&lt;h2 id=&quot;crash-reporting-logging-rework&quot;&gt;Crash Reporting &amp;amp; Logging Rework&lt;/h2&gt;
&lt;p&gt;The top feature I wanted as a developer was proper logging and crash reporting in production builds. While I have been trying my best to keep things clean, an area where I  had neglected things was logging. I was using a mixture of &lt;code&gt;print!&lt;/code&gt; &lt;code&gt;println!&lt;/code&gt; &lt;code&gt;eprint!&lt;/code&gt; &lt;code&gt;eprintln!&lt;/code&gt; &lt;code&gt;info!&lt;/code&gt; &lt;code&gt;warn!&lt;/code&gt; &lt;code&gt;error!&lt;/code&gt; all over the place. Debug prints became permanent output.&lt;/p&gt;
&lt;p&gt;On the windows build you couldn&#39;t see half of it even if you launched the game from powershell. I took a three step approach to fixing this.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Drop all the stdout/err stuff except for &lt;code&gt;info!&lt;/code&gt; &lt;code&gt;warn!&lt;/code&gt; &lt;code&gt;error!&lt;/code&gt; and &lt;code&gt;panic!&lt;/code&gt;. Migrating one plugin at a time.&lt;/li&gt;
&lt;li&gt;Added a non-blocking tracing capture system that appends the output to a log file.&lt;/li&gt;
&lt;li&gt;Wrote logic around the log file. If there was no clean exit the user is given the option to automatically upload the logs as part of a crash report.&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-12-30/crash_report.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-12-30/crash_report.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2025-12-30/crash_report.webp&quot; alt=&quot;After detecting a crash we can upload logs.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;After detecting a crash we can upload logs.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;The player now has logs the can check if they are so inclined, and the player can automatically upload those logs as part a crash report. I am sure legacy game engines have this sort of thing built in, but I am just happy to have it now. No more &lt;em&gt;&quot;what were you doing just before the game crashed?&quot;&lt;/em&gt; discussions.&lt;/p&gt;
&lt;p&gt;Lastly added a &lt;a rel=&quot;external&quot; href=&quot;https://crates.io/crates/bevy-panic-handler&quot;&gt;small library that shows panics in the GUI&lt;/a&gt;. Worst, worst case a player could copy paste the output.&lt;/p&gt;
&lt;h2 id=&quot;settings-overhaul&quot;&gt;Settings Overhaul&lt;/h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-30/graphics_settings.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-30/graphics_settings.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;You can change graphics settings in real time.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is the stuff I am super happy with. Before the most recent (internal) build you could not access the settings in the game, and changing and settings required a game restart. Not good.&lt;/p&gt;
&lt;p&gt;I blame my backend programming history for that one. After hearing from players that the state of settings was not really acceptable I set off on overhauling it.&lt;/p&gt;
&lt;p&gt;I took an ECS/Bevy centric approach and think it went well.&lt;/p&gt;
&lt;p&gt;The way that settings work now is that settings are serialized/deserialized to/from the &lt;code&gt;config.toml&lt;/code&gt; file and is represented in game as a series of Resource structs.&lt;/p&gt;
&lt;p&gt;I added a few systems that run when those structs are created or change and update the components that reflect the setting that was changed.&lt;/p&gt;
&lt;p&gt;For example let&#39;s consider changing &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/pbr/struct.ScreenSpaceAmbientOcclusion.html&quot;&gt;ScreenSpaceAmbientOcclusion&lt;/a&gt; settings in the game.&lt;/p&gt;
&lt;p&gt;In a ECS world this is easy. We find the global camera entity by getting entities with the Exofactory &lt;code&gt;GlobalCamera&lt;/code&gt; component. Since the camera is just a bundle of components we can grab the  ScreenSpaceAmbientOcclusion component as well and modify it in real time keeping it in sync with the graphics setting resource.&lt;/p&gt;
&lt;p&gt;The same can be applied to any setting.&lt;/p&gt;
&lt;p&gt;All settings are just properties in a &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/learn/quick-start/getting-started/resources/&quot;&gt;resource&lt;/a&gt; struct that are mirrored onto specific components.&lt;/p&gt;
&lt;p&gt;The result is that the player can edit any setting at and time in real time including language, graphics, window size/mode, along with everything else.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-30/control_language.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-30/control_language.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Language and everything else too.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Pretty cool in my book.&lt;/p&gt;
&lt;h2 id=&quot;wiki&quot;&gt;Wiki&lt;/h2&gt;
&lt;p&gt;The idea behind the wiki is to provide a &lt;a rel=&quot;external&quot; href=&quot;https://wiki.exofactory.net/&quot;&gt;community oriented wiki&lt;/a&gt; that is performant, available, and not exploitive. Unless anyone has a better approach, I aim to have the wiki licensed under &lt;a rel=&quot;external&quot; href=&quot;https://creativecommons.org/licenses/by-nc-sa/4.0/&quot;&gt;Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While I agree that it is a bit early to set up the wiki I wanted to do so because of:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A genuine need for documentation around the &lt;a rel=&quot;external&quot; href=&quot;https://wiki.exofactory.net/index.php/Technical_Reference/config.toml&quot;&gt;config.toml&lt;/a&gt; file.&lt;/li&gt;
&lt;li&gt;A desire to short circuit any wikis being built on less community oriented platforms.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There isn&#39;t too much to be said except that as the game gets closer to launch the wiki will become even more useful.&lt;/p&gt;
&lt;p&gt;For now account creation is closed, but will be open later as things become more playable. This all being said if anyone is a mediawiki theme specialist do reach out. The default theme is ok, but not exactly ideal.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;ECS once again shows how cool it is. Going from reboot for every setting change to all changes being applied live was shockingly easier than I expected.&lt;/p&gt;
&lt;p&gt;That and the save system &lt;strong&gt;WITH&lt;/strong&gt; crash reporting is a really nice to have.&lt;/p&gt;
&lt;p&gt;Quite happy and I am excited to get working properly on the much better demo 2.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Draggable Belts, Electricity, &amp; View Modes</title>
          <pubDate>Thu, 04 Dec 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-12-04/</link>
          <guid>https://exofactory.net/blog/2025-12-04/</guid>
          <description xml:base="https://exofactory.net/blog/2025-12-04/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;This month focused on a few new areas these being major game mechanics, visuals, and major quality of life belt placement changes.&lt;/p&gt;
&lt;p&gt;We are getting closer to implementing all of the October Nextfest feedback that can be fixed via pure programming and I think the game shows that.&lt;/p&gt;
&lt;p&gt;I am super happy to add electricity. It&#39;s a core feature and while adding it wasn&#39;t too hard the visualizations was harder. But I think the shader based approach looks really cool. Super happy with the productivity/efficiency view mode shader below.&lt;/p&gt;
&lt;p&gt;I will get a bit deeper in the relevant sections.&lt;/p&gt;
&lt;h1 id=&quot;draggable-belts&quot;&gt;Draggable Belts&lt;/h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-04/belt_bend.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-04/belt_bend.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Dragging belts to connect buildings is now easy.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A good amount of time was spent on adding draggable belts. While Factorio belt-by-belt placement works, in playing the game I realized it gets old fast. The feedback I got was universally in agreement.&lt;/p&gt;
&lt;p&gt;The interesting thing is that Exofactory uses a &quot;tile&quot; based belt approach so the spline based approach of other factory games wasn&#39;t really possible. After &lt;del&gt;playing a bunch of other factory games&lt;/del&gt; doing a bunch of research I found that I could use an approach similar to &lt;a rel=&quot;external&quot; href=&quot;https://shapez2.com/&quot;&gt;Shapez2&lt;/a&gt; adapted for 3d and the peculiarities of Exofactory.&lt;/p&gt;
&lt;p&gt;Long story short you place the first belt segment and can drag out a straight or &quot;L&quot; shaped segment of belts of any length that you have the resources for. The only real technical limitation is that you can only have 1 bend per dragged out segment. Adding any more just adds ambiguity and unpredictable results.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-04/belt_connect.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-04/belt_connect.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Longer belt connections take way less work now.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This makes the game way less tedious to play and I am super glad to have it coded out.&lt;/p&gt;
&lt;h1 id=&quot;electricity&quot;&gt;Electricity&lt;/h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-04/power_new_building.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-04/power_new_building.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Building automatically connect to the nearest power source in range.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I also added power recently to the game. All buildings now consume electricity and don&#39;t function without it. Building in the range of a power source or extender will automatically connect and start consuming power.&lt;/p&gt;
&lt;p&gt;Right now the Core generates enough power to build a little factory. Once I add fuels and piping properly it will be possible to really get the power cranked up.&lt;/p&gt;
&lt;p&gt;From a coding perspective this was quite an easy feature to add. Just add some &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/learn/quick-start/getting-started/ecs/&quot;&gt;ECS&lt;/a&gt; components and you are good to go, buildings update their components as they cycle and power systems query for them accordingly.&lt;/p&gt;
&lt;p&gt;The hard part was visualization. I&#39;ll cover that below.&lt;/p&gt;
&lt;h1 id=&quot;view-modes&quot;&gt;View Modes&lt;/h1&gt;
&lt;p&gt;One piece of feedback I got was &lt;em&gt;&quot;What&#39;s the point of the global mode?&quot;&lt;/em&gt; and to be fair in the demo the global view mode is less useful than it should be. The primary reason being that the view mode features were not there.&lt;/p&gt;
&lt;p&gt;I am happy to show them off now. Good god did I have to learn a lot about &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/examples/shaders/custom-render-phase/&quot;&gt;shaders&lt;/a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/render/render_resource/struct.DepthStencilState.html&quot;&gt;stencils&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/pbr/fn.setup_morph_and_skinning_defs.html&quot;&gt;skinning&lt;/a&gt; to get things to work.&lt;/p&gt;
&lt;p&gt;The view modes can be accessed in the global mode with the tab button or relevant controller button.&lt;/p&gt;
&lt;h2 id=&quot;power&quot;&gt;Power&lt;/h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-04/power_global.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-04/power_global.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;You can see the powered zones, and which buildings and wires are powered or not.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This view mode lets you see what buildings are powered or not. It also let&#39;s you see the powered zones and what wires are connected. Simple, fast and useful.&lt;/p&gt;
&lt;p&gt;While the view modes are a feature for the global mode, when you place power extenders you can see the powered zones and the like, just for sanity preservation reasons.&lt;/p&gt;
&lt;h2 id=&quot;productivity&quot;&gt;Productivity&lt;/h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-04/productivity.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-12-04/productivity.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;The color of the buildings shows their productivity. Green for 100%, Red for 0%.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I am quite proud of this and I think it brings something new to the factory game space. The productivity mode shows you at a glance the productivity of a whole landscape of machines. Red or yellow sections of a factory stand out clearly.&lt;/p&gt;
&lt;p&gt;In the above video you can see the productivity level drop as the output buffer fills up. Like the power view mode this mode can be accessed via the tab key in global mode.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;It felt really nice to finally add a new feature after so many bug fixes. Super happy with that. Now I just need to change the emotional core/dialogue system to reflect these new systems. Lots of fun and lots to do.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Real Factory Game Quality of Life Changes</title>
          <pubDate>Sun, 16 Nov 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-11-16/</link>
          <guid>https://exofactory.net/blog/2025-11-16/</guid>
          <description xml:base="https://exofactory.net/blog/2025-11-16/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;There were two driving forces when it came to the work done over the past month: feedback from the demo release and the porting from &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/learn/migration-guides/0-16-to-0-17/&quot;&gt;Bevy
0.16 to 0.17&lt;/a&gt; as well as the switch to the &lt;a rel=&quot;external&quot; href=&quot;https://github.com/avianphysics/avian&quot;&gt;Avian&lt;/a&gt; physics engine.&lt;/p&gt;
&lt;p&gt;I will go over a bunch of the new quality-of-life features resulting from the feedback below, but first I want to cover why I decided to switch to Avian and the work that came with that.&lt;/p&gt;
&lt;h2 id=&quot;switching-to-avian&quot;&gt;Switching to Avian&lt;/h2&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-11-16/collider_avian.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-11-16/collider_avian.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2025-11-16/collider_avian.webp&quot; alt=&quot;Autogenerated Avian Collider Meshes&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;Autogenerated Avian Collider Meshes&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;I had initially been using the venerable &lt;a rel=&quot;external&quot; href=&quot;https://github.com/dimforge/bevy_rapier&quot;&gt;Rapier3D&lt;/a&gt; for physics but was unsatisfied for a few reasons.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;High development latency. Given the rapid changes in the Bevy ecosystem and major improvements in each version of Bevy, this was a motivational killer. At the time of this blog post Rapier still does not support Bevy 0.17.&lt;/li&gt;
&lt;li&gt;Non Ergonomic APIs.&lt;/li&gt;
&lt;li&gt;No collider generation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This all being said, Rapier is a solid physics engine and the work that &lt;a rel=&quot;external&quot; href=&quot;https://dimforge.com/&quot;&gt;dimforge&lt;/a&gt; does for the Bevy community is amazing. They are just not the best fit for me.&lt;/p&gt;
&lt;p&gt;Switching to Avian addressed all of these issues and made things like &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/avian3d/latest/avian3d/spatial_query/struct.RayCaster.html&quot;&gt;raycasting&lt;/a&gt; a breeze compared to what I was doing.&lt;/p&gt;
&lt;p&gt;That, and the &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/avian3d/latest/avian3d/collision/collider/enum.ColliderConstructor.html&quot;&gt;amazing collider constructor&lt;/a&gt; system, sealed the deal. &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/avian3d/latest/avian3d/collision/collider/enum.ColliderConstructor.html#variant.ConvexDecompositionWithConfig&quot;&gt;&amp;lt;3 ConvexDecompositionWithConfig&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I did run into one snafu though: Avian does not have a native &lt;a rel=&quot;external&quot; href=&quot;https://rapier.rs/docs/user_guides/bevy_plugin/character_controller&quot;&gt;character controller&lt;/a&gt; like Rapier does. This being said, after reading the &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/avian3d/latest/avian3d/#frequently-asked-questions&quot;&gt;Avian FAQs&lt;/a&gt;, I settled on using &lt;a rel=&quot;external&quot; href=&quot;https://github.com/idanarye/bevy-tnua&quot;&gt;bevy_tnua&lt;/a&gt;, an excellent replacement.&lt;/p&gt;
&lt;p&gt;Time-wise the whole port took a day. Approximately:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 hours for all the colliders and tuning the parameters.&lt;/li&gt;
&lt;li&gt;3 hours to replace all the ray casting and to set up &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/avian3d/latest/avian3d/collision/collider/struct.CollisionLayers.html&quot;&gt;collision
layers&lt;/a&gt;. (With enums, very pleasant to do.)&lt;/li&gt;
&lt;li&gt;3 hours to rewire all the player controls through tnua.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to all the work done by &lt;a rel=&quot;external&quot; href=&quot;https://github.com/Jondolf&quot;&gt;Joona Aalto&lt;/a&gt; on Avian. I am super happy to sponsor him and if you like Avian you should consider it too.&lt;/p&gt;
&lt;h1 id=&quot;general-quality-of-life&quot;&gt;General Quality of Life&lt;/h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-11-16/jump.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-11-16/jump.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;We can now jump!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Given that the newly implemented tnua made it easy to add a jump, I opted to do so. With a little repurposing of an animation that will be fully revealed later, it was a snap.&lt;/p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-11-16/build_cost_menu.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-11-16/build_cost_menu.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2025-11-16/build_cost_menu.webp&quot; alt=&quot;Instead of the broken tool tips we now have the build costs shown in the build menu.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;Instead of the broken tool tips we now have the build costs shown in the build menu.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Here is where the first bit of feedback-based improvement comes in. It was made very clear that it is important that the cost of things should be made more explicit and clear, before, during, and when you can&#39;t build buildings. Now when you hover over or select a building in the build menu the cost is evident.&lt;/p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-11-16/build_cost_placement.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-11-16/build_cost_placement.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2025-11-16/build_cost_placement.webp&quot; alt=&quot;We now see the costs and the available stock when we go to place buildings.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;We now see the costs and the available stock when we go to place buildings.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;h1 id=&quot;machine-productivity&quot;&gt;Machine Productivity&lt;/h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-11-16/mining_machine.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-11-16/mining_machine.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;The mining machine now shows us ideal and real outputs.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is where most of the work went. Based on the feedback of factory game enthusiasts, I was made painfully and embarrassingly aware that I had completely forgotten a major element of the genre: that players should have a clear understanding of what is being consumed, produced, and where optimizations can happen in their factories.&lt;/p&gt;
&lt;p&gt;Like, I play and enjoy &lt;a rel=&quot;external&quot; href=&quot;https://www.satisfactorygame.com/&quot;&gt;Satisfactory&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://factorio.com/&quot;&gt;Factorio&lt;/a&gt;. I don&#39;t know how I missed this. That being said, it&#39;s there now.&lt;/p&gt;
&lt;p&gt;I will say this was a pleasure to program with Bevy&#39;s ECS system. I don&#39;t think there is a better way to track and do the math than ECS. We can just query for machines whose statistics we should update in a system, process them in parallel, and move on with life. Beautiful.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-11-16/furnace.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-11-16/furnace.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;The furnace shows what we actually need to input and what we are and should be outputting.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h1 id=&quot;settings&quot;&gt;Settings&lt;/h1&gt;
&lt;p&gt;I will say part of why I was itching for Bevy 0.17 was due to the &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/examples/ui-user-interface/standard-widgets-observers/&quot;&gt;new/reworked UI using observers&lt;/a&gt;. This let me step away from the buttons for all settings setup and let me use sliders. Much cleaner. Using observers makes writing UIs less painful. With the latest release, the settings page is much better.&lt;/p&gt;
&lt;p&gt;A major quality-of-life improvement I made was regarding the controller guide. Before, it would show keyboard and mouse controls unless you had an Xbox or Steam controller plugged in. This led to a few situations where players were not being shown the correct controls. That is now fixed. By default, the control guide shows what was used last. Yay!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-11-16/graphics_settings.webp&quot; alt=&quot;Graphics settings screen showing the new quality sliders, foliage detail toggle, and render scaling readout.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-11-16/audio_settings.webp&quot; alt=&quot;Audio settings panel with separate sliders for ambience, UI, music, and machinery effects plus output device selection.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-11-16/control_settings.webp&quot; alt=&quot;Control settings overview featuring rebinding support for keyboard/mouse and controller prompts, including a Steam Deck preset.&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;site-fancification&quot;&gt;Site Fancification&lt;/h1&gt;
&lt;p&gt;In progress, but part of the feedback I got was that the site simply didn&#39;t let people know anything about the game at all. In fairness, a plain text only site isn&#39;t the norm for video game sites. As part of ongoing efforts to make the site more informative, we now have an animated homepage.&lt;/p&gt;
&lt;p&gt;I will be continuing to work on fleshing out the rest of the site with rich media over the next few weeks, so keep an eye out.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Lots of quality-of-life improvements based on lots of feedback, with lots more to come. Pretty happy with this. Going forward I am looking forward to adding new features.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Steam Next Fest Reflections</title>
          <pubDate>Tue, 21 Oct 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-10-21/</link>
          <guid>https://exofactory.net/blog/2025-10-21/</guid>
          <description xml:base="https://exofactory.net/blog/2025-10-21/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;Steam Next Fest was a success, although quite stressful. The good news is that I got a ton of feedback from players on Steam, Discord, and elsewhere, and a lot of edge case bugs were fixed.&lt;/p&gt;
&lt;p&gt;I never knew that so many keyboards report to the operating system that they are Xbox-branded human interface devices. Crazy.&lt;/p&gt;
&lt;p&gt;Based on all that I learned, I think I can solidify the timeline for the game going forward.&lt;/p&gt;
&lt;h1 id=&quot;next-fest-results&quot;&gt;Next Fest Results&lt;/h1&gt;
&lt;h2 id=&quot;more-good-things&quot;&gt;More Good Things&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A ton of bugs were found and quickly fixed. Thank you very much to those who reported them.&lt;/li&gt;
&lt;li&gt;A ton of interest was shown in the game, both in terms of wishlists and playtime.&lt;/li&gt;
&lt;li&gt;Many ideas on how to fix and improve things were given.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;less-good-things&quot;&gt;Less Good Things&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I didn’t foresee the diversity of hardware that exists in the real world outside of the soft-launched testers. Some players simply could not launch the game until several hot patches were released.&lt;/li&gt;
&lt;li&gt;I thought the game was fully accessible for those who use accessibility devices and controllers, but from the feedback, I missed a few things.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;updated-timeline&quot;&gt;Updated Timeline&lt;/h1&gt;
&lt;p&gt;Given the feedback from the demo and the very helpful advice from more experienced developers, along with guidance from people knowledgeable in producing successful games, I think it makes sense to adjust the timeline for the release of the game.&lt;/p&gt;
&lt;p&gt;The Q4 2025 date was just unrealistic. Flat out.&lt;/p&gt;
&lt;p&gt;Given this, a new plan is needed.&lt;/p&gt;
&lt;p&gt;After consideration and reflection on what is best for the game, the plan is this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Release a much more feature-rich and polished demo that can be used in a pitch deck and shows the quality we are aiming for in the game.&lt;/li&gt;
&lt;li&gt;Consider options on how to fund the game further, whether that be Kickstarter, investment, or working with a publisher.&lt;/li&gt;
&lt;li&gt;Aim to release the full game in late 2026.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As someone once said: &lt;em&gt;&quot;A delayed game is eventually good, but a rushed game is forever bad.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Meme or not, I do want to release a game I am proud of.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;I am always learning and improving the game and my understanding of the video game industry. Next Fest, and those people who reached out to me, taught me a ton, and the game will be better for it. Exciting times ahead. I now have a ton of feedback to act on.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Demo Release and Polish</title>
          <pubDate>Tue, 07 Oct 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-10-07/</link>
          <guid>https://exofactory.net/blog/2025-10-07/</guid>
          <description xml:base="https://exofactory.net/blog/2025-10-07/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;A LOT happened over the past month, but the biggest thing is that the demo has been soft launched on Steam in anticipation of Steam Next Fest. If you want you can download it at the link at the end of this post. Linux and Windows versions are both available.&lt;/p&gt;
&lt;p&gt;The amount of work that has gone into this has been a lot, and we cover a good amount of it here.&lt;/p&gt;
&lt;h2 id=&quot;steam-next-fest&quot;&gt;Steam Next Fest&lt;/h2&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-10-07/demo_steam.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-10-07/demo_steam.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2025-10-07/demo_steam.webp&quot; alt=&quot;Nice little Demo download button.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;Nice little Demo download button.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Big news is that we are officially participating in Steam Next Fest October. We finally have everything in place and approved. This was a shockingly difficult process and was more complicated than I thought. Turns out that you can&#39;t simply upload an &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Executable_and_Linkable_Format&quot;&gt;ELF&lt;/a&gt;/&lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/.exe&quot;&gt;.exe&lt;/a&gt; file to Steam and have them distribute it. You have to use &lt;a rel=&quot;external&quot; href=&quot;https://partner.steamgames.com/doc/sdk/uploading#Introduction&quot;&gt;quite a bit of Steam-specific tooling.&lt;/a&gt; Which to Valve&#39;s credit does run natively on Linux. It&#39;s just a lot to learn and process, particularly when you gave yourself a day to do all the packaging and uploading to Steam.&lt;/p&gt;
&lt;p&gt;I will say a major piece of advice I have for programmers turned game devs would be to give more time to packaging than you think you might need. For me, packaging a game for Steam was more difficult than preparing an &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/RPM_Package_Manager&quot;&gt;RPM&lt;/a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Deb_(file_format)&quot;&gt;DEB&lt;/a&gt; distributable.&lt;/p&gt;
&lt;p&gt;The good news was, in the end, the game made the deadline, but with intense timing difficulties.&lt;/p&gt;
&lt;h2 id=&quot;testing-mistakes-made&quot;&gt;Testing Mistakes Made&lt;/h2&gt;
&lt;p&gt;This leads to the next major point. If you signed up for alpha/beta testing you were not forgotten or passed over. Due to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The unexpected (by me) delays in Steam approving the game.&lt;/li&gt;
&lt;li&gt;The unexpected (by me) difficulties in packaging the game.&lt;/li&gt;
&lt;li&gt;The sheer number of &quot;breaking&quot; bugs that I was crunch fixing found by friends and family.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I was not able to upload and get early testing keys before the Demo had to be soft launched for Next Fest.&lt;/p&gt;
&lt;p&gt;My apologies. My plan going forward is to structure the game development process in a more streamlined way with dedicated feature, testing, and polishing time windows. So for the main game itself, we should have more structured testing periods.&lt;/p&gt;
&lt;h2 id=&quot;animations-mechanics&quot;&gt;Animations &amp;amp; Mechanics&lt;/h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-10-07/belt_loop.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-10-07/belt_loop.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Lifters, Belts, Splitters, and Mergers&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is where most of the crunch time was dedicated. I will say a disadvantage of ECS is that syncing independent animations is a bit harder. It feels like the world animations run on some &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Psychophysical_parallelism&quot;&gt;Leibniz-style pre-established harmony&lt;/a&gt;. No linking or hierarchy to speak of. Just async systems running in such a way to give that illusion.&lt;/p&gt;
&lt;p&gt;Long story short, the game now behaves like a game should, animations, sound, and all.&lt;/p&gt;
&lt;h2 id=&quot;demo-released-trailer&quot;&gt;Demo Released + Trailer&lt;/h2&gt;
&lt;p&gt;Here is the fun part. While no emails have been sent yet, the demo can be downloaded and played. I may be able to squeeze one more bug fix build in before Next Fest officially starts, so if you see any bugs you can report them in the &lt;a rel=&quot;external&quot; href=&quot;https://discord.com/channels/1393503401073180803/1400190777136644157&quot;&gt;Exofactory Bug Report Discord Channel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We also have a small gameplay trailer! In the interests of bandwidth and new YouTube accounts not being allowed to upload videos until they are verified, it can be watched on the Steam page.&lt;/p&gt;
&lt;h2 id=&quot;roadmap&quot;&gt;Roadmap&lt;/h2&gt;
&lt;p&gt;The demo is just the start. The full game continues on with major improvements incoming. Among these are the following. This being said, I am open to player recommendations. You can provide them at the &lt;a rel=&quot;external&quot; href=&quot;https://discord.com/channels/1393503401073180803/1400190867280629820&quot;&gt;feature suggestion channel in Discord.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I will be providing a more detailed roadmap on this site soon. These lists are preliminary and VERY VERY incomplete.&lt;/p&gt;
&lt;h3 id=&quot;coming-sooner&quot;&gt;Coming Sooner&lt;/h3&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-10-07/gamepad.avif&quot; type=&quot;image/avif&quot;&gt;
      &lt;source srcset=&quot;https://exofactory.net/media/2025-10-07/gamepad.webp&quot; type=&quot;image/webp&quot;&gt;
      &lt;img src=&quot;https://exofactory.net/media/2025-10-07/gamepad.webp&quot; alt=&quot;Accessibility Prioritized Steam Deck and Controller Support&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;/picture&gt;
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;Accessibility Prioritized Steam Deck and Controller Support&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Full accessibility prioritized Steam Deck and controller support.&lt;/li&gt;
&lt;li&gt;Terrain and foliage asset rework.&lt;/li&gt;
&lt;li&gt;Massive optimization overhaul.&lt;/li&gt;
&lt;li&gt;The first diverging branches of technology unlocks in the tech web based on your in-game choices.&lt;/li&gt;
&lt;li&gt;A public wiki like a proper factory game should have.&lt;/li&gt;
&lt;li&gt;Continuing work on the &quot;real&quot; terrain.&lt;/li&gt;
&lt;li&gt;Real power use.&lt;/li&gt;
&lt;li&gt;Liquids.&lt;/li&gt;
&lt;li&gt;German.&lt;/li&gt;
&lt;li&gt;Test ELF binaries for &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/AArch64&quot;&gt;aarch64&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/RISC-V&quot;&gt;RISC-V&lt;/a&gt; if possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;coming-later&quot;&gt;Coming Later&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Game binaries for more &lt;a rel=&quot;external&quot; href=&quot;https://doc.rust-lang.org/beta/rustc/platform-support.html&quot;&gt;Rust Tier 1 and 2 targets.&lt;/a&gt; (Anyone want to help test on the BSDs?)&lt;/li&gt;
&lt;li&gt;Steam-free way to play the game &lt;a rel=&quot;external&quot; href=&quot;https://www.factorio.com/&quot;&gt;Factorio&lt;/a&gt; style.&lt;/li&gt;
&lt;li&gt;Officially supported &lt;a rel=&quot;external&quot; href=&quot;https://flathub.org/&quot;&gt;Flathub&lt;/a&gt; / &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Flatpak&quot;&gt;Flatpak&lt;/a&gt; images.&lt;/li&gt;
&lt;li&gt;Continuing work on the &quot;real&quot; terrain.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;The demo is out and I look forward to working on the full game. I am looking forward to seeing what people make.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Demo on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
</description>
      </item>
      <item>
          <title>Private Alpha, Steam, &amp; Core Functionality</title>
          <pubDate>Mon, 08 Sep 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-09-08/</link>
          <guid>https://exofactory.net/blog/2025-09-08/</guid>
          <description xml:base="https://exofactory.net/blog/2025-09-08/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;Over the past 30 days the game went from &quot;a bit worried&quot; to &quot;back on track&quot; for release. I am happy to say we plan on participating in Steam Next Fest October! (more details below) A lot of the work was done on pure fundamental elements of the game from a coding perspective. So while the visuals haven&#39;t changed too much the code is now in a great state. Next month the demo should be full of new visuals and and also new sounds! The month of September will be focused on visuals, polish, and testing. Exciting times!&lt;/p&gt;
&lt;h2 id=&quot;private-alpha&quot;&gt;Private Alpha&lt;/h2&gt;
&lt;p&gt;I am aiming on releasing a small focused private alpha version of the game for player testing in the second half of this month. If you are interested you can sign up to test on the &lt;a href=&quot;/&quot;&gt;homepage&lt;/a&gt;. You should see a button where you can sign up there.&lt;/p&gt;
&lt;p&gt;Just be aware, this will be a true technical alpha and may be full of bugs, UI, UX, and playability issues. If you are looking to play the game I would recommend waiting for Steam Next Fest. If you are interested in debugging and pointing out issues I welcome you to join.&lt;/p&gt;
&lt;h2 id=&quot;steam-next-fest&quot;&gt;Steam Next Fest&lt;/h2&gt;
&lt;p&gt;We plan on, and are on schedule for, participating in Steam Next Fest October next month. We were approved and just need to make sure that we have our final release build submitted before the end of September.&lt;/p&gt;
&lt;p&gt;The plan is to release a free vertical slice demo of the game that people can play. The goal is to let people build out a factory how they like and to see how the story changes based on that factory. I am aiming for a short small demo, but depending on how and where you build your factory the tone, feel, and direction should be different. Unless you are scripting, every playthrough should be a little different at the least or very different depending on how you build.&lt;/p&gt;
&lt;p&gt;This is all managed by the emotional core and it&#39;s pretty cool.&lt;/p&gt;
&lt;p&gt;Just to set expectations though, this will be a shorter demo at about ~10-15 min if you play fast. The full game will be developed with the community via Early Access, with a full release sometime in 2026.&lt;/p&gt;
&lt;h2 id=&quot;belt-fundamentals-logistics&quot;&gt;Belt Fundamentals &amp;amp; Logistics&lt;/h2&gt;
&lt;p&gt;The majority of the work on the development side was focused in this area. You simply can not have a factory game without a robust and performant belt and logistics system.&lt;/p&gt;
&lt;p&gt;I think I did that. I never understood the pain that factory game devs felt when they talked about the pain of belt dev until now. Now I join that circle.&lt;/p&gt;
&lt;p&gt;The cool thing is that I basically get performance for free with Bevy&#39;s ECS architecture. Everything is fully parallel and the game will use every CPU core you have to make sure your factory runs smoothly. Visually I suspect you could bring fps down if you crank up the settings, but factory size in itself should never be a problem.&lt;/p&gt;
&lt;p&gt;Included here is a rough technical explanation of how things work under the hood. Feel free to skip this if you find it boring.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-09-08/belt_connect.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-09-08/belt_connect.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Fancy Belt Stuff&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;how-belts-actually-work&quot;&gt;How Belts Actually Work&lt;/h3&gt;
&lt;p&gt;Belts auto-organize themselves into directed “segments”. Segments are made of chains of belts from anything that can output items to anything that can accept them. Each belt entity gets a component that marks what belt segment it is part of. This is all done via observers and only happens when you place/delete said belt.&lt;/p&gt;
&lt;p&gt;To be clear there is no linked-list like structure anywhere. We are just tagging belt entities with a segment component.&lt;/p&gt;
&lt;h3 id=&quot;connections-and-segment-formation&quot;&gt;Connections and Segment Formation&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-09-08/working_rotation.webp&quot; alt=&quot;Fabricators rotated at 90 degree increments. A blue or red cube is next to the entrance or exit&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Buildings and belts declare their belt inputs and outputs on the grid. When you place a building or belt, the building IO points, look one tile in the facing direction, and only connect if the neighbor is oriented in a compatible way. If it connects, the building adds a sink or source relationship with said belt segment. Above you can see some very large debug cubes that show the watched tiles.&lt;/p&gt;
&lt;p&gt;As you place belts or buildings, I reorder belts from true start to end so the chain is coherent, and I rebuild a “visual path” spline straight from each belt’s world-space center. If you remove a belt, I recompute the actual connected groups, split the segment if needed, and reassign connected buildings to the correct new segments.&lt;/p&gt;
&lt;p&gt;This was like 95% of the work.&lt;/p&gt;
&lt;h3 id=&quot;item-movement&quot;&gt;Item Movement&lt;/h3&gt;
&lt;p&gt;Items on a belt move along a piecewise set of &lt;a rel=&quot;external&quot; href=&quot;https://docs.rs/bevy/latest/bevy/prelude/struct.CubicHermite.html&quot;&gt;CubicHermite Splines&lt;/a&gt; built from the location of the belts in the world. This is really cheap because all of the splines are pre-calculated. All we do is move stuff based on a timer which is also pre-calculated based on belt segment length and belt speed.&lt;/p&gt;
&lt;h3 id=&quot;capacity-throughput-and-backpressure&quot;&gt;Capacity, Throughput, and Backpressure&lt;/h3&gt;
&lt;p&gt;Belt capacity was done ASAP (as simple as possible) aka one belt entity = one item. A 20 belt entity long segment can hold 20 items. Inserts only succeed if the segment has room. Machine sources hooked up to a belt segment push from a small output buffer into the segment whenever there’s space. If the segment is full, the buffer fills and production pauses naturally; when the line clears, it resumes automatically. A similar process happens with machine inputs.&lt;/p&gt;
&lt;h3 id=&quot;performance&quot;&gt;Performance&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-09-08/working_input_output.webp&quot; alt=&quot;A series of buildings all with input and output debug cubes&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is all ECS and fully parallel. Because segments are fully isolated and Bevy is cool I can just set up an async pool as wide as your CPU core count is. Segments all process their items and try to send via the relationship based source sink system. Above you can see a series of buildings with their input and outputs highlighted.&lt;/p&gt;
&lt;h2 id=&quot;new-buildings-resources&quot;&gt;New Buildings &amp;amp; Resources&lt;/h2&gt;
&lt;p&gt;We&#39;ve added a few new buildings since the last dev blog and they&#39;re all pretty cool.&lt;/p&gt;
&lt;h3 id=&quot;mining-platform-v1&quot;&gt;Mining Platform v1&lt;/h3&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-09-08/mining_machine.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-09-08/mining_machine.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Mining Machine In Action&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is the first resource extractor that the player has access to. It will extract ores from the planet just as humans taught.&lt;/p&gt;
&lt;h3 id=&quot;ancient-ai-core&quot;&gt;Ancient AI Core&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-09-08/LostAICore_04.webp&quot; alt=&quot;The ancient AI core. It has a door and communication dishes. It is worn and covered in moss.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The core where you the player AI&#39;s mind resides. Where you have been... for quite a while.&lt;/p&gt;
&lt;h3 id=&quot;gas-extractor-sneak-preview&quot;&gt;Gas Extractor Sneak Preview&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-09-08/Gas_Extractor_Rig.webp&quot; alt=&quot;Gas extractor in Blender. Many technical nodes are visible.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And here is a sneak preview of the gas extractor. Not everything is a mineral after all.&lt;/p&gt;
&lt;h2 id=&quot;music&quot;&gt;Music&lt;/h2&gt;
&lt;p&gt;Super happy to be working with &lt;a rel=&quot;external&quot; href=&quot;https://www.instagram.com/kilianliccia/&quot;&gt;Repto Eternef&lt;/a&gt; They are creating some amazing music for the game and will be helping drive the exofactory music engine which we plan on open sourcing in 2026 before the game releases.&lt;/p&gt;
&lt;h2 id=&quot;dialogue-the-emotional-core&quot;&gt;Dialogue &amp;amp; The Emotional Core&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-09-08/dialogue.webp&quot; alt=&quot;A dialogue box on top of a desert scene saying &amp;quot;I am alone here and things are not as they should be.&amp;quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Lastly, but certainly not least, the emotional core and dialogue system was added.&lt;/p&gt;
&lt;p&gt;The emotional core is the heart of what makes Exofactory, Exofactory. Technically it watches what the players do by receiving and processing events that are triggered by any action the player takes. This includes all building, destruction, movements, production, everything. These along with looking at the totality of what you have built, how systems interact and how things don&#39;t interact inform the story direction.&lt;/p&gt;
&lt;p&gt;The goal is to have a user driven story based solely on their factory. I never want to put up a &quot;choose option A or B&quot; popup to advance the story. The game should know your priorities based on how, where, and what you are doing with your factories.&lt;/p&gt;
&lt;p&gt;This is most evident to the player via the internal monologue of the AI that the player listens to as the game goes on. The thoughts and tones and direction of the dialogue/monologue are given by the emotional core to the dialogue system which displays them and plays the audio. Currently I am examining open source TTS systems that can read the many many many lines of potential dialogue.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Lots of core progress was made and things are on track. I am excited to see how players use the systems I am working on. :)&lt;/p&gt;
&lt;p&gt;Exofactory is now available on Steam! If you are interested in the game I would encourage you to consider wishlisting it there.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
</description>
      </item>
      <item>
          <title>Animation, Motion, &amp; Terrain v3</title>
          <pubDate>Thu, 07 Aug 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-08-07/</link>
          <guid>https://exofactory.net/blog/2025-08-07/</guid>
          <description xml:base="https://exofactory.net/blog/2025-08-07/">&lt;p&gt;Exofactory is now available on Steam! If you are interested in the game I would encourage you to consider wishlisting it there.&lt;/p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;/media/home/steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;There were a few major goals that were met. The game is now animated, we have some resources, and the terrain system is getting closer to &quot;done&quot;. Not the most productive time period, but we are moving forward.&lt;/p&gt;
&lt;p&gt;Additionally, I did give a presentation at &lt;a rel=&quot;external&quot; href=&quot;https://www.bornhack.dk/bornhack-2025/&quot;&gt;Bornhack 2025&lt;/a&gt; about creating games in Bevy with Rust, but it is not yet available. When it is, I will include it in a future dev blog.&lt;/p&gt;
&lt;h1 id=&quot;animation&quot;&gt;Animation&lt;/h1&gt;
&lt;p&gt;We now have animations in the game! Animating in Bevy was quite the fun thing to learn. The thing that saved the day (and a ton of work hours) was the bevy ecosystem, namely the excellent Bevy/Blender plugin &lt;a rel=&quot;external&quot; href=&quot;https://bevyskein.dev/&quot;&gt;Skein&lt;/a&gt; by &lt;a rel=&quot;external&quot; href=&quot;https://hachyderm.io/@chrisbiscardi&quot;&gt;Chris Biscardi&lt;/a&gt;. He is doing a ton for the Bevy community and I see his work everywhere.&lt;/p&gt;
&lt;p&gt;Skein is both a Bevy and Blender plugin that enables the 3D artist to add Bevy components (if you are not familiar with Bevy, think of components as a sort of tag or label) to parts of the 3D asset. When the asset is exported as a glb/gltf file those components are exported with as part of the file.&lt;/p&gt;
&lt;p&gt;Skein on the Bevy side sees those embedded components and makes them available in Bevy&#39;s &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/learn/quick-start/getting-started/ecs/&quot;&gt;Entity Component System&lt;/a&gt;. This saves a ton of time and boilerplate code.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-08-07/motion_control.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-08-07/motion_control.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Programmatic Control of Lifter Animation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We are using Skein to add components to animation &quot;bones&quot; so animation can be controlled in a programmatic way, reacting to game events instead of just going through an animation loop. We are using these primarily in the Lifters as shown above.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-08-07/motion_trans.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-08-07/motion_trans.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Motion Transitions&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In addition to more interesting programmatic animation we are using Bevy&#39;s &lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/examples/animation/animation-graph/&quot;&gt;animation graph system&lt;/a&gt;. This lets us change from one animation cycle to another smoothly without jitter or visual artifacts. Above you can see the exoframe go from walking to idle in a smooth continuous way.&lt;/p&gt;
&lt;h1 id=&quot;resources&quot;&gt;Resources&lt;/h1&gt;
&lt;p&gt;We now have resources! We are starting with iron and copper. Soon we should see some machines start to get to work!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-08-07/copper.webp&quot; alt=&quot;Copper Resource&quot; /&gt;
Above we see copper ore and bars. This should be pretty common in game and will be used to make many things including low power wires.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-08-07/iron.webp&quot; alt=&quot;Iron Resource&quot; /&gt;
Above we see iron. I quite like the details on the top of the bars. Given we play as an AI, I could see the AI liking the design too.&lt;/p&gt;
&lt;h1 id=&quot;terrain-v3&quot;&gt;Terrain v3&lt;/h1&gt;
&lt;p&gt;The Bevy space is full of halfborn, unmaintained, and poorly documented terrain &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Level_of_detail_(computer_graphics)&quot;&gt;level of detail (LoD)&lt;/a&gt; systems. You will see a ton of terrain LoD systems everywhere but I found none that were maintained, had the features I needed, and were documented in a clear way. Resultingly Exofactory now has its own LoD implementation. It&#39;s relatively naive, but meets the base requirements I need. These being:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Spawning and despawning terrain based on the location of &lt;em&gt;multiple&lt;/em&gt; cameras.&lt;/li&gt;
&lt;li&gt;Swapping in higher and lower resolution meshes and textures based on the location of said multiple cameras.&lt;/li&gt;
&lt;li&gt;Handling LoD for terrain details like foliage or stones.&lt;/li&gt;
&lt;li&gt;Doing all of this in a performant Bevy native ECS way.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-08-07/level_of_detail.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-08-07/level_of_detail.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Level of Detail System Testing&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Above you can see the test terrain I was using to test this LoD system. Green being the tile under the active camera, yellow being the higher resolution mesh tiles, red being the low resolution mesh tiles, and the red being despawned as it goes further away.&lt;/p&gt;
&lt;p&gt;This is a MUCH stronger foundation for terrain, but sadly a lot of my past terrain work needed/needs to be re-written. Good news is that the terrain v3 system is very tunable for aesthetics or performance. Even on my old 11th gen intel laptop iGPU I was able to tune things to run at 60fps with the full view distance. This being said this will probably change as more gets added.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-08-07/terrain_v3_with_color.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-08-07/terrain_v3_with_color.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Terrain v3 with only base colors&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Here we can see a more developed (although still very bare, texture-less, and empty) version of the reworked Terrain v3 system with full LoD functionality. The textures and other detail will be added on GPU via shader and that is not included here, but we have the base colors and that gives an idea of what textures we can expect. Once we add terrain details I think the terrain will look amazing.&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Given the time frame I wish I could have gotten more done. This being said what I did do was impactful and makes the game more playable, and more importantly at this stage, more test-playable. No longer are we seeing stutters when crossing terrain tiles. It&#39;s smooth and pleasant. The animation is cute too and adds a lot of life to a formally still world.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Terrain, Animation, and Major Work Done</title>
          <pubDate>Sun, 06 Jul 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-07-06/</link>
          <guid>https://exofactory.net/blog/2025-07-06/</guid>
          <description xml:base="https://exofactory.net/blog/2025-07-06/">&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; We were approved and Exofactory is now &lt;a rel=&quot;external&quot; href=&quot;https://store.steampowered.com/app/3615720/Exofactory/&quot;&gt;available on Steam&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;
&lt;p&gt;The past month has been full of a ton of progress. The terrain has been completely reworked (more on that later), we now have a ton of animated 3D assets thanks to &lt;a rel=&quot;external&quot; href=&quot;https://julef.myportfolio.com/&quot;&gt;Julef&lt;/a&gt;, and we have everything in line to get our steam presence up.&lt;/p&gt;
&lt;p&gt;Also over the month I had the pleasure of attending &lt;a rel=&quot;external&quot; href=&quot;https://entropia.de/GPN23/en&quot;&gt;GPN23&lt;/a&gt; an amazing hacker/maker conference of the chillest (in vibe not temperature) order. I was tricked into giving a lightning talk on creating games in Rust with Bevy. If you are inclined you can watch it &lt;a rel=&quot;external&quot; href=&quot;https://media.ccc.de/v/gpn23-50-lightning-talks-ii#t=72&quot;&gt;here&lt;/a&gt;. The cool thing is that this talk was received well enough that I could justify giving a longer extended presentation at an upcoming event.&lt;/p&gt;
&lt;p&gt;As a bonus &lt;a rel=&quot;external&quot; href=&quot;https://julef.myportfolio.com/&quot;&gt;Julef&lt;/a&gt; shares a peek behind the scenes at her work on Exofactory in her first blog contribution.&lt;/p&gt;
&lt;p&gt;More to come.&lt;/p&gt;
&lt;h1 id=&quot;animation&quot;&gt;Animation&lt;/h1&gt;
&lt;p&gt;Where a ton of work shows is the animation and 3d work by &lt;a rel=&quot;external&quot; href=&quot;https://julef.myportfolio.com/&quot;&gt;Julef&lt;/a&gt;. I am super excited to add these to the game.&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-07-06/wave.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-07-06/wave.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Wave Animation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-07-06/walk.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-07-06/walk.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Walk Animation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-07-06/idle.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-07-06/idle.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Idle Animation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-07-06/scene.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-07-06/scene.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;Scene with Belts and Machines&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h1 id=&quot;behind-the-scenes-with-julef&quot;&gt;Behind the Scenes with Julef&lt;/h1&gt;
&lt;p&gt;Hello, Julija here – Art Director and head of the full Art Development team for Exofactory.&lt;/p&gt;
&lt;p&gt;I&#39;d like to share a quick art update on the game.&lt;/p&gt;
&lt;p&gt;Over the past month, we&#39;ve been focused on refining assets and enhancing the terrain.&lt;/p&gt;
&lt;p&gt;One of the key highlights: the Fabricator has received a complete visual overhaul with a brand-new look.&lt;/p&gt;
&lt;div style=&quot;display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin: 1rem 0; align-items: center;&quot;&gt;
  &lt;img src=&quot;https://exofactory.net/media/2025-07-06/julef_image1.webp&quot; alt=&quot;Fabricator 1&quot;&gt;
  &lt;img src=&quot;https://exofactory.net/media/2025-07-06/julef_image2.webp&quot; alt=&quot;Fabricator 2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;We added more belts with Level 1 and 2 and gave them a life. Things are starting to move!&lt;/p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-07-06/scene.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https://exofactory.net/media/2025-07-06/scene.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;/video&gt;
&lt;/figure&gt;
&lt;p&gt;The Exoframe also came to life with a working rig and animations – big thanks to &lt;a rel=&quot;external&quot; href=&quot;https://vimeo.com/1066535461&quot;&gt;Juan&lt;/a&gt;, who supported the rig setup and created the animation work!&lt;/p&gt;
&lt;div style=&quot;display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin: 1rem 0; align-items: center;&quot;&gt;
  &lt;div style=&quot;display: flex; flex-direction: column; align-items: center;&quot;&gt;
    &lt;video class=&quot;looping-video&quot; style=&quot;width: 100%;&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
      &lt;source src=&quot;https://exofactory.net/media/2025-07-06/walk.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
      &lt;source src=&quot;https://exofactory.net/media/2025-07-06/walk.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
    &lt;/video&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;p style=&amp;quot;margin-top: 0.5rem; text-align: center;&amp;quot;&amp;gt;Walk Animation&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt;
  &lt;div style=&quot;display: flex; flex-direction: column; align-items: center;&quot;&gt;
    &lt;video class=&quot;looping-video&quot; style=&quot;width: 100%;&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
      &lt;source src=&quot;https://exofactory.net/media/2025-07-06/wave.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
      &lt;source src=&quot;https://exofactory.net/media/2025-07-06/wave.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
    &lt;/video&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;p style=&amp;quot;margin-top: 0.5rem; text-align: center;&amp;quot;&amp;gt;Wave Animation&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt;
  &lt;div style=&quot;display: flex; flex-direction: column; align-items: center;&quot;&gt;
    &lt;video class=&quot;looping-video&quot; style=&quot;width: 100%;&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
      &lt;source src=&quot;https://exofactory.net/media/2025-07-06/idle.av1.mp4&quot; type=&quot;video/mp4; codecs=av01.0.05M.08&quot;&gt;
      &lt;source src=&quot;https://exofactory.net/media/2025-07-06/idle.h264.mp4&quot; type=&quot;video/mp4; codecs=avc1.4D401E&quot;&gt;
    &lt;/video&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;p style=&amp;quot;margin-top: 0.5rem; text-align: center;&amp;quot;&amp;gt;Idle Animation&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We successfully completed and submitted First Visuals for Steam.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-07-06/julef_image7.webp&quot; alt=&quot;Steam visuals&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And here you can see what is happening behind the scenes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-07-06/julef_image8.webp&quot; alt=&quot;Behind the scenes work&quot; /&gt;
&lt;img src=&quot;/media/2025-07-06/julef_image9.webp&quot; alt=&quot;Behind the scenes work&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;terrain&quot;&gt;Terrain&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-07-06/terrain_basic.webp&quot; alt=&quot;Terrain Basic&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Cait here agan! If the imaga above is terrain v2 below you will see v2.5.&lt;/p&gt;
&lt;p&gt;The terrain system was overhauled. In the new system we have non-trash-tier terrain. But, I am still not happy with it. If this is terrain v2 I imagine we will need to get to at least v4 or v5 before things start to look okay. This being said, as I am reminded of constantly, terrain is one of the hardest parts of the factory game genre. If I am ever happy with it that would be a major win. So we won&#39;t stop working on this till it&#39;s at a good place.&lt;/p&gt;
&lt;p&gt;More subtly, a new terrain loading system was added. It dynamically streams in assets and textures as the player navigates the world. This allows for a ton of potential like adding a &quot;level of detail&quot; system later on.&lt;/p&gt;
&lt;h1 id=&quot;steam-screenshots&quot;&gt;Steam Screenshots&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-07-06/1.webp&quot; alt=&quot;Screenshot 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The screenshots were the killer for me. I had initially planned to set up our Steam presence &lt;em&gt;much&lt;/em&gt; sooner, but I just couldn&#39;t get the screenshots to a point where they actually represented the game.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://bevy.org/&quot;&gt;Bevy&lt;/a&gt;, the engine behind Exofactory has no scene viewer, nor preview nor paint tool, or any GUI at all. Resultingly I had to build the factories in the screenshot by &lt;strong&gt;actually playing the game&lt;/strong&gt; exactly like a player would.  Given that thing like deleting building haven&#39;t been added yet, you can imagine how this went.&lt;/p&gt;
&lt;p&gt;The good news here that this did help me find things I now want to change just for player quality of life. So that is a win.&lt;/p&gt;
&lt;p&gt;So without further ado here are the in game images that will be submitted to Steam. We expect the game to be approved soon.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-07-06/2.webp&quot; alt=&quot;Screenshot 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-07-06/3.webp&quot; alt=&quot;Screenshot 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-07-06/4.webp&quot; alt=&quot;Screenshot 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-07-06/5.webp&quot; alt=&quot;Screenshot 5&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;conclusions&quot;&gt;Conclusions&lt;/h1&gt;
&lt;p&gt;All in all a productive month. Great work was done all around, particularly by Julef.&lt;/p&gt;
&lt;p&gt;The only downside that was by doing so much so fast a little brittleness was introduced to the code base. I am looking forward to doing some &quot;pure&quot; programming work to bring the code base to where I want it to be in terms of quality. After all, what&#39;s the point of writing a game in Rust at all if you let code brittleness work its way in.&lt;/p&gt;
&lt;p&gt;This month was great and soon that greatness will be rock solid.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Our Art Lead, ESC, and the 3D Rework</title>
          <pubDate>Sun, 25 May 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-05-24/</link>
          <guid>https://exofactory.net/blog/2025-05-24/</guid>
          <description xml:base="https://exofactory.net/blog/2025-05-24/">&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;The last two weeks were full of a ton of work, most of it not programming related. The good news is that this work resulted in major changes (improvements to the game overall).&lt;/p&gt;
&lt;p&gt;The largest of these changes is that Exofactory now has an art lead. So we should start to see some visual improvements soon.&lt;/p&gt;
&lt;h2 id=&quot;art-lead&quot;&gt;Art Lead&lt;/h2&gt;
&lt;p&gt;The big news, as mentioned above, is that Exofactory now has an art lead. While the artist search was originally focused on finding an artist to create some assets for the game, after speaking with Julija, I was convinced that hiring an art lead who can help drive game art direction made sense.&lt;/p&gt;
&lt;p&gt;I simply lack the skills and don&#39;t think the game would be best served by me driving the art direction.&lt;/p&gt;
&lt;p&gt;We&#39;ve been working together for a bit now and the game now has an aesthetic that we are aiming for.&lt;/p&gt;
&lt;p&gt;I&#39;m excited to work together and lots is to be done.&lt;/p&gt;
&lt;p&gt;If you want to learn more about Julija, you can take a look at &lt;a rel=&quot;external&quot; href=&quot;https://julef.myportfolio.com&quot;&gt;her portfolio here.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;esc&quot;&gt;ESC&lt;/h2&gt;
&lt;p&gt;If the single reader of this dev blog is wondering why there wasn&#39;t an update last week, the reason was me being distracted by the Eurovision Song Contest!&lt;/p&gt;
&lt;p&gt;The resulting party and extra long get-together may have also impacted the progress this week, but I&#39;ll just say it was worth it.&lt;/p&gt;
&lt;h2 id=&quot;we-re-now-3d&quot;&gt;We&#39;re now 3D!&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-05-24/terrain.webp&quot; alt=&quot;3D Screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The major work over the past two weeks was porting the game to be 3D. Not terribly hard, but it was a lot of work. (Just FYI: these are not final art assets. So don&#39;t worry.)&lt;/p&gt;
&lt;p&gt;Part of this work was writing a programmatic terrain generator. Regardless of whether the game will have an infinite map or a more limited hand tuned one, having the terrain be autogenerated lightens the load substantially.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-05-24/terrain_zoom.webp&quot; alt=&quot;3D Screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Funnily enough, generating the terrain takes just enough time to justify adding a game loading screen. So we now have one of those.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-05-24/load_screen.webp&quot; alt=&quot;Loading Screen Screenshot&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Pretty happy this week. Lots of important work was started and the game now has an artistic direction.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Art and Artists</title>
          <pubDate>Sat, 10 May 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-05-10/</link>
          <guid>https://exofactory.net/blog/2025-05-10/</guid>
          <description xml:base="https://exofactory.net/blog/2025-05-10/">&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;This week was focused on primarily non-code work. I ended up focusing on an area where I am quite inexperienced, namely the area of finding, filtering out, and selecting an artist. It was a tedious and quite unfun task, but it needs to be done.&lt;/p&gt;
&lt;h2 id=&quot;art-and-artists&quot;&gt;Art and Artists&lt;/h2&gt;
&lt;p&gt;I am a programmer, not an artist so I made a few mistakes. Namely focusing on 2d artists.&lt;/p&gt;
&lt;p&gt;This was a mistake because as one of the artists I reached out to kindly told me, I would need to commission an entire new animation for each building for each orientation. That&#39;s a lot of work.&lt;/p&gt;
&lt;p&gt;I was told that hiring a 3D artist and doing a &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/UV_mapping&quot;&gt;UV map&lt;/a&gt; to a sprite sheet might be wiser. After a bit of research I agreed. This advice was appreciated and helped set me in the right direction.&lt;/p&gt;
&lt;p&gt;Before I was told this though I did get some concept art that&#39;s pretty cool.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-05-10/design_1.webp&quot; alt=&quot;Concept 2D drawing of a building.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A bit too round compared to what I was looking for but cool for sure.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-05-10/design_2.webp&quot; alt=&quot;Concept 2D drawing of a building.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Quite like this one.&lt;/p&gt;
&lt;p&gt;Sadly this 2D concept art can&#39;t really be taken further, but it helps define the game energy which is a good thing.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The week was full of new things for me, but I learned a lot. Now I am in the process of hiring a proper 3D focused artist and should have more to show you there soon.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Offsets, Menus, Accessibility, and 0.16</title>
          <pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-05-03/</link>
          <guid>https://exofactory.net/blog/2025-05-03/</guid>
          <description xml:base="https://exofactory.net/blog/2025-05-03/">&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Last week I had big plans to do a hard micro-crunch, and to put out a technical preview. Sadly due to personal issues, I couldn&#39;t put in the needed time this week. Resultingly I was not able to get the game to where I wanted it to be. I will probably submit the game for future consideration, but for the sake of sustainability I had to drop it for this week.i&lt;/p&gt;
&lt;p&gt;This being said, major work was done this week, both behind the scenes, and user facing stuff. All of which is exciting.&lt;/p&gt;
&lt;h2 id=&quot;bevy-0-16&quot;&gt;Bevy 0.16&lt;/h2&gt;
&lt;p&gt;The first big task was porting the game from &lt;a rel=&quot;external&quot; href=&quot;https://bevyengine.org/learn/migration-guides/0-15-to-0-16/&quot;&gt;Bevy 0.15 to 0.16&lt;/a&gt;. I had 3 reasons for this.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I plan on starting work on belts soon. I plan on heavily using the new &lt;a rel=&quot;external&quot; href=&quot;https://bevyengine.org/news/bevy-0-16/#ecs-relationships&quot;&gt;ECS Relationships feature&lt;/a&gt; to manage belt sources and sinks. Without this I would just have ended up writing &quot;ECS Relationships at home&quot;.&lt;/li&gt;
&lt;li&gt;I wanted to use the stabilized &lt;a rel=&quot;external&quot; href=&quot;https://bevyengine.org/news/bevy-0-16/#input-focus-improvements&quot;&gt;Input Focus feature&lt;/a&gt;. This is important for accessibility and gamepad support. (More details below.)&lt;/li&gt;
&lt;li&gt;Bevy is a rapidly evolving game engine. To fall behind is death for Exofactory&#39;s future at this point. Once bevy becomes stable that may change, but for now upgrades are mandatory.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This wasn&#39;t too big of a struggle, mostly moving away from newly depreciated functions, and an small amount of refactoring. I took this as an opportunity to clean up some earlier code I wrote while I was newly learning Bevy, namely swapping out &lt;code&gt;Queries&lt;/code&gt; for &lt;code&gt;Single&lt;/code&gt; where I could. This let me delete a lot of &lt;code&gt;if let Some(x) =&lt;/code&gt; style code removing a lot of nesting which is nice.&lt;/p&gt;
&lt;p&gt;I had a few dependencies that hadn&#39;t updated yet, so I used either their 0.16 PR branches directly or release candidates where available.&lt;/p&gt;
&lt;h2 id=&quot;menus-accessibility&quot;&gt;Menus &amp;amp; Accessibility&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-05-03/build_menu.webp&quot; alt=&quot;Animated Image Showing the build menu&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The other big project this week was the new complete-ish build menu.&lt;/p&gt;
&lt;p&gt;I waited till after 0.16 because I wanted to use the accessibility/focus feature. This menu is the first in the game to use it. I strongly believe that accessibility is best practice. Building in accessibility helps everyone no matter what. This includes developers. By doing this I make it trivial to add gamepad support. After all from the perspective of code, a gamepad, and specialized accessibility hardware/software are basically the same thing.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This week, I didn&#39;t do as much as I wanted to in terms of quality, but I am happy with what I did do. That and sustainability is important to me. Burnout is something to be avoided.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Building Menus, Gamepads, and Change</title>
          <pubDate>Sat, 26 Apr 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-04-26/</link>
          <guid>https://exofactory.net/blog/2025-04-26/</guid>
          <description xml:base="https://exofactory.net/blog/2025-04-26/">&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;This week started with a nearly completely different set of goals than the week ended with. Things changed when &lt;a rel=&quot;external&quot; href=&quot;https://www.twitch.tv/pokinsson&quot;&gt;Pokinsson
&lt;/a&gt; made a call for indie game submissions, in any state, finished or not. After thinking about it, I thought I would give it a shot. In essence, that basically means that I have until April 7th to polish what I have and produce a playable technical preview.&lt;/p&gt;
&lt;p&gt;As a result, I paused work on the half-baked gamepad support and started working toward that goal. This leaves a bunch of half-functioning gamepad code, but that&#39;s a problem for future me.&lt;/p&gt;
&lt;p&gt;That being said, progress was made.&lt;/p&gt;
&lt;h2 id=&quot;half-baked-gamepad-support&quot;&gt;Half-Baked Gamepad Support&lt;/h2&gt;
&lt;p&gt;During the first half of the week, before I knew about the call for games, this was the primary area of focus. I am using &lt;a rel=&quot;external&quot; href=&quot;https://thoseawesomeguys.com/prompts/&quot;&gt;Xelu&#39;s excellent button-prompt images&lt;/a&gt;; I strongly recommend them.&lt;/p&gt;
&lt;p&gt;I added a lot of mappings and controller-management code, so now, going forward, I can do something like:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;let&lt;/span&gt;&lt;span&gt; focus_on_exoframe&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; Handle&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;Image&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span&gt; smart_prompt_collection&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span&gt;focus_on_exoframe&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;clone&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The result will always be the correct prompt image regardless of whether you are using the Steam Deck, an Xbox One controller, or a keyboard and mouse.&lt;/p&gt;
&lt;p&gt;I didn&#39;t get any further than this, but I do have a list of supported devices/control schemes. I plan on supporting:&lt;/p&gt;
&lt;p&gt;The Steam Deck with built-in controllers, a keyboard and mouse, or an Xbox One controller.&lt;/p&gt;
&lt;p&gt;Modern (Debian 11 or newer) Linux with a keyboard and mouse or an Xbox One controller.&lt;/p&gt;
&lt;p&gt;Windows 10/11 with a keyboard and mouse or an Xbox One controller.&lt;/p&gt;
&lt;p&gt;Other systems or controllers should work but won&#39;t be tested. For more information on what may or may not work, see &lt;a rel=&quot;external&quot; href=&quot;https://gitlab.com/gilrs-project/gilrs&quot;&gt;gilrs&lt;/a&gt;, the underlying library I am using via Bevy.&lt;/p&gt;
&lt;h2 id=&quot;control-guide&quot;&gt;Control Guide&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-04-26/control_guide.webp&quot; alt=&quot;animation showing the control guide&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I also added a &quot;control guide&quot; panel. This panel shows you exactly what you can do at any given moment and self-updates as you play the game. Of course, you can always hide it if it gets in your way.&lt;/p&gt;
&lt;p&gt;This is great for the technical preview and for the game in general.&lt;/p&gt;
&lt;h2 id=&quot;building-interface&quot;&gt;Building Interface&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-04-26/building_interface.webp&quot; alt=&quot;animation showing the building interface&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Last but not least, I added a core new feature to the game: an in-game building can now produce a thing!&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Overall, it was a stressful week, and I don&#39;t want to normalize this work pace (especially with my other obligations), but a lot got done, and the preview build should come together.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>UI Foundations Laid</title>
          <pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-04-19/</link>
          <guid>https://exofactory.net/blog/2025-04-19/</guid>
          <description xml:base="https://exofactory.net/blog/2025-04-19/">&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;This week was primarily focused on adding basic UI elements, working on Exoframe movement, and adding initial game sounds.&lt;/p&gt;
&lt;p&gt;For now I am using VERY basic art assets while I focus on core game mechanics, so be prepared for some crappy looking art that definitively proves that I am not an artist.&lt;/p&gt;
&lt;p&gt;Overall this week was not too bad in terms of the timeline.&lt;/p&gt;
&lt;h2 id=&quot;fleshing-out-the-ui&quot;&gt;Fleshing Out The UI&lt;/h2&gt;
&lt;p&gt;Exofactory is being written in &lt;a rel=&quot;external&quot; href=&quot;https://bevyengine.org&quot;&gt;Bevy&lt;/a&gt;, and while it has been quite enjoyable overall I must say that the UI developer experience is absolutely not fun. &lt;a rel=&quot;external&quot; href=&quot;https://github.com/bevyengine/bevy/discussions/14437&quot;&gt;Future Bevy&lt;/a&gt; is supposed to address this, and for the sake of Rust game devs everywhere I hope they do. While the UI for the main menu and settings are in a good spot the core game itself till this week has seen no work.&lt;/p&gt;
&lt;p&gt;This week, that changed with the addition of the main top bar. This bar is intended to be the goto place that players use to get a sense of what “mode” they are in what is going on a global level.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-04-19/ui_sample.webp&quot; alt=&quot;screenshot of the game showing the UI&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Secondly this week I laid down the framework for building detail/setting windows. This enables me to quickly iterate and reduce the amount of UI work as new buildings are introduced. For now all clicking on a building does is bring up some basic info as shown above.&lt;/p&gt;
&lt;p&gt;Overall happy with things here.&lt;/p&gt;
&lt;h2 id=&quot;experiment-with-sound&quot;&gt;Experiment With Sound&lt;/h2&gt;
&lt;p&gt;As a break from all the UI work I added some basic sounds to the game. After a bit of recording and tinkering in &lt;a rel=&quot;external&quot; href=&quot;https://tenacityaudio.org&quot;&gt;Tenacity&lt;/a&gt; I have a few sounds I am happy with. For example the menu mouse over I find quite nice.&lt;/p&gt;
&lt;audio controls&gt;
  &lt;source src=&quot;/media/2025-04-19/mouse_over.webm&quot; type=&quot;audio/webm&quot;&gt;
  Your browser does not support the audio element.
&lt;/audio&gt;
&lt;p&gt;I still need to add a sound section to the settings menu, but that can wait for now.&lt;/p&gt;
&lt;h2 id=&quot;exoframe-motion&quot;&gt;Exoframe Motion&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/2025-04-19/movement.webp&quot; alt=&quot;screenshot of the game showing the UI&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Lastly I added exofame motion. It’s very snappy and satisfying to say the least. The motion and physics system in general is handled by the excellent rapier library.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Bottom line, I am happy with this week. I aim to release weekly dev blogs and monthly video blogs, so keep an eye out.&lt;/p&gt;
</description>
      </item>
    </channel>
</rss>
