Browse Source

第一次提交,定时调度版本的resource,daily已经基本调试完成

wangxq 1 month ago
commit
b18b6738cb
100 changed files with 4716 additions and 0 deletions
  1. 28 0
      .gitgnore
  2. 164 0
      .venv/Include/site/python3.12/greenlet/greenlet.h
  3. 1 0
      .venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/INSTALLER
  4. 289 0
      .venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/LICENSE.txt
  5. 289 0
      .venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/METADATA
  6. 25 0
      .venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/RECORD
  7. 6 0
      .venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/WHEEL
  8. 1 0
      .venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/top_level.txt
  9. 1 0
      .venv/Lib/site-packages/Deprecated-1.2.18.dist-info/INSTALLER
  10. 21 0
      .venv/Lib/site-packages/Deprecated-1.2.18.dist-info/LICENSE.rst
  11. 195 0
      .venv/Lib/site-packages/Deprecated-1.2.18.dist-info/METADATA
  12. 12 0
      .venv/Lib/site-packages/Deprecated-1.2.18.dist-info/RECORD
  13. 6 0
      .venv/Lib/site-packages/Deprecated-1.2.18.dist-info/WHEEL
  14. 1 0
      .venv/Lib/site-packages/Deprecated-1.2.18.dist-info/top_level.txt
  15. 1 0
      .venv/Lib/site-packages/Flask-2.2.5.dist-info/INSTALLER
  16. 28 0
      .venv/Lib/site-packages/Flask-2.2.5.dist-info/LICENSE.rst
  17. 123 0
      .venv/Lib/site-packages/Flask-2.2.5.dist-info/METADATA
  18. 53 0
      .venv/Lib/site-packages/Flask-2.2.5.dist-info/RECORD
  19. 5 0
      .venv/Lib/site-packages/Flask-2.2.5.dist-info/WHEEL
  20. 2 0
      .venv/Lib/site-packages/Flask-2.2.5.dist-info/entry_points.txt
  21. 1 0
      .venv/Lib/site-packages/Flask-2.2.5.dist-info/top_level.txt
  22. 1 0
      .venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/INSTALLER
  23. 27 0
      .venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/LICENSE
  24. 242 0
      .venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/METADATA
  25. 336 0
      .venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/RECORD
  26. 5 0
      .venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/WHEEL
  27. 5 0
      .venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/entry_points.txt
  28. 1 0
      .venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/top_level.txt
  29. 1 0
      .venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/INSTALLER
  30. 31 0
      .venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/LICENSE
  31. 57 0
      .venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/METADATA
  32. 10 0
      .venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/RECORD
  33. 5 0
      .venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/WHEEL
  34. 1 0
      .venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/top_level.txt
  35. 1 0
      .venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/INSTALLER
  36. 69 0
      .venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/LICENSE
  37. 70 0
      .venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/METADATA
  38. 35 0
      .venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/RECORD
  39. 5 0
      .venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/WHEEL
  40. 1 0
      .venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/top_level.txt
  41. 1 0
      .venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/INSTALLER
  42. 21 0
      .venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/LICENSE
  43. 113 0
      .venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/METADATA
  44. 27 0
      .venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/RECORD
  45. 6 0
      .venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/WHEEL
  46. 1 0
      .venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/top_level.txt
  47. 1 0
      .venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER
  48. 22 0
      .venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/LICENSE
  49. 183 0
      .venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/METADATA
  50. 22 0
      .venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/RECORD
  51. 5 0
      .venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/WHEEL
  52. 1 0
      .venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt
  53. 1 0
      .venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/INSTALLER
  54. 28 0
      .venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/LICENSE.rst
  55. 94 0
      .venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/METADATA
  56. 14 0
      .venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/RECORD
  57. 6 0
      .venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/WHEEL
  58. 1 0
      .venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/top_level.txt
  59. 1 0
      .venv/Lib/site-packages/Mako-1.3.9.dist-info/INSTALLER
  60. 19 0
      .venv/Lib/site-packages/Mako-1.3.9.dist-info/LICENSE
  61. 87 0
      .venv/Lib/site-packages/Mako-1.3.9.dist-info/METADATA
  62. 74 0
      .venv/Lib/site-packages/Mako-1.3.9.dist-info/RECORD
  63. 5 0
      .venv/Lib/site-packages/Mako-1.3.9.dist-info/WHEEL
  64. 18 0
      .venv/Lib/site-packages/Mako-1.3.9.dist-info/entry_points.txt
  65. 1 0
      .venv/Lib/site-packages/Mako-1.3.9.dist-info/top_level.txt
  66. 1 0
      .venv/Lib/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER
  67. 28 0
      .venv/Lib/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt
  68. 92 0
      .venv/Lib/site-packages/MarkupSafe-3.0.2.dist-info/METADATA
  69. 14 0
      .venv/Lib/site-packages/MarkupSafe-3.0.2.dist-info/RECORD
  70. 5 0
      .venv/Lib/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL
  71. 1 0
      .venv/Lib/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt
  72. 7 0
      .venv/Lib/site-packages/PyJWT-2.10.1.dist-info/AUTHORS.rst
  73. 1 0
      .venv/Lib/site-packages/PyJWT-2.10.1.dist-info/INSTALLER
  74. 21 0
      .venv/Lib/site-packages/PyJWT-2.10.1.dist-info/LICENSE
  75. 106 0
      .venv/Lib/site-packages/PyJWT-2.10.1.dist-info/METADATA
  76. 32 0
      .venv/Lib/site-packages/PyJWT-2.10.1.dist-info/RECORD
  77. 5 0
      .venv/Lib/site-packages/PyJWT-2.10.1.dist-info/WHEEL
  78. 1 0
      .venv/Lib/site-packages/PyJWT-2.10.1.dist-info/top_level.txt
  79. 1 0
      .venv/Lib/site-packages/PyYAML-6.0.2.dist-info/INSTALLER
  80. 20 0
      .venv/Lib/site-packages/PyYAML-6.0.2.dist-info/LICENSE
  81. 46 0
      .venv/Lib/site-packages/PyYAML-6.0.2.dist-info/METADATA
  82. 43 0
      .venv/Lib/site-packages/PyYAML-6.0.2.dist-info/RECORD
  83. 5 0
      .venv/Lib/site-packages/PyYAML-6.0.2.dist-info/WHEEL
  84. 2 0
      .venv/Lib/site-packages/PyYAML-6.0.2.dist-info/top_level.txt
  85. 1 0
      .venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/INSTALLER
  86. 19 0
      .venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/LICENSE
  87. 252 0
      .venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/METADATA
  88. 487 0
      .venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/RECORD
  89. 5 0
      .venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/WHEEL
  90. 1 0
      .venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/top_level.txt
  91. 1 0
      .venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/INSTALLER
  92. 201 0
      .venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/LICENSE
  93. 135 0
      .venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/METADATA
  94. 12 0
      .venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/RECORD
  95. 5 0
      .venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/WHEEL
  96. 1 0
      .venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/top_level.txt
  97. 1 0
      .venv/Lib/site-packages/SQLAlchemy_Utils-0.41.2.dist-info/INSTALLER
  98. 27 0
      .venv/Lib/site-packages/SQLAlchemy_Utils-0.41.2.dist-info/LICENSE
  99. 96 0
      .venv/Lib/site-packages/SQLAlchemy_Utils-0.41.2.dist-info/METADATA
  100. 134 0
      .venv/Lib/site-packages/SQLAlchemy_Utils-0.41.2.dist-info/RECORD

+ 28 - 0
.gitgnore

@@ -0,0 +1,28 @@
+# 忽略 Python 缓存和虚拟环境
+__pycache__/
+*.py[cod]
+venv/
+.env
+.venv
+
+# 忽略日志文件
+*.log
+
+# 忽略操作系统文件
+.DS_Store
+Thumbs.db
+
+# 忽略编译生成文件
+*.class
+*.o
+*.exe
+
+# 忽略数据库文件
+*.db
+*.sqlite
+
+# 忽略 node_modules(前端项目)
+node_modules/
+
+# 忽略 JetBrains IDE 配置
+.idea/

+ 164 - 0
.venv/Include/site/python3.12/greenlet/greenlet.h

