+
+
+
diff --git a/data/log/.keep b/data/log/.keep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/data/log/2024-4-25.txt b/data/log/2024-4-25.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5bee8c795bc792ba881a66920388277ba529215b
--- /dev/null
+++ b/data/log/2024-4-25.txt
@@ -0,0 +1,14 @@
+{'time': 1714049809.1000438, 'text': '--------------------------------'}
+{'time': 1714049809.1090915, 'text': 'Start File Lock'}
+{'time': 1714049809.110092, 'text': 'exit: Use Admin to run'}
+{'time': 1714049818.9306526, 'text': '--------------------------------'}
+{'time': 1714049818.9376829, 'text': 'Start File Lock'}
+{'time': 1714049818.9397085, 'text': 'exit: Use Admin to run'}
+{'time': 1714049857.8656344, 'text': '--------------------------------'}
+{'time': 1714049857.8736348, 'text': 'Start File Lock'}
+{'time': 1714050400.7416077, 'text': '--------------------------------'}
+{'time': 1714050400.7606223, 'text': 'Start File Lock'}
+{'time': 1714050420.7463977, 'text': '--------------------------------'}
+{'time': 1714050420.7533998, 'text': 'Start File Lock'}
+{'time': 1714050433.7075903, 'text': '--------------------------------'}
+{'time': 1714050433.7135906, 'text': 'Start File Lock'}
diff --git a/data/log/2024-4-27.txt b/data/log/2024-4-27.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fc8c819e706adefb7b651ffeae0a1199f9c5a39a
--- /dev/null
+++ b/data/log/2024-4-27.txt
@@ -0,0 +1,32 @@
+{'time': 1714197127.6111367, 'text': '--------------------------------'}
+{'time': 1714197127.6231368, 'text': 'Start File Lock'}
+{'time': 1714197127.624137, 'text': 'exit: Use Admin to run'}
+{'time': 1714197163.3287535, 'text': '--------------------------------'}
+{'time': 1714197163.3347538, 'text': 'Start File Lock'}
+{'time': 1714197179.8198972, 'text': 'Install False'}
+{'time': 1714197214.6632016, 'text': '--------------------------------'}
+{'time': 1714197214.6712015, 'text': 'Start File Lock'}
+{'time': 1714197214.6722016, 'text': 'Start QPanel'}
+{'time': 1714197244.3334582, 'text': '--------------------------------'}
+{'time': 1714197244.3534567, 'text': 'Start File Lock'}
+{'time': 1714197247.638893, 'text': '--------------------------------'}
+{'time': 1714197247.6448927, 'text': 'Start File Lock'}
+{'time': 1714197247.646893, 'text': 'Start QPanel'}
+{'time': 1714197305.44406, 'text': '--------------------------------'}
+{'time': 1714197305.4520605, 'text': 'Start File Lock'}
+{'time': 1714197305.4520605, 'text': 'Start QPanel'}
+{'time': 1714198723.392203, 'text': '--------------------------------'}
+{'time': 1714198723.4002562, 'text': 'Start File Lock'}
+{'time': 1714198723.401256, 'text': 'Start QPanel'}
+{'time': 1714198741.0294638, 'text': '--------------------------------'}
+{'time': 1714198741.0354998, 'text': 'Start File Lock'}
+{'time': 1714198741.0365307, 'text': 'Start QPanel'}
+{'time': 1714198779.2207742, 'text': '--------------------------------'}
+{'time': 1714198779.2262907, 'text': 'Start File Lock'}
+{'time': 1714198779.2273176, 'text': 'Start QPanel'}
+{'time': 1714198918.448512, 'text': '--------------------------------'}
+{'time': 1714198918.454539, 'text': 'Start File Lock'}
+{'time': 1714198918.4555702, 'text': 'Start QPanel'}
+{'time': 1714198969.2535493, 'text': '--------------------------------'}
+{'time': 1714198969.2595725, 'text': 'Start File Lock'}
+{'time': 1714198969.2605755, 'text': 'Start QPanel'}
diff --git a/dist/main/_internal/VCRUNTIME140.dll b/dist/main/_internal/VCRUNTIME140.dll
new file mode 100644
index 0000000000000000000000000000000000000000..7d9accfa9762302e9c233241a1c4bc2771952b2d
Binary files /dev/null and b/dist/main/_internal/VCRUNTIME140.dll differ
diff --git a/dist/main/_internal/VCRUNTIME140_1.dll b/dist/main/_internal/VCRUNTIME140_1.dll
new file mode 100644
index 0000000000000000000000000000000000000000..a45248b1f9e32b4f6051fea8eb1dce1856296896
Binary files /dev/null and b/dist/main/_internal/VCRUNTIME140_1.dll differ
diff --git a/dist/main/_internal/_asyncio.pyd b/dist/main/_internal/_asyncio.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..abb67769cc96dc2c3206b90d90d047942444c622
Binary files /dev/null and b/dist/main/_internal/_asyncio.pyd differ
diff --git a/dist/main/_internal/_bz2.pyd b/dist/main/_internal/_bz2.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..7c64d7210f6fc1db499b78539de183961c375c0f
Binary files /dev/null and b/dist/main/_internal/_bz2.pyd differ
diff --git a/dist/main/_internal/_ctypes.pyd b/dist/main/_internal/_ctypes.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..497d875f169b0ec47ccca2ad2c9153822343a196
Binary files /dev/null and b/dist/main/_internal/_ctypes.pyd differ
diff --git a/dist/main/_internal/_decimal.pyd b/dist/main/_internal/_decimal.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..98235e954c77fbef8428ae718f2196b6de69e8cd
Binary files /dev/null and b/dist/main/_internal/_decimal.pyd differ
diff --git a/dist/main/_internal/_hashlib.pyd b/dist/main/_internal/_hashlib.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..190edaa751366d745907e10d2b2f6beddf1f4db3
Binary files /dev/null and b/dist/main/_internal/_hashlib.pyd differ
diff --git a/dist/main/_internal/_lzma.pyd b/dist/main/_internal/_lzma.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..63dc3b8e9b28e30e04e3a3e6f2a2fe59d0cbbc48
Binary files /dev/null and b/dist/main/_internal/_lzma.pyd differ
diff --git a/dist/main/_internal/_multiprocessing.pyd b/dist/main/_internal/_multiprocessing.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..f620c486d21b2926e3421ce34d7505248b6ecf40
Binary files /dev/null and b/dist/main/_internal/_multiprocessing.pyd differ
diff --git a/dist/main/_internal/_overlapped.pyd b/dist/main/_internal/_overlapped.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..575a4a133bc8e94ada486a5e5f70829d821f6356
Binary files /dev/null and b/dist/main/_internal/_overlapped.pyd differ
diff --git a/dist/main/_internal/_queue.pyd b/dist/main/_internal/_queue.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..55681758b021ddb60b86b6b5d037dd3a8bbd81f2
Binary files /dev/null and b/dist/main/_internal/_queue.pyd differ
diff --git a/dist/main/_internal/_socket.pyd b/dist/main/_internal/_socket.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..9cce8c565110b38d70e1969c4a0454dc0c8c45eb
Binary files /dev/null and b/dist/main/_internal/_socket.pyd differ
diff --git a/dist/main/_internal/_ssl.pyd b/dist/main/_internal/_ssl.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..bd6d787ca58bd721926e6bbddba803007d8736dd
Binary files /dev/null and b/dist/main/_internal/_ssl.pyd differ
diff --git a/dist/main/_internal/base_library.zip b/dist/main/_internal/base_library.zip
new file mode 100644
index 0000000000000000000000000000000000000000..29e938d840e53dbcb955fd3d273b465324d1a68a
Binary files /dev/null and b/dist/main/_internal/base_library.zip differ
diff --git a/dist/main/_internal/flask-3.0.3.dist-info/INSTALLER b/dist/main/_internal/flask-3.0.3.dist-info/INSTALLER
new file mode 100644
index 0000000000000000000000000000000000000000..a1b589e38a32041e49332e5e81c2d363dc418d68
--- /dev/null
+++ b/dist/main/_internal/flask-3.0.3.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/dist/main/_internal/flask-3.0.3.dist-info/LICENSE.txt b/dist/main/_internal/flask-3.0.3.dist-info/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9d227a0cc43c3268d15722b763bd94ad298645a1
--- /dev/null
+++ b/dist/main/_internal/flask-3.0.3.dist-info/LICENSE.txt
@@ -0,0 +1,28 @@
+Copyright 2010 Pallets
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/dist/main/_internal/flask-3.0.3.dist-info/METADATA b/dist/main/_internal/flask-3.0.3.dist-info/METADATA
new file mode 100644
index 0000000000000000000000000000000000000000..5a02107246ee8047a2bd0b7ce221535a6bd23237
--- /dev/null
+++ b/dist/main/_internal/flask-3.0.3.dist-info/METADATA
@@ -0,0 +1,101 @@
+Metadata-Version: 2.1
+Name: Flask
+Version: 3.0.3
+Summary: A simple framework for building complex web applications.
+Maintainer-email: Pallets
+Requires-Python: >=3.8
+Description-Content-Type: text/markdown
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Framework :: Flask
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
+Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
+Classifier: Typing :: Typed
+Requires-Dist: Werkzeug>=3.0.0
+Requires-Dist: Jinja2>=3.1.2
+Requires-Dist: itsdangerous>=2.1.2
+Requires-Dist: click>=8.1.3
+Requires-Dist: blinker>=1.6.2
+Requires-Dist: importlib-metadata>=3.6.0; python_version < '3.10'
+Requires-Dist: asgiref>=3.2 ; extra == "async"
+Requires-Dist: python-dotenv ; extra == "dotenv"
+Project-URL: Changes, https://flask.palletsprojects.com/changes/
+Project-URL: Chat, https://discord.gg/pallets
+Project-URL: Documentation, https://flask.palletsprojects.com/
+Project-URL: Donate, https://palletsprojects.com/donate
+Project-URL: Source, https://github.com/pallets/flask/
+Provides-Extra: async
+Provides-Extra: dotenv
+
+# Flask
+
+Flask is a lightweight [WSGI][] web application framework. It is designed
+to make getting started quick and easy, with the ability to scale up to
+complex applications. It began as a simple wrapper around [Werkzeug][]
+and [Jinja][], and has become one of the most popular Python web
+application frameworks.
+
+Flask offers suggestions, but doesn't enforce any dependencies or
+project layout. It is up to the developer to choose the tools and
+libraries they want to use. There are many extensions provided by the
+community that make adding new functionality easy.
+
+[WSGI]: https://wsgi.readthedocs.io/
+[Werkzeug]: https://werkzeug.palletsprojects.com/
+[Jinja]: https://jinja.palletsprojects.com/
+
+
+## Installing
+
+Install and update from [PyPI][] using an installer such as [pip][]:
+
+```
+$ pip install -U Flask
+```
+
+[PyPI]: https://pypi.org/project/Flask/
+[pip]: https://pip.pypa.io/en/stable/getting-started/
+
+
+## A Simple Example
+
+```python
+# save this as app.py
+from flask import Flask
+
+app = Flask(__name__)
+
+@app.route("/")
+def hello():
+ return "Hello, World!"
+```
+
+```
+$ flask run
+ * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
+```
+
+
+## Contributing
+
+For guidance on setting up a development environment and how to make a
+contribution to Flask, see the [contributing guidelines][].
+
+[contributing guidelines]: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst
+
+
+## Donate
+
+The Pallets organization develops and supports Flask and the libraries
+it uses. In order to grow the community of contributors and users, and
+allow the maintainers to devote more time to the projects, [please
+donate today][].
+
+[please donate today]: https://palletsprojects.com/donate
+
diff --git a/dist/main/_internal/flask-3.0.3.dist-info/RECORD b/dist/main/_internal/flask-3.0.3.dist-info/RECORD
new file mode 100644
index 0000000000000000000000000000000000000000..09ff7f0dea67e5819be8848b8b0d6d233d7e80c1
--- /dev/null
+++ b/dist/main/_internal/flask-3.0.3.dist-info/RECORD
@@ -0,0 +1,58 @@
+../../Scripts/flask.exe,sha256=zmxZSOfMRYJhBifiManlOHC66PLmbMZkyhES0pyUhUw,108425
+flask-3.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+flask-3.0.3.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
+flask-3.0.3.dist-info/METADATA,sha256=exPahy4aahjV-mYqd9qb5HNP8haB_IxTuaotoSvCtag,3177
+flask-3.0.3.dist-info/RECORD,,
+flask-3.0.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask-3.0.3.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
+flask-3.0.3.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40
+flask/__init__.py,sha256=6xMqdVA0FIQ2U1KVaGX3lzNCdXPzoHPaa0hvQCNcfSk,2625
+flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30
+flask/__pycache__/__init__.cpython-38.pyc,,
+flask/__pycache__/__main__.cpython-38.pyc,,
+flask/__pycache__/app.cpython-38.pyc,,
+flask/__pycache__/blueprints.cpython-38.pyc,,
+flask/__pycache__/cli.cpython-38.pyc,,
+flask/__pycache__/config.cpython-38.pyc,,
+flask/__pycache__/ctx.cpython-38.pyc,,
+flask/__pycache__/debughelpers.cpython-38.pyc,,
+flask/__pycache__/globals.cpython-38.pyc,,
+flask/__pycache__/helpers.cpython-38.pyc,,
+flask/__pycache__/logging.cpython-38.pyc,,
+flask/__pycache__/sessions.cpython-38.pyc,,
+flask/__pycache__/signals.cpython-38.pyc,,
+flask/__pycache__/templating.cpython-38.pyc,,
+flask/__pycache__/testing.cpython-38.pyc,,
+flask/__pycache__/typing.cpython-38.pyc,,
+flask/__pycache__/views.cpython-38.pyc,,
+flask/__pycache__/wrappers.cpython-38.pyc,,
+flask/app.py,sha256=7-lh6cIj27riTE1Q18Ok1p5nOZ8qYiMux4Btc6o6mNc,60143
+flask/blueprints.py,sha256=7INXPwTkUxfOQXOOv1yu52NpHPmPGI5fMTMFZ-BG9yY,4430
+flask/cli.py,sha256=OOaf_Efqih1i2in58j-5ZZZmQnPpaSfiUFbEjlL9bzw,35825
+flask/config.py,sha256=bLzLVAj-cq-Xotu9erqOFte0xSFaVXyfz0AkP4GbwmY,13312
+flask/ctx.py,sha256=4atDhJJ_cpV1VMq4qsfU4E_61M1oN93jlS2H9gjrl58,15120
+flask/debughelpers.py,sha256=PGIDhStW_efRjpaa3zHIpo-htStJOR41Ip3OJWPYBwo,6080
+flask/globals.py,sha256=XdQZmStBmPIs8t93tjx6pO7Bm3gobAaONWkFcUHaGas,1713
+flask/helpers.py,sha256=tYrcQ_73GuSZVEgwFr-eMmV69UriFQDBmt8wZJIAqvg,23084
+flask/json/__init__.py,sha256=hLNR898paqoefdeAhraa5wyJy-bmRB2k2dV4EgVy2Z8,5602
+flask/json/__pycache__/__init__.cpython-38.pyc,,
+flask/json/__pycache__/provider.cpython-38.pyc,,
+flask/json/__pycache__/tag.cpython-38.pyc,,
+flask/json/provider.py,sha256=q6iB83lSiopy80DZPrU-9mGcWwrD0mvLjiv9fHrRZgc,7646
+flask/json/tag.py,sha256=DhaNwuIOhdt2R74oOC9Y4Z8ZprxFYiRb5dUP5byyINw,9281
+flask/logging.py,sha256=8sM3WMTubi1cBb2c_lPkWpN0J8dMAqrgKRYLLi1dCVI,2377
+flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask/sansio/README.md,sha256=-0X1tECnilmz1cogx-YhNw5d7guK7GKrq_DEV2OzlU0,228
+flask/sansio/__pycache__/app.cpython-38.pyc,,
+flask/sansio/__pycache__/blueprints.cpython-38.pyc,,
+flask/sansio/__pycache__/scaffold.cpython-38.pyc,,
+flask/sansio/app.py,sha256=YG5Gf7JVf1c0yccWDZ86q5VSfJUidOVp27HFxFNxC7U,38053
+flask/sansio/blueprints.py,sha256=Tqe-7EkZ-tbWchm8iDoCfD848f0_3nLv6NNjeIPvHwM,24637
+flask/sansio/scaffold.py,sha256=WLV9TRQMMhGlXz-1OKtQ3lv6mtIBQZxdW2HezYrGxoI,30633
+flask/sessions.py,sha256=RU4lzm9MQW9CtH8rVLRTDm8USMJyT4LbvYe7sxM2__k,14807
+flask/signals.py,sha256=V7lMUww7CqgJ2ThUBn1PiatZtQanOyt7OZpu2GZI-34,750
+flask/templating.py,sha256=2TcXLT85Asflm2W9WOSFxKCmYn5e49w_Jkg9-NaaJWo,7537
+flask/testing.py,sha256=3BFXb3bP7R5r-XLBuobhczbxDu8-1LWRzYuhbr-lwaE,10163
+flask/typing.py,sha256=ZavK-wV28Yv8CQB7u73qZp_jLalpbWdrXS37QR1ftN0,3190
+flask/views.py,sha256=B66bTvYBBcHMYk4dA1ScZD0oTRTBl0I5smp1lRm9riI,6939
+flask/wrappers.py,sha256=m1j5tIJxIu8_sPPgTAB_G4TTh52Q-HoDuw_qHV5J59g,5831
diff --git a/dist/main/_internal/flask-3.0.3.dist-info/REQUESTED b/dist/main/_internal/flask-3.0.3.dist-info/REQUESTED
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/dist/main/_internal/flask-3.0.3.dist-info/WHEEL b/dist/main/_internal/flask-3.0.3.dist-info/WHEEL
new file mode 100644
index 0000000000000000000000000000000000000000..3b5e64b5e6c4a210201d1676a891fd57b15cda99
--- /dev/null
+++ b/dist/main/_internal/flask-3.0.3.dist-info/WHEEL
@@ -0,0 +1,4 @@
+Wheel-Version: 1.0
+Generator: flit 3.9.0
+Root-Is-Purelib: true
+Tag: py3-none-any
diff --git a/dist/main/_internal/flask-3.0.3.dist-info/entry_points.txt b/dist/main/_internal/flask-3.0.3.dist-info/entry_points.txt
new file mode 100644
index 0000000000000000000000000000000000000000..eec6733e577feb9487435b9722713a820bd4ccc1
--- /dev/null
+++ b/dist/main/_internal/flask-3.0.3.dist-info/entry_points.txt
@@ -0,0 +1,3 @@
+[console_scripts]
+flask=flask.cli:main
+
diff --git a/dist/main/_internal/importlib_metadata-7.1.0.dist-info/INSTALLER b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/INSTALLER
new file mode 100644
index 0000000000000000000000000000000000000000..a1b589e38a32041e49332e5e81c2d363dc418d68
--- /dev/null
+++ b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/dist/main/_internal/importlib_metadata-7.1.0.dist-info/LICENSE b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..d645695673349e3947e8e5ae42332d0ac3164cd7
--- /dev/null
+++ b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/dist/main/_internal/importlib_metadata-7.1.0.dist-info/METADATA b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/METADATA
new file mode 100644
index 0000000000000000000000000000000000000000..201ed4906c8f3a7e7875686de6d536210991df29
--- /dev/null
+++ b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/METADATA
@@ -0,0 +1,129 @@
+Metadata-Version: 2.1
+Name: importlib_metadata
+Version: 7.1.0
+Summary: Read metadata from Python packages
+Home-page: https://github.com/python/importlib_metadata
+Author: Jason R. Coombs
+Author-email: jaraco@jaraco.com
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3 :: Only
+Requires-Python: >=3.8
+License-File: LICENSE
+Requires-Dist: zipp >=0.5
+Requires-Dist: typing-extensions >=3.6.4 ; python_version < "3.8"
+Provides-Extra: docs
+Requires-Dist: sphinx >=3.5 ; extra == 'docs'
+Requires-Dist: jaraco.packaging >=9.3 ; extra == 'docs'
+Requires-Dist: rst.linker >=1.9 ; extra == 'docs'
+Requires-Dist: furo ; extra == 'docs'
+Requires-Dist: sphinx-lint ; extra == 'docs'
+Requires-Dist: jaraco.tidelift >=1.4 ; extra == 'docs'
+Provides-Extra: perf
+Requires-Dist: ipython ; extra == 'perf'
+Provides-Extra: testing
+Requires-Dist: pytest >=6 ; extra == 'testing'
+Requires-Dist: pytest-checkdocs >=2.4 ; extra == 'testing'
+Requires-Dist: pytest-cov ; extra == 'testing'
+Requires-Dist: pytest-enabler >=2.2 ; extra == 'testing'
+Requires-Dist: pytest-ruff >=0.2.1 ; extra == 'testing'
+Requires-Dist: packaging ; extra == 'testing'
+Requires-Dist: pyfakefs ; extra == 'testing'
+Requires-Dist: flufl.flake8 ; extra == 'testing'
+Requires-Dist: pytest-perf >=0.9.2 ; extra == 'testing'
+Requires-Dist: jaraco.test >=5.4 ; extra == 'testing'
+Requires-Dist: pytest-mypy ; (platform_python_implementation != "PyPy") and extra == 'testing'
+Requires-Dist: importlib-resources >=1.3 ; (python_version < "3.9") and extra == 'testing'
+
+.. image:: https://img.shields.io/pypi/v/importlib_metadata.svg
+ :target: https://pypi.org/project/importlib_metadata
+
+.. image:: https://img.shields.io/pypi/pyversions/importlib_metadata.svg
+
+.. image:: https://github.com/python/importlib_metadata/actions/workflows/main.yml/badge.svg
+ :target: https://github.com/python/importlib_metadata/actions?query=workflow%3A%22tests%22
+ :alt: tests
+
+.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json
+ :target: https://github.com/astral-sh/ruff
+ :alt: Ruff
+
+.. image:: https://readthedocs.org/projects/importlib-metadata/badge/?version=latest
+ :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest
+
+.. image:: https://img.shields.io/badge/skeleton-2024-informational
+ :target: https://blog.jaraco.com/skeleton
+
+.. image:: https://tidelift.com/badges/package/pypi/importlib-metadata
+ :target: https://tidelift.com/subscription/pkg/pypi-importlib-metadata?utm_source=pypi-importlib-metadata&utm_medium=readme
+
+Library to access the metadata for a Python package.
+
+This package supplies third-party access to the functionality of
+`importlib.metadata `_
+including improvements added to subsequent Python versions.
+
+
+Compatibility
+=============
+
+New features are introduced in this third-party library and later merged
+into CPython. The following table indicates which versions of this library
+were contributed to different versions in the standard library:
+
+.. list-table::
+ :header-rows: 1
+
+ * - importlib_metadata
+ - stdlib
+ * - 7.0
+ - 3.13
+ * - 6.5
+ - 3.12
+ * - 4.13
+ - 3.11
+ * - 4.6
+ - 3.10
+ * - 1.4
+ - 3.8
+
+
+Usage
+=====
+
+See the `online documentation `_
+for usage details.
+
+`Finder authors
+`_ can
+also add support for custom package installers. See the above documentation
+for details.
+
+
+Caveats
+=======
+
+This project primarily supports third-party packages installed by PyPA
+tools (or other conforming packages). It does not support:
+
+- Packages in the stdlib.
+- Packages installed without metadata.
+
+Project details
+===============
+
+ * Project home: https://github.com/python/importlib_metadata
+ * Report bugs at: https://github.com/python/importlib_metadata/issues
+ * Code hosting: https://github.com/python/importlib_metadata
+ * Documentation: https://importlib-metadata.readthedocs.io/
+
+For Enterprise
+==============
+
+Available as part of the Tidelift Subscription.
+
+This project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.
+
+`Learn more `_.
diff --git a/dist/main/_internal/importlib_metadata-7.1.0.dist-info/RECORD b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/RECORD
new file mode 100644
index 0000000000000000000000000000000000000000..19e4d3204893ba4bbd6bbe37dd9f87f251b5f0c4
--- /dev/null
+++ b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/RECORD
@@ -0,0 +1,29 @@
+importlib_metadata-7.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+importlib_metadata-7.1.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
+importlib_metadata-7.1.0.dist-info/METADATA,sha256=E4z5cKjydu7RGKbGvm876vG3Lxhd55OcXDhGoka7drQ,4690
+importlib_metadata-7.1.0.dist-info/RECORD,,
+importlib_metadata-7.1.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
+importlib_metadata-7.1.0.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19
+importlib_metadata/__init__.py,sha256=lAFrEbJHarqSCdkubZebZSDAe20ES_h-ZFqVyv4bn8Y,34302
+importlib_metadata/__pycache__/__init__.cpython-38.pyc,,
+importlib_metadata/__pycache__/_adapters.cpython-38.pyc,,
+importlib_metadata/__pycache__/_collections.cpython-38.pyc,,
+importlib_metadata/__pycache__/_compat.cpython-38.pyc,,
+importlib_metadata/__pycache__/_functools.cpython-38.pyc,,
+importlib_metadata/__pycache__/_itertools.cpython-38.pyc,,
+importlib_metadata/__pycache__/_meta.cpython-38.pyc,,
+importlib_metadata/__pycache__/_text.cpython-38.pyc,,
+importlib_metadata/__pycache__/diagnose.cpython-38.pyc,,
+importlib_metadata/_adapters.py,sha256=jZr_CmHrl8qTGatO0yMmuOdfFExOY64G8eEYf6Cnj9k,2455
+importlib_metadata/_collections.py,sha256=CJ0OTCHIjWA0ZIVS4voORAsn2R4R2cQBEtPsZEJpASY,743
+importlib_metadata/_compat.py,sha256=73QKrN9KNoaZzhbX5yPCCZa-FaALwXe8TPlDR72JgBU,1314
+importlib_metadata/_functools.py,sha256=PsY2-4rrKX4RVeRC1oGp1lB1pmC9eKN88_f-bD9uOoA,2895
+importlib_metadata/_itertools.py,sha256=cvr_2v8BRbxcIl5x5ldfqdHjhI8Yi8s8yk50G_nm6jQ,2068
+importlib_metadata/_meta.py,sha256=nxZ7C8GVlcBFAKWyVOn_dn7ot_twBcbm1NmvjIetBHI,1801
+importlib_metadata/_text.py,sha256=HCsFksZpJLeTP3NEk_ngrAeXVRRtTrtyh9eOABoRP4A,2166
+importlib_metadata/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_metadata/compat/__pycache__/__init__.cpython-38.pyc,,
+importlib_metadata/compat/__pycache__/py39.cpython-38.pyc,,
+importlib_metadata/compat/py39.py,sha256=cPkMv6-0ilK-0Jw_Tkn0xYbOKJZc4WJKQHow0c2T44w,1102
+importlib_metadata/diagnose.py,sha256=nkSRMiowlmkhLYhKhvCg9glmt_11Cox-EmLzEbqYTa8,379
+importlib_metadata/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
diff --git a/dist/main/_internal/importlib_metadata-7.1.0.dist-info/WHEEL b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/WHEEL
new file mode 100644
index 0000000000000000000000000000000000000000..bab98d675883cc7567a79df485cd7b4f015e376f
--- /dev/null
+++ b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.43.0)
+Root-Is-Purelib: true
+Tag: py3-none-any
+
diff --git a/dist/main/_internal/importlib_metadata-7.1.0.dist-info/top_level.txt b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/top_level.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bbb07547a19c30031d13c45cf01cba61dc434e47
--- /dev/null
+++ b/dist/main/_internal/importlib_metadata-7.1.0.dist-info/top_level.txt
@@ -0,0 +1 @@
+importlib_metadata
diff --git a/dist/main/_internal/itsdangerous-2.2.0.dist-info/INSTALLER b/dist/main/_internal/itsdangerous-2.2.0.dist-info/INSTALLER
new file mode 100644
index 0000000000000000000000000000000000000000..a1b589e38a32041e49332e5e81c2d363dc418d68
--- /dev/null
+++ b/dist/main/_internal/itsdangerous-2.2.0.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/dist/main/_internal/itsdangerous-2.2.0.dist-info/LICENSE.txt b/dist/main/_internal/itsdangerous-2.2.0.dist-info/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7b190ca6712aa09eede3e6de79f68d7fa29072da
--- /dev/null
+++ b/dist/main/_internal/itsdangerous-2.2.0.dist-info/LICENSE.txt
@@ -0,0 +1,28 @@
+Copyright 2011 Pallets
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/dist/main/_internal/itsdangerous-2.2.0.dist-info/METADATA b/dist/main/_internal/itsdangerous-2.2.0.dist-info/METADATA
new file mode 100644
index 0000000000000000000000000000000000000000..ddf54648499557c652181f6126362ffd5751c273
--- /dev/null
+++ b/dist/main/_internal/itsdangerous-2.2.0.dist-info/METADATA
@@ -0,0 +1,60 @@
+Metadata-Version: 2.1
+Name: itsdangerous
+Version: 2.2.0
+Summary: Safely pass data to untrusted environments and back.
+Maintainer-email: Pallets
+Requires-Python: >=3.8
+Description-Content-Type: text/markdown
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Typing :: Typed
+Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/
+Project-URL: Chat, https://discord.gg/pallets
+Project-URL: Documentation, https://itsdangerous.palletsprojects.com/
+Project-URL: Donate, https://palletsprojects.com/donate
+Project-URL: Source, https://github.com/pallets/itsdangerous/
+
+# ItsDangerous
+
+... so better sign this
+
+Various helpers to pass data to untrusted environments and to get it
+back safe and sound. Data is cryptographically signed to ensure that a
+token has not been tampered with.
+
+It's possible to customize how data is serialized. Data is compressed as
+needed. A timestamp can be added and verified automatically while
+loading a token.
+
+
+## A Simple Example
+
+Here's how you could generate a token for transmitting a user's id and
+name between web requests.
+
+```python
+from itsdangerous import URLSafeSerializer
+auth_s = URLSafeSerializer("secret key", "auth")
+token = auth_s.dumps({"id": 5, "name": "itsdangerous"})
+
+print(token)
+# eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg
+
+data = auth_s.loads(token)
+print(data["name"])
+# itsdangerous
+```
+
+
+## Donate
+
+The Pallets organization develops and supports ItsDangerous and other
+popular packages. In order to grow the community of contributors and
+users, and allow the maintainers to devote more time to the projects,
+[please donate today][].
+
+[please donate today]: https://palletsprojects.com/donate
+
diff --git a/dist/main/_internal/itsdangerous-2.2.0.dist-info/RECORD b/dist/main/_internal/itsdangerous-2.2.0.dist-info/RECORD
new file mode 100644
index 0000000000000000000000000000000000000000..2a76fbda2e567c109b7f01c14636a2862405067e
--- /dev/null
+++ b/dist/main/_internal/itsdangerous-2.2.0.dist-info/RECORD
@@ -0,0 +1,22 @@
+itsdangerous-2.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+itsdangerous-2.2.0.dist-info/LICENSE.txt,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475
+itsdangerous-2.2.0.dist-info/METADATA,sha256=0rk0-1ZwihuU5DnwJVwPWoEI4yWOyCexih3JyZHblhE,1924
+itsdangerous-2.2.0.dist-info/RECORD,,
+itsdangerous-2.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
+itsdangerous/__init__.py,sha256=4SK75sCe29xbRgQE1ZQtMHnKUuZYAf3bSpZOrff1IAY,1427
+itsdangerous/__pycache__/__init__.cpython-38.pyc,,
+itsdangerous/__pycache__/_json.cpython-38.pyc,,
+itsdangerous/__pycache__/encoding.cpython-38.pyc,,
+itsdangerous/__pycache__/exc.cpython-38.pyc,,
+itsdangerous/__pycache__/serializer.cpython-38.pyc,,
+itsdangerous/__pycache__/signer.cpython-38.pyc,,
+itsdangerous/__pycache__/timed.cpython-38.pyc,,
+itsdangerous/__pycache__/url_safe.cpython-38.pyc,,
+itsdangerous/_json.py,sha256=wPQGmge2yZ9328EHKF6gadGeyGYCJQKxtU-iLKE6UnA,473
+itsdangerous/encoding.py,sha256=wwTz5q_3zLcaAdunk6_vSoStwGqYWe307Zl_U87aRFM,1409
+itsdangerous/exc.py,sha256=Rr3exo0MRFEcPZltwecyK16VV1bE2K9_F1-d-ljcUn4,3201
+itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+itsdangerous/serializer.py,sha256=PmdwADLqkSyQLZ0jOKAgDsAW4k_H0TlA71Ei3z0C5aI,15601
+itsdangerous/signer.py,sha256=YO0CV7NBvHA6j549REHJFUjUojw2pHqwcUpQnU7yNYQ,9647
+itsdangerous/timed.py,sha256=6RvDMqNumGMxf0-HlpaZdN9PUQQmRvrQGplKhxuivUs,8083
+itsdangerous/url_safe.py,sha256=az4e5fXi_vs-YbWj8YZwn4wiVKfeD--GEKRT5Ueu4P4,2505
diff --git a/dist/main/_internal/itsdangerous-2.2.0.dist-info/WHEEL b/dist/main/_internal/itsdangerous-2.2.0.dist-info/WHEEL
new file mode 100644
index 0000000000000000000000000000000000000000..3b5e64b5e6c4a210201d1676a891fd57b15cda99
--- /dev/null
+++ b/dist/main/_internal/itsdangerous-2.2.0.dist-info/WHEEL
@@ -0,0 +1,4 @@
+Wheel-Version: 1.0
+Generator: flit 3.9.0
+Root-Is-Purelib: true
+Tag: py3-none-any
diff --git a/dist/main/_internal/libcrypto-1_1.dll b/dist/main/_internal/libcrypto-1_1.dll
new file mode 100644
index 0000000000000000000000000000000000000000..ed07392cb7e6956f7410c059e4f8a811246b2140
Binary files /dev/null and b/dist/main/_internal/libcrypto-1_1.dll differ
diff --git a/dist/main/_internal/libffi-7.dll b/dist/main/_internal/libffi-7.dll
new file mode 100644
index 0000000000000000000000000000000000000000..8fd2e5e07029035e4c437a14517ba7ff5eaed233
Binary files /dev/null and b/dist/main/_internal/libffi-7.dll differ
diff --git a/dist/main/_internal/libssl-1_1.dll b/dist/main/_internal/libssl-1_1.dll
new file mode 100644
index 0000000000000000000000000000000000000000..b7aa2b31040fff1231bb59634a2fedd31b7dbf77
Binary files /dev/null and b/dist/main/_internal/libssl-1_1.dll differ
diff --git a/dist/main/_internal/markupsafe/_speedups.cp38-win_amd64.pyd b/dist/main/_internal/markupsafe/_speedups.cp38-win_amd64.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..412089951f64c9dc24120a291344068d6800c355
Binary files /dev/null and b/dist/main/_internal/markupsafe/_speedups.cp38-win_amd64.pyd differ
diff --git a/dist/main/_internal/psutil/_psutil_windows.pyd b/dist/main/_internal/psutil/_psutil_windows.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..5dc58d9abd5ccc1b2a872087f85459361d88bd18
Binary files /dev/null and b/dist/main/_internal/psutil/_psutil_windows.pyd differ
diff --git a/dist/main/_internal/pyexpat.pyd b/dist/main/_internal/pyexpat.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..0fe2db2a2659759e49f5cf17f59a9db0e5fe2f28
Binary files /dev/null and b/dist/main/_internal/pyexpat.pyd differ
diff --git a/dist/main/_internal/python3.dll b/dist/main/_internal/python3.dll
new file mode 100644
index 0000000000000000000000000000000000000000..9c074a3b8ada5bc6fab9336f0cb230d02248f1b2
Binary files /dev/null and b/dist/main/_internal/python3.dll differ
diff --git a/dist/main/_internal/python38.dll b/dist/main/_internal/python38.dll
new file mode 100644
index 0000000000000000000000000000000000000000..f01daa578e2d3eff059b1025d4ba175ce4542cf5
Binary files /dev/null and b/dist/main/_internal/python38.dll differ
diff --git a/dist/main/_internal/pywin32_system32/pywintypes38.dll b/dist/main/_internal/pywin32_system32/pywintypes38.dll
new file mode 100644
index 0000000000000000000000000000000000000000..1c7027f4abe641bd9b0d75bb26a7c3340a79a282
Binary files /dev/null and b/dist/main/_internal/pywin32_system32/pywintypes38.dll differ
diff --git a/dist/main/_internal/select.pyd b/dist/main/_internal/select.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..960a00c9ae2ea5202b54cf4485eabed748e66cd2
Binary files /dev/null and b/dist/main/_internal/select.pyd differ
diff --git a/dist/main/_internal/unicodedata.pyd b/dist/main/_internal/unicodedata.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..bece8b2ccb2c8bb9874263164880bdaf05c25b0f
Binary files /dev/null and b/dist/main/_internal/unicodedata.pyd differ
diff --git a/dist/main/_internal/werkzeug-3.0.2.dist-info/INSTALLER b/dist/main/_internal/werkzeug-3.0.2.dist-info/INSTALLER
new file mode 100644
index 0000000000000000000000000000000000000000..a1b589e38a32041e49332e5e81c2d363dc418d68
--- /dev/null
+++ b/dist/main/_internal/werkzeug-3.0.2.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/dist/main/_internal/werkzeug-3.0.2.dist-info/LICENSE.rst b/dist/main/_internal/werkzeug-3.0.2.dist-info/LICENSE.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c37cae49ec77ad6ebb25568c1605f1fee5313cfb
--- /dev/null
+++ b/dist/main/_internal/werkzeug-3.0.2.dist-info/LICENSE.rst
@@ -0,0 +1,28 @@
+Copyright 2007 Pallets
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/dist/main/_internal/werkzeug-3.0.2.dist-info/METADATA b/dist/main/_internal/werkzeug-3.0.2.dist-info/METADATA
new file mode 100644
index 0000000000000000000000000000000000000000..8d0ac9114f1e0b8f1db9b469dd8c9ccce0ef7430
--- /dev/null
+++ b/dist/main/_internal/werkzeug-3.0.2.dist-info/METADATA
@@ -0,0 +1,118 @@
+Metadata-Version: 2.1
+Name: Werkzeug
+Version: 3.0.2
+Summary: The comprehensive WSGI web application library.
+Maintainer-email: Pallets
+Requires-Python: >=3.8
+Description-Content-Type: text/x-rst
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware
+Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
+Requires-Dist: MarkupSafe>=2.1.1
+Requires-Dist: watchdog>=2.3 ; extra == "watchdog"
+Project-URL: Changes, https://werkzeug.palletsprojects.com/changes/
+Project-URL: Chat, https://discord.gg/pallets
+Project-URL: Documentation, https://werkzeug.palletsprojects.com/
+Project-URL: Donate, https://palletsprojects.com/donate
+Project-URL: Issue Tracker, https://github.com/pallets/werkzeug/issues/
+Project-URL: Source Code, https://github.com/pallets/werkzeug/
+Provides-Extra: watchdog
+
+Werkzeug
+========
+
+*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff")
+
+Werkzeug is a comprehensive `WSGI`_ web application library. It began as
+a simple collection of various utilities for WSGI applications and has
+become one of the most advanced WSGI utility libraries.
+
+It includes:
+
+- An interactive debugger that allows inspecting stack traces and
+ source code in the browser with an interactive interpreter for any
+ frame in the stack.
+- A full-featured request object with objects to interact with
+ headers, query args, form data, files, and cookies.
+- A response object that can wrap other WSGI applications and handle
+ streaming data.
+- A routing system for matching URLs to endpoints and generating URLs
+ for endpoints, with an extensible system for capturing variables
+ from URLs.
+- HTTP utilities to handle entity tags, cache control, dates, user
+ agents, cookies, files, and more.
+- A threaded WSGI server for use while developing applications
+ locally.
+- A test client for simulating HTTP requests during testing without
+ requiring running a server.
+
+Werkzeug doesn't enforce any dependencies. It is up to the developer to
+choose a template engine, database adapter, and even how to handle
+requests. It can be used to build all sorts of end user applications
+such as blogs, wikis, or bulletin boards.
+
+`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while
+providing more structure and patterns for defining powerful
+applications.
+
+.. _WSGI: https://wsgi.readthedocs.io/en/latest/
+.. _Flask: https://www.palletsprojects.com/p/flask/
+
+
+Installing
+----------
+
+Install and update using `pip`_:
+
+.. code-block:: text
+
+ pip install -U Werkzeug
+
+.. _pip: https://pip.pypa.io/en/stable/getting-started/
+
+
+A Simple Example
+----------------
+
+.. code-block:: python
+
+ from werkzeug.wrappers import Request, Response
+
+ @Request.application
+ def application(request):
+ return Response('Hello, World!')
+
+ if __name__ == '__main__':
+ from werkzeug.serving import run_simple
+ run_simple('localhost', 4000, application)
+
+
+Donate
+------
+
+The Pallets organization develops and supports Werkzeug and other
+popular packages. In order to grow the community of contributors and
+users, and allow the maintainers to devote more time to the projects,
+`please donate today`_.
+
+.. _please donate today: https://palletsprojects.com/donate
+
+
+Links
+-----
+
+- Documentation: https://werkzeug.palletsprojects.com/
+- Changes: https://werkzeug.palletsprojects.com/changes/
+- PyPI Releases: https://pypi.org/project/Werkzeug/
+- Source Code: https://github.com/pallets/werkzeug/
+- Issue Tracker: https://github.com/pallets/werkzeug/issues/
+- Chat: https://discord.gg/pallets
+
diff --git a/dist/main/_internal/werkzeug-3.0.2.dist-info/RECORD b/dist/main/_internal/werkzeug-3.0.2.dist-info/RECORD
new file mode 100644
index 0000000000000000000000000000000000000000..5060fa61f6169fd2ea047aca363cd65abca76df9
--- /dev/null
+++ b/dist/main/_internal/werkzeug-3.0.2.dist-info/RECORD
@@ -0,0 +1,125 @@
+werkzeug-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+werkzeug-3.0.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475
+werkzeug-3.0.2.dist-info/METADATA,sha256=6SiNlP2DNzqyOyg_fYs89a_g-0tlwJVL8eMm_iN3vUI,4093
+werkzeug-3.0.2.dist-info/RECORD,,
+werkzeug-3.0.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
+werkzeug/__init__.py,sha256=HX_PSY5E2vtVlD3R4YblwBRCjg7j3Tlm3LASbYqOSkU,727
+werkzeug/__pycache__/__init__.cpython-38.pyc,,
+werkzeug/__pycache__/_internal.cpython-38.pyc,,
+werkzeug/__pycache__/_reloader.cpython-38.pyc,,
+werkzeug/__pycache__/exceptions.cpython-38.pyc,,
+werkzeug/__pycache__/formparser.cpython-38.pyc,,
+werkzeug/__pycache__/http.cpython-38.pyc,,
+werkzeug/__pycache__/local.cpython-38.pyc,,
+werkzeug/__pycache__/security.cpython-38.pyc,,
+werkzeug/__pycache__/serving.cpython-38.pyc,,
+werkzeug/__pycache__/test.cpython-38.pyc,,
+werkzeug/__pycache__/testapp.cpython-38.pyc,,
+werkzeug/__pycache__/urls.cpython-38.pyc,,
+werkzeug/__pycache__/user_agent.cpython-38.pyc,,
+werkzeug/__pycache__/utils.cpython-38.pyc,,
+werkzeug/__pycache__/wsgi.cpython-38.pyc,,
+werkzeug/_internal.py,sha256=aVz_qPOvQFpvqBaEKdVuCBnJPekok4miXms5xIM4M04,5542
+werkzeug/_reloader.py,sha256=1O1DDWlqVwYIX8kgJwH5B4a_Uh6acQnw3sQf01JpXtM,14745
+werkzeug/datastructures/__init__.py,sha256=yzBdOT9DdK3nraNG49pA3bVsvtPPLx2-t2N8ZmuAd9w,1900
+werkzeug/datastructures/__pycache__/__init__.cpython-38.pyc,,
+werkzeug/datastructures/__pycache__/accept.cpython-38.pyc,,
+werkzeug/datastructures/__pycache__/auth.cpython-38.pyc,,
+werkzeug/datastructures/__pycache__/cache_control.cpython-38.pyc,,
+werkzeug/datastructures/__pycache__/csp.cpython-38.pyc,,
+werkzeug/datastructures/__pycache__/etag.cpython-38.pyc,,
+werkzeug/datastructures/__pycache__/file_storage.cpython-38.pyc,,
+werkzeug/datastructures/__pycache__/headers.cpython-38.pyc,,
+werkzeug/datastructures/__pycache__/mixins.cpython-38.pyc,,
+werkzeug/datastructures/__pycache__/range.cpython-38.pyc,,
+werkzeug/datastructures/__pycache__/structures.cpython-38.pyc,,
+werkzeug/datastructures/accept.py,sha256=CuCvBAxNzbt4QUb17rH986vvOVGURFUjo0DX2PQy_yI,10670
+werkzeug/datastructures/accept.pyi,sha256=6P114gncjZoy-i_n_3OQy2nJVwjEAIe7PcBxKYqCEfc,1917
+werkzeug/datastructures/auth.py,sha256=3RJYi9eGj05-4kSNqozR6GaVxpEPW0qk9Qbof4v0n1Y,10087
+werkzeug/datastructures/cache_control.py,sha256=RTUipZev50s-1TAn2rYGZrytm_6IOIxQd67fkR5bNF0,6043
+werkzeug/datastructures/cache_control.pyi,sha256=6Q93jRysAKMPWRA72OMksyn7d3ZysuxwGlHp_iwF9pA,3756
+werkzeug/datastructures/csp.py,sha256=DAOAO266LK0JKbvlG80bbkAgfrNsnU9HBoz-FdIYNdo,3244
+werkzeug/datastructures/csp.pyi,sha256=AmDWiZU4rrJA4SZmyMNI1L5PLdIfJsI5Li9r5lE1q6M,5765
+werkzeug/datastructures/etag.py,sha256=JsyI-yXayF-hQu26MyFzbHFIZsaQ6odj3RZO_jF-_cc,2913
+werkzeug/datastructures/etag.pyi,sha256=N9cuUBrZnxHmsbW0BBmjKW-djNY7WKbI6t_WopB8Zo0,1047
+werkzeug/datastructures/file_storage.py,sha256=ePeMtr65s_1_sunXMv_SBOiFof5CX5BepYv5_W16fZk,6184
+werkzeug/datastructures/file_storage.pyi,sha256=2sdbKHhvbQF5FjrJuO6l_m1yZvZ4oPCUTspmdmjQlSU,1433
+werkzeug/datastructures/headers.py,sha256=97-P-LgzterxEwxLbQsBEGiZpCOAXzZ7fExXXd4uH-o,17286
+werkzeug/datastructures/headers.pyi,sha256=66Gh9DbD8QNpLRBOuer4DMCj12csddHrcgxiJPLE5n8,4237
+werkzeug/datastructures/mixins.py,sha256=-IQSQ70UOMQlqtJEIyyhplOd4obaTOfzGvka-cunCtM,5337
+werkzeug/datastructures/mixins.pyi,sha256=Axe16elbs9zSOK9IuXIGs08ukgqSSPCxXFEjB_ACYSM,4189
+werkzeug/datastructures/range.py,sha256=JXSDPseG7iH5giJp3R1SnQC_SqQp634M8Iv6QTsbTxM,5669
+werkzeug/datastructures/range.pyi,sha256=bsM61iNp86gT2lyN0F_Dqg8xsnfPerdmElipuHppiJQ,1792
+werkzeug/datastructures/structures.py,sha256=8nRqvwHM8moZj_fEaxOqF-N7lguoXgnNJeT2l9LX7xA,31917
+werkzeug/datastructures/structures.pyi,sha256=MRg-RubT3UPjh62i9-7Xht8DVL0zTApRzjs52Hfz_j4,8148
+werkzeug/debug/__init__.py,sha256=XOhy0HqKd5_178CNO4SXYACszo27JzfySx8AslNwm8I,18746
+werkzeug/debug/__pycache__/__init__.cpython-38.pyc,,
+werkzeug/debug/__pycache__/console.cpython-38.pyc,,
+werkzeug/debug/__pycache__/repr.cpython-38.pyc,,
+werkzeug/debug/__pycache__/tbtools.cpython-38.pyc,,
+werkzeug/debug/console.py,sha256=FIO8gDX2eQ1_4MtpJ4s0i2gR4fFCJZTPwhSVByF4kbo,6068
+werkzeug/debug/repr.py,sha256=nI71orv_oFoTWZBosXV5249aPc05qszeSyHc_WXzd5U,9316
+werkzeug/debug/shared/ICON_LICENSE.md,sha256=DhA6Y1gUl5Jwfg0NFN9Rj4VWITt8tUx0IvdGf0ux9-s,222
+werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507
+werkzeug/debug/shared/debugger.js,sha256=FVBBUirz4kKedIbM08QQCYeEoicoSbnm4BnBF4dCYfA,10562
+werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191
+werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200
+werkzeug/debug/shared/style.css,sha256=-xSxzUEZGw_IqlDR5iZxitNl8LQUjBM-_Y4UAvXVH8g,6078
+werkzeug/debug/tbtools.py,sha256=Vk5Wqry-Wh9Y7Zwofl33dvBm5Eiu4C_GNSUy-fm0bvM,13295
+werkzeug/exceptions.py,sha256=d6VNzGcVgLazIpfwRD8pN_d3yAJNyngBDFvlXQbR-38,26062
+werkzeug/formparser.py,sha256=VBGrsffcImycGpL9_CRhhLlHlUZvcO-QX4MLdnE3rlc,15275
+werkzeug/http.py,sha256=oDCppI-07PHsAE2Taxf3wFMWp3LYOjt1VO2EMz_nCYg,43363
+werkzeug/local.py,sha256=G2rjJ-62SLgxnTSa6_rQ710rkWg-xpUaIX__zVRJuVs,22001
+werkzeug/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+werkzeug/middleware/__pycache__/__init__.cpython-38.pyc,,
+werkzeug/middleware/__pycache__/dispatcher.cpython-38.pyc,,
+werkzeug/middleware/__pycache__/http_proxy.cpython-38.pyc,,
+werkzeug/middleware/__pycache__/lint.cpython-38.pyc,,
+werkzeug/middleware/__pycache__/profiler.cpython-38.pyc,,
+werkzeug/middleware/__pycache__/proxy_fix.cpython-38.pyc,,
+werkzeug/middleware/__pycache__/shared_data.cpython-38.pyc,,
+werkzeug/middleware/dispatcher.py,sha256=6ltzPtDsIdLTY_T1GW6kxBJL0KZftbipa_WVdKtpVQ8,2601
+werkzeug/middleware/http_proxy.py,sha256=vsSvt84m656x3mV_Fj78y7O2eYHmurWngErTcjeiz8U,7833
+werkzeug/middleware/lint.py,sha256=Y4KuX7QyrnlaKrpUDKvp_mcjDO-jsOOO1nEmhd4vWNo,14463
+werkzeug/middleware/profiler.py,sha256=r0BtSk_iLY4JdkjfsXlUnALogjrQSJ2ja-wPDuJN6sw,5561
+werkzeug/middleware/proxy_fix.py,sha256=dcOOSjSok2QsSh1VSNsw-a0Vy_Jn5DunlO6PRbXBq0A,6754
+werkzeug/middleware/shared_data.py,sha256=DeM8OouhfhZs8w5T7Wxw-uKuOHXoH0x5RopzxR2RRjI,9513
+werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+werkzeug/routing/__init__.py,sha256=HpvahY7WwkLdV4Cq3Bsc3GrqNon4u6t8-vhbb9E5o00,4819
+werkzeug/routing/__pycache__/__init__.cpython-38.pyc,,
+werkzeug/routing/__pycache__/converters.cpython-38.pyc,,
+werkzeug/routing/__pycache__/exceptions.cpython-38.pyc,,
+werkzeug/routing/__pycache__/map.cpython-38.pyc,,
+werkzeug/routing/__pycache__/matcher.cpython-38.pyc,,
+werkzeug/routing/__pycache__/rules.cpython-38.pyc,,
+werkzeug/routing/converters.py,sha256=nEWOaAfeZWPJMneegi91e0L1MhuH7hmyKoxGNJ6QKW8,7249
+werkzeug/routing/exceptions.py,sha256=yGZ5AUL-buHp-vK8AJbZ0bLIbSckh1UyiGKgRg4ZjaA,4698
+werkzeug/routing/map.py,sha256=H7CpXvHeSFtbfM8fjQAZdt_yTllICqeURGbxgQAvI6s,36523
+werkzeug/routing/matcher.py,sha256=nfBbl37eGAkZ1dQlumshFcPuyfggmFjPuSSQOE6GuYs,7849
+werkzeug/routing/rules.py,sha256=VnfNTahYj0IsNxyCRioXV-O_mwcCEMqIUqi46ewzQzs,32137
+werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+werkzeug/sansio/__pycache__/__init__.cpython-38.pyc,,
+werkzeug/sansio/__pycache__/http.cpython-38.pyc,,
+werkzeug/sansio/__pycache__/multipart.cpython-38.pyc,,
+werkzeug/sansio/__pycache__/request.cpython-38.pyc,,
+werkzeug/sansio/__pycache__/response.cpython-38.pyc,,
+werkzeug/sansio/__pycache__/utils.cpython-38.pyc,,
+werkzeug/sansio/http.py,sha256=EZIQJSO6cQfLA_ApVY-bLrVa52x_chCwFYew25eCgRA,5320
+werkzeug/sansio/multipart.py,sha256=u_XLs68tvP2AO704Yq5zZg7ZN0A33SQaZfQE40gsduo,11490
+werkzeug/sansio/request.py,sha256=BbKmMJ5NNhJIbsQXCJTd6R15t61M7tazzwxGYPtGAl8,19933
+werkzeug/sansio/response.py,sha256=CurS5HqPJRt_vCsUuIYa2EOGciUW8GUkIVdpKac6bYo,27647
+werkzeug/sansio/utils.py,sha256=LYgmrN7yr04ZDVk5flPcUJLo1rDnTzhF04OH3-ujCWQ,4950
+werkzeug/security.py,sha256=tlnEWlKjouPp81IXaW0reSX46GfsqEkPFVnxiP65pKk,5280
+werkzeug/serving.py,sha256=wjw7TMvCQHzxmHXDrNGQYetP4gYRTbLRo0XRhXIBUCQ,39332
+werkzeug/test.py,sha256=pWOhzfsnsNLY1jPBzvzzzdzWbGEiRzd7nnofm-f6RHM,52672
+werkzeug/testapp.py,sha256=Q7SXVDXeXnnXo7-TWVoAJCTF2GnXxoH-v5_pvjUyTWc,6135
+werkzeug/urls.py,sha256=7rvnhTmjJ9X_VVJO1aMj9V-yDzOIVpgGnLWLR0VhIPw,6849
+werkzeug/user_agent.py,sha256=lSlLYKCcbzCUSkbdAoO8zPk2UR-8Mdn6iu_iA2kYPBA,1416
+werkzeug/utils.py,sha256=kqtUWcfQriUbExh9gt49K4qfHNFwpMfkDqZUL1gSDWo,24647
+werkzeug/wrappers/__init__.py,sha256=b78jCM8x96kJUGLZ5FYFR3zlK-3pnFAmP9RJIGU0ses,138
+werkzeug/wrappers/__pycache__/__init__.cpython-38.pyc,,
+werkzeug/wrappers/__pycache__/request.cpython-38.pyc,,
+werkzeug/wrappers/__pycache__/response.cpython-38.pyc,,
+werkzeug/wrappers/request.py,sha256=mIURGEyuGrYhtLJ3roPn8-hyliVuRbSIlwyFsfDHuVQ,24620
+werkzeug/wrappers/response.py,sha256=aiEoV3pHugfcw-1SXjQ8b2t2VeGlDiKGC88fZbaKXPY,32587
+werkzeug/wsgi.py,sha256=P7jB0VpG6X6miies4uk7Zgm7NVm4Yz8Ra6Inr5q_FMs,20894
diff --git a/dist/main/_internal/werkzeug-3.0.2.dist-info/WHEEL b/dist/main/_internal/werkzeug-3.0.2.dist-info/WHEEL
new file mode 100644
index 0000000000000000000000000000000000000000..3b5e64b5e6c4a210201d1676a891fd57b15cda99
--- /dev/null
+++ b/dist/main/_internal/werkzeug-3.0.2.dist-info/WHEEL
@@ -0,0 +1,4 @@
+Wheel-Version: 1.0
+Generator: flit 3.9.0
+Root-Is-Purelib: true
+Tag: py3-none-any
diff --git a/dist/main/_internal/win32/_win32sysloader.pyd b/dist/main/_internal/win32/_win32sysloader.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..72115bfa934881e31c01cda237a8840fe1fc571c
Binary files /dev/null and b/dist/main/_internal/win32/_win32sysloader.pyd differ
diff --git a/dist/main/_internal/win32/win32file.pyd b/dist/main/_internal/win32/win32file.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..fc0da46f7fd0e61a6ad2ac60c0f92f4c2bb43e17
Binary files /dev/null and b/dist/main/_internal/win32/win32file.pyd differ
diff --git a/dist/main/_internal/win32/win32wnet.pyd b/dist/main/_internal/win32/win32wnet.pyd
new file mode 100644
index 0000000000000000000000000000000000000000..51b8c37b3e25662494808f6ed56ee06242ef1558
Binary files /dev/null and b/dist/main/_internal/win32/win32wnet.pyd differ
diff --git a/dist/main/main.exe b/dist/main/main.exe
new file mode 100644
index 0000000000000000000000000000000000000000..f7f0782c54de4ec705083eb257696a7a9d3c02b0
Binary files /dev/null and b/dist/main/main.exe differ
diff --git a/install.bat b/install.bat
index b8e9c52bfa7d0b2eb30c9bd3d7d14ee5203138ee..25219d50037c2260a02f1726fa911880573b1365 100644
--- a/install.bat
+++ b/install.bat
@@ -1,6 +1,6 @@
@echo off
-set DOWNLOAD_URL=https://cn-sy1.rains3.com/stardream/windows/win_0.0.6.zip
-set DOWNLOAD_PATH=C:\Program Files\win_0.0.6.zip
+set DOWNLOAD_URL=https://cn-sy1.rains3.com/stardream/windows/win_0.1.0.zip
+set DOWNLOAD_PATH=C:\Program Files\win_0.1.0.zip
set EXTRACT_PATH=C:\Program Files\quick-panel
set MAIN_EXE_PATH=%EXTRACT_PATH%\main.exe
diff --git a/main.py b/main.py
index f1c00ec50f8e6c1eee5fca4066a2957c67925df0..38b862e18756fcdf5e59188d439b762ccafe426c 100644
--- a/main.py
+++ b/main.py
@@ -1,35 +1,47 @@
import ctypes
import subprocess
+import psutil
+
import app.utils.File as f
import app.controller.install as paninstall
from app.controller import index
+from app.utils import Log
from app.utils import System
+from app.utils import File
import os
import sys
LOCK_FILE = "running.lock"
ROOT_PATH = os.getcwd()
-
+Log.New("----------------启动程序----------------")
+# 工作函数
def main():
if f.Had("data/config/panel.json"):
print("已安装")
print("开始启动面板...")
+ Log.New("Start QPanel")
print("------------------------------------")
index.service_start(ROOT_PATH)
+ if System.get_system_name() == "Windows":
+ pass
+ #subprocess.Popen(["main.exe"], shell=True, creationflags=subprocess.CREATE_NEW_CONSOLE)
else:
print("未安装面板")
if System.get_system_name() == "Linux":
if os.getuid() != 0:
+ Log.New("exit: Use ROOT to run")
sys.exit("请使用root用户运行此程序")
else:
try:
# 使用 ctypes.windll.shell32.IsUserAnAdmin 来检查当前用户是否是管理员
if ctypes.windll.shell32.IsUserAnAdmin() == 0:
+ Log.New("exit: Use Admin to run")
sys.exit("请使用管理员用户运行此程序")
except AttributeError:
# 如果 IsUserAnAdmin 函数不可用,则当前系统不支持该方法,因此返回 False
+ Log.New("exit: Use Admin to run")
sys.exit("请使用管理员用户运行此程序")
install = input("是否安装面板(y/n):")
if install == "y":
@@ -37,6 +49,7 @@ def main():
print("开始安装面板...")
if paninstall.install():
print("安装成功")
+ Log.New("Install True")
# 获取当前可执行文件的路径
executable = sys.executable
if System.get_system_name() == "Linux":
@@ -48,6 +61,7 @@ def main():
# 退出当前程序
sys.exit()
else:
+ Log.New("Install False")
print("安装失败")
else:
print("退出程序")
@@ -100,44 +114,8 @@ else:
return not self._acquire_lock()
def run_task(self):
- if f.Had("data/config/panel.json"):
- print("已安装")
- print("开始启动面板...")
- print("------------------------------------")
- index.service_start(ROOT_PATH)
- else:
- print("未安装面板")
- if System.get_system_name() == "Linux":
- if os.getuid() != 0:
- sys.exit("请使用root用户运行此程序")
- else:
- try:
- # 使用 ctypes.windll.shell32.IsUserAnAdmin 来检查当前用户是否是管理员
- if ctypes.windll.shell32.IsUserAnAdmin() == 0:
- sys.exit("请使用管理员用户运行此程序")
- except AttributeError:
- # 如果 IsUserAnAdmin 函数不可用,则当前系统不支持该方法,因此返回 False
- sys.exit("请使用管理员用户运行此程序")
- install = input("是否安装面板(y/n):")
- if install == "y":
- # 安装面板
- print("开始安装面板...")
- if paninstall.install():
- print("安装成功")
- # 获取当前可执行文件的路径
- executable = sys.executable
- if System.get_system_name() == "Linux":
- input("请及时保留您的登录信息(按下任意键结束进程并重启)")
- else:
- input("请及时保留您的登录信息(按下任意键结束进程并手动重启)")
- subprocess.Popen([executable] + sys.argv)
-
- # 退出当前程序
- sys.exit()
- else:
- print("安装失败")
- else:
- print("退出程序")
+ print("start")
+ main()
# 任务完成后释放锁
self._release_lock()
@@ -146,59 +124,86 @@ else:
# 使用示例
lock_file_path = LOCK_FILE
print("启动Windows文件锁")
+ Log.New("Start File Lock")
guardian = SingleInstanceGuardian(lock_file_path)
+ guardian._release_lock()
-# 检查命令行参数
-if len(sys.argv) > 1:
- if sys.argv[1] == "start":
- # 启动程序
- if System.get_system_name() == "Linux":
- import fcntl
+print(len(sys.argv))
+if (len(sys.argv) > 1 and sys.argv[1] == "start") or len(sys.argv) == 1:
+ # 启动程序
- lockfile = open(LOCK_FILE, "w")
- try:
- fcntl.lockf(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)
- except IOError:
+ if File.Had('./pid.txt'):
+ pid = File.Read('./pid.txt')
+ pid_info = System.get_process_info(int(pid))
+ if pid_info != False:
+ if pid_info["status"] == "running":
print("程序已经在运行中")
sys.exit(1)
- lockfile.close()
- os.unlink(LOCK_FILE)
- main()
- else:
- guardian.run_task()
-
- elif sys.argv[1] == "stop":
- # 停止程序
- if System.get_system_name() == "Linux":
- if os.path.exists(LOCK_FILE):
- os.unlink(LOCK_FILE)
- print("停止程序")
- else:
- print("程序未在运行中")
- else:
- # Windows
- guardian._release_lock()
else:
- print("无效的命令")
-else:
- # 启动程序
+ print("pid.txt 文件不存在")
+ File.Write("./pid.txt", str(os.getpid()))
+ # 写入进程号
+
if System.get_system_name() == "Linux":
- # 启动程序
- if System.get_system_name() == "Linux":
- import fcntl
+ import fcntl
+
+ lockfile = open(LOCK_FILE, "w")
+ try:
+ fcntl.lockf(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)
+ except IOError:
+ print("程序已经在运行中")
+ File.Del("./pid.txt")
+ sys.exit(1)
+ lockfile.close()
+ os.unlink(LOCK_FILE)
+ main()
+ else:
+ guardian.run_task()
- lockfile = open(LOCK_FILE, "w")
- try:
- fcntl.lockf(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)
- except IOError:
- print("程序已经在运行中")
- sys.exit(1)
- lockfile.close()
+elif len(sys.argv) > 1 and sys.argv[1] == "stop":
+ # 停止程序
+ print("stop")
+ if System.get_system_name() == "Linux":
+ if os.path.exists(LOCK_FILE):
os.unlink(LOCK_FILE)
- main()
+ if File.Had('./pid.txt'):
+ pid = File.Read('./pid.txt')
+ pid_info = System.get_process_info(int(pid))
+ if pid_info != False:
+ if pid_info["status"] == "running":
+ print("程序已经在运行中")
+ os.kill(pid, 9) # 9表示SIGKILL信号,强制终止进程
+ File.Del("./pid.txt")
+ print("关闭成功")
+
+ print("停止程序")
else:
- guardian.run_task()
-
+ print("程序未在运行中")
else:
- print("启动项目")
- guardian.run_task()
+ # Windows
+ if File.Had('./pid.txt'):
+ pid = File.Read('./pid.txt')
+ pid_info = System.get_process_info(int(pid))
+ if pid_info != False:
+ if pid_info["status"] == "running":
+ print("程序已经在运行中")
+ try:
+ # 根据进程ID获取进程对象
+ process = psutil.Process(int(pid))
+ # 终止进程
+ process.terminate()
+ File.Del("./pid.txt")
+ print("关闭成功")
+ except psutil.NoSuchProcess:
+ # 如果没有找到对应的进程,返回 False
+ print("关闭失败")
+
+ guardian._release_lock()
+
+elif len(sys.argv) > 1 and sys.argv[1] == "run":
+ if(System.get_system_name() == "Linux"):
+ subprocess.run(['bash', 'run.sh'])
+ else:
+ subprocess.run(['cscript', '//NoLogo', 'run.vbs'])
+else:
+ print("无效的命令")
diff --git a/pid.txt b/pid.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ca071bb9db41f8f1dc4bbfea00a90951bd66036e
--- /dev/null
+++ b/pid.txt
@@ -0,0 +1 @@
+12308
\ No newline at end of file
diff --git a/run.bat b/run.bat
new file mode 100644
index 0000000000000000000000000000000000000000..00549404b8cb25f2003825afb9615a84b749ff52
--- /dev/null
+++ b/run.bat
@@ -0,0 +1 @@
+start /B main.py
\ No newline at end of file
diff --git a/run.sh b/run.sh
new file mode 100644
index 0000000000000000000000000000000000000000..0c8abed272983f027045bf501c1ae71d75bd1db7
--- /dev/null
+++ b/run.sh
@@ -0,0 +1 @@
+nohup ./main &
\ No newline at end of file
diff --git a/run.vbs b/run.vbs
new file mode 100644
index 0000000000000000000000000000000000000000..9d8604ca71dac8116426aea30a33f294832991e7
--- /dev/null
+++ b/run.vbs
@@ -0,0 +1,2 @@
+Set ws = CreateObject("Wscript.Shell")
+ws.run "cmd /c run.bat",0
diff --git a/templates/404.html b/templates/error.html
similarity index 100%
rename from templates/404.html
rename to templates/error.html
diff --git a/vue/.gitignore b/vue/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..579aa936775cd025ec4274ab6f488faf290d57c9
--- /dev/null
+++ b/vue/.gitignore
@@ -0,0 +1,32 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+pid.*
+*.txt
+
+*.tsbuildinfo
diff --git a/vue/.vscode/extensions.json b/vue/.vscode/extensions.json
new file mode 100644
index 0000000000000000000000000000000000000000..a7cea0b0678120a1b590d1b6592c7318039b9179
--- /dev/null
+++ b/vue/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["Vue.volar"]
+}
diff --git a/vue/README.md b/vue/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..be04c18c01b9ee38cf3eda93b4d863a64fb0e88f
--- /dev/null
+++ b/vue/README.md
@@ -0,0 +1,29 @@
+# vue
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+npm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+npm run dev
+```
+
+### Compile and Minify for Production
+
+```sh
+npm run build
+```
diff --git a/vue/index.html b/vue/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..4a51c62966347680d59868fc44e624b0b9e2e34a
--- /dev/null
+++ b/vue/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ QPanel
+
+
+
+
+
+
+
diff --git a/vue/jsconfig.json b/vue/jsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..5a1f2d222a302a174e710614c6d76531b7bda926
--- /dev/null
+++ b/vue/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/vue/package-lock.json b/vue/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..70bd577d12ffb94a3e122c4b6613c8ba3bd46184
--- /dev/null
+++ b/vue/package-lock.json
@@ -0,0 +1,1197 @@
+{
+ "name": "vue",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "vue",
+ "version": "0.0.0",
+ "dependencies": {
+ "@arco-themes/vue-qpanel": "^0.0.2",
+ "axios": "^1.6.8",
+ "vue": "^3.4.21",
+ "vue-router": "^4.3.0"
+ },
+ "devDependencies": {
+ "@arco-design/web-vue": "^2.55.1",
+ "@vitejs/plugin-vue": "^5.0.4",
+ "vite": "^5.2.8"
+ }
+ },
+ "node_modules/@arco-design/color": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@arco-design/color/-/color-0.4.0.tgz",
+ "integrity": "sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g==",
+ "dependencies": {
+ "color": "^3.1.3"
+ }
+ },
+ "node_modules/@arco-design/web-vue": {
+ "version": "2.55.1",
+ "resolved": "https://registry.npmjs.org/@arco-design/web-vue/-/web-vue-2.55.1.tgz",
+ "integrity": "sha512-MI0mteI4B1+UAKAslCrV2zqRKHWwkjLjdOpOLAR36cAbYhtlj7Tel3yAjGHk5zsQ1ODZX60OFfRfl66pq6919A==",
+ "dependencies": {
+ "@arco-design/color": "^0.4.0",
+ "b-tween": "^0.3.3",
+ "b-validate": "^1.4.4",
+ "compute-scroll-into-view": "^1.0.17",
+ "dayjs": "^1.10.3",
+ "number-precision": "^1.5.0",
+ "resize-observer-polyfill": "^1.5.1",
+ "scroll-into-view-if-needed": "^2.2.28"
+ },
+ "peerDependencies": {
+ "vue": "^3.1.0"
+ }
+ },
+ "node_modules/@arco-themes/vue-qpanel": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@arco-themes/vue-qpanel/-/vue-qpanel-0.0.2.tgz",
+ "integrity": "sha512-Uc8MkvuNILo4pNbwpguif7RJmJ4Ddh+xF1Z4yN+/umdsJo92uzaVcg4N5Fvu0uB223JIUva4vZOl6frL2HuECA==",
+ "peerDependencies": {
+ "@arco-design/web-vue": "^2.55.1"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.24.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz",
+ "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==",
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz",
+ "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz",
+ "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz",
+ "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz",
+ "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz",
+ "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz",
+ "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz",
+ "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz",
+ "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz",
+ "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz",
+ "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz",
+ "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz",
+ "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz",
+ "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz",
+ "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz",
+ "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz",
+ "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz",
+ "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==",
+ "dev": true,
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.4.25",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.25.tgz",
+ "integrity": "sha512-Y2pLLopaElgWnMNolgG8w3C5nNUVev80L7hdQ5iIKPtMJvhVpG0zhnBG/g3UajJmZdvW0fktyZTotEHD1Srhbg==",
+ "dependencies": {
+ "@babel/parser": "^7.24.4",
+ "@vue/shared": "3.4.25",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.4.25",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.25.tgz",
+ "integrity": "sha512-Ugz5DusW57+HjllAugLci19NsDK+VyjGvmbB2TXaTcSlQxwL++2PETHx/+Qv6qFwNLzSt7HKepPe4DcTE3pBWg==",
+ "dependencies": {
+ "@vue/compiler-core": "3.4.25",
+ "@vue/shared": "3.4.25"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.4.25",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.25.tgz",
+ "integrity": "sha512-m7rryuqzIoQpOBZ18wKyq05IwL6qEpZxFZfRxlNYuIPDqywrXQxgUwLXIvoU72gs6cRdY6wHD0WVZIFE4OEaAQ==",
+ "dependencies": {
+ "@babel/parser": "^7.24.4",
+ "@vue/compiler-core": "3.4.25",
+ "@vue/compiler-dom": "3.4.25",
+ "@vue/compiler-ssr": "3.4.25",
+ "@vue/shared": "3.4.25",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.10",
+ "postcss": "^8.4.38",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.4.25",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.25.tgz",
+ "integrity": "sha512-H2ohvM/Pf6LelGxDBnfbbXFPyM4NE3hrw0e/EpwuSiYu8c819wx+SVGdJ65p/sFrYDd6OnSDxN1MB2mN07hRSQ==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.25",
+ "@vue/shared": "3.4.25"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz",
+ "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA=="
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.4.25",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.25.tgz",
+ "integrity": "sha512-mKbEtKr1iTxZkAG3vm3BtKHAOhuI4zzsVcN0epDldU/THsrvfXRKzq+lZnjczZGnTdh3ojd86/WrP+u9M51pWQ==",
+ "dependencies": {
+ "@vue/shared": "3.4.25"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.4.25",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.25.tgz",
+ "integrity": "sha512-3qhsTqbEh8BMH3pXf009epCI5E7bKu28fJLi9O6W+ZGt/6xgSfMuGPqa5HRbUxLoehTNp5uWvzCr60KuiRIL0Q==",
+ "dependencies": {
+ "@vue/reactivity": "3.4.25",
+ "@vue/shared": "3.4.25"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.4.25",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.25.tgz",
+ "integrity": "sha512-ode0sj77kuwXwSc+2Yhk8JMHZh1sZp9F/51wdBiz3KGaWltbKtdihlJFhQG4H6AY+A06zzeMLkq6qu8uDSsaoA==",
+ "dependencies": {
+ "@vue/runtime-core": "3.4.25",
+ "@vue/shared": "3.4.25",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.4.25",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.25.tgz",
+ "integrity": "sha512-8VTwq0Zcu3K4dWV0jOwIVINESE/gha3ifYCOKEhxOj6MEl5K5y8J8clQncTcDhKF+9U765nRw4UdUEXvrGhyVQ==",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.4.25",
+ "@vue/shared": "3.4.25"
+ },
+ "peerDependencies": {
+ "vue": "3.4.25"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.4.25",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.25.tgz",
+ "integrity": "sha512-k0yappJ77g2+KNrIaF0FFnzwLvUBLUYr8VOwz+/6vLsmItFp51AcxLL7Ey3iPd7BIRyWPOcqUjMnm7OkahXllA=="
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/axios": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
+ "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/b-tween": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/b-tween/-/b-tween-0.3.3.tgz",
+ "integrity": "sha512-oEHegcRpA7fAuc9KC4nktucuZn2aS8htymCPcP3qkEGPqiBH+GfqtqoG2l7LxHngg6O0HFM7hOeOYExl1Oz4ZA=="
+ },
+ "node_modules/b-validate": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/b-validate/-/b-validate-1.5.3.tgz",
+ "integrity": "sha512-iCvCkGFskbaYtfQ0a3GmcQCHl/Sv1GufXFGuUQ+FE+WJa7A/espLOuFIn09B944V8/ImPj71T4+rTASxO2PAuA=="
+ },
+ "node_modules/color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "dependencies": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/compute-scroll-into-view": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+ "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.10",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
+ "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.20.2",
+ "@esbuild/android-arm": "0.20.2",
+ "@esbuild/android-arm64": "0.20.2",
+ "@esbuild/android-x64": "0.20.2",
+ "@esbuild/darwin-arm64": "0.20.2",
+ "@esbuild/darwin-x64": "0.20.2",
+ "@esbuild/freebsd-arm64": "0.20.2",
+ "@esbuild/freebsd-x64": "0.20.2",
+ "@esbuild/linux-arm": "0.20.2",
+ "@esbuild/linux-arm64": "0.20.2",
+ "@esbuild/linux-ia32": "0.20.2",
+ "@esbuild/linux-loong64": "0.20.2",
+ "@esbuild/linux-mips64el": "0.20.2",
+ "@esbuild/linux-ppc64": "0.20.2",
+ "@esbuild/linux-riscv64": "0.20.2",
+ "@esbuild/linux-s390x": "0.20.2",
+ "@esbuild/linux-x64": "0.20.2",
+ "@esbuild/netbsd-x64": "0.20.2",
+ "@esbuild/openbsd-x64": "0.20.2",
+ "@esbuild/sunos-x64": "0.20.2",
+ "@esbuild/win32-arm64": "0.20.2",
+ "@esbuild/win32-ia32": "0.20.2",
+ "@esbuild/win32-x64": "0.20.2"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.10",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
+ "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/number-precision": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/number-precision/-/number-precision-1.6.0.tgz",
+ "integrity": "sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ=="
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "node_modules/postcss": {
+ "version": "8.4.38",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
+ "node_modules/rollup": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz",
+ "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.5"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.16.4",
+ "@rollup/rollup-android-arm64": "4.16.4",
+ "@rollup/rollup-darwin-arm64": "4.16.4",
+ "@rollup/rollup-darwin-x64": "4.16.4",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.16.4",
+ "@rollup/rollup-linux-arm-musleabihf": "4.16.4",
+ "@rollup/rollup-linux-arm64-gnu": "4.16.4",
+ "@rollup/rollup-linux-arm64-musl": "4.16.4",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4",
+ "@rollup/rollup-linux-riscv64-gnu": "4.16.4",
+ "@rollup/rollup-linux-s390x-gnu": "4.16.4",
+ "@rollup/rollup-linux-x64-gnu": "4.16.4",
+ "@rollup/rollup-linux-x64-musl": "4.16.4",
+ "@rollup/rollup-win32-arm64-msvc": "4.16.4",
+ "@rollup/rollup-win32-ia32-msvc": "4.16.4",
+ "@rollup/rollup-win32-x64-msvc": "4.16.4",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/scroll-into-view-if-needed": {
+ "version": "2.2.31",
+ "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+ "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+ "dependencies": {
+ "compute-scroll-into-view": "^1.0.20"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.2.10",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz",
+ "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.20.1",
+ "postcss": "^8.4.38",
+ "rollup": "^4.13.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.4.25",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.25.tgz",
+ "integrity": "sha512-HWyDqoBHMgav/OKiYA2ZQg+kjfMgLt/T0vg4cbIF7JbXAjDexRf5JRg+PWAfrAkSmTd2I8aPSXtooBFWHB98cg==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.25",
+ "@vue/compiler-sfc": "3.4.25",
+ "@vue/runtime-dom": "3.4.25",
+ "@vue/server-renderer": "3.4.25",
+ "@vue/shared": "3.4.25"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.2.tgz",
+ "integrity": "sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.5.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ }
+ }
+}
diff --git a/vue/package.json b/vue/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..69f64d57d7ac4d45cd4aae7432ec521291a6c677
--- /dev/null
+++ b/vue/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "vue",
+ "version": "0.0.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@arco-themes/vue-qpanel": "^0.0.2",
+ "axios": "^1.6.8",
+ "vue": "^3.4.21",
+ "vue-router": "^4.3.0"
+ },
+ "devDependencies": {
+ "@arco-design/web-vue": "^2.55.1",
+ "@vitejs/plugin-vue": "^5.0.4",
+ "vite": "^5.2.8"
+ }
+}
diff --git a/vue/public/favicon.ico b/vue/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2
Binary files /dev/null and b/vue/public/favicon.ico differ
diff --git a/vue/src/App.vue b/vue/src/App.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f2f64e92917917d6e816b01370fad844de36f67f
--- /dev/null
+++ b/vue/src/App.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+
+
+ 概览
+
+
+
+ 网站
+
+
+
+ 数据库
+
+
+
+ FTP
+
+
+
+ 安全
+
+
+
+ 软件
+
+
+
+ 设置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vue/src/assets/base.css b/vue/src/assets/base.css
new file mode 100644
index 0000000000000000000000000000000000000000..8816868a41b651f318dee87c6784ebcd6e29eca1
--- /dev/null
+++ b/vue/src/assets/base.css
@@ -0,0 +1,86 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition:
+ color 0.5s,
+ background-color 0.5s;
+ line-height: 1.6;
+ font-family:
+ Inter,
+ -apple-system,
+ BlinkMacSystemFont,
+ 'Segoe UI',
+ Roboto,
+ Oxygen,
+ Ubuntu,
+ Cantarell,
+ 'Fira Sans',
+ 'Droid Sans',
+ 'Helvetica Neue',
+ sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/vue/src/assets/logo.svg b/vue/src/assets/logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7565660356e5b3723c9c33d508b830c9cfbea29f
--- /dev/null
+++ b/vue/src/assets/logo.svg
@@ -0,0 +1 @@
+
diff --git a/vue/src/assets/main.css b/vue/src/assets/main.css
new file mode 100644
index 0000000000000000000000000000000000000000..70c7f6f849042fb5a8a762eade7e05b37dffc558
--- /dev/null
+++ b/vue/src/assets/main.css
@@ -0,0 +1,8 @@
+@import './base.css';
+
+
+@media (hover: hover) {
+ a:hover {
+ background-color: hsla(160, 100%, 37%, 0.2);
+ }
+}
\ No newline at end of file
diff --git a/vue/src/components/HelloWorld.vue b/vue/src/components/HelloWorld.vue
new file mode 100644
index 0000000000000000000000000000000000000000..5fb372c9c9e8ad63c632a14fb0323627dbdf6bb1
--- /dev/null
+++ b/vue/src/components/HelloWorld.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
{{ msg }}
+
+ You’ve successfully created a project with
+ Vite +
+ Vue 3.
+
+
+
+
+
diff --git a/vue/src/components/TheWelcome.vue b/vue/src/components/TheWelcome.vue
new file mode 100644
index 0000000000000000000000000000000000000000..dab95367d4cb1dfe39b9c898fcd087ee3eda35b6
--- /dev/null
+++ b/vue/src/components/TheWelcome.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+ Documentation
+
+ Vue’s
+ official documentation
+ provides you with all information you need to get started.
+
+
+
+
+
+
+ Tooling
+
+ This project is served and bundled with
+ Vite. The
+ recommended IDE setup is
+ VSCode +
+ Volar. If
+ you need to test your components and web pages, check out
+ Cypress and
+ Cypress Component Testing.
+
+
+
+ More instructions are available in README.md.
+
+
+
+
+
+
+ Ecosystem
+
+ Get official tools and libraries for your project:
+ Pinia,
+ Vue Router,
+ Vue Test Utils, and
+ Vue Dev Tools. If
+ you need more resources, we suggest paying
+ Awesome Vue
+ a visit.
+
+
+
+
+
+
+ Community
+
+ Got stuck? Ask your question on
+ Vue Land, our official
+ Discord server, or
+ StackOverflow. You should also subscribe to
+ our mailing list and follow
+ the official
+ @vuejs
+ twitter account for latest news in the Vue world.
+
+
+
+
+
+
+ Support Vue
+
+ As an independent project, Vue relies on community backing for its sustainability. You can help
+ us by
+ becoming a sponsor.
+
+
diff --git a/vue/src/components/WelcomeItem.vue b/vue/src/components/WelcomeItem.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ac366d0740bfa462d7e9f290137601a3f3139ecc
--- /dev/null
+++ b/vue/src/components/WelcomeItem.vue
@@ -0,0 +1,86 @@
+
+