初始化

This commit is contained in:
Vectorune
2025-09-13 16:18:30 +08:00
commit 754f4d97b3
91 changed files with 29581 additions and 0 deletions

23
.gitignore vendored Normal file
View File

@ -0,0 +1,23 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*

14
Dockerfile Normal file
View File

@ -0,0 +1,14 @@
FROM nginx:alpine
COPY build /usr/share/nginx/html
COPY deploy/entrypoint.sh /entrypoint.sh
COPY deploy/nginx.conf /etc/nginx/conf.d/default.conf
ENV BACKEND_ADDRESS="http://localhost:31000"
ENV BACKEND_TIMEOUT=10000
RUN chmod +x /entrypoint.sh
EXPOSE 80
CMD ["/entrypoint.sh"]

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 李东璋
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

70
README.md Normal file
View File

@ -0,0 +1,70 @@
# Getting Started with Create React App
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
## Available Scripts
In the project directory, you can run:
### `npm start`
Runs the app in the development mode.\
Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
The page will reload when you make changes.\
You may also see any lint errors in the console.
### `npm test`
Launches the test runner in the interactive watch mode.\
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
### `npm run build`
Builds the app for production to the `build` folder.\
It correctly bundles React in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.\
Your app is ready to be deployed!
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
### `npm run eject`
**Note: this is a one-way operation. Once you `eject`, you can't go back!**
If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
## Learn More
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
To learn React, check out the [React documentation](https://reactjs.org/).
### Code Splitting
This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
### Analyzing the Bundle Size
This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
### Making a Progressive Web App
This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
### Advanced Configuration
This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
### Deployment
This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
### `npm run build` fails to minify
This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)

6
deploy/entrypoint.sh Normal file
View File

@ -0,0 +1,6 @@
#!/bin/sh
echo "window.BACKEND_ADDRESS = \"${BACKEND_ADDRESS}\";" > /usr/share/nginx/html/runtime-config.js
echo "window.BACKEND_TIMEOUT = ${BACKEND_TIMEOUT};" >> /usr/share/nginx/html/runtime-config.js
exec nginx -g "daemon off;"

17
deploy/nginx.conf Normal file
View File

@ -0,0 +1,17 @@
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri /index.html;
}
location ~* \.svg$ {
add_header Content-Type image/svg+xml;
try_files $uri =404;
}
}

19702
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

46
package.json Normal file
View File

@ -0,0 +1,46 @@
{
"name": "efc-workload-base-web",
"version": "0.1.0",
"private": true,
"dependencies": {
"@ant-design/icons": "^5.3.7",
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"antd": "^5.17.3",
"antd-mobile": "^5.36.1",
"axios": "^1.7.9",
"lodash": "^4.17.21",
"react": "^18.3.1",
"react-countup": "^6.5.3",
"react-dom": "^18.3.1",
"react-router-dom": "^6.23.1",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}

View File

@ -0,0 +1,45 @@
<svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
<defs>
<style>.cls-1{fill:none;}</style>
</defs>
<path class="cls-1"
d="M0,0H1024V1024H0ZM420.13,740.21c24,.48,47.93-6.77,71.81-3.21,32.64,6.32,66.54,5.44,97.81-6.67a17.43,17.43,0,0,1,14.4.45c21.57,10,44.63,15.31,68,17C746.91,754.15,826,724,868,659.68,917.87,588.1,892.93,486.73,822.32,439c-45.42-33.65-103.83-46.17-159.59-39.44-25.14,6.35-48.74,17.28-74.46,22-8.43,2.11-16.8,2.39-23.28-5.38s-13.54-15.1-19.9-23c-27.75-33.75-40.17-79.49-28-122,13.29-40.1,34.53-81.15,73.61-101,28.95-14.25,61.3-22,93.55-20.47,2.16-.08,4.27-1.71,6.41-2.62-4.23-6.23-11.39-7.38-18.06-9.59-80-28.43-171.12,20.17-200.78,97.88-5.3,12.9-5,13-18.71,11.46-87.72-9.19-178.79,22.34-236.81,89.89-57,63.27-75.1,157.6-44.62,237.33,2.17,5.6,2,6.23-3.78,8.19-9.45,3.21-19.19,5.77-28.29,9.77C48.9,625.25-17.57,763.48,76.92,829.34c10,6.93-7.68,17.32,9.51,32.2,23.42,22.77,53.53,8.38,77.65-5.27,20.14-8.54,44.58-18.74,66.56-16.34,29.51,5.13,57.1,19.31,84.87,30.05,30.32,7.92,68.83,20.1,89.25-12.54a37.42,37.42,0,0,1,9.13-9.06c54.82-40.29,127,1.77,183.39,19.73,30.46,11.24,60.5,23.53,90.29,36.43,77.74,31,144.6,8.41,169.4-74.92-7.7.93-12.22,13.27-18.87,17.66-36.11,26.54-85.41,28.58-128,19.82-44.93-8.55-82.52-36.51-127.17-46.5l.3-1.72c4.21.43,10.79.49,12.3-4,.59-7.83,2.28-16.06-5.13-22.22-2.21-1.83-4.05-4.78-1.49-7.43,8.8-9.09,5.82-17.43-1.09-25.72-2.39-4.71-5.81-7.13-11.44-7-15.48.13-31-.26-46.44-.54-8.37-.62-4.86,10-5.65,15.23,0,13.33,0,26.66-.09,40,0,2.84-.71,5.54-4.33,5.52s-4.14-2.39-4.12-5.47c.12-14.49-.1-29,.18-43.47.22-11.54.44-11-11.21-11.35-7.26-.23-11.29,2.46-14.56,8.56-4.38,8.2-9.49,16-14.35,24-6.32,11.17-14.77-15.22-19.09-19.22-8.6-13.84-8.63-13.78-24.73-13.4-7.42-.14-2.2,11.39-3.59,16.09q-.09,21.48-.25,43c-1.15,9.71,7.1,7,13.65,7.4l.51,1.74c-31.47,13.31-65.76,22-99.91,23.79-32.11-.23-63.05-12.84-93.75-21.21l-1.48-2c35.24-20.74,62.62-53.76,75.2-92.91,1.89-6,5.39-4,9-2.84,27.63,10.08,56.1,13.82,85.35,14.68l.63,1.62c-6.27,6-16.5,8.53-15.61,19.15.55,15.82.19,31.66.19,47.49,0,9.14,0,9.13,8.77,10.13,5.8,1.17,10.12,1.66,9.53-5.84C420.16,788.13,420.13,764.89,420.13,740.21ZM871.08,441c32.9-30.68,72.25-81.2,53-128.35C886,234.51,817.05,161,725.4,155.33c-97.22-3-141.22,77.74-44.86,130.9,45.79,31.32,103.42,36,149.54,65.32,12.26,8.56,24.31,17.82,28.52,32.94C863.59,403.38,867.43,421.67,871.08,441Zm62-125.79c15.63-39.09,23.52-86.12,1.85-124.59-25.89-42.11-60.26-88.77-110.64-101.18C780,81.21,730.82,74.61,694.6,107.7c-3.64,3-3.57,5.48.07,8.49,26.61,26,38.58,22.12,71.93,30.05C849.51,165,897.84,243.8,933.13,315.24Zm-52.7,405.62v-.33c-20,1.09-40.86-2.34-60.39,1.63,2.08,8.82,10.31,14.36,14.37,22.18,5.66,9.88,17.59,5.7,26.84,6.43,9.19-.91,4.73,10.23,5.69,15.79q0,38.73.1,77.46c0,4,.51,7.54,4,10.21,5.76,2.72,26.58,26.94,26.94,10.92q0-54.21-.39-108.42c0-4.29,1.8-5.64,5.55-5.71,8.17-1.39,19.17,3,24.93-4.45,5.64-7.15,11.53-14.11,17.22-21.22,5.15-8.48-10.42-4.09-14.39-4.53C914.08,720.92,897.26,720.86,880.43,720.86ZM684.87,784.59h.18c.11,9-.15,18-.17,27,.12,7,.82,7.73,7.75,7.74,13.82,0,27.65-.46,41.45,0,7.49.26,13-1.24,16-8.75,16.78-20.21-5-15.51,2.76-29.55,8.61-9.08-.92-15.93-5-23.95-4.93-8.11-16.72-2.85-24.64-4.3-10.32,0-20.65,0-31,0-6.5,0-7.35.81-7.36,6.9Q684.85,772.1,684.87,784.59ZM350.45,819.45v-.17c8.5,0,17-.22,25.49.08,9.87,1,13.15-9.18,17.44-16,3.49-6.62-5.14-23.56-12.57-24.85-11.79-.57-23.67-.06-35.48-.25-3.18-.07-6.43-.87-6.55-4.65-.28-5.08,4.82-5.64,8.87-5.41,8.83,0,17.75-.8,26.47.17,8.07,3.35,28.37-15.92,17.05-16.25-16.82.17-33.64.86-50.43.43-7.64-.19-11.95,2.23-16,8.72-9,14.29-6.89,11.07.25,24.08,3.38,6.15,7.83,7.74,14.17,7.61,10-.19,20,0,30,.2,3.22.06,6,1.18,5.75,5.29-.23,3.8-2.8,4.5-5.92,4.52-9,0-18.1,1-27-.12-9.67-1.76-21.59,6.65-22.41,15.39C328.85,821.26,340.5,818.61,350.45,819.45Zm451.24-66.79v.05c-3.66,0-7.38.4-11-.08-12.8-2.63-25.08,8-25.66,21,.85,18.56-5,40.95,19.92,45.63,19-.68,50.15,6.25,53-20.7-1.05-14.85,4.27-32.16-9.52-42.25C821,750.17,810.53,753.28,801.69,752.66Zm-161.06.13v-.07c-17.44-1.44-36.11,1.22-37.17,22.82.74,10.32-2.18,21.53,3.23,31,4.29,5.7,8.9,13.35,17,12.74,10.65-.11,21.3,0,32,0,25-2.91,21.55-27.07,21.4-45.78C674.93,753.21,657.1,751.59,640.63,752.79Z"
transform="translate(0 0)"/>
<path d="M420.13,740.21c0,24.67,0,47.93,0,72.4.59,7.47-3.73,7-9.53,5.84-8.77-1-8.77-1-8.77-10.13,0-15.83.36-31.67-.19-47.49-.89-10.61,9.34-13.13,15.61-19.15l-.63-1.62c-29.26-.86-57.72-4.6-85.35-14.68-3.57-1.19-7.07-3.11-9,2.84-12.58,39.15-40,72.17-75.2,92.91l1.48,2c30.7,8.37,61.64,21,93.75,21.21,34.15-1.84,68.44-10.48,99.91-23.79l-.51-1.74c-6.5-.37-14.84,2.33-13.65-7.4q.13-21.5.25-43c1.27-4.63-3.65-16.42,3.58-16.09,16.11-.38,16.14-.44,24.74,13.4,4.25,3.93,12.84,30.42,19.09,19.22,4.86-7.94,10-15.76,14.35-24,3.27-6.1,7.3-8.79,14.56-8.56,11.65.37,11.43-.19,11.21,11.35-.28,14.48-.06,29-.18,43.47,0,3.08.56,5.44,4.12,5.47s4.32-2.68,4.33-5.52c.08-13.32.06-26.65.09-40,.8-5.23-2.73-15.84,5.65-15.23,15.48.28,31,.67,46.44.54,5.62-.15,9.06,2.27,11.44,7,18,20.6-7.48,24.43,2.58,33.15,7.41,6.16,5.72,14.39,5.13,22.22-1.56,4.51-8.08,4.47-12.3,4l-.3,1.72c44.65,10,82.24,37.95,127.17,46.5,45.11,8.87,104.36,7.61,136.88-29.26,3.17-3.15,4.85-8.27,10-8.22C821.54,939.69,735.46,930.49,647.1,887.43c-36.22-14.28-72.54-28.58-109.48-40.86-40.33-12.68-86.79-27.33-123.73,1.81a37.42,37.42,0,0,0-9.13,9.06c-20.42,32.62-58.92,20.47-89.26,12.54-27.76-10.73-55.34-24.93-84.86-30.05a59.17,59.17,0,0,0-27.07,2.49c-13.24,4.39-27,7.09-39.49,13.86-24.07,13.6-54.3,28.08-77.65,5.26-17.13-14.71.44-25.43-9.51-32.2C-17.5,763.44,48.86,625.28,139.63,592c9.1-4,18.84-6.57,28.29-9.78,5.78-2,6-2.59,3.78-8.19-30.48-79.73-12.4-174.06,44.62-237.33,58-67.55,149.09-99.09,236.81-89.89,13.66,1.55,13.41,1.44,18.71-11.46,21.49-53.65,71-96,128.78-104.16,27.2-3.51,68.6-1.91,90.06,15.87-2.14.91-4.25,2.54-6.41,2.62-32.25-1.5-64.6,6.23-93.55,20.47-47.31,24.31-80.83,91.56-78.13,144,2.67,29.72,13.85,56,32.5,79.09,6.36,7.88,13.4,15.2,19.9,23s14.85,7.49,23.28,5.39c25.72-4.75,49.32-15.68,74.46-22a230.14,230.14,0,0,1,59.79.31C845.64,409.76,944.24,548.38,868,659.69,826,724,746.9,754.15,672.16,747.82c-23.38-1.73-46.44-7-68-17a17.43,17.43,0,0,0-14.4-.45c-31.27,12.11-65.17,13-97.81,6.67C468.05,733.45,444.12,740.69,420.13,740.21ZM405,690.48l1.28-1.82c80.08,52.53,202.22,5.29,219.2-90.82,9.19-43.08-7.2-88.68-37.59-119.87-6.9-7.22-14.58-13.77-24.65-17.24-77.37-29.49-115.21-112.49-101.9-191.84C208.86,299.5,174.13,627,417.81,704.9l1-1.39ZM697.57,575c12.44-4.52,23.19.94,35.39,2.5,5.27.79,7.64,3.42,8.74,8.47,3.69,16.91,7.63,33.77,11.63,50.61.93,3.92,0,6.71-3.17,9.17-12.19,9.55-24.48,19-36.31,28.94-11.33,8.7-28.57-2.27-41.71-2.63a8,8,0,0,0-6,2.24c-4.61,4.78-8.74,10-13.11,15-2.51,2.88-2.44,4.85,1.1,7.14,28.1,19,60.94,26.27,94.53,22.11,3.77,0,5.6-1.58,7.39-4.63,5.93-10.69,16.5-17.38,25.72-25,15.86-15.58,44.32-5.34,55.58-27.53,15.77-25.46,24.92-54.71,23.8-84.81-.08-3.45-.83-5-4.68-3.72-9.19,1.33-20.57,10.35-28.57,2.56-11.13-10.76-22.16-21.63-33.57-32.07-10.83-9.53-4.27-24.36-2-36.17,3.73-12.58,3.33-26.43,11.53-37.81C761.65,440.19,696.6,433.67,657,471.1c-3.73,3.82-3.88,4.82-.2,8.91C681.6,506.22,693.86,539.48,697.57,575Zm-565,97c-.18,42.67,37.61,78.17,79.64,77.52,14.53,0,28.66-2.66,41.8-9.82,11.42-6.23,20.09-15.19,28-25.16,5.11-6.46,4.7-8.28-2.24-12.89-38.68-23.47-71.59-55.17-93.23-95.18-2.47-4.45-4.85-5.45-9.21-2.87C151.19,617.2,132.77,642.18,132.57,672Zm-13.12,38.73c-.82-19.42-4-71.7-27.48-75.41-15.39.19-40.43,61.13-45.15,76-5.06,16.29-8.42,32.79-5.73,50.09,1.9,12.15,6.17,23,14.51,32.13C69.43,810,85,791,93.1,778.84c8.38-15,20.35-29.1,24.88-45.73C118.77,725.67,119,718.18,119.45,710.71Zm123.23,44.95-.26-1c-21,5.47-61.95,5-77.07,18.15-15,17.15-29.2,34.92-43.52,52.61-1.84,2.27-2.51,5.25,1.74,6.58,15.59,4.88,31.55,6.4,47.3,2.23,18.88-5,36.95-12.16,52.32-24.94C235.53,798.06,288.12,754,242.68,755.66Zm-83.86,0c-.19-17.91-13.74-21.37-26.36-8.17-17.94,15.4-34.72,34.77-37,59.24-1.19,12.25,13.07,4.35,18.2.56C127.21,796.35,158.18,773.56,158.82,755.68ZM446,819.07c14.89-1.5,28.65-4.17,43.41-5.73,7.71-.88,7.94-.65,8.16-8.52,0-7.17.9-14.46-.61-21.52-8,5.12-10.54,15.42-16.13,22.82-3,4.79-14.89,4.93-17.87.14-5.43-7.41-7.9-17.39-15.55-22.85C444.28,794.82,446.8,806.73,446,819.07Zm112.64-21.55v-.2c-12.58.66-18.09-3.35-16.48,12.36-1.73,7.73,26.44,7.12,32.54,9.14,6-1.37,2.18-9.82,2.54-14.23C576.47,795.06,565.34,797.88,558.68,797.52Zm-.57-16.45v-.13c3.66,0,7.33.16,11-.05,8.75.16,8.95-13.72-.28-12.67-7,.07-14,.2-21-.05-8.25-1.22-8.18,13.49-.21,12.9Zm-458.42,61-.8,1.16c2.14,11,39.65,12.69,30.86,5.14C119.73,846.5,109.87,843.06,99.69,842.09Z"
transform="translate(0 0)"/>
<path d="M871.08,441c-3.65-19.35-7.49-37.66-12.48-56.54-4.21-15.12-16.26-24.38-28.52-32.94-46.11-29.35-103.76-34-149.54-65.33C584.4,233.28,627.9,152.29,725.4,155.33,817.05,161,886,234.51,924.11,312.67,943.48,359.32,903.78,410.73,871.08,441Z"
transform="translate(0 0)"/>
<path d="M933.13,315.24c-35.27-71.42-83.64-150.22-166.53-169-33.4-8-45.24-4-71.93-30.06-3.64-3-3.71-5.52-.07-8.48C730.84,74.62,780,81.21,824.34,89.47c50.39,12.41,84.73,59.07,110.64,101.18C956.66,229.12,948.75,276.14,933.13,315.24Z"
transform="translate(0 0)"/>
<path d="M880.43,720.86c16.83,0,33.65.06,50.48,0,4.09.37,19.47-3.89,14.39,4.53-5.69,7.11-11.58,14.07-17.22,21.22-5.75,7.44-16.77,3.07-24.93,4.45-3.75.07-5.58,1.42-5.55,5.71q.42,54.21.39,108.42c-.34,16.13-21.27-8.35-26.94-10.92-3.5-2.67-4-6.24-4-10.21q0-38.73-.1-77.46c-1-5.56,3.51-16.7-5.69-15.79-9.26-.73-21.17,3.46-26.84-6.43-4.06-7.82-12.29-13.36-14.37-22.18,19.53-4,40.4-.54,60.39-1.63Z"
transform="translate(0 0)"/>
<path d="M684.87,784.59q0-12.48,0-25c0-6.09.86-6.89,7.36-6.9,10.32,0,20.65,0,31,0,7.92,1.43,19.7-3.8,24.64,4.3,4,8,13.57,14.86,5,23.95-7.79,14,14.05,9.23-2.77,29.55-2.93,7.51-8.47,9-16,8.75-13.8-.48-27.63,0-41.45,0-6.93,0-7.63-.74-7.75-7.74,0-9,.28-18,.17-27ZM719.48,803V803c5.15-.77,16.88,2.77,16.93-5-.25-1.94-3.9-4.68-6.21-4.89-7.22-.66-14.55-.31-21.83-.3-3.38,0-5.32,1.61-5.22,5.16C703.51,806.07,714.18,802,719.48,803Zm-.06-24.77v.08c5.15-.64,17,2.68,16.91-5.17-.35-1.93-3.65-4.54-5.78-4.71-7.44-.57-14.94-.2-22.42-.22-3.34,0-4.82,1.85-5,5C703.1,781.33,714.23,777.29,719.42,778.2Z"
transform="translate(0 0)"/>
<path d="M350.45,819.45c-9.95-.83-21.6,1.81-30.88-1.24.79-8.71,12.79-17.18,22.41-15.39,8.86,1.1,18,.15,27,.12,3.12,0,5.69-.72,5.92-4.52.25-4.11-2.53-5.23-5.75-5.29-10-.21-20-.39-30-.2-6.34.13-10.79-1.46-14.17-7.61-7.14-13-9.25-9.79-.25-24.08,4.08-6.49,8.39-8.91,16-8.72,16.79.43,33.61-.26,50.43-.43,11.32.33-9,19.6-17.05,16.25-9.55-1-19.32-.07-29-.15-3.67,0-6.49,1.54-6.37,5.39,1.43,7.92,12.84,3.62,18.55,4.65,7.81.14,15.69-.24,23.48.25,7.43,1.29,16.06,18.23,12.57,24.85-4.29,6.85-7.57,17-17.44,16-8.49-.3-17-.08-25.49-.08Z"
transform="translate(0 0)"/>
<path d="M801.69,752.66c8.84.62,19.34-2.48,26.75,3.6,13.78,10.1,8.47,27.4,9.52,42.25-2.87,27-33.92,20-53,20.7-24.87-4.62-19.1-27.09-19.92-45.63.58-12.9,12.86-23.57,25.66-21,3.6.48,7.32.08,11,.08Zm-.38,50.23V803c5.6-1.33,18.08,3.81,18-5q-.12-12.48,0-25c0-3.63-1.58-4.94-5.2-4.86q-12.74.29-25.48,0c-3.58-.08-5.36,1.2-5.37,4.78C785.17,801.54,775.06,804.07,801.31,802.89Z"
transform="translate(0 0)"/>
<path d="M640.63,752.79c16.56-1.14,34.19.3,36.48,20.71.14,18.69,3.62,42.88-21.41,45.78-10.66-.08-21.31-.14-32,0-8.15.61-12.76-7-17-12.74-5.41-9.44-2.49-20.65-3.23-31,1.08-21.6,19.71-24.27,37.17-22.82Zm.06,50.08h0c5-1.22,18.21,3.45,18.17-4.2-1.3-5.46,3.36-32.47-3.93-30.44q-14.23,0-28.48,0c-2.86,0-4.29,1.19-4.26,4.19C624.39,801.63,613.47,804.08,640.69,802.87Z"
transform="translate(0 0)"/>
<path class="cls-1"
d="M405,690.48l13.75,13-1,1.39c-243.87-78-208.74-405.5,43.56-436C448,348.21,485.91,431.26,563.27,460.73c10.07,3.47,17.75,10,24.65,17.24,30.39,31.19,46.78,76.79,37.59,119.88-17,96.08-139.12,143.36-219.2,90.81Zm7.72-70.85c-.27,50.33,25.95,36.65,45.55,4.78,22-39.75,38.66-83.5,39.16-129.51.45-50.51-32.82-29.49-47.76.46C429.94,534.14,414.09,575.62,412.75,619.63ZM296.52,474.75c-6.86,14.27-9.09,29.23-13.19,44.31-3.72,12.53-10.59,87.2,17.28,62,19.32-26.94,26-59.54,30.56-91.8,1.24-11.55,3.08-44.5-12.25-45.47-5.68.86-12.71,9.08-12.93,14.71,9.25-.21,16.79,2.79,19.68,12.12,1.73,4.45-2.29,11-7.25,13.48C308.57,489,302.39,483.65,296.52,474.75Z"
transform="translate(0 0)"/>
<path class="cls-1"
d="M697.57,575c-3.71-35.53-16-68.77-40.74-95-3.68-4.09-3.53-5.09.2-8.91,39.58-37.43,104.61-30.91,146.78-1.68-8.2,11.38-7.8,25.23-11.53,37.81-2.24,11.79-8.82,26.66,2,36.17,11.41,10.44,22.44,21.31,33.57,32.06,8,7.77,19.35-1.19,28.57-2.55,3.85-1.29,4.6.27,4.68,3.72,1.11,30.1-8,59.35-23.8,84.81-11.27,22.19-39.71,11.95-55.58,27.53-9.22,7.6-19.79,14.29-25.72,25-1.79,3-3.62,4.62-7.39,4.63-33.59,4.16-66.44-3.08-94.53-22.11-3.54-2.29-3.61-4.26-1.1-7.14,4.37-5,8.5-10.25,13.11-15a8,8,0,0,1,6-2.24c13.07.37,30.47,11.31,41.71,2.63,11.83-10,24.12-19.39,36.31-28.94,3.14-2.46,4.1-5.25,3.17-9.17-4-16.84-7.94-33.7-11.63-50.61-1.1-5.05-3.47-7.68-8.74-8.47C720.76,575.94,710,570.48,697.57,575Z"
transform="translate(0 0)"/>
<path class="cls-1"
d="M132.57,672c.59-23.54,10.59-42.94,28.92-58,6.23-3.47,20.2-18.49,25-7.5,21.64,40,54.55,71.71,93.23,95.17,6.94,4.62,7.35,6.44,2.24,12.9-7.9,10-16.57,18.93-28,25.16-13.14,7.16-27.27,9.87-41.8,9.82C170.18,750.16,132.39,714.64,132.57,672Z"
transform="translate(0 0)"/>
<path class="cls-1"
d="M119.45,710.71c-.46,7.47-.68,15-1.47,22.4-4.53,16.63-16.5,30.76-24.87,45.73C85,791,69.42,810,55.6,793.5c-8.34-9.16-12.61-20-14.51-32.13-2.69-17.3.67-33.8,5.73-50.09,4.84-15.07,29.56-75.47,45.15-76C115.37,638.9,118.65,691.38,119.45,710.71Z"
transform="translate(0 0)"/>
<path class="cls-1"
d="M158.82,755.68c-.61,17.83-31.61,40.67-45.2,51.63-5.14,3.81-19.39,11.68-18.2-.56,2.32-24.47,19.09-43.84,37-59.24C145,734.35,158.65,737.72,158.82,755.68Z"
transform="translate(0 0)"/>
<path d="M412.75,619.63c1.34-44,17.19-85.49,36.95-124.27,14.81-29.74,48.19-51.15,47.76-.46-.5,46-17.15,89.76-39.16,129.51C438.83,656.07,412.49,670.15,412.75,619.63ZM472,513.81c23.58.13,21.64-31.7.66-32.39C451.46,482.54,447,512.8,472,513.81Z"
transform="translate(0 0)"/>
<path d="M296.52,474.75c5.87,8.9,12.05,14.26,21.9,9.39,5-2.44,9-9,7.25-13.48-2.9-9.32-10.43-12.33-19.68-12.12,1.4-11.74,18.35-22.78,23-5.36,7.86,33.26-2.46,68.47-12.92,100.12-4.08,9.65-9.79,18.92-15.45,27.8-5.56,9.09-18.38,4.71-18.84-5.42C276.16,541.41,283.83,506.6,296.52,474.75Z"
transform="translate(0 0)"/>
<path class="cls-1" d="M472,513.81c-25-1-20.53-31.27.66-32.39C493.64,482.11,495.58,513.94,472,513.81Z"
transform="translate(0 0)"/>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 124 KiB

363
public/dashboard/notice.svg Normal file
View File

@ -0,0 +1,363 @@
<svg height="1024" node-id="1" sillyvg="true" template-height="1024" template-width="1024"
version="1.1" viewBox="0 0 1024 1024" width="1024" xmlns="http://www.w3.org/2000/svg">
<defs node-id="139">
<linearGradient gradientUnits="objectBoundingBox" id="SVGID_1_" node-id="83" spreadMethod="pad" x1="503.3618"
x2="511.719" y1="621.252" y2="752.951">
<stop offset="0" stop-color="#91b3ff"/>
<stop offset="0.4022" stop-color="#6791f2"/>
<stop offset="0.7939" stop-color="#3b6ce4"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="SVGID_2_" node-id="88" spreadMethod="pad" x1="519.0669"
x2="523.0499" y1="618.2672" y2="681.0345">
<stop offset="0" stop-color="#91b3ff"/>
<stop offset="0.2484" stop-color="#6795ec"/>
<stop offset="0.7939" stop-color="#004cbf"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="SVGID_3_" node-id="97" spreadMethod="pad" x1="743.5417"
x2="706.5889" y1="649.0374" y2="598.7522">
<stop offset="0" stop-color="#efbb81"/>
<stop offset="0.5011" stop-color="#f79e57"/>
<stop offset="1" stop-color="#ff7f2a"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="SVGID_4_" node-id="106" spreadMethod="pad" x1="801.872"
x2="780.7891" y1="686.5665" y2="657.8769">
<stop offset="0" stop-color="#efbb81"/>
<stop offset="0.5011" stop-color="#f79e57"/>
<stop offset="1" stop-color="#ff7f2a"/>
</linearGradient>
</defs>
<g node-id="434">
<path d="M 162.60 716.10 L 162.60 510.30 L 245.00 510.30 L 245.00 362.10 L 385.70 362.10 L 385.70 716.10 Z"
fill="#ccdafe" fill-rule="nonzero" group-id="1" node-id="178" stroke="none" target-height="353.99997"
target-width="223.1" target-x="162.6" target-y="362.1"/>
<g node-id="439">
<path d="M 259.00 386.60 L 287.80 386.60 L 287.80 409.60 L 259.00 409.60 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="182" stroke="none" target-height="23"
target-width="28.799988" target-x="259" target-y="386.6"/>
<path d="M 302.20 386.60 L 331.00 386.60 L 331.00 409.60 L 302.20 409.60 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="184" stroke="none" target-height="23"
target-width="28.799988" target-x="302.2" target-y="386.6"/>
<path d="M 345.40 386.60 L 374.20 386.60 L 374.20 409.60 L 345.40 409.60 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="186" stroke="none" target-height="23"
target-width="28.800018" target-x="345.4" target-y="386.6"/>
<path d="M 259.00 422.60 L 287.80 422.60 L 287.80 445.60 L 259.00 445.60 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="188" stroke="none" target-height="23"
target-width="28.799988" target-x="259" target-y="422.6"/>
<path d="M 302.20 422.60 L 331.00 422.60 L 331.00 445.60 L 302.20 445.60 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="190" stroke="none" target-height="23"
target-width="28.799988" target-x="302.2" target-y="422.6"/>
<path d="M 345.40 422.60 L 374.20 422.60 L 374.20 445.60 L 345.40 445.60 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="192" stroke="none" target-height="23"
target-width="28.800018" target-x="345.4" target-y="422.6"/>
<path d="M 259.00 458.50 L 287.80 458.50 L 287.80 481.50 L 259.00 481.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="194" stroke="none" target-height="23"
target-width="28.799988" target-x="259" target-y="458.5"/>
<path d="M 302.20 458.50 L 331.00 458.50 L 331.00 481.50 L 302.20 481.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="196" stroke="none" target-height="23"
target-width="28.799988" target-x="302.2" target-y="458.5"/>
<path d="M 345.40 458.50 L 374.20 458.50 L 374.20 481.50 L 345.40 481.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="198" stroke="none" target-height="23"
target-width="28.800018" target-x="345.4" target-y="458.5"/>
<path d="M 259.00 494.50 L 287.80 494.50 L 287.80 517.50 L 259.00 517.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="200" stroke="none" target-height="23"
target-width="28.799988" target-x="259" target-y="494.5"/>
<path d="M 302.20 494.50 L 331.00 494.50 L 331.00 517.50 L 302.20 517.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="202" stroke="none" target-height="23"
target-width="28.799988" target-x="302.2" target-y="494.5"/>
<path d="M 345.40 494.50 L 374.20 494.50 L 374.20 517.50 L 345.40 517.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="204" stroke="none" target-height="23"
target-width="28.800018" target-x="345.4" target-y="494.5"/>
<path d="M 259.00 530.50 L 287.80 530.50 L 287.80 553.50 L 259.00 553.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="206" stroke="none" target-height="23"
target-width="28.799988" target-x="259" target-y="530.5"/>
<path d="M 215.80 530.50 L 244.60 530.50 L 244.60 553.50 L 215.80 553.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="208" stroke="none" target-height="23"
target-width="28.800003" target-x="215.8" target-y="530.5"/>
<path d="M 172.70 530.50 L 201.50 530.50 L 201.50 553.50 L 172.70 553.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="210" stroke="none" target-height="23"
target-width="28.800003" target-x="172.7" target-y="530.5"/>
<path d="M 302.20 530.50 L 331.00 530.50 L 331.00 553.50 L 302.20 553.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="212" stroke="none" target-height="23"
target-width="28.799988" target-x="302.2" target-y="530.5"/>
<path d="M 345.40 530.50 L 374.20 530.50 L 374.20 553.50 L 345.40 553.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="214" stroke="none" target-height="23"
target-width="28.800018" target-x="345.4" target-y="530.5"/>
<path d="M 259.00 566.50 L 287.80 566.50 L 287.80 589.50 L 259.00 589.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="216" stroke="none" target-height="23"
target-width="28.799988" target-x="259" target-y="566.5"/>
<path d="M 215.80 566.50 L 244.60 566.50 L 244.60 589.50 L 215.80 589.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="218" stroke="none" target-height="23"
target-width="28.800003" target-x="215.8" target-y="566.5"/>
<path d="M 172.70 566.50 L 201.50 566.50 L 201.50 589.50 L 172.70 589.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="220" stroke="none" target-height="23"
target-width="28.800003" target-x="172.7" target-y="566.5"/>
<path d="M 302.20 566.50 L 331.00 566.50 L 331.00 589.50 L 302.20 589.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="222" stroke="none" target-height="23"
target-width="28.799988" target-x="302.2" target-y="566.5"/>
<path d="M 345.40 566.50 L 374.20 566.50 L 374.20 589.50 L 345.40 589.50 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="224" stroke="none" target-height="23"
target-width="28.800018" target-x="345.4" target-y="566.5"/>
<path d="M 259.00 602.40 L 287.80 602.40 L 287.80 625.40 L 259.00 625.40 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="226" stroke="none" target-height="23"
target-width="28.799988" target-x="259" target-y="602.4"/>
<path d="M 215.80 602.40 L 244.60 602.40 L 244.60 625.40 L 215.80 625.40 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="228" stroke="none" target-height="23"
target-width="28.800003" target-x="215.8" target-y="602.4"/>
<path d="M 172.70 602.40 L 201.50 602.40 L 201.50 625.40 L 172.70 625.40 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="230" stroke="none" target-height="23"
target-width="28.800003" target-x="172.7" target-y="602.4"/>
<path d="M 302.20 602.40 L 331.00 602.40 L 331.00 625.40 L 302.20 625.40 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="232" stroke="none" target-height="23"
target-width="28.799988" target-x="302.2" target-y="602.4"/>
<path d="M 345.40 602.40 L 374.20 602.40 L 374.20 625.40 L 345.40 625.40 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="234" stroke="none" target-height="23"
target-width="28.800018" target-x="345.4" target-y="602.4"/>
<path d="M 259.00 638.40 L 287.80 638.40 L 287.80 661.40 L 259.00 661.40 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="236" stroke="none" target-height="23"
target-width="28.799988" target-x="259" target-y="638.4"/>
<path d="M 215.80 638.40 L 244.60 638.40 L 244.60 661.40 L 215.80 661.40 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="238" stroke="none" target-height="23"
target-width="28.800003" target-x="215.8" target-y="638.4"/>
<path d="M 172.70 638.40 L 201.50 638.40 L 201.50 661.40 L 172.70 661.40 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="240" stroke="none" target-height="23"
target-width="28.800003" target-x="172.7" target-y="638.4"/>
<path d="M 302.20 638.40 L 331.00 638.40 L 331.00 661.40 L 302.20 661.40 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="242" stroke="none" target-height="23"
target-width="28.799988" target-x="302.2" target-y="638.4"/>
<path d="M 345.40 638.40 L 374.20 638.40 L 374.20 661.40 L 345.40 661.40 Z" fill="#a8beef"
fill-rule="nonzero" group-id="1,6" node-id="244" stroke="none" target-height="23"
target-width="28.800018" target-x="345.4" target-y="638.4"/>
</g>
</g>
<g node-id="435">
<path d="M 634.60 713.30 L 634.60 583.70 L 697.90 583.70 L 697.90 434.10 L 794.40 434.10 L 794.40 504.60 L 850.50 504.60 L 850.50 713.30 Z"
fill="#ccdafe" fill-rule="nonzero" group-id="2" node-id="250" stroke="none" target-height="279.19998"
target-width="215.90002" target-x="634.6" target-y="434.1"/>
<g node-id="440">
<path d="M 712.30 452.80 L 741.10 452.80 L 741.10 475.80 L 712.30 475.80 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="254" stroke="none" target-height="23"
target-width="28.799988" target-x="712.3" target-y="452.8"/>
<path d="M 752.60 452.80 L 781.40 452.80 L 781.40 475.80 L 752.60 475.80 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="256" stroke="none" target-height="23"
target-width="28.800049" target-x="752.6" target-y="452.8"/>
<path d="M 712.30 596.70 L 741.10 596.70 L 741.10 619.70 L 712.30 619.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="258" stroke="none" target-height="23"
target-width="28.799988" target-x="712.3" target-y="596.7"/>
<path d="M 672.00 596.70 L 700.80 596.70 L 700.80 619.70 L 672.00 619.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="260" stroke="none" target-height="23"
target-width="28.799988" target-x="672" target-y="596.7"/>
<path d="M 672.00 632.70 L 700.80 632.70 L 700.80 655.70 L 672.00 655.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="262" stroke="none" target-height="23"
target-width="28.799988" target-x="672" target-y="632.7"/>
<path d="M 752.60 596.70 L 781.40 596.70 L 781.40 619.70 L 752.60 619.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="264" stroke="none" target-height="23"
target-width="28.800049" target-x="752.6" target-y="596.7"/>
<path d="M 712.30 488.80 L 741.10 488.80 L 741.10 511.80 L 712.30 511.80 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="266" stroke="none" target-height="23"
target-width="28.799988" target-x="712.3" target-y="488.8"/>
<path d="M 752.60 488.80 L 781.40 488.80 L 781.40 511.80 L 752.60 511.80 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="268" stroke="none" target-height="23"
target-width="28.800049" target-x="752.6" target-y="488.8"/>
<path d="M 712.30 524.70 L 741.10 524.70 L 741.10 547.70 L 712.30 547.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="270" stroke="none" target-height="23"
target-width="28.799988" target-x="712.3" target-y="524.7"/>
<path d="M 752.60 524.70 L 781.40 524.70 L 781.40 547.70 L 752.60 547.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="272" stroke="none" target-height="23"
target-width="28.800049" target-x="752.6" target-y="524.7"/>
<path d="M 792.90 524.70 L 821.70 524.70 L 821.70 547.70 L 792.90 547.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="274" stroke="none" target-height="23"
target-width="28.799988" target-x="792.9" target-y="524.7"/>
<path d="M 792.90 560.70 L 821.70 560.70 L 821.70 583.70 L 792.90 583.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="276" stroke="none" target-height="23"
target-width="28.799988" target-x="792.9" target-y="560.7"/>
<path d="M 792.90 596.70 L 821.70 596.70 L 821.70 619.70 L 792.90 619.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="278" stroke="none" target-height="23"
target-width="28.799988" target-x="792.9" target-y="596.7"/>
<path d="M 792.90 632.70 L 821.70 632.70 L 821.70 655.70 L 792.90 655.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="280" stroke="none" target-height="23"
target-width="28.799988" target-x="792.9" target-y="632.7"/>
<path d="M 712.30 560.70 L 741.10 560.70 L 741.10 583.70 L 712.30 583.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="282" stroke="none" target-height="23"
target-width="28.799988" target-x="712.3" target-y="560.7"/>
<path d="M 752.60 560.70 L 781.40 560.70 L 781.40 583.70 L 752.60 583.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="284" stroke="none" target-height="23"
target-width="28.800049" target-x="752.6" target-y="560.7"/>
<path d="M 712.30 632.70 L 741.10 632.70 L 741.10 655.70 L 712.30 655.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="286" stroke="none" target-height="23"
target-width="28.799988" target-x="712.3" target-y="632.7"/>
<path d="M 752.60 632.70 L 781.40 632.70 L 781.40 655.70 L 752.60 655.70 Z" fill="#a8beef"
fill-rule="nonzero" group-id="2,7" node-id="288" stroke="none" target-height="23"
target-width="28.800049" target-x="752.6" target-y="632.7"/>
</g>
</g>
<g node-id="436">
<path d="M 511.60 286.30 L 401.80 335.90" fill="none" group-id="3" node-id="294" stroke="#3b6ce4"
stroke-linecap="butt" stroke-width="4" target-height="49.600006" target-width="109.80002" target-x="401.8"
target-y="286.3"/>
<path d="M 511.60 286.30 L 621.30 335.90" fill="none" group-id="3" node-id="296" stroke="#3b6ce4"
stroke-linecap="butt" stroke-width="4" target-height="49.600006" target-width="109.69998" target-x="511.6"
target-y="286.3"/>
<path d="M 511.60 297.00 L 507.90 296.30 L 504.70 294.50 L 502.40 291.70 L 501.60 290.00 L 500.90 286.30 L 501.60 282.60 L 503.40 279.40 L 506.20 277.10 L 509.70 275.80 L 513.60 275.80 L 515.30 276.30 L 518.50 278.10 L 520.80 280.90 L 521.60 282.60 L 522.30 286.30 L 521.60 290.00 L 519.80 293.20 L 517.00 295.50 L 515.30 296.30 L 511.60 297.00 Z"
fill="#ffffff" fill-rule="nonzero" group-id="3" node-id="298" stroke="none" target-height="21.200012"
target-width="21.399994" target-x="500.9" target-y="275.8"/>
<path d="M 693.60 549.40 L 329.60 549.40 L 327.50 549.10 L 325.60 548.30 L 324.00 547.10 L 322.70 545.40 L 321.90 543.50 L 321.60 541.40 L 321.90 539.30 L 322.70 537.40 L 323.90 535.80 L 325.60 534.50 L 327.50 533.70 L 329.60 533.40 L 693.60 533.40 L 695.70 533.70 L 697.60 534.50 L 699.20 535.80 L 700.50 537.40 L 701.30 539.30 L 701.60 541.40 L 701.30 543.50 L 700.50 545.40 L 699.20 547.00 L 697.60 548.30 L 695.70 549.10 L 693.60 549.40 Z"
fill="#3b6ce4" fill-rule="nonzero" group-id="3" node-id="300" stroke="none" target-height="16"
target-width="379.99997" target-x="321.6" target-y="533.4"/>
<g node-id="441">
<path d="M 519.60 541.30 L 519.60 624.80 L 503.60 624.80 L 503.60 541.30 Z" fill="#3b6ce4"
fill-rule="nonzero" group-id="3,8" node-id="304" stroke="none" target-height="83.5"
target-width="15.9999695" target-x="503.6" target-y="541.3"/>
</g>
<path d="M 681.60 533.40 L 341.60 533.40 L 341.60 343.40 L 342.20 339.90 L 344.00 337.00 L 346.60 334.80 L 348.10 334.00 L 351.60 333.40 L 671.60 333.40 L 673.40 333.60 L 676.60 334.80 L 679.20 337.00 L 680.20 338.40 L 681.40 341.60 L 681.60 343.40 L 681.60 533.40 Z"
fill="#5d94fa" fill-rule="nonzero" group-id="3" node-id="307" stroke="none" target-height="200.00003"
target-width="339.99997" target-x="341.6" target-y="333.4"/>
<path d="M 351.60 343.40 L 671.60 343.40 L 671.60 523.40 L 351.60 523.40 Z" fill="#ffffff" fill-rule="nonzero"
group-id="3" node-id="309" stroke="none" target-height="180.00003" target-width="319.99997"
target-x="351.6" target-y="343.4"/>
<g node-id="442">
<path d="M 511.60 299.60 L 509.20 299.40 L 507.00 298.80 L 504.90 297.80 L 501.50 294.90 L 499.20 291.00 L 498.60 288.70 L 498.40 286.30 L 498.60 283.90 L 499.20 281.70 L 501.50 277.80 L 504.90 274.90 L 507.00 273.90 L 509.20 273.30 L 511.60 273.10 L 514.00 273.30 L 516.20 273.90 L 520.20 276.20 L 523.10 279.60 L 524.10 281.70 L 524.70 283.90 L 524.90 286.30 L 524.00 290.90 L 523.00 293.00 L 520.10 296.40 L 516.20 298.80 L 514.00 299.40 L 511.60 299.60 Z M 511.60 280.30 L 510.00 280.50 L 507.30 282.10 L 506.30 283.30 L 505.70 284.70 L 505.50 286.40 L 505.70 288.00 L 506.30 289.40 L 507.30 290.70 L 508.50 291.70 L 509.90 292.30 L 511.60 292.50 L 513.20 292.30 L 514.60 291.70 L 515.90 290.70 L 516.90 289.50 L 517.50 288.10 L 517.70 286.40 L 517.40 284.70 L 516.80 283.30 L 515.90 282.10 L 513.20 280.50 L 511.60 280.30 Z"
fill="#3b6ce4" fill-rule="nonzero" group-id="3,9" node-id="313" stroke="none" target-height="26.5"
target-width="26.50003" target-x="498.4" target-y="273.1"/>
</g>
<g node-id="443">
<path d="M 395.10 388.70 L 574.90 388.50 L 578.10 387.30 L 580.70 385.10 L 582.50 382.20 L 583.10 378.70 L 582.50 375.20 L 580.70 372.30 L 578.10 370.10 L 574.90 368.90 L 393.30 368.90 L 390.10 370.10 L 387.50 372.30 L 385.70 375.20 L 385.10 378.70 L 385.70 382.20 L 387.50 385.10 L 390.10 387.30 L 391.60 388.10 L 395.10 388.70 Z"
fill="#c69767" fill-rule="nonzero" group-id="3,10" node-id="318" stroke="none"
target-height="19.800018" target-width="197.99997" target-x="385.1" target-y="368.9"/>
<path d="M 395.10 428.00 L 510.80 427.80 L 514.00 426.60 L 516.60 424.40 L 518.40 421.50 L 519.00 418.00 L 518.40 414.50 L 516.60 411.60 L 514.00 409.40 L 510.80 408.20 L 393.30 408.20 L 390.10 409.40 L 387.50 411.60 L 385.70 414.50 L 385.10 418.00 L 385.70 421.50 L 387.50 424.40 L 390.10 426.60 L 391.60 427.40 L 395.10 428.00 Z"
fill="#c69767" fill-rule="nonzero" group-id="3,10" node-id="320" stroke="none"
target-height="19.799988" target-width="133.9" target-x="385.1" target-y="408.2"/>
<path d="M 624.10 447.30 L 395.10 447.30 L 391.60 447.90 L 388.70 449.70 L 386.50 452.30 L 385.70 453.80 L 385.10 457.30 L 385.70 460.80 L 387.50 463.70 L 390.10 465.90 L 391.60 466.70 L 395.10 467.30 L 624.10 467.30 L 627.60 466.70 L 629.10 465.90 L 631.70 463.70 L 633.50 460.80 L 634.10 457.30 L 633.50 453.80 L 631.70 450.90 L 629.10 448.70 L 627.60 447.90 L 624.10 447.30 Z"
fill="#c69767" fill-rule="nonzero" group-id="3,10" node-id="322" stroke="none" target-height="20"
target-width="248.99997" target-x="385.1" target-y="447.3"/>
<path d="M 464.30 486.60 L 395.00 486.60 L 391.50 487.20 L 388.60 489.00 L 386.40 491.60 L 385.20 494.80 L 385.20 498.40 L 386.40 501.60 L 388.60 504.20 L 391.50 506.00 L 395.00 506.60 L 464.30 506.60 L 467.80 506.00 L 470.70 504.20 L 472.90 501.60 L 474.10 498.40 L 474.10 494.80 L 473.00 491.60 L 470.80 489.00 L 467.80 487.20 L 464.30 486.60 Z"
fill="#c69767" fill-rule="nonzero" group-id="3,10" node-id="324" stroke="none" target-height="20"
target-width="88.899994" target-x="385.2" target-y="486.6"/>
</g>
<g node-id="444">
<path d="M 397.10 385.70 L 576.90 385.50 L 580.10 384.30 L 582.70 382.10 L 584.50 379.20 L 585.10 375.70 L 584.50 372.20 L 582.70 369.30 L 580.10 367.10 L 578.60 366.30 L 575.10 365.70 L 395.30 365.90 L 392.10 367.10 L 389.50 369.30 L 387.70 372.20 L 387.10 375.70 L 387.70 379.20 L 389.50 382.10 L 392.10 384.30 L 393.60 385.10 L 397.10 385.70 Z"
fill="#efbb81" fill-rule="nonzero" group-id="3,11" node-id="329" stroke="none" target-height="20"
target-width="197.99997" target-x="387.1" target-y="365.7"/>
<path d="M 397.10 425.00 L 512.80 424.80 L 516.00 423.60 L 518.60 421.40 L 520.40 418.50 L 521.00 415.00 L 520.40 411.50 L 518.60 408.60 L 516.00 406.40 L 514.50 405.60 L 511.00 405.00 L 395.30 405.20 L 392.10 406.40 L 389.50 408.60 L 387.70 411.50 L 387.10 415.00 L 387.70 418.50 L 388.50 420.00 L 390.70 422.60 L 393.60 424.40 L 397.10 425.00 Z"
fill="#efbb81" fill-rule="nonzero" group-id="3,11" node-id="331" stroke="none" target-height="20"
target-width="133.9" target-x="387.1" target-y="405"/>
<path d="M 626.10 444.30 L 397.10 444.30 L 393.60 444.90 L 390.70 446.70 L 388.50 449.30 L 387.70 450.80 L 387.10 454.30 L 387.70 457.80 L 388.50 459.30 L 390.70 461.90 L 393.60 463.70 L 397.10 464.30 L 626.10 464.30 L 629.60 463.70 L 631.10 462.90 L 633.70 460.70 L 635.50 457.80 L 636.10 454.30 L 635.50 450.80 L 633.70 447.90 L 631.10 445.70 L 629.60 444.90 L 626.10 444.30 Z"
fill="#efbb81" fill-rule="nonzero" group-id="3,11" node-id="333" stroke="none" target-height="20"
target-width="248.99997" target-x="387.1" target-y="444.3"/>
<path d="M 466.30 483.60 L 397.00 483.60 L 393.50 484.20 L 390.60 486.00 L 388.40 488.60 L 387.20 491.80 L 387.20 495.40 L 388.40 498.60 L 390.60 501.20 L 393.50 503.00 L 397.00 503.60 L 466.30 503.60 L 469.80 503.00 L 472.70 501.20 L 474.90 498.60 L 476.10 495.40 L 476.10 491.80 L 475.00 488.60 L 472.80 486.00 L 469.80 484.20 L 466.30 483.60 Z"
fill="#efbb81" fill-rule="nonzero" group-id="3,11" node-id="335" stroke="none" target-height="20"
target-width="88.899994" target-x="387.2" target-y="483.6"/>
</g>
</g>
<g node-id="437">
<g node-id="445">
<path d="M 92.10 750.70 L 104.70 741.40 L 127.80 726.40 L 155.10 710.30 L 182.30 696.10 L 196.80 689.00 L 212.80 681.80 L 230.20 674.30 L 247.80 667.30 L 266.70 660.50 L 287.00 653.70 L 318.10 644.50 L 334.60 640.30 L 351.90 636.20 L 369.10 632.70 L 386.90 629.50 L 405.30 626.60 L 424.40 624.20 L 443.30 622.30 L 462.90 620.90 L 483.00 620.00 L 503.70 619.70 L 521.20 620.00 L 538.50 620.70 L 555.50 621.80 L 572.30 623.40 L 605.60 627.70 L 637.70 633.30 L 658.80 637.80 L 679.10 642.70 L 698.80 648.00 L 718.40 653.80 L 737.00 659.70 L 772.50 672.30 L 804.80 685.20 L 827.60 695.20 L 847.80 704.60 L 866.80 714.00 L 882.80 722.40 L 909.00 737.10 L 931.10 750.70 L 914.20 745.60 L 888.30 739.50 L 858.70 734.10 L 842.30 731.70 L 823.30 729.40 L 801.30 727.20 L 779.30 725.60 L 754.50 724.30 L 726.70 723.40 L 714.00 723.40 L 701.80 723.90 L 690.00 724.70 L 672.30 726.60 L 655.00 729.10 L 602.50 738.20 L 571.50 743.00 L 544.70 746.00 L 531.00 747.00 L 516.40 747.70 L 500.80 747.90 L 479.10 747.70 L 438.80 745.90 L 419.50 744.60 L 342.70 737.80 L 301.90 734.60 L 257.60 732.10 L 243.10 731.70 L 229.00 731.80 L 215.30 732.20 L 188.50 734.10 L 158.10 737.60 L 127.60 742.70 L 115.80 745.10 L 92.10 750.70 Z"
fill="url(#SVGID_1_)" fill-rule="nonzero" group-id="4,12" node-id="343" stroke="none"
target-height="131" target-width="839" target-x="92.1" target-y="619.7"/>
<path d="M 428.80 623.70 L 424.00 627.70 L 421.20 631.90 L 420.40 634.10 L 420.20 636.20 L 420.50 638.60 L 421.40 641.00 L 423.00 643.50 L 425.30 646.00 L 431.00 650.20 L 439.50 654.50 L 445.70 656.80 L 452.90 659.10 L 469.50 662.80 L 488.60 665.50 L 498.60 666.40 L 520.20 667.10 L 531.30 666.90 L 551.80 665.50 L 561.80 664.30 L 579.20 661.10 L 587.50 659.00 L 594.70 656.80 L 605.50 652.30 L 609.40 650.20 L 615.10 645.90 L 617.40 643.40 L 619.00 641.00 L 619.90 638.60 L 620.20 636.20 L 619.90 634.10 L 619.20 631.90 L 617.90 629.60 L 599.60 626.70 L 580.90 624.30 L 561.90 622.30 L 542.80 620.80 L 523.30 619.90 L 503.60 619.60 L 484.10 620.00 L 465.10 620.80 L 446.70 622.00 L 428.80 623.70 Z"
fill="url(#SVGID_2_)" fill-rule="nonzero" group-id="4,12" node-id="345" stroke="none"
target-height="47.5" target-width="200" target-x="420.2" target-y="619.6"/>
<g node-id="447">
<path d="M 386.70 677.00 L 386.90 678.50 L 386.80 680.20 L 386.10 682.00 L 384.90 683.90 L 383.00 686.30 L 380.30 688.80 L 376.70 691.60 L 368.50 696.50 L 363.40 699.00 L 352.50 703.40 L 346.30 705.30 L 340.00 707.00 L 328.40 709.30 L 322.80 709.90 L 313.20 710.20 L 308.70 709.80 L 305.10 709.10 L 302.20 708.20 L 300.10 707.20 L 298.60 706.00 L 297.60 704.70 L 296.90 703.30 L 296.70 701.80 L 296.90 700.20 L 297.50 698.40 L 298.70 696.40 L 300.60 694.10 L 303.30 691.50 L 306.90 688.80 L 315.10 683.80 L 320.20 681.30 L 331.20 677.00 L 337.40 675.00 L 343.70 673.30 L 355.20 671.10 L 360.90 670.40 L 370.40 670.10 L 374.90 670.50 L 378.60 671.20 L 381.50 672.10 L 385.00 674.30 L 386.70 677.00 Z"
fill="#3b6ce4" fill-rule="nonzero" group-id="4,12,14" node-id="349" stroke="none"
target-height="40.100037" target-width="90.19998" target-x="296.7" target-y="670.1"/>
</g>
<path d="M 561.90 699.50 L 567.50 701.50 L 572.70 703.80 L 577.40 706.40 L 581.30 709.20 L 583.60 711.20 L 586.40 714.90 L 587.20 716.80 L 587.40 718.50 L 587.20 720.00 L 586.50 721.40 L 585.40 722.70 L 583.60 723.80 L 579.30 725.30 L 576.20 725.70 L 571.50 725.80 L 566.10 725.30 L 560.50 724.40 L 554.80 722.90 L 549.10 720.90 L 544.00 718.60 L 539.20 715.90 L 535.40 713.20 L 533.10 711.10 L 530.30 707.50 L 529.50 705.60 L 529.20 703.90 L 529.40 702.40 L 530.10 701.00 L 531.30 699.70 L 533.00 698.60 L 537.40 697.10 L 540.40 696.70 L 545.10 696.60 L 550.60 697.00 L 556.10 698.00 L 561.90 699.50 Z"
fill="#3b6ce4" fill-rule="nonzero" group-id="4,12,15" node-id="354" stroke="none"
target-height="29.200012" target-width="58.200012" target-x="529.2" target-y="696.6"/>
</g>
<g node-id="446">
<g node-id="449">
<path d="M 749.30 627.70 L 751.60 625.00 L 753.40 622.10 L 754.70 619.00 L 755.60 615.80 L 755.90 612.50 L 755.70 609.10 L 755.00 606.10 L 753.90 603.30 L 752.50 600.70 L 750.70 598.30 L 746.20 594.30 L 740.50 591.30 L 740.60 588.60 L 740.30 585.70 L 739.40 582.70 L 738.10 580.10 L 736.30 577.80 L 734.20 575.90 L 731.80 574.30 L 729.20 573.10 L 726.40 572.40 L 723.50 572.30 L 720.50 572.60 L 717.60 573.50 L 715.00 574.80 L 712.70 576.60 L 710.80 578.70 L 709.20 581.10 L 708.10 583.70 L 707.40 586.50 L 707.30 589.40 L 707.60 592.50 L 708.70 595.80 L 706.20 598.00 L 702.30 602.90 L 699.70 608.40 L 699.00 611.30 L 698.80 614.30 L 699.00 617.40 L 699.60 620.20 L 701.90 625.20 L 703.50 627.50 L 701.00 629.40 L 697.40 633.40 L 696.10 635.70 L 695.40 638.00 L 695.10 640.50 L 695.40 643.10 L 696.20 645.50 L 697.60 647.90 L 699.30 650.00 L 701.50 652.00 L 704.30 653.90 L 710.50 656.90 L 718.00 658.80 L 722.00 659.30 L 726.30 659.50 L 734.60 658.80 L 738.40 658.00 L 745.40 655.50 L 751.10 652.00 L 753.30 650.00 L 755.00 647.90 L 756.40 645.50 L 757.20 643.10 L 757.50 640.50 L 757.20 638.10 L 756.50 635.80 L 755.30 633.50 L 753.70 631.50 L 749.30 627.70 Z"
fill="url(#SVGID_3_)" fill-rule="nonzero" group-id="4,13,16" node-id="362" stroke="none"
target-height="87.20001" target-width="62.400024" target-x="695.1" target-y="572.3"/>
<g node-id="451">
<g node-id="453">
<path d="M 725.70 686.00 L 724.70 684.30 L 724.40 683.10 L 726.50 659.80 L 726.70 651.40 L 726.60 639.50 L 726.00 631.30 L 724.10 619.20 L 724.20 618.00 L 724.90 616.00 L 725.70 615.40 L 726.40 615.40 L 727.00 616.00 L 727.50 617.40 L 729.40 629.80 L 730.20 642.70 L 730.30 651.60 L 729.20 671.10 L 727.90 683.50 L 727.00 685.70 L 726.40 686.10 L 725.70 686.00 Z"
fill="#ff7f2a" fill-rule="nonzero" group-id="4,13,16,18,20" node-id="368" stroke="none"
target-height="70.69995" target-width="6.200012" target-x="724.1" target-y="615.4"/>
</g>
</g>
</g>
<g node-id="450">
<path d="M 805.20 674.40 L 807.00 672.10 L 808.30 669.50 L 808.80 667.60 L 808.90 663.80 L 808.30 661.50 L 807.40 659.50 L 806.00 657.60 L 804.40 656.10 L 800.20 653.60 L 800.10 650.40 L 799.60 648.70 L 797.80 645.90 L 795.90 644.30 L 793.80 643.20 L 790.50 642.70 L 788.80 642.90 L 785.60 644.20 L 784.40 645.20 L 782.80 647.10 L 781.70 649.30 L 781.30 652.50 L 782.10 656.20 L 778.70 659.70 L 777.60 661.80 L 776.80 663.90 L 776.50 666.20 L 776.60 668.50 L 777.10 670.60 L 779.20 674.30 L 777.10 675.90 L 775.70 677.60 L 774.70 679.60 L 774.40 681.70 L 774.70 683.60 L 775.50 685.40 L 776.80 687.20 L 778.50 688.60 L 780.60 689.90 L 785.90 691.80 L 792.20 692.50 L 798.50 691.80 L 803.80 689.90 L 807.60 687.10 L 808.90 685.40 L 809.70 683.60 L 810.00 681.70 L 809.60 679.70 L 808.60 677.70 L 807.20 676.00 L 805.20 674.40 Z"
fill="url(#SVGID_4_)" fill-rule="nonzero" group-id="4,13,17" node-id="375" stroke="none"
target-height="49.799988" target-width="35.599976" target-x="774.4" target-y="642.7"/>
<g node-id="452">
<g node-id="454">
<path d="M 791.70 707.70 L 791.10 706.80 L 791.00 705.20 L 792.00 695.40 L 792.20 681.20 L 790.80 668.80 L 791.20 667.70 L 792.00 667.40 L 792.70 668.50 L 793.80 675.60 L 794.30 688.00 L 793.90 696.00 L 792.90 706.20 L 792.50 707.50 L 791.70 707.70 Z"
fill="#ff7f2a" fill-rule="nonzero" group-id="4,13,17,19,21" node-id="381" stroke="none"
target-height="40.299988" target-width="3.5" target-x="790.8" target-y="667.4"/>
</g>
</g>
</g>
</g>
</g>
<g node-id="438">
<path d="M 554.30 584.00 L 556.50 601.70 L 559.80 612.50 L 560.50 615.80 L 563.10 646.80 L 563.10 662.80 L 562.60 664.80 L 561.60 666.70 L 559.40 668.90 L 557.70 669.70 L 545.10 673.70 L 543.80 674.50 L 543.10 675.60 L 544.40 678.60 L 545.10 679.30 L 547.60 680.10 L 554.60 679.80 L 573.10 678.40 L 574.50 673.40 L 575.20 668.90 L 575.20 666.60 L 574.30 660.60 L 574.50 654.90 L 576.90 632.70 L 577.00 624.00 L 576.60 619.50 L 573.00 599.40 L 570.80 582.30 L 554.30 584.00 Z"
fill="#ef9f92" fill-rule="nonzero" group-id="5" node-id="390" stroke="none" target-height="97.79999"
target-width="33.900024" target-x="543.1" target-y="582.3"/>
<path d="M 582.50 582.20 L 581.60 596.30 L 581.40 603.30 L 581.70 608.70 L 582.20 611.20 L 586.00 621.00 L 586.80 624.00 L 587.30 627.20 L 587.30 631.10 L 586.60 638.90 L 584.30 656.50 L 583.30 663.20 L 581.80 669.20 L 580.70 675.20 L 580.80 676.60 L 582.40 681.70 L 582.80 684.50 L 582.10 685.70 L 578.80 686.80 L 566.50 689.30 L 561.30 690.00 L 558.40 689.90 L 554.70 688.70 L 553.00 687.20 L 552.90 686.10 L 553.80 684.30 L 555.10 683.10 L 556.90 682.10 L 564.80 678.90 L 567.30 677.40 L 569.70 673.60 L 570.70 670.30 L 571.30 664.90 L 571.50 642.00 L 570.40 620.60 L 566.50 594.50 L 566.00 589.70 L 567.50 588.20 L 571.60 586.00 L 582.50 582.20 Z"
fill="#ffae9c" fill-rule="nonzero" group-id="5" node-id="392" stroke="none" target-height="107.79999"
target-width="34.399963" target-x="552.9" target-y="582.2"/>
<path d="M 554.80 505.80 L 548.90 510.40 L 546.70 511.10 L 544.00 509.80 L 539.20 506.20 L 537.50 505.80 L 533.00 505.20 L 529.20 506.30 L 528.50 506.90 L 528.40 507.40 L 529.30 509.10 L 531.60 512.00 L 537.30 514.80 L 545.10 520.10 L 557.90 514.50 L 554.80 505.80 Z"
fill="#fdcaca" fill-rule="nonzero" group-id="5" node-id="394" stroke="none" target-height="14.899963"
target-width="29.5" target-x="528.4" target-y="505.2"/>
<path d="M 549.90 447.40 L 549.40 450.40 L 549.90 453.50 L 551.40 456.10 L 554.10 458.80 L 554.20 464.10 L 554.50 465.30 L 557.10 465.90 L 557.90 466.40 L 558.80 467.50 L 560.80 471.30 L 561.90 472.10 L 563.90 471.50 L 569.20 468.20 L 572.50 465.80 L 574.80 463.20 L 576.80 459.00 L 577.30 456.10 L 577.40 452.30 L 576.80 447.70 L 575.90 445.80 L 573.60 442.90 L 569.90 439.90 L 567.70 439.00 L 566.10 438.70 L 564.40 438.90 L 562.60 439.60 L 556.10 443.30 L 549.90 447.40 Z"
fill="#fdcaca" fill-rule="nonzero" group-id="5" node-id="396" stroke="none" target-height="33.399994"
target-width="28" target-x="549.4" target-y="438.7"/>
<path d="M 556.70 446.50 L 551.70 449.70 L 549.50 450.10 L 548.30 450.00 L 546.80 449.10 L 546.20 448.10 L 545.50 445.60 L 545.40 443.50 L 545.80 441.50 L 547.70 438.40 L 549.90 436.30 L 552.60 434.50 L 555.60 432.80 L 558.80 431.70 L 561.80 431.20 L 564.50 431.40 L 566.80 432.00 L 570.30 434.00 L 572.10 435.80 L 574.90 440.50 L 576.00 443.30 L 576.80 446.30 L 577.10 449.80 L 577.00 450.10 L 576.70 449.90 L 574.40 447.90 L 573.00 447.80 L 571.90 448.30 L 570.50 450.30 L 569.80 453.60 L 569.10 454.90 L 565.40 450.60 L 564.60 450.10 L 562.90 450.30 L 562.30 450.00 L 561.70 448.90 L 561.50 447.70 L 560.10 446.30 L 558.10 445.90 L 556.70 446.50 Z"
fill="#63393f" fill-rule="nonzero" group-id="5" node-id="398" stroke="none" target-height="23.699982"
target-width="31.699951" target-x="545.4" target-y="431.2"/>
<path d="M 515.70 501.80 L 545.80 514.10 L 552.90 528.30 L 524.00 519.10 Z" fill="#383838" fill-rule="nonzero"
group-id="5" node-id="400" stroke="none" target-height="26.5" target-width="37.200012" target-x="515.7"
target-y="501.8"/>
<path d="M 517.70 503.50 L 545.50 514.50 L 551.20 526.40 L 524.60 518.60 Z" fill="#ffffff" fill-rule="nonzero"
group-id="5" node-id="402" stroke="none" target-height="22.900024" target-width="33.5" target-x="517.7"
target-y="503.5"/>
<path d="M 563.00 656.50 L 574.90 656.80 L 575.80 670.30 L 575.90 675.60 L 575.50 678.00 L 568.30 679.40 L 556.90 680.90 L 549.40 681.20 L 544.40 681.00 L 540.10 679.90 L 538.40 678.50 L 538.10 677.60 L 538.10 676.10 L 538.50 675.20 L 539.70 674.00 L 546.70 672.30 L 549.00 671.50 L 559.20 666.00 L 560.80 664.90 L 561.50 663.80 L 563.00 656.50 Z"
fill="#353535" fill-rule="nonzero" group-id="5" node-id="404" stroke="none" target-height="24.700012"
target-width="37.80005" target-x="538.1" target-y="656.5"/>
<path d="M 586.10 500.10 L 591.50 533.20 L 555.00 540.00 L 552.30 519.90 Z" fill="#dbeefe" fill-rule="nonzero"
group-id="5" node-id="406" stroke="none" target-height="39.899994" target-width="39.200012"
target-x="552.3" target-y="500.1"/>
<path d="M 574.30 456.20 L 580.80 465.30 L 566.60 477.30 L 563.90 464.40 Z" fill="#fdcaca" fill-rule="nonzero"
group-id="5" node-id="408" stroke="none" target-height="21.099976" target-width="16.899963"
target-x="563.9" target-y="456.2"/>
<path d="M 586.10 496.50 L 586.70 502.30 L 586.80 506.80 L 586.10 510.00 L 583.00 512.80 L 580.40 514.60 L 573.70 518.40 L 566.90 521.30 L 564.10 521.90 L 560.60 522.10 L 554.30 521.70 L 552.10 521.30 L 547.90 519.80 L 546.70 519.80 L 542.60 520.40 L 538.00 520.00 L 537.80 521.00 L 538.10 521.70 L 540.50 523.10 L 534.80 521.60 L 533.40 521.60 L 533.30 522.20 L 533.70 523.20 L 534.70 524.10 L 537.70 526.00 L 543.00 531.90 L 544.70 533.10 L 547.80 533.40 L 561.50 531.00 L 573.30 530.30 L 580.50 529.30 L 591.40 527.00 L 596.30 525.00 L 597.30 524.10 L 598.40 522.20 L 600.30 516.50 L 600.90 513.10 L 601.00 509.60 L 600.40 505.90 L 598.70 502.70 L 595.10 499.70 L 590.00 497.50 L 586.10 496.50 Z"
fill="#fdcaca" fill-rule="nonzero" group-id="5" node-id="410" stroke="none" target-height="36.900024"
target-width="67.70001" target-x="533.3" target-y="496.5"/>
<path d="M 576.00 465.80 L 579.80 464.00 L 581.60 463.80 L 592.20 473.20 L 596.20 477.00 L 598.40 479.60 L 599.20 483.60 L 599.90 491.00 L 601.00 512.80 L 600.80 517.80 L 600.20 522.90 L 599.60 524.90 L 598.80 526.00 L 597.30 527.00 L 591.90 529.20 L 588.80 530.00 L 583.60 530.70 L 552.30 533.00 L 553.80 525.80 L 553.40 523.50 L 552.00 520.50 L 557.10 483.40 L 557.80 480.10 L 559.50 477.00 L 562.90 472.90 L 576.00 465.80 Z"
fill="#dbeefe" fill-rule="nonzero" group-id="5" node-id="412" stroke="none" target-height="69.20001"
target-width="49" target-x="552" target-y="463.8"/>
<path d="M 554.60 537.30 L 578.90 534.60 L 585.80 533.40 L 588.50 532.80 L 590.80 531.70 L 591.70 531.90 L 591.90 532.60 L 592.00 533.80 L 591.20 537.30 L 593.60 543.20 L 594.30 545.80 L 594.90 551.90 L 591.50 571.10 L 588.20 593.00 L 588.00 617.80 L 587.10 644.70 L 586.20 656.20 L 585.00 664.20 L 584.40 666.10 L 583.40 667.00 L 579.80 666.40 L 574.30 666.10 L 573.80 665.10 L 573.20 659.50 L 565.60 660.70 L 562.80 660.50 L 562.10 659.70 L 553.40 593.00 L 550.50 566.20 L 550.40 562.30 L 551.50 557.80 L 551.80 547.10 L 554.60 537.30 Z"
fill="#274da0" fill-rule="nonzero" group-id="5" node-id="414" stroke="none" target-height="135.29999"
target-width="44.5" target-x="550.4" target-y="531.7"/>
<path d="M 584.00 488.10 L 585.30 498.00 L 586.90 503.00 L 588.00 504.40 L 586.90 504.80 L 586.80 506.20 L 585.20 500.60 L 584.20 494.80 L 584.00 488.10 Z"
fill="#b9d8ed" fill-rule="nonzero" group-id="5" node-id="416" stroke="none" target-height="18.100006"
target-width="4" target-x="584" target-y="488.1"/>
<path d="M 561.90 565.10 L 573.10 659.50 L 571.30 659.90 L 561.90 565.10 Z" fill="#1e3f7a" fill-rule="nonzero"
group-id="5" node-id="418" stroke="none" target-height="94.80005" target-width="11.199951"
target-x="561.9" target-y="565.1"/>
<path d="M 573.10 662.70 L 576.00 664.00 L 578.40 664.50 L 581.10 664.70 L 584.60 664.40 L 584.60 670.50 L 584.90 672.80 L 586.60 678.80 L 587.20 682.50 L 587.10 684.60 L 585.30 685.30 L 571.10 688.70 L 560.00 690.20 L 554.50 689.30 L 551.20 687.80 L 550.50 687.00 L 550.10 685.60 L 550.30 684.30 L 551.00 683.20 L 551.90 682.60 L 557.10 680.90 L 559.70 679.70 L 562.10 678.20 L 567.30 673.60 L 569.70 670.70 L 573.10 662.70 Z"
fill="#353535" fill-rule="nonzero" group-id="5" node-id="420" stroke="none" target-height="27.5"
target-width="37.100037" target-x="550.1" target-y="662.7"/>
<path d="M 591.10 537.40 L 592.20 539.80 L 581.20 542.90 L 576.60 543.50 L 580.40 541.50 L 591.10 537.40 Z"
fill="#1e3f7a" fill-rule="nonzero" group-id="5" node-id="422" stroke="none" target-height="6.0999756"
target-width="15.600037" target-x="576.6" target-y="537.4"/>
<path d="M 581.10 512.60 L 565.00 517.20 L 557.50 518.80 L 552.20 519.20 L 552.40 521.20 L 566.10 518.40 L 576.00 515.60 L 580.30 513.50 L 581.10 512.60 Z"
fill="#b9d8ed" fill-rule="nonzero" group-id="5" node-id="424" stroke="none" target-height="8.600037"
target-width="28.899963" target-x="552.2" target-y="512.6"/>
<path d="M 584.30 466.10 L 581.60 463.80 L 581.00 463.70 L 577.60 464.90 L 564.30 472.10 L 566.80 478.40 L 584.30 466.10 Z"
fill="#b9d8ed" fill-rule="nonzero" group-id="5" node-id="426" stroke="none" target-height="14.699982"
target-width="20" target-x="564.3" target-y="463.7"/>
<path d="M 564.40 472.10 L 559.90 478.90 L 558.70 478.10 L 562.80 472.80 Z" fill="#b9d8ed" fill-rule="nonzero"
group-id="5" node-id="428" stroke="none" target-height="6.799988" target-width="5.700012" target-x="558.7"
target-y="472.1"/>
<path d="M 563.50 473.50 L 564.70 475.30 L 565.00 477.00 L 564.50 479.60 L 563.60 481.50 L 562.30 504.30 L 556.90 512.80 L 555.90 504.60 L 561.80 481.20 L 561.30 478.70 L 561.40 476.90 L 562.40 474.70 L 563.50 473.50 Z"
fill="#183f8c" fill-rule="nonzero" group-id="5" node-id="430" stroke="none" target-height="39.299988"
target-width="9.099976" target-x="555.9" target-y="473.5"/>
<path d="M 555.10 503.00 L 548.60 508.90 L 551.20 518.80 L 553.60 517.90 Z" fill="#dbeefe" fill-rule="nonzero"
group-id="5" node-id="432" stroke="none" target-height="15.799988" target-width="6.5" target-x="548.6"
target-y="503"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 43 KiB

181
public/dashboard/print.svg Normal file
View File

@ -0,0 +1,181 @@
<svg height="540" node-id="1" sillyvg="true" template-height="540" template-width="960"
version="1.1" viewBox="0 0 960 540" width="960" xmlns="http://www.w3.org/2000/svg">
<defs node-id="68"></defs>
<g node-id="202">
<g node-id="208">
<path d="M 820.00 512.00 L 819.70 497.90 L 818.90 484.00 L 817.50 470.30 L 815.50 456.80 L 813.10 443.50 L 810.10 430.20 L 806.60 417.20 L 802.60 404.50 L 798.20 391.90 L 793.30 379.70 L 787.90 367.50 L 782.00 355.70 L 775.80 344.20 L 769.10 332.90 L 761.90 321.90 L 754.40 311.20 L 746.50 300.80 L 738.20 290.70 L 729.50 281.00 L 720.40 271.60 L 711.00 262.50 L 701.30 253.80 L 691.20 245.50 L 680.80 237.60 L 670.10 230.10 L 659.10 222.90 L 647.80 216.20 L 636.30 210.00 L 624.50 204.10 L 612.30 198.70 L 600.10 193.80 L 587.50 189.40 L 574.80 185.40 L 561.80 181.90 L 548.50 178.90 L 535.20 176.50 L 521.70 174.50 L 508.00 173.10 L 494.10 172.30 L 480.00 172.00 L 465.90 172.30 L 452.00 173.10 L 438.30 174.50 L 424.80 176.50 L 411.50 178.90 L 398.20 181.90 L 385.20 185.40 L 372.50 189.40 L 359.90 193.80 L 347.70 198.70 L 335.50 204.10 L 323.70 210.00 L 312.20 216.20 L 300.90 222.90 L 289.90 230.10 L 279.20 237.60 L 268.80 245.50 L 258.70 253.80 L 249.00 262.50 L 239.60 271.60 L 230.50 281.00 L 221.80 290.70 L 213.50 300.80 L 205.60 311.20 L 198.10 321.90 L 190.90 332.90 L 184.20 344.20 L 178.00 355.70 L 172.10 367.50 L 166.70 379.70 L 161.80 391.90 L 157.40 404.50 L 153.40 417.20 L 149.90 430.20 L 146.90 443.50 L 144.50 456.80 L 142.50 470.30 L 141.10 484.00 L 140.30 497.90 L 140.00 512.00"
fill="#69baf9" fill-opacity="0.2" fill-rule="nonzero" group-id="1,7" id="路径_1806" node-id="3"
stroke="none" target-height="340" target-width="680" target-x="140" target-y="172"/>
</g>
<g node-id="209">
<path d="M 727.60 512.00 L 727.30 500.20 L 726.50 488.70 L 725.20 477.30 L 723.40 466.20 L 721.10 455.20 L 718.20 444.30 L 715.00 433.60 L 711.20 423.20 L 707.10 413.00 L 702.40 403.10 L 697.40 393.30 L 691.90 383.80 L 686.10 374.60 L 679.80 365.70 L 673.20 357.10 L 666.20 348.70 L 658.90 340.70 L 651.20 333.00 L 643.20 325.70 L 634.80 318.70 L 626.20 312.10 L 617.30 305.80 L 608.10 300.00 L 598.60 294.50 L 588.80 289.50 L 578.90 284.80 L 568.70 280.70 L 558.30 276.90 L 547.60 273.70 L 536.70 270.80 L 525.70 268.50 L 514.60 266.70 L 503.20 265.40 L 491.70 264.60 L 479.90 264.30 L 468.10 264.60 L 456.60 265.40 L 445.20 266.70 L 434.10 268.50 L 423.10 270.80 L 412.20 273.70 L 401.50 276.90 L 391.10 280.70 L 380.90 284.80 L 371.00 289.50 L 361.20 294.50 L 351.70 300.00 L 342.50 305.80 L 333.60 312.10 L 325.00 318.70 L 316.60 325.70 L 308.60 333.00 L 300.90 340.70 L 293.60 348.70 L 286.60 357.10 L 280.00 365.70 L 273.70 374.60 L 267.90 383.80 L 262.40 393.30 L 257.40 403.10 L 252.70 413.00 L 248.60 423.20 L 244.80 433.60 L 241.60 444.30 L 238.70 455.20 L 236.40 466.20 L 234.60 477.30 L 233.30 488.70 L 232.50 500.20 L 232.20 512.00"
fill="#69baf9" fill-opacity="0.5" fill-rule="nonzero" group-id="1,8" id="路径_1807" node-id="4"
stroke="none" target-height="247.70001" target-width="495.39996" target-x="232.2" target-y="264.3"/>
</g>
<path d="M 635.60 512.00 L 635.40 503.40 L 634.70 495.00 L 633.60 486.70 L 632.10 478.60 L 630.20 470.70 L 627.80 462.80 L 625.00 455.20 L 621.90 447.80 L 618.50 440.60 L 614.60 433.60 L 609.30 425.10 L 603.50 417.00 L 597.20 409.40 L 590.40 402.10 L 583.20 395.30 L 575.50 388.90 L 567.50 383.10 L 559.00 377.70 L 552.00 373.80 L 544.90 370.30 L 537.50 367.20 L 529.80 364.40 L 522.00 362.00 L 514.10 360.00 L 506.00 358.40 L 497.80 357.30 L 489.30 356.60 L 480.70 356.30 L 472.10 356.60 L 463.70 357.20 L 455.40 358.30 L 447.40 359.80 L 439.40 361.80 L 431.60 364.10 L 423.90 366.90 L 416.50 370.00 L 409.30 373.50 L 402.30 377.30 L 393.80 382.70 L 385.70 388.50 L 378.10 394.70 L 370.80 401.50 L 364.00 408.80 L 357.70 416.40 L 351.80 424.40 L 346.50 432.90 L 342.60 439.90 L 339.10 447.10 L 335.90 454.50 L 333.10 462.10 L 330.70 469.90 L 328.70 477.90 L 327.20 485.90 L 326.00 494.20 L 325.30 502.60 L 325.10 512.00"
fill="#69baf9" fill-opacity="0.7" fill-rule="nonzero" group-id="1,9" id="路径_1808" node-id="5"
stroke="none" target-height="155.70001" target-width="310.49997" target-x="325.1" target-y="356.3"/>
</g>
<g node-id="203">
<path d="M 577.00 512.00 L 468.00 512.00 L 466.60 511.80 L 464.50 510.50 L 463.20 508.40 L 463.00 507.00 L 463.20 505.60 L 464.50 503.50 L 466.60 502.20 L 468.00 502.00 L 577.00 502.00 L 578.40 502.20 L 580.50 503.50 L 581.80 505.60 L 582.00 507.00 L 581.80 508.40 L 580.50 510.50 L 578.40 511.80 L 577.00 512.00 Z"
fill="#3d3d63" fill-rule="nonzero" group-id="2" node-id="85" stroke="none" target-height="10"
target-width="119" target-x="463" target-y="502"/>
<path d="M 689.00 512.00 L 631.60 511.80 L 630.50 511.30 L 628.70 509.50 L 628.00 507.00 L 628.20 505.60 L 629.50 503.50 L 631.60 502.20 L 633.00 502.00 L 690.40 502.20 L 691.50 502.70 L 693.30 504.50 L 694.00 507.00 L 693.80 508.40 L 692.50 510.50 L 690.40 511.80 L 689.00 512.00 Z"
fill="#3d3d63" fill-rule="nonzero" group-id="2" node-id="87" stroke="none" target-height="10"
target-width="66" target-x="628" target-y="502"/>
<path d="M 427.00 512.00 L 271.00 512.00 L 269.60 511.80 L 267.50 510.50 L 266.20 508.40 L 266.00 507.00 L 266.70 504.50 L 268.50 502.70 L 269.60 502.20 L 427.00 502.00 L 428.40 502.20 L 430.50 503.50 L 431.80 505.60 L 432.00 507.00 L 431.80 508.40 L 430.50 510.50 L 428.40 511.80 L 427.00 512.00 Z"
fill="#3d3d63" fill-rule="nonzero" group-id="2" node-id="89" stroke="none" target-height="10"
target-width="166" target-x="266" target-y="502"/>
<path d="M 609.00 512.00 L 606.50 511.30 L 605.50 510.50 L 604.20 508.30 L 604.00 507.00 L 604.20 505.70 L 605.50 503.50 L 607.70 502.20 L 610.30 502.20 L 612.50 503.50 L 613.80 505.70 L 614.00 507.00 L 613.80 508.30 L 612.50 510.50 L 611.50 511.30 L 609.00 512.00 Z"
fill="#3d3d63" fill-rule="nonzero" group-id="2" node-id="91" stroke="none" target-height="9.799988"
target-width="10" target-x="604" target-y="502.2"/>
</g>
<g node-id="204">
<path d="M 403.50 191.00 L 565.00 472.00 L 242.00 472.00 L 403.50 191.00 Z" fill="#077af1" fill-rule="nonzero"
group-id="3" id="多边形_8_1_" node-id="12" stroke="none" target-height="281" target-width="323"
target-x="242" target-y="191"/>
<path d="M 565.00 482.00 L 242.00 482.00 L 240.20 481.80 L 237.00 480.70 L 234.40 478.50 L 233.30 477.00 L 232.60 475.40 L 232.00 472.00 L 232.60 468.60 L 233.30 467.00 L 394.80 186.00 L 395.90 184.60 L 398.50 182.30 L 401.70 181.20 L 403.50 181.00 L 405.30 181.20 L 408.50 182.30 L 411.10 184.60 L 412.20 186.00 L 573.70 467.00 L 574.40 468.60 L 575.00 472.00 L 574.40 475.40 L 573.70 477.00 L 572.60 478.50 L 570.00 480.70 L 566.80 481.80 L 565.00 482.00 Z M 259.30 462.00 L 547.70 462.00 L 403.50 211.10 L 259.30 462.00 Z"
fill="#3d3d63" fill-rule="nonzero" group-id="3" node-id="97" stroke="none" target-height="301"
target-width="343" target-x="232" target-y="181"/>
</g>
<g node-id="205">
<g node-id="211">
<path d="M 729.00 86.00 L 728.70 90.00 L 728.00 93.70 L 726.70 97.30 L 725.00 100.70 L 723.00 103.70 L 720.50 106.50 L 717.70 109.00 L 714.70 111.00 L 711.30 112.70 L 707.70 114.00 L 704.00 114.70 L 700.00 115.00 L 696.00 114.70 L 692.30 114.00 L 688.70 112.70 L 685.30 111.00 L 682.30 109.00 L 679.50 106.50 L 677.00 103.70 L 675.00 100.70 L 673.30 97.30 L 672.00 93.70 L 671.30 90.00 L 671.00 86.00 L 671.30 82.00 L 672.00 78.30 L 673.30 74.70 L 675.00 71.30 L 677.00 68.30 L 679.50 65.50 L 682.30 63.00 L 685.30 61.00 L 688.70 59.30 L 692.30 58.00 L 696.00 57.30 L 700.00 57.00 L 704.00 57.30 L 707.70 58.00 L 711.30 59.30 L 714.70 61.00 L 717.70 63.00 L 720.50 65.50 L 723.00 68.30 L 725.00 71.30 L 726.70 74.70 L 728.00 78.30 L 728.70 82.00 L 729.00 86.00 Z"
fill="#f06a57" fill-rule="nonzero" group-id="4,10" node-id="102" stroke="none" target-height="58"
target-width="58" target-x="671" target-y="57"/>
<path d="M 700.00 115.00 L 696.00 114.70 L 692.30 114.00 L 688.70 112.70 L 685.40 111.00 L 682.30 109.00 L 679.50 106.50 L 677.00 103.70 L 675.00 100.60 L 673.30 97.30 L 672.00 93.70 L 671.30 90.00 L 671.00 86.00 L 671.30 82.00 L 672.00 78.30 L 673.30 74.70 L 675.00 71.40 L 677.00 68.30 L 679.50 65.50 L 682.30 63.00 L 685.40 61.00 L 688.70 59.30 L 692.30 58.00 L 696.00 57.30 L 700.00 57.00 L 704.00 57.30 L 707.70 58.00 L 711.30 59.30 L 714.60 61.00 L 717.70 63.00 L 720.50 65.50 L 723.00 68.30 L 725.00 71.40 L 726.70 74.70 L 728.00 78.30 L 728.70 82.00 L 729.00 86.00 L 728.70 90.00 L 728.00 93.70 L 726.70 97.30 L 725.00 100.60 L 723.00 103.70 L 720.50 106.50 L 717.70 109.00 L 714.60 111.00 L 711.30 112.70 L 707.70 114.00 L 704.00 114.70 L 700.00 115.00 Z M 700.00 73.00 L 697.60 73.20 L 695.50 73.80 L 691.60 76.10 L 688.80 79.40 L 687.80 81.50 L 687.00 86.00 L 687.20 88.40 L 687.80 90.50 L 690.10 94.40 L 693.40 97.20 L 695.50 98.20 L 697.60 98.80 L 700.00 99.00 L 702.40 98.80 L 704.50 98.20 L 708.40 95.90 L 711.20 92.60 L 712.20 90.50 L 712.80 88.40 L 713.00 86.00 L 712.80 83.60 L 712.20 81.50 L 711.20 79.40 L 708.40 76.10 L 704.50 73.80 L 700.00 73.00 Z"
fill="#3d3d63" fill-rule="nonzero" group-id="4,10" node-id="104" stroke="none" target-height="58"
target-width="58" target-x="671" target-y="57"/>
</g>
<g node-id="212">
<path d="M 290.00 86.00 L 289.70 90.00 L 289.00 93.70 L 287.70 97.30 L 286.00 100.70 L 284.00 103.70 L 281.50 106.50 L 278.70 109.00 L 275.70 111.00 L 272.30 112.70 L 268.70 114.00 L 265.00 114.70 L 261.00 115.00 L 257.00 114.70 L 253.30 114.00 L 249.70 112.70 L 246.30 111.00 L 243.30 109.00 L 240.50 106.50 L 238.00 103.70 L 236.00 100.70 L 234.30 97.30 L 233.00 93.70 L 232.30 90.00 L 232.00 86.00 L 232.30 82.00 L 233.00 78.30 L 234.30 74.70 L 236.00 71.30 L 238.00 68.30 L 240.50 65.50 L 243.30 63.00 L 246.30 61.00 L 249.70 59.30 L 253.30 58.00 L 257.00 57.30 L 261.00 57.00 L 265.00 57.30 L 268.70 58.00 L 272.30 59.30 L 275.70 61.00 L 278.70 63.00 L 281.50 65.50 L 284.00 68.30 L 286.00 71.30 L 287.70 74.70 L 289.00 78.30 L 289.70 82.00 L 290.00 86.00 Z"
fill="#f06a57" fill-rule="nonzero" group-id="4,11" node-id="108" stroke="none" target-height="58"
target-width="58" target-x="232" target-y="57"/>
<path d="M 261.00 115.00 L 257.00 114.70 L 253.30 114.00 L 249.70 112.70 L 246.40 111.00 L 243.30 109.00 L 240.50 106.50 L 238.00 103.70 L 236.00 100.60 L 234.30 97.30 L 233.00 93.70 L 232.30 90.00 L 232.00 86.00 L 232.30 82.00 L 233.00 78.30 L 234.30 74.70 L 236.00 71.40 L 238.00 68.30 L 240.50 65.50 L 243.30 63.00 L 246.40 61.00 L 249.70 59.30 L 253.30 58.00 L 257.00 57.30 L 261.00 57.00 L 265.00 57.30 L 268.70 58.00 L 272.30 59.30 L 275.60 61.00 L 278.70 63.00 L 281.50 65.50 L 284.00 68.30 L 286.00 71.40 L 287.70 74.70 L 289.00 78.30 L 289.70 82.00 L 290.00 86.00 L 289.70 90.00 L 289.00 93.70 L 287.70 97.30 L 286.00 100.60 L 284.00 103.70 L 281.50 106.50 L 278.70 109.00 L 275.60 111.00 L 272.30 112.70 L 268.70 114.00 L 265.00 114.70 L 261.00 115.00 Z M 261.00 73.00 L 258.60 73.20 L 256.50 73.80 L 252.60 76.10 L 249.80 79.40 L 248.80 81.50 L 248.20 83.60 L 248.00 86.00 L 248.20 88.40 L 248.80 90.50 L 251.10 94.40 L 254.40 97.20 L 256.50 98.20 L 258.60 98.80 L 261.00 99.00 L 263.40 98.80 L 265.50 98.20 L 269.40 95.90 L 272.20 92.60 L 273.20 90.50 L 273.80 88.40 L 274.00 86.00 L 273.80 83.60 L 273.20 81.50 L 272.20 79.40 L 269.40 76.10 L 265.50 73.80 L 263.40 73.20 L 261.00 73.00 Z"
fill="#3d3d63" fill-rule="nonzero" group-id="4,11" node-id="110" stroke="none" target-height="58"
target-width="58" target-x="232" target-y="57"/>
</g>
<path d="M 672.50 91.00 L 668.50 91.00 L 668.50 81.00 L 672.50 81.00 L 672.50 91.00 Z M 658.50 91.00 L 648.50 91.00 L 648.50 81.00 L 658.50 81.00 L 658.50 91.00 Z M 638.50 91.00 L 628.50 91.00 L 628.50 81.00 L 638.50 81.00 L 638.50 91.00 Z M 618.50 91.00 L 608.50 91.00 L 608.50 81.00 L 618.50 81.00 L 618.50 91.00 Z M 598.50 91.00 L 588.50 91.00 L 588.50 81.00 L 598.50 81.00 L 598.50 91.00 Z M 578.50 91.00 L 568.50 91.00 L 568.50 81.00 L 578.50 81.00 L 578.50 91.00 Z M 558.50 91.00 L 548.50 91.00 L 548.50 81.00 L 558.50 81.00 L 558.50 91.00 Z M 538.50 91.00 L 528.50 91.00 L 528.50 81.00 L 538.50 81.00 L 538.50 91.00 Z M 518.50 91.00 L 508.50 91.00 L 508.50 81.00 L 518.50 81.00 L 518.50 91.00 Z M 498.50 91.00 L 488.50 91.00 L 488.50 81.00 L 498.50 81.00 L 498.50 91.00 Z M 478.50 91.00 L 468.50 91.00 L 468.50 81.00 L 478.50 81.00 L 478.50 91.00 Z M 458.50 91.00 L 448.50 91.00 L 448.50 81.00 L 458.50 81.00 L 458.50 91.00 Z M 438.50 91.00 L 428.50 91.00 L 428.50 81.00 L 438.50 81.00 L 438.50 91.00 Z M 418.50 91.00 L 408.50 91.00 L 408.50 81.00 L 418.50 81.00 L 418.50 91.00 Z M 398.50 91.00 L 388.50 91.00 L 388.50 81.00 L 398.50 81.00 L 398.50 91.00 Z M 378.50 91.00 L 368.50 91.00 L 368.50 81.00 L 378.50 81.00 L 378.50 91.00 Z M 358.50 91.00 L 348.50 91.00 L 348.50 81.00 L 358.50 81.00 L 358.50 91.00 Z M 338.50 91.00 L 328.50 91.00 L 328.50 81.00 L 338.50 81.00 L 338.50 91.00 Z M 318.50 91.00 L 308.50 91.00 L 308.50 81.00 L 318.50 81.00 L 318.50 91.00 Z M 298.50 91.00 L 288.50 91.00 L 288.50 81.00 L 298.50 81.00 L 298.50 91.00 Z"
fill="#f06a57" fill-rule="nonzero" group-id="4" node-id="113" stroke="none" target-height="10"
target-width="384" target-x="288.5" target-y="81"/>
<path d="M 269.30 213.20 L 260.70 208.10 L 261.20 207.30 L 269.80 212.30 L 269.30 213.20 Z M 691.40 212.70 L 686.30 204.30 L 694.80 199.00 L 700.10 207.70 L 691.40 212.70 Z M 274.90 204.00 L 266.50 198.60 L 272.10 190.10 L 280.30 195.80 L 274.90 204.00 Z M 680.90 196.10 L 675.20 188.20 L 683.20 182.20 L 689.20 190.50 L 680.90 196.10 Z M 286.10 187.90 L 278.10 181.90 L 284.40 173.90 L 292.10 180.20 L 286.10 187.90 Z M 669.10 180.50 L 662.80 173.00 L 670.30 166.40 L 676.90 174.10 L 669.10 180.50 Z M 298.50 172.70 L 291.00 166.10 L 298.00 158.60 L 305.20 165.60 L 298.50 172.70 Z M 656.10 165.80 L 649.20 158.80 L 656.10 151.60 L 663.40 158.90 L 656.10 165.80 Z M 312.10 158.60 L 305.20 151.40 L 312.70 144.50 L 319.30 152.00 L 312.10 158.60 Z M 642.00 152.20 L 634.50 145.90 L 640.90 138.10 L 648.60 144.70 L 642.00 152.20 Z M 326.80 145.70 L 320.50 137.90 L 328.50 131.60 L 334.50 139.60 L 326.80 145.70 Z M 626.80 139.80 L 618.90 134.10 L 624.50 125.90 L 632.80 131.80 L 626.80 139.80 Z M 342.50 133.90 L 336.80 125.70 L 345.30 120.00 L 350.60 128.50 L 342.50 133.90 Z M 610.70 128.70 L 602.30 123.60 L 607.30 115.00 L 616.00 120.20 L 610.70 128.70 Z M 359.00 123.40 L 354.00 114.80 L 363.00 109.80 L 367.60 118.70 L 359.00 123.40 Z M 593.70 118.90 L 585.00 114.50 L 589.30 105.50 L 598.40 110.00 L 593.70 118.90 Z M 376.40 114.30 L 372.10 105.30 L 381.40 101.10 L 385.30 110.30 L 376.40 114.30 Z M 576.00 110.50 L 566.90 106.80 L 570.50 97.50 L 580.00 101.30 L 576.00 110.50 Z M 394.40 106.70 L 390.90 97.30 L 400.50 93.90 L 403.70 103.40 L 394.40 106.70 Z M 557.70 103.50 L 548.40 100.60 L 551.20 91.00 L 560.90 94.10 L 557.70 103.50 Z M 413.00 100.50 L 410.30 90.90 L 420.20 88.20 L 422.50 97.90 L 413.00 100.50 Z M 538.90 98.10 L 529.40 95.90 L 531.40 86.10 L 541.30 88.40 L 538.90 98.10 Z M 432.10 95.80 L 430.10 86.00 L 440.20 84.20 L 441.70 94.10 L 432.10 95.80 Z M 519.80 94.20 L 510.10 92.80 L 511.30 82.90 L 521.40 84.30 L 519.80 94.20 Z M 451.40 92.70 L 450.30 82.80 L 460.40 81.80 L 461.20 91.80 L 451.40 92.70 Z M 500.30 91.80 L 490.60 91.20 L 491.00 81.20 L 501.10 81.80 L 500.30 91.80 Z M 471.00 91.20 L 470.60 81.20 L 480.50 81.00 L 480.80 81.00 L 480.80 91.00 L 471.00 91.20 Z"
fill="#f06a57" fill-rule="nonzero" group-id="4" node-id="115" stroke="none" target-height="132.2"
target-width="439.39996" target-x="260.7" target-y="81"/>
<g node-id="213">
<path d="M 462.00 56.00 L 500.20 56.20 L 504.10 57.60 L 505.70 58.80 L 508.40 61.90 L 509.80 65.80 L 510.00 68.00 L 509.80 106.20 L 508.40 110.10 L 505.70 113.20 L 502.20 115.20 L 498.00 116.00 L 459.80 115.80 L 455.90 114.40 L 454.30 113.20 L 451.60 110.10 L 450.20 106.20 L 450.00 104.00 L 450.20 65.80 L 451.60 61.90 L 454.30 58.80 L 457.80 56.80 L 462.00 56.00 Z"
fill="#f06a57" fill-rule="nonzero" group-id="4,12" node-id="118" stroke="none" target-height="60"
target-width="60" target-x="450" target-y="56"/>
<path d="M 498.00 116.00 L 459.80 115.80 L 455.90 114.40 L 454.30 113.20 L 451.60 110.10 L 450.20 106.20 L 450.00 104.00 L 450.20 65.80 L 450.80 63.80 L 452.80 60.30 L 455.90 57.60 L 459.80 56.20 L 462.00 56.00 L 500.20 56.20 L 504.10 57.60 L 505.70 58.80 L 508.40 61.90 L 509.80 65.80 L 510.00 68.00 L 509.80 106.20 L 508.40 110.10 L 505.70 113.20 L 502.20 115.20 L 498.00 116.00 Z M 470.00 96.00 L 490.00 96.00 L 490.00 76.00 L 470.00 76.00 L 470.00 96.00 Z"
fill="#3d3d63" fill-rule="nonzero" group-id="4,12" node-id="120" stroke="none" target-height="60"
target-width="60" target-x="450" target-y="56"/>
</g>
<g node-id="214">
<path d="M 681.00 210.00 L 719.20 210.20 L 723.10 211.60 L 726.20 214.30 L 727.40 215.90 L 728.80 219.80 L 729.00 222.00 L 728.80 260.20 L 728.20 262.20 L 726.20 265.70 L 723.10 268.40 L 719.20 269.80 L 717.00 270.00 L 678.80 269.80 L 674.90 268.40 L 673.30 267.20 L 670.60 264.10 L 669.20 260.20 L 669.00 258.00 L 669.20 219.80 L 670.60 215.90 L 673.30 212.80 L 676.80 210.80 L 681.00 210.00 Z"
fill="#f06a57" fill-rule="nonzero" group-id="4,13" node-id="124" stroke="none" target-height="60"
target-width="60" target-x="669" target-y="210"/>
<path d="M 717.00 270.00 L 678.80 269.80 L 674.90 268.40 L 673.30 267.20 L 670.60 264.10 L 669.20 260.20 L 669.00 258.00 L 669.20 219.80 L 669.80 217.80 L 671.80 214.30 L 674.90 211.60 L 678.80 210.20 L 681.00 210.00 L 719.20 210.20 L 723.10 211.60 L 726.20 214.30 L 727.40 215.90 L 728.80 219.80 L 729.00 222.00 L 728.80 260.20 L 727.40 264.10 L 724.70 267.20 L 721.20 269.20 L 717.00 270.00 Z M 685.00 254.00 L 713.00 254.00 L 713.00 226.00 L 685.00 226.00 L 685.00 254.00 Z"
fill="#3d3d63" fill-rule="nonzero" group-id="4,13" node-id="126" stroke="none" target-height="60"
target-width="60" target-x="669" target-y="210"/>
</g>
<g node-id="215">
<path d="M 244.00 210.00 L 282.20 210.20 L 286.10 211.60 L 289.20 214.30 L 290.40 215.90 L 291.80 219.80 L 292.00 222.00 L 291.80 260.20 L 291.20 262.20 L 289.20 265.70 L 286.10 268.40 L 282.20 269.80 L 280.00 270.00 L 241.80 269.80 L 237.90 268.40 L 236.30 267.20 L 233.60 264.10 L 232.20 260.20 L 232.00 258.00 L 232.20 219.80 L 233.60 215.90 L 236.30 212.80 L 239.80 210.80 L 244.00 210.00 Z"
fill="#f06a57" fill-rule="nonzero" group-id="4,14" node-id="130" stroke="none" target-height="60"
target-width="60" target-x="232" target-y="210"/>
<path d="M 280.00 270.00 L 241.80 269.80 L 237.90 268.40 L 236.30 267.20 L 233.60 264.10 L 232.20 260.20 L 232.00 258.00 L 232.20 219.80 L 232.80 217.80 L 234.80 214.30 L 237.90 211.60 L 241.80 210.20 L 244.00 210.00 L 282.20 210.20 L 286.10 211.60 L 289.20 214.30 L 290.40 215.90 L 291.80 219.80 L 292.00 222.00 L 291.80 260.20 L 290.40 264.10 L 287.70 267.20 L 284.20 269.20 L 280.00 270.00 Z M 248.00 254.00 L 276.00 254.00 L 276.00 226.00 L 248.00 226.00 L 248.00 254.00 Z"
fill="#3d3d63" fill-rule="nonzero" group-id="4,14" node-id="132" stroke="none" target-height="60"
target-width="60" target-x="232" target-y="210"/>
</g>
</g>
<path d="M 547.70 462.00 L 259.00 462.00 L 275.10 434.60 L 533.00 436.40 L 547.70 462.00 Z" fill="#056fdc"
fill-rule="nonzero" id="路径_1903" node-id="32" stroke="none" target-height="27.399994" target-width="288.7"
target-x="259" target-y="434.6"/>
<g node-id="206">
<path d="M 603.00 270.00 L 719.00 472.00 L 487.00 472.00 L 603.00 270.00 Z" fill="#92c5fb" fill-rule="nonzero"
group-id="5" id="多边形_9_1_" node-id="34" stroke="none" target-height="202" target-width="232"
target-x="487" target-y="270"/>
<path d="M 719.00 482.00 L 487.00 482.00 L 485.20 481.80 L 482.00 480.70 L 479.40 478.50 L 478.30 477.00 L 477.60 475.40 L 477.00 472.00 L 477.60 468.60 L 478.30 467.00 L 594.30 265.00 L 595.40 263.60 L 598.00 261.30 L 601.20 260.20 L 603.00 260.00 L 604.80 260.20 L 608.00 261.30 L 610.60 263.60 L 611.70 265.00 L 727.70 467.00 L 728.40 468.60 L 729.00 472.00 L 728.40 475.40 L 727.70 477.00 L 726.60 478.50 L 724.00 480.70 L 720.80 481.80 L 719.00 482.00 Z M 504.30 462.00 L 701.70 462.00 L 603.00 290.10 L 504.30 462.00 Z"
fill="#3d3d63" fill-rule="nonzero" group-id="5" node-id="140" stroke="none" target-height="222"
target-width="252" target-x="477" target-y="260"/>
</g>
<path d="M 701.80 462.00 L 504.00 462.00 L 520.10 434.60 L 686.10 434.60 L 701.80 462.00 Z" fill="#5ea7f3"
fill-rule="nonzero" id="路径_1904" node-id="36" stroke="none" target-height="27.399994"
target-width="197.79999" target-x="504" target-y="434.6"/>
<g node-id="207">
<g node-id="216">
<path d="M 302.90 449.20 L 270.20 449.20 L 268.60 448.90 L 267.40 448.00 L 266.50 446.80 L 266.20 445.20 L 266.50 443.60 L 267.40 442.40 L 268.60 441.50 L 270.20 441.20 L 302.90 441.20 L 304.50 441.50 L 305.70 442.40 L 306.60 443.60 L 306.90 445.20 L 306.60 446.80 L 305.70 448.00 L 304.50 448.90 L 302.90 449.20 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,15" node-id="146" stroke="none" target-height="8"
target-width="40.69998" target-x="266.2" target-y="441.2"/>
<path d="M 286.60 465.50 L 285.00 465.20 L 283.70 464.40 L 282.90 463.10 L 282.60 461.50 L 282.60 428.90 L 282.90 427.30 L 283.70 426.00 L 285.00 425.20 L 286.60 424.90 L 288.10 425.20 L 289.40 426.00 L 290.20 427.30 L 290.60 428.90 L 290.60 461.50 L 290.20 463.10 L 289.40 464.40 L 288.10 465.20 L 286.60 465.50 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,15" node-id="148" stroke="none"
target-height="40.600006" target-width="8" target-x="282.6" target-y="424.9"/>
</g>
<g node-id="217">
<g node-id="222">
<g node-id="223">
<path d="M 315.00 305.20 L 313.40 304.80 L 312.10 304.00 L 311.30 302.70 L 311.00 301.20 L 311.00 293.80 L 311.30 292.30 L 312.10 291.00 L 313.40 290.20 L 315.00 289.80 L 316.50 290.20 L 317.80 291.00 L 318.60 292.30 L 319.00 293.80 L 319.00 301.20 L 318.60 302.70 L 317.80 304.00 L 316.50 304.80 L 315.00 305.20 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,16,21,22" node-id="154" stroke="none"
target-height="15.400024" target-width="8" target-x="311" target-y="289.8"/>
<path d="M 315.00 337.90 L 313.40 337.50 L 312.10 336.70 L 311.30 335.40 L 311.00 333.90 L 311.00 326.50 L 311.30 325.00 L 312.10 323.70 L 313.40 322.80 L 315.00 322.50 L 316.50 322.80 L 317.80 323.70 L 318.60 325.00 L 319.00 326.50 L 319.00 333.90 L 318.60 335.40 L 317.80 336.70 L 316.50 337.50 L 315.00 337.90 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,16,21,22" node-id="156" stroke="none"
target-height="15.399994" target-width="8" target-x="311" target-y="322.5"/>
</g>
<g node-id="224">
<path d="M 335.00 317.80 L 327.70 317.80 L 326.10 317.50 L 324.80 316.70 L 324.00 315.40 L 323.70 313.80 L 324.00 312.30 L 324.80 311.00 L 326.10 310.20 L 327.70 309.80 L 335.00 309.80 L 336.50 310.20 L 337.80 311.00 L 338.70 312.30 L 339.00 313.80 L 338.70 315.40 L 337.80 316.70 L 336.50 317.50 L 335.00 317.80 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,16,21,23" node-id="160" stroke="none"
target-height="8" target-width="15.299988" target-x="323.7" target-y="309.8"/>
<path d="M 302.30 317.80 L 295.00 317.80 L 293.40 317.50 L 292.10 316.70 L 291.30 315.40 L 291.00 313.80 L 291.30 312.30 L 292.10 311.00 L 293.40 310.20 L 295.00 309.80 L 302.30 309.80 L 303.90 310.20 L 305.10 311.00 L 306.00 312.30 L 306.30 313.80 L 306.00 315.40 L 305.10 316.70 L 303.90 317.50 L 302.30 317.80 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,16,21,23" node-id="162" stroke="none"
target-height="8" target-width="15.299988" target-x="291" target-y="309.8"/>
</g>
<g node-id="225">
<path d="M 323.90 308.90 L 322.40 308.60 L 321.10 307.70 L 320.20 306.40 L 319.90 304.90 L 320.20 303.40 L 321.10 302.00 L 326.30 296.90 L 327.60 296.00 L 329.10 295.70 L 330.60 296.00 L 331.90 296.90 L 332.80 298.20 L 333.10 299.70 L 332.80 301.20 L 331.90 302.50 L 326.80 307.70 L 325.40 308.60 L 323.90 308.90 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,16,21,24" node-id="166" stroke="none"
target-height="13.199982" target-width="13.200012" target-x="319.9" target-y="295.7"/>
<path d="M 300.80 332.00 L 299.30 331.70 L 298.00 330.80 L 297.10 329.50 L 296.80 328.00 L 297.10 326.50 L 298.00 325.20 L 303.20 320.00 L 304.50 319.10 L 306.00 318.80 L 307.50 319.10 L 308.80 320.00 L 309.70 321.30 L 310.00 322.80 L 309.70 324.30 L 308.80 325.60 L 303.60 330.80 L 302.30 331.70 L 300.80 332.00 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,16,21,24" node-id="168" stroke="none"
target-height="13.200012" target-width="13.200012" target-x="296.8" target-y="318.8"/>
</g>
<g node-id="226">
<path d="M 306.00 308.90 L 304.50 308.60 L 303.20 307.70 L 298.00 302.50 L 297.10 301.20 L 296.80 299.70 L 297.10 298.20 L 298.00 296.90 L 299.30 296.00 L 300.80 295.70 L 302.30 296.00 L 303.60 296.90 L 308.80 302.00 L 309.70 303.40 L 310.00 304.90 L 309.70 306.40 L 308.80 307.70 L 307.50 308.60 L 306.00 308.90 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,16,21,25" node-id="172" stroke="none"
target-height="13.199982" target-width="13.200012" target-x="296.8" target-y="295.7"/>
<path d="M 329.10 332.00 L 327.60 331.70 L 326.30 330.80 L 321.10 325.60 L 320.20 324.30 L 319.90 322.80 L 320.20 321.30 L 321.10 320.00 L 322.40 319.10 L 323.90 318.80 L 325.40 319.10 L 326.80 320.00 L 331.90 325.20 L 332.80 326.50 L 333.10 328.00 L 332.80 329.50 L 331.90 330.80 L 330.60 331.70 L 329.10 332.00 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,16,21,25" node-id="174" stroke="none"
target-height="13.200012" target-width="13.200012" target-x="319.9" target-y="318.8"/>
</g>
</g>
</g>
<g node-id="218">
<path d="M 194.00 254.80 L 190.90 254.50 L 188.00 253.70 L 185.40 252.50 L 183.00 250.80 L 181.00 248.80 L 179.30 246.40 L 178.10 243.80 L 177.30 240.90 L 177.00 237.80 L 177.30 234.70 L 178.10 231.90 L 179.30 229.30 L 181.00 226.90 L 183.00 224.90 L 185.40 223.20 L 188.00 221.90 L 190.90 221.20 L 194.00 220.90 L 197.00 221.20 L 199.90 221.90 L 202.50 223.20 L 204.90 224.90 L 206.90 226.90 L 208.60 229.30 L 209.80 231.90 L 210.60 234.70 L 210.90 237.80 L 210.60 240.90 L 209.80 243.80 L 208.60 246.40 L 206.90 248.80 L 204.90 250.80 L 202.50 252.50 L 199.90 253.70 L 197.00 254.50 L 194.00 254.80 Z"
fill="none" group-id="6,17" node-id="180" stroke="none" target-height="33.90001"
target-width="33.899994" target-x="177" target-y="220.9"/>
<path d="M 194.00 246.80 L 196.30 246.40 L 198.50 245.60 L 200.30 244.10 L 201.70 242.30 L 202.60 240.20 L 202.90 237.80 L 202.60 235.40 L 201.70 233.30 L 200.30 231.50 L 198.50 230.10 L 196.30 229.20 L 194.00 228.90 L 191.60 229.20 L 189.40 230.10 L 187.60 231.50 L 186.20 233.30 L 185.30 235.40 L 185.00 237.80 L 185.30 240.20 L 186.20 242.30 L 187.60 244.20 L 189.40 245.60 L 191.60 246.40 L 194.00 246.80 M 194.00 254.80 L 190.90 254.50 L 188.00 253.70 L 185.40 252.50 L 183.00 250.80 L 181.00 248.80 L 179.30 246.40 L 178.10 243.80 L 177.30 240.90 L 177.00 237.80 L 177.30 234.70 L 178.10 231.90 L 179.30 229.30 L 181.00 226.90 L 183.00 224.90 L 185.40 223.20 L 188.00 221.90 L 190.90 221.20 L 194.00 220.90 L 197.00 221.20 L 199.90 221.90 L 202.50 223.20 L 204.90 224.90 L 206.90 226.90 L 208.60 229.30 L 209.80 231.90 L 210.60 234.70 L 210.90 237.80 L 210.60 240.90 L 209.80 243.80 L 208.60 246.40 L 206.90 248.80 L 204.90 250.80 L 202.50 252.50 L 199.90 253.70 L 197.00 254.50 L 194.00 254.80 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,17" node-id="182" stroke="none"
target-height="33.90001" target-width="33.899994" target-x="177" target-y="220.9"/>
</g>
<g node-id="219">
<path d="M 329.60 72.30 L 327.00 72.00 L 324.60 71.40 L 322.50 70.30 L 320.50 68.90 L 318.80 67.20 L 317.40 65.30 L 316.30 63.10 L 315.70 60.70 L 315.50 58.10 L 315.70 55.50 L 316.30 53.20 L 317.40 51.00 L 318.80 49.00 L 320.50 47.30 L 322.50 45.90 L 324.60 44.90 L 327.00 44.20 L 329.60 44.00 L 332.20 44.20 L 334.50 44.90 L 336.70 45.90 L 338.70 47.30 L 340.40 49.00 L 341.80 51.00 L 342.80 53.20 L 343.50 55.50 L 343.70 58.10 L 343.50 60.70 L 342.80 63.10 L 341.80 65.30 L 340.40 67.20 L 338.70 68.90 L 336.70 70.30 L 334.50 71.40 L 332.20 72.00 L 329.60 72.30 Z"
fill="none" group-id="6,18" node-id="186" stroke="none" target-height="28.300003"
target-width="28.200012" target-x="315.5" target-y="44"/>
<path d="M 329.60 64.30 L 331.20 64.00 L 332.70 63.40 L 333.90 62.50 L 334.90 61.20 L 335.50 59.80 L 335.70 58.10 L 335.50 56.50 L 334.90 55.00 L 333.90 53.80 L 332.70 52.80 L 331.20 52.20 L 329.60 52.00 L 327.90 52.20 L 326.50 52.80 L 325.30 53.80 L 324.30 55.00 L 323.70 56.50 L 323.50 58.10 L 323.70 59.80 L 324.30 61.20 L 325.30 62.50 L 326.50 63.40 L 327.90 64.00 L 329.60 64.30 M 329.60 72.30 L 327.00 72.00 L 324.60 71.40 L 322.50 70.30 L 320.50 68.90 L 318.80 67.20 L 317.40 65.30 L 316.30 63.10 L 315.70 60.70 L 315.50 58.10 L 315.70 55.50 L 316.30 53.20 L 317.40 51.00 L 318.80 49.00 L 320.50 47.30 L 322.50 45.90 L 324.60 44.90 L 327.00 44.20 L 329.60 44.00 L 332.20 44.20 L 334.50 44.90 L 336.70 45.90 L 338.70 47.30 L 340.40 49.00 L 341.80 51.00 L 342.80 53.20 L 343.50 55.50 L 343.70 58.10 L 343.50 60.70 L 342.80 63.10 L 341.80 65.30 L 340.40 67.20 L 338.70 68.90 L 336.70 70.30 L 334.50 71.40 L 332.20 72.00 L 329.60 72.30 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,18" node-id="188" stroke="none"
target-height="28.300003" target-width="28.200012" target-x="315.5" target-y="44"/>
</g>
<g node-id="220">
<path d="M 718.60 367.90 L 714.90 367.50 L 711.50 366.60 L 708.30 365.10 L 705.50 363.10 L 703.00 360.60 L 701.00 357.80 L 699.50 354.60 L 698.60 351.20 L 698.20 347.50 L 698.60 343.80 L 699.50 340.40 L 701.00 337.20 L 703.00 334.40 L 705.50 331.90 L 708.30 329.90 L 711.50 328.40 L 714.90 327.50 L 718.60 327.10 L 722.30 327.50 L 725.70 328.40 L 728.90 329.90 L 731.70 331.90 L 734.10 334.40 L 736.20 337.20 L 737.70 340.40 L 738.60 343.80 L 738.90 347.50 L 738.60 351.20 L 737.70 354.60 L 736.20 357.80 L 734.10 360.60 L 731.70 363.10 L 728.90 365.10 L 725.70 366.60 L 722.30 367.50 L 718.60 367.90 Z"
fill="none" group-id="6,19" node-id="192" stroke="none" target-height="40.799988"
target-width="40.700012" target-x="698.2" target-y="327.1"/>
<path d="M 718.60 359.90 L 722.90 359.10 L 726.60 356.90 L 729.30 353.70 L 730.20 351.80 L 730.90 347.50 L 730.20 343.20 L 729.30 341.30 L 726.60 338.10 L 722.90 335.90 L 718.60 335.10 L 714.30 335.90 L 710.60 338.10 L 707.90 341.30 L 707.00 343.20 L 706.20 347.50 L 707.00 351.80 L 709.20 355.50 L 712.40 358.20 L 714.30 359.10 L 718.60 359.90 M 718.60 367.90 L 714.90 367.50 L 711.50 366.60 L 708.30 365.10 L 705.50 363.10 L 703.00 360.60 L 701.00 357.80 L 699.50 354.60 L 698.60 351.20 L 698.20 347.50 L 698.60 343.80 L 699.50 340.40 L 701.00 337.20 L 703.00 334.40 L 705.50 331.90 L 708.30 329.90 L 711.50 328.40 L 714.90 327.50 L 718.60 327.10 L 722.30 327.50 L 725.70 328.40 L 728.90 329.90 L 731.70 331.90 L 734.10 334.40 L 736.20 337.20 L 737.70 340.40 L 738.60 343.80 L 738.90 347.50 L 738.60 351.20 L 737.70 354.60 L 736.20 357.80 L 734.10 360.60 L 731.70 363.10 L 728.90 365.10 L 725.70 366.60 L 722.30 367.50 L 718.60 367.90 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,19" node-id="194" stroke="none"
target-height="40.799988" target-width="40.700012" target-x="698.2" target-y="327.1"/>
</g>
<g node-id="221">
<path d="M 782.90 129.80 L 758.20 129.80 L 756.60 129.50 L 755.30 128.60 L 754.50 127.30 L 754.20 125.80 L 754.50 124.20 L 755.30 122.90 L 756.60 122.10 L 758.20 121.80 L 782.90 121.80 L 784.40 122.10 L 785.70 122.90 L 786.60 124.20 L 786.90 125.80 L 786.60 127.30 L 785.70 128.60 L 784.40 129.50 L 782.90 129.80 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,20" node-id="198" stroke="none" target-height="8"
target-width="32.700012" target-x="754.2" target-y="121.8"/>
<path d="M 770.50 143.10 L 769.00 142.80 L 767.70 141.90 L 766.80 140.60 L 766.50 139.10 L 766.50 114.40 L 766.80 112.80 L 767.70 111.50 L 769.00 110.70 L 770.50 110.40 L 772.10 110.70 L 773.40 111.50 L 774.20 112.80 L 774.50 114.40 L 774.50 139.10 L 774.20 140.60 L 773.40 141.90 L 772.10 142.80 L 770.50 143.10 Z"
fill="#fbe274" fill-rule="nonzero" group-id="6,20" node-id="200" stroke="none"
target-height="32.700005" target-width="8" target-x="766.5" target-y="110.4"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -0,0 +1,45 @@
<svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
<defs>
<style>.cls-1{fill:none;}</style>
</defs>
<path class="cls-1"
d="M0,0H1024V1024H0ZM420.13,740.21c24,.48,47.93-6.77,71.81-3.21,32.64,6.32,66.54,5.44,97.81-6.67a17.43,17.43,0,0,1,14.4.45c21.57,10,44.63,15.31,68,17C746.91,754.15,826,724,868,659.68,917.87,588.1,892.93,486.73,822.32,439c-45.42-33.65-103.83-46.17-159.59-39.44-25.14,6.35-48.74,17.28-74.46,22-8.43,2.11-16.8,2.39-23.28-5.38s-13.54-15.1-19.9-23c-27.75-33.75-40.17-79.49-28-122,13.29-40.1,34.53-81.15,73.61-101,28.95-14.25,61.3-22,93.55-20.47,2.16-.08,4.27-1.71,6.41-2.62-4.23-6.23-11.39-7.38-18.06-9.59-80-28.43-171.12,20.17-200.78,97.88-5.3,12.9-5,13-18.71,11.46-87.72-9.19-178.79,22.34-236.81,89.89-57,63.27-75.1,157.6-44.62,237.33,2.17,5.6,2,6.23-3.78,8.19-9.45,3.21-19.19,5.77-28.29,9.77C48.9,625.25-17.57,763.48,76.92,829.34c10,6.93-7.68,17.32,9.51,32.2,23.42,22.77,53.53,8.38,77.65-5.27,20.14-8.54,44.58-18.74,66.56-16.34,29.51,5.13,57.1,19.31,84.87,30.05,30.32,7.92,68.83,20.1,89.25-12.54a37.42,37.42,0,0,1,9.13-9.06c54.82-40.29,127,1.77,183.39,19.73,30.46,11.24,60.5,23.53,90.29,36.43,77.74,31,144.6,8.41,169.4-74.92-7.7.93-12.22,13.27-18.87,17.66-36.11,26.54-85.41,28.58-128,19.82-44.93-8.55-82.52-36.51-127.17-46.5l.3-1.72c4.21.43,10.79.49,12.3-4,.59-7.83,2.28-16.06-5.13-22.22-2.21-1.83-4.05-4.78-1.49-7.43,8.8-9.09,5.82-17.43-1.09-25.72-2.39-4.71-5.81-7.13-11.44-7-15.48.13-31-.26-46.44-.54-8.37-.62-4.86,10-5.65,15.23,0,13.33,0,26.66-.09,40,0,2.84-.71,5.54-4.33,5.52s-4.14-2.39-4.12-5.47c.12-14.49-.1-29,.18-43.47.22-11.54.44-11-11.21-11.35-7.26-.23-11.29,2.46-14.56,8.56-4.38,8.2-9.49,16-14.35,24-6.32,11.17-14.77-15.22-19.09-19.22-8.6-13.84-8.63-13.78-24.73-13.4-7.42-.14-2.2,11.39-3.59,16.09q-.09,21.48-.25,43c-1.15,9.71,7.1,7,13.65,7.4l.51,1.74c-31.47,13.31-65.76,22-99.91,23.79-32.11-.23-63.05-12.84-93.75-21.21l-1.48-2c35.24-20.74,62.62-53.76,75.2-92.91,1.89-6,5.39-4,9-2.84,27.63,10.08,56.1,13.82,85.35,14.68l.63,1.62c-6.27,6-16.5,8.53-15.61,19.15.55,15.82.19,31.66.19,47.49,0,9.14,0,9.13,8.77,10.13,5.8,1.17,10.12,1.66,9.53-5.84C420.16,788.13,420.13,764.89,420.13,740.21ZM871.08,441c32.9-30.68,72.25-81.2,53-128.35C886,234.51,817.05,161,725.4,155.33c-97.22-3-141.22,77.74-44.86,130.9,45.79,31.32,103.42,36,149.54,65.32,12.26,8.56,24.31,17.82,28.52,32.94C863.59,403.38,867.43,421.67,871.08,441Zm62-125.79c15.63-39.09,23.52-86.12,1.85-124.59-25.89-42.11-60.26-88.77-110.64-101.18C780,81.21,730.82,74.61,694.6,107.7c-3.64,3-3.57,5.48.07,8.49,26.61,26,38.58,22.12,71.93,30.05C849.51,165,897.84,243.8,933.13,315.24Zm-52.7,405.62v-.33c-20,1.09-40.86-2.34-60.39,1.63,2.08,8.82,10.31,14.36,14.37,22.18,5.66,9.88,17.59,5.7,26.84,6.43,9.19-.91,4.73,10.23,5.69,15.79q0,38.73.1,77.46c0,4,.51,7.54,4,10.21,5.76,2.72,26.58,26.94,26.94,10.92q0-54.21-.39-108.42c0-4.29,1.8-5.64,5.55-5.71,8.17-1.39,19.17,3,24.93-4.45,5.64-7.15,11.53-14.11,17.22-21.22,5.15-8.48-10.42-4.09-14.39-4.53C914.08,720.92,897.26,720.86,880.43,720.86ZM684.87,784.59h.18c.11,9-.15,18-.17,27,.12,7,.82,7.73,7.75,7.74,13.82,0,27.65-.46,41.45,0,7.49.26,13-1.24,16-8.75,16.78-20.21-5-15.51,2.76-29.55,8.61-9.08-.92-15.93-5-23.95-4.93-8.11-16.72-2.85-24.64-4.3-10.32,0-20.65,0-31,0-6.5,0-7.35.81-7.36,6.9Q684.85,772.1,684.87,784.59ZM350.45,819.45v-.17c8.5,0,17-.22,25.49.08,9.87,1,13.15-9.18,17.44-16,3.49-6.62-5.14-23.56-12.57-24.85-11.79-.57-23.67-.06-35.48-.25-3.18-.07-6.43-.87-6.55-4.65-.28-5.08,4.82-5.64,8.87-5.41,8.83,0,17.75-.8,26.47.17,8.07,3.35,28.37-15.92,17.05-16.25-16.82.17-33.64.86-50.43.43-7.64-.19-11.95,2.23-16,8.72-9,14.29-6.89,11.07.25,24.08,3.38,6.15,7.83,7.74,14.17,7.61,10-.19,20,0,30,.2,3.22.06,6,1.18,5.75,5.29-.23,3.8-2.8,4.5-5.92,4.52-9,0-18.1,1-27-.12-9.67-1.76-21.59,6.65-22.41,15.39C328.85,821.26,340.5,818.61,350.45,819.45Zm451.24-66.79v.05c-3.66,0-7.38.4-11-.08-12.8-2.63-25.08,8-25.66,21,.85,18.56-5,40.95,19.92,45.63,19-.68,50.15,6.25,53-20.7-1.05-14.85,4.27-32.16-9.52-42.25C821,750.17,810.53,753.28,801.69,752.66Zm-161.06.13v-.07c-17.44-1.44-36.11,1.22-37.17,22.82.74,10.32-2.18,21.53,3.23,31,4.29,5.7,8.9,13.35,17,12.74,10.65-.11,21.3,0,32,0,25-2.91,21.55-27.07,21.4-45.78C674.93,753.21,657.1,751.59,640.63,752.79Z"
transform="translate(0 0)"/>
<path d="M420.13,740.21c0,24.67,0,47.93,0,72.4.59,7.47-3.73,7-9.53,5.84-8.77-1-8.77-1-8.77-10.13,0-15.83.36-31.67-.19-47.49-.89-10.61,9.34-13.13,15.61-19.15l-.63-1.62c-29.26-.86-57.72-4.6-85.35-14.68-3.57-1.19-7.07-3.11-9,2.84-12.58,39.15-40,72.17-75.2,92.91l1.48,2c30.7,8.37,61.64,21,93.75,21.21,34.15-1.84,68.44-10.48,99.91-23.79l-.51-1.74c-6.5-.37-14.84,2.33-13.65-7.4q.13-21.5.25-43c1.27-4.63-3.65-16.42,3.58-16.09,16.11-.38,16.14-.44,24.74,13.4,4.25,3.93,12.84,30.42,19.09,19.22,4.86-7.94,10-15.76,14.35-24,3.27-6.1,7.3-8.79,14.56-8.56,11.65.37,11.43-.19,11.21,11.35-.28,14.48-.06,29-.18,43.47,0,3.08.56,5.44,4.12,5.47s4.32-2.68,4.33-5.52c.08-13.32.06-26.65.09-40,.8-5.23-2.73-15.84,5.65-15.23,15.48.28,31,.67,46.44.54,5.62-.15,9.06,2.27,11.44,7,18,20.6-7.48,24.43,2.58,33.15,7.41,6.16,5.72,14.39,5.13,22.22-1.56,4.51-8.08,4.47-12.3,4l-.3,1.72c44.65,10,82.24,37.95,127.17,46.5,45.11,8.87,104.36,7.61,136.88-29.26,3.17-3.15,4.85-8.27,10-8.22C821.54,939.69,735.46,930.49,647.1,887.43c-36.22-14.28-72.54-28.58-109.48-40.86-40.33-12.68-86.79-27.33-123.73,1.81a37.42,37.42,0,0,0-9.13,9.06c-20.42,32.62-58.92,20.47-89.26,12.54-27.76-10.73-55.34-24.93-84.86-30.05a59.17,59.17,0,0,0-27.07,2.49c-13.24,4.39-27,7.09-39.49,13.86-24.07,13.6-54.3,28.08-77.65,5.26-17.13-14.71.44-25.43-9.51-32.2C-17.5,763.44,48.86,625.28,139.63,592c9.1-4,18.84-6.57,28.29-9.78,5.78-2,6-2.59,3.78-8.19-30.48-79.73-12.4-174.06,44.62-237.33,58-67.55,149.09-99.09,236.81-89.89,13.66,1.55,13.41,1.44,18.71-11.46,21.49-53.65,71-96,128.78-104.16,27.2-3.51,68.6-1.91,90.06,15.87-2.14.91-4.25,2.54-6.41,2.62-32.25-1.5-64.6,6.23-93.55,20.47-47.31,24.31-80.83,91.56-78.13,144,2.67,29.72,13.85,56,32.5,79.09,6.36,7.88,13.4,15.2,19.9,23s14.85,7.49,23.28,5.39c25.72-4.75,49.32-15.68,74.46-22a230.14,230.14,0,0,1,59.79.31C845.64,409.76,944.24,548.38,868,659.69,826,724,746.9,754.15,672.16,747.82c-23.38-1.73-46.44-7-68-17a17.43,17.43,0,0,0-14.4-.45c-31.27,12.11-65.17,13-97.81,6.67C468.05,733.45,444.12,740.69,420.13,740.21ZM405,690.48l1.28-1.82c80.08,52.53,202.22,5.29,219.2-90.82,9.19-43.08-7.2-88.68-37.59-119.87-6.9-7.22-14.58-13.77-24.65-17.24-77.37-29.49-115.21-112.49-101.9-191.84C208.86,299.5,174.13,627,417.81,704.9l1-1.39ZM697.57,575c12.44-4.52,23.19.94,35.39,2.5,5.27.79,7.64,3.42,8.74,8.47,3.69,16.91,7.63,33.77,11.63,50.61.93,3.92,0,6.71-3.17,9.17-12.19,9.55-24.48,19-36.31,28.94-11.33,8.7-28.57-2.27-41.71-2.63a8,8,0,0,0-6,2.24c-4.61,4.78-8.74,10-13.11,15-2.51,2.88-2.44,4.85,1.1,7.14,28.1,19,60.94,26.27,94.53,22.11,3.77,0,5.6-1.58,7.39-4.63,5.93-10.69,16.5-17.38,25.72-25,15.86-15.58,44.32-5.34,55.58-27.53,15.77-25.46,24.92-54.71,23.8-84.81-.08-3.45-.83-5-4.68-3.72-9.19,1.33-20.57,10.35-28.57,2.56-11.13-10.76-22.16-21.63-33.57-32.07-10.83-9.53-4.27-24.36-2-36.17,3.73-12.58,3.33-26.43,11.53-37.81C761.65,440.19,696.6,433.67,657,471.1c-3.73,3.82-3.88,4.82-.2,8.91C681.6,506.22,693.86,539.48,697.57,575Zm-565,97c-.18,42.67,37.61,78.17,79.64,77.52,14.53,0,28.66-2.66,41.8-9.82,11.42-6.23,20.09-15.19,28-25.16,5.11-6.46,4.7-8.28-2.24-12.89-38.68-23.47-71.59-55.17-93.23-95.18-2.47-4.45-4.85-5.45-9.21-2.87C151.19,617.2,132.77,642.18,132.57,672Zm-13.12,38.73c-.82-19.42-4-71.7-27.48-75.41-15.39.19-40.43,61.13-45.15,76-5.06,16.29-8.42,32.79-5.73,50.09,1.9,12.15,6.17,23,14.51,32.13C69.43,810,85,791,93.1,778.84c8.38-15,20.35-29.1,24.88-45.73C118.77,725.67,119,718.18,119.45,710.71Zm123.23,44.95-.26-1c-21,5.47-61.95,5-77.07,18.15-15,17.15-29.2,34.92-43.52,52.61-1.84,2.27-2.51,5.25,1.74,6.58,15.59,4.88,31.55,6.4,47.3,2.23,18.88-5,36.95-12.16,52.32-24.94C235.53,798.06,288.12,754,242.68,755.66Zm-83.86,0c-.19-17.91-13.74-21.37-26.36-8.17-17.94,15.4-34.72,34.77-37,59.24-1.19,12.25,13.07,4.35,18.2.56C127.21,796.35,158.18,773.56,158.82,755.68ZM446,819.07c14.89-1.5,28.65-4.17,43.41-5.73,7.71-.88,7.94-.65,8.16-8.52,0-7.17.9-14.46-.61-21.52-8,5.12-10.54,15.42-16.13,22.82-3,4.79-14.89,4.93-17.87.14-5.43-7.41-7.9-17.39-15.55-22.85C444.28,794.82,446.8,806.73,446,819.07Zm112.64-21.55v-.2c-12.58.66-18.09-3.35-16.48,12.36-1.73,7.73,26.44,7.12,32.54,9.14,6-1.37,2.18-9.82,2.54-14.23C576.47,795.06,565.34,797.88,558.68,797.52Zm-.57-16.45v-.13c3.66,0,7.33.16,11-.05,8.75.16,8.95-13.72-.28-12.67-7,.07-14,.2-21-.05-8.25-1.22-8.18,13.49-.21,12.9Zm-458.42,61-.8,1.16c2.14,11,39.65,12.69,30.86,5.14C119.73,846.5,109.87,843.06,99.69,842.09Z"
transform="translate(0 0)"/>
<path d="M871.08,441c-3.65-19.35-7.49-37.66-12.48-56.54-4.21-15.12-16.26-24.38-28.52-32.94-46.11-29.35-103.76-34-149.54-65.33C584.4,233.28,627.9,152.29,725.4,155.33,817.05,161,886,234.51,924.11,312.67,943.48,359.32,903.78,410.73,871.08,441Z"
transform="translate(0 0)"/>
<path d="M933.13,315.24c-35.27-71.42-83.64-150.22-166.53-169-33.4-8-45.24-4-71.93-30.06-3.64-3-3.71-5.52-.07-8.48C730.84,74.62,780,81.21,824.34,89.47c50.39,12.41,84.73,59.07,110.64,101.18C956.66,229.12,948.75,276.14,933.13,315.24Z"
transform="translate(0 0)"/>
<path d="M880.43,720.86c16.83,0,33.65.06,50.48,0,4.09.37,19.47-3.89,14.39,4.53-5.69,7.11-11.58,14.07-17.22,21.22-5.75,7.44-16.77,3.07-24.93,4.45-3.75.07-5.58,1.42-5.55,5.71q.42,54.21.39,108.42c-.34,16.13-21.27-8.35-26.94-10.92-3.5-2.67-4-6.24-4-10.21q0-38.73-.1-77.46c-1-5.56,3.51-16.7-5.69-15.79-9.26-.73-21.17,3.46-26.84-6.43-4.06-7.82-12.29-13.36-14.37-22.18,19.53-4,40.4-.54,60.39-1.63Z"
transform="translate(0 0)"/>
<path d="M684.87,784.59q0-12.48,0-25c0-6.09.86-6.89,7.36-6.9,10.32,0,20.65,0,31,0,7.92,1.43,19.7-3.8,24.64,4.3,4,8,13.57,14.86,5,23.95-7.79,14,14.05,9.23-2.77,29.55-2.93,7.51-8.47,9-16,8.75-13.8-.48-27.63,0-41.45,0-6.93,0-7.63-.74-7.75-7.74,0-9,.28-18,.17-27ZM719.48,803V803c5.15-.77,16.88,2.77,16.93-5-.25-1.94-3.9-4.68-6.21-4.89-7.22-.66-14.55-.31-21.83-.3-3.38,0-5.32,1.61-5.22,5.16C703.51,806.07,714.18,802,719.48,803Zm-.06-24.77v.08c5.15-.64,17,2.68,16.91-5.17-.35-1.93-3.65-4.54-5.78-4.71-7.44-.57-14.94-.2-22.42-.22-3.34,0-4.82,1.85-5,5C703.1,781.33,714.23,777.29,719.42,778.2Z"
transform="translate(0 0)"/>
<path d="M350.45,819.45c-9.95-.83-21.6,1.81-30.88-1.24.79-8.71,12.79-17.18,22.41-15.39,8.86,1.1,18,.15,27,.12,3.12,0,5.69-.72,5.92-4.52.25-4.11-2.53-5.23-5.75-5.29-10-.21-20-.39-30-.2-6.34.13-10.79-1.46-14.17-7.61-7.14-13-9.25-9.79-.25-24.08,4.08-6.49,8.39-8.91,16-8.72,16.79.43,33.61-.26,50.43-.43,11.32.33-9,19.6-17.05,16.25-9.55-1-19.32-.07-29-.15-3.67,0-6.49,1.54-6.37,5.39,1.43,7.92,12.84,3.62,18.55,4.65,7.81.14,15.69-.24,23.48.25,7.43,1.29,16.06,18.23,12.57,24.85-4.29,6.85-7.57,17-17.44,16-8.49-.3-17-.08-25.49-.08Z"
transform="translate(0 0)"/>
<path d="M801.69,752.66c8.84.62,19.34-2.48,26.75,3.6,13.78,10.1,8.47,27.4,9.52,42.25-2.87,27-33.92,20-53,20.7-24.87-4.62-19.1-27.09-19.92-45.63.58-12.9,12.86-23.57,25.66-21,3.6.48,7.32.08,11,.08Zm-.38,50.23V803c5.6-1.33,18.08,3.81,18-5q-.12-12.48,0-25c0-3.63-1.58-4.94-5.2-4.86q-12.74.29-25.48,0c-3.58-.08-5.36,1.2-5.37,4.78C785.17,801.54,775.06,804.07,801.31,802.89Z"
transform="translate(0 0)"/>
<path d="M640.63,752.79c16.56-1.14,34.19.3,36.48,20.71.14,18.69,3.62,42.88-21.41,45.78-10.66-.08-21.31-.14-32,0-8.15.61-12.76-7-17-12.74-5.41-9.44-2.49-20.65-3.23-31,1.08-21.6,19.71-24.27,37.17-22.82Zm.06,50.08h0c5-1.22,18.21,3.45,18.17-4.2-1.3-5.46,3.36-32.47-3.93-30.44q-14.23,0-28.48,0c-2.86,0-4.29,1.19-4.26,4.19C624.39,801.63,613.47,804.08,640.69,802.87Z"
transform="translate(0 0)"/>
<path class="cls-1"
d="M405,690.48l13.75,13-1,1.39c-243.87-78-208.74-405.5,43.56-436C448,348.21,485.91,431.26,563.27,460.73c10.07,3.47,17.75,10,24.65,17.24,30.39,31.19,46.78,76.79,37.59,119.88-17,96.08-139.12,143.36-219.2,90.81Zm7.72-70.85c-.27,50.33,25.95,36.65,45.55,4.78,22-39.75,38.66-83.5,39.16-129.51.45-50.51-32.82-29.49-47.76.46C429.94,534.14,414.09,575.62,412.75,619.63ZM296.52,474.75c-6.86,14.27-9.09,29.23-13.19,44.31-3.72,12.53-10.59,87.2,17.28,62,19.32-26.94,26-59.54,30.56-91.8,1.24-11.55,3.08-44.5-12.25-45.47-5.68.86-12.71,9.08-12.93,14.71,9.25-.21,16.79,2.79,19.68,12.12,1.73,4.45-2.29,11-7.25,13.48C308.57,489,302.39,483.65,296.52,474.75Z"
transform="translate(0 0)"/>
<path class="cls-1"
d="M697.57,575c-3.71-35.53-16-68.77-40.74-95-3.68-4.09-3.53-5.09.2-8.91,39.58-37.43,104.61-30.91,146.78-1.68-8.2,11.38-7.8,25.23-11.53,37.81-2.24,11.79-8.82,26.66,2,36.17,11.41,10.44,22.44,21.31,33.57,32.06,8,7.77,19.35-1.19,28.57-2.55,3.85-1.29,4.6.27,4.68,3.72,1.11,30.1-8,59.35-23.8,84.81-11.27,22.19-39.71,11.95-55.58,27.53-9.22,7.6-19.79,14.29-25.72,25-1.79,3-3.62,4.62-7.39,4.63-33.59,4.16-66.44-3.08-94.53-22.11-3.54-2.29-3.61-4.26-1.1-7.14,4.37-5,8.5-10.25,13.11-15a8,8,0,0,1,6-2.24c13.07.37,30.47,11.31,41.71,2.63,11.83-10,24.12-19.39,36.31-28.94,3.14-2.46,4.1-5.25,3.17-9.17-4-16.84-7.94-33.7-11.63-50.61-1.1-5.05-3.47-7.68-8.74-8.47C720.76,575.94,710,570.48,697.57,575Z"
transform="translate(0 0)"/>
<path class="cls-1"
d="M132.57,672c.59-23.54,10.59-42.94,28.92-58,6.23-3.47,20.2-18.49,25-7.5,21.64,40,54.55,71.71,93.23,95.17,6.94,4.62,7.35,6.44,2.24,12.9-7.9,10-16.57,18.93-28,25.16-13.14,7.16-27.27,9.87-41.8,9.82C170.18,750.16,132.39,714.64,132.57,672Z"
transform="translate(0 0)"/>
<path class="cls-1"
d="M119.45,710.71c-.46,7.47-.68,15-1.47,22.4-4.53,16.63-16.5,30.76-24.87,45.73C85,791,69.42,810,55.6,793.5c-8.34-9.16-12.61-20-14.51-32.13-2.69-17.3.67-33.8,5.73-50.09,4.84-15.07,29.56-75.47,45.15-76C115.37,638.9,118.65,691.38,119.45,710.71Z"
transform="translate(0 0)"/>
<path class="cls-1"
d="M158.82,755.68c-.61,17.83-31.61,40.67-45.2,51.63-5.14,3.81-19.39,11.68-18.2-.56,2.32-24.47,19.09-43.84,37-59.24C145,734.35,158.65,737.72,158.82,755.68Z"
transform="translate(0 0)"/>
<path d="M412.75,619.63c1.34-44,17.19-85.49,36.95-124.27,14.81-29.74,48.19-51.15,47.76-.46-.5,46-17.15,89.76-39.16,129.51C438.83,656.07,412.49,670.15,412.75,619.63ZM472,513.81c23.58.13,21.64-31.7.66-32.39C451.46,482.54,447,512.8,472,513.81Z"
transform="translate(0 0)"/>
<path d="M296.52,474.75c5.87,8.9,12.05,14.26,21.9,9.39,5-2.44,9-9,7.25-13.48-2.9-9.32-10.43-12.33-19.68-12.12,1.4-11.74,18.35-22.78,23-5.36,7.86,33.26-2.46,68.47-12.92,100.12-4.08,9.65-9.79,18.92-15.45,27.8-5.56,9.09-18.38,4.71-18.84-5.42C276.16,541.41,283.83,506.6,296.52,474.75Z"
transform="translate(0 0)"/>
<path class="cls-1" d="M472,513.81c-25-1-20.53-31.27.66-32.39C493.64,482.11,495.58,513.94,472,513.81Z"
transform="translate(0 0)"/>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,191 @@
<svg height="1274" node-id="1" sillyvg="true" template-height="1274" template-width="1113"
version="1.1" viewBox="0 0 1113 1274" width="1113" xmlns="http://www.w3.org/2000/svg">
<defs node-id="91">
<linearGradient gradientUnits="objectBoundingBox" id="paint0_linear_1707_19427" node-id="37" spreadMethod="pad"
x1="725.124" x2="725.124" y1="331.053" y2="1020">
<stop offset="0.02" stop-color="#bfd1ff"/>
<stop offset="1" stop-color="#ffffff"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint1_linear_1707_19427" node-id="40" spreadMethod="pad"
x1="609.124" x2="609.124" y1="365.824" y2="937.614">
<stop offset="0.02" stop-color="#2575f2"/>
<stop offset="1" stop-color="#6a11c1"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint2_linear_1707_19427" node-id="43" spreadMethod="pad"
x1="489.611" x2="489.611" y1="465.836" y2="1106.82">
<stop offset="0.02" stop-color="#bfd1ff"/>
<stop offset="1" stop-color="#ffffff"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint3_linear_1707_19427" node-id="46" spreadMethod="pad"
x1="347.166" x2="411.343" y1="448.399" y2="450.996">
<stop offset="0" stop-color="#3c54e2"/>
<stop offset="1" stop-color="#f582c2"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint4_linear_1707_19427" node-id="49" spreadMethod="pad"
x1="543.553" x2="594.004" y1="553.675" y2="553.675">
<stop offset="0" stop-color="#e967cd"/>
<stop offset="1" stop-color="#e967cd"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint5_linear_1707_19427" node-id="52" spreadMethod="pad"
x1="397.766" x2="551.122" y1="518.287" y2="518.287">
<stop offset="0" stop-color="#6571e1"/>
<stop offset="1" stop-color="#f687c4"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint6_linear_1707_19427" node-id="55" spreadMethod="pad"
x1="730.662" x2="638.12" y1="836.463" y2="836.463">
<stop offset="0" stop-color="#6571e1"/>
<stop offset="1" stop-color="#f687c4"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint7_linear_1707_19427" node-id="58" spreadMethod="pad"
x1="781.004" x2="633.004" y1="753.037" y2="753.037">
<stop offset="0" stop-color="#6571e1"/>
<stop offset="1" stop-color="#f687c4"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint8_linear_1707_19427" node-id="61" spreadMethod="pad"
x1="242.77" x2="195.149" y1="604.474" y2="838.115">
<stop offset="0" stop-color="#7eaaf7"/>
<stop offset="1" stop-color="#a671da"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint9_linear_1707_19427" node-id="64" spreadMethod="pad"
x1="69.5178" x2="316.213" y1="505.879" y2="600.202">
<stop offset="0" stop-color="#8b87ff"/>
<stop offset="1" stop-color="#f68bc6"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint10_linear_1707_19427" node-id="67" spreadMethod="pad"
x1="362.026" x2="797.404" y1="938.289" y2="938.289">
<stop offset="0" stop-color="#623fe9"/>
<stop offset="0.1676" stop-color="#6d49e8"/>
<stop offset="0.7004" stop-color="#8c65e5"/>
<stop offset="1" stop-color="#976fe4"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint11_linear_1707_19427" node-id="72" spreadMethod="pad"
x1="363.875" x2="767.672" y1="732.915" y2="1007.79">
<stop offset="0" stop-color="#8b87ff"/>
<stop offset="1" stop-color="#f68bc6"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint12_linear_1707_19427" node-id="75" spreadMethod="pad"
x1="355.429" x2="416.268" y1="889.089" y2="889.089">
<stop offset="0" stop-color="#e967cd"/>
<stop offset="0.1594" stop-color="#eb6fc3"/>
<stop offset="0.4286" stop-color="#f086a9"/>
<stop offset="0.7724" stop-color="#f8aa7e"/>
<stop offset="1" stop-color="#fec55e"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint13_linear_1707_19427" node-id="81" spreadMethod="pad"
x1="197.003" x2="161.063" y1="336.698" y2="512.666">
<stop offset="0" stop-color="#7eaaf7"/>
<stop offset="1" stop-color="#a671da"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint14_linear_1707_19427" node-id="84" spreadMethod="pad"
x1="55.5638" x2="236.776" y1="521.605" y2="484.49">
<stop offset="0.02" stop-color="#2575f2"/>
<stop offset="1" stop-color="#b881ff"/>
</linearGradient>
<linearGradient gradientUnits="objectBoundingBox" id="paint15_linear_1707_19427" node-id="87" spreadMethod="pad"
x1="201.409" x2="783.983" y1="401.927" y2="370.494">
<stop offset="0.02" stop-color="#2575f2"/>
<stop offset="1" stop-color="#6a11c1"/>
</linearGradient>
</defs>
<path d="M 1081.00 484.00 L 1080.20 476.20 L 1079.10 472.20 L 1076.00 464.40 L 1074.00 460.60 L 1071.70 457.00 L 1066.50 450.60 L 1063.60 447.80 L 1057.50 443.40 L 392.70 65.20 L 389.40 63.50 L 386.40 62.50 L 383.60 62.10 L 381.00 62.10 L 378.50 62.50 L 376.30 63.50 L 374.30 64.90 L 372.50 66.80 L 371.20 68.90 L 370.20 71.60 L 369.50 74.80 L 369.30 78.70 L 369.30 602.40 L 370.10 610.20 L 371.10 614.20 L 374.20 622.00 L 376.30 625.80 L 378.50 629.40 L 383.70 635.80 L 386.70 638.70 L 392.70 643.10 L 1057.50 1021.30 L 1060.90 1022.90 L 1063.90 1023.90 L 1066.70 1024.40 L 1069.20 1024.40 L 1071.80 1023.90 L 1074.00 1023.00 L 1076.00 1021.60 L 1077.70 1019.70 L 1079.00 1017.50 L 1080.10 1014.90 L 1080.70 1011.60 L 1081.00 1007.70 L 1081.00 484.00 Z"
fill="url(#paint0_linear_1707_19427)" fill-opacity="0.6" fill-rule="nonzero" node-id="200" stroke="none"
target-height="962.30005" target-width="711.7" target-x="369.3" target-y="62.1"/>
<path d="M 965.00 532.00 L 964.20 524.20 L 963.10 520.20 L 960.00 512.40 L 958.00 508.60 L 955.70 505.00 L 950.50 498.60 L 947.60 495.80 L 941.50 491.40 L 276.70 113.20 L 273.40 111.50 L 270.40 110.50 L 267.60 110.10 L 265.00 110.10 L 262.50 110.50 L 260.30 111.50 L 258.30 112.90 L 256.50 114.80 L 255.20 116.90 L 254.20 119.60 L 253.50 122.80 L 253.30 126.70 L 253.30 650.40 L 254.10 658.20 L 255.10 662.20 L 258.20 670.00 L 260.30 673.80 L 262.50 677.40 L 267.70 683.80 L 270.70 686.70 L 276.70 691.10 L 941.50 1069.30 L 944.90 1070.90 L 947.90 1071.90 L 950.70 1072.40 L 953.20 1072.40 L 955.80 1071.90 L 958.00 1071.00 L 960.00 1069.60 L 961.70 1067.70 L 963.00 1065.50 L 964.10 1062.90 L 964.70 1059.60 L 965.00 1055.70 L 965.00 532.00 Z"
fill="url(#paint1_linear_1707_19427)" fill-rule="nonzero" node-id="202" stroke="none"
target-height="962.30005" target-width="711.7" target-x="253.3" target-y="110.1"/>
<path d="M 838.50 637.50 L 837.60 629.70 L 836.60 625.70 L 833.50 617.90 L 831.50 614.10 L 829.20 610.50 L 824.00 604.10 L 821.10 601.30 L 815.00 596.90 L 164.20 218.70 L 160.90 217.00 L 157.80 216.00 L 155.10 215.60 L 152.50 215.60 L 150.00 216.00 L 147.70 217.00 L 145.80 218.40 L 144.00 220.30 L 142.70 222.40 L 141.70 225.10 L 141.00 228.30 L 140.70 232.20 L 140.70 686.00 L 141.60 693.70 L 144.00 701.70 L 147.70 709.30 L 152.50 716.30 L 158.10 722.20 L 164.20 726.60 L 815.00 1107.80 L 818.40 1109.40 L 821.40 1110.40 L 824.20 1110.90 L 826.70 1110.90 L 829.30 1110.40 L 831.50 1109.50 L 833.50 1108.10 L 835.20 1106.20 L 836.50 1104.00 L 837.50 1101.40 L 838.20 1098.10 L 838.50 1094.20 L 838.50 637.50 Z"
fill="url(#paint2_linear_1707_19427)" fill-rule="nonzero" node-id="204" stroke="none"
target-height="895.30005" target-width="697.8" target-x="140.7" target-y="215.6"/>
<path d="M 842.00 597.00 L 841.20 589.20 L 840.10 585.20 L 837.00 577.40 L 835.00 573.60 L 832.70 570.00 L 827.50 563.60 L 824.60 560.80 L 818.50 556.40 L 161.70 178.20 L 158.40 176.50 L 155.40 175.50 L 152.60 175.10 L 150.00 175.10 L 147.50 175.50 L 145.30 176.50 L 143.30 177.90 L 141.50 179.80 L 140.20 181.90 L 139.20 184.60 L 138.50 187.80 L 138.30 191.70 L 138.30 686.40 L 139.10 694.20 L 140.10 698.20 L 143.20 706.00 L 145.30 709.80 L 147.50 713.40 L 152.70 719.80 L 155.70 722.70 L 161.70 727.10 L 818.50 1105.30 L 821.90 1106.90 L 824.90 1107.90 L 827.70 1108.40 L 830.20 1108.40 L 832.80 1107.90 L 835.00 1107.00 L 837.00 1105.60 L 838.70 1103.70 L 840.00 1101.50 L 841.10 1098.90 L 841.70 1095.60 L 842.00 1091.70 L 842.00 597.00 Z"
fill="#ffffff" fill-rule="nonzero" node-id="206" stroke="none" target-height="933.30005" target-width="703.7"
target-x="138.3" target-y="175.1"/>
<path d="M 202.00 574.60 L 202.30 572.60 L 202.90 570.90 L 203.90 569.50 L 206.70 567.40 L 210.20 566.70 L 211.90 567.00 L 213.80 567.80 L 292.00 613.00 L 293.60 614.30 L 294.80 615.90 L 295.60 617.70 L 295.90 619.80 L 295.60 621.70 L 295.00 623.40 L 294.00 624.90 L 292.70 626.10 L 289.50 627.50 L 287.70 627.60 L 286.00 627.30 L 284.20 626.50 L 205.90 581.40 L 204.30 580.10 L 203.10 578.50 L 202.30 576.60 L 202.00 574.60 Z"
fill="#dfe6fd" fill-rule="nonzero" node-id="208" stroke="none" target-height="60.899963"
target-width="93.899994" target-x="202" target-y="566.7"/>
<path d="M 202.00 613.50 L 202.30 611.80 L 203.20 610.40 L 204.40 609.40 L 205.90 608.80 L 207.60 608.80 L 209.30 609.40 L 488.90 771.20 L 489.90 771.90 L 491.20 774.10 L 491.30 775.30 L 491.00 777.10 L 490.20 778.50 L 488.90 779.50 L 487.40 780.10 L 485.80 780.10 L 484.10 779.50 L 204.40 617.70 L 202.70 616.00 L 202.00 613.50 Z"
fill="#dfe6fd" fill-rule="nonzero" node-id="210" stroke="none" target-height="171.29999" target-width="289.3"
target-x="202" target-y="608.8"/>
<path d="M 202.00 650.70 L 202.30 648.90 L 203.20 647.60 L 204.40 646.50 L 205.90 646.00 L 207.50 645.90 L 209.20 646.50 L 408.80 762.20 L 410.60 764.00 L 411.20 766.40 L 410.90 768.10 L 410.00 769.50 L 408.80 770.60 L 407.30 771.10 L 405.60 771.20 L 403.90 770.60 L 204.40 654.80 L 202.60 653.10 L 202.00 650.70 Z"
fill="#dfe6fd" fill-rule="nonzero" node-id="212" stroke="none" target-height="125.29999"
target-width="209.20001" target-x="202" target-y="645.9"/>
<path d="M 202.00 457.50 L 202.30 455.50 L 202.90 453.80 L 205.20 451.10 L 208.40 449.70 L 210.10 449.50 L 211.90 449.80 L 213.80 450.60 L 291.80 494.00 L 293.50 495.30 L 294.80 496.90 L 295.60 498.80 L 295.90 500.90 L 295.60 502.90 L 295.00 504.60 L 294.00 506.00 L 292.70 507.20 L 289.50 508.60 L 287.80 508.80 L 286.00 508.50 L 284.20 507.80 L 206.10 464.40 L 204.40 463.10 L 203.10 461.50 L 202.30 459.60 L 202.00 457.50 Z"
fill="#e5ecff" fill-rule="nonzero" node-id="214" stroke="none" target-height="59.299988"
target-width="93.899994" target-x="202" target-y="449.5"/>
<path d="M 202.00 492.50 L 202.30 490.70 L 203.20 489.30 L 204.40 488.30 L 205.90 487.70 L 207.60 487.70 L 209.30 488.20 L 564.90 688.20 L 566.70 689.90 L 567.30 692.40 L 567.00 694.20 L 566.20 695.60 L 564.90 696.60 L 563.40 697.20 L 561.80 697.20 L 560.10 696.60 L 204.50 496.70 L 202.70 494.90 L 202.00 492.50 Z"
fill="#e5ecff" fill-rule="nonzero" node-id="216" stroke="none" target-height="209.5" target-width="365.3"
target-x="202" target-y="487.7"/>
<path d="M 202.00 527.60 L 202.30 525.90 L 203.20 524.50 L 204.40 523.40 L 205.90 522.80 L 207.50 522.80 L 209.20 523.40 L 408.70 634.20 L 410.50 636.00 L 411.20 638.50 L 410.90 640.20 L 410.00 641.60 L 408.80 642.70 L 407.30 643.30 L 405.60 643.30 L 403.90 642.70 L 204.50 531.80 L 202.70 530.10 L 202.00 527.60 Z"
fill="#e5ecff" fill-rule="nonzero" node-id="218" stroke="none" target-height="120.5" target-width="209.20001"
target-x="202" target-y="522.8"/>
<path d="M 367.80 407.00 L 411.00 433.00 L 411.00 493.30 L 360.70 461.90 L 378.90 444.70 L 367.80 407.00 Z"
fill="url(#paint3_linear_1707_19427)" fill-rule="nonzero" node-id="220" stroke="none" target-height="86.29999"
target-width="50.299988" target-x="360.7" target-y="407"/>
<path d="M 397.80 444.20 L 411.00 475.70 L 411.00 433.00 L 397.80 444.20 Z" fill="#615cf5" fill-rule="nonzero"
node-id="222" stroke="none" target-height="42.700012" target-width="13.200012" target-x="397.8"
target-y="433"/>
<path d="M 543.60 511.30 L 594.00 541.00 L 579.40 560.90 L 585.20 596.00 L 543.60 570.70 L 543.60 511.30 Z"
fill="url(#paint4_linear_1707_19427)" fill-rule="nonzero" node-id="224" stroke="none" target-height="84.70001"
target-width="50.400024" target-x="543.6" target-y="511.3"/>
<path d="M 551.10 532.40 L 543.60 511.30 L 543.60 548.10 L 551.10 532.40 Z" fill="#f68cc7" fill-rule="nonzero"
node-id="226" stroke="none" target-height="36.799988" target-width="7.5" target-x="543.6" target-y="511.3"/>
<path d="M 397.80 443.90 L 551.10 532.40 L 551.10 592.80 L 397.80 503.20 L 397.80 443.90 Z"
fill="url(#paint5_linear_1707_19427)" fill-rule="nonzero" node-id="228" stroke="none" target-height="148.9"
target-width="153.29999" target-x="397.8" target-y="443.9"/>
<path d="M 749.20 828.30 L 780.30 828.30 L 780.10 835.30 L 778.70 847.80 L 777.50 853.80 L 774.30 864.60 L 771.90 870.00 L 769.30 875.00 L 766.50 879.50 L 763.20 883.60 L 759.70 887.30 L 755.80 890.50 L 751.60 893.20 L 747.20 895.20 L 742.70 896.70 L 738.00 897.60 L 733.30 898.00 L 728.40 897.90 L 731.40 860.10 L 734.20 860.40 L 736.50 860.10 L 738.50 859.30 L 741.90 856.60 L 743.50 854.60 L 744.90 852.20 L 746.20 849.00 L 748.20 839.80 L 748.90 834.30 L 749.20 828.30 Z"
fill="#eddeff" fill-rule="nonzero" node-id="230" stroke="none" target-height="69.70001"
target-width="51.899963" target-x="728.4" target-y="828.3"/>
<path d="M 669.20 776.50 L 671.20 784.20 L 673.70 791.90 L 676.70 799.50 L 683.90 814.00 L 687.90 821.00 L 692.30 827.60 L 696.60 833.50 L 699.70 837.40 L 705.90 844.10 L 715.10 852.00 L 723.40 856.70 L 726.10 857.80 L 730.70 858.60 L 727.70 896.40 L 722.90 895.70 L 718.10 894.50 L 713.30 892.70 L 708.50 890.50 L 698.80 884.60 L 692.30 879.30 L 685.60 873.30 L 677.10 864.10 L 672.90 858.60 L 667.40 850.80 L 662.00 842.40 L 656.90 833.80 L 652.20 824.60 L 648.00 815.10 L 644.30 805.60 L 638.10 786.10 L 669.20 776.50 Z"
fill="url(#paint6_linear_1707_19427)" fill-opacity="0.6" fill-rule="nonzero" node-id="232" stroke="none"
target-height="119.900024" target-width="92.60004" target-x="638.1" target-y="776.5"/>
<path d="M 679.80 678.00 L 684.40 678.00 L 689.20 678.70 L 694.10 679.90 L 699.10 681.70 L 703.90 683.90 L 713.80 689.80 L 720.50 695.00 L 727.30 701.10 L 731.60 705.40 L 740.20 715.70 L 745.80 723.60 L 751.40 731.80 L 756.60 740.50 L 761.40 749.70 L 765.60 759.10 L 769.40 768.60 L 772.70 778.20 L 775.70 788.10 L 778.80 802.00 L 780.50 815.30 L 781.00 828.00 L 749.30 828.00 L 749.00 821.20 L 748.30 813.80 L 745.50 798.40 L 743.50 790.70 L 741.00 783.00 L 737.90 775.50 L 730.50 761.00 L 726.40 754.00 L 722.00 747.40 L 714.40 737.60 L 711.30 734.10 L 703.20 726.60 L 698.70 723.10 L 694.20 720.40 L 687.50 717.30 L 685.10 716.70 L 680.00 716.10 L 677.60 716.50 L 675.60 717.30 L 672.20 720.00 L 670.50 722.00 L 669.00 724.40 L 666.80 730.20 L 665.40 736.70 L 664.70 747.50 L 665.00 754.20 L 665.80 761.70 L 668.50 777.00 L 638.30 788.10 L 636.60 781.10 L 634.20 767.50 L 633.30 757.40 L 633.00 747.50 L 633.20 740.50 L 634.60 728.00 L 635.80 722.00 L 639.00 711.30 L 641.50 705.80 L 644.20 700.80 L 647.10 696.40 L 650.40 692.20 L 654.00 688.60 L 660.80 683.10 L 664.00 681.20 L 667.70 679.80 L 671.60 678.80 L 675.60 678.20 L 679.80 678.00 Z"
fill="url(#paint7_linear_1707_19427)" fill-rule="nonzero" node-id="234" stroke="none" target-height="150"
target-width="148" target-x="633" target-y="678"/>
<path d="M 94.50 500.00 L 90.00 502.20 L 92.20 729.60 L 92.50 732.40 L 93.30 735.10 L 94.50 737.80 L 96.10 740.20 L 100.10 744.20 L 292.80 855.10 L 296.60 853.20 L 298.20 851.90 L 299.60 850.20 L 300.70 848.30 L 301.50 846.10 L 301.70 843.90 L 301.70 626.60 L 301.40 623.80 L 300.70 621.10 L 299.50 618.50 L 297.90 616.00 L 293.90 612.00 L 100.50 500.70 L 97.00 500.00 L 94.50 500.00 Z"
fill="url(#paint8_linear_1707_19427)" fill-opacity="0.6" fill-rule="nonzero" node-id="236" stroke="none"
target-height="355.09998" target-width="211.70001" target-x="90" target-y="500"/>
<path d="M 56.80 532.20 L 53.60 531.40 L 51.20 532.00 L 50.10 533.00 L 49.30 534.60 L 49.00 536.70 L 49.00 761.90 L 49.30 764.70 L 50.00 767.40 L 51.20 770.00 L 52.80 772.40 L 56.80 776.50 L 249.50 884.00 L 252.80 884.90 L 255.10 884.30 L 256.30 883.20 L 257.10 881.70 L 257.40 879.50 L 257.40 659.90 L 257.10 657.20 L 256.30 654.50 L 255.10 651.80 L 253.50 649.40 L 249.50 645.40 L 56.80 532.20 Z"
fill="url(#paint9_linear_1707_19427)" fill-rule="nonzero" node-id="238" stroke="none" target-height="353.5"
target-width="208.4" target-x="49" target-y="531.4"/>
<path d="M 183.40 756.30 L 184.70 756.70 L 185.90 756.60 L 187.20 756.10 L 188.60 754.90 L 191.10 751.20 L 192.10 746.90 L 192.40 738.40 L 192.10 731.10 L 191.20 724.10 L 189.70 717.20 L 186.30 707.10 L 184.00 702.00 L 178.50 692.00 L 175.50 687.40 L 172.20 683.20 L 168.70 679.30 L 160.90 672.30 L 152.10 666.70 L 147.30 664.30 L 142.90 662.60 L 138.90 661.50 L 135.30 660.90 L 131.50 660.90 L 128.10 661.50 L 124.90 662.60 L 121.80 664.40 L 119.10 666.70 L 116.60 669.20 L 114.50 672.20 L 112.70 675.60 L 111.40 679.10 L 110.40 683.30 L 109.70 688.00 L 109.50 693.60 L 109.80 700.30 L 110.60 707.20 L 112.20 714.30 L 113.70 719.50 L 117.90 729.80 L 120.70 735.00 L 124.80 741.60 L 129.10 747.40 L 133.60 752.60 L 137.20 756.30 L 141.20 759.60 L 145.40 762.60 L 153.30 767.20 L 156.60 768.50 L 159.60 769.30 L 165.30 769.70 L 168.10 769.30 L 173.30 767.50 L 179.00 782.10 L 173.10 783.50 L 168.30 783.60 L 161.30 782.30 L 154.60 780.30 L 152.20 779.10 L 144.50 774.10 L 139.40 770.20 L 129.70 761.50 L 125.20 756.70 L 120.90 751.40 L 116.80 745.70 L 112.90 739.50 L 109.30 733.00 L 106.30 726.60 L 103.80 720.10 L 101.80 713.70 L 100.20 707.10 L 99.10 700.60 L 98.50 694.20 L 98.30 688.00 L 98.60 681.50 L 99.40 675.90 L 100.70 670.80 L 102.40 666.40 L 104.20 662.90 L 106.20 659.90 L 108.50 657.30 L 111.10 655.10 L 114.00 653.20 L 117.10 651.80 L 120.30 650.70 L 123.80 650.00 L 127.40 649.70 L 131.30 649.90 L 136.10 650.60 L 141.10 651.90 L 146.40 653.80 L 152.10 656.60 L 162.50 663.90 L 172.20 672.70 L 176.70 677.50 L 180.90 682.70 L 185.10 688.50 L 189.00 694.70 L 192.60 701.10 L 195.60 707.60 L 198.10 714.00 L 200.10 720.40 L 201.70 727.00 L 202.80 733.50 L 203.40 739.90 L 203.60 746.20 L 202.90 756.50 L 202.10 760.50 L 200.90 764.30 L 199.50 767.40 L 198.00 769.70 L 194.50 772.30 L 191.00 773.20 L 188.60 773.10 L 185.70 772.30 L 182.30 770.80 L 177.40 767.20 L 174.60 764.00 L 173.30 761.90 L 170.10 755.70 L 167.70 749.60 L 165.90 751.00 L 164.00 752.10 L 161.90 752.70 L 159.50 752.90 L 157.10 752.70 L 151.80 751.10 L 148.70 749.60 L 145.00 747.10 L 141.50 744.30 L 138.30 741.00 L 132.60 733.20 L 127.10 723.20 L 125.10 718.30 L 123.60 713.70 L 122.60 709.00 L 122.00 704.10 L 122.00 694.10 L 122.70 689.90 L 123.60 686.40 L 124.70 683.90 L 127.70 679.60 L 129.70 677.90 L 131.40 676.50 L 133.40 675.50 L 135.60 675.10 L 138.10 675.10 L 141.40 675.70 L 145.20 676.90 L 151.60 680.00 L 155.80 683.40 L 163.30 692.40 L 165.50 695.80 L 165.50 689.10 L 182.30 698.00 L 182.30 747.30 L 181.30 748.50 L 180.60 750.60 L 180.80 752.20 L 181.40 753.70 L 183.40 756.30 Z M 163.30 721.60 L 163.00 717.50 L 162.40 713.90 L 161.40 710.40 L 159.90 707.00 L 158.00 703.80 L 155.80 701.10 L 150.90 696.90 L 149.20 695.90 L 146.00 695.20 L 143.20 696.00 L 142.00 696.90 L 140.60 698.70 L 139.50 700.90 L 138.90 703.60 L 138.60 707.00 L 139.50 714.30 L 140.50 718.00 L 142.00 721.60 L 146.00 728.00 L 148.50 730.80 L 150.90 732.80 L 152.70 733.70 L 155.80 734.40 L 158.70 733.70 L 159.90 732.80 L 161.70 729.90 L 162.40 728.00 L 163.10 724.90 L 163.30 721.60 Z"
fill="#ffffff" fill-rule="nonzero" node-id="240" stroke="none" target-height="133.89996" target-width="105.3"
target-x="98.3" target-y="649.7"/>
<path d="M 362.10 731.90 L 362.10 884.90 L 362.70 889.50 L 363.50 891.80 L 365.20 895.10 L 368.90 899.90 L 372.40 902.60 L 786.60 1146.70 L 793.30 1143.10 L 794.90 1141.80 L 796.30 1140.10 L 797.20 1138.00 L 797.50 1135.80 L 797.50 987.60 L 796.90 983.10 L 796.10 980.70 L 794.40 977.40 L 790.60 972.60 L 787.20 970.00 L 375.40 731.30 L 373.30 730.50 L 368.80 730.00 L 364.30 730.90 L 362.10 731.90 Z"
fill="url(#paint10_linear_1707_19427)" fill-opacity="0.5" fill-rule="nonzero" node-id="242" stroke="none"
target-height="416.69995" target-width="435.4" target-x="362.1" target-y="730"/>
<path d="M 331.30 764.10 L 327.70 762.90 L 324.80 763.20 L 323.50 763.90 L 321.70 766.30 L 321.00 770.20 L 321.00 919.00 L 321.70 923.50 L 322.50 925.80 L 324.10 929.20 L 327.90 934.00 L 331.30 936.60 L 746.10 1176.50 L 749.70 1177.70 L 752.70 1177.40 L 753.90 1176.70 L 755.00 1175.60 L 755.70 1174.30 L 756.20 1172.60 L 756.40 1170.40 L 756.40 1021.60 L 755.80 1017.10 L 755.00 1014.80 L 753.30 1011.40 L 749.60 1006.60 L 746.10 1004.00 L 331.30 764.10 Z"
fill="url(#paint11_linear_1707_19427)" fill-rule="nonzero" node-id="244" stroke="none"
target-height="414.79993" target-width="435.40002" target-x="321" target-y="762.9"/>
<path d="M 430.90 872.10 L 431.60 869.50 L 432.30 868.50 L 433.70 867.30 L 435.40 866.70 L 436.70 866.60 L 439.20 867.40 L 730.20 1038.90 L 731.30 1039.80 L 732.60 1042.10 L 732.80 1043.40 L 732.20 1045.90 L 731.50 1046.90 L 730.10 1048.00 L 727.30 1048.70 L 724.90 1048.00 L 433.60 876.90 L 431.70 874.80 L 430.90 872.10 Z"
fill="#ffffff" fill-rule="nonzero" node-id="246" stroke="none" target-height="182.09998" target-width="301.9"
target-x="430.9" target-y="866.6"/>
<path d="M 430.90 909.30 L 431.50 906.90 L 433.60 904.80 L 436.40 904.10 L 438.80 904.80 L 730.30 1076.70 L 731.30 1077.50 L 732.60 1079.60 L 732.80 1080.90 L 732.40 1082.80 L 731.50 1084.20 L 730.30 1085.30 L 728.70 1085.80 L 727.00 1085.90 L 725.30 1085.20 L 433.50 913.80 L 431.60 911.90 L 430.90 909.30 Z"
fill="#ffffff" fill-rule="nonzero" node-id="248" stroke="none" target-height="181.80005" target-width="301.9"
target-x="430.9" target-y="904.1"/>
<path d="M 430.90 946.80 L 431.60 944.20 L 432.30 943.20 L 433.70 942.00 L 435.40 941.40 L 436.70 941.30 L 439.20 942.10 L 569.20 1018.90 L 570.30 1019.70 L 571.60 1022.00 L 571.80 1023.40 L 571.20 1025.90 L 569.20 1027.90 L 566.30 1028.60 L 563.90 1027.90 L 433.60 951.50 L 431.70 949.50 L 430.90 946.80 Z"
fill="#ffffff" fill-rule="nonzero" node-id="250" stroke="none" target-height="87.29999" target-width="140.9"
target-x="430.9" target-y="941.3"/>
<path d="M 400.00 882.50 L 402.50 879.60 L 403.50 877.60 L 404.70 873.10 L 404.80 870.40 L 404.10 863.90 L 403.20 860.40 L 401.30 855.30 L 398.80 850.30 L 396.80 847.10 L 392.30 841.40 L 389.70 839.00 L 384.20 835.20 L 381.30 833.70 L 378.60 832.80 L 376.20 832.30 L 374.00 832.40 L 371.70 832.80 L 369.70 833.70 L 368.00 834.90 L 366.40 836.60 L 365.20 838.50 L 364.30 840.80 L 363.80 843.50 L 363.50 846.70 L 363.90 851.30 L 364.80 855.90 L 366.40 860.50 L 368.50 865.00 L 371.00 869.30 L 373.80 873.40 L 370.30 875.50 L 367.10 877.90 L 364.10 880.60 L 361.50 883.70 L 359.30 887.10 L 357.50 890.80 L 356.10 894.60 L 355.30 898.80 L 355.00 911.10 L 415.70 946.90 L 415.60 923.30 L 415.00 916.90 L 413.70 910.70 L 411.90 904.60 L 409.60 898.70 L 406.90 893.10 L 403.60 887.70 L 400.00 882.50 Z"
fill="url(#paint12_linear_1707_19427)" fill-rule="nonzero" node-id="252" stroke="none"
target-height="114.60004" target-width="60.700012" target-x="355" target-y="832.3"/>
<path d="M 85.50 258.60 L 82.20 260.20 L 83.90 431.20 L 84.60 435.30 L 85.50 437.30 L 86.70 439.10 L 89.70 442.10 L 234.60 525.50 L 237.50 524.10 L 239.70 521.80 L 241.10 518.70 L 241.30 517.10 L 241.30 353.70 L 240.60 349.60 L 239.60 347.60 L 238.40 345.80 L 235.40 342.80 L 90.60 259.40 L 89.80 258.40 L 88.70 258.00 L 85.50 258.60 Z"
fill="url(#paint13_linear_1707_19427)" fill-opacity="0.6" fill-rule="nonzero" node-id="254" stroke="none"
target-height="267.5" target-width="159.1" target-x="82.2" target-y="258"/>
<path d="M 54.90 277.50 L 53.20 276.90 L 51.80 276.90 L 50.70 277.30 L 49.80 278.10 L 49.20 279.30 L 49.00 280.90 L 49.00 450.20 L 49.80 454.30 L 50.70 456.30 L 51.90 458.10 L 54.90 461.10 L 199.70 541.90 L 201.50 542.50 L 202.80 542.60 L 203.90 542.20 L 204.80 541.40 L 205.40 540.20 L 205.60 538.60 L 205.60 373.50 L 204.90 369.40 L 203.90 367.40 L 202.70 365.60 L 199.70 362.60 L 54.90 277.50 Z"
fill="url(#paint14_linear_1707_19427)" fill-rule="nonzero" node-id="256" stroke="none"
target-height="265.69998" target-width="156.6" target-x="49" target-y="276.9"/>
<path d="M 153.40 408.90 L 159.30 405.50 L 160.30 403.60 L 160.20 402.30 L 152.00 385.80 L 150.40 384.50 L 148.90 384.20 L 143.30 387.00 L 142.10 386.80 L 141.50 386.40 L 139.90 384.20 L 138.50 382.90 L 137.60 380.70 L 137.30 370.50 L 136.00 367.30 L 134.90 365.90 L 124.80 359.20 L 123.50 358.90 L 122.50 359.10 L 121.70 359.80 L 121.40 360.90 L 121.40 368.50 L 120.90 369.60 L 119.70 370.20 L 117.30 369.90 L 116.50 369.20 L 110.80 358.10 L 109.20 356.70 L 107.60 356.40 L 99.50 360.90 L 98.60 362.80 L 98.70 364.10 L 103.70 374.40 L 104.20 375.60 L 104.20 377.10 L 102.60 379.90 L 100.40 380.30 L 93.60 376.10 L 92.40 375.70 L 91.30 375.90 L 90.60 376.60 L 90.30 377.70 L 89.40 389.50 L 89.60 390.90 L 90.80 394.00 L 91.90 395.40 L 98.70 399.60 L 101.20 403.00 L 102.10 405.50 L 101.70 407.90 L 96.20 410.60 L 95.20 412.50 L 95.30 413.80 L 103.50 430.30 L 105.00 431.60 L 106.60 431.90 L 112.20 429.10 L 113.40 429.30 L 114.00 429.70 L 115.50 431.90 L 117.00 433.20 L 117.90 435.40 L 118.20 445.60 L 119.50 448.80 L 120.60 450.20 L 130.70 456.90 L 132.00 457.20 L 133.00 457.00 L 133.80 456.30 L 134.10 455.20 L 134.20 447.00 L 135.10 446.10 L 137.40 445.90 L 138.10 446.20 L 139.00 446.90 L 139.90 448.50 L 144.70 458.00 L 146.30 459.40 L 147.80 459.70 L 155.90 455.20 L 156.90 453.30 L 156.80 452.00 L 151.20 440.50 L 151.30 439.00 L 152.60 436.70 L 153.80 435.90 L 155.10 435.80 L 161.80 440.10 L 163.10 440.40 L 164.20 440.20 L 164.90 439.50 L 165.20 438.40 L 166.10 425.70 L 165.40 422.80 L 163.50 419.80 L 156.80 415.60 L 155.50 414.30 L 154.30 412.30 L 153.40 408.90 Z M 115.50 410.60 L 113.70 404.40 L 113.30 401.60 L 113.40 396.40 L 114.80 392.30 L 115.90 390.80 L 117.30 389.60 L 118.90 388.90 L 120.80 388.50 L 125.30 389.20 L 127.60 390.10 L 129.90 391.60 L 134.20 395.50 L 136.20 398.10 L 139.50 403.90 L 141.90 410.40 L 142.60 413.40 L 143.10 419.00 L 142.40 423.50 L 141.50 425.50 L 140.40 427.00 L 139.00 428.20 L 137.40 428.90 L 135.50 429.30 L 131.00 428.60 L 128.80 427.60 L 126.40 426.00 L 122.10 421.90 L 120.10 419.30 L 116.80 413.60 L 115.50 410.60 Z"
fill="#ffffff" fill-rule="nonzero" node-id="258" stroke="none" target-height="103.30002"
target-width="76.700005" target-x="89.4" target-y="356.4"/>
<path d="M 409.40 382.10 L 843.00 628.00 L 843.00 586.60 L 842.40 581.00 L 840.00 573.70 L 837.80 569.50 L 835.20 565.50 L 829.90 559.80 L 825.20 556.50 L 153.20 173.10 L 148.70 172.00 L 144.90 172.40 L 141.70 174.20 L 139.40 177.20 L 138.70 179.20 L 138.00 184.40 L 138.00 225.70"
fill="url(#paint15_linear_1707_19427)" fill-rule="nonzero" node-id="260" stroke="none" target-height="456"
target-width="705" target-x="138" target-y="172"/>
<path d="M 211.00 236.70 L 211.30 239.70 L 212.30 243.00 L 213.80 246.10 L 215.80 248.90 L 218.10 251.40 L 220.60 253.20 L 224.10 254.50 L 226.80 254.20 L 228.00 253.60 L 229.60 251.30 L 230.20 247.80 L 229.90 244.70 L 228.90 241.50 L 227.40 238.40 L 225.50 235.50 L 223.10 233.00 L 220.60 231.20 L 217.20 229.90 L 214.40 230.20 L 213.30 230.90 L 211.60 233.10 L 211.00 236.70 Z"
fill="#ffffff" fill-rule="nonzero" node-id="262" stroke="none" target-height="24.600006"
target-width="19.199997" target-x="211" target-y="229.9"/>
<path d="M 186.00 222.20 L 186.30 225.30 L 187.30 228.50 L 188.80 231.60 L 190.80 234.50 L 193.10 237.00 L 195.60 238.80 L 199.00 240.10 L 201.80 239.80 L 203.00 239.10 L 204.60 236.90 L 205.20 233.30 L 204.90 230.30 L 203.90 227.00 L 202.40 223.90 L 200.50 221.10 L 198.10 218.60 L 195.60 216.80 L 192.20 215.50 L 189.40 215.80 L 188.30 216.40 L 186.60 218.60 L 186.00 222.20 Z"
fill="#ffffff" fill-rule="nonzero" node-id="264" stroke="none" target-height="24.600006"
target-width="19.199997" target-x="186" target-y="215.5"/>
<path d="M 161.00 207.80 L 161.30 210.90 L 162.30 214.10 L 163.80 217.20 L 165.80 220.10 L 168.10 222.50 L 170.60 224.40 L 174.00 225.60 L 176.80 225.30 L 177.90 224.70 L 179.60 222.50 L 180.20 218.90 L 179.90 215.80 L 178.90 212.60 L 177.40 209.50 L 175.50 206.60 L 173.10 204.20 L 170.60 202.30 L 167.20 201.10 L 164.40 201.30 L 163.30 202.00 L 161.60 204.20 L 161.00 207.80 Z"
fill="#ffffff" fill-rule="nonzero" node-id="266" stroke="none" target-height="24.5" target-width="19.199997"
target-x="161" target-y="201.1"/>
</svg>

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -0,0 +1,400 @@
<svg height="1200" node-id="1" sillyvg="true" template-height="1200" template-width="1600"
version="1.1" viewBox="0 0 1600 1200" width="1600" xmlns="http://www.w3.org/2000/svg">
<defs node-id="138"></defs>
<g node-id="416">
<path d="M 1273.10 227.80 L 1273.10 857.40 L 1272.80 861.40 L 1272.00 865.20 L 1270.80 868.70 L 1269.10 872.10 L 1267.00 875.20 L 1264.50 878.00 L 1261.70 880.40 L 1258.70 882.50 L 1255.30 884.20 L 1251.70 885.40 L 1248.00 886.20 L 1244.00 886.50 L 315.80 886.50 L 312.20 886.30 L 308.80 885.60 L 305.60 884.70 L 302.50 883.30 L 297.00 879.60 L 292.50 874.80 L 290.70 872.10 L 288.00 866.00 L 286.80 860.10 L 286.70 227.80 L 287.20 222.70 L 288.00 219.30 L 290.70 213.20 L 294.60 207.90 L 299.60 203.70 L 305.60 200.60 L 308.80 199.60 L 312.20 199.00 L 315.80 198.80 L 1244.00 198.80 L 1248.00 199.10 L 1251.70 199.80 L 1255.30 201.10 L 1258.70 202.80 L 1261.70 204.80 L 1264.50 207.30 L 1267.00 210.10 L 1269.10 213.20 L 1270.80 216.50 L 1272.00 220.10 L 1272.80 223.80 L 1273.10 227.80 Z"
fill="#edf1fc" fill-rule="nonzero" group-id="1" node-id="141" stroke="none" target-height="687.7"
target-width="986.39996" target-x="286.7" target-y="198.8"/>
</g>
<g node-id="417">
<path d="M 549.70 174.00 L 549.70 266.20 L 449.00 266.20 L 449.00 148.90 L 521.10 148.90 Z" fill="#ffffff"
fill-rule="nonzero" group-id="2" node-id="145" stroke="#070707" stroke-linecap="butt" stroke-width="1"
target-height="117.30002" target-width="100.70001" target-x="449" target-y="148.9"/>
<path d="M 520.90 175.00 L 520.70 149.70 L 549.50 174.70 L 549.40 175.00 L 520.90 175.00 Z" fill="#ffffff"
fill-rule="nonzero" group-id="2" node-id="147" stroke="#000000" stroke-linecap="butt" stroke-width="1"
target-height="25.300003" target-width="28.799988" target-x="520.7" target-y="149.7"/>
</g>
<g node-id="418">
<path d="M 536.30 780.00 L 1121.20 780.00 L 1121.20 886.50 L 536.30 886.50 Z" fill="#ffffff" fill-rule="nonzero"
group-id="3" node-id="151" stroke="#000000" stroke-linecap="butt" stroke-width="1" target-height="106.5"
target-width="584.89996" target-x="536.3" target-y="780"/>
<path d="M 1121.20 824.40 L 1121.20 886.50 L 460.10 886.50 L 460.10 788.30 L 460.30 785.60 L 460.90 783.20 L 461.90 780.90 L 463.30 778.80 L 465.00 777.00 L 466.90 775.60 L 469.00 774.50 L 471.40 773.80 L 473.90 773.60 L 536.40 773.60 L 538.90 773.80 L 541.20 774.50 L 543.30 775.60 L 545.30 777.00 L 546.90 778.80 L 548.30 780.90 L 549.30 783.20 L 549.90 785.60 L 550.20 794.10 L 1092.90 794.10 L 1096.80 794.40 L 1100.50 795.20 L 1103.90 796.50 L 1107.20 798.30 L 1110.20 800.40 L 1112.90 803.00 L 1115.30 805.90 L 1117.30 809.10 L 1119.00 812.60 L 1120.20 816.30 L 1120.90 820.20 L 1121.20 824.40 Z"
fill="#e5f1f9" fill-rule="nonzero" group-id="3" node-id="153" stroke="#141414" stroke-linecap="butt"
stroke-width="1" target-height="112.900024" target-width="661.1" target-x="460.1" target-y="773.6"/>
</g>
<g node-id="419">
<path d="M 928.00 669.10 L 971.10 669.10 L 971.10 706.70 L 928.00 706.70 Z" fill="#f9c756" fill-rule="nonzero"
group-id="4" node-id="157" stroke="none" target-height="37.600037" target-width="43.099976" target-x="928"
target-y="669.1"/>
<path d="M 928.30 722.90 L 971.40 722.90 L 971.40 760.50 L 928.30 760.50 Z" fill="#05cdcd" fill-rule="nonzero"
group-id="4" node-id="159" stroke="none" target-height="37.599976" target-width="43.100037"
target-x="928.3" target-y="722.9"/>
<path d="M 974.90 667.90 L 1064.90 667.90 L 1064.90 684.70 L 974.90 684.70 Z" fill="#05cdcd" fill-rule="nonzero"
group-id="4" node-id="161" stroke="#050505" stroke-linecap="butt" stroke-width="1"
target-height="16.799988" target-width="90" target-x="974.9" target-y="667.9"/>
<path d="M 974.90 692.60 L 1175.00 692.60 L 1175.00 702.60 L 974.90 702.60 Z" fill="#ffffff" fill-rule="nonzero"
group-id="4" node-id="163" stroke="#020202" stroke-linecap="butt" stroke-width="1" target-height="10"
target-width="200.09998" target-x="974.9" target-y="692.6"/>
<path d="M 925.30 719.20 L 968.40 719.20 L 968.40 756.90 L 925.30 756.90 Z" fill="none" group-id="4"
node-id="165" stroke="#020202" stroke-linecap="butt" stroke-width="1" target-height="37.700012"
target-width="43.100037" target-x="925.3" target-y="719.2"/>
<path d="M 974.70 720.30 L 1064.70 720.30 L 1064.70 737.10 L 974.70 737.10 Z" fill="#f9c756" fill-rule="nonzero"
group-id="4" node-id="167" stroke="none" target-height="16.799988" target-width="89.99994"
target-x="974.7" target-y="720.3"/>
<path d="M 974.70 745.00 L 1174.90 745.00 L 1174.90 754.90 L 974.70 754.90 Z" fill="#ffffff" fill-rule="nonzero"
group-id="4" node-id="169" stroke="#020202" stroke-linecap="butt" stroke-width="1"
target-height="9.900024" target-width="200.20001" target-x="974.7" target-y="745"/>
<path d="M 925.40 666.80 L 968.50 666.80 L 968.50 704.50 L 925.40 704.50 Z" fill="none" group-id="4"
node-id="171" stroke="#020202" stroke-linecap="butt" stroke-width="1" target-height="37.700012"
target-width="43.099976" target-x="925.4" target-y="666.8"/>
</g>
<g node-id="420">
<path d="M 282.20 273.90 L 198.60 273.90 L 194.70 273.20 L 193.00 272.40 L 190.10 270.00 L 188.20 266.70 L 187.70 264.90 L 187.50 245.40 L 188.20 241.50 L 190.10 238.20 L 193.00 235.80 L 196.60 234.50 L 282.20 234.30 L 286.10 235.00 L 287.80 235.80 L 290.70 238.30 L 292.60 241.50 L 293.10 243.40 L 293.10 264.90 L 291.80 268.50 L 289.40 271.30 L 286.10 273.20 L 282.20 273.90 Z"
fill="#ffffff" fill-rule="nonzero" group-id="5" node-id="175" stroke="#000000" stroke-linecap="butt"
stroke-width="1" target-height="39.59999" target-width="105.600006" target-x="187.5" target-y="234.3"/>
<g node-id="427">
<path d="M 215.60 254.70 L 215.30 255.90 L 214.60 257.00 L 213.60 257.60 L 212.30 257.90 L 211.10 257.60 L 210.10 257.00 L 209.40 255.90 L 209.10 254.70 L 209.40 253.40 L 210.10 252.40 L 211.10 251.70 L 212.30 251.40 L 213.60 251.70 L 214.60 252.40 L 215.30 253.40 L 215.60 254.70 Z"
fill="none" group-id="5,12" node-id="178" stroke="#050505" stroke-linecap="butt" stroke-width="1"
target-height="6.5" target-width="6.5" target-x="209.1" target-y="251.4"/>
<path d="M 235.60 254.70 L 235.30 255.90 L 234.60 257.00 L 233.60 257.60 L 232.30 257.90 L 231.10 257.60 L 230.10 257.00 L 229.40 255.90 L 229.10 254.70 L 229.40 253.40 L 230.10 252.40 L 231.10 251.70 L 232.30 251.40 L 233.60 251.70 L 234.60 252.40 L 235.30 253.40 L 235.60 254.70 Z"
fill="none" group-id="5,12" node-id="180" stroke="#050505" stroke-linecap="butt" stroke-width="1"
target-height="6.5" target-width="6.5" target-x="229.1" target-y="251.4"/>
<path d="M 254.50 254.70 L 254.20 255.90 L 253.50 257.00 L 252.40 257.60 L 251.10 257.90 L 249.80 257.60 L 248.70 257.00 L 248.00 255.90 L 247.70 254.70 L 248.00 253.40 L 248.70 252.40 L 249.80 251.70 L 251.10 251.40 L 252.40 251.70 L 253.50 252.40 L 254.20 253.40 L 254.50 254.70 Z"
fill="none" group-id="5,12" node-id="182" stroke="#050505" stroke-linecap="butt" stroke-width="1"
target-height="6.5" target-width="6.800003" target-x="247.7" target-y="251.4"/>
<path d="M 272.00 254.70 L 271.70 256.10 L 271.00 257.20 L 269.80 258.00 L 268.50 258.20 L 267.10 258.00 L 265.90 257.20 L 265.20 256.10 L 264.90 254.70 L 265.20 253.30 L 265.90 252.10 L 267.10 251.40 L 268.50 251.10 L 269.80 251.40 L 271.00 252.10 L 271.70 253.30 L 272.00 254.70 Z"
fill="none" group-id="5,12" node-id="184" stroke="#050505" stroke-linecap="butt" stroke-width="1"
target-height="7.100006" target-width="7.100006" target-x="264.9" target-y="251.1"/>
</g>
</g>
<g node-id="421">
<path d="M 1341.40 563.30 L 1172.70 563.20 L 1171.60 562.70 L 1170.00 561.10 L 1169.40 558.80 L 1169.40 508.60 L 1169.50 507.40 L 1170.70 505.40 L 1172.60 504.30 L 1173.90 504.10 L 1342.60 504.30 L 1343.60 504.70 L 1345.30 506.30 L 1345.90 508.60 L 1345.90 558.80 L 1345.70 560.10 L 1344.60 562.00 L 1342.60 563.20 L 1341.40 563.30 Z"
fill="#ffffff" fill-rule="nonzero" group-id="6" node-id="189" stroke="#000000" stroke-linecap="butt"
stroke-width="1" target-height="59.19998" target-width="176.5" target-x="1169.4" target-y="504.1"/>
<path d="M 1189.60 517.80 L 1320.90 518.20" fill="#ffffff" fill-rule="nonzero" group-id="6" node-id="191"
stroke="#000000" stroke-linecap="butt" stroke-width="1" target-height="0.4000244" target-width="131.30005"
target-x="1189.6" target-y="517.8"/>
<path d="M 1189.60 529.60 L 1319.70 529.60" fill="#ffffff" fill-rule="nonzero" group-id="6" node-id="193"
stroke="#000000" stroke-linecap="butt" stroke-width="1" target-height="0" target-width="130.09998"
target-x="1189.6" target-y="529.6"/>
<path d="M 1190.40 540.50 L 1318.50 540.50" fill="#ffffff" fill-rule="nonzero" group-id="6" node-id="195"
stroke="#000000" stroke-linecap="butt" stroke-width="1" target-height="0" target-width="128.09998"
target-x="1190.4" target-y="540.5"/>
<path d="M 1191.60 550.50 L 1317.30 550.50" fill="#ffffff" fill-rule="nonzero" group-id="6" node-id="197"
stroke="#000000" stroke-linecap="butt" stroke-width="1" target-height="0" target-width="125.70007"
target-x="1191.6" target-y="550.5"/>
</g>
<g node-id="422">
<path d="M 325.70 361.50 L 327.90 365.20 L 330.80 368.20 L 332.60 369.20 L 334.70 369.60 L 337.70 369.10 L 340.70 366.90 L 342.20 365.10 L 346.70 356.80 L 349.60 353.20 L 352.20 351.80 L 355.40 351.40 L 358.40 352.40 L 360.40 353.80 L 362.20 355.60 L 366.60 361.80 L 370.00 365.70 L 373.40 367.80 L 376.70 368.20 L 378.50 367.70 L 380.20 366.90 L 381.70 365.70 L 383.60 363.50 L 388.90 354.50 L 391.70 352.00 L 393.50 351.20 L 395.60 351.00 L 397.60 351.30 L 399.30 352.00 L 400.20 352.80 L 401.10 354.90"
fill="none" group-id="7" node-id="201" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="18.600006" target-width="75.399994" target-x="325.7" target-y="351"/>
<path d="M 597.30 655.20 L 605.70 687.90 L 650.80 679.90 Z" fill="#ed1e79" fill-opacity="0.82"
fill-rule="nonzero" group-id="7" node-id="203" stroke="none" target-height="32.700012" target-width="53.5"
target-x="597.3" target-y="655.2"/>
<path d="M 592.50 657.30 L 600.80 690.00 L 645.90 682.00 Z" fill="none" group-id="7" node-id="205"
stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82" stroke-width="1" target-height="32.700012"
target-width="53.400024" target-x="592.5" target-y="657.3"/>
<path d="M 931.10 970.70 L 961.80 966.70 L 956.20 949.00 Z" fill="#39b54a" fill-opacity="0.82"
fill-rule="nonzero" group-id="7" node-id="207" stroke="none" target-height="21.700012"
target-width="30.700012" target-x="931.1" target-y="949"/>
<path d="M 1357.50 776.60 L 1359.40 782.40 L 1362.20 787.60 L 1363.50 789.10 L 1366.60 791.20 L 1368.30 791.90 L 1370.00 792.10 L 1371.80 791.80 L 1373.80 791.00 L 1375.50 789.60 L 1376.90 787.80 L 1382.10 779.30 L 1383.50 777.40 L 1385.20 775.80 L 1387.10 774.50 L 1389.10 773.70 L 1391.20 773.20 L 1395.60 773.20 L 1397.70 773.80 L 1399.70 774.80 L 1403.20 777.90 L 1408.00 783.80 L 1409.90 785.40 L 1412.00 786.50 L 1413.50 786.90 L 1415.00 786.90 L 1416.50 786.50 L 1418.10 785.20 L 1419.50 783.50 L 1422.90 777.30 L 1424.10 775.60 L 1425.10 774.70 L 1427.40 774.00"
fill="none" group-id="7" node-id="209" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="18.899963" target-width="69.900024" target-x="1357.5" target-y="773.2"/>
<g node-id="428">
<path d="M 1412.40 194.70 L 1389.70 175.30 L 1408.20 153.30 L 1430.90 172.70 Z" fill="#fe6666"
fill-opacity="0.82" fill-rule="nonzero" group-id="7,13" node-id="212" stroke="none"
target-height="41.399994" target-width="41.200073" target-x="1389.7" target-y="153.3"/>
<path d="M 1406.00 196.30 L 1383.30 176.90 L 1401.70 154.90 L 1424.50 174.30 Z" fill="none" group-id="7,13"
node-id="214" stroke="#020202" stroke-linecap="butt" stroke-opacity="0.82" stroke-width="1"
target-height="41.40001" target-width="41.19995" target-x="1383.3" target-y="154.9"/>
<path d="M 230.40 923.60 L 257.10 939.30 L 229.00 954.80 L 229.70 939.20 Z" fill="#05cdcd"
fill-opacity="0.82" fill-rule="nonzero" group-id="7,13" node-id="216" stroke="none"
target-height="31.200012" target-width="28.100006" target-x="229" target-y="923.6"/>
<path d="M 1422.00 485.70 L 1424.00 512.10 L 1400.00 500.30 L 1411.00 493.00 Z" fill="#ffffff"
fill-opacity="0.82" fill-rule="nonzero" group-id="7,13" node-id="218" stroke="#020202"
stroke-linecap="butt" stroke-opacity="0.82" stroke-width="1" target-height="26.399963"
target-width="24" target-x="1400" target-y="485.7"/>
<g node-id="432">
<path d="M 417.90 146.00 L 417.60 148.30 L 416.70 150.40 L 415.40 152.20 L 413.70 153.60 L 411.60 154.50 L 409.30 154.80 L 407.00 154.50 L 405.00 153.60 L 403.30 152.20 L 401.90 150.40 L 401.10 148.30 L 400.80 146.00 L 401.10 143.60 L 401.90 141.60 L 403.30 139.80 L 405.00 138.40 L 407.00 137.50 L 409.30 137.20 L 411.60 137.50 L 413.70 138.40 L 415.40 139.80 L 416.70 141.60 L 417.60 143.60 L 417.90 146.00 Z"
fill="#000033" fill-opacity="0.082" fill-rule="nonzero" group-id="7,13,17" node-id="222"
stroke="none" target-height="17.600006" target-width="17.100006" target-x="400.8"
target-y="137.2"/>
</g>
<path d="M 874.10 115.80 L 873.90 117.30 L 872.50 119.80 L 871.30 120.70 L 868.60 121.40 L 865.80 120.70 L 864.70 119.80 L 863.20 117.30 L 863.20 114.40 L 864.70 111.90 L 865.80 111.00 L 868.60 110.30 L 871.30 111.00 L 872.50 111.90 L 873.90 114.40 L 874.10 115.80 Z"
fill="#ffffff" fill-opacity="0.82" fill-rule="nonzero" group-id="7,13" node-id="225" stroke="#020202"
stroke-linecap="butt" stroke-opacity="0.82" stroke-width="1" target-height="11.099998"
target-width="10.899963" target-x="863.2" target-y="110.3"/>
<path d="M 228.70 616.00 L 228.40 618.00 L 227.60 619.80 L 226.40 621.30 L 224.90 622.50 L 223.10 623.30 L 221.00 623.60 L 219.00 623.30 L 217.10 622.50 L 215.60 621.30 L 214.40 619.80 L 213.60 618.00 L 213.30 616.00 L 213.60 614.00 L 214.40 612.20 L 215.60 610.60 L 217.10 609.50 L 219.00 608.70 L 221.00 608.40 L 223.10 608.70 L 224.90 609.50 L 226.40 610.60 L 227.60 612.20 L 228.40 614.00 L 228.70 616.00 Z"
fill="#ff6666" fill-opacity="0.82" fill-rule="nonzero" group-id="7,13" node-id="227" stroke="none"
target-height="15.199951" target-width="15.399994" target-x="213.3" target-y="608.4"/>
<path d="M 226.30 929.30 L 253.00 944.90 L 224.90 960.40 L 225.60 944.90 Z" fill="none" group-id="7,13"
node-id="229" stroke="#020202" stroke-linecap="butt" stroke-opacity="0.82" stroke-width="1"
target-height="31.100037" target-width="28.100006" target-x="224.9" target-y="929.3"/>
</g>
<path d="M 800.70 632.00 L 800.60 633.80 L 799.30 636.90 L 797.00 639.40 L 793.90 640.70 L 790.60 640.70 L 787.60 639.40 L 785.30 636.90 L 784.00 633.80 L 784.00 630.30 L 785.30 627.10 L 787.60 624.70 L 790.60 623.40 L 793.90 623.40 L 797.00 624.70 L 798.20 625.80 L 800.10 628.70 L 800.70 632.00 Z"
fill="#ded8fa" fill-opacity="0.82" fill-rule="nonzero" group-id="7" node-id="232" stroke="none"
target-height="17.299988" target-width="16.700012" target-x="784" target-y="623.4"/>
<path d="M 225.40 480.40 L 225.10 482.10 L 224.20 483.60 L 223.30 484.30 L 221.20 484.90 L 219.10 484.30 L 218.20 483.60 L 217.30 482.10 L 217.00 480.40 L 217.30 478.70 L 218.20 477.30 L 219.10 476.60 L 221.20 476.00 L 223.30 476.60 L 224.20 477.30 L 225.10 478.70 L 225.40 480.40 Z"
fill="none" group-id="7" node-id="234" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="8.899994" target-width="8.399994" target-x="217" target-y="476"/>
<path d="M 394.90 497.40 L 394.60 498.90 L 393.80 500.10 L 392.50 500.90 L 391.00 501.20 L 389.50 500.90 L 388.20 500.10 L 387.40 498.90 L 387.10 497.40 L 387.40 495.90 L 388.20 494.70 L 389.50 493.90 L 391.00 493.60 L 392.50 493.90 L 393.80 494.70 L 394.60 495.90 L 394.90 497.40 Z"
fill="none" group-id="7" node-id="236" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="7.600006" target-width="7.799988" target-x="387.1" target-y="493.6"/>
<path d="M 441.40 565.40 L 441.20 566.70 L 440.00 568.90 L 437.80 570.20 L 436.50 570.40 L 434.10 569.70 L 432.30 567.90 L 431.80 566.70 L 431.60 565.40 L 432.30 562.80 L 434.10 561.00 L 436.50 560.30 L 437.80 560.50 L 440.00 561.80 L 441.20 564.00 L 441.40 565.40 Z"
fill="none" group-id="7" node-id="238" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="10.100037" target-width="9.799988" target-x="431.6" target-y="560.3"/>
<path d="M 454.10 404.30 L 453.90 405.60 L 452.60 407.80 L 451.60 408.70 L 449.20 409.30 L 446.80 408.70 L 445.80 407.80 L 444.50 405.60 L 444.50 403.00 L 445.80 400.70 L 446.80 399.90 L 449.20 399.20 L 451.60 399.90 L 452.60 400.70 L 453.90 403.00 L 454.10 404.30 Z"
fill="none" group-id="7" node-id="240" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="10.099976" target-width="9.600006" target-x="444.5" target-y="399.2"/>
<path d="M 1016.80 710.00 L 1016.40 711.60 L 1015.50 712.90 L 1014.20 713.80 L 1012.50 714.10 L 1010.90 713.80 L 1009.60 712.90 L 1008.70 711.60 L 1008.30 710.00 L 1008.70 708.40 L 1009.60 707.10 L 1010.90 706.30 L 1012.50 705.90 L 1014.20 706.30 L 1015.50 707.10 L 1016.40 708.40 L 1016.80 710.00 Z"
fill="none" group-id="7" node-id="242" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="8.199951" target-width="8.5" target-x="1008.3" target-y="705.9"/>
<path d="M 1160.30 220.30 L 1160.10 221.60 L 1158.80 223.80 L 1156.70 225.10 L 1155.40 225.30 L 1152.90 224.60 L 1151.20 222.80 L 1150.70 221.60 L 1150.50 220.30 L 1151.20 217.70 L 1152.90 215.90 L 1155.40 215.20 L 1156.70 215.40 L 1158.80 216.70 L 1160.10 218.90 L 1160.30 220.30 Z"
fill="none" group-id="7" node-id="244" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="10.100006" target-width="9.800049" target-x="1150.5" target-y="215.2"/>
<path d="M 951.80 230.30 L 951.50 231.90 L 950.60 233.20 L 949.30 234.10 L 947.60 234.40 L 945.90 234.10 L 944.60 233.20 L 943.70 231.90 L 943.40 230.30 L 943.70 228.70 L 944.60 227.40 L 945.90 226.50 L 947.60 226.20 L 949.30 226.50 L 950.60 227.40 L 951.50 228.70 L 951.80 230.30 Z"
fill="none" group-id="7" node-id="246" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="8.199997" target-width="8.399963" target-x="943.4" target-y="226.2"/>
<path d="M 1337.50 644.00 L 1337.20 645.60 L 1336.30 646.80 L 1335.00 647.70 L 1333.30 648.10 L 1331.60 647.70 L 1330.30 646.80 L 1329.40 645.60 L 1329.10 644.00 L 1329.40 642.30 L 1330.30 641.10 L 1331.60 640.20 L 1333.30 639.90 L 1335.00 640.20 L 1336.30 641.10 L 1337.20 642.30 L 1337.50 644.00 Z"
fill="none" group-id="7" node-id="248" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="8.199951" target-width="8.400024" target-x="1329.1" target-y="639.9"/>
<path d="M 1036.80 249.00 L 1036.60 250.90 L 1036.00 252.50 L 1035.00 253.80 L 1033.70 254.90 L 1032.30 255.60 L 1030.70 255.80 L 1029.00 255.60 L 1027.60 254.90 L 1026.30 253.80 L 1025.40 252.50 L 1024.80 250.90 L 1024.60 249.00 L 1024.80 247.10 L 1025.40 245.50 L 1026.30 244.20 L 1027.60 243.10 L 1029.00 242.40 L 1030.70 242.20 L 1032.30 242.40 L 1033.70 243.10 L 1035.00 244.20 L 1036.00 245.50 L 1036.60 247.10 L 1036.80 249.00 Z"
fill="#05cdcd" fill-opacity="0.82" fill-rule="nonzero" group-id="7" node-id="250" stroke="none"
target-height="13.600006" target-width="12.200073" target-x="1024.6" target-y="242.2"/>
<path d="M 911.60 476.20 L 911.40 477.50 L 910.10 479.90 L 907.80 481.20 L 906.40 481.40 L 905.00 481.20 L 902.70 479.90 L 901.40 477.50 L 901.20 476.20 L 901.40 474.80 L 902.70 472.50 L 903.80 471.70 L 906.40 471.00 L 907.80 471.20 L 910.10 472.50 L 910.90 473.60 L 911.60 476.20 Z"
fill="none" group-id="7" node-id="252" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="10.399994" target-width="10.399963" target-x="901.2" target-y="471"/>
<path d="M 565.70 941.90 L 565.40 943.60 L 564.50 944.90 L 563.20 945.80 L 561.60 946.10 L 560.00 945.80 L 558.70 944.90 L 557.80 943.60 L 557.50 941.90 L 557.80 940.30 L 558.70 939.00 L 560.00 938.10 L 561.60 937.80 L 563.20 938.10 L 564.50 939.00 L 565.40 940.30 L 565.70 941.90 Z"
fill="none" group-id="7" node-id="254" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="8.299988" target-width="8.200012" target-x="557.5" target-y="937.8"/>
<path d="M 1355.40 899.50 L 1355.00 901.20 L 1354.10 902.50 L 1352.90 903.40 L 1351.20 903.70 L 1349.60 903.40 L 1348.30 902.50 L 1347.50 901.20 L 1347.10 899.50 L 1347.50 897.90 L 1348.30 896.60 L 1349.60 895.70 L 1351.20 895.40 L 1352.90 895.70 L 1354.10 896.60 L 1355.00 897.90 L 1355.40 899.50 Z"
fill="none" group-id="7" node-id="256" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="8.299988" target-width="8.300049" target-x="1347.1" target-y="895.4"/>
<path d="M 256.80 816.10 L 256.60 817.40 L 255.40 819.50 L 253.50 820.70 L 252.20 820.90 L 251.00 820.70 L 249.00 819.50 L 247.90 817.40 L 247.70 816.10 L 247.90 814.90 L 249.00 812.80 L 251.00 811.60 L 252.20 811.40 L 253.50 811.60 L 255.40 812.80 L 256.60 814.90 L 256.80 816.10 Z"
fill="none" group-id="7" node-id="258" stroke="#000000" stroke-linecap="butt" stroke-opacity="0.82"
stroke-width="1" target-height="9.5" target-width="9.099991" target-x="247.7" target-y="811.4"/>
</g>
<g node-id="423">
<path d="M 585.30 197.00 L 972.80 197.00 L 972.80 485.20 L 585.30 485.20 Z" fill="#ffffff" fill-rule="nonzero"
group-id="8" node-id="262" stroke="#000000" stroke-linecap="butt" stroke-width="1" target-height="288.2"
target-width="387.5" target-x="585.3" target-y="197"/>
<path d="M 586.20 496.90 L 974.20 496.90 L 974.20 587.30 L 586.20 587.30 Z" fill="#ffffff" fill-rule="nonzero"
group-id="8" node-id="264" stroke="#000000" stroke-linecap="butt" stroke-width="1"
target-height="90.399994" target-width="388" target-x="586.2" target-y="496.9"/>
<path d="M 869.40 341.90 L 869.10 349.40 L 868.20 356.60 L 866.80 363.60 L 864.80 370.50 L 862.30 377.10 L 859.30 383.40 L 855.90 389.50 L 852.00 395.20 L 847.70 400.60 L 843.40 405.30 L 838.80 409.70 L 833.90 413.70 L 828.60 417.40 L 823.20 420.70 L 817.50 423.70 L 811.60 426.20 L 805.40 428.30 L 799.10 430.00 L 792.60 431.20 L 785.90 432.00 L 779.10 432.20 L 772.90 432.00 L 761.10 430.40 L 755.40 429.10 L 744.40 425.30 L 734.10 420.20 L 727.60 416.20 L 721.60 411.60 L 716.00 406.50 L 711.90 402.30 L 704.60 393.10 L 698.60 382.90 L 696.10 377.60 L 692.10 366.30 L 690.60 360.40 L 689.60 354.40 L 689.00 348.30 L 688.80 341.90 L 689.10 334.40 L 689.90 327.20 L 691.40 320.20 L 693.40 313.40 L 695.90 306.70 L 698.80 300.40 L 702.30 294.30 L 706.20 288.60 L 710.50 283.10 L 715.20 278.10 L 720.30 273.40 L 725.70 269.00 L 731.50 265.10 L 737.50 261.70 L 743.90 258.70 L 750.50 256.20 L 757.30 254.20 L 764.30 252.80 L 771.60 251.90 L 779.10 251.60 L 786.60 251.90 L 793.80 252.80 L 800.80 254.20 L 807.60 256.20 L 814.30 258.70 L 820.60 261.70 L 826.60 265.10 L 832.40 269.00 L 837.90 273.40 L 842.90 278.10 L 847.60 283.10 L 851.90 288.60 L 855.80 294.30 L 859.30 300.40 L 862.20 306.70 L 864.80 313.40 L 866.70 320.20 L 868.20 327.20 L 869.10 334.40 L 869.40 341.90 Z"
fill="#e5f1f9" fill-rule="nonzero" group-id="8" node-id="266" stroke="none" target-height="180.6"
target-width="180.60004" target-x="688.8" target-y="251.6"/>
<path d="M 805.30 306.90 L 805.00 310.20 L 804.40 313.30 L 803.40 316.20 L 802.00 319.00 L 798.40 323.80 L 793.60 327.50 L 790.90 328.90 L 788.00 329.90 L 784.90 330.50 L 781.70 330.70 L 778.40 330.50 L 775.40 329.90 L 772.50 328.90 L 769.70 327.50 L 765.00 323.80 L 761.30 319.00 L 759.90 316.20 L 758.90 313.30 L 758.30 310.20 L 758.10 306.90 L 758.30 303.70 L 758.90 300.60 L 759.90 297.70 L 761.30 294.90 L 765.00 290.10 L 769.70 286.40 L 772.50 285.00 L 775.40 284.00 L 778.40 283.40 L 781.70 283.20 L 784.90 283.40 L 788.00 284.00 L 790.90 285.00 L 793.60 286.40 L 798.40 290.10 L 802.00 294.90 L 803.40 297.70 L 804.40 300.60 L 805.00 303.70 L 805.30 306.90 Z"
fill="#fbb03b" fill-rule="nonzero" group-id="8" node-id="268" stroke="none" target-height="47.5"
target-width="47.200012" target-x="758.1" target-y="283.2"/>
<path d="M 847.70 400.40 L 843.40 405.30 L 838.80 409.70 L 833.90 413.70 L 828.60 417.40 L 823.20 420.70 L 817.50 423.70 L 811.60 426.20 L 805.40 428.30 L 799.10 430.00 L 792.60 431.20 L 785.90 432.00 L 779.10 432.20 L 772.90 432.00 L 761.10 430.40 L 749.80 427.40 L 739.10 423.00 L 734.10 420.20 L 727.60 416.20 L 721.60 411.60 L 716.00 406.50 L 715.70 400.40 L 715.90 395.10 L 716.50 390.00 L 717.60 385.10 L 719.00 380.30 L 720.90 375.60 L 725.50 366.80 L 728.40 362.80 L 735.00 355.30 L 742.70 349.00 L 746.90 346.20 L 755.90 341.70 L 765.80 338.50 L 770.90 337.50 L 776.20 336.90 L 781.70 336.70 L 787.10 336.90 L 792.40 337.50 L 797.60 338.50 L 807.40 341.70 L 816.40 346.20 L 820.60 349.00 L 828.40 355.30 L 834.90 362.80 L 837.80 366.80 L 842.50 375.60 L 844.30 380.30 L 845.80 385.10 L 846.80 390.00 L 847.40 395.10 L 847.70 400.40 Z"
fill="#fbb03b" fill-rule="nonzero" group-id="8" node-id="270" stroke="none" target-height="95.5"
target-width="132" target-x="715.7" target-y="336.7"/>
<path d="M 785.30 514.60 L 948.40 515.30" fill="none" group-id="8" node-id="272" stroke="#e0e2e2"
stroke-linecap="butt" stroke-width="1" target-height="0.7000122" target-width="163.10004" target-x="785.3"
target-y="514.6"/>
<path d="M 805.60 535.70 L 943.40 536.40" fill="none" group-id="8" node-id="274" stroke="#e0e2e2"
stroke-linecap="butt" stroke-width="1" target-height="0.7000122" target-width="137.80005" target-x="805.6"
target-y="535.7"/>
</g>
<g node-id="424">
<path d="M 462.90 420.30 L 462.90 562.70 L 462.60 566.00 L 461.80 569.10 L 460.50 571.90 L 458.70 574.40 L 456.60 576.60 L 454.10 578.40 L 451.40 579.70 L 448.40 580.50 L 445.20 580.80 L 189.30 580.80 L 186.10 580.50 L 183.10 579.70 L 180.40 578.40 L 177.90 576.60 L 175.80 574.40 L 174.10 571.90 L 172.80 569.10 L 172.00 566.00 L 171.70 562.70 L 171.70 420.30 L 172.00 416.90 L 172.80 413.90 L 174.10 411.10 L 175.80 408.60 L 177.90 406.40 L 180.40 404.60 L 183.10 403.30 L 186.10 402.40 L 189.30 402.10 L 445.20 402.10 L 448.40 402.40 L 451.40 403.30 L 454.10 404.60 L 456.60 406.40 L 458.70 408.60 L 460.50 411.10 L 461.80 413.90 L 462.60 416.90 L 462.90 420.30 Z"
fill="#ffffff" fill-rule="nonzero" group-id="9" node-id="278" stroke="#000000" stroke-linecap="butt"
stroke-width="1" target-height="178.69998" target-width="291.2" target-x="171.7" target-y="402.1"/>
<path d="M 190.00 422.00 L 300.60 422.00 L 300.60 427.70 L 190.00 427.70 Z" fill="#bdcdd6" fill-rule="nonzero"
group-id="9" node-id="280" stroke="none" target-height="5.700012" target-width="110.600006" target-x="190"
target-y="422"/>
<path d="M 190.00 437.70 L 263.40 437.70 L 263.40 442.50 L 190.00 442.50 Z" fill="#bdcdd6" fill-rule="nonzero"
group-id="9" node-id="282" stroke="none" target-height="4.799988" target-width="73.399994" target-x="190"
target-y="437.7"/>
</g>
<g node-id="425">
<g node-id="429">
<path d="M 583.70 412.40 L 598.80 402.50 L 600.10 401.00 L 600.60 399.10 L 600.60 384.30 L 601.20 375.70 L 602.40 369.10 L 603.10 367.50 L 603.70 366.70 L 604.40 366.40 L 606.40 367.40 L 609.40 371.40 L 614.20 381.60 L 616.30 387.30 L 617.40 388.90 L 619.30 389.60 L 633.50 390.60 L 634.80 390.90 L 636.90 392.60 L 638.30 396.60 L 640.00 404.90 L 640.50 409.80 L 640.60 414.90 L 640.10 420.10 L 639.40 423.50 L 638.30 426.80 L 635.80 431.50 L 633.20 433.70 L 629.00 436.10 L 625.40 437.30 L 595.10 438.30 L 592.90 439.60 L 582.40 450.00 L 583.70 412.40 Z"
fill="#ffffff" fill-rule="nonzero" group-id="10,14" node-id="288" stroke="#020202"
stroke-linecap="butt" stroke-width="1" target-height="83.600006" target-width="58.19995"
target-x="582.4" target-y="366.4"/>
<path d="M 609.10 399.50 L 607.50 402.80 L 607.20 404.70 L 607.40 406.40 L 608.60 407.90 L 613.20 408.80 L 617.20 409.00 L 622.10 408.70 L 628.80 407.40 L 635.20 404.80 L 639.70 401.90"
fill="none" group-id="10,14" node-id="290" stroke="#000000" stroke-linecap="butt" stroke-width="1"
target-height="9.5" target-width="32.5" target-x="607.2" target-y="399.5"/>
<path d="M 610.00 408.20 L 608.20 409.80 L 606.80 412.10 L 606.20 414.30 L 606.40 415.40 L 607.70 417.30 L 609.10 418.40 L 613.20 419.90 L 615.70 420.30 L 621.90 419.90 L 629.40 417.90 L 637.50 414.60 L 639.90 412.80 L 640.80 411.50"
fill="none" group-id="10,14" node-id="292" stroke="#000000" stroke-linecap="butt" stroke-width="1"
target-height="12.099976" target-width="34.599976" target-x="606.2" target-y="408.2"/>
<path d="M 613.20 419.90 L 611.60 420.90 L 611.10 421.90 L 610.60 423.40 L 610.60 425.00 L 611.10 426.30 L 613.00 428.40 L 614.30 429.10 L 617.10 429.80 L 623.50 429.40 L 630.40 427.70 L 633.80 426.30 L 639.70 422.60"
fill="none" group-id="10,14" node-id="294" stroke="#000000" stroke-linecap="butt" stroke-width="1"
target-height="9.899994" target-width="29.100037" target-x="610.6" target-y="419.9"/>
<path d="M 620.00 429.90 L 619.10 430.30 L 617.90 432.00 L 617.80 433.00 L 618.10 434.20 L 618.90 435.00 L 621.30 436.20 L 623.70 436.90 L 626.20 437.10"
fill="none" group-id="10,14" node-id="296" stroke="#000000" stroke-linecap="butt" stroke-width="1"
target-height="7.200012" target-width="8.400024" target-x="617.8" target-y="429.9"/>
<path d="M 609.00 399.50 L 614.30 398.10 L 622.40 396.80 L 623.90 396.30 L 623.90 395.20 L 620.50 392.30 L 618.20 389.40"
fill="none" group-id="10,14" node-id="298" stroke="#000000" stroke-linecap="butt" stroke-width="1"
target-height="10.100006" target-width="14.900024" target-x="609" target-y="389.4"/>
</g>
<path d="M 301.10 1036.40 L 300.30 1084.70 L 386.90 1088.40 L 387.80 1086.70 L 388.00 1083.80 L 387.40 1081.80 L 386.20 1079.70 L 383.90 1077.20 L 380.90 1074.70 L 376.20 1071.70 L 370.50 1068.80 L 356.60 1063.20 L 354.00 1061.50 L 349.30 1057.20 L 345.60 1052.10 L 342.80 1045.70 L 341.60 1041.50 L 338.00 1035.40 L 303.60 1033.00 L 301.10 1036.40 Z"
fill="#0c0c4f" fill-rule="nonzero" group-id="10" node-id="301" stroke="#0c0c4f" stroke-linecap="butt"
stroke-width="1" target-height="55.400024" target-width="87.70001" target-x="300.3" target-y="1033"/>
<path d="M 414.50 1037.40 L 414.70 1085.70 L 501.30 1087.70 L 502.20 1086.00 L 502.40 1083.00 L 501.70 1081.00 L 500.50 1079.00 L 498.10 1076.50 L 495.10 1074.10 L 490.20 1071.20 L 484.60 1068.40 L 470.50 1063.00 L 467.90 1061.50 L 463.10 1057.30 L 459.40 1052.20 L 456.40 1045.80 L 455.10 1041.70 L 451.40 1035.70 L 416.90 1033.90 L 414.50 1037.40 Z"
fill="#0c0c4f" fill-rule="nonzero" group-id="10" node-id="303" stroke="#0c0c4f" stroke-linecap="butt"
stroke-width="1" target-height="53.799927" target-width="87.899994" target-x="414.5" target-y="1033.9"/>
<path d="M 447.50 562.80 L 475.80 779.00 L 458.60 1037.60 L 453.20 1040.00 L 449.00 1041.30 L 444.30 1042.40 L 438.60 1043.10 L 434.70 1043.30 L 426.00 1042.50 L 421.70 1041.50 L 417.20 1039.90 L 412.50 1037.60 L 413.00 1029.40 L 413.10 1021.90 L 412.60 1014.40 L 412.00 1011.10 L 411.10 1008.90 L 410.30 1007.70 L 409.30 1007.10 L 406.80 1006.90 L 406.00 1006.50 L 405.50 1005.80 L 405.30 1004.20 L 406.40 999.20 L 409.40 991.10 L 410.30 987.20 L 395.30 787.80 L 385.70 745.00 L 379.20 563.10 L 404.60 559.80 L 425.60 558.30 L 431.90 558.40 L 437.80 558.80 L 442.20 559.60 L 444.90 560.50 L 446.50 561.60 L 447.50 562.80 Z"
fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="305" stroke="#000000" stroke-linecap="butt"
stroke-width="1" target-height="485.00006" target-width="96.599976" target-x="379.2" target-y="558.3"/>
<path d="M 308.60 564.00 L 299.30 1003.70 L 299.50 1005.30 L 300.60 1007.10 L 301.90 1007.90 L 305.50 1009.30 L 306.00 1010.40 L 305.70 1011.50 L 304.70 1012.80 L 294.60 1021.10 L 293.20 1022.80 L 292.80 1024.00 L 292.90 1024.60 L 293.60 1025.30 L 299.30 1027.20 L 300.40 1027.80 L 299.30 1028.10 L 299.30 1037.00 L 310.60 1040.80 L 319.30 1042.40 L 324.00 1042.70 L 328.70 1042.60 L 333.20 1041.90 L 336.10 1041.00 L 338.90 1039.70 L 341.40 1038.10 L 428.80 564.30 L 308.60 564.00 Z"
fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="307" stroke="#000000" stroke-linecap="butt"
stroke-width="1" target-height="478.69995" target-width="136" target-x="292.8" target-y="564"/>
<path d="M 395.30 787.80 L 395.80 784.10 L 398.40 777.40 L 403.40 769.30 L 410.20 761.10" fill="none"
group-id="10" node-id="309" stroke="#050505" stroke-linecap="butt" stroke-width="1"
target-height="26.700012" target-width="14.900024" target-x="395.3" target-y="761.1"/>
<path d="M 411.90 334.50 L 422.10 335.10 L 424.00 335.90 L 424.70 336.60 L 488.60 433.50 L 582.80 408.70 L 583.60 409.30 L 583.80 409.80 L 589.00 451.20 L 588.70 452.70 L 587.60 453.70 L 474.80 507.30 L 459.00 501.70 L 459.00 575.60 L 458.80 576.80 L 457.40 578.40 L 456.30 578.70 L 444.90 580.00 L 434.70 580.70 L 424.90 580.80 L 408.30 580.20 L 393.70 578.50 L 361.00 572.40 L 347.70 570.80 L 340.60 570.50 L 332.60 570.70 L 322.90 571.40 L 314.70 572.50 L 300.70 575.40 L 297.50 572.80 L 296.10 570.90 L 294.90 568.60 L 294.10 565.70 L 293.50 562.10 L 293.30 557.30 L 293.90 545.00 L 300.00 496.70 L 301.50 478.10 L 301.80 468.30 L 301.70 458.60 L 301.20 448.80 L 300.20 438.90 L 296.70 415.20 L 296.10 406.60 L 296.00 400.80 L 296.40 394.80 L 298.20 384.20 L 301.20 375.00 L 303.40 370.20 L 306.90 364.10 L 309.90 359.80 L 369.70 328.20 L 411.90 334.50 Z"
fill="#05d3ab" fill-rule="nonzero" group-id="10" node-id="311" stroke="none" target-height="252.59998"
target-width="295.7" target-x="293.3" target-y="328.2"/>
<path d="M 427.60 253.70 L 428.90 256.80 L 431.00 264.50 L 433.00 275.10 L 433.70 281.10 L 434.10 287.30 L 434.00 293.40 L 433.30 299.30 L 432.50 303.10 L 431.40 306.50 L 429.90 309.70 L 428.10 312.50 L 425.80 314.90 L 423.10 316.80 L 418.30 318.70 L 411.90 319.20 L 411.20 349.20 L 404.90 352.00 L 398.20 353.40 L 394.50 353.60 L 390.50 353.20 L 387.90 352.50 L 382.60 349.80 L 380.20 347.80 L 377.80 345.20 L 375.40 341.90 L 373.40 338.30 L 371.50 333.80 L 369.70 328.30 L 370.30 286.50 L 371.80 277.90 L 374.50 269.70 L 376.50 265.30 L 379.10 260.90 L 383.50 255.70 L 386.20 253.40 L 389.20 251.40 L 392.50 249.80 L 396.30 248.50 L 400.30 247.80 L 404.80 247.70 L 409.90 248.10 L 415.00 249.10 L 420.90 251.00 L 427.60 253.70 Z"
fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="313" stroke="#020202" stroke-linecap="butt"
stroke-width="1" target-height="105.90001" target-width="64.399994" target-x="369.7" target-y="247.7"/>
<path d="M 444.60 238.40 L 439.20 245.50 L 436.50 248.50 L 433.20 251.60 L 429.50 254.50 L 425.60 256.80 L 422.80 258.10 L 419.90 258.90 L 404.30 260.20 L 402.10 260.70 L 400.00 261.90 L 398.80 264.10 L 398.40 271.10 L 397.60 274.70 L 397.00 274.80 L 396.70 274.50 L 393.10 268.90 L 390.10 266.00 L 387.40 264.90 L 386.00 264.80 L 384.50 265.20 L 382.90 266.30 L 380.70 268.90 L 380.20 270.30 L 380.00 272.30 L 380.30 274.40 L 381.00 276.30 L 382.00 278.00 L 384.80 281.60 L 383.60 288.20 L 382.10 294.10 L 379.70 299.80 L 378.10 302.20 L 376.40 303.80 L 375.10 304.50 L 373.80 304.80 L 372.20 304.60 L 370.80 303.80 L 369.20 302.20 L 367.30 299.60 L 364.80 295.00 L 362.20 289.00 L 357.80 275.10 L 356.00 267.70 L 354.60 260.50 L 353.60 253.40 L 353.30 247.40 L 353.40 243.50 L 353.90 240.60 L 354.60 238.40 L 356.00 236.00 L 358.00 233.70 L 360.60 231.40 L 365.10 228.30 L 370.30 225.30 L 394.60 214.00 L 396.80 212.60 L 403.00 207.40 L 406.70 205.50 L 408.20 205.40 L 409.00 205.80 L 409.80 206.50 L 411.30 209.00 L 413.00 210.20 L 414.50 210.60 L 420.80 210.60 L 423.30 210.90 L 426.30 211.90 L 429.00 213.80 L 430.90 217.00 L 433.00 225.70 L 433.70 227.20 L 435.20 228.40 L 438.40 228.90 L 440.10 229.50 L 441.50 230.40 L 443.10 232.20 L 444.10 234.30 L 444.60 236.50 L 444.60 238.40 Z"
fill="#000000" fill-rule="nonzero" group-id="10" node-id="315" stroke="#000000" stroke-linecap="butt"
stroke-width="1" target-height="99.399994" target-width="91.30002" target-x="353.3" target-y="205.4"/>
<path d="M 444.50 439.50 L 451.30 434.80 L 464.00 425.30 L 480.40 412.30 L 507.70 389.50 L 524.70 374.00 L 531.80 366.90 L 538.20 359.90 L 542.70 354.20 L 543.30 353.90 L 543.80 354.30 L 574.60 417.00 L 574.50 417.70 L 561.60 432.70 L 549.50 445.80 L 535.10 460.50 L 519.30 475.10 L 511.10 481.90 L 503.10 487.90 L 492.50 494.80 L 487.70 497.30 L 482.60 499.50 L 478.10 500.90 L 473.90 501.70 L 473.30 501.30 L 444.20 440.30 L 444.50 439.50 Z"
fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="317" stroke="#020202" stroke-linecap="butt"
stroke-width="1" target-height="147.80002" target-width="130.39996" target-x="444.2" target-y="353.9"/>
<path d="M 451.10 485.90 L 476.20 481.70 L 484.70 466.10 L 489.40 458.70 L 493.70 453.10 L 496.20 451.20 L 497.00 451.10 L 498.30 452.10 L 499.30 455.50 L 499.50 458.40 L 499.50 464.90 L 498.20 478.20 L 510.90 478.80 L 513.80 478.70 L 517.60 477.90 L 519.00 476.90 L 524.30 468.60 L 528.00 464.00 L 529.80 462.20 L 531.90 461.10 L 532.40 461.40 L 532.80 462.20 L 533.10 463.90 L 532.90 471.70 L 531.60 482.70 L 530.90 485.10 L 529.80 487.30 L 528.20 489.30 L 508.00 508.50 L 505.60 509.40 L 504.20 509.50 L 486.90 508.90 L 448.50 524.90 L 451.10 485.90 Z"
fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="319" stroke="#020202" stroke-linecap="butt"
stroke-width="1" target-height="73.80002" target-width="84.599976" target-x="448.5" target-y="451.1"/>
<path d="M 347.10 388.20 L 347.30 392.10 L 351.90 417.20 L 364.30 477.00 L 365.40 479.30 L 367.40 481.00 L 369.90 481.60 L 450.50 482.30 L 451.40 483.20 L 451.50 483.80 L 452.10 524.40 L 452.00 525.10 L 451.10 526.10 L 326.30 539.40 L 302.40 406.30 L 303.10 406.00"
fill="#05d3ab" fill-rule="nonzero" group-id="10" node-id="321" stroke="#050505" stroke-linecap="butt"
stroke-width="1" target-height="151.20001" target-width="149.70001" target-x="302.4" target-y="388.2"/>
<path d="M 301.40 567.80 L 314.50 563.80 L 321.30 562.20 L 328.10 561.10 L 334.90 560.60 L 341.70 560.50 L 348.10 561.20 L 380.30 568.30 L 394.00 570.80 L 407.70 573.00 L 421.50 574.70 L 430.50 575.40 L 439.60 575.60 L 445.50 575.30 L 448.40 574.80 L 451.10 573.80"
fill="none" group-id="10" node-id="323" stroke="#070707" stroke-linecap="butt" stroke-width="1"
target-height="15.099976" target-width="149.70001" target-x="301.4" target-y="560.5"/>
<path d="M 351.60 477.60 L 355.10 477.40 L 358.30 477.90 L 361.90 479.00 L 367.00 481.20" fill="none"
group-id="10" node-id="325" stroke="#050505" stroke-linecap="butt" stroke-width="1"
target-height="3.8000183" target-width="15.399994" target-x="351.6" target-y="477.4"/>
<path d="M 384.70 271.20 L 386.00 274.60 L 388.60 277.30" fill="#000000" fill-rule="nonzero" group-id="10"
node-id="327" stroke="#000000" stroke-linecap="butt" stroke-width="1" target-height="6.0999756"
target-width="3.899994" target-x="384.7" target-y="271.2"/>
<path d="M 535.80 373.30 L 561.40 420.00" fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="329"
stroke="#020202" stroke-linecap="butt" stroke-width="1" target-height="46.700012" target-width="25.600037"
target-x="535.8" target-y="373.3"/>
<path d="M 527.00 382.60 L 552.00 426.10" fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="331"
stroke="#020202" stroke-linecap="butt" stroke-width="1" target-height="43.5" target-width="25"
target-x="527" target-y="382.6"/>
<path d="M 518.20 392.60 L 542.60 432.90" fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="333"
stroke="#020202" stroke-linecap="butt" stroke-width="1" target-height="40.299988" target-width="24.399963"
target-x="518.2" target-y="392.6"/>
<path d="M 510.50 405.30 L 528.70 434.10" fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="335"
stroke="#020202" stroke-linecap="butt" stroke-width="1" target-height="28.800018" target-width="18.200012"
target-x="510.5" target-y="405.3"/>
<path d="M 504.30 417.30 L 515.30 434.80" fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="337"
stroke="#020202" stroke-linecap="butt" stroke-width="1" target-height="17.5" target-width="11"
target-x="504.3" target-y="417.3"/>
<path d="M 462.10 442.20 L 476.30 472.50" fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="339"
stroke="#020202" stroke-linecap="butt" stroke-width="1" target-height="30.299988" target-width="14.199982"
target-x="462.1" target-y="442.2"/>
<path d="M 472.10 441.50 L 481.50 461.40" fill="#ffffff" fill-rule="nonzero" group-id="10" node-id="341"
stroke="#020202" stroke-linecap="butt" stroke-width="1" target-height="19.899994" target-width="9.399994"
target-x="472.1" target-y="441.5"/>
</g>
<g node-id="426">
<path d="M 999.10 442.00 L 996.00 443.80 L 994.10 445.50 L 992.20 447.70 L 989.20 453.20 L 987.20 459.50 L 986.50 463.00 L 986.00 472.20 L 986.20 472.30 L 989.00 469.20 L 991.10 466.50 L 993.50 462.70 L 995.80 458.50 L 997.70 453.50 L 998.70 450.00 L 999.70 442.20 L 999.10 442.00 Z"
fill="#000000" fill-rule="nonzero" group-id="11" node-id="345" stroke="#020202" stroke-linecap="butt"
stroke-width="1" target-height="30.299988" target-width="13.700012" target-x="986" target-y="442"/>
<g node-id="430">
<path d="M 849.70 454.30 L 855.90 446.30 L 865.80 454.10 L 859.70 462.00 Z" fill="#0c0c0c"
fill-rule="nonzero" group-id="11,15" node-id="349" stroke="#000000" stroke-linecap="butt"
stroke-width="1.0000479" target-height="15.700012" target-width="16.099976" target-x="849.7"
target-y="446.3"/>
</g>
<path d="M 931.50 484.00 L 930.90 490.60 L 931.60 496.70 L 933.00 501.20 L 934.10 503.00 L 935.20 504.10 L 936.40 504.60 L 937.60 504.60 L 938.80 504.10 L 940.20 503.00 L 942.50 499.80 L 945.10 493.50 L 946.20 488.90 L 946.70 485.40 L 946.80 478.80 L 946.40 475.60 L 945.10 470.80 L 944.00 468.90 L 943.00 467.70 L 941.90 467.20 L 940.70 467.20 L 939.40 467.80 L 936.70 470.50 L 934.20 475.00 L 932.80 479.10 L 931.50 484.00 Z"
fill="#000000" fill-rule="nonzero" group-id="11" node-id="352" stroke="#020202" stroke-linecap="butt"
stroke-width="1" target-height="37.399994" target-width="15.899963" target-x="930.9" target-y="467.2"/>
<path d="M 940.40 504.50 L 918.50 495.70 L 916.10 495.80 L 907.80 500.10 L 904.50 501.50 L 902.60 501.70 L 876.60 467.20 L 870.20 463.50 L 867.00 460.50 L 865.70 457.80 L 866.10 455.50 L 866.70 454.70 L 869.20 453.20 L 871.60 452.40 L 877.90 451.30 L 887.70 450.60 L 892.60 450.50 L 894.70 450.80 L 896.80 451.60 L 924.70 466.90 L 940.80 469.20 L 946.70 470.70 L 947.10 471.10 L 947.20 474.50 L 946.90 481.70 L 945.80 490.40 L 943.80 498.70 L 942.70 501.10 L 940.40 504.50 Z"
fill="#ffffff" fill-rule="nonzero" group-id="11" node-id="354" stroke="#020202" stroke-linecap="butt"
stroke-width="1" target-height="54" target-width="81.5" target-x="865.7" target-y="450.5"/>
<path d="M 954.00 425.90 L 955.30 407.80 L 956.80 406.90 L 958.90 406.80 L 960.00 407.40 L 961.00 408.70 L 962.00 411.20 L 964.50 423.10 L 965.40 425.10 L 966.70 426.80 L 970.70 429.70 L 977.60 433.90 L 1000.80 447.30 L 996.30 471.80 L 972.30 462.00 L 943.50 461.70 L 941.00 454.80 L 939.70 447.30 L 939.50 442.90 L 939.90 438.00 L 941.40 431.40 L 942.80 427.80 L 944.40 426.00 L 946.70 425.40 L 954.00 425.90 Z"
fill="#ffffff" fill-rule="nonzero" group-id="11" node-id="356" stroke="#020202" stroke-linecap="butt"
stroke-width="1" target-height="65" target-width="61.299988" target-x="939.5" target-y="406.8"/>
<path d="M 1062.80 281.70 L 1056.20 326.80 L 1051.80 350.30 L 1049.00 361.60 L 1047.80 364.80 L 1042.30 374.60 L 1052.30 377.40 L 1062.60 379.80 L 1074.40 381.80 L 1080.50 382.40 L 1090.00 382.60 L 1096.40 381.70 L 1099.40 380.80 L 1101.70 379.60 L 1103.60 378.10 L 1108.60 264.70 L 1099.50 265.10 L 1090.60 266.10 L 1080.90 267.90 L 1076.20 269.30 L 1069.30 272.30 L 1065.40 275.40 L 1064.00 277.30 L 1063.20 279.40 L 1062.80 281.70 Z"
fill="#150f60" fill-rule="nonzero" group-id="11" node-id="358" stroke="none" target-height="117.899994"
target-width="66.29993" target-x="1042.3" target-y="264.7"/>
<path d="M 1208.70 1070.20 L 1208.10 1097.30 L 1277.20 1097.60 L 1278.90 1094.80 L 1280.20 1091.20 L 1280.20 1089.50 L 1279.80 1088.60 L 1279.10 1087.90 L 1264.30 1083.20 L 1255.70 1079.60 L 1251.60 1077.50 L 1248.20 1075.30 L 1246.20 1073.60 L 1244.70 1072.00 L 1243.80 1070.40 L 1208.70 1070.20 Z"
fill="#070707" fill-rule="nonzero" group-id="11" node-id="360" stroke="#000000" stroke-linecap="butt"
stroke-width="1" target-height="27.400024" target-width="72.099976" target-x="1208.1" target-y="1070.2"/>
<path d="M 1204.90 1037.20 L 1208.50 1070.60 L 1243.70 1070.50 L 1235.50 1031.20 Z" fill="#ffffff"
fill-rule="nonzero" group-id="11" node-id="362" stroke="#020202" stroke-linecap="butt" stroke-width="1"
target-height="39.400024" target-width="38.799927" target-x="1204.9" target-y="1031.2"/>
<g node-id="431">
<path d="M 1051.80 1034.60 L 1085.90 1034.70 L 1085.80 1071.30 L 1051.70 1071.20 Z" fill="#ffffff"
fill-rule="nonzero" group-id="11,16" node-id="366" stroke="#020202" stroke-linecap="butt"
stroke-width="1.0000039" target-height="36.700073" target-width="34.200073" target-x="1051.7"
target-y="1034.6"/>
</g>
<path d="M 1046.60 529.00 L 1043.00 557.30 L 1041.00 577.60 L 1039.50 596.40 L 1038.40 614.70 L 1037.50 649.00 L 1038.10 698.70 L 1039.00 734.80 L 1038.80 731.90 L 1038.80 745.20 L 1039.90 833.40 L 1043.10 1037.10 L 1044.00 1038.40 L 1044.80 1038.90 L 1051.70 1041.30 L 1055.60 1042.20 L 1060.20 1042.60 L 1067.00 1042.80 L 1078.60 1042.40 L 1085.50 1041.20 L 1088.10 1040.20 L 1090.60 1038.20 L 1095.00 1029.40 L 1102.00 1013.70 L 1105.00 1004.70 L 1104.60 1003.20 L 1103.80 1002.70 L 1102.50 1002.60 L 1096.20 1003.70 L 1094.80 1003.70 L 1093.80 1002.80 L 1094.00 1000.70 L 1095.10 998.10 L 1100.40 987.40 L 1103.50 979.60 L 1104.20 977.00 L 1104.60 972.50 L 1104.30 970.40 L 1103.50 968.70 L 1102.20 967.20 L 1098.10 964.40 L 1093.80 962.30 L 1093.00 960.50 L 1092.80 956.40 L 1094.80 829.50 L 1096.60 750.00 L 1097.80 712.80 L 1099.20 680.40 L 1100.80 654.80 L 1102.50 638.20 L 1103.40 634.20 L 1104.00 633.00 L 1104.40 632.90 L 1105.90 635.50 L 1109.60 647.30 L 1119.00 685.00 L 1126.60 718.50 L 1143.30 796.60 L 1159.30 875.20 L 1171.30 937.00 L 1175.70 962.70 L 1175.80 970.10 L 1176.10 974.70 L 1176.90 978.90 L 1177.70 981.50 L 1178.60 983.00 L 1179.20 983.50 L 1184.40 981.50 L 1185.60 981.40 L 1186.70 981.60 L 1187.80 983.00 L 1188.00 984.70 L 1187.70 987.20 L 1185.10 999.60 L 1184.80 1003.30 L 1185.00 1006.10 L 1185.50 1008.20 L 1186.30 1009.80 L 1187.40 1011.00 L 1188.80 1011.70 L 1190.60 1011.90 L 1194.10 1011.40 L 1195.20 1011.80 L 1196.00 1012.60 L 1196.50 1013.60 L 1202.40 1041.30 L 1214.20 1042.60 L 1230.30 1042.90 L 1239.20 1042.00 L 1243.60 1041.00 L 1244.60 1040.40 L 1245.70 1038.70 L 1245.90 1037.00 L 1245.60 1034.30 L 1202.10 786.00 L 1187.20 697.90 L 1177.20 636.40 L 1171.50 598.20 L 1169.70 584.50 L 1169.10 570.00 L 1167.80 558.00 L 1164.70 542.90 L 1161.10 530.90 L 1159.70 527.00 L 1101.10 527.50 L 1046.60 529.00 Z"
fill="#4f47fd" fill-rule="nonzero" group-id="11" node-id="369" stroke="none" target-height="515.9"
target-width="208.40002" target-x="1037.5" target-y="527"/>
<path d="M 1069.40 360.70 L 1056.90 360.50 L 1049.30 361.20 L 1044.30 362.60 L 1042.30 364.40 L 1019.80 413.90 L 1003.00 449.50 L 992.60 469.90 L 990.30 473.90 L 987.70 477.40 L 987.20 477.60 L 985.60 477.40 L 973.60 474.70 L 942.90 466.30 L 944.50 474.20 L 944.90 477.80 L 945.00 486.30 L 944.40 490.70 L 943.70 493.60 L 941.40 498.90 L 939.70 501.20 L 937.70 503.30 L 935.20 505.20 L 960.60 510.60 L 989.10 515.80 L 1001.00 517.30 L 1005.80 517.50 L 1008.50 517.30 L 1010.00 516.80 L 1013.90 514.00 L 1017.00 510.90 L 1024.00 502.30 L 1034.80 486.90 L 1048.50 465.70 L 1045.60 498.00 L 1039.90 517.30 L 1040.00 517.90 L 1045.10 523.20 L 1040.50 529.40 L 1043.20 532.30 L 1059.00 533.90 L 1085.60 535.40 L 1107.00 535.60 L 1118.10 535.20 L 1129.10 534.50 L 1146.60 532.10 L 1159.00 529.10 L 1164.40 523.70 L 1164.60 523.00 L 1164.10 522.40 L 1158.50 520.00 L 1165.00 511.60 L 1165.30 487.80 L 1165.70 479.00 L 1167.30 458.20 L 1168.70 446.80 L 1170.40 435.10 L 1172.70 423.20 L 1175.40 411.40 L 1178.70 399.80 L 1186.60 366.30 L 1132.40 347.90 L 1124.10 354.20 L 1079.70 365.90 L 1069.40 360.70 Z"
fill="#ffffff" fill-rule="nonzero" group-id="11" node-id="371" stroke="#020202" stroke-linecap="butt"
stroke-width="1" target-height="187.69998" target-width="251.39996" target-x="935.2" target-y="347.9"/>
<path d="M 1086.10 1070.40 L 1087.10 1097.50 L 1017.30 1097.30 L 1015.80 1095.10 L 1014.70 1092.20 L 1014.80 1090.80 L 1015.20 1090.00 L 1016.00 1089.40 L 1030.70 1084.50 L 1039.30 1080.70 L 1043.30 1078.50 L 1048.70 1074.60 L 1051.00 1071.30 L 1086.10 1070.40 Z"
fill="#070707" fill-rule="nonzero" group-id="11" node-id="373" stroke="#000000" stroke-linecap="butt"
stroke-width="1" target-height="27.099976" target-width="72.39996" target-x="1014.7" target-y="1070.4"/>
<path d="M 1068.40 272.80 L 1065.80 293.00 L 1065.00 304.40 L 1065.20 315.60 L 1065.70 320.80 L 1066.70 325.00 L 1067.60 327.60 L 1068.70 329.50 L 1070.00 330.90 L 1075.30 334.40 L 1081.50 336.40 L 1089.70 337.70 L 1090.80 338.20 L 1091.50 338.90 L 1091.80 339.80 L 1091.90 344.70 L 1091.70 359.20 L 1069.40 360.70 L 1067.30 368.60 L 1066.00 375.60 L 1065.40 382.10 L 1065.80 385.30 L 1066.30 386.20 L 1067.60 387.20 L 1070.10 388.50 L 1077.00 390.70 L 1081.10 391.70 L 1090.10 392.80 L 1094.40 393.00 L 1098.70 392.70 L 1102.30 391.90 L 1105.80 390.60 L 1109.30 388.50 L 1112.60 386.00 L 1118.80 380.40 L 1126.40 371.40 L 1118.20 367.00 L 1142.30 296.90 L 1109.40 257.00 L 1068.40 272.80 Z"
fill="#ffffff" fill-rule="nonzero" group-id="11" node-id="375" stroke="#020202" stroke-linecap="butt"
stroke-width="1" target-height="136" target-width="77.30005" target-x="1065" target-y="257"/>
<path d="M 1122.20 305.00 L 1121.10 307.80 L 1118.90 311.30 L 1116.10 313.70 L 1113.00 314.70" fill="none"
group-id="11" node-id="377" stroke="#03082b" stroke-linecap="butt" stroke-width="1"
target-height="9.700012" target-width="9.199951" target-x="1113" target-y="305"/>
<path d="M 1055.30 390.40 L 1034.70 430.20 L 1033.00 435.00 L 1032.70 437.40 L 1033.00 439.60 L 1033.90 441.70 L 1041.00 454.70 L 1043.30 459.80 L 1045.10 465.20 L 1046.00 468.90 L 1046.50 472.70 L 1046.50 476.50"
fill="none" group-id="11" node-id="379" stroke="#ffffff" stroke-linecap="butt" stroke-width="1"
target-height="86.100006" target-width="22.600098" target-x="1032.7" target-y="390.4"/>
<path d="M 1152.50 353.70 L 1162.30 356.20 L 1171.30 359.00 L 1180.30 362.50 L 1184.30 364.70 L 1187.30 366.70 L 1188.90 368.40 L 1189.80 369.90 L 1190.10 371.40 L 1188.90 374.70 L 1183.60 384.20 L 1178.60 392.10 L 1166.30 410.20 L 1143.20 441.70 L 1126.50 463.00 L 1110.50 482.00 L 1103.30 489.90 L 1096.30 496.90 L 1090.70 501.90 L 1086.80 504.80 L 1084.00 506.30 L 1082.00 507.00 L 1079.50 507.10 L 1072.40 506.30 L 1066.30 504.90 L 1051.50 500.30 L 1027.20 490.90 L 1011.80 484.30 L 986.70 472.70 L 993.50 462.40 L 997.30 454.50 L 999.40 447.50 L 999.70 442.20 L 1058.70 462.20 L 1059.40 462.40 L 1060.60 462.00 L 1090.00 422.70 L 1104.50 403.90 L 1119.40 385.60 L 1133.20 369.80 L 1139.60 363.20 L 1144.70 358.50 L 1148.20 355.80 L 1150.70 354.30 L 1152.50 353.70 Z"
fill="#ffffff" fill-rule="nonzero" group-id="11" node-id="381" stroke="#000000" stroke-linecap="butt"
stroke-width="1" target-height="153.4" target-width="203.39996" target-x="986.7" target-y="353.7"/>
<path d="M 1045.00 522.90 L 1063.10 525.20 L 1071.90 526.00 L 1093.70 527.00 L 1106.10 527.10 L 1118.60 526.60 L 1131.50 525.40 L 1140.00 524.30 L 1156.60 520.80"
fill="none" group-id="11" node-id="383" stroke="#ffffff" stroke-linecap="butt" stroke-width="1"
target-height="6.299988" target-width="111.599976" target-x="1045" target-y="520.8"/>
<path d="M 1108.20 555.10 L 1104.30 626.00" fill="none" group-id="11" node-id="385" stroke="#000000"
stroke-linecap="butt" stroke-width="1" target-height="70.900024" target-width="3.8999023"
target-x="1104.3" target-y="555.1"/>
<path d="M 1096.80 567.30 L 1101.70 623.60" fill="none" group-id="11" node-id="387" stroke="#000000"
stroke-linecap="butt" stroke-width="1" target-height="56.299988" target-width="4.8999023"
target-x="1096.8" target-y="567.3"/>
<path d="M 1061.30 536.20 L 1059.30 547.40 L 1056.80 555.30 L 1055.00 559.30 L 1052.90 563.00 L 1050.30 566.20 L 1048.30 568.10 L 1046.10 569.60 L 1043.70 570.80"
fill="none" group-id="11" node-id="389" stroke="#000000" stroke-linecap="butt" stroke-width="1"
target-height="34.599976" target-width="17.600098" target-x="1043.7" target-y="536.2"/>
<path d="M 1125.40 537.20 L 1129.60 547.00 L 1131.80 551.30 L 1136.80 558.70 L 1141.80 563.80 L 1144.60 565.90 L 1147.60 567.50 L 1150.90 568.70"
fill="none" group-id="11" node-id="391" stroke="#000000" stroke-linecap="butt" stroke-width="1"
target-height="31.5" target-width="25.5" target-x="1125.4" target-y="537.2"/>
<path d="M 1058.70 462.20 L 1064.70 464.10 L 1068.30 466.60 L 1069.90 468.30" fill="none" group-id="11"
node-id="393" stroke="#ffffff" stroke-linecap="butt" stroke-width="1" target-height="6.0999756"
target-width="11.200073" target-x="1058.7" target-y="462.2"/>
<path d="M 986.60 478.50 L 988.90 479.10 L 990.70 480.30 L 992.60 481.80 L 995.10 484.60" fill="none"
group-id="11" node-id="395" stroke="#ffffff" stroke-linecap="butt" stroke-width="1"
target-height="6.100006" target-width="8.5" target-x="986.6" target-y="478.5"/>
<path d="M 1104.20 269.30 L 1097.90 275.00 L 1090.80 280.50 L 1086.60 283.10 L 1079.00 286.70 L 1072.70 288.10 L 1069.50 288.20 L 1066.40 287.80 L 1060.90 285.70 L 1060.70 285.30 L 1061.00 285.00 L 1069.20 282.30 L 1073.70 280.30 L 1076.60 278.10 L 1077.40 276.30 L 1076.10 275.50 L 1074.20 275.60 L 1062.80 278.70 L 1060.90 278.60 L 1058.10 277.60 L 1056.20 276.30 L 1055.20 275.10 L 1054.50 273.60 L 1054.40 269.50 L 1055.80 264.50 L 1057.60 260.70 L 1059.90 256.90 L 1062.60 253.40 L 1065.40 250.40 L 1069.40 247.70 L 1077.00 244.40 L 1082.50 242.70 L 1088.30 241.50 L 1094.40 240.80 L 1098.60 240.60 L 1106.70 241.20 L 1110.60 242.00 L 1114.30 243.20 L 1117.80 244.80 L 1126.70 251.10 L 1131.80 252.20 L 1134.80 253.30 L 1137.80 254.80 L 1141.00 256.90 L 1144.70 260.50 L 1146.40 262.80 L 1147.50 265.20 L 1150.30 275.80 L 1155.00 300.20 L 1158.00 319.00 L 1163.20 353.70 L 1165.40 371.60 L 1161.00 375.20 L 1153.20 380.40 L 1145.80 383.90 L 1137.70 386.10 L 1133.60 386.60 L 1128.20 386.80 L 1122.50 386.40 L 1111.80 384.80 L 1103.20 382.80 L 1098.80 381.60 L 1098.50 381.20 L 1098.60 379.60 L 1110.30 323.70 L 1122.00 318.10 L 1124.00 316.40 L 1126.00 314.20 L 1127.60 311.70 L 1128.80 309.10 L 1129.40 305.40 L 1129.20 303.60 L 1128.60 302.30 L 1126.80 300.30 L 1125.00 299.30 L 1123.00 298.80 L 1120.80 298.70 L 1117.00 299.70 L 1113.90 301.80 L 1112.00 303.90 L 1110.60 306.50 L 1108.50 312.20 L 1107.20 311.00 L 1105.60 308.80 L 1102.30 302.60 L 1100.90 298.70 L 1099.90 293.80 L 1099.60 290.40 L 1100.00 282.60 L 1100.80 278.60 L 1102.20 274.10 L 1104.20 269.30 Z"
fill="#0d005f" fill-rule="nonzero" group-id="11" node-id="397" stroke="none" target-height="146.19998"
target-width="111" target-x="1054.4" target-y="240.6"/>
<path d="M 808.90 354.90 L 798.90 355.70 L 794.20 356.60 L 785.10 359.60 L 776.70 363.80 L 772.90 366.40 L 768.00 370.30 L 763.60 374.60 L 759.70 379.40 L 757.00 383.20 L 752.70 391.40 L 749.70 400.30 L 748.70 404.90 L 747.90 414.70 L 748.70 424.40 L 749.70 429.10 L 752.70 438.00 L 757.00 446.20 L 759.70 450.00 L 763.60 454.70 L 768.00 459.00 L 772.90 462.90 L 780.80 467.80 L 789.60 471.40 L 794.20 472.70 L 803.80 474.20 L 808.90 474.40 L 814.50 474.20 L 820.00 473.40 L 825.30 472.20 L 830.40 470.60 L 835.40 468.50 L 840.00 466.00 L 844.50 463.20 L 848.60 460.00 L 852.50 456.40 L 855.90 452.70 L 858.90 448.80 L 862.10 443.80 L 864.80 438.50 L 866.90 432.80 L 869.10 424.00 L 869.60 419.40 L 869.80 414.70 L 869.60 409.70 L 869.00 404.90 L 866.70 395.80 L 865.00 391.40 L 860.70 383.20 L 858.00 379.40 L 854.10 374.60 L 849.70 370.30 L 844.80 366.40 L 836.90 361.60 L 832.60 359.60 L 823.50 356.60 L 818.80 355.70 L 808.90 354.90 Z M 809.00 470.10 L 802.90 469.80 L 797.10 468.80 L 791.50 467.30 L 786.10 465.20 L 781.10 462.60 L 776.40 459.50 L 772.00 455.90 L 768.00 451.90 L 764.40 447.50 L 761.30 442.80 L 758.70 437.80 L 756.60 432.40 L 755.10 426.80 L 754.10 421.00 L 753.80 415.00 L 754.10 408.90 L 755.10 403.10 L 756.60 397.50 L 758.70 392.10 L 761.30 387.10 L 764.40 382.40 L 768.00 378.00 L 772.00 374.00 L 776.40 370.40 L 781.10 367.30 L 786.10 364.70 L 791.50 362.60 L 797.10 361.10 L 802.90 360.10 L 809.00 359.80 L 815.00 360.10 L 820.80 361.10 L 826.40 362.60 L 831.80 364.70 L 836.80 367.30 L 841.50 370.40 L 845.90 374.00 L 849.90 378.00 L 853.50 382.40 L 856.60 387.10 L 859.20 392.10 L 861.30 397.50 L 862.80 403.10 L 863.80 408.90 L 864.10 415.00 L 863.80 421.00 L 862.80 426.80 L 861.30 432.40 L 859.20 437.80 L 856.60 442.80 L 853.50 447.50 L 849.90 451.90 L 845.90 455.90 L 841.50 459.50 L 836.80 462.60 L 831.80 465.20 L 826.40 467.30 L 820.80 468.80 L 815.00 469.80 L 809.00 470.10 Z"
fill="#356ef2" fill-rule="nonzero" group-id="11" node-id="399" stroke="none" target-height="119.5"
target-width="121.89996" target-x="747.9" target-y="354.9"/>
<path d="M 921.50 494.10 L 915.60 502.00 L 913.90 502.30 L 913.00 502.00 L 858.90 463.50 L 866.50 452.80 L 921.10 491.60 L 921.80 492.70 L 921.50 494.10 Z"
fill="#2a68f1" fill-rule="nonzero" group-id="11" node-id="401" stroke="none" target-height="49.5"
target-width="62.899963" target-x="858.9" target-y="452.8"/>
<path d="M 876.40 478.70 L 879.00 487.70 L 879.40 488.70 L 880.70 490.30 L 900.80 500.80 L 902.00 501.20 L 904.40 501.00 L 910.90 498.20 L 913.60 496.70 L 914.60 495.70 L 906.10 482.00 L 899.10 477.90 L 889.10 472.70 L 888.00 472.30 L 886.00 472.60 L 877.20 476.70 L 876.40 477.50 L 876.40 478.70 Z"
fill="#ffffff" fill-rule="nonzero" group-id="11" node-id="403" stroke="#020202" stroke-linecap="butt"
stroke-width="1" target-height="28.900024" target-width="38.19995" target-x="876.4" target-y="472.3"/>
<path d="M 889.60 477.40 L 885.60 480.80 L 883.90 483.20 L 883.70 486.20 L 883.90 491.30" fill="#ffffff"
fill-rule="nonzero" group-id="11" node-id="405" stroke="#020202" stroke-linecap="butt" stroke-width="1"
target-height="13.899994" target-width="5.8999634" target-x="883.7" target-y="477.4"/>
<path d="M 896.20 482.70 L 891.90 486.30 L 890.90 487.60 L 891.50 495.70" fill="#ffffff" fill-rule="nonzero"
group-id="11" node-id="407" stroke="#020202" stroke-linecap="butt" stroke-width="1" target-height="13"
target-width="5.299988" target-x="890.9" target-y="482.7"/>
<path d="M 903.70 488.10 L 900.20 489.60 L 899.30 490.30 L 899.00 491.00 L 899.00 499.40" fill="#ffffff"
fill-rule="nonzero" group-id="11" node-id="409" stroke="#020202" stroke-linecap="butt" stroke-width="1"
target-height="11.299988" target-width="4.700012" target-x="899" target-y="488.1"/>
<path d="M 836.40 405.00 L 806.80 431.40 L 787.60 408.30 L 793.60 405.10 L 806.90 421.00 L 830.50 400.20 Z"
fill="#09138e" fill-rule="nonzero" group-id="11" node-id="411" stroke="none" target-height="31.199982"
target-width="48.80005" target-x="787.6" target-y="400.2"/>
</g>
<path d="M 196.20 1086.80 L 1427.10 1093.20" fill="none" node-id="414" stroke="#000000" stroke-linecap="butt"
stroke-width="1" target-height="6.3999023" target-width="1230.9" target-x="196.2" target-y="1086.8"/>
</svg>

After

Width:  |  Height:  |  Size: 63 KiB

2713
public/dashboard/work.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 448 KiB

View File

@ -0,0 +1,6 @@
<svg t="1739715035190" className="icon" viewBox="0 0 1024 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="3688" width="48" height="48">
<path
d="M910.2336 1024H113.7664C51.2 1024 0 972.8 0 910.2336V113.7664C0 51.2 51.2 0 113.7664 0h796.4672C972.8 0 1024 51.2 1024 113.7664v796.4672C1024 972.8 972.8 1024 910.2336 1024zM155.2128 555.4432h44.672c35.9936 1.2032 66.0224-8.704 89.984-29.6704 24.0128-20.9664 36.0192-48.3328 36.0192-82.1248 0-33.28-10.24-58.9568-30.7712-76.8768-20.5312-17.92-49.3568-26.88-86.5536-26.88h-97.792v344.2432h44.4416v-128.6912z m0-176.4352h45.3376c52.48 0 78.6688 22.1184 78.6688 66.432 0 22.8096-7.04 40.3456-21.12 52.5824-14.08 12.1856-34.6624 18.304-61.7728 18.304H155.2128v-137.3184z m234.0352 305.1008h94.6432c54.528 0 99.072-16.0768 133.6576-48.2048 34.6112-32.1536 51.8912-74.9056 51.8912-128.256 0-51.0976-17.28-91.8528-51.8912-122.2144-34.56-30.336-77.952-45.568-130.0992-45.568h-98.2016v344.2432z m44.416-304.6656h51.9936c41.0624 0 74.1632 10.8032 99.328 32.4608 25.216 21.6064 37.7856 53.888 37.7856 96.8704 0 43.008-12.2368 76.3392-36.7872 100.224-24.5248 23.8592-58.624 35.7632-102.3232 35.7632H433.664V379.4432z m479.5648 0v-39.5776h-177.3312v344.2432h44.4416v-150.4512h123.1104V494.592h-123.136v-115.1232h132.9152z"
fill="#D93838" p-id="3689"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
public/hrbnu_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

44
public/index.html Normal file
View File

@ -0,0 +1,44 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta content="#ffffff" name="theme-color"/>
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>工作量精算管家 - 哈尔滨师范大学</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
<script src="%PUBLIC_URL%/runtime-config.js" type="application/javascript"></script>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

BIN
public/login-background.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 KiB

BIN
public/logo192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
public/logo512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

25
public/manifest.json Normal file
View File

@ -0,0 +1,25 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

3
public/robots.txt Normal file
View File

@ -0,0 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

2
public/runtime-config.js Normal file
View File

@ -0,0 +1,2 @@
window.BACKEND_ADDRESS = "http://localhost:31000";
window.BACKEND_TIMEOUT = 10000;

BIN
public/xygk-bj1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 668 KiB

38
src/App.css Normal file
View File

@ -0,0 +1,38 @@
/*.App {*/
/* text-align: center;*/
/*}*/
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}

39
src/App.jsx Normal file
View File

@ -0,0 +1,39 @@
import './App.css';
import {ConfigProvider} from "antd";
import locale from 'antd/locale/zh_CN';
import {useEffect, useState} from "react";
import {BrowserRouter as Router} from "react-router-dom";
import Routers from "./routes";
function App() {
const [height, setHeight] = useState(window.innerHeight)
useEffect(() => {
setHeight(window.innerHeight)
window.addEventListener('resize', handleResize);
}, []);
const handleResize = () => {
setHeight(window.innerHeight)
}
return (
<ConfigProvider
theme={{
token: {
colorPrimary: '#980000'
}
}}
locale={locale}>
<div className="App" style={{height: height}}>
<Router>
<Routers/>
</Router>
</div>
</ConfigProvider>
);
}
export default App;

8
src/App.test.js Normal file
View File

@ -0,0 +1,8 @@
import { render, screen } from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
render(<App />);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});

View File

@ -0,0 +1,26 @@
import React from 'react';
import {theme} from "antd";
const CardDiv = props => {
const {
token: {colorBgContainer, borderRadiusLG, colorBgBase},
} = theme.useToken();
return (
<div className={'card-div'}
style={{
padding: 28,
background: colorBgContainer,
borderRadius: borderRadiusLG,
marginTop: 10,
marginBottom: 10,
}}>
{props.children}
</div>
);
};
CardDiv.propTypes = {};
export default CardDiv;

View File

@ -0,0 +1,3 @@
div {
}

View File

@ -0,0 +1,90 @@
import React from 'react';
import PropTypes from 'prop-types';
import {Button, Flex, Form, Input, Modal, Typography} from "antd";
const ChangePasswordModal = props => {
const formLayout = {
labelCol: {span: 4},
wrapperCol: {span: 20},
};
const {commonAxios, messageApi, open, setOpen, closable} = props;
const [form] = Form.useForm();
const onSubmit = (values) => {
const passwordConfirmCheck = values.newPassword === values.confirmNewPassword;
if (!passwordConfirmCheck) {
messageApi.error('两次输入的密码不一致,请重新输入');
return;
}
const changeRequest = {
originalPassword: values.originalPassword,
newPassword: values.newPassword,
}
commonAxios.put('/api/auth/change/password', changeRequest)
.then(response => {
let result = response.data.success;
if (result) {
messageApi.success('修改密码成功');
setOpen(false);
form.resetFields();
}
})
}
const onCancel = () => {
setOpen(false);
form.resetFields();
}
return (
<div>
<Modal
open={open}
title="修改密码"
onCancel={onCancel}
closable={closable}
maskClosable={closable}
footer={
<Flex justify={"end"} align={"center"} gap={"middle"}>
<Button disabled={!closable} onClick={onCancel}>取消</Button>
<Button type={"primary"} onClick={() => form.submit()}>确认</Button>
</Flex>
}
>
{!closable ? <Typography.Text level={5}
style={{color: "red"}}>您的密码已过期请修改密码</Typography.Text> : <></>}
<Form
form={form}
{...formLayout}
style={{marginTop: 20}}
onFinish={onSubmit}
>
<Form.Item label={'旧密码'} name='originalPassword'
rules={[{required: true, message: '请输入旧密码'}]}>
<Input type={'password'}/>
</Form.Item>
<Form.Item label={'新密码'} name='newPassword'
rules={[{required: true, message: '请输入新密码'}]}>
<Input type={'password'}/>
</Form.Item>
<Form.Item label={'确认密码'} name='confirmNewPassword'
rules={[{required: true, message: '请再次输入新密码'}]}>
<Input type={'password'}/>
</Form.Item>
</Form>
</Modal>
</div>
);
}
;
ChangePasswordModal.propTypes = {
commonAxios: PropTypes.func.isRequired,
messageApi: PropTypes.object.isRequired,
open: PropTypes.bool.isRequired,
setOpen: PropTypes.func.isRequired,
closable: PropTypes.bool.isRequired,
};
export default ChangePasswordModal;

View File

@ -0,0 +1,104 @@
import React from 'react';
import {Badge, Button, Dropdown, Flex, Layout, Modal, Space, theme} from "antd";
import {DownOutlined, KeyOutlined, LogoutOutlined, MailOutlined, UserOutlined} from "@ant-design/icons";
import {useNavigate} from "react-router-dom";
import ChangePasswordModal from "./ChangePasswordModal";
function LayoutHeader(props) {
const {
token: {colorBgContainer, borderRadiusLG, colorBgBase},
} = theme.useToken();
const navigate = useNavigate();
const {profile, commonAxios, messageApi} = props;
const [changePasswordModalOpen, setChangePasswordModalOpen] = React.useState(false);
const logout = () => {
Modal.confirm({
title: '确认退出登录吗?',
onOk: () => {
commonAxios.post('/api/auth/logout').then(res => {
localStorage.removeItem('token');
navigate('/auth/login');
})
},
onCancel: () => {
}
});
}
const accountItems = [
{
label: (
<div onClick={() => setChangePasswordModalOpen(true)}>修改密码</div>
),
icon: <KeyOutlined/>,
key: 'changePassword',
},
{
type: 'divider',
},
{
label: <div onClick={logout}>退出登录</div>,
key: 'logout',
icon: <LogoutOutlined/>,
danger: true,
},
];
return (
<div>
<ChangePasswordModal commonAxios={commonAxios} messageApi={messageApi} open={changePasswordModalOpen}
setOpen={setChangePasswordModalOpen} closable={true}/>
<Layout.Header
style={{
height: '64px',
background: colorBgBase
}}
>
<div
style={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
height: '100%'
}}
>
<a href={'/overview'} style={{height: '100%', color: 'black'}}>
<Flex justify={'flex-start'} style={{height: '100%'}} align={"center"}>
<img style={{width: 'auto', height: '80%'}} src={'/hrbnu_logo.png'}
alt={'哈师大logo'}/>
<h2 style={{marginLeft: '20px'}}>工作量精算管家</h2>
</Flex>
</a>
<Flex justify={"flex-start"} align={"center"} gap={"large"}>
<a hidden>
<Badge count={0}>
<MailOutlined style={{fontSize: '15px'}}/>
</Badge>
</a>
<Dropdown
menu={{
items: accountItems,
}}
>
<Button type={'text'}>
<Space>
<UserOutlined/>
{profile.staffNumber}{profile.name}
<DownOutlined/>
</Space>
</Button>
</Dropdown>
</Flex>
</div>
</Layout.Header>
</div>
);
}
export default LayoutHeader;

View File

@ -0,0 +1,111 @@
import React from 'react';
import {Button, Col, Dropdown, Flex, Layout, Modal, Row, Space, theme} from "antd";
import {KeyOutlined, LogoutOutlined, MenuOutlined} from "@ant-design/icons";
import {useNavigate} from "react-router-dom";
import ChangePasswordModal from "./ChangePasswordModal";
const MobileHeader = (props) => {
const {
token: {colorBgContainer, borderRadiusLG, colorBgBase},
} = theme.useToken();
const navigate = useNavigate();
const logout = () => {
Modal.confirm({
title: '确认退出登录吗?',
onOk: () => {
commonAxios.post('/api/auth/logout').then(res => {
localStorage.removeItem('token');
navigate('/auth/login');
})
},
onCancel: () => {
}
});
}
const {profile, commonAxios, messageApi} = props;
const [changePasswordModalOpen, setChangePasswordModalOpen] = React.useState(false);
const mobileAccountItems = [
{
label: (
<div>{profile.name} ({profile.staffNumber})</div>
),
key: 'user',
disabled: true
},
{
type: 'divider',
},
// {
// label: (
// <Badge count={5}>
// 消息中心
// </Badge>
// ),
// icon: <MailOutlined/>,
// key: 'message',
// },
{
label: (
<div onClick={() => setChangePasswordModalOpen(true)}>修改密码</div>
),
icon: <KeyOutlined/>,
key: 'changePassword',
},
{
type: 'divider',
},
{
label: <div onClick={logout}>退出登录</div>,
key: 'logout',
icon: <LogoutOutlined/>,
danger: true,
},
];
return (
<div>
<ChangePasswordModal commonAxios={commonAxios} messageApi={messageApi} open={changePasswordModalOpen}
setOpen={setChangePasswordModalOpen} closable={true}/>
<Layout.Header style={{background: colorBgBase}}>
<Row>
<Col span={2}></Col>
<Col span={20}>
<a
href={'/overview'}
style={{
height: '100%',
color: 'black'
}}>
<Flex justify={"center"} style={{height: '100%'}}>
<img style={{width: 'auto', height: '60px'}} src={'/hrbnu_logo.png'}
alt={'哈师大logo'}/>
</Flex>
</a>
</Col>
<Col span={2}>
<div>
<Dropdown
menu={{
items: mobileAccountItems,
}}
>
<Button type={'text'}>
<Space>
<MenuOutlined/>
</Space>
</Button>
</Dropdown>
</div>
</Col>
</Row>
</Layout.Header>
</div>
);
};
export default MobileHeader;

View File

@ -0,0 +1,63 @@
import React, {useEffect} from 'react';
import {Menu, message} from "antd";
import DashboardMenuItems from "../../menu/DashboardMenuItems";
import {useLocation} from "react-router-dom";
import creatMessageCommonAxios from "../../http/CreatMessageCommonAxios";
const DashboardMenu = props => {
const [messageApi, contextHolder] = message.useMessage();
let commonAxios = creatMessageCommonAxios(messageApi);
const [permissions, setPermissions] = React.useState([]);
const [isAdmin, setIsAdmin] = React.useState(false);
const [menuItems, setMenuItems] = React.useState(DashboardMenuItems);
const [path, setPath] = React.useState(useLocation().pathname);
const removeTrailingSlash = (path) => {
if (path.endsWith('/')) {
return path.slice(0, -1);
}
return path;
}
const fetchPermission = () => {
commonAxios.get('/api/auth/permissions').then((response) => {
if (response.data.data != null) {
setPermissions(response.data.data)
if (response.data.data.includes('ROLE_ADMIN')) {
setIsAdmin(true);
}
}
});
}
useEffect(() => {
fetchPermission();
}, []);
useEffect(() => {
const filteredMenuItems = DashboardMenuItems.filter(item => {
console.log(item.key);
return item.key !== 'system-management' || isAdmin;
});
setMenuItems(filteredMenuItems);
}, [isAdmin]);
return (
<div>
<Menu
mode="inline"
defaultSelectedKeys={[removeTrailingSlash(path)]}
defaultOpenKeys={['workload-retrieval', 'system-management']}
style={{
height: '100%',
borderRight: 0,
}}
items={menuItems}
/>
</div>
);
};
DashboardMenu.propTypes = {};
export default DashboardMenu;

View File

@ -0,0 +1,55 @@
import {Table, Transfer} from "antd";
const TableTransfer = (props) => {
const { leftColumns, rightColumns, ...restProps } = props;
return (
<Transfer
style={{
width: '100%',
}}
{...restProps}
>
{({
direction,
filteredItems,
onItemSelect,
onItemSelectAll,
selectedKeys: listSelectedKeys,
disabled: listDisabled,
}) => {
const columns = direction === 'left' ? leftColumns : rightColumns;
const rowSelection = {
getCheckboxProps: () => ({
disabled: listDisabled,
}),
onChange(selectedRowKeys) {
onItemSelectAll(selectedRowKeys, 'replace');
},
selectedRowKeys: listSelectedKeys,
selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT, Table.SELECTION_NONE],
};
return (
<Table
rowSelection={rowSelection}
columns={columns}
dataSource={filteredItems}
size="small"
style={{
pointerEvents: listDisabled ? 'none' : undefined,
}}
onRow={({ key, disabled: itemDisabled }) => ({
onClick: () => {
if (itemDisabled || listDisabled) {
return;
}
onItemSelect(key, !listSelectedKeys.includes(key));
},
})}
/>
);
}}
</Transfer>
);
};
export default TableTransfer;

View File

@ -0,0 +1,32 @@
import {Tag} from "antd";
import React, {useEffect} from "react";
const CourseTypeTag = (props) => {
const {courseNature} = props;
const [color, setColor] = React.useState('');
const [text, setText] = React.useState('');
useEffect(() => {
if (courseNature === '01') {
setColor('green');
setText('公共必修');
}
if (courseNature === '02') {
setColor('blue');
setText('院选修');
}
if (courseNature === '03') {
setColor('purple');
setText('专业必修');
}
}, [props]);
return (
<Tag color={color} key={courseNature}>
{text}
</Tag>
);
}
export default CourseTypeTag;

View File

@ -0,0 +1,6 @@
const baseWebConfig ={
baseUrl: 'http://localhost:8080',
timeout: 10000,
}
export default baseWebConfig;

View File

@ -0,0 +1,32 @@
import axios from 'axios';
import baseWebConfig from "../config/BaseWebConfig";
const authorizeAxios = axios.create({
baseURL: window.BACKEND_ADDRESS || baseWebConfig.baseUrl,
timeout: window.BACKEND_TIMEOUT || baseWebConfig.timeout,
});
// 传入messageApi
// 响应拦截器
authorizeAxios.interceptors.response.use(
(response) => {
return response;
},
(error) => {
const errorList = JSON.parse(localStorage.getItem('errorList') || '[]');
errorList.push({
message: error.message,
status: error.response?.status,
timestamp: new Date().toISOString(),
});
localStorage.setItem('errorList', JSON.stringify(errorList));
return Promise.reject(error);
}
);
export default authorizeAxios;

View File

@ -0,0 +1,77 @@
import axios from 'axios';
import baseWebConfig from "../config/BaseWebConfig";
const creatMessageCommonAxios = (messageApi) => {
const instance = axios.create({
baseURL: window.BACKEND_ADDRESS || baseWebConfig.baseUrl,
timeout: window.BACKEND_TIMEOUT || baseWebConfig.timeout,
});
const defaultResponse = {
data: {},
success: false,
failed: true,
};
// 请求拦截器
instance.interceptors.request.use(
(config) => {
// 可以在这里添加请求头或者其他配置
const token = localStorage.getItem('token');
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
// 响应拦截器
instance.interceptors.response.use(
(response) => {
let errorDetails = response.data.errorDetails;
if (errorDetails) {
messageApi.error(errorDetails.message + '(' + errorDetails.code + ')');
// return Promise.reject(response);
}
return response;
},
(error) => {
console.log(error);
const errorList = JSON.parse(localStorage.getItem('errorList') || '[]');
errorList.push({
message: error.message,
status: error.response?.status,
timestamp: new Date().toISOString(),
});
localStorage.setItem('errorList', JSON.stringify(errorList));
// 401跳转登录页面
if (error.response?.status === 401) {
messageApi.error('登录过期,请重新登录!');
// 等待1秒后跳转到登录页面
setTimeout(() => {
window.location.href = '/auth/login';
}, 1000);
return Promise.reject(error);
}
// 403 弹出 ant-design 消息
else if (error.response?.status === 403) {
messageApi.error('权限不足,请重试!');
} else {
messageApi.error(error.response
? error.response.data.errorDetails.message + '(' + error.response.data.errorDetails.code + ')'
: '网络中断,请调试网络后重试!');
}
return Promise.resolve(defaultResponse);
}
);
return instance;
};
export default creatMessageCommonAxios;

13
src/index.css Normal file
View File

@ -0,0 +1,13 @@
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace;
}

17
src/index.js Normal file
View File

@ -0,0 +1,17 @@
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

1
src/logo.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,71 @@
import {
ControlOutlined,
DashboardOutlined,
DatabaseOutlined,
DownloadOutlined,
MonitorOutlined,
ReconciliationOutlined,
UsergroupAddOutlined,
UserSwitchOutlined
} from "@ant-design/icons";
import React from "react";
import {NavLink} from "react-router-dom";
const DashboardMenuItems = [
{
key: '/overview',
icon: <DashboardOutlined/>,
label: <NavLink to={'/overview'}>概览</NavLink>
},
{
key: `workload-retrieval`,
icon: <ReconciliationOutlined/>,
label: `个人工作量`,
children: [
{
key: `/data-check`,
icon: <MonitorOutlined/>,
label: <NavLink to={'/data-check'}>数据核对</NavLink>
},
{
key: `/data-print`,
icon: <DownloadOutlined/>,
label: <NavLink to={'/data-print'}>数据打印</NavLink>
}
]
},
{
key: `system-management`,
icon: <ControlOutlined/>,
label: `系统管理`,
children: [
{
key: `/user-management`,
icon: <UserSwitchOutlined/>,
label: <NavLink to={'/user-management'}>用户管理</NavLink>
},
// {
// key: `announcement-management`,
// icon: <NotificationOutlined/>,
// label: `公告管理`,
// },
{
key: `/data-maintenance`,
icon: <DatabaseOutlined/>,
label: <NavLink to={'/data-maintenance'}>数据维护</NavLink>
},
// {
// key: `settings`,
// icon: <SettingOutlined/>,
// label: <NavLink to={'/system-settings'}>系统设置</NavLink>
// }
]
},
{
key: `/about-us`,
icon: <UsergroupAddOutlined/>,
label: <NavLink to={'/about-us'}>关于我们</NavLink>
}
];
export default DashboardMenuItems;

23
src/menu/SettingsMenu.js Normal file
View File

@ -0,0 +1,23 @@
import {AppstoreOutlined, BuildOutlined, DashboardOutlined, SecurityScanOutlined} from "@ant-design/icons";
import React from "react";
const SettingsMenu = [
{
key: '/commons',
icon: <AppstoreOutlined />,
label: '综合设置'
},
{
key: '/security',
icon: <SecurityScanOutlined />,
label: '安全设置'
},
{
key: '/ui',
icon: <BuildOutlined />,
label: '系统UI设定'
}
];
export default SettingsMenu;

View File

@ -0,0 +1,3 @@
.login-layout{
text-align: center;
}

View File

@ -0,0 +1,133 @@
import React, {useState} from 'react';
import './Login.css'
import {Button, Col, Flex, Input, Layout, message, Row, Space, Typography} from "antd";
import {KeyOutlined, UserOutlined} from '@ant-design/icons';
import {useNavigate} from "react-router-dom";
import authorizeAxios from "../../../http/AuthorizeAxios";
import ChangePasswordModal from "../../../component/Header/ChangePasswordModal";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
const {Content, Footer} = Layout;
const loginPageStyle = {
color: 'blue',
backgroundImage: 'url(/login-background.jpg)',
backgroundSize: 'cover',
backgroundPosition: 'center',
height: 'auto',
width: '100%'
};
function Login(props) {
const navigate = useNavigate();
const [messageApi, contextHolder] = message.useMessage();
const commonAxios = creatMessageCommonAxios(messageApi);
const [loginParam, setLoginParam] = useState({
username: '',
password: ''
});
const [changePasswordModalOpen, setChangePasswordModalOpen] = useState(false);
const doLogin = () => {
const username = document.getElementById('username-input').value;
const password = document.getElementById('password-input').value;
setLoginParam({username: username, password: password});
// console.log(loginParam);
authorizeAxios.post('/api/auth/login', loginParam).then((response) => {
if (response.data.data) {
localStorage.setItem('token', response.data.data.token);
messageApi.success('登录成功');
if (response.data.data.needChangePassword === true) {
setChangePasswordModalOpen(true);
} else navigate('/overview')
} else {
console.log(response);
messageApi.error(response.data.errorDetails.message + '(' + response.data.errorDetails.code + ')');
}
});
}
return (
<div style={{height: '100%'}}>
<ChangePasswordModal commonAxios={commonAxios} messageApi={messageApi} open={changePasswordModalOpen}
setOpen={setChangePasswordModalOpen} closable={false}/>
<Row
style={{...loginPageStyle, height: '100%'}}>
<Col
xs={24}
lg={17}
/>
<Col
style={{
height: '100%'
}}
xs={24}
lg={7}
>
{contextHolder}
<Layout className={'login-layout'} style={{height: '100%', background: 'rgba(245,245,245,0.9)'}}>
<Content style={{
height: '100%',
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
}}>
<Flex justify={"center"} vertical>
<div style={{padding: '20%'}}>
<Space direction={"vertical"} size={"large"}>
<div>
<Flex justify={"center"} wrap={"wrap"}>
<img style={{width: '100px', height: 'auto'}} src={'/hrbnu_logo.png'}
alt={'哈师大logo'}/>
<Typography.Title level={2}
style={{marginBottom: '20px'}}>工作量精算管家</Typography.Title>
</Flex>
<Typography.Text type={"secondary"}>您的一站式工作量门户</Typography.Text>
</div>
<div>
<Input id='username-input'
placeholder="请输入用户名"
prefix={<UserOutlined/>}
size={"large"}
style={{marginBottom: '20px'}}
onChange={(e) => {
setLoginParam({...loginParam, username: e.target.value})
}}
/>
<Input.Password id='password-input'
placeholder="请输入密码"
prefix={<KeyOutlined/>}
size={"large"}
style={{marginBottom: '20px'}}
onChange={(e) => {
setLoginParam({...loginParam, password: e.target.value})
}}
/>
<Button type="primary" block size={"large"}
onClick={() => doLogin()}>登录</Button>
</div>
</Space>
</div>
</Flex>
</Content>
<Footer style={{background: 'rgba(0,0,0,0)'}}>
<Flex vertical justify={'center'} align={'center'} wrap={"wrap"}>
<Typography.Text type={"secondary"}>Powered by ©2023
- {new Date().getFullYear()} SimRobot Studio</Typography.Text>
<Typography.Text type={"secondary"}>SimRobot Studio
来自哈尔滨师范大学计算机科学与信息工程学院软件工程系</Typography.Text>
</Flex>
</Footer>
</Layout>
</Col>
</Row>
</div>
);
}
export default Login;

View File

@ -0,0 +1,129 @@
import React from 'react';
import CardDiv from "../../../component/CardDiv/CardDiv";
import {Flex, Table, Typography} from "antd";
const AboutUs = props => {
const {Title, Paragraph, Text} = Typography;
const columns = [
{
title: '姓名',
dataIndex: 'name',
key: 'name',
},
{
title: '职责',
dataIndex: 'responsibilities',
key: 'responsibilities',
},
{
title: '单位或曾单位',
dataIndex: 'record',
key: 'record',
},
{
title: '联系方式',
dataIndex: 'contract',
key: 'contract',
}
];
const data = [
{
key: '1',
name: '付伟',
responsibilities: '指导教师',
record: '计算机科学与信息工程学院软件工程系',
contract: '恕不提供'
},
{
key: '2',
name: '刁衣非',
responsibilities: 'Infrastructure Support',
record: '哈尔滨师范大学 教务处',
contract: '恕不提供'
},
{
key: '3',
name: '刘小琳',
responsibilities: 'Requirements Support',
record: '哈尔滨师范大学 教务处',
contract: '恕不提供'
},
{
key: '10',
name: '李东璋',
responsibilities: 'Architect, 后端开发, 前端开发 ',
record: '2020级软件工程03班',
contract: 'l.dzh@163.com'
},
{
key: '11',
name: '马宇彤',
responsibilities: '需求分析, 前端开发',
record: '2020级软件工程04班',
contract: '恕不提供'
},
];
return (
<div>
<CardDiv>
<Title level={3}>关于我们</Title>
<Title level={4}>Educational Fusion Cloud</Title>
<Paragraph>在当今数字化浪潮席卷全球的时代高等教育领域也在积极探索如何借助前沿技术提升教学管理效率优化学生生活体验并推动教育模式的创新变革正是在这样的背景下Educational
Fusion Cloud教育融合云
项目应运而生它如同一颗璀璨的新星正以其强大的功能和创新的理念为高校的教务与生活管理带来前所未有的自动化与智能化变革</Paragraph>
<Paragraph> Educational Fusion Cloud
项目中有一个特别值得关注的孵化项目工作量精算管家它是整个系统中用于优化高校教师工作量管理与绩效评估的重要组成部分旨在通过智能化手段解决传统教师工作量计算过程中存在的复杂性主观性以及效率低下等问题</Paragraph>
<Paragraph>在数字化时代数据安全至关重要Educational Fusion Cloud
项目在设计之初就将数据安全作为核心考量之一系统采用了先进的加密技术访问控制机制和数据备份策略确保学生教师和学校的各类数据在存储传输和使用过程中的安全性同时通过严格的权限管理只有经过授权的用户才能访问和操作相关数据有效防止了数据泄露和滥用的风险为高校师生营造了一个安全可靠的数字化环境</Paragraph>
<Paragraph>Educational Fusion Cloud
项目正处于快速发展和不断完善的过程中随着技术的不断进步和高校用户需求的持续变化项目团队将继续致力于系统的优化升级和功能拓展未来Educational
Fusion Cloud
将进一步深化软件工程技术在高校管理中的应用探索智能辅导智能科研协作等更多创新功能加强与高校外部资源的对接如与企业合作开展实习实训与科研机构共享科研成果等拓宽高校的教育资源渠道同时持续提升系统的用户体验和数据安全保障能力努力打造一个更加智能高效开放安全的高校数字化生态系统</Paragraph>
<Title level={4}>SimRobot Studio</Title>
<Flex justify={"space-between"} align={"start"} gap={"middle"} wrap={"wrap"}>
<div style={{width: '80%'}}>
<Paragraph>东流逝水叶落纷纷星辰交替间 SimRobot
实验室已经走过20个春秋冬夏从最初的机器人足球实验室到程序创新实验室再到现在的应用软件研究室SimRobot
紧跟学院学校乃至国家的需求变更同样在不断提升不断成长沿着计算机领域的研究路线不断探索截至目前SimRobot
实验室也是哈尔滨师范大学计算机科学与信息工程学院最具实力的实验室之一</Paragraph>
<Paragraph>SimRobot实验室是一个充满活力与创新精神的科研团队
这里汇聚了一批对软件工程怀揣热忱对技术探索永无止境的学生和导师
实验室以软件开发为核心驱动力致力于构建高效智能的软件系统从基础的工具软件到复杂的智能应用平台从桌面端到移动端从单机到分布式系统
无一不在他们的开发视野之内他们用代码编织梦想用逻辑架构未来让软件成为连接人类与数字世界的桥梁</Paragraph>
<Paragraph>算法讨论是实验室的另一大特色活动
在这里每一次算法的探讨都是一场思维的盛宴
无论是经典的排序算法搜索算法还是前沿的机器学习算法深度学习算法都被拿出来反复剖析优化学生们围坐在一起热烈地交流着各自的想法
从算法的时间复杂度空间复杂度到其在实际问题中的适用性从理论的推导到代码的实现每一个细节都不放过他们用严谨的思维碰撞出创新的火花
用智慧的火花点燃技术的火焰让算法成为解决问题的利刃</Paragraph>
</div>
<div
style={{
width: 240,
height: 240,
backgroundImage: 'url(/dashboard/simrobot.svg)',
backgroundSize: 'cover',
backgroundPosition: 'center',
}}
/>
</Flex>
<Paragraph> SimRobot
实验室每一天都有新的挑战每一天都有新的突破他们用汗水浇灌着科技之花用智慧书写着创新篇章
这里不仅是一个实验室更是一个梦想的孵化器一个未来科技人才的摇篮相信在不久的将来从这里走出的学子们将在计算机科学与软件工程领域绽放出属于自己的光芒
SimRobot 实验室也将继续在科技的浪潮中乘风破浪向着更高的目标砥砺前行</Paragraph>
<Title level={4}>开发团队</Title>
<Table
columns={columns}
dataSource={data}
pagination={false}
/>
</CardDiv>
</div>
);
};
AboutUs.propTypes = {};
export default AboutUs;

View File

@ -0,0 +1,58 @@
import {Space} from "antd";
import CourseTypeTag from "../../../../component/Workload/CourseTypeTag";
const CheckTableColumn = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
responsive: ['lg'],
render: (text) => <span key={text}>{text}</span>
},
{
title: '授课名称',
dataIndex: 'courseName',
key: 'courseName',
render: (text) => <span key={text}>{text}</span>
},
{
title: '姓名',
dataIndex: 'teacherName',
key: 'teacherName',
responsive: ['lg'],
render: (text) => <span key={text}>{text}</span>
},
{
title: '课程性质',
dataIndex: 'courseNature',
key: 'courseNature',
responsive: ['sm'],
render: (text) => <CourseTypeTag key={text} courseNature={text}/>,
},
{
title: '授课专业',
dataIndex: 'teachingMajor',
key: 'teachingMajor',
responsive: ['lg'],
render: (text) => <span key={text}>{text}</span>
},
{
title: '总学时',
dataIndex: 'totalClassHours',
key: 'totalClassHours',
render: (text) => <span key={text}>{text}</span>
},
{
title: '操作',
dataIndex: 'operation',
key: 'operation',
hidden: true,
render: (_, record) => (
<Space size={"middle"}>
<a>申请复核</a>
</Space>
)
},
];
export default CheckTableColumn;

View File

@ -0,0 +1,34 @@
import React from 'react';
import {Pagination, Table} from "antd";
import CheckTableColumn from "./CheckTableColumn";
const DataCheckTable = props => {
const {queryResult, queryRequest, setQueryRequest} = props;
const onPaginationChange = (page, pageSize) => {
setQueryRequest({...queryRequest, page: page, size: pageSize});
};
return (
<div>
<Table
columns={CheckTableColumn}
dataSource={queryResult.list}
pagination={false}
/>
<div style={{width: '100%', marginTop: 10, marginBottom: 10}}/>
<Pagination
defaultCurrent={1}
showSizeChanger
total={queryResult.total}
align={'end'}
onChange={onPaginationChange}
/>
</div>
);
};
DataCheckTable.propTypes = {};
export default DataCheckTable;

View File

@ -0,0 +1,151 @@
import React, {useEffect} from 'react';
import {Button, Form, message, Select, Space, Spin} from "antd";
import DataCheckTable from "./DataCheckTable/DataCheckTable";
import CardDiv from "../../../component/CardDiv/CardDiv";
import ResourceFinder from "../../../util/ResourceFinder";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
const DataCheck = props => {
const [messageApi, contextHolder] = message.useMessage();
const commonAxios = creatMessageCommonAxios(messageApi);
const [form] = Form.useForm();
const [semesterList, setSemesterList] = React.useState([]);
const [profile, setProfile] = React.useState({});
const [queryRequest, setQueryRequest] = React.useState({
page: 1,
size: 10,
startSemester: null,
endSemester: null,
staffNumber: profile.staffNumber,
});
const [spinLoading, setSpinLoading] = React.useState(true);
const [queryResult, setQueryResult] = React.useState({});
const fetchSemesterList = () => {
let resourceFinder = new ResourceFinder('efc.workload.oms.workload', 'efc.workload.oms.workload.semester.list', commonAxios, null);
resourceFinder.getResource().then((response) => {
let semesterList = response.data.data.data || [];
setSemesterList(semesterList);
});
}
const fetchWorkloadData = () => {
let uri = `/api/v1/workload/query?page=${queryRequest.page}&size=${queryRequest.size}`;
if (queryRequest.staffNumber) {
uri += `&staffNumber=${queryRequest.staffNumber}`;
}
if (queryRequest.startSemester) {
uri += `&startSemester=${queryRequest.startSemester}`;
}
if (queryRequest.endSemester) {
uri += `&endSemester=${queryRequest.endSemester}`;
}
commonAxios.get(uri).then((response) => {
if (!response.data.data) {
setSpinLoading(false)
setQueryResult([]);
return
}
let workloadData = response.data.data || {};
setQueryResult(workloadData);
setSpinLoading(false)
});
}
const onFormSubmit = (values) => {
console.log(values)
setQueryRequest({
...queryRequest,
page: 1,
size: 10,
startSemester: values.startTerm,
endSemester: values.endTerm,
})
}
useEffect(() => {
fetchSemesterList();
commonAxios.get('/api/auth/profile').then((response) => {
if (response.data.data != null) {
setProfile({
id: response.data.data.id,
name: response.data.data.name,
staffNumber: response.data.data.staffNumber
});
setQueryRequest({...queryRequest, staffNumber: response.data.data.staffNumber});
}
});
}, [props]);
useEffect(() => {
fetchWorkloadData();
}, [queryRequest]);
return (
<div>
{contextHolder}
<Space direction={'vertical'} size={'middle'} style={{display: 'flex'}}>
<CardDiv id={'data-check-param'}>
<Form
layout={"inline"}
form={form}
onFinish={onFormSubmit}
>
<Form.Item label={'起始学期'} name={'startTerm'}>
<Select
style={{
width: 200
}}
showSearch
allowClear
placeholder={'请选择起始学期'}
options={semesterList.map(semester => {
return {label: semester, value: semester}
})}
/>
</Form.Item>
<Form.Item label={'结束学期'} name={'endTerm'}>
<Select
style={{
width: 200
}}
showSearch
allowClear
placeholder={'请选择结束学期'}
options={semesterList.map(semester => {
return {label: semester, value: semester}
})}
/>
</Form.Item>
<Form.Item>
<Button type={"primary"} htmlType={"submit"}>获取数据</Button>
</Form.Item>
</Form>
</CardDiv>
<CardDiv
id={'data-check-table'}
style={{
height: '100%',
width: '100%',
overflow: 'auto'
}}
>
<Spin spinning={spinLoading}>
<DataCheckTable queryResult={queryResult} queryRequest={queryRequest}
setQueryRequest={setQueryRequest}/>
</Spin>
</CardDiv>
</Space>
</div>
);
};
DataCheck.propTypes = {};
export default DataCheck;

View File

@ -0,0 +1,99 @@
import React, {useState} from 'react';
import {Button, Flex, message, Popconfirm, Table, Typography} from "antd";
import ManageTableColumn from "./ManageTableColumn";
import ImportDataDrawer from "./ImportDataDrawer";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
const DataManageTable = props => {
const {workloadData, fetWorkload} = props;
const [messageApi, contextHolder] = message.useMessage();
const commonAxios = creatMessageCommonAxios(messageApi);
const [selectIds, setSelectIds] = useState([]);
const rowSelection = {
type: 'checkbox',
onChange: (selectedRowKeys, selectedRows) => {
setSelectIds(selectedRowKeys);
console.log(selectIds)
console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
},
};
const onBatchDelete = () => {
let url = `/api/v1/workload/delete`
commonAxios.delete(url, {data: selectIds}).then(res => {
if (res.data.data && res.data.data === true) {
messageApi.success("删除成功");
fetWorkload()
setSelectIds([]);
} else {
messageApi.warning('您要删除的数据不存在或已被删除!');
}
})
}
const [importDataOpen, setImportDataOpen] = useState(false);
const importDataDrawerOnClose = () => {
setImportDataOpen(false);
}
return (
<div>
{contextHolder}
<ImportDataDrawer
open={importDataOpen}
onClose={importDataDrawerOnClose}
fetchWorkloadData={fetWorkload}
/>
<Flex justify={"space-between"} align={"center"} gap={"middle"}>
<h3>数据管理</h3>
<Flex justify={"flex-end"} align={"center"} gap={"middle"}>
<Typography.Text>{workloadData.total}条数据</Typography.Text>
<Button type={"primary"} onClick={() => setImportDataOpen(true)}>导入</Button>
</Flex>
</Flex>
<Table
rowSelection={
rowSelection
}
rowKey={(record) => record.id}
columns={ManageTableColumn(commonAxios, messageApi, fetWorkload)}
dataSource={workloadData.list}
pagination={false}
/>
<div id={'batch-operation'} style={{
position: 'fixed',
bottom: 0,
left: '0',
width: '100%',
height: '60px',
background: 'rgb(245,245,245,0.8)',
paddingLeft: 20,
paddingRight: 20,
display: selectIds.length !== 0 ? 'block' : 'none'
}}>
<Flex justify={"space-between"} align={"center"} style={{width: '100%', height: '100%'}}>
<Typography.Text>已选择<Typography.Text
type={'danger'}>{selectIds.length}</Typography.Text></Typography.Text>
<Popconfirm
title="批量删除工作量"
description={`确定批量删除这${selectIds.length}条记录吗?`}
onConfirm={() => onBatchDelete()}
okText="确定"
cancelText="算了"
>
<Button type={"primary"} danger>批量删除</Button>
</Popconfirm>
</Flex>
</div>
</div>
);
};
DataManageTable.propTypes = {};
export default DataManageTable;

View File

@ -0,0 +1,137 @@
import React, {useEffect, useState} from 'react';
import PropTypes from 'prop-types';
import {Button, Divider, Drawer, Form, Input, message, Radio, Space, Upload} from "antd";
import {UploadOutlined} from "@ant-design/icons";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
import ImportHistoryTable from "./ImportHistoryTable";
const ImportDataDrawer = props => {
const {open, onClose, fetchWorkloadData} = props;
const [form] = Form.useForm();
const [messageApi, contextHolder] = message.useMessage();
const commonAxios = creatMessageCommonAxios(messageApi);
const [drawerParam, setDrawerParam] = useState({
open: false
});
const [fileList, setFileList] = useState([]);
useEffect(() => {
console.log('open drawer', open)
setDrawerParam(prevDrawerParam => ({...prevDrawerParam, open: open}))
}, [open]);
const onReset = () => {
form.resetFields();
setFileList([]);
}
const onSubmit = () => {
form.submit();
}
const onFinish = (values) => {
const formData = new FormData();
formData.append('file', fileList[0]);
formData.append('startYear', values.startYear);
formData.append('endYear', parseInt(values.startYear) + 1);
formData.append('semester', values.term);
commonAxios.post('/api/v1/workload/import', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
}).then((res) => {
if (res.data.data && res.data.success === true && res.data.data.uploadStatus === '03') {
messageApi.success("导入成功");
onReset();
onClose();
fetchWorkloadData();
} else {
messageApi.warning('导入失败,请检查文件格式或数据');
onClose();
}
})
};
return (
<div>
{contextHolder}
<Drawer open={drawerParam.open}
size={"large"}
extra={
<Space direction={"horizontal"} size={"middle"}>
<Button onClick={onReset}>重置</Button>
<Button type={"primary"} onClick={onSubmit}>提交</Button>
</Space>
}
title={'导入数据'}
placement={'right'}
onClose={onClose}
>
<div>
<Form
form={form}
labelAlign={'left'}
onFinish={onFinish}
>
<Form.Item
label={'起始年度'}
name={'startYear'}
labelCol={{span: 6}}
wrapperCol={{span: 18}}
rules={[{required: true, message: '请输入起始年度'},
{pattern: /^20[0-9]{2}$/, message: '请输入正确的年度'}]}
>
<Input placeholder={'请输入起始年度'}/>
</Form.Item>
<Form.Item
label={'学期'}
name={'term'}
labelCol={{span: 6}}
wrapperCol={{span: 18}}
rules={[{required: true, message: '请选择学期'}]}
>
<Radio.Group
optionType="button"
buttonStyle="solid"
>
<Radio value={1}>第一学期</Radio>
<Radio value={2}>第二学期</Radio>
</Radio.Group>
</Form.Item>
<Form.Item
name={'file'}
label={'数据文件'}
labelCol={{span: 6}}
wrapperCol={{span: 18}}
rules={[{required: true, message: '请上传数据文件'}]}
>
<Upload
beforeUpload={(file) => {
setFileList([file]);
return false;
}}
onRemove={() => setFileList([])}
multiple={false}
fileList={fileList}
>
<Button icon={<UploadOutlined/>}>点击此处上传</Button>
</Upload>
</Form.Item>
</Form>
</div>
<Divider/>
<ImportHistoryTable messageApi={messageApi} commonAxios={commonAxios}
fetchWorkloadData={fetchWorkloadData}/>
</Drawer>
</div>);
};
ImportDataDrawer.propTypes = {
open: PropTypes.bool,
onClose: PropTypes.func
};
export default ImportDataDrawer;

View File

@ -0,0 +1,56 @@
import React, {useEffect, useState} from 'react';
import {Pagination, Table, Typography} from "antd";
import ImportHistoryTableColumn from "./ImportHistoryTableColumn";
const ImportHistoryTable = props => {
const {messageApi, commonAxios, fetchWorkloadData} = props;
const {Title, Text} = Typography;
const [historyList, setHistoryList] = useState({});
const [queryRequest, setQueryRequest] = useState({
page: 1,
size: 10
});
const fetchHistoryInfo = () => {
commonAxios.get(`/api/v1/workload/upload-record/page?page=${queryRequest.page}&size=${queryRequest.size}`).then((res) => {
if (res.data.success === true) {
setHistoryList(res.data.data);
} else {
messageApi.warning('获取导入历史失败');
}
});
}
const onPaginationChange = (page, pageSize) => {
setQueryRequest({...queryRequest, page: page, size: pageSize});
};
useEffect(() => {
fetchHistoryInfo();
}, [queryRequest, props]);
return (
<div>
{/*<Title level={5}>导入历史</Title>*/}
<Table
columns={ImportHistoryTableColumn(commonAxios, messageApi, fetchHistoryInfo, fetchWorkloadData)}
dataSource={historyList.list}
pagination={false}
/>
<div style={{width: '100%', marginTop: 20}}/>
<Pagination
defaultCurrent={1}
showSizeChanger
total={historyList.total}
align={'end'}
onChange={onPaginationChange}
/>
</div>
);
};
ImportHistoryTable.propTypes = {};
export default ImportHistoryTable;

View File

@ -0,0 +1,58 @@
import {Button, Space, Tooltip} from "antd";
import UploadStatus from "./UploadStatus";
const ManageTableColumn = (commonAxios, messageApi, fetchHistory, fetchWorkloadData) => [
{
title: '文件名',
dataIndex: 'fileName',
key: 'fileName',
ellipsis: {
showTitle: false,
},
render: (text) => (
<Tooltip placement="topLeft" title={text}>
{text}
</Tooltip>
),
},
{
title: '学期',
dataIndex: 'semester',
key: 'semester',
responsive: ['lg'],
render: (_, record) => <span key={`${record.startYear}-${record.endYear}-${record.semester}`}>
{`${record.startYear}-${record.endYear}-${record.semester}`}</span>
},
{
title: '上传状态',
dataIndex: 'uploadStatus',
key: 'uploadStatus',
responsive: ['lg'],
render: (text) => <span key={text}><UploadStatus originText={text}/></span>
},
{
title: '',
dataIndex: 'operation',
key: 'operation',
render: (_, record) => (
record.uploadStatus === '03' ? (<Space size={"middle"}>
<Button danger onClick={() => {
let url = '/api/v1/workload/withdraw';
let param = [];
param.push(record.id);
commonAxios.put(url, param).then(res => {
if (res.data.data) {
messageApi.success("撤回成功");
fetchHistory()
fetchWorkloadData()
} else if (res.data.success === true) {
messageApi.warning('您要撤回的数据不存在或已被撤回!');
}
})
}}>撤回</Button>
</Space>) : <></>
)
},
];
export default ManageTableColumn;

View File

@ -0,0 +1,70 @@
import {Button, Space} from "antd";
import CourseTypeTag from "../../../component/Workload/CourseTypeTag";
const ManageTableColumn = (commonAxios, messageApi, fetchWorkload) => [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
responsive: ['lg'],
render: (text) => <span key={text}>{text}</span>
},
{
title: '授课名称',
dataIndex: 'courseName',
key: 'courseName',
render: (text) => <span key={text}>{text}</span>
},
{
title: '姓名',
dataIndex: 'teacherName',
key: 'teacherName',
responsive: ['lg'],
render: (text) => <span key={text}>{text}</span>
},
{
title: '课程性质',
dataIndex: 'courseNature',
key: 'courseNature',
responsive: ['lg'],
render: (text) => <CourseTypeTag key={text} courseNature={text}/>,
},
{
title: '授课专业',
dataIndex: 'teachingMajor',
key: 'teachingMajor',
responsive: ['lg'],
render: (text) => <span key={text}>{text}</span>
},
{
title: '工作量',
dataIndex: 'totalClassHours',
key: 'totalClassHours',
render: (text) => <span key={text}>{text}</span>
},
{
title: '操作',
dataIndex: 'operation',
key: 'operation',
render: (_, record) => (
<Space size={"middle"}>
<Button danger onClick={() => {
let id = record.id;
let param = [];
param.push(id);
let url = `/api/v1/workload/delete`
commonAxios.delete(url, {data: param}).then(res => {
if (res.data.data && res.data.data === true) {
messageApi.success("删除成功");
fetchWorkload()
} else {
messageApi.warning('您要删除的数据不存在或已被删除!');
}
})
}}>删除</Button>
</Space>
)
},
];
export default ManageTableColumn;

View File

@ -0,0 +1,40 @@
import React, {useEffect} from 'react';
import {Badge} from "antd";
const UploadStatus = props => {
const {originText} = props;
const [status, setStatus] = React.useState('success');
const [text, setText] = React.useState('Success');
useEffect(() => {
if (originText === '01') {
setText('准备上传')
setStatus('default');
} else if (originText === '02') {
setText('上传中')
setStatus('processing');
} else if (originText === '03') {
setText('上传成功')
setStatus('success');
} else if (originText === '04') {
setText('上传失败')
setStatus('error');
} else if (originText === '05') {
setText('已撤销')
setStatus('warning');
} else {
setText('未知')
setStatus('default');
}
}, [props]);
return (
<div>
<Badge status={status} text={text}/>
</div>
);
};
UploadStatus.propTypes = {};
export default UploadStatus;

View File

@ -0,0 +1,214 @@
import React, {useCallback, useEffect} from 'react';
import {Button, Flex, Form, message, Pagination, Select, Space, Spin} from "antd";
import DataManageTable from "./DataManageTable";
import CardDiv from "../../../component/CardDiv/CardDiv";
import {debounce} from "lodash";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
import ResourceFinder from "../../../util/ResourceFinder";
const DataManager = props => {
const [messageApi, contextHolder] = message.useMessage();
const commonAxios = creatMessageCommonAxios(messageApi);
const [form] = Form.useForm();
const [staffInfo, setStaffInfo] = React.useState([]);
const [semesterList, setSemesterList] = React.useState([]);
const [queryRequest, setQueryRequest] = React.useState({
page: 1,
size: 10,
staffNumber: null,
startSemester: null,
endSemester: null,
});
const [queryResult, setQueryResult] = React.useState([]);
const [spinLoading, setSpinLoading] = React.useState(false);
const fetchStaffInfo = (value) => {
var url = `/api/auth/query/registered?page=1&size=10&staffNumber=${value}&precise=false`;
if (!value || value === '') {
url = `/api/auth/query/registered?page=1&size=10&precise=false`;
}
commonAxios.get(url)
.then((response) => {
let staffInfoList = response.data.data.list || [];
setStaffInfo(staffInfoList);
})
}
const debouncedFetchStaffInfo = useCallback(debounce(fetchStaffInfo, 150), []);
const fetchSemesterList = () => {
let resourceFinder = new ResourceFinder('efc.workload.oms.workload', 'efc.workload.oms.workload.semester.list', commonAxios, null);
resourceFinder.getResource().then((response) => {
let semesterList = response.data.data.data || [];
setSemesterList(semesterList);
});
}
const fetchWorkloadData = () => {
let uri = `/api/v1/workload/query?page=${queryRequest.page}&size=${queryRequest.size}`;
if (queryRequest.staffNumber) {
uri += `&staffNumber=${queryRequest.staffNumber}`;
}
if (queryRequest.startSemester) {
uri += `&startSemester=${queryRequest.startSemester}`;
}
if (queryRequest.endSemester) {
uri += `&endSemester=${queryRequest.endSemester}`;
}
commonAxios.get(uri).then((response) => {
if (!response.data.data) {
setSpinLoading(false)
setQueryResult([]);
return
}
let workloadData = response.data.data || {};
setQueryResult(workloadData);
setSpinLoading(false)
});
}
const onPaginationChange = (page, pageSize) => {
setQueryRequest({...queryRequest, page: page, size: pageSize});
};
const onFormSubmit = (values) => {
console.log(values)
setQueryRequest({
page: 1,
size: 10,
staffNumber: values.teacherId,
startSemester: values.startTerm,
endSemester: values.endTerm,
})
}
const onFormReset = () => {
form.resetFields();
setQueryRequest({
page: 1,
size: 10,
staffNumber: null,
startSemester: null,
endSemester: null,
})
}
useEffect(() => {
fetchStaffInfo();
fetchSemesterList();
fetchWorkloadData();
}, []);
useEffect(() => {
setSpinLoading(true)
fetchWorkloadData();
console.log(queryRequest)
}, [queryRequest]);
return (
<div>
{contextHolder}
<Space
style={{
width: '100%'
}}
direction={"vertical"}
size={"middle"}
>
<CardDiv>
<Form
layout={"inline"}
style={{
width: '100%',
display: "flex",
justifyContent: 'space-between',
alignItems: 'center'
}}
labelAlign={'left'}
form={form}
onFinish={onFormSubmit}
>
<Flex justify={"flex-start"} align={"center"} gap={"middle"} wrap={"wrap"}>
<Form.Item
label={'教师'}
name={'teacherId'}>
<Select
style={{
width: '200px'
}}
showSearch
allowClear
onSearch={debouncedFetchStaffInfo}
placeholder={'输入工号搜索'}
options={(staffInfo || []).map(item => ({
value: item.staffNumber,
label: `${item.name} (${item.staffNumber})`
}))}
/>
</Form.Item>
<Form.Item
label={'起始学期'}
name={'startTerm'}
>
<Select
style={{
width: '200px'
}}
showSearch
allowClear
placeholder={'请选择起始学期'}
options={semesterList.map(item => ({label: item, value: item}))}
/>
</Form.Item>
<Form.Item
label={'结束学期'}
name={'endTerm'}
>
<Select
style={{
width: '200px'
}}
showSearch
allowClear
placeholder={'请选择结束学期'}
options={semesterList.map(item => ({label: item, value: item}))}
/>
</Form.Item>
</Flex>
<Flex justify={"flex-start"} align={"center"} gap={"middle"}>
<Form.Item>
<Flex justify={"flex-start"} align={"center"} gap={"middle"}>
<Button onClick={onFormReset}>重置</Button>
<Button type={'primary'} htmlType={'submit'}>检索</Button>
</Flex>
</Form.Item>
</Flex>
</Form>
</CardDiv>
<CardDiv>
<Space direction={"vertical"} size={"middle"} style={{width: '100%'}}>
<Spin spinning={spinLoading}>
<DataManageTable workloadData={queryResult} fetWorkload={fetchWorkloadData}/>
</Spin>
<Pagination
defaultCurrent={1}
showSizeChanger
total={queryResult.total}
align={'end'}
onChange={onPaginationChange}
/>
</Space>
</CardDiv>
</Space>
</div>
);
};
DataManager.propTypes = {};
export default DataManager;

View File

@ -0,0 +1,171 @@
import React, {useCallback, useEffect} from 'react';
import {Button, Col, DatePicker, Flex, Form, Input, message, Row, Select} from "antd";
import {useForm} from "antd/es/form/Form";
import {PlusOutlined, RedoOutlined, SearchOutlined} from "@ant-design/icons";
import {useNavigate} from "react-router-dom";
import creatMessageCommonAxios from "../../../../http/CreatMessageCommonAxios";
import {debounce} from "lodash";
QueryConditionBox.propTypes = {};
function QueryConditionBox(props) {
const {setQueryRequest, setLoading} = props;
const [messageApi, contextHolder] = message.useMessage();
const [form] = useForm();
const commonAxios = creatMessageCommonAxios(messageApi);
const [staffInfo, setStaffInfo] = React.useState([]);
const onReset = () => {
form.resetFields();
setQueryRequest({
page: 1,
size: 6,
id: null,
staffNumber: null,
fileType: null,
status: null,
startTime: null,
endTime: null
})
setLoading(true)
}
const onFinish = () => {
const newRequest = {
page: 1,
size: 6,
id: form.getFieldValue('id'),
staffNumber: form.getFieldValue('staffNumber'),
fileType: form.getFieldValue('fileType'),
status: form.getFieldValue('status'),
startTime: form.getFieldValue('time-range') ? form.getFieldValue('time-range')[0] : null,
endTime: form.getFieldValue('time-range') ? form.getFieldValue('time-range')[1] : null
};
setQueryRequest(newRequest);
setLoading(true)
}
const fetchStaffInfo = (value) => {
commonAxios.get(`/api/auth/query/registered?page=1&size=10&staffNumber=${value}&precise=false`)
.then((response) => {
let staffInfoList = response.data.data.list || [];
setStaffInfo(staffInfoList);
})
}
const debouncedFetchStaffInfo = useCallback(debounce(fetchStaffInfo, 150), []);
const navigate = useNavigate();
useEffect(() => {
commonAxios.get(`/api/auth/query/registered?page=1&size=10&precise=false`)
.then((response) => {
let staffInfoList = response.data.data.list || [];
setStaffInfo(staffInfoList);
})
}, []);
return (
<div className={'query-condition-box'}>
{contextHolder}
<Form form={form}
onFinish={onFinish}
>
<Row gutter={24}>
<Col span={8}>
<Form.Item label={"编号"} name='id'>
<Input
allowClear
placeholder={'证明编号'}/>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item label={"教师"} name='staffNumber'>
<Select
mode="multiple"
placeholder={'输入工号搜索'}
showSearch
allowClear
maxTagCount={'responsive'}
onSearch={debouncedFetchStaffInfo}
options={(staffInfo || []).map(item => ({
value: item.staffNumber,
label: `${item.name} (${item.staffNumber})`
}))}
/>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item label={"类型"} name='fileType'>
<Select
placeholder="请选择证明类型"
options={[
{
value: '01',
label: '本科教学课时证明'
},
{
value: '02',
label: '任职后工作情况证明'
}
]}
style={{minWidth: 180}}
allowClear
/>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item label={"状态"} name='status'>
<Select
placeholder="请选择生成状态"
options={[
{
value: '01',
label: '生成中'
},
{
value: '02',
label: '生成成功'
},
{
value: '03',
label: '生成失败'
},
{
value: '04',
label: '失效'
},
]}
style={{minWidth: 120}}
allowClear
/>
</Form.Item>
</Col>
<Col span={10}>
<Form.Item label={"申请时间"} name='time-range'>
<DatePicker.RangePicker showTime/>
</Form.Item>
</Col>
</Row>
<Flex justify={"space-between"} align={"center"}>
<Flex justify={"start"} align={"center"}>
<Button icon={<PlusOutlined/>}
onClick={() => navigate('/generate-certificate')}>生成新报告</Button>
</Flex>
<Flex justify={"center"} align={"center"} gap={"large"}>
<Button type={"primary"} htmlType={"submit"} icon={<SearchOutlined/>}>搜索</Button>
<Button type={"default"} onClick={onReset} icon={<RedoOutlined/>}>重置</Button>
</Flex>
</Flex>
</Form>
</div>
);
}
export default QueryConditionBox;

View File

@ -0,0 +1,101 @@
import {DeleteOutlined, DownloadOutlined, EditOutlined, RetweetOutlined} from "@ant-design/icons";
import React from "react";
import creatMessageCommonAxios from "../../../../http/CreatMessageCommonAxios";
import baseWebConfig from "../../../../config/BaseWebConfig";
import {Popconfirm} from "antd";
const CardAction = (record, messageApi, navigator) => {
const commonAxios = creatMessageCommonAxios(messageApi);
const downloadRecord = (recordId) => {
let baseUrl = window.BACKEND_ADDRESS || baseWebConfig.baseUrl
commonAxios.get(`${baseUrl}/api/v1/workload/certificate/download/${recordId}`, {responseType: 'blob'}).then((response) => {
if (response.data.type === 'application/json') {
messageApi.error('证明已失效 (GENERATE_CERTIFICATE_ERROR_007)');
setTimeout(() => {
window.location.reload();
}, 1000);
} else {
let fileName = `certificate-${recordId}.pdf`;
const blob = new Blob([response.data], {type: 'application/octet-stream'});
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = fileName;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
}
});
}
const reGenerateRecord = (record) => {
if (record.status === '01' || record.status === '02') {
messageApi.error('证明已经生成或者正在生成,无法重新生成');
return;
}
commonAxios.post(`/api/v1/workload/certificate/re-generate/${record.id}`).then((response) => {
if (response.data.success) {
messageApi.success('已进入队列');
setTimeout(() => {
window.location.reload();
}, 500);
}
});
}
const onEdit = (record) => {
commonAxios.get(`/api/v1/workload/detail/edit/${record.id}`).then((response) => {
let recordRes = response.data.data || {};
sessionStorage.setItem('certificateParam', JSON.stringify(recordRes.certificateParam || {}));
sessionStorage.setItem('chooseUser', recordRes.chooseUser || '');
sessionStorage.setItem('nowStep', recordRes.nowStep || '1');
sessionStorage.setItem('generate-request', JSON.stringify(recordRes.generateRequest || {}));
sessionStorage.setItem('targetKeys', JSON.stringify(recordRes.targetKeys || []));
sessionStorage.setItem('edit-flag', "YES");
navigator('/generate-certificate')
})
}
const onDelete = (record) => {
commonAxios.delete(`/api/v1/workload/certificate/delete/${record.id}`).then((response) => {
if (response.data.success) {
messageApi.success('删除成功');
setTimeout(() => {
window.location.reload();
}, 500);
}
});
}
return [
<EditOutlined onClick={() => onEdit(record)}/>,
...(record.status === '04'
? [<Popconfirm
title="重新生成证明"
description="确定重新生成这份证明吗?"
onConfirm={() => reGenerateRecord(record)}
okText="确定"
cancelText="算了"
>
<RetweetOutlined/>
</Popconfirm>] : []),
...(record.status === '02' ? [<DownloadOutlined onClick={() => downloadRecord(record.id)}/>] : []),
...(record.status === '03' || record.status === '04'
? [<Popconfirm
title="删除证明记录"
description="确定删除这个记录吗?"
onConfirm={() => onDelete(record)}
okText="确定"
cancelText="算了"
>
<DeleteOutlined/>
</Popconfirm>]
: []),
]
}
export default CardAction;

View File

@ -0,0 +1,70 @@
import React from 'react';
import PropTypes from 'prop-types';
import {Avatar, Card, Divider, Flex, Skeleton, Tooltip, Typography} from "antd";
import RecordStatus from "./RecordStatus";
import DateFormater from "../../../../util/DateFormater";
import CardAction from "./CardAction";
import {useNavigate} from "react-router-dom";
PrintRecordCard.propTypes = {
fileType: PropTypes.number.isRequired,
record: PropTypes.object.isRequired,
};
function PrintRecordCard(props) {
const {Meta} = Card;
const {fileType, record, messageApi} = props;
const {Title, Text, Paragraph} = Typography;
const recordName = record.recordType === '01' ? '本科课堂教学课时证明' : '任现职后工作情况证明';
const recordIdSuffix = record.id.slice(-6);
const navigate = useNavigate();
return (
<Skeleton active={true} loading={false}>
<Card
bordered={true}
bodyStyle={{
height: 200
}}
style={{minWidth: 400}}
hoverable={true}
actions={CardAction(record, messageApi, navigate)}
>
<Flex justify={"space-between"} align={"start"}>
<Meta
avatar={<Avatar src={'/data-print/pdf_icon.svg'}/>}
title={recordName}
description={
<div>
<span>编号</span>
<Text type={"secondary"} copyable>{record.id}</Text>
</div>
}
/>
<Tooltip title={'ss'}>
</Tooltip>
<Tooltip title={record.failReason}>
<span></span>
<RecordStatus status={record.status}/>
</Tooltip>
</Flex>
<Divider/>
<Flex justify={"start"} align={"start"} vertical={true}>
<div>
<Text strong>教师工号: </Text><Text>{record.stuffNumber}</Text>
</div>
<div><Text strong>请求时间: </Text><Text>{DateFormater(record.requestTime)}</Text></div>
<div><Text
strong>生成时间: </Text><Text>{record.status === '02' ? DateFormater(record.madeTime) : 'N/A'}</Text>
</div>
</Flex>
</Card>
</Skeleton>)
;
}
export default PrintRecordCard;

View File

@ -0,0 +1,42 @@
import React, {useEffect, useState} from 'react';
import PropTypes from 'prop-types';
import {Badge} from "antd";
RecordStatus.propTypes = {
status: PropTypes.string.isRequired,
};
function RecordStatus({ status }) {
const [statusValue, setStatusValue] = useState({
color: 'green',
text: '生成成功'
});
useEffect(() => {
switch (status) {
case '02':
setStatusValue({color: 'success', text: '生成成功'});
break;
case '01':
setStatusValue({color: 'processing', text: '生成中'});
break;
case '03':
setStatusValue({color: 'error', text: '生成失败'});
break;
case '04':
setStatusValue({color: 'default', text: '已失效'});
break;
default:
setStatusValue({color: 'warning', text: '未知状态'});
}
}, [status]);
return (
<Badge
status={statusValue.color}
text={statusValue.text}
/>
);
}
export default RecordStatus;

View File

@ -0,0 +1,139 @@
import React, {useEffect, useState} from 'react';
import {Button, Col, Empty, FloatButton, message, Pagination, Row, Skeleton, Space, Spin, Typography} from "antd";
import PrintRecordCard from "./RecordCard/PrintRecordCard";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
import QueryConditionBox from "./QueryConditionBox";
import CardDiv from "../../../component/CardDiv/CardDiv";
import {PlusOutlined} from "@ant-design/icons";
import {useNavigate} from "react-router-dom";
const DataPrint = props => {
const [downloadDisabled, setDownloadDisabled] = useState(true);
const previewClicked = () => {
setDownloadDisabled(false);
}
const navigate = useNavigate();
const [messageApi, contextHolder] = message.useMessage();
const [loading, setLoading] = useState(true);
const [spinLoading, setSpinLoading] = useState(false);
const commonAxios = creatMessageCommonAxios(messageApi);
const [queryRequest, setQueryRequest] = useState({
page: 1,
size: 6,
id: null,
staffNumber: null,
fileType: null,
status: null,
startTime: null,
endTime: null
});
const [records, setRecords] = useState([{
"id": "",
"stuffNumber": "",
"currentOperatorUser": "",
"recordType": "",
"status": "",
"failReason": null,
"requestTime": "",
"madeTime": "",
"extraInfo": null
}]);
const [pageInfo, setPageInfo] = useState({
current: 1,
pageSize: 6,
total: 2
});
const onPageChange = (page) => {
setQueryRequest({...queryRequest, page: page});
setSpinLoading(true)
}
useEffect(() => {
setTimeout(() => {
commonAxios.post('/api/v1/workload/certificate/record', queryRequest).then((response) => {
if (response.data.data != null) {
setRecords(response.data.data.list);
setPageInfo({...pageInfo, current: response.data.data.pageNum, total: response.data.data.total});
} else {
setRecords([]);
}
setLoading(false)
setSpinLoading(false)
});
// 动态调整
}, 0)
}, [queryRequest]);
return (
<div style={{width: '100%'}}>
{contextHolder}
<Space direction="vertical" size="large" style={{display: "flex"}}>
<CardDiv>
<QueryConditionBox setQueryRequest={(req) => setQueryRequest(req)}
setLoading={(loading) => setLoading(loading)}/>
</CardDiv>
<Skeleton active={true} loading={loading}>
<CardDiv>
{
records && records.length > 0 ? <Spin spinning={spinLoading}>
<Space direction="vertical" size="large" style={{display: "flex"}}>
<Row gutter={[16, {xs: 8, sm: 16, md: 24, lg: 32}]}>
{
records.map((record, index) => {
return (<Col xxl={8} xl={12} lg={12} md={24} sm={24} xs={24}>
<PrintRecordCard key={index} record={record} fileType={1}
messageApi={messageApi}/>
</Col>)
})
}
</Row>
<Pagination
showQuickJumper
defaultCurrent={1}
showSizeChanger={false}
total={pageInfo.total}
pageSize={pageInfo.pageSize}
onChange={onPageChange}
align={'end'}
/>
</Space>
</Spin> : <>
<Empty
image="https://gw.alipayobjects.com/zos/antfincdn/ZHrcdLPrvN/empty.svg"
styles={{
image: {
height: 60,
},
}}
description={
<Typography.Text>
暂无历史证明生成记录数据
</Typography.Text>
}
>
<Button type="primary" icon={<PlusOutlined/>}
onClick={() => navigate('/generate-certificate')}>生成报告</Button>
</Empty>
</>
}
</CardDiv>
</Skeleton>
<FloatButton.BackTop visibilityHeight={1000}/>
</Space>
</div>
);
};
DataPrint.propTypes = {};
export default DataPrint;

View File

@ -0,0 +1,146 @@
import React, {useEffect} from 'react';
import {Button, Flex, Form, Input, message, Spin, Table, Typography} from "antd";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
const ChooseUser = props => {
const {allowNext, request, setRequest} = props;
const {Title, Text} = Typography;
const [messageApi, contextHolder] = message.useMessage();
const [form] = Form.useForm();
const commonAxios = creatMessageCommonAxios(messageApi);
const columns = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
hidden: true,
width: 0,
},
{
title: '工号',
dataIndex: 'staffNumber',
width: 150
},
{
title: '姓名',
dataIndex: 'name',
width: 200
},
{
title: '学院',
dataIndex: 'college',
},
{
title: '系别',
dataIndex: 'department',
width: 300
},
];
const [staffInfo, setStaffInfo] = React.useState([]);
const [staffNumberPrefix, setStaffNumberPrefix] = React.useState("");
const [spinning, setSpinning] = React.useState(true);
const rowSelection = {
onChange: (selectedRowKeys, selectedRows) => {
console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
allowNext(selectedRows.length > 0);
setRequest({...request, stuffNumber: selectedRows[0].staffNumber});
sessionStorage.setItem('chooseUser', selectedRowKeys)
sessionStorage.removeItem('certificateParam');
sessionStorage.removeItem('targetKeys');
sessionStorage.removeItem('generate-request');
},
defaultSelectedRowKeys: () => {
const selectedRowKeys = [];
let selected = sessionStorage.getItem('chooseUser');
if (selected) {
// 转换为number
selectedRowKeys.push(selected);
allowNext(selectedRowKeys.length > 0);
}
return selectedRowKeys;
}
};
useEffect(() => {
commonAxios.get(`/api/auth/query/registered?page=1&size=10`).then((response) => {
if (response.data.data != null) {
let list = response.data.data.list;
// 为list设置key=id
list.forEach((item) => {
item.key = item.id;
});
setStaffInfo(list);
} else {
setStaffInfo([]);
}
});
setSpinning(false);
}, []);
const onSearch = () => {
setSpinning(true);
commonAxios.get(`/api/auth/query/registered?staffNumber=${staffNumberPrefix}&page=1&size=10`).then((response) => {
if (response.data.data != null) {
let list = response.data.data.list;
// 为list设置key=id
list.forEach((item) => {
item.key = item.id;
});
setStaffInfo(list);
} else {
setStaffInfo([]);
}
setSpinning(false);
});
}
return (
<div>
{contextHolder}
<Flex vertical justiffy={"start"} align={"start"} gap={"large"}>
<div>
<Title level={4}>选择用户</Title>
<Text level={4}
type={'secondary'}>指示EFC系统为何人生成报告选择后这份报告将会出现在您和该同事的EFC系统证明管理画面中</Text>
</div>
<Form
form={form}
layout={"inline"}
>
<Form.Item
name='staff-number'
>
<Input placeholder={"工号"} onChange={(event) => setStaffNumberPrefix(event.target.value)}/>
</Form.Item>
<Button type={"primary"} onClick={() => onSearch()}>搜索</Button>
</Form>
<div style={{width: '100%'}}>
<Spin spinning={spinning}>
<Table
columns={columns}
dataSource={staffInfo}
pagination={false}
rowSelection={{
type: 'radio',
...rowSelection,
}}
/>
</Spin>
</div>
</Flex>
</div>
)
;
}
;
ChooseUser.propTypes = {};
export default ChooseUser;

View File

@ -0,0 +1,203 @@
import React, {useEffect, useState} from 'react';
import {Flex, message, Spin, Tag, Typography} from "antd";
import TableTransfer from "../../../component/TableTransfer";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
const ContentConfig = props => {
const {allowNext, request, setRequest} = props;
const {Title, Paragraph, Text} = Typography;
const [messageApi, contentHolder] = message.useMessage();
const commonAxios = creatMessageCommonAxios(messageApi);
const generateTag = (courseNature) => {
let color = '';
let text = '';
if (courseNature === '01') {
color = 'green';
text = '公共必修';
}
if (courseNature === '02') {
color = 'blue';
text = '院选修';
}
if (courseNature === '03') {
color = 'purple';
text = '专业必修';
}
return (
<Tag color={color} key={courseNature}>
{text}
</Tag>
);
}
const tableColumns = [
{
dataIndex: 'semester',
title: '学期',
},
{
dataIndex: 'courseNature',
title: '课程性质',
render: (_, {courseNature}) => (
<>
{
generateTag(courseNature)
}
</>
),
},
{
dataIndex: 'courseName',
title: '课程名称',
width: 200
},
{
dataIndex: 'actualClassSize',
title: '学生人数',
},
{
dataIndex: 'totalClassHours',
title: '总学时数',
},
]
const mockData = [
{
key: '1',
semester: '2020-2021-1',
courseNature: '必修',
courseName: '计算机网络',
actualClassSize: '30',
totalClassHours: '48',
},
{
key: '2',
semester: '2020-2021-1',
courseNature: '必修',
courseName: '计算机网络',
actualClassSize: '30',
totalClassHours: '48',
},
{
key: '3',
semester: '2020-2021-1',
courseNature: '必修',
courseName: '计算机网络',
actualClassSize: '30',
totalClassHours: '48',
},
{
key: '4',
semester: '2020-2021-1',
courseNature: '必修',
courseName: '计算机网络',
actualClassSize: '30',
totalClassHours: '48',
},
{
key: '5',
semester: '2020-2021-1',
courseNature: '必修',
courseName: '计算机网络',
actualClassSize: '30',
totalClassHours: '48',
},
]
const [targetKeys, setTargetKeys] = useState([]);
const [disabled, setDisabled] = useState(false);
const [spinning, setSpinning] = useState(true);
const [workloadList, setWorkloadList] = useState([
{
key: '',
semester: '',
courseNature: '',
courseName: '',
actualClassSize: '',
totalClassHours: '',
}
]);
const onChange = (nextTargetKeys) => {
setTargetKeys(nextTargetKeys);
sessionStorage.setItem('targetKeys', JSON.stringify(nextTargetKeys));
setRequest({...request, ids: nextTargetKeys});
if (nextTargetKeys.length === 0) {
allowNext(false)
} else {
allowNext(true)
}
};
const toggleDisabled = (checked) => {
setDisabled(checked);
};
useEffect(() => {
commonAxios.get(`/api/v1/workload/detail/queryList/${request.stuffNumber}`)
.then((response) => {
if (response.data.data) {
console.log(response.data.data);
let dataInfo = response.data.data.map((item, index) => {
return {
key: item.id,
semester: item.semesterInfo,
courseNature: item.courseNature,
courseName: item.courseName,
actualClassSize: item.actualClassSize,
totalClassHours: item.totalClassHours,
}
}
);
setWorkloadList(dataInfo);
setSpinning(false)
}
});
let item = sessionStorage.getItem('targetKeys');
if (item !== null) {
item = JSON.parse(item);
setTargetKeys(item);
if (item.length === 0) {
allowNext(false)
} else {
allowNext(true)
}
}
}, [request]);
return (
<div>
{contentHolder}
<Flex vertical justify={"start"} align={"start"} gap={"middle"}>
<div>
<Title level={4}>证书内容配置</Title>
<Text level={4}
type={'secondary'}>选择您想体现在证明上的工作量数据无论是课时证明还是任职后工作情况证明都将会通过您的选择进而渲染合适的数据到您需要的报告中</Text>
</div>
<div style={{width: '100%'}}>
<Spin spinning={spinning}>
<TableTransfer
dataSource={workloadList}
targetKeys={targetKeys}
disabled={disabled}
// showSearch
showSelectAll={false}
onChange={onChange}
// filterOption={filterOptxion}
leftColumns={tableColumns}
rightColumns={tableColumns}
/>
</Spin>
</div>
</Flex>
</div>
);
};
ContentConfig.propTypes = {};
export default ContentConfig;

View File

@ -0,0 +1,175 @@
import React, {useEffect, useState} from 'react';
import PropTypes from 'prop-types';
import {Flex, Form, Input, Radio, Typography} from "antd";
const ParameterConfig = props => {
const {allowNext, request, setRequest} = props;
const {Title, Text} = Typography;
const [form] = Form.useForm();
const [hideWorkloadParam, setHideWorkloadParam] = React.useState(true);
const [admin, setAdmin] = React.useState(true);
const [tempParam, setTempParam] = useState({
recordType: null,
total: '',
annual: '',
})
useEffect(() => {
let item = sessionStorage.getItem("certificateParam");
// TODO 判断是否是管理员
setAdmin(true);
if (item !== null) {
item = JSON.parse(item);
setTempParam(item);
allowNext(item.recordType !== null)
if (item.recordType === '02' && admin) {
setHideWorkloadParam(false);
}
}
}, []);
return (
<div>
<Flex vertical justify={"start"} align={"start"} gap={"middle"}>
<div>
<Title level={4}>参数配置</Title>
<Text level={4}
type={'secondary'}>配置这份证明如指定这份证明的类型手动设定它的计算数据这将决定您即将看到的报告的样式和数据</Text>
</div>
<div style={{width: '100%'}}>
<Form
form={form}
labelCol={{
span: 4,
}}
style={{
maxWidth: 500,
}}
>
<Form.Item
label={"证书类型"}
name='recordType'
rules={[{required: true, message: '请选择证书类型'}]}
>
<Radio.Group
onChange={(event) => {
const recordType = event.target.value;
let item = sessionStorage.getItem("certificateParam");
if (item !== null) {
item = JSON.parse(item);
} else item = tempParam;
item.recordType = recordType;
setTempParam(item)
if (recordType === '02' && admin) {
setHideWorkloadParam(false);
setRequest({...request, recordType: recordType});
} else {
setHideWorkloadParam(true);
setRequest({
...request,
recordType: recordType,
totalTeachingWorkload: '',
annualAverageTeachingWorkload: ''
});
item.total = '';
item.annual = '';
form.setFieldsValue({
total: '',
annual: ''
});
}
sessionStorage.setItem("certificateParam", JSON.stringify(item))
allowNext(true);
}}
defaultValue={() => {
let item = sessionStorage.getItem("certificateParam");
if (item !== null) {
item = JSON.parse(item);
return item.recordType;
}
}}
options={[
{label: '本科课堂工时证明', value: '01'},
{label: '任现职后工作情况证明', value: '02'}
]}
/>
</Form.Item>
<Form.Item
label={"总工作量"}
name='total'
hidden={hideWorkloadParam}
>
<Input
type={'number'}
addonAfter={'课时'}
allowClear
onChange={(event) => {
const total = event.target.value;
let item = sessionStorage.getItem("certificateParam");
if (item !== null) {
item = JSON.parse(item);
} else item = tempParam;
item.total = total;
setTempParam(item)
sessionStorage.setItem("certificateParam", JSON.stringify(item))
setRequest({...request, totalTeachingWorkload: total});
}}
defaultValue={() => {
let item = sessionStorage.getItem("certificateParam");
if (item !== null) {
item = JSON.parse(item);
return item.total;
}
}}
/>
</Form.Item>
<Form.Item
label={"年均工作量"}
name='annual'
hidden={hideWorkloadParam}
>
<Input
addonAfter={'课时'}
allowClear
type={'number'}
onChange={(event) => {
const annualHours = event.target.value;
let item = sessionStorage.getItem("certificateParam");
if (item !== null) {
item = JSON.parse(item);
} else item = tempParam;
item.annual = annualHours;
setTempParam(item)
sessionStorage.setItem("certificateParam", JSON.stringify(item))
setRequest({
...request,
annualAverageTeachingWorkload: annualHours
});
}}
defaultValue={() => {
let item = sessionStorage.getItem("certificateParam");
if (item !== null) {
item = JSON.parse(item);
return item.annual;
}
}}
/>
</Form.Item>
</Form>
</div>
</Flex>
</div>
);
};
ParameterConfig.propTypes = {};
export default ParameterConfig;

View File

@ -0,0 +1,228 @@
import React, {useEffect, useState} from 'react';
import {Descriptions, Flex, message, Skeleton, Table, Tag, Typography} from "antd";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
const generateTag = (courseNature) => {
let color = '';
let text = '';
if (courseNature === '01') {
color = 'green';
text = '公共必修';
}
if (courseNature === '02') {
color = 'blue';
text = '院选修';
}
if (courseNature === '03') {
color = 'purple';
text = '专业必修';
}
return (
<Tag color={color} key={courseNature}>
{text}
</Tag>
);
}
const tableColumns = [
{
dataIndex: 'semester',
title: '学期',
},
{
dataIndex: 'courseNature',
title: '课程性质',
render: (_, {courseNature}) => (
<>
{
generateTag(courseNature)
}
</>
),
},
{
dataIndex: 'courseName',
title: '课程名称',
},
{
dataIndex: 'actualClassSize',
title: '学生人数',
},
{
dataIndex: 'totalClassHours',
title: '总学时数',
},
]
const mockData = [
{
key: '1',
semester: '2020-2021-1',
courseNature: '必修',
courseName: '计算机网络',
actualClassSize: '30',
totalClassHours: '48',
},
{
key: '2',
semester: '2020-2021-1',
courseNature: '必修',
courseName: '计算机网络',
actualClassSize: '30',
totalClassHours: '48',
},
{
key: '3',
semester: '2020-2021-1',
courseNature: '必修',
courseName: '计算机网络',
actualClassSize: '30',
totalClassHours: '48',
},
{
key: '4',
semester: '2020-2021-1',
courseNature: '必修',
courseName: '计算机网络',
actualClassSize: '30',
totalClassHours: '48',
},
{
key: '5',
semester: '2020-2021-1',
courseNature: '必修',
courseName: '计算机网络',
actualClassSize: '30',
totalClassHours: '48',
},
]
const ReadyToGenerate = props => {
const {allowNext, request, setRequest} = props;
const [messageApi, contentHolder] = message.useMessage();
const commonAxios = creatMessageCommonAxios(messageApi);
const {Title, Text} = Typography;
const [loading, setLoading] = useState(true);
const [user, setUser] = React.useState({
id: "",
name: "",
staffNumber: "",
gender: "",
college: "",
department: "",
researchRoom: ""
});
const [workloadList, setWorkloadList] = React.useState([{
key: '',
semester: '',
courseNature: '',
courseName: '',
actualClassSize: '',
totalClassHours: '',
}]);
useEffect(() => {
allowNext(true)
console.log(request);
commonAxios.get(`/api/auth/query/registered?staffNumber=${request.stuffNumber}`).then(response => {
if (response.data.data.list) {
console.log(response.data.data.list[0])
let userInfo = response.data.data.list[0];
setUser(userInfo);
}
});
commonAxios.post(`/api/v1/workload/detail/queryListByIds`, request.ids)
.then((response) => {
if (response.data.data) {
console.log(response.data.data);
let dataInfo = response.data.data.map((item, index) => {
return {
key: item.id,
semester: item.semesterInfo,
courseNature: item.courseNature,
courseName: item.courseName,
actualClassSize: item.actualClassSize,
totalClassHours: item.totalClassHours,
}
}
);
setWorkloadList(dataInfo);
setLoading(false)
}
});
}, [request]);
useEffect(() => {
console.log('数据写入=》', user)
}, [user]);
return (
<div>
{contentHolder}
<Flex vertical justify={"start"} align={"start"} gap={"middle"}>
<div>
<Title level={4}>数据确认</Title>
<Text level={4} type={'secondary'}>请确认您的数据点击生成按钮生成证书</Text>
</div>
<div style={{width: '100%'}}>
<Skeleton active={true} loading={loading}>
<Descriptions
bordered
items={[
{
key: 'staffNumber',
label: '工号',
children: user.staffNumber,
},
{
key: 'name',
label: '姓名',
children: user.name,
},
{
key: 'department',
label: '学院',
children: user.college,
},
{
key: 'recordType',
label: '证明类型',
children: request.recordType === '01' ? '本科教学课时证明' : '任职后工作情况证明',
},
{
key: 'totalTeachingWorkload',
label: '总学时数',
children: request.totalTeachingWorkload || '自动生成',
// span: 2,
},
{
key: 'annualAverageTeachingWorkload',
label: '年均工作量',
children: request.annualAverageTeachingWorkload || '自动生成',
},
{
key: 'workloadList',
label: '证明内容',
children: (
<>
<Table columns={tableColumns} dataSource={workloadList} pagination={false}/>
</>
),
},
]}/>
</Skeleton>
</div>
</Flex>
</div>
);
};
ReadyToGenerate.propTypes = {};
export default ReadyToGenerate;

View File

@ -0,0 +1,228 @@
import React, {useEffect} from 'react';
import {Button, Flex, message, Result, Space, Spin, Steps} from "antd";
import CardDiv from "../../../component/CardDiv/CardDiv";
import ChooseUser from "./ChooseUser";
import ParameterConfig from "./ParameterConfig";
import ContentConfig from "./ContentConfig";
import ReadyToGenerate from "./ReadyToGenerate";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
import {useNavigate} from "react-router-dom";
const GenerateCertificate = props => {
const [messageApi, contextHolder] = message.useMessage();
const commonAxios = creatMessageCommonAxios(messageApi);
const navigate = useNavigate();
const [current, setCurrent] = React.useState(() => {
let nowStep = sessionStorage.getItem('nowStep');
if (nowStep === null) {
return 0;
} else {
return parseInt(nowStep);
}
});
const [request, setRequest] = React.useState({
ids: [],
stuffNumber: "",
recordType: "",
totalTeachingWorkload: "",
annualAverageTeachingWorkload: "",
});
const [resultStatus, setResultStatus] = React.useState('error');
const [result, setResult] = React.useState({});
const [loading, setLoading] = React.useState(false);
const [pageConfig, setPageConfig] = React.useState({});
const steps = [
{
title: '选择用户',
description: '选择生成证书的用户',
},
{
title: '证书参数配置',
description: '证书类型、参数配置',
},
{
title: '证书内容配置',
description: '选择证书的工作量记录',
},
{
title: '数据确认',
description: '确认数据,准备生成',
},
{
title: '生成证明',
description: '生成进行中',
},
];
const stepMap = {
0:
<ChooseUser
allowNext={(allow) => allowNext(allow)}
request={request}
setRequest={req => setRequest(req)}
/>,
1:
<ParameterConfig
allowNext={(allow) => allowNext(allow)}
request={request}
setRequest={req => setRequest(req)}
/>,
2:
<ContentConfig
allowNext={(allow) => allowNext(allow)}
request={request}
setRequest={req => setRequest(req)}
/>,
3:
<ReadyToGenerate
allowNext={(allow) => allowNext(allow)}
request={request}
setRequest={req => setRequest(req)}
/>,
4:
<Result
status={resultStatus}
title={resultStatus === 'success' ? '成功' : '失败'}
subTitle={resultStatus === 'success' ?
`编号: ${result.id} 的证书打印请求已成功进入队列,正在生成证书,请前往证书打印页面查看。` :
'证书生成失败'}
extra={[
<Button type="primary" key="console" onClick={() => navigate('/data-print')}>
{resultStatus === 'success' ? '查看结果' : '返回'}
</Button>,
]}
/>
}
const [preButton, setPreButton] = React.useState({
type: "default",
disabled: true,
hidden: false,
text: "上一步",
});
const [nextButton, setNextButton] = React.useState({
type: "primary",
disabled: true,
hidden: false,
text: "下一步",
})
const onNext = () => {
let nextCurrent = current + 1;
setPreButton({...preButton, disabled: false,});
if (nextCurrent === 3) {
setCurrent(nextCurrent);
sessionStorage.setItem('nowStep', nextCurrent.toString());
}
if (nextCurrent >= 4) {
setLoading(true);
commonAxios.post('/api/v1/workload/certificate/generate', request).then((response) => {
console.log(response);
console.log(response.data.data !== null)
console.log(response.data.data.success === true)
if (response.data.data !== null && response.data.success === true) {
setResultStatus('success');
setResult(response.data.data);
} else {
setResultStatus('error');
setResult(response.data.errorDetails);
messageApi.error(response.data.errorDetails.message + `(${response.data.errorDetails.code})`);
}
setPreButton({...preButton, hidden: true,});
setNextButton({...nextButton, hidden: true,});
setCurrent(4);
setLoading(false);
});
sessionStorage.removeItem('nowStep');
sessionStorage.removeItem('chooseUser');
sessionStorage.removeItem('certificateParam');
sessionStorage.removeItem('targetKeys');
sessionStorage.removeItem('generate-request');
} else {
setCurrent(nextCurrent);
allowNext(false);
sessionStorage.setItem('nowStep', nextCurrent.toString());
}
}
const onPrev = () => {
let nextCurrent = current - 1;
setCurrent(nextCurrent);
let editFlag = sessionStorage.getItem('edit-flag');
if (nextCurrent <= 0) {
setCurrent(0)
setPreButton({...preButton, disabled: true,})
}
sessionStorage.setItem('nowStep', nextCurrent.toString());
}
const allowNext = (allow) => {
setNextButton({...nextButton, disabled: !allow})
}
useEffect(() => {
console.log(request);
if (request.stuffNumber !== '') {
sessionStorage.setItem('generate-request', JSON.stringify(request));
}
}, [request]);
useEffect(() => {
let request = sessionStorage.getItem('generate-request');
if (request !== null) {
request = JSON.parse(request);
setRequest(request);
}
}, []);
return (
<div>
{contextHolder}
<Space direction="vertical" size="large" style={{display: "flex"}}>
<CardDiv>
<Steps
current={current}
items={steps}
/>
</CardDiv>
<Spin spinning={loading}>
<CardDiv>
{stepMap[current]}
<Flex justify={"start"} align={"center"} gap={"middle"} style={{marginTop: 20}}
hidden={current >= 4}>
<Button
type={preButton.type}
disabled={preButton.disabled}
onClick={onPrev}
style={{display: current === 4 ? 'none' : 'inline-block'}}>
{preButton.text}
</Button>
<Button
type={nextButton.type}
disabled={nextButton.disabled}
onClick={onNext}
style={{display: current === 4 ? 'none' : 'inline-block'}}>
{current === 3 ? '开始生成' : nextButton.text}
</Button>
</Flex>
</CardDiv>
</Spin>
</Space>
</div>
);
};
GenerateCertificate.propTypes = {};
export default GenerateCertificate;

View File

@ -0,0 +1,13 @@
import React from 'react';
const NoticeManager = props => {
return (
<div>
</div>
);
};
NoticeManager.propTypes = {};
export default NoticeManager;

View File

@ -0,0 +1,254 @@
import React, {useEffect} from 'react';
import {Avatar, Card, Col, Flex, message, Row, Statistic, Typography} from "antd";
import Meta from "antd/es/card/Meta";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
import CardDiv from "../../../component/CardDiv/CardDiv";
import CountUp from 'react-countup';
const Overview = props => {
const [messageApi, contextHolder] = message.useMessage();
const commonAxios = creatMessageCommonAxios(messageApi);
const {Title, Text} = Typography;
const formatter = value => <CountUp end={value} separator=","/>;
const [profile, setProfile] = React.useState({
id: '',
name: '',
staffNumber: '',
college: '',
department: '',
researchRoom: '',
});
const [userStatistic, setUserStatistic] = React.useState({
workloadDataCount: '0',
reportCount: '0',
});
const [permissions, setPermissions] = React.useState([]);
const [isAdmin, setIsAdmin] = React.useState(false);
const fetchUserProfile = () => {
commonAxios.get('/api/auth/profile').then((response) => {
if (response.data.data != null) {
setProfile({
id: response.data.data.id,
name: response.data.data.name,
staffNumber: response.data.data.staffNumber,
college: response.data.data.college,
department: response.data.data.department,
researchRoom: response.data.data.researchRoom,
});
}
});
}
const fetchPermission = () => {
commonAxios.get('/api/auth/permissions').then((response) => {
if (response.data.data != null) {
setPermissions(response.data.data)
if (response.data.data.includes('ROLE_ADMIN')) {
setIsAdmin(true);
}
}
});
}
const fetWorkloadStatistic = () => {
commonAxios.get('/api/v1/workload/query-statistic').then((response) => {
if (response.data.data != null) {
setUserStatistic({
workloadDataCount: response.data.data.workloadDataCount,
reportCount: response.data.data.reportCount,
});
}
});
}
useEffect(() => {
fetchUserProfile()
fetWorkloadStatistic()
fetchPermission()
}, []);
return (
<div>
{contextHolder}
<Row>
<Col xs={0} sm={0} lg={24}>
<CardDiv style={{padding: 10}}>
<Flex justify={"space-between"} align={"center"} wrap={"nowrap"}>
<div>
<Flex justify={"start"} align={"center"} wrap={"nowrap"} gap={"large"}>
<div>
<Avatar style={{backgroundColor: '#fde3cf', color: '#f56a00'}}
size={42}>{profile.name.slice(-2) || 'U'}</Avatar>
</div>
<div>
<Title level={3} style={{marginTop: 10}}>你好{profile.name}欢迎使用Education
Fusion
Cloud Platform</Title>
<Text
type={"secondary"}>{profile.college} / {profile.department} / {profile.researchRoom}</Text>
</div>
</Flex>
</div>
<Flex justify={"center"} align={"center"} wrap={"nowrap"} gap={"large"}>
<Statistic title="工作量数据条数" value={userStatistic.workloadDataCount}
formatter={formatter}/>
<Statistic title="生成报告数" value={userStatistic.reportCount} formatter={formatter}/>
</Flex>
</Flex>
</CardDiv>
</Col>
<Col sm={24} lg={0} xxl={0}>
<CardDiv style={{padding: 10}}>
<Flex justify={"space-between"} align={"center"} wrap={"wrap"}>
<div>
<Flex justify={"start"} align={"center"} wrap={"nowrap"} gap={"large"}>
<div>
<Avatar style={{backgroundColor: '#fde3cf', color: '#f56a00'}}
size={42}>{profile.name.slice(-2) || 'U'}</Avatar>
</div>
<div>
<Title level={3} style={{marginTop: 10}}>你好{profile.name}</Title>
<Text
type={"secondary"}>{profile.college} / {profile.department} / {profile.researchRoom}</Text>
</div>
</Flex>
</div>
<Flex justify={"start"} align={"center"} wrap={"nowrap"} gap={"large"}
style={{marginTop: 10}}>
<Statistic title="工作量数据条数" value={userStatistic.workloadDataCount}
formatter={formatter}/>
<Statistic title="生成报告数" value={userStatistic.reportCount} formatter={formatter}/>
</Flex>
</Flex>
</CardDiv>
</Col>
</Row>
<div style={{
padding: 0
}}>
<Row gutter={[16, {xs: 8, sm: 16, md: 24, lg: 32}]}>
<Col lg={6} xs={24}>
<a href={'/data-check'}>
<Card
hoverable
cover={
(
<div
style={{
minHeight: '240px',
backgroundImage: 'url(/dashboard/work.svg)',
backgroundSize: 'cover',
backgroundPosition: 'center',
}}
></div>
)
}
>
<Meta title="数据核对" description="核对系统内工作量数据"/>
</Card>
</a>
</Col>
<Col lg={6} xs={24}>
<a href={'/data-print'}>
<Card
hoverable
cover={
(
<div
style={{
minHeight: '240px',
backgroundImage: 'url(/dashboard/print.svg)',
backgroundSize: 'cover',
backgroundPosition: 'center',
}}
></div>
)
}
>
<Meta title="数据打印" description="打印工作量统计报表"/>
</Card>
</a>
</Col>
{
!isAdmin ? <></> :
<Col lg={6} xs={24}>
<a href={'/data-maintenance'}>
<Card
hoverable
cover={
(
<div
style={{
minHeight: '240px',
backgroundImage: 'url(/dashboard/data-manage.svg)',
backgroundSize: 'cover',
backgroundPosition: 'center',
}}
></div>
)
}
>
<Meta title="数据维护" description="管理系统内工作量数据"/>
</Card>
</a>
</Col>
}
{
!isAdmin ? <></> :
<Col lg={6} xs={24}>
<a href={'/user-management'}>
<Card
hoverable
cover={
(
<div
style={{
minHeight: '240px',
backgroundImage: 'url(/dashboard/user-manage.svg)',
backgroundSize: 'cover',
backgroundPosition: 'center',
}}
></div>
)
}
>
<Meta title="用户管理" description="管理系统内用户"/>
</Card>
</a>
</Col>
}
<Col lg={6} xs={24}>
<a href={'/about-us'}>
<Card
hoverable
cover={
(
<div
style={{
minHeight: '240px',
backgroundImage: 'url(/dashboard/simrobot.svg)',
backgroundSize: 'cover',
backgroundPosition: 'center',
}}
></div>
)
}
>
<Meta title="关于本系统" description="了解系统背景、开发团队"/>
</Card>
</a>
</Col>
</Row>
</div>
</div>
);
};
Overview.propTypes = {};
export default Overview;

View File

@ -0,0 +1,22 @@
import React from 'react';
import {Col, Flex, Menu, Row, Switch, Typography} from 'antd';
import Sider from "antd/es/layout/Sider";
import DashboardMenuItems from "../../../menu/DashboardMenuItems";
import SettingsMenu from "../../../menu/SettingsMenu";
import {Header} from "antd/es/layout/layout";
const {Title} = Typography;
const Index = () => {
return (
<div>
<div>
<Menu
mode={'horizontal'}
items={SettingsMenu}/>
</div>
</div>
);
};
export default Index;

View File

@ -0,0 +1,267 @@
import React, {useEffect} from 'react';
import PropTypes from 'prop-types';
import {Badge, Button, Descriptions, Divider, Drawer, Empty, Flex, Popconfirm, Space, Typography} from "antd";
import DeleteTeacherModal from "./DeleteTeacherModal";
import ResetPasswordModal from "./ResetPasswordModal";
const AccountInfoDrawer = props => {
const {open, setOpen, userInfoDetails, commonAxios, messageApi, fetchUserInfoList} = props;
const {Title, Text, Paragraph} = Typography;
const [loading, setLoading] = React.useState(true);
const [userInfo, setUserInfo] = React.useState({});
const [profile, setProfile] = React.useState({});
const [modalOpen, setModalOpen] = React.useState(false);
const [isSelf, setIsSelf] = React.useState(false);
const [newPassword, setNewPassword] = React.useState('');
const [resetPasswordModalOpen, setResetPasswordModalOpen] = React.useState(false);
const fetchAccountInfo = () => {
setUserInfo(userInfoDetails)
setLoading(false);
}
const onClose = () => {
fetchUserInfoList();
setOpen(false);
}
const fetchProfile = () => {
commonAxios.get('/api/auth/profile').then((response) => {
if (response.data.data != null) {
setProfile({
id: response.data.data.id,
name: response.data.data.name,
staffNumber: response.data.data.staffNumber
});
let propsUsername = userInfoDetails.staffNumber || '';
setIsSelf(response.data.data.staffNumber === propsUsername)
}
});
}
const changeTeacherInfo = (code, afterValue) => {
console.log('code', code);
console.log('afterValue', afterValue);
const url = '/api/v1/teacher/update';
let params = {
staffNumber: userInfoDetails.staffNumber,
changes: [
{
changeOption: code,
value: afterValue,
}
]
}
commonAxios.put(url, params)
.then(res => {
if (res.status === 200) {
let newUserInfo = res.data.data || {};
setUserInfo(newUserInfo);
messageApi.success('修改成功');
} else {
messageApi.error('修改失败');
}
})
.catch(err => {
messageApi.error('修改失败');
});
}
const changeAccountInfo = (code, afterValue) => {
console.log('code', code);
console.log('afterValue', afterValue);
const url = '/api/v1/teacher/update-account';
let params = {
username: userInfoDetails.staffNumber,
changes: [
{
changeOption: code,
value: afterValue,
}
]
}
commonAxios.put(url, params)
.then(res => {
if (res.status === 200) {
let newUserInfo = res.data.data || {};
setUserInfo(newUserInfo);
messageApi.success('修改成功');
} else {
messageApi.error('修改失败');
}
})
.catch(err => {
messageApi.error('修改失败');
});
}
const resetPassword = () => {
commonAxios.post('/api/auth/reset/password', {username: userInfoDetails.staffNumber})
.then(res => {
if (res && res.data.success) {
setNewPassword(res.data.data.newPassword);
setResetPasswordModalOpen(true);
}
})
}
useEffect(() => {
fetchAccountInfo();
fetchProfile();
}, [props]);
return (
<div>
<Drawer
open={open}
loading={loading}
onClose={onClose}
size={"large"}
closable
destroyOnClose
title={`${userInfo.name} (${userInfo.staffNumber})`}
extra={
<Space>
{
isSelf ? <></>
: <Button
color="danger"
variant="dashed"
onClick={() => setModalOpen(true)}
>
删除教师
</Button>
}
</Space>
}
>
<DeleteTeacherModal
open={modalOpen}
setOpen={setModalOpen}
setDrawerOpen={setOpen}
commonAxios={commonAxios}
messageApi={messageApi}
userInfo={userInfo}
fetchUserInfo={fetchUserInfoList}
/>
<ResetPasswordModal newPassword={newPassword} open={resetPasswordModalOpen}
setOpen={setResetPasswordModalOpen} setNewPassword={setNewPassword}/>
<Descriptions title={'教师信息'}>
<Descriptions.Item label={'编号'}>
{userInfo.id}
</Descriptions.Item>
<Descriptions.Item label={'姓名'}>
<Text
editable={{onChange: (value) => changeTeacherInfo('changeInfo.teacher.name', value)}}
>{userInfo.name}</Text>
</Descriptions.Item>
<Descriptions.Item label={'工号'}>
{userInfo.staffNumber}
</Descriptions.Item>
<Descriptions.Item label={'性别'}>
{userInfo.gender}
</Descriptions.Item>
<Descriptions.Item label={'学院'} span={2}>
<Text
editable={{onChange: (value) => changeTeacherInfo('changeInfo.teacher.college', value)}}
>{userInfo.college}</Text>
</Descriptions.Item>
<Descriptions.Item label={'专业'}>
<Text
editable={{onChange: (value) => changeTeacherInfo('changeInfo.teacher.department', value)}}
>{userInfo.department}</Text>
</Descriptions.Item>
<Descriptions.Item label={'研究室'}>
<Text
editable={{onChange: (value) => changeTeacherInfo('changeInfo.teacher.researchRoom', value)}}
>{userInfo.researchRoom}</Text>
</Descriptions.Item>
<Descriptions.Item label={'职称'}>
<Text
editable={{onChange: (value) => changeTeacherInfo('changeInfo.teacher.jobTitle', value)}}
>{userInfo.jobTitle}</Text>
</Descriptions.Item>
</Descriptions>
<Divider/>
{
!userInfo.registered
? <>
<Title level={5}>账号信息</Title>
<Empty description={'该教师尚未注册账号'}/>
</>
: <>
<Descriptions title={'账号信息'}>
<Descriptions.Item label={'账户id'}>{userInfo.accountInfo.id}</Descriptions.Item>
<Descriptions.Item label={'账号'}>{userInfo.accountInfo.username}</Descriptions.Item>
<Descriptions.Item label={'账户状态'}>{userInfo.accountInfo.enable
? <Badge status={'success'} text={'已启用'}/>
: <Badge status={'error'} text={'已锁定'}/>}</Descriptions.Item>
<Descriptions.Item label={'手机号'}>
<Text
editable={{onChange: (value) => changeAccountInfo('changeInfo.account.phone', value)}}
>{userInfo.accountInfo.phone}</Text>
</Descriptions.Item>
<Descriptions.Item label={'密码状态'}>{userInfo.accountInfo.resetPassword
? <Badge status={'error'} text={'已过期'}/>
: <Badge status={'success'} text={'有效'}/>}</Descriptions.Item>
<Descriptions.Item
label={'用户角色'}>{userInfo.accountInfo.roleList.some(role => role.code === 'ADMIN') ? '管理员' : '普通用户'}</Descriptions.Item>
</Descriptions>
{
profile.staffNumber === userInfo.accountInfo.username ? <><Paragraph type={'secondary'}
style={{marginTop: 20}}>这是您自己的账号您不能对自己进行任何可能影响账号运转的操作</Paragraph> </>
: <Flex justify={"start"} align={"center"} wrap={true} gap={"middle"}
style={{marginTop: 20}}>
{
userInfo.accountInfo.enable
? <Button
onClick={() => changeAccountInfo('changeInfo.account.enabled', 'false')}
>禁用用户</Button>
: <Button
onClick={() => changeAccountInfo('changeInfo.account.enabled', 'true')}
>启用用户</Button>
}
<Popconfirm
title={'重置密码'}
description={'重置密码后,用户需要重新登录。'}
okText={'确认'}
cancelText={'算了'}
onConfirm={() => {
resetPassword();
}}
>
<Button>重置密码</Button>
</Popconfirm>
{
!userInfo.accountInfo.roleList.some(role => role.code === 'ADMIN')
? <Button
onClick={() => changeAccountInfo('changeInfo.account.role', 'ADMIN')}
>提升为管理员</Button>
: <Button
onClick={() => changeAccountInfo('changeInfo.account.role', 'UN-ADMIN')}
>降级为普通用户</Button>
}
</Flex>
}
</>
}
</Drawer>
</div>
);
};
AccountInfoDrawer.propTypes = {
open: PropTypes.bool.isRequired,
setOpen: PropTypes.func.isRequired,
userInfoDetails: PropTypes.object.isRequired,
commonAxios: PropTypes.object.isRequired,
messageApi: PropTypes.object.isRequired,
fetchUserInfoList: PropTypes.func.isRequired,
};
export default AccountInfoDrawer;

View File

@ -0,0 +1,153 @@
import React from 'react';
import PropTypes from 'prop-types';
import {Button, Divider, Drawer, Flex, Form, Input, Select, Typography, Upload} from "antd";
import {UploadOutlined} from "@ant-design/icons";
import baseWebConfig from "../../../config/BaseWebConfig";
const AddUserDrawer = props => {
const {open, setOpen, commonAxios, fetchUserInfoList, messageApi} = props;
const formLayout = {
labelCol: {span: 5},
wrapperCol: {span: 20},
};
const fileUploadProps = {
name: 'file',
action: window.BACKEND_ADDRESS || baseWebConfig.baseUrl + '/api/v1/teacher/import',
headers: {
authorization: `Bearer ${localStorage.getItem('token') || ''}`,
},
onChange(info) {
console.log(info);
if (info.file.status !== 'uploading') {
console.log(info.file, info.fileList);
}
if (info.file.status === 'done') {
messageApi.success(`${info.file.name} file uploaded successfully`);
} else if (info.file.status === 'error') {
messageApi.error(`${info.file.name} file upload failed.`);
}
},
};
const [form] = Form.useForm();
const {Title, Paragraph} = Typography;
const onSubmit = (values) => {
commonAxios.post('/api/v1/teacher/add', values).then(response => {
let result = response.data.data || false;
if (result) {
messageApi.success('添加教师信息成功');
setOpen(false);
fetchUserInfoList();
}
})
}
return (
<div>
<Drawer
open={open}
onClose={() => {
setOpen(false);
}}
title={'添加教师'}
destroyOnClose
>
<div>
<Title level={5}>单个添加</Title>
<Form
form={form}
{...formLayout}
onFinish={onSubmit}
>
<Form.Item
label="工号"
name="staffNumber"
rules={[{required: true, message: '请输入工号'}]}
>
<Input placeholder="请输入工号"/>
</Form.Item>
<Form.Item
label="姓名"
name="name"
rules={[{required: true, message: '请输入姓名'}]}
>
<Input placeholder="请输入姓名"/>
</Form.Item>
<Form.Item
label="性别"
name="gender"
rules={[{required: true, message: '请选择性别'}]}
>
<Select
placeholder="请选择性别"
options={[
{label: '男', value: '男'},
{label: '女', value: '女'},
]}
/>
</Form.Item>
<Form.Item
label="学院"
name="college"
rules={[{required: true, message: '请输入学院'}]}
>
<Input placeholder="请输入学院"/>
</Form.Item>
<Form.Item
label="专业"
name="department"
rules={[{required: true, message: '请输入专业名称'}]}
>
<Input placeholder="请输入专业"/>
</Form.Item>
<Form.Item
label="研究室"
name="researchRoom"
rules={[{required: true, message: '请输入研究室名称'}]}
>
<Input placeholder="请输入研究室名称"/>
</Form.Item>
<Form.Item
label="职称"
name="jobTitle"
rules={[{required: true, message: '请输入职称'}]}
>
<Input placeholder="请输入职称"/>
</Form.Item>
<Form.Item
label="身份证号"
name="idNumber"
rules={[{required: true, message: '请输入身份证号'}]}
>
<Input placeholder="请输入身份证号"/>
</Form.Item>
<Flex justify={"center"} align={"center"}>
<Button htmlType={'submit'} type={'primary'}>提交</Button>
</Flex>
</Form>
</div>
<Divider/>
<div>
<Title level={5}>批量添加</Title>
<Paragraph type={'danger'}>请使用Excel模板进行批量添加模板下载请点击<a
href={'/api/v1/teacher/download-template'}>这里</a></Paragraph>
<Upload {...fileUploadProps}>
<Button icon={<UploadOutlined/>}>上传Excel</Button>
</Upload>
</div>
</Drawer>
</div>
);
};
AddUserDrawer.propTypes = {
open: PropTypes.bool.isRequired,
setOpen: PropTypes.func.isRequired,
commonAxios: PropTypes.object.isRequired,
fetchUserInfoList: PropTypes.func.isRequired,
messageApi: PropTypes.object.isRequired
};
export default AddUserDrawer;

View File

@ -0,0 +1,69 @@
import React from 'react';
import PropTypes from 'prop-types';
import {Modal, Typography} from "antd";
const DeleteTeacherModal = props => {
const {open, setOpen, commonAxios, userInfo, fetchUserInfo, setDrawerOpen, messageApi} = props;
const {Title, Paragraph, Text} = Typography;
const [confirmLoading, setConfirmLoading] = React.useState(false);
const [cancelButtonProps, setCancelButtonProps] = React.useState({
disabled: false,
});
const onClose = () => {
setOpen(false);
}
const onSubmit = () => {
setConfirmLoading(true)
setCancelButtonProps({...cancelButtonProps, disabled: true});
let url = '/api/v1/teacher/delete/'
url += userInfo.staffNumber;
commonAxios.delete(url).then(response => {
let result = response.data.data || false;
if (result) {
messageApi.success('删除教师信息成功');
setDrawerOpen(false);
fetchUserInfo();
}
setOpen(false);
setConfirmLoading(false);
})
}
return (
<div>
<Modal
title={'删除教师'}
open={open}
onCancel={onClose}
confirmLoading={confirmLoading}
onOk={onSubmit}
cancelButtonProps={cancelButtonProps}
closable={false}
maskClosable={false}
cancelText={'取消'}
okText={'删除'}
>
<Text>确认删除该教师吗</Text>
<Paragraph type={'danger'}
strong={true}>删除后会同时删除该教师的账号但不会删除已生成的记录工作量记录等数据</Paragraph>
</Modal>
</div>
);
};
DeleteTeacherModal.propTypes = {
open: PropTypes.bool.isRequired,
setOpen: PropTypes.func.isRequired,
commonAxios: PropTypes.object.isRequired,
userInfo: PropTypes.object.isRequired,
fetchUserInfo: PropTypes.func.isRequired,
setDrawerOpen: PropTypes.func.isRequired,
messageApi: PropTypes.object.isRequired,
};
export default DeleteTeacherModal;

View File

@ -0,0 +1,110 @@
import React, {useCallback, useEffect} from 'react';
import PropTypes from 'prop-types';
import {Button, Flex, Form, Input, Select} from "antd";
import ResourceFinder from "../../../util/ResourceFinder";
import {debounce} from "lodash";
import {SearchOutlined, UndoOutlined} from "@ant-design/icons";
const QueryConditionForm = props => {
const {queryRequest, setQueryRequest, commonAxios} = props;
const [form] = Form.useForm();
const [collegeOptions, setCollegeOptions] = React.useState([]);
const fetchCollegeList = (keyword) => {
let attributes = null;
if (keyword) {
attributes = {
"keyword": keyword
}
}
let resourceFinder = new ResourceFinder('efc.workload.oms.user', 'efc.workload.oms.user.college.list', commonAxios, attributes);
resourceFinder.getResource().then(response => {
let collegeList = response.data.data.data || [];
let options = collegeList.map(item => {
return {
label: item,
value: item
}
})
setCollegeOptions(options);
})
}
const onSubmit = (values) => {
console.log(values)
setQueryRequest({
page: 1,
pageSize: 10,
staffNumber: values.staffNumber,
college: values.college,
})
}
const debouncedFetchCollegeList = useCallback(debounce(fetchCollegeList, 150), []);
useEffect(() => {
fetchCollegeList()
}, [props]);
return (
<div>
<Form
form={form}
onFinish={onSubmit}
layout={"inline"}
style={{
width: '100%',
display: "flex",
justifyContent: 'space-between',
alignItems: 'center'
}}
>
<Flex justify={"start"} align={"start"} gap={"small"}>
<Form.Item
label={'工号'}
name={'staffNumber'}
>
<Input
type="text"
placeholder={'输入工号或工号前缀查询'}
allowClear
style={{width: 240}}
/>
</Form.Item>
<Form.Item
label={'学院'}
name={'college'}
>
<Select
showSearch={true}
onSearch={debouncedFetchCollegeList}
allowClear
placeholder={'请选择学院'}
options={collegeOptions}
style={{width: 240}}
/>
</Form.Item>
</Flex>
<Flex justify={"flex-start"} align={"center"} gap={"middle"}>
<Form.Item>
<Flex justify={"flex-start"} align={"center"} gap={"middle"}>
<Button htmlType={"reset"} icon={<UndoOutlined/>}>重置</Button>
<Button htmlType={"submit"} type={'primary'} icon={<SearchOutlined/>}>搜索</Button>
</Flex>
</Form.Item>
</Flex>
</Form>
</div>
);
};
QueryConditionForm.propTypes = {
queryRequest: PropTypes.object.isRequired,
setQueryRequest: PropTypes.func.isRequired,
commonAxios: PropTypes.object.isRequired,
};
export default QueryConditionForm;

View File

@ -0,0 +1,44 @@
import React from 'react';
import PropTypes from 'prop-types';
import {Button, Flex, Modal, Typography} from "antd";
const ResetPasswordModal = props => {
const {newPassword, open, setOpen, setNewPassword} = props;
const {Paragraph, Title} = Typography;
const onClose = () => {
setOpen(false);
setNewPassword('');
}
return (
<div>
<Modal
title={'新密码'}
open={open}
onCancel={onClose}
onOk={onClose}
closable={false}
maskClosable={false}
okText={'关闭'}
footer={<Button key={'submit'} type={"primary"} onClick={onClose}>关闭</Button>}
>
<Flex justify={"center"} align={"center"}
style={{backgroundColor: '#f0f2f5', padding: 10, borderRadius: 8, margin: 10}}>
<Title level={1} copyable={true}>{newPassword}</Title>
</Flex>
<Paragraph type={'danger'}
strong={true}>新密码仅会显示一次请妥善保管未来不可再次查看</Paragraph>
</Modal>
</div>
);
};
ResetPasswordModal.propTypes = {
newPassword: PropTypes.string.isRequired,
open: PropTypes.bool.isRequired,
setOpen: PropTypes.func.isRequired,
setNewPassword: PropTypes.func.isRequired,
};
export default ResetPasswordModal;

View File

@ -0,0 +1,18 @@
import React from 'react';
import PropTypes from 'prop-types';
import {Badge} from "antd";
const TeacherRegistered = props => {
const {registered} = props;
return (
<div>
<Badge text={registered ? '已注册' : '未注册'} color={registered ? 'green' : 'red'}/>
</div>
);
};
TeacherRegistered.propTypes = {
registered: PropTypes.bool.isRequired,
};
export default TeacherRegistered;

View File

@ -0,0 +1,64 @@
import React from 'react';
import PropTypes from 'prop-types';
import {Button, Flex, Pagination, Spin, Table} from "antd";
import UserInfoTableColumn from "./UserInfoTableColumn";
import AccountInfoDrawer from "./AccountInfoDrawer";
import {UserAddOutlined} from "@ant-design/icons";
import AddUserDrawer from "./AddUserDrawer";
const UserInfoTable = props => {
const {fetchUserInfo, spinLoading, queryRequest, setQueryRequest, queryResponse, messageApi, commonAxios} = props;
const [drawerOpen, setDrawerOpen] = React.useState(false);
const [drawerUserInfo, setDrawerUserInfo] = React.useState({});
const [addUserDrawerOpen, setAddUserDrawerOpen] = React.useState(false);
const openUserInfoDetails = (record) => {
setDrawerOpen(true);
setDrawerUserInfo(record);
}
return (
<div>
<Flex justify={"space-between"} align={"center"} style={{marginBottom: 10}}>
<h3>教师管理</h3>
<Button shape={'round'} icon={<UserAddOutlined/>} type={'default'}
onClick={() => setAddUserDrawerOpen(true)}>添加教师</Button>
</Flex>
<AccountInfoDrawer fetchUserInfoList={fetchUserInfo} open={drawerOpen} setOpen={setDrawerOpen}
userInfoDetails={drawerUserInfo} commonAxios={commonAxios} messageApi={messageApi}/>
<AddUserDrawer open={addUserDrawerOpen} setOpen={setAddUserDrawerOpen} commonAxios={commonAxios}
fetchUserInfoList={fetchUserInfo} messageApi={messageApi}/>
<Spin spinning={spinLoading}>
<Table
columns={UserInfoTableColumn(openUserInfoDetails)}
dataSource={queryResponse.list}
pagination={false}
/>
</Spin>
<Pagination
defaultCurrent={1}
showSizeChanger
total={queryResponse.total}
align={'end'}
style={{marginTop: 20}}
onChange={(page, pageSize) => {
setQueryRequest({...queryRequest, page: page, size: pageSize});
}}
/>
</div>
);
};
UserInfoTable.propTypes = {
fetchUserInfo: PropTypes.func.isRequired,
spinLoading: PropTypes.bool.isRequired,
queryRequest: PropTypes.object.isRequired,
setQueryRequest: PropTypes.func.isRequired,
queryResponse: PropTypes.object.isRequired,
messageApi: PropTypes.object.isRequired,
commonAxios: PropTypes.object.isRequired,
};
export default UserInfoTable;

View File

@ -0,0 +1,67 @@
import {Button, Flex} from "antd";
import TeacherRegistered from "./TeacherRegistered";
const UserInfoTableColumn = (openUserInfoDetails) => [
{
title: 'id',
dataIndex: 'id',
key: 'id',
responsive: ['lg'],
render: (text) => <span key={text}>{text}</span>
},
{
title: '姓名',
dataIndex: 'name',
key: 'name',
render: (text) => <span key={text}>{text}</span>
},
{
title: '工号',
dataIndex: 'staffNumber',
key: 'staffNumber',
render: (text) => <span key={text}>{text}</span>
},
{
title: '学院',
dataIndex: 'college',
key: 'college',
responsive: ['lg'],
render: (text) => <span key={text}>{text}</span>
},
{
title: '专业',
dataIndex: 'department',
key: 'department',
responsive: ['lg'],
render: (text) => <span key={text}>{text}</span>
},
{
title: '研究室',
dataIndex: 'researchRoom',
key: 'researchRoom',
responsive: ['lg'],
render: (text) => <span key={text}>{text}</span>
},
{
title: '注册状态',
dataIndex: 'registered',
key: 'registered',
render: (text, record) => <span key={text}><TeacherRegistered registered={record.registered}/></span>
},
{
title: '操作',
dataIndex: 'options',
key: 'options',
responsive: ['lg'],
render: (text, record) => (
<>
<Flex justify={"start"} align={"center"}>
<Button type={"link"} onClick={() => openUserInfoDetails(record)}>查看详情</Button>
</Flex>
</>
)
},
]
export default UserInfoTableColumn;

View File

@ -0,0 +1,72 @@
import React, {useEffect} from 'react';
import CardDiv from "../../../component/CardDiv/CardDiv";
import {message} from "antd";
import UserInfoTable from "./UserInfoTable";
import creatMessageCommonAxios from "../../../http/CreatMessageCommonAxios";
import QueryConditionForm from "./QueryConditionForm";
const UserManagement = props => {
const [messageApi, contextHolder] = message.useMessage();
const commonAxios = creatMessageCommonAxios(messageApi);
const [queryRequest, setQueryRequest] = React.useState({
page: 1,
pageSize: 10,
staffNumber: null,
college: null,
});
const [queryResponse, setQueryResponse] = React.useState({});
const [spinLoading, setSpinLoading] = React.useState(true);
const fetchUserInfo = () => {
let url = `/api/v1/teacher/query`;
url += `?page=${queryRequest.page}&size=${queryRequest.pageSize}`;
if (queryRequest.staffNumber) {
url += `&staffNumber=${queryRequest.staffNumber}`;
}
if (queryRequest.college) {
url += `&college=${queryRequest.college}`;
}
commonAxios.get(url).then((response) => {
if (!response.data.data) {
setSpinLoading(false)
setQueryResponse({});
return
}
let workloadData = response.data.data || {};
console.log(workloadData)
setQueryResponse(workloadData);
setSpinLoading(false)
});
}
useEffect(() => {
setSpinLoading(true)
fetchUserInfo();
}, [queryRequest]);
return (
<div>
{contextHolder}
<CardDiv>
<QueryConditionForm queryRequest={queryRequest} setQueryRequest={setQueryRequest}
commonAxios={commonAxios}/>
</CardDiv>
<CardDiv>
<UserInfoTable
fetchUserInfo={fetchUserInfo}
spinLoading={spinLoading}
queryRequest={queryRequest}
setQueryRequest={setQueryRequest}
queryResponse={queryResponse}
messageApi={messageApi}
commonAxios={commonAxios}/>
</CardDiv>
</div>
);
};
UserManagement.propTypes = {};
export default UserManagement;

View File

@ -0,0 +1,118 @@
import React, {useEffect, useState} from 'react';
import {Col, Divider, Flex, Layout, message, Row, theme, Typography} from 'antd';
import MobileHeader from "../../component/Header/MobileHeader";
import LayoutHeader from "../../component/Header/LayoutHeader";
import DashboardMenu from "../../component/Menu/DashboardMenu";
import {Outlet, useLocation} from 'react-router-dom';
import creatMessageCommonAxios from "../../http/CreatMessageCommonAxios";
const {Content, Sider} = Layout;
const App = () => {
const {
token: {colorBgContainer, borderRadiusLG, colorBgBase},
} = theme.useToken();
const location = useLocation();
const pathnames = location.pathname.split('/').filter(x => x);
const [messageApi, contextHolder] = message.useMessage();
const [collapsed, setCollapsed] = useState(false);
const [profile, setProfile] = useState(
{
id: 3,
name: '',
staffNumber: '',
}
);
const commonAxios = creatMessageCommonAxios(messageApi);
useEffect(() => {
commonAxios.get('/api/auth/profile').then((response) => {
if(response.data.data != null) {
setProfile({
id: response.data.data.id,
name: response.data.data.name,
staffNumber: response.data.data.staffNumber
});
}
});
}, []);
return (
<Layout style={{height: '100%'}}>
{contextHolder}
<Row>
<Col xs={0} lg={24}>
<LayoutHeader profile={profile} commonAxios={commonAxios} messageApi={messageApi}/>
</Col>
<Col xs={24} lg={0}>
<MobileHeader profile={profile} commonAxios={commonAxios} messageApi={messageApi}/>
</Col>
</Row>
<Layout style={{height: '100%'}}>
<Sider
width={200}
style={{
background: colorBgContainer
}}
breakpoint="lg"
collapsedWidth="0"
onBreakpoint={(broken) => {
console.log(broken);
}}
onCollapse={(collapsed, type) => {
console.log(collapsed, type);
}}
>
<DashboardMenu/>
</Sider>
<Layout
style={{
padding: '0 24px 24px',
}}
>
<Content
style={{
padding: 24,
marginTop: 20,
minHeight: 280,
borderRadius: borderRadiusLG,
overflow: 'auto',
scrollbarWidth: 'thin',
scrollbarColor: '#888 #f5f5f5',
'&::-webkit-scrollbar': {
width: '8px',
},
'&::-webkit-scrollbar-track': {
background: '#f5f5f5',
},
'&::-webkit-scrollbar-thumb': {
background: '#888',
borderRadius: '4px',
},
'&::-webkit-scrollbar-thumb:hover': {
background: '#555',
},
}}
>
<Outlet style={{position: 'relative'}}/>
<Layout.Footer style={{background: 'rgba(0,0,0,0)'}}>
<Divider/>
<Flex vertical justify={'center'} align={'center'} wrap={"wrap"}>
<Typography.Text type={"secondary"}>
Version 1.2.x</Typography.Text>
<Typography.Text type={"secondary"}>Educational Fusion Cloud -- Workload
Statistics</Typography.Text>
<Typography.Text type={"secondary"}>Powered by ©2023
- {new Date().getFullYear()} SimRobot Studio</Typography.Text>
</Flex>
</Layout.Footer>
</Content>
</Layout>
</Layout>
</Layout>
);
};
export default App;

13
src/reportWebVitals.js Normal file
View File

@ -0,0 +1,13 @@
const reportWebVitals = onPerfEntry => {
if (onPerfEntry && onPerfEntry instanceof Function) {
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
getCLS(onPerfEntry);
getFID(onPerfEntry);
getFCP(onPerfEntry);
getLCP(onPerfEntry);
getTTFB(onPerfEntry);
});
}
};
export default reportWebVitals;

13
src/routes/AuthRoutes.js Normal file
View File

@ -0,0 +1,13 @@
import Login from "../page/Authentication/Login";
const AuthRoutes = {
path: '/auth',
children: [
{
path: 'login',
element: <Login/>
}
]
}
export default AuthRoutes;

View File

@ -0,0 +1,56 @@
import Dashboard from "../page/Dashboard";
import Overview from "../page/Dashboard/Overview";
import DataCheck from "../page/Dashboard/DataCheck";
import DataPrint from "../page/Dashboard/DataPrint";
import DataManager from "../page/Dashboard/DataManager";
import {Navigate} from "react-router-dom";
import SystemSettings from "../page/Dashboard/SystemSettings";
import GenerateCertificate from "../page/Dashboard/GenerateCertificate";
import UserManagement from "../page/Dashboard/UserManagement";
import AboutUs from "../page/Dashboard/AboutUs";
const DashboardRoutes = {
path: '/',
element: <Dashboard/>,
children: [
{
path: '/',
element: <Navigate to="/overview" replace/>,
index: true
},
{
path: 'overview',
element: <Overview/>
},
{
path: 'data-check',
element: <DataCheck/>
},
{
path: 'data-print',
element: <DataPrint/>,
},
{
path: 'data-maintenance',
element: <DataManager/>
},
{
path: 'system-settings',
element: <SystemSettings/>
},
{
path: 'generate-certificate',
element: <GenerateCertificate />
},
{
path: 'user-management',
element: <UserManagement/>
},
{
path: 'about-us',
element: <AboutUs/>
},
]
}
export default DashboardRoutes;

7
src/routes/index.js Normal file
View File

@ -0,0 +1,7 @@
import {useRoutes} from "react-router-dom";
import AuthRoutes from "./AuthRoutes";
import DashboardRoutes from "./DashboardRoutes";
export default function Routers() {
return useRoutes([DashboardRoutes, AuthRoutes])
}

5
src/setupTests.js Normal file
View File

@ -0,0 +1,5 @@
// jest-dom adds custom jest matchers for asserting on DOM nodes.
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom';

13
src/util/DateFormater.js Normal file
View File

@ -0,0 +1,13 @@
const DateFormater = (isoDate) => {
const date = new Date(isoDate);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
export default DateFormater;

View File

@ -0,0 +1,23 @@
class ResourceFinder {
constructor(type, subType, axiosInstance, attributes) {
this.type = type;
this.subType = subType;
this.attributes = attributes;
this.axiosInstance = axiosInstance;
}
getResource() {
let body = {
type: this.type,
subType: this.subType,
attributes: null,
};
if (this.attributes) {
body.attributes = this.attributes;
}
return this.axiosInstance.post(`/api/v1/common/res/query`, body);
}
}
export default ResourceFinder;