Merge main into nations-ai

This commit is contained in:
Scott Anderson
2025-04-04 20:41:22 -04:00
44 changed files with 360 additions and 138 deletions
+10
View File
@@ -121,6 +121,16 @@ Contributions are welcome! Please feel free to submit a Pull Request.
4. Push to the branch (`git push origin amazing-feature`)
5. Open a Pull Request
## 🌐 Translation
Translators are welcome! Please feel free to help translate into your language.
How to help?
1. Go to the project's Crowdin translation page: [https://crowdin.com/project/openfrontio](https://crowdin.com/project/openfrontio)
2. Login if you already have an account/ Sign up if you don't have one
3. Select the language you want to translate in/ If your language isn't on the list, create a new topic in "Discussions" about adding the language
4. Translate the strings
### Project Governance
- The project maintainer ([evan](https://github.com/evanpelle)) has final authority on all code changes and design decisions
+112
View File
@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="150px" height="75px" viewBox="0 0 150 75" version="1.1">
<g id="surface1">
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(23.529412%,23.137255%,43.137255%);fill-opacity:1;" d="M -0.0585938 -0.0585938 C 18.941406 -0.0585938 37.941406 -0.0585938 56.941406 -0.0585938 C 56.941406 1.867188 56.941406 3.789062 56.941406 5.710938 C 56.941406 7.632812 56.941406 9.558594 56.941406 11.480469 C 56.941406 13.402344 56.941406 15.328125 56.941406 17.25 C 56.941406 19.171875 56.941406 21.097656 56.941406 23.019531 C 56.941406 24.941406 56.941406 26.867188 56.941406 28.789062 C 56.941406 30.710938 56.941406 32.632812 56.941406 34.558594 C 56.941406 36.480469 56.941406 38.402344 56.941406 40.328125 C 37.941406 40.328125 18.941406 40.328125 -0.0585938 40.328125 C -0.0585938 26.867188 -0.0585938 13.402344 -0.0585938 -0.0585938 Z M -0.0585938 -0.0585938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(69.411767%,13.333334%,20.392157%);fill-opacity:1;" d="M 56.941406 -0.0585938 C 87.902344 -0.0585938 118.867188 -0.0585938 149.828125 -0.0585938 C 146.082031 1.871094 142.3125 3.777344 138.519531 5.652344 C 111.328125 5.710938 84.132812 5.730469 56.941406 5.710938 C 56.941406 3.789062 56.941406 1.867188 56.941406 -0.0585938 Z M 56.941406 -0.0585938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 149.828125 -0.0585938 C 149.863281 -0.0585938 149.902344 -0.0585938 149.941406 -0.0585938 C 149.941406 2.75 149.941406 5.558594 149.941406 8.367188 C 138.964844 13.796875 128.003906 19.257812 117.058594 24.75 C 116.945312 24.804688 116.832031 24.863281 116.710938 24.921875 C 127.789062 24.980469 138.867188 25 149.941406 24.980469 C 149.941406 26.632812 149.941406 28.289062 149.941406 29.941406 C 129.902344 29.921875 109.867188 29.941406 89.828125 30 C 86.785156 31.519531 83.746094 33.039062 80.710938 34.558594 C 72.789062 34.558594 64.867188 34.558594 56.941406 34.558594 C 56.941406 32.632812 56.941406 30.710938 56.941406 28.789062 C 68.710938 28.808594 80.480469 28.789062 92.25 28.730469 C 96.042969 26.816406 99.851562 24.929688 103.671875 23.078125 C 88.097656 23.019531 72.519531 23 56.941406 23.019531 C 56.941406 21.097656 56.941406 19.171875 56.941406 17.25 C 76.441406 17.269531 95.941406 17.25 115.441406 17.191406 C 119.210938 15.308594 122.980469 13.421875 126.75 11.539062 C 103.480469 11.480469 80.210938 11.460938 56.941406 11.480469 C 56.941406 9.558594 56.941406 7.632812 56.941406 5.710938 C 84.132812 5.730469 111.328125 5.710938 138.519531 5.652344 C 142.3125 3.777344 146.082031 1.871094 149.828125 -0.0585938 Z M 149.828125 -0.0585938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.078432%,97.254902%);fill-opacity:1;" d="M 5.25 3.058594 C 5.71875 3.246094 6.21875 3.363281 6.75 3.402344 C 6.367188 3.636719 6.019531 3.925781 5.710938 4.269531 C 5.921875 4.78125 6.054688 5.300781 6.117188 5.828125 C 5.722656 5.472656 5.300781 5.164062 4.847656 4.902344 C 4.394531 5.101562 3.992188 5.371094 3.632812 5.710938 C 3.609375 5.21875 3.726562 4.738281 3.980469 4.269531 C 3.617188 3.953125 3.230469 3.664062 2.828125 3.402344 C 3.328125 3.328125 3.828125 3.25 4.328125 3.171875 C 4.625 1.289062 4.929688 1.25 5.25 3.058594 Z M 5.25 3.058594 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.470588%,97.647059%);fill-opacity:1;" d="M 14.828125 3.171875 C 15.289062 3.25 15.75 3.328125 16.210938 3.402344 C 15.792969 3.632812 15.449219 3.9375 15.171875 4.328125 C 15.355469 4.777344 15.453125 5.238281 15.460938 5.710938 C 15.109375 5.394531 14.722656 5.125 14.308594 4.902344 C 13.847656 5.113281 13.425781 5.382812 13.039062 5.710938 C 13.164062 5.183594 13.238281 4.644531 13.269531 4.097656 C 12.957031 3.839844 12.628906 3.609375 12.289062 3.402344 C 12.789062 3.328125 13.289062 3.25 13.789062 3.171875 C 13.882812 2.644531 14.054688 2.144531 14.308594 1.671875 C 14.472656 2.191406 14.644531 2.691406 14.828125 3.171875 Z M 14.828125 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 43.097656 3.171875 C 43.597656 3.25 44.097656 3.328125 44.597656 3.402344 C 44.253906 3.609375 43.929688 3.839844 43.617188 4.097656 C 43.644531 4.644531 43.722656 5.183594 43.847656 5.710938 C 43.46875 5.398438 43.0625 5.128906 42.632812 4.902344 C 42.1875 5.101562 41.78125 5.371094 41.421875 5.710938 C 41.5 5.171875 41.578125 4.632812 41.652344 4.097656 C 41.3125 3.878906 40.988281 3.648438 40.671875 3.402344 C 41.132812 3.328125 41.597656 3.25 42.058594 3.171875 C 42.214844 2.71875 42.390625 2.257812 42.578125 1.789062 C 42.851562 2.210938 43.023438 2.671875 43.097656 3.171875 Z M 43.097656 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 52.558594 3.171875 C 53.058594 3.25 53.558594 3.328125 54.058594 3.402344 C 53.65625 3.664062 53.269531 3.953125 52.902344 4.269531 C 53.136719 4.730469 53.269531 5.210938 53.308594 5.710938 C 52.921875 5.382812 52.5 5.113281 52.039062 4.902344 C 51.585938 5.164062 51.160156 5.472656 50.769531 5.828125 C 50.828125 5.300781 50.964844 4.78125 51.171875 4.269531 C 50.871094 3.925781 50.523438 3.636719 50.132812 3.402344 C 50.664062 3.363281 51.164062 3.246094 51.632812 3.058594 C 51.953125 1.25 52.261719 1.289062 52.558594 3.171875 Z M 52.558594 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 24.289062 3.171875 C 24.75 3.25 25.210938 3.328125 25.671875 3.402344 C 25.359375 3.648438 25.03125 3.878906 24.691406 4.097656 C 24.769531 4.632812 24.847656 5.171875 24.921875 5.710938 C 24.5625 5.371094 24.160156 5.101562 23.710938 4.902344 C 23.28125 5.128906 22.878906 5.398438 22.5 5.710938 C 22.578125 5.171875 22.652344 4.632812 22.730469 4.097656 C 22.417969 3.839844 22.089844 3.609375 21.75 3.402344 C 22.210938 3.328125 22.671875 3.25 23.132812 3.171875 C 23.347656 2.691406 23.539062 2.191406 23.710938 1.671875 C 23.921875 2.179688 24.113281 2.679688 24.289062 3.171875 Z M 24.289062 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 33.632812 3.171875 C 34.132812 3.25 34.632812 3.328125 35.132812 3.402344 C 34.792969 3.609375 34.46875 3.839844 34.152344 4.097656 C 34.230469 4.632812 34.308594 5.171875 34.382812 5.710938 C 34.007812 5.398438 33.601562 5.128906 33.171875 4.902344 C 32.742188 5.128906 32.339844 5.398438 31.960938 5.710938 C 32.039062 5.171875 32.117188 4.632812 32.191406 4.097656 C 31.878906 3.839844 31.550781 3.609375 31.210938 3.402344 C 31.671875 3.328125 32.132812 3.25 32.597656 3.171875 C 32.753906 2.707031 32.945312 2.246094 33.171875 1.789062 C 33.394531 2.226562 33.550781 2.6875 33.632812 3.171875 Z M 33.632812 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(68.235296%,68.235296%,76.47059%);fill-opacity:1;" d="M 4.328125 3.171875 C 3.828125 3.25 3.328125 3.328125 2.828125 3.402344 C 2.765625 3.398438 2.726562 3.359375 2.710938 3.289062 C 3.246094 3.175781 3.78125 3.136719 4.328125 3.171875 Z M 4.328125 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(70.588237%,70.588237%,78.039217%);fill-opacity:1;" d="M 5.25 3.058594 C 5.816406 3.148438 6.394531 3.207031 6.980469 3.230469 C 6.917969 3.3125 6.839844 3.371094 6.75 3.402344 C 6.21875 3.363281 5.71875 3.246094 5.25 3.058594 Z M 5.25 3.058594 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(67.450982%,67.450982%,75.686276%);fill-opacity:1;" d="M 13.789062 3.171875 C 13.289062 3.25 12.789062 3.328125 12.289062 3.402344 C 12.199219 3.371094 12.121094 3.3125 12.058594 3.230469 C 12.632812 3.171875 13.210938 3.152344 13.789062 3.171875 Z M 13.789062 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(69.01961%,69.01961%,76.862746%);fill-opacity:1;" d="M 14.828125 3.171875 C 15.367188 3.152344 15.90625 3.171875 16.441406 3.230469 C 16.378906 3.3125 16.300781 3.371094 16.210938 3.402344 C 15.75 3.328125 15.289062 3.25 14.828125 3.171875 Z M 14.828125 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(67.450982%,67.058825%,75.686276%);fill-opacity:1;" d="M 23.132812 3.171875 C 22.671875 3.25 22.210938 3.328125 21.75 3.402344 C 21.660156 3.371094 21.582031 3.3125 21.519531 3.230469 C 22.054688 3.171875 22.59375 3.152344 23.132812 3.171875 Z M 23.132812 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(68.235296%,68.235296%,76.47059%);fill-opacity:1;" d="M 24.289062 3.171875 C 24.828125 3.152344 25.367188 3.171875 25.902344 3.230469 C 25.839844 3.3125 25.765625 3.371094 25.671875 3.402344 C 25.210938 3.328125 24.75 3.25 24.289062 3.171875 Z M 24.289062 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(67.843139%,67.843139%,76.078433%);fill-opacity:1;" d="M 32.597656 3.171875 C 32.132812 3.25 31.671875 3.328125 31.210938 3.402344 C 31.121094 3.371094 31.042969 3.3125 30.980469 3.230469 C 31.519531 3.171875 32.054688 3.152344 32.597656 3.171875 Z M 32.597656 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(68.627453%,68.235296%,76.47059%);fill-opacity:1;" d="M 33.632812 3.171875 C 34.210938 3.152344 34.789062 3.171875 35.367188 3.230469 C 35.300781 3.3125 35.226562 3.371094 35.132812 3.402344 C 34.632812 3.328125 34.132812 3.25 33.632812 3.171875 Z M 33.632812 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(68.627453%,68.627453%,76.862746%);fill-opacity:1;" d="M 42.058594 3.171875 C 41.597656 3.25 41.132812 3.328125 40.671875 3.402344 C 40.582031 3.371094 40.503906 3.3125 40.441406 3.230469 C 40.980469 3.171875 41.519531 3.152344 42.058594 3.171875 Z M 42.058594 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(67.843139%,67.843139%,76.078433%);fill-opacity:1;" d="M 43.097656 3.171875 C 43.675781 3.152344 44.25 3.171875 44.828125 3.230469 C 44.765625 3.3125 44.6875 3.371094 44.597656 3.402344 C 44.097656 3.328125 43.597656 3.25 43.097656 3.171875 Z M 43.097656 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(70.588237%,70.588237%,78.039217%);fill-opacity:1;" d="M 51.632812 3.058594 C 51.164062 3.246094 50.664062 3.363281 50.132812 3.402344 C 50.042969 3.371094 49.964844 3.3125 49.902344 3.230469 C 50.488281 3.207031 51.066406 3.148438 51.632812 3.058594 Z M 51.632812 3.058594 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(68.627453%,68.627453%,76.47059%);fill-opacity:1;" d="M 52.558594 3.171875 C 53.101562 3.136719 53.640625 3.175781 54.171875 3.289062 C 54.160156 3.359375 54.121094 3.398438 54.058594 3.402344 C 53.558594 3.328125 53.058594 3.25 52.558594 3.171875 Z M 52.558594 3.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(95.686275%,95.294118%,96.470588%);fill-opacity:1;" d="M 7.558594 7.441406 C 8.058594 7.367188 8.558594 7.289062 9.058594 7.210938 C 9.152344 6.679688 9.324219 6.179688 9.578125 5.710938 C 9.769531 6.199219 9.90625 6.699219 9.980469 7.210938 C 10.558594 7.191406 11.136719 7.210938 11.710938 7.269531 C 11.234375 7.582031 10.8125 7.949219 10.441406 8.367188 C 10.625 8.816406 10.722656 9.277344 10.730469 9.75 C 10.375 9.433594 9.992188 9.164062 9.578125 8.941406 C 9.160156 9.1875 8.753906 9.457031 8.367188 9.75 C 8.34375 9.253906 8.457031 8.773438 8.710938 8.308594 C 8.339844 7.996094 7.957031 7.707031 7.558594 7.441406 Z M 7.558594 7.441406 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(95.686275%,95.294118%,96.470588%);fill-opacity:1;" d="M 17.019531 7.441406 C 17.519531 7.367188 18.019531 7.289062 18.519531 7.210938 C 18.613281 6.679688 18.785156 6.179688 19.039062 5.710938 C 19.226562 6.199219 19.363281 6.699219 19.441406 7.210938 C 20.019531 7.191406 20.597656 7.210938 21.171875 7.269531 C 20.699219 7.582031 20.273438 7.949219 19.902344 8.367188 C 20.085938 8.816406 20.183594 9.277344 20.191406 9.75 C 19.824219 9.453125 19.441406 9.183594 19.039062 8.941406 C 18.578125 9.152344 18.15625 9.421875 17.769531 9.75 C 17.882812 9.21875 17.960938 8.679688 18 8.132812 C 17.6875 7.878906 17.359375 7.648438 17.019531 7.441406 Z M 17.019531 7.441406 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(95.686275%,95.686275%,96.862745%);fill-opacity:1;" d="M 47.828125 7.210938 C 48.328125 7.289062 48.828125 7.367188 49.328125 7.441406 C 48.929688 7.707031 48.542969 7.996094 48.171875 8.308594 C 48.402344 8.769531 48.539062 9.25 48.578125 9.75 C 48.191406 9.421875 47.769531 9.152344 47.308594 8.941406 C 46.855469 9.203125 46.429688 9.511719 46.039062 9.867188 C 46.132812 9.367188 46.269531 8.867188 46.441406 8.367188 C 46.070312 7.949219 45.648438 7.582031 45.171875 7.269531 C 45.75 7.210938 46.324219 7.191406 46.902344 7.210938 C 46.980469 6.699219 47.113281 6.199219 47.308594 5.710938 C 47.558594 6.179688 47.734375 6.679688 47.828125 7.210938 Z M 47.828125 7.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.647059%);fill-opacity:1;" d="M 29.019531 7.210938 C 29.480469 7.289062 29.941406 7.367188 30.402344 7.441406 C 29.988281 7.671875 29.640625 7.976562 29.367188 8.367188 C 29.546875 8.816406 29.644531 9.277344 29.652344 9.75 C 29.289062 9.453125 28.902344 9.183594 28.5 8.941406 C 28.039062 9.152344 27.617188 9.421875 27.230469 9.75 C 27.308594 9.210938 27.382812 8.671875 27.460938 8.132812 C 27.121094 7.917969 26.792969 7.6875 26.480469 7.441406 C 26.941406 7.367188 27.402344 7.289062 27.867188 7.210938 C 28.054688 6.761719 28.246094 6.300781 28.441406 5.828125 C 28.636719 6.300781 28.828125 6.761719 29.019531 7.210938 Z M 29.019531 7.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.647059%);fill-opacity:1;" d="M 38.367188 7.210938 C 38.867188 7.289062 39.367188 7.367188 39.867188 7.441406 C 39.550781 7.6875 39.226562 7.917969 38.882812 8.132812 C 38.914062 8.683594 38.992188 9.222656 39.117188 9.75 C 38.730469 9.421875 38.304688 9.152344 37.847656 8.941406 C 37.441406 9.183594 37.058594 9.453125 36.691406 9.75 C 36.703125 9.277344 36.796875 8.816406 36.980469 8.367188 C 36.707031 7.976562 36.359375 7.671875 35.941406 7.441406 C 36.402344 7.367188 36.867188 7.289062 37.328125 7.210938 C 37.472656 6.742188 37.664062 6.277344 37.902344 5.828125 C 38.128906 6.265625 38.28125 6.726562 38.367188 7.210938 Z M 38.367188 7.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(58.431375%,58.039218%,69.01961%);fill-opacity:1;" d="M 9.058594 7.210938 C 8.558594 7.289062 8.058594 7.367188 7.558594 7.441406 C 7.464844 7.410156 7.390625 7.351562 7.328125 7.269531 C 7.902344 7.210938 8.480469 7.191406 9.058594 7.210938 Z M 9.058594 7.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(59.215689%,58.823532%,69.803923%);fill-opacity:1;" d="M 18.519531 7.210938 C 18.019531 7.289062 17.519531 7.367188 17.019531 7.441406 C 16.929688 7.410156 16.851562 7.351562 16.789062 7.269531 C 17.363281 7.210938 17.941406 7.191406 18.519531 7.210938 Z M 18.519531 7.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(58.823532%,58.431375%,69.411767%);fill-opacity:1;" d="M 27.867188 7.210938 C 27.402344 7.289062 26.941406 7.367188 26.480469 7.441406 C 26.390625 7.410156 26.3125 7.351562 26.25 7.269531 C 26.789062 7.210938 27.324219 7.191406 27.867188 7.210938 Z M 27.867188 7.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(59.215689%,58.823532%,69.803923%);fill-opacity:1;" d="M 29.019531 7.210938 C 29.558594 7.191406 30.097656 7.210938 30.632812 7.269531 C 30.570312 7.351562 30.496094 7.410156 30.402344 7.441406 C 29.941406 7.367188 29.480469 7.289062 29.019531 7.210938 Z M 29.019531 7.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(59.607846%,59.215689%,70.19608%);fill-opacity:1;" d="M 37.328125 7.210938 C 36.867188 7.289062 36.402344 7.367188 35.941406 7.441406 C 35.851562 7.410156 35.773438 7.351562 35.710938 7.269531 C 36.25 7.210938 36.785156 7.191406 37.328125 7.210938 Z M 37.328125 7.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(59.607846%,59.215689%,69.803923%);fill-opacity:1;" d="M 38.367188 7.210938 C 38.945312 7.191406 39.519531 7.210938 40.097656 7.269531 C 40.035156 7.351562 39.957031 7.410156 39.867188 7.441406 C 39.367188 7.367188 38.867188 7.289062 38.367188 7.210938 Z M 38.367188 7.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(58.823532%,58.431375%,69.411767%);fill-opacity:1;" d="M 47.828125 7.210938 C 48.40625 7.191406 48.980469 7.210938 49.558594 7.269531 C 49.496094 7.351562 49.417969 7.410156 49.328125 7.441406 C 48.828125 7.367188 48.328125 7.289062 47.828125 7.210938 Z M 47.828125 7.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(0.392157%,14.117648%,49.019608%);fill-opacity:1;" d="M 149.941406 8.367188 C 149.941406 13.867188 149.941406 19.367188 149.941406 24.867188 C 138.960938 24.902344 128 24.867188 117.058594 24.75 C 128.003906 19.257812 138.964844 13.796875 149.941406 8.367188 Z M 149.941406 8.367188 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 5.367188 11.25 C 5.867188 11.328125 6.367188 11.402344 6.867188 11.480469 C 6.410156 11.726562 6.023438 12.054688 5.710938 12.460938 C 5.898438 12.941406 6.03125 13.421875 6.117188 13.902344 C 5.722656 13.550781 5.300781 13.242188 4.847656 12.980469 C 4.429688 13.226562 4.023438 13.496094 3.632812 13.789062 C 3.613281 13.292969 3.726562 12.8125 3.980469 12.347656 C 3.609375 12.03125 3.226562 11.746094 2.828125 11.480469 C 3.328125 11.402344 3.828125 11.328125 4.328125 11.25 C 4.464844 10.734375 4.640625 10.234375 4.847656 9.75 C 5.011719 10.265625 5.183594 10.765625 5.367188 11.25 Z M 5.367188 11.25 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 12.289062 11.480469 C 12.789062 11.402344 13.289062 11.328125 13.789062 11.25 C 13.882812 10.71875 14.054688 10.21875 14.308594 9.75 C 14.480469 10.273438 14.65625 10.792969 14.828125 11.308594 C 15.328125 11.347656 15.828125 11.382812 16.328125 11.421875 C 15.910156 11.726562 15.527344 12.050781 15.171875 12.402344 C 15.355469 12.855469 15.453125 13.316406 15.460938 13.789062 C 15.09375 13.488281 14.710938 13.222656 14.308594 12.980469 C 13.890625 13.226562 13.484375 13.496094 13.097656 13.789062 C 13.074219 13.292969 13.1875 12.8125 13.441406 12.347656 C 13.070312 12.03125 12.6875 11.746094 12.289062 11.480469 Z M 12.289062 11.480469 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 43.097656 11.25 C 43.597656 11.328125 44.097656 11.402344 44.597656 11.480469 C 44.199219 11.746094 43.8125 12.03125 43.441406 12.347656 C 43.671875 12.808594 43.808594 13.289062 43.847656 13.789062 C 43.421875 13.515625 43 13.25 42.578125 12.980469 C 42.175781 13.222656 41.789062 13.488281 41.421875 13.789062 C 41.433594 13.316406 41.527344 12.855469 41.710938 12.402344 C 41.402344 11.996094 41.015625 11.671875 40.558594 11.421875 C 41.058594 11.382812 41.558594 11.347656 42.058594 11.308594 C 42.207031 10.820312 42.378906 10.339844 42.578125 9.867188 C 42.851562 10.285156 43.023438 10.75 43.097656 11.25 Z M 43.097656 11.25 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 52.558594 11.25 C 53.058594 11.328125 53.558594 11.402344 54.058594 11.480469 C 53.660156 11.746094 53.273438 12.03125 52.902344 12.347656 C 53.15625 12.8125 53.273438 13.292969 53.25 13.789062 C 52.859375 13.496094 52.457031 13.226562 52.039062 12.980469 C 51.585938 13.242188 51.160156 13.550781 50.769531 13.902344 C 50.863281 13.40625 51 12.90625 51.171875 12.402344 C 50.835938 12.042969 50.453125 11.734375 50.019531 11.480469 C 50.519531 11.402344 51.019531 11.328125 51.519531 11.25 C 51.699219 10.765625 51.871094 10.265625 52.039062 9.75 C 52.246094 10.234375 52.417969 10.734375 52.558594 11.25 Z M 52.558594 11.25 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.470588%,97.647059%);fill-opacity:1;" d="M 21.75 11.480469 C 22.25 11.402344 22.75 11.328125 23.25 11.25 C 23.335938 10.765625 23.488281 10.304688 23.710938 9.867188 C 23.914062 10.34375 24.109375 10.824219 24.289062 11.308594 C 24.789062 11.347656 25.289062 11.382812 25.789062 11.421875 C 25.332031 11.671875 24.945312 11.996094 24.632812 12.402344 C 24.816406 12.855469 24.914062 13.316406 24.921875 13.789062 C 24.550781 13.476562 24.144531 13.207031 23.710938 12.980469 C 23.328125 13.25 22.941406 13.519531 22.558594 13.789062 C 22.519531 13.730469 22.480469 13.671875 22.441406 13.617188 C 22.585938 13.21875 22.699219 12.816406 22.789062 12.402344 C 22.511719 12.015625 22.167969 11.707031 21.75 11.480469 Z M 21.75 11.480469 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 33.058594 9.867188 C 33.402344 10.285156 33.59375 10.785156 33.632812 11.367188 C 34.175781 11.347656 34.710938 11.367188 35.25 11.421875 C 34.792969 11.671875 34.40625 11.996094 34.097656 12.402344 C 34.230469 12.867188 34.328125 13.328125 34.382812 13.789062 C 34.011719 13.476562 33.605469 13.207031 33.171875 12.980469 C 32.738281 13.207031 32.335938 13.476562 31.960938 13.789062 C 31.96875 13.316406 32.066406 12.855469 32.25 12.402344 C 31.9375 11.996094 31.554688 11.671875 31.097656 11.421875 C 31.597656 11.382812 32.097656 11.347656 32.597656 11.308594 C 32.808594 10.847656 32.960938 10.363281 33.058594 9.867188 Z M 33.058594 9.867188 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(54.11765%,53.725493%,65.882355%);fill-opacity:1;" d="M 4.328125 11.25 C 3.828125 11.328125 3.328125 11.402344 2.828125 11.480469 C 2.734375 11.449219 2.660156 11.390625 2.597656 11.308594 C 3.171875 11.25 3.75 11.230469 4.328125 11.25 Z M 4.328125 11.25 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(52.941179%,52.549022%,65.098041%);fill-opacity:1;" d="M 5.367188 11.25 C 5.910156 11.210938 6.449219 11.25 6.980469 11.367188 C 6.964844 11.433594 6.929688 11.472656 6.867188 11.480469 C 6.367188 11.402344 5.867188 11.328125 5.367188 11.25 Z M 5.367188 11.25 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(54.901963%,54.509807%,66.274512%);fill-opacity:1;" d="M 13.789062 11.25 C 13.289062 11.328125 12.789062 11.402344 12.289062 11.480469 C 12.199219 11.449219 12.121094 11.390625 12.058594 11.308594 C 12.632812 11.25 13.210938 11.230469 13.789062 11.25 Z M 13.789062 11.25 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(55.686277%,55.29412%,67.058825%);fill-opacity:1;" d="M 23.25 11.25 C 22.75 11.328125 22.25 11.402344 21.75 11.480469 C 21.660156 11.449219 21.582031 11.390625 21.519531 11.308594 C 22.09375 11.25 22.671875 11.230469 23.25 11.25 Z M 23.25 11.25 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(55.29412%,54.901963%,66.666669%);fill-opacity:1;" d="M 43.097656 11.25 C 43.675781 11.230469 44.25 11.25 44.828125 11.308594 C 44.765625 11.390625 44.6875 11.449219 44.597656 11.480469 C 44.097656 11.402344 43.597656 11.328125 43.097656 11.25 Z M 43.097656 11.25 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(52.941179%,52.549022%,65.098041%);fill-opacity:1;" d="M 51.519531 11.25 C 51.019531 11.328125 50.519531 11.402344 50.019531 11.480469 C 49.957031 11.472656 49.917969 11.433594 49.902344 11.367188 C 50.4375 11.25 50.976562 11.210938 51.519531 11.25 Z M 51.519531 11.25 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(54.509807%,54.11765%,65.882355%);fill-opacity:1;" d="M 52.558594 11.25 C 53.136719 11.230469 53.710938 11.25 54.289062 11.308594 C 54.226562 11.390625 54.148438 11.449219 54.058594 11.480469 C 53.558594 11.402344 53.058594 11.328125 52.558594 11.25 Z M 52.558594 11.25 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(69.411767%,13.333334%,20.392157%);fill-opacity:1;" d="M 56.941406 11.480469 C 80.210938 11.460938 103.480469 11.480469 126.75 11.539062 C 122.980469 13.421875 119.210938 15.308594 115.441406 17.191406 C 95.941406 17.25 76.441406 17.269531 56.941406 17.25 C 56.941406 15.328125 56.941406 13.402344 56.941406 11.480469 Z M 56.941406 11.480469 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 10.097656 15.289062 C 10.597656 15.367188 11.097656 15.441406 11.597656 15.519531 C 11.140625 15.765625 10.753906 16.09375 10.441406 16.5 C 10.628906 16.980469 10.761719 17.460938 10.847656 17.941406 C 10.453125 17.589844 10.03125 17.28125 9.578125 17.019531 C 9.105469 17.285156 8.664062 17.589844 8.25 17.941406 C 8.308594 17.433594 8.464844 16.914062 8.710938 16.382812 C 8.308594 16.046875 7.886719 15.742188 7.441406 15.460938 C 7.980469 15.402344 8.519531 15.382812 9.058594 15.402344 C 9.160156 14.839844 9.332031 14.300781 9.578125 13.789062 C 9.742188 14.304688 9.914062 14.804688 10.097656 15.289062 Z M 10.097656 15.289062 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 45.289062 15.519531 C 45.789062 15.441406 46.289062 15.367188 46.789062 15.289062 C 46.96875 14.804688 47.140625 14.304688 47.308594 13.789062 C 47.550781 14.300781 47.722656 14.839844 47.828125 15.402344 C 48.367188 15.382812 48.90625 15.402344 49.441406 15.460938 C 49 15.742188 48.574219 16.046875 48.171875 16.382812 C 48.425781 16.851562 48.542969 17.332031 48.519531 17.828125 C 48.132812 17.558594 47.75 17.289062 47.367188 17.019531 C 46.875 17.257812 46.433594 17.566406 46.039062 17.941406 C 46.121094 17.460938 46.257812 16.980469 46.441406 16.5 C 46.128906 16.09375 45.746094 15.765625 45.289062 15.519531 Z M 45.289062 15.519531 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 18.867188 13.902344 C 18.980469 13.898438 19.058594 13.957031 19.097656 14.078125 C 19.226562 14.511719 19.382812 14.933594 19.558594 15.347656 C 20.058594 15.382812 20.558594 15.421875 21.058594 15.460938 C 20.691406 15.75 20.328125 16.039062 19.960938 16.328125 C 20.0625 16.820312 20.140625 17.320312 20.191406 17.828125 C 19.816406 17.515625 19.414062 17.246094 18.980469 17.019531 C 18.597656 17.289062 18.210938 17.558594 17.828125 17.828125 C 17.789062 17.769531 17.75 17.710938 17.710938 17.652344 C 17.953125 17.1875 18.03125 16.707031 17.941406 16.210938 C 17.597656 15.960938 17.25 15.710938 16.902344 15.460938 C 17.441406 15.402344 17.980469 15.382812 18.519531 15.402344 C 18.609375 14.898438 18.726562 14.398438 18.867188 13.902344 Z M 18.867188 13.902344 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 28.902344 15.289062 C 29.441406 15.367188 29.980469 15.441406 30.519531 15.519531 C 30.085938 15.773438 29.703125 16.082031 29.367188 16.441406 C 29.535156 16.894531 29.632812 17.359375 29.652344 17.828125 C 29.238281 17.570312 28.835938 17.300781 28.441406 17.019531 C 28.058594 17.289062 27.671875 17.558594 27.289062 17.828125 C 27.25 17.769531 27.210938 17.710938 27.171875 17.652344 C 27.28125 17.246094 27.394531 16.84375 27.519531 16.441406 C 27.222656 16.023438 26.839844 15.71875 26.367188 15.519531 C 26.902344 15.441406 27.441406 15.367188 27.980469 15.289062 C 28.289062 13.441406 28.597656 13.441406 28.902344 15.289062 Z M 28.902344 15.289062 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.647059%);fill-opacity:1;" d="M 38.367188 15.289062 C 38.902344 15.367188 39.441406 15.441406 39.980469 15.519531 C 39.476562 15.710938 39.09375 16.039062 38.828125 16.5 C 38.917969 16.890625 39.035156 17.277344 39.171875 17.652344 C 39.132812 17.710938 39.097656 17.769531 39.058594 17.828125 C 38.671875 17.558594 38.289062 17.289062 37.902344 17.019531 C 37.511719 17.300781 37.105469 17.570312 36.691406 17.828125 C 36.703125 17.355469 36.796875 16.894531 36.980469 16.441406 C 36.625 16.089844 36.242188 15.761719 35.828125 15.460938 C 36.328125 15.421875 36.828125 15.382812 37.328125 15.347656 C 37.507812 14.863281 37.699219 14.378906 37.902344 13.902344 C 38.128906 14.34375 38.28125 14.804688 38.367188 15.289062 Z M 38.367188 15.289062 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(43.921569%,43.529412%,58.431375%);fill-opacity:1;" d="M 10.097656 15.289062 C 10.640625 15.25 11.179688 15.289062 11.710938 15.402344 C 11.695312 15.472656 11.660156 15.511719 11.597656 15.519531 C 11.097656 15.441406 10.597656 15.367188 10.097656 15.289062 Z M 10.097656 15.289062 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(44.313726%,43.921569%,58.823532%);fill-opacity:1;" d="M 27.980469 15.289062 C 27.441406 15.367188 26.902344 15.441406 26.367188 15.519531 C 26.300781 15.511719 26.265625 15.472656 26.25 15.402344 C 26.820312 15.289062 27.398438 15.25 27.980469 15.289062 Z M 27.980469 15.289062 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(44.313726%,43.921569%,58.823532%);fill-opacity:1;" d="M 28.902344 15.289062 C 29.484375 15.25 30.0625 15.289062 30.632812 15.402344 C 30.621094 15.472656 30.582031 15.511719 30.519531 15.519531 C 29.980469 15.441406 29.441406 15.367188 28.902344 15.289062 Z M 28.902344 15.289062 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(43.529412%,43.137255%,58.039218%);fill-opacity:1;" d="M 38.367188 15.289062 C 38.949219 15.25 39.523438 15.289062 40.097656 15.402344 C 40.082031 15.472656 40.042969 15.511719 39.980469 15.519531 C 39.441406 15.441406 38.902344 15.367188 38.367188 15.289062 Z M 38.367188 15.289062 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(43.529412%,43.137255%,58.039218%);fill-opacity:1;" d="M 46.789062 15.289062 C 46.289062 15.367188 45.789062 15.441406 45.289062 15.519531 C 45.226562 15.511719 45.1875 15.472656 45.171875 15.402344 C 45.707031 15.289062 46.246094 15.25 46.789062 15.289062 Z M 46.789062 15.289062 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.647059%);fill-opacity:1;" d="M 4.789062 17.941406 C 5.035156 18.390625 5.226562 18.871094 5.367188 19.382812 C 5.867188 19.421875 6.367188 19.460938 6.867188 19.5 C 6.4375 19.8125 6.054688 20.15625 5.710938 20.539062 C 5.898438 21.015625 6.03125 21.496094 6.117188 21.980469 C 5.722656 21.625 5.300781 21.320312 4.847656 21.058594 C 4.410156 21.300781 4.007812 21.589844 3.632812 21.921875 C 3.558594 22 3.480469 22 3.402344 21.921875 C 3.597656 21.421875 3.789062 20.921875 3.980469 20.421875 C 3.578125 20.085938 3.15625 19.78125 2.710938 19.5 C 3.25 19.441406 3.785156 19.421875 4.328125 19.441406 C 4.433594 18.925781 4.589844 18.425781 4.789062 17.941406 Z M 4.789062 17.941406 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.470588%,97.647059%);fill-opacity:1;" d="M 51.980469 17.941406 C 52.28125 18.386719 52.476562 18.886719 52.558594 19.441406 C 53.097656 19.421875 53.636719 19.441406 54.171875 19.5 C 53.730469 19.78125 53.304688 20.085938 52.902344 20.421875 C 53.15625 20.890625 53.273438 21.371094 53.25 21.867188 C 52.867188 21.597656 52.480469 21.328125 52.097656 21.058594 C 51.644531 21.351562 51.203125 21.660156 50.769531 21.980469 C 50.851562 21.496094 50.988281 21.015625 51.171875 20.539062 C 50.84375 20.140625 50.460938 19.792969 50.019531 19.5 C 50.519531 19.460938 51.019531 19.421875 51.519531 19.382812 C 51.683594 18.910156 51.839844 18.425781 51.980469 17.941406 Z M 51.980469 17.941406 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 14.132812 17.941406 C 14.277344 17.953125 14.375 18.027344 14.421875 18.171875 C 14.511719 18.59375 14.648438 19 14.828125 19.382812 C 15.328125 19.421875 15.828125 19.460938 16.328125 19.5 C 15.886719 19.792969 15.503906 20.140625 15.171875 20.539062 C 15.359375 21.015625 15.492188 21.496094 15.578125 21.980469 C 15.144531 21.660156 14.703125 21.351562 14.25 21.058594 C 13.828125 21.367188 13.402344 21.671875 12.980469 21.980469 C 13.027344 21.488281 13.183594 20.988281 13.441406 20.480469 C 13.066406 20.097656 12.640625 19.773438 12.171875 19.5 C 12.710938 19.441406 13.25 19.421875 13.789062 19.441406 C 13.921875 18.945312 14.039062 18.445312 14.132812 17.941406 Z M 14.132812 17.941406 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 23.597656 17.941406 C 23.941406 18.359375 24.132812 18.859375 24.171875 19.441406 C 24.714844 19.421875 25.25 19.441406 25.789062 19.5 C 25.421875 19.789062 25.058594 20.078125 24.691406 20.367188 C 24.738281 20.808594 24.832031 21.253906 24.980469 21.691406 C 24.941406 21.75 24.902344 21.808594 24.867188 21.867188 C 24.480469 21.597656 24.097656 21.328125 23.710938 21.058594 C 23.269531 21.335938 22.84375 21.644531 22.441406 21.980469 C 22.402344 21.960938 22.367188 21.941406 22.328125 21.921875 C 22.628906 21.390625 22.742188 20.832031 22.671875 20.25 C 22.3125 20.023438 21.964844 19.773438 21.632812 19.5 C 22.171875 19.441406 22.710938 19.421875 23.25 19.441406 C 23.339844 18.9375 23.457031 18.4375 23.597656 17.941406 Z M 23.597656 17.941406 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 33.058594 17.941406 C 33.402344 18.359375 33.59375 18.859375 33.632812 19.441406 C 34.175781 19.421875 34.710938 19.441406 35.25 19.5 C 34.882812 19.789062 34.519531 20.078125 34.152344 20.367188 C 34.152344 20.820312 34.246094 21.265625 34.441406 21.691406 C 34.402344 21.75 34.367188 21.808594 34.328125 21.867188 C 33.941406 21.597656 33.558594 21.328125 33.171875 21.058594 C 32.789062 21.328125 32.402344 21.597656 32.019531 21.867188 C 31.980469 21.789062 31.941406 21.710938 31.902344 21.632812 C 32.0625 21.21875 32.160156 20.792969 32.191406 20.367188 C 31.828125 20.078125 31.460938 19.789062 31.097656 19.5 C 31.632812 19.441406 32.171875 19.421875 32.710938 19.441406 C 32.804688 18.9375 32.917969 18.4375 33.058594 17.941406 Z M 33.058594 17.941406 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 42.519531 17.941406 C 42.867188 18.367188 43.058594 18.867188 43.097656 19.441406 C 43.636719 19.421875 44.175781 19.441406 44.710938 19.5 C 44.285156 19.828125 43.859375 20.15625 43.441406 20.480469 C 43.707031 20.925781 43.824219 21.386719 43.789062 21.867188 C 43.402344 21.597656 43.019531 21.328125 42.632812 21.058594 C 42.183594 21.351562 41.738281 21.660156 41.308594 21.980469 C 41.390625 21.496094 41.527344 21.015625 41.710938 20.539062 C 41.382812 20.140625 40.996094 19.792969 40.558594 19.5 C 41.058594 19.460938 41.558594 19.421875 42.058594 19.382812 C 42.269531 18.921875 42.421875 18.441406 42.519531 17.941406 Z M 42.519531 17.941406 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.647059%);fill-opacity:1;" d="M 9.519531 21.980469 C 9.71875 22.445312 9.914062 22.925781 10.097656 23.421875 C 10.597656 23.460938 11.097656 23.5 11.597656 23.539062 C 11.167969 23.851562 10.785156 24.195312 10.441406 24.578125 C 10.628906 25.054688 10.761719 25.535156 10.847656 26.019531 C 10.414062 25.699219 9.972656 25.390625 9.519531 25.097656 C 9.089844 25.472656 8.628906 25.761719 8.132812 25.960938 C 8.316406 25.476562 8.507812 24.996094 8.710938 24.519531 C 8.292969 24.195312 7.871094 23.867188 7.441406 23.539062 C 7.980469 23.480469 8.519531 23.460938 9.058594 23.480469 C 9.164062 22.964844 9.320312 22.464844 9.519531 21.980469 Z M 9.519531 21.980469 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 18.867188 21.980469 C 19.210938 22.398438 19.402344 22.898438 19.441406 23.480469 C 19.980469 23.460938 20.519531 23.480469 21.058594 23.539062 C 20.691406 23.828125 20.328125 24.117188 19.960938 24.402344 C 19.996094 24.832031 20.089844 25.253906 20.25 25.671875 C 20.210938 25.75 20.171875 25.828125 20.132812 25.902344 C 19.75 25.632812 19.367188 25.367188 18.980469 25.097656 C 18.558594 25.402344 18.132812 25.710938 17.710938 26.019531 C 17.671875 26 17.632812 25.980469 17.597656 25.960938 C 17.851562 25.46875 17.984375 24.949219 18 24.402344 C 17.632812 24.117188 17.269531 23.828125 16.902344 23.539062 C 17.441406 23.480469 17.980469 23.460938 18.519531 23.480469 C 18.617188 22.976562 18.730469 22.476562 18.867188 21.980469 Z M 18.867188 21.980469 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.470588%,97.647059%);fill-opacity:1;" d="M 28.328125 21.980469 C 28.671875 22.398438 28.863281 22.898438 28.902344 23.480469 C 29.445312 23.460938 29.980469 23.480469 30.519531 23.539062 C 30.152344 23.828125 29.789062 24.117188 29.421875 24.402344 C 29.421875 24.859375 29.515625 25.300781 29.710938 25.730469 C 29.671875 25.789062 29.632812 25.847656 29.597656 25.902344 C 29.210938 25.632812 28.828125 25.367188 28.441406 25.097656 C 28.019531 25.402344 27.597656 25.710938 27.171875 26.019531 C 27.132812 26 27.097656 25.980469 27.058594 25.960938 C 27.3125 25.46875 27.445312 24.949219 27.460938 24.402344 C 27.097656 24.117188 26.730469 23.828125 26.367188 23.539062 C 26.902344 23.480469 27.441406 23.460938 27.980469 23.480469 C 28.074219 22.976562 28.1875 22.476562 28.328125 21.980469 Z M 28.328125 21.980469 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 37.789062 21.980469 C 37.902344 21.976562 37.980469 22.035156 38.019531 22.152344 C 38.179688 22.585938 38.296875 23.027344 38.367188 23.480469 C 38.90625 23.460938 39.445312 23.480469 39.980469 23.539062 C 39.617188 23.828125 39.25 24.117188 38.882812 24.402344 C 38.882812 24.859375 38.976562 25.300781 39.171875 25.730469 C 39.132812 25.789062 39.097656 25.847656 39.058594 25.902344 C 38.671875 25.632812 38.289062 25.367188 37.902344 25.097656 C 37.519531 25.367188 37.132812 25.632812 36.75 25.902344 C 36.710938 25.828125 36.671875 25.75 36.632812 25.671875 C 36.792969 25.253906 36.890625 24.832031 36.921875 24.402344 C 36.558594 24.117188 36.191406 23.828125 35.828125 23.539062 C 36.363281 23.480469 36.902344 23.460938 37.441406 23.480469 C 37.535156 22.976562 37.648438 22.476562 37.789062 21.980469 Z M 37.789062 21.980469 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 47.25 21.980469 C 47.550781 22.425781 47.746094 22.925781 47.828125 23.480469 C 48.367188 23.460938 48.90625 23.480469 49.441406 23.539062 C 49.015625 23.867188 48.589844 24.195312 48.171875 24.519531 C 48.4375 24.964844 48.554688 25.425781 48.519531 25.902344 C 48.132812 25.632812 47.75 25.367188 47.367188 25.097656 C 46.914062 25.390625 46.46875 25.699219 46.039062 26.019531 C 46.121094 25.535156 46.257812 25.054688 46.441406 24.578125 C 46.097656 24.195312 45.714844 23.851562 45.289062 23.539062 C 45.789062 23.5 46.289062 23.460938 46.789062 23.421875 C 47 22.960938 47.152344 22.480469 47.25 21.980469 Z M 47.25 21.980469 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(69.411767%,13.333334%,20.392157%);fill-opacity:1;" d="M 56.941406 23.019531 C 72.519531 23 88.097656 23.019531 103.671875 23.078125 C 99.851562 24.929688 96.042969 26.816406 92.25 28.730469 C 80.480469 28.789062 68.710938 28.808594 56.941406 28.789062 C 56.941406 26.867188 56.941406 24.941406 56.941406 23.019531 Z M 56.941406 23.019531 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(33.333334%,42.745098%,65.882355%);fill-opacity:1;" d="M 117.058594 24.75 C 128 24.867188 138.960938 24.902344 149.941406 24.867188 C 149.941406 24.902344 149.941406 24.941406 149.941406 24.980469 C 138.867188 25 127.789062 24.980469 116.710938 24.921875 C 116.832031 24.863281 116.945312 24.804688 117.058594 24.75 Z M 117.058594 24.75 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 4.789062 26.019531 C 5.023438 26.472656 5.214844 26.953125 5.367188 27.460938 C 5.902344 27.5 6.441406 27.539062 6.980469 27.578125 C 6.566406 27.851562 6.164062 28.140625 5.769531 28.441406 C 5.816406 28.957031 5.953125 29.457031 6.171875 29.941406 C 6.132812 29.980469 6.097656 30.019531 6.058594 30.058594 C 5.65625 29.722656 5.230469 29.414062 4.789062 29.132812 C 4.367188 29.421875 3.964844 29.726562 3.578125 30.058594 C 3.621094 29.542969 3.753906 29.042969 3.980469 28.558594 C 3.5625 28.230469 3.140625 27.90625 2.710938 27.578125 C 3.25 27.519531 3.785156 27.5 4.328125 27.519531 C 4.433594 27.003906 4.589844 26.503906 4.789062 26.019531 Z M 4.789062 26.019531 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 14.132812 26.019531 C 14.25 26.015625 14.328125 26.074219 14.367188 26.191406 C 14.496094 26.625 14.652344 27.050781 14.828125 27.460938 C 15.367188 27.5 15.902344 27.539062 16.441406 27.578125 C 16.007812 27.820312 15.601562 28.109375 15.230469 28.441406 C 15.261719 28.871094 15.359375 29.292969 15.519531 29.710938 C 15.480469 29.789062 15.441406 29.867188 15.402344 29.941406 C 15.019531 29.671875 14.632812 29.402344 14.25 29.132812 C 13.828125 29.421875 13.425781 29.726562 13.039062 30.058594 C 13.039062 29.53125 13.175781 29.03125 13.441406 28.558594 C 13.019531 28.230469 12.597656 27.902344 12.171875 27.578125 C 12.710938 27.519531 13.25 27.5 13.789062 27.519531 C 13.925781 27.023438 14.042969 26.523438 14.132812 26.019531 Z M 14.132812 26.019531 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 23.597656 26.019531 C 23.941406 26.4375 24.132812 26.9375 24.171875 27.519531 C 24.75 27.5 25.328125 27.519531 25.902344 27.578125 C 25.46875 27.820312 25.0625 28.109375 24.691406 28.441406 C 24.707031 28.988281 24.839844 29.507812 25.097656 30 C 25.058594 30.019531 25.019531 30.039062 24.980469 30.058594 C 24.558594 29.75 24.132812 29.441406 23.710938 29.132812 C 23.3125 29.402344 22.925781 29.6875 22.558594 30 C 22.480469 30.078125 22.402344 30.078125 22.328125 30 C 22.582031 29.507812 22.714844 28.988281 22.730469 28.441406 C 22.367188 28.152344 22 27.867188 21.632812 27.578125 C 22.171875 27.519531 22.710938 27.5 23.25 27.519531 C 23.339844 27.015625 23.457031 26.515625 23.597656 26.019531 Z M 23.597656 26.019531 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 33.058594 26.019531 C 33.402344 26.4375 33.59375 26.9375 33.632812 27.519531 C 34.175781 27.5 34.710938 27.519531 35.25 27.578125 C 34.882812 27.867188 34.519531 28.152344 34.152344 28.441406 C 34.152344 28.898438 34.246094 29.339844 34.441406 29.769531 C 34.402344 29.828125 34.367188 29.882812 34.328125 29.941406 C 33.941406 29.671875 33.558594 29.402344 33.171875 29.132812 C 32.75 29.441406 32.328125 29.75 31.902344 30.058594 C 31.867188 30.039062 31.828125 30.019531 31.789062 30 C 32.042969 29.507812 32.179688 28.988281 32.191406 28.441406 C 31.828125 28.152344 31.460938 27.867188 31.097656 27.578125 C 31.632812 27.519531 32.171875 27.5 32.710938 27.519531 C 32.804688 27.015625 32.917969 26.515625 33.058594 26.019531 Z M 33.058594 26.019531 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 42.519531 26.019531 C 42.820312 26.460938 43.015625 26.960938 43.097656 27.519531 C 43.636719 27.5 44.175781 27.519531 44.710938 27.578125 C 44.289062 27.902344 43.867188 28.230469 43.441406 28.558594 C 43.644531 29.035156 43.839844 29.515625 44.019531 30 C 43.523438 29.800781 43.0625 29.511719 42.632812 29.132812 C 42.234375 29.402344 41.847656 29.6875 41.480469 30 C 41.386719 30.078125 41.308594 30.058594 41.25 29.941406 C 41.46875 29.457031 41.605469 28.957031 41.652344 28.441406 C 41.28125 28.109375 40.878906 27.820312 40.441406 27.578125 C 40.980469 27.539062 41.519531 27.5 42.058594 27.460938 C 42.269531 27 42.421875 26.519531 42.519531 26.019531 Z M 42.519531 26.019531 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.862745%,96.862745%,97.647059%);fill-opacity:1;" d="M 51.980469 26.019531 C 52.28125 26.460938 52.476562 26.960938 52.558594 27.519531 C 53.097656 27.5 53.636719 27.519531 54.171875 27.578125 C 53.75 27.902344 53.328125 28.230469 52.902344 28.558594 C 53.125 29.042969 53.257812 29.542969 53.308594 30.058594 C 52.921875 29.726562 52.515625 29.421875 52.097656 29.132812 C 51.691406 29.394531 51.304688 29.683594 50.941406 30 C 50.847656 30.078125 50.769531 30.058594 50.710938 29.941406 C 50.933594 29.457031 51.066406 28.957031 51.117188 28.441406 C 50.742188 28.109375 50.339844 27.820312 49.902344 27.578125 C 50.441406 27.539062 50.980469 27.5 51.519531 27.460938 C 51.699219 26.988281 51.851562 26.507812 51.980469 26.019531 Z M 51.980469 26.019531 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(81.176472%,7.843138%,16.862746%);fill-opacity:1;" d="M 149.941406 29.941406 C 149.941406 34.941406 149.941406 39.941406 149.941406 44.941406 C 127.441406 44.941406 104.941406 44.941406 82.441406 44.941406 C 82.441406 54.941406 82.441406 64.941406 82.441406 74.941406 C 77.441406 74.941406 72.441406 74.941406 67.441406 74.941406 C 67.441406 64.941406 67.441406 54.941406 67.441406 44.941406 C 64.941406 44.960938 62.441406 44.941406 59.941406 44.882812 C 62.929688 43.371094 65.929688 41.890625 68.941406 40.441406 C 72.902344 38.539062 76.824219 36.578125 80.710938 34.558594 C 83.746094 33.039062 86.785156 31.519531 89.828125 30 C 109.867188 29.941406 129.902344 29.921875 149.941406 29.941406 Z M 149.941406 29.941406 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.078432%,96.078432%,96.862745%);fill-opacity:1;" d="M 9.519531 30.058594 C 9.71875 30.523438 9.914062 31.003906 10.097656 31.5 C 10.632812 31.539062 11.171875 31.578125 11.710938 31.617188 C 11.296875 31.890625 10.894531 32.179688 10.5 32.480469 C 10.546875 32.996094 10.683594 33.496094 10.902344 33.980469 C 10.867188 34.019531 10.828125 34.058594 10.789062 34.097656 C 10.367188 33.789062 9.941406 33.480469 9.519531 33.171875 C 9.097656 33.457031 8.695312 33.765625 8.308594 34.097656 C 8.351562 33.578125 8.484375 33.078125 8.710938 32.597656 C 8.289062 32.269531 7.867188 31.941406 7.441406 31.617188 C 7.980469 31.558594 8.519531 31.539062 9.058594 31.558594 C 9.164062 31.042969 9.320312 30.542969 9.519531 30.058594 Z M 9.519531 30.058594 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.078432%,96.078432%,97.254902%);fill-opacity:1;" d="M 18.867188 30.058594 C 19.210938 30.476562 19.402344 30.976562 19.441406 31.558594 C 20.019531 31.539062 20.597656 31.558594 21.171875 31.617188 C 20.757812 31.890625 20.355469 32.179688 19.960938 32.480469 C 19.976562 33.023438 20.113281 33.542969 20.367188 34.039062 C 20.328125 34.058594 20.289062 34.078125 20.25 34.097656 C 19.828125 33.789062 19.402344 33.480469 18.980469 33.171875 C 18.558594 33.457031 18.15625 33.765625 17.769531 34.097656 C 17.773438 33.570312 17.90625 33.066406 18.171875 32.597656 C 17.734375 32.292969 17.308594 31.964844 16.902344 31.617188 C 17.441406 31.558594 17.980469 31.539062 18.519531 31.558594 C 18.660156 31.0625 18.773438 30.5625 18.867188 30.058594 Z M 18.867188 30.058594 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.078432%,96.078432%,96.862745%);fill-opacity:1;" d="M 28.328125 30.058594 C 28.671875 30.476562 28.863281 30.976562 28.902344 31.558594 C 29.445312 31.539062 29.980469 31.558594 30.519531 31.617188 C 30.152344 31.902344 29.789062 32.191406 29.421875 32.480469 C 29.4375 33.023438 29.570312 33.542969 29.828125 34.039062 C 29.789062 34.058594 29.75 34.078125 29.710938 34.097656 C 29.289062 33.789062 28.867188 33.480469 28.441406 33.171875 C 28.011719 33.550781 27.550781 33.839844 27.058594 34.039062 C 27.3125 33.542969 27.445312 33.023438 27.460938 32.480469 C 27.097656 32.191406 26.730469 31.902344 26.367188 31.617188 C 26.902344 31.558594 27.441406 31.539062 27.980469 31.558594 C 28.074219 31.050781 28.1875 30.550781 28.328125 30.058594 Z M 28.328125 30.058594 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.470588%,96.470588%,97.254902%);fill-opacity:1;" d="M 37.789062 30.171875 C 38.113281 30.566406 38.304688 31.027344 38.367188 31.558594 C 38.90625 31.539062 39.445312 31.558594 39.980469 31.617188 C 39.617188 31.902344 39.25 32.191406 38.882812 32.480469 C 38.960938 33.019531 39.039062 33.558594 39.117188 34.097656 C 38.726562 33.765625 38.324219 33.457031 37.902344 33.171875 C 37.503906 33.4375 37.117188 33.726562 36.75 34.039062 C 36.671875 34.117188 36.597656 34.117188 36.519531 34.039062 C 36.773438 33.542969 36.910156 33.023438 36.921875 32.480469 C 36.550781 32.148438 36.148438 31.859375 35.710938 31.617188 C 36.289062 31.558594 36.863281 31.539062 37.441406 31.558594 C 37.511719 31.085938 37.625 30.621094 37.789062 30.171875 Z M 37.789062 30.171875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.078432%,96.078432%,96.862745%);fill-opacity:1;" d="M 47.25 30.058594 C 47.550781 30.5 47.746094 31 47.828125 31.558594 C 48.367188 31.539062 48.90625 31.558594 49.441406 31.617188 C 49.035156 31.964844 48.613281 32.292969 48.171875 32.597656 C 48.4375 33.070312 48.570312 33.570312 48.578125 34.097656 C 48.191406 33.765625 47.785156 33.457031 47.367188 33.171875 C 46.964844 33.4375 46.578125 33.726562 46.210938 34.039062 C 46.117188 34.117188 46.039062 34.097656 45.980469 33.980469 C 46.199219 33.496094 46.335938 32.996094 46.382812 32.480469 C 45.992188 32.179688 45.585938 31.890625 45.171875 31.617188 C 45.710938 31.578125 46.25 31.539062 46.789062 31.5 C 47 31.039062 47.152344 30.558594 47.25 30.058594 Z M 47.25 30.058594 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.078432%,95.686275%,96.862745%);fill-opacity:1;" d="M 4.789062 34.097656 C 4.988281 34.5625 5.183594 35.042969 5.367188 35.539062 C 5.902344 35.578125 6.441406 35.617188 6.980469 35.652344 C 6.566406 35.929688 6.164062 36.214844 5.769531 36.519531 C 5.816406 37.03125 5.953125 37.53125 6.171875 38.019531 C 6.132812 38.058594 6.097656 38.097656 6.058594 38.132812 C 5.636719 37.847656 5.234375 37.542969 4.847656 37.210938 C 4.421875 37.519531 4 37.828125 3.578125 38.132812 C 3.613281 37.636719 3.75 37.15625 3.980469 36.691406 C 3.558594 36.347656 3.136719 36.003906 2.710938 35.652344 C 3.25 35.597656 3.785156 35.578125 4.328125 35.597656 C 4.433594 35.082031 4.589844 34.582031 4.789062 34.097656 Z M 4.789062 34.097656 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.078432%,96.078432%,97.254902%);fill-opacity:1;" d="M 14.25 34.097656 C 14.492188 34.558594 14.648438 35.058594 14.710938 35.597656 C 15.289062 35.578125 15.867188 35.597656 16.441406 35.652344 C 16.027344 35.929688 15.625 36.214844 15.230469 36.519531 C 15.246094 37.0625 15.382812 37.582031 15.632812 38.078125 C 15.597656 38.097656 15.558594 38.117188 15.519531 38.132812 C 15.097656 37.828125 14.671875 37.519531 14.25 37.210938 C 13.828125 37.496094 13.425781 37.804688 13.039062 38.132812 C 13.046875 37.609375 13.179688 37.109375 13.441406 36.632812 C 13.003906 36.328125 12.578125 36.003906 12.171875 35.652344 C 12.710938 35.597656 13.25 35.578125 13.789062 35.597656 C 13.894531 35.082031 14.050781 34.582031 14.25 34.097656 Z M 14.25 34.097656 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(95.686275%,95.686275%,96.862745%);fill-opacity:1;" d="M 23.597656 34.097656 C 23.941406 34.515625 24.132812 35.015625 24.171875 35.597656 C 24.75 35.578125 25.328125 35.597656 25.902344 35.652344 C 25.488281 35.929688 25.085938 36.214844 24.691406 36.519531 C 24.707031 37.0625 24.839844 37.582031 25.097656 38.078125 C 24.601562 37.878906 24.140625 37.589844 23.710938 37.210938 C 23.292969 37.496094 22.886719 37.804688 22.5 38.132812 C 22.578125 37.597656 22.652344 37.058594 22.730469 36.519531 C 22.367188 36.230469 22 35.941406 21.632812 35.652344 C 22.171875 35.597656 22.710938 35.578125 23.25 35.597656 C 23.390625 35.101562 23.503906 34.601562 23.597656 34.097656 Z M 23.597656 34.097656 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(95.686275%,95.686275%,96.862745%);fill-opacity:1;" d="M 33.058594 34.097656 C 33.359375 34.53125 33.550781 35.03125 33.632812 35.597656 C 34.175781 35.578125 34.710938 35.597656 35.25 35.652344 C 34.894531 35.957031 34.53125 36.246094 34.152344 36.519531 C 34.230469 37.058594 34.308594 37.597656 34.382812 38.132812 C 33.996094 37.804688 33.59375 37.496094 33.171875 37.210938 C 32.742188 37.589844 32.28125 37.878906 31.789062 38.078125 C 32.042969 37.582031 32.179688 37.0625 32.191406 36.519531 C 31.796875 36.214844 31.394531 35.929688 30.980469 35.652344 C 31.554688 35.597656 32.132812 35.578125 32.710938 35.597656 C 32.804688 35.089844 32.917969 34.589844 33.058594 34.097656 Z M 33.058594 34.097656 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(96.078432%,96.078432%,96.862745%);fill-opacity:1;" d="M 42.519531 34.097656 C 42.820312 34.539062 43.015625 35.039062 43.097656 35.597656 C 43.636719 35.578125 44.175781 35.597656 44.710938 35.652344 C 44.347656 35.941406 43.980469 36.230469 43.617188 36.519531 C 43.691406 37.058594 43.769531 37.597656 43.847656 38.132812 C 43.457031 37.804688 43.054688 37.496094 42.632812 37.210938 C 42.207031 37.589844 41.742188 37.878906 41.25 38.078125 C 41.449219 37.632812 41.601562 37.171875 41.710938 36.691406 C 41.363281 36.265625 40.941406 35.921875 40.441406 35.652344 C 41.019531 35.597656 41.59375 35.578125 42.171875 35.597656 C 42.265625 35.089844 42.378906 34.589844 42.519531 34.097656 Z M 42.519531 34.097656 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(95.686275%,95.686275%,96.862745%);fill-opacity:1;" d="M 51.980469 34.097656 C 52.28125 34.539062 52.476562 35.039062 52.558594 35.597656 C 53.097656 35.578125 53.636719 35.597656 54.171875 35.652344 C 53.746094 36.003906 53.324219 36.347656 52.902344 36.691406 C 53.136719 37.15625 53.269531 37.636719 53.308594 38.132812 C 52.929688 37.820312 52.523438 37.550781 52.097656 37.328125 C 51.667969 37.503906 51.28125 37.753906 50.941406 38.078125 C 50.847656 38.15625 50.769531 38.136719 50.710938 38.019531 C 50.933594 37.53125 51.066406 37.03125 51.117188 36.519531 C 50.722656 36.214844 50.316406 35.929688 49.902344 35.652344 C 50.441406 35.617188 50.980469 35.578125 51.519531 35.539062 C 51.730469 35.078125 51.886719 34.597656 51.980469 34.097656 Z M 51.980469 34.097656 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(69.803923%,13.333334%,20.392157%);fill-opacity:1;" d="M 56.941406 34.558594 C 64.867188 34.558594 72.789062 34.558594 80.710938 34.558594 C 76.824219 36.578125 72.902344 38.539062 68.941406 40.441406 C 64.960938 40.328125 60.960938 40.289062 56.941406 40.328125 C 56.941406 38.402344 56.941406 36.480469 56.941406 34.558594 Z M 56.941406 34.558594 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M -0.0585938 40.328125 C 18.941406 40.328125 37.941406 40.328125 56.941406 40.328125 C 60.960938 40.289062 64.960938 40.328125 68.941406 40.441406 C 65.929688 41.890625 62.929688 43.371094 59.941406 44.882812 C 62.441406 44.941406 64.941406 44.960938 67.441406 44.941406 C 67.441406 54.941406 67.441406 64.941406 67.441406 74.941406 C 65.789062 74.941406 64.132812 74.941406 62.480469 74.941406 C 62.519531 67.328125 62.480469 59.710938 62.367188 52.097656 C 62.296875 52.109375 62.257812 52.148438 62.25 52.210938 C 47.058594 59.730469 31.90625 67.308594 16.789062 74.941406 C 14.941406 74.941406 13.097656 74.941406 11.25 74.941406 C 27.726562 66.644531 44.226562 58.375 60.75 50.132812 C 60.863281 50.078125 60.976562 50.019531 61.097656 49.960938 C 57.421875 49.941406 53.769531 49.882812 50.132812 49.789062 C 52.554688 48.578125 54.976562 47.367188 57.402344 46.152344 C 38.25 46.097656 19.097656 46.078125 -0.0585938 46.097656 C -0.0585938 44.171875 -0.0585938 42.25 -0.0585938 40.328125 Z M -0.0585938 40.328125 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 149.941406 44.941406 C 149.941406 46.597656 149.941406 48.25 149.941406 49.902344 C 138.867188 49.882812 127.789062 49.902344 116.710938 49.960938 C 116.832031 50.019531 116.945312 50.078125 117.058594 50.132812 C 128.003906 55.628906 138.964844 61.089844 149.941406 66.519531 C 149.941406 67.441406 149.941406 68.367188 149.941406 69.289062 C 137.019531 62.867188 124.097656 56.441406 111.171875 50.019531 C 107.460938 49.886719 103.730469 49.867188 99.980469 49.960938 C 100.097656 50.019531 100.214844 50.078125 100.328125 50.132812 C 116.847656 58.375 133.347656 66.644531 149.828125 74.941406 C 144.25 74.941406 138.671875 74.941406 133.097656 74.941406 C 117.984375 67.308594 102.828125 59.730469 87.632812 52.210938 C 87.628906 52.148438 87.589844 52.109375 87.519531 52.097656 C 87.402344 59.710938 87.367188 67.328125 87.402344 74.941406 C 85.75 74.941406 84.097656 74.941406 82.441406 74.941406 C 82.441406 64.941406 82.441406 54.941406 82.441406 44.941406 C 104.941406 44.941406 127.441406 44.941406 149.941406 44.941406 Z M 149.941406 44.941406 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(69.803923%,13.333334%,20.392157%);fill-opacity:1;" d="M -0.0585938 46.097656 C 19.097656 46.078125 38.25 46.097656 57.402344 46.152344 C 54.976562 47.367188 52.554688 48.578125 50.132812 49.789062 C 49.996094 49.839844 49.878906 49.914062 49.789062 50.019531 C 48.542969 50.699219 47.273438 51.355469 45.980469 51.980469 C 30.652344 51.867188 15.308594 51.828125 -0.0585938 51.867188 C -0.0585938 49.941406 -0.0585938 48.019531 -0.0585938 46.097656 Z M -0.0585938 46.097656 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(87.058824%,38.431373%,44.705883%);fill-opacity:1;" d="M 50.132812 49.789062 C 53.769531 49.882812 57.421875 49.941406 61.097656 49.960938 C 60.976562 50.019531 60.863281 50.078125 60.75 50.132812 C 57.117188 50.019531 53.460938 49.980469 49.789062 50.019531 C 49.878906 49.914062 49.996094 49.839844 50.132812 49.789062 Z M 50.132812 49.789062 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(87.450981%,38.431373%,44.705883%);fill-opacity:1;" d="M 111.171875 50.019531 C 107.539062 49.980469 103.921875 50.019531 100.328125 50.132812 C 100.214844 50.078125 100.097656 50.019531 99.980469 49.960938 C 103.730469 49.867188 107.460938 49.886719 111.171875 50.019531 Z M 111.171875 50.019531 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(33.333334%,42.745098%,65.882355%);fill-opacity:1;" d="M 149.941406 49.902344 C 149.941406 49.941406 149.941406 49.980469 149.941406 50.019531 C 138.960938 49.980469 128 50.019531 117.058594 50.132812 C 116.945312 50.078125 116.832031 50.019531 116.710938 49.960938 C 127.789062 49.902344 138.867188 49.882812 149.941406 49.902344 Z M 149.941406 49.902344 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(81.176472%,8.235294%,16.862746%);fill-opacity:1;" d="M 49.789062 50.019531 C 53.460938 49.980469 57.117188 50.019531 60.75 50.132812 C 44.226562 58.375 27.726562 66.644531 11.25 74.941406 C 7.558594 74.941406 3.867188 74.941406 0.171875 74.941406 C 3.941406 73.019531 7.710938 71.097656 11.480469 69.171875 C 15.273438 67.257812 19.082031 65.371094 22.902344 63.519531 C 26.808594 61.585938 30.695312 59.625 34.558594 57.632812 C 38.351562 55.71875 42.160156 53.835938 45.980469 51.980469 C 47.273438 51.355469 48.542969 50.699219 49.789062 50.019531 Z M 49.789062 50.019531 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(81.176472%,8.627451%,17.254902%);fill-opacity:1;" d="M 100.328125 50.132812 C 103.921875 50.019531 107.539062 49.980469 111.171875 50.019531 C 124.097656 56.441406 137.019531 62.867188 149.941406 69.289062 C 149.941406 71.171875 149.941406 73.058594 149.941406 74.941406 C 149.902344 74.941406 149.863281 74.941406 149.828125 74.941406 C 133.347656 66.644531 116.847656 58.375 100.328125 50.132812 Z M 100.328125 50.132812 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(0.392157%,14.117648%,49.019608%);fill-opacity:1;" d="M 117.058594 50.132812 C 128 50.019531 138.960938 49.980469 149.941406 50.019531 C 149.941406 55.519531 149.941406 61.019531 149.941406 66.519531 C 138.964844 61.089844 128.003906 55.628906 117.058594 50.132812 Z M 117.058594 50.132812 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M -0.0585938 51.867188 C 15.308594 51.828125 30.652344 51.867188 45.980469 51.980469 C 42.160156 53.835938 38.351562 55.71875 34.558594 57.632812 C 23.019531 57.632812 11.480469 57.632812 -0.0585938 57.632812 C -0.0585938 55.710938 -0.0585938 53.789062 -0.0585938 51.867188 Z M -0.0585938 51.867188 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(0.392157%,14.117648%,49.019608%);fill-opacity:1;" d="M 62.25 52.210938 C 62.367188 59.769531 62.402344 67.347656 62.367188 74.941406 C 47.171875 74.941406 31.980469 74.941406 16.789062 74.941406 C 31.90625 67.308594 47.058594 59.730469 62.25 52.210938 Z M 62.25 52.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(33.333334%,42.745098%,65.882355%);fill-opacity:1;" d="M 62.25 52.210938 C 62.257812 52.148438 62.296875 52.109375 62.367188 52.097656 C 62.480469 59.710938 62.519531 67.328125 62.480469 74.941406 C 62.441406 74.941406 62.402344 74.941406 62.367188 74.941406 C 62.402344 67.347656 62.367188 59.769531 62.25 52.210938 Z M 62.25 52.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(33.333334%,42.745098%,65.882355%);fill-opacity:1;" d="M 87.632812 52.210938 C 87.519531 59.769531 87.480469 67.347656 87.519531 74.941406 C 87.480469 74.941406 87.441406 74.941406 87.402344 74.941406 C 87.367188 67.328125 87.402344 59.710938 87.519531 52.097656 C 87.589844 52.109375 87.628906 52.148438 87.632812 52.210938 Z M 87.632812 52.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(0.392157%,14.117648%,49.019608%);fill-opacity:1;" d="M 87.632812 52.210938 C 102.828125 59.730469 117.984375 67.308594 133.097656 74.941406 C 117.902344 74.941406 102.710938 74.941406 87.519531 74.941406 C 87.480469 67.347656 87.519531 59.769531 87.632812 52.210938 Z M 87.632812 52.210938 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(69.803923%,13.333334%,20.392157%);fill-opacity:1;" d="M -0.0585938 57.632812 C 11.480469 57.632812 23.019531 57.632812 34.558594 57.632812 C 30.695312 59.625 26.808594 61.585938 22.902344 63.519531 C 15.269531 63.402344 7.617188 63.367188 -0.0585938 63.402344 C -0.0585938 61.480469 -0.0585938 59.558594 -0.0585938 57.632812 Z M -0.0585938 57.632812 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M -0.0585938 63.402344 C 7.617188 63.367188 15.269531 63.402344 22.902344 63.519531 C 19.082031 65.371094 15.273438 67.257812 11.480469 69.171875 C 7.632812 69.171875 3.789062 69.171875 -0.0585938 69.171875 C -0.0585938 67.25 -0.0585938 65.328125 -0.0585938 63.402344 Z M -0.0585938 63.402344 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(69.803923%,13.725491%,20.784314%);fill-opacity:1;" d="M -0.0585938 69.171875 C 3.789062 69.171875 7.632812 69.171875 11.480469 69.171875 C 7.710938 71.097656 3.941406 73.019531 0.171875 74.941406 C 0.0976562 74.941406 0.0195312 74.941406 -0.0585938 74.941406 C -0.0585938 73.019531 -0.0585938 71.097656 -0.0585938 69.171875 Z M -0.0585938 69.171875 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 62 KiB

