From 67f292cd60e5f8825b60275f508459b40b181da1 Mon Sep 17 00:00:00 2001 From: tactile Date: Wed, 1 Oct 2025 16:43:15 +0500 Subject: [PATCH] add dev mode --- README.md | 13 +++++++++++++ README.pdf | Bin 1466596 -> 1488281 bytes backend/main.py | 11 ++++++++++- docker-compose.yml | 21 ++++++++++----------- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 73034af..c4bb024 100644 --- a/README.md +++ b/README.md @@ -236,8 +236,21 @@ source venv/bin/activate pip install -r requirements.txt export DB_HOST=localhost export DEX_ISSUER=https://dex.127.0.0.1.sslip.io/ + python main.py ``` +Для удобной локальной разработки без настройки OIDC/Dex есть режим разработки. +```bash +export INSECURE_DEV_MODE=true +export INSECURE_DEV_EMAIL=developer@example.com +``` +#### Что происходит в режиме разработки + +- **Отключается проверка JWT токенов** - не требуется настройка Dex или OIDC +- **Используется фиксированный email** - задается через переменную `INSECURE_DEV_EMAIL` +- **Логирование** - в консоли будет выводиться сообщение о том, какой email используется + +**Никогда не используйте INSECURE_DEV_MODE=true в продакшене!** Это отключает всю аутентификацию. ### Локальная разработка frontend diff --git a/README.pdf b/README.pdf index 64f0a84dda7d92a19f079e83a0f2be1181ab87ef..8f702544396a7fd598fbb71d9eeae94f2d3da9fc 100644 GIT binary patch delta 61307 zcmZ_02Rzo_`#tQ6NB*hdJ+5N8hI$ic43w*So;FiQC9gp%v4Yp<_`GUw)r%T~*~$Ge z6H~7gIL)5g*k`x^*Ap!BF??#xK233!Bw=qUJIrdc!S-Ntc{C|(XBeXtvbE0kwNWqoc%JG8`EZR-?~5lmNSl~a z?c>wj($r=-|6ZX@bWHA?;Ob=h>0yHzx%J*?-G>%mko_rV(FRKbOUR$SIh9!rjK!=W ziz)Artjycnx>+P{`hR#a&ZM4Q< zFx&G{?VYptzFb>9(M7NZNxri|_-pD-513Fb;xT7wkOdseI zsSy|oN}Q2QC<)6y>98+$F_E4tt@IA}n*cq54f#b%O&;}v43%OlyW41A4oRwxvzIKo zPd_hbwC4RxA~A^;xO=nRuEdc03}KBp6UFdDis%J>O%hLMF~*bf;p~|zeB4qQi8Kus z^UvGuk~@XZ<%qj`i80125@N23lNAh89Q3)j?A|D4+Q0lnIn?Nht9{Uu)Kk4rYHqVW znT}j6VU)#ucsLhAm!RuyCHP*LrNpX+qV==lw0v!Pq?GCM6|%4|ITNQ32=orrxW{j6 zay|l2y@HRZOYoH4z~YCyBo#bVL>?YQ@2~URQTGg(va`4z@tmEhqLK+iF*=Zl&oAk) zZ|2dm>r~1lpzY$sqMujvz??To%cvm6pv^)$(ypXQ*6qVND;eqG#ExILyJuBt%^$ZH zT9V%PkYW;CZ+CP&-7w4x{K>g$+qzEijAqJROzcU-Y>EVM#sdl>;EbGNG!w@Q={;H{6@;zL z{J%?S6W(-s3;q@#d!NA(C{E}VJt5^za;bE6r)h zuLv(W_Zkx;`OL}aA1>Cy*;Zt94Dh>>!RYcTbv?DV&ej+)%$+wMVpFS_1%-+4AuahI zr`%}&-B{^WTgCVA5mBsDo28w{qUdr#XnQV7EO4HJrs*brAUU^mBL2nY`}Y)iF!=`{O;KKgkG!jR3hPf_+U?h?zwy9hJ+zm`YGQ>pQ6%EL}Fs8p5*Y*e;!!TQ7%Qy zlwE2W;JX-QL|5T(7s*H>*sZG9EOk~w(t+R5Jl^Eur?ioB16%34{QWFR9Z{JH_IW)^ zS3e6gMcBZP*&WX8`2t zq?tmws&`9I(=~q#uxMXdJ;yCUQaCW8Ial;pc=18P!yTi($(7Whfn4|GiWYi3I`dP8 zFK>^&z%<(XBrilZe_oagvlO4o9eDj3x}~i_w)8RFkh$IA#piMxV-<~gdQvu}*Qm{r z)K;@BtNX2=jWLdMJ(N#>N4?kIu@cBCyyUaA@JpP}-Pqggnrg{Tt1tQ1a_efhd988& ztT-zA4%Dpt(M=x^r4D2yYal`lpBxU$jmfYmj`bd`BkfQ->tif4%ob| zQ1m?O>zYH$wnK}{FN}L7TH!)N>jM{()8f{b1R3-fU)y0c1X2|y=MvXm>^L$gJYjir zaWHdaWhkIE(O>Bi^CchU#ntl2Etw_Vl9>2OxgTi$2QE=oX0ZZ2o(AJBD^_dmsS7hB zKAN<98d>rfX<9`kzuOJ>c@Ea6OT(&|$9xT#w~N!n2F`L6njBm{Z*WKBN@?$f_$>4D z2Hc#4Jt_qgm>K`Zu&vYc585ABqMl}Gpt(1=cOO{wcub(X=(=S+GnQ6DGekZ#C9k^6 zO$@p(C{L}FDC+W^Fr?i3`uhUAcKh@Xl`LYHzw;yR;yaU2%f)h ze}5`2yM59!^JN^HL!FRwVcB1c5$3;aEPu+VBa^)@to^-Uo+HbeYZZGp zB4DEFQDknG9&6mi_%X+arpt5@l~ceGy-dX%&%tK|#gB=Uwnp*9dk@@#-iAUl+e9hg zVVV1lTGtNI<NI@%%X8qE#XsWue+mAj?- z?Q;EYGR(1>8>$~?O?p~(XKUNqO{uum)YH%8{H8S4miY0VFUrTKr`@zW9(KI8&ndP> z&v|ccfdQj1E)>0xzCs$2rN)rgr&q(CrxMhw8g*?fB!&Is%Y{uv`&U~FvUl;zPycQwBl+aWCiTb&jVbw9&KUQ>%eAZB$$akx_38}Po7n3Qf zN*KLLkD>0^b1WCWY;_s07e#Rj-}b!|qi@ygJ!W>zI_suSF4i|b%XYqei?7Q#650No z@mv{gv{NFhK%*nR1$DV9srd3e8iE0$X*ofQX#N4sd-6HIf7m{2{19;W1AFiC&Zn9i z)poq5^Rs)Z=S{MxmOB3P;>8ZG^86vASJ8LO>Z2>nzN$Pn zn`cXHS@xx&0CB>nER+GHFdl`dWI%l&91q@uKB;MN2Vf^iQFPDGy-VmB$P7hTa?`cRl z80b+T)BoK&Gnwo9$hFX?CAqLh%dnqn$+VZn^Fnffi@Q(3uBu7krG$vyo9MwZr@r>o zD_a-T-!`U-)hI5%l$i0cDV({*d6q`ZC5?iK+WTjC@PPA5WV^(9a@Lu>MI+}G5AL`> zPwP~-J&iH-o=xUDzWns;wrWo=1(h>Oofc|&rAphpYpsO2 zwr9=dTP}k#jWj$wC+_hvP&p@^gyf!GU3FpVQ?Tq}Nvinkzik>yGZ`2+cQc`n7Amyj zQI-ykG@CqqJ%>c9RNPSdQDk?M_yRtuiTynMvscUp^IKoPo}7s3)z#<*oBqBR8Y4C3 zvBB`kyGma2mLGs3Ra-8!)Q4neosH#RrQq@()T$?jyk3+h>O8lc9DBClqN}m6u5-KP zo!T%HcYmARYb$+y65ns=%f|PfO!Y>-YkWpIf8u699TR2zgOWcy@eX-6{JXEK6{k+2 zwJI?uRHZz9Z>usT{r$bE3B~)UQvm(S2NI z++$_gknXRYh%UK=Ocg4Kad!@Qqj@P)O1KmG;sQGLPAmlb12mwiJyL6<{Z5J`T3*EC=`J(k<9sq^zKtehMrAk7L#^0 zLHGgjK31HA7d~D(x#rekuZWRulid(k?#d9y+xk9`g|HvXMpW_rIG||o;Hz{F*Ct~B z(EbJ!@Azq_N`}Du)j7B6Yecc-Nv>M5@vd4!*$B=!apk!XKI_hd{>g|Uq}5-0>vBg@cK!LIj)|@_Des?(+uRuE=GM}GPq$?lW|=; z9;sLxSmGcx`AQ>RgtyCJ#$dE9*k+WGI44IgGLr4oq1_;f<*;b1L6lqHYwSniPnm z{=t5uBhi)o?FrJ_TU_`CMcD?`#s1OrKb+h9Sc5#HKcBckA;W~KnSDg~Ui~)NWAkwh zx?53xZbaKA+lD?Wi$=Wu`C|+7ah+4BArFRY0?!Oqufm1F1@@Xoq}LQHV3#%qet z4#bVl88tVITQ*0%a|9DOwCcQtugJuZOAwg$P`$UzjV32uAn_n5G3_a_W!C9e49}VN(KiQV$l=V_eU**D|4>c8-;&Y9bE+!dq zUW^+FwD#0(BDW6Gu!~RXvrK)?PW^r8ORoIX%;{HI=QdMIiip3rqCGw6bM)QryHqL3 zV{BQ*NO@BzmX-@+6&w0)aYoIW7_h`7yf$U83#vw0q6l`%{m!wV7IFEhsLbckbx1I|->=Lx?-Aji2^ zwD*6HZT$^bj4tNO>u?f^?1YJ#79QJv{)+e5DwWNP{_)r++Yyi454~0?fVmmX?s&sG zD@CgPK3-APMMF}GpA+BRPUMYN*%ZxH7OghpQ%b(O_!yz#7p_=4dxo8cR)|=(dY;Vdo@7y z^f%S^rb^{$>)j=~is-!6UF-#g7XO?G!Q=~CF3p%uf2^uEysa^nh56I#LM$46I+K74 z`K-M`xw78qajyhkT|M*+B~&5x)L&Uta)x)80nb}Ds*0y2@FPN9%!*mbUj$EkuT;!4 z6*ZRr$u_6>&!-`VYvJyf*=?FWjgN{(vw7V}j!oQBp-7EMB)(eaxo7#BoZYsbGZW($ zy5Uymk2l-WPxbxnKyXZ#50O<(L}>nx@gJU}QdGWQhDm%qZsv0M=5I|@ejffqrfVPK zfB%u2l6N8MdxEel27Mvo-Mc`8nR|#ve)h-j%M5-9d>y?Z7bBEk?eVJT z&BVb9yEW1@?ptN1qI~bm)uA`>t4}3rFmgU#Vt6z0L#x7Vz7;jo%^7DdK)1K@G}ab< zg)A|*jV_TC4aV;%D!}y%Ex#&P)#nBtOI$FoR@x#LZ2jS`wTlmvW1#d>i<-KThjiJl z#<}RdDa)^>0lBFmukFoK!w1rt(nOz~TnN!=v3XhWZj9d-R{tf{nPXAsRVJQu0pn#H znj=%2@Mf*QU^InfE#t|bc#6!=bhej&Yb^7r#Ykx-@wLu%$T7wUM~vsZ_!Qn5@%hTi zqFU`a#&v(yjEYNjH+weZ)`Vi_DST@=zhBI2_f|xk8s_o$c1+{FjEq0Ye!l5ttIwBv zv{p{PLlWDYC*~zPUSIyaG!n?hVa;KKVfh}|QTNEX*Nx-nbng764$o76QdP}7zLZHS zTDj$A3*Gd8_hyT?T7DEE`;BW)!|7(F)A!Vylixf)=jwhb&rr>VSq~)RyX(|<26Db^ zbneM86ciwoa?cfQ-XYQG^{QptycJCFh&TIN%699o)f0u3VVbPp`=HNKC3Z_jH5iP0 zpFzdLdW)p`SDHqy44#6Cb)CIuZ4|5R?r_6o&2>tyv||Y(&hOAcdy$`1su^WT8g5zC z7Rw<5OmnRNCQV1ZI$3eMd$DTn>RIb{R4d5dX=1f%@$ z%4XCIzx!7|^HC4=h91AUffer7v!!Hw2Td-P**?cXr|W*{L$ zygnDNeCeqG&1dOKdF%PoA9KGrng%yC-YEE z+$Z_`^ITS4HA~mrT>H>$cEZMm_iyU*KG$a%9*&^+WRt2=?$CE|MMBqf>9Z}zH^0Sw zo1#_bC;i^}X+0rh&tD?_ul-!p3G)ABIAls-;RMUh-N|Zq-VFRjp)giS|8c|WWS@ey z@&3on-^-R{!afReUJap*weP4mHox{`hW{9O38%>1+DaIUsb=}Uld8&VY9o_iHNM|u zd9W~aqFU~En0M&bt1{QqZC>xvdcJk?NYxFPPR5ol1&D;zA%l{FKUYRiFP2`l>U6|s z{&|-zXmdCuYCD~T(8lx9q=)1@eQi(Kg#=|gX%kB!!hU?3vh2A1F&eEat?VKzWf)II z-tQX&-yhBg5S!kRnKspP%6wC4d+}n(Yc=)yNqIH_n*oVUH)wFqr2f5LznjxZ8zcTe z2lWf&qx{@^YvYX}1=d2ZK6>XWw4WYKGsFLVeBzvdk_+ zk|8%TmfJk}zbI}=l_vjaDenLD(z3-v2Sw8yb=D}oCREj>XIEWx{*A*{6JNF^mrz6+ zLrO5swev3rmnPp=XYP`@_-fo*dLk1yc7jzi_^b8nZ$kx^;qy)>**Z3m@02r?tY2Z; zg!6UDJ@`qwhmxL-#V&h9czczc?kG@H5%u}yYdQb5O5viOqF3RZ)*bSiueujQ>XX=X zgKu{_^uMOuo-*6~Dqv+9o02j4gKEqwcEBWE@FDuVZTmGLg=BW$L?^{_iwzxLb{O5~ z!-(1zsDc~`4E0}9Je9xA(7u)K<#E5$QmCg;sA;68vz|Tg!2Pd=b=akdulI7K`qna9 zq*VAkLdtudQ)(ue{QXN^^d@KuKI?###fZs>OaJF9t4qUoSSx8mvx{bD@Nz7+IN2FL z^(->q@WvY^|4xuPpi}H?*WA8E{G0nv#rLj?(v;WA(Hz~WfiF8>+MmA*C4b%?r-_jc zp*Oe9L{(9Hjc10*AheBA5qd=GaU7+8lw(oSJg3I~ZmiEJQ7C1HVPuT)QhiG1Ofz@r z<69nFAa6H{-pC%uh|8a?`#ZP(i-kFCw}0;2!uVhD+OYj!!)t6_K>Geh_rlIiRNKUN z+1gjx#?h^N>1B9Xq^xG4ZGQ_s5JGVS=r0l)1@AehmnA>?i+=J!k!ha0VR!DQ=v|9u z;+x?&wQofeKH^cc`-ZtH{8J{GnE7I&L@#S9@dujpPhZqc4O4g=*bVHRp7S~>I4=&? zej+OPD_g5@^;CF~rnH&S zUVS3XSB#SN_66B4iFh6N*T3}~P5RQ#Yg(R*W0-a_K`lz;TI{csV^05mNRRhE$hiOU zqrkEnH*HR%`}rZ&C%(G8w>(|RPFQ|&MCd{O$=By8-^MWVoH(yhP3-;YcE>1zMmD!d zix0J)7*npL=ob@aZt|L>pPKpEY=&-DsU>dPU(fa{Uy`&{D=mGi>PdU$_OiyWGy$`P z0)-q`p9RZ=x_$!-p|Z_y7}v(;qVcSQ>$@v-ArB5dsyq!l?Lgo{MP)nH081~QrP`}+ zjbJnI>Ef&Vd*y+m;9%ou<;<5?O8aXwY+<2)mn!RfZs4cNPyU=-|7An;DY^M}Z%hoE zp{SGG4Y<+xMqpq-P^g+MHT7R<#Lb(`8opHP%kboe(4A}Kkp-G2?dF&mmNOi|FIw*| zHr_mSnfs4~e6B$+G)GL8o6uQXJ(HRD=hm6Dh~P|bWrK&47Us1=_F5d*N(J_^UZqf= zn>=YL7n?enuRhOdp!jLtJ~OPUIo)Qyfyuqs#%QFi{%a^8^loEHb^GPJ<8(w65s6M8 zg=L?!(vw|G;6`e+D_$5V#pKW_(48`A-pO&-;fyU{yOJ+C{;pR(W$AR#ooG3&X&x#~ zS{`Cu`kK_IPk*EEqlHDu&pS117gOBPFf$-Yi2Jy8%boOIwbzDI1Yf?`SB>XSKTD7{ z(rf04a*}q(imU}(fPZ$|c@`N5BtBQJBIh_$s^!1fEEHQ8EPcYSl_L*xhB~4-SALFk zW#3R?t#>FSJopbHC%MhBg!2;Ztux8YC+}N4bZpq1^}8qN?Q$&xauMMi;`R&f{F6VK zOKhlhueOg%$>(N>q%Nne#M?W%({^O%Tt(kk#>flhnQOMsEMHkK-3l8cf2t|`jOZ3Y z5^Z2axAm}vlvd(5m3u}RBN(Ppgeq~r*U+(y;y1RC%dqj?~|`e3VJ<`6|Co zE_ADFb8&f%loh|@vGJPi(ysvFGBzIk8Pz)xk-2oCZ4&(?>Cq9!NXm)SQEPX*@Ni?U zO4eh&a`AQ_p&y zok(bq5WS2?-xXR%hs67Sce+B_^=U|ZEb0M`xUra>AdlelH3|tz*Yb-eyVb6D3K7hr zXjY=n3*IRqG2_$t?K7s$hk1Czik9~~k)8q5{AUL)dj=~Mhi9WuvxJV>0KH+O{pVVz zG#!(%YwqP{?L42`TJth?6*8Xjd!aqdS6z1oSy?o%ynk(xMOlmVNJt=qovqn^Sjg|+ z4c6Vs8#O7ci2nSuO5gC#@W|%9YkY2Ln@{>*M#yS$vB{+^WqcnnAPmB2SjODj9D4U` z|I^SZqNKB;r+j4H0#XtUBzql-?*(5=S-!?)I_GHd?#*!1mhU@*Q)4={RD-3auGgex zu4G1SFXsKC87Mx}QwC|mlD z@cvtJ3}PHyP>p@+kdG#NGNyA^Cg^?dvw-bF$_tlojt=Bjk9-WP5dMgkKid~F9gzNV zVbn;EEpX5@`PB zgvgfF>M6H5J9Emqw)8K$Z)D?C|9H#X=UpEZZ+Y(wNk1N?iBZ%$YJpau3s$v)lN!_??r;;5^>8MPu(+X{%js ze^{Hd%?CDW?#22dIsD{=(=Gg$T~n0CTNQu2qn}MPuW1z>)fZ9h^U0y+Bc{4KBrKI1 z5f#q6Z}TkOwy)fdO!JWl8l$KqA$R@#GHsEvVp5H=w%odP-u&mU0%!8yipIZxG;%J~ zog;6e^98e{xO3sHhgGrN8=5jqCPthFFNK>nxI->w(s|uu*Lyg;%R=F;%-Q@_^0&9i zq8k&PO8cf<08d!d6|WzWK;p-4s2luH~akMq^_*RuSw7MRcb z)x2_fopw*lW{j1-+oyP8c9U|WWO!-b`KqgMfAI3PSyIyz@mdm7>3hf%ljk!;816IO z$sCD_g3IKj!o*e|+sqFCtggU(uq3OvakBVPm{6^)@Ef#n&2`-cKS;E4qnJZmT~|)< z{MJvscdOgE5>=bTyH=xL`dqSC(}p0e*I{bY!wJ@TBO;&IN-JywPR?yR#@w5~VHWC< zR~po^U4N^LTyeBTYstf5IF~x&<;<78TJ?7#9T^Y19q%yQs!w0LH*+H(1=C*h<45hE zRe`?Vn$AKm&jbnwE^CPq(vnkVsky~8B$NX)$`(lkqD;0~RumZ`zaN-6kmS2Q%6J(# zo|;%Lvn%_^jgHI4y-#gK9}*#E`_;F8hDWiprfh7s;#84B*PyR&ZVcXQ(X;0six9h1 zlg(Do>vz8ng-!&oyzq-X74!i!+HRuQz2f)#y9*obyYknWe47>SY#yf!WT(7CgDQe| z26Uum;3Tn)KSdPvfu4#iV-obSb|S=HbyQ2G^H!lBzE?*YvP8|i%@c#p8IEA)DQ1Ew zE4r(HI#Tfc$ouOPo+zbXzo1eU)p%!exZw0F^Pn`NKWQGsZD#M+H%X+;Fb$Ke7VP!R zVV^z2P7W&!$_=`=R#LZ*CFuBe?bC5@y?XU7{7<|8mOxDyUv$u}`o9S@}_Xt;$L6O>L@YO}>htlMPg$<4OafWf;1$BKY1WIXk^$?GVG%4CS)R-Vv_7) zl9gAzkrxs0t|w9mwsl96!*wo53PNlzxW@%4QOWF!d=&_1FC(epZ@-XlV3SlNJ8a~K zq=KF2ktgAr-$+V0;5SkPc9}=g!xRfhc^q{y2gr(@N2=4YOGu!xGlEaaqfaTgZ5~+! zJ1&56#_LErnC~Hy0&e+@+5{Ej%PZp7(hm)N`qi{;=vP+=Fv819RnUklZ zm%S^Q1RCamkCZ|H8UfMa1MOcfAO+!ucq9?41X}cX@FfYf7)}SY1oqP!j$T40f>F>i z@*KdFK$W)@K$YHQq~GDh_-Hh&w}NDbm6wnlhvG#4EAGf7wDghKL&dHCrJW><7(faU zNJxsoK1)al&R@a$ZUrfM0@xxc4)?DjMR5*ITLBJLTm=rTS^@U_e|48U(p~aM_g$=s zG^I!yMhTpMfOC#qEqUlKYglRZ(7diyBn#}fe(WVloT-6pV6L4NU>I0mT58E7TOka7qaoYw8wt`cjYtI-SW0!baZ6n?jkG(t$jTN^-;!=Tt&N2fZx<;E z_wN9;H2?hLWtqeIVar{x4Gy>9+%AZqslT{&q{gk{=pSJ7YB)B=WTXyPi%J6ZuK<*R zCw-3w&>Z^z&?_>Browmr0KeiQP3CZsa0@1L6bdqjjM*uUhlDQ=QB^fP>b1ho*&@^_m=;6{^!}VZgZf;4yXCo5r-E0=Kuyqi5*%` zCW13+B^4O;l>nG*n1m!oqQ(9>70_ab^T5o6M>-Oq#Za&zA;b);5C8{b&jH|;W0Ni& z4P_Vo_slTIPoyxI^FNN{m_yRx1Eo+{8?k#7LW5NIpPT_&u|DHMiyazwr0wxssDEuA zv^WfWB}^%H7!Ai}iQd3XfnAEz{|Et&7e92)zv4?AMinE4fQtW~2u74($BQ4P1}?Pt zky8#`_Ky-0|B+(+7%4>dj}%>4f(AMZdj}#}|Nm@2|7ZAK>!4v& zH99t!V!x|X41ou1Q1XHW~YMKRE}62SOiw#c8UZJ-2qs1WY&MN8F+ux55T5ytQREU z$3Pkr&R7YVBdPxY1ZjAH3gW>W4zm6yOeL}1u;3gV+edD~rBjejj(A*_1pLvCM&TgG z|I*FTYT?oiaPLt++))nrqm$zB#Ko9^qu@xeI8Md?9Ti7{|2Zm-1mpHSSf8W*N7V^h z;z%%V2e6}$DhBjX#qd8Hu?k^rl$RHQJ*XiTlOynr0%LG(3-LRtveQU~I#6rh825HNu*Xi~0%sNj5h=qk)= z09d(`&>p^&IQ-WLh%#q@RADV6Fra|}Qb6EKq2a%b5C--(1+Q|LATxYe)*K8HQl+DT z#aN*wxZeWet2}oK+C;!#EkP$2Hi(q~POt`K0Vl)`3QSu-uAhO_@!{*20cpn#)eyk$ zSAY~NG(8n;%nx0L$DKjT5I@9E2-95!q@W0dA%H(#g(%<%~Fz2-w>l;)6qKAnM8sl29N%Jmmpo8W=;!%8(3*8Xx}U1yoa!gRUXqhrXa`R37q% zX|93s{t8eiKCB-AUIK5>!h-i9CwL?fh|6N2r-s{2#mH+fy5ASOfcwJstU!z z!Xbe2M$ps1zG{#uED#2SEu}&P2)H#2bg#Y-nc%|);XrNoI(pX1_H^h50wD^oOw;jH zR%=4p`0$xH&@WO43P-?~;{hq43oYZrdkJ9fV0k(!xG58|gA48ec1)U%y7HF+WQBnB zlL7B#1XaLufT{#Ga^S;fQvf;t7C7^`ig*8(*U_=3Ejbm z@7{;_E8|~5n)on9I_S%32bm(^$LXL$)@7)h5LU?mGuU*}Q&&E_0?8rZgiO#x>;h3B zV2&)%B!3l3A&^8#!@XC5eoc=-tEDS+5+6={23kRM(N^ZWLsAGBl?$52tDs2)eETIJ zLu;UDe3&U8;)UhM!P0#7#frCk1)8L!PBH;OQhzB+egRa5K6%aoLCH3!bBCU-(J>Rp_)UMG7 z>rv4@7`UNL!so->9;0X`#Wv9}q>+zm`aV%#B&x%|foC6+etF=9lYf2zsj|}EV^@k# z%&!#gyzdscDR8|dB{52pf8^DT3!&2_La$5}ZX^D5R1nbOhlklaw@mO@u&#SIpMA1q zgLx)Z5!L*n0KVBLH4|2>#S%`-r{bXNvNKdwnWOc%%>De;^2VE2{rTpVTKd1!Y+E_= z-DZ}!Q)oQPGR#4ns6#VT#^th6FPBBvZyqX@MN)B}opD+Z*%*KAXW3%UfYLVgyaQKS z+}nhF22xJBvlF~=6K@F{E5(zYX$N#^-0tg!-{!LKKI5(3a1nV|OD9WD$~Z;q3#Zet z`WMbC0-NH+KWJlR;@5v)4={Wr)?(P&C|~o^bL<)A+WJqbmNBM;kBFK^jq_IZicSy6 zVU-$Cb}&^z zBTVKD>Krug#sD;cbb`jEFf0QOT-+T4mI3ogNwQ-OYa(ZmX3)6QhHV1V<7#~@15RJ5 z}ZViVJ-ko zAcLW$57Pmb0V+rzdjRA#wDhqGpi)5NFbB39m=$*mfMvj}I23|qz^u4zjAg*A$5pno z7?>4T9AjHBz>T9a#xmmUlDI-0%SZs`cpU)lmJ~hq z0;m!sarHa4n-pM-4UI5rgQuNph0Ix~nPy!GKva#fG zLF)`~u_O*RU|WD}T&;>_fM^_&z%oEI4o+YhRltCSz+g*aX9+dH9jhRr0hoVO&;-n} z3Lxi89^a2T1Dq&{Lmxl@Kmn3CD1&8ye~v3zXOQ(JkBeSskoYBWNCn#ss4aHxI2b_w zm&Ab=Y!lG?xFmE&166Tw2HOHOJuWt#(dz7y$0a4m|Akc$3Y+zP;D&1GF#nxIz-Bez zQ1$u?&g}Gf$Pr}sI=~<2!vK8vZ#_6K_3wf9={t}c0#0cF?GKzllDU}-U4fIDfF$Hy zhzmLg$pK_!8hp622lV`3np^w?WSq-_x`A$=L5tF3 z=q4;Z2B-xz9W~~>nQrL_JH?0}nKd4KkiE8jo8v?9nmY%NP~gFH zK4lAv#AP+Lw96?*joBQ=aBOTA{pB5=+&cu)<~={Wsjs{X+3!1N--=K7ibjr&P^Z9( zbg`HDIlf|4EHjO6L@DA#*r3_|OPs^p(9+>Oo*LIyHphDQr#Pha_%KW{#`P-8P# z+t}TCgK6Xp>S4O&Y1^+|OclN_qWBhjIGIiP1kT9hl3uL4rM>r-s=PV=p*M9?+m`{s zSEgmeVqbO|0!~-Z3S4hr8tb&XZN1Ll=WKg|^F&$*lU{{%zj^I*Lw+j-ttI4AX<;(& zC|@JRZ*A7dtEVu~LXLI*u+RX^X>P}#ORH(ryAeRmCwHDnrC_%T|3?d-b^?c&jj)>y z@#j<0#Y&q`rxQJ5D#n-|G*sLq5i{cKQkZyidEsjgkHLe)44M8sJ6{!PJ-(_|GRCWe zzM0QQe#UF;pq<=p1!)roeFQ!R>c7pHCN#d$E%=yMt|~?bv+(I&&v}E6YKo>8t!bD1 z@)f=$7k9Fk*)b~?wj&>8RZCPYE|g=K>K-(&vK6Xo~s<<&AgbRf1J^s z+h^vj(K06~-27<1rO?g@tqag9Xm4$E4rX7NcN`973gr_qSw>Yo+27I#syE--RtURY zubsMZ3JbOUV4`t|8m7Gl@f@KXx^WOLZ=OM+1aSNWAT4ttas2yJAY8a#10ebSC1eg; zOatsCr~{zvYfgx&(kLIIMZkm8pm*FWNDKe|PlylRc?~7Ph4bLu>p}=3fN2+ih{tUJ z6>pXR{M@_*TJDxY6$sdV1+;jTL&5MKpem7XAQ1$dwF=0q6;KfZ)>;GYU{3_Vy?{D` zJtiCA=52sn;eZ3s^BB;yAksGJcq=QLAS--0 zi-3+72YS*@(DC6Q`*JgY?CK<-Peco3j)14gKp&c?z;enquxo3m0Sl~%fGuh103>gR zA`tL5B!d;HOAVw z#`C=>#mELd>phO-Q^OiWD&cIT6HlnWb`wh@7fAA)RLqI~hH|v)M^JILK}*`KS4SmZ zn^VokWNO4v5xscP>=b4Z;r-tDYRYL9{>ch{b<{@mr)rOCe;?^LK@UhB@YW%%H_|mt zg{fCxgUM+-z*-; z)|p3nQ}{Di(w2Q_UdQ(+(&7@-kuL7M1$|u|w>`;JsWK9*Ymw$-r<0W>ec2zm>M*%x z+LiIR#Gj#l#6$0*kDU`lk2J8jG1-vMd++C?;{4?X8T=Rh8>xP$!@Ep-L{9UbB}l$7 zT%NZCZxJb3(^9(`*LdHWxVfc#HRN^#)j<4PT76Ew*~p}0!>kORKJRojOgc8cT7j#3BN z99MN?+tfii$5q~k9PksUzK_wNI>_j_68x|cxD8i^A9BELhZh=HAc0Z`Zo?Jiha9j% z@;Jkz)PdLjfx9Sm;I)4MFG?L4_z&bosRIMCpcjWuQ0l@u)?8D8o;LiL0}DF)BiBA z2C(UWAXo#~ghRoK;0J!hM0W&83|Yas5+h0nVecWh;Ehw@7y|VmHAde=H>H`KWF$Dg zF8qE7p@Lyf&e&A6OvD@)C^2!5&g^m954Cwc z9N?+z9bea}$?W<}Uwty2`hyv>SifZu*YiR`zpGWqc8l!%TU}i$x9<+-4TP}IxBVs` zqE8RD&7`-wahWw;i?|HKse9fk?#;s7#k|M`;dWL0)5ylOo4@z9o*N36X%0Q5-+xa0 zqnE>>R)+UYMkd+28?QR<*bJ4o8yB{0El(Rr?^S_)d?K5pd&IO~!TV%pH}@ii`E705 z@ABKx>nLRsC-sEv!Tb7kB+;h?RrGyE>}`ch4a?X9oHuKL~_=_Sz+8qP+b9Mx3OhgOxeJ9RVnj4Zv*$CphyJ z#vz)@_Y>e221av%Q=E4S5=G$4h+;2fPQd}wkUiXT7Q9D%hyEg93=eQS_CCene3uGY zgD44MLru{DHQ|UEGn?5t>dn9X_5>*-=9y`~scy+JzhTMCanWqmXn#H5AmC4(ZqM>r zeJ*+CVsn+fNF)56BwVW8kxG`g1*Jxc4i?u+gHHpT(Rkb*kcz(7|MaYpW z^hIsc_!Cy`QrBl^$WmOtMkszXeDX~AVA0=mJYZ;+P~{_sAx>+A7?>q~1%PHZaXNnZ z>?#xpQ%KP9VZ@~V^GnO;O?2<5aZn8V#ao5*JQ8`7`_1KK<{vLD(pqyTCspKc>C^X! z{0lTr{nD#WH6v2!m1WpQzP|M>R#frz_ra`?5W?eG;;>y!d7y^OHvyt!eir?d2WYQhWNi2D+V zvtvH*{5(AJxtys}EABl?bPBuf@aRKB|L*TMLFMC{Uk(u3u0hOjuQAxu&1m4mLu~YQ z74n5oNQ21qS_3zB)R|!GW>_ms)0%L!N(gmxnDGb{(2C*&uqNrl)+~q z^;J`5XPD)Z4gX3{Q$-OrI+1fEqZl*8IQy5+ zg9L2qPTSKNGO6@0Q~$E?#lKneLT9F?t2*PUqI64m59f(}W#--ca1GmYX5RspYqwYI z-VZ=rMQ<6aZ(GP~JtQnL>DRmH@CXyi^GRrZ^vvTw1N0^L=7s%|^dp^8S?Ua3no~UQ zP2|?3JGuZxB=2#}3odK5>+!KL70@-_wLl$FaCvfp-rV`q;C? zl$LxFP0>wM?!K%B@-#89sG|ZQ#;3(%ft{SjISKl}_=>jE_e4#db3?$|IyI3y((QZG zB6Y!s=n+K(oOwscvyZ6c%-s2VzAp^y`%BpKpFJw`nl59s?V1%p+L`;uF35+^y%7i+ ztIqeZ$q(~L`0!f(a*3%Ibsi%9l2Y z>m|J9a85Cm2TlQ(K>u-ysY>Y&kT+&PL|u?%pSUqr^m4EZlomY=bo?K<7p!`Ls z=lY3}FwJ0Oj`%`!x5lh(bIbl2PW;FwMGj5_j|QbHSMITwVTjN_RL05ecO%kC(X@)% zmtVA~k^IhNZtA}jZA=h_w{dS!?#VF5f=^>ExI0--I*zaDq+x({_L5VJ0Ao%Z5$ftP z<+m}&HQm4W<(K^S)AN%#O||0MC5eBkjG{!J2JQV84&a}8@nJX3o_RX9^p5b(^;=I? zw0+cOl;4=|^q#*S5rfD6to-uncI&cunm-TOTT|@o=}%p3)sb8DbjqS&PVqNO_Qyou zHYrr;cJsYr;$EpV^7`o#JuUr5#(JaKpG9B8du-qISA9&r=h8UvMaeE(Yh+l}t}UYe z(TUix{^79M4weJoIo5rWM>bUcL97Sw4s7^+erG+QeARcpvP;wBCWdH^#5GFjRoFLiTkhUSY`?Q)pjeKi-6)er0o#Au45v&@?XrJB*B9-Vh;l9P)(E{|@0oCv-( za?g^1Hi%5VDm_(Trd*l;`qkYR*cN-m*}{b#KqX0#ZWI+k6a_?O0?Z61 z6hskoz^s^aRxqGrz`$n$MGGS)3>Z-nbIuAXW(CEZ1EQGqf2)V-VY>G7U!99{aoo@5 z>#C{lN~>1AE7YokQ=@fby(3cw_uMxmD>igk8S;2U^OR=elS`j@{a@<+zQb~@*R^X} z=|IKFANq}35f%D!{PbB@t!@Op%&G4cb8zG45kGc}Y#%Ww<@?dNPB-HJ-R)3$OWOIn zI}ZCKXRnCc8N6-Bf_k+M9dPS?&Oh$LhI2RPtxc;lad`aGZ;hLG3>#OtIi=uIT7!e# z0~$Vzj@Wk7s&$vgC%6ZBBR+caj%^#?bt}DOyiI<3Kk{ea@A>im8J9|J3LpA6?bX%E zQ_^=8-kVxtdaZfu^`kj91fx0qkJDH3u?hC^04+?##&~)CJBID)R>d|4TTuy8VZo{z zTRS*6{Pt**h2`<&?Y5nRx82GPzB1_Mmhp2J%%1Wmu3U%hZGRP*ZBh;CRmWlDc(=O) zk1St){gAT4+$Uv}D|Z|o^ziwP9fwE%$~SX7`m}TD`>P7~53kf=^ovS6&c_!%^*>!x zH=)_`tnzm*Ze3Nc>!Pi%pLK8Lw0Bi@jP;{!`x|85$jKh{Fz8KO^ez5nlR}%PN1xOz z?2+d4JfMF>X#B*LWhZ`Ke!E=spBn!rKAjx1Q0KUN#N7KYd@jdyv%9)pkymNM+|@Hv zn{RI>ueG4ct)x$v{WHhdrC(iVR0_W9Q&`Rn@gHjGzxX*wczU!dFaKUrn&xIpHe4B3A*DjfE$`(I6NkChTEPG6agB>;=kUpDo%xQj8}EZ>#R9!0&6Y%4hwkx50aN`TYEoyuSCuH5T3W%uldO zz14Prw>op%x!&y;IHe6M|DsD7SLa*N>D_I&y44=j&)=@;mYjr2r|f)ICsw+#u-+0~ z&E5kh+eIxf8@zH{)tX)sMA^n3!5-dqiW4p)voiZrL-;ac0X_ zvu9?lA2Td3((UZIfelW4@DIw{8}(h=J8yS|MxVmY3=BAVc&2t=d_h9~%MQU8hP+GY zu;x|r(Gt^hvT}K|dvDVVZTrnneX)1GdvJ0^o5kS|q6Us{pjy!@XYxI_++BA*-r04h zR}Yu*<@D4&vMFb)Y0-bgz;T1%GHax4jo_40OXV(yu|Wd?TnR;UKe@Fb2corHMXs&q zU5Hy4m|F5*rwB9ZC{QH;N+&lNH&sYAa)T!A!+-o$n04XM)*s@=v69>@Gm_K>=sfp4 z(ETt=Zaj>UH2wQ2(7KHcx66X`XiL%jIGABS?FW$AJOCEBk`7!48F|{4^U0X$$hDP` z8SMeF|CZ$zn5z~3)Jo_|wmEUZ#5)2lD#vlZWn^?`Jl1pOhRcY17d-Bt#b?XN(XM#R zbm69(k@#+SjIP8@fzh!i9$hPQRm{mj`Z%x(2Se=mUR+JGb`s={8y;M587bWxjJroQ z?le*K!Bdzg7elV&DdU4D7Y_q*Uu0$#at=Be184d<9QjoRkm$<)TT)V_QtzTun%Wd4t?)`*WeD9AtOAZ{?x>xOq z=^on;wY;ITw~eg-JY?wo#!Wl_?b>?e*Aj^(?;RR;a?(@s)pOV1^1UuwbeP@!%!n0f zvnHli9F_ilx>uHe$CrDnM?TPv4C~PS@QcGyA#sh{pPe}7T1Z&sr;VMKUUC?C{b`o- z? z#V7fKO)G1e)o9sqSxDZNxJwF)^{*p5rcLSBc292ZKZlj)67ue^**juH*7UEvGkPD> zbm{x};NQWk+RS=c?m_$2B%uH#aIGI#CIgniy0S90nPMPlECFHd^;at%qnU!eC?U(VhIRvVbk)bx*r{?X!( zAN@ZGi^X!7_lxtQrq1f*?k~=Rbg0FR)rs~%s9i*JAhb%NF%bG6(H02hk7x>nnJYjv z1;We~AesVUObjrZ0-^XZngUUY(G-YUv^s+!4r7Atu}BGoegqgzff!HG6o`HWh^9dF zFF-T}!m_9qO@Xj1szp zDG-`ZwP*^2;!`b}0-^U*i>5%RJ=LNq5L!>Q!4#+)2s5MFXbVKG24~xWP;07%J5fFc3j03+Yu~# zF7N~zi9)qC+#IrK6n@Xu&`lv{G&12jVxKWRkjs|Ahm!iuP=j8*+Iv@-+%?z-s6~5*l&iNXi5x;hOZ1L`}j|hhT0zag4#!yi8b0{sp5*#1y=| zGKA|WBPVotEFa2sl94OZP-xhA>?@m^a+73a;&l83{Z?JU@2-kBS1V&rbFL|M$J28* zc;ivuhYX(<+$b}hTGYE^-i%sz%(YSJj=47YmQrs8wNc|v-!ZIO5U$#&Z^y(N)$N#g zqqZFrZ&bGHF!M%bJ0{+!YX`v^+%}36>q^>Ka70ZjnA(c z$>o!|X(&kbw>oU5M&LPNRsDr>J6HkDqmRyT8|B_L!1ZX2M%PdN`PWr7_{eI@vVpf( zjJnpge65q0To*10C_gG@``*(yWx1*2n9=s@_XSM7doZls`ZH_FSx_zvQ-{9Jl2mA2z!!TZLMq<*DDY)EW70;ECJemfCt(4&!&CQXS zY5eqtD1Jn4X<8G3? z!x*TYkGWZ7%rP_r49A}Ao{mYgI*uP&&fu<)^?1rC^PF2EBfU;=UKxL4Iq1bdokXtd zE3TW2R632^wXeCAGIAJ?1TC@8*c`_#hm*w_lo~vbbCHqn^l{sKu9O)`Jd1DNU&wtR z_0A#lp`|nQau@JOxtRkQl)#N9*UqDzO|6|{Nzw&8?f%LY5{paty1;*PmvBRf`ZD+b z?;1BXU~6oA*~1AjuY$*amf3CZv9Utc7IuGsS&wSJwe+PidRIv)a+KZo%yZma1z}3qsx}c8j```e)k# z-%?de8m9vd09*mKqHeRiX# zK8xkM%)NZK?~Vq)$8=hL^YX?ych?oVF08CM8!)+5=ZH~}UHEC?9$!x^H^01LP}|X` zK4+UJv>VX#Ui<%=P5hkrWR`i&| zXn~}gk7$4d98w#+@O0E6PA$6O!68m9!fpy%MchrnsR+F3_9Y^3U?{Z+y(u;op*QUE zY7u(VT~37F6pjkeTL5_!kBZov;!)8JkK$1gdQ&(mLT@EnDnf6-0ksIdDK-_MHxPhE zgx){^8WDP9pVjy&47PJX0F8*ffdDij^afJZh|n8IRU<-gAXSYBz2Oh15urDLsz!v~ z*uym<^ag~`h|n7lLZ=b2H!y_8fV~F-Luf?k4Gf_Xp*JvuMugtL5E>DB14C#;=nV*= z5urCwt44(0K&=`PdfUM}PNT=(0>bdi0>Xfy&yF~(;rf!7*T5uKt>KQ4nCn<;enUAs z5}(W!V3leJz??6^qP595x)z8Id4jOY(;qY3)^l>Rsu~flQ)P=rkJo8Mh7$l9oapV3 z#o7a)hOD`Py>oI3SAozUC7QmXvUuut{>@nPyfV|Wl%Fd+K2Rs2# zb|5jIFcScj6UmZ%j1F{H(K7PuGu{KByhKt8I4=q)=gY|5FCY{3VJ?--`HD=dBNQfX zf;Uz%n7I2G*A)`U==ShAha;vP2|CX8UFyMmLEgPM<UaJmBGsjmzdIU7qb2l``N=)!|tcx=s7h=;MaJxyx20 zOl^5(U-ZTKihVooTIV2Mo4 z(6&)cWY#rnz3u#TTXy4N?#pU4X>oGXmyf@a?m1rOR#j^ABQ(g%{ptvBlKr;(^i@rD zPyVc5<-YplVJnaLb`2EA2ez8~Y`tA0%QM&076AYxKr{6gnE5;tGn!3ilSMr@falI~VUKRe*u}^Hl z)G^Ke46*D~wr+0E4bKZp$348=_S2gFU8Z(D68m2Ffzz((m{#$2N_g&ob>H&c9D6By zkM0}vkf9maYhG^a@No~r3(6mRZFxOzLN~`ns}~%c)~{srX~j#QI)RsaI_(Sb zZBu2;>szsp+m49OdpMA9TkpZ?#JVq7?iVXV(yBj_sWwPL02@pEZSe#N!;V}&%Z(v*%it>} z@>nZ!+YWh<#~zUg2NZ@pww8=7%X?9Itg(#LapHYQRsp^MdF&7A%;A^F%g`{APCW0O zfqh6OBeR_Gra>ITd7bg)kOpfXPPp>;I>fP0WSI-^{ePDvR-*!1iNTph-d5yosrc1_ ztaL^H^x~IKW%N%kd4;)QPAW%pvt{IgJ970BS6mf5!c`r9s6HNe)Jt5|tKv~FadoeT z3Mx*+;VUX}LAD+}48E~~%(b@;FR*`mGUN$&pG3=%G>TwL6?jn)!Ib{^nqCCE?9ba~ zK=g+3*FFHP)Qe!h=%Zc)v(?}u#YC{mTD+?l!S>Tfy$JR=5Z@L=u!MTZ)Qe!g4UlOR z!R{iN0U_K*M!E&zmr!fxS!8u1Py(c}ujF$mrV{p=;zBi!CJi|aYsA}{f)U`JIK7Vsh{L-2Kj%|Oo>DtUQ@A?jyle>M$n{z9I_C`0{>TLFY!L7|UDZ{J^WmW>7%%4RN~+3VHmwyitejn}=) z9Qx^;-IvGh(km`bSHC>g+oGaZ)pqU5)W4WYvW`Yoz2=*}e?h5=EjsTfsej&n?_Q}* z<)`%ywp}v&-gxVnfu-GN$ivS5@U`mvXIE6S`9pUd3v6vsvl>5tboIE%U$Hi4u39Bm zbDZcpdURsQsAZ#S#d)=I{8-u3(X+KCv-_=&d#AP^-lXx;#Dt|Ax*iL+O1!ctso9~k zvX|=`{^guJS3K+dENnwanT4(9rJKKBma?%A2`v2ariS*!_`HiBCP%10o}4}5&Vg<@ zscEAc9$i^!&!;~nE+npYB`0&CAkcp2(#*Af{w9E@9F@JSNMSJSVGVw8;iN_q=R&R# z_=G>|&zB^+Bpgr@1TctQrOA83ITCj-P_^NQ*5p$X*Nj~L$xRi^0A`8+()kzH%?6-F zum3M5ktJdO7thF0qe77a7BEUw@d59M8a@CcQNaiFZPf2ki-bWX4zR5;>h}~#7<6mE z+8U#J4>-;Fs#JQ@!s4QzBPza$qAC^NL@N;$-$Y3j6rvF&RVuxSk}8!7L`jtj z1)`)%Wdc!Br6PeSse(cpYDG~MB%&2XRR{!H(MkkaPAf{P5Dv6@NmaoA)0^^o{V-|X zjQ3d@&i^LqVc?`VX4{AGE%5Y9#=juVTH(psoPS6Dw#HL2m8^MN%ACV^jTuR9hsTC3 zcpEcvqyt|g!_}IH!Z^C4{&VHX8yh~HL`5Lk)0WR6DVJvk0@Q&)#EtJNBZ`Sg3meR^$#@c!d?%{#L&)kFBxm;IZ<2aC-YY}bi?@@J z0z4APgbo=?tHIE2uGO1m1;H=_)(e~n`*hQ(HW`rw23RJ9wJ^kt&`{B)r)&bE70>r6n}BK+qIp%>Bm_x=woTcj2~q}^ zdu5YQq{NX4MGwIk^{Z4FiXMuRxH1$y6eV$GD0(PL;>u8TP?W@#q3EDeSy%iFdMJwG z%24!B6vdUHXt&YAXHZ&b$@PAao}sfCPS#8ZNXx0iuaJ>yGcn7cHhZ#D&c7rdVnO`J z6nqBgMOAdtmnstCRs1+Pf<24%qx*Up9-DwN6dl&vy^5$Z?;~gbLsF3LkIu&vr299d^#VMZm}t5X%SC9JUvCZwe+PZkFPk>;=!ssH zpPhi0jKHwk5(-3LafoquE)nGgbZ4gZCnpcV59VAWz7XLzRR04xWB@tzG}CFttsJu= zZsizuaVy6#i(5H}!?=}WY{ab`bf6Wtaum^uTRC#I;#Lk`t`#kH;L+N0;#Lk;tkrMj z0=w*;%=08?2TWDerbf0Wqt|Dk@yZO9bZ9a*s*b4}|cA1TB8yB)uP;lcFr-ws+xV0epm^4_GN2S14H+Kq1r z+-uri{H*6*Pt%c^9?Ab8F&W6b-J6F8Q7^)kqk1hP`>IFTm%yv+gr^K}tuGcj5#T6; z=_rdUlky%B;t0G)#5e-)5kZc?dqk8YFdGr&2+T%=IRbkTagM-V0*bK-a1;^h2pmPk zIsywZf*s02jA)0l5F^~7EX06!u-ecGBi^Ab#0YpOCr~S^iOUo;YQ#LDpi({P5h%&; zAU0kaN`xFZgsI2TjrnHe?-AbHOr<8Df}P6gPPoMCMy)yadR)Ro-Gh@3iXKfOss$;I z_;hUCsm~Vmj6Q8r>@QvZ<2?S}_nw;dl?RQ9n>+31gIi5P;)1`7iFOOCFgobVetCS-yP*|t25r}Duue4YB{y>Gwo`QP-|;!*>b~>krY~#!WmH;>ZsGas z!L{!;tv$0epQBthr2T&mpFUN**1>1($=vJXKY5gYqUHFU57#0hqDxSj-QS%bo{I{x`*HTJ-IBa3uHT2(`%(Vz_uu>b zTrYUw((`!wpgmE|pFgvaH|{jhcVLh6-Q(TIEs3q>S~@qoc3;0kZ->m8-@Rg#I`~EO zw3B1@H@!G?+TaN*_k<_Q3U7wDzZhPT8#txo%k>N7sZ-v>#3?^!4ZZ8H_~ENv*M*#T zcW~>Yr5}BdDLa(UeK;;+(b)KNPb>X7JaS6SFh*49|Nm_ zH;6+!9F20fwfH#k?9`wOw>vEUmzX{C@4v45tPA%!MJ>PfJ9fs1X8XoW>%#vxPq8)3 zV%?Ui?JoioJxI&wk@mTL=Dn;BX(1J}&QADV_t3|LZao{AyY1K0&D!JOs?^f{{|+DZWM;2}BFzkAHGv7C>27HKKR9j~Lu*SY)E}2tW z_ZhKvW{W|6FI@;7+HPexU(f0tng?&0SF8Wq=HoAp@Neb)VSV<1^ z#CAjZ+wJafLmqq1A8awZVC{+q(V-c{Tfu9Pzxc z@>%t-H3f==mmFf&e~bIkt9Jip>HkKo-SB&GO`EngbL zufn3!KdYnByCd)PF!zipt*dkUNXXJVlX9!Jnscr5xY3QLTD6INHm1f$t#)Q|Ucs69 zc^kh@aC6!fbo7$)+U$S>inzq>b6iI4Y*FiGt20*HxBXhy@zVTKZ~c;-Z^@p;l(5S> z61sBEvL>I`pXX->_DnsXc$q;ipMUi7>eG(Z$DVj}e)!I7?aM7WqP6LM^Fv#klO1*C zMs7O2v+&ZSh|8zUOI>|4;29zlKkDneH#11(-pxLEPp$1cbY3>qT9)^p3(e&cjWjR*BciK`p%0e?0omp=GY^9 zYq%b&{~@t@$patqrmU*dIz6)B$+jDB=l{rxAD*N;uL^xO+Iqv0X6B6sE}Qfq>&c|f zb7$Q5-?CQuI`!<;?xj*@yqtF4yUD?G*)J5$?>y|huH`Z3`|d6C*K}#Q^1#R8+HFsq z_oP+|3x8RA*sU?$LWbn5i$8XFTk7$LfgO*!y$jb3==$c$js}-EJlOEOY~jb3Zo8K5 ztSJQd7&oSW@8Q-sYQS5P@Jm>f-6ry7%}Bsy@HHCEBY3ZBUmL$Rekx^~YY3#cugz{h zHPX%G&&=fRjSo8PpEWC`u^ow9?ya~HRAr9MMwigwanIaeXFa}@*ZiqjiGl#9RQ>AT zdIeu!I+?eUk-nLD)Sq#%&EjF4FAK4Etd5^XT3!Y2gU_yn8I<+)w#=PuT|08tl~HTn zy?WK;>z|BR1loAsGy8TWS32E{96>ZKl$$dvmKcYqJ~#E^e8ke?#;k@waa$OlvQr-?>S>m zqigSv4xUi|aH$q8-yYD}%sv@C;aKXMsgZ3mcCT2S5nR{y)|<<3js;#wzmlRJ=Q*p| z$6u9qCLWRFLbRg?oocFI*S9}aH~z}_9v6Merdw5Cne1|}>7I!3Nt}(Mc4pYHuNE!d zSv9|2v64?Ck6vfroO$xt;<5k7BL&Sqmb$jOMfELZy;=m`D4(~j^tyBRHhvhTvtK@O z#{F8pwH!WPRcfBQHjDgnuA@YZ;97kS`J?}V9B5i=a~b#tZ5Xr`)8f_cYBs|^5+|d z+#19K{zQnhchAUq_bcZG>7EmE!9 zZ@ArLO17p2|6tR9$-&+h{A}+-y3Yg7RiCur#qa0tM?$+CJKo;&(WbhIx0+yX3QT@!Xrsh{=u%atkVry^%p>g{7aAof)K`A4@dyYzDM zwT3>&&mC`+c(7vr-bx?(ZEMs1K|tF)j~Y8lcx*T?pFY{as$p$shsW)2wQD(Jg>u@p z9UpabpIA3qc)R~mkECBq|I_^Eu=&H?^{?6#dIoo`)FduFs^7+at@HXnI5cNN<*;98 z4op4U;K!|@FTeR$?wq+cbJRYEm({;s4!TQf&3jY1dw8e(BeoNwJ9M)xefw_Uj`dx( z^jfs6?eyhc``#PrcXq_-`unm*9GSgr)%5CP&34SWV{y{Yt)i~n;o&JNmlmIT96mHG zz2&d*I|itUvfaL@$FEnWOl@^9qj{^lQ{Va&UTirqH0M3y7){@|WAYhw=Fe}pnt0B+ zP`_GQYoU znEU9@_xlOy3f*~Kjnc1&SobFdZFomg@h)hh#&muHnR*{j^wes`?dg1L7_A@hh&nlw zUyEb2xzGZ^obE(?X7PQ=4J3;Wa^*k7FLRH|S3sYJEK-zW;I3IT6|+BJ4_hX)+7UAEjT!f zgnThyy!CHE?LjrOY;JGATzzH8o3C8s!@u3RtFnff(QW@tjd`nUd*WAGURLYQf5u%c zar({P0~NMJsyB?NzN~)f<2qYSL8YzUt@%!o8ycVbRNzkwL+ZER*0cUzmlne+-5)g8{d2-X z2b%-0)+nE6RB}nbSiAjzchAa9oAJI-``+=ers1)F6I*p(nZIVr_l7%HebW`Z zZ2Q@~@MCPX4a*c?eVb%&>fLscQ-@3AQ*V#e_=dSwxaG2Jf=xy1@MqHkw(r|?y6dh* ziWko<&NsiL*q%N2jfZR7iz`dJ?(IG*A)>)HtEy#v%_D{-SB)4u>%Gqd?>(iL_uf$> z_kIP>e%!$O;e#i6x0#c^JZRgrrZZpciLIdOvCvI-sCGibtI2bcK4njOGO|ydJHy7@ zs&dJr|0SoA4_ofc3VEJgVXI>4(00pr^z$vB6TbZO!RRx)nx^fuTsgV)^Ra1XU*vbs z9TYq|_G{x^%~q@)vHwx)td58U)A(_>*EOAcx12PtT8m#f4Il9v({3JX<(^%5!{6%G z2Rrro;E?=-wT@S>TE6+g+QS-bzH?{Gh7wb{9RDw|!SQ5W#}$4vsJWRZ7BAq0A{;VQ zy#yH}Fqj>Awum2QF870~{1|>Th-B6}PhGvM;VFBPAd#8**IB-xR^uC)(>M#K`0{}s zrQF+@uON%dhC= zpE{h=)jvG<#Ep8-Eqnd=ko2eIhJ98CI+xtEwC(0eFFjMPoLJVqT&0-KS5oKp$h$TF z>7mFaN`B?XwSikcnw?!0f5f{R;}jO@^0GKV#2<_Mr7$(FIoMwp8jhRo=+Wgb8NX0ORa|I?bYbi?|?pm!}PFttqqkYq`pC=@Vac`Y)e* zGSjK_h@(kW-s&rx`x!>IiSaxP0cF2}-TZ=`0D;c%s8gA?p=0~-#eL*;y8BDtZ#LcLwCZ|nkng01HuqD?mAP24 zWyYpnD&L-6<}~*17`=UvOTw!XsjF*MkL`1A*`#M}E$>XfvikXsDPALQhgE*yf9+c5 z4&Hqy-BacU{2p=P%b%MwbN|WQTfZw;==TOaVM3?Oy6W#3P|E9V{Hk{0f08D3)kDaE-CNZ zm8lzfsO`kqMNM6u&hPTwx*ai~qt8x#=GN%fWSd8KgR`c6$l3k5_ulH?xA(iXJ!NaN zukqpGo&j$bT)Dcl)Aq@AU2?xZ9}*sw5b$>M-}C1_f4N%V_AdF=9#H@xL;gT*H|iVc z17R{JB4Y7(ENjGILioFcOoR`%J^!)ZtVQqFd4z39U*gcNpsn|uDTBJWxyxzG^wl}tikDc$u8}pqaDpgIc->^yTdSv?En+5)3vaD+Ey-?%o%L^T^<)pqm-nCn| zS@u3_`aZujkgwF)wf`ck8ruu^)c)$N8MCX$uU9|Ix_*tQx2!-{P@uDInX{wG`%{Zg zt^GYW@!a{!nZsgmC?a}BVkuI48J}bcBSIA!(J#J=a59*d zfiar?rH6-wZ@}bC(^_)!Chx2hol9tNKdtCpLIe0|MfVa~uU0$>LF?9v{v~JwQU*sO zd1KgkL=O{rW0;Xd7ZWrRDT9@oM&8qEbOvLXoSNlDHxn9pPb>PF(8zmQ(a}U642!0C zCPE&JDnw5cc`z(hqN@pwyr&g?O=#pjt>|nb4?zdD{sw;)IU?_AMSl}{2&~Gz8v5 zT5K061WB=3AQk=>A4KNm<1isT(_n#LHTr1(amjpDGWHJ`)vaXyJMJyQQ{h@Zf9Ydq zALhJ~^x;iou!+pOOuHpp2|4jWj?%Zj#yv zTkSqeXP=DN6dr-RD_J|&BttjzSIK2-lj_ywZpcE#_8DtW^Ud^)5dv;F zp5+e-CECVA!h$!GJuyEobiL@XGrVE#Gs<7!6||lHWZggZM%9 zqwD-PGcwQK*+vIu3TgwXQc7)169yuut3~vkp^HOwodMw^B`!O<7DU$>%ANhh^YEZ@ zq{Jmh*M;agBd4ns;rWW{#yj}Y&=S0Zl%Xjo1i~^bH)JDaU;^+jM9R<@_!J^#SZa7c z%COS#fRv#zaGF6%WRTdXkTf&~z8gpx8Uz0hqzsLr+l-%h@Eg8-NEsRfXFjA1je$2G zQijIB>jNo6W8lGul*l0A8-k>P8NoRODMMr69D zqDUDU1K$Uv42^;B15zsY+WLuy%N~-3p@GjHQbJ>jyZ9iF(6}UMxT*j zVRQ{6PhCjRI|ETtKM^DiV^6)(kTeWFbv;AUF#6Q@3`qkmP*)Ko4Z}|z%#ftx-;}OO z>MDk`fgGr>7?K8hpw41Qip_#k2!N8U{;P#$|`y*QVf54urGp~EDe8rWq%a7Qs;OItzH0rU zeZ313YSQTEeDxnbRfaVpu< zek8@gS?!`k2p^EY$35JzWE3jkd|GThNw z-3TF-Df=}k2ls3y4-k`jMiwup!rq_^AkQ70tCBXnvqe47uIcZv3rX`JxlkrxQcg)P z9Bo$CxmricjInY}e#O0)bhk3i!(9?s|E78Hu$9(^J2W5-oh<8IwInD}9Y9_Sj}T+P zvz##Q5Mn6gHTe+2Xv+ggOZ<$GOYr41{TULFu#k$sqL9mlGq$FA3I*MsP4aLv76r+s zc?vltFOxjELP=*-C&^S$Q9_a@+#V^(6Rr)G`0FNXO#7)xhbsZLvwaGb~4ZP&m79T2KWcSo%SZ#s#U&bo%>IrY!j$NTMiDSHunRvVtOENkQSFY)PK5 zbWHPbR}4clxR#O46JpU9f42cD7H%CXo{2p5|LC1?2*k7;$*%?)Mz^KR7|IqbD`|fa znvKm9R^H)5WgNI*3z_1;BU;#Ae27)vT(1D>AN%#(Y1=sTwBBZh|_~r z#7qxDtTDugh-C~7Aj}tHE>^-wF^xc&E{3!a!HMYrI21E-2*AWvFB~+JbV^O3CjCb; zT%F6%b7AzKapeQdGL66<$@Bx80Q)Ypdx78o53)rJfTHmWC|0p>MU|v6!fnZtJVeDJ zyYic89=sGdubC#O<@Bu}ZN zXUZg*3Mx=a@>sf5Kqi$AKR^mYPJj zOTH_Io|nlJqLG-^k77)l6~h z4dPVQnbT3VgXDLGR7L?Z0ZL=a33nt)-u0)dY)KyQ9g`=7K0-O{h~kn4zGLVdSdN(< zT>Q(dWq&M4X(fPs4Bh$%P>q|hfja2k!5UcR03pewpioZ9fK7$Jie(}IR7{U?ha|JG zahD*2{}s5rkm(8JJhsQe=`mwZXajMx6GJMvj+4z3F4(5;8aFh&OqDf~4+;QFn)g3? zB3z4TS`Hy9nc+upSJTGOXch=t%M4e5aCqMIg9t%u`ZC@HPGx8Y0auw3M6g#jPwA(1 zkoK5d_oF;dElNm6`a~#9W`JUv$Zy(q1UzHw7ffK1a>6NBN7GEi&LR#quvi(2 zMC_*jk;iVUKxE7i1CcQliIepIBhS#qV#I{FHP!ah9GT0vxnss2R!)wqn8R zS!^gMvEYaI92@kbcjf1rRvl$q*V&%OSj-^kv~TFUbdmBY2X$ z|FJ>AY%3iF>_rT6fv6}l7*SYM!hk64of2ZXw09`Sa4cBVnI)ryT8Etx zo3~^Xu!^YN)TGBsXnNUl>}VoforM z0oJ5E6*$izYKz;35`@N7r4(YBoAw*v0@NoNGzggtNkSdP^hd=CaY_}9a8K(fwq)RM z!;n4H=Em=JD;hLJ?q^?S1v{lm#jZhUZ=}1DQbq3v&#&d|L>)vVZ4x4Tn&#mmYo?t< zR-Y0zq!ET?U>9a;1WaT;fs44=cU6pf_Y|3%$Le0-+Sh`}mtv=Xt*jSRu? zE|kV%=SCVbh1?p8GHzjrmrpJh)3cI2lgU);wW(lV42(ZZvE<%tp z{RUKK`Utg{v5!SvL^P$MrjyA|&Q?0`7M4&E35jhtt22n@tb6oP@UjS~R6 zWF=`?Qv*061NM{v%}m8w|6(&*)LSU+*v1Gqu@_CUVS7NMnHfb;1!m}pjK|EWph1)V zqyj^h&I%X^Gb?zPVN=*_m>Gr2h@l4Xcgm1W2Myeu(FI})WaMoqj~U2~22u|^6N*>) z2{FV>^Kem$aeRujA)q*BT9L=hmI}az87-J@r6dNO1T*09+bp&(>1S1?ldBj7nMy9i zHlS+y$QuwvzC{g@E6yI7_n?|)Rn>S&;zVzvyGLI_x6+8EfGn5lyg6eIlOW*!DM zqY{?Vfkve~4$y<8ewf|aib3jhw9tR!@GDtOxC$I!y6jchXPFOz;@HLrUayi-5CU6? zd8i-5kF~=Ph$?{DMpbmIrE?7HF+=@mwRA^-38nbFqXD#Dm5%KlERpQXLVR?w)%urN z8yLVFW3WKI%s#L3#}X4dGP2n419UM&=+Ele!QU7m6nP9pgyV!nIfNdQwv7>|W39&7 zf>C~`{QcS02mKy1y12xgnQDKS_oXufqYV45=qh4Veqg2RA*XXq2kF4M*YV>BQ@Gd&3qVr`pFHC8Ue+Hq5qACYUZg)#L*E63E2n}wK9K&oS^ zhy2d0H(c_<^c#1772$wl0||7-tPl9!n|2)ihVGQ97(k3|v=AxNbSwbkOgjuM5*%_E z^a2khLko=@20`!{GJ$Uq(-=fXXF7slno{HgK~&Ay&{XhHVqXqmbk`75SaO2Gju~nM zk7T}w@Qa2#QH!KP@JB~Es{TV-jWQfKTw`@IiVb*zkn957%0=T5hyYP{K>39XHOk4rS!wp$%)Bh zwS#crVwROZJf5UO2_wDKhYn^!NV&9*;+r&HW|j~ncm}?}fWt5n%szwR@h(H4Xtc>{ z5jJUmbWTbr7+iMPp!AcjQ?MmwWgw58S2$s@?;^?@Gh9j`)|?4vLi7qFQ5a|f9D*Sz z5CB6b5C+&htSe!Piy76hM>3+3KMZ5c$YAqj8XdrH=CDOFpd8+rrW(ldU^XBHW>fJe za_R&F^*^Iq@(1lQgb(WmL$i=snU2F2!3-K~MbhsDU}d7;b|$kBK+-t6C(4D;qozMm zUr5QCffkGXE+il6jsQb0Lm8L}#<3>=gNL;WiY*3gF~*F91lgV0`(ayW_#QsT>?ZJy zWWNW5XdK8Qu@0&r$z~~60ADa935LYzb8vYjn+Nw&DJR0MlFV$Wb>O$ssfLP_p?g?# znJED;5%)I3HU{C(gdPxl&u}r)%=QFx7h@Px z2e615nx*1vur}&P3vum_bYWs?F&bdF$vc5&aZeGW&4jL*+5F+r$e5K-6N6zPMKgnj z>wOp;2z?>d^FR_THfX?s4CuoZI&2=P;)}LJx5cbu^pufCFcXXd0W6Y1Tj1-A)e`~3 z8OaD63RPS*H*Gs^@{}?Q$Rfqohkn8lubaUh8gjA*?GOG*cLLZ**)fJ)QbYnpOdsxQ z450(B{f|7@OCGG;KKUSnT|-ATIY0E`(E6ReWVB)~jSY;cSC2Rg@o z5VOU!8oRx8w}Dldt=OM6Euy~+|Im6t7?3g=Z0igFK&)fB1Hs9P{RVuer89_$VVExP zXYrLQEL`X$8Bl@^NQyOJq7_iH$!t-(t&~Z^+$9`UEl#D#^Ow#l@&csf1eF8B#F1D0 z{Dqr9&dAhC1qv8_QT37(uOJV4G3f^pR#`%6C?{M~VA2uz3`%UoI_k_HAmt0lV;C%K&Ww{c z^5A$QX$%|=O@R_b4?ve<>qtK_5J(VFT>3Ix=cT;^wq}N!u5$^80evw?CXmOd@{niT zUJYU*01wX0OB(}^bLp_c153&=@h;nQd; zC8K_ax?5@7M2egZpdb~_Y?{6tz{nynuM5{`o0fw&x`ZuK+q@LPB9A##po9;U5Junh zgRG(hdy;U2oM|~o?$W7)#3I$h!LH93Cg8LHw;aiqhD@j>B|`|Rk?xTwCq%zDX$)Oq z(osN{8RkQUIU_^TZ)wzdK)Nj!Hmw-mkP$}u7+Od7()lcu8u z?M$)8(E6#8fx%12W6o)W~BX4@4Q^8X1#{p`~X=Ri)H1el76qWtj>r7z|H` zMMMgu@h&6wz;{A85Np~Ps6U03gZ>*N64>*x>qv%Gh3!*1$0{6(l&%t})umE2oH1}Z zNcuhSkK*s5ehfe0GE)$4y2T3$2RTQe𝔩1y;tzzLYTU@2zvgxg9?K1-E-(zb&SGi}ELH~4TE@d|WfQq3=LF>|m1 zd5riD?jV=yL6FC|@FEYe+GGZSSK#X)^>#oWOcN#rX*uC?AJZPgp6k zmO&LtDk)y^hd$S|g{T{GveqOgWtIX7U8ZmoWY! z$A%v@vk}5URI2x+AdrEE0WgJ#!>ZR2pd9pT(u%Rbj8j*HSJV(>q&Rv_(-x{3H*qD-zcZ8$y(fc^aQ=`{z(5OTss_VJ zD!BSFu87EEob!+;T;OifK)5F`OAMF1F`xtoKp0wp0zfG})=ZrT8SxMtm>Fuo#Q#x_ zQRgb@sSqjehu+Vi%P`_Uuylr-L21PBbiiX~Gtoi;CZz=}zyX_A+$)dL7Vsa;>I{d| z;*31=G8{Ris|2za!?@rXY3QA}v>~`L>>J0ewG94)l8v3G|Dh^?K9x}=K~o?VJK!S$ zGqmZ_roNaW$nh`Q5Rgg3H&WUX*C(V%M&V1HED;ZHd1vQpI)tx~Fj=@|LK!Cg3U%mW z@(c^GSZ#2tV%~*yT(U32XP+PBO8ul`v!rmrmxmB=SHj z#*PSE7xn#=?uE!>w4GqEjNcVjJq~jiKZwR7>?Xp3NgEACsT6@ia>uzM=4Ghc*gVFw z9D5lQbJB_xa0p=Xpox^`fk6m_Qf%v@PN!1+9rBp9K^;~_(lbyV2vn-eMLEX*0eNbZ zorZ2*AU9@}LyG`NAZ<197&9{P_>q#loYj;foWO<*a6=wW3P?r}PPV2~ zjI9g2ol&16Pq-t`v@!5mlkiU1JK(J+t%P+QgYF3uHB$~AVN53Yk#s)6>7;@@xRG90 zhZY(bH1ZhT4)S1imsAWjt3j;wFusgfP12rV%T)Li&z|rr5|0fVUw|1#y2zo`Wov_s zD(xk-fW^5GIsu>DA~bK(BSW06;_DQ01T*GJ_Q)~ytYvsHu&ANy#*P4yNQn$k4+Bf5 zUq8IUIz^@wr$D#I9O^?JbAk$DdXXD*@%h58U5po_E{p=K^U^hreGPWYVy&SC!SR_L z2}(sN)Id4G>@D_0co$wP(y0SKl|mOxh~Zpsv2{uXvEoA`d=LtG=@6=*QepDY6{aJo zhUqbIl*uZf>lE(EQt<$J@T`%J3><5iilG`}@?cz)QapH-6a&Lmi;lmv5;YU71_fa^ zk(OhR=wMr5?87*h#Au?Cr!asp5n|G)S5oN=d5kY8bjgg(milr_&0xrr3^hjDUmo^cGc`5$UW%p4OS1T)7HA$-Fb0>;sMr4(Y~Wndu5P=iI85)JJM{z;h+ zz?0Oj15G)4BK;olxPj0ODn`LmUAktW!H}v1RZuiBqXnxg1A(9=G~JQVXsZ2_(3_4r zxiD*%hC-A`TGcH>W77ght!O=$$VQb1ij5`hNy;6Y);X0VuPc(#w wfr3SLOMT%G9y-#wlC4%@U8mj1k>lK<^(6-*o!x99#`p(VdwMo$9cumm0p1?_2LJ#7 delta 44341 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 a5#7r#|8e(?FA{NV)3bNp`N5BW`0W1|Mii_7 diff --git a/backend/main.py b/backend/main.py index b7dd363..0bc91d0 100644 --- a/backend/main.py +++ b/backend/main.py @@ -21,13 +21,17 @@ app.add_middleware( # Конфигурация из переменных окружения DB_HOST = os.getenv("DB_HOST", "postgres") -DB_PORT = os.getenv("DB_PORT", "5432") +DB_PORT = os.getenv("DB_PORT", "5440") DB_NAME = os.getenv("DB_NAME", "dexdemo") DB_USER = os.getenv("DB_USER", "dexdemo") DB_PASSWORD = os.getenv("DB_PASSWORD", "dexdemo") DEX_ISSUER = os.getenv("DEX_ISSUER", "https://dex.127.0.0.1.sslip.io/") DEX_JWKS_URL = f"{DEX_ISSUER}keys" +# Режим разработки +INSECURE_DEV_MODE = os.getenv("INSECURE_DEV_MODE", "false").lower() == "true" +if INSECURE_DEV_MODE: + INSECURE_DEV_EMAIL = os.getenv("INSECURE_DEV_EMAIL") class Organization(BaseModel): id: int @@ -125,6 +129,11 @@ def validate_jwt_token(token: str) -> dict: def get_user_email(request: Request) -> str: """Извлечение email пользователя из JWT или заголовков""" + # В режиме разработки возвращаем заданный email + if INSECURE_DEV_MODE: + print(f"INSECURE_DEV_MODE: Using email {INSECURE_DEV_EMAIL}") + return INSECURE_DEV_EMAIL + # Попытка получить токен из заголовка Authorization auth_header = request.headers.get("Authorization") diff --git a/docker-compose.yml b/docker-compose.yml index d79337b..191cf03 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,16 +2,16 @@ version: '3.8' services: - postgres: + python-navigator-demo-postgres: image: postgres:15-alpine environment: POSTGRES_DB: dexdemo POSTGRES_USER: dexdemo POSTGRES_PASSWORD: dexdemo ports: - - "5432:5432" + - "5440:5432" volumes: - - postgres_data:/var/lib/postgresql/data + - python-navigator-demo-postgres_data:/var/lib/postgresql/data - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U dexdemo"] @@ -19,7 +19,7 @@ services: timeout: 5s retries: 5 - backend: + python-navigator-demo-backend: build: ./backend ports: - "8000:8000" @@ -30,19 +30,18 @@ services: DB_USER: dexdemo DB_PASSWORD: dexdemo DEX_ISSUER: https://dex.127.0.0.1.sslip.io + # Режим разработки - установите INSECURE_DEV_MODE=true для локальной разработки без OIDC + INSECURE_DEV_MODE: "true" + INSECURE_DEV_EMAIL: "developer@example.com" depends_on: - postgres: + python-navigator-demo-postgres: condition: service_healthy - restart: unless-stopped - frontend: + python-navigator-demo-frontend: build: ./frontend ports: - "8080:80" - depends_on: - - backend - restart: unless-stopped volumes: - postgres_data: + python-navigator-demo-postgres_data: