From 53276f6a0150bd97954c45aa22235949093b9178 Mon Sep 17 00:00:00 2001 From: Luca Benvenuto <20568758+lucabenvenuto@users.noreply.github.com> Date: Tue, 30 Jul 2024 13:30:43 -0300 Subject: [PATCH 1/5] Add pre-commit, set up ruff, configure pre-commit hooks for ruff and mypy --- .docs/images/pre-commit.png | Bin 0 -> 32835 bytes .flake8 | 6 ---- .gitignore | 3 ++ .isort.cfg | 3 -- .pre-commit-config.yaml | 27 ++++++++++++++++++ README.md | 27 +++++++++++++++--- mypy.ini | 7 ----- pyproject.toml | 26 +++++++++++++++++ requirements.txt | 1 + scripts/format.sh | 10 ------- src/admin.py | 4 +-- src/alembic/env.py | 6 ++-- .../versions/2023-07-12-5d07fd610995_.py | 2 +- src/api/v1/routers/item.py | 4 +-- src/controllers/item.py | 4 +-- src/controllers/user.py | 4 +-- src/core/database.py | 12 ++------ src/core/security.py | 16 +++-------- src/tests/test_user.py | 12 ++------ 19 files changed, 97 insertions(+), 77 deletions(-) create mode 100644 .docs/images/pre-commit.png delete mode 100755 .flake8 delete mode 100755 .isort.cfg create mode 100644 .pre-commit-config.yaml delete mode 100755 mypy.ini create mode 100644 pyproject.toml diff --git a/.docs/images/pre-commit.png b/.docs/images/pre-commit.png new file mode 100644 index 0000000000000000000000000000000000000000..b3298700fb92537a87a5ff8ffa112f7a98d0043b GIT binary patch literal 32835 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 compares the actual status of the DB against the table metadata, and generates the migrations based on the comparison ## Code tools + +### pre-commit +Install `pre-commit` via `pip`: + + pip install pre-commit + +Setup the `pre-commit` hooks, specified in `.pre-commit-config.yaml`: + + pre-commit install + +Ensure everything was set up correctly by running the hooks: + + pre-commit run --all-files + +![Screenshot](.docs/images/pre-commit.png) + +#### Adding hooks + +You can add new `pre-commit` hooks by editing `.pre-commit-config.yaml`. Whenever new hooks are added, you must run `pre-commit install` to ensure new hooks are run on commit. + + Linters, formatters, etc. - **Pycln**: Formatter for finding and removing unused import statements. @@ -49,5 +70,3 @@ The template includes an admin interface via [SQLAdmin](https://github.com/amina *One note: You should be careful when adding relationships to the list or detail pages (specially large many-to-many / one-to-many relationships), because it's not very optimal in terms of DB querys in those cases (all the related objects would be loaded in memory).* ![Screenshot](.docs/images/admin.png) - - diff --git a/mypy.ini b/mypy.ini deleted file mode 100755 index ba46814..0000000 --- a/mypy.ini +++ /dev/null @@ -1,7 +0,0 @@ -[mypy] -plugins = pydantic.mypy, sqlalchemy.ext.mypy.plugin -disallow_untyped_defs = True -exclude = src/alembic/ - -[mypy-bpython] -ignore_missing_imports = True diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..87d64ad --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,26 @@ +[tool.ruff] +line-length = 130 +force-exclude = true # Ensure exclusions are respected by the pre-commit hook +extend-exclude = [ + "src/alembic/versions", + "__pycache__" +] + +[tool.ruff.lint] +extend-select = [ # Defaults: [ "E4", "E7", "E9", "F" ] (https://docs.astral.sh/ruff/rules/#error-e) + "E501", # line-too-long + "I001", # unsorted-imports + "I002", # missing-required-import +] + +[tool.ruff.lint.per-file-ignores] +"__init__.py" = ["F401"] + +[tool.mypy] +plugins = [ + "pydantic.mypy", + "sqlalchemy.ext.mypy.plugin" +] +exclude = "src/alembic/" +disallow_untyped_defs = true +ignore_missing_imports = true diff --git a/requirements.txt b/requirements.txt index 6ff6e2e..8f3322e 100755 --- a/requirements.txt +++ b/requirements.txt @@ -50,6 +50,7 @@ pyxdg==0.28 PyYAML==6.0 requests==2.31.0 rsa==4.9 +ruff==0.5.5 six==1.16.0 sniffio==1.3.0 sqladmin==0.10.3 diff --git a/scripts/format.sh b/scripts/format.sh index ee3b6a6..e5a61c7 100755 --- a/scripts/format.sh +++ b/scripts/format.sh @@ -1,14 +1,4 @@ #!/bin/bash -printf "Runing pycln...\n" -pycln src --exclude __init__.py --all -printf "\nRunning isort...\n" -isort src -printf "\nRunning flake8...\n" -flake8 - printf "\nRunning mypy...\n" mypy src - -printf "\nRunning black...\n" -black src --exclude alembic diff --git a/src/admin.py b/src/admin.py index 11b3e34..294629e 100755 --- a/src/admin.py +++ b/src/admin.py @@ -29,9 +29,7 @@ async def logout(self, request: Request) -> bool: return True async def authenticate(self, request: Request) -> RedirectResponse | None: - failed_auth_response = RedirectResponse( - request.url_for("admin:login"), status_code=302 - ) + failed_auth_response = RedirectResponse(request.url_for("admin:login"), status_code=302) manager = AuthManager() token = request.session.get(AdminAuth.cookie_name) if not token: diff --git a/src/alembic/env.py b/src/alembic/env.py index 6eaa610..2c658e0 100755 --- a/src/alembic/env.py +++ b/src/alembic/env.py @@ -1,8 +1,8 @@ from logging.config import fileConfig +from alembic import context from sqlalchemy import engine_from_config, pool -from alembic import context from src import models # noqa F401 from src.core.config import settings from src.core.database import SQLBase @@ -59,9 +59,7 @@ def run_migrations_online(): ) with connectable.connect() as connection: - context.configure( - connection=connection, target_metadata=target_metadata, compare_type=True - ) + context.configure(connection=connection, target_metadata=target_metadata, compare_type=True) with context.begin_transaction(): context.run_migrations() diff --git a/src/alembic/versions/2023-07-12-5d07fd610995_.py b/src/alembic/versions/2023-07-12-5d07fd610995_.py index a68bfe5..dff84a7 100755 --- a/src/alembic/versions/2023-07-12-5d07fd610995_.py +++ b/src/alembic/versions/2023-07-12-5d07fd610995_.py @@ -1,7 +1,7 @@ """empty message Revision ID: 5d07fd610995 -Revises: +Revises: Create Date: 2023-07-12 18:37:52.159059 """ diff --git a/src/api/v1/routers/item.py b/src/api/v1/routers/item.py index 1282d6f..e6fa142 100755 --- a/src/api/v1/routers/item.py +++ b/src/api/v1/routers/item.py @@ -14,9 +14,7 @@ @router.get("", response_model=Page[Item]) -def get_items( - user: User = Depends(get_user), session: Session = Depends(db_session) -) -> Any: +def get_items(user: User = Depends(get_user), session: Session = Depends(db_session)) -> Any: return paginate(session, user.get_items()) diff --git a/src/controllers/item.py b/src/controllers/item.py index 5a80aec..7ce94b0 100755 --- a/src/controllers/item.py +++ b/src/controllers/item.py @@ -7,9 +7,7 @@ class ItemController: @staticmethod - def create( - item_data: schemas.ItemCreate, owner_id: UUID, session: Session - ) -> models.Item: + def create(item_data: schemas.ItemCreate, owner_id: UUID, session: Session) -> models.Item: item_data = schemas.Item(owner_id=owner_id, **item_data.model_dump()) item = models.Item.objects(session).create(item_data.model_dump()) return item diff --git a/src/controllers/user.py b/src/controllers/user.py index 741efdc..3bd57aa 100755 --- a/src/controllers/user.py +++ b/src/controllers/user.py @@ -19,9 +19,7 @@ def create(user_data: UserCreate, session: Session) -> User: @staticmethod def login(user_data: UserCreate, session: Session) -> User: - login_exception = HTTPException( - status_code=401, detail="Invalid email or password" - ) + login_exception = HTTPException(status_code=401, detail="Invalid email or password") user = User.objects(session).get(User.email == user_data.email) if not user: raise login_exception diff --git a/src/core/database.py b/src/core/database.py index e16cf8b..8bebd70 100755 --- a/src/core/database.py +++ b/src/core/database.py @@ -68,9 +68,7 @@ def get(self, *where_clause: Any) -> _Model | None: def get_or_404(self, *where_clause: Any) -> _Model: obj = self.get(*where_clause) if obj is None: - raise HTTPException( - status_code=404, detail=f"{self.cls.__name__} not found" - ) + raise HTTPException(status_code=404, detail=f"{self.cls.__name__} not found") return obj def get_all(self, *where_clause: Any) -> Sequence[_Model]: @@ -96,14 +94,10 @@ def create(self, data: Dict[str, Any]) -> _Model: @declarative_mixin class TableIdMixin: - id: Mapped[uuid.UUID] = mapped_column( - primary_key=True, server_default=random_uuid() - ) + id: Mapped[uuid.UUID] = mapped_column(primary_key=True, server_default=random_uuid()) @declarative_mixin class DatedTableMixin(TableIdMixin): created_at: Mapped[datetime] = mapped_column(server_default=utcnow()) - updated_at: Mapped[datetime] = mapped_column( - server_default=utcnow(), onupdate=datetime.utcnow() - ) + updated_at: Mapped[datetime] = mapped_column(server_default=utcnow(), onupdate=datetime.utcnow()) diff --git a/src/core/security.py b/src/core/security.py index 09451a7..f4a1f43 100755 --- a/src/core/security.py +++ b/src/core/security.py @@ -38,16 +38,10 @@ class AuthManager: accept_header = settings.accept_token @classmethod - def create_access_token( - cls, user: User, expires_delta: timedelta | None = None - ) -> Tuple[str, datetime]: - expires = datetime.utcnow() + ( - expires_delta or timedelta(minutes=settings.access_token_expire_minutes) - ) + def create_access_token(cls, user: User, expires_delta: timedelta | None = None) -> Tuple[str, datetime]: + expires = datetime.utcnow() + (expires_delta or timedelta(minutes=settings.access_token_expire_minutes)) claims = {"exp": expires, "user_id": str(user.id)} - token = jwt.encode( - claims=claims, key=settings.jwt_signing_key, algorithm=cls.algorithm - ) + token = jwt.encode(claims=claims, key=settings.jwt_signing_key, algorithm=cls.algorithm) return token, expires @classmethod @@ -65,9 +59,7 @@ def process_login(cls, user: User, response: Response) -> Token | None: def get_user_from_token(self, token: str, session: Session) -> User: try: - payload = jwt.decode( - token=token, key=settings.jwt_signing_key, algorithms=self.algorithm - ) + payload = jwt.decode(token=token, key=settings.jwt_signing_key, algorithms=self.algorithm) token_data = TokenPayload(**payload) except (JWTError, ValidationError): raise self.credentials_exception diff --git a/src/tests/test_user.py b/src/tests/test_user.py index bfb754f..28f508a 100755 --- a/src/tests/test_user.py +++ b/src/tests/test_user.py @@ -47,9 +47,7 @@ def check_me_response(self, response: Response) -> None: @reset_database def test_signup(self) -> None: - expected_expire = datetime.utcnow() + timedelta( - minutes=settings.access_token_expire_minutes - ) + expected_expire = datetime.utcnow() + timedelta(minutes=settings.access_token_expire_minutes) response = client.post(self.SIGNUP_URL, json=self.TEST_PAYLOAD) assert response.status_code == 201 data = response.json() @@ -74,9 +72,7 @@ def test_signup_dup_emails(self) -> None: @reset_database def test_login(self) -> None: client.post(self.SIGNUP_URL, json=self.TEST_PAYLOAD) - expected_expire = datetime.utcnow() + timedelta( - minutes=settings.access_token_expire_minutes - ) + expected_expire = datetime.utcnow() + timedelta(minutes=settings.access_token_expire_minutes) response = client.post(self.LOGIN_URL, json=self.TEST_PAYLOAD) assert response.status_code == 200 data = response.json() @@ -126,9 +122,7 @@ def test_me_unauthenticated(self) -> None: def test_me_bad_access_token(self) -> None: client.post(self.SIGNUP_URL, json=self.TEST_PAYLOAD) client.cookies.clear() - response = client.get( - self.ME_URL, headers={AuthManager.header_name: self.BAD_TOKEN} - ) + response = client.get(self.ME_URL, headers={AuthManager.header_name: self.BAD_TOKEN}) assert response.status_code == 401 @reset_database From a5cd2cb8469e30bdfe34fad4e8d2b1feebc30b79 Mon Sep 17 00:00:00 2001 From: Luca Benvenuto <20568758+lucabenvenuto@users.noreply.github.com> Date: Tue, 30 Jul 2024 13:53:03 -0300 Subject: [PATCH 2/5] Update README with new tools --- .docs/images/format.png | Bin 36360 -> 25083 bytes .docs/images/pre-commit.png | Bin 32835 -> 23889 bytes README.md | 10 ++++------ scripts/format.sh | 6 ++++++ 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.docs/images/format.png b/.docs/images/format.png index 409de27949c95a333075a0006cf9410f845fdae9..7dd3784e294cc10e943b7bcf927b1731a6fc1926 100644 GIT binary patch literal 25083 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
  • wbu*CO$$Q-|y+@8@c+i+y?6 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 literal 36360 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 z EFYkBtM*si- diff --git a/.docs/images/pre-commit.png b/.docs/images/pre-commit.png index b3298700fb92537a87a5ff8ffa112f7a98d0043b..32a203f4a3f37bb3c8edf678c109fe2f8bc6525a 100644 GIT binary patch literal 23889 zcma&O1ymMWz%~jw(j9_yH$(=sFf)5%&)&12+I*0gl|V+oLx6yQKz{RDR1pFKDiBx?1Hl6SU-^W5fq;NiHWv|* zec5O^qo`>K- ze2D}vITBG^e-%$*v5LeUD)t$_XEm{gHyE zNstJWgTWxmDt5@Ex3$sIBZ=lnVx#z5-Y2j3Czwbr9L-}qI37V?WMsxt__S!JI+CZy zmls)_2=RJ)S!Q~&F3fNys|+S&Gf!cLU+OJ)8KK$hvo-_OtZJbx-+-`hi zzmDJr)}J;rl9Bv6#L1G6OkGBvM8wv?n1r2yiGhiXAAy8~gxA5ygj-Qm{C9ESH$E~m zCnq~@Mn+dxR|Z#B23rSHMrJN9E=DF6Miv%&;0St0cN-@IH+maK@_$b9=RBguj)o5A zc24HDHY88yHF#_5?8HY#_H?0t|NV2H#%|{SUCGAr_hSJM$oRB}k(q&s@!xX;MR}jL za?6{$8Cz+Hnp*?a16+fjnU#z8*YW>r&wp3^tEBpWCD~uS`n%*`d;ZUoDvrhuBDU7R zC7t;Hdo#Za|Go2fL0-nEC;zJ^{;B3)TY-A!N8n}r_nq-02t;R3LO=*Yyb%>rc7r_7 zfp^0&{?70`#ttvWjw&z(0v2{%9!*<;0S#M6R7_35shLPeryJ2(g%{G*xmjIEO@r}F zOj8UqUY*^5+oH4^B+=s@TPkJhB}an_xkpZ$LD%6uczuD-6VdSHHU`DcLvB@EgS`tLYMp=CM=LC}iE14Q2e zB9#9-5)u&TX`wF#3P#2kKWu&UsS(+^n77TZUGylPD{U;IuhVVzP_cfa;={L<>WETf zIX&zK!!T3GU(uYhmnV}FGihq9qKbRksF7Wb_RkF!%z-AVwH6~dehBio9#mN>QtY)n zK6v7BJ5eJOa7J&AWav>$s}o|K|7<+`&hT(Y>~poE_>GWBAHsU3!tdhef>zN_D~7t8 z-D2~rqZL?aRK7E?_59bNI+r32yarD9(;<#R_tVXyjhpkmot^xQi#_A>YnAmopV} zhlt2~BpMahuh`Nl>=6$~!2+XH8D4MUgOr+$slqyn%Nis78`862q4{0E1ydksia>Jl@XXF&)N#hvJ4G4}kYhscT2|f6Oy(LDCFR@{+(92E ztLbnKaOX-R>3j#tvr}oFKkFwd3`FMH3-%YAdAhs0u4)_|eSHY&7@j|WJ~2b0@7J;7 zkKyCDQP=Y$jmK40Wo&E=nqX*ExqM!j^=icTK}ip$ug!H`1eyu0^=l16?2C~GyibK1L{aNv)XH8dnde(TDry1z~&80GA{6l0-76EYER zA}lgqPMN^XHo2H=xMT`C&s|R>VewDT!9?aB5Ua^xCeUhy7P1#k4V((PVjF)pd^=?A zRc=!?RQsS*oMr#G>8tn-*$Ak~vq9F8f>ZsBj3TGw&9l3f;~xC?g?ODCTU+B19E;m; zjm*jZ>4WkrXcZG+|0X}twsnk9I-Le(bNW|rM!mE8$JU<V13h z%3=L=w!qvwI|Jf{B9-FpZfw05`&!T+oE?381hJ^>z;%xgw>uMsO0O)Z=scGF;I>ak z1gJ{mpRK^s+#UB4n|B1lTcnXhW9xZU-V9cJEpL6$O!5%IYrWpYmoy}EYY)Qap4!`Z z2f^P1jia6dV|3XLNBrud$S-6SkI~F%A(YU^rU!K4Rkx$H$W9_avPDuBC2)bWk`a%1 zd!{fV?B44#PP~N6i>{%ev3uIirTfT~6dvFW6ms?Ov2D3F35|-%FK@XC{aLq$axFU7~THtw_B zv_9Snv_6o)&cwo817Dqqv7Zllav3&>4k~N!YUAQC8g}whFlJM^ooVT{>*QvX*+9!bH+ZN89@9R++kVXtZM!>Q|u)jow6o$G&diEbgE`1v%k3Xw@Sm_v%>G-RVWjqkcF!v zza4rqmKY!U0BpJ`M3#b$X+7UuvoLS3)6JoAnTfHThj%b`@RW1aksdOzL)MjYXzEGL zs+aq-*{{S#@hsXG<-o9@i-aA=d=D_+srTMRyfaeQ$N{g*NbmxV?3D=m-q|&Tmf3Qq z7<(9H|7Ml^NZM5JmPqV_JkU56cdol}Mv;W^@9$1W(D{S)5=G@!e02p;#C{KiMT}4h zfnZI}*TvwW((Qnj(Lo)Lo!mfTuSCI5r$jF)_`e6sGsRNLT_k8UX<56WqN1wNTlaEA zzyv=}bbk5L3I$ZcE`>kdP$yu<6#(Bej;B)0p8P5R12(j5d_#7QwAiEA{@e}IySgii z3cd-o*!>_KwfLd|2~U&iE^W6`?fLD?toCjfzrMcLxml&4{U0TAOH#Q6I=ro;{BIeV zUd@i~UhXcW3>zZ1x=V@WmdLiff=MQ+Bmz@@F{J`=r0VIn@acT62{GwS2u;QxNz<5zSMnAMMSpNP zpV10yP9=$O+!|K-h9JIN*^BzU%2-MuqKtOER{z}Pbgu=|zB+kn=(KoCybiyqto6Yo zSEZXsZ<*}RH;fMrBneu{olkkZ?S*~FmWaApAOwX>g=}ZnLk>1Dy%drPX|Y2Zt8zKe zG*N3tjs79oYr4UiWWo7}LuEK*j8v>;qd-qWK96dpPvfdl zw}BVYA*P`9u{LIp#J?L<6g29-Wmt`Hw|zgi`Ybrmj};jDg`A7PxilO16scw?u> zq_f6@IN}>}%|o;rlUx5AhhPelP?H93q6UHk*V0@UkF|R*Ozg-=# z!83N*vDz*_0-#HUHNSGK&&G=no4prqxO6Wy@@lLX)|Zpv-4Pj9wu`_0?w*sc?EU4z zyhJRejADAWnznt=K%GC^yCWg_;0o5QG}m;GETm*yw>z@^a4goy8*SpTo?QZgvr#v{ zb#p)1=eOM?N7R$^@L)}l5uAYy2}#wQ{cFs)V`N$G(RZsE@J+9T#yXRxOTWo(9UG!> zA`fv0Z!J6eWy7Vjxh29Ov~XmLM<_1VwM|Kb#-qu6QMGL?s%Q# zfI^0lA0#gz(0B{yS4`b*8g>X>4rFR-{YaXYmVI z7o>xr*>Lyf3vGb}(%A)9`)|xn8`;)!DXwyiImcMuZ=Es6u{_7ri}n3)To2&&aPdq6f{0d&Pk|l#`wDGo`k$j7v}_v%l=H}@JrQu=hgwv zC!i8o7Zfs%Lp{QOTY>-+sNEMr4lid#RjDNaWl9b`w1bedU#(h*{fCCoqWe`)G#0q$ zag-j=plE)a40UXDwRr6$t86T*RaVJ|{z+lr=!Kf$l{rWV;|$UMYPmFQ5UByFSN=up z7dB<1HqBFR+PB`amv3u)y87{%-$Hxe?Bt8v{nTGmKS!PVN;Yupu4C5@lORIs1@4$3 zISZXXdf7gOO26|Pz*nY9A^aggeyqrTfd};%wLYy4r6EmZCxdg+>F}v``WlK+ySM;)}<#qu#pDS#MXZ8%){#rqhtr#!50TRpk8?-v1h?`-j&Ri ze&6H^F9o4Kns=rSLC@(M#R!#%y@dbja~BICWR{`tKZ0XVzzVRWCV{g~#{itD_VjYc z5x!60g4;H~XSsRyr`M#D+CZ;n~aqmm;x-T^OOyJf-bdBZ3^@e~f*yq)oUB~j5p+TN&2c3koR zC>AXe%V*y|`w5bnGW89dY5iV_7_i zHCipiZapU&CGb$k4fiIsE$Q`VPI74IK(J8q)?kvzVash9E#ies^amx@sprCi+n(pU zV(3(|%5K?68DgIpbS6v#q{%n0dn53JDJA_&TLG+2D-~+P;dZ3ofp{_|L5!PcVWb3! zJK^s>w0<(gv2^w=He!$|+ly2R3|GazF@1KZB|#d`n{^^0gMz5`k~Y>Ui%Xb0!<%!O{S=RARb?8LmR&QXPYJ zLu+lL2c^GEt86x9v83?c!QN!*g>L-%fiHDN%tLde#eu2tK+OEdp;^+`Ng&c5xDU_j zHR~NHhB5>)Zq9ZLa}GVu#w2KHSz^++yxLSZ-|UNtHZXFUEC=KD>gNrEe|DFfSDceJ zc9dv*F&q0VhS8q0hDBM>M~D;?a{G?6bjg-13^D(q4;85tCj_mkO<#}rgv;=eI7H)x z<>Ka0N`45~0k07=(M{{CMQ$?r5<|6q9~?G?O$QAGxwbY$r@a_}Etg)@KTit3v$UR#NL&1U@(KmGY z6W0nX_QvWvir9cOh#9_*;9^3^=Vph>xhq9h3{EC9K2wk1GU!M|Ak4S=mdU&@obI{m zUcgsL#AuIN1QQI>X9z*B5I$3@-{{WGwD1WD*xLsnacGW*u3s1y3Nhnmpi1~dgJ_)_Al zO{{fXF7qb5#IVFzj$axHAyGQg(?X+TDq3_F+!Pn!RJVf8bKv~_iVFdhM>S)4eFr*M%f$z-T zK`Y0pm!js`BoZ5ZWecO^+N>Jj?$s5bpWDg9vh1!7=D1L`fV6jz0y*309PBfH6374; zdJ&)7CSO$h=CotNd5Cuu*y@?vLCy5t`!RQ$EW-CaM=(=FhJ1)VwIdZ36{Ck- zg8YW-PVYIreP%d7ekM%vKS~%YqO|{&web9oI^KrP+9%2eO=tdaVUCOMGSNVdWm@G6 zXgVw>M6YP@jN0AYRi}D{#yrt5_$01e?FQ$rtM{f?-O}ydo3~|@v9jm4&4%e;*n)Xu z6K*5)29w{^*nX7yGI)!Sm4qY&w5Q`|#G#!c%gH6x!K#}ZZ9X>T0i~!$V9#$ApKLKx z8p+AXcMfWozP_?>6-~ zd7&*;aqaBw9yMAmo6bAyfMbSH4(KcXl&EqN zotHhfQdKp^X)8;o*NcvOseb&{MPDKJ?yG=YMm)jF%ya*%pfva_y&5Zo1GHBGQlA)d z>m9dfOEE6^6U3_AT8Tt0&j(n<^@**&cc=5y^Ld_6{B2--G+n&N4}pm@x1>9p{6)JlP|H!P-V&pYWhU9 zU@vK0z0MNx!x3CfJVc&FskN9dy&~h)@@({$NDJ}Fr9sHU7c+v9v(~6x@%E!ZMvRk1 zJ~PWUx+`x zKI(p>e14>iA~aA!io_1rk^IU~0uto2z0x)cJgNSWoF!Ku)Wu}`3KXea1%qR>IbDy< zy&zs^GE>K<8X4XLY;eaxt@Ua2VnqVv~G$NT;NR*zmuJhZ=Lp50f z54}udDy6LX^8mApw*-LPn%6P=?%iA4MPP(1)T*^P13sDKpY(hRQ+X;LQSnCA^t|JL zHl50DoHvCKsxQAmvZm~6szsk>qVWaPnD?7t$gu@4AClxz-bJ6=gV2&E-lT*gH}f1q zregetiDSxw3aGEXQ#1m|YoESL@~d%$`^Og8W{#1&wvb@X=w| zS{m7n*no1CtcsF#=l0;?lt&weB2bl5C%97iTt!VM_cauQKGb_9=(o7SPBW;fDKefn zym4G2=3&>>UU&Ue1KQUUN^*st0r6zxSX*1Wr0iho@oZe~wwpe1t+zlS8>3(7@guoJ zjFPW+xd)%0M4+kPDNJ>s-PzUkRtBbD4a+I)MK{~(g&&wf>#MX%r@=EotoF?szmwgY zw#Pr#@JEWmWfk{M0P#EoVZ3lf~UA%+};k1_=Hol<<#e(Q!6klBepv!CkE0=&>G zf75N?1u&;7r}7K@5a<|a8^^h&I`-E`2^qf`?SUsRtmO~^@%y8;NVJQlqq_6^^WjsM ze;*0Hmyk$-{hF1-rPX(OVc{Is$Y9eiOOfOh>f1}QLKRBmZu7zLB`D`a(u8G4+c(q! z_G>QFg>IzY0IrhYje3QzU1zk*uGe&h3kDng2*}$pI!)H1(h>17y2vBH7H|LKu3ea{ zi1LVs8>eNAa{M6#9%nQ|U`VAyT)}`PT#p@?IhLqwt8O0ZF2ZH1Og$lIN#< zvLf`*`%Px~A6`BY_@};7`;#Ry-KvJrT6+3g^;rMlc1};Unaf4$OAg=Y%hPUmnYx5D zdA(S+{xOAw$#vzZwh6BN)B#oXZ_DFWEj>P>UtZN8D4phRxXUAF8Sk+cR20PsCCYnV z{wyUBUR_&LA>cO?DaOa`%6=PMsgve22sPB#@Wb3{0cF#n$^SzN8}#1GjelVl1(b^s zm~cQV>ORcH5IS1u8=EFZdQIRcR2Z#7;5`RP5TIJBY$_(oQAsDtQ%t#VW7${DaJy{m zBx-H`>uLV*UBPJiKocXb)}PT83|+(wC4r#L z*fK%X(H;Od9$zXqdpEG;eW@e7s1qnzNPT^p@mSJP3LRMs=+++h=hM%^ zbacocex!0ag7!*ZKY17`ud&1HeeOMk)$yok7+ZkuUNgY|c}vI)Yn=(}x0M1sq~CxD zi4}aX=P``W`)pg)m$I3og;}B3YVKbWY>h?&jpJB&`zJ|qL8PzbLbQVAi9!8Y6l7$= z8F&)WLOgQv*#;o05S?H^nlK+1 zi!o==M#1Z$%yevtuB^trvc^HNgsl%BJ~)N5eS&jzkeqZiTS`BPB(4oNP%EkwgX}d` z7OFw3o0DXyTZXEUg*Idei^JB-7n~&N=yQwd&sjhqF2SAE6ucAbR8NqTzxicS0c^(_ zMDodg)49LLnkq_9wEwjBJFKJ6iZ=l{*gY_1)~Z-Uvwlvx{jIl#WH_2PmCL!j+)sXC z3_XF0PnS0ks{|*JZQ#xkz@?e`;wB{ki2vX5c+5a-%;9T4z8(U01()SUsw)Xb+XDpW-TRS>c zMjsmB!u_s4iiseeBneNIYDtXno`!QX9%?apEkyDF9*G#Nv!|DM6z@q$i*k~D=E6kG zNS3ut)3LZWjl@4g`IC1CdJnM*ar2^9gs$8A=oo33X!Y78tW2>t9I|xB>`_%*qvI?B z;I=Ea|4{0|>|$6F*9X+q-CXq;=G-K6Au~C3HDn0~-rZ z-B`yT{-Vh+^;S<(zY6pLcC}{TqWyyNbm1%8*TENjTfH#M;p;U9BP0$>iynKWn+60U zl~kxXcHN8HXZg@GL<1Bi!e1a6U3p!n|<8G(J=F8_7yo+9^LxJz6N3Ed9IlHudt~YGnC$Rt5#r1_rJS-VDdatVd z?eMtbL(A9>>DMtFBUDWk=3(ZkDg5Hq4h%o29x50y8H-Y}kFk-@dB*MTc=h0nm!Jr7@gb9vDDFTIEQ2x48awyH6hI{RiLEp&-*`r{1QZ#h*88BfXw-cS$dB2wY)G6 zF7D1JCGZQGFj+B^csZP$9bnj2ySDfkg}r_-Ynp+~m8T21KIcxm>iLnrcsO7VQ1!?1 zrjt+yQH^GgnmON)b91=o(O*|OgNwh~EXKsdZ1;U6ho;AezI`FYyJ8mLIqr#{rP6tC zN%te%+D1v$YsgSN4e)VPlKfh)RuNT@kxinA__hI6R5=jr9!c7UV7_uB++z5bBU~Zz zKS;nO`qUtgP+kDgHqr05-eYhsHoOy|PiW~zw@H?U3Z zR5xVLkEL9`e`K$Wo35#}&};L=jmkAqN@4S)NrNZ7;2_%WQBd*loUZ(b3Mg4GG{sjm zy_*`{=Qb2|D>roNw)R)Z?w*ZGL#vF-exPSe;tuvP zVTB<3c@y^cAyfNVqEq`dcQ!oTkBMT1 za%bm}rdo#^EHonX=;!7N9uND^#gY`@dlSH2d|C(wqu6e?qChM(nHoFfg^MhjxBviselz*q)sD-iA^9PD zBeY(sC>sfHyhwC3TOd<0yJb%bsYa%Er>;O3N}!d|DY-u@IVvNsvs#(fKm&OH_&+4lA`|;dD4K4o<0Kb%X3mCfZzdK=k3K_d8wp~)4lPX}$pZpz{Zi+npq!ldNE zOSG|q00qJo@M%I=yju=H{SMI5G6HsGv1pFLFaZ|7z>0TioPwb98-FLY)B6Kk-)z5U za7C1ju7|3SIi-XBs)qWHrWNVP`s6OG;Bs<#Uyf3Xwb?&l`n|m)N%X+W zB$;kIy2{e6V@KGUEV~O`o0f3aymx1n`j5-+Ne?Ej%M1>vEi}{7ZeSs+Eh{%;-ozKV zdK9~ z_O$k?DtNzf&+mmYE+CkyCPfKj{kGeFrFYtF1Kxo*)) z|MYBU9NzvK7?8y<^M8Jww{c|k>9c+~%NH1nCKXYpj+cM4mGO9IYB8RN%y-oG%;)si z*bQ`#B9g(7Ry86a`OT%rhsz$YVQ(abV-Zibuc#K504_5IAz|q%>RZt+P&I=1t_3@GMEJ3{`HZ#` zbMhT96w_uLcS?UBbhy-Ur76{Q?ka>L2!PAiijnxSMs<}g zm1CiOR1;0tNa12zU?J0!Zd-D3-pFWK&>ak;Cv?%W~$)qN$R zh$vpl0DSYj00<|=)mvf%s_X?au2}RO137sov%YiNM8YQ!kv9PT$Ai3Yz`bfY0G$~F zv}tJtg79mgR%-Q#%>+Icb`orBaJ0<Z6 zI#C5m7z_1UeVhP(Lo@z`A(hYbE1r_x-dd(m!1gfDp>lh?L61w!2Xw0Eiq-cUjJ{dD zM4r+~t_CL$yT#?oYB|;88q#O#-##&_S&G9ZXxTQaxSWl9Rg9sO#_!zNfgbUyk3#*Zy1-S+DhWX%7e!H4|9z6WLLAN0q|#|!$47Q}D8 zo0G>Ei@hifh9zUp4xN=P1<(}}eneUgqX+?1#cZ5~mDM^}@Zs%#isxQwt#WAnFZtW- z_3_32ml0YPkTv1=T+(Z+EpvSVS2dD_+a9yy!YuxB)Z zUTYh$9@x}i_<|`90gpNd2+U*v0W;qMuW!DOw@VQheZ$N^m`1bO3{A{#cu^}6Lf362 z$ma#xdZp!bS)dgWNfDIQ-qEe{15LvgG-SV>K(yL8))c#-cPPT-w z+^T<`^u)lG#vS{x%{wgCbcr*$_M`Lt%p@zW6(@(z$9DRFc|~1C0x@gu*MwWfqYv+$ zw~dyt;`)qUk#Q_FnpQw=v6#fVP_Nbo%g0vf`5LR_1@NAYid1`?Tg12G$nZFAXL>m8 zd>7-&66|!_pJ7gBHhj-*A?!RZ!$A`<4=B)+KD^N*fCL>5XiwIyxaGK9iXYo2CX}a* zzZRX-ZQ{Sl|Pt!aPhQ$5MKk5e@Z_5RDmY#4-(#y>=Ka`3%dVm z^I+&}u`t-AnFih`#JIUy8RtjL~sf z`^)qBLAA}-e2tlf$*p{iFYyEw43wEqRx}}ZCa$!=l4Y67IYC~JoKwcnA+s&w zM#X`?;emB&+~B66{ayS?1?%6yG`pdQza5)OL8ncL3z{aEG?mw#rTJvw<=Kf8d z$tu$kq7BR+K&(@(%L>TgO_XYJcs!+DNd0>%eIFlayATKafCOO{%LW+)Ti*oWN#>Us zM0Wo$5t_l-XAAtqoT`%Ub7Su4+_y!N4P%AybM{NVrs39b+EXN!G%5gPMgX3Eb$cwE zhL%<`DQ4vZk{_(1CHlF7%GF|y?$Ovt5dXlb!V~gbzs+jJzEMAM>RVE~_PP7IgnIgA z+jTMX>j{ocn#a5ETD@RqdnwJjp>p_AeX-{l-qv+3R~X&-*94NQURpC&dzPbRVOok| z#4e-#Axs1BlekM@#aNO`+LPP-mnam6>mv#w56K5bwY&a?p`;hk{)6qs*v#-*S)HF0 z;hbGqt|N&B(vSS>u>++Lc_T?l+(A;$tk>iw(pc zKkkDJZOR$w7SH%Jl?%xVw;o%pM32zCtcXxs4=Yu8+FjxE zM;4hYJa$F4lu#Hy2_NNvo88I5vSdiwFL+XK3EH@}={xo~BQMc^t~7Pn@J2nO5~;)5 z-w42+lLYf}C$k02O;}ClRSi_I_lsz2Yy*Lw-?{9zq<~*wa|sDbTm+>`gJamT;~eXV zXRz@JZ@Qu#I4+A3{(+m7@4@Z)-g9E7SM|Lg)D6uOC~JM+wp8=hQUoUO<;edH4ZnaO z)dDLJ*2dPq$`Pum4HR}&2EY1OPyGeYIJ3cEVK;H_R0q~Sck^^pfsp{z9A%Cr`g>!l z0w_=#6rT;xlcJnQvScrY&{M2dt}BM3k!8rWP_EQG{#JM=>PWz@Zj3R%vRK5sVq|GI zi4*;>mD@|aO8g(*?k6d@Z0ENpBo&l4#z*XRBox1d?U(B4=x7cYDOlZK zaGAGmFb^U^%dqQ>ChBrGx(b$LaErIwill!YPaj%UFHl!PTz2zK! z6LM++C<7_ZA7P9~tOWjFG}%aYy9)O>J>RHcj&%K_y`Ip)uT-0l7x>)YR6B0T3Nvk8 z9L$eD*&iU%x0f0)h|X*&Vd6bkEu4W24eIPdZ97+2ZkQm?p=7o*OUxl5B>H&!5iHkL zW!tgta_WhPtNml)fi`@bx^~-=U8j}J(~)&6R&MOtmRi=0hx7YBg@0aU=3DUVr+_hKKv()KwnI=T?<0`P zE5fkzb0#4JfNSocPUE(|tgL=bgE(!ycmy8W2?lYYe#iSbr@j~#$4%*P^=Qw~@!w$wlhkq=YgA#qPxPkLYb=ApN)qBubHbY>JtlXK&zQLDcuhUzku?4sv{qfg- z!gFlG5cT1#W^-IJ#GI=y-Q|4 zU1Nrr5i9|%7e_Buq;+5!I~Qc|D8-=Ao-x`hMVu4D0r`48$$`%SteGd86l)VR*ooGGJj;msIpn$j(-KY%a-F@ zVmS#(pkLsbTx!-d5i7g6e5IYXl|45z4K7c4@F=SyNc)LuNQNlQba%q#yeyT9rLZIb zA`PjZHL`K_m9=!axf>&%Cq6?Ruyjr1Y7K_wMIlMcBaiI zj3#Ze?^|?-%nw!gW0_1T-rQVr7u96I(@5D!u$u-0-h%-KI%eXBgB+WM2FX3YX7gzs zS3>9gnU4$xWY++#DE9WSdkxVq+`#?97SJ%mFd+d^mt!*O5!hE=?FwWxKR@0d`cCA_ z5sR%tZ4t0r;Y8rFzW-`9`&n@ZW=cyZApD(`{vm$#J59tKwrF5JNOZF0leFB7LkxYM zpW(yu{nStTy*>0102D?6&|vm(cWn{zT5jvb)iGSX&M)*WyQXE+9M72s8Ge&DKUR?6c4>WF zIh%c|xNPoc%OOuhu5Rt@`2XO%r>b!2Vs@YYK!~j9LJHaepX9j{zoGtHwGpF=l^;$P zRURDHxIYq3xVsc4HUlQ?bzu)|)q`a(tc5;Ei<3K?HhaS2+c6j>R*QfIgh2%z)G z+i5#p{pfxG$LHF!OwXo~tFb_L!PEyo8{ed$prBErsOF8tob;6H!b6#!IfV7Y{a!|7y?@mGL-w9o+`a4P zgP_~c^N@@d0sTncQ7||Uja(dOVgD!UNK`DR_rrF1#)q~a6S9Wci{{?Qct^xg2|zfe zxD>-Kyn~hQPuBPz4fKuibDb?K^~n`{=*E2@+o`NPttDjqnVGIb!2ea|_DJ-|GPcr; ziabGd4=4Tqp>k__bQj;q+#~k0lFOtux}TB<&K0Yrocbf%?I)@ce(-3fA@&wTAiYv} zm7<>o`5nHq(iU80w<7F}bOFl(nys@pte_Ec z8n}ZCF*N%DiSf23*qsm>4GO&x%Z!AL)Tzj|W4f?4{R^)|<1Hcq2UsBS3+d(vM%Np3 z;e24jqmy2v#uD&}$$hm7h_JjXo+pR`tx8uJ#Pci8MtFm{@Ef=A zL91jow`b&y%&!cL!<+w?49slPR`kYi%8|BL3s8>dv9hldC{ya*{b3vuNT(0n#g!%O zKZ1i#{k_uLnJS;cD@Db?==M@3Xq26jit459bo@)TqGsK^U6wQpMFf95>IT_QYut&Q z0XBxt(70U>ugnC6F38Bq<6)mWY9^&-(NC@_9|kg3XZXD(5~wJnn|8T0B^p6!MGv}? z1dEA@;mTNwC9yX*xcP)fwswCAI~Te|M71{S$ih6FY~)Dm#XI>}a{R|iEm#D#6~4G1 zCVJplnOB;zF~JMM#84R6F0&#t`Fv#w=}t+fG9Wlf+Q6P0xhGL=f=W?kQoi9jPxH`A z2V`c-U3up{7}Z|m&ZYAuYh8^*6$9FO+AnQACotlQyFC>P5T;Uzg>fXji`;}IB`S`=JX6;3xtGj$69gq$wlwR6Mdp0N6Wv$)dL^G7e zqh=l?h)``dL~@~Ru>+ufezsS^?SM4xjJK57*Zl@7*vQYUlxP?j6s-3}%a;xxJmP<} zmeqRt?Dv%SaTnjB8hZo8f^-2$k)8o5iI=vH`<0Xa>cMs{9a5GZ&V-S_LLsC}sDLuf z_Q+qn(=kx8+LwlOpB6ZamR%(oBkmBc5Me}B6K9ZQ?afX8mN9hz9G)0oiUyeB@w zcbR(A9`K9*>`ENhOzSGyLkh(#OG8v0FSstz$RJ1;`Du#n!v*9WJgG`V9e`%%1gbSz zctuYy6BOtU7>6p_Vh8uv=hJ#xuAnRoquO_u4F2no&-U>rHud?Csv}8MpVFNj?4v8c zL5K&TtVE(iWv|WI_LyWgTz=}tKK%g@qF?JM#$E|oHjj|!KO*A@8^2GQPuL)shXrP# zUEk08V)yeHi?pyKUG%u5j(EH{^Jo#!(=1^oM9sN9X`@zmH7FCHixuxPN$-WpE7V z5*F+H4PN!$YQn^7FrgC*S$LH}9!jy$M`=pS3d)LQ*AH=yHii~$w; zZQ{uSuU4Rv0;ni`eq<^<+rIJ(Se}#Zi6WMBYyVN~Yc@utTLX@6dJ{`I_6(I*5ST3h zgG|V+98nIRMD&f{S{+eCZ=Q=syB&xMr|^H*xL&`y|p zZ3FAUi)C%d_9!bMnM3Vuo3_5UDQL+iKwg?QMUwj5<%&Ckc!00t*l?miAvD_1o5_=V zA!GcCiHn>Lu{v-j_7afAUP6`DlIq{PTyDK;QR0It>GUM@AA!Sr%XokbOH+O!N z-RsoVG<(K2#z;p^!aL7IVL3KZ*Mh<;*?hl*(=KrYe>a?1zHuGB)p^GYo&IU>x*{N< z#`#b1hSj|$84J4XI#imwyOk~a2)#RwmqR3N4H;U|o#IO&jwjf9&;2e{$eKE}`BMtx zS~v}fH{Fatoxy7!=N3zKp3vk3)4&!Xhy%@%`gLL+mBTaDfM&&jMKS{VRZiU{qA82| zV_uY0q!rU6k@9BlXL~DX_(RD;)}e?c<%5=Hp?DlNR*B{>Js5s?dU$w@8e|cQ>F>62 z1~vpJ@y*Sy?B%tl7t=}P-#YT-q0mFi9STa2Hv+%-7=QhuMZ61eW7)Yg?WDcv%HR4l zEw-QcVT40E1Y|ZT+-wQ{7Tbyk;uYbhj-$8CMPtatL6*c{+>a?dK<>6WZ1Z@wGwJ_A z{;1)gn6fTRBoM7I1ufbEzf0HMs1r@(Uumi!6jVnRsA9j;!o~*VdwM71S#WtSqGA07 zxxnu@xL+GAwRp$(V|hM*3gSefgn^;-689Z|1qUv2?3aaK=890`wADOU89uK)td@M zcxYCtsK||yE<0}JO<97Pc_8?BQ4scHC1mAh4g!c1}2NL`?9RH0W#mPV1)@gkHR)XvQk4mU;jxi zdVC(S=|cs_2?+O#XftitTchPHS3wk{q6x@Ry&{NMbWAK3`XPYmocc5|RnZne%sn{H zJ>j^t$Uln9TO}B6U8pcQ^vILFm=~ifa~9S2l%`E26)sj$KBv}(%tn#Dqq*> z5LWAk36hzN#BD9h!1FxYoVxSda7&|?vrfLYYja=!Z%X^h4=>5&ufMbIDP5cU;I0@j zSuXZT6ABK~JHRj&JKY+|=l8zB*_qz&k%-jKITQ|MF(QNX3p6WN%=c)l%$5DGsX+S` z`Tvr?qmIp2IU`af#io-lu^d9{#b16YIPkZQi?Ksd_)GsT@MQhmEK!&~Y#NSVRcy*K zV`sz7rqP`870E`*op6=f;#6ptlQH0eqeO)2_G@O>qg57&GRR^?|JkrHQmhN;?HiEu zm0O(fWS3-`da|E@RpltnaWd8v^y)#pH;R}`5FE{0~aSaBB{G;pZ0Uet>4m= zTN+Nbyt`x}k{Zfmx4cl~Mi<_<-zAvM5Dvl4-jrPy)3IBKKvLge^iDtD$k$7WmBON&P2)EMTIri|*aLHaq3n zDV~oMBmo2;ukGUxC<1*j?X2L1gi)k*)YV^ar7CrB0~2wpzD@&drGzbmz_HqXtcU zcv!+qOabEb7Le40O=bIE;NVvl0P=)gThA+WwMOJkD&twWwKwvdv%QqXapyllTqdR9 z$;{W3v25z->PL;D16;MtY|Gw(N&5%VWBbY{_b!jugk{2%fp#qB3k_^fGhlaXfcciY zQ>7`Lud-Bll5%s?A5SaLfFZTgo%i)qkahhU6!}XlMmyW72zdWLMpZnhe@4{}CA**u z>b&)O+@7P~_WS=9L?L$!+y430%hJ(Yq&;J-OEu)%0ydu14~YhY#1^Pk4=xvxvF}Rz#=!f6HaR+zY=i z2#_-SoD7*K+$c@%tscs-+iR)2W8GyDWlHvF&w9l5;NWKqy9{^>e}`j#i=qW4AP{MZ z32`Ew+TUNQP;o(!ffzaM+Fvv8NaTlp4QVLU=ewkQVKtnST9>pm^tO*NAJ?V-F3buI z%+V{e%^8%XurYC4i{L15ceIslKHr-jXC2{Pn;t4$EU)YqbHCL>(l8Kv28)!5jL)ua z;#pYn#)#y)H3Z!4LV{B;~u>%cTOuj2XH+`|PPobj1`+L6Kx8hgAoL*OUm~A(J zjGDt{IW<}?5qU-5_dhPsx9$J{^ig1<(XT(4QDJZV*F~=<*RQYv31=@F)=a629sFnwRk4ATv#x<&$q5Zp_LpYB|{58otrP;w>PCF zCceh!u*vy<8aWSls{e=_w}>`_Mc zChJ(8Y$Dk_?^CIM-{*Hd*YgLQ>pJ7}`MmFQ->>_gpSRqC`(J#6-K%JPFUr7dgL5iV znbsZ^my?sXZv-k9pMM!y*dKD4^j8)x_i>g&ZR4Pzv_TQF?Er(%k=kAKde`c9zt*XmTjk_uOng!_xxYyKR#<0;oqIrDHu^JL2xR>NH< zoMY%&DK&lOiGeQ-7V;styjtvpo!YZ>%;-uICrCPtF{(P6kByAH z!H|sYD$W9v?K!|-uT=hY$Jij%Ql&mAuq6UU?Ak-OECs3J2k7QY>DZ`LT3TVdL|tJB z<0^#*gb^$>Wv&`&wf^;KHO287H=eVvjuD|G5We@^rA&S|xvG^*7Zdwi%v|l;DuUjy zKU%xWiS2S#w~i5K8Cp^$45foM7nQ<)XbM4PoHa9v=y;_EL(7>?tjH0xTZ*1Wn&H(lR1(6qzrtj-JpP-qR{I=KogK;o$thv;WkHERFs@!NIz-{Ry)`mNX) z=Fj~H&2;T|-cV6xj5+UObwl>KYuJ~qD5s#e{sghi7;C--&E!rGVx6u}@iH&v+XpKU zT;`q3R~L}?txBE|TC&Q7r6AVcz*UyCYocgT0>W>~>`GcVhQv7OE9iR5}I6L;=SWLM+lfRPg z{7*K!6E3LZtIySw=a*=^%U&kkxU25pm|pQC=pIvmbjr3BHxmi0!=wPd&qiNohAIk3nT5rYlK-fP{|O zO`HHV$z$bWd$qg*>?93N!k2kq5^hBmx04iVru-~qUXp;$51L?ipK|9EV;xD|%9`Jv zg!Dh1AgqwNX)sA1i;zsPx&D7Cp}AngzTZkngJoxiIgikdGl1c`AhMxZdM65mSlEb! z1HhDWp>(wQ3-;gbL~yZepeg-#FU60p}e6OodaXFMGPEzLDHW=h_%hhASfP{YJ54z*V-%eDk9hnueC zHj#+W-@id=_Fj<|G??NPho+#y_;m^yiHJ-kw%<-hPlJ02!WJ=< z?^6ZFfCg>ArHq1!b~ujau_?u8G)!J9(*HmB_!0F3d`vZ2w!3QS9eWQ5FS(w0EmuLof$B$8iG&+Nc6PRQ+X!FI zpGU4HE#CJU;WqcH5Xy6+t>zOVg=dEK>eqPJ;+Jenm~J^;u@_uqP~MWGvGe8)6+~7q z@ib=}2!wXib$y^#08ODoa%@wml^T8x72y|Px2;DTuEi4B!I}D6qt!SkP~PK2$4n8) zNt26*5JG~DIKIBR`9PW``>|88P5P3i{)Z>Uy~EexE}RaODtUj{J**7KqXPS8uRam5 zw*Q(@`61U*(nz83yS;&JZhwc=n*4yBe2F2s%pFZ`viXV+pIFK+!|+;02kBo2EI*kK z6VPO@M#+6BN|6z791@zr;JSl~%JV-q-*EXakwUX0^`*BHH= zhFr*9yl||;Noqlr3WdZR&PQo1#T5lvezw#0(^h~7RyS;qJCdBE;`=bDbeqWr&t+v) zmWqnyYIwe$eD0rbp7|jr9Q^gZ03~&oor`-Lr_q0PdZP(1e-)xb29G5ZcU{e2y&@(S zPexAO?vxB*Y;Hl@Rt|m6yJ3>VWEU=Iy$)X)A|R5W3*}PME0SeqW>y7m-Jv?LIdO-L zF{Z+s;=%SW+ZSQ(amTye-nv@3d{tXOgrw?PTl!7rYyRd=iGLMtN)My$A~y~)IeDFc z+&ZfH?f`4NcJr_uw=nDucfc(EY4WPaAGk^t6kMN}p2s|rUW7LB5Ht4WPk=TEG6-e@ zTZcLvPzzY5@IA`ETbp?CvVIPq6T>+eU$mt=V0kplLiFq^o*H^>X@U4I`gXVfc`@jR zWe?DfzaR?tC#gCTBPpUA^Ta#jzK|IcbZKrECSVy>DaRVNGFBdARPaXmdncUY=>x_N(LHAmbEYH zi0ScItI2MgQ#z6MBBrE0UypW9JBk+>)%)A76_jN4U|p55F3O(xkni?pkt~YnR^8_R zma}R-JL6_lh$-F9W48BZ^^xx%QY$!AyruIf0>@~Y) z2)V1nhVpe}T0-fyIhLy5c%UO9BD87^!$iLo8dM3HSy*t*6alEs8eMxW7$(}M<-PgN z=L>ezfgo-`0#tJH&MwS93?2p|-5}V$T$1SQqvw~ILCsfigK?I+B4Gm3+KUZo`;I%} z1)tNoP2pgR{qi<~SLHy-WdUqUeFIc1XJW*Q7dZfHvUbbfod_x%22)qsoP6)h+AsPM zr4i$;UuB(dEw^RqQO3;8Q6?L;gwQU$0D-*Hb^Yt70Va9;c$>4iDYqN;4)y!OvmnRq z)pO)9!uQ2gVFVuCl8xDz!jIheGFiIs>thBM>i`dD6A)4G<5-#lmbsbb&+WCJEs1$qaXnX*li*DU9z=1rml z=pNsi<_DCW7EvFOLp*wAXP6f!piEd$P|M0{#syt5ql0ZWP^FyzmE?@RXc`~v` zX!kF)x~!0Lg^h4seI&ZXtNjKYZ#0Dxz)$9#r0z^g! z>h9Z`k|mH!MHJh)?yQ@%b#IR*lkhF{ec@$vUlSR%pmXj=Q|1t{*)@}tNruruI_7x2Y<#}AbEKBrJ@@j0hGiQ2!g_R5u0NGt z!k8n3XH6wyQH%_^>^5b(!E-F@NsirSt0qzcrfe}Y-k zd|TnL73L3aJd28~h#uuvJ9zt~CMrnG(!)-xKKc&b~NtXP!U3YAtb>(hRz2!_+U9U*%8Q7)ATg&q6L94(QqsMXPM-**= zsPc|zLp?0SA=M1jh4v#IZ-r&~T!~i<_sdY3Wr%_lYv2|0;*;@*?uCUqpMCC><#JU+7^?CCLSv!|pYNzSg z`zNB(>n4X}@ECl?+9UKt=5mNf3HY)(vL=MN(r32PyQmGMC83xxKZ`=}3l!mkVe&xZ zhAeGNblp( zF4o5Y*jN^z-q~^ei}=l3E>?X73S$OI5ttIk?6tpA-Vi;bU2Bh)j5<6u*)(D#>NKzV z6i1?*(OmyfY>zt;<0^h6pSYa{dm9>Hfof-cdWlFh zK>2*5p&oSJN4pk_A3u!Sn!8lq%q`cRC6x3HJwoWx{)hkZ z(xx43*5@cXC1`WGvv2OZN=Hoe7X&rD{UXj&-gG$sNQoAguY138K8y;!U@z=aRH@or zuAA(xk2k;_DxDCZt2y$VEioA%;|-|ghjc$jzsVT$m$UaB z)<;|{zYL%y?&x$SHM{B>>0l%h_UdVub1!Zbe-<1 z>QmK)wfA1@gvrZ_Bf#Opfq;M@NPH7f1OWl71*YR*pn(5dB&oAOKtPo(goWiLgoTOa z9qddktW7{bsA6qmxTS=?V-NZ!k*pWwDfCvrn{F4b2a%d1v(Yr|PAkiESC`_R`rQ@Z+YfH;sObb=KUtYhuxw(BXA~~sJ$c$?GYj>7}9GYd)0+@@> z5b(&HcDpM}AnB3e=p}=QY54Yw(%QVBo6dix9@~D5A8ja57rl-*b!3Uu=7jr< zNSCDPLX4)^n*&Nx+v$1AM-_TsD2j2ttR32W3Oy)r5#jXUkxDGcNnSsnhBrNyVosQF z%w6D(oxH?76^54R3<^RZ@f}?5m}#~?@t*+90?YGj0%d=oTZDgw4b6`wr*0P@#Nc2s zh_;R&Hy!F~v+_u#z7*dFj20z({kX>X)XC8?&5i95Tqh$lozAO8v(THiIJ>pM;zWQu zIK;9vn0s%IJzr}uC!2EvIYFzp)o+aQUH?l5u$xs))Fn)1WI$+uX&4aD5DO3pUQ3r1(p*M%HVg*Fc7`SlZZ`IRih%IAaRHMyCQb&#ZZ_7oj$CfMr2omm1x)|B z%t%W7pDa#Ryrk+f^2EY+4kpCx3``76qgvki`h~&H!HkialarH?iG`7cg&vrL-qGFG$-s@?){*SLmHbtYh>4?-gN415g`F+& zpLz`p?VO!>NlE`a=-fKB0UOBp=MEz?0~6!lbpwm?{JF{{Z{cQQ zts!Dz1MD8)Gx(TU*?Inx|Npu3&lCSuQvIKj?3_&hF8QxJ|943hM-vBOI~(95o%sHF zGyg06@0;`(O1MQ`( za?f`JOAiZ*`t3LQEtQO*fC93r0=nlwqm_nE8=xFRCwZr`(&P=kH2^~gzPGH}PZ5$@ z$dA}RC*MKsEVDhe-Q8}67-#b7&GevS_2OY;%{;MbR8e>F9@~{uItWN9d`>_2)1htEL#+@A~N|_g{4r-Fb9=- zk?Cy1)cRAAah1g>+&(#`SiEY*jxaEXF9Twl5YVd$C7a7GyG^52C(FxscFB5+yMXAk z&4oP3x0!q_87XtM{cXq}9BZ4wG;)oEYUVQq61;>uZ}^&ZrsE}2$qbdrhg4_RyrVA; zgjiVOri&wV6%5Z!c==~tvoahT-#ovtoUW9*K1n6fnppbl7v~z^W=B2WMS;zic(fHo1$R!~^h67-g}QFC zn(t1&0QGBjpEj?_d&`qGM7_4x6>!844W!bA%Ps5UhymS7WtC48||rCo)bEyhAwZGb-qMDO2XAGjdLRr;E{?` zznDF*=yp&iCnbr6AQI%I+jX{VM3kyR&*T%C@V~l__*^Dx+B7cUatrUmuQjEU`f3RI zYaFqqkKo{TeV-~6pDCd-V#6@2V50!+PBjLWEH{7TnK~**^(<*l>Ew2a@ZoW9r;*W0;;oWUdM;2hdrk?f&HQAyl293GE4$2t=!?qjb$0y* z`}25=ydg(`H=~?K<4MrGWcF|)EzmYxIzH9brBsR>uJ()y#0T{W zTVLgL>~MfW+51yZt~O=&Q*G%+d!jq2t_xCV6D8_iMW;I;N?C7kv6))Ii?XT$qQ9|X zxDGcErAu#7=`jMUbinI|(OopqYc8BE^Q;w_?MustrNOJMcWMU2ko_j6VoYO7)MQ)s z^}w?BOE+<>9<2^;O?Ip(KY`at~U^ zZia*|!b4O)Y)V z*d$?pP}|N@QP#E32w2S)C!uf6l}!9xB+3-oMmnfsHZm8*>YRquRal7|6{y?cp#aYw zTOD6F!SypQe|>zw>*=H3ii3p2e~LXczqmTu{qEy5HOi5W`r&k0$wX944E4P@(lEJd zR0!?G_e1T;pk0A%$WAT=>7mkg^mz6YKj50HisDtcNnw4Gkk>>0Vxyx&m9f#ix@q)b zrTWV*a4jv2i$fjAzdv0T4vEGuRUTNq6BcZH_ipk1zRu-R|Dg-1hMP(P%JHyJp@l$w zA99%KN+>vw(6-`!bI?N5e!pTB#5g{$rdKgjB%3Lj$?fX0zgv15MwumlI9n`NZ2t~Q zM^EqU-J__aWUz*0v_$=5b)|_{kkTCQ)ntxM;s_ zQ@3O$UzM?7%~Aa7nh8x&7c4s6iwFa$Edo)mSJQYm&TW)Ef%iyQh4Ox!lKSO6`6=Z@ zAVBC_6IO>MNw5#oeC)(U@edtY%JZy(3A|#vB8n=Wy4O)H~!G~=eZlw)*tJ+@w7;$@D|=nB0u&4Yx%b# zgSyV;n{l`tMOoV@w;Q?mna0cSDDT@Hp}tL~^%o^0fgn}CCLQMo{B=6D3>Yar#y$?d zuTSR{rXkrk+rO}D&Q!FOIiF29X%5}^BsWZ8vD=7U?BN$sL*K9NScP;YleEO$Ep?jm zR7HfV8jWuAchJtbPJtd~XEPYFzY7hH9Y5#ge=jG=UZcno$~2`+c~P>yzse>HnGYQO zlvQ{2-n~|QwMMk{vLo2ZfBn?d!ORa+h=r+$&;NVtF?~&YWnj}2@G8!7Ujm)(sj147 zvAfY4Tk|7hGW_R*S9=#+laIvqn{DwWp_<~=HFa5Ml^w_WTsYyQ5|0THRh|@s&BTWl z{qNmqq-W)~j)x7U54#>7yLMuA!PlGYkJGY`u`iQUs4eExq$Y&LU$Q)osaHC^xi#K= zk84%4fnz`a<)UkIo_}QL!{cBq6&(#tIG$3j=l}|GHXMWYH*hYIm(OhYyqqZyK71qA zd&w7%R#a9-hrGO)K2`zzUbI=IyD9Ft4#!QXC=Y5Akuh*$PJ{|7cOf$FL!~3wd z>oPu#Q9ZvjZ?ITqF}C?=4{1%D&Tf-;nC+`e;MwLwGaJIu_VN(Pv0)mox zl-}Nm|C=7V0F8rEc}OKTkyeccv&xQ72TP7U4ITUwHf{dttQ>!ZEpf)~&q7E!C-FyE z5RSWvOzu+8hjXVMNURbrH_2*Cy{23nD=w$sIq_w$IP$})UNtgDTX>5~?q14?C+TV+ zr~cB0;%EdWI|E;pj6Y?z-t)ofUg?Qrn8TuRmG0IGk`Y*lKZV4>+V0xmQUC7N702z` z#jo0mAgE-;&-l&hH+rUE;hy;-?=II^YRvg8PEm7)M({@XBZ)Q!F|s9gBqUPh34IHD zvu5K^zMHRda+iC#unN$bACvsBD{eEC{MKzO{t^6y-twK3(I#2Zw(F+!u}HjGVK87w zcnuK)OHsp`8;)z_b5VIvlqG)51tdRXzJnBl<*eZLhSw8MxW+AK{DIfVg$p}IbY{+T zL*JsutF2CI7AxU9di)a81bohnk~lS0B?p>P7TP&@(oCO)az;zi$Tbq+2E>_nj-;3% zH?RE8da-FWw)^6%nnlQ(nrv^Yo?vdKxZ<}pjmp}=K))CmXHBmqZwotE#`#L)nKJT7 zUlIFGhDkvf1CG^XiBpMATjJ`%*W!Ebg^~6#m+}~qg?a)in!M=LxiS5`5Qpjq2tm&N z&2^PERj#H|$U`?9&cv#C?QA)Ff?+2LA4fr5j|8cPlL4^Q3S5U z(>l_I(Ki|FOd3##h?+Yk!7Rv&#W&9@+g8aJ=JPLYgsUpjhTjS7)fx@PQ4rO8V7Y2%E((5knKc+J z@793c!#&dm73w!p*wErLn`S?JgNet28L|3R+WV&Buyo~#vsN2Yd46*kLS&3a>uvGe zrt^fxupUK|HmbSbP-r!7g>=gFkE z6N$#uBQjxU6F2of9 zpI7q^1okQrQRYj73Al8<-D|B3Lfo(Q1lru(*$ZfA8}CGYIOO{k@Lvy;F=$C6n`i6> zW2ov4!13#?Tn_Skm1@nh5ZkzwfNc95|DuGIZ0`~NQR10fWb>j(l=107L{&AZmGA4| zNjB6hnBC%J^8MNQrj}ht;?C}_#Y6_@Z3zFXf0p;XMzZ3J*300gP7@1pQcQ>ELu=uS z0~olCxnM(g7I>arf2a40A_Kp-@6`Yn4M9Yg@5ei9N*4?h!$JTfIz-SthEH7IENBN(nx%7jJHctUOLCb{Tqqd2FDVY#Ps*UpyGW1Y6POj8gf~VkK>2(@}xsP^TM~-dZ5~h9|Pg z$CaIv@$bU9ovu1%UBCr@QC@!?)kDTl>Vr{Ns*m0)r`jP9(gj(o=^MvBIWtYKAHL6A zqTNn@GVmkmtobFT(`DKDI?wX7orFn`D-rznyT0nTr^9eA3?_sxlQPN~@si_quW?}c zG{ac+#cphbP8_129y_!=2RK)cmexF}>(4l?iC!@EK2V*{RflgNPP>JLcAm=;u1Q^O z$WgP0oxBc}Jnt0PYbVb~6>(Me1oP8|aTSMC2uka-fAvF_gT8TC2~?TUulJ9A+K5Ta zWpyS5g=A!oJ~WwjbZfcfTv%DJwJIh}CUQ9~kcP6irO0gIgSk{IzXKJVHk^N# zUl=|bw;GF45xX!ItE-^(q+Og>Nx6!?oKR&6l`>b#lDH z_K5jKM`%lIcO3{@Nq_z`8R;~C)kt%OsnbQXeZMckfWa#5$|LmfmNF|{p)rfA@SJgJ z*hk;dH}Qb${3ZueCsO9o$?Mjf+OC><%Vg4?%cnh|ve^qDcNY;{-Rt)H_`N|h^rQPH zLu=?eaKFX=NhJiHE0`w?l4Lp{&_NmIS`Xkw_H-7 zuZWzPSs@Z$^9xLZ#wCc;vPtrEt;wh|ZYU-UmRqkjMT4*#Ii}RM=IJ$Cm7nRNQguXy z48i4Q^vyBc;C5Jcm5uu@k?LLUuQ>`V)BT*Wx{;wfe^qUGbiZZ}`>Gs5)>}4|wyWHa zKxhIV7&>{w_FtFkj|yx!^1!ZQQ`B^$MBU zdZHnEx+6fBPcUlkZyhd=0lU1tG)~y*8%Sg2&=HGdPlW2R7`2rVjL{Ya4NI19Nnw}uxRoz>fffbFwkv@ zYiVjQHxN4<8PYLDYU#IXBr71psee7jo5@vNEDK-N7 zGoYyOPn%ap;lqu4p2AXmhuKuLD#cGG`%W`~Q*NV3haX`pakWa~%1WTtStAH5JAj;wbSXW`RyYEz*n>BNmTK4s74 zwm3^eZTKSAh++S+TYb{hUa%yHf`9~5$@PQCZg-}EHXBL$QE9)^Ame&mYO4LChM1;$$2jgpjDYX@q*BdI00f&~j{=xR#N~yG+ zU8~##2c9n{nldf5(HAIkC`GkoKKk)*bkB^u=Tl_+*~IWC+pk+{y>-T)cnc=%rW*l$#bd?6~YJ z3!D9>uMP`bORtbzLO23cdCKR964TJp<*QZ*X=p8HG!!EmTB|KCdQrL5yJrBR&^!Sj za^;#HX!XTv-^NGGO;Cr+i+}TE+7?HC8Rf82Yf@XyE_(bq&QiX8pg_E5nmFe|t{~@&cvqM>(vzz9vTQIPMsA>sM#*Sy` zAaOX4I19G{iFq>ok;Qybl?gG6-?vjMHhZyLp&U2R-|J~V`PlI#ir~0Tm<^`3?6=p= zLT60`d-T%w>1@j3$#)HWE9`K|l6}XI!fw5X7tQfvhk>^rX!YUb-XY2~M0KxPqRk^a z+<^8XCR!%A)o2=KWJROK#og1f@bXIUCFnC#8a}HOva^&2N z{bWm`XW7By86kT(QgsrZadMco$OT}jV__0~=Bjt(ZM86gtDeMsC|yM7S*~Fjp#S1~ zG-vuiJ{lKT8fA%jH@>oNL7X^wS?gS;L>pKOo>J|?#PgM>7q7`76M79l zGtVH)!`I{py3^XW7^nUqdm_ zU&>dHmO_fJ2y_xHT#J=6kK@x4KxZzB0i8Z_Z7=ZN(BhoZ1(Jw0Ey@^so&1dlk?JyT zlj3}DSJ4*rk0G76-GNssq_xD9>WM*N1Q3!~9R*fw=z8z`w6S{8P+z`$NlXScKjcX+ zV1Nma$Mj;Md7(XdFZ^YnbP7i&SX)6d$#M&iz_(UBdy}I3o3EAmT`4 zheTLy5L|D!xgir+dALKrS>~(L#LhSV{ILH%@7;HXrMsx-+c9IPXWs(}hm~pfdi%~e zT&NGn6uQjxDO>Iu3OV2Wtb}>oEn?rdBqTRcRL6$Uj|GpzR=Eh8vGXyHw3+FVkl7F- zSEi)V8wGIh{5HzirM>L-`q1?;FQM}OX(d6TW^tm#fme@)ie4Wzekru5?CWc`C9Ez> z$Z#oV5RRXjexRQ)hVSKa)kIH!F8or{&og6g#d|$dd2B0_zLZY{7c)PpJ|G&@kKP50=esa`5>yOaQ+c1h zz>P}h4|=*#r5m@tF_tX{wCQaP-LN#u5bBnuA4l=K>_jH6TuW2^devxov*3A^aFC~S zJrloGsZ&nu9&SAT^0kris2)v9w*YnHld6YTHeflWElF{CdR;lC(eFB*|9c@cWkx=X zqy0oxCF?FIdpsn2`1ZKIcgbV7sZrA6F8$L}ea9Ahn@V`jMJq)ag8owkiMA+#(F|9F z4TYZ72{5c-*bNwD9qecSGAj@o?|DywT;krY{ARZS0^X8nL&H&L0sH&~&YG-Z1$w%# zmL2B0*EY-&O%d%-5^<$wl;d7yeYfz{lOsxE1ioT*s!w`Yuxv6&03Hz)@931M)90$Sp`p;@tMt1x{lkqh>ijQR(gf_L!U$AQeIx^ zsZ~mCUc|E)=hw2=#Zf)wmoIaDDnG{Gf}wy;Fo26B;t}-kW3{r@fLp$%y0O-Lop+H(F1w$EE#WL-EQU=&qRyw;yPGAZeAGAMX$05O0sW z(Z~2wi|XV9gY-*n$B|1OO<&pF+*?5$5z648&GVg47RsPhrSWb8iyHCf@p@xnb(vyx z%zD|e_V5l6(;n4w+ayJEulh_$tr>>2DWy~7OUF_ryLoET5R!A5CLtIGx1a~V_xwQD zw2L4zO(y=}f4hwbgz9tx^f8dUI(#;so7#M9df;yY!oa_h@Tdqz;LkV?s{(`}WN1Y; zhX+Soj@{Sjs_*=|x&0L=WYP-8z_)~vY*}>Owjse*7mSxHZR$AJS9!TAK}M4)xyimZ-PQmYItZ^bEu+ zq;hj_O(3n%9HhoYy9nAkVf`}C~==4FU}jU#5@Gt)g}oUef8(1kTN5AIorI2|8`VJ z)=WHSLf19MKKvKr`kE0WTa}vS-uYB6{a5L|IgcT5O_3QHik6Ld+w}$|&OGQh!eL*b z!#W-6;T_9jnLVj?_d|&Im7f}D(5Uba-?9QSkK^ynQ0kLqT5M6{V>b*C)0wO(0;KN@ zS8W&H*C)o+u!*SlNCW9fR~kmeQ`3gW`a)n<#G8xY_B~(KDBjJ4I`?E8()vxSi*AFx zf6Qb51YOqIG^QwfsH0_DBH2ZPcmS#VsFFQ)qzf7&a{rNDY($5aleAq_a~HB?_^#l zEkFe?FYraXc%G|d@KIRvu3#p9nc+cmn&UMjAdg#7;hB`HbL*ESLVjyv&Nw6r-|GcD z26d$+_nCWXR|*m9eJULu*`)dAvDNBj5(ue7=QwJY&I{Z4gLC`Fh=0FHt=P5GsO&!M+B*n1B~7_u?h^Fm{FN-X51s=+O@eZvy@ZRRk4|s!E2rhfQBO{?|+4 zjt+_SOO}`=zZCV6ee#Qdg)u&+06So&d)-GVm39r}6y1tZoGec`RBUJP`~`(o-Bk(RV%L2O zvuUbn@~%%;sw_IsK&;_1U{S5u3y$N|>rFyP2)~vW@WrV|aFnlN-)$u|P1GElvxT&d zeSx3UOnkR|{(wEB(=`pyhjx1cWH4w=AMdEmT4}BO$eHm1I5qd(qo$LF^MtO8j3+(r z-n}+EaV=M5`#yoYr546<@qCVeTj8?q7BD3H6x%A>7lW&eRrJW_hl5VECPYHXnA07K z%|1<^UyFw0be!y3YX2Zt?0pMax{0QHCxQ8-KdO;EsHHcgc+^zbiFo@d;$*2EdP1No zieXf8T*iB1$*;gjFvp)v-%4|;`;f8^>tED?oIx1lE?42m)vxgg{ToM2YCQ2qB|kgq zIXve@LuQKpW(@q7I3SM)GshVld{X&?&U7~<9Tl7OBzgXI>{u(2pTM0Np9qgpuYfOV zGx@s|&R>KD0c3rMD2!*ePl?vXD7XlSE*-GFAy3B_h&E&TSh_f;cxS*k+U0_A;*6E2 zmrG`P9A;Uqd|E5%S%(u^f5JVVSbfY*{DIWTY&4j1PagI+ z?V^h$rkXq1kez$Yt(bk2`3Vv>YNWi6Bilw@}HWt2)AiaZN(&$LHUl?4i2Tbz4&<&-_Dw;y& zi$yx9cwYaaw0OBc!#^`-53a7WhWQr6PA|~RDRL|jgcMX9n9bFn0rg9>!7?$NWyi7{ z3R-nn*xF<_WjfMqb7S!0B&PhB%urKABq)3ibe!Td8(ZR^pq29{2X2#VW4K)yEM#Pj zuXgX}Z5O}ST{l%MHZ~ByY+H?MYQPYRKq2CPQ!18KaU(-m%#+LJJ6<7n2(S4FL!-C`n@G7m6EwLb4*&3qhciKZ67oF^xaXB+QlaL=k%$+&F^lE zu&8Hoc&e*F8FZhRFjgsBS9Z@!$5QrKNCx6;;$W+V^4wr}teF@RVQquC_t!&yC2a9V z_pn`wbb6z{1xym-8Ur{8@a&DGet;)JdnD2{>A^&%6p*GI4dbAg%GwA!dG{xlq_RDgDK>sum`8Fk`?lA2%~c zCf8feEJ0hHNJ>x`&8{oC$t26QzI#t3@Eo45uAG`s)BP@|UH(XHw!J;>zmaU`|lh%oH`) zq52SPVHA&hBpU!lt?Dkc!F-x_gbtcIFQ2)W0YeTf!{ym#SC@x8XlyVJtnqrQ^T-~E zDF!t)b!+Ph+9JdO2vrC>G9I1?=AP=$<-4~1B(1r=*$A93=wYJE!1*ezrhsb!xN3nL z@&9Y+Zutx73&IXC<$mH-ksePCf;z-fg0s>|{A8}9kk*jTX*Q&gKCgj364VeHX8oIb z$d}n7-miJkDNYaQp59eEE!@paQ}WqVEt53JR!vBb6V7DE&tavgo#x3BHe(hf#GYIk zbdV&N_K)jaDN27Boy0}cFh>B8E%73e!h^<64-tRMYK)k-&|752Ba$YqmX6%_&Np{3 zl?DKemTE1h)3jp&^keTgYuE&~554 ztTkCXqmMi%!!3XHNDc}N4Nc*1-k}m6DnExd5hYbp#!X6Qcad`0Mys>l{+cWQ_}1oU zYh`(9Q7`4WV)8_~Rbh#$s$8Ch8A3ycbbv&)PUoz4&hi9V0;^4;)=ObItg1^(MjB+? z*k@H()*c@QHlQzrLS;F0FRU=NabfIJPhD2k;l?1)fLN7SDyuZ93yqnQe_rf*H?aiU zw$f9fH~XB}%D|q5@x?z7n?oTuP z=x#WVSAqLKjR`&77lS1-gC^s z$>U%&QPmiZ{!C88YDtyoH6+m*o`Y}3(?!UJby-*XWBJI#Y^9IR;poLE_HLolkV=b> z85lp?H)OS4_%Q2qI2r2|&h~O7RQTn@lgC>xvzMigrrX>-D-W7k2uc29-CnxvGkua8 z+3|8uNIt9mVLAKf7L}(#dDaHoGl%|Vq9t}Ct$7T#lPyVLk6F{eTnYwdX$lt#RC{5^`x~-Lv+<7 z_6P1l@=wr6gv#lF`gMQ>xo}?9F0>%w@K>PIOts|>?E80mykuREu+GNR^gzj^UgFgJI z=E_ukK6-cBV(-oBbgXU#Rrs0lm+i$QwxKX7m$rwC5VIta1?!_ttWTBAJ8+`5@|ZG z1s%Kbx_uu)ct-9!+oHCx%iW#!of{ATb`e~9UQXfwRJoqdlPHSa7e|oE)~_L(D#**( zKF<;+Mr0W65aur$ZSQA;Rd44zngRWr--if}HGAJMc~H93L3LrebBOe(D0#321fI7^ z1U+fG10mbtu{k115HwA!zxDCno>X{dPs~=i0QYjp>`wXe4`?lJiT)JByq(i}Ud!@~#bXeWhPmg*We7jjIBNi#!0ZWir*@ZW#p6*z$7l0+usZhk$jQ3$4EX<2 zm|tB`hJ7xeHYt5m&Qy%>rQV7XV~EDmUWS=wt!qcc=@Yh9>}GSItq(vvwetHno=UIg z?4sz|YJI*)F`|`Lea4hJ3xq;Y#A^W33KEG_%(L-u!yr#pv9b7s$07WVa3 z{gXMaOg?QKOSb;Ca_fitVT6eWryZ;|YzrF74E?4I>#`u#(yJml9ThMI@@C7D=4;0I zOhyu(xz;p^)HF(4F19rM)_C$))?Y^ zy{j)9{o{DcCQC=_9jn4OYu*kf7P@~7suC=ixs+jci3&<}%MAJCfcq0L_&WA& zF*v-;TL8l$xy}DN3rPDG02kYGGXN)Sf18rAG2U*vtsP|mDC50LWCHBQJdbO7 z`rU<;r>Ull-tlsxf0xRmSunWIqX+L%KChL`RVJGi=5}yQCC7$a{yG!6-d|`A8Nw3O zKWM!LeH;{eE1T_eS5Vx6E#*$~Vs%Z!R57bTq#t$cyb7|$$ONx~jisS;7jQIAd!Dxp zr5JmxRqAk$7|C31lZn&pyBY~)`5q^fBF#t!%b+d|Rl*(k`N5hxoVOg7eJ6zxa4sl% zT!H-7ZCWFn$)!NSZ=JFo$V>*dSYtFKlCPBsPv!hS7Qc@p47y`~`Phj^+rhf$jN);J zJ*5p!+?HfMxVs3x&CeC}6g{CjydG9*@w>8;v#;0W{JEuO^g~Z1kEJFj)0=*H3{s?4 zQBh=fb(4JgF)_%_V3Fk%^~~exv)r@AvnUiv_U1^S%Od78<>hqGv)S(jGnUuvnX5=h zNR%Qo0UcC-j2{ZwjFPD7&4gd^)Dfcs4h{};#Z`99%*?E*Cme?@<{CAI!D-+V)BJg| z7J}{0!$mUbzn>1X)rQ!-Z+=u&odKJu0*N-Y|2;CxZ3ou7Oqw-EWhLCFCRW9qmrAXm-9K+etG?5LRfSdj? zdOur+aAfE0V%M?t9qjlfaAmCQ4GgH?c`QuURZJW0dfjKVHK~vd2n^KeS4h^XH%IY) zIcqvbKLD$S7p(`JRJO?mJBlvNl1n8~3E_=6r9dUB&l^!dfvKAI>N`XCi&M$x=QD-~tQ{>NJj+D-195&Z>Q?sPITQsexB5hl}F20gu85r&viK(UIbB481}x%1*AYUmnqF8#D_ zNM-$EaNJ3piP&f^Vj{e%*!FRrgG^C3LcvZGfokx)b!aGIY!Gi5;r_{?R5S!%w4YiI zbea1w!x5&x7D!vP>wPxEhY||Hh6l9gQ}Wp%UQar*2lC46X}!H zrYe@=$DN;y$}FsdZ!ZtUJ%P})q<9zudQ6!5!IxETg#`sAtnO%kubH41Fc6pt@}JN~ zrj!QeGR{l_Z+=n-H&jYKtCc$`o>Px-a!0L{Pvpt7vr!q6;(3(yD==iqfaT0bS_x4; ziSA8ZuIvw0ElCY=vlYK~Rw#1^TLaSnu_UTDd7UslEpYd+#g9V~6K?0(#euuCZjZDK z1&mBtW@NbpTOzB?3Tp!i>`EsP8Tz*`r+NU8@HA}F^i?SsCv(}wH-KzU6_gab?s57G0{z>HwNM@HwW2vxeoQBQSG2l3%_V@2>8=c2BN9LEC zcF#JxJ8oaQQf{)}7V-ej9GMU(1Qs5`H6Z;+Qi|Jtiuia4ch#!0Ww5^eGu%IFBXCgb zd&#!qY-)U+&J8jDVDbc>T*h=%rXF5}ZxTwXH2Z)uWE??iv=9`VCAl;8_?7peb@UHM z%)(cbl6+pks{k~k0wF3?Q^lIEY;eG2ViZD0iqS3-hFHstD&d~6R=9q3YIY%{a*QOi1b5Z;O^#%VD*9+66+4! zwY4oa5VzP*J73Q8fo#W&OJoowWcuBqXv&n&TWqFd*qNu#30^(o=SWXJb0M41r=XV! zWv_h8^HnEaPu?~_Wo6bw`pK&~D4S{eV!h)I!Dq}O@YBjsnV26~t3&4?RD@cUNWlNV=p=ttL}46HIe%gVB{b zGdbtZ#N<*GbdbvI>KotjG`6`mS3A)-`v?T(PMA;(_U|~5E`X(WV@jY9h}b;nqT@j~ zKtn)gl_)cl8!uiQ&3pI=@!KV*RpMMcs3v(;iStdvxOlm^fj-Iz;Y zh^Z87q#F;c9c1pu?<+OvO(69=2`IAK!5sv~bc8w9>;r#h1Pp`OwO@kd5;4gO@gZEhyA?XY#|dpJs&&dzjuSy5Ddc?5It~a@PbG25WU9l@Zl!D72(5QZYx8P zR+`VHu;a>2b#&%z3HCqiP2-wI3x$!ac=2>p`OE(g^tM*?L(l_)Z!za0f%_lGU2$X) z{^hmZd@iFY498!Mtg+zI6E7S^kms6W67XBA{-)iY3LGhZ=wHzKEsx3#CXR)&8 zhcXq7V>o#TKL_D4ETLU2*A>rH$3j0?u88C+f=c{LG8imy@5!-5=HJ{9)7Sob!3t^r z`I37KB;u*3-2nyXd{~UIpJB7^Q&qSU>o=yKHQx6r0_7y^lBYV^*m7?NOI2azo7&{5 zq5ojO3BjZmNCnGW7|FrND4+2cBdKDlo9s~Lnd-xbxVlI=+t!8rJnMOj%H*fEI z*qt+wP@Aka8=z5VIz5#uOwGs`-DtNd8yg!t;!Ecd6s=Z=T**clSqG~2GGPx;v2X>7 zENEutccmF39WHnuklSzp%weMG-3MiW$~@qlu9yAJ6r~sSw{Ko>Ym79eJGRx3-Ry>V zg!*$=${!qzEb8#=#9NpDVsmd>78^`~9^1nAw1@T#+@7_EolaKfoy(E70C#)8;)~K| zfx&zE!--7lFJyfH957OQk{}xok5-!;i1p%m$^cAl-?uwfw_#*a?Yg?UqXjLyLMBA8 z%N}T=W|iPZ92Bt#P$(zRhz^}Lm!NMZ#8+-O;7~dEuXW-7C{w%bp#67D4HDdS>=uJO zc8DJ4*r0tAet83QQ+7 z`I$bJ>nv|4{RzWS&0AoiGZCLLXE!>HLagpdNJwtqUoOy2MM+?AnZECcsPW|)`S)9b zDtNzM4c$@y0d@LN$oSgKK|tA8DZ5T^1~itQ7xTLJ!}>@m{}{ok@$p<~kbF54qZ=?5 zk%$8#O$PKY=a-Q>RYW}(t^z|37zSgZ>Mp>o5inH+)8%>lTOm9=Tro{eM{F@x?w`@{ zh(MYHj(s`j*v3|zLeGhato|ka)&^2d$nbeM%E>_l8lOfYC9_v^J@8pMxIqT!)dz|> z`E6xs1}fJNX|j2%5eS-lEx5WB+EMwJM7E(*zt!#ap7u-@28iNPz@3?xnii21UK{KV zMkea~2J+_%g?_nQZ0H2@ic&3N>ADHVs+)_WU^)YVDFmJh@*>b;3apMj$qgY?G{(tQ zz+%*u{v&`J=N>6fB^&8pj)Dk z#}EKjp2m14cXASgjwFe6ft}F~m)oU2hXee~YLlIw&@C;pwO1Ck&6 zIfpG9pFuS^;|yK2Ki636Jwr4T>nv{%LiO2sKl1wIo)$ITO9d&<=er2>b;+-)5E_C1 zUr+llG1d5AXq5PaW2zuL&%g8Qfx5gu7)Avs&}%K7sOnVAPJ`L_ zgKGLXjRrrN*ul-b0t0c=UGH~{P3M)J2e_h!N{WhJ6g92>)JjD_btr6u&1zDk&FX)B}ty5{P;#W?D?||D)M4VL&F(?#Ves@ zJW-b+Bf-U7#`Q}hDI9!WFJA>!w1h)30wSZ_v~+m%y|n}@Q&yNGJkUelGvC-ns5~=l z$q2e#p4fnjtW3}CdafK&l7D7igC7laizje%*!3`Ag2|L83dF&odYs*hAN{G*6x)J(L2IkW4*W%43si~Q?7TL|8aC@DE{N3jlcr-zDR!-kzx#_X=o;dku5b&;}5UkgpPdxIHdDr9G~ z)25Cc?XsDaey_K2=y>1FOLD_;ua<=p8Y!UIX2bbcFjzYl%Vo&MLZHFQ$$c_0 zF~La85YIB9!H9wQXTDx)K~yi(o}Is+-#DU*$1LSMRlnW>f6+nn&u;sac2| ziI9-XX#DYH{{vvehu}`o;KAM9Ay{yCZ7jIEy-hlO)8GBcyW_pT z7y~%x?7hc2Yu2o)S!-h$m{2tX-D&wWMo=eBNB~<*((JOvRsHMTH7CQcCyf(QhB{k=nE1;xIYJ5u1t1X`Y8Hk`815{Fl z*bfkV0t%2242{5?9n2~O59D!;zI6DA@w|xY2hdPDqc}fMaHztn71zy3^BPU3#Xv8H z+WJ@Iin|yQFkhI?W}$UXU3=p%Zwvw4-$Ty1j$$myP4F@yx{L5OX%qkc^>blFBQrUb zkQ=}ucc(T~C(Bf?nE&;{qxway1}uWL(lO+R>9u6o+RpM%^i3A0+QCngDR$l-VTRF= zv>Vu>oQYF7qd-?Z)-^pGQfj*v>ywhuKYB!DMseqt(+ zJ@SWyi*KQ`Bx(7X9d2o5p+XwOE|2OLy}(b$mL|9q?neIZ9W^3kUS3{#d*mhqfk*w- zDEG-Y0{e2-@@If^ZWSC+*G*4u-Q!F#DkA&Qp!*it6N1oY4L^72iTL$ttRlyph$FNU zs;Yc7&5zm_30*tN%59h{f{S5n<*n05m)ss^B@*n-oA&UAY@#)tncvvzIRx5WnNA^KtxNPv-Z(%q3)YrNtP14Gq6`mCtKjq{CMK$?jYzlr*)rDOy}D68 zKgl39VAv_XLEdXZTh6Dm~XKiq*}Rtn6mh*8PH^kIOBedZ<;zs+)o3l znE7^_eTtr*t#3LjKYoYevRg(v%5ILF734LA)Nx=lTccac4bxImIoMp>3>@!-!J1I$ zO*+W@F|n}DzCiiRa*Da!1XQ-Ov5C<*!0z&t6gvb&SWRRH zlA!imd^IJRR0XQK7ZCE0@AW;HHZctusY?#&8+^NMG=Wo4Y)wh$-M9&9_h2HemW;H^ z!EEID#Rcr5HFMQa!}q!JcEFCsa{E$;(sGA=kg^f{0NWnAkuxuIxbsQ1KiS0PN%8uu zpO9VEj=Mg!gMRaSYcxLhtUl|aweLXa-@OwEIy+p>D?uFdlh^G1m2P8PJyz%;=ryTU zU;D=;^<9I3XdS zpHDYy@8(g3eg_roW7z<To#H`&7gkQz+LF!S`I>@z=&4q!E?CiiUtD4)@+4%s zDjJS4QK*=sy(iCmg=V!jDzA@WKgN60I3qYQQ=&RitEQ`1C-4l2W5#a~U6%EM=pyT~ zh3%Y5^!D~?mxIc%cg`2W4yw24wjt{sRc>J!FQ63Fu2~Ezs_G+S){V|{gjXLaK6_yO zaW2m6 z&(!1}uT{eq(vG;q9V@1xp_@jJ&Np{*m1u&CX1@I2VKz=51l$gU>SUvxVV<%3L0QAk z=7aK_Uk(---y|B1>_derMVKw5k7nZ01hTI^WY5(I``np|P(U~c zUU6%xW(-gXCh=XC1-YFM6^I>pFGfZMvjx8BFTs|T%r=`vp5#RH72j(D01}6O5xPnj z@QYBx(T4iWkGv@)YC@8)>Kfy}35mh%V+lP~cGMfx%^@d}X zu<<<{GGCc_w%n&!pux&XN-E;;8D`AbIoEGWLI;$TmX<2HF8B0^fE5L*B7Et}M1-F9u<|eSI~xFdgI=&q-;<(B z6|SB#+KX>hsaAvB*Jb_hB*!0ri-mqc(f{_;Eaz)49=ls>5L9$%P5*=q{E`3RB<>q=^g>5pZchh;;b(blSW;i=V}j&0(Kls zTtuWXAs8Dfgcc$nOEc?iMr4+54M?H6ZyrnW)EpVB(UE`DzXoB{{eZ+LYjm`;yYRfn zcVq17ursVkjYQveiL&8wPQBIvO#R9FG|1f~=kfoI+x-@W|F_LY(l;5gny3$RoJ)lh z&vDlHY*du_By#Wfr@lxf9(~K5n^PdLFhgW)8kr%Rr&}|l8@Jp=mP)A~EPGO#g+M*D z*QjQZ?E7W10T$j)ID(ScgCaBhFk832A!?0^3ZC@Y>r|nJ3g$P~5f(C`mL-6%t@H2( znA^d`i5Q(SVcC4aQeM&BJ;$`~-ZjNwC~yzbrfGso!otD{eVAS;Unx2R1jBXO@!QAQ zJi@BH##;B&v_{6}GqAmTMQ^E40|Nt_!h(XaBPP5WeYDZXdi)SKKiA_E5LTZ1s)YD` zhEn9$jcp84!xH(;nBlO2%^xN>yZGEla#)$Pc(z4?!AVoP3F)zs>-&3T$9%~zRUTAR zA!hPdqIgTXSedz4MN#+KwLI_ANZk!7h5)=mc5XC}xofzcE>F}pE z)Vf$zZKUichShe`-gGIXS|e<^cS@&UdkMOEC^%;Q<;iKCC}v!0%}@V6bWc<@ z@X1BTI{To~>u@#oLFt^8H^B@nkDHf7W4oV4Rkl}%xnu~NUyJJ;l?kC-tVXWU=_LAH zK8}W|(#H#~uP%vW_v_%@liX~=U9ySv0rmhJ1JNK1Oni}a8G^91l8Qwr`0P})U8kHM zys;0K$B>%TU1{M`&MpxKTwL*C(cuMr3$G_{Isf(ck3Z=MiDOdM1JJ- z?2VN&L>IVVf4p$~ETg8G1nM8#&bwFJj%(Y5bjy16?{>?)#St+f5JKtgFt+;tL<+e5 z4hh>kYW?_L_;aYS-6Ny0tu=WZg)B*{K1LQS*q~t&AHosErni4^F+BL zP`)F;#Fa}@csWp6ihdfZ{AlQ&D}O2;M#inSZrp&nBJw-?=(cR_?R@l|1@yQmD4mFU6OD*Rb!=ol!+ zR>^p#6E}@~H;?h22Wwcsqdj{Z#TwfN`rGfW{H_FZKc6f86GKh*3+3W(SKdmwd!+BP z8M=C`9wz)y?8Gwx{kxHCwvZrd9~=TrMeFRFrF$7D97P*gMfyw4K7cVs1!KP78hc6< z|5L<~(8ro{9lB1WM&dNq-p5Y`f9nX1T0k3@PZji3)@{~Cp8?M!=#NW>gw`g#%uL9A zNUDKal4Qwyad3{8(xh6Z*_3!;(Lz7WOG`UqQ8O+^O5|TasG-wEN4Q;jdX?9HT*8&< zd~s1Hdt`u+LCV7p0_^N_*9X;UGq*7=`_u0yDc(47zBSYOjq9y{`FkGT{%Qh~UefbH zq9DA3v3(i&lUcvVj`ETWe4gL-NZe2n4Rf}pVXq$}Kn-E-5escQK;0}_!&^ep==fSB zleLEbEfy6}w{eg`=L6G`cSD^2y)!d;f_!K`G z{zm|rc7d306cRz=V1`ld-?<--P z(}g(y$-*n)x7p^Ns}(1@L@t!((WxG27$F6GE5_sAEtAU3Z_l|pPyPvr1fEe{fB=~I ze%OvL_~{tV7d;_KhX&L$>A*<*FACCa63i-sou5d;DOFA(JuVBGBT^9C(g1dss(20< zhqcmNq+6@~@^2NG$TkRx(i%hT>)e&|)#^X47eR}+&vko!c* z!I69nBtK!oguu3Y-r2if&8V5(U+z(*m5quJ7)|BNQuUMp;R5gexLb)8uETdk*NBF%cHjq8~M?P67R$vZS%;7SEU$JYjk!)juY*ryPkId{I7GWuJbQ$z-~Ug}uUpK?9l2s!P^%7D-v3_5KI0P5QX zYSeXa?-gWH1nh}WDv2C}ody2X*>}EEwUW;Gvua?#t{{IA<48x-p7xFE==Sx7Xvo1| ztp3XgG7{3v_D-`wFLr*b#2qPpCFN(QqUxx``AMEd&l)IbsMQJ^oRv2lE@G~YPX_j@SXsI$3&?{&Ga4+Fyd6by$e_}RJ=jCo9U^k9l{x- z;afb1`pExfNr3QU4){M~P({1s`Tsixjgl?-f5)Kc;w%G4w%l`?Q?y?WnJ`{EE^Gn z>{af0FY2YK^rM2%AUV%F3G8qFm|%ot{lj=Px=qNftJFJ%chg z_dRvOxr$0iL{@z0_Yk(j0_RdmtCvmduouqoe>1|r{0&a=?CrZ8A*GCxRvZq}ryX(T zkRp^+RM{pYRO-*7m^#V_0}+J$8I_Xo6~JVXvbi2$H*Nxqvcw&T=MNl!){pbVKmW^= z;A7$XakXO#cDE8*B$ zo|@@#cR-2sz$yhW1?An|y1u%Y%$Dk{SUz?`*oc;-6QK2&+r!0rcJ=>tO$1!cYmMRt zJAVSG=9`w!TQ^fdKCZoVRQ~IJS%!neQU_SFJvfs+y)Db(HElG4Rg0k)(nIfcZ7wJ2 z8cWZ=)|#ZPWh~OI2pbdo#e+LQ%}xd}!M@d3)B8WV0!lDqdv_`Tck*N)rf#7w;A0@W z{aPkl#jF?O={;HV8<$ADnqU7oi?5C={e%9aewvf~T|Xta4`JV+C~Hf#?G}_6w*J=P zL2$KN9!Yb!J`i~bhv@x4?h{be&?js$mcevNW2}b@92sWEBhhQN#?kFD&_uJiCIgj1@ zCS5xuj$XpVC4X0UWs2+cq)=S9Fob9q^B(q(M+bNZ76yRiWUGXu_;1O=wnRigTJXQr zkY8$j=&!z$KkLJt z&W|MBIoTOW-2)tjF4X!-C#v&Xx%pSJDW!F}v83XYudG^5&Wz@}$(TR4mWJ^^lF-%C zQ5FD(v8WUFHRIK4zS2()k6k2n{oB&^(nxv!)zM;wBp*p8K#Y2^xEyPza5|XCrhIAs zv!5s+B1x=E=uF_*f;?*opG#Ak9XpeF7gbgXqwIIV_;?7PejOlL@53%r_tY|gK;I4fB1NH^t0^J=+J+dJC4RXCSP4ANNM&cDU* zGixQu@k22Ngek=~ZCWlw&mZ!p`x--b8FBJx!?QVq2uW_pK9W~bMwxCq*iuqb+5hly z7hd~C1wX6$2|hp^144ph-Yc0``&u*s$B!vcG=aRv?|x)>QGT(|3$^iB zZFuu_(e3Z#Gh_e@uuEN~LGPQ_GOM$@x^n|a>r+P!YjS{whBgotB)FWDojt9sTA?XA zrRx?5m}CjqWyT9f0a^g}>Bz>%;p#KT3P8$MalHWkt=2E@YLJ|N*mb}ANZ;$Z!JOfv z*))UtEsnmSiTW??D;sRrm$CSJTOn`DYXcUv-kUhoAK*>2DG}mraWxD@r^ZQDS==-Y zenPYqhAy{Fd25SS(SyjQcq>RTNz=pt%)OmS83_srZt3qfIUi|iHrf&+U^4|sNlT-X zrR17>+LliVpnU)S9epEE^%7uc)q112W#JCbol;l%j`sNh**HuBFe9fV(r5^|EZaf< z%Le*k#62}LqaWzXgn{lLk4~p~93W7qcbiH-2BD#$71qA;aT2x+D}6mK42IyP0*{1l zTgc{%weMw9SV9G|SYw05v_$@(%SY({6vnZB3FGBIvPZ+6743zXv&&1hwf@)g4~fNg zN82v1M&{iAb2NU9HmJLvF#i~Ca*qgFpAvU5agj0f?GIYp`TwZ?HZhHW>7?iblAs#L7Rze$g9JJDGPQ6)XL)Mu+Y#@h)Eu&edQTBF)^subnw?~v8IsH z<4y-}N^n80K134kB*~+gi&4^K6oCk~3I_h${gMh(AQRVonW#FM-qMIzJPNOf#V3K- z=FeAdd>sjfhVmO0Mf|sdup-W-p?`+NE?q3G)%x)$*me&&%xk#9g%+l>UdP0WP{f;D z*d-VY&>x;IbF zk>~enAg_kQpy4R{5UhFuq>)`MzLUYMRh=nSaCEGlgg*ho6B62dUc8M<;NrmL&)7N) z`=j2Igr5h0jqslq5>Nnm+QQmlWMpJ2*$%Vw;<0}lHXq^sJ0KxHKleh36Awro;gZwY zwagKFkZ+c4Rup7Jx06!LOjNG6L?mx(4?0(u_6Yd_pG;g=We+;+@-F*yT@X4 zF?Bai;qhiMut-Eg0%jzcQTVG)Ku{1>WQ9g%#?`j=pXG)__YX+~`~RIJit-X46z*QH zKYrSz=@&FwVXA!9wKYMJ0TYb2^ls;Fb~s(JO0s}zTiYSm;K&F$lCr66U8jQ}!&0@u z*N%L!B{f$v^}pGm%(sMmGN&2q?-vQ?8#jj4ODN0SaLyu1!b`S!hk0iXfgvcCb)>!8*D905(O@3RbTT+CX* zdpjEx#a^+gHGT_=jxGRVZ8HII)^YNwP5>){i-OiO1cE_w_i7X*zKQnq zDYgEEQveJF=9lu^;cmtCFXU9llKVgNQ$p{+m*ycDqu~9w$)^PmFn<;@K($`&Ak0t+ zA27I36Q6YjVpszA>+CkgMECdM_<%O)!*K)91&F%}uD5{@Kpgg%dh0vGJA97jzYDN# z+Q#s|fk;Nx2gl*TGmU=RjM#V%_9J)>qSn~4!`Ml(i0o|z%vZR%)4vs3cFRp|F2%s~yiBf4LeN3}u!|9~%M4aK|XTa3=*s#3b} z?X)VR%%mjoaiv-DuD%L@q);?BH&2I0BtV#)oZQc~GE@Gu{`V38Mq^n2J2cimU@Ojc zPUL)-VLUHOCCbg7fxGl68ny?=0GKYi3Vod}D#?qTscBep%^ONDl80a}lp?Dxj`|>B zse&AL{$KkXA!!!u`v<4Mpt>)O+oW?j5juRu>IoBWgB4}sON9r)N@XLu-XWi5B>!9& z0H%Ng9~4NZ{Gr&?u*?5JL$-ZLzL+S~ehrYXl0YF27%LNPp{AOW=0C5zwIW@QEM1IU zUSl(7@(}Fg2CL79w8alxxj~RU2Bz=ObF;ohwy5?kk$owA-*SCh_U83i2V86AI5Ek& z55xHU3N_&wB~#ScNTWC5k+u5#!w4FOeXnOZI5Zrr(RGyfs}U}BM1KGJ^1mGEph^V; z<{bqbCegOnhr74l^%>zURO6EQN;7LD4r_5&ON2JmCdVwW21&=l!cgkC~HW_=q)*dEZKjH|zY%o%vD83w=Cz!F@Lc<7}RY z(*ih%kGyf)y=W6&mU*gB?AAg>ZTI7&e3G?6u-{AHrc)&pNp^ECd;56bkpQPLOy=G~ z=!L0LT}W7_ZQmZ9Q?sf|!#dwCZqH3J;8-#%3U;COBC1;n3(M^4JNd9atne51dL2+w zHt&>@!>_Ooh&OVG-1W?>P2<8j2t*3W6&3goaeZ!1&Wh!od0+ zJ}hdiayAq@T2Z&;{4p9F|Xk8WeNB~v8SdoOEjJj!{@ zI;H=3QhADF>a_AWT26GNU6Ozx11p086()J5)8Z!)=O=Q+=|g@zHqQxuh9YL8=*xKq zkP}v-houB0Fp3It(`B<^K4W0zSMZ)PKrZyAc zIs3I}EhLxQ^|?lA5~n*uwP5txgcpof8-$%!>pVTZA5XfDJBXt7F+czO3B#%v6=mW* zTTDuvUXJA^jq`T-`%jUM?|L zZEvcDa7mZyFQL1Eyur7$_n9#{7WyEI?f)f+l%pJz{Y=te)8F=DOWh-NH_@rLdbiCr zaZzg^KtzCKogM-nd@VaW+jeUJIrAQe&y#}yK$^&EEx;D=h5!UE?P^p!QNQk?^R zRuE8$mWHM#CmC#3dF)!vXQ%=uz+=|pd)X>ar4a}`4jElbGM5h5Ix;(YwE6*G2lZsT zH_LT3$qW5v%;~h4`eOiBD`A;u0LZ@F?aY2WU>9OmZ*N$u%qQ!`@$a;I%|dOJQqcy zejL|v-yxc4U=i`Ew?LuQnTjN6MCf*V>S)CB({=Xc)I*P*=_G4N%4ygWEu)Oc=E)lE zpm~&+-}#aJ!crYRYo-utwqjBhIBS2y{6(FJ=}QrbhR5)k&meZo!=-RqlzQtbd8mEd zX+@a5%$P)Q!r-ceR3Avf&vUszEwj!CqF9~81(pQTMK5 z{M}t(qE95>=;+@y=3-q`%Z1loGg6X(J#}}V-S~Ub4k`E`w_)5vxto;ADM>)0uCJ)n zGB(K#4?3yvQn043k+d9#hGXu2=ZN5ZrgpyECtZ}4mH)2Gb;ADRfG6JyZFOMmyTk5i z%3l^i9pX9DU?cSi0lOzTOK?l)KT>%)k03^ibgjywxF0NFnR504;<`DmFRfLds6wcU%eIE7s|wLL(=dw|5wzd(eAx+0I7VutS* zArk#;k(ENdMsYr-n2Z$er*iAP%p&v0Jv#t}$lxy9ns`Tep{Fnl>p}2t@IgoNib+)0 z_y*K;pIsz3oRAD9by{n$A*M~6#f#_JnI*DOG5&k@yjqGqD-Gv##$m}%#_?6%qOFaZ z()sE3<%Kb-r#aPcD}Kr;i`D`^&~x-t*^=T>FpLl-5H0IWYn=u48Do?C+|evJY@47T zdDOS#b>lOjz|Ic0poFE5|0K3uyfL>QtX z5lX?@+vTdzOUzXfk51874x}65FlK9AMhax`DUF$9QOP_Zm56 zrB>gFwE&8y(fvv%*Lx{7OW#;5stWA?&SG)4wiowJ{(39JJ zu=Sb2q#7H_x@}*ce&=?wqV3(wtJ=1JDr1g_U*6LV`IT=kCV?Cb1@wg|%jcNO%qaVZ z{r#m`fv3$|pf{pv&C=AdYC+D}|Aft9OC)7_`2?JU5o);VY%~x^e17|x zw}nQ=G>Kj>3NWAhVcLD&!;GAc)^z_#Ud$hK?m|1Tdba1Z6ETXkf!8xJ(G%wU zGYhmR={w@+kTg~m@=0Zahob@*&4)LaN1vIZ!9$_o$R@oR>no(?S)2~@FFTB&be4Gn z^58{}KT9h*u88zl-3L=j&$mK3wL#}>?c0Uuyg(KAE&GSHtATB$&x&yKzk93|`g~G( zqbJA_{8qtK@PiRrcFtnBcbEsf0GJM0 z{H^e|f=5h7M~d!>N1JzE^^cpBPlw(C+Rm)K{p}QgY2D2$Br7&b*#0FDJEgpPShh9n zwlMg@Lx1@f)WI3JNgRZBV+T^&_6pg_W59d zw4bdeg8amk3;Dh7!f3d^`taa_?o)idY3{@AkKUFc-Jakd(m%toHiq0I2ED3IUQB_M z^HcAb)~x7p<``()^1sYG*yq$P>UWVO+mDkCPkZJ{pr05+jqil-B@c7D5a}l$Dw5TQ ziJ68z<0hiBFl<;1-Sjf=+S|HV@`#PsP4#@>3}*5a%P@IcqRMMe6rjLsC zn%jCdr&K(?=xoezN7u~@566v(Rs3A8^Ibu8*7rwTlK7OZh{tGOagrgpJoRj| z_`?zgMtp!l1x{8911ua!0M8TI4V+~1aGIHN5o-NwB9Z$WG(Ua+2?8po$seKlh z5&l$ECZ-=L)hIL{R}=y)L3{bNE7TK_jl$F!YkV*EvwC9+1Cx%xZlZ{8Tn-ii7}`n$ zlp&?0JN#}(5mlr6jhyvJ3(DFo{9dp`wkZsxA|&5@s_mCn4M;?6_b)d(ncfCc3w}hA zb^{meaWF&aTV7Kl)X~I32jM)WZv}J=i8vj*;+~_rSOkcRC~OFU8_~I>nUF}+;6%+* z6QK+=T|C^Jt&JOxTX2EHCq^8h(({G4Ih<-<(bc8+QnYnsLUJIdeRQ*Pe@$FHcn;fJ zxKAG04aQ;lIZ&7@xu@DwLzODTvXxFdFKloKNP==xF+`>MsZO6U_+7c8zTH}SDso0N zyC|@`Mw4V#Bu_^+(w=~Jg7_Eo-;MU|*TcAWuLg=`xQ!lPBdv!}e+2etfE6cUWJCtC z?Ua-Yjhp~^31ETp#Ov6c7A5qEV_L~+g6^FVT)(M-xP6j)Kq5eH-o{kllaI>}pxi1; z5&N(d8S-)frGAe0pes5m`$TT00;d`s% zhWBWS>;jby6TGcgALg#@r5dgDG~}?1_DVPlEM!_|7CAqZgg9;!IH<0FkIf%K=U4rf zUK4d|Ur*k|{zhDWhb-HBA+pkoTS0!w65TF2I8{_KJNsGqAnts5VNC>LMgr%3gkVV2 zw9Wu8?MkframP2AGcmWtMQO&#TZhbWmoF9#%IxVt2F zg>*2anR4CBX9a@1Zjx1aWnk_t6Ktp|fkWVFynsBePoezH|56-xZY=AA! zs|#-Pq1?xf!dn%39lD-`{B}Z~?;3oG4!BQq_4LHyqB*`@7tvp^ ztt3kj1U0+&@HfGNijTQ34VSprQ;Yexgn2J7SU2>qZ|$$!E_U(PjE^9^`c(DL5)$GLvycIjsb@ktiGQ6mnV zYY9Q&6KcGEiua_CG~30POf+En@)m*i%Y|;ak}kJl;-ZKM;L7wx?Hw44Hf-~i>7?}R zaXKW`8}C1udXy0&FFQrFe>#~&V3p#*3mveGXZ`NHoAS(Yd`+%TzhvRzMSHo zbJ~ww8v$A39sLGF*xqzcX_}!QCs~)4-7qnyX1oFxL@*QCgeB5g6TE^jBOa?}#(8f$ ztm4FNekr`63Vl(FuFesAOFQ1uJ@v=M*wG`5ur3`jxJH%@{5MR>^c=f7qBq|O-bi8- z<_$Y;HQC9TT0K2kIs4f82u?_aD0_hhO5YLP@Q?eM;E|e*h@+c~aD`U16NCisIDQeC zg@!j)3H9YiW+1D^d&A)PQ{l9`+kIvzjfZhl83sY8(_1_aA|XUT z`v9Y8Y;`>VBKM#VwpI{Ykx8F4AAnJpSkgLV;4rPpYR~7lkDR!(MI~O=yRzULka!|w zY}%m+n@{qru#0D~S?+H+;XCd13slM4X(6KsZC zvAZ0HlZc@+4zf5r_BH5OG~CV)@JY)-_5N@cJ>D!qmeO5NAQ3j^y$4s>4q0mIJ>ZKx z{f;fZYj^IJ$t_&$l8o#QF(IqZvXip7goe0@{N2s zQdNya0%8*Gzd%%y41<@N+u*E&dq;vOUF2lF&Td zC|P~_BL4}bCB>@tn%W*DXDb}I$C}#>_*>$i(qz|92AXNoT6K0md(o{(D(kge(uhAv zd?IP1p&w_{Xcg|d8w?_llCk)LBWBOJ;-R_vcu2$8ILOr0F&{)^5yp_mH`d~jN!?(9 z8PXK(m>=jRo6Prw^#*RgYW)lz4IOu^CnRbs7@#3+1(6uiu0G0B57nAYr8t#Gf3i}Q zz;2a@xXCi!Sb@E)c0DsdCK&JV@u5+#1OdD}-9IOCj*J#$*bkT{E3SIO2isqsJ&r18 zyu@El^U{0#L(Jx(sqxrQHnw;YlTT9PxTC&D=-uGN@`rsUCDD#s#$;O!?TkFdkarK& zY(i?qPl7>Fk))xoely>sp*ND@Y-K~wAc3`zbb8JsLXg*}pWDM}2C+VfQP?l+$emZdg(z~4awp}hp9l8G7 z)R3gl{7LqtxBB@V-n^W5Xx|{%^zNbf3M`}xEe-MbBH?4d%@vA}t{N>pkqq`Fi}F^E z`L2BxCWX*aSURFVO8iBQi;+B%w{@<2CX)ah;q>FnlB|=*Y&!Oy0jYcbnp$jw16pqa zlg6W9WTc%P9BGcKg>%zVfjS%w2Ne1A?AE20r^NOLWMhU{nEXMNjjkwFLS``|1K(GjY$w)zx>tY~5z41~POT z%3=;zAx+cJG+Gre5$6Q@?)Qldo$8 zJgtm?Z?H0SX0h8Pj;@ti)m{zK`^I4xH4FSFB`lxR4#SFiV zs)l-hvR!Cl_Kub*Coj_AlP8?C1jL&)oSYZ~LUi&8<&H=w98T-}$R-)Wwf!>lRa(E$ z0m``d-po(CTE}H=8T*W(Lln_ly%^qk3~(n@c4-6T9hL%cMW-_u02|WmYNtopTj%fH~^ zdEz(CI@fn(xzG#KBljRSy4V?+Z};*jA+53=QxP|ytx}C2k9Uy`CR0qnBs)vg!jz#S z58aL%yZ{fK-PlEy+m$xZGUa~>33{6xmfuVTF|J!~fT%I4;&I5FIea6&JvjXdnbCl+ zyICiCpEUEnbQ0C?qo|m%7(TDWl24x69F_{QvB~{d!}2sp+?yo-o@VBvJhDWmuOA1% z-;$a|k|iD?9I@)cFH_x6)kKNy5)F}oq4>?dMr;{hAU=CmI%Njp9@yIh!$vz|1syds zXhUZ=4L$UvSr_K%-36cXno; runs all the migrations @@ -39,14 +41,10 @@ Ensure everything was set up correctly by running the hooks: You can add new `pre-commit` hooks by editing `.pre-commit-config.yaml`. Whenever new hooks are added, you must run `pre-commit install` to ensure new hooks are run on commit. +### Linting, formatting and type checking -Linters, formatters, etc. - -- **Pycln**: Formatter for finding and removing unused import statements. -- **isort**: Tool to sort imports alphabetically and automatically separate into sections by type. -- **flake8**: Linting tool +- **ruff**: Linter and formatter - **mypy**: Static type checker -- **black**: PEP 8 compliant opinionated formatter There is a shortcut under the `/scripts` directory that runs all this tools for you (`./exec.sh format`). diff --git a/scripts/format.sh b/scripts/format.sh index e5a61c7..440387a 100755 --- a/scripts/format.sh +++ b/scripts/format.sh @@ -2,3 +2,9 @@ printf "\nRunning mypy...\n" mypy src + +printf "\nRunning ruff check...\n" +ruff check --fix + +printf "\nRunning ruff format...\n" +ruff format From 03b26280f81a15bcd51b27ab9d171503cf45d486 Mon Sep 17 00:00:00 2001 From: federicoVallcorbaX Date: Fri, 20 Sep 2024 10:55:03 -0300 Subject: [PATCH 3/5] Add ruff to poetry --- poetry.lock | 717 +++++++++---------------------------------------- pyproject.toml | 6 +- 2 files changed, 129 insertions(+), 594 deletions(-) diff --git a/poetry.lock b/poetry.lock index 904164e..86ddee9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -30,26 +30,15 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -[[package]] -name = "ansicon" -version = "1.89.0" -description = "Python wrapper for loading Jason Hood's ANSICON" -optional = false -python-versions = "*" -files = [ - {file = "ansicon-1.89.0-py2.py3-none-any.whl", hash = "sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec"}, - {file = "ansicon-1.89.0.tar.gz", hash = "sha256:e4d039def5768a47e4afec8e89e83ec3ae5a26bf00ad851f914d1240b444d2b1"}, -] - [[package]] name = "anyio" -version = "4.4.0" +version = "4.5.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.5.0-py3-none-any.whl", hash = "sha256:fdeb095b7cc5a5563175eedd926ec4ae55413bb4be5770c424af0ba46ccb4a78"}, + {file = "anyio-4.5.0.tar.gz", hash = "sha256:c5a275fe5ca0afd788001f58fca1e69e29ce706d746e317d660e21f70c530ef9"}, ] [package.dependencies] @@ -57,94 +46,9 @@ idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] - -[[package]] -name = "black" -version = "24.8.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" -files = [ - {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, - {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, - {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, - {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, - {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, - {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, - {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, - {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, - {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, - {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, - {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, - {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, - {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, - {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, - {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, - {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, - {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, - {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, - {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, - {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, - {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, - {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "blessed" -version = "1.20.0" -description = "Easy, practical library for making terminal apps, by providing an elegant, well-documented interface to Colors, Keyboard input, and screen Positioning capabilities." -optional = false -python-versions = ">=2.7" -files = [ - {file = "blessed-1.20.0-py2.py3-none-any.whl", hash = "sha256:0c542922586a265e699188e52d5f5ac5ec0dd517e5a1041d90d2bbf23f906058"}, - {file = "blessed-1.20.0.tar.gz", hash = "sha256:2cdd67f8746e048f00df47a2880f4d6acbcdb399031b604e34ba8f71d5787680"}, -] - -[package.dependencies] -jinxed = {version = ">=1.1.0", markers = "platform_system == \"Windows\""} -six = ">=1.9.0" -wcwidth = ">=0.1.4" - -[[package]] -name = "bpython" -version = "0.24" -description = "" -optional = false -python-versions = ">=3.7" -files = [ - {file = "bpython-0.24-py3-none-any.whl", hash = "sha256:0d196ae3d1ce3dcd559a3fb89ed2c468dfbd1504af0d680b906dd65a9c7a32eb"}, - {file = "bpython-0.24.tar.gz", hash = "sha256:98736ffd7a8c48fd2bfb53d898a475f4241bde0b672125706af04d9d08fd3dbd"}, -] - -[package.dependencies] -curtsies = ">=0.4.0" -cwcwidth = "*" -greenlet = "*" -pygments = "*" -pyxdg = "*" -requests = "*" - -[package.extras] -clipboard = ["pyperclip"] -jedi = ["jedi (>=0.16)"] -urwid = ["urwid"] -watch = ["watchdog"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "certifi" @@ -157,105 +61,6 @@ files = [ {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - [[package]] name = "click" version = "8.1.7" @@ -281,66 +86,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "curtsies" -version = "0.4.2" -description = "Curses-like terminal wrapper, with colored strings!" -optional = false -python-versions = ">=3.7" -files = [ - {file = "curtsies-0.4.2-py3-none-any.whl", hash = "sha256:f24d676a8c4711fb9edba1ab7e6134bc52305a222980b3b717bb303f5e94cec6"}, - {file = "curtsies-0.4.2.tar.gz", hash = "sha256:6ebe33215bd7c92851a506049c720cca4cf5c192c1665c1d7a98a04c4702760e"}, -] - -[package.dependencies] -blessed = ">=1.5" -cwcwidth = "*" - -[[package]] -name = "cwcwidth" -version = "0.1.9" -description = "Python bindings for wc(s)width" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cwcwidth-0.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:704f0d6888aa5e81e76d9f76709385f9f55aca8c450ee82cc722054814a7791f"}, - {file = "cwcwidth-0.1.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0633158205b50f253ad04e301156807e309a9fb9479a520418e010da6df13604"}, - {file = "cwcwidth-0.1.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a5407d0933c3aab8ee92cffd9e4f09010f25af10ebdfa19776748402bba9261"}, - {file = "cwcwidth-0.1.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:72490e07dfbc599fdf6efe26a13cfbf725f0513b181c3386d65bfd84f6175924"}, - {file = "cwcwidth-0.1.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf71151ae06e95f266bef91392c1562539b2eed847fd1f00f7b5b4ca3fd41a67"}, - {file = "cwcwidth-0.1.9-cp310-cp310-win32.whl", hash = "sha256:3e3c186b5c171d85f2b7f093e7efb33fd9b6e55b791ff75a0f101b18ec0433cd"}, - {file = "cwcwidth-0.1.9-cp310-cp310-win_amd64.whl", hash = "sha256:ae17e493ffc18497c2602f8f42a0d8e490ea42ab3ccfbe5e4a6069a6d24f3b36"}, - {file = "cwcwidth-0.1.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b1c3eb0a8c1b25c4a17b6b9bbf7d25ce9df3ea43b6f87903c51bc12434a2cc29"}, - {file = "cwcwidth-0.1.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c8752815ce4e40e7b34b7fe039276a5fbfb1b077131614381b13ef3b7bb21ff"}, - {file = "cwcwidth-0.1.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:368ace13080dbaacdc247370d8a965a749b124aa50d0b1b6eb87601826db870f"}, - {file = "cwcwidth-0.1.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ca9a653661e152a426bdb51a272f36bc79f9830e6a7169abe8110ec367c3518c"}, - {file = "cwcwidth-0.1.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f96386cc29e6eef8ef066d7dd3c767c5119d66506dabea20dd344dabb3f2d225"}, - {file = "cwcwidth-0.1.9-cp311-cp311-win32.whl", hash = "sha256:f6ba88970ec12fdbed5554beb1b9a25d8271fc3d0d9e60639db700a79bed1863"}, - {file = "cwcwidth-0.1.9-cp311-cp311-win_amd64.whl", hash = "sha256:aa6725e7b3571fdf6ce7c02d1dd2d69e00d166bb6df44e46ab215067028b3a03"}, - {file = "cwcwidth-0.1.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:42de102d5191fc68ef3ff6530f60c4895148ddc21aa0acaaf4612e5f7f0c38c4"}, - {file = "cwcwidth-0.1.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:877e48c615b3fec88b7e640f9cf9d96704497657fb5aad2b7c0b0c59ecabff69"}, - {file = "cwcwidth-0.1.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdbaf0a8dad20eb685df11a195a2449fe230b08a5b356d036c8d7e59d4128a88"}, - {file = "cwcwidth-0.1.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f6e0e023c4b127c47fd4c44cf537be209b9a28d8725f4f576f4d63744a23aa38"}, - {file = "cwcwidth-0.1.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b4f7d24236ce3c9d3b5e07fd75d232452f19bdddb6ae8bbfdcb97b6cb02835e8"}, - {file = "cwcwidth-0.1.9-cp312-cp312-win32.whl", hash = "sha256:ba9da6c911bf108334426890bc9f57b839a38e1afc4383a41bd70adbce470db3"}, - {file = "cwcwidth-0.1.9-cp312-cp312-win_amd64.whl", hash = "sha256:40466f16e85c338e8fc3eee87a8c9ca23416cc68b3049f68cb4cead5fb8b71b3"}, - {file = "cwcwidth-0.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:167f59c3c1e1d8e231a1abd666af4e73dd8a94917efb6522e9b610ac4587903a"}, - {file = "cwcwidth-0.1.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afc745f18c9e3c38851a931c0c0a7e479d6494911ba1353f998d707f95a895b4"}, - {file = "cwcwidth-0.1.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8d55c47cbec4796e89cfedc89c52e6c4c2faeb77489a763415b9f76d8fc14db"}, - {file = "cwcwidth-0.1.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c858842849ce2cfdf207095253da83831d9407771c8073f6b75f24d3faf1a1eb"}, - {file = "cwcwidth-0.1.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc049ce273f32b632f5ead649b2120f8b2b78035d7b069fdc460c4be9affddb5"}, - {file = "cwcwidth-0.1.9-cp38-cp38-win32.whl", hash = "sha256:1bafe978a5b7915848244a952829e3f8757c0cebef581c8250da6064c906c38c"}, - {file = "cwcwidth-0.1.9-cp38-cp38-win_amd64.whl", hash = "sha256:024d1b21e6123bf30a849e60eea3482f556bbd00d39215f86c904e5bd81fc1b6"}, - {file = "cwcwidth-0.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7d367da5e6fb538388817bf5b2d6dd4db90e5e631d99c34055589d007b5c94bc"}, - {file = "cwcwidth-0.1.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad721d9dbc14eafd06176e4f5594942336b1e813de2a5ab7bd64254393c5713f"}, - {file = "cwcwidth-0.1.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:711ace9796cb6767ff29095ff5b0ec4619e7297854eb4b91ba99154590eddcc9"}, - {file = "cwcwidth-0.1.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:945615a7b8cdcbcd8e06d399f96a2b09440c3a4c5cb3c2d0109f00d80da27a12"}, - {file = "cwcwidth-0.1.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ffaf706abe400282f299463594d8887566e2a280cd0255110bd4397cc7be2910"}, - {file = "cwcwidth-0.1.9-cp39-cp39-win32.whl", hash = "sha256:03093cac6f8e4326b1c30169e024fe2894f76c6ffddf6464e489bb33cb3a2897"}, - {file = "cwcwidth-0.1.9-cp39-cp39-win_amd64.whl", hash = "sha256:0ddef2c504e6f4fd6122b46d55061f487add1ebb86596ae70ffc2a8b8955c8bc"}, - {file = "cwcwidth-0.1.9.tar.gz", hash = "sha256:f19d11a0148d4a8cacd064c96e93bca8ce3415a186ae8204038f45e108db76b8"}, -] - [[package]] name = "dnspython" version = "2.6.1" @@ -469,22 +214,6 @@ sqlalchemy = ["SQLAlchemy (>=1.3.20)", "sqlakeyset (>=2.0.1680321678,<3.0.0)"] sqlmodel = ["sqlakeyset (>=2.0.1680321678,<3.0.0)", "sqlmodel (>=0.0.8,<0.0.15)"] tortoise = ["tortoise-orm (>=0.16.18,!=0.21.0,<0.22.0)"] -[[package]] -name = "flake8" -version = "7.1.1" -description = "the modular source code checker: pep8 pyflakes and co" -optional = false -python-versions = ">=3.8.1" -files = [ - {file = "flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213"}, - {file = "flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38"}, -] - -[package.dependencies] -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.12.0,<2.13.0" -pyflakes = ">=3.2.0,<3.3.0" - [[package]] name = "greenlet" version = "3.1.0" @@ -694,20 +423,6 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "isort" -version = "5.13.2" -description = "A Python utility / library to sort Python imports." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, - {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, -] - -[package.extras] -colors = ["colorama (>=0.4.6)"] - [[package]] name = "itsdangerous" version = "2.2.0" @@ -736,60 +451,6 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] -[[package]] -name = "jinxed" -version = "1.3.0" -description = "Jinxed Terminal Library" -optional = false -python-versions = "*" -files = [ - {file = "jinxed-1.3.0-py2.py3-none-any.whl", hash = "sha256:b993189f39dc2d7504d802152671535b06d380b26d78070559551cbf92df4fc5"}, - {file = "jinxed-1.3.0.tar.gz", hash = "sha256:1593124b18a41b7a3da3b078471442e51dbad3d77b4d4f2b0c26ab6f7d660dbf"}, -] - -[package.dependencies] -ansicon = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "libcst" -version = "1.4.0" -description = "A concrete syntax tree with AST-like properties for Python 3.0 through 3.12 programs." -optional = false -python-versions = ">=3.9" -files = [ - {file = "libcst-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:279b54568ea1f25add50ea4ba3d76d4f5835500c82f24d54daae4c5095b986aa"}, - {file = "libcst-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3401dae41fe24565387a65baee3887e31a44e3e58066b0250bc3f3ccf85b1b5a"}, - {file = "libcst-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1989fa12d3cd79118ebd29ebe2a6976d23d509b1a4226bc3d66fcb7cb50bd5d"}, - {file = "libcst-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:addc6d585141a7677591868886f6bda0577529401a59d210aa8112114340e129"}, - {file = "libcst-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17d71001cb25e94cfe8c3d997095741a8c4aa7a6d234c0f972bc42818c88dfaf"}, - {file = "libcst-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:2d47de16d105e7dd5f4e01a428d9f4dc1e71efd74f79766daf54528ce37f23c3"}, - {file = "libcst-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6227562fc5c9c1efd15dfe90b0971ae254461b8b6b23c1b617139b6003de1c1"}, - {file = "libcst-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3399e6c95df89921511b44d8c5bf6a75bcbc2d51f1f6429763609ba005c10f6b"}, - {file = "libcst-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48601e3e590e2d6a7ab8c019cf3937c70511a78d778ab3333764531253acdb33"}, - {file = "libcst-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42797309bb725f0f000510d5463175ccd7155395f09b5e7723971b0007a976d"}, - {file = "libcst-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb4e42ea107a37bff7f9fdbee9532d39f9ea77b89caa5c5112b37057b12e0838"}, - {file = "libcst-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:9d0cc3c5a2a51fa7e1d579a828c0a2e46b2170024fd8b1a0691c8a52f3abb2d9"}, - {file = "libcst-1.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7ece51d935bc9bf60b528473d2e5cc67cbb88e2f8146297e40ee2c7d80be6f13"}, - {file = "libcst-1.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:81653dea1cdfa4c6520a7c5ffb95fa4d220cbd242e446c7a06d42d8636bfcbba"}, - {file = "libcst-1.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6abce0e66bba2babfadc20530fd3688f672d565674336595b4623cd800b91ef"}, - {file = "libcst-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5da9d7dc83801aba3b8d911f82dc1a375db0d508318bad79d9fb245374afe068"}, - {file = "libcst-1.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c54aa66c86d8ece9c93156a2cf5ca512b0dce40142fe9e072c86af2bf892411"}, - {file = "libcst-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:62e2682ee1567b6a89c91853865372bf34f178bfd237853d84df2b87b446e654"}, - {file = "libcst-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8ecdba8934632b4dadacb666cd3816627a6ead831b806336972ccc4ba7ca0e9"}, - {file = "libcst-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8e54c777b8d27339b70f304d16fc8bc8674ef1bd34ed05ea874bf4921eb5a313"}, - {file = "libcst-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:061d6855ef30efe38b8a292b7e5d57c8e820e71fc9ec9846678b60a934b53bbb"}, - {file = "libcst-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb0abf627ee14903d05d0ad9b2c6865f1b21eb4081e2c7bea1033f85db2b8bae"}, - {file = "libcst-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d024f44059a853b4b852cfc04fec33e346659d851371e46fc8e7c19de24d3da9"}, - {file = "libcst-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3c6a8faab9da48c5b371557d0999b4ca51f4f2cbd37ee8c2c4df0ac01c781465"}, - {file = "libcst-1.4.0.tar.gz", hash = "sha256:449e0b16604f054fa7f27c3ffe86ea7ef6c409836fe68fe4e752a1894175db00"}, -] - -[package.dependencies] -pyyaml = ">=5.2" - -[package.extras] -dev = ["Sphinx (>=5.1.1)", "black (==23.12.1)", "build (>=0.10.0)", "coverage (>=4.5.4)", "fixit (==2.1.0)", "flake8 (==7.0.0)", "hypothesis (>=4.36.0)", "hypothesmith (>=0.0.4)", "jinja2 (==3.1.4)", "jupyter (>=1.0.0)", "maturin (>=0.8.3,<1.6)", "nbsphinx (>=0.4.2)", "prompt-toolkit (>=2.0.9)", "pyre-check (==0.9.18)", "setuptools-rust (>=1.5.2)", "setuptools-scm (>=6.0.1)", "slotscheck (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "ufmt (==2.6.0)", "usort (==1.0.8.post1)"] - [[package]] name = "mako" version = "1.3.5" @@ -902,17 +563,6 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -optional = false -python-versions = ">=3.6" -files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] - [[package]] name = "mdurl" version = "0.1.2" @@ -1009,33 +659,6 @@ bcrypt = ["bcrypt (>=3.1.0)"] build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] totp = ["cryptography"] -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - -[[package]] -name = "platformdirs" -version = "4.3.3" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.3.3-py3-none-any.whl", hash = "sha256:50a5450e2e84f44539718293cbb1da0a0885c9d14adf21b77bae4e66fc99d9b5"}, - {file = "platformdirs-4.3.3.tar.gz", hash = "sha256:d4e0b7d8ec176b341fb03cb11ca12d0276faa8c485f9cd218f613840463fc2c0"}, -] - -[package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.11.2)"] - [[package]] name = "pluggy" version = "1.5.0" @@ -1084,49 +707,20 @@ files = [ {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, ] -[[package]] -name = "pycln" -version = "2.4.0" -description = "A formatter for finding and removing unused import statements." -optional = false -python-versions = ">=3.7.0,<4" -files = [ - {file = "pycln-2.4.0-py3-none-any.whl", hash = "sha256:d1bf648df17077306100815d255d45430035b36f66bac635df04a323c61ba126"}, - {file = "pycln-2.4.0.tar.gz", hash = "sha256:1f3eefb7be18a9ee06c3bdd0ba2e91218cd39317e20130325f107e96eb84b9f6"}, -] - -[package.dependencies] -libcst = ">=0.3.10" -pathspec = ">=0.9.0" -pyyaml = ">=5.3.1" -tomlkit = ">=0.11.1" -typer = ">=0.4.1" - -[[package]] -name = "pycodestyle" -version = "2.12.1" -description = "Python style guide checker" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, - {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, -] - [[package]] name = "pydantic" -version = "2.9.1" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, - {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.3" +pydantic-core = "2.23.4" typing-extensions = [ {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, {version = ">=4.6.1", markers = "python_version < \"3.13\""}, @@ -1138,100 +732,100 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.3" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, - {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, - {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, - {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, - {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, - {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, - {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, - {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, - {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, - {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, - {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, - {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, - {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, - {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -1257,17 +851,6 @@ azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0 toml = ["tomli (>=2.0.1)"] yaml = ["pyyaml (>=6.0.1)"] -[[package]] -name = "pyflakes" -version = "3.2.0" -description = "passive checker of Python programs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, - {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, -] - [[package]] name = "pygments" version = "2.18.0" @@ -1351,17 +934,6 @@ files = [ [package.extras] dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatch", "invoke (==2.2.0)", "more-itertools (==10.2.0)", "pbr (==6.0.0)", "pluggy (==1.4.0)", "py (==1.11.0)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.2.0)", "pyyaml (==6.0.1)", "ruff (==0.2.1)"] -[[package]] -name = "pyxdg" -version = "0.28" -description = "PyXDG contains implementations of freedesktop.org standards in python." -optional = false -python-versions = "*" -files = [ - {file = "pyxdg-0.28-py2.py3-none-any.whl", hash = "sha256:bdaf595999a0178ecea4052b7f4195569c1ff4d344567bccdc12dfdf02d545ab"}, - {file = "pyxdg-0.28.tar.gz", hash = "sha256:3267bb3074e934df202af2ee0868575484108581e6f3cb006af1da35395e88b4"}, -] - [[package]] name = "pyyaml" version = "6.0.2" @@ -1424,27 +996,6 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] -[[package]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - [[package]] name = "rich" version = "13.8.1" @@ -1477,6 +1028,33 @@ files = [ [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "ruff" +version = "0.6.6" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.6.6-py3-none-linux_armv6l.whl", hash = "sha256:f5bc5398457484fc0374425b43b030e4668ed4d2da8ee7fdda0e926c9f11ccfb"}, + {file = "ruff-0.6.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:515a698254c9c47bb84335281a170213b3ee5eb47feebe903e1be10087a167ce"}, + {file = "ruff-0.6.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6bb1b4995775f1837ab70f26698dd73852bbb82e8f70b175d2713c0354fe9182"}, + {file = "ruff-0.6.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c546f412dfae8bb9cc4f27f0e45cdd554e42fecbb34f03312b93368e1cd0a6"}, + {file = "ruff-0.6.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:59627e97364329e4eae7d86fa7980c10e2b129e2293d25c478ebcb861b3e3fd6"}, + {file = "ruff-0.6.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94c3f78c3d32190aafbb6bc5410c96cfed0a88aadb49c3f852bbc2aa9783a7d8"}, + {file = "ruff-0.6.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:704da526c1e137f38c8a067a4a975fe6834b9f8ba7dbc5fd7503d58148851b8f"}, + {file = "ruff-0.6.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efeede5815a24104579a0f6320660536c5ffc1c91ae94f8c65659af915fb9de9"}, + {file = "ruff-0.6.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e368aef0cc02ca3593eae2fb8186b81c9c2b3f39acaaa1108eb6b4d04617e61f"}, + {file = "ruff-0.6.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2653fc3b2a9315bd809725c88dd2446550099728d077a04191febb5ea79a4f79"}, + {file = "ruff-0.6.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:bb858cd9ce2d062503337c5b9784d7b583bcf9d1a43c4df6ccb5eab774fbafcb"}, + {file = "ruff-0.6.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:488f8e15c01ea9afb8c0ba35d55bd951f484d0c1b7c5fd746ce3c47ccdedce68"}, + {file = "ruff-0.6.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:aefb0bd15f1cfa4c9c227b6120573bb3d6c4ee3b29fb54a5ad58f03859bc43c6"}, + {file = "ruff-0.6.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a4c0698cc780bcb2c61496cbd56b6a3ac0ad858c966652f7dbf4ceb029252fbe"}, + {file = "ruff-0.6.6-py3-none-win32.whl", hash = "sha256:aadf81ddc8ab5b62da7aae78a91ec933cbae9f8f1663ec0325dae2c364e4ad84"}, + {file = "ruff-0.6.6-py3-none-win_amd64.whl", hash = "sha256:0adb801771bc1f1b8cf4e0a6fdc30776e7c1894810ff3b344e50da82ef50eeb1"}, + {file = "ruff-0.6.6-py3-none-win_arm64.whl", hash = "sha256:4b4d32c137bc781c298964dd4e52f07d6f7d57c03eae97a72d97856844aa510a"}, + {file = "ruff-0.6.6.tar.gz", hash = "sha256:0fc030b6fd14814d69ac0196396f6761921bd20831725c7361e1b8100b818034"}, +] + [[package]] name = "shellingham" version = "1.5.4" @@ -1635,17 +1213,6 @@ anyio = ">=3.4.0,<5" [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] -[[package]] -name = "tomlkit" -version = "0.13.2" -description = "Style preserving TOML library" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, - {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, -] - [[package]] name = "typer" version = "0.12.5" @@ -1725,23 +1292,6 @@ files = [ mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" -[[package]] -name = "urllib3" -version = "2.2.3" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - [[package]] name = "uvicorn" version = "0.30.6" @@ -1906,17 +1456,6 @@ files = [ [package.dependencies] anyio = ">=3.0.0" -[[package]] -name = "wcwidth" -version = "0.2.13" -description = "Measures the displayed width of unicode strings in a terminal" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, -] - [[package]] name = "websockets" version = "13.0.1" @@ -2032,4 +1571,4 @@ email = ["email-validator"] [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "6b2f0e4bceaa019d3db3424328e0ccc9b4570e194d1fd8ebea99ff0e5c8bbd21" +content-hash = "f1e863d7e3145cbfae9523ea784186e5e96227556f7e701a6f961da3c3e2f4e7" diff --git a/pyproject.toml b/pyproject.toml index 8d7b953..92b056b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,14 +23,10 @@ sqlalchemy = "^2.0.31" uvicorn = "^0.30.3" [tool.poetry.group.dev.dependencies] -black = "^24.4.2" -bpython = "^0.24" -flake8 = "^7.1.0" -isort = "^5.13.2" mypy = "^1.11.1" mypy-extensions = "^1.0.0" -pycln = "^2.4.0" pytest = "^8.3.2" +ruff = "^0.6.6" [tool.poetry.group.types.dependencies] types-passlib = "^1.7.7.20240327" From 16174b7f1ffff43552c80cd5360c63c9264106e5 Mon Sep 17 00:00:00 2001 From: federicoVallcorbaX Date: Fri, 20 Sep 2024 10:55:15 -0300 Subject: [PATCH 4/5] format --- src/admin.py | 1 - src/alembic/env.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/admin.py b/src/admin.py index 905ebcf..952a1fa 100755 --- a/src/admin.py +++ b/src/admin.py @@ -28,7 +28,6 @@ async def logout(self, request: Request) -> bool: request.session.clear() return True - async def authenticate(self, request: Request) -> RedirectResponse | bool: failed_auth_response = RedirectResponse(request.url_for("admin:login"), status_code=302) manager = AuthManager() diff --git a/src/alembic/env.py b/src/alembic/env.py index 2c658e0..fb2f700 100755 --- a/src/alembic/env.py +++ b/src/alembic/env.py @@ -1,8 +1,8 @@ from logging.config import fileConfig -from alembic import context from sqlalchemy import engine_from_config, pool +from alembic import context from src import models # noqa F401 from src.core.config import settings from src.core.database import SQLBase From 00cf6e424f7bed67e530ac1ec919e930c13b67a6 Mon Sep 17 00:00:00 2001 From: federicoVallcorbaX Date: Fri, 20 Sep 2024 10:58:59 -0300 Subject: [PATCH 5/5] fix mypy plugins and overrides --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 92b056b..0d04b8c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,10 +58,10 @@ extend-select = [ # Defaults: [ "E4", "E7", "E9", "F" ] (https://docs.astral.sh "__init__.py" = ["F401"] [tool.mypy] -plugins = [ - "pydantic.mypy", - "sqlalchemy.ext.mypy.plugin" -] +plugins = ["pydantic.mypy"] exclude = "src/alembic/" disallow_untyped_defs = true + +[[tool.mypy.overrides]] +module = "bpython" ignore_missing_imports = true