From 55f2553780d7ab1378815fb162f7482a0727d193 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Mon, 28 Apr 2025 21:24:11 +0200 Subject: [PATCH 1/2] Update ROADMAP.md, remove CORS & flask-cors from app.py, and update requirements.txt: no longer use CORS for Flask-SocketIO. --- ROADMAP.md | 6 +++++- app.py | 6 ++---- requirements.txt | 1 - 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index e1d0d88..bd55bc9 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -165,4 +165,8 @@ Der neue WebGL-basierte Hintergrund bietet: - Verbesserung der mobilen Benutzererfahrung - Integration von Exportfunktionen für Mindmaps -*Zuletzt aktualisiert: 15.06.2024* \ No newline at end of file +*Zuletzt aktualisiert: 15.06.2024* + +## [Entfernt] CORS-Unterstützung (flask-cors) +- Die flask-cors-Bibliothek und alle zugehörigen Initialisierungen wurden entfernt. +- CORS wird nicht mehr unterstützt oder benötigt. \ No newline at end of file diff --git a/app.py b/app.py index 9aa310d..31c17bf 100644 --- a/app.py +++ b/app.py @@ -17,7 +17,6 @@ import secrets from sqlalchemy.sql import func from openai import OpenAI from dotenv import load_dotenv -from flask_cors import CORS from flask_socketio import SocketIO, emit from flask_wtf.csrf import CSRFProtect @@ -92,9 +91,8 @@ login_manager.login_view = 'login' # Erst nach der App-Initialisierung die DB-Check-Funktionen importieren from utils.db_check import check_db_connection, initialize_db_if_needed -# CORS und SocketIO initialisieren -CORS(app) -socketio = SocketIO(app, cors_allowed_origins="*") +# SocketIO initialisieren +socketio = SocketIO(app) # Security csrf = CSRFProtect(app) diff --git a/requirements.txt b/requirements.txt index 7917c56..bf034f0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,6 @@ werkzeug==2.2.3 flask-sqlalchemy==3.0.5 openai requests==2.31.0 -flask-cors==4.0.0 gunicorn==21.2.0 #pillow==10.0.1 pytest==7.4.0 From 7d74b5a7bfc127b4d5b1fdaa794ef76cd12d6b1a Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Mon, 28 Apr 2025 21:41:38 +0200 Subject: [PATCH 2/2] Implement Flask-Migrate for database migrations in app.py, disable CSRF protection, and update requirements.txt to include Flask-Migrate. Remove obsolete systades.db file and add migration configuration files for Alembic. --- __pycache__/app.cpython-311.pyc | Bin 71524 -> 75142 bytes __pycache__/models.cpython-311.pyc | Bin 18555 -> 24491 bytes app.py | 6 +- database/systades.V2.db.backup | Bin 0 -> 143360 bytes database/systades.db | Bin 122880 -> 122880 bytes migrations/README | 1 + migrations/__pycache__/env.cpython-311.pyc | Bin 0 -> 5096 bytes migrations/alembic.ini | 50 ++++++++ migrations/env.py | 113 ++++++++++++++++++ migrations/script.py.mako | 24 ++++ ...dd_password_column_to_user.cpython-311.pyc | Bin 0 -> 3419 bytes ...4406f5b12f7_add_password_column_to_user.py | 46 +++++++ requirements.txt | 3 +- systades.db | 0 utils/__pycache__/__init__.cpython-311.pyc | Bin 1101 -> 1101 bytes utils/__pycache__/db_fix.cpython-311.pyc | Bin 4494 -> 4494 bytes utils/__pycache__/db_rebuild.cpython-311.pyc | Bin 4395 -> 4395 bytes utils/__pycache__/db_test.cpython-311.pyc | Bin 6849 -> 6849 bytes utils/__pycache__/server.cpython-311.pyc | Bin 2098 -> 2098 bytes .../__pycache__/user_manager.cpython-311.pyc | Bin 9839 -> 9839 bytes 20 files changed, 239 insertions(+), 4 deletions(-) create mode 100644 database/systades.V2.db.backup create mode 100644 migrations/README create mode 100644 migrations/__pycache__/env.cpython-311.pyc create mode 100644 migrations/alembic.ini create mode 100644 migrations/env.py create mode 100644 migrations/script.py.mako create mode 100644 migrations/versions/__pycache__/d4406f5b12f7_add_password_column_to_user.cpython-311.pyc create mode 100644 migrations/versions/d4406f5b12f7_add_password_column_to_user.py delete mode 100644 systades.db diff --git a/__pycache__/app.cpython-311.pyc b/__pycache__/app.cpython-311.pyc index 209d477117e7a2c8ef0241a94dc5370a850294cc..491a2657bfdd85540a8b111362c701155b301b6d 100644 GIT binary patch delta 17780 zcmb7r33yaRws7Cxl5}U^7f2cmgshMNh9Fy55(p5M1cV?ooxV4nPI?K|oj_tBK~$nL zW1IqmE5U6t>?F>vP2C_})XEF}#`i$7N=|cTU~Dy(a#?{yHc3 zR-HO^&Z$$UPMxa$!}IDp-&W81XN~KUd3xCq5X@gP$2pi@1NJ6WH z4Nq~<1pcHCpL#m&DJ7J^pY-7rKtwHU3dL*M48$5_oZ&{`Dy=V_&j@WRY;M~kW?(#cHxc%5ty_dRFpNPEQT(I|MJ+ho@-U8t?BaPgaYTDd1-M$=dX2 z-XJkY@2gCo7eXU%g8rvr*#t6959Ot4o3PCl2fb|PZwRe{;m&W`1~uivw$n30>zbON z{~dmIXWp)O3SOR-3lvSaK>benl`ja?$4Z4wyM)cdMyB*xe4&LqT@fx#?QH3(bUeD1GMoK0PV^=g{60oV<9B9JG3Yxk{Zc)${)}lS4#Ss}ds?Ddr zuDEi|kL1!)yQG0o-grj@ogd3BvYeA>r-MmzuOH7oiFWodyul#6iM2x*-hF;N*ChSA z8QxE1yn@a!opeRWLS@|2y%W*o_eHcg>Tl6Kp}u+|S{#EG_v6A;aBCPpy%D%We%$?G zxCbI|kNa`^!f^W|a37Fy>CVLIng`*HEtPSHf~BUzi8=a*_&dO^9+olaKN6>Dn;wy0 z3kJfvx+|iqM`hfUyF+p1@}zr0%lRX0*iOjxSw9M9%0Fct{ErbYX;|3A-`mcDG135S zPEzk3({=L|Y~@_o_85JwHIsh*SeaU|4nK~e;S^yrpUMxOzArQs