@@ -0,0 +1,164 @@
+/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */
+
+/* Greenlet object interface */
+
+#ifndef Py_GREENLETOBJECT_H
+#define Py_GREENLETOBJECT_H
+
+
+#include <Python.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* This is deprecated and undocumented. It does not change. */
+#define GREENLET_VERSION "1.0.0"
+
+#ifndef GREENLET_MODULE
+#define implementation_ptr_t void*
+#endif
+
+typedef struct _greenlet {
+    PyObject_HEAD
+    PyObject* weakreflist;
+    PyObject* dict;
+    implementation_ptr_t pimpl;
+} PyGreenlet;
+
+#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type))
+
+
+/* C API functions */
+
+/* Total number of symbols that are exported */
+#define PyGreenlet_API_pointers 12
+
+#define PyGreenlet_Type_NUM 0
+#define PyExc_GreenletError_NUM 1
+#define PyExc_GreenletExit_NUM 2
+
+#define PyGreenlet_New_NUM 3
+#define PyGreenlet_GetCurrent_NUM 4
+#define PyGreenlet_Throw_NUM 5
+#define PyGreenlet_Switch_NUM 6
+#define PyGreenlet_SetParent_NUM 7
+
+#define PyGreenlet_MAIN_NUM 8
+#define PyGreenlet_STARTED_NUM 9
+#define PyGreenlet_ACTIVE_NUM 10
+#define PyGreenlet_GET_PARENT_NUM 11
+
+#ifndef GREENLET_MODULE
+/* This section is used by modules that uses the greenlet C API */
+static void** _PyGreenlet_API = NULL;
+
+#    define PyGreenlet_Type \
+        (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM])
+
+#    define PyExc_GreenletError \
+        ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM])
+
+#    define PyExc_GreenletExit \
+        ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM])
+
+/*
+ * PyGreenlet_New(PyObject *args)
+ *
+ * greenlet.greenlet(run, parent=None)
+ */
+#    define PyGreenlet_New                                        \
+        (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \
+             _PyGreenlet_API[PyGreenlet_New_NUM])
+
+/*
+ * PyGreenlet_GetCurrent(void)
+ *
+ * greenlet.getcurrent()
+ */
+#    define PyGreenlet_GetCurrent \
+        (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM])
+
+/*
+ * PyGreenlet_Throw(
+ *         PyGreenlet *greenlet,
+ *         PyObject *typ,
+ *         PyObject *val,
+ *         PyObject *tb)
+ *
+ * g.throw(...)
+ */
+#    define PyGreenlet_Throw                 \
+        (*(PyObject * (*)(PyGreenlet * self, \
+                          PyObject * typ,    \
+                          PyObject * val,    \
+                          PyObject * tb))    \
+             _PyGreenlet_API[PyGreenlet_Throw_NUM])
+
+/*
+ * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args)
+ *
+ * g.switch(*args, **kwargs)
+ */
+#    define PyGreenlet_Switch                                              \
+        (*(PyObject *                                                      \
+           (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \
+             _PyGreenlet_API[PyGreenlet_Switch_NUM])
+
+/*
+ * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent)
+ *
+ * g.parent = new_parent
+ */
+#    define PyGreenlet_SetParent                                 \
+        (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \
+             _PyGreenlet_API[PyGreenlet_SetParent_NUM])
+
+/*
+ * PyGreenlet_GetParent(PyObject* greenlet)
+ *
+ * return greenlet.parent;
+ *
+ * This could return NULL even if there is no exception active.
+ * If it does not return NULL, you are responsible for decrementing the
+ * reference count.
+ */
+#     define PyGreenlet_GetParent                                    \
+    (*(PyGreenlet* (*)(PyGreenlet*))                                 \
+     _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM])
+
+/*
+ * deprecated, undocumented alias.
+ */
+#     define PyGreenlet_GET_PARENT PyGreenlet_GetParent
+
+#     define PyGreenlet_MAIN                                         \
+    (*(int (*)(PyGreenlet*))                                         \
+     _PyGreenlet_API[PyGreenlet_MAIN_NUM])
+
+#     define PyGreenlet_STARTED                                      \
+    (*(int (*)(PyGreenlet*))                                         \
+     _PyGreenlet_API[PyGreenlet_STARTED_NUM])
+
+#     define PyGreenlet_ACTIVE                                       \
+    (*(int (*)(PyGreenlet*))                                         \
+     _PyGreenlet_API[PyGreenlet_ACTIVE_NUM])
+
+
+
+
+/* Macro that imports greenlet and initializes C API */
+/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we
+   keep the older definition to be sure older code that might have a copy of
+   the header still works. */
+#    define PyGreenlet_Import()                                               \
+        {                                                                     \
+            _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \
+        }
+
+#endif /* GREENLET_MODULE */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_GREENLETOBJECT_H */

+ 1 - 0
.venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 289 - 0
.venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/LICENSE.txt

@@ -0,0 +1,289 @@
+ConfigUpdater is licensed under the MIT license; see below for details.
+
+ConfigUpdater includes code derived from the Python standard library, which is
+licensed under the Python license, a permissive open source license.
+The copyright and license are included at the bottom of this file for compliance
+with Python's terms.
+
+----------------------------------------------------------------------
+
+The MIT License (MIT)
+
+Copyright (c) 2018 Florian Wilhelm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+----------------------------------------------------------------------
+
+Copyright (c) 2001-present Python Software Foundation; All Rights Reserved
+
+A. HISTORY OF THE SOFTWARE
+==========================
+
+Python was created in the early 1990s by Guido van Rossum at Stichting
+Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
+as a successor of a language called ABC.  Guido remains Python's
+principal author, although it includes many contributions from others.
+
+In 1995, Guido continued his work on Python at the Corporation for
+National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
+in Reston, Virginia where he released several versions of the
+software.
+
+In May 2000, Guido and the Python core development team moved to
+BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
+year, the PythonLabs team moved to Digital Creations, which became
+Zope Corporation.  In 2001, the Python Software Foundation (PSF, see
+https://www.python.org/psf/) was formed, a non-profit organization
+created specifically to own Python-related Intellectual Property.
+Zope Corporation was a sponsoring member of the PSF.
+
+All Python releases are Open Source (see http://www.opensource.org for
+the Open Source Definition).  Historically, most, but not all, Python
+releases have also been GPL-compatible; the table below summarizes
+the various releases.
+
+    Release         Derived     Year        Owner       GPL-
+                    from                                compatible? (1)
+
+    0.9.0 thru 1.2              1991-1995   CWI         yes
+    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
+    1.6             1.5.2       2000        CNRI        no
+    2.0             1.6         2000        BeOpen.com  no
+    1.6.1           1.6         2001        CNRI        yes (2)
+    2.1             2.0+1.6.1   2001        PSF         no
+    2.0.1           2.0+1.6.1   2001        PSF         yes
+    2.1.1           2.1+2.0.1   2001        PSF         yes
+    2.1.2           2.1.1       2002        PSF         yes
+    2.1.3           2.1.2       2002        PSF         yes
+    2.2 and above   2.1.1       2001-now    PSF         yes
+
+Footnotes:
+
+(1) GPL-compatible doesn't mean that we're distributing Python under
+    the GPL.  All Python licenses, unlike the GPL, let you distribute
+    a modified version without making your changes open source.  The
+    GPL-compatible licenses make it possible to combine Python with
+    other software that is released under the GPL; the others don't.
+
+(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
+    because its license has a choice of law clause.  According to
+    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
+    is "not incompatible" with the GPL.
+
+Thanks to the many outside volunteers who have worked under Guido's
+direction to make these releases possible.
+
+
+B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
+===============================================================
+
+PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+--------------------------------------------
+
+1. This LICENSE AGREEMENT is between the Python Software Foundation
+("PSF"), and the Individual or Organization ("Licensee") accessing and
+otherwise using this software ("Python") in source or binary form and
+its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, PSF hereby
+grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
+analyze, test, perform and/or display publicly, prepare derivative works,
+distribute, and otherwise use Python alone or in any derivative version,
+provided, however, that PSF's License Agreement and PSF's notice of copyright,
+i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation;
+All Rights Reserved" are retained in Python alone or in any derivative version
+prepared by Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python.
+
+4. PSF is making Python available to Licensee on an "AS IS"
+basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between PSF and
+Licensee.  This License Agreement does not grant permission to use PSF
+trademarks or trade name in a trademark sense to endorse or promote
+products or services of Licensee, or any third party.
+
+8. By copying, installing or otherwise using Python, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+-------------------------------------------
+
+BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+
+1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+Individual or Organization ("Licensee") accessing and otherwise using
+this software in source or binary form and its associated
+documentation ("the Software").
+
+2. Subject to the terms and conditions of this BeOpen Python License
+Agreement, BeOpen hereby grants Licensee a non-exclusive,
+royalty-free, world-wide license to reproduce, analyze, test, perform
+and/or display publicly, prepare derivative works, distribute, and
+otherwise use the Software alone or in any derivative version,
+provided, however, that the BeOpen Python License is retained in the
+Software, alone or in any derivative version prepared by Licensee.
+
+3. BeOpen is making the Software available to Licensee on an "AS IS"
+basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+5. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+6. This License Agreement shall be governed by and interpreted in all
+respects by the law of the State of California, excluding conflict of
+law provisions.  Nothing in this License Agreement shall be deemed to
+create any relationship of agency, partnership, or joint venture
+between BeOpen and Licensee.  This License Agreement does not grant
+permission to use BeOpen trademarks or trade names in a trademark
+sense to endorse or promote products or services of Licensee, or any
+third party.  As an exception, the "BeOpen Python" logos available at
+http://www.pythonlabs.com/logos.html may be used according to the
+permissions granted on that web page.
+
+7. By copying, installing or otherwise using the software, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
+---------------------------------------
+
+1. This LICENSE AGREEMENT is between the Corporation for National
+Research Initiatives, having an office at 1895 Preston White Drive,
+Reston, VA 20191 ("CNRI"), and the Individual or Organization
+("Licensee") accessing and otherwise using Python 1.6.1 software in
+source or binary form and its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, CNRI
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 1.6.1
+alone or in any derivative version, provided, however, that CNRI's
+License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
+1995-2001 Corporation for National Research Initiatives; All Rights
+Reserved" are retained in Python 1.6.1 alone or in any derivative
+version prepared by Licensee.  Alternately, in lieu of CNRI's License
+Agreement, Licensee may substitute the following text (omitting the
+quotes): "Python 1.6.1 is made available subject to the terms and
+conditions in CNRI's License Agreement.  This Agreement together with
+Python 1.6.1 may be located on the Internet using the following
+unique, persistent identifier (known as a handle): 1895.22/1013.  This
+Agreement may also be obtained from a proxy server on the Internet
+using the following URL: http://hdl.handle.net/1895.22/1013".
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 1.6.1 or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python 1.6.1.
+
+4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
+basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. This License Agreement shall be governed by the federal
+intellectual property law of the United States, including without
+limitation the federal copyright law, and, to the extent such
+U.S. federal law does not apply, by the law of the Commonwealth of
+Virginia, excluding Virginia's conflict of law provisions.
+Notwithstanding the foregoing, with regard to derivative works based
+on Python 1.6.1 that incorporate non-separable material that was
+previously distributed under the GNU General Public License (GPL), the
+law of the Commonwealth of Virginia shall govern this License
+Agreement only as to issues arising under or with respect to
+Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
+License Agreement shall be deemed to create any relationship of
+agency, partnership, or joint venture between CNRI and Licensee.  This
+License Agreement does not grant permission to use CNRI trademarks or
+trade name in a trademark sense to endorse or promote products or
+services of Licensee, or any third party.
+
+8. By clicking on the "ACCEPT" button where indicated, or by copying,
+installing or otherwise using Python 1.6.1, Licensee agrees to be
+bound by the terms and conditions of this License Agreement.
+
+        ACCEPT
+
+
+CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+--------------------------------------------------
+
+Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+The Netherlands.  All rights reserved.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ 289 - 0
.venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/METADATA

@@ -0,0 +1,289 @@
+Metadata-Version: 2.1
+Name: ConfigUpdater
+Version: 3.2
+Summary: Parser like ConfigParser but for updating configuration files
+Home-page: https://github.com/pyscaffold/configupdater
+Author: Florian Wilhelm
+Author-email: florian.wilhelm@gmail.com
+License: MIT
+Project-URL: Documentation, https://configupdater.readthedocs.io/
+Project-URL: Source, https://github.com/pyscaffold/configupdater/
+Project-URL: Tracker, https://github.com/pyscaffold/configupdater/issues
+Project-URL: Changelog, https://configupdater.readthedocs.io/en/latest/changelog.html
+Project-URL: Download, https://pypi.org/project/configupdater/#files
+Project-URL: Conda-Forge, https://anaconda.org/conda-forge/configupdater
+Platform: any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Operating System :: OS Independent
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Intended Audience :: Developers
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Operating System :: Unix
+Classifier: Operating System :: MacOS
+Classifier: Operating System :: Microsoft :: Windows
+Requires-Python: >=3.6
+Description-Content-Type: text/x-rst; charset=UTF-8
+License-File: LICENSE.txt
+Requires-Dist: importlib-metadata ; python_version < "3.8"
+Provides-Extra: testing
+Requires-Dist: sphinx ; extra == 'testing'
+Requires-Dist: flake8 ; extra == 'testing'
+Requires-Dist: pytest ; extra == 'testing'
+Requires-Dist: pytest-cov ; extra == 'testing'
+Requires-Dist: pytest-xdist ; extra == 'testing'
+Requires-Dist: pytest-randomly ; extra == 'testing'
+
+.. image:: https://api.cirrus-ci.com/github/pyscaffold/configupdater.svg?branch=main
+    :alt: Built Status
+    :target: https://cirrus-ci.com/github/pyscaffold/configupdater
+.. image:: https://readthedocs.org/projects/pyscaffold/badge/?version=latest
+    :alt: ReadTheDocs
+    :target: https://configupdater.readthedocs.io/
+.. image:: https://img.shields.io/coveralls/github/pyscaffold/configupdater/main.svg
+    :alt: Coveralls
+    :target: https://coveralls.io/r/pyscaffold/configupdater
+.. image:: https://img.shields.io/pypi/v/configupdater.svg
+    :alt: PyPI-Server
+    :target: https://pypi.org/project/configupdater/
+.. image:: https://img.shields.io/conda/vn/conda-forge/configupdater.svg
+    :alt: Conda-Forge
+    :target: https://anaconda.org/conda-forge/configupdater
+.. image:: https://static.pepy.tech/badge/configupdater/month
+    :alt: Monthly Downloads
+    :target: https://pepy.tech/project/configupdater
+.. image:: https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&color=ff69b4
+    :alt: Sponsor me
+    :target: https://github.com/sponsors/FlorianWilhelm
+
+|
+
+.. image:: https://configupdater.readthedocs.io/en/latest/_images/banner-640x323.png
+    :height: 323px
+    :width: 640px
+    :scale: 60 %
+    :alt: Config Updater
+    :align: center
+
+|
+
+The sole purpose of `ConfigUpdater`_ is to easily update an INI config file
+with no changes to the original file except the intended ones. This means
+comments, the ordering of sections and key/value-pairs as wells as their
+cases are kept as in the original file. Thus ConfigUpdater provides
+complementary functionality to Python's `ConfigParser`_ which is primarily
+meant for reading config files and writing *new* ones.
+
+Features
+========
+
+The key differences to `ConfigParser`_ are:
+
+* minimal invasive changes in the update configuration file,
+* proper handling of comments,
+* only a single config file can be updated at a time,
+* the original case of sections and keys are kept,
+* control over the position of a new section/key
+
+Following features are **deliberately not** implemented:
+
+* interpolation of values,
+* propagation of parameters from the default section,
+* conversions of values,
+* passing key/value-pairs with ``default`` argument,
+* non-strict mode allowing duplicate sections and keys.
+
+Usage
+=====
+
+First install the package with either::
+
+    pip install configupdater
+
+or::
+
+    conda install -c conda-forge configupdater
+
+Now we can simply do::
+
+    from configupdater import ConfigUpdater
+
+    updater = ConfigUpdater()
+    updater.read("setup.cfg")
+
+which would read the file ``setup.cfg`` that is found in many projects.
+
+To change the value of an existing key we can simply do::
+
+    updater["metadata"]["author"].value = "Alan Turing"
+
+At any point we can print the current state of the configuration file with::
+
+    print(updater)
+
+To update the read-in file just call ``updater.update_file()`` or ``updater.write(open('filename','w'))``
+to write the changed configuration file to another destination. Before actually writing,
+ConfigUpdater will automatically check that the updated configuration file is still valid by
+parsing it with the help of ConfigParser.
+
+Many of ConfigParser's methods still exists and it's best to look them up in the `module reference`_.
+Let's look at some examples.
+
+Adding and removing options
+---------------------------
+
+Let's say we have the following configuration in a string::
+
+    cfg = """
+    [metadata]
+    author = Ada Lovelace
+    summary = The Analytical Engine
+    """
+
+We can add an *license* option, i.e. a key/value pair, in the same way we would do with ConfigParser::
+
+    updater = ConfigUpdater()
+    updater.read_string(cfg)
+    updater["metadata"]["license"] = "MIT"
+
+A simple ``print(updater)`` will give show you that the new option was appended to the end::
+
+    [metadata]
+    author = Ada Lovelace
+    summary = The Analytical Engine
+    license = MIT
+
+Since the license is really important to us let's say we want to add it before the ``summary``
+and even add a short comment before it::
+
+    updater = ConfigUpdater()
+    updater.read_string(cfg)
+    (updater["metadata"]["summary"].add_before
+                                   .comment("Ada would have loved MIT")
+                                   .option("license", "MIT"))
+
+which would result in::
+
+    [metadata]
+    author = Ada Lovelace
+    # Ada would have loved MIT
+    license = MIT
+    summary = Analytical Engine calculating the Bernoulli numbers
+
+Using ``add_after`` would give the same result and looks like::
+
+    updater = ConfigUpdater()
+    updater.read_string(cfg)
+    (updater["metadata"]["author"].add_after
+                                  .comment("Ada would have loved MIT")
+                                  .option("license", "MIT"))
+
+Let's say we want to rename `summary` to the more common `description`::
+
+    updater = ConfigUpdater()
+    updater.read_string(cfg)
+    updater["metadata"]["summary"].key = "description"
+
+If we wanted no summary at all, we could just do ``del updater["metadata"]["summary"]``.
+
+
+Adding and removing sections
+----------------------------
+
+Adding and remove sections just works like adding and removing options but on a higher level.
+Sticking to our *Ada Lovelace* example, let's say we want to add a section ``options`` just
+before ``metadata`` with a comment and two new lines to separate it from ``metadata``::
+
+    updater = ConfigUpdater()
+    updater.read_string(cfg)
+    (updater["metadata"].add_before
+                        .section("options")
+                        .comment("Some specific project options")
+                        .space(2))
+
+As expected, this results in::
+
+    [options]
+    # Some specific project options
+
+
+    [metadata]
+    author = Ada Lovelace
+    summary = The Analytical Engine
+
+We could now fill the new section with options like we learnt before. If we wanted to rename
+an existing section we could do this with the help of the ``name`` attribute::
+
+    updater["metadata"].name = "MetaData"
+
+Sometimes it might be useful to inject a new section not in a programmatic way but more declarative.
+Let's assume we have thus defined our new section in a multi-line string::
+
+    sphinx_sect_str = """
+    [build_sphinx]
+    source_dir = docs
+    build_dir = docs/_build
+    """
+
+With the help of two ConfigUpdater objects we can easily inject this section into our example::
+
+    sphinx = ConfigUpdater()
+    sphinx.read_string(sphinx_sect_str)
+    sphinx_sect = sphinx["build_sphinx"]
+
+    updater = ConfigUpdater()
+    updater.read_string(cfg)
+
+    (updater["metadata"].add_after
+                        .space()
+                        .section(sphinx_sect.detach()))
+
+The ``detach`` method will remove the ``build_sphinx`` section from the first object
+and add it to the second object. This results in::
+
+    [metadata]
+    author = Ada Lovelace
+    summary = The Analytical Engine
+
+    [build_sphinx]
+    source_dir = docs
+    build_dir = docs/_build
+
+Alternatively, if you want to preserve ``build_sphinx`` in both
+``ConfigUpdater`` objects (i.e., prevent it from being removed from the first
+while still adding a copy to the second), you call also rely on stdlib's
+``copy.deepcopy`` function instead of ``detach``::
+
+    from copy import deepcopy
+
+    (updater["metadata"].add_after
+                        .space()
+                        .section(deepcopy(sphinx_sect)))
+
+This technique can be used for all objects inside ConfigUpdater: sections,
+options, comments and blank spaces.
+
+Shallow copies are discouraged in the context of ConfigUpdater because each
+configuration block keeps a reference to its container to allow easy document
+editing. When doing editions (such as adding or changing options and comments)
+based on a shallow copy, the results can be unreliable and unexpected.
+
+For more examples on how the API of ConfigUpdater works it's best to take a look into the
+`unit tests`_ and read the references.
+
+
+Notes
+=====
+
+ConfigUpdater is mainly developed for `PyScaffold`_.
+
+.. _ConfigParser: https://docs.python.org/3/library/configparser.html
+.. _ConfigUpdater: https://configupdater.readthedocs.io/
+.. _PyScaffold: https://pyscaffold.org/
+.. _module reference: https://configupdater.readthedocs.io/en/latest/api.html#configupdater.configupdater.ConfigUpdater
+.. _unit tests: https://github.com/pyscaffold/configupdater/blob/main/tests/test_configupdater.py

+ 25 - 0
.venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/RECORD

@@ -0,0 +1,25 @@
+ConfigUpdater-3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+ConfigUpdater-3.2.dist-info/LICENSE.txt,sha256=t_IAs6aOhF6A7JaCD91OZ7bNsZ2IjmavMoFtQDXtRBY,14402
+ConfigUpdater-3.2.dist-info/METADATA,sha256=RtCiOgP7C9rZ9wUdyWux1ni6FxM9yDIiMSxMsnypoaI,10278
+ConfigUpdater-3.2.dist-info/RECORD,,
+ConfigUpdater-3.2.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110
+ConfigUpdater-3.2.dist-info/top_level.txt,sha256=DTEzHw73sxgej5KdJQXYvs7wGjJr83B2mlKCydOrcWo,14
+configupdater/__init__.py,sha256=1fc8RP_7xBGK7mJ4U63-euPYF5ix-vghCZLMepb4hNg,790
+configupdater/__pycache__/__init__.cpython-312.pyc,,
+configupdater/__pycache__/block.cpython-312.pyc,,
+configupdater/__pycache__/builder.cpython-312.pyc,,
+configupdater/__pycache__/configupdater.cpython-312.pyc,,
+configupdater/__pycache__/container.cpython-312.pyc,,
+configupdater/__pycache__/document.cpython-312.pyc,,
+configupdater/__pycache__/option.cpython-312.pyc,,
+configupdater/__pycache__/parser.cpython-312.pyc,,
+configupdater/__pycache__/section.cpython-312.pyc,,
+configupdater/block.py,sha256=jMhfXSffCcVKJRh9k5BUmxVID-8XWl2DD9q8Z4QAJ3k,6266
+configupdater/builder.py,sha256=-FX_s1AonAVSq1TGUDqNJPl_U0mNzDTHuHGl68laB2o,3548
+configupdater/configupdater.py,sha256=Vtrw-EsB7TMcTpTsWIlnrj-llPRYNkraLqXfbhwGtrE,7273
+configupdater/container.py,sha256=bNWjIX42mehgIXzmVQX9g0YNgpkC-HUUpjnkyIXxKCA,2856
+configupdater/document.py,sha256=CaYr4t1mzcetsGFkuwIJBmzPCJ6aQLvusUomLZ_LjDc,14094
+configupdater/option.py,sha256=tMuTL71WcMJ4JARWa59i0D2VIRXG42idoo7ft8OtyRM,8801
+configupdater/parser.py,sha256=_9GMybwQUjYM7oUsPl-j-4FTtUzqqa8OGyNE9FBk1IE,24004
+configupdater/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+configupdater/section.py,sha256=SmtYoPRs8InPmJJjy5Z2_9deMF_XXy72RvMO3LS9yV0,11293

+ 6 - 0
.venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/WHEEL

@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.42.0)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+

+ 1 - 0
.venv/Lib/site-packages/ConfigUpdater-3.2.dist-info/top_level.txt

@@ -0,0 +1 @@
+configupdater

+ 1 - 0
.venv/Lib/site-packages/Deprecated-1.2.18.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 21 - 0
.venv/Lib/site-packages/Deprecated-1.2.18.dist-info/LICENSE.rst

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

+ 195 - 0
.venv/Lib/site-packages/Deprecated-1.2.18.dist-info/METADATA

@@ -0,0 +1,195 @@
+Metadata-Version: 2.2
+Name: Deprecated
+Version: 1.2.18
+Summary: Python @deprecated decorator to deprecate old python classes, functions or methods.
+Home-page: https://github.com/laurent-laporte-pro/deprecated
+Author: Laurent LAPORTE
+Author-email: laurent.laporte.pro@gmail.com
+License: MIT
+Project-URL: Documentation, https://deprecated.readthedocs.io/en/latest/
+Project-URL: Source, https://github.com/laurent-laporte-pro/deprecated
+Project-URL: Bug Tracker, https://github.com/laurent-laporte-pro/deprecated/issues
+Keywords: deprecate,deprecated,deprecation,warning,warn,decorator
+Platform: any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
+Description-Content-Type: text/x-rst
+License-File: LICENSE.rst
+Requires-Dist: wrapt<2,>=1.10
+Provides-Extra: dev
+Requires-Dist: tox; extra == "dev"
+Requires-Dist: PyTest; extra == "dev"
+Requires-Dist: PyTest-Cov; extra == "dev"
+Requires-Dist: bump2version<1; extra == "dev"
+Requires-Dist: setuptools; python_version >= "3.12" and extra == "dev"
+Dynamic: author
+Dynamic: author-email
+Dynamic: classifier
+Dynamic: description
+Dynamic: description-content-type
+Dynamic: home-page
+Dynamic: keywords
+Dynamic: license
+Dynamic: platform
+Dynamic: project-url
+Dynamic: provides-extra
+Dynamic: requires-dist
+Dynamic: requires-python
+Dynamic: summary
+
+
+Deprecated Library
+------------------
+
+Deprecated is Easy to Use
+`````````````````````````
+
+If you need to mark a function or a method as deprecated,
+you can use the ``@deprecated`` decorator:
+
+Save in a hello.py:
+
+.. code:: python
+
+    from deprecated import deprecated
+
+
+    @deprecated(version='1.2.1', reason="You should use another function")
+    def some_old_function(x, y):
+        return x + y
+
+
+    class SomeClass(object):
+        @deprecated(version='1.3.0', reason="This method is deprecated")
+        def some_old_method(self, x, y):
+            return x + y
+
+
+    some_old_function(12, 34)
+    obj = SomeClass()
+    obj.some_old_method(5, 8)
+
+
+And Easy to Setup
+`````````````````
+
+And run it:
+
+.. code:: bash
+
+    $ pip install Deprecated
+    $ python hello.py
+    hello.py:15: DeprecationWarning: Call to deprecated function (or staticmethod) some_old_function.
+    (You should use another function) -- Deprecated since version 1.2.0.
+      some_old_function(12, 34)
+    hello.py:17: DeprecationWarning: Call to deprecated method some_old_method.
+    (This method is deprecated) -- Deprecated since version 1.3.0.
+      obj.some_old_method(5, 8)
+
+
+You can document your code
+``````````````````````````
+
+Have you ever wonder how to document that some functions, classes, methods, etc. are deprecated?
+This is now possible with the integrated Sphinx directives:
+
+For instance, in hello_sphinx.py:
+
+.. code:: python
+
+    from deprecated.sphinx import deprecated
+    from deprecated.sphinx import versionadded
+    from deprecated.sphinx import versionchanged
+
+
+    @versionadded(version='1.0', reason="This function is new")
+    def function_one():
+        '''This is the function one'''
+
+
+    @versionchanged(version='1.0', reason="This function is modified")
+    def function_two():
+        '''This is the function two'''
+
+
+    @deprecated(version='1.0', reason="This function will be removed soon")
+    def function_three():
+        '''This is the function three'''
+
+
+    function_one()
+    function_two()
+    function_three()  # warns
+
+    help(function_one)
+    help(function_two)
+    help(function_three)
+
+
+The result it immediate
+```````````````````````
+
+Run it:
+
+.. code:: bash
+
+    $ python hello_sphinx.py
+
+    hello_sphinx.py:23: DeprecationWarning: Call to deprecated function (or staticmethod) function_three.
+    (This function will be removed soon) -- Deprecated since version 1.0.
+      function_three()  # warns
+
+    Help on function function_one in module __main__:
+
+    function_one()
+        This is the function one
+
+        .. versionadded:: 1.0
+           This function is new
+
+    Help on function function_two in module __main__:
+
+    function_two()
+        This is the function two
+
+        .. versionchanged:: 1.0
+           This function is modified
+
+    Help on function function_three in module __main__:
+
+    function_three()
+        This is the function three
+
+        .. deprecated:: 1.0
+           This function will be removed soon
+
+
+Links
+`````
+
+* `Python package index (PyPi) <https://pypi.org/project/Deprecated/>`_
+* `GitHub website <https://github.com/laurent-laporte-pro/deprecated>`_
+* `Read The Docs <https://readthedocs.org/projects/deprecated>`_
+* `EBook on Lulu.com <http://www.lulu.com/commerce/index.php?fBuyContent=21305117>`_
+* `StackOverFlow Q&A <https://stackoverflow.com/a/40301488/1513933>`_
+* `Development version
+  <https://github.com/laurent-laporte-pro/deprecated/zipball/master#egg=Deprecated-dev>`_
+

+ 12 - 0
.venv/Lib/site-packages/Deprecated-1.2.18.dist-info/RECORD

@@ -0,0 +1,12 @@
+Deprecated-1.2.18.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+Deprecated-1.2.18.dist-info/LICENSE.rst,sha256=HoPt0VvkGbXVveNy4yXlJ_9PmRX1SOfHUxS0H2aZ6Dw,1081
+Deprecated-1.2.18.dist-info/METADATA,sha256=4CrUw5Bl8_NsBuZYe0Nw-mIwQnVpT1CnmBYU9BqOuq8,5725
+Deprecated-1.2.18.dist-info/RECORD,,
+Deprecated-1.2.18.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
+Deprecated-1.2.18.dist-info/top_level.txt,sha256=nHbOYawKPQQE5lQl-toUB1JBRJjUyn_m_Mb8RVJ0RjA,11
+deprecated/__init__.py,sha256=yZNbmDKXF4PLtp_Ikdb_9ObJLkHuFSUHvqidFTKKGFM,351
+deprecated/__pycache__/__init__.cpython-312.pyc,,
+deprecated/__pycache__/classic.cpython-312.pyc,,
+deprecated/__pycache__/sphinx.cpython-312.pyc,,
+deprecated/classic.py,sha256=7WXOt4Vf1NhrUznm8ypjS50CMyAdZwrGT58Lhb8fW14,10609
+deprecated/sphinx.py,sha256=cOKnXbDyFAwDr5O7HBEpgQrx-J-qfp57sfdK_LabDxs,11109

+ 6 - 0
.venv/Lib/site-packages/Deprecated-1.2.18.dist-info/WHEEL

@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: setuptools (75.8.0)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+

+ 1 - 0
.venv/Lib/site-packages/Deprecated-1.2.18.dist-info/top_level.txt

@@ -0,0 +1 @@
+deprecated

+ 1 - 0
.venv/Lib/site-packages/Flask-2.2.5.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 28 - 0
.venv/Lib/site-packages/Flask-2.2.5.dist-info/LICENSE.rst

@@ -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.

+ 123 - 0
.venv/Lib/site-packages/Flask-2.2.5.dist-info/METADATA

@@ -0,0 +1,123 @@
+Metadata-Version: 2.1
+Name: Flask
+Version: 2.2.5
+Summary: A simple framework for building complex web applications.
+Home-page: https://palletsprojects.com/p/flask
+Author: Armin Ronacher
+Author-email: armin.ronacher@active-4.com
+Maintainer: Pallets
+Maintainer-email: contact@palletsprojects.com
+License: BSD-3-Clause
+Project-URL: Donate, https://palletsprojects.com/donate
+Project-URL: Documentation, https://flask.palletsprojects.com/
+Project-URL: Changes, https://flask.palletsprojects.com/changes/
+Project-URL: Source Code, https://github.com/pallets/flask/
+Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/
+Project-URL: Twitter, https://twitter.com/PalletsTeam
+Project-URL: Chat, https://discord.gg/pallets
+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
+Requires-Python: >=3.7
+Description-Content-Type: text/x-rst
+License-File: LICENSE.rst
+Requires-Dist: Werkzeug (>=2.2.2)
+Requires-Dist: Jinja2 (>=3.0)
+Requires-Dist: itsdangerous (>=2.0)
+Requires-Dist: click (>=8.0)
+Requires-Dist: importlib-metadata (>=3.6.0) ; python_version < "3.10"
+Provides-Extra: async
+Requires-Dist: asgiref (>=3.2) ; extra == 'async'
+Provides-Extra: dotenv
+Requires-Dist: python-dotenv ; 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 using `pip`_:
+
+.. code-block:: text
+
+    $ pip install -U Flask
+
+.. _pip: https://pip.pypa.io/en/stable/getting-started/
+
+
+A Simple Example
+----------------
+
+.. code-block:: python
+
+    # save this as app.py
+    from flask import Flask
+
+    app = Flask(__name__)
+
+    @app.route("/")
+    def hello():
+        return "Hello, World!"
+
+.. code-block:: text
+
+    $ 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
+
+
+Links
+-----
+
+-   Documentation: https://flask.palletsprojects.com/
+-   Changes: https://flask.palletsprojects.com/changes/
+-   PyPI Releases: https://pypi.org/project/Flask/
+-   Source Code: https://github.com/pallets/flask/
+-   Issue Tracker: https://github.com/pallets/flask/issues/
+-   Website: https://palletsprojects.com/p/flask/
+-   Twitter: https://twitter.com/PalletsTeam
+-   Chat: https://discord.gg/pallets

+ 53 - 0
.venv/Lib/site-packages/Flask-2.2.5.dist-info/RECORD

@@ -0,0 +1,53 @@
+../../Scripts/flask.exe,sha256=cSL-iGkdv6hwFvUONbA-l-ngSYY92xhNs6MXZi2385U,108416
+Flask-2.2.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+Flask-2.2.5.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
+Flask-2.2.5.dist-info/METADATA,sha256=rZTjr5v4M7HB-zC-w2Y0ZU96OYSGBb-Hm15jlLJhs3g,3889
+Flask-2.2.5.dist-info/RECORD,,
+Flask-2.2.5.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
+Flask-2.2.5.dist-info/entry_points.txt,sha256=s3MqQpduU25y4dq3ftBYD6bMVdVnbMpZP-sUNw0zw0k,41
+Flask-2.2.5.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6
+flask/__init__.py,sha256=GJgAILDWhW_DQljuoJ4pk9zBUy70zPPu-VZ6kLyiVI4,2890
+flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30
+flask/__pycache__/__init__.cpython-312.pyc,,
+flask/__pycache__/__main__.cpython-312.pyc,,
+flask/__pycache__/app.cpython-312.pyc,,
+flask/__pycache__/blueprints.cpython-312.pyc,,
+flask/__pycache__/cli.cpython-312.pyc,,
+flask/__pycache__/config.cpython-312.pyc,,
+flask/__pycache__/ctx.cpython-312.pyc,,
+flask/__pycache__/debughelpers.cpython-312.pyc,,
+flask/__pycache__/globals.cpython-312.pyc,,
+flask/__pycache__/helpers.cpython-312.pyc,,
+flask/__pycache__/logging.cpython-312.pyc,,
+flask/__pycache__/scaffold.cpython-312.pyc,,
+flask/__pycache__/sessions.cpython-312.pyc,,
+flask/__pycache__/signals.cpython-312.pyc,,
+flask/__pycache__/templating.cpython-312.pyc,,
+flask/__pycache__/testing.cpython-312.pyc,,
+flask/__pycache__/typing.cpython-312.pyc,,
+flask/__pycache__/views.cpython-312.pyc,,
+flask/__pycache__/wrappers.cpython-312.pyc,,
+flask/app.py,sha256=ue4tEeDnr3m-eSEwz7OJ1_wafSYl3fl6eo-NLFgNNJQ,99141
+flask/blueprints.py,sha256=fenhKP_Sh5eU6qtWeHacg1GVeun4pQzK2vq8sNDd1hY,27266
+flask/cli.py,sha256=pLmnWObe_G4_ZAFQdh7kgwqPMxRXm4oUhaUSBpJMeq4,33532
+flask/config.py,sha256=Ubo_juzSYsAKqD2vD3vm6mjsPo3EOJDdSEzYq8lKTJI,12585
+flask/ctx.py,sha256=bGEQQuF2_cHqZ3ZNMeMeEG8HOLJkDlL88u2BBxCrRao,14829
+flask/debughelpers.py,sha256=_RvAL3TW5lqMJeCVWtTU6rSDJC7jnRaBL6OEkVmooyU,5511
+flask/globals.py,sha256=EX0XdX73BTWdVF0UHDSNet2ER3kI6sKveo3_o5IOs98,3187
+flask/helpers.py,sha256=XTHRgLlyxeEzR988q63-4OY8RswTscR-5exFxK10CLU,25280
+flask/json/__init__.py,sha256=TOwldHT3_kFaXHlORKi9yCWt7dbPNB0ovdHHQWlSRzY,11175
+flask/json/__pycache__/__init__.cpython-312.pyc,,
+flask/json/__pycache__/provider.cpython-312.pyc,,
+flask/json/__pycache__/tag.cpython-312.pyc,,
+flask/json/provider.py,sha256=jXCNypf11PN4ngQjEt6LnSdCWQ1yHIAkNLHlXQlCB-A,10674
+flask/json/tag.py,sha256=fys3HBLssWHuMAIJuTcf2K0bCtosePBKXIWASZEEjnU,8857
+flask/logging.py,sha256=WYng0bLTRS_CJrocGcCLJpibHf1lygHE_pg-KoUIQ4w,2293
+flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask/scaffold.py,sha256=EKx-Tr5BXLzeKKvq3ZAi_2oUQVZuC4OJSJTocyDXsSo,35958
+flask/sessions.py,sha256=adWCRnJYETJcjjhlcvUgZR5S0DMqKQctS0nzkY9g9Us,15927
+flask/signals.py,sha256=H7QwDciK-dtBxinjKpexpglP0E6k0MJILiFWTItfmqU,2136
+flask/templating.py,sha256=1P4OzvSnA2fsJTYgQT3G4owVKsuOz8XddCiR6jMHGJ0,7419
+flask/testing.py,sha256=JtHRQY7mIH39SM4S51svAr8e7Xk87dqMb30Z6Dyv9TA,10706
+flask/typing.py,sha256=KgxegTF9v9WvuongeF8LooIvpZPauzGrq9ZXf3gBlYc,2969
+flask/views.py,sha256=LulttWL4owVFlgwrJi8GCNM4inC3xbs2IBlY31bdCS4,6765
+flask/wrappers.py,sha256=el3tn1LgSUV0eNGgYMjKICT5I7qGJgbpIhvci4nrwQ8,5702

+ 5 - 0
.venv/Lib/site-packages/Flask-2.2.5.dist-info/WHEEL

@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.40.0)
+Root-Is-Purelib: true
+Tag: py3-none-any
+

+ 2 - 0
.venv/Lib/site-packages/Flask-2.2.5.dist-info/entry_points.txt

@@ -0,0 +1,2 @@
+[console_scripts]
+flask = flask.cli:main

+ 1 - 0
.venv/Lib/site-packages/Flask-2.2.5.dist-info/top_level.txt

@@ -0,0 +1 @@
+flask

+ 1 - 0
.venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 27 - 0
.venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/LICENSE

@@ -0,0 +1,27 @@
+Copyright (c) 2013, Daniel Vaz Gaspar
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* 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.
+
+* Neither the name of the {organization} 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.

+ 242 - 0
.venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/METADATA

@@ -0,0 +1,242 @@
+Metadata-Version: 2.1
+Name: Flask-AppBuilder
+Version: 4.5.3
+Summary: Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, google charts and much more.
+Home-page: https://github.com/dpgaspar/flask-appbuilder/
+Author: Daniel Vaz Gaspar
+Author-email: danielvazgaspar@gmail.com
+License: BSD
+Platform: any
+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 :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Requires-Python: ~=3.7
+Description-Content-Type: text/x-rst
+License-File: LICENSE
+Requires-Dist: apispec[yaml] <7,>=6.0.0
+Requires-Dist: colorama <1,>=0.3.9
+Requires-Dist: click <9,>=8
+Requires-Dist: email-validator >=1.0.5
+Requires-Dist: Flask <3.0.0,>=2
+Requires-Dist: Flask-Babel <3,>=1
+Requires-Dist: Flask-Limiter <4,>3
+Requires-Dist: Flask-Login <0.7,>=0.3
+Requires-Dist: Flask-SQLAlchemy <3,>=2.4
+Requires-Dist: Flask-WTF <2,>=0.14.2
+Requires-Dist: Flask-JWT-Extended <5.0.0,>=4.0.0
+Requires-Dist: jsonschema <5,>=3
+Requires-Dist: marshmallow <4,>=3.18.0
+Requires-Dist: marshmallow-sqlalchemy <0.29.0,>=0.22.0
+Requires-Dist: python-dateutil <3,>=2.3
+Requires-Dist: prison <1.0.0,>=0.2.1
+Requires-Dist: PyJWT <3.0.0,>=2.0.0
+Requires-Dist: SQLAlchemy <1.5
+Requires-Dist: sqlalchemy-utils <1,>=0.32.21
+Requires-Dist: WTForms <4
+Requires-Dist: werkzeug <4
+Provides-Extra: jmespath
+Requires-Dist: jmespath >=0.9.5 ; extra == 'jmespath'
+Provides-Extra: oauth
+Requires-Dist: Authlib <2.0.0,>=0.14 ; extra == 'oauth'
+Provides-Extra: openid
+Requires-Dist: Flask-OpenID <2,>=1.2.5 ; extra == 'openid'
+Provides-Extra: talisman
+Requires-Dist: flask-talisman <2.0,>=1.0.0 ; extra == 'talisman'
+
+Flask App Builder
+=================
+
+.. image:: https://github.com/dpgaspar/Flask-AppBuilder/workflows/Python/badge.svg
+        :target: https://github.com/dpgaspar/Flask-AppBuilder/actions
+
+.. image:: https://img.shields.io/pypi/v/Flask-AppBuilder.svg
+        :alt: PyPI
+        :target: https://pypi.org/project/Flask-AppBuilder/
+
+.. image:: https://img.shields.io/badge/pyversions-3.8%2C%203.9%2C%203.10%2C%203.11%2C%203.12-blue.svg
+        :target: https://www.python.org/
+
+.. image:: https://codecov.io/github/dpgaspar/Flask-AppBuilder/coverage.svg?branch=master
+        :target: https://codecov.io/github/dpgaspar/Flask-AppBuilder
+
+.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
+    :target: https://github.com/psf/black
+
+
+Simple and rapid application development framework, built on top of `Flask <http://flask.pocoo.org/>`_.
+includes detailed security, auto CRUD generation for your models, google charts and much more.
+
+Extensive configuration of all functionality, easily integrate with normal Flask/Jinja2 development.
+
+- Documentation: `Documentation <http://flask-appbuilder.readthedocs.org/en/latest/>`_
+
+- Mailing list: `Google group <https://groups.google.com/forum/#!forum/flask-appbuilder>`_
+
+- Chat: `Gitter <https://gitter.im/dpgaspar/Flask-AppBuilder>`_
+
+- Examples: `examples <https://github.com/dpgaspar/Flask-AppBuilder/tree/master/examples>`_
+
+Checkout installation video on `YouTube <http://youtu.be/xvum4vfwldg>`_
+
+Quick how to `Demo from the docs <http://flaskappbuilder.pythonanywhere.com/>`_ (login has guest/welcome).
+
+Change Log
+----------
+
+`Versions <https://github.com/dpgaspar/Flask-AppBuilder/tree/master/CHANGELOG.rst>`_ for further detail on what changed.
+
+Fixes, Bugs and contributions
+-----------------------------
+
+You're welcome to report bugs, propose new features, or even better contribute to this project.
+
+`Issues, bugs and new features <https://github.com/dpgaspar/Flask-AppBuilder/issues/new>`_
+
+`Contribute <https://github.com/dpgaspar/Flask-AppBuilder/fork>`_
+
+Includes:
+---------
+
+  - Database
+      - SQLAlchemy, multiple database support: sqlite, MySQL, ORACLE, MSSQL, DB2 etc.
+      - Partial support for MongoDB using MongoEngine.
+      - Multiple database connections support (Vertical partitioning).
+      - Easy mixin audit to models (created/changed by user, and timestamps).
+  - Security
+      - Automatic permissions lookup, based on exposed methods. It will grant all permissions to the Admin Role.
+      - Inserts on the Database all the detailed permissions possible on your application.
+      - Public (no authentication needed) and Private permissions.
+      - Role based permissions.
+      - Authentication support for OAuth, OpenID, Database, LDAP and REMOTE_USER environ var.
+      - Support for self user registration.
+  - Views and Widgets
+      - Automatic menu generation.
+      - Automatic CRUD generation.
+      - Multiple actions on db records.
+      - Big variety of filters for your lists.
+      - Various view widgets: lists, master-detail, list of thumbnails etc
+      - Select2, Datepicker, DateTimePicker
+      - Related Select2 fields.
+      - Google charts with automatic group by or direct values and filters.
+      - AddOn system, write your own and contribute.
+  - CRUD REST API
+      - Automatic CRUD RESTful APIs.
+      - Internationalization
+      - Integration with flask-jwt-extended extension to protect your endpoints.
+      - Metadata for dynamic rendering.
+      - Selectable columns and metadata keys.
+      - Automatic and configurable data validation.
+  - Forms
+      - Automatic, Add, Edit and Show from Database Models
+      - Labels and descriptions for each field.
+      - Automatic base validators from model's definition.
+      - Custom validators, extra fields, custom filters for related dropdown lists.
+      - Image and File support for upload and database field association. It will handle everything for you.
+      - Field sets for Form's (Django style).
+  - i18n
+      - Support for multi-language via Babel
+  - Bootstrap 3.1.1 CSS and js, with Select2 and DatePicker
+  - Font-Awesome icons, for menu icons and actions.
+
+
+Some pictures
+-------------
+
+Login page (with AUTH_DB)
+
+.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/login_db.png
+    :width: 480px
+    :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/login_db.png
+
+
+Login page (with AUTH_OAUTH)
+
+.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/login_oauth.png
+    :width: 480px
+    :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/login_oauth.png
+
+
+Security
+
+.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/security.png
+    :width: 480px
+    :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/security.png
+
+
+Lists:
+
+List contacts example
+
+.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/contact_list.png
+    :width: 480px
+    :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/contact_list.png
+
+
+List Group example with search
+
+.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/group_list.png
+    :width: 480px
+    :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/group_list.png
+
+
+
+Charts:
+
+Group by pie chart
+
+.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/grouped_chart.png
+    :width: 480px
+    :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/grouped_chart.png
+
+Direct time chart
+
+.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/direct_chart.png
+    :width: 480px
+    :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/chart_time1.png
+
+Group by time chart
+
+.. image:: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/chart_time2.png
+    :width: 480px
+    :target: https://raw.github.com/dpgaspar/flask-AppBuilder/master/images/chart_time2.png
+
+
+Projects/Organizations using FAB
+--------------------------------
+
+If you would like to share your project, or let everyone know that you're using FAB
+on your organization please submit a PR or send me an email with the details.
+
+Projects:
+
+- `Superset <https://github.com/apache/incubator-superset>`_ - a data exploration platform designed to be visual, intuitive, and interactive
+
+- `Airflow <https://github.com/apache/airflow>`_ - a platform to programmatically author, schedule, and monitor workflows.
+
+
+Organizations:
+
+- Miniclip
+- EuroBIC
+- `On Beat Digital <https://onbeat.digital/>`_
+
+
+Depends on:
+-----------
+
+- flask
+- click
+- colorama
+- flask-sqlalchemy
+- flask-login
+- flask-openid
+- flask-wtform
+- flask-Babel

+ 336 - 0
.venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/RECORD

@@ -0,0 +1,336 @@
+../../Scripts/fabmanager.exe,sha256=riUwssnG_GYIqXF7M5P0U6f9WC_C8AwPY2Tu0ICImQ4,108429
+Flask_AppBuilder-4.5.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+Flask_AppBuilder-4.5.3.dist-info/LICENSE,sha256=pZ-ajm1I_0h91a1peoZFSemkiFE8kK1H_xmV_cxlQlY,1493
+Flask_AppBuilder-4.5.3.dist-info/METADATA,sha256=gR9vJMbxurVZUILsGHgxMWpnAmEO33a3TrE_PuLPmbU,8862
+Flask_AppBuilder-4.5.3.dist-info/RECORD,,
+Flask_AppBuilder-4.5.3.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
+Flask_AppBuilder-4.5.3.dist-info/entry_points.txt,sha256=3DOZUyqiwUVz_vRVOuT8E5vMa_O9dpGKpey9lSpAyb4,109
+Flask_AppBuilder-4.5.3.dist-info/top_level.txt,sha256=Dy4t809z2TNdpjQhDUMEXU8Hc61x1e6WRNaC7hG6r8M,17
+flask_appbuilder/__init__.py,sha256=eiWzoyyhwP5G8GhNhCY_ksxZbOkBw167VBdtSYB347M,734
+flask_appbuilder/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/__pycache__/_compat.cpython-312.pyc,,
+flask_appbuilder/__pycache__/actions.cpython-312.pyc,,
+flask_appbuilder/__pycache__/base.cpython-312.pyc,,
+flask_appbuilder/__pycache__/basemanager.cpython-312.pyc,,
+flask_appbuilder/__pycache__/baseviews.cpython-312.pyc,,
+flask_appbuilder/__pycache__/cli.cpython-312.pyc,,
+flask_appbuilder/__pycache__/console.cpython-312.pyc,,
+flask_appbuilder/__pycache__/const.cpython-312.pyc,,
+flask_appbuilder/__pycache__/exceptions.cpython-312.pyc,,
+flask_appbuilder/__pycache__/fields.cpython-312.pyc,,
+flask_appbuilder/__pycache__/fieldwidgets.cpython-312.pyc,,
+flask_appbuilder/__pycache__/filemanager.cpython-312.pyc,,
+flask_appbuilder/__pycache__/filters.cpython-312.pyc,,
+flask_appbuilder/__pycache__/forms.cpython-312.pyc,,
+flask_appbuilder/__pycache__/hooks.cpython-312.pyc,,
+flask_appbuilder/__pycache__/menu.cpython-312.pyc,,
+flask_appbuilder/__pycache__/messages.cpython-312.pyc,,
+flask_appbuilder/__pycache__/upload.cpython-312.pyc,,
+flask_appbuilder/__pycache__/urltools.cpython-312.pyc,,
+flask_appbuilder/__pycache__/validators.cpython-312.pyc,,
+flask_appbuilder/__pycache__/views.cpython-312.pyc,,
+flask_appbuilder/__pycache__/widgets.cpython-312.pyc,,
+flask_appbuilder/_compat.py,sha256=Ac71GIwVHe9Pq7i2qDsrGUgL63Vz5oeC4rjhWw0kd6g,1969
+flask_appbuilder/actions.py,sha256=-TqIH159BKCB-ezHJifbubApk2nxjospNYfH_7IgBJ8,1177
+flask_appbuilder/api/__init__.py,sha256=6495xUocWEpoe-pT22hXXmETtc90aKqEwTBoxF9o698,76738
+flask_appbuilder/api/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/api/__pycache__/convert.cpython-312.pyc,,
+flask_appbuilder/api/__pycache__/manager.cpython-312.pyc,,
+flask_appbuilder/api/__pycache__/schemas.cpython-312.pyc,,
+flask_appbuilder/api/convert.py,sha256=UITMjuhRAdgcC9nibk0JRmfdzu-cMww2GQgzOjhmdL8,9871
+flask_appbuilder/api/manager.py,sha256=GOJfbACRlP4a1kxk5VvReM8CyUEHCAGPBm6wS9-ybBE,3366
+flask_appbuilder/api/schemas.py,sha256=Z-Jor8w52iDuQ_tfWf10TPFGQq6HK95AXd1XK3-7oBg,4906
+flask_appbuilder/babel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_appbuilder/babel/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/babel/__pycache__/manager.cpython-312.pyc,,
+flask_appbuilder/babel/__pycache__/views.cpython-312.pyc,,
+flask_appbuilder/babel/manager.py,sha256=jemmBQWSV7i0XSxDjDAa29YZJ2n2EcSdoP-KPkbJ12w,2310
+flask_appbuilder/babel/views.py,sha256=LWM2xbw-eekTEBCdgB49GkYaEOk95Po5TKF2-Jsyp14,506
+flask_appbuilder/base.py,sha256=DTXq4uwn8X8_W21Uu6acyJ9xoVvEmcWAabtSFLDA3Sg,26023
+flask_appbuilder/basemanager.py,sha256=MdgZ52RhUBxKWRBxp4a2u41cUy9u7FBYWVHo6FW_RG0,342
+flask_appbuilder/baseviews.py,sha256=27-0bobq0F1EuT2FCltO6ysJqTi7O8yviF7Cd4CJ7r8,49021
+flask_appbuilder/charts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_appbuilder/charts/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/charts/__pycache__/jsontools.cpython-312.pyc,,
+flask_appbuilder/charts/__pycache__/views.cpython-312.pyc,,
+flask_appbuilder/charts/__pycache__/widgets.cpython-312.pyc,,
+flask_appbuilder/charts/jsontools.py,sha256=ftlXJd_LP_YFMdtvVPbm54E3de0QbEyHJOZwo9gt6nY,1315
+flask_appbuilder/charts/views.py,sha256=6yumuHzdbZF8UwGLtX0h7-dqqg4ZVP2DPOacL0JRNlE,17437
+flask_appbuilder/charts/widgets.py,sha256=o-VafcXlbiCVbopxxphDUA0Q4WNhxEwY_d5cRlIzk9I,382
+flask_appbuilder/cli.py,sha256=Pk0gCPruiZrJg7B5GL7J2tsqEDpqLMMW3Gpp6bakSt8,14981
+flask_appbuilder/console.py,sha256=FNCcFrTJASbVu1Cz-plbOw25FXVdz9bsQPr98XjlaQo,14071
+flask_appbuilder/const.py,sha256=Z_BzT99JmOHy0yHfzs2x4R6l98e04mHq3ANm6Gp5o3A,8641
+flask_appbuilder/exceptions.py,sha256=GZqxq152x-iJWoQs3Wr5Sjwdk2cYnmKV11e5rw4K3os,1382
+flask_appbuilder/fields.py,sha256=GyM_EjpP0HL1cpqhVjWludv3uj1VdKImM-kj5fazDk8,9328
+flask_appbuilder/fieldwidgets.py,sha256=XPQPzBsNsTOi848nK2lsQG0knkZzx9kLvujspqL83Qs,6058
+flask_appbuilder/filemanager.py,sha256=WyAMepEMoDQ11MsW9CMSK0h3L8t9rDEz9aRJGMh7JWQ,8452
+flask_appbuilder/filters.py,sha256=dBBO8p5UwzMkRANWkf9PVAVzWqxqwQXlhErdR8yJrNk,6164
+flask_appbuilder/forms.py,sha256=KSm34jXwACLxfRerNBWBx9QTr8qgV-fzC4WScMtqS7o,11025
+flask_appbuilder/hooks.py,sha256=WScmGkHUjVsQgxli01fXZ97E0_5toxi8MMcATgrXKDg,3003
+flask_appbuilder/menu.py,sha256=SZZSGPoT8t1lOB4z8B2_0_Rx19XGfB3c1XtKQCyQaDg,7636
+flask_appbuilder/messages.py,sha256=Q5KXDSZUKV7O26n7BxR6AMDgtoANJZmVGgCyrvTkbK8,290
+flask_appbuilder/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_appbuilder/models/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/models/__pycache__/base.cpython-312.pyc,,
+flask_appbuilder/models/__pycache__/decorators.cpython-312.pyc,,
+flask_appbuilder/models/__pycache__/filters.cpython-312.pyc,,
+flask_appbuilder/models/__pycache__/group.cpython-312.pyc,,
+flask_appbuilder/models/__pycache__/mixins.cpython-312.pyc,,
+flask_appbuilder/models/base.py,sha256=lo_USLR1VWpsTGtQ57D1irtcdWzdJ6lR9nP6W6EUbVE,9580
+flask_appbuilder/models/decorators.py,sha256=GKPLyW1Q1aN6VPe9JUqvzh-YBUEP7ltKmtgc2pLrEf4,794
+flask_appbuilder/models/filters.py,sha256=5JTF5KLOsJxz9yYmiv-nEFDO-vxeDhqKU7ZIx7h9hB8,10262
+flask_appbuilder/models/generic/__init__.py,sha256=gU8gN5UYdgSpQ33SHiPm862T5ejcOIUxFEp2Vg1MEeA,12948
+flask_appbuilder/models/generic/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/models/generic/__pycache__/filters.cpython-312.pyc,,
+flask_appbuilder/models/generic/__pycache__/interface.cpython-312.pyc,,
+flask_appbuilder/models/generic/filters.py,sha256=TtjPUF3UsdIu0Zkgv7xyVMCN68pUValL68vroYrqjF8,2641
+flask_appbuilder/models/generic/interface.py,sha256=CDxMomzeMEiow7CY2SxjBFmkBKgBM2w06htfsK8MjTs,2247
+flask_appbuilder/models/group.py,sha256=x3wxx7yj5j4bYwS-z3HHvVWTDTyv6GQyZ8ncJSXwCuE,10808
+flask_appbuilder/models/mixins.py,sha256=bWfuSJDZaP_zpz7SSXDSj37AtiQGK73ItC-lWhsMPok,2593
+flask_appbuilder/models/mongoengine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_appbuilder/models/mongoengine/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/models/mongoengine/__pycache__/fields.cpython-312.pyc,,
+flask_appbuilder/models/mongoengine/__pycache__/filters.cpython-312.pyc,,
+flask_appbuilder/models/mongoengine/__pycache__/interface.cpython-312.pyc,,
+flask_appbuilder/models/mongoengine/fields.py,sha256=EzvBbz8IKI8Ud6hMtsQtG3OiG1a8M9m0tE0DBS0QAkA,1757
+flask_appbuilder/models/mongoengine/filters.py,sha256=IU70HBbaskfmSDisgKZZq3uWM_oIGll9HyrgEio2UIQ,4176
+flask_appbuilder/models/mongoengine/interface.py,sha256=IH-_I25xuZWJhr4oMz2qhZp0S_XVDEkqrUfvDNW5BJs,9952
+flask_appbuilder/models/sqla/__init__.py,sha256=8BWIo3Tw1Ync8Enhbaj4EgkLB2vnMSxDQX6Vq0YRogk,4073
+flask_appbuilder/models/sqla/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/models/sqla/__pycache__/filters.cpython-312.pyc,,
+flask_appbuilder/models/sqla/__pycache__/interface.cpython-312.pyc,,
+flask_appbuilder/models/sqla/filters.py,sha256=mMgtPbSLsPsBl5q_frrKmduj3HvjtgLECtY7yuwvARY,11046
+flask_appbuilder/models/sqla/interface.py,sha256=FYOGQ-bjtmx43XBmSnRfK4nnE643w_9cabhzJuG4H28,39115
+flask_appbuilder/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_appbuilder/security/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/security/__pycache__/api.cpython-312.pyc,,
+flask_appbuilder/security/__pycache__/decorators.cpython-312.pyc,,
+flask_appbuilder/security/__pycache__/forms.cpython-312.pyc,,
+flask_appbuilder/security/__pycache__/manager.cpython-312.pyc,,
+flask_appbuilder/security/__pycache__/registerviews.cpython-312.pyc,,
+flask_appbuilder/security/__pycache__/schemas.cpython-312.pyc,,
+flask_appbuilder/security/__pycache__/utils.cpython-312.pyc,,
+flask_appbuilder/security/__pycache__/views.cpython-312.pyc,,
+flask_appbuilder/security/api.py,sha256=8porfOv5xpM3IOiCPPmrqYY5z7P2qOPqJD-2UABXxSQ,5219
+flask_appbuilder/security/decorators.py,sha256=awI42SQR892OuPnerMSTcpa-K82Mc2ukp8eB19ynUGs,11020
+flask_appbuilder/security/forms.py,sha256=BDgkJ8PfbrRqXuo2nHdFU1WqioKulFkG0aWX9IfK1BU,4162
+flask_appbuilder/security/manager.py,sha256=nYRHAxcog1yW2i4k4KZ3JzZPYpLZlFZRemub9ZKh3Cg,79918
+flask_appbuilder/security/mongoengine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_appbuilder/security/mongoengine/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/security/mongoengine/__pycache__/manager.cpython-312.pyc,,
+flask_appbuilder/security/mongoengine/__pycache__/models.cpython-312.pyc,,
+flask_appbuilder/security/mongoengine/manager.py,sha256=A_GC6Ap6JOjs7LnoyNWUuw6ah5O0IYfyZeZc6qa6Oz4,15221
+flask_appbuilder/security/mongoengine/models.py,sha256=9BlQMB2jyAcCfory5fVM9HjZsF2Jh3x7qSTa9pKSOTU,3219
+flask_appbuilder/security/registerviews.py,sha256=zI_EXc-GG2CJBUg1Ds8vqQqVBx2n73Z5TWGzhfXNboE,10519
+flask_appbuilder/security/schemas.py,sha256=keManyd6dh-FXBXGkuvVHLWh-BSYoJytv8pTZ2wTHhY,1359
+flask_appbuilder/security/sqla/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_appbuilder/security/sqla/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/security/sqla/__pycache__/manager.cpython-312.pyc,,
+flask_appbuilder/security/sqla/__pycache__/models.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/__init__.py,sha256=rbQV6bmZirUhCM5R_Bh2MLFVnc-nHHCLvbxVznW3750,435
+flask_appbuilder/security/sqla/apis/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/permission/__init__.py,sha256=QmBYWNu9LIk0k-qrcYmcSnN3YW6QGK4pky_Ux3V6Vjg,45
+flask_appbuilder/security/sqla/apis/permission/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/permission/__pycache__/api.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/permission/api.py,sha256=Kh-LZ4v4G3y06y-XJyclKj1kjOF4d4HLfTqAK5KY99s,624
+flask_appbuilder/security/sqla/apis/permission_view_menu/__init__.py,sha256=OyBP6HjYzOpSqr63drKLXaqEngIdqPRLueUDJos-UPY,53
+flask_appbuilder/security/sqla/apis/permission_view_menu/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/permission_view_menu/__pycache__/api.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/permission_view_menu/api.py,sha256=mthU1QIYTsw0tCWu_M2gr7usEicAVO1izu62wvgSW_0,647
+flask_appbuilder/security/sqla/apis/role/__init__.py,sha256=naG_84Y_PUaV8jvm5AeLJcLxywf_onzcnd5TbLjZuXc,39
+flask_appbuilder/security/sqla/apis/role/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/role/__pycache__/api.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/role/__pycache__/schema.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/role/api.py,sha256=3JJyKRVsGYNnVv1ks9OGaKPZlCeT_rQ4CXXewYZVRro,5053
+flask_appbuilder/security/sqla/apis/role/schema.py,sha256=iyTKF2_rj8W1UScSu0BH5azADWpBEf_epVhF6pkUXdQ,390
+flask_appbuilder/security/sqla/apis/user/__init__.py,sha256=8llQQbFTBj7oaHzMRV-Wd5iBFNOjqAhy1-x3_Ae1gf0,39
+flask_appbuilder/security/sqla/apis/user/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/user/__pycache__/api.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/user/__pycache__/schema.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/user/__pycache__/validator.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/user/api.py,sha256=4GBxSqSFze6Re1lsBDHzDlcahqN5We22a6sirAH5w_k,6695
+flask_appbuilder/security/sqla/apis/user/schema.py,sha256=pqil9485M0v-r4It42oEYGrDrEgt3WmQ4cLSlrt4q20,2481
+flask_appbuilder/security/sqla/apis/user/validator.py,sha256=mZ1dHl7X0BSzmafJjzHrPuJWuu1sFLUhZQGjMzE2F6Y,1095
+flask_appbuilder/security/sqla/apis/view_menu/__init__.py,sha256=YPSc8M1MMrcfLg633cJtKY0UPMTQT96V0fcY0GWQ8a0,43
+flask_appbuilder/security/sqla/apis/view_menu/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/view_menu/__pycache__/api.cpython-312.pyc,,
+flask_appbuilder/security/sqla/apis/view_menu/api.py,sha256=g0-OBjpwcF8Pm52QHHOqNENT-2D6WZOs7VA3vvM96Xo,569
+flask_appbuilder/security/sqla/manager.py,sha256=BgPGzXVWp2SQTYwPKlSa1k9fqnE8bMPobmZ2ulGGNOg,26476
+flask_appbuilder/security/sqla/models.py,sha256=ACxsW3oj7Vhh9PnD2jg9g6lJ_DxVCUVboAnaVvs4zL0,5532
+flask_appbuilder/security/utils.py,sha256=0PwDO-mB76RLPYlV9tCksChIMRq3zQgwLwiVMJ8jeiU,247
+flask_appbuilder/security/views.py,sha256=0XN1fzDnyKcQ1bQQMyqLTyR8uSRz7fxGIj-4m6HNvzI,26394
+flask_appbuilder/static/.DS_Store,sha256=y0F1REGYdjEP6mkLEXwRfq1bfqn3irXPxwg2W-1pSu0,6148
+flask_appbuilder/static/appbuilder/.DS_Store,sha256=bAUT2QH2kkh-tMDe3K_1snJM8v2MCWWnXUkv2VZeAa4,6148
+flask_appbuilder/static/appbuilder/css/ab.css,sha256=3aeitulGDxslqqEfB0XPFgUYN87Y3SAJYg7zBlJklnc,643
+flask_appbuilder/static/appbuilder/css/bootstrap-datepicker/bootstrap-datepicker3.min.css,sha256=bZRrQVK1rYvxccX8WACyWguD6Ba0h4h_Qs6vmJP2Pws,21102
+flask_appbuilder/static/appbuilder/css/bootstrap.min.css,sha256=bZLfwXAP04zRMK2BjiO8iu9pf4FbLqX6zitd-tIvLhE,121457
+flask_appbuilder/static/appbuilder/css/bootstrap.min.css.map,sha256=eLWMnr_ULsLGG8T99Gpd-ZjmzZB8dzB2oKbo9Whrr8M,540434
+flask_appbuilder/static/appbuilder/css/flags/flags16.css,sha256=rIM9XGcQ0BxJPOuKTzXajC4niQoS4cAa1wmN4-8kB28,10904
+flask_appbuilder/static/appbuilder/css/fontawesome/all.min.css,sha256=Z1K5uhUaJXA7Ll0XrZ_0JhX4lAtZFpT6jkKrEDT0drU,101894
+flask_appbuilder/static/appbuilder/css/fontawesome/brands.min.css,sha256=TXCTfrlEOGerSO77rgj5Fvyzf9g0O4ne2lXoR8uS4II,18594
+flask_appbuilder/static/appbuilder/css/fontawesome/fontawesome.min.css,sha256=zgORubRsz5iTQajy0X9EdrJBq1vNm70B2ZW4YKdRy3s,80761
+flask_appbuilder/static/appbuilder/css/fontawesome/regular.min.css,sha256=AKdJTilWP0HA1p1q_DnHgnJmR3uc56QTFroCEUE1NCs,580
+flask_appbuilder/static/appbuilder/css/fontawesome/solid.min.css,sha256=PWjOYKvQnR-QNLq3ts8OC0_uUzdQ2NkfEulijXY8Xfo,572
+flask_appbuilder/static/appbuilder/css/fontawesome/svg-with-js.min.css,sha256=BmRf_TpWkrGebpxG24nKIy25TXuzr7WmOOqtWPhfaNw,16771
+flask_appbuilder/static/appbuilder/css/fontawesome/v4-font-face.min.css,sha256=3qx38sFUtiOKkZc7eAT97tB7BHy4UtkjNS8Kirug-lA,1736
+flask_appbuilder/static/appbuilder/css/fontawesome/v4-shims.min.css,sha256=CBrGmsHCYkijL0yBH22hDEe9MvZYhXdAiOjeZm9OkS8,27593
+flask_appbuilder/static/appbuilder/css/fontawesome/v5-font-face.min.css,sha256=zGrY1du3JRHqYLHQdYES159Q-372nQNFC_IpetFsksY,794
+flask_appbuilder/static/appbuilder/css/images/flags16.png,sha256=4J5H4u1HssdXva0oOR4tEDhcWmXjd3ubK3zvzicaTk8,51306
+flask_appbuilder/static/appbuilder/css/select2/select2-bootstrap.min.css,sha256=nbyata2PJRjImhByQzik2ot6gSHSU4Cqdz5bNYL2zcU,16792
+flask_appbuilder/static/appbuilder/css/select2/select2.min.css,sha256=FdatTf20PQr_rWg-cAKfl6j4_IY3oohFAJ7gVC3M34E,14966
+flask_appbuilder/static/appbuilder/css/swagger/swagger-ui.css,sha256=wk7P_WP8eX03vtHGjqAwR5rRx6MGOP-2taJVnqmLxDE,151211
+flask_appbuilder/static/appbuilder/css/themes/amelia.css,sha256=kPkKJh9Kz2u6naJn3pH4VFgGpgr1DNzNOy2liHeU4Wk,105250
+flask_appbuilder/static/appbuilder/css/themes/cerulean.css,sha256=UKmB9_useaL9IPo4IS517peuQEt05x_Z0vSG14-lCBc,120090
+flask_appbuilder/static/appbuilder/css/themes/cosmo.css,sha256=VguXHGaX2jwxjvlWXG3zwWh_i3d8w1XCi2jVqTRmG7I,119768
+flask_appbuilder/static/appbuilder/css/themes/cyborg.css,sha256=zxEHfLTlVC7lgREqDvri8javBIniGsbVmfSgAwx0wfE,119799
+flask_appbuilder/static/appbuilder/css/themes/darkly.css,sha256=3ENdQmzAZ_ZJ_5vCIpqVRiaOQQwGDT0qDyLL_b0D-GY,121625
+flask_appbuilder/static/appbuilder/css/themes/flatly.css,sha256=YWVGaarRFEqNTJPYf4VPJj4lutdGawVsrfm-tXi9qbw,121354
+flask_appbuilder/static/appbuilder/css/themes/journal.css,sha256=wLEIsTem6YGp3_G0iNqqLKhYzkiBzPN9ZBoZpU2PuY4,118666
+flask_appbuilder/static/appbuilder/css/themes/lumen.css,sha256=Tg2t3ds9B3CEkYurKyNc2E8wV5IoJjPgo0pq7meOeHE,124431
+flask_appbuilder/static/appbuilder/css/themes/paper.css,sha256=l26I8blnp0qRoSufU5_wAxzYwkj8Egy_Q40h9sPMrVM,132318
+flask_appbuilder/static/appbuilder/css/themes/readable.css,sha256=PA0eUEGv1KU0FsZUIa2nJacxxLbtyqRgavDy8FGFhDg,118678
+flask_appbuilder/static/appbuilder/css/themes/sandstone.css,sha256=dWyyHDaAx6lROKdA9KzmLzBe9LsF2hnwCZk2auGcfe4,118965
+flask_appbuilder/static/appbuilder/css/themes/simplex.css,sha256=Uu16KAlMrzFZBn_2FYxhVWnwHarllrNh2cvf8w4YNZc,120186
+flask_appbuilder/static/appbuilder/css/themes/slate.css,sha256=Orf6npZE1_7-IlImB13cRpXmY4UkoF4POi_A4SFTcJg,129014
+flask_appbuilder/static/appbuilder/css/themes/solar.css,sha256=myOylmHaqDfIsXzix87RHS8ROCq2po3cAyCl_pxIMKE,125030
+flask_appbuilder/static/appbuilder/css/themes/spacelab.css,sha256=_BGJbByPB6l_Z75eYlhuECuDOE4AGGh4RGpH7MYEwJI,121499
+flask_appbuilder/static/appbuilder/css/themes/superhero.css,sha256=_YJAsKpKyctRvT1UDptVCWpLhg-hY1bYRkzXgXtnY44,120731
+flask_appbuilder/static/appbuilder/css/themes/united.css,sha256=ltLC53c-9nQc0ELY92pXXop0iDkRo4LeF9_FQ_JnXH0,117016
+flask_appbuilder/static/appbuilder/css/themes/yeti.css,sha256=EWnz2eP0uYQgePSFe305auRVJm2K6j7KBENXMlMQzDU,121865
+flask_appbuilder/static/appbuilder/css/webfonts/fa-brands-400.ttf,sha256=sdHBsBLhp2IcyE_R5cHbq5IBL0DfdCPoeasvpJNSD-4,186124
+flask_appbuilder/static/appbuilder/css/webfonts/fa-brands-400.woff2,sha256=xhKHwvqYY7X7WETGg6ForGUgyU2CK7Q9Xq41w6KoIWY,107656
+flask_appbuilder/static/appbuilder/css/webfonts/fa-regular-400.ttf,sha256=17Gf4gEQGwirE0T_1HLVnOZSrTw_tfGUw-NaopCOZ0o,62320
+flask_appbuilder/static/appbuilder/css/webfonts/fa-regular-400.woff2,sha256=XaMTsEZ_fBsY2YFnKyNGGt0x461BmIwwEBvaq7B05EY,25236
+flask_appbuilder/static/appbuilder/css/webfonts/fa-solid-900.ttf,sha256=5Pan6dGnwLSWjZy51CLo2c3KIp9_866sf5bkuqJcdoA,397420
+flask_appbuilder/static/appbuilder/css/webfonts/fa-solid-900.woff2,sha256=jwZUD9d_Hv_h4tqOoQzsSjgt2pzG7wXYFuHW3kRAcvI,150516
+flask_appbuilder/static/appbuilder/css/webfonts/fa-v4compatibility.ttf,sha256=Lds7QRSpy1ZeSbCvIcw6yIzQQ760m-MouPV6Y0mJ4Kw,10140
+flask_appbuilder/static/appbuilder/css/webfonts/fa-v4compatibility.woff2,sha256=9GcVydMAR_jepOsl7YafeR6wacaw9hAjgsMqVq7q37s,4568
+flask_appbuilder/static/appbuilder/fonts/glyphicons-halflings-regular.eot,sha256=E2NNqH2eI_jD7ZEIzhck0YOjmtBy5z4bPYy_ZG0tBAc,20127
+flask_appbuilder/static/appbuilder/fonts/glyphicons-halflings-regular.svg,sha256=QvYGWdJlwaPDD5-kKry7Vr1KU69Ng9MW1t16NpA8Q-U,108738
+flask_appbuilder/static/appbuilder/fonts/glyphicons-halflings-regular.ttf,sha256=45UEQJN1fYKvyxOJV9BqHqk2G9zwtELQahioBRr1dFY,45404
+flask_appbuilder/static/appbuilder/fonts/glyphicons-halflings-regular.woff,sha256=omOU9-3hAMoRjv8u2ghZYnWpg5uVnCJuFUOVV6WoB0I,23424
+flask_appbuilder/static/appbuilder/fonts/glyphicons-halflings-regular.woff2,sha256=_hhdEaSWdokNR7t4MxKgzaWkTEA5IUCU55V7TAQO8Rw,18028
+flask_appbuilder/static/appbuilder/img/aol.png,sha256=CPiVUhcQlOq_8lAC3Y16BEKs2sLfOnZBZNf_cSPeWOE,2483
+flask_appbuilder/static/appbuilder/img/fab.png,sha256=MeZfyBLCdtgsJdGdPYKd3QFiDhJby6oLp1sVP1NbF4Q,2591
+flask_appbuilder/static/appbuilder/img/flickr.png,sha256=hGfZT_eUDA04ADKe-ABedCxrpoiT6KGSHUiU_-7jg88,1595
+flask_appbuilder/static/appbuilder/img/glyphicons-halflings-white.png,sha256=8ODZWpyKvN-r9GNI4tQoWCm7BJH19q8OBa9Sv_tjJMQ,8777
+flask_appbuilder/static/appbuilder/img/glyphicons-halflings.png,sha256=2Z4_oyxkEDLwgUmRSyjC3GrPLsYvcJh_Ilnqu_p_wN4,12799
+flask_appbuilder/static/appbuilder/img/google.png,sha256=Mb27xYlpbku_ieGoanh6dKZAnm2gi2cDzFA0lduwHXU,2558
+flask_appbuilder/static/appbuilder/img/myopenid.png,sha256=MpsN-TRci120VuCyN4q76sOAKAU11e5pxuv2BxK27y4,2882
+flask_appbuilder/static/appbuilder/img/yahoo.png,sha256=QJfPXaWRgaq8PCVb4Z2vMORUzDJGKE7dhViTKvJXMyk,2842
+flask_appbuilder/static/appbuilder/js/ab.js,sha256=X-SKsBQKViDV4I0l_XWYfKto0diPp1qBwXn9XXaaLbo,3380
+flask_appbuilder/static/appbuilder/js/ab_actions.js,sha256=gSh55Vh0fOLLUJPxzCJaegAtJFVgvzvd0duPXRy3pjA,4228
+flask_appbuilder/static/appbuilder/js/ab_filters.js,sha256=iPw-tVct4pLuCAF38vEdk7vbzL5aSC1RVYs0Sv4XKms,5275
+flask_appbuilder/static/appbuilder/js/ab_keep_tab.js,sha256=8MOjHJICM0UiMmB_B8r2pFFZ2Mka3BT2d90eL5SKBFM,1526
+flask_appbuilder/static/appbuilder/js/bootstrap-datepicker/bootstrap-datepicker.min.js,sha256=iZp9dyOMJKPFdn1UMra9ZMhPZAlSGZUzdhqqEgijE-Q,33871
+flask_appbuilder/static/appbuilder/js/bootstrap.min.js,sha256=nuL8_2cJ5NDSSwnKD8VqreErSWHtnEP9E7AySL-1ev4,39680
+flask_appbuilder/static/appbuilder/js/google_charts.js,sha256=WWPcbKY75OwEWXxnfXEY55cx788X92ZdaAGH_mvjCgI,46151
+flask_appbuilder/static/appbuilder/js/jquery-latest.js,sha256=_xUj-3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej_m4,89501
+flask_appbuilder/static/appbuilder/js/popper.min.js,sha256=_ijcOLwFf26xEYAjW75FizKVo5tnTYiQddPZoLUHHZ8,21233
+flask_appbuilder/static/appbuilder/js/select2/select2.min.js,sha256=AFAYEOkzB6iIKnTYZOdUf9FFje6lOTYdwRJKwTN5mks,70851
+flask_appbuilder/static/appbuilder/js/swagger-ui-bundle.js,sha256=KlVjBlJL7SymaOxa4ZsdvU2c2qNHlckGOhxEspqcYJc,1385226
+flask_appbuilder/templates/appbuilder/_formhelpers.html,sha256=XVS_zN1ZrWLqDhnmH1oqhieF1F5uGMi1K7bCm__wsno,360
+flask_appbuilder/templates/appbuilder/base.html,sha256=HUMYeU_KKCy4LiA0KrdoXQm56MoiORgQV6ERwQbbgkY,28
+flask_appbuilder/templates/appbuilder/baselayout.html,sha256=EF_tMzYkKAIexehvoXol2sj62XK1Z8HLCz_bOvghzwc,874
+flask_appbuilder/templates/appbuilder/baselib.html,sha256=PsEx5l4GFexaXIWT5OQUvStKG_U1J7DJREkbO_aUk_U,4588
+flask_appbuilder/templates/appbuilder/flash.html,sha256=omg3axewTG3DWQgkLxORg7MPQLwvfbelzTJ-PJs7RRI,486
+flask_appbuilder/templates/appbuilder/footer.html,sha256=fxT9fn7iPczCYAZVYWmpL6xferrnOHK7MyR_nKRON3o,143
+flask_appbuilder/templates/appbuilder/general/alert.html,sha256=odj2dNzbopclSI7jVXwODnrqY185ASYTyShL442iox8,444
+flask_appbuilder/templates/appbuilder/general/charts/chart.html,sha256=vZTsnv3YmEU-JSlKlIc7CTR5uJvOzsryOq-YsAXnSYo,778
+flask_appbuilder/templates/appbuilder/general/charts/chart_time.html,sha256=vMGotm_VFaWYyJGk4zZ1tPM4WdTylvNtWN2kBwttp20,890
+flask_appbuilder/templates/appbuilder/general/charts/jsonchart.html,sha256=w09kwbAsGFG0WFvQ_3JouVVAkX4LhNZx3MabPi4GvQ4,670
+flask_appbuilder/templates/appbuilder/general/confirm.html,sha256=tA-hAsBh91vEPeW2W5D0hY0bX-jSI61JyZwOiUElwGI,717
+flask_appbuilder/templates/appbuilder/general/lib.html,sha256=2R_EAl1PwhPws_YhkK9BV785Kw21tlD8YjH8LfmPUSk,14587
+flask_appbuilder/templates/appbuilder/general/model/add.html,sha256=MhOXEx-gqV8CPKhq2jh8T4iqVgSbWdw9SgiMffCKcpA,271
+flask_appbuilder/templates/appbuilder/general/model/edit.html,sha256=oQ2xBDDGqp_ifxYJANcAqxovdEO3FODCVQrLT2b-OmY,1181
+flask_appbuilder/templates/appbuilder/general/model/edit_cascade.html,sha256=HFTJczks4TdkIhkap785poJBI_TTynaKLogoNdJEh4w,813
+flask_appbuilder/templates/appbuilder/general/model/left_master_detail.html,sha256=i6ObZ1lY1QpOEUnmQb-fv1cD-MEUyZ-vd9dy5eaqen4,653
+flask_appbuilder/templates/appbuilder/general/model/list.html,sha256=fBEQb_J_ttJI80D0C1M9jI0G9w25ckoSk7xOazmT5Zc,496
+flask_appbuilder/templates/appbuilder/general/model/multiple_views.html,sha256=u4R0GrHeVPRCbQPwDKBdOBf0jVsAvWkINK4J0UrdpvY,517
+flask_appbuilder/templates/appbuilder/general/model/search.html,sha256=vxS_74SuBr-9DQtJMpRnveO3pXtn5Yl2hlF_DDmTDww,501
+flask_appbuilder/templates/appbuilder/general/model/show.html,sha256=Z6V02x3BJKIhb_emhXGARL_g94-F1nEWkV4JruUioeo,1207
+flask_appbuilder/templates/appbuilder/general/model/show_cascade.html,sha256=okkMqAiZaqPyvKeGKwLTYPaGn44mzT-xh4bQiytFA3k,784
+flask_appbuilder/templates/appbuilder/general/security/activation.html,sha256=xERW3RMRr12xKUX6zRpye9bAXhfe3RiW-hyzo4Wtbeg,216
+flask_appbuilder/templates/appbuilder/general/security/login_db.html,sha256=MnchMZLJhkqZGPkPErn2AXbiYQURWTzLpBeWfZNVH90,2949
+flask_appbuilder/templates/appbuilder/general/security/login_ldap.html,sha256=wr3VKEp6etfcsLf1sgIqReeXaIyHOns1p-4R_zumgGQ,1996
+flask_appbuilder/templates/appbuilder/general/security/login_oauth.html,sha256=-XwSh9NBm3rpd_kryjRThF_mqQTFPgiJu_zOnYGAGtM,1595
+flask_appbuilder/templates/appbuilder/general/security/login_oid.html,sha256=ruHkiRAoO6579NxHdN2ZZGbaG26j35pcjnntvrboNLc,6396
+flask_appbuilder/templates/appbuilder/general/security/register_mail.html,sha256=o40VoLzyETkSM7lW5el2Hff-gIAh3i5jMlW0d2Ay-4M,230
+flask_appbuilder/templates/appbuilder/general/security/register_oauth.html,sha256=Zl-ORB_dCbphWaXYigEGSVIBU6ZrcNwAGDPrUUXSVo4,1057
+flask_appbuilder/templates/appbuilder/general/widgets/base_list.html,sha256=Fv7FyPoLPanYh_zmFosQnibJb0jTJ4QwToqKAkBCHqU,1153
+flask_appbuilder/templates/appbuilder/general/widgets/chart.html,sha256=Zge0HeDD-MUm_YbSP1oSAbJtw0WmO87W-0te9_iqZxA,2981
+flask_appbuilder/templates/appbuilder/general/widgets/direct_chart.html,sha256=Q8VX97abYdtcZOWIym053M29wTpXbbTWsUoDLwQbnpc,2613
+flask_appbuilder/templates/appbuilder/general/widgets/form.html,sha256=ZApB1T0AoYQVhMzQ_MKeUX1mToablQW514NvnaBLUc4,2016
+flask_appbuilder/templates/appbuilder/general/widgets/form_horizontal.html,sha256=ccOK-8aUBmM1m4fvUSfTDaZaSpxFQUA99i1Av7o72vQ,1382
+flask_appbuilder/templates/appbuilder/general/widgets/form_inline.html,sha256=4-SZuL53_omJOukHvxQAkK7H6lM0ojXrPoEoQ2HsIeI,1326
+flask_appbuilder/templates/appbuilder/general/widgets/form_vertical.html,sha256=vKaK9jS7c_ZdfONzOQDbpsdWxU7mt7ZwsAhnW5lC0ZQ,1328
+flask_appbuilder/templates/appbuilder/general/widgets/group_form_list.html,sha256=eceh1r4br9UF_fkxfASR-MHv1b83RVHSmOwbpxHiQWg,247
+flask_appbuilder/templates/appbuilder/general/widgets/list.html,sha256=Kg-tSP5CI5x1bbyWPc76PLoRgcbWmTeLyBHdCB69tmI,2745
+flask_appbuilder/templates/appbuilder/general/widgets/list_block.html,sha256=g3xOphl51AQR4BsY4bvzULFLP8xNYx974z3JSCzvYtk,1331
+flask_appbuilder/templates/appbuilder/general/widgets/list_carousel.html,sha256=PHpItuC_EVplduO9PNpc2id90FJlsAymrqfIOy1WgOo,2038
+flask_appbuilder/templates/appbuilder/general/widgets/list_item.html,sha256=g4LHtP3Ay1_9fF1yIybkrMXlPyyILhNGHe485uByw-U,1317
+flask_appbuilder/templates/appbuilder/general/widgets/list_link.html,sha256=UnljuAk0cAvDnkjPPGOBMqKvYF1n26aARfmh7gm8kzE,2843
+flask_appbuilder/templates/appbuilder/general/widgets/list_master.html,sha256=91W3oiuvcmqysm-uyUxHk9TdqXSe58RVmVksZeXYF8s,572
+flask_appbuilder/templates/appbuilder/general/widgets/list_thumbnail.html,sha256=_oG8PjsNGBXpBFayWfZwBTGf7I8fKCfvYsgIwmFhKAw,1167
+flask_appbuilder/templates/appbuilder/general/widgets/multiple_chart.html,sha256=eb1DK3zuF43XYvRk99ELw5hBhs6ZV20GgmnXF5h14DA,1631
+flask_appbuilder/templates/appbuilder/general/widgets/roles/list.html,sha256=-_LLPbwlzLZnP4R4w-h7scFwwip2Y_iJ7p6UZQu8qBg,3249
+flask_appbuilder/templates/appbuilder/general/widgets/roles/show.html,sha256=PYQxFZXOqfbARAuPLNjZlafCXo7BbHno2hxRaWHqJCg,2132
+flask_appbuilder/templates/appbuilder/general/widgets/search.html,sha256=NsmI-irzl9lHFpBSEiQ4SrwTpBVrO8dERZ9Zunx0ccA,1087
+flask_appbuilder/templates/appbuilder/general/widgets/show.html,sha256=ur1bgNTjg8SgoqbVNfOq8XKF606dduG7-PDP6FWGNYo,1738
+flask_appbuilder/templates/appbuilder/general/widgets/show_block.html,sha256=ZylOUshZQ9octVj2-XjRjMAH53CSmbfZ7Rs5N9-75MY,1833
+flask_appbuilder/templates/appbuilder/general/widgets/show_vertical.html,sha256=pOqaFmvNndW0r1zkrwzNS9_LPM5bLztLWr7MAl1LCyY,1544
+flask_appbuilder/templates/appbuilder/index.html,sha256=NJKAjcqL9C7mTbwR_bAD3dkAOJTGcJBfPQlSMDhcu-0,145
+flask_appbuilder/templates/appbuilder/init.html,sha256=Y81Y7FQtmW-jODm2d8viwInaNaAIUiKtAbK_y4oRnLg,3048
+flask_appbuilder/templates/appbuilder/navbar.html,sha256=FA57fvVai2a4rfolvsdwP7B61P_GyfLjdOHykUdE3gc,1299
+flask_appbuilder/templates/appbuilder/navbar_menu.html,sha256=yA0FVS-hZs-2CnZvhX3vm21gK4mDyPvJ3FDJwp-wyhw,1247
+flask_appbuilder/templates/appbuilder/navbar_right.html,sha256=lT8BgKYMXumMlWKcQYE0xAvk-2-pssI0j_dX5ZI4cN0,1564
+flask_appbuilder/templates/appbuilder/swagger/swagger.html,sha256=R8OgoPVCFQA22yx6tiI3Pqp6o93kd3rpIblbCKfjWu8,896
+flask_appbuilder/translations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_appbuilder/translations/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/translations/__pycache__/__init__.cpython-38.pyc,sha256=oHWvaBjpr3aLQnfEfD-soJ49YBAXW0zqVTX00etQSxA,181
+flask_appbuilder/translations/de/LC_MESSAGES/messages.mo,sha256=iavCGbOdPhfvqHeMGjidesCcncDYYLJsw7TkxIoDWLU,9681
+flask_appbuilder/translations/de/LC_MESSAGES/messages.po,sha256=NCd_qi-PBkQoSb6udJ0QOIhLSB6oAmovw-gbiwDk3Nc,26578
+flask_appbuilder/translations/el/LC_MESSAGES/messages.mo,sha256=LXr_WkihKj4Kzs8SVNTDoJnrOKZS6b3HGrsHivmuxdg,11017
+flask_appbuilder/translations/el/LC_MESSAGES/messages.po,sha256=Wh4wezTVlsYs7ndqUk2P1NukL0-Ci6Y-bi4rufPkssU,22936
+flask_appbuilder/translations/es/LC_MESSAGES/messages.mo,sha256=f58Vl0A6lngb_JPk-MGjwJHBMHiWc2krlZm1OcukbPk,8468
+flask_appbuilder/translations/es/LC_MESSAGES/messages.po,sha256=ve9Y8p1PzizY5kd3ROacELV78kRAPNsKkNGKPvvDbg4,20079
+flask_appbuilder/translations/fa/LC_MESSAGES/messages.mo,sha256=WJJg4gaR71uH7KDDwu-x6jDSCISWr0mGZWMlK-UsZX8,12017
+flask_appbuilder/translations/fa/LC_MESSAGES/messages.po,sha256=zUMPkOLASFn51Fz4zY88t0iOErbUQiew3t2m-dVru_M,27607
+flask_appbuilder/translations/fr/LC_MESSAGES/messages.mo,sha256=XdsRh8eobO5pwmWw9OpMYjL0YM66hmhEVaS7x1BrnQ8,8504
+flask_appbuilder/translations/fr/LC_MESSAGES/messages.po,sha256=4AV4ueGdKTJIU7MA68vPea_g9ZU2aJZoLQt7Ra1BhPg,20065
+flask_appbuilder/translations/it/LC_MESSAGES/messages.mo,sha256=T7JAnLQc4ww_9BSEssovwkojmXz_MmS4zQkapefQWuw,9121
+flask_appbuilder/translations/it/LC_MESSAGES/messages.po,sha256=PDIirc9Kf3so84xrC5MWmSZt3RpwE__EYqaMDs5a9sE,24545
+flask_appbuilder/translations/ja_JP/LC_MESSAGES/messages.mo,sha256=Yvs2hZ8PbYhv5_I2NEQtAeYzvdGUhVngkZOwAJNji0U,9412
+flask_appbuilder/translations/ja_JP/LC_MESSAGES/messages.po,sha256=DLXJUwApP6cc1tPm9SVuSOBn1wIs7lDjV2sLp6PC-Ww,20790
+flask_appbuilder/translations/ko/LC_MESSAGES/messages.mo,sha256=_hcH6yP4mzlVYKbk5HJSK8bnLsY7w_IhuRS7M63x_zo,9513
+flask_appbuilder/translations/ko/LC_MESSAGES/messages.po,sha256=WUn5YfX8aWfAsven5RUqbwafN2EAI6u4_eIyucN_LGA,39930
+flask_appbuilder/translations/nl/LC_MESSAGES/messages.mo,sha256=p1h8_BqijMFXRaACAgB_9RIvWArTrhFV4RMYXk0J-G0,8252
+flask_appbuilder/translations/nl/LC_MESSAGES/messages.po,sha256=vyTNgbYKJmwMW1hsxfZfrrWW-pROqidvRsMSiaxZ-hc,19648
+flask_appbuilder/translations/pl/LC_MESSAGES/messages.mo,sha256=6jqC0VJIvAvYHghzZpYT9OqgRA__Ej25Mk5mwjsYDW4,8136
+flask_appbuilder/translations/pl/LC_MESSAGES/messages.po,sha256=A1S4jbKbP9ztqMpJfp4iCzpGyYE2rz9BXZm5V59Bw8o,20115
+flask_appbuilder/translations/pt/LC_MESSAGES/messages.mo,sha256=-gqhdBzwygGmLocm5kWwoSIprMOF5bpiYNZHcb8yz7c,8441
+flask_appbuilder/translations/pt/LC_MESSAGES/messages.po,sha256=qVyiB8TA1TO8vjHvCvP8QZAf7bsgMDLIuML7EubVuE8,20002
+flask_appbuilder/translations/pt/LC_MESSAGES/messages.po~,sha256=zwUQE2GP-L3VaKum4KqqFWh2Md8DSMp-Kq7f7PO5y0A,20509
+flask_appbuilder/translations/pt_BR/LC_MESSAGES/messages.mo,sha256=YT8fgL_bJDNf0ghQ5KyEdpgbtwh3po6tZzvct7RVlmk,8336
+flask_appbuilder/translations/pt_BR/LC_MESSAGES/messages.po,sha256=Og1Efwv409W0fZUFUSJeJ4Vdgt-3mKYQQs0TovaBjFc,20517
+flask_appbuilder/translations/ru/LC_MESSAGES/messages.mo,sha256=wcG3qhjMmIgG4qD4ViH20Hx4dxg5CvFyJ-1GQqUIigg,10674
+flask_appbuilder/translations/ru/LC_MESSAGES/messages.po,sha256=uG6zOAFH3NuS1DAkKj6bf7l0qMIS8dvxx6jfDdvf5W8,22035
+flask_appbuilder/translations/sl/LC_MESSAGES/messages.mo,sha256=zgKVl6OjSSxtloIoVN7RDXLt31BkWW4VUJQMcrl5aSY,9682
+flask_appbuilder/translations/sl/LC_MESSAGES/messages.po,sha256=28IkADoqJB1owFqKL-psyAmA_lDn7Uh_6BdcymdX2IU,20841
+flask_appbuilder/translations/tr/LC_MESSAGES/messages.mo,sha256=nJlekRpNIOBYx3q6BHrSyR-01qn7UERrORB-sBVAFJ0,10336
+flask_appbuilder/translations/tr/LC_MESSAGES/messages.po,sha256=q3hv2AMKpaMpI2CXentUvQa1VBm6wfABqGLnk3sCfgw,40132
+flask_appbuilder/translations/zh/LC_MESSAGES/messages.mo,sha256=LOspp0B_RAVWHmtqzvmFHrgxds6pmZjPrRpS_D8jkME,7528
+flask_appbuilder/translations/zh/LC_MESSAGES/messages.po,sha256=3allp8Aa1eUVZXi-ezhmbOPNR5JO57qajtwbrWkltnM,19095
+flask_appbuilder/translations/zh_HK/LC_MESSAGES/messages.mo,sha256=s4S4s1yNeGRmfPlpd7NuAf4UqkxeKakXFUsirvn0c14,7493
+flask_appbuilder/translations/zh_HK/LC_MESSAGES/messages.po,sha256=G3K0jpHUZNYQXMazLBVpUB8tDVrDWzeo6oumWTzwYxs,19104
+flask_appbuilder/upload.py,sha256=q59R4G2U_89SY3Sv4lfoqyppCAOWbR0s9zVJhX2fchM,7537
+flask_appbuilder/urltools.py,sha256=QduNelzv4XSbEq7YoJTNXon3Kv6Rqk5LhOEDbH5wtcE,3178
+flask_appbuilder/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_appbuilder/utils/__pycache__/__init__.cpython-312.pyc,,
+flask_appbuilder/utils/__pycache__/base.cpython-312.pyc,,
+flask_appbuilder/utils/__pycache__/limit.cpython-312.pyc,,
+flask_appbuilder/utils/base.py,sha256=4NyIWvhfqFQri7EALfNUt2RUX6NaAiz1oGaf36si01I,2284
+flask_appbuilder/utils/limit.py,sha256=oCmJluV-fSvCG9DlPg0Od9Sfkyl5jP22pRGunmE5SSA,734
+flask_appbuilder/validators.py,sha256=dqaK10Qc-TWrHh6tIuZWeSN5bthIsNJeblhdL_GjEOM,3364
+flask_appbuilder/views.py,sha256=O3u6hSjRcekWO7DcdG47r1QkzWT5wGwuZDo9k8BMyYc,31378
+flask_appbuilder/widgets.py,sha256=eZKMxOU1qmYnSM01CTWZUNI_CtTKUCbCeGQO-xFOV38,4815

+ 5 - 0
.venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/WHEEL

@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.42.0)
+Root-Is-Purelib: true
+Tag: py3-none-any
+

