From 310ef8391e4de9f8d833f3610e2a9fb7f4ef64e3 Mon Sep 17 00:00:00 2001 From: Mohammad Elmi Date: Sun, 13 Mar 2022 07:33:07 +0330 Subject: [PATCH] initial commit --- .flake8 | 3 + .gitignore | 167 ++++++++++++++++++ .vscode/settings.json | 4 + doc/diagram.drawio.png | Bin 0 -> 118835 bytes doc/diagram.xml | 1 + doc/readme | 1 + manage.py | 22 +++ requirements.txt | 12 ++ shortner/__init__.py | 0 shortner/admin.py | 3 + shortner/apps.py | 6 + shortner/domain/__inti__.py | 0 .../domain/boundaries/input/token_broker.py | 6 + .../boundaries/output/random_generator.py | 5 + .../output/token_generator_config.py | 5 + .../domain/boundaries/output/url_validator.py | 5 + .../boundaries/output/urltoken_repository.py | 8 + shortner/domain/entities/exceptions.py | 6 + shortner/domain/entities/url_token.py | 7 + .../domain/services/token_broker_service.py | 33 ++++ .../services/token_generation_service.py | 19 ++ shortner/domain/services/token_generator.py | 5 + shortner/ioc.py | 40 +++++ shortner/migrations/0001_initial.py | 22 +++ shortner/migrations/__init__.py | 0 shortner/models.py | 17 ++ .../default_random_generator_service.py | 11 ++ .../services/env_token_generator_config.py | 7 + .../services/model_url_token_repository.py | 14 ++ .../validators_url_validator_service.py | 7 + shortner/tests.py | 3 + shortner/urls.py | 9 + shortner/views.py | 43 +++++ urlshortner/__init__.py | 0 urlshortner/asgi.py | 16 ++ urlshortner/settings.py | 124 +++++++++++++ urlshortner/urls.py | 22 +++ urlshortner/wsgi.py | 16 ++ 38 files changed, 669 insertions(+) create mode 100644 .flake8 create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 doc/diagram.drawio.png create mode 100644 doc/diagram.xml create mode 100644 doc/readme create mode 100755 manage.py create mode 100644 requirements.txt create mode 100644 shortner/__init__.py create mode 100644 shortner/admin.py create mode 100644 shortner/apps.py create mode 100644 shortner/domain/__inti__.py create mode 100644 shortner/domain/boundaries/input/token_broker.py create mode 100644 shortner/domain/boundaries/output/random_generator.py create mode 100644 shortner/domain/boundaries/output/token_generator_config.py create mode 100644 shortner/domain/boundaries/output/url_validator.py create mode 100644 shortner/domain/boundaries/output/urltoken_repository.py create mode 100644 shortner/domain/entities/exceptions.py create mode 100644 shortner/domain/entities/url_token.py create mode 100644 shortner/domain/services/token_broker_service.py create mode 100644 shortner/domain/services/token_generation_service.py create mode 100644 shortner/domain/services/token_generator.py create mode 100644 shortner/ioc.py create mode 100644 shortner/migrations/0001_initial.py create mode 100644 shortner/migrations/__init__.py create mode 100644 shortner/models.py create mode 100644 shortner/services/default_random_generator_service.py create mode 100644 shortner/services/env_token_generator_config.py create mode 100644 shortner/services/model_url_token_repository.py create mode 100644 shortner/services/validators_url_validator_service.py create mode 100644 shortner/tests.py create mode 100644 shortner/urls.py create mode 100644 shortner/views.py create mode 100644 urlshortner/__init__.py create mode 100644 urlshortner/asgi.py create mode 100644 urlshortner/settings.py create mode 100644 urlshortner/urls.py create mode 100644 urlshortner/wsgi.py diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..d8ed724 --- /dev/null +++ b/.flake8 @@ -0,0 +1,3 @@ +[flake8] +max-line-length = 120 +exclude = .env/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..28999f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,167 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/django +# Edit at https://www.toptal.com/developers/gitignore?templates=django + +### Django ### +*.log +*.pot +*.pyc +__pycache__/ +local_settings.py +db.sqlite3 +db.sqlite3-journal +media + +# If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ +# in your Git repository. Update and uncomment the following line accordingly. +# /staticfiles/ + +### Django.Python Stack ### +# Byte-compiled / optimized / DLL files +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo + +# Django stuff: + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# End of https://www.toptal.com/developers/gitignore/api/django \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..33fe63f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "python.linting.flake8Enabled": true, + "python.linting.enabled": true +} \ No newline at end of file diff --git a/doc/diagram.drawio.png b/doc/diagram.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..ea719b7df4fb4866530ab3d1a6838cf45c72eb97 GIT binary patch literal 118835 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 z zD^*@(CZe)FKH46-ws*MRHUiV^Aih%=VU9@x?m8<-V)f-fn0ijy=f~b_77ox9JKlo% zt(Or+P-q~{LKq08Us@y%DHB5kJU~4(3{FqZ(N)>i_h6g9v~`z=24(kUq%Z zJ)_FEgucRK3GfE90`vaHXja1+0{i@np&3@}t**qF8?rf65J(*vZ@G>KvGqS};%s2C z3BN|rnU6Yd@n-ybcC3Aw-K{5?zd*4@grl5&ni@KaFUlPEw=grT^Y=>ko^U^f!@|qU zCUfNq;`l$57~I%z*%^(}zc^m%JmQF5jS}B@i+1$p}Y|t4g2D$qFK`3=sS-rtsTGFMVh2ZNtsDo03 z<-+)0WabK@*ubWdsV^jfO)Z4BAdf&Ejtr283}TXCSr))cMB!C=*)I=d&`5aXR#z*e zi*@Whx+wGdvZm|(1&229*AhT2ZT_Ws!xOQJmZ4&JGHY*aoB zkL50knY7qlqZLw3V$&JO5EzKqWVhHmU7`mUp#s^1B=?%ulMOo}W-N@XeN$VNd+Y#Pq|jfA0` zYw}0UT68}j#mUh^c3tQVXaB#HNTAA)OD8mMr_GmmTs<#WCWkh4!-`$B#zL58djC2_ z!&S_f;5=F&8Pw#j_arbs4hn)fqFC#28`u;Z>}?WHycplsqb8$~t=TuHLBZ>{Gov*P zM%iTnZCZf!VYN>8_mlkzodFykK8%CP7WJbiXdk=-a;$IOfCqtexVqOKRLEjidwS_&2i*3T*2@w<1BIi0tpqP zug9w+tV>h6iEVp^2H6)_4RHdTv54MvpBl4ukN+VG%bu%s4hjRueAeSofDB>VaHyB{ zIZ_mN(|8}ZB)|ftaZ2~uuu%-*73tkOF;GL;Y5sR+%q9pPzeN-Drgux{LviIf|pw9FYoc+KY{4M_Xe#1$HVZ6~JmQPWS*+Jn!XMm$>jFSoZrOo*GAP@}U&@Zz>p9lm_ z2i?bhl;qTUib$~QuW%nkJywAzU)PX_kX5a0c;8boW;PAl&UVG;s4sEdCtMi#_bpbg z4m_S`XHmTK)73t1)ov;moi6B2DAiC*Ud!aOroq}R^7uL2zZd^gTmnXM0fdju82Jrd zFrCg_eN@)Em~w@gi{re8fxsS9{us!%+Z=7`hgGArMjW}kkTG`J7e2kJL_Yg5i{TK) zRk4GOR0%V=#U_Gz%su~u8ZGaVO!n||6s5@g73!)?rO#rEGf^~k53nU@PY{Z}Nu$dRBY;_P9S0FB zg`)gA&y!z1b>@@r7EwIFhM~_G&A<1MgJTFwxCIF%&V$*=LNvLA+w0#@CX==y**JkX zw>anQe{dYzYvrmo=X67G&!m{%!}_GT$I^K6CP-KrW;3&@<9VJ=5_Ato>s6RZc4?!< zx%M3(BjTF(r>b(WD4Ql-sli53-e~Nrv1|+M+ZUQgHxNFm(Z~AQxVH!zW8XC6ltWU- zS~4~YtYy2V#}Z9S>9lh3lRsJAtjHXuF+o&HgVe0cQ>Mv*i{!)OY*n}_+0;xVhm=#f z*mC8LTy&`kcKuY{{j(e$31m_VmYxag@o<&q*-6Byc97A~Hg^a|d6_Q#U6YQ)vIXc) z6--gFT4bNN{g}6P1!(M1>F4}f_cgv-{psDGdZn0~pryszkYK>2(@t36-6QZfgP{JO z&X30jOcf`){TczzQ}hA>|Mz-+!vfLQbxy%a5nD#$s`k4KAuqOX=4y1_F3dk2BISCR z>tA(LY~GkcGD54%4?+EHRoc(c^m)_ndIcJyJ6+HJhw{M0m8!0@mF`0lm*c&7*m3p= zYFEY7KOT%VyV>nyKdPXiL>LXVy8my9Fs({eHV{{O_oCc@qYjK7Rom~%RIpA9Ax~g( z0B{+v*IM|)}w{28zN(P8SRUb{gpobZa+3M=@yNM zWN|MeJy1Q-))B}D{=e@8-(}glC0|C=HFs}p;!6GtePLX?@Au%feyo0a-D)pHi$P^; zz;D;^&JOMUZyDDhrF6s%I~OBCoEJ%)Vrd>F#Fs;0IxnkB`mjnilUstV(5cx*d*1NI zUSXST=?jiniL|!10;GccpBp#-xxOKK^GBb?>wLGd_r-?w#f{;5{Ddk>R&$`^)w)7T z^@=!2J)>n2$q1+IMQzx+RE^u1J$8T6>Is?LpCta%Hz;T(981%g=q;NJt72Onnjw2B zmWG_-5t(W`6C%DEy7H}j^>cpQbygGabc3wsD#s;`vP_xoOu|eyUZghL2kq!WF7EzN zID|%(#p=Ce$Uo%A=(0oMtHev2h*08j`^R%P6RI5fvp09;pa7a((lrp~KJ|wh`oB2w zRRM$9kzebO4-H4w@IN93_8x%?&^%iXiQ-6R@%@Ds-=&AbD=(R}>WP*$Li@tht$zGc zoUB_H6ywjN_`A99kP>*tuhTSHh=0xF<3?)T`9u`gAxn_Jzk}rL_pn8DOn34>`}$am zcSI1|@_eBv84PJ~P_9ey?}q?7?pzKO1j1CnC=FuJ?!f`@B{wvFV; zxWO7r<2`o6z0UZ?hpw2BmPEi8w>-4*C#&QGO!rAd!#Y}|+A>{!amG)ZH*_+OfzAZ)NX%u`b8hk_B z@yDX=ddwX~N(hTeuoBTq z@K1Q|YTTs$>CZ>MFKK4CV9s7C9@D=&s`mra>pfB$U@P;`3K|s=u;S*GcrskE>AAwU zP~VZ-$Cpo+g}upVX@!<6a$>$YVS9`yS8hi=ttSBa$`B)=e94;x%A5e62w@`4MU$g^ zANWA?fz!NOOd8(6{w33nDbk)OH5|Wxe+1)s(a%`cz2xQSoXbocoJV{%UUhO z1*qgm(L!->l&~Pny$7^unBC*lkrKl`)>J_V=`=~Y*gEU?jpG5aK24w5E-~1f08o5{ z&T*QGIn|>?)EXWc$?fMBXVNM=Y*Pq7NLkwK>h1{I-eE+n`@W4!$=}G3vE>=L+O6XFVdhS?l7woN zc1hH9fNz-VbLxD*7mp&(!SYCWkvLw4?N&DwB=32Kwhd*`VIfqJV{(t+=o?!e{HC9z zkl1|rtbtR=bRr~5Pa%X+FDq4Fo$|zVOV|iZ4^|9crkos;e6Ox#J4Bb_X zq`L%fFxMlQ+Y5I`$oP#qQ<_o?VU)rnHYUQ5HkeM_u@}VR_JbygE9s_E@})4HIu~>b zf2Nj2BGpYLFsZl#5`rXz`Og)9^boQes2H=&(&PSq`URX}P{H+!H#^V3Q|Tq~MQCxX zu^Y@d<%IsNgZz0W!lK^IoI@5?V@2kUCQbPnqq#m%2+4wj$odsE>H9$FY9LAEVwJG! zzn0_DjPxVYH&+W>B47V|IaF{X$a*?8M96& z1sfBv^%`7+QAhIC*v&zf3@KtZkA)oR$t6EjtaGZkhdzlSZXDdt1sZ`)6ULS*{FU`5 z3aJW;L>H1zCkE3J(6?2cdtvJ!SFdn}DD4I-kV@$jP(>=zSeV( zD@uCxj)KO*Wg5ct$H6mA)EoO#=ge=!-BW{jEIaf`SQ6a$`nBV8U0W*(8?$fjGDe?H z_=_u`k(WJk5zrBA5DLq1NlE;c3X>&))@i^)AaI<0DJmte&H zEHT&<(Aw8x?=f2BsihWm6CVt!{QEa5P`ekege28Xb$EaBaPuC1EE1Od_g8x4+5;-6 zFPXK*^>)7QXX*8k0<&he<$W*i&F?B$z0Nt3SXmu^pyjiM*5G~xlwK9_QSI^L}3#4#n^+uJ1X zRyRF0VYoxeb4$f^ae(c#meq#u`CseruWaB25sI-cxJ{c{ zrP6)}Wzl>;v}NU{q^oJtDJ9nKJEM`IshO+)v`07p((C$?c<2~O4o7RK%36Xo__cIlaaHvkw&!75U>RAd=(*RM9eDN6Pp zE*fT1AY5;DCV=L!o~05y4lChjzdagu=Q??~rNd>K?5q!c9Lo%{d|>?A4-B1TlKh{^ z^nY+}^a}BGXZXM0th&)RAWVSj9yCHtr0#^0zA-WHqMT`oY_eU?G=>tk!bdPO*Q>;y zS`f9}3sj+==|bJ+PDIsmdhF)>Az+lc(q~^>8sLG?@*d-PiYhB9I2^Xc|5-MnUUlU; zyp85lguDu>kfXvMB~l5`T^71~beM&yG#VlLw}2m_6XHmx8nV3hX3@MwhcCeVDWz@b z1D*VO6!xQ_^gBMKLzYf7ceeMC8ssdluC%eB&F=yHRrL*{P@RBJ7i8|_zHK_3Mb886 zc=h;)3i2~-8`p4c>a0hOB+-&KC{x=;|36gSLq;(#SRZ`K3=>X%j$TkdAcorl&4MDmEQ74CUG+50zL97qKdI zykX=@D+z2?S3*jEYb_kte0NOJB58Q46tn3a3}6B()b09j5g!*0m^&Ef>IfW+VtTz( z=RP#v*q|Ams1%YUB}{)LJAGC|uv*J+ap-ZEdi9I3N2seo$1%SmoUODc42umbipd{) zI5vT$x6P;Z`2A7C_Xk5Hi<2|UH^wTB!fajDc28U_i!YrOZE1P;kFR3LCG!?=?yN$5 ziC;{liYrA<>Nh*n8Whj27y0!{((c@l*{jgLSaVOO6S}o9VHQH8VBmmtCP$Fc1rpL-+Db9GTV5vsSsYEY0ocwx^5wd2# z_rx-+^!(5pcEvN~CC_h>?a74vNgHQ&iV@*TGN~xFbHX0A`nX*GdszOSOnW8-eVR?l zd;Z4MXis!jBSoC6X}Cm{O?sYL>Zl59cOg6FO_LeFzzdDZX+lnTDH;I!+L&0HXO8bE)4&sS2s)TNOmpvJ{|G=r1 zexK+(wc)TBuA3<+2eI=zL$ZXNb_f8gycRCG?A%fQRlGcN67+pn<`%yW_4#){5*V*i zCIyodh^!7X%D-+<%HIo;vc5y&!AoC!3f;fUv39?!NomXqX)iQ>n%?M0S%1k>`RLWS zCrl=)r3Weoqixa__YnN#H)w=7F+eP1xoy><63FzY_hWf(Z*9fRy6 zOI6klcj##ww&h`b;^i0g;^j_?rFtix7;;{z2ldW{1}fdmIQ^unQobxUO3_gl*XT?* zI636N{2+}|1T?K1VID&hXL}?I0h(e__^VG3M!&KXT)aZ@9@`%Q{>6k%xX9W7S77?e zo5rB?^P|syb0z1+iQLr3$3i+};J~_lSvurq;LAyEUzE?&r%V(F%~$+kA-Y%^hPlfkgs7xoiSzay16_TT zV?qVnH!!j`x5WQq(?oIFCfpNXYJxiLG`U^Wa^0Ee?kD(pvOmil&1#zYw;uDW(g{@? zD4do-4DNJ)mdDn3AY1%n!bdhmOJ`|`UtLxhCcsb%ieEg6?fG>SOxegx?;Dh7_4;y6q&lH#*|&{8&#GEBX5(b-G%@ zH`8pnI3a^g{yMGJ4ldi-p^z>(lIl#80y44vySTefv+Sk&in_GO-AGSwFVSckc39M3 zqIw2>^ehSTyYHudGZeTiQ9AH#3O$8vU?Jmz*t}lbLkTZiam~-a6jQF*uxKu_VaVBq zIv&P3rsI*^a>or^x0wAo`u)}654xwV4}u2>w^{u1LosAmBe~y5bYe1^To^L%T#WJc zw8=AR%qN|h4}6-b9gCXX>bLcmpeeCjJguiP%0FV*D{u7) zDxPB`^AN+SYLl7H5z?tJ3Us(J5^#iL>oEJ}@Hfp!>64$fo)9Hm2zh^Z%2vHi6H=m# zkA-?KZ=s3?cI2kIMcMQeB@L0(I?CXWqUOp^`p(9tx1Kx4#^HpN7e`pIO4!Pg$B!@1 zbt)*NC(M!ZC^(|d*$4cd;9wW$8-(Kb+@H7id=KYDkEUCLjrOeuH5Kw6O9$7~+RThcZI{!pl8RSC@d*DgK3muD zV+vRLg>#(emBO!euo`{-QEd85gsSnp&H=VpANNHvXE)35Je7p1#Kh+w@%#xN}kP zV!?rr>=&MADF#yhD(#NA4(}`@heB)}9Xj3lvKmQrt_F=1D2dTYzh%XFK}bZm4)P~6 zwvO>)y59>Wwn;b4YAEY?AB)7#%5qUo4I<^S6{@?ZN3zUA)q<7OwF#@Q0TIKMfW{TO z2O2~Elv(-i&x`sp1ZS>3`&RqbFy}N+E88VARE#WOO~?$i%p0K9#M*sVCAsh_3}O5V!!mmJmQ+|$-SPc zy@QAC5(mQ1;c6YGyYEca=6+ zskg<|+qGlC9jLT(;oA7=Mv$G^03V@5?6fM8<#QnSxlGbpn_B+ulGO=PxXSn&eDDy$ zE)y6>8@kE;+5LkS_fh{)VW!(C>NFRnLCP_hr*SUfl7a5hR19!23M|Gh_g#-*IE*(S zS^ZMyFSWHa5F_|#o9V`Ze!9e@f$=^IFye$cisHY;0;;9cbywH!Yq@jj15#esiZ9Kv zU3!r`ra1sKm#vR+s`MLE|MB@ALD%it5Tm@&7LC&u*5zK)mBzya&3?Zx0ykbR#!)Af zs)waz!Hz$+rBo(CM8`k+7FI+>_5yBWp9nVmO@&AAQ=KfBZjIbsDTJEAY8DARl}aic z2O6PJA8%*Be`5h=zYR|Jl~8+j>Oe|N>22pYG~ScW5rMnc`7pkCqJnYUeWt+di*cKY zaqYS=T^4myp1w6TQUY(>dJR6Tui;_`#%Z)zD(*KuagS>!!e4undHUe&C>bGvH30q3)_q#Kxjkr z+KZ&{rsk-?-)dzRv|hFWNze;!@~;!m5jv__jr0wYZr^ahX?X9w`HdKfsu{Az>UB+u zdLxu#oYWNaV0qthSh2GzeePg$vz?d6y-aRY>CZ~1FTh))aGMp*e|Y=Twm9xmxdO$x zou5f5Sl!FmzJ>731uNg7`qbX)O~g0xw8-Gvhtfc|RITE<_`Y4eRhee9q881dynxWm8=R;_IH8vaM--vNM zH|3!>kIFS;hg}U8dxG$9P2>ThS=%3~N(3jQBG=oH~9g3PzL zMVp2?<*9M^8HYKdXsz&wB2fjGX=CxLH^#Z_PsKqJ`Cl@I)DGiA)TT{m9sA8_Pn%VF z+3eD!3TQvb?w3DP5itAR)1b*2F+r6^9~uTe-H@xZVFH@v3Nt zxgy-AU*q{n^6FWTT(BoZQSi)L^3|&G>Xba zBcx?#wTK(4zes*-Zx?e?YZc=b8U2vd9>FV~z+=q9FMpYe@F=Oh+3x#DvHktg_b~4@ zrkcmVKcxGu5fsE?mIg;)LDbb@%a@hemZGVHCk7G;E^vr^Ygmt0BWhxbDy75_K|X%@vuUyCDAxa4gf}E)ZNBnbAy-Qw_HzQA&<}M zT^P^aL^Lwk4NEYG=D6c{OTd5;C`t(b&@wh%lKh~+bMUO%=POGWI)~O{$r`@TKJv&} zc(xi#v3Z{SX4ZQH@?4!!prn!@3WfP9C5DVMU~_O#zb@M#F<`f7|H8HdSE(+RveikKEpq*}WYkFY$p&|G zi>GYwM*sM;U5(p3D}AV1QPnbxY7UR2kFSQoL7;On#(=l!Jbh=@_ru3+Kxv90HXW4jGl9bB(L!>k}EI#XKPUfjx%aP6l3s}%Q8&(l%`H~L>ANuJt=+lMA^AS zQmzN>-h<;Wd2O)w1>`y38OEfSU&R-EA8^s6SgU-YOCj@`Q$lrlRJ;tqFxPOyyTwugOQnX3A$HCU*87o9jOK*;9`p*a zaucdsR?2vb)I{1iH4|#3pEi%u%C`m$#39Bmi@hvruH4}J&)O2yh8t^m7=KmW{T5xLm%KnNqXS`S z*YjnRxyYA%DwDos*%a|@DH_R^i@&@+uSV4uHh;$J58z(uF8I*rrb}I*Qm@?-v2wdc zy7xp!`+vpS@`2DgDEq$67kbj0<}Zo=*T|-z;3HF}mbfUukI;hJ0!dVNmJBY3cBw?Msxq?x~0cDb5pDF?0B^58BAMUwzaMxnv& zi}o`$N<_gNrokD$OW`&sp}6dD?Cv)OvyMmsX6ur5O)j;zaO8R`sOHJ3E6je~rhav2 zhsx{Las~qjPuACGQLa}@#qZm$Y@HaAWzA&()aWNjDPY?f;~D3&FRx7{EtfxTr@eaMQSLQL#&}3-G#`Ki^Pc*mQU!(ps*DKo|Cl+Mu^xuP zW;YDinVXvn0a5;3U?9O*HGUwHY{_t496ubzGFu+{r>4K~LDAiz3GTS`aro7EP{ZLS zGfn|Pit{ibOaxVI5F?JEOIk=r812baan<0mVxSql?67Rpl=6y7TC;4mkGaLtP4{xE z6#a-X>L*_GLr{pe1+D_3i2+c;ys|)U091m^eke%a6@Yj?f~!WPQ|t#b5!x1r^LK%2 zK?0xg<)!9ySiJl|p+LVswhX-!#==<(nHlY%=JKF@8B)n5WyYo7sylY+X#HeCOkt57YKfFX1Iy(dK^M@TRspIH?e8ddBZWdA~q z{1fQGJF02B*qh=abGyJ`xn#8olh4ctoC25Eg_&N<<_-h8m2F(+zo)*h=$m-8clII+bVr-)sQH)6y{z54KAfen>>VSC;B8iJ477QZ$Ud^T)LjRusFuG2DbnMrTqn$QYer|LMxHjBdD`Lv^0=hfvq z9!fsxt%5w63C9`TbF+$@Zk+4k@?BnOnJTqdb0qpb4xA_^GeZ}kRU(lq9U_3Ly$mA& zf;sLZe~o}Bgh!*v+Gt2jB{>wI8$Xiq5IGOQ(8&w2=~2g(vWX^%x0du}y!}-gskT zqe98z&byQXPd^Vr_;6@gZJfic2;*Q`&;(8jY*1K6OLkV;7k`0++UM>}kK7Vg+o zL_26Aa5;3;x|*F{%lc4z<5Oyn9=-N!`)F}P-Vzw-9)*~1f1IR8Y)+XlX$9ZsvcjMssam%IwlNN$jaoV%`=fp{_en+Tbz4S z=o(Jl`aXcbj!lG5!{ftXL4*iI9wvsi$F)544GX1s{8#8Em-N+x1xxj(H5BA{jd<)t zhe^S1sDs$2as3nSZ$Mq(OE&@6MtH`JjjhLw2Y20;Q#RM6xMFFV44>Wy9D{_qEH7*K zT*$`|5b@dgI?4%o`RCjbiI`~=Qse_7_jehhg?|7KsKnrj*K5T(dA_6tsEQ^dA)liG zMRmq8UJsnf@6v!*>m>Z!Fr@p}LYUa@6Di}iv1?c9P{Zux^W^y3Sqn2ANzHE}8T^Ds zI>`YT^Vp1g3G5V{4T)rA40+Z4i9k5Q^Xjyzw5ER#gi+C=dN|kycenu{lE3$kO}o^< z{Rn-P55$kw)oJNXS#e(;O*85C;ra%QQ3GA+Jr_@BLa-#EFP}viMAQi6bXh&P#8ti> zYJGPcP5OuZC)_sQBWTr&rUUc05bunsFRrWS+@(N!koKC^J3R*Aj>e3V5;)U5ArXLhrN}dsR z7NTCUbQeYxxWMM!M^0Yx9~^!GLLMkY37*FB^wa$;(Hzl9RF|(5KRBu*3mATciuA2b$pYe3X_g+|MO7ml)q9L%}6$9 zDC<9mLgmKnLAf;2GO1uR5hzy@CR~W35jKc6fp|jwIvg&T678rbo2Q~jHd*zX^a0V` zPN-B}3J|k9GZtO(VG^nFD-1@lf4GN8j{J=c$N?Wk15yWaA9@n+jBSC&ZQ(mh%JV}% zKis8nLft%kIz%btlYt&cMyW9MfGbDQGM`pam>qAsm&jy6|A;~->LLm>fb>bYpIj|z zxHw0fj8d0Jbc@0X(DX8)84&(?{DRD^NPZ;q~{7i_ymx=**l6wVqX@$x$@F5yQ9 zinl8su#(H{xsTDd7P$IuKDhHS;a~x?WQf1r3vPemoi<$Y+wr3Aw^PDmbsQo0EiP1g zuQT&yUzyA#yv%!pOvUmQ$H6_PIJ%{1+`v~o<4e~#{%#@;TH+rzXV>OhG+`9-4W&akY+Bi;ddc33$J#fY zGx%pIa<~T|zmr7}o+Ua}c_Ao&5_-jEiK+w^RoozD^Sa&(#8SWB)<4smO_C`H`6iJv zfO>kxFC>4=bZ%1Y_~DCzyZK_S&~rW{IcMl{v{cgWIZ8bjzcDvla^1ic&z1siLa@Y) zU1!ImC~NXb2QZ2sUK&!tNJY&w;QTOyABoLs;l~YQNxdy1E|_)B{H;zE)v3mJsIQ^3{_$@yD6k8Y;@W`fv0LaD5=66w$%Z ziV`O1beli5*z>C`?Z>x4KdzaI@d~r|Y_z%@gvG1~kbq(!nX=`R_;E#N?&d{g3S;E1 z}qj=StV19cpNJ_jsjEyw4J;(qL#uhvjk6w2fJWZtAVU5d@>$4;c=nqz8!L?QYWrrSDPY!gW zqV(OL9X-6;IKSUkFbg7jnonCWP%fEDkCV}B^FCn)FmuGaLFWRyfRpnVDc3Gjy@Z>QyH=ESI_)3jSa>~BR?F_!}j^LH{(;ihXI40 zgH()gFM#M4{&47+bydjaGKpKZyD^^nKqg8_%RKn!Nf62VXQkpguPyM+rcbVgjf|9a zWmrQG_IRn>Ca&AY?=BeAV$jq^g5*3|5Kr*$_<(Jya_8Iy2+b+xxW;LkXEXLy?UW0b$ z*1}rT?|%sCN4&$juZieinwkG89a7B=`&7#cL1XQPdKQ?#YsmS$9VGibjgZweM7Dgq zMJHeOlE@2l9Z7%PY{Fz-=LZN3^z2t5d}0DVlSbN>NUg}%gD*__}g6+h&UmiGF+0k5!A9b0k?ViD?;)y86IdD=G@^D_ zMiA% z_ldtrKW0e$eR5M)Dzkd>8%R1FzTBi=8`_P7gm6JZco(i&B{$;NvgU0+(UDC;+S~bM z*=p$a`JjS|FRw53kGtuqr$e1N*FJ)*?_|4*5yum+`>S_arBmVsdw%0E7uwN$xlYYj zckd+su@bbMA|n-lh>$QoJyw&;eyEeDfYX)xROofQYlfibHtF8Vy8yep161pOXl6g* z0s{R&(|--NyHx?_!wa*%E2_r&+&8gCwUz48Q2M<8uiV7PqKMwu2bbX>_WI{Zp+sqC zJPNPgU4x&HNy4g%@tHO;I3;l^K{%paBj*V-1XXuainSbYW2Mh`fGB|w6gK&0D&>vY zYwX{hRBVjh_l@Ml;U<9WR;BUaUjAFMrRKtM;?g|b7jn9e1q5W;@>U=*Dd?Duf7O2v z`WuQ{OYO_%hjZSuT=@!77>l(FF9<$BsaN%bZP#=o3 zsTag*d8KwQL?bRsJ$=|Kx=0Gt=pat{PAOjm5Pe^O{$7*`gmHc3HlKPdLgwpkk6r>5 zZ**8w!&&_xAFpgUjBhilK$8(<+7QQ1!8kgOX|Ebx(WzB(#zvE$tFl$k-37zOwESi&xo{dV+-L!Q_tohy} zNZ(^VF%I+L5FSOzHoQqramJKB<}LYg=B3$d!Rv_-!y~k;cc;6pclVAlv@#{%0$o&a z4Oz5byW!j2P;MCCDNmvDuHp{qpK!|?4fgD_ZkkHfB&3Ld_%z$oZ5drehq?o zWh>r_L=MFN6lSa(SUCXA!^2%gODLfI5cXzl-bfq!QLj%UP-{&Tm3RD8vnyrb% z^Pr*V?Ze+OKi+p>hJc6KG{Es6v+eotQ}as-^uKx^qH5Wg-thnzSGnB&T~^#P{(oZu zyz2_fzG&9NLtXzq^Z|eN=r<$Jz|w_VJBHW)G(8=D7sxd(IHtL2aOCVO+$Ce4@1$Pe)|La_(0tz z5UhSC0=b|R%GBV%(OqK;yE^oe(1mB*^)j||`T zek%_>xUci~5*g;G{@+s4D^b;&UaaidklfZEj=6<_vLf+g2Gi-&n@d>PNin*<;xvXj70IEoq-q~&sM8 zsyXEm%Qe=^2J$Ub@0{+INwkf5RzKh^xGErGQ+72uoe}P?J!1Pr$ZuIOwPw>0Oex9J z?o=00aj!I*=#IPneS+A3dqQb$pamqa--N@F7ogGnSNPOPPGkj>>0s@@I}(2Dj~i!` z7^>sA{m!>~@J0sLmN1K+=m+PyY{R!v+olYhr447lttkGJ!v}B(Ar16FsA0^Fvkh{P zpXNsW-BzX6@c-WlwfnFF;Epi|GUS{O#~|n2K9q>)R##fG*HT{|v;<(p@Y6Q7YyNw| zpvsU3YUU&(f!oW(XDPUXfqy;^0_+%a&N%r$YwstKExa-)G9(!^W;nL#126qnc=+W* zq8#+QfVbcK;a+4AZJR#P4bC}TS4i(p{bA@FXwbaNmVpDI!X*2z{p{B#5pKyYUfKn% z6%cYU+|LOb+FW=$0^^8XK2|Hb8o@wwbkNBkanLAlitfML zFTJ~SLakMQ|Al2yoO0@%a7QB}<~0~`(EF2^9ozU`^Og0N67Nr;r;6N8ZSsz2i|LNWghhi)pB?!r2LACm^0iQ;u$aRnvNxWn( z^(^53DV(8USaUlx50IJEuNoWQbakBp#kaShWzHOvm9H3W1ENc>?tZ7zEmR2st*Lp? zvOq+~$ZpVF0|9ensxShnKmK!QJCd&$6*5|7tNiNqYo44+&<(Vn>xk&vWkBo2pr!6O zB2%kDmHsX0v27mgI3v?=YIAy!%lPC~nZR6jo5@Y7S>*88)|?P$z54h#$5crs`|wl3 zGMu5!lS%1wl`o=pV`mBrbMwOqjJTq%^YCD}R50PeDFp8^cU00;!h-MID^Q6RdC&dj z3slO`h>|G8lW-3Q0XvqQGW01NCBeJe;dQ|vh7$3GzQ{o9ES4Y zOoISW9rIo#-&t{x1(Ju6%*58k(BAHOA}y{INB^i{CUA=A?9>urN{wy(oDcm9U7Nk% z&})C63u)tZ1HY4SC6z^X1J(s@64H$>8{v8RXVnlyGO{ps^YJ@x?Mqowplvm-6;mJ! z;j7Zl!`%IY_><=9+G=+CT#fgNCIzqI0LDIVQpkRQ2BgRcHs`wz<4HS%hW-zEZ{Zd7 z_q~e?f(#`L-7&OE3@y@)w19vhU4nE7lB2``1BgL4Dk>ckk`hCMpnw8WLrR0f(D#h* z&;5PlbHBg)2i&z-xE8LN*Xx|K>+HRsXFunOH@v~+B~d(+;e6cdk99lGX1F_2SiI!L%I3yR7Z+bW2w}?>4GBM07s<>n{_s8F|&Q0 zciFC+KSk#CVGqn`))=Cf_T9~bN>BH2SDj1@oeR|vo5SZEDqTtfue=E|!?$?cEP_J&;`uvua%34VUm+8zrQW?{b3UXHPa|Nb z+Gz01TfZjZK!hneb}Hr0TOH!bwi>%G60T3nfY2R1&YPpAa!W<<=+}nXPpih8^GvOG z4=Wn>HY9}x%~{hd5gA-eC*uc2=$e~32&UQP5(L!$I_}uk_Xu5EG?A5M!^Y3SS~`f$ zcse6typ1>coEQO96gw#AO2TgASom8)PnZmOWQ)3tIG4d(f}X6KVu4Odot9C zsYqqAIvK+`+p~00NBsWYXPi$tI}IY{TP57a2kH}Bd2YY#!QNVT{gU@N{MV*7@To!2@qi?y1(c1n5zD>3CezFa+3UsLPf@`?_37TXpIYEAd- zCs~FS6Fhy#FJ%xpX_;pZPaG8>8Qe}(-o!?L1vol)rZp=~5jXtIqSpU@!@6Y}iL@0b zqnKEtPYBeDXXK2w{Vdy=IbKg#c+ z0u*kT>pIg;oi0os&c|Dg+qj|JT)%jN4>qFHI;sG{kqc5?)*;Q`%gqQd9wjS;hlL#c za7L#T1I@Ps{4nT)w+1>bGPmy5{Yb=EVkUlBB{s-5CiJHXUbReA9D*i_KFMS0}O_+7fQ!3)9 z?6GXBjsiF{ttJ{$=KRuWcK5ZCPADXc@UC`Sp@8)L-f_cmOP!(q1^97 zVI24=(2Coj-{fiSfEOvrb6-0=RoY#4eB5?&jY-#KxVWS^*LgqSi_72&_(i^7>!Oos z|7O=c@x@o)e>9ZJE=&ITH+f);`XN9=o6C94$B(W7)`<}RfD*~udi7(fD%IdPv~L-H zW2rRqOsi7^XK@|KR#sNdb%T91Wz<)V=aYQ+FdIg&9EN@}5*sBSJ$%S5)CUq^AnD$t z8_e$v4gGzK$^YY9&_FT2p#=wEM+mZjXF&a6_G@Ei(2erZ+xW&jRM}!8-Sv^J^npcN?GdpKSp ztl+2~>IIabyIu6ws;=hAFf|e9p)CGVA&c4@IEQiT(U#e`XxMRjE+Pkv(ZSInIrKi~ ze6%%<1)A_oz=*g1*X|pR)P&QA{$K=8(=}H>r{XeE#yVbZ?TKW@`5mAEPm>hRzZdUW z((k^Q1e}`a=?353&qVBVU-cE#fKN;q_Gmqv36_7gNy8bP%k?PKXL{@{ppL^-56i10 zvB~Z9a3x^}dQC2^^t==>Lg{B)qyuuKr$EdB0of52P>>~yI^G6ug$%?N=)xp7jIiuKU2p#e>KW#24f}IdYBOM_@iU7>0Al z{sxZIESWC-n#nbXp{ySatw(!HD%DPdC?CuB?o+im2Ml~_9MEm`d(kJ=&HyDmGJ`Rj z?H6uE0oSTF)v1_hDpn%#cF+KS0JROC!wgJ>2)gL{NS(mF8vf(oYrxnuofcKe1s^cT z6Ll|u!6twJ38_iGAXW$(Ka$Uvt<*uU$e;v&v?U@WEL}pnKv??Wcaf%(t;WEmSEd7W z^S<&x9$6384~wd)WmE9DmJC*dhcDZ ztU}=O3?=*7m34r5#<5^I3}(ogrtR>~1HuRqFbuFF@3tFT-eTK(@(x*~g(6P}8PbJthWx#1i#J;&}|? zAoA-U_#H#(3%Kflq!AKPuyyj~hS(tkLEPI7I#I|+e7fRjQ+}}DSAq{x3+d6_FtfQ4 zA*;2K1o-O$ePTCZA7w>nhSQtVxtw(NjFH}dinWnPeIigR{&zd7oj%$gCTGx($A3LCHFy>xz`gy01muOr?AQsF83?Q0n{q z96mas`-4*GSpm9Fkv+)G!y-y*{%8gjC6->fcR_k6}GwFK>Rc}el z5g4IeUJrqRf;L&%Lb$#Dk>QCrN26u-i$)q90YMEH{tK=(yom3q#oRMj)B}mOE z0xGwJ^@$SmrxXgOU*5$hUx(lCR>OiBEjvr8)=%QeT6i!YQP}y+YS6F53`-6sfO1h` z@1}Zs2W-oB8Kn@mtWT|}l!Xdo&;g3<|YmpbgL=SwM*J2aX z3+&vpR3n&OnC5x~(eN3SQI@U{IR}c2B$>Anw0cAeKgQfF)!$ z6yI*zzj}PI={6v+3}zfP!+DQ9PsIvcI;Co}C|CfON4`NvOOYUrNciclM#t9bGRG!z zP3ExjblP`VtuJhC~_jtP&$dt#DATuJG>?&`?-v(&?I5@H&Hz+7Kq z_}0jc5H^tlH(+fkGMUFh3mRw8UA;6^E>$|SU0k1erm*z1T9F1(9XM=Fzd^a@<_O4d?} zA{_+d@fec1Xf!Ns7ioyG5pNjUx`YbvGrUqXjGlT^pXOL#fVoX$RKNLT=mbm~!ZA%_ z1j(`kJpR~r5@j>X?D-Yc&lSGtkP-0e^kd!h{Pr%Hv&3K(d%Rwr5Cu~cI1d+MSmig+ zEJ(1_T_BS2%MJ zS&-yDAe?1+L3o0kN^Uv+bzSAPZFqeogO6?aUV>N@myE1~suC*HmY1;a2i%@?AFTg= z;>PMoAvq_?Q(?{W&a}-%^)O?47lb;Fp9Uknye3{1-tg?Tm&!^OCL>;6rhsNadfZ&7 zn~#t-ky)mcMpL>)U?}ALXhr?P;Moxvp_ky@e$?(GpjZ(m(+h$-I7`@&TwF%T{&0hO z{xb{whA$4eqe16@ew__wA4yAJjJk$t6%!_uo(Rb|8h}H8u)Gdr`0Br9pFRM?bOzlX ziK$Iy?`APKdbkwQ--iG&~Xw!E3vze5%y84$R zFL&Jn12v7D1F@0!^RVm#_n)7}T!iaFy_1JJA#^Rf`Il(TMLV(+Nz|^@W&>EJ4fw3; z)gNEd3ssiF!tlF<)Y~d3u;>IB+0B?@O6p{}!W?uWtJ_0b``=f(s1qMe+!ZGgWZ7rY zIDNF|u+W|a<5ass!lf^N^m=4lhlZ~HlAqcKgSJAWUfD7=enLi>`WvYiLv=4%Zuu$R z9OwUCnZ$n&@XJn6vaOx&m%tKvQidN}#s-L1p?ncbRUwmoXUC}N{HM%gEQ=EG`z!J( zg&0-u6jElPcZ`l5QRMDLg+raCF-@LcVcxqPaNWvS%*5BlV(P62q4_UoGo2CX2kEqS zu!G`8%8sC9FfpO&_*XGHNCQP;L$eIBY6&Nv#)ot7A{k~V7|+@Xg}Ge$pZLhP{u#GG z%U1RSJ8Eh_Nyg(A#n9qsYfNNhJQW91?-ap@e>jop7TYdDJzk9GCpkk=+Ac7>^;ENd zYAEtMW>sY;Y;AIs>4#X(IpT!TS?KoGU-NlvPs1+|`Q=f*L6`GwzZSB(raSx#;ScGp zl^Y6Dey$X*2lYCWM=^3f4WF1h^9FnM(8j>ySbQYopy311gcyLkP zGfK?VICu0@(K}B(R|Hr@Kqx)r^^lQu&W8@WoC_nTPqCE!R95KwS(99Tqk#kSgWs>} zXI)>tun!~EKoryLvwe3`>Mj=Emi&S_MMPA*zP#W4siM`AuOstM#?Hu7*5@=y_?^n^ zEgI$=3rcIE5}}(#D#JZQBy3yCWQATX6tmcRK&GN*+G~(a| zI{p;L=*APyUZG%YEh?*!%8vhZr!=)#fibxQg7l)bW1#IcaNcq(`l_k%0>(vMsQ#S- zC1aZ=qegMgtfq1p#l3&WYtF0?Go(o)lT_y254lFdW$Cpy+nZw_8(VO>PGYwNPu;5_ zRogjhM5^p5$9+#Ffzh2EO_?1_5ih7VULw?zrI>}ZBx!y@wlTu@#Z*Mv>P|I_x|^B= z(V*pDDOwcj6lq5s>~MH^a5)t053V!fp&QWhb1ZYy2jWM+B7^T)^DiByQmRy@7gV3@ zBSL$lsJZm{+jbbCmDXHC>@CU81dMg$-kd$bd{O(WTb~Vy;g$@0jEhuKKlB0pCTMN$ z6~c@SU`NsZ(}~QsTUip>j@3YL zUcbIq?C&Oav5}aC{in_mYO>+OXN>wIG3~0x!@}}zc6-VEzxLnIzgS=T3`t&Sss0r)fMYBLJW7p)}L7Yt}~O2;z=1yRnL@k7lla_Y9lg)sq6*@wU?;y zaCczbeS9rppVdSawLW--{uzoOPYe#&XJhmvRn!H()fX6Jz20J#ic&rAS;kU?sAs8u zge=nq$_hqL)k(!_n&D9<=u}hpkPe{+N57*pI(EA`2!-1elyjt zTJbu_`GTkMMA58`S9#vNQ1O0x($-LZbHOy;l8CBN&}F*8P*2Gn&+2 zopdC5;ef(a)4!esUM6P8aI?#W+=CI*5>7(LvNCb zCH267q*Yvv_VQ&;H|LD@eL7-o*>=awo5urc7kDd*0rL00f8oXYKznr2rG7FBM%sSzL*vkQ8c-cEL zk{`d}Y4xGehDIpk{2oeg%M4(d)I;iLCxR5->bD;$jb!1IdS;=rKPKj;3H03;zSz>-U-*a~{Q?#VM8?F6`+_=IEk zN~!40EeZBEsk4b?q{!?YX=2w;skWw)T%kRCmQaG}drHnx_=N18WF!8~4R&&}5y?}U z4Bj1eRhB(_EOD!m4Am3f5xXp8Y#dt7F;F2IHU5`7f=sjHK2sFKX8G^hU6{|aQ4Dm$ zbvDy>?NT~5V!%~8KO?2!RVVcF)-jAlF=&0ReUZz!b)(~vC$R5A8I zcsh#VQBjt~a=l}8vYusAGIW;ZPEEm%QgQ;(x6$;XXXr&XXa|zfqYiVxEEC-n9j^pL zr__c8gTmUG)BIZ95gQ#Sq3rNh`W&guIm_TgwL3MBBLAH0q2W+m8C{ z-k-{SxY@H4SUmx!;*-&vPU+damsOP2zt~qf91K~JU=1R9>aes<|2@RNU01^ zpefzSC!Tqmk7btTeM8!7>5g~22VyI+Ai3xd7tWQM=KcKi{g2#{pHCYq{D~iJO$jrS zchKWcZ=qMN7E)mOF0%1!?xTwtTbRB&@uySUSsq%&amv<3TFeIKE{A3%i-xRWN-3#- zhGt{FEWOydse2JImBnZ{u&a52F#PcQ6$7F-_~sdjeq7#m5cnD|vif|}h z4r1jz=;WPxR5>o^^`8QrNQT)+h9}E+Ve(!Lc?%YFIduzpCAfLdNMi~Lbh`V-yGeJQi6QMBspU(5^ahloV!-J5b^iQuDGt@@?JW!a;L z2{eo`wsJ=> zVAgdn)?*e%K6Rvb&gj}o;7Z7Rrk;>x&l4h((a*eG#PFQNko_ZEUP9Y>k)GaSTBc1E z@7bYei=4CQ_0IaC%=t4U=}6kv=dAc-Vt7-xq2*f<)%<7s2#fmy0sBmiC=eEJ29!(K z`-<$PvCgsxPcvzaWE`r<*B#w>ZB4y<-rt&;fV7=?x3v!KpNr>b`!6L*!Z+3<0+WyVP-%$m}vh~5|ii7m-x+Lfurr97+ z;nV_EA6^<}&+(hYUA4VV+r(a(^ik|WI`x8)7TpZViroV`xZEk4Zh1snO1tmJ(ciSE z#eYwG(x+nW5K}~(Squ^b{0(U>DT}U8fpkLQ0c_+|x&*2m+_*x;-%S7WEb3c-qU9dW zn-&MwUM=)w$nU%eEQ8cRz2Xt+i^bLUZ?Ed_xnu<^_csJ>;&QC_{_SCQu$*4I7J`cv z2LiG>clf>Dv(xu!t_S`tX@B-gC}( zb1i-zo1&Sxl*PEcWNwyM_3Nx`Top;LMnVJRd6(TmRM34JGsRM50JW>nPMIP;QoDY> zcB~qpQ%d$NB$@L6dqRa7l2|RzM^CwOV#CuHR}A469~yk_6CjUEQ;&@QTbjE6Z}p=n ziSna9*pxY7>kE--5fm~prmJA(5^Oi;|8KeFNQVFTGk*4j*Vio~q0D}oFzjODEI|;u3<8FYj z*z<4UhoRTFRB@?kh%_$CUM;m6AtjPQvXlk#*je`RMU=vDtnKG9CRt^gO&y|C) z7TABu_k&mKzw&}a6oLgMu>`~a=d=Ac`S2oH)lG02hj?Sm^bG;$6be$z+Ql$IyE$@~(JGC` zYh#hIW=#?TrbIzr&=sfaaT&a~x+Pw`Pbk`Y`s8cI+XJNHOM)`1#>7vhpD^7+gU`gZ z?2@Sv6#xL@!Ax_44SgweZ1`OiV%)*gNf1}_3kn1%2q%M_6w2ht=Za5jZuwfQ<}WiZzlU^HSZ#+z$@0yFHfHt|l_IB)25$^CZe+_dlsi8jd7x_?tU9Maz(D>&(#=+f z1uNG#@gSBub4B2qI)?iOF-`F(LzH|^)I7CwK0uqOJD{Gg5d5t;?`D;j0XqaS0(Pjq z2BRz4XtmC!`BDV$Q|Qf)TyS16;`aw zK~ZbPf&rg5X~)NBdqDKUT%L{zvpA? zxE%AA{A%eLkBj7cJLpcN;y6C-&i(yK{?qwj&<-Lw>U13i7)4Z5284s|p!VVvHKAT= z9VOYfuB2NHMEpFVz-+=^(b7`iY38>t*U?5T zamd}5X?x&2kcwmkCE&U%d7hwa{u19P#3@654yXyTP)a5KIvZ`Aa9Us z<5N2gbt7Y|D;$pJVm7xWZOB09am21d0EsrQt6w0cS5mb1M>9kC{K%o}(goz<_fOQn z%@aK{4tLm{hb-{riN*(6xs2JUME+*=RVw;~@L`lKpez^ZIjb?T_f$il!*@nB`tpl~ z-9?J(GRr!`SD^0qSwev{3-Ucf@!*Md-u=Q~{P#G9Rc>uhH^)0y(V?@v6*#8W(;vFG zqNwpaA*!fo?^pTn7(88mWf<@p%&(94>`iLB+*ywgm%yAomoV6mf6i}RV8bspTwAM+ ztaP8~5dkOCh&z!=i$;eePl6VY5!&7ta&bem<45{RUB%+)?jYa%gVZ-6#j2+95xEeZ z^B~SE3E7Axv6%Cs=$xl$+x-K%H0g@!TvyXd7^N(JvRX%diJ`I1&M~-2r?ib{pX_)y ze3EVml3ze4?3eeg+_)DjDR;%bznmK1%@{fH7MVu5t(Yzhl4J@vO?2}7a=^tA4+EUF zSm_zib)xq$C#m~|!ZEwz^>GjNF?4pt#bGXiKEXq+xl)*QL6?+?L6gnQ#rH=S=b^GM zN=3lfiP$W2tB-HaL~j!`aZ;Lyql!x|)VczrdwgLNmdl+9ysDbAmwLuT zdz(geX*gbn7O}J``uB8veqS>H-swF!9qEtG&7P*4o{bDs$ubhftd5+ycReE8k7m?L zZ|4SCCzsLSDNv@#oB#?FIB{_p8`N_Xx2YI;OJKN@pVY);d0QrI|9S zwrvp%sCLv(=DlNRJbb&cpVEft=-zcY-%}UYsnU3%YB4Z6#%x&qzm86sbvVn8WW=sQ$z}Eb3zv2MqOtuw#?Y{b*^>i%s%#^bQ&o2 zP;+@LuwvM#e|Z&arhMg4-U_!_TOa|9e3C&25(!<`Coq}gausez;<@eyc(6HA#G&?G zjm_I{3~I66Y_$8zWeb28NN}$yd#rH%r8&WdV%t|2hSWh+Tu`y5qy5MSVg4Wae2!1c z37Bfv69T<41;Lq**=YX+4blbPvTy=?9iI!=+Xbutwj0b#ihi>KCZ!y7H|;WI7Ydb( z*He$mWs|rwn;h2PkGl3v<-NYV>X=WLY|CAGWCSgN)5Rxz*2febXhMvvkjIy_HM0so z38#du&E1cm6bYW_M#L9VI}h2KiCf=}>r+=(daL`#7!{Lor7_`yHGv(>>v)6kb?==o zlyqNTKNfwvad8~lF@B%_?i(mDy)n|2_Q8Ioq8F*4$s~aU7mbVHt{P|u|2`)b{9A`? zoxxon<~x^zG_&~gyXl1PRbC~Z`qQ5H=9uht_l_Tehd`d+gmkQrUM1>zRMRzKOfV1p zb+C5Gj$S}{*@PO5k_>-Fy`%o2iLs8zV_pB_r;7XA$Md-sb-OCvXe(N45Og%9tPzS| z9BY@CQN+Z9GrQVcA_-KQ;N?GO=BLP9)TaZ*w#;f`9wu5ei~YcN>%cD4mO~oOkY6xf=|1xO2WGGv=FA;ay1gwA^e%FzH7-kKMdnG?8B z>0me+vUyC-t(C>!H+#_($QXJ{;5dJs5pE}&!Wu{RF4 zes=wAJl)UPJ#4)=@1}I6;znM~%}$3kK00Lcm~Dusm>En=?`Y&wdZIxfO@;qAIqiZ4 zI)jYR0XnQ3&}kym63d#si+z2}_9eY6nfN;r8TNmKx!7-5^|lL^uU{zS za+W?7c>f@Pw@vDVhRB{7-}Xjl+$I$%`>Dllc}AZ7*NmR$M@tt=-u)||gt{=jo6|Z! zc=0bd+b-WO)MoUdOW5TY{r$iwz625}ju;HzP}-2LOej^O`HAT~x==Vel&%~(ih&05 z>R$Wy&TK)UwZVE{^AyWD`1vXt_(>Jvo-3dP|BM5uIyF_ot7I#vw9lzHkd4bR6Kloz zR(Rjkl=z;lzqq#gwGuirbbRlNdomu3QWL*&)S>&#i21Vln_pCTQ&5-b{G?rz9(4(S zj`F(fLL`G{@0tuwERj$CrNT0>-w>9YVI)Vl$J+D#TO)IJtIP;4H5vWB{@Zo-5-{RI zY%t2ZxTwM8QE{aqrOWtx;T)Y^hK%ttZgs1F1sB?FpLD>*?iAO+)GB{i(-o7H-5%rU ziup2Wo@4dl6lOz;zfD&h$5y&NpUvX=y`7Db6CVNN;N&%UZIYBt9CC7&6u2?M?P66| zl|ASe=}u+GGLqmL3F0LV2)IELwBH?rvf#%g=BS=m`FnW*HiWs~5w3q;DQ+!{eR<<} zzbSQJ*E)Xm4~+5-?p2K+^_nR_UB>+Lc0VIh{Ad?>vOx=?UM4(ZxRMIHC@s6J4?bc4MA!Kkm7Vh2uMVrN zkS6P@E5N5m$$C1|GD0EOaRKs&##Y`5|tCQj4fJZ1=NbuL>q#hpwA19i) z`JE(CSb|6(o;r#s6CNebitRZ=n$l@Vu;~!w_Spwxf)Jjakrn?h1s;weX}5~X)z%*4 zZcSj5KQua&1juhDS+=6#`-;Q0u+O_U7|(==elzkAODg1yJ|Fn7w-8`LrLE@RcwX6 z@ZRYm21I6^T7x7m7Qp-)On<4&FpojNcPiqfoj9`e1D7;Gz}BtEVYje&R&AjEMMTEM2#1VbTy;fST$91$^3e=!#>fCnC3Pid$ab_t? zMO83XGvegK^^l)T;Wu(_NW&A7wXKDCWgh z4e$ZpM9;Juvq2gJ5m=B5H}aB57+Uu9(?db@!8ZT@tnJ|&lS#tAK6cg40uk)fJK9v5 zt9I2j%y+PTdE*ozNA{c+M#%v*6QAJT*!PUK&Rja1Eze>R+qOrwwO@(RT1anY;Sc1v zGvdT~I!b#JEd$8IsgD%a650| z?&WQt89&{R2bIJ96Ei_vDJw-@B+o5~;5`-UUpb#j|n!GM_cxz3pley3QcJQ3sD8}!Po1C7|bV+Ww zoi^!f!P8=UgU(N&tt_;=Mx7kwbt)(jCx;b}9739m1G9%E)0>q}ER#tf(g?v@2L-N$ ziQiAxBO@kCNz~d%@Eu*l;zx5sB1hE}stTlEapH5T0Ez4Idqwt#3z5E`V$(iAmSohh#wrgR%}r?|YM1 zli)@&pvn?JRDHacr#c^kJ^gz6*9lXO;(VjuVQ*kOcscg~8v*`C|m3?sPeeOH7)ax6r1vi#&jj_^z(;-EQt;rxBVW1)Tp;&r$| zi{ABzGc82HcZVQuS6hx(nkdv#&l>_DMYSJ0s^0`0)qp7uT~u};C0(UPz@k34*j^C$ z`~6|E_^TG)g^IF|B{wtAzb9l2wseCK{>F79!dOKP;+GenXyd|O5-r^hVd-%-Nrez( zN5Jf!%n*vUT_IQ&vWikFEV3V}XMbpu;Hz8z*h!!)%Q~@$bRa;73$${-y*@?>tzbux zW=<}ge-sN8wbwmiCOteR`YP2W$cOzZ}0vb4KW_oe6mAt+n3XGAAx`Dl9itQhIt z=aa*V<}`lz%(YwX6M~I)XR^R=ZIdz1(IRgDndA)5$-)*GL;tyJe88>Db-35#Ix+6z zc>g#F?P+x7o_R^150}^BfeDM5B?II2`>G|FysH6XDRV&WVL25e&aUTALqiNt{G}(MPOzadH(B`ueen8s zL-f?JG;Uq%bsMV9;Px4?wVF2tyR6#AjBmo^*LJe)ptdBc*4$t@fmH0FdPYfIb)T<8 zkh{WelMaM)kbY-*EPm$mKLm*-WpOk&WjM8DoaLN(I?WXB8W(^llmK7DsVR}qx&+aw zzf8pp#nL1EGau!JP34%~(f~Jebr&k^2Sbg;p(EZ8FVDoqnK_Ep+O&ZcX(A}*p~LEZA)kNUO^LzulwJh zRnL!LmMt0r_5;KpPB6PUC5eV7`@{i`Ib-)};%%pJR_j;Sow$k};vm>uaNoQTyGwq+ zSK;(EK-^=NsMtBFrnQpOWxmqi|JlZvjOM{YDyK{6Z(ePrw`J-FC76vqez#L=jD}Gd za&dUIv{EjZU;3_`m(64Qk084C1JQN5B1pK-mzJa(mWFue_TK>)jN7;~y5re=8 zip?Ne;Y&S+!t5-5hWkNYBrk$V_ZC-oW_jM@D60G)m&^t6t-$eMc%<(y^W!tuZK{Jz zm`z7W=-EhLVzcl5jjN?tmSGyph)99ik5w*HFL^l8lJ_}*NjxGrpPt5((i1|9{Wy_s zt#r*7zz2hq5O1@O7Y@z2{z<(sBY@q|sGYC|8KYy-te?l~2Uy%){bJ8#Enmr|Ke2g^ zZfuaWJ0|)wr`^(S0{OGmwbMYD+Z1KxcV97{&cGoZQxKkF73aP!j3S@bYaZREX1_i1 zMvrsnB--8O{Jug7P`#Hz&ox5b+bZQYPNT;jjL?=hpW?fQoA(_hn2@TqC4dEy6G1NpY}`cp_}{ZV zdEVP@i-+(H4)0W$NaAqMS3}a?DkJ2Xtb-844>p<2dGQl@ytc<3vra!UEb!@+_AqoG zR5e6vA>rLx4IA2X>nT5XT+u5AMLrKsm<0M&+bDn-VDUc0k=?|{F{!RG4OaO6sCicX z)8k6+&oSnU(@>TN3OP@|@3MW&3`&^-@wLzEzX?t^+Y1_b>g${Ag* z4pjU6q^tQQLwP-nX}N9uz1F;9o=5Rk&u`@`A@|?tNQ;}g(;#BNBV9z0mjGj~Ax$y3 z4cr}~yedpQ-4JxO=#igNR-{0(%q&4?9P4cVbLDkW(62jYU3Hg$MI(X;d*0B@m(%x6 zGq*OtavMFJN9$IXr+bJnlQ&Y<8K`;Lkx20C;}(KGS3AbD<#;-AxtABZ!wdrYFqPsb zD#*6;j&8%(c5)jhXGN4%lk#t^WX?&4Hn*PgS-GM3s%oo~Z1E~om31z06oZTpVwHI3 z>-fq%fVLJrfYK0Whzu8Wsrr5SMaV_w))>Zh`h=@zy&w{K-VZ( zmE#^T7~+bmm!$oEbMK{=K7H!uL>xmzP?l@`RDmLi$gaEV#m!GJ+Yg7b^^=U|z;6|@ zkC8yV2oU`z-E#{EGsq}2%>zFuw{AAO_X3Z<>eM%65AhA_YU0huSG%ehRU$QU7l@~| z%{vc2iNCWhwbYyxE>vr?z}YFDqV+7*xt`ds*tu#Z=_Zfb7a2>bwbRX^gr@q!?Mp_a zZCoU5!KKjWjwK7JpOo_rzz%=Wt}-NON40&l_w{nTkhZ)f$xO`FkBUrcjwMKPQa$Bf zg9Qt}A=;}__=j7T9h;deUh9+4>82|7aO>%~O!`M0TAx6a z&?Wqg`zN36u(qcY3XK~@Z9?e;X)5TmlhLwub>&H8$$_WjaE87 z8pUt8HQf+XvpKV}nR{sCM{V@ul@`H6jl3yijwO4=rPEq5-7B#X*2E4Uu5OI)T7@~5 zv~TLqP4ndWIokwLoJ=u6NMF3}OUla1~VjMs!8*5U9>s1KqxC*F{G|L}~WPPoU*w>(&jcrtf&AhScrJiU1@FM%=rK zdrV8SWR^?Dz!7GZcJlyzY^$TFOOH1P0Ny>%c}M}WRFFjoze%_=j)x6S3DVP?FkBlZ zj8YsQwDl{k3}u76Qz?;gWjR5HqZOYZnm;i^I0bhp!z?CQ5 z_-s&MdZ9v&bhuW$fB)IWC0TQ_K?UO9{}22n38a5^A*rH&>s*1<*v-1xX8>#nP?#$U z99v)>JrB#dq+=hA@jHXhq7hy3^crAjxIv|zT7RFh(hzUn?)t{L$$9~AUS;_RCq4zl zMaYHwdlZm}#@~?}xc5O&awrnL1+Xe(}ha0F)}58wcBmaEMi%(zrOhbp9VaR5wcr@?`z0HDSDXwT81 z?Q9r{zq0c=GDJR$*^2Ef5~03TidXqydyOrpFo z==p|~98%~9Q85Do@vzHk_x^lOh(Ndee5`sv5FfFuT+vfJgTxs;om%_CJbng}mpc4yW3<6bL)_<_VV)j2%8LBa%rMj&|hsX5PB|4JS{!D<@~ zzd;+N*)%nm5ddpHIHfMUw>+HdsaoNseWyK=_=2aC+)fp8 zhe+LqQ8MBsSSQ4L@#Iyqm&ug}XmIB>i0geV>D9*jK zjR5EcH5&(z&JRt%v>Xz7fbw2&7|!{LEC~XTT9t@*I%M2nn-oXy-VcD~ReBc9JQMs3 z-iK1>_`_5-5ak4-e^loy!GN>~fD^+z(}MPwZNVw3*Tgka`Yv=515_Vls?hyo{pPK9 zZBe>=48zL6>0ZC^+o?CGc_l@Rl8UVYLMW&{1S%@}Dsg=l0z<4WB~{u6h)C36aK<25^Fmxi8;RirTbYDlxA{OFvAt zNca@683#ZTT%aC+wr!+&$S~q_ej4@a#zx|{etpcIO|}re(|c4G05T}V z0KnMl0I5wtakz97p1>p_dUZKL2o^oDb0Y(2F0(}@|7yryFW)=k_s4KWg}& zfBzTb^lvuNOBR^f#BDnXkZ}e!=fC~5{numR#0#^_u$Esief3h6gNAq~{(kuR5g&jv z(ZwzIJ3)6cE>Y;ThF`QyOsp$Iy+{xM?P#+-(;NttIct>rBiAKx$OML(tPiHD@RR9sz6iumT>)ALZrToRI zFJJ=r@lB%dw7eMSTzpto_hNnh@daZjBZIfMo5C&Ioo18n6D z-U+yPx^3IAFg=-XMnFX>9sB8C-+p!NTPEz}GA`SA$+q|!Fb(Sv z5td^B2JHr{@H-3f!giytwE!u5<~)r~HbBwb1}A8Xq=&l_l8YS@-jht-26TKv5L}QjnsP0XL+SUoYAlWu!*Q}z~_+y{c*3{N)B@Y zI4al`PIsQ}W@;nnw^1qHZ$NCqe3Xt|-~eD=PI58#$r`gd57wNpf_l46vN!wS5+p*s^$Wl|?#&PVk-$@J97vXELIWeGV_J-x+Xr z=%oz%V3%J^U0|76eU_PJ11mT$Njw-`RA}!6q1A3LUoL~~FPaGKqZY;`|Jm>hITCuI zQ(=u(0C?sHZZ|{9(?c~AK8jk9oV!4=|AZjXt@c*MKNG=NORyfU?d3oTuQA1$R` z{(4DaOqp}-a5h{DcITC98}3A$v;=TS{ZfeE+GrQ0G{coXcRctTlj6IKq#7-y03%HS zgwLLZvfpbGL_l(u;(NAzYP9q(KyHV)$Zy^z4gcgfVIcWP(DdD zCya1FJ^`EINu8CHR^R>mR#Y1JJOKMK!X3x94Jp0cwHG91)w@LQ zU9Z~IvJTme`kZmHE8z2Rrs)TzGQ;3J;8{^qk4dv{1ZZnCmR<5;T4i(6(aju2M>JB5 z?Y8E86^N(Oq&(TAyXzHlFeek%;c6i4A|H8Srv=D*z`rAIp3Q$!IG-=~z3Qhl5YW5B zz3}JM9lJ9ht=V}5sBSnhOy_4fC_i{9a&M$Flv_JxfbvzK6*WB(2s!)>(3&9LBWJes zjCg7nd5spq0YV;Xf>ot5Q5nwYL#3JRbW7o$0xCPpC6OnQ6Ckh^?h)KCJ$B9wrPEFo zQUgIl$aPKA7+SFBwqrkCOCZuQiU4EZMo3BTf%1zLXa>M}9OX@A1jg=V?8r5Mo06nU zw+y`VZC>Risg{rv4xg&p=at;IsrTmgE774WTRUS?R&us)y>%BlWp4Ll{(O44XpviL zQOA^cWj4nMYx|t?vdW^}x8%sQGG!BM`Ytc9YTm~`AI&l@iQEwY`1(MAkOszrgv&K5SrkNuVf80kdIWxL&msOZ$C(KBYhEkbeiyl@+%-zNI+%) zP6DQ@!qkP27#dPQh=8fHd5sIG0iP54OjC=XJr-n0ynbyGxhLo$=Sg|x<3W()E~{|u zZVAI0Bb;XDD2lTsYhm2M^qUX=R~(MC(q*I|M%kFZPOX+G5q!9<@~$ojL+PmIQf;wU zGFI9}`nW%J67m&Z3JfEo_bn5oJiSGqWtruJ=;6mpO>3{)3t1oT6eOBvQgTM*7wG`# zjwzefx=hbLV0WN6q|`d|0_R&;M|%XNo+Ik1fyw zyb`DjYcS!2j8#T_w4B%5YDXbO3eXkUpHLkBX^f;AqHXE*Hb>R`&uOXyzak9(aBS$1!37 zo%@_-`AyBTqye>v|2$qyCN5-u=;^n#zys3RoJOj;J6@G5R8}zck0R{D&F}6v9<&yC z4nW|RmgnHYL%~ICMpvh9cnaiepW|BWRFh@Aj|F)ZrAYM1T^0@0llc{~^guMUyXoYB zTm6Ay$$Y@A!~KN%=A@}pODLQrcY0-5-+Z6cMwVvkRsEkBy?Wq40vdHQCFM@Dp@P%b zRJ~(-c||$j0vzewk**<6oanS@&*fTyPdmPOTe15u4R4kSzuA=@^ZVC#NbIIeQo5dQcDDsB*8&lCdmklg zLWNfiVx}~nHz7b`YGG}JHU}F&03#O!!$`9g3+1;Y+lyD9=G|Q_OgiU-Mca{gxE%4d z&U8e*ex*z{+&V``lJmdVdke3syRCmzV2hwgOV_56+#=m6C?SG$Za`F8k?uy2?i4BM z?v_mmNOyO4H+S)z=e_55e)l|oz#Zdt3?1LGT|MVoYpyvzb55ofl&#n)DJVJ&%bUpJ za>4CoGR}7yoI!(LHj~%~y9Z{p^r!wrF&qoHaC<5?tc;a}m(uoq0Tz=L`8c1*mHboh z{bF?~Sem$b;TIqL#Yh}v!&n7j5gGy%lK8K)nx}9((3pT%*R%D!7jhVGt5+tIRr%i@ zoF16dwub7bgZwL={rtc+9!>fe8q5y{c>J_tcW)O7k_1HXg{Ax%bVl#+H zdUsErv1QC*8)SnC;(Ql7`qotv>bp8rB!3ki{z?UIgn@<438bpb8V zN`p1xJwEZOkfujiG2`w|I!o`h5~RGUJLQz3L+rW!xfHs7X2H1}=ls`7xx5@b8GmgN zXomG4vS*VIS+D?tb+4^Q!>6!L@5?oeZLq<_~+_;Q_5Djvw=^fYh1QW z7t!jnNQzwnDXs0+#O9d`^G(kZ zF8qv(?(2#izUkV7eG*}bstg8ozkID>ucPC$@Q_|EIvkEWJGI7}&b#;&k^FI2;9>~)lwgTAKnwyfcQ zjTSuh@7Ko{T@(BqNJ;*2WuCB^(Pk*;Z5Qv)c=#i%RyMVQM5rquP#lY(QJ6_ZAL`d{ z_;lLAjFqBFd#N%lg|td!KT7{pH?evNj)nRie(Kpj9J-1pBD7UPhnZ3O2uN?dcK_l3 za^8;`ce06{<37!Pk)cJ@f=N}BBvs-a7%FSVwNDiU$#Uvq+Nr%_6Bc1CsCr}McYI(c zEqXxw%fw@o>il))Z>$%47^V72ZwWfLevR7#<=oWe$66qo>7iS}y6@A_*bsedL9}?D zw-Q-oRN3$U*f-&20Q%R_%YJma)KQXIRtg{%;pj+;foJaDx2SnJ7e8{)k&#OJrc}cF z0C(cMJK*)3J3u_np69*U@V^|&tH}h>Vh!p9v3&f-s@*il0)LQyMyD|#itc7LdYLLF zD&F0A82}uai{6AP;d)rzAy*O|wamW--_t8P-ku!YJCFPiSrW}&%-zInZ|YGpR7}iQ zE3E3VmzMBUrM!bu84X+NJx-?+Gr2_Gew=M|KWQ2Nb369WT~B(mQ>oJa-@REeK|+p1 z5kGtP?Amku5B>q~a(zAkhXE1xV8Rl4w8*J4`rwt?mf8&BKVnE78keHk%L8s3U9(AT zLEB3tZLnGNIC@E~9}N^QrRkBt{|7w6n?4~2dC#Zj18w1pTx1kUcO3Dn9Q^LeukV5>coPl&j8ytp10Rv`^?^n!1jw;kI%S=B9`4w43_#G+`RKeY z`=123Q!fHX=b*xe|9K4qDs-X0cGm!UowjeJCJy7kI)W_bZfFN2Rw4mgGpZbAa%z22 zKr^$!C(md*AZNzi;N3CTf+d1cLYE^PdB_xH%T0XcP|czq`| zqIha9wovf0U=xB0c*=hV8Qp*CH3~l@U?DP7R&hhSyD-F)=#-_Xw9%%jsvhv%O!*|l zoGy+WD_33j(oNMKV!2<=ds3NA@R{!8X58rd`d8c+D^T|-VIywPvL!xOY4La zkZgZHfWnEd!}hxJV$iR5aj5w-uhS7STTV#E6WPh~)w$nY zV{Qw$!O7KMO9?IKHjcHU`-X;#&$)KtzVrFWPKuk$yaX zLJ=l-`!_7A=n@gD9qiJ6LN&oa`*-Px5oCzAP$Uxol$;=m~oWR2I;T z4_1d=#f4ytDCK+~w?F^&c1zO<`;wcynFf7veqZHx7)xuKOt>HpF0CWPda?CBIeA7C z-kI@CuX>pc^x~8V|E%+E8X6=_^g>N}ajj=itc>a?CsW^b^@Mz?ZXc^ar^cg;uwbr` zGiI-MwlWN+g<5xTawro`{h^P<_GVyKz5e?7$gXgpB>KYqdgSl0gZ*@SK@DnJ1$@f= z#SINSjn$!x5=f`Y&#%t+h0!%<$E)GNms)l^a~I#V&NdGoCthzp1<3@wf%1jMBs0=} zwS36_nS;0hPcwUktpENa)hAEEwvBE|a${Tk<&j zOzhRtll8_O-QxWg*M+q(O!x+RncGXGB@-z~vnN0Nj8U_M>>)nW{J2l2Irdz1Y>1~lVCbe`YV9?B#!f80E5~$m0lNjZ`r}IJFEyca#~w&Tj#JA z$0z+s_n}o&IyXHbA5On$>UqPs(2e1Z1_Hw6pI3*Qy~8Pe5i0 zpHi5~JUh{lQ|zu!HUtL^3Qn}EQ4PXgo#vh6%dm^;tUcFkGS}Sq2MaE|_6H9SjGQR4 z->hjYvaVeWcm0^l%6R?rJ<}aNOS!K>#^sJ=(!280nnix04|0J)~$)>D3I1<+@&T8X}L6fd?(%xtkk zGI1~qGpv)?Lr>FwwVlw?nWC{w+TT0fnX)Y-0#^9=;va9o9VmxAXPfTC(@Q1a_KW@# z^DAC#BA6|~NZu_^XK@X+H05kuH~$%c3kpJ?0Hv+iJcE zaOAmdVrP7!^sAId7!nKbuiw+7=&m&%r&xL#E)QLRa^t${l-wJ1jrTOTe&G|l{7env z43Md9Jg&*wf3`_XS1f*!I_RDJtD4cFY$RK#R4<7lKb3FYpG`NP%Gp1GxW-R4)N{Tr zRHdA35-fFHl+j@AMPaAGfV&vO|quy^?_I$OsBFY<wmTz2 z!{Mo!p#KZp*3*xHxRtcib$Fz^4d-TakL~Qg<&%ygHZ?x~kn_pGwESQde|kC6B7=RJ zyjZ~~>yO@J|0bUrn;T*=&Fj^Y8^6#>R*oaELt`*#!8JtYk(%}nJ~$#oG*FpQ{m3kS zb0*2H$gPD+@KP5Gp%~d&78S#;-8!Uu7`A(8ht2M)Jvhpg=7PqedqYYuM{0(3^FLSs zVy`fi_VIQ`4Qga0VAG|)7fPdI4Gu+?xDpa$5<>A3d|7!?D{!-|@mtX3M0NzcSXkFE zBuV@oWS%h6%v@+9HqM@tP$xbv2;J-579ctvbacLyvK5RIOl63f;4kzh(y|K)!t>~3 zu(H^-pBv$mYVmeeyU4gNA^istZSKTz=GR96NApvH`QPFvJ7)j*plZ5e);io+z)aHi z9Cm4}T?2=;$&vWyb?^7QZYz7rS8Loy9P7X{K7Y#1h3yQ7 z+tVt2#kLISK7HT;r7_Xpq`c%<^CP%n6#i~}^LY_DcsntG@bEEAXEzp8gvRLx1P^t9 z4~{aX)uXX!RYTI~fq>GCw`ClghlBJt23ZN;?RemenRXeuUInwoguAN5=-gmk+`fH@ zWM-j~^dW@5A}?fB*B<>zV~*hs_41K_lU|JFT#T_mU$rz_NI~i6cjz$N9dh6Z167!7 zYZcZ86*~D8)U7}%9I`w( zvY4b;a_6YG^-BLdCxZxPLDYsB_g;_2I1cUX4jUpO%B8Wi!IuD{StZI`Z$-d#t@oCU z<#g*PjfHz~4Rww8f}8B}NvU;wS6^pO@XS21k0j%lI!^j?VY=n| z(@KfeHd>S6aN1=T-`zqW!{|rd=KDy!G zsIh-Q6wEe!jY34c(wTH0_7ilNx#1DL*9-fLj9>heZOPMyk8)8l6MU1LFbzZtV|^ZJ5s`V}2r{fJ%{bVzDb5o8NgDft zInxm#yV`<~>6{@}&DRJJqq#8rwU>Rutuhke-g+mkVGMaK*ei5bJgHT>nN)<=(9O)E^-6Oahpb5irW|mK|tYO!?pbtpL&Q6eZ^7#2a+Tn*)$`i zx6r!9bv(X-z1=7pE2O`svNdA|5jim<@ZY%7_1h=j{3fyY<^~2E;i?;c?);iRMp%oS zhRMm~%w_v22GIl|-V24&%G44CU~2^17yg|Bzr9zTJ*fh9m_H_XKPMAKb-oMEcQn31 zB!4}PxOaw}H^xG&!=TJVsK$LTK0;R|-De2QgwUFHl{*Xv3%3nA0LI8In+ zl3L6Y@^kuo#;MO*ClR{U)GeYmqjJT0Q|r0tSEw(SGI^Afs;2e2>&8BF z^p$6g)S#ZDyp!=-hRw1+zhINvPKG^#%^qp^Ixc@sU{yV@qw1@4azcC~CDh~jxZOHj zgTO<+rZ14Z^#w6Y3^MD$d)DC297<$c<0ro(V*l`jlHb>L8XzzI6~@iQ^{3mo)`lA& zWCq85zza0;MT7X>sr{{ja|qC3&C9#GPPfVA&HiJS@nxkUN|@!6;z1Gus((Oev7$RA zfT;t2ahab3wHt_|+|*)js53)|MRVi7;Jmf?vaVECu6x&!4~ zo!5>E7b%)d)qHvMINq-4pPFs(qMzRjQ$9=8GHidYC>~^3GoT{DZKfMy;lgitQKgZ2 zz#M_b3*bz#b0_KGp98x>7pqyeD(gjllJc`2VQIc0Tyz-bwmR1z9>I$(d4CI23)`LutJ5WoJ4_xOJs z>seFs+2${Y=cbc?{&B1rvHpt;J>M(6i5P4x)yqB{R>-f7<&(Q6^D?kZ43KKIe_aWir*2+>CNBNa(u6s$Zw4g{4Of~iCQz)40B6y zhik*t9)|HiT@BOukOQ5puoO$^VcqXqI{$AgFy&8az0`+PwtnUHkHg&%0ZwAtqKbFK znkjleNGVW}`ZjANR>)XPy-e*JJ`y2N$~2Qd!i9Tw&DNiwr=c!1HB7%B&1n3`CbxJn zO?t0=C}xN4{=EX*0=J@pnDQ`_4e|fB0w21ux5kej@Y|5;Q>Kx91WzSD+q`%Xq*4FQ zM{wl82L3_lBDm%Jkz1-0&?Nqgv4V9b`|HdNyOVBA{~Kdv1(EuaPjaU!_couvI#Z)% z{H@=&=V*W(I|2~fhOCMV(IaWQ>WPh3=+gqjpZ`79q*}Z0A2xksc?`p{uR3Xw6@Y$; zzDkG*{Bt#Jn!;^OTVbIc*i-K}(az|n3EoVpbP7mNnP`lvTdQaku6p0 z#s7@8pkAQAO3I}>Y7Sx?weZ&?IfVsT)#pHO58Cx-%h9B?I8U_RUWD?K4AURTd5ZWR$jlT!Yb>H0$$D zE}IXxZre!@s$xOLL`tOXi}Q*aj>JPsdQe8;gdd87sbI*8dAJIDh>R>I95b8 z!0PVKSbzFdO3L3u6fKob)ZJT@>Nnl#ZJpn3vvnQk=bkA(&d(Y_KNl4PAbKxSTAhYAG$1 z#|Z9g{|~Ia&sI+ADU`!?TF6>!4 zmpor_pw4_QANMfmbgSq4uSq*GiJnpw)4jXkJw6P59qWM!)K2D_1W zKW`^nMb`8Ow(@}QFblfO_i_k6T(he*sG8h$DPaHV(WAv$J&~&CD@=&UOeRj^Pq!$8 zi|!J_WNJEA5}8Nz;i4L7j0l?wx+ie{uEvt1E_Pv_GxSYE1>st!r*8-184;0X23)|s z+4Sb-!lFyt%d zSB)D3hl@wE@vJBj}^UYAwB_VxuS7wfT6VI`77K^*1y%x)6xag7hX77eZS^vF)$`oun~uw)-Q znv>vMM0wC4Qc!!gqRXL1O1Jmyj&S^5e-m!{Z4Bafl zbPHEZ`+lR~Qw9FTg@0U(OaH|mZok9NqQ&Ki6Dk?Z9M8i17OpQF87!){qLYi%Xy`%# zSFY!=1L8%y8L#u`xEWtvWX*;s_tfP5-<0#n6YnlE=CL$yUZMB!L^~4stksez@P*p< zd&djpdKvwdNR7DeiV&k;Mn5odJ2tvhipj;hFYsR2g!)Rw#5I+TyU537VGrVS>xH{R z9KVTDKr&t@lHEoU7lJzTx9KG(0-BlFdFb+8Fq54cWG?lu^^<*Nu$0%QkIHJ?}(N%=u0 zWCv#rXr^+$QFT7mckDx4DW6zX`v?aaQDhWQz8}^p33h~Bem1KyG?c;qtv}PN+?c^& z!G=6+Wd+K$C%O1=e7IxlXt^>nISpVL*b#yDJwOQL@9`NBR9Py;y&P;#nXv|4MvuSh zyjPBOXa<`HAO6r5RvP0DK94+};k@=|Qa1hgN&{^PUH1vRb6{h+j3$Jg84)@7z_InI z50Ou-?*5nUNYVDYZG=&OpHLKx>fXiBT`#1YDg-c`~k zeMFPz-a<23@^uvi4$ex%<@j8_tL44%SMpzfqBp95ZW9DHZhN1W6%rWLL-&u-xJ0xb zg3Y<&-Bbpbj;WBp>ZHmWtlYwRY#6ks>~MJ*3R z^snwBTk~<+sb;v@y}e;C0Kcdg>5Ju+_V8Qxi9Kjd^`jt>(@$~+nQ|Ipg`8~7YPTz@ zbFELO?b>4+ua>Jea&i|y{)r%Yp6TZe=YK5Q5@xSfrW`WZryN$3iYF~p|DeN=(ZJY>!b<+$vzYrxCRD|soQ+IYQfxj2||V?zc2 zpw7h52qu01qb%cA;h zC`&jh$R*$20!(hqX}2Da^8IiGgMB^&!udE?Pk!ULUF2q8BnPB}DYKv6)Qt&p0BJY! z1#VIRc$KR?#jfEnX@BOlfk*hP8EfQu5?|nf$essQ8KhUkBq{1htx8Q8Bu8<}tKF&D zFE4c2ZtRrZN5B4Q1-Y#wM+RSc~WRfyA zgIj=h^Sei~&GnZ7S%&+Hk^PXdeX(QSy! zmZ7XDzx4v5>U2W z!WZw0nhctyUxyIw0cK#riRls8ts8T_+%A20O1bWObC|;5`NRRLSzM%PJ8qoNnLG1J zLdReB65ZSyz!Tf&{V0J1>R^1eZRz%E;>XNk@@XA|?UZ$U`gFX*Q^KC8n-gq>3~}8PL)f>F&h&*lj&^!; z%iUk_7-)J7HOt|i@Ze-1>Q4KVAM!e8Mc`JQhu>z%(W>i?x3zx-jS zodWo#AVM~eTUeG=GJh|2)r~$D?|vb2(Lbi|^*G#`-Q_(GvXf+?1ulGmJO4yzBm{U= zSW^r0IF=kO-VtuL;GF%H%hSt`rH3z~KMg#82xAX>?f-j`D>KR+@(E`R6}n;~a;bqm z25ScHWnMRUu$1AbDgSgw0sF(|8N~l)-Ix;AXvAlv-|ZA_auu&&3dNjP#nmAMa@_|*|M`EdOWYA5UoEsIdf8R zwqw^wdV45x8!^_j;6p`5F{SS@hWy5wy#;KYc%%a% zyNal3S^5#k_VR+#@V@wma*pFUFRZqYx%tsY<(h)?Z*pgjFTQ+noA}hl`e5l7Q5zHI zhV@d|3woEzkt!(>W3sDxEVtMozQmRDB?b}V%dNv*9a}T%Iisy?E?26R=7gIYkmn2m zfYJ#|uU_|}C~o*PMI`$h%=fB$H#SEK_pG-$PN8n(0_K-iiBKo&X{E*zB7 z2yPEtoa*S=tVOrw0HO;dGGaHP5ChNK#mUMUN7Dg%kdVe^z+|oj92@P@q~?)VB9hpi zWtxiy$M)Z36sLiILsa7PrQW?>YJ|$=aB(}u<-zYHN5Q?MkEBG3ACvqIu2zqbUA*u_ zvL7ch&LhYTuR##9h-!C-$C<-|u_g`R;$c`PGW^NBD9MGjf^-!dk+I$q+a%a68{l}I zSE9HDQXBmyYOnj#qAqzort;k_g8@$D7JK@^kcguvh(d^;t!mCQog83rA`?Ff&3of* zB#U-0b`52bdK0w~wcQ^fU9Y-ryuEBhr@6Q%j)7sCkGF9gp}8nOg9jU4Br{iY@T}JK z&sLj#2}NzjPife1BQ;#lh@r5$$>W*9qD6!@e7ecyq4*>o!WZ6f-%>%IlX5ioHX}xt zB<1#MHG(hvn0mVsz{DG!9l!0@#+`fZ`xW~Y2l-iJ^sHYg3E46u>Lh`$*ycl^GY%EC zK%S;Ta4?<^f;N_hI0RFm&$Z|=9M-8YL)ftAQ`0_(BZJ1P zaql&zKrG8WbpP{RzRxSP0xD?IXk;wfXrDd~KS)4pL;tGIK^<+iuzWIUspw5%W-KO) z-TKR`mD5deP7E7JDWh~AB#+Q;Fi{hKP@x$tn1qRs`^&LdJaAMO#O^3Yk-x_YT!JLa z#OqQMHS3-d8j~q16w)iHO`KfL-nwdAw>}AIl1vz>C3)TZyNeM)_PHBoJ@Fxn?xqtN zvk}TDp7&kEsuQI@_0#@u>R_t)@19aeAeC(dx8|4Ox1SB?A#^%yBaxPw&T-<8|y68ugi<@YhCMjL+Ul zbC~l~+q-ClEYD4aj_pTscw8z}8w++6kE{AZik?`PB-aP|_+uU!TqQI}&Sn%2qC%>p z6!Z7J+zH#x5MUNJv>|RlnvoUQ>s#HYQK-)l$Dk$<<1?NCyL3OgvW^Z1m$5dQ5);9% zxHlo=&$m;x7=F_v3!`ZJjKFI%Q=lF>xb*NQ;++c#5;?=B{=$Dl)jg*LVUP5yYO3 zE(lyaOVnuwdzlOAxj5a5qTg8CkK1d75NXTlB(6}|^O48aOs^{imVB<&;1ai#GL-qC5kYK*(VF7+~ z{-)2?6`FE^gdtfb8^X@%KtoW(QTUb}fkH1`0NE>wK>UdCQ$~jfty|BryR5(ZeQN>} zZGa@B!B`-1O%7vGD=O$>=Jgjvhbap2ESYHfgM&PfT9z_2TxOIHL?yh^ybA^wh7r6Yi_zTfWEcF8%JKc0o?&DKN8Yq{ylZAOa08;x5=f><91&9>Q*S+K(Px z1>Ps#mT-^J&4uozU*oVcdvPj671MmHYHKOBLB{t?mS%vX;=&zFqWvy; zG?%SL;fd<%VgI{j82f_91y5i=xG9CtSnB-v0(P$R`489cUnKj%Qf!OJSn#LUem95$ zehhW1gFZEM414vUUuhJ*n#b?N9`|Zq*OZ71FTSY`wJ>78Za8>|N6li$V2Hl0IGZ(F z+El>hioHfP@`>8LICxNY@5R_V7BO0VIeU<%N|yjmw2Jm}utGv~G5xjB133wq|G@%S zp!^ZNyKclW46!`njsqT4=x*sc8~YS8{>|?cUT2)ZqOBK#_E&))qoQpZ&JVQjL|S}Y zN=%67Bv{Ptrrt6aNX>-8;XOPW3J8^u!Mn{6qREXxi+Ii8i~$YwbBNgYvL>IWn5QL2 zA@W)iK|6~Q#MX&*E3SQpb+81Hr^C8QzUi6jzReQCd4uyf)^Oub%F&-rVX;Z7I*wjz z$2FH-C%pmRZ0r_rq-L37D9rR1IB!1C+C!qaK)w04jp8yG{M^BrFYdH%UTC z*W1!hRA?tsxG70)B?N5$a~GtDOG&g}Dbu?c!i67nQ=*0BwHKi)Xj?BV+2mV0O>AAw zTGJM$Db};O-c*x6=(hWLt*D5=C?_awz$FrgOwb{QE~PQVF|q{D-jgaWr^Mx9zf+fi zt$)U)Nm7y3VntXD#opJsC>9B}!EFlX!J`&%VxiaYFX>o931AUs7FqGDYKADdzsc2w zJZJeh5JAK8#v#Oq4v+PbBK@Bu8Ido`GK`db8FB<8{^Z(8bF#PH$Yr`NyqZ@)-hw*# zm7pQc^=SenY#})M>gsPF!sM#9tg<3lYooNkEtK6`J~)LG364owC5_}xL@}k*jnTd!8SJlFK*#1b?b`)frFOu+GMZ z1F+$cmutJi$K#d&49}+*%pT0*7Ww-qVG%XZk#wwPq(x?JBCX%K2Zr@sETwX|a&O%P z%PA@~A6>*LzcY>}CPjxC{VFF$Xh{l6#tk+8i^<)pHN$j$3|JP8&=#=-cEF>Z9giDL zu$%a*_Kp4f=M<{JqjiDUy_nCluyGE4iXe+!h^@aA9qV91mE75|uDKv3Dz_ghF`$C_ z>WAONCbOinm5I3Ewk6t1K3^3JT|C0bT7K$)y)|e#sI2;dqPy9QO6B0EEo$3S=dkLS z2rhr7@(YbGDeg4L>>kWwOow>aB2VDhT6>F~j!MGY9y(F85({OxhFXq3SvAQLZ~asA z(RPR%=Y#gz#$q4Bjz`eTFVGEN=I{F+OFcz!=uw$Lzp4nE`C1zX3Fb_eg<&ffHXLCg z93k)8o=Z9VunGGwHzW2)Go?n%u zNSYq!3u@sJlFBFWy7*`?=z+8G^B{>7J7*=G3qFU3N zx{TfT!>SEs`NSCVyFt_6VAcP=kQ$#onz*b)-y0n)Z*p%EJT-WYc$3|c%Aev%!U+-J;mJ~PJzhOmi5YD#) zrH%od?WWVdC7WC_wDTNE#1M1-X|OJc@XT&GAXanJTl3o6QfrvR@+ptrT3TXF_SFfQ znrYnapr!5GzYg4)8s8hSly_c!%))2nF1d00fX>Z|IjfD1=kN!l0Y~f<3K`Et=F`gU z)h?(vxx7^iJfE#*Hd>8zUx_tzUk}}9^ZzwGi;~AOnJdfQzb7d-(%=8Ll+K3G#}_N8v?GT|ao1vzy)qVimF!QPc<(12f-2J}AIqW0ieA)2Nvf!a zjarOYz?-G&Y?rf#mxeF88y@vN0S_NSIFw&Qk%;`O;3)8lrAb{qf>IzJ@|5Ksngu#` zQJjuFy`BBa6Zn{ibjSP=YM{{u3WHCq3XcD zAzb}~TXZ?zdMPS#s-6PIEVHVdmRakZ!0-8Q{Ih|~-GI|_Z95U{9$vB$rS__C?juqb zl6pFB$3oW?i;zo=u1L>QMAJ7PW|w;@ev}p1Me};jhkr>DDd9O1J z*WX+}HC@Lrp}rBKXf#FoWH0ZxJJvnGg|Bf2`IMo|!k|s!a#a2jjIus%ZC?}=tv13U zjL-00+!;3QJFdj_(jM!7z1RF!<3`@0Tk6P8@(VY5Yzwc>uc>|+e`5a!zqD9Mv4?Wp z8c0OGUuWZeLFjrvzCum)-1q+e%^@npfyRhq=JPL>j zU;G8S*|qycL*ZL5$Rvjt?&S~n=3LSvV`d4gDMNDB{qmHdzV5jDq1+OAG>@;nm4D>j zk0srw2HL;^}T=jjNoVa~gDrlzTO>PYPBBrUZH~wO|1?+i zUI-V&6hgv6t1dZ&2Un;46!iRhn6_YwN@Y)Fr-&+?s>;gPOPM8+&0sZzoS**f!B0DC z-z#;N645MO$TPBSdd8LOqe(KB=i}%`VY2tS7b5V4k3rh6G?rrnn5d|4RZB2eARR$8 zOFE9Wew&?%x_V}#ZRMMS(iH1SrlJ5qNlV6LMoL@9YQk&<*@h1;(q> zT{ib~zHl*JM^PZ-O+@<$A|a6_IQU+)I}Tbh^($O`g)~Ms@z7x-?5mL5%Q=xBcoQi& zTTLZ|sHr`Kp|P?Y@Q%oZc9xTQOF8>CNK^e8Mm|`bd9*8vibq9eZ`iFxxX>F1+B#S7|VpvEZ$k5Ra@nAQ9dVW2Cr@L7h3CJ-RJiIBVV zu4^a=x0cc=viQ|8MoB7jHpOn2(jfxfLCjlE2c?h3jpnrtuZY$pF@p3x3p27_0`u2| z2Mph>B?j&Fem~I2kk-Acj+Z2cgq{g6SYK?1JJz8?3|^n-$`*-tH1AeXAca(Tp9$s^pNzg8QphXNV zD0TThr=q9ItJ`t^8SdI0C65Hrn@FzqtoGIq7497qzg^`gL;6C8g)FlL-}$abQ^3Ka z+KV+r>;^ZXxal_R=30_3>Qv56d3%aJ@GE347V|t+&(_ z+P;5;S9x-(Gc{@gwt{-)oN|=7+;ZWWO5xv1mgPjn>L7OicC?zZN2D+E$cfZ|F9Ga$ zLyM2Fq`(kUTt?C?m&ABgz_o|5MFv1=Tr)kD@rq z^yOa8R<3{KpKi*bq+%bgd$TBpTZOBey7C8-a-62tvtjO#XSnbEup^3}(r+puv&amX zDr`M0RhOW8ze3z8F2{Lt5e)G~2KG5qRp>j$F>~^+7r@YH=#r&~h%CJC8!d$fyP8n1 z*V{F%l+xx}{fNI{RNsyVWAESp_@-89=zz9Q0+{(6e-_vFsT6n@lXgBKwjCMMSmt%j z$D-qY2F&+3&|6*PZHB)LtRLJi)#0{(nPuq(MoTjDZbsy@wwI2$85($>wA&Ga&0Xm) zE@vp62~_y;w7}*{%d2OKjuhPXi4|qvXH!L+WG(=pkbjeu}xfSOx`zZb>=8B;G zU#-5|tMhZjoTf$W6OJJGJuVR%$j{BD} z_ZgH+$q#L5-`FP>lPkQn!rNUuNL=m}*>5>eYvRuS8~nfa-~YA${;xS6AS(Vp=!gR} z*g$yGYpTB6Zu7^ve8(4*ZA;TPV;s{kJzmzCll~-<%&vHMs=@yXFxke3^ZU2_cqOMl zvDJ{7CvY*exv-itS)6TGyPaWh4gO54GHuczp+|a&szNi#Mn3vLbgBE8pwc&Y=0Vy% z0SFuKeh%;1PZtuBtMwFZa=)EgofaGVP%xtJ*qr#9zxiK^B9k+K!(yMl2$>xGIEb`H zz=Q-4Qg=v=BXuuR3xKGSesR}as0RQ&pvurQkpq~-09Q6Dz?0#w@!y>=qqM3&AA_S{ z;@&tlI2BSAMWOH3DpLuTK+_Q^ah3p$0+iswpy;`MTn!m0+1Veg2}MH32N;Y@{ib)b zQQ)_l5{~w*)Byl6 z^eD6uk-?zz^>`JpzdFBL*#c8s<{{L(X57tia6_B=z#4KMO}>6~0I(##d%Jn=O3F~( zP2IUpP6rc|Tz>x|A5iEan2<7ue(CN@@SDy!i|Wg}RnG>)jLhNVqNf2hg1*bqBcUI0 zgU=a@TitS90GiR#tpykx^s*2zl1p{1H>UtMvz}a0L=P$x;>9}l&%hie*(DK0Yy}x_ zBSe|ekJ^VeL%#m5O`72t)N|V}8#BL6g2zs$L7DOXwK9$9N2f2eZ4Tb<2hf~;@L%pr z(Irora1vOJ_f41U+lK62>Lt4BkX?_H*VgC6ZSdqZQbsu6O{*-qNhoHUaMRrNH3lWD z<~S}P4N?=@6yD%ty=&gyhFY6EP-NTgcHBMop)lWY=_k(P!T3AYy5mk<^}3(z1^kDZ zXJhkDT;2z*db*UC+tpG*6zkf9*wN@U@lC&4U93C#D%-;R%qEAAyEXZIV)N4F817iX z>b5*3V3>PMNIE1g^ioF;Y!TWbtL8-erQ}D3N!xBCMHg8V)~;qX*GohKu5rE}cvfdsVJMD6M?)_=(cO^orB95#pgmjQ2ADy=E4c#F@jl_a--XtQ8GQ(Z!xe(fXjsSqy%h4WDW z@B7|wwKd5a%vsnGQIYFlJ4``VrtEB49Bw?+KjgPP@|lXe^t@Z@MJ#Q+mKa@T`n<~> z-}2h)1E&3@w9keue;ByrOp*VZaj59axt+<(_J_H_A%ASge?lVzZ}~aj_3DsWI&V+> zMUiQ_IbXMK|A568ZCbNM?|9TWKTqSspQSxZ1%!%e^32)|ZqK};ADKBqanR$chxpQZ z5ZhfrRcF=~VehIRla9EJ1Tiecb6N(NpN!=hX#R_@+#zp}d6M0nwu(lhi#sR2DXJ*A z8R;gvw$|@ARMsiD;}Q)(da9Ooi%%0q0%dc*kq+3VM*$3~6z4~8NKH&ry&46+so9Z5 zBi>-WywM*`N%!3rLEhypb<0&l&Q<%)%3Iuo-I{>efZuZ6-givpm~d~_uX?*gz_8J> zfs@m}@Ma~`zCD=qGAXtjAvb0YITP-#R-1j|=jOa=k*hg)tmOZJB#9lIsTyd4uD!c7 z1VTH<=`2NZoayLRtW47R_{`>e&E2+BHa8;h8|7XHAtp{39w>fyylKB8sl9qud`waJ z2V)^|b0;K=kY(TT%{w^#7B~1$O^fcmvCp+%YVtqIkG_Crez0j^L_#-$7QJuYinYEb zG^}UEJTb{Dy~p_{ls5Fr>^Q$2F)>L&oYp4SZPrr9ceoftse>=j=tk<+#?Q(1uU_Sm zLBS}uI@rwV`80gWyEqOi2s=IJU9hWceKAv>A!3*m7mr@+b5BIeWgx{efZgr=p}O_e z!1SAZu~7-=yFRo(VDRrH^-m%f;b-CJ$zMM}IvXiVAiR%Djn2kmtNJ~v&8t@Ov<&Ax zrINq?mhU0F+vZ0END3`M6r4|O?RN>PAB$Xn{je`SYo*w_M8EndiN5JWY=$&TK>ci) zYgX>Sz`+x^=GVb)z_cD{N34m2gM~uRN5yFXu~6HZFqYZN&g zXl(B()MKrfv5&HSGFkBnT(rIuo?to!jI0g@ws|!-JHJ9jna~9Jw|@~e3?VWLXy2mD zeI4Lb6edlu;HkzpdoKRhDXA$j7rdF-R>E9YlFckT%mvCQA6~*o^LgIOFLz5J-^Z!i z%5;LC7t_47qho5#z*Y`jjLnD8a&UO~S>B2T*-If1vbFv)$P)2QTkA0|W&?3@El)C{ z$F1klM-d=O9y~3-^9xpuv3s}7-6TVBVm}?0t?llHOk<6u8b?z)_2|Hy5glXJhhMa! zvxsHCM?nf2wj0z3DtR#{J};`in|$lQgs^%0SsknoDiVmJTg<4cw$+VQ((0CO8-)bNbbo&S;;u_oWbLlA)nnzwCp5m5pj6k3ActZ% z`>m2;)E+Jk(pDQEyry0D#`9$R)*`wL0)u-%A5$fu0d5cuY@`Avq1&UO*s2}{*CsVW z;%AUEj@_-x!mk-I2~**lGUXVn@dJ66lp(*h3RWLD`vuvlE8QK5`Oqdmhpd@TmU$&T zFIlUDRdQ9emE&(ZIE$~}MO?XCn#T8Nql&p>9qKw=9>tbTlw{Ngs|37&zQgWW$OTvY z9NHezY|1bscz`?)^NadBq%IR+Q?-X=rHf*0Rh<|h6o35`8X-+R{QN2lM5+_{2WT-dmlLW zHoS8*E89VgIj5<$u7!aW8ILRAf)KFn1WslO;w$eYknheIykQdQ7Qki#NcOXkYA`=} z+_|j$)hRpaZl|RQb&IIc)~YD(ul9$NXz^(wrJ-v z{vu%GooTD0)~w_2B-r)|aq-I1FueQ=L)+MX*Ykv=-8=CSNEo=WBB#~%OAX_&&l@zw zH}6c_2`tCcvr~Rrj68RpxbRG%@YlLMRyQlTc?xsbjxs#AHjMw%b4nW;(4>4wfEXeU zX-)cnb~){+*!nojd)vN7E&bj3s!9P^+3f7>1Qr>KICY{7te@GHR07?;OTsW~W<=VZ zR~x@*s~=losD0!_U~=-0j=(zqWiQ--7YqDO_PoC+Voye$PSl4KoBwa#ROH<|d~y4W zof6w`l^OmE-F;+*p|G`E#=SW|Kdzs>{P>pJ@*Nkw`+J_M_w^SFPwNfulNa{xm6TO> z>-*4Ge?01V6R2gCqI}@H{x7lbN4dGhj%_X$KeEU2{E^_z&yO8?E`I#i?6son?_~w` z%r-EKPGenCmGtg&;p4fRA5B}?e-u~_9?R11@1Htdes+h^=^jbZ#cmeYMH=>giG1|E z``52WJ6XG#K0e*J{Mm8k{g#20=WOy?V^R0=Qt=A20L5j`XT>zDUiix* zW>Z_PQ}HSOP1;JL2w(?VK%VYyM=ShQ7{i(BXB`EDDj~Sb8hJbwt;6mL__KdG_9cJ+oM)N0u5IH zdVc-#hJk^3nx~6n$Y@}~Q_E;-L}a(oWHCU=;*b4BTf2>W4QFj<00K`}KbLh*2~7ZL C7Zxdd9o4EIZ/DZfpQZItm8tASHb3tN2eZtuml8IW4I2xOEYEsr9+ZZDwh0QgwR844SbBshH4mZeRZjRWBw1m67uYzKdfmE/DDuz66w666UAIAXTFv6TleduCAd42TOLA3zaBtOE++I/Kxq5sXQY+XeQu5IyFPJjnGz0WRdTjuTYSx2yVv2zMwvynzsmEag33Hgn11l+Bz6fbVtfupu1/0GAyVZ8MuvLMiHiPk5gtI/l5EYvo9syMqG7kpYsp8dkq04SGHTSIGePbV7P1gIYJVkVs+77bPWd3XzmmET/mDYNV9xe45X89fI349ePTQzD58vkKbnt5IuFSopBflj8rNpu7o0knoIP6q2nA6f2ceMnZlVCDaJvyWShPj4MwHLCQxZv3ovGYYs8T7Qses0eaOeM7vZGAiPok9qQeLHGk35S8zycac7rONMmbvKNsRnn8LC6RZ5HkLaXoyMNValenJ9umGZva6kIitTTZ9ZxCFS8k11cwtvFrIHePgMwiLpkBuIOrhFs0w0aSqO+TxXRnxeTgG+GcxtGmBXZhOfAtNwff6hnoY6jTB6gq+sguW+Ip/Z6ueN+mrm+ZFO/CEcK4HMxXsJtXOcYa590lWc6oVxVnS8c8gJ3rfhAJlY0TmOKwL24eh+K79EexeDXhGxyyRTX8I7hF/YRerM6JbzRKry9YL2ObEtDaTg4sgDpZAEz+ozL3URrY7yTy2eyORjQmnDUBV7jeHF0b2jpdVCddg28+RbY7uAMWjYNJA4h76DBhu07CTmmEf8ThTxIGfkPitdzuYbS1uga3TLQb/X6nc7YIBN/nBgBjbJ2Zd+hpgL8yfpvMFoZrj855wKKqmdh50YGu2zATpfDMLVNfRFPykMV8yiYsIuEwbe3n57fpNZ8Zm0tY/1LOn+XEiiw5y8+66DrgD8nbP9ny6HfmzM1a9rw5eJYHe/Ev2DL26GG7cxJPKD98XXL/LxozpiHhwVM+2izfMkpdqVz7y0UQ0cWiMbnixuWqh7jK2dXMAsLGWSCNRWayfU/jp8CjVY+ihcjFOMGul4oeumTncuJHUw8ZiECODHL14BlYvTrJVDU7biL0UDpTv0ZsoGtbddLVZ8Y/FrrIaORfJynOZGydC6clBrnIz6Z/cpmdDLT8mPv2wdA9cjBUnvbgaJglrqxw9Agpu/vGhAZT6yKn4GvdgtW2dynflRpO68hGBzraYtA62ihgd48niEKf05+lKNRQclAVzkUUp4tCj0PaLQr3IoqTRaHWld6NKNRs46KKU1Shx4DnqQrrSFXYF1GcLgpDDNxqUVw8RQmi0JMBwzUXFl+8JIxRyLzHvDLw9vA2SD5/o4AmpXEZRcrQhp4SOU+Hcezc4thE7UUUL4hCX4lutyhUvrwJVdgqplNpUMv55HYtC6o/7ttEgnFeJADBT6Bn2476A+vVjJ5BPOdB5ljlWBd3cro0DIUBRU2cVns4hntqD/EI2yVVYhUgYlPO3lRuWF3BGzRUBZTJlQLfpo6Jaw87iJTE9RiwVhfUClbPwpUK1ifUHRsFiz2XjsYlrUpa4CBY4NaqWNVxfon22veTAsAC4HIXha5AwZsCYFijrbWmB+mx+jB6MheX7WdTLBEugZVVqKs2rds6tZLSA9jNkwmmWqZaSWEbH0ZVaw0e0uO5XSXdIltWd8RKdxXSssFhYKqSpB5gDcxbi2DTkicnW/O0K3MqueZJOZ42Jd8QKGnyq3VU8eQX6ZPf2vV1glTAkVI5o+R9e6Wiz+fbJJVj87ZnVCfQXqnoEUrtUlmIe+Sqa/ns2QnyaWFFQWvlYxnjsDuaPCeoCajsQMy28/dueKKt3kBMxcn1pLsLTxW+/RejjNimHCYqphbe/IspdlT1L0YP1tugEXTRSI0a2VN0f8PZS061gjD7ChRq76Eh21VrCscyrDPHYRNk3HMjU+tiawOeBTXnWnbbjiiPoNJNr3Utmo8qdlS1a9GzVO9LJA2OP+9HJHqq6WdAV5pKhKvkefPn16FkLGfYWoSEwSTZR8SjyWNBoiFxvIFHwmt5Yhb4/uYxUNOC2P5wEneMe5skV8ivbdgE5w2+v1cwkB55YIPrr2w5zNITPjdsRgL9ecWParLCLjONG0xPu+xZobsYbGsdNW1qymLq8zMWu/bJXJDVM2Uf1Waw8Phy80bTEzI3+lOjH9VcWl1H0+ZCBnPRMVmGvLAPUTNrzkV5G9ecjRvFVaZvwxZaRSbvZZ84DPPbbPUMZTeOo8PfbWpWPv1X7RPXbvqF4RioutdcfQrU6QPXqYq+Puf9M5ovkzCqn0AnhiKe8/D0OYsVbV7xPMrV7VbviKxPfP9e8ovZDu2K2fTQjPXp7zDiAQ9oFdPfkI55i4yFYX4l0rCBLAAG5/gGa4nDdP/fbb4n3V8ZDf8H \ No newline at end of file diff --git a/doc/readme b/doc/readme new file mode 100644 index 0000000..0c84136 --- /dev/null +++ b/doc/readme @@ -0,0 +1 @@ +open the diagram using draw.io \ No newline at end of file diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..36f3b49 --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'urlshortner.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..489aa39 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,12 @@ +asgiref==3.5.0 +decorator==5.1.1 +Django==4.0.3 +flake8==4.0.1 +mccabe==0.6.1 +punq==0.6.2 +pycodestyle==2.8.0 +pyflakes==2.4.0 +qrcode==7.3.1 +six==1.16.0 +sqlparse==0.4.2 +validators==0.18.2 diff --git a/shortner/__init__.py b/shortner/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/shortner/admin.py b/shortner/admin.py new file mode 100644 index 0000000..4185d36 --- /dev/null +++ b/shortner/admin.py @@ -0,0 +1,3 @@ +# from django.contrib import admin + +# Register your models here. diff --git a/shortner/apps.py b/shortner/apps.py new file mode 100644 index 0000000..42dc249 --- /dev/null +++ b/shortner/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ShortnerConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'shortner' diff --git a/shortner/domain/__inti__.py b/shortner/domain/__inti__.py new file mode 100644 index 0000000..e69de29 diff --git a/shortner/domain/boundaries/input/token_broker.py b/shortner/domain/boundaries/input/token_broker.py new file mode 100644 index 0000000..d986a7c --- /dev/null +++ b/shortner/domain/boundaries/input/token_broker.py @@ -0,0 +1,6 @@ +from typing import Protocol + + +class TokenBroker(Protocol): + def get_token(self, url: str) -> str: ... + def get_url(self, token: str) -> str: ... diff --git a/shortner/domain/boundaries/output/random_generator.py b/shortner/domain/boundaries/output/random_generator.py new file mode 100644 index 0000000..35ff2be --- /dev/null +++ b/shortner/domain/boundaries/output/random_generator.py @@ -0,0 +1,5 @@ +from typing import Protocol + + +class RandomGenerator(Protocol): + def get_next_int(self, stop: int) -> int: ... diff --git a/shortner/domain/boundaries/output/token_generator_config.py b/shortner/domain/boundaries/output/token_generator_config.py new file mode 100644 index 0000000..cd44c08 --- /dev/null +++ b/shortner/domain/boundaries/output/token_generator_config.py @@ -0,0 +1,5 @@ +from typing import Protocol + + +class TokenGeneratorConfig(Protocol): + def get_token_length(self) -> int: ... diff --git a/shortner/domain/boundaries/output/url_validator.py b/shortner/domain/boundaries/output/url_validator.py new file mode 100644 index 0000000..ba3cdd7 --- /dev/null +++ b/shortner/domain/boundaries/output/url_validator.py @@ -0,0 +1,5 @@ +from typing import Protocol + + +class UrlValidator(Protocol): + def is_url_valid(self, url: str) -> bool: ... diff --git a/shortner/domain/boundaries/output/urltoken_repository.py b/shortner/domain/boundaries/output/urltoken_repository.py new file mode 100644 index 0000000..d8bae7f --- /dev/null +++ b/shortner/domain/boundaries/output/urltoken_repository.py @@ -0,0 +1,8 @@ +from typing import Protocol + +from shortner.domain.entities.url_token import UrlToken + + +class UrlTokenRepository(Protocol): + def get_by_token(self, token: str) -> UrlToken: ... + def insert(self, data: UrlToken): ... diff --git a/shortner/domain/entities/exceptions.py b/shortner/domain/entities/exceptions.py new file mode 100644 index 0000000..4deea66 --- /dev/null +++ b/shortner/domain/entities/exceptions.py @@ -0,0 +1,6 @@ +class NotFoundException(Exception): + pass + + +class BusinessException(Exception): + pass diff --git a/shortner/domain/entities/url_token.py b/shortner/domain/entities/url_token.py new file mode 100644 index 0000000..ebc1c39 --- /dev/null +++ b/shortner/domain/entities/url_token.py @@ -0,0 +1,7 @@ +from dataclasses import dataclass + + +@dataclass +class UrlToken: + url: str + token: str diff --git a/shortner/domain/services/token_broker_service.py b/shortner/domain/services/token_broker_service.py new file mode 100644 index 0000000..5c25216 --- /dev/null +++ b/shortner/domain/services/token_broker_service.py @@ -0,0 +1,33 @@ +from shortner.domain.boundaries.input.token_broker import TokenBroker +from shortner.domain.boundaries.output.url_validator import UrlValidator +from shortner.domain.boundaries.output.urltoken_repository import UrlTokenRepository +from shortner.domain.services.token_generator import TokenGenerator +from shortner.domain.entities.exceptions import BusinessException, NotFoundException +from shortner.domain.entities.url_token import UrlToken + + +class TokenBrokerService(TokenBroker): + def __init__(self, + repository: UrlTokenRepository, + url_validator: UrlValidator, + token_generator: TokenGenerator): + self.repository = repository + self.url_validator = url_validator + self.token_generator = token_generator + + def get_token(self, url: str) -> str: + if not self.url_validator.is_url_valid(url): + raise BusinessException('url is not valid') + + token = self.token_generator.get_token() + + self.repository.insert(UrlToken(url, token)) + + return token + + def get_url(self, token: str) -> str: + url_token = self.repository.get_by_token(token) + if url_token is None: + raise NotFoundException('token not found') + + return url_token.url diff --git a/shortner/domain/services/token_generation_service.py b/shortner/domain/services/token_generation_service.py new file mode 100644 index 0000000..c738c1d --- /dev/null +++ b/shortner/domain/services/token_generation_service.py @@ -0,0 +1,19 @@ +from shortner.domain.services.token_generator import TokenGenerator +from shortner.domain.boundaries.output.random_generator import RandomGenerator +from shortner.domain.boundaries.output.token_generator_config import TokenGeneratorConfig + + +class TokenGenerationService(TokenGenerator): + def __init__(self, + token_generation_config: TokenGeneratorConfig, + random_generator: RandomGenerator): + self.token_generation_config = token_generation_config + self.random_generator = random_generator + + CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + + def get_token(self) -> str: + chars = [self.CHARS[self.random_generator.get_next_int(len(self.CHARS))] + for i in range(self.token_generation_config.get_token_length())] + result = ''.join(chars) + return result diff --git a/shortner/domain/services/token_generator.py b/shortner/domain/services/token_generator.py new file mode 100644 index 0000000..83a4554 --- /dev/null +++ b/shortner/domain/services/token_generator.py @@ -0,0 +1,5 @@ +from typing import Protocol + + +class TokenGenerator(Protocol): + def get_token(self) -> str: ... diff --git a/shortner/ioc.py b/shortner/ioc.py new file mode 100644 index 0000000..dc0941c --- /dev/null +++ b/shortner/ioc.py @@ -0,0 +1,40 @@ +import punq + +from shortner.domain.boundaries.input.token_broker import TokenBroker +from shortner.domain.boundaries.output.random_generator import RandomGenerator +from shortner.domain.boundaries.output.token_generator_config import TokenGeneratorConfig +from shortner.domain.boundaries.output.url_validator import UrlValidator +from shortner.domain.boundaries.output.urltoken_repository import UrlTokenRepository +from shortner.domain.services.token_broker_service import TokenBrokerService +from shortner.domain.services.token_generation_service import TokenGenerationService +from shortner.domain.services.token_generator import TokenGenerator +from shortner.services.default_random_generator_service import DefaultRandomGeneratorService +from shortner.services.env_token_generator_config import EnvTokenGeneratorConfig +from shortner.services.validators_url_validator_service import ValidatorsUrlValidatorService +from shortner.services.model_url_token_repository import ModelUrlTokenRepository + +container = punq.Container() + +container.register(TokenBroker, TokenBrokerService) +container.register(RandomGenerator, DefaultRandomGeneratorService) +container.register(UrlValidator, ValidatorsUrlValidatorService) +container.register(UrlTokenRepository, ModelUrlTokenRepository) +container.register(TokenGenerator, TokenGenerationService) +container.register(TokenGeneratorConfig, EnvTokenGeneratorConfig) + + +# based on https://github.com/django/django/blob/main/django/views/generic/base.py +def get_ioc_view(cls, **initkwargs): + def view(request, *args, **kwargs): + self = container.instantiate(cls, **initkwargs) + self.setup(request, *args, **kwargs) + return self.dispatch(request, *args, **kwargs) + + view.view_class = cls + view.view_initkwargs = initkwargs + view.__doc__ = cls.__doc__ + view.__module__ = cls.__module__ + view.__annotations__ = cls.dispatch.__annotations__ + view.__dict__.update(cls.dispatch.__dict__) + + return view diff --git a/shortner/migrations/0001_initial.py b/shortner/migrations/0001_initial.py new file mode 100644 index 0000000..dec5cde --- /dev/null +++ b/shortner/migrations/0001_initial.py @@ -0,0 +1,22 @@ +# Generated by Django 4.0.3 on 2022-03-12 04:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='UrlToken', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.CharField(max_length=1000)), + ('token', models.CharField(db_index=True, max_length=50)), + ], + ), + ] diff --git a/shortner/migrations/__init__.py b/shortner/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/shortner/models.py b/shortner/models.py new file mode 100644 index 0000000..09873c1 --- /dev/null +++ b/shortner/models.py @@ -0,0 +1,17 @@ +from django.db import models +from .domain.entities.url_token import UrlToken as DomainUrlToken + + +class UrlToken(models.Model): + url = models.CharField(max_length=1000) + token = models.CharField(max_length=50, db_index=True) + + @staticmethod + def from_domain(data: DomainUrlToken): + result = UrlToken(url=data.url, token=data.token) + return result + + @staticmethod + def to_domain(model) -> DomainUrlToken: + result = DomainUrlToken(model.url, model.token) + return result diff --git a/shortner/services/default_random_generator_service.py b/shortner/services/default_random_generator_service.py new file mode 100644 index 0000000..16cc014 --- /dev/null +++ b/shortner/services/default_random_generator_service.py @@ -0,0 +1,11 @@ +import random + +from ..domain.boundaries.output.random_generator import RandomGenerator + + +class DefaultRandomGeneratorService(RandomGenerator): + def __init__(self): + self.random = random.Random() + + def get_next_int(self, stop: int) -> int: + return self.random.randrange(stop) diff --git a/shortner/services/env_token_generator_config.py b/shortner/services/env_token_generator_config.py new file mode 100644 index 0000000..8fbe78b --- /dev/null +++ b/shortner/services/env_token_generator_config.py @@ -0,0 +1,7 @@ +import os +from ..domain.boundaries.output.token_generator_config import TokenGeneratorConfig + + +class EnvTokenGeneratorConfig(TokenGeneratorConfig): + def get_token_length(self) -> int: + return int(os.environ.get('TOKEN_LENGTH', 10)) diff --git a/shortner/services/model_url_token_repository.py b/shortner/services/model_url_token_repository.py new file mode 100644 index 0000000..09a4dcf --- /dev/null +++ b/shortner/services/model_url_token_repository.py @@ -0,0 +1,14 @@ +from ..domain.boundaries.output.urltoken_repository import UrlTokenRepository +from ..domain.entities.url_token import UrlToken as DomainUrlToken +from shortner.models import UrlToken + + +class ModelUrlTokenRepository(UrlTokenRepository): + def get_by_token(self, token: str) -> UrlToken: + try: + return UrlToken.to_domain(UrlToken.objects.get(token=token)) + except UrlToken.DoesNotExist: + return None + + def insert(self, data: DomainUrlToken): + UrlToken.objects.create(url=data.url, token=data.token) diff --git a/shortner/services/validators_url_validator_service.py b/shortner/services/validators_url_validator_service.py new file mode 100644 index 0000000..3b8c60a --- /dev/null +++ b/shortner/services/validators_url_validator_service.py @@ -0,0 +1,7 @@ +import validators +from ..domain.boundaries.output.url_validator import UrlValidator + + +class ValidatorsUrlValidatorService(UrlValidator): + def is_url_valid(self, url: str) -> bool: + return validators.url(url) diff --git a/shortner/tests.py b/shortner/tests.py new file mode 100644 index 0000000..a79ca8b --- /dev/null +++ b/shortner/tests.py @@ -0,0 +1,3 @@ +# from django.test import TestCase + +# Create your tests here. diff --git a/shortner/urls.py b/shortner/urls.py new file mode 100644 index 0000000..edd1cbc --- /dev/null +++ b/shortner/urls.py @@ -0,0 +1,9 @@ +from django.urls import path +from shortner.ioc import get_ioc_view + +from shortner.views import UrlAdder, UrlGetter + +urlpatterns = [ + path('urls/', get_ioc_view(UrlAdder), name='add_url'), + path('t/', get_ioc_view(UrlGetter), name='get_url') +] diff --git a/shortner/views.py b/shortner/views.py new file mode 100644 index 0000000..b644fae --- /dev/null +++ b/shortner/views.py @@ -0,0 +1,43 @@ +from dataclasses import asdict, dataclass +import json +from django.http import HttpResponseBadRequest, HttpResponsePermanentRedirect, JsonResponse +from django.views.decorators.csrf import csrf_exempt +from django.utils.decorators import method_decorator +from django.views import View + +from .domain.boundaries.input.token_broker import TokenBroker + + +@dataclass +class UrlDto: + url: str + + +@dataclass +class TokenDto: + token: str + + +@method_decorator(csrf_exempt, name='dispatch') +class UrlAdder(View): + def __init__(self, token_broker: TokenBroker): + self.token_broker = token_broker + + def post(self, request): + try: + j = json.loads(request.body) + in_dto = UrlDto(**j) + except Exception: + return HttpResponseBadRequest('invalid payload') + token = self.token_broker.get_token(in_dto.url) + out_dto = TokenDto(token) + return JsonResponse(asdict(out_dto)) + + +class UrlGetter(View): + def __init__(self, token_broker: TokenBroker): + self.token_broker = token_broker + + def get(self, request, token): + url = self.token_broker.get_url(token) + return HttpResponsePermanentRedirect(url) diff --git a/urlshortner/__init__.py b/urlshortner/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/urlshortner/asgi.py b/urlshortner/asgi.py new file mode 100644 index 0000000..d64187c --- /dev/null +++ b/urlshortner/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for urlshortner project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'urlshortner.settings') + +application = get_asgi_application() diff --git a/urlshortner/settings.py b/urlshortner/settings.py new file mode 100644 index 0000000..3def069 --- /dev/null +++ b/urlshortner/settings.py @@ -0,0 +1,124 @@ +""" +Django settings for urlshortner project. + +Generated by 'django-admin startproject' using Django 4.0.3. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.0/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-y92txdx91gb=*_0zz3n6%s#hzi9u!(7!(&k-w0a%*@el7o7i)t' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'shortner', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'urlshortner.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'urlshortner.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.0/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/urlshortner/urls.py b/urlshortner/urls.py new file mode 100644 index 0000000..269dc67 --- /dev/null +++ b/urlshortner/urls.py @@ -0,0 +1,22 @@ +"""urlshortner URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import include, path + +urlpatterns = [ + path('admin/', admin.site.urls), + path('api/', include('shortner.urls')) +] diff --git a/urlshortner/wsgi.py b/urlshortner/wsgi.py new file mode 100644 index 0000000..940503a --- /dev/null +++ b/urlshortner/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for urlshortner project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'urlshortner.settings') + +application = get_wsgi_application()