s;1wRR6h(-wY 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 delta 14596 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 dc`1}3EdYK1f6? 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 F{tIz!_PhW9 delta 4117 zcmbtWeN0r@6`wmF%s9i$Fw7_OAt0a(C@g}ovVe$)iUP*P-4$17AM>8h;C!%m23Iz% z&}N$wV=8)07R@%Y*@Q|Z);dYMO|!La`o|`1x=cDv%uCw-vH#R`H^J6q6LpiGbB7s` zj+-`p;r+Ppch0%z+;h)4aO)m~UqE_0lpaL1Zt1^S6pD$*@VTT$PM)q)@qeRk=nR0R<&FsT6JFDMb zVmB-mFQ~y9-t5CoKx#3*$VLS=?2yW*fnC85=xR)PEAxx2zQI$$=&Y6n0&&5ceZ-ts zOWtc~-mA5c*BaY@?(l-M{%;YW-|V^V`3M{ZBXItI5!4jOLE#g4T;SiD%ax=av*p%H zW$c{VXR-5oaYMa$Bo*j7*mmQo^x|<6L3{| z&cnHC;A--mmvfte+mhp0qo!y>EinEZW8TQM>VT`ybLE`d3f#6Fr>zhhURC%T+1;XG z%As`;Qp*~3PS&OK5MydYH%tt=)sz40x{5XReUEkNZ?Pv%Gke-s!yf3Z?8recbM)4- zbA~eIn2}u`a6EOF2=7kH+CA}TREi~K z!_kC92f{HiDvZnO3HXo=tDl4Mq$C?hlQAJ04lWY<3V4EzHzXue zFdh>HI!W7s3Mv_S-NtSkJ1dOiLL%`_oQi>vkO+aUIw3_)$+{eU#kAe)0+VUQUwqAX z_NRTF8DHm&I-_$h^B;E5bf~ls6#Po6g~T<-pwNjqvsGP1Uv72eGtmTgJ9+df>jTLuT0KcFQ319K5g8bF>apjyRR?4Jksx1}dBsLYnBLxGkkwcz^f*wg&)(F2B7ZNsU??0BsT7knvA76VhGoku zjk<9q<^U@+@l?TnW`As$-aEZFt0S^yN15^uDmK+V3L(wF>trhj&8a8O>qIT7=bbPD zoK-H#HHOv8pE2B+Ka%zg9|Ul4Y3|3!db&19$^Fk3!4S2K9h;Ma6yS7By z2y3qFw}7T;-FzusH($zgmOiU!Te3f|JyIb$Ad5~KWoh@}of3HKqhUaL3gI*Yjv!ix z5JH$h*p1Kw;MdSz_{HAw`1azY;1h(l;p!~H9)v~!*%+h}w4(_9fys^lH|VdVW>hFa zupq=)Wv6TE2rkDF@ZRX#2oxcKa1=n^09`&lF&YU6>FY>hhtoF@u)S##;F-(O$v{|? z4MFgKI!^I}@;dOK775Y{H1Q(f8RSmwxBzvLOwdZ?P9mqzg+DsEzEGm5gfI+m;>Rgc zUQC#?;)jOm{^|Z~u|!j!SA4D1&`!``UsfH|u4bC;sxBu{7O3{O=Tn-^8BgIZP?xo< zgN0_x+VkJ143j|p2nA9k8~Fr`#>Mcduq0-)s>iI-FpNVfn<1W$;%uT|P6TfZuiHI%vefo=Ngm8iV$^S=k zkN3B$p`Bl8~=qv2A7BAV!zGyjIlx?R}&yEd* z^sz&&0{Jbw-MUZhC-eaOsb!VhW z{HvXyl%?Cs8oseKvZ>)662Q}Z#C$KeZd}0Sx-9W3MYxfA`{jQU$PQlHx7&9p$u*Yh zXe43wdBrcA= zLC73i?B0p4yBq2tTYQk<45A+)WP`C445pmtr3%$}-`v2}n$XzzZg-1p3IvkEXhaGK z^mHN+$cEU3s_R0WLk?k?rFMTo=2G)LkfaXAdaJhbg63t+XKTJ#2K}W4Lp#VvAzmvV zZuD7@YvMyGPaQArb=;Qr<5tVq;wBd?h4nIEk`g|mhbsaEvCL&T7y$8zBKZ?X5c57rT zRd@XFWXehKKY+qGvvYRzYUm-CK3c1@-9Y-msxZ#bi{~D4*`u`@ZZGKpn{`;eO3iM% dTKkX-AFWmCU^h-UQa?G-McD688Z>!kny diff --git a/app.py b/app.py index 31c17bf..099f55e 100644 --- a/app.py +++ b/app.py @@ -18,7 +18,7 @@ from sqlalchemy.sql import func from openai import OpenAI from dotenv import load_dotenv from flask_socketio import SocketIO, emit -from flask_wtf.csrf import CSRFProtect +from flask_migrate import Migrate # Modelle importieren from models import ( @@ -42,6 +42,7 @@ app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{db_path}' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=365) # Langlebige Session für Dark Mode-Einstellung app.config['UPLOAD_FOLDER'] = os.getenv('UPLOAD_FOLDER', os.path.join(os.getcwd(), 'uploads')) +app.config['WTF_CSRF_ENABLED'] = False # OpenAI API-Konfiguration api_key = os.environ.get("OPENAI_API_KEY") @@ -94,8 +95,7 @@ from utils.db_check import check_db_connection, initialize_db_if_needed # SocketIO initialisieren socketio = SocketIO(app) -# Security -csrf = CSRFProtect(app) +migrate = Migrate(app, db) def create_default_categories(): """Erstellt die Standardkategorien für die Mindmap""" diff --git a/database/systades.V2.db.backup b/database/systades.V2.db.backup new file mode 100644 index 0000000000000000000000000000000000000000..063f9e9d5c620e4ecd01152f530e2491ddc73753 GIT binary patch literal 143360 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 literal 0 HcmV?d00001 diff --git a/database/systades.db b/database/systades.db index 8a04d1cd31dfe9793a92ac0f8e01b25fd9244157..6a14d3c0c00fda3a88f550c47924a5e1cc8f0733 100644 GIT binary patch delta 2230 zcmZWqYit`;7M_!_J$}wjoVrdrq;V9|2hXfzo zn7MNv-}%mWjxTKrmo|mJNNw#L$L(dG?N|KTp&@p7cvzlsT!-?=$9C{noP#y{5TjCR9UJS+l8Pj5Y(Ql$}MAhg>G#2?N@^oY_(i8q_y?#Ah z8%qe>y%|Y@Q`oX^zG>)0Q8i5HaaFctjbaOv5;kl_l~*V>dWQ!ynf$+K4*2Cn2#dc~DTdJ%xcwV4MOza)G6|>A@ zQu~i>0(WpkItb%LFJhyJQ!`b=uF*weSFx@)Zt03?xd`&PBg5Gvtjr1nK+^@QYOCVD zR)I_QF#NMsn`kq-Y?L$>f;O$o?13TRxEhwr*R;ULzwS+AVZ~N5b zbip(=aat5ONtSxJnVUCQNbF+U0^=2>Rdp7}!DfSZk1(RHmwWc(I}&6$kl>nmMpnkCfKSPr3G_^ zo|7%iSUg7*O=m}*uji_mMI6pW1a2%Nb*-W0j{a$bGMuhzC{E4FEG1#WXnI&?!KC5S zVb)YE^>J$-8vAQrjalOy>kEs%)4EI)%VZ%c(;-&YY1Y4K!)=mGiMB*+MnFTGsUo&g zIhl#zamKk-U=nt54j&yKA3e%S)a42_D`^+5|NbBgH6rbYS(&Psg&HPWwqR3F@TmoA zRW+AvruJ=bMb?$7E>qL;4+{dB|C_{j+|7>r)tsU1oPJN9>EFqPxs_E)%B3>b#?(6Qc_u2upa#>vicOa3q$@m@+D>iJ)SH0Hd8y` z+O<>;yOU`*ohp|3XROe4k;tw#GA+zCBc(%msuFG1v}B!l>Y8MdDcUz*WQ8}K3o@G) z1*dIBB+dbA{eslRol=Qz+Ga&1xOwRYvDdDe!bz|28Pm9kD|BZpcPWI~_DhKGaN^JC zIW#DKjNV6Iqf6o!XdgO*I?xyBDiXza(D&#SlokJrD(KDi`meaUcl(33h4^G+A+)-#w?`gDcnP+KSrqvmZyNVB#xdrGxpT&% zYtdz?7IE{P!HQ}$wp`eCZ0bGa-fnA_Xu&Ao#kN_)R0#8(Te1tZ@_n##Hv9>`AO24u zJ{P&yc;3BYeQYOMi^%ten$5tmH(>ME?&m*g-F{cDZ$fJt{m6;@%bfTO`WU?wJ0>nh z{vJLbyd``YxZ*GS@8N&qUxr)!6i47W^y9Vqm=A8j$a;MUS_1j?y3i7s69Y-*56-J| z(BZ%Y4EoS&I_8W{z%dXVIsxAWve7{DY=6Vzg(chej*$7Q;>l@AtBk>372KhgsK*ni;eHF^Vww@I5j>ucOsuX>6~ANLr#4TF1-M+ zr}hV*G;pU0ob!~ z_zXM-jDo9Y;eMZV`QUEn^RsXWIvw_4_eRGer~nD4z65te$Hq%b@Gsz3&$m18Kgd`} zIJF0$a|1mD_dy`LYn!bu=fwx1JF+|S9v5_zPRE_>!!YG*Uma|7z8{Ap5O)q7hhL!8 zdG`_cldo;{5#&6RgA?q)4e0zY2S4~+$7}Wc#=@iUS_{9L?R4IqhdprD#=qxbAHcRO I?rX^6H!qy10ssI2 delta 3504 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 literal 0 HcmV?d00001 diff --git a/migrations/alembic.ini b/migrations/alembic.ini new file mode 100644 index 0000000..ec9d45c --- /dev/null +++ b/migrations/alembic.ini @@ -0,0 +1,50 @@ +# A generic, single database configuration. + +[alembic] +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic,flask_migrate + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[logger_flask_migrate] +level = INFO +handlers = +qualname = flask_migrate + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/migrations/env.py b/migrations/env.py new file mode 100644 index 0000000..4c97092 --- /dev/null +++ b/migrations/env.py @@ -0,0 +1,113 @@ +import logging +from logging.config import fileConfig + +from flask import current_app + +from alembic import context + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) +logger = logging.getLogger('alembic.env') + + +def get_engine(): + try: + # this works with Flask-SQLAlchemy<3 and Alchemical + return current_app.extensions['migrate'].db.get_engine() + except (TypeError, AttributeError): + # this works with Flask-SQLAlchemy>=3 + return current_app.extensions['migrate'].db.engine + + +def get_engine_url(): + try: + return get_engine().url.render_as_string(hide_password=False).replace( + '%', '%%') + except AttributeError: + return str(get_engine().url).replace('%', '%%') + + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +config.set_main_option('sqlalchemy.url', get_engine_url()) +target_db = current_app.extensions['migrate'].db + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def get_metadata(): + if hasattr(target_db, 'metadatas'): + return target_db.metadatas[None] + return target_db.metadata + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=get_metadata(), literal_binds=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + # this callback is used to prevent an auto-migration from being generated + # when there are no changes to the schema + # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, 'autogenerate', False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info('No changes in schema detected.') + + conf_args = current_app.extensions['migrate'].configure_args + if conf_args.get("process_revision_directives") is None: + conf_args["process_revision_directives"] = process_revision_directives + + connectable = get_engine() + + with connectable.connect() as connection: + context.configure( + connection=connection, + target_metadata=get_metadata(), + **conf_args + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/migrations/script.py.mako b/migrations/script.py.mako new file mode 100644 index 0000000..2c01563 --- /dev/null +++ b/migrations/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/migrations/versions/__pycache__/d4406f5b12f7_add_password_column_to_user.cpython-311.pyc b/migrations/versions/__pycache__/d4406f5b12f7_add_password_column_to_user.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb1e7e0ac7745655e5df1b04a61562bd12367a25 GIT binary patch literal 3419 zcmd5<%}*Og6rZ(?{k+5hLYlP6wsiwaV;VkUNQh8W2?C~33nYd>ph;G1&w@?YUUzqa zCTb-P{R?_Y4yhFNK#OpsMlw>5xg_Ga8?D-CuT>A+sM14}Q{ULwi}|Q%%Atez=QnTO z?3?%e<~PHSp%727t^8V-`p!?t@2pd9o=xFp4+{4PB~yfQ)T3}2&yH31I(Qr~#<}%r^p@!#lS>yS*JfGIn zYBqeOzb8z)x;idQpHG~NPIs3^WW6WMU)E&Fki-25J>h6a^n7baS8McQIC`!pdZDMY zyRECU<6^Xv=hxYyBb?(=bHmP|t#3aEh(RP?@l%@X=rasByeAP-A8bEPu7+JgJHzJpc1 z@fR+&CHz_`cL?S4wM&?d6_$}=`;T4^Re5zI4(*6|Kc2T_wY)w;=;2+~xVvTDzAfwb zZP~DI%Ol$@Defdns;dfj6B#8<GQHCQh8dMQw%4V)*SJ>H&DGje-U)#P?6&$lng2|aDd?V0q9CK<>edOHTls6=nyy7O_NRIDt& zv=GryMV8RE+#M${m%|rOSv!Sp8u8I{=x~wz5v;X?@7|yOY0L~ptzgs+MmGr5eE4(f z1=RlrC!fQ~@B1EHc{sazst|e7X+{UF=%5`PG~*LyN;3uB5_B683>yp+jOtlmtVRnx zk1rK2tu>p%h$W2Jh;Y@0t0r8nHl2Qy$ftkN%(gzOtRSU)P&LE z4BhL)lFG&#)dN{oN;wGEI4h$X%kLw zG+^|_6cpi4mW;m`xVk;1SFc{}IaVCdk6`BS^@j(1-lsm_00f@aa)?RPR$7I&FJi6z ze`q@&I8ge8D*D`uwEYL{wfd-VNt@q6+6V2qwkqBViElfk4%%z=AqC|cdjqemDt9y* z+D`mx)ccCxXU^ zQEOmO$AB#`!WTJTdz&fVVQ_-MNdzY_-W$LCNpBq4ePrabfnGeo#s+STIndubHZXQ& zXh3_9*}jiZqIc~BHZ4fig=~q9Td>a{dnKEsxI@&aNFbg<(q=wh>{(h7l7+s!i2Zt#Eg((d-_wx`*uU zA@jyfQ@CXbw`@eXZNqI7ZdXr{AI0+%%ai%ZC;0Z5CB$q*7_?!~gu!Z4Wwo#H>Eofo z&|1GKT(g90HX_7rh?@{Enid%z<7l>_*@R|S_qhcT8zLq|T%F72jJYF>W=p`BJHnWI zi_RV0CT%kJ-liqy9{4C$=Y3Y^i!}zG9pexqwN5}3shSi;Cm<({{uK7_WO%&H=#*cyiVX1Mpkr(r*cltQe9ND#lu=-HL^@zB9dbLyoO5| zmCh;h$66Qa*u6o|AZ&O!j@$6~Io}3haF}q%O>%7O=LJE{=4S)Qp%aVnqW!oQK*i3I>VTm@VJ delta 20 acmX@hah8L7IWI340}zN?@onUGVgUd#q66Xp diff --git a/utils/__pycache__/db_fix.cpython-311.pyc b/utils/__pycache__/db_fix.cpython-311.pyc index 67f0fef792dd938ac91ceca3d56b671d58efa04d..fe2d90bb1e0dfba9bd7db298bdb27317b4291c34 100644 GIT binary patch delta 20 acmeBE?o;Mo&dbZi00iHz@NeX976bq`T?JwQ delta 20 acmeBE?o;Mo&dbZi00cX=_%?Dk3jzQzu>^Vm diff --git a/utils/__pycache__/db_rebuild.cpython-311.pyc b/utils/__pycache__/db_rebuild.cpython-311.pyc index 21d2918e25dcd60052fbc6c223c9e369852ff916..a059a74c8178c14e1bed5292a6ea569beb0fb2a8 100644 GIT binary patch delta 20 acmZ3jv|5RKIWI340}y<>!oQJQK@b2r!38$} delta 20 acmZ3jv|5RKIWI340}yap@onT*5Ci}(r30@3 diff --git a/utils/__pycache__/db_test.cpython-311.pyc b/utils/__pycache__/db_test.cpython-311.pyc index 5a6f57789e1919b8973ee6cc5bd28df269081f7b..9fc961e8b72f292cf3c7382b5ae8f13a58cf3b97 100644 GIT binary patch delta 20 acmX?TdeD@6IWI340}y<>!oQJwn-l;*<_0JL delta 20 acmX?TdeD@6IWI340}$-g;@il*O$q=zIt4%g diff --git a/utils/__pycache__/server.cpython-311.pyc b/utils/__pycache__/server.cpython-311.pyc index 8916ed1d7f8559f6810d545a335962c5cbf3b2f8..9e1d591b627992c09cb81a2b449a557da6be0103 100644 GIT binary patch delta 20 acmdlaut|V>IWI340}y<>!oQJQodWIWI340}$-g;@ilr&H(^2oCG%j diff --git a/utils/__pycache__/user_manager.cpython-311.pyc b/utils/__pycache__/user_manager.cpython-311.pyc index a1b3930c2da39e28845c705ebe0322ad743d29e3..40def1de3429b20b44768d23ecaa05dcf7b3e2b2 100644 GIT binary patch delta 20 acmaFw^WKMhIWI340}y<>!oQI_MGXK-UIuIc delta 20 acmaFw^WKMhIWI340}$-g;@ilbq6Pp&vIT?y