+ 5 - 0
.venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/entry_points.txt

@@ -0,0 +1,5 @@
+[console_scripts]
+fabmanager = flask_appbuilder.console:cli
+
+[flask.commands]
+fab = flask_appbuilder.cli:fab

+ 1 - 0
.venv/Lib/site-packages/Flask_AppBuilder-4.5.3.dist-info/top_level.txt

@@ -0,0 +1 @@
+flask_appbuilder

+ 1 - 0
.venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 31 - 0
.venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/LICENSE

@@ -0,0 +1,31 @@
+Copyright (c) 2010 by Armin Ronacher.
+
+Some rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions and the following disclaimer.
+
+* 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.
+
+* The names of the contributors may not 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
+OWNER 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.

+ 57 - 0
.venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/METADATA

@@ -0,0 +1,57 @@
+Metadata-Version: 2.1
+Name: Flask-Babel
+Version: 2.0.0
+Summary: Adds i18n/l10n support to Flask applications
+Home-page: http://github.com/python-babel/flask-babel
+Author: Armin Ronacher
+Author-email: armin.ronacher@active-4.com
+Maintainer: Tyler Kennedy
+Maintainer-email: tk@tkte.ch
+License: BSD
+Platform: UNKNOWN
+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 :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Description-Content-Type: text/markdown
+Requires-Dist: pytz
+Requires-Dist: Flask
+Requires-Dist: Babel (>=2.3)
+Requires-Dist: Jinja2 (>=2.5)
+Provides-Extra: dev
+Requires-Dist: pytest ; extra == 'dev'
+Requires-Dist: pytest-mock ; extra == 'dev'
+Requires-Dist: bumpversion ; extra == 'dev'
+Requires-Dist: ghp-import ; extra == 'dev'
+Requires-Dist: sphinx ; extra == 'dev'
+Requires-Dist: Pallets-Sphinx-Themes ; extra == 'dev'
+
+# Flask Babel
+
+![Tests](https://github.com/python-babel/flask-babel/workflows/Tests/badge.svg?branch=master)
+[![PyPI](https://img.shields.io/pypi/v/flask-babel.svg?maxAge=2592000)](https://pypi.python.org/pypi/Flask-Babel)
+
+Implements i18n and l10n support for Flask.  This is based on the Python
+[babel][] module as well as [pytz][] both of which are installed automatically
+for you if you install this library.
+
+# Documention
+
+The latest documentation is available [here][docs].
+
+[babel]: https://github.com/python-babel/babel
+[pytz]: https://pypi.python.org/pypi/pytz/
+[docs]: https://flask-babel.tkte.ch/
+[semver]: https://semver.org/
+
+

+ 10 - 0
.venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/RECORD

@@ -0,0 +1,10 @@
+Flask_Babel-2.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+Flask_Babel-2.0.0.dist-info/LICENSE,sha256=pSYQCnBHI3Ngo5S6T3CugBtQ_5uMm55z53lUgKWfa34,1457
+Flask_Babel-2.0.0.dist-info/METADATA,sha256=PAc5Px_xpOvXOxW8pLJ7Hr5BlDu8sEECZZkGTXShwRo,2145
+Flask_Babel-2.0.0.dist-info/RECORD,,
+Flask_Babel-2.0.0.dist-info/WHEEL,sha256=EVRjI69F5qVjm_YgqcTXPnTAv3BfSUr0WVAHuSP3Xoo,92
+Flask_Babel-2.0.0.dist-info/top_level.txt,sha256=2CI1eTvkPSxyDsmIAjCSzvyC9vye6AnqevE4ByOoGpg,12
+flask_babel/__init__.py,sha256=pVPkON7P5p2JBIUJwkZb1uaGvrT81hlaf-MkcwTn88c,24625
+flask_babel/__pycache__/__init__.cpython-312.pyc,,
+flask_babel/__pycache__/speaklater.cpython-312.pyc,,
+flask_babel/speaklater.py,sha256=moGrHeg_M-c5sqUdmudwnKZ55-FH-Uh4iktpjiHGSpo,1669

+ 5 - 0
.venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/WHEEL

@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.35.1)
+Root-Is-Purelib: true
+Tag: py3-none-any
+

+ 1 - 0
.venv/Lib/site-packages/Flask_Babel-2.0.0.dist-info/top_level.txt

@@ -0,0 +1 @@
+flask_babel

+ 1 - 0
.venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 69 - 0
.venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/LICENSE

@@ -0,0 +1,69 @@
+Copyright (c) 2010 by Thadeus Burgess.
+Copyright (c) 2016 by Peter Justin.
+
+Some rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions and the following disclaimer.
+
+* 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.
+
+* The names of the contributors may not 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
+OWNER 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.
+
+
+The "cache" module from werkzeug is licensed under a BSD-3 Clause license as is
+stated below:
+
+Copyright (c) 2017, Pallets Team
+
+All rights reserved.
+
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+
+* 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.
+
+* 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 AND DOCUMENTATION 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 AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.

+ 70 - 0
.venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/METADATA

@@ -0,0 +1,70 @@
+Metadata-Version: 2.2
+Name: Flask-Caching
+Version: 2.3.1
+Summary: Adds caching support to Flask applications.
+Home-page: https://github.com/pallets-eco/flask-caching
+Author: Peter Justin
+Author-email: peter.justin@outlook.com
+Maintainer: Pallets
+Maintainer-email: contact@palletsprojects.com
+License: BSD
+Project-URL: Donate, https://palletsprojects.com/donate
+Project-URL: Documentation, https://flask-caching.readthedocs.io
+Project-URL: Changes, https://flask-caching.readthedocs.io/en/latest/changelog.html
+Project-URL: Source Code, https://github.com/pallets-eco/flask-caching
+Project-URL: Issue Tracker, https://github.com/pallets-eco/flask-caching/issues
+Project-URL: Twitter, https://twitter.com/PalletsTeam
+Project-URL: Chat, https://discord.gg/pallets
+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
+Requires-Python: >=3.8
+Description-Content-Type: text/x-rst
+License-File: LICENSE
+Requires-Dist: cachelib>=0.9.0
+Requires-Dist: Flask
+Dynamic: requires-dist
+
+Flask-Caching
+=============
+
+A fork of the `Flask-cache`_ extension which adds easy cache support to Flask.
+
+.. _Flask-cache: https://github.com/thadeusb/flask-cache
+
+
+Installing
+----------
+
+Install and update using `pip`_:
+
+.. code-block:: text
+
+    $ pip install -U flask-caching
+
+.. _pip: https://pip.pypa.io/en/stable/getting-started/
+
+
+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
+
+
+Links
+-----
+
+-   Documentation: https://flask-caching.readthedocs.io
+-   Changes: https://flask-caching.readthedocs.io/en/latest/changelog.html
+-   PyPI Releases: https://pypi.org/project/Flask-Caching/
+-   Source Code: https://github.com/pallets-eco/flask-caching
+-   Issue Tracker: https://github.com/pallets-eco/flask-caching/issues
+-   Twitter: https://twitter.com/PalletsTeam
+-   Chat: https://discord.gg/pallets

+ 35 - 0
.venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/RECORD

@@ -0,0 +1,35 @@
+Flask_Caching-2.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+Flask_Caching-2.3.1.dist-info/LICENSE,sha256=HzxEX6om6zLZApEihRDi2FlL0f4VRj9dcMh9RPOIcv0,3119
+Flask_Caching-2.3.1.dist-info/METADATA,sha256=ra9QOl_xhrZM8XfXXOcJe1yaH7R15ZHswI_uUeH8MWQ,2222
+Flask_Caching-2.3.1.dist-info/RECORD,,
+Flask_Caching-2.3.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
+Flask_Caching-2.3.1.dist-info/top_level.txt,sha256=n9GtsdkLGBvDxN57lvIn4ZGnnQn3rkZVwus4MmBwA4I,14
+flask_caching/__init__.py,sha256=-bnIg2mojIJ0ru0E7Y2SibxRgHNQC0stALaucMvlCpA,41968
+flask_caching/__pycache__/__init__.cpython-312.pyc,,
+flask_caching/__pycache__/jinja2ext.cpython-312.pyc,,
+flask_caching/__pycache__/utils.cpython-312.pyc,,
+flask_caching/backends/__init__.py,sha256=LhJsthVtpbA7ph6ENLs3s7ZvnnHnyVZ5MxRujB1ghUU,2215
+flask_caching/backends/__pycache__/__init__.cpython-312.pyc,,
+flask_caching/backends/__pycache__/base.cpython-312.pyc,,
+flask_caching/backends/__pycache__/filesystemcache.cpython-312.pyc,,
+flask_caching/backends/__pycache__/memcache.cpython-312.pyc,,
+flask_caching/backends/__pycache__/nullcache.cpython-312.pyc,,
+flask_caching/backends/__pycache__/rediscache.cpython-312.pyc,,
+flask_caching/backends/__pycache__/simplecache.cpython-312.pyc,,
+flask_caching/backends/__pycache__/uwsgicache.cpython-312.pyc,,
+flask_caching/backends/base.py,sha256=HuE_nzle0QO97mpeloz5TyJjGubenGJz2WGy3eW60Io,1501
+flask_caching/backends/filesystemcache.py,sha256=FCrdIAmNRgVkOF19G4Ng8bKvo3tCpQX34CPGrltJVro,2680
+flask_caching/backends/memcache.py,sha256=1nEpOMkBZ740oZw1JP6AF1lFqt13ACa9n21XgPOQGMo,7634
+flask_caching/backends/nullcache.py,sha256=zxC631MkXN4uUvyQwAaRG_udVTcgxwNWMhgQTcfnZyg,626
+flask_caching/backends/rediscache.py,sha256=NMwP8M81uWRqf_ODBq5waXdt1VI3LQybWhR4fRJI3bE,9344
+flask_caching/backends/simplecache.py,sha256=qUAS764SApzG6eSWz0629zrhG7-4LKpSYx1WFTpS-R4,2066
+flask_caching/backends/uwsgicache.py,sha256=gP0gKvaJ8l7q3Yn7F2P4w2kBWu_vkgOGhOgkBVeQUM8,455
+flask_caching/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_caching/contrib/__pycache__/__init__.cpython-312.pyc,,
+flask_caching/contrib/__pycache__/googlecloudstoragecache.cpython-312.pyc,,
+flask_caching/contrib/__pycache__/uwsgicache.cpython-312.pyc,,
+flask_caching/contrib/googlecloudstoragecache.py,sha256=fCgBHQ3qld9vYSbL3OBN-4HOntkCi1byyh8fPio4IcM,7527
+flask_caching/contrib/uwsgicache.py,sha256=G8pW-B8C2G_h4Df4HRgieO-nWLMYvUO7y22tB-oh0t0,2296
+flask_caching/jinja2ext.py,sha256=02O2p5d_5qhwh0DP-PlOSbLZV1ujGS_JIczPnNcfxaU,2920
+flask_caching/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_caching/utils.py,sha256=CDTgTzNDSExyeKt3fZdxm-01c8A5nJKL85nunzjkP0k,3238

+ 5 - 0
.venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/WHEEL

@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: setuptools (75.8.0)
+Root-Is-Purelib: true
+Tag: py3-none-any
+

+ 1 - 0
.venv/Lib/site-packages/Flask_Caching-2.3.1.dist-info/top_level.txt

@@ -0,0 +1 @@
+flask_caching

+ 1 - 0
.venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 21 - 0
.venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/LICENSE

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

+ 113 - 0
.venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/METADATA

@@ -0,0 +1,113 @@
+Metadata-Version: 2.1
+Name: Flask-JWT-Extended
+Version: 4.7.1
+Summary: Extended JWT integration with Flask
+Home-page: https://github.com/vimalloc/flask-jwt-extended
+Author: Lily Acadia Gilbert
+Author-email: lily.gilbert@hey.com
+License: MIT
+Keywords: flask,jwt,json web token
+Platform: any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Framework :: Flask
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Requires-Python: >=3.9,<4
+Description-Content-Type: text/markdown
+License-File: LICENSE
+Requires-Dist: Werkzeug>=0.14
+Requires-Dist: Flask<4.0,>=2.0
+Requires-Dist: PyJWT<3.0,>=2.0
+Provides-Extra: asymmetric-crypto
+Requires-Dist: cryptography>=3.3.1; extra == "asymmetric-crypto"
+
+# Flask-JWT-Extended
+
+### Features
+
+Flask-JWT-Extended not only adds support for using JSON Web Tokens (JWT) to Flask for protecting routes,
+but also many helpful (and **optional**) features built in to make working with JSON Web Tokens
+easier. These include:
+
+-   Adding custom claims to JSON Web Tokens
+-   Automatic user loading (`current_user`).
+-   Custom claims validation on received tokens
+-   [Refresh tokens](https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/)
+-   First class support for fresh tokens for making sensitive changes.
+-   Token revoking/blocklisting
+-   Storing tokens in cookies and CSRF protection
+
+### Usage
+
+[View the documentation online](https://flask-jwt-extended.readthedocs.io/en/stable/)
+
+### Upgrading from 3.x.x to 4.0.0
+
+[View the changes](https://flask-jwt-extended.readthedocs.io/en/stable/v4_upgrade_guide/)
+
+### Changelog
+
+You can view the changelog [here](https://github.com/vimalloc/flask-jwt-extended/releases).
+This project follows [semantic versioning](https://semver.org/).
+
+### Chatting
+
+Come chat with the community or ask questions at https://discord.gg/EJBsbFd
+
+### Contributing
+
+Before making any changes, make sure to install the development requirements
+and setup the git hooks which will automatically lint and format your changes.
+
+```bash
+pip install -r requirements.txt
+pre-commit install
+```
+
+We require 100% code coverage in our unit tests. You can run the tests locally
+with `tox` which ensures that all tests pass, tests provide complete code coverage,
+documentation builds, and style guide are adhered to
+
+```bash
+tox
+```
+
+A subset of checks can also be ran by adding an argument to tox. The available
+arguments are:
+
+-   py37, py38, py39, py310, py311, py312, pypy3
+    -   Run unit tests on the given python version
+-   mypy
+    -   Run mypy type checking
+-   coverage
+    -   Run a code coverage check
+-   docs
+    -   Ensure documentation builds and there are no broken links
+-   style
+    -   Ensure style guide is adhered to
+
+```bash
+tox -e py38
+```
+
+We also require features to be well documented. You can generate a local copy
+of the documentation by going to the `docs` directory and running:
+
+```bash
+make clean && make html && open _build/html/index.html
+```

+ 27 - 0
.venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/RECORD

@@ -0,0 +1,27 @@
+Flask_JWT_Extended-4.7.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+Flask_JWT_Extended-4.7.1.dist-info/LICENSE,sha256=IZ7JSdUnG3ZAFNkV8wskplpL1tTu-ImxNFJM2Zfci5g,1076
+Flask_JWT_Extended-4.7.1.dist-info/METADATA,sha256=GuhF8kzZOl9nKVkGgeRx5X7KEa6FiNpv9xjRWZgiz9I,3812
+Flask_JWT_Extended-4.7.1.dist-info/RECORD,,
+Flask_JWT_Extended-4.7.1.dist-info/WHEEL,sha256=pxeNX5JdtCe58PUSYP9upmc7jdRPgvT0Gm9kb1SHlVw,109
+Flask_JWT_Extended-4.7.1.dist-info/top_level.txt,sha256=ScNvc4cNmrFFSnAe_rENqiMpfhog1M2HkaUaydRBbUU,19
+flask_jwt_extended/__init__.py,sha256=q3b7uG1tp7jXv9L2WokVrh920M7J8mRGRQKaCc2KbNo,1179
+flask_jwt_extended/__pycache__/__init__.cpython-312.pyc,,
+flask_jwt_extended/__pycache__/config.cpython-312.pyc,,
+flask_jwt_extended/__pycache__/default_callbacks.cpython-312.pyc,,
+flask_jwt_extended/__pycache__/exceptions.cpython-312.pyc,,
+flask_jwt_extended/__pycache__/internal_utils.cpython-312.pyc,,
+flask_jwt_extended/__pycache__/jwt_manager.cpython-312.pyc,,
+flask_jwt_extended/__pycache__/tokens.cpython-312.pyc,,
+flask_jwt_extended/__pycache__/typing.cpython-312.pyc,,
+flask_jwt_extended/__pycache__/utils.cpython-312.pyc,,
+flask_jwt_extended/__pycache__/view_decorators.cpython-312.pyc,,
+flask_jwt_extended/config.py,sha256=8hvI2WEUPcDRFumnWACjPQSNm5Sn10RfVzagP4Tv46g,10083
+flask_jwt_extended/default_callbacks.py,sha256=S-zUiOS5nMiC4n3URpUpGf9LfNA5bT2kWHVJdp14Ngs,5273
+flask_jwt_extended/exceptions.py,sha256=kleki6CySt5u-BiAwJ-uskWb8rySnXHLC-w-YvMqyk4,2400
+flask_jwt_extended/internal_utils.py,sha256=XDnS8GLQ2oaZka5FbfiuE9KBgxAmmHssuKR3mLDP1Jk,3350
+flask_jwt_extended/jwt_manager.py,sha256=OjTJhl2xPVq3Z0FH874NNtHR4VeOl2y75dnQLdPL8GM,23989
+flask_jwt_extended/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+flask_jwt_extended/tokens.py,sha256=GOreSqdqx1rAg3nV_DMn2ltqAngLpu2281zx6Y6V2M4,3131
+flask_jwt_extended/typing.py,sha256=l4nGV2_ARq2_BUK6CjnrOp5i43qXJ3yqLPy8YOs1soA,170
+flask_jwt_extended/utils.py,sha256=iA6Fk-S4DDmRruKNCwkB6KK70cuPWKOTVb8vsKUq2P4,15964
+flask_jwt_extended/view_decorators.py,sha256=gtDCZ4-3e6eldJREMukIjD9SzoYa1bScKdInUtPIhIs,13583

+ 6 - 0
.venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/WHEEL

@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: setuptools (75.6.0)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+

+ 1 - 0
.venv/Lib/site-packages/Flask_JWT_Extended-4.7.1.dist-info/top_level.txt

@@ -0,0 +1 @@
+flask_jwt_extended

+ 1 - 0
.venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 22 - 0
.venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/LICENSE

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

+ 183 - 0
.venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/METADATA

@@ -0,0 +1,183 @@
+Metadata-Version: 2.1
+Name: Flask-Login
+Version: 0.6.3
+Summary: User authentication and session management for Flask.
+Home-page: https://github.com/maxcountryman/flask-login
+Author: Matthew Frazier
+Author-email: leafstormrush@gmail.com
+Maintainer: Max Countryman
+License: MIT
+Project-URL: Documentation, https://flask-login.readthedocs.io/
+Project-URL: Changes, https://github.com/maxcountryman/flask-login/blob/main/CHANGES.md
+Project-URL: Source Code, https://github.com/maxcountryman/flask-login
+Project-URL: Issue Tracker, https://github.com/maxcountryman/flask-login/issues
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Web Environment
+Classifier: Framework :: Flask
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Requires-Python: >=3.7
+Description-Content-Type: text/markdown
+License-File: LICENSE
+Requires-Dist: Flask >=1.0.4
+Requires-Dist: Werkzeug >=1.0.1
+
+# Flask-Login
+
+![Tests](https://github.com/maxcountryman/flask-login/workflows/Tests/badge.svg)
+[![coverage](https://coveralls.io/repos/maxcountryman/flask-login/badge.svg?branch=main&service=github)](https://coveralls.io/github/maxcountryman/flask-login?branch=main)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE)
+
+Flask-Login provides user session management for Flask. It handles the common
+tasks of logging in, logging out, and remembering your users' sessions over
+extended periods of time.
+
+Flask-Login is not bound to any particular database system or permissions
+model. The only requirement is that your user objects implement a few methods,
+and that you provide a callback to the extension capable of loading users from
+their ID.
+
+## Installation
+
+Install the extension with pip:
+
+```sh
+$ pip install flask-login
+```
+
+## Usage
+
+Once installed, the Flask-Login is easy to use. Let's walk through setting up
+a basic application. Also please note that this is a very basic guide: we will
+be taking shortcuts here that you should never take in a real application.
+
+To begin we'll set up a Flask app:
+
+```python
+import flask
+
+app = flask.Flask(__name__)
+app.secret_key = 'super secret string'  # Change this!
+```
+
+Flask-Login works via a login manager. To kick things off, we'll set up the
+login manager by instantiating it and telling it about our Flask app:
+
+```python
+import flask_login
+
+login_manager = flask_login.LoginManager()
+
+login_manager.init_app(app)
+```
+
+To keep things simple we're going to use a dictionary to represent a database
+of users. In a real application, this would be an actual persistence layer.
+However it's important to point out this is a feature of Flask-Login: it
+doesn't care how your data is stored so long as you tell it how to retrieve it!
+
+```python
+# Our mock database.
+users = {'foo@bar.tld': {'password': 'secret'}}
+```
+
+We also need to tell Flask-Login how to load a user from a Flask request and
+from its session. To do this we need to define our user object, a
+`user_loader` callback, and a `request_loader` callback.
+
+```python
+class User(flask_login.UserMixin):
+    pass
+
+
+@login_manager.user_loader
+def user_loader(email):
+    if email not in users:
+        return
+
+    user = User()
+    user.id = email
+    return user
+
+
+@login_manager.request_loader
+def request_loader(request):
+    email = request.form.get('email')
+    if email not in users:
+        return
+
+    user = User()
+    user.id = email
+    return user
+```
+
+Now we're ready to define our views. We can start with a login view, which will
+populate the session with authentication bits. After that we can define a view
+that requires authentication.
+
+```python
+@app.route('/login', methods=['GET', 'POST'])
+def login():
+    if flask.request.method == 'GET':
+        return '''
+               <form action='login' method='POST'>
+                <input type='text' name='email' id='email' placeholder='email'/>
+                <input type='password' name='password' id='password' placeholder='password'/>
+                <input type='submit' name='submit'/>
+               </form>
+               '''
+
+    email = flask.request.form['email']
+    if email in users and flask.request.form['password'] == users[email]['password']:
+        user = User()
+        user.id = email
+        flask_login.login_user(user)
+        return flask.redirect(flask.url_for('protected'))
+
+    return 'Bad login'
+
+
+@app.route('/protected')
+@flask_login.login_required
+def protected():
+    return 'Logged in as: ' + flask_login.current_user.id
+```
+
+Finally we can define a view to clear the session and log users out:
+
+```python
+@app.route('/logout')
+def logout():
+    flask_login.logout_user()
+    return 'Logged out'
+```
+
+We now have a basic working application that makes use of session-based
+authentication. To round things off, we should provide a callback for login
+failures:
+
+```python
+@login_manager.unauthorized_handler
+def unauthorized_handler():
+    return 'Unauthorized', 401
+```
+
+Documentation for Flask-Login is available on [ReadTheDocs](https://flask-login.readthedocs.io/en/latest/).
+For complete understanding of available configuration, please refer to the [source code](https://github.com/maxcountryman/flask-login).
+
+
+## Contributing
+
+We welcome contributions! If you would like to hack on Flask-Login, please
+follow these steps:
+
+1. Fork this repository
+2. Make your changes
+3. Install the dev requirements with `pip install -r requirements/dev.txt`
+4. Submit a pull request after running `tox` (ensure it does not error!)
+
+Please give us adequate time to review your submission. Thanks!

+ 22 - 0
.venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/RECORD

@@ -0,0 +1,22 @@
+Flask_Login-0.6.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+Flask_Login-0.6.3.dist-info/LICENSE,sha256=ep37nF2iBO0TcPO2LBPimSoS2h2nB_R-FWiX7rQ0Tls,1059
+Flask_Login-0.6.3.dist-info/METADATA,sha256=AUSHR5Po6-Cwmz1KBrAZbTzR-iVVFvtb2NQKYl7UuAU,5799
+Flask_Login-0.6.3.dist-info/RECORD,,
+Flask_Login-0.6.3.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
+Flask_Login-0.6.3.dist-info/top_level.txt,sha256=OuXmIpiFnXLvW-iBbW2km7ZIy5EZvwSBnYaOC3Kt7j8,12
+flask_login/__about__.py,sha256=Kkp5e9mV9G7vK_FqZof-g9RFmyyBzq1gge5aKXgvilE,389
+flask_login/__init__.py,sha256=wYQiQCikT_Ndp3PhOD-1gRTGCrUPIE-FrjQUrT9aVAg,2681
+flask_login/__pycache__/__about__.cpython-312.pyc,,
+flask_login/__pycache__/__init__.cpython-312.pyc,,
+flask_login/__pycache__/config.cpython-312.pyc,,
+flask_login/__pycache__/login_manager.cpython-312.pyc,,
+flask_login/__pycache__/mixins.cpython-312.pyc,,
+flask_login/__pycache__/signals.cpython-312.pyc,,
+flask_login/__pycache__/test_client.cpython-312.pyc,,
+flask_login/__pycache__/utils.cpython-312.pyc,,
+flask_login/config.py,sha256=YAocv18La7YGQyNY5aT7rU1GQIZnX6pvchwqx3kA9p8,1813
+flask_login/login_manager.py,sha256=h20F_iv3mqc6rIJ4-V6_XookzOUl8Rcpasua-dCByQY,20073
+flask_login/mixins.py,sha256=gPd7otMRljxw0eUhUMbHsnEBc_jK2cYdxg5KFLuJcoI,1528
+flask_login/signals.py,sha256=xCMoFHKU1RTVt1NY-Gfl0OiVKpiyNt6YJw_PsgkjY3w,2464
+flask_login/test_client.py,sha256=6mrjiBRLGJpgvvFlLypXPTBLiMp0BAN-Ft-uogqC81g,517
+flask_login/utils.py,sha256=Y1wxjCVxpYohBaQJ0ADLypQ-VvBNycwG-gVXFF7k99I,14021

+ 5 - 0
.venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/WHEEL

@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.41.3)
+Root-Is-Purelib: true
+Tag: py3-none-any
+

+ 1 - 0
.venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt

@@ -0,0 +1 @@
+flask_login

+ 1 - 0
.venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 28 - 0
.venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/LICENSE.rst

@@ -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.

+ 94 - 0
.venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/METADATA

@@ -0,0 +1,94 @@
+Metadata-Version: 2.1
+Name: Flask-SQLAlchemy
+Version: 2.5.1
+Summary: Adds SQLAlchemy support to your Flask application.
+Home-page: https://github.com/pallets/flask-sqlalchemy
+Author: Armin Ronacher
+Author-email: armin.ronacher@active-4.com
+Maintainer: Pallets
+Maintainer-email: contact@palletsprojects.com
+License: BSD-3-Clause
+Project-URL: Documentation, https://flask-sqlalchemy.palletsprojects.com/
+Project-URL: Code, https://github.com/pallets/flask-sqlalchemy
+Project-URL: Issue tracker, https://github.com/pallets/flask-sqlalchemy/issues
+Platform: UNKNOWN
+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: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Requires-Python: >= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*
+Requires-Dist: Flask (>=0.10)
+Requires-Dist: SQLAlchemy (>=0.8.0)
+
+Flask-SQLAlchemy
+================
+
+Flask-SQLAlchemy is an extension for `Flask`_ that adds support for
+`SQLAlchemy`_ to your application. It aims to simplify using SQLAlchemy
+with Flask by providing useful defaults and extra helpers that make it
+easier to accomplish common tasks.
+
+
+Installing
+----------
+
+Install and update using `pip`_:
+
+.. code-block:: text
+
+  $ pip install -U Flask-SQLAlchemy
+
+
+A Simple Example
+----------------
+
+.. code-block:: python
+
+    from flask import Flask
+    from flask_sqlalchemy import SQLAlchemy
+
+    app = Flask(__name__)
+    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.sqlite"
+    db = SQLAlchemy(app)
+
+
+    class User(db.Model):
+        id = db.Column(db.Integer, primary_key=True)
+        username = db.Column(db.String, unique=True, nullable=False)
+        email = db.Column(db.String, unique=True, nullable=False)
+
+
+    db.session.add(User(name="Flask", email="example@example.com"))
+    db.session.commit()
+
+    users = User.query.all()
+
+
+Links
+-----
+
+-   Documentation: https://flask-sqlalchemy.palletsprojects.com/
+-   Releases: https://pypi.org/project/Flask-SQLAlchemy/
+-   Code: https://github.com/pallets/flask-sqlalchemy
+-   Issue tracker: https://github.com/pallets/flask-sqlalchemy/issues
+-   Test status: https://travis-ci.org/pallets/flask-sqlalchemy
+-   Test coverage: https://codecov.io/gh/pallets/flask-sqlalchemy
+
+.. _Flask: https://palletsprojects.com/p/flask/
+.. _SQLAlchemy: https://www.sqlalchemy.org
+.. _pip: https://pip.pypa.io/en/stable/quickstart/
+
+

+ 14 - 0
.venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/RECORD

@@ -0,0 +1,14 @@
+Flask_SQLAlchemy-2.5.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+Flask_SQLAlchemy-2.5.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
+Flask_SQLAlchemy-2.5.1.dist-info/METADATA,sha256=vVCeMtTM_xOrUVoVyemeNaTUI5L9iXa16NsiMDDOgFU,3128
+Flask_SQLAlchemy-2.5.1.dist-info/RECORD,,
+Flask_SQLAlchemy-2.5.1.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110
+Flask_SQLAlchemy-2.5.1.dist-info/top_level.txt,sha256=w2K4fNNoTh4HItoFfz2FRQShSeLcvHYrzU_sZov21QU,17
+flask_sqlalchemy/__init__.py,sha256=IaupgTRkQnY05KPLYvfiNnJdrmwoyfsxaiyGtrEYfO4,40738
+flask_sqlalchemy/__pycache__/__init__.cpython-312.pyc,,
+flask_sqlalchemy/__pycache__/_compat.cpython-312.pyc,,
+flask_sqlalchemy/__pycache__/model.cpython-312.pyc,,
+flask_sqlalchemy/__pycache__/utils.cpython-312.pyc,,
+flask_sqlalchemy/_compat.py,sha256=yua0ZSgVWwi56QpEgwaPInzkNQ9PFb7YQdvEk3dImXo,821
+flask_sqlalchemy/model.py,sha256=bd2mIv9LA1A2MZkQObgnMUCSrxNvyqplaSkCxyxKNxY,4988
+flask_sqlalchemy/utils.py,sha256=4eHqAbYElnJ3NbSAHhuINckoAHDABoxjleMJD0iKgyg,1390

+ 6 - 0
.venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/WHEEL

@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.36.2)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+

+ 1 - 0
.venv/Lib/site-packages/Flask_SQLAlchemy-2.5.1.dist-info/top_level.txt

@@ -0,0 +1 @@
+flask_sqlalchemy

+ 1 - 0
.venv/Lib/site-packages/Mako-1.3.9.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 19 - 0
.venv/Lib/site-packages/Mako-1.3.9.dist-info/LICENSE

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

+ 87 - 0
.venv/Lib/site-packages/Mako-1.3.9.dist-info/METADATA

@@ -0,0 +1,87 @@
+Metadata-Version: 2.2
+Name: Mako
+Version: 1.3.9
+Summary: A super-fast templating language that borrows the best ideas from the existing templating languages.
+Home-page: https://www.makotemplates.org/
+Author: Mike Bayer
+Author-email: mike@zzzcomputing.com
+License: MIT
+Project-URL: Documentation, https://docs.makotemplates.org
+Project-URL: Issue Tracker, https://github.com/sqlalchemy/mako
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Requires-Python: >=3.8
+Description-Content-Type: text/x-rst
+License-File: LICENSE
+Requires-Dist: MarkupSafe>=0.9.2
+Provides-Extra: testing
+Requires-Dist: pytest; extra == "testing"
+Provides-Extra: babel
+Requires-Dist: Babel; extra == "babel"
+Provides-Extra: lingua
+Requires-Dist: lingua; extra == "lingua"
+
+=========================
+Mako Templates for Python
+=========================
+
+Mako is a template library written in Python. It provides a familiar, non-XML 
+syntax which compiles into Python modules for maximum performance. Mako's 
+syntax and API borrows from the best ideas of many others, including Django
+templates, Cheetah, Myghty, and Genshi. Conceptually, Mako is an embedded 
+Python (i.e. Python Server Page) language, which refines the familiar ideas
+of componentized layout and inheritance to produce one of the most 
+straightforward and flexible models available, while also maintaining close 
+ties to Python calling and scoping semantics.
+
+Nutshell
+========
+
+::
+
+    <%inherit file="base.html"/>
+    <%
+        rows = [[v for v in range(0,10)] for row in range(0,10)]
+    %>
+    <table>
+        % for row in rows:
+            ${makerow(row)}
+        % endfor
+    </table>
+
+    <%def name="makerow(row)">
+        <tr>
+        % for name in row:
+            <td>${name}</td>\
+        % endfor
+        </tr>
+    </%def>
+
+Philosophy
+===========
+
+Python is a great scripting language. Don't reinvent the wheel...your templates can handle it !
+
+Documentation
+==============
+
+See documentation for Mako at https://docs.makotemplates.org/en/latest/
+
+License
+========
+
+Mako is licensed under an MIT-style license (see LICENSE).
+Other incorporated projects may be licensed under different licenses.
+All licenses allow for non-commercial and commercial use.

+ 74 - 0
.venv/Lib/site-packages/Mako-1.3.9.dist-info/RECORD

@@ -0,0 +1,74 @@
+../../Scripts/mako-render.exe,sha256=-EYkgYDd_nstDgATkKXA90mJmc8yPKPexIzQYxVekqE,108421
+Mako-1.3.9.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+Mako-1.3.9.dist-info/LICENSE,sha256=aNcGTlPj_6jp9CCp5gS9LiBZ2cMwSS-m69TrPUgRFok,1098
+Mako-1.3.9.dist-info/METADATA,sha256=gImMYAE3i8pGSGz0W39Ch2SiUkYphuu5CDwgs2cviNA,2896
+Mako-1.3.9.dist-info/RECORD,,
+Mako-1.3.9.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
+Mako-1.3.9.dist-info/entry_points.txt,sha256=LsKkUsOsJQYbJ2M72hZCm968wi5K8Ywb5uFxCuN8Obk,512
+Mako-1.3.9.dist-info/top_level.txt,sha256=LItdH8cDPetpUu8rUyBG3DObS6h9Gcpr9j_WLj2S-R0,5
+mako/__init__.py,sha256=0Umu9OqA4gU1dLRLTcAPieeVTbYoSlzmUeZk9FMt0N8,242
+mako/__pycache__/__init__.cpython-312.pyc,,
+mako/__pycache__/_ast_util.cpython-312.pyc,,
+mako/__pycache__/ast.cpython-312.pyc,,
+mako/__pycache__/cache.cpython-312.pyc,,
+mako/__pycache__/cmd.cpython-312.pyc,,
+mako/__pycache__/codegen.cpython-312.pyc,,
+mako/__pycache__/compat.cpython-312.pyc,,
+mako/__pycache__/exceptions.cpython-312.pyc,,
+mako/__pycache__/filters.cpython-312.pyc,,
+mako/__pycache__/lexer.cpython-312.pyc,,
+mako/__pycache__/lookup.cpython-312.pyc,,
+mako/__pycache__/parsetree.cpython-312.pyc,,
+mako/__pycache__/pygen.cpython-312.pyc,,
+mako/__pycache__/pyparser.cpython-312.pyc,,
+mako/__pycache__/runtime.cpython-312.pyc,,
+mako/__pycache__/template.cpython-312.pyc,,
+mako/__pycache__/util.cpython-312.pyc,,
+mako/_ast_util.py,sha256=hCbfnnizWEa3xRCA-uVyShC2HohSpmVvexz5as_lHc8,20247
+mako/ast.py,sha256=xYrdSiJFbf1CxJ9tU9pcPEWK0BYfwF2aDNDNLQG9PqQ,6642
+mako/cache.py,sha256=kA6FKGl5NeTBnSTcnhoPkSaeJ0JeYpF6GM8qzEZGSts,7680
+mako/cmd.py,sha256=Y2Y6VxNCYwO2Y8EXOdLTf5tpYgfdoondV6Ehlbh8a84,2813
+mako/codegen.py,sha256=N49EH57CcTUfKGzI8V7GFBrAEoFhRo9lkdXBzpFYzBY,47736
+mako/compat.py,sha256=owGbObdoF0C-6rCCs6Vnk3YGHv0bf0PpTja55Woxqb4,1820
+mako/exceptions.py,sha256=87Djuoi1IS5zyVFml1Z5zpCP1IoI7UMOH3h4ejt3x3g,12530
+mako/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+mako/ext/__pycache__/__init__.cpython-312.pyc,,
+mako/ext/__pycache__/autohandler.cpython-312.pyc,,
+mako/ext/__pycache__/babelplugin.cpython-312.pyc,,
+mako/ext/__pycache__/beaker_cache.cpython-312.pyc,,
+mako/ext/__pycache__/extract.cpython-312.pyc,,
+mako/ext/__pycache__/linguaplugin.cpython-312.pyc,,
+mako/ext/__pycache__/preprocessors.cpython-312.pyc,,
+mako/ext/__pycache__/pygmentplugin.cpython-312.pyc,,
+mako/ext/__pycache__/turbogears.cpython-312.pyc,,
+mako/ext/autohandler.py,sha256=QuhNiPSF1LZ53awQ1Qfpwu1Zi9RGOmrtCDnwCLgQzeE,1885
+mako/ext/babelplugin.py,sha256=mmt5fG3pcYII1QsrLEV3wH1ltj-C7uKl8vBIpAjxsKY,2091
+mako/ext/beaker_cache.py,sha256=4quuJQuXRKKUyF6kM43LQhJT1J2z1KSglRZVDW-7c1I,2578
+mako/ext/extract.py,sha256=ZUeaRL2jWcUlrpnhXFXJB0CUJfvQVGBF9tJr5nKJAWI,4659
+mako/ext/linguaplugin.py,sha256=sUZalJSI_XeON9aRBb2hds-ilVQaxHKlfCg_nAl7EuU,1935
+mako/ext/preprocessors.py,sha256=HYG45idRJUwJkDpswEELL8lPFLisQzgDhW5EHpTDGkI,576
+mako/ext/pygmentplugin.py,sha256=TnpJDyQeWTTGHZraMDpw8FB3PNzbmXhaZcjyIBudyi0,4753
+mako/ext/turbogears.py,sha256=egv8hradAnnSJwxtmW8uXAsqPUzX8cZZCXclmO_8hMA,2141
+mako/filters.py,sha256=IBXyGOby4eFE3UGvNLhJlzbe1FfwJ2dcEr1-gKO_Ljc,4658
+mako/lexer.py,sha256=GMq8yf0dEn04-xw2EVDEzaOLXMSVVQz9HyUbfwKnZKg,16321
+mako/lookup.py,sha256=4ALORJiL0wIdDvK1okW8rbjq2jL5F_TNASekDFQSULY,12428
+mako/parsetree.py,sha256=-wmyX_mklAoKhc-7Psx0U15EKpNSd8oGRXFmvk2JQWo,19021
+mako/pygen.py,sha256=689_jR0GG_8Am62Dmlm5h59VY6eyZAU3GroodqEDnZ0,10416
+mako/pyparser.py,sha256=3XNxTFQMLJCrRLQdtT5aKLOMU2faRiKfdmadS47vNm8,7478
+mako/runtime.py,sha256=ZsUEN22nX3d3dECQujF69mBKDQS6yVv2nvz_0eTvFGg,27804
+mako/template.py,sha256=Vn5nLoBY-YzSQJKvRPFGb4fiPyZryA5Q-8mWutv0b9A,23563
+mako/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+mako/testing/__pycache__/__init__.cpython-312.pyc,,
+mako/testing/__pycache__/_config.cpython-312.pyc,,
+mako/testing/__pycache__/assertions.cpython-312.pyc,,
+mako/testing/__pycache__/config.cpython-312.pyc,,
+mako/testing/__pycache__/exclusions.cpython-312.pyc,,
+mako/testing/__pycache__/fixtures.cpython-312.pyc,,
+mako/testing/__pycache__/helpers.cpython-312.pyc,,
+mako/testing/_config.py,sha256=k-qpnsnbXUoN-ykMN5BRpg84i1x0p6UsAddKQnrIytU,3566
+mako/testing/assertions.py,sha256=pfbGl84QlW7QWGg3_lo3wP8XnBAVo9AjzNp2ajmn7FA,5161
+mako/testing/config.py,sha256=wmYVZfzGvOK3mJUZpzmgO8-iIgvaCH41Woi4yDpxq6E,323
+mako/testing/exclusions.py,sha256=_t6ADKdatk3f18tOfHV_ZY6u_ZwQsKphZ2MXJVSAOcI,1553
+mako/testing/fixtures.py,sha256=nEp7wTusf7E0n3Q-BHJW2s_t1vx0KB9poadQ1BmIJzE,3044
+mako/testing/helpers.py,sha256=z4HAactwlht4ut1cbvxKt1QLb3yLPk1U7cnh5BwVUlc,1623
+mako/util.py,sha256=SNYeX2_PmajQJIR3-S1Yqxxylz8lwS65rC8YbCdTkUU,10638

+ 5 - 0
.venv/Lib/site-packages/Mako-1.3.9.dist-info/WHEEL

@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: setuptools (75.8.0)
+Root-Is-Purelib: true
+Tag: py3-none-any
+

+ 18 - 0
.venv/Lib/site-packages/Mako-1.3.9.dist-info/entry_points.txt

@@ -0,0 +1,18 @@
+[babel.extractors]
+mako = mako.ext.babelplugin:extract [babel]
+
+[console_scripts]
+mako-render = mako.cmd:cmdline
+
+[lingua.extractors]
+mako = mako.ext.linguaplugin:LinguaMakoExtractor [lingua]
+
+[pygments.lexers]
+css+mako = mako.ext.pygmentplugin:MakoCssLexer
+html+mako = mako.ext.pygmentplugin:MakoHtmlLexer
+js+mako = mako.ext.pygmentplugin:MakoJavascriptLexer
+mako = mako.ext.pygmentplugin:MakoLexer
+xml+mako = mako.ext.pygmentplugin:MakoXmlLexer
+
+[python.templating.engines]
+mako = mako.ext.turbogears:TGPlugin

+ 1 - 0
.venv/Lib/site-packages/Mako-1.3.9.dist-info/top_level.txt

@@ -0,0 +1 @@
+mako

+ 1 - 0
.venv/Lib/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 28 - 0
.venv/Lib/site-packages/MarkupSafe-3.0.2.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.

+ 92 - 0
.venv/Lib/site-packages/MarkupSafe-3.0.2.dist-info/METADATA

@@ -0,0 +1,92 @@
+Metadata-Version: 2.1
+Name: MarkupSafe
+Version: 3.0.2
+Summary: Safely add untrusted strings to HTML/XML markup.
+Maintainer-email: Pallets <contact@palletsprojects.com>
+License: 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.
+        
+Project-URL: Donate, https://palletsprojects.com/donate
+Project-URL: Documentation, https://markupsafe.palletsprojects.com/
+Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/
+Project-URL: Source, https://github.com/pallets/markupsafe/
+Project-URL: Chat, https://discord.gg/pallets
+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 :: Text Processing :: Markup :: HTML
+Classifier: Typing :: Typed
+Requires-Python: >=3.9
+Description-Content-Type: text/markdown
+License-File: LICENSE.txt
+
+# MarkupSafe
+
+MarkupSafe implements a text object that escapes characters so it is
+safe to use in HTML and XML. Characters that have special meanings are
+replaced so that they display as the actual characters. This mitigates
+injection attacks, meaning untrusted user input can safely be displayed
+on a page.
+
+
+## Examples
+
+```pycon
+>>> from markupsafe import Markup, escape
+
+>>> # escape replaces special characters and wraps in Markup
+>>> escape("<script>alert(document.cookie);</script>")
+Markup('&lt;script&gt;alert(document.cookie);&lt;/script&gt;')
+
+>>> # wrap in Markup to mark text "safe" and prevent escaping
+>>> Markup("<strong>Hello</strong>")
+Markup('<strong>hello</strong>')
+
+>>> escape(Markup("<strong>Hello</strong>"))
+Markup('<strong>hello</strong>')
+
+>>> # Markup is a str subclass
+>>> # methods and operators escape their arguments
+>>> template = Markup("Hello <em>{name}</em>")
+>>> template.format(name='"World"')
+Markup('Hello <em>&#34;World&#34;</em>')
+```
+
+## Donate
+
+The Pallets organization develops and supports MarkupSafe 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

+ 14 - 0
.venv/Lib/site-packages/MarkupSafe-3.0.2.dist-info/RECORD

@@ -0,0 +1,14 @@
+MarkupSafe-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+MarkupSafe-3.0.2.dist-info/LICENSE.txt,sha256=RjHsDbX9kKVH4zaBcmTGeYIUM4FG-KyUtKV_lu6MnsQ,1503
+MarkupSafe-3.0.2.dist-info/METADATA,sha256=nhoabjupBG41j_JxPCJ3ylgrZ6Fx8oMCFbiLF9Kafqc,4067
+MarkupSafe-3.0.2.dist-info/RECORD,,
+MarkupSafe-3.0.2.dist-info/WHEEL,sha256=62QJgqtUFevqILau0n0UncooEMoOyVCKVQitJpcuCig,101
+MarkupSafe-3.0.2.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11
+markupsafe/__init__.py,sha256=pREerPwvinB62tNCMOwqxBS2YHV6R52Wcq1d-rB4Z5o,13609
+markupsafe/__pycache__/__init__.cpython-312.pyc,,
+markupsafe/__pycache__/_native.cpython-312.pyc,,
+markupsafe/_native.py,sha256=2ptkJ40yCcp9kq3L1NqpgjfpZB-obniYKFFKUOkHh4Q,218
+markupsafe/_speedups.c,sha256=SglUjn40ti9YgQAO--OgkSyv9tXq9vvaHyVhQows4Ok,4353
+markupsafe/_speedups.cp312-win_amd64.pyd,sha256=sC88mCi7HJOQhbSSrdMPZfdCvi_VBfOzwkVuQ7V6T3M,13312
+markupsafe/_speedups.pyi,sha256=LSDmXYOefH4HVpAXuL8sl7AttLw0oXh1njVoVZp2wqQ,42
+markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0

+ 5 - 0
.venv/Lib/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL

@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: setuptools (75.2.0)
+Root-Is-Purelib: false
+Tag: cp312-cp312-win_amd64
+

+ 1 - 0
.venv/Lib/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt

@@ -0,0 +1 @@
+markupsafe

+ 7 - 0
.venv/Lib/site-packages/PyJWT-2.10.1.dist-info/AUTHORS.rst

@@ -0,0 +1,7 @@
+Authors
+=======
+
+``pyjwt`` is currently written and maintained by `Jose Padilla <https://github.com/jpadilla>`_.
+Originally written and maintained by `Jeff Lindsay <https://github.com/progrium>`_.
+
+A full list of contributors can be found on GitHub’s `overview <https://github.com/jpadilla/pyjwt/graphs/contributors>`_.

+ 1 - 0
.venv/Lib/site-packages/PyJWT-2.10.1.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 21 - 0
.venv/Lib/site-packages/PyJWT-2.10.1.dist-info/LICENSE

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

+ 106 - 0
.venv/Lib/site-packages/PyJWT-2.10.1.dist-info/METADATA

@@ -0,0 +1,106 @@
+Metadata-Version: 2.1
+Name: PyJWT
+Version: 2.10.1
+Summary: JSON Web Token implementation in Python
+Author-email: Jose Padilla <hello@jpadilla.com>
+License: MIT
+Project-URL: Homepage, https://github.com/jpadilla/pyjwt
+Keywords: json,jwt,security,signing,token,web
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Natural Language :: English
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Topic :: Utilities
+Requires-Python: >=3.9
+Description-Content-Type: text/x-rst
+License-File: LICENSE
+License-File: AUTHORS.rst
+Provides-Extra: crypto
+Requires-Dist: cryptography>=3.4.0; extra == "crypto"
+Provides-Extra: dev
+Requires-Dist: coverage[toml]==5.0.4; extra == "dev"
+Requires-Dist: cryptography>=3.4.0; extra == "dev"
+Requires-Dist: pre-commit; extra == "dev"
+Requires-Dist: pytest<7.0.0,>=6.0.0; extra == "dev"
+Requires-Dist: sphinx; extra == "dev"
+Requires-Dist: sphinx-rtd-theme; extra == "dev"
+Requires-Dist: zope.interface; extra == "dev"
+Provides-Extra: docs
+Requires-Dist: sphinx; extra == "docs"
+Requires-Dist: sphinx-rtd-theme; extra == "docs"
+Requires-Dist: zope.interface; extra == "docs"
+Provides-Extra: tests
+Requires-Dist: coverage[toml]==5.0.4; extra == "tests"
+Requires-Dist: pytest<7.0.0,>=6.0.0; extra == "tests"
+
+PyJWT
+=====
+
+.. image:: https://github.com/jpadilla/pyjwt/workflows/CI/badge.svg
+   :target: https://github.com/jpadilla/pyjwt/actions?query=workflow%3ACI
+
+.. image:: https://img.shields.io/pypi/v/pyjwt.svg
+   :target: https://pypi.python.org/pypi/pyjwt
+
+.. image:: https://codecov.io/gh/jpadilla/pyjwt/branch/master/graph/badge.svg
+   :target: https://codecov.io/gh/jpadilla/pyjwt
+
+.. image:: https://readthedocs.org/projects/pyjwt/badge/?version=stable
+   :target: https://pyjwt.readthedocs.io/en/stable/
+
+A Python implementation of `RFC 7519 <https://tools.ietf.org/html/rfc7519>`_. Original implementation was written by `@progrium <https://github.com/progrium>`_.
+
+Sponsor
+-------
+
+.. |auth0-logo| image:: https://github.com/user-attachments/assets/ee98379e-ee76-4bcb-943a-e25c4ea6d174
+   :width: 160px
+
++--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| |auth0-logo| | If you want to quickly add secure token-based authentication to Python projects, feel free to check Auth0's Python SDK and free plan at `auth0.com/signup <https://auth0.com/signup?utm_source=external_sites&utm_medium=pyjwt&utm_campaign=devn_signup>`_. |
++--------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Installing
+----------
+
+Install with **pip**:
+
+.. code-block:: console
+
+    $ pip install PyJWT
+
+
+Usage
+-----
+
+.. code-block:: pycon
+
+    >>> import jwt
+    >>> encoded = jwt.encode({"some": "payload"}, "secret", algorithm="HS256")
+    >>> print(encoded)
+    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg
+    >>> jwt.decode(encoded, "secret", algorithms=["HS256"])
+    {'some': 'payload'}
+
+Documentation
+-------------
+
+View the full docs online at https://pyjwt.readthedocs.io/en/stable/
+
+
+Tests
+-----
+
+You can run tests from the project root after cloning with:
+
+.. code-block:: console
+
+    $ tox

+ 32 - 0
.venv/Lib/site-packages/PyJWT-2.10.1.dist-info/RECORD

@@ -0,0 +1,32 @@
+PyJWT-2.10.1.dist-info/AUTHORS.rst,sha256=klzkNGECnu2_VY7At89_xLBF3vUSDruXk3xwgUBxzwc,322
+PyJWT-2.10.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+PyJWT-2.10.1.dist-info/LICENSE,sha256=eXp6ICMdTEM-nxkR2xcx0GtYKLmPSZgZoDT3wPVvXOU,1085
+PyJWT-2.10.1.dist-info/METADATA,sha256=EkewF6D6KU8SGaaQzVYfxUUU1P_gs_dp1pYTkoYvAx8,3990
+PyJWT-2.10.1.dist-info/RECORD,,
+PyJWT-2.10.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
+PyJWT-2.10.1.dist-info/top_level.txt,sha256=RP5DHNyJbMq2ka0FmfTgoSaQzh7e3r5XuCWCO8a00k8,4
+jwt/__init__.py,sha256=VB2vFKuboTjcDGeZ8r-UqK_dz3NsQSQEqySSICby8Xg,1711
+jwt/__pycache__/__init__.cpython-312.pyc,,
+jwt/__pycache__/algorithms.cpython-312.pyc,,
+jwt/__pycache__/api_jwk.cpython-312.pyc,,
+jwt/__pycache__/api_jws.cpython-312.pyc,,
+jwt/__pycache__/api_jwt.cpython-312.pyc,,
+jwt/__pycache__/exceptions.cpython-312.pyc,,
+jwt/__pycache__/help.cpython-312.pyc,,
+jwt/__pycache__/jwk_set_cache.cpython-312.pyc,,
+jwt/__pycache__/jwks_client.cpython-312.pyc,,
+jwt/__pycache__/types.cpython-312.pyc,,
+jwt/__pycache__/utils.cpython-312.pyc,,
+jwt/__pycache__/warnings.cpython-312.pyc,,
+jwt/algorithms.py,sha256=cKr-XEioe0mBtqJMCaHEswqVOA1Z8Purt5Sb3Bi-5BE,30409
+jwt/api_jwk.py,sha256=6F1r7rmm8V5qEnBKA_xMjS9R7VoANe1_BL1oD2FrAjE,4451
+jwt/api_jws.py,sha256=aM8vzqQf6mRrAw7bRy-Moj_pjWsKSVQyYK896AfMjJU,11762
+jwt/api_jwt.py,sha256=OGT4hok1l5A6FH_KdcrU5g6u6EQ8B7em0r9kGM9SYgA,14512
+jwt/exceptions.py,sha256=bUIOJ-v9tjopTLS-FYOTc3kFx5WP5IZt7ksN_HE1G9Q,1211
+jwt/help.py,sha256=vFdNzjQoAch04XCMYpCkyB2blaqHAGAqQrtf9nSPkdk,1808
+jwt/jwk_set_cache.py,sha256=hBKmN-giU7-G37L_XKgc_OZu2ah4wdbj1ZNG_GkoSE8,959
+jwt/jwks_client.py,sha256=p9b-IbQqo2tEge9Zit3oSPBFNePqwho96VLbnUrHUWs,4259
+jwt/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+jwt/types.py,sha256=VnhGv_VFu5a7_mrPoSCB7HaNLrJdhM8Sq1sSfEg0gLU,99
+jwt/utils.py,sha256=hxOjvDBheBYhz-RIPiEz7Q88dSUSTMzEdKE_Ww2VdJw,3640
+jwt/warnings.py,sha256=50XWOnyNsIaqzUJTk6XHNiIDykiL763GYA92MjTKmok,59

+ 5 - 0
.venv/Lib/site-packages/PyJWT-2.10.1.dist-info/WHEEL

@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: setuptools (75.6.0)
+Root-Is-Purelib: true
+Tag: py3-none-any
+

+ 1 - 0
.venv/Lib/site-packages/PyJWT-2.10.1.dist-info/top_level.txt

@@ -0,0 +1 @@
+jwt

+ 1 - 0
.venv/Lib/site-packages/PyYAML-6.0.2.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 20 - 0
.venv/Lib/site-packages/PyYAML-6.0.2.dist-info/LICENSE

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

+ 46 - 0
.venv/Lib/site-packages/PyYAML-6.0.2.dist-info/METADATA

@@ -0,0 +1,46 @@
+Metadata-Version: 2.1
+Name: PyYAML
+Version: 6.0.2
+Summary: YAML parser and emitter for Python
+Home-page: https://pyyaml.org/
+Download-URL: https://pypi.org/project/PyYAML/
+Author: Kirill Simonov
+Author-email: xi@resolvent.net
+License: MIT
+Project-URL: Bug Tracker, https://github.com/yaml/pyyaml/issues
+Project-URL: CI, https://github.com/yaml/pyyaml/actions
+Project-URL: Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation
+Project-URL: Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core
+Project-URL: Source Code, https://github.com/yaml/pyyaml
+Platform: Any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Cython
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Text Processing :: Markup
+Requires-Python: >=3.8
+License-File: LICENSE
+
+YAML is a data serialization format designed for human readability
+and interaction with scripting languages.  PyYAML is a YAML parser
+and emitter for Python.
+
+PyYAML features a complete YAML 1.1 parser, Unicode support, pickle
+support, capable extension API, and sensible error messages.  PyYAML
+supports standard YAML tags and provides Python-specific tags that
+allow to represent an arbitrary Python object.
+
+PyYAML is applicable for a broad range of tasks from complex
+configuration files to object serialization and persistence.

+ 43 - 0
.venv/Lib/site-packages/PyYAML-6.0.2.dist-info/RECORD

@@ -0,0 +1,43 @@
+PyYAML-6.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+PyYAML-6.0.2.dist-info/LICENSE,sha256=jTko-dxEkP1jVwfLiOsmvXZBAqcoKVQwfT5RZ6V36KQ,1101
+PyYAML-6.0.2.dist-info/METADATA,sha256=9lwXqTOrXPts-jI2Lo5UwuaAYo0hiRA0BZqjch0WjAk,2106
+PyYAML-6.0.2.dist-info/RECORD,,
+PyYAML-6.0.2.dist-info/WHEEL,sha256=c7SWG1_hRvc9HXHEkmWlTu1Jr4WpzRucfzqTP-_8q0s,102
+PyYAML-6.0.2.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11
+_yaml/__init__.py,sha256=04Ae_5osxahpJHa3XBZUAf4wi6XX32gR8D6X6p64GEA,1402
+_yaml/__pycache__/__init__.cpython-312.pyc,,
+yaml/__init__.py,sha256=N35S01HMesFTe0aRRMWkPj0Pa8IEbHpE9FK7cr5Bdtw,12311
+yaml/__pycache__/__init__.cpython-312.pyc,,
+yaml/__pycache__/composer.cpython-312.pyc,,
+yaml/__pycache__/constructor.cpython-312.pyc,,
+yaml/__pycache__/cyaml.cpython-312.pyc,,
+yaml/__pycache__/dumper.cpython-312.pyc,,
+yaml/__pycache__/emitter.cpython-312.pyc,,
+yaml/__pycache__/error.cpython-312.pyc,,
+yaml/__pycache__/events.cpython-312.pyc,,
+yaml/__pycache__/loader.cpython-312.pyc,,
+yaml/__pycache__/nodes.cpython-312.pyc,,
+yaml/__pycache__/parser.cpython-312.pyc,,
+yaml/__pycache__/reader.cpython-312.pyc,,
+yaml/__pycache__/representer.cpython-312.pyc,,
+yaml/__pycache__/resolver.cpython-312.pyc,,
+yaml/__pycache__/scanner.cpython-312.pyc,,
+yaml/__pycache__/serializer.cpython-312.pyc,,
+yaml/__pycache__/tokens.cpython-312.pyc,,
+yaml/_yaml.cp312-win_amd64.pyd,sha256=Bx7e_LEQx7cnd1_A9_nClp3X77g-_Lw1aoAAtYZbwWk,263680
+yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883
+yaml/constructor.py,sha256=kNgkfaeLUkwQYY_Q6Ff1Tz2XVw_pG1xVE9Ak7z-viLA,28639
+yaml/cyaml.py,sha256=6ZrAG9fAYvdVe2FK_w0hmXoG7ZYsoYUwapG8CiC72H0,3851
+yaml/dumper.py,sha256=PLctZlYwZLp7XmeUdwRuv4nYOZ2UBnDIUy8-lKfLF-o,2837
+yaml/emitter.py,sha256=jghtaU7eFwg31bG0B7RZea_29Adi9CKmXq_QjgQpCkQ,43006
+yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533
+yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445
+yaml/loader.py,sha256=UVa-zIqmkFSCIYq_PgSGm4NSJttHY2Rf_zQ4_b1fHN0,2061
+yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440
+yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495
+yaml/reader.py,sha256=0dmzirOiDG4Xo41RnuQS7K9rkY3xjHiVasfDMNTqCNw,6794
+yaml/representer.py,sha256=IuWP-cAW9sHKEnS0gCqSa894k1Bg4cgTxaDwIcbRQ-Y,14190
+yaml/resolver.py,sha256=9L-VYfm4mWHxUD1Vg4X7rjDRK_7VZd6b92wzq7Y2IKY,9004
+yaml/scanner.py,sha256=YEM3iLZSaQwXcQRg2l2R4MdT0zGP2F9eHkKGKnHyWQY,51279
+yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165
+yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573

+ 5 - 0
.venv/Lib/site-packages/PyYAML-6.0.2.dist-info/WHEEL

@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.44.0)
+Root-Is-Purelib: false
+Tag: cp312-cp312-win_amd64
+

+ 2 - 0
.venv/Lib/site-packages/PyYAML-6.0.2.dist-info/top_level.txt

@@ -0,0 +1,2 @@
+_yaml
+yaml

+ 1 - 0
.venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 19 - 0
.venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/LICENSE

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

+ 252 - 0
.venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/METADATA

@@ -0,0 +1,252 @@
+Metadata-Version: 2.1
+Name: SQLAlchemy
+Version: 1.4.54
+Summary: Database Abstraction Library
+Home-page: https://www.sqlalchemy.org
+Author: Mike Bayer
+Author-email: mike_mp@zzzcomputing.com
+License: MIT
+Project-URL: Documentation, https://docs.sqlalchemy.org
+Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Database :: Front-Ends
+Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7
+Description-Content-Type: text/x-rst
+License-File: LICENSE
+Requires-Dist: importlib-metadata ; python_version < "3.8"
+Requires-Dist: greenlet !=0.4.17 ; python_version >= "3" and (platform_machine == "aarch64" or (platform_machine == "ppc64le" or (platform_machine == "x86_64" or (platform_machine == "amd64" or (platform_machine == "AMD64" or (platform_machine == "win32" or platform_machine == "WIN32"))))))
+Provides-Extra: aiomysql
+Requires-Dist: greenlet !=0.4.17 ; (python_version >= "3") and extra == 'aiomysql'
+Requires-Dist: aiomysql >=0.2.0 ; (python_version >= "3") and extra == 'aiomysql'
+Provides-Extra: aiosqlite
+Requires-Dist: typing-extensions !=3.10.0.1 ; extra == 'aiosqlite'
+Requires-Dist: greenlet !=0.4.17 ; (python_version >= "3") and extra == 'aiosqlite'
+Requires-Dist: aiosqlite ; (python_version >= "3") and extra == 'aiosqlite'
+Provides-Extra: asyncio
+Requires-Dist: greenlet !=0.4.17 ; (python_version >= "3") and extra == 'asyncio'
+Provides-Extra: asyncmy
+Requires-Dist: greenlet !=0.4.17 ; (python_version >= "3") and extra == 'asyncmy'
+Requires-Dist: asyncmy !=0.2.4,>=0.2.3 ; (python_version >= "3") and extra == 'asyncmy'
+Provides-Extra: mariadb-connector
+Requires-Dist: mariadb !=1.1.2,>=1.0.1 ; (python_version >= "3") and extra == 'mariadb-connector'
+Provides-Extra: mariadb_connector
+Requires-Dist: mariadb !=1.1.2,>=1.0.1 ; (python_version >= "3") and extra == 'mariadb_connector'
+Provides-Extra: mssql
+Requires-Dist: pyodbc ; extra == 'mssql'
+Provides-Extra: mssql-pymssql
+Requires-Dist: pymssql ; extra == 'mssql-pymssql'
+Provides-Extra: mssql-pyodbc
+Requires-Dist: pyodbc ; extra == 'mssql-pyodbc'
+Provides-Extra: mssql_pymssql
+Requires-Dist: pymssql ; extra == 'mssql_pymssql'
+Provides-Extra: mssql_pyodbc
+Requires-Dist: pyodbc ; extra == 'mssql_pyodbc'
+Provides-Extra: mypy
+Requires-Dist: sqlalchemy2-stubs ; extra == 'mypy'
+Requires-Dist: mypy >=0.910 ; (python_version >= "3") and extra == 'mypy'
+Provides-Extra: mysql
+Provides-Extra: mysql-connector
+Requires-Dist: mysql-connector-python ; extra == 'mysql-connector'
+Requires-Dist: mysqlclient <2,>=1.4.0 ; (python_version < "3") and extra == 'mysql'
+Requires-Dist: mysqlclient >=1.4.0 ; (python_version >= "3") and extra == 'mysql'
+Provides-Extra: mysql_connector
+Requires-Dist: mysql-connector-python ; extra == 'mysql_connector'
+Provides-Extra: oracle
+Requires-Dist: cx-oracle <8,>=7 ; (python_version < "3") and extra == 'oracle'
+Requires-Dist: cx-oracle >=7 ; (python_version >= "3") and extra == 'oracle'
+Provides-Extra: postgresql
+Requires-Dist: psycopg2 >=2.7 ; extra == 'postgresql'
+Provides-Extra: postgresql-asyncpg
+Requires-Dist: greenlet !=0.4.17 ; (python_version >= "3") and extra == 'postgresql-asyncpg'
+Requires-Dist: asyncpg ; (python_version >= "3") and extra == 'postgresql-asyncpg'
+Provides-Extra: postgresql-pg8000
+Requires-Dist: pg8000 !=1.29.0,>=1.16.6 ; (python_version >= "3") and extra == 'postgresql-pg8000'
+Provides-Extra: postgresql_asyncpg
+Requires-Dist: greenlet !=0.4.17 ; (python_version >= "3") and extra == 'postgresql_asyncpg'
+Requires-Dist: asyncpg ; (python_version >= "3") and extra == 'postgresql_asyncpg'
+Provides-Extra: postgresql_pg8000
+Requires-Dist: pg8000 !=1.29.0,>=1.16.6 ; (python_version >= "3") and extra == 'postgresql_pg8000'
+Provides-Extra: postgresql_psycopg2binary
+Requires-Dist: psycopg2-binary ; extra == 'postgresql_psycopg2binary'
+Provides-Extra: postgresql_psycopg2cffi
+Requires-Dist: psycopg2cffi ; extra == 'postgresql_psycopg2cffi'
+Provides-Extra: pymysql
+Requires-Dist: pymysql <1 ; (python_version < "3") and extra == 'pymysql'
+Requires-Dist: pymysql ; (python_version >= "3") and extra == 'pymysql'
+Provides-Extra: sqlcipher
+Requires-Dist: sqlcipher3-binary ; (python_version >= "3") and extra == 'sqlcipher'
+
+SQLAlchemy
+==========
+
+|PyPI| |Python| |Downloads|
+
+.. |PyPI| image:: https://img.shields.io/pypi/v/sqlalchemy
+    :target: https://pypi.org/project/sqlalchemy
+    :alt: PyPI
+
+.. |Python| image:: https://img.shields.io/pypi/pyversions/sqlalchemy
+    :target: https://pypi.org/project/sqlalchemy
+    :alt: PyPI - Python Version
+
+.. |Downloads| image:: https://img.shields.io/pypi/dm/sqlalchemy
+    :target: https://pypi.org/project/sqlalchemy
+    :alt: PyPI - Downloads
+
+
+The Python SQL Toolkit and Object Relational Mapper
+
+Introduction
+-------------
+
+SQLAlchemy is the Python SQL toolkit and Object Relational Mapper
+that gives application developers the full power and
+flexibility of SQL. SQLAlchemy provides a full suite
+of well known enterprise-level persistence patterns,
+designed for efficient and high-performing database
+access, adapted into a simple and Pythonic domain
+language.
+
+Major SQLAlchemy features include:
+
+* An industrial strength ORM, built
+  from the core on the identity map, unit of work,
+  and data mapper patterns.   These patterns
+  allow transparent persistence of objects
+  using a declarative configuration system.
+  Domain models
+  can be constructed and manipulated naturally,
+  and changes are synchronized with the
+  current transaction automatically.
+* A relationally-oriented query system, exposing
+  the full range of SQL's capabilities
+  explicitly, including joins, subqueries,
+  correlation, and most everything else,
+  in terms of the object model.
+  Writing queries with the ORM uses the same
+  techniques of relational composition you use
+  when writing SQL.  While you can drop into
+  literal SQL at any time, it's virtually never
+  needed.
+* A comprehensive and flexible system
+  of eager loading for related collections and objects.
+  Collections are cached within a session,
+  and can be loaded on individual access, all
+  at once using joins, or by query per collection
+  across the full result set.
+* A Core SQL construction system and DBAPI
+  interaction layer.  The SQLAlchemy Core is
+  separate from the ORM and is a full database
+  abstraction layer in its own right, and includes
+  an extensible Python-based SQL expression
+  language, schema metadata, connection pooling,
+  type coercion, and custom types.
+* All primary and foreign key constraints are
+  assumed to be composite and natural.  Surrogate
+  integer primary keys are of course still the
+  norm, but SQLAlchemy never assumes or hardcodes
+  to this model.
+* Database introspection and generation.  Database
+  schemas can be "reflected" in one step into
+  Python structures representing database metadata;
+  those same structures can then generate
+  CREATE statements right back out - all within
+  the Core, independent of the ORM.
+
+SQLAlchemy's philosophy:
+
+* SQL databases behave less and less like object
+  collections the more size and performance start to
+  matter; object collections behave less and less like
+  tables and rows the more abstraction starts to matter.
+  SQLAlchemy aims to accommodate both of these
+  principles.
+* An ORM doesn't need to hide the "R".   A relational
+  database provides rich, set-based functionality
+  that should be fully exposed.   SQLAlchemy's
+  ORM provides an open-ended set of patterns
+  that allow a developer to construct a custom
+  mediation layer between a domain model and
+  a relational schema, turning the so-called
+  "object relational impedance" issue into
+  a distant memory.
+* The developer, in all cases, makes all decisions
+  regarding the design, structure, and naming conventions
+  of both the object model as well as the relational
+  schema.   SQLAlchemy only provides the means
+  to automate the execution of these decisions.
+* With SQLAlchemy, there's no such thing as
+  "the ORM generated a bad query" - you
+  retain full control over the structure of
+  queries, including how joins are organized,
+  how subqueries and correlation is used, what
+  columns are requested.  Everything SQLAlchemy
+  does is ultimately the result of a developer-
+  initiated decision.
+* Don't use an ORM if the problem doesn't need one.
+  SQLAlchemy consists of a Core and separate ORM
+  component.   The Core offers a full SQL expression
+  language that allows Pythonic construction
+  of SQL constructs that render directly to SQL
+  strings for a target database, returning
+  result sets that are essentially enhanced DBAPI
+  cursors.
+* Transactions should be the norm.  With SQLAlchemy's
+  ORM, nothing goes to permanent storage until
+  commit() is called.  SQLAlchemy encourages applications
+  to create a consistent means of delineating
+  the start and end of a series of operations.
+* Never render a literal value in a SQL statement.
+  Bound parameters are used to the greatest degree
+  possible, allowing query optimizers to cache
+  query plans effectively and making SQL injection
+  attacks a non-issue.
+
+Documentation
+-------------
+
+Latest documentation is at:
+
+https://www.sqlalchemy.org/docs/
+
+Installation / Requirements
+---------------------------
+
+Full documentation for installation is at
+`Installation <https://www.sqlalchemy.org/docs/intro.html#installation>`_.
+
+Getting Help / Development / Bug reporting
+------------------------------------------
+
+Please refer to the `SQLAlchemy Community Guide <https://www.sqlalchemy.org/support.html>`_.
+
+Code of Conduct
+---------------
+
+Above all, SQLAlchemy places great emphasis on polite, thoughtful, and
+constructive communication between users and developers.
+Please see our current Code of Conduct at
+`Code of Conduct <https://www.sqlalchemy.org/codeofconduct.html>`_.
+
+License
+-------
+
+SQLAlchemy is distributed under the `MIT license
+<https://www.opensource.org/licenses/mit-license.php>`_.
+

+ 487 - 0
.venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/RECORD

@@ -0,0 +1,487 @@
+SQLAlchemy-1.4.54.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+SQLAlchemy-1.4.54.dist-info/LICENSE,sha256=eYQKk6tEYK_iQW6ePf95YIdsg66dK-JwXoOhBNSXQOs,1119
+SQLAlchemy-1.4.54.dist-info/METADATA,sha256=HyqQjLLrnMMu0aAXxuD1PyvnSSWPrcRe3UL9FYYA80U,11060
+SQLAlchemy-1.4.54.dist-info/RECORD,,
+SQLAlchemy-1.4.54.dist-info/WHEEL,sha256=Z9NC-OvRBktQLUujjZiuac9jF_06CqbjTb-FqrCClNs,101
+SQLAlchemy-1.4.54.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
+sqlalchemy/__init__.py,sha256=UtCx0vF-ehbxC9yCJJy5SxtyZe4JzwdoZXYxFs_glT8,4261
+sqlalchemy/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/__pycache__/events.cpython-312.pyc,,
+sqlalchemy/__pycache__/exc.cpython-312.pyc,,
+sqlalchemy/__pycache__/inspection.cpython-312.pyc,,
+sqlalchemy/__pycache__/log.cpython-312.pyc,,
+sqlalchemy/__pycache__/processors.cpython-312.pyc,,
+sqlalchemy/__pycache__/schema.cpython-312.pyc,,
+sqlalchemy/__pycache__/types.cpython-312.pyc,,
+sqlalchemy/cimmutabledict.cp312-win_amd64.pyd,sha256=vcTZd5kZtpEhK8J7mxuyGrNZKcuFKQR6YT-1t4tX4CU,15360
+sqlalchemy/connectors/__init__.py,sha256=K2d8Gy5kSYwJCZLL2T-RhVF3KT3dbOVqBnslTw2_j94,289
+sqlalchemy/connectors/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/connectors/__pycache__/mxodbc.cpython-312.pyc,,
+sqlalchemy/connectors/__pycache__/pyodbc.cpython-312.pyc,,
+sqlalchemy/connectors/mxodbc.py,sha256=1huxJ31iHvvNNusX5puRCJGOT7lJk5xadUGhHnuTyVA,5950
+sqlalchemy/connectors/pyodbc.py,sha256=x-4HPpbfC2NJGBJYXvOq0d9-mtOIkzHSKec4ScYsvhw,7048
+sqlalchemy/cprocessors.cp312-win_amd64.pyd,sha256=JcLSYrBYUhfibauvO7xe3CquZRTJHt2_WOWAYTqxpKI,17408
+sqlalchemy/cresultproxy.cp312-win_amd64.pyd,sha256=69lonusBGjcfLxhrQ2MpaEFZx_JDDckKvSh1Jb2xo7A,21504
+sqlalchemy/databases/__init__.py,sha256=FVre1sXBUNIc7YP3Qz5dyx6Yx15zh8Ift2aqN-xCEno,1048
+sqlalchemy/databases/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/dialects/__init__.py,sha256=4TNFHKkLGWl7C_wukiJCr_U5QIyahk2_HKlvUHsWDCM,2157
+sqlalchemy/dialects/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/dialects/firebird/__init__.py,sha256=X_sdaMgJJfjQbZPKJjIc3WRyONqjdQjcpY6UGMdkK3A,1203
+sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/dialects/firebird/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-312.pyc,,
+sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-312.pyc,,
+sqlalchemy/dialects/firebird/base.py,sha256=-xCAFboMi_xpC3OWuR9opLMalp8uMl6iiVYU4nVPNmU,32169
+sqlalchemy/dialects/firebird/fdb.py,sha256=VAeJMTOjNtOaKbZXbvwoZJJYr7kWU69Max85AhkXrLA,4237
+sqlalchemy/dialects/firebird/kinterbasdb.py,sha256=-0bJDUkh5s0SfIP9JSD8ThdrDSPe_QXnmL4S9UWAk00,6690
+sqlalchemy/dialects/mssql/__init__.py,sha256=bZXj_jZR74IvADFP7w3DZte06Tm0UcWG3bwr-w5q0XI,1882
+sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/dialects/mssql/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-312.pyc,,
+sqlalchemy/dialects/mssql/__pycache__/json.cpython-312.pyc,,
+sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-312.pyc,,
+sqlalchemy/dialects/mssql/__pycache__/provision.cpython-312.pyc,,
+sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-312.pyc,,
+sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-312.pyc,,
+sqlalchemy/dialects/mssql/base.py,sha256=tdJ4u0O4ogjFB3qt6I6KOuEX11zUVzI9oEWyFZeHFGw,121964
+sqlalchemy/dialects/mssql/information_schema.py,sha256=u9L136i0xN1bIISl15XHGFQMtTdBWCsacs6VxU7wJY8,7832
+sqlalchemy/dialects/mssql/json.py,sha256=rtcY7mmua_FNImJYtnAbjAjVZrNp7ge499XndGbc9sU,4932
+sqlalchemy/dialects/mssql/mxodbc.py,sha256=TjVuBJmaTgHesi4wkJptTnGkprunCyuj0xJsgy35_qw,4967
+sqlalchemy/dialects/mssql/provision.py,sha256=EjBx1-aGEafANd0-7sYkeH726I-GTlHK11JGgQuUwm8,4863
+sqlalchemy/dialects/mssql/pymssql.py,sha256=lK5hj3FxpFYZD1AVwa7aw0cBCkR7GCfSlH1j6sl_hG0,3992
+sqlalchemy/dialects/mssql/pyodbc.py,sha256=Y2arSuYYwJFQS_9KwfWW4eTzMKleANpVQf9hI7q14fs,25134
+sqlalchemy/dialects/mysql/__init__.py,sha256=nVu8XxL0FnscIqIQZFLv4i4SeZLvs8Di_cDPq89qV18,2302
+sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/dml.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/expression.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/json.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/provision.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/__pycache__/types.cpython-312.pyc,,
+sqlalchemy/dialects/mysql/aiomysql.py,sha256=K43oikZQ1nVnxQWDnr5OebLSsLnmv5TIOcmy7P1nh1I,9855
+sqlalchemy/dialects/mysql/asyncmy.py,sha256=GDRdIePQJ8sCLMA31f0htdzTSPn5vTrgYUm78EOg2Qw,9994
+sqlalchemy/dialects/mysql/base.py,sha256=zKv-MkVbqorLUUjpb7viVLvR_RmmUSuAyszQZd_18Fc,118690
+sqlalchemy/dialects/mysql/cymysql.py,sha256=Lvd_T57Qx2vgWlDGCjxzg1Bmb-0zS8sNuPd6l_hufgs,2362
+sqlalchemy/dialects/mysql/dml.py,sha256=-Hv4dmYjhdkUPvPtxqIZGHVis_avMvUvwf-RUE3zgC8,6649
+sqlalchemy/dialects/mysql/enumerated.py,sha256=27Nxf-WqyqPyy6cqSjCJGPYH6WfSrf_w7I6TzOPABH4,9636
+sqlalchemy/dialects/mysql/expression.py,sha256=0oxkRHi4Kt2SzL7EfYubi2VbPy7Yau8mfKGiDxwPgHo,4126
+sqlalchemy/dialects/mysql/json.py,sha256=6qA1M6UI7-yHtASEHYYaT_eKuHphcVgggqY9YLVzrVg,2406
+sqlalchemy/dialects/mysql/mariadb.py,sha256=9qsr2m8XTywadOfTIsAz4PciqeLi8S3AoxV783Xc25s,862
+sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=XYnIZ1BjwQKrlLqyyOzPljoSXftq4DM-3eAIZyhjBAw,7812
+sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=Bvs-vCzJH4sg9TrWEcsFTEbKCNBk5EsgFEYxX7CMQaQ,7939
+sqlalchemy/dialects/mysql/mysqldb.py,sha256=ei8wYczTQ7c7F-DwTebnv9CBZ_I0pjHuh2xNBA-fLnw,10353
+sqlalchemy/dialects/mysql/oursql.py,sha256=0dbrs-W34xj19MtKH2G2iqo3A965HY_UwA5yTC2lPB0,8805
+sqlalchemy/dialects/mysql/provision.py,sha256=xxd65FlRsO7toxtI8uSC-5i1Qb3NtPFz3cwjr3bc_NM,2981
+sqlalchemy/dialects/mysql/pymysql.py,sha256=WdO6WGVRbMYr_MeYCcw4Fi8ltmDbmZV09799HLZvkmU,4570
+sqlalchemy/dialects/mysql/pyodbc.py,sha256=PcSO-rMJfSfYnfczgJ95LnfJSDOSzaPoQTb7gTCof10,4435
+sqlalchemy/dialects/mysql/reflection.py,sha256=IPxKYnhSNxWSNYu72TfIuAMqfiWTijXT2uxz82TIRxA,19441
+sqlalchemy/dialects/mysql/reserved_words.py,sha256=TDycSLdOzvAr0xFCBWi-X6_bx2f7uMfystAbirSIJqs,9677
+sqlalchemy/dialects/mysql/types.py,sha256=rC-YHYNdiJaM3z8Xmj9wBoYIkfK5lWAWcyMyqHCLpI4,25448
+sqlalchemy/dialects/oracle/__init__.py,sha256=tBVZoR8rL40oNoVCHxZjpj4hNN-Gts_E94KYsYjyQYM,1296
+sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/dialects/oracle/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-312.pyc,,
+sqlalchemy/dialects/oracle/__pycache__/provision.cpython-312.pyc,,
+sqlalchemy/dialects/oracle/base.py,sha256=t5M6Gdrrs68K47GtgKq1IWqoHu0yMGFcoKt3HYC6Dmw,90074
+sqlalchemy/dialects/oracle/cx_oracle.py,sha256=t6zcYeJGvI2SpOorR4CCBrMKceuagM9R_qfPTXebkzg,57307
+sqlalchemy/dialects/oracle/provision.py,sha256=u3Kqizap94rDlRVcqhvgAaGUaTM3pb0MpeAOQkA0vWM,6221
+sqlalchemy/dialects/postgresql/__init__.py,sha256=_DYbzuo5PKl4b6GwqEVQ_hchqYwmSALirsTKZ_jMAs0,2680
+sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/array.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/json.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/pygresql.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-312.pyc,,
+sqlalchemy/dialects/postgresql/array.py,sha256=LrB0EDsaWydA-zlZzNpRPoXt-_XKcOiOCQ1YHB3AkvQ,14644
+sqlalchemy/dialects/postgresql/asyncpg.py,sha256=1Qxi-Tgy9gQEGMRP8Ofr4AHrn_BTSg1Ft3N6bN8JFEg,37486
+sqlalchemy/dialects/postgresql/base.py,sha256=PwEmSsZv4UfYPuvFdeMOhJqQxHMkrltVZFOczP_yTzI,168483
+sqlalchemy/dialects/postgresql/dml.py,sha256=-1ROBEqNAYHFre3PX6lJg0gtLF2a5z6FH1xsMkeP7mE,9843
+sqlalchemy/dialects/postgresql/ext.py,sha256=kFzc6O5iARavKlgC6hFDBDBBm3jXnQVCvHP3vi7488k,8943
+sqlalchemy/dialects/postgresql/hstore.py,sha256=RYYm4nclQMZrHdt63WA6GmF9V52BW3J0os21fYXPz8I,13341
+sqlalchemy/dialects/postgresql/json.py,sha256=IUJ-onxYDC6XOxss0IxL7-ledSDvn19LWKNdt67Z4F8,11151
+sqlalchemy/dialects/postgresql/pg8000.py,sha256=QFKnH500rE01AYf2EPcNJWZ_ci9n2a_0pr_bEcTxdDE,17647
+sqlalchemy/dialects/postgresql/provision.py,sha256=QdXNL98xgdRtXwb2O8T4pF32a9Y0cdy3dUM5qDDIhkE,4702
+sqlalchemy/dialects/postgresql/psycopg2.py,sha256=8WDxwIdbPibMQl-pcK02LvAG3xOWfSLWpPYUlq5aIOo,41435
+sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=giSm085aj9aM3NK4oh2E8y6UWal5Vs5mTXZdiRwCylE,1768
+sqlalchemy/dialects/postgresql/pygresql.py,sha256=-zMIW-SF89IMJtBOy_PNFK7FUPeVJl7lF2WVHVbDmR4,8872
+sqlalchemy/dialects/postgresql/pypostgresql.py,sha256=E1MpLQCEi0JgkvM6VyC7MRcclRANGsQgQBVvj5ij07s,3828
+sqlalchemy/dialects/postgresql/ranges.py,sha256=Zut_mC1D3VFlc3kzTNgc67-A6VNTKy6HadfjuAnwUYM,4934
+sqlalchemy/dialects/sqlite/__init__.py,sha256=34LaCZTmR9rbYgU37O8joORC2ohgs6xbIBDDserZxyY,1265
+sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-312.pyc,,
+sqlalchemy/dialects/sqlite/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-312.pyc,,
+sqlalchemy/dialects/sqlite/__pycache__/json.cpython-312.pyc,,
+sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-312.pyc,,
+sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-312.pyc,,
+sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-312.pyc,,
+sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=PuOctboFJRciZFPimYJUqIaydEr9pNVRD-OTsnUb_w8,10575
+sqlalchemy/dialects/sqlite/base.py,sha256=WcYfZjQyq6Bhq9cEKAagpu4hF8rfVYYOstdxQmuB7TI,93814
+sqlalchemy/dialects/sqlite/dml.py,sha256=pWp7BKFnSY7VvHA9Li-JkobH7bEd2KZ5EZ2MJcBfUII,7091
+sqlalchemy/dialects/sqlite/json.py,sha256=8p_zKEQzvno2mNCA6UBv51TTFaMiN9XQZC5clOpU-js,2852
+sqlalchemy/dialects/sqlite/provision.py,sha256=q9PMou0DUFVWAfGn_spd6oykwZT-OWNfJU0JHhNEfWM,5073
+sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=JLy_z0y1HdtLas5hDG6aM7TLo2EqzNRWHr7UWajbBdo,5778
+sqlalchemy/dialects/sqlite/pysqlite.py,sha256=kOzRw7c-SWQrU3OXHUbnwtc4ieml1ps3O2uVc_mzze0,25122
+sqlalchemy/dialects/sybase/__init__.py,sha256=X_p0ZaaGzBhdR-pmzFUssGLiZdv0ruwqHUuDf1BeUJk,1440
+sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/dialects/sybase/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-312.pyc,,
+sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-312.pyc,,
+sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-312.pyc,,
+sqlalchemy/dialects/sybase/base.py,sha256=p8XJZF-CJAPdnNY_t__R4nQUiw9P8Fib2vyVWKasQ0Y,33530
+sqlalchemy/dialects/sybase/mxodbc.py,sha256=498ILIhXfYOTvAQLliGCaCuY_aC_ZtDYoXifJET4xaY,982
+sqlalchemy/dialects/sybase/pyodbc.py,sha256=FVFVHylV6guS7wRAqgjO5DTjZJzwujP58l1nxUJOnc8,2328
+sqlalchemy/dialects/sybase/pysybase.py,sha256=TlX8JmHZzEBpAcq6tcv3QtG7thT4b7_btypQA_Rk0Gk,3485
+sqlalchemy/engine/__init__.py,sha256=DjGpk4lIVc8rLJIwyfdjDBiEFFTzN5PPizVoeYjgvRE,2170
+sqlalchemy/engine/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/characteristics.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/create.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/cursor.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/default.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/events.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/interfaces.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/mock.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/reflection.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/result.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/row.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/strategies.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/url.cpython-312.pyc,,
+sqlalchemy/engine/__pycache__/util.cpython-312.pyc,,
+sqlalchemy/engine/base.py,sha256=u1e8j5nsEOF4P3LQgZwKwe_yo9tfrM3evQ7jSSjcC10,128774
+sqlalchemy/engine/characteristics.py,sha256=4B00Sqy-D2YmSMssjumsqroMwa1B4qu3IhpaaKn4CKQ,2125
+sqlalchemy/engine/create.py,sha256=u7g6dtIlQPsfxy1zXRRgBE1NaiBi6U6ArssRzZB76no,31368
+sqlalchemy/engine/cursor.py,sha256=cVE3PykuhwJsRBFogoH0TWsnckCuWRSbpgkeYLcU1nc,70721
+sqlalchemy/engine/default.py,sha256=pXKVdEaTXGWNnVt7gwEm2U_p0iSdWBweRkXsohXM4_M,68964
+sqlalchemy/engine/events.py,sha256=M-e9wv-kmxy9SBP5AZtXpU49Yi-dpI-D7DyfO86B1OE,34246
+sqlalchemy/engine/interfaces.py,sha256=k5jF4i28nU2lVwvWjIvSkuT7WVvXYt3rb99iXsyQzJE,60708
+sqlalchemy/engine/mock.py,sha256=L94_yma877EZB88GgKTkC3rdDbXct9J6SHoDfG1Ww4g,3744
+sqlalchemy/engine/reflection.py,sha256=55lU1s7LmPrDE36Dr0-BgzajaUhDzWTrAn5gN1LksFs,40090
+sqlalchemy/engine/result.py,sha256=Z5k4QVPLlZ4JILOokQhzGdmK5UWydoULAGb11kpZfEk,62574
+sqlalchemy/engine/row.py,sha256=40FFfdMYvXEpMxOZ42yVLnt9g43lCRHCMXolrWAGe_E,19433
+sqlalchemy/engine/strategies.py,sha256=gWtOViR59VFny5B_rdJzk9JAxotBF7apO2N8AsqlS04,431
+sqlalchemy/engine/url.py,sha256=d1DRB7oaClKNtIfDhtPCXoZdNNUgQk5E1Y5y-d6rTcA,27978
+sqlalchemy/engine/util.py,sha256=IN0MUNonCMyKGvN5JytCb5iKQpSoE4yJft0OnRdDXRs,8695
+sqlalchemy/event/__init__.py,sha256=OnQV_ms79aCEHEL79QoCyqf7hqZi4ncq0Y5kd3nvjz4,534
+sqlalchemy/event/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/event/__pycache__/api.cpython-312.pyc,,
+sqlalchemy/event/__pycache__/attr.cpython-312.pyc,,
+sqlalchemy/event/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/event/__pycache__/legacy.cpython-312.pyc,,
+sqlalchemy/event/__pycache__/registry.cpython-312.pyc,,
+sqlalchemy/event/api.py,sha256=EVJjM9UylK7FzconVmOcDNWJuk4Lf1Oq336_lQ1vqj4,8262
+sqlalchemy/event/attr.py,sha256=bDsTo6d3QNed0Hw7Mt0iKEo_eMyaRHXaGs8IVGPCaRI,14951
+sqlalchemy/event/base.py,sha256=brPneg4Jonst1n_cWFh3uEnSzOMbETA2pkSTH2Qnc4A,11281
+sqlalchemy/event/legacy.py,sha256=n7mDWrZs4_hyYG7BJiYf_ZeQOzWtln0SE8C86TGlVts,6788
+sqlalchemy/event/registry.py,sha256=2MSfbdANVqKfiNacHO9rjhxWjbg0OaLFuOx7XgFJbDs,8783
+sqlalchemy/events.py,sha256=EvU_nwGKiDnj6QhVGcfVg3bQx72gjjgwthOsud3KNHw,470
+sqlalchemy/exc.py,sha256=Osh-j-L-KTZW0DCVwJ4xWzhWBftFP2RBQBqT5YW0-PA,21838
+sqlalchemy/ext/__init__.py,sha256=YbMQmRS_9HxRyWM-KA_F76WOss1_Em1ZcrnQDIDXoOc,333
+sqlalchemy/ext/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/ext/__pycache__/associationproxy.cpython-312.pyc,,
+sqlalchemy/ext/__pycache__/automap.cpython-312.pyc,,
+sqlalchemy/ext/__pycache__/baked.cpython-312.pyc,,
+sqlalchemy/ext/__pycache__/compiler.cpython-312.pyc,,
+sqlalchemy/ext/__pycache__/horizontal_shard.cpython-312.pyc,,
+sqlalchemy/ext/__pycache__/hybrid.cpython-312.pyc,,
+sqlalchemy/ext/__pycache__/indexable.cpython-312.pyc,,
+sqlalchemy/ext/__pycache__/instrumentation.cpython-312.pyc,,
+sqlalchemy/ext/__pycache__/mutable.cpython-312.pyc,,
+sqlalchemy/ext/__pycache__/orderinglist.cpython-312.pyc,,
+sqlalchemy/ext/__pycache__/serializer.cpython-312.pyc,,
+sqlalchemy/ext/associationproxy.py,sha256=fLPiTYSE5sQNb7bHkFF_w38Jwrv6LsJtuwuvAo0SKBE,52766
+sqlalchemy/ext/asyncio/__init__.py,sha256=CcG8Lt3HKcuHKOKV63E13uRXeVrBH52oVbVe2sveiLg,845
+sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/ext/asyncio/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/ext/asyncio/__pycache__/engine.cpython-312.pyc,,
+sqlalchemy/ext/asyncio/__pycache__/events.cpython-312.pyc,,
+sqlalchemy/ext/asyncio/__pycache__/exc.cpython-312.pyc,,
+sqlalchemy/ext/asyncio/__pycache__/result.cpython-312.pyc,,
+sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-312.pyc,,
+sqlalchemy/ext/asyncio/__pycache__/session.cpython-312.pyc,,
+sqlalchemy/ext/asyncio/base.py,sha256=Ib_kxVocjRs2zAmVLOd-itDIbS1rkCfeoxbMT5KY3Tg,2615
+sqlalchemy/ext/asyncio/engine.py,sha256=hLQueuKl4OqGtjoXEU09wjlQVIjRVd7K9YERxHu_D98,27485
+sqlalchemy/ext/asyncio/events.py,sha256=K8HjPpKE6PCxE8engEnmT-zpjwB4zKZlXDez7Gt-mb8,1467
+sqlalchemy/ext/asyncio/exc.py,sha256=0awLfUB4PhEPVVTKYluyor1tW91GPZZnvdQ-GGSOmJY,660
+sqlalchemy/ext/asyncio/result.py,sha256=_idiPW8h9gsenPGTc7VRUe5u2JgSJiHTwYABmYrGHZY,21321
+sqlalchemy/ext/asyncio/scoping.py,sha256=Mjz_uVIqRgzAG64OWnCiIOyRgDKg6OIPo3HIDb5wqE0,3067
+sqlalchemy/ext/asyncio/session.py,sha256=p-75lMea8fiWLlJ-I9MGqO3oinu0mGIgCZwfOFUBpdA,25044
+sqlalchemy/ext/automap.py,sha256=3N1zrka6ccMNHhAqbpbfb269FyOenENo-RD7yN0ghcY,47016
+sqlalchemy/ext/baked.py,sha256=h8PXuUw_Gh07BZrspF9svLli0X6v6BaPPAxh8A4PCuc,20606
+sqlalchemy/ext/compiler.py,sha256=6_UEvEE9eOr7HNGJu5DyTohiViOsccRmA1ShC3CFA10,23242
+sqlalchemy/ext/declarative/__init__.py,sha256=ClT1sXwX29AImka1Wlzkcf-0AjM8hqVxEaiSLRsbies,1906
+sqlalchemy/ext/declarative/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/ext/declarative/__pycache__/extensions.cpython-312.pyc,,
+sqlalchemy/ext/declarative/extensions.py,sha256=pf8WRK2J7Nop_qEUC3ATts2rU9Srd-sXGq1J2Bsc28A,17004
+sqlalchemy/ext/horizontal_shard.py,sha256=j_JEfHMAdAHSq2X4rvwJ5sATs6M5PIRjSBXZ8-kj7Nw,9178
+sqlalchemy/ext/hybrid.py,sha256=-o6lN4mUtB7d3wk4ZafD1N0TQxxkrzdlOUU0f3Kxi7A,43145
+sqlalchemy/ext/indexable.py,sha256=N90II0RM9sD7nWs7SGWWl37yOvit-dGLzXJFbEenBz8,11611
+sqlalchemy/ext/instrumentation.py,sha256=szdWev2Ayv7rOJgw_7bhg207kTduCxrqz3OEx52gB08,15051
+sqlalchemy/ext/mutable.py,sha256=NmKzxp-rhj6HSVGFc5Oo7g9R_xetNjx-xYsD4pdAR00,33458
+sqlalchemy/ext/mypy/__init__.py,sha256=aqT8_9sNwzC8PIaEZ4zkCYGBvYPaDD3eCgJtJuk3g6A,247
+sqlalchemy/ext/mypy/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/ext/mypy/__pycache__/apply.cpython-312.pyc,,
+sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-312.pyc,,
+sqlalchemy/ext/mypy/__pycache__/infer.cpython-312.pyc,,
+sqlalchemy/ext/mypy/__pycache__/names.cpython-312.pyc,,
+sqlalchemy/ext/mypy/__pycache__/plugin.cpython-312.pyc,,
+sqlalchemy/ext/mypy/__pycache__/util.cpython-312.pyc,,
+sqlalchemy/ext/mypy/apply.py,sha256=MR9aSm7HDYim9jNZ6XLU6rmCX8GLB8rZPm8Ld4V6-BY,10893
+sqlalchemy/ext/mypy/decl_class.py,sha256=K2QQX8GOe8hY2tK92xRQlgZD591SAmxWeQtNsc8TzZo,18084
+sqlalchemy/ext/mypy/infer.py,sha256=jZy0iZohAjYdmRsihfnE1NoUa83HtV4u0EQ5OSvP0LY,18806
+sqlalchemy/ext/mypy/names.py,sha256=TWTu7p3Z4fd-kdhACJTh3tCUBPSFhJFnrGSqmxSuwG0,8408
+sqlalchemy/ext/mypy/plugin.py,sha256=lL-S-SnLi6B1SFAfaaQ_K6PCFn681KrUoqkiRWW7xhk,9802
+sqlalchemy/ext/mypy/util.py,sha256=j9lcaqzlwUG-5FHdzdfV2nIJkIqMJMiznGUxPgEEaCY,9245
+sqlalchemy/ext/orderinglist.py,sha256=WdEd7ehySOy2-UDjemStNq8hXZ926vB2dHI6XI05JsE,14263
+sqlalchemy/ext/serializer.py,sha256=jEWD5zI54UcK6nHqmd7LO1ea4LF-eyuzV4BhCg_GNk8,10535
+sqlalchemy/future/__init__.py,sha256=D7ZPBiVcBGXSlBZiiTOp26Yr2CU9NlIwwzIgvQtiw1s,539
+sqlalchemy/future/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/future/__pycache__/engine.cpython-312.pyc,,
+sqlalchemy/future/engine.py,sha256=Ms5QUjfCpNUAaWunObLbBO7iQb-OEOZMxJHzm0Zpkns,16840
+sqlalchemy/future/orm/__init__.py,sha256=Jm9f1aFMpqTYjavfLX6qO4x6n6rOWkz7zQ0LOWJSKrk,295
+sqlalchemy/future/orm/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/inspection.py,sha256=hMiu7Z-H_wqR2f0ZA2XNwnJ_59HygXqwXSHmL7k77es,3136
+sqlalchemy/log.py,sha256=qa1OWmCcjFyQ95xFEYpU2xR2AywhV4mjKvjRZgj0ciA,7373
+sqlalchemy/orm/__init__.py,sha256=Kt75lS7-XHtTg42-7LGvxZO2w0hUhVxMlyesmd9SfGE,11308
+sqlalchemy/orm/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/attributes.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/clsregistry.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/collections.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/context.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/decl_api.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/decl_base.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/dependency.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/descriptor_props.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/dynamic.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/evaluator.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/events.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/exc.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/identity.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/instrumentation.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/interfaces.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/loading.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/mapper.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/path_registry.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/persistence.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/properties.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/query.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/relationships.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/scoping.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/session.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/state.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/strategies.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/strategy_options.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/sync.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/unitofwork.cpython-312.pyc,,
+sqlalchemy/orm/__pycache__/util.cpython-312.pyc,,
+sqlalchemy/orm/attributes.py,sha256=1Msa2CGtvhiiTqGm3GB1KA9nViUWC_rSYgVBmzlU7BA,80060
+sqlalchemy/orm/base.py,sha256=GrgjzLVUFN00t1P_987h2MJPgKcoM_ppvQKgkOepJo4,15816
+sqlalchemy/orm/clsregistry.py,sha256=X3uBP_MsK7grzi8Hax_SAU_8M1WfsnyeBoK0pYZlZiA,13740
+sqlalchemy/orm/collections.py,sha256=vavHNr7oPmuVrn9CxpBOysWbdxuK9buoSLUjxZgqWjQ,56429
+sqlalchemy/orm/context.py,sha256=5gg1vKtLHyUEbf8QCRkAtKwUofJOpruet3LiJY4nK_4,114392
+sqlalchemy/orm/decl_api.py,sha256=pesEyV5UDn6dVuNIHju6sa3QerG2ijtv-SqUpaBWWzI,36619
+sqlalchemy/orm/decl_base.py,sha256=oLh5gWLyz6yHf-E9PBjvd2OmUU_h74pT4uOKE3eVIG4,45949
+sqlalchemy/orm/dependency.py,sha256=8ZjWbSQlN9hCNbK7Agw22B_H_eRaWX_IAwWKg_cf7RE,48277
+sqlalchemy/orm/descriptor_props.py,sha256=kqoW4zYBfmNCkb4aAQLBS-RC1vSscoves3agEYMQwyU,26732
+sqlalchemy/orm/dynamic.py,sha256=PFJ13bXrnjIIxZ_LinWdtQuMhdOiwpWM4yeh8WtC85A,16506
+sqlalchemy/orm/evaluator.py,sha256=PA5ApecF2oNjD_wnp8c87R-7J61m5rv012Z-9OE6TOo,8217
+sqlalchemy/orm/events.py,sha256=yvcFafjVVacVtsOiKi6RkZ-gScUstIw6KyOepNm5K5w,115173
+sqlalchemy/orm/exc.py,sha256=vBpWM79Bqe90qv-lTSuaAgHoO9v3Bu0QyYbfNuwda_U,6736
+sqlalchemy/orm/identity.py,sha256=t2PC5yy1P0IkOw6-BQuQERyQCaN7mzunxyS1ZAIA-N4,7487
+sqlalchemy/orm/instrumentation.py,sha256=S3DmrATcilp15IIE2t6C98QfPRxVj6Wf4qh2HsiCyzs,21044
+sqlalchemy/orm/interfaces.py,sha256=M2lGg19wlz9NvqMt4gFiZsnvwyKV90zkRC1mVIv0y1Y,33362
+sqlalchemy/orm/loading.py,sha256=hMXtEMElCZam1a8NKuKnh4Zw4vMup_ZZP6J_jKgr9aI,50782
+sqlalchemy/orm/mapper.py,sha256=xC2asLPQ6QhgPLi17mliWqIcS4BCqHTxtR6kmPP3YAM,148083
+sqlalchemy/orm/path_registry.py,sha256=sV28WNialuz90R0hXDabhnls5Tk7HZ8N-my6ENIKIKc,16911
+sqlalchemy/orm/persistence.py,sha256=LTlcaHKVzjMGBZ_T6WImu1OFcWJ7JV7sXY4psmZ17uk,86767
+sqlalchemy/orm/properties.py,sha256=6kwBVSPnCZgc6eJApEARJBmvNTFwkdecKznKtEHExv0,15217
+sqlalchemy/orm/query.py,sha256=ZxO3ygcbPevMo3VVXe-sugdG4QimSCGU2WS5mYfYi00,129468
+sqlalchemy/orm/relationships.py,sha256=3rN8zrYtiybk51KRVLz_H1svHPmhA6hD5rydWe0yBMA,147702
+sqlalchemy/orm/scoping.py,sha256=jgG2jLVVgdn-ip24nZLZwpltGFM4j3NIpvf1zDDnc_w,7485
+sqlalchemy/orm/session.py,sha256=qZVJqDr8l7uRxrBknuVdVGmc9ua4B5GYscUUcEgS9Ho,167046
+sqlalchemy/orm/state.py,sha256=48JNjLt4LXf81O_ax4tgsZV8PedlGVutPy5B5caPkFk,34549
+sqlalchemy/orm/strategies.py,sha256=1qN81UADel7zufLxqTwmeJR5vj8MVFDxmL2bTFQlIfY,111482
+sqlalchemy/orm/strategy_options.py,sha256=jSRkzm0Tmext4kwg3KnZM4dhMTxiE6LKhgNfWp3CL6w,70318
+sqlalchemy/orm/sync.py,sha256=pb-qbMqDFVPwZ4XBjK9kvX39U7HG2XY-FmLl-CRGSVU,5991
+sqlalchemy/orm/unitofwork.py,sha256=5JFnMsr1P50WTSUzdUB9Srv7pF0qI4zWk6m4hOEnAxc,27874
+sqlalchemy/orm/util.py,sha256=kIbDzejzAxfxrpNsLLNnndCXcfT4aNcWnzouShzKOBw,78436
+sqlalchemy/pool/__init__.py,sha256=47INNdDtseDMxv0V9i3JmDcCxlapDXhlxbiecUxm2dM,1648
+sqlalchemy/pool/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/pool/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/pool/__pycache__/dbapi_proxy.cpython-312.pyc,,
+sqlalchemy/pool/__pycache__/events.cpython-312.pyc,,
+sqlalchemy/pool/__pycache__/impl.cpython-312.pyc,,
+sqlalchemy/pool/base.py,sha256=yCzrXGUcng1TN9Of55GyLAhf9MA5FNEo4sQMMdkfSdQ,41694
+sqlalchemy/pool/dbapi_proxy.py,sha256=QnTkYiB_j2C-IXEH0EqnTB3H8385-2p3C00kUv1JxKs,4365
+sqlalchemy/pool/events.py,sha256=v5_s9IEOJ5qGCA33M_VfKVLaZAhQY1vLjdT4CT3Q0Js,11978
+sqlalchemy/pool/impl.py,sha256=_yikhSf2A2daR4tZNSmRzuqml66nU7hS7ZuZP323fXw,16291
+sqlalchemy/processors.py,sha256=7SahX6wVuZ1S8dco5I_fInho1S-KqXyDBrFuUlJE6kc,5910
+sqlalchemy/schema.py,sha256=LZlIvwhyK5KGG4HuDKrjhh7W2szT6tiqJn3iyegjLAA,2472
+sqlalchemy/sql/__init__.py,sha256=TNdf3uhM-4Ob7VSXSrflUpn_UFpsVg14ff26nj04QGw,4811
+sqlalchemy/sql/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/annotation.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/base.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/coercions.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/compiler.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/crud.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/ddl.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/default_comparator.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/dml.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/elements.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/events.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/expression.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/functions.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/lambdas.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/naming.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/operators.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/roles.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/schema.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/selectable.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/sqltypes.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/traversals.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/type_api.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/util.cpython-312.pyc,,
+sqlalchemy/sql/__pycache__/visitors.cpython-312.pyc,,
+sqlalchemy/sql/annotation.py,sha256=S-WvpETG-ZL5Un8M8GgJzWqjqjNpRcMKGt3YNUodB_E,12393
+sqlalchemy/sql/base.py,sha256=N2WiInPEShs-doglLgdtbZ_RFBdzM9wNAhQ2A1rrA0I,57601
+sqlalchemy/sql/coercions.py,sha256=6JsiRKs1Gab8SisDe5BV_2I8P0jc63ixmL_WhihLO8k,35817
+sqlalchemy/sql/compiler.py,sha256=101b10CuU0Ba4OFeMFBX_Li-EYFwSNEvbElblkppX4A,199177
+sqlalchemy/sql/crud.py,sha256=7sk9_r-OjSAuD4VL8Juj948rGC2h-nSs1mw0_Lf06JA,37260
+sqlalchemy/sql/ddl.py,sha256=7RiTK-pE_tUOEuD_OGw1P1QCOHbyjhN77d31t4xI9hE,45623
+sqlalchemy/sql/default_comparator.py,sha256=AVoqQmX9DhdgxRhQuzb7Gsyr_Fwr_Qh8P4WU_X3QR5U,11501
+sqlalchemy/sql/dml.py,sha256=MV8SXCgwsz6bx0j4cN86YVkwN-YLN4b2ecD7c4PYzt0,56184
+sqlalchemy/sql/elements.py,sha256=onp9ZtP6dsVAYS-uLDgm-cEgcIQvPvxAos5xDV-6UOY,188157
+sqlalchemy/sql/events.py,sha256=bFVWFCKCV-AoBTeNYDm618uiizu0H0pk2zaOYwEJcTc,13563
+sqlalchemy/sql/expression.py,sha256=x2AA58XOJ6T7vjOMTTa56SUOPGiM8K9tCaFDZ7bC0zc,9106
+sqlalchemy/sql/functions.py,sha256=xDQNhi6OdvDlM4YKllSMPrDeZZkbz3rBejfa5nZXFWg,50650
+sqlalchemy/sql/lambdas.py,sha256=c7ay_8cPoBHI--tyOsG2p5IVubXQ6qFRZL-4qbcJsms,46363
+sqlalchemy/sql/naming.py,sha256=hUr64m0tNY-zRAtWOlagdu9kt2MX4z9blsj6nHhvHy4,6989
+sqlalchemy/sql/operators.py,sha256=L1dohiQTRujGai6NGJMHCN1WnIE2csEXbM1kMWQAhT0,51618
+sqlalchemy/sql/roles.py,sha256=ooCuZuGZGR6X6y44gTybnydlkSoQbNkq5MWCz2-CCeU,5877
+sqlalchemy/sql/schema.py,sha256=k6FWh-p7-EgRuLDhbDc1Ckq5bbMOyqXbpC0sin59tIc,201034
+sqlalchemy/sql/selectable.py,sha256=l2LQR5NfhTA0_2_5Tqaz5UJe6ZBSpUmZ_PU3olpaezs,244630
+sqlalchemy/sql/sqltypes.py,sha256=XgtcTPCziC3ruXH-_nMHGV2dZAF9IPEb85ZIoviVWAw,118353
+sqlalchemy/sql/traversals.py,sha256=eOjLJFpc44MDJ1pdLrLbrddNbRroWJrWbwwBWk594ss,54915
+sqlalchemy/sql/type_api.py,sha256=52akaESzgPFp33tsBA89qSKx9BqBMMHzvCh34cyoDJU,73737
+sqlalchemy/sql/util.py,sha256=vRHJnQiDrbcJs3ayZ1Z7640kYyCa44nZgn3iTTLYog4,37087
+sqlalchemy/sql/visitors.py,sha256=2eoXxY76WVHQngYT09AWlTxYhPD79-lnUMiRaq0tpTY,28181
+sqlalchemy/testing/__init__.py,sha256=y3aBbdILfX1EHZRGbNA8Xwzyz1zcwO959hSArHjqyI8,3074
+sqlalchemy/testing/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/assertions.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/assertsql.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/asyncio.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/config.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/engines.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/entities.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/exclusions.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/fixtures.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/mock.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/pickleable.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/profiling.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/provision.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/requirements.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/schema.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/util.cpython-312.pyc,,
+sqlalchemy/testing/__pycache__/warnings.cpython-312.pyc,,
+sqlalchemy/testing/assertions.py,sha256=S7-0gU7pZHC99CZwMYFNnqbRg834Y-jgs1wAgjo_IRs,30053
+sqlalchemy/testing/assertsql.py,sha256=6JWVJkxrTf1n8ay6AibqF9emTUNXm9GAy0c0bW746wI,15421
+sqlalchemy/testing/asyncio.py,sha256=UF69_JxZwEdwdT7R0bjPxoECqP1ti12fATaoSxGzUAM,3799
+sqlalchemy/testing/config.py,sha256=H1MOE_deR9vVinXEYvW5hCRgKXUfZWwKGWrIBbzXZHc,9995
+sqlalchemy/testing/engines.py,sha256=aN2IiVwAXwVAtFvAPv1oeyxHXr-mQlu-Y8_03Wumsdg,13857
+sqlalchemy/testing/entities.py,sha256=jqJwOpK9L67SI8iW_hrNgmlesPbz5DH79kMOLK2yIUA,3364
+sqlalchemy/testing/exclusions.py,sha256=68YS8DsZaPQgcxgp607ZWY6jdrFJ0pqnDZ8Kw1oOFGs,13777
+sqlalchemy/testing/fixtures.py,sha256=qYLlb5VMP-RKgxJQzRM-CUsI0tw0SNx8RjGz4Rh4ud8,31902
+sqlalchemy/testing/mock.py,sha256=WxFitkGzk0bT4T4VJSc-CsEgs9Ug0H9WGGfU55UAar4,926
+sqlalchemy/testing/pickleable.py,sha256=2W45K35EstWORy5Ci82W-ClYI8URO6X5x2MpXrFSTe8,3037
+sqlalchemy/testing/plugin/__init__.py,sha256=bbtVIt7LzVnUCcVxHWRH2owOQD067bQwwhyMf_whqHs,253
+sqlalchemy/testing/plugin/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-312.pyc,,
+sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-312.pyc,,
+sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-312.pyc,,
+sqlalchemy/testing/plugin/__pycache__/reinvent_fixtures_py2k.cpython-312.pyc,,
+sqlalchemy/testing/plugin/bootstrap.py,sha256=iKztIbiLNt4D-DiPf6SNkNFOTYfR3btFDKmiUHL5th8,2009
+sqlalchemy/testing/plugin/plugin_base.py,sha256=u9U2X_aaIKK6dlWfW3yiK0QsDXaoA7XgoK2GXt6SoZI,22336
+sqlalchemy/testing/plugin/pytestplugin.py,sha256=mX-deWUGYCGHMOWbT57QVhDd9EqGTbQNmIcL2md3lXs,27210
+sqlalchemy/testing/plugin/reinvent_fixtures_py2k.py,sha256=wGSbmYHcaSGV-zx6T1PmN4sgI9RDy8aOXKtXqEVFa70,3667
+sqlalchemy/testing/profiling.py,sha256=MbvZLlelNQNVzjp4wenbB0gCpQtccycn_2uHbuZkKdc,10988
+sqlalchemy/testing/provision.py,sha256=nFnJlDgCHDAwgTE0oNP79ct1Y3ZhgIiSwKCKq7zyeXY,12740
+sqlalchemy/testing/requirements.py,sha256=5Rh12U-lRmYEJXd3jKA0Vd-WkqbHq85e0oYDC1XQrWU,46187
+sqlalchemy/testing/schema.py,sha256=xMwJNVGholmF9lAEORgZeNnZeKHLdW77cyo-wBLiPnA,6762
+sqlalchemy/testing/suite/__init__.py,sha256=YvTEqUNHaBlgLgWDAWn79mQrUR4VBGUHtprywJlmDT8,741
+sqlalchemy/testing/suite/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_cte.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_insert.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_results.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_select.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_types.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-312.pyc,,
+sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-312.pyc,,
+sqlalchemy/testing/suite/test_cte.py,sha256=SrAhjOHj6k8ol8D1VEl0uhVoCp6eAz2dj8JZjitmJ9Y,6639
+sqlalchemy/testing/suite/test_ddl.py,sha256=qWyRqN3rTHZBWNEO92zhzU8MLN7BFwTp89-Jjy7apnI,12395
+sqlalchemy/testing/suite/test_deprecations.py,sha256=oKHv_njcX8ldeCudU09dOYo7LeR1yQ75OkXmb8HJ37o,5465
+sqlalchemy/testing/suite/test_dialect.py,sha256=215qgc-mnk_WhBWv-VHmBRxJ6tBE2ij2V9dwdwNULC0,13590
+sqlalchemy/testing/suite/test_insert.py,sha256=bhWQoqbgBoib11lwMVUU33XLkNFlI_FC62Ou_3QKF74,11756
+sqlalchemy/testing/suite/test_reflection.py,sha256=ykKN8avBrgqi3ZEJEhDAfDQpmEAX9CHwX5Ia9mtVmV4,63564
+sqlalchemy/testing/suite/test_results.py,sha256=Hg6MJejMoU1EGOT-9PzmZlUm3cWBP0s004ByHLwmpBw,14665
+sqlalchemy/testing/suite/test_rowcount.py,sha256=a4V54SO3uClAOKm_p2-o1Zyc5c7klnyl1BIjO3Ig44k,5299
+sqlalchemy/testing/suite/test_select.py,sha256=qdCJhCFSgEK5_AgAuD9n5Qq6FB4iaqYk7CzwWBLqBzQ,59007
+sqlalchemy/testing/suite/test_sequence.py,sha256=LZZQUdHf-lVdBPbyugJSL610KaHJgNu-3WqqY7ms8KE,8970
+sqlalchemy/testing/suite/test_types.py,sha256=9PaCKGq2CAFipr8CNxiTI05G6h53FyXcg8VcRp6KmmY,49843
+sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=nSoXv1vIGUSh-o5zbz3iJE7g5-xNCL9jRZkvABuntHM,7203
+sqlalchemy/testing/suite/test_update_delete.py,sha256=uUtlGIORY26awXYTH850_qd567xgWOCvLAfVIQMH1Y8,1947
+sqlalchemy/testing/util.py,sha256=iPWRq0vLA4RPMe_KjLxh32kDFCssaDsWbXas2c7T0N8,14526
+sqlalchemy/testing/warnings.py,sha256=cbwerJdsmswuYWDsCLrd_GJ0xjFZEYebPFBYZWi7GBo,2557
+sqlalchemy/types.py,sha256=IfR_klREt3NNcdWb_oqRqHuNjpDfFjLBQHWJY70WJ7M,3114
+sqlalchemy/util/__init__.py,sha256=0G2Cv_YwYxOiwnjrkJOu37-Cyr4NffMpLxODqvUH5nE,6631
+sqlalchemy/util/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy/util/__pycache__/_collections.cpython-312.pyc,,
+sqlalchemy/util/__pycache__/_compat_py3k.cpython-312.pyc,,
+sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-312.pyc,,
+sqlalchemy/util/__pycache__/_preloaded.cpython-312.pyc,,
+sqlalchemy/util/__pycache__/compat.cpython-312.pyc,,
+sqlalchemy/util/__pycache__/concurrency.cpython-312.pyc,,
+sqlalchemy/util/__pycache__/deprecations.cpython-312.pyc,,
+sqlalchemy/util/__pycache__/langhelpers.cpython-312.pyc,,
+sqlalchemy/util/__pycache__/queue.cpython-312.pyc,,
+sqlalchemy/util/__pycache__/tool_support.cpython-312.pyc,,
+sqlalchemy/util/__pycache__/topological.cpython-312.pyc,,
+sqlalchemy/util/_collections.py,sha256=xUMn7KXt1gowHB0ZAweJxv62xHS5TvkFulTPiRZ9cTQ,30228
+sqlalchemy/util/_compat_py3k.py,sha256=moJ9Fj6id3-jkNrPwihseuIP4cCOJUsaRoWewPymzWc,2262
+sqlalchemy/util/_concurrency_py3k.py,sha256=9THJTJwCaqC6_n0pfr00nDWwultOFm5Ekat4hybFyNQ,6743
+sqlalchemy/util/_preloaded.py,sha256=al9NQZNCkxMvK6Ivssdh4Dcg5GwiVie7v_sDVnNqz_0,2464
+sqlalchemy/util/compat.py,sha256=AcVx5dKkCHQSb-7XRE-ig7EahctGwDZO_0MGAhxfebs,19020
+sqlalchemy/util/concurrency.py,sha256=SD3lE-QrpWYEsB6Oxp4cIQHFKENgShCLrJQ0U6Cewi0,2351
+sqlalchemy/util/deprecations.py,sha256=r-Hu5n5__01WCPddYAVFS4h-D-L5HWbUMe3obs4YreY,14158
+sqlalchemy/util/langhelpers.py,sha256=QqkypXF8x3mzTCSq6S4jwoB8gn2acVIW1AeOldiYmfc,58233
+sqlalchemy/util/queue.py,sha256=SsCqzH75kS_eWc8JHJ_c_BA4CItu7XrPCt-xg3PEdxk,9584
+sqlalchemy/util/tool_support.py,sha256=DuurikYgDUIIxk3gubUKl6rs-etXt3eeHaZ4ZkIyJXQ,6336
+sqlalchemy/util/topological.py,sha256=KqMx43y9Smm6wL3BbJJHRHKsJsTtvDgw6iLc_QaFbeQ,2959

+ 5 - 0
.venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/WHEEL

@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: setuptools (74.1.2)
+Root-Is-Purelib: false
+Tag: cp312-cp312-win_amd64
+

+ 1 - 0
.venv/Lib/site-packages/SQLAlchemy-1.4.54.dist-info/top_level.txt

@@ -0,0 +1 @@
+sqlalchemy

+ 1 - 0
.venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 201 - 0
.venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/LICENSE

@@ -0,0 +1,201 @@
+                                 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 2016-2022 Alexey Stepanov aka penguinolog
+
+   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.

+ 135 - 0
.venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/METADATA

@@ -0,0 +1,135 @@
+Metadata-Version: 2.1
+Name: SQLAlchemy-JSONField
+Version: 1.0.2
+Summary: SQLALchemy JSONField implementation for storing dicts at SQL
+Author-email: Alexey Stepanov <penguinolog@gmail.com>
+License: Apache-2.0
+Project-URL: Repository, https://github.com/penguinolog/sqlalchemy_jsonfield
+Project-URL: Bug Tracker, https://github.com/penguinolog/sqlalchemy_jsonfield/issues
+Keywords: sql,sqlalchemy,json,jsonfield,development
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Requires-Python: >=3.7.0
+Description-Content-Type: text/x-rst
+License-File: LICENSE
+Requires-Dist: sqlalchemy
+
+SQLAlchemy-JSONField
+====================
+
+.. image:: https://github.com/penguinolog/sqlalchemy_jsonfield/workflows/Python%20package/badge.svg
+    :target: https://github.com/penguinolog/sqlalchemy_jsonfield/actions
+.. image:: https://img.shields.io/pypi/v/sqlalchemy_jsonfield.svg
+    :target: https://pypi.python.org/pypi/sqlalchemy_jsonfield
+.. image:: https://img.shields.io/pypi/pyversions/sqlalchemy_jsonfield.svg
+    :target: https://pypi.python.org/pypi/sqlalchemy_jsonfield
+.. image:: https://img.shields.io/pypi/status/sqlalchemy_jsonfield.svg
+    :target: https://pypi.python.org/pypi/sqlalchemy_jsonfield
+.. image:: https://img.shields.io/github/license/penguinolog/sqlalchemy_jsonfield.svg
+    :target: https://raw.githubusercontent.com/penguinolog/sqlalchemy_jsonfield/master/LICENSE
+.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
+    :target: https://github.com/ambv/black
+
+SQLALchemy JSONField implementation for storing dicts at SQL independently from JSON type support.
+
+Why?
+----
+
+SqlAlchemy provides JSON field support for several database types (PostgreSQL and MySQL for now)
+and semi-working dict <-> JSON <-> VARCHAR example, but...
+In real scenarios we have tests on sqlite, production on MySQL/MariaDB/Percona/PostgreSQL
+and some of them (modern Oracle MySQL & PostgreSQL) support JSON,
+some of them (SQLite, Percona & MariaDB) requires data conversion to Text (not VARCHAR).
+
+As addition, we have different levels of Unicode support on database and connector side,
+so we may be interested to switch JSON encoding between deployments.
+
+.. note:: SQLite 3.9 supports JSON natively and SQLAlchemy can handle this.
+
+Solution:
+---------
+
+SQLALchemy JSONField has API with suport for automatic switch between native JSON and JSON encoded data,
+and encoding to JSON string can be enforced.
+
+Pros:
+-----
+
+* Free software: Apache license
+* Open Source: https://github.com/penguinolog/sqlalchemy_jsonfield
+* Self-documented code: docstrings with types in comments
+* Uses native JSON by default, but allows to specify different library.
+* Support multiple Python versions
+
+Usage
+=====
+Direct usage with MariaDB (example extracted from functional tests):
+
+.. code-block:: python
+
+  import sqlalchemy_jsonfield
+
+  class ExampleTable(Base):
+      __tablename__ = table_name
+      id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
+      row_name = sqlalchemy.Column(
+          sqlalchemy.Unicode(64),
+          unique=True,
+      )
+      json_record = sqlalchemy.Column(
+          sqlalchemy_jsonfield.JSONField(
+              # MariaDB does not support JSON for now
+              enforce_string=True,
+              # MariaDB connector requires additional parameters for correct UTF-8
+              enforce_unicode=False
+          ),
+          nullable=False
+      )
+
+Usage with alternate JSON library:
+
+.. code-block:: python
+
+  import sqlalchemy_jsonfield
+  import ujson
+
+  class ExampleTable(Base):
+      __tablename__ = table_name
+      id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
+      row_name = sqlalchemy.Column(
+          sqlalchemy.Unicode(64),
+          unique=True,
+      )
+      json_record = sqlalchemy.Column(
+          sqlalchemy_jsonfield.JSONField(
+              enforce_string=True,
+              enforce_unicode=False,
+              json=ujson,  # Use ujson instead of standard json.
+          ),
+          nullable=False
+      )
+
+Usage on PostgreSQL/Oracle MySQL(modern version)/SQLite(testing) environments allows to set `enforce_string=False`
+and use native JSON fields.
+
+Testing
+=======
+The main test mechanism for the package `sqlalchemy_jsonfield` is using `tox`.
+Available environments can be collected via `tox -l`
+
+CI systems
+==========
+For code checking several CI systems is used in parallel:
+
+1. `GitHub actions: <https://github.com/penguinolog/sqlalchemy_jsonfield/actions>`_ is used for checking: PEP8, pylint, bandit, installation possibility and unit tests.

+ 12 - 0
.venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/RECORD

@@ -0,0 +1,12 @@
+SQLAlchemy_JSONField-1.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+SQLAlchemy_JSONField-1.0.2.dist-info/LICENSE,sha256=QUMgEaFGDhNsuWC0H2NcmeOSplC1YGyj7tGX2MLJqH8,11366
+SQLAlchemy_JSONField-1.0.2.dist-info/METADATA,sha256=-RgBvyvxj4DcjNlaNlTMjpknuJTMNiqEIq5vFGeVDrQ,5204
+SQLAlchemy_JSONField-1.0.2.dist-info/RECORD,,
+SQLAlchemy_JSONField-1.0.2.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
+SQLAlchemy_JSONField-1.0.2.dist-info/top_level.txt,sha256=NdmVTqdzw1LTTDSmyG9U2ne8IcIJkCM_viIH5mAFz2k,21
+sqlalchemy_jsonfield/__init__.py,sha256=uRT3gQRuKqFv62ULaIrmIIpYEZiMKlL2z30iGxAyRsw,1298
+sqlalchemy_jsonfield/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy_jsonfield/__pycache__/_version.cpython-312.pyc,,
+sqlalchemy_jsonfield/__pycache__/jsonfield.cpython-312.pyc,,
+sqlalchemy_jsonfield/_version.py,sha256=BGgbj7AHZwtVw29XgDIjcG5woR-f3jQy2X-ArcRT22E,411
+sqlalchemy_jsonfield/jsonfield.py,sha256=_6Is-gp-4YJk2GAbt5F6hzZnOXifjyatPhEKCg5y1Gw,5682

+ 5 - 0
.venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/WHEEL

@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.41.3)
+Root-Is-Purelib: true
+Tag: py3-none-any
+

+ 1 - 0
.venv/Lib/site-packages/SQLAlchemy_JSONField-1.0.2.dist-info/top_level.txt

@@ -0,0 +1 @@
+sqlalchemy_jsonfield

+ 1 - 0
.venv/Lib/site-packages/SQLAlchemy_Utils-0.41.2.dist-info/INSTALLER

@@ -0,0 +1 @@
+pip

+ 27 - 0
.venv/Lib/site-packages/SQLAlchemy_Utils-0.41.2.dist-info/LICENSE

@@ -0,0 +1,27 @@
+Copyright (c) 2012, Konsta Vesterinen
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* 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.
+
+* The names of the contributors may not 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 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.

+ 96 - 0
.venv/Lib/site-packages/SQLAlchemy_Utils-0.41.2.dist-info/METADATA

@@ -0,0 +1,96 @@
+Metadata-Version: 2.1
+Name: SQLAlchemy-Utils
+Version: 0.41.2
+Summary: Various utility functions for SQLAlchemy.
+Home-page: https://github.com/kvesteri/sqlalchemy-utils
+Author: Konsta Vesterinen, Ryan Leckey, Janne Vanhala, Vesa Uimonen
+Author-email: konsta@fastmonkeys.com
+License: BSD
+Platform: any
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Requires-Python: >=3.7
+License-File: LICENSE
+Requires-Dist: SQLAlchemy >=1.3
+Requires-Dist: importlib-metadata ; python_version < "3.8"
+Provides-Extra: arrow
+Requires-Dist: arrow >=0.3.4 ; extra == 'arrow'
+Provides-Extra: babel
+Requires-Dist: Babel >=1.3 ; extra == 'babel'
+Provides-Extra: color
+Requires-Dist: colour >=0.0.4 ; extra == 'color'
+Provides-Extra: encrypted
+Requires-Dist: cryptography >=0.6 ; extra == 'encrypted'
+Provides-Extra: intervals
+Requires-Dist: intervals >=0.7.1 ; extra == 'intervals'
+Provides-Extra: password
+Requires-Dist: passlib <2.0,>=1.6 ; extra == 'password'
+Provides-Extra: pendulum
+Requires-Dist: pendulum >=2.0.5 ; extra == 'pendulum'
+Provides-Extra: phone
+Requires-Dist: phonenumbers >=5.9.2 ; extra == 'phone'
+Provides-Extra: test
+Requires-Dist: pytest ==7.4.4 ; extra == 'test'
+Requires-Dist: Pygments >=1.2 ; extra == 'test'
+Requires-Dist: Jinja2 >=2.3 ; extra == 'test'
+Requires-Dist: docutils >=0.10 ; extra == 'test'
+Requires-Dist: flexmock >=0.9.7 ; extra == 'test'
+Requires-Dist: psycopg >=3.1.8 ; extra == 'test'
+Requires-Dist: psycopg2 >=2.5.1 ; extra == 'test'
+Requires-Dist: psycopg2cffi >=2.8.1 ; extra == 'test'
+Requires-Dist: pg8000 >=1.12.4 ; extra == 'test'
+Requires-Dist: pytz >=2014.2 ; extra == 'test'
+Requires-Dist: python-dateutil >=2.6 ; extra == 'test'
+Requires-Dist: pymysql ; extra == 'test'
+Requires-Dist: flake8 >=2.4.0 ; extra == 'test'
+Requires-Dist: isort >=4.2.2 ; extra == 'test'
+Requires-Dist: pyodbc ; extra == 'test'
+Requires-Dist: backports.zoneinfo ; (python_version < "3.9") and extra == 'test'
+Provides-Extra: test_all
+Requires-Dist: Babel >=1.3 ; extra == 'test_all'
+Requires-Dist: Jinja2 >=2.3 ; extra == 'test_all'
+Requires-Dist: Pygments >=1.2 ; extra == 'test_all'
+Requires-Dist: arrow >=0.3.4 ; extra == 'test_all'
+Requires-Dist: colour >=0.0.4 ; extra == 'test_all'
+Requires-Dist: cryptography >=0.6 ; extra == 'test_all'
+Requires-Dist: docutils >=0.10 ; extra == 'test_all'
+Requires-Dist: flake8 >=2.4.0 ; extra == 'test_all'
+Requires-Dist: flexmock >=0.9.7 ; extra == 'test_all'
+Requires-Dist: furl >=0.4.1 ; extra == 'test_all'
+Requires-Dist: intervals >=0.7.1 ; extra == 'test_all'
+Requires-Dist: isort >=4.2.2 ; extra == 'test_all'
+Requires-Dist: passlib <2.0,>=1.6 ; extra == 'test_all'
+Requires-Dist: pendulum >=2.0.5 ; extra == 'test_all'
+Requires-Dist: pg8000 >=1.12.4 ; extra == 'test_all'
+Requires-Dist: phonenumbers >=5.9.2 ; extra == 'test_all'
+Requires-Dist: psycopg2 >=2.5.1 ; extra == 'test_all'
+Requires-Dist: psycopg2cffi >=2.8.1 ; extra == 'test_all'
+Requires-Dist: psycopg >=3.1.8 ; extra == 'test_all'
+Requires-Dist: pymysql ; extra == 'test_all'
+Requires-Dist: pyodbc ; extra == 'test_all'
+Requires-Dist: pytest ==7.4.4 ; extra == 'test_all'
+Requires-Dist: python-dateutil ; extra == 'test_all'
+Requires-Dist: python-dateutil >=2.6 ; extra == 'test_all'
+Requires-Dist: pytz >=2014.2 ; extra == 'test_all'
+Requires-Dist: backports.zoneinfo ; (python_version < "3.9") and extra == 'test_all'
+Provides-Extra: timezone
+Requires-Dist: python-dateutil ; extra == 'timezone'
+Provides-Extra: url
+Requires-Dist: furl >=0.4.1 ; extra == 'url'
+
+
+SQLAlchemy-Utils
+----------------
+
+Various utility functions and custom data types for SQLAlchemy.

+ 134 - 0
.venv/Lib/site-packages/SQLAlchemy_Utils-0.41.2.dist-info/RECORD

@@ -0,0 +1,134 @@
+SQLAlchemy_Utils-0.41.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+SQLAlchemy_Utils-0.41.2.dist-info/LICENSE,sha256=aKpRvWCrOmo-gm2RyB2KhgP4FtG6tTWi_xi_fWmqmwo,1437
+SQLAlchemy_Utils-0.41.2.dist-info/METADATA,sha256=Oa5EKUeSQem6qDguiTjQhh85jmYr1pZnDzX4Z4p7dKQ,4201
+SQLAlchemy_Utils-0.41.2.dist-info/RECORD,,
+SQLAlchemy_Utils-0.41.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
+SQLAlchemy_Utils-0.41.2.dist-info/top_level.txt,sha256=C1ORFCU1fhRUCHEe-ZcUkfSkafW8gtZgCEAFeXZeaLc,17
+sqlalchemy_utils/__init__.py,sha256=_h7wBBWLH4F4sLMqghPSbPx1y6bT96hlxMTonRO06WY,2363
+sqlalchemy_utils/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/aggregates.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/asserts.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/compat.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/exceptions.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/expressions.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/generic.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/i18n.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/listeners.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/models.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/observer.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/operators.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/path.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/proxy_dict.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/query_chain.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/utils.cpython-312.pyc,,
+sqlalchemy_utils/__pycache__/view.cpython-312.pyc,,
+sqlalchemy_utils/aggregates.py,sha256=sdzDxpQDZgHmHMuEJ82vzMh8DDQEw7_vqaLBeRwn9ik,15420
+sqlalchemy_utils/asserts.py,sha256=w37lkU4hgzlLkr3GalUMkGVRFrB4E65gi8vVeDNW5tE,5376
+sqlalchemy_utils/compat.py,sha256=BYEgwN_tu-1yfjYSjVJEtK2R_WC57R7okXHoCv6aD4k,2241
+sqlalchemy_utils/exceptions.py,sha256=iZW-TQSZDtCge4pzDDpYug4tKmpEM8coaplYiPJ8UPw,229
+sqlalchemy_utils/expressions.py,sha256=ab-7JXJbuf9nNaSIEHGeUK9mkI__UpLrsAxgXYHZjCA,1610
+sqlalchemy_utils/functions/__init__.py,sha256=R6TU8WdVGFrYOcA_76rW8CH8AvZeBR_SL6pJFdHa0g8,950
+sqlalchemy_utils/functions/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy_utils/functions/__pycache__/database.cpython-312.pyc,,
+sqlalchemy_utils/functions/__pycache__/foreign_keys.cpython-312.pyc,,
+sqlalchemy_utils/functions/__pycache__/mock.cpython-312.pyc,,
+sqlalchemy_utils/functions/__pycache__/orm.cpython-312.pyc,,
+sqlalchemy_utils/functions/__pycache__/render.cpython-312.pyc,,
+sqlalchemy_utils/functions/__pycache__/sort_query.cpython-312.pyc,,
+sqlalchemy_utils/functions/database.py,sha256=w0Wc9sqM_7EqmA3Gmyq2OFVVhsHutoQvUB_Ccd9Zccs,19986
+sqlalchemy_utils/functions/foreign_keys.py,sha256=oHVJoB037tpa-xc3eVnhJPKT6YhkTDETVgQ5RIdIchg,10440
+sqlalchemy_utils/functions/mock.py,sha256=g8PrPh7W2NFIyklSzKoL4s2cErvJXrAxMzGfvdif_48,3145
+sqlalchemy_utils/functions/orm.py,sha256=sg9PfWFefRLGeMT_B8vcVDdLmn5EJjuUj9ImW-MNGqM,24628
+sqlalchemy_utils/functions/render.py,sha256=aCAtzQicivrCMbCvaT-CdHhQvztr2yzAVFXHImzakH8,2057
+sqlalchemy_utils/functions/sort_query.py,sha256=4O2vMDAwrPA2FsOY62xTirVmhqsfaDBGkRV_ReM7F4A,2332
+sqlalchemy_utils/generic.py,sha256=Q0uHiwI0rNP68kuNE8jlRwiAhzf6-mTvJ388D1l_7I4,7150
+sqlalchemy_utils/i18n.py,sha256=bPJziNDTzIaSdNZntlgL0MlI3frQgf8M-yvyjmS_XoQ,3905
+sqlalchemy_utils/listeners.py,sha256=p1nxzGnEWNspueH27iFG21D9_O-PX95wIWbgiNx5pHM,7805
+sqlalchemy_utils/models.py,sha256=z87KGdLmwSRGeQBzEJ4w3jj5eEL3heEZPIfQYRPYniw,2877
+sqlalchemy_utils/observer.py,sha256=11E_n4NwgRcqes0N6A1G8MKCTCGcznSvla2VkJdREPE,12220
+sqlalchemy_utils/operators.py,sha256=nItfRvJbYcreLjCkJd7t1zckfidkvoiF-tMXNVUJz04,1966
+sqlalchemy_utils/path.py,sha256=ulyUFuG5BAHIKr_ttJoa2s5NTzUKH27YYPrMLsy1Pew,4121
+sqlalchemy_utils/primitives/__init__.py,sha256=Ubo8i8HJr2TIcA94y0I822FninJyxKSmHY676wZWT14,185
+sqlalchemy_utils/primitives/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy_utils/primitives/__pycache__/country.cpython-312.pyc,,
+sqlalchemy_utils/primitives/__pycache__/currency.cpython-312.pyc,,
+sqlalchemy_utils/primitives/__pycache__/ltree.cpython-312.pyc,,
+sqlalchemy_utils/primitives/__pycache__/weekday.cpython-312.pyc,,
+sqlalchemy_utils/primitives/__pycache__/weekdays.cpython-312.pyc,,
+sqlalchemy_utils/primitives/country.py,sha256=U8eayWirlksN2ZnCTLE4PFYnLU5DSnxs51m4FU2rVFM,2740
+sqlalchemy_utils/primitives/currency.py,sha256=RdI-TIxhO90VCmzxnuOAd9ZvHkuw2XrzFJPvD5ZgfE8,2733
+sqlalchemy_utils/primitives/ltree.py,sha256=4Hs6xjZKdNVMLiVppSCA37RoidfOQZWi7FlUWPuujHA,5261
+sqlalchemy_utils/primitives/weekday.py,sha256=AMAe1km6iOKLlHghWUr8enj8J2jWNvf5Dox4LrneJJg,1259
+sqlalchemy_utils/primitives/weekdays.py,sha256=K4tIOHv6EvYR3IUwCEqKT1DEiVgsBMpOty8xRym0Kcc,1764
+sqlalchemy_utils/proxy_dict.py,sha256=t0-VwgrTcAAsUhOFCE2JdIhTy5Yv-71GebhwQC3xNIU,2369
+sqlalchemy_utils/query_chain.py,sha256=GN6pWesgac5LtPTvUSecbciR9XbfBAG6qxdQiNFA38s,3963
+sqlalchemy_utils/relationships/__init__.py,sha256=vyGb2Opfv-ZM0pw5JOpv9kdWr4_Q2foSHSp8Ho_cBik,3587
+sqlalchemy_utils/relationships/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy_utils/relationships/__pycache__/chained_join.cpython-312.pyc,,
+sqlalchemy_utils/relationships/chained_join.py,sha256=VUMZh5gwGf8qypkM-ZzNz3OtHY7mP7Hi0QoijQM6OpA,880
+sqlalchemy_utils/types/__init__.py,sha256=LUMa5FZq7dFuzatd_Dl993hPHc8lQXSnHX4QlW0wG7E,1919
+sqlalchemy_utils/types/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/arrow.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/bit.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/choice.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/color.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/country.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/currency.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/email.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/ip_address.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/json.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/locale.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/ltree.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/password.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/pg_composite.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/phone_number.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/range.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/scalar_coercible.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/scalar_list.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/timezone.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/ts_vector.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/url.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/uuid.cpython-312.pyc,,
+sqlalchemy_utils/types/__pycache__/weekdays.cpython-312.pyc,,
+sqlalchemy_utils/types/arrow.py,sha256=zpklt2Bh2rFPyjI2HBjMWWmbm83o6iiksp4yj9j1z-g,1535
+sqlalchemy_utils/types/bit.py,sha256=V9TU63GCuPJGAjlDskK15kBwi2F2y_E9On34QQAY1Zs,756
+sqlalchemy_utils/types/choice.py,sha256=3GNGs0qNgO3eR0xOlYEhbMjumTKGjMB1wAi-p5UuI5k,5882
+sqlalchemy_utils/types/color.py,sha256=X5ogyU5s21wJYFhE9v_SttyYElV1BlnNFaZ2M0kTvJk,2121
+sqlalchemy_utils/types/country.py,sha256=VQpj_5zL04u1mW6g9HKPp5pQlZoHmSXwW--wjj7DGtY,1579
+sqlalchemy_utils/types/currency.py,sha256=7jab_GdPTZvaYjvsWwh8pyMj69iU2lpUwDsJy4_3YTo,1933
+sqlalchemy_utils/types/email.py,sha256=93fleQPJrvdxZH9pjdPXtYnci96qwTIwdx3sJbvZNWk,1259
+sqlalchemy_utils/types/encrypted/__init__.py,sha256=54Yf-Bd-HekcoRTJnHc5q0YVbAlJh8XMcPctgKTJGJo,28
+sqlalchemy_utils/types/encrypted/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy_utils/types/encrypted/__pycache__/encrypted_type.cpython-312.pyc,,
+sqlalchemy_utils/types/encrypted/__pycache__/padding.cpython-312.pyc,,
+sqlalchemy_utils/types/encrypted/encrypted_type.py,sha256=dUGIEqg1Jq5QPT0D1JXqaDSGD227J8rvnshO7-eEl1A,16913
+sqlalchemy_utils/types/encrypted/padding.py,sha256=roNnoiCelBV-N1-UpOrBHZpL9tA7pkokcPeSNUrhfA8,4483
+sqlalchemy_utils/types/enriched_datetime/__init__.py,sha256=OmaPAmpYTRsySUrf5V6YboLtq5cGMzjSkixzXg0g3fs,196
+sqlalchemy_utils/types/enriched_datetime/__pycache__/__init__.cpython-312.pyc,,
+sqlalchemy_utils/types/enriched_datetime/__pycache__/arrow_datetime.cpython-312.pyc,,
+sqlalchemy_utils/types/enriched_datetime/__pycache__/enriched_date_type.cpython-312.pyc,,
+sqlalchemy_utils/types/enriched_datetime/__pycache__/enriched_datetime_type.cpython-312.pyc,,
+sqlalchemy_utils/types/enriched_datetime/__pycache__/pendulum_date.cpython-312.pyc,,
+sqlalchemy_utils/types/enriched_datetime/__pycache__/pendulum_datetime.cpython-312.pyc,,
+sqlalchemy_utils/types/enriched_datetime/arrow_datetime.py,sha256=FsBohjRv800aIRIt-HCs_Hy7yV_MXYfS6fGzc9VdP2k,1038
+sqlalchemy_utils/types/enriched_datetime/enriched_date_type.py,sha256=ZcqeUk_2MqQR91pHvh0r4-bZmdeFnf49zVEIcSRnspQ,1367
+sqlalchemy_utils/types/enriched_datetime/enriched_datetime_type.py,sha256=N4BNnx4dqwbdltgxxm3GMNXvd744E2rSuTG-Iu2IKs8,1446
+sqlalchemy_utils/types/enriched_datetime/pendulum_date.py,sha256=4gWAowdqxXWxkci5iKG6UrtYdAQ7ZbM4S4Br4Su7clA,868
+sqlalchemy_utils/types/enriched_datetime/pendulum_datetime.py,sha256=FWGq--aTUDEOsjcmvSOYf3mpvQuwtUua4UFO2guJ8As,1451
+sqlalchemy_utils/types/ip_address.py,sha256=d0W5H9ICIchWfGi76hkwOCZVVBsUiFS5ZE3HzJoHZwU,1327
+sqlalchemy_utils/types/json.py,sha256=R_B-GkUwsqjsN0ncat9siWiTgITb-AS9LfLYZa5ilgQ,2123
+sqlalchemy_utils/types/locale.py,sha256=4wJJ--wNUz_4Zj7u1-QSSRk_1VaF9fN6AjEmq-EL7sM,1797
+sqlalchemy_utils/types/ltree.py,sha256=uS5Ry3GdXQzcXmYE57kCq_Orq22j_vIUSDtZLDi5UgA,3386
+sqlalchemy_utils/types/password.py,sha256=GxfkBcnndSy-ihmqoECAY2YsgGJUpqGYzILg3x9gSD4,7875
+sqlalchemy_utils/types/pg_composite.py,sha256=k6iPw3znq6U2fVhCUNykSTN4lrGpx5evxEwAfKcDQxA,10524
+sqlalchemy_utils/types/phone_number.py,sha256=RTUiZbpw06e8Rt_N6Smgkh-lSNa27GidXysYx3ODFQ8,6707
+sqlalchemy_utils/types/range.py,sha256=_nMDA-xL9rhYJby1gdLshZ8E9q2aR_rYd_8-3OrIT2A,12002
+sqlalchemy_utils/types/scalar_coercible.py,sha256=cIG3kQKMPy6tktOQmexFZ_iDYzWzz3ky_x4jRZ38VFU,192
+sqlalchemy_utils/types/scalar_list.py,sha256=ioi-hEIz6lC4E8ohQ_4SCTqvWYIHiNGxugzB3g1CeS8,2701
+sqlalchemy_utils/types/timezone.py,sha256=RvtXS8OVoQvLvJVKpN5YjID7FcURwMJ9Vouh-lxO2Bk,3408
+sqlalchemy_utils/types/ts_vector.py,sha256=WSOOGr8FXUIVe0HXhP-CSFAtCLDCyF07gMimfXQx8Rs,3148
+sqlalchemy_utils/types/url.py,sha256=Gwa05HTM1ZKOBVWVk4AZ2WcydaQTAbwwANO8jp-SFmQ,1525
+sqlalchemy_utils/types/uuid.py,sha256=NDkGm_NOcKyluKYT_tKgIWJX6WIk2kY8em-Md8a7Zc4,3297
+sqlalchemy_utils/types/weekdays.py,sha256=u0AEc_sNnRNFKBYBfupby-7j7iBC3CWo5S2JDVC8mDE,2129
+sqlalchemy_utils/utils.py,sha256=xFL2j2MxNiaKGFMrXOZsK8wMmqMItgtgSEgCExzsaIQ,452
+sqlalchemy_utils/view.py,sha256=KFXVps8dlTNizyjUyiR97w5fv6VUugVJ1SmY3pLy-9A,7020

Some files were not shown because too many files changed in this diff