+3 -2
View File
@@ -111,7 +111,8 @@
"pangaea": "Пангея",
"map": "Карта",
"betweentwoseas": "Между Две Морета",
"japanandneighbors": "Япония и съседи"
"japan": "Япония и съседи",
"knownworld": "Познат Свят"
},
"private_lobby": {
"title": "Присъединяване към частна игра",
@@ -169,7 +170,7 @@
"lang_code": "bg"
},
"game_mode": {
"ffa": "Свободна игра (FFA)",
"ffa": "Всеки срещу всеки (FFA)",
"teams": "Отбори"
}
}
+2 -1
View File
@@ -111,7 +111,8 @@
"pangaea": "Pangaea",
"map": "Karte",
"betweentwoseas": "Zwischen zwei Meeren",
"japanandneighbors": "Japan und Nachbarländer"
"japan": "Japan und Nachbarländer",
"knownworld": "Bekannte Welt"
},
"private_lobby": {
"title": "Privater Lobby beitreten",
+2 -1
View File
@@ -2,7 +2,7 @@
"lang": {
"en": "English",
"native": "English",
"svg": "xx",
"svg": "uk_us_flag",
"lang_code": "en"
},
"main": {
@@ -22,6 +22,7 @@
"action_alt_view": "Alternate view (terrain/countries)",
"action_attack_altclick": "Attack (when left click is set to open menu)",
"action_build": "Open build menu",
"action_emote": "Open emote menu",
"action_center": "Center camera on player",
"action_zoom": "Zoom out/in",
"action_move_camera": "Move camera",
+4 -1
View File
@@ -109,7 +109,10 @@
"random": "Willekeurig",
"iceland": "IJsland",
"pangaea": "Pangea",
"map": "Kaart"
"map": "Kaart",
"betweentwoseas": "Tussen twee zeeën",
"japan": "Japan en buren",
"knownworld": "Bekende Wereld"
},
"private_lobby": {
"title": "Privélobby toetreden",
+5 -2
View File
@@ -109,7 +109,10 @@
"random": "Losowe",
"iceland": "Islandia",
"pangaea": "Pangea",
"map": "Mapa"
"map": "Mapa",
"betweentwoseas": "Między dwoma morzami",
"japan": "Japonia i sąsiedzi",
"knownworld": "Znany Świat"
},
"private_lobby": {
"title": "Dołącz do prywatnego Lobby",
@@ -167,7 +170,7 @@
"lang_code": "pl"
},
"game_mode": {
"ffa": "Darmowe dla wszystkich",
"ffa": "Każdy na Każdego",
"teams": "Drużyny"
}
}
+2 -1
View File
@@ -111,7 +111,8 @@
"pangaea": "Пангея",
"map": "Карта",
"betweentwoseas": "Между двух морей",
"japanandneighbors": "Япония и соседи"
"japan": "Япония и соседи",
"knownworld": "Известный мир"
},
"private_lobby": {
"title": "Присоединиться к приватному лобби",
+2 -1
View File
@@ -111,7 +111,8 @@
"pangaea": "Пангея",
"map": "Мапа",
"betweentwoseas": "Поміж двох морів",
"japanandneighbors": "Японія та сусіди"
"japan": "Японія та сусіди",
"knownworld": "Відомий світ"
},
"private_lobby": {
"title": "Приєднатися до приватного лобі",
@@ -1,5 +1,5 @@
{
"name": "TwoSeas",
"name": "BetweenTwoSeas",
"width": 1778,
"height": 1062,
"nations": [

Before

Width:  |  Height:  |  Size: 7.2 MiB

After

Width:  |  Height:  |  Size: 7.2 MiB

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

+4
View File
@@ -46,6 +46,10 @@ export class HelpModal extends LitElement {
<td>Ctrl + left click</td>
<td>${translateText("help_modal.action_build")}</td>
</tr>
<tr>
<td>Alt + left click</td>
<td>${translateText("help_modal.action_emote")}</td>
</tr>
<tr>
<td>C</td>
<td>${translateText("help_modal.action_center")}</td>
+10
View File
@@ -69,6 +69,12 @@ export class ShowBuildMenuEvent implements GameEvent {
public readonly y: number,
) {}
}
export class ShowEmojiMenuEvent implements GameEvent {
constructor(
public readonly x: number,
public readonly y: number,
) {}
}
export class AttackRatioEvent implements GameEvent {
constructor(public readonly attackRatio: number) {}
@@ -292,6 +298,10 @@ export class InputHandler {
this.eventBus.emit(new ShowBuildMenuEvent(event.clientX, event.clientY));
return;
}
if (event.altKey) {
this.eventBus.emit(new ShowEmojiMenuEvent(event.clientX, event.clientY));
return;
}
const dist =
Math.abs(event.x - this.lastPointerDownX) +
+9 -1
View File
@@ -11,6 +11,7 @@ import "./components/Difficulties";
import { DifficultyDescription } from "./components/Difficulties";
import "./components/Maps";
import { JoinLobbyEvent } from "./Main";
import { UsernameInput } from "./UsernameInput";
@customElement("single-player-modal")
export class SinglePlayerModal extends LitElement {
@@ -326,6 +327,13 @@ export class SinglePlayerModal extends LitElement {
const clientID = generateID();
const gameID = generateID();
const usernameInput = document.querySelector(
"username-input",
) as UsernameInput;
if (!usernameInput) {
consolex.warn("Username input element not found");
}
this.dispatchEvent(
new CustomEvent("join-lobby", {
detail: {
@@ -337,7 +345,7 @@ export class SinglePlayerModal extends LitElement {
{
playerID: generateID(),
clientID,
username: "PLACEHOLDER",
username: usernameInput.getCurrentUsername(),
},
],
config: {
+1 -1
View File
@@ -21,7 +21,7 @@ export const MapDescription: Record<keyof typeof GameMapType, string> = {
Australia: "Australia",
Iceland: "Iceland",
Japan: "Japan",
TwoSeas: "Between Two Seas",
BetweenTwoSeas: "Between Two Seas",
KnownWorld: "Known World",
};
+5
View File
@@ -47,6 +47,11 @@ export function createRenderer(
if (!emojiTable || !(emojiTable instanceof EmojiTable)) {
consolex.error("EmojiTable element not found in the DOM");
}
emojiTable.eventBus = eventBus;
emojiTable.transformHandler = transformHandler;
emojiTable.game = game;
emojiTable.initEventBus();
const buildMenu = document.querySelector("build-menu") as BuildMenu;
if (!buildMenu || !(buildMenu instanceof BuildMenu)) {
consolex.error("BuildMenu element not found in the DOM");
+40
View File
@@ -1,5 +1,12 @@
import { LitElement, css, html } from "lit";
import { customElement, state } from "lit/decorators.js";
import { EventBus } from "../../../core/EventBus";
import { AllPlayers } from "../../../core/game/Game";
import { GameView, PlayerView } from "../../../core/game/GameView";
import { TerraNulliusImpl } from "../../../core/game/TerraNulliusImpl";
import { ShowEmojiMenuEvent } from "../../InputHandler";
import { SendEmojiIntentEvent } from "../../Transport";
import { TransformHandler } from "../TransformHandler";
const emojiTable: string[][] = [
["😀", "😊", "🥰", "😇", "😎"],
@@ -17,6 +24,10 @@ const emojiTable: string[][] = [
@customElement("emoji-table")
export class EmojiTable extends LitElement {
public eventBus: EventBus;
public transformHandler: TransformHandler;
public game: GameView;
static styles = css`
:host {
display: block;
@@ -96,6 +107,35 @@ export class EmojiTable extends LitElement {
@state()
private _hidden = true;
initEventBus() {
this.eventBus.on(ShowEmojiMenuEvent, (e) => {
const cell = this.transformHandler.screenToWorldCoordinates(e.x, e.y);
if (!this.game.isValidCoord(cell.x, cell.y)) {
return;
}
const tile = this.game.ref(cell.x, cell.y);
if (!this.game.hasOwner(tile)) {
return;
}
const targetPlayer = this.game.owner(tile);
// maybe redundant due to owner check but better safe than sorry
if (targetPlayer instanceof TerraNulliusImpl) {
return;
}
this.showTable((emoji) => {
const recipient =
targetPlayer == this.game.myPlayer()
? AllPlayers
: (targetPlayer as PlayerView);
this.eventBus.emit(new SendEmojiIntentEvent(recipient, emoji));
this.hideTable();
});
});
}
private onEmojiClicked: (emoji: string) => void = () => {};
render() {
+2 -1
View File
@@ -215,7 +215,8 @@ export class WinModal extends LitElement implements Layer {
!this.hasShownDeathModal &&
myPlayer &&
!myPlayer.isAlive() &&
!this.game.inSpawnPhase()
!this.game.inSpawnPhase() &&
myPlayer.hasSpawned()
) {
this.hasShownDeathModal = true;
this._title = "You died";
+31 -6
View File
@@ -240,28 +240,53 @@ label.option-card:hover {
#private-lobby-bots-count {
width: 80%;
height: 16px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
/* Firefox */
#bots-count::-moz-range-track,
#private-lobby-bots-count::-moz-range-track {
height: 8px;
background: white;
}
#bots-count::-moz-range-progress,
#private-lobby-bots-count::-moz-range-progress {
height: 8px;
background-color: #0075ff;
}
#bots-count::-moz-range-thumb,
#private-lobby-bots-count::-moz-range-thumb {
height: 16px;
width: 16px;
background: #0075ff;
border: none;
border-radius: 50%;
}
/* Chrome */
#bots-count::-webkit-slider-runnable-track,
#private-lobby-bots-count::-webkit-slider-runnable-track {
appearance: none;
height: 8px;
background: linear-gradient(
to right,
#0075ff var(--progress, 0%),
white var(--progress, 0%)
);
height: 8px;
}
#bots-count::-webkit-slider-thumb,
#private-lobby-bots-count::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
height: 16px;
width: 16px;
background: #0075ff;
border-color: #0075ff;
position: relative;
top: -3px;
border: none;
border-radius: 50%;
margin-top: -4px;
}
.random-map {
+3 -3
View File
@@ -1,6 +1,7 @@
import africa from "../../../resources/maps/AfricaThumb.webp";
import asia from "../../../resources/maps/AsiaThumb.webp";
import australia from "../../../resources/maps/AustraliaThumb.webp";
import betweenTwoSeas from "../../../resources/maps/BetweenTwoSeasThumb.webp";
import blackSea from "../../../resources/maps/BlackSeaThumb.webp";
import britannia from "../../../resources/maps/BritanniaThumb.webp";
import europe from "../../../resources/maps/EuropeThumb.webp";
@@ -14,7 +15,6 @@ import northAmerica from "../../../resources/maps/NorthAmericaThumb.webp";
import oceania from "../../../resources/maps/OceaniaThumb.webp";
import pangaea from "../../../resources/maps/PangaeaThumb.webp";
import southAmerica from "../../../resources/maps/SouthAmericaThumb.webp";
import twoSeas from "../../../resources/maps/TwoSeasThumb.webp";
import world from "../../../resources/maps/WorldMapThumb.webp";
import { GameMapType } from "../../core/game/Game";
@@ -53,8 +53,8 @@ export function getMapsImage(map: GameMapType): string {
return iceland;
case GameMapType.Japan:
return japan;
case GameMapType.TwoSeas:
return twoSeas;
case GameMapType.BetweenTwoSeas:
return betweenTwoSeas;
case GameMapType.KnownWorld:
return knownworld;
default:
+5 -1
View File
@@ -25,6 +25,8 @@ import {
} from "./game/GameUpdates";
import { loadTerrainMap as loadGameMap } from "./game/TerrainMapLoader";
import { ClientID, GameStartInfo, Turn } from "./Schemas";
import { sanitize } from "./Util";
import { fixProfaneUsername } from "./validations/username";
export async function createGameRunner(
gameStart: GameStartInfo,
@@ -38,7 +40,9 @@ export async function createGameRunner(
(p) =>
new PlayerInfo(
p.flag,
p.username,
p.clientID == clientID
? sanitize(p.username)
: fixProfaneUsername(sanitize(p.username)),
PlayerType.Human,
p.clientID,
p.playerID,
+6 -4
View File
@@ -95,9 +95,11 @@ export abstract class DefaultServerConfig implements ServerConfig {
}
// Maps smaller than ~2 mil pixels
if (
[GameMapType.TwoSeas, GameMapType.BlackSea, GameMapType.Pangaea].includes(
map,
)
[
GameMapType.BetweenTwoSeas,
GameMapType.BlackSea,
GameMapType.Pangaea,
].includes(map)
) {
return Math.random() < 0.2 ? 60 : 35;
}
@@ -266,7 +268,7 @@ export class DefaultConfig implements Config {
case UnitType.AtomBomb:
return {
cost: (p: Player) =>
p.type() == PlayerType.Human && this.infiniteGold() ? 0 : 750_000,
p.type() == PlayerType.Human && this.infiniteGold() ? 0 : 500_000,
territoryBound: false,
};
case UnitType.HydrogenBomb:
+2 -12
View File
@@ -1,8 +1,7 @@
import { Execution, Game, PlayerInfo, PlayerType } from "../game/Game";
import { PseudoRandom } from "../PseudoRandom";
import { ClientID, GameID, Intent, Turn } from "../Schemas";
import { sanitize, simpleHash } from "../Util";
import { fixProfaneUsername } from "../validations/username";
import { simpleHash } from "../Util";
import { AllianceRequestExecution } from "./alliance/AllianceRequestExecution";
import { AllianceRequestReplyExecution } from "./alliance/AllianceRequestReplyExecution";
import { BreakAllianceExecution } from "./alliance/BreakAllianceExecution";
@@ -62,16 +61,7 @@ export class Executor {
return new MoveWarshipExecution(intent.unitId, intent.tile);
case "spawn":
return new SpawnExecution(
new PlayerInfo(
intent.flag,
// Players see their original name, others see a sanitized version
intent.clientID == this.clientID
? sanitize(intent.name)
: fixProfaneUsername(sanitize(intent.name)),
PlayerType.Human,
intent.clientID,
playerID,
),
player.info(),
this.mg.ref(intent.x, intent.y),
);
case "boat":
+43 -56
View File
@@ -16,7 +16,7 @@ import {
Unit,
UnitType,
} from "../game/Game";
import { andFN, euclDistFN, manhattanDistFN, TileRef } from "../game/GameMap";
import { euclDistFN, manhattanDistFN, TileRef } from "../game/GameMap";
import { PseudoRandom } from "../PseudoRandom";
import { GameID } from "../Schemas";
import { calculateBoundingBox, simpleHash } from "../Util";
@@ -169,12 +169,12 @@ export class FakeHumanExecution implements Execution {
if (enemyborder.length == 0) {
if (this.random.chance(5)) {
this.sendBoat();
this.sendBoatRandomly();
}
return;
}
if (this.random.chance(10)) {
this.sendBoat();
this.sendBoatRandomly();
return;
}
@@ -588,58 +588,30 @@ export class FakeHumanExecution implements Execution {
);
}
sendBoat(tries: number = 0, oceanShore: TileRef[] = null) {
if (tries > 10) {
return;
}
if (oceanShore == null) {
oceanShore = Array.from(this.player.borderTiles()).filter((t) =>
this.mg.isOceanShore(t),
);
}
sendBoatRandomly() {
const oceanShore = Array.from(this.player.borderTiles()).filter((t) =>
this.mg.isOceanShore(t),
);
if (oceanShore.length == 0) {
return;
}
const src = this.random.randElement(oceanShore);
const otherShore = Array.from(
this.mg.bfs(
src,
andFN(
(gm, t) => gm.isOcean(t) || gm.isOceanShore(t),
manhattanDistFN(src, 200),
),
const dst = this.randOceanShoreTile(src, 250);
if (dst == null) {
return;
}
this.mg.addExecution(
new TransportShipExecution(
this.player.id(),
this.mg.owner(dst).id(),
dst,
this.player.troops() / 5,
),
).filter((t) => this.mg.isOceanShore(t) && this.mg.owner(t) != this.player);
if (otherShore.length == 0) {
return;
}
for (let i = 0; i < 20; i++) {
const dst = this.random.randElement(otherShore);
if (this.isSmallIsland(dst)) {
continue;
}
if (
this.mg.owner(dst).isPlayer() &&
this.player.isFriendly(this.mg.owner(dst) as Player)
) {
continue;
}
this.mg.addExecution(
new TransportShipExecution(
this.player.id(),
this.mg.hasOwner(dst) ? this.mg.owner(dst).id() : null,
dst,
this.player.troops() / 5,
),
);
return;
}
this.sendBoat(tries + 1, oceanShore);
);
return;
}
randomLand(): TileRef | null {
@@ -684,13 +656,28 @@ export class FakeHumanExecution implements Execution {
);
}
isSmallIsland(tile: TileRef): boolean {
return (
this.mg.bfs(
tile,
andFN((gm, t) => gm.isLand(t), manhattanDistFN(tile, 10)),
).size < 50
);
private randOceanShoreTile(tile: TileRef, dist: number): TileRef | null {
const x = this.mg.x(tile);
const y = this.mg.y(tile);
for (let i = 0; i < 500; i++) {
const randX = this.random.nextInt(x - dist, x + dist);
const randY = this.random.nextInt(y - dist, y + dist);
if (!this.mg.isValidCoord(randX, randY)) {
continue;
}
const randTile = this.mg.ref(randX, randY);
if (!this.mg.isOceanShore(randTile)) {
continue;
}
const owner = this.mg.owner(randTile);
if (!owner.isPlayer()) {
return randTile;
}
if (!owner.isFriendly(this.player)) {
return randTile;
}
}
return null;
}
owner(): Player {
+13 -16
View File
@@ -25,28 +25,25 @@ export class SpawnExecution implements Execution {
return;
}
const existing = this.mg
.players()
.find((p) => p.id() == this.playerInfo.id);
if (existing) {
existing.tiles().forEach((t) => existing.relinquish(t));
getSpawnTiles(this.mg, this.tile).forEach((t) => {
existing.conquer(t);
});
return;
let player: Player = null;
if (this.mg.hasPlayer(this.playerInfo.id)) {
player = this.mg.player(this.playerInfo.id);
} else {
player = this.mg.addPlayer(this.playerInfo);
}
const player = this.mg.addPlayer(
this.playerInfo,
this.mg.config().startManpower(this.playerInfo),
);
player.tiles().forEach((t) => player.relinquish(t));
getSpawnTiles(this.mg, this.tile).forEach((t) => {
player.conquer(t);
});
this.mg.addExecution(new PlayerExecution(player.id()));
if (player.type() == PlayerType.Bot) {
this.mg.addExecution(new BotExecution(player));
if (!player.hasSpawned()) {
this.mg.addExecution(new PlayerExecution(player.id()));
if (player.type() == PlayerType.Bot) {
this.mg.addExecution(new BotExecution(player));
}
}
player.setHasSpawned(true);
}
owner(): Player {
+3
View File
@@ -111,6 +111,9 @@ export class TradeShipExecution implements Execution {
break;
case PathFindResultType.PathNotFound:
consolex.warn("captured trade ship cannot find route");
if (this.tradeShip.isActive()) {
this.tradeShip.delete(false);
}
this.active = false;
break;
}
+5 -2
View File
@@ -60,7 +60,7 @@ export enum GameMapType {
Australia = "Australia",
Iceland = "Iceland",
Japan = "Japan",
TwoSeas = "Between Two Seas",
BetweenTwoSeas = "Between Two Seas",
KnownWorld = "Known World",
}
@@ -316,6 +316,9 @@ export interface Player {
largestClusterBoundingBox: { min: Cell; max: Cell } | null;
lastTileChange(): Tick;
hasSpawned(): boolean;
setHasSpawned(hasSpawned: boolean): void;
// Territory
tiles(): ReadonlySet<TileRef>;
borderTiles(): ReadonlySet<TileRef>;
@@ -430,7 +433,7 @@ export interface Game extends GameMap {
playerByClientID(id: ClientID): Player | null;
playerBySmallID(id: number): Player | TerraNullius;
hasPlayer(id: PlayerID): boolean;
addPlayer(playerInfo: PlayerInfo, manpower: number): Player;
addPlayer(playerInfo: PlayerInfo): Player;
terraNullius(): TerraNullius;
owner(ref: TileRef): Player | TerraNullius;
+4 -8
View File
@@ -107,7 +107,7 @@ export class GameImpl implements Game {
private addHumans() {
if (this.config().gameConfig().gameMode != GameMode.Team) {
this._humans.forEach((p) => this.addPlayer(p, 0));
this._humans.forEach((p) => this.addPlayer(p));
return;
}
const playerToTeam = assignTeams(this._humans);
@@ -116,7 +116,7 @@ export class GameImpl implements Game {
console.warn(`Player ${playerInfo.name} was kicked from team`);
continue;
}
this.addPlayer(playerInfo, 0, team);
this.addPlayer(playerInfo, team);
}
}
@@ -346,16 +346,12 @@ export class GameImpl implements Game {
return this.player(id);
}
addPlayer(
playerInfo: PlayerInfo,
manpower: number,
team: Team = null,
): Player {
addPlayer(playerInfo: PlayerInfo, team: Team = null): Player {
const player = new PlayerImpl(
this,
this.nextPlayerID,
playerInfo,
manpower,
this.config().startManpower(playerInfo),
team ?? this.maybeAssignTeam(playerInfo),
);
this._playersBySmallID.push(player);
+1
View File
@@ -111,6 +111,7 @@ export interface PlayerUpdate {
incomingAttacks: AttackUpdate[];
outgoingAllianceRequests: PlayerID[];
stats: PlayerStats;
hasSpawned: boolean;
}
export interface AllianceRequestUpdate {
+3
View File
@@ -266,6 +266,9 @@ export class PlayerView {
stats(): PlayerStats {
return this.data.stats;
}
hasSpawned(): boolean {
return this.data.hasSpawned;
}
}
export class GameView implements GameMap {
+12 -1
View File
@@ -94,12 +94,14 @@ export class PlayerImpl implements Player {
public _outgoingAttacks: Attack[] = [];
public _outgoingLandAttacks: Attack[] = [];
private _hasSpawned = false;
constructor(
private mg: GameImpl,
private _smallID: number,
private readonly playerInfo: PlayerInfo,
startTroops: number,
private _team: Team | null,
private readonly _team: Team | null,
) {
this._flag = playerInfo.flag;
this._name = sanitizeUsername(playerInfo.name);
@@ -162,6 +164,7 @@ export class PlayerImpl implements Player {
),
outgoingAllianceRequests: outgoingAllianceRequests,
stats: this.mg.stats().getPlayerStats(this.id()),
hasSpawned: this.hasSpawned(),
};
}
@@ -291,6 +294,14 @@ export class PlayerImpl implements Player {
return this._tiles.size > 0;
}
hasSpawned(): boolean {
return this._hasSpawned;
}
setHasSpawned(hasSpawned: boolean): void {
this._hasSpawned = hasSpawned;
}
incomingAllianceRequests(): AllianceRequest[] {
return this.mg.allianceRequests.filter((ar) => ar.recipient() == this);
}
+1 -1
View File
@@ -39,7 +39,7 @@ const MAP_FILE_NAMES: Record<GameMapType, string> = {
[GameMapType.Australia]: "Australia",
[GameMapType.Iceland]: "Iceland",
[GameMapType.Japan]: "Japan",
[GameMapType.TwoSeas]: "TwoSeas",
[GameMapType.BetweenTwoSeas]: "BetweenTwoSeas",
[GameMapType.KnownWorld]: "KnownWorld",
};
+1 -1
View File
@@ -19,7 +19,7 @@ const maps = [
"Australia",
"Pangaea",
"Iceland",
"TwoSeas",
"BetweenTwoSeas",
"Japan",
"KnownWorld",
];
+3 -3
View File
@@ -10,10 +10,10 @@ const log = logger.child({ component: "Archive" });
// R2 client configuration
const r2 = new S3({
region: "auto", // R2 ignores region, but it's required by the SDK
endpoint: config.r2Endpoint(), // You'll need to add this to your config
endpoint: config.r2Endpoint(),
credentials: {
accessKeyId: config.r2AccessKey(), // You'll need to add these
secretAccessKey: config.r2SecretKey(), // credential methods to your config
accessKeyId: config.r2AccessKey(),
secretAccessKey: config.r2SecretKey(),
},
});
+2 -2
View File
@@ -369,8 +369,8 @@ export class GameServer {
this.turns,
this._startTime,
Date.now(),
this.winner.winner,
this.winner.winnerType,
this.winner?.winner,
this.winner?.winnerType,
this.allPlayersStats,
),
);
+1 -1
View File
@@ -88,7 +88,7 @@ export class MapPlaylist {
Pangaea: 1,
Asia: 1,
Mars: 1,
TwoSeas: 3,
BetweenTwoSeas: 3,
Japan: 3,
BlackSea: 1,
};
+2 -2
View File
@@ -39,7 +39,7 @@ describe("Attack", () => {
null,
"attacker_id",
);
game.addPlayer(attackerInfo, 1000);
game.addPlayer(attackerInfo);
const defenderInfo = new PlayerInfo(
"us",
"defender dude",
@@ -47,7 +47,7 @@ describe("Attack", () => {
null,
"defender_id",
);
game.addPlayer(defenderInfo, 1000);
game.addPlayer(defenderInfo);
defenderSpawn = game.ref(0, 15);
attackerSpawn = game.ref(0, 10);
+1 -1
View File
@@ -38,7 +38,7 @@ describe("MissileSilo", () => {
null,
"attacker_id",
);
game.addPlayer(attacker_info, 1000);
game.addPlayer(attacker_info);
game.addExecution(
new SpawnExecution(game.player(attacker_info.id).info(), game.ref(1, 1)),
+2 -2
View File
@@ -50,8 +50,8 @@ describe("SAM", () => {
null,
"attacker_id",
);
game.addPlayer(defender_info, 1000);
game.addPlayer(attacker_info, 1000);
game.addPlayer(defender_info);
game.addPlayer(attacker_info);
game.addExecution(
new SpawnExecution(game.player(defender_info.id).info(), game.ref(1, 1)),
-1
View File
@@ -7,7 +7,6 @@ describe("Territory management", () => {
const game = await setup("Plains");
game.addPlayer(
new PlayerInfo("us", "test_player", PlayerType.Human, null, "test_id"),
1000,
);
const spawnTile = game.map().ref(50, 50);
game.addExecution(
+2 -2
View File
@@ -27,7 +27,7 @@ describe("Warship", () => {
null,
"player_1_id",
);
game.addPlayer(player_1_info, 1000);
game.addPlayer(player_1_info);
const player_2_info = new PlayerInfo(
"us",
"boat dude",
@@ -35,7 +35,7 @@ describe("Warship", () => {
null,
"player_2_id",
);
game.addPlayer(player_2_info, 1000);
game.addPlayer(player_2_info);
game.addExecution(
new SpawnExecution(