# v2 git bundle d02989f1a74410252987ba803a93d55ee8c21f74 refs/heads/bundle d02989f1a74410252987ba803a93d55ee8c21f74 HEAD PACKxUJ0}͟ 2,t%6F& ط =󝒉@XMz69όA#MLkI=W42J!rޒ)"kb(Mw\N[Mm06.OR3x`HP e]xXQ5fJB3w9x _|;5g!aŽXx1n0 {}C("Qt2ttߟ< `X7aX*aظRJyM΢lțw殇)"i-%x9eÊ\:z >6U&i`ȈGܠLgp5Чs^>Yx]J0߻yj~TE4ۤ$S.wF t8\@)M\Є^v8N5E@É2AE/Y zz2"g6:wo:tC9A:ov$CGbC 1 ;d^W~z?c-);mgRR7tgxIN0yEA Զ㴍idyx> JC"d1K^tRlyqTS$;G(rm`ghSn G=Sr$Cm *OR~>}{EΒEMo#*~^/gx˟C\n\/kK?׽A\c,RxUj {\n1j)c0Gsl F}ecJ&^ Z+5aUdް3A Di`P*1=uaPR8%=Z%n[])/یqj2@ҝÁkپαp.u5iɴNXΘxJ& tЏOq8N91|U;>\xKN1 D9VN*vaF;{ɒPzz*Nkic u'>+w%gsҔC\JI葤$k ]zqL9+?z|nXgz⭍\.)R+‹]1U5/yK@ٕ[`~YBxPˊ0+زRmcl)ۿ_&!*P-&P'9'Ca_-aCC!Rm)91!!{Ym I޴\|;-|wG:BuCC;USV8Z3>MK:_  I(謓B5/ccxKn!DG@0XibKa{}.H^T2F-zɻlDjkUG 4lcK\ll3kJ<~]{,ϗ<ϼ~FÇQ^"?6U/y$ s!E]uqDX?xAn0~UBk0k\UUz7{]P F_qF*"d#@e}' ^RޮKkOs3,[x}x;t*@+tp.'ncz\/dxKn0 D:E I7\$@me`FgJ 0ִ^R%ŸLVy@hSdTck6zg,& hw>wi|q-{o?, LL>>;_zFM=Ϭ)Qq0LF`sR# YxAn b&V-ߘF KBjUw+̠M@+3^c$0jmE[t z`*N# J ۜ |VE堍Nc\jy9GlݹAӹGDqklI'/q o@ò#{FvǺeKO*W]_hxKJ19E/qüDDw^8? x_QU3D H1[NQ"bB6(XQTlwH>K^|bvb0Bxhyr/lwpq]+Mtl|he}rHfomUUԻK:T`+hВ`f nZxMN0F>E-1ĉB0HaXq]X$eG4HsYկ>D0MjMFe, i=5Z$hʢlt=vINQ֎r PߘMP r1SZχ祚=ISjFDn7o͌v>n-n{L 20YJJ!~*P8n>K 1g.%a\GL} ?ļֲ@ {Ӊʩ`p\ ADJn| O+VGjv.*x^rL^TxK0D:ECe~*v;1ؖQڋ~L- QM| r>ǐG׍$Wp4,`ٜɡd%LK$Hx3)[),.p6WmףYT-=3l ƞiM|"C+Hᗸk(Crͅ-ط'xˎ0 E .LmJlGݴt7( Ycadc2*$y{= U۵4 =pT AJIJb- =Zkq\7=vtĖKyhx+$S)c*Yx+R yZZMS_j7}u+p[YN&FOdfO{#tVz/Nfu!:nHVY"h . .Op}2%\' jFЭMu/CF3c ?GZ!Dc-X"˿`o4aQQ'x &KEZPE_ 87+e=I`Q,?AY7A89bF\2-Vi=U)/Pî$b sOxNn0 +|@8TU$ AYso;<4" CfJt2;Bd0*BwĘm }ȁ2ԺG fgֵT8Y*], ?oq?>4c6]اr@aqDeLsMU>fR%p_U`ߏ @HS0/@Z֙/xn0 z 4qlv(6`mQY6$yKeR츋 ']H\Tk\X2/$\Ը$ѣ'A*d.tY, rZײX*Ru8Ħ ggtQs >|H\穷`b3TIݵ[diqp4mM6qt1=8:E~9$1q/!hՄ<PȥE 7tΞEriYCeM>⁒_s )vjf:0-BɴChquC// MB4'qN ʼ뙊=(ցo?D{TOFV_LW)̷^73ܴU;;˴~w; ǿfؤp'Lݥho;hcn(X8D590Co X$xMn0<,m$)UI(h ȦkJL(Q )=DOؓ[4na&Difu7T5]Kƥ欤dU%4-cx%T[KְZ49>e p2w#X>EgS?'(0Z3Qe6%Ov cH[Jan}av*,v[é]ro!?%,۾ɇ?O}}Lq /2>ٱ$i^KN)|֬#uӃaN[`Uo`IWotN0*6*p(Oy%; #h[k6 xj0EY&X~TJiw+ed9$_Cs9\Nɪ$0 vN1z1, B\L"\cv}>v:(^dmBKMWA~a}MVK2}R#Ĵ\JQ4nj;}Z)qS` tJJ( J1=/dxKj0D>E/g>BHvY-563 K}BU+u2Y璗.JgRfTT&I~F$ \rR7TXV1t=qʞxj!E~[&::R..oGSW r73=udpFV##ygA˄8/hEƥC$̨ +j4>%m,hY$ zրvwj?T^GG>W_n$b5E|%5:a|Cl[}cX, F-*%^cdb#94(-_40Nԓ62A* rrw^v8vʨ&!^( nuVrdmյF4x92`4#?qGxG"&ۆNq3W"!Jbx[G&loK?O:-{`<;u a;JiNc]Ds+\xKn0 D:E Zԇ"W(: P["/zhdv0T!(Wo[\k!)HbtlcN#Y= %BI٤?jMkr;_^^8$u9#fٻ~f8WXkɈ%`Y /xn0 lP;c9lVlhov@KTBĖ IN{ϟhFO%¨4um *׸j70RKP,&Г, 4ŢҴ4 UdLen(RJxt0pDE1[G\ͪ4/VEHC-H&=]5x 1I25k&cmG!y0m #,뢬 p@{EB(3$aA+s#e 'i@"™,EÝgoiw~1:?731[e({ǾUΝB ~/!i)T1)sS8=] i؞ _6QђC8Fv;/rGܨ3OZL޳ٴyͳs;8r1|S/ּN&|h=AUL>lb뒿"xN0 E /g34m#nLӦI6|;y F$9.HZQtFd4hnq(|jz7ju'F݊шII:4P½!f3yneC:l/ 뤀ZufKѕMBtpt4>@&gN.%&R̄ ҅-lX,;,¿WV&{Î/Fk>}W+Hɾ1O6#^W>"̼k{<,FL6/rOXž<:N}2DYOW?v?aBL_3A}b''5oSnxKj0:EڒB.hZ!ˋr,Q<7`$hckY[)cԄR2eK,RO689E"FД!>·\,jEWߧTn:~4s]|M'q} tZ.t.wj.ۃ&a^[hx1N0bKIax !TT|`^_#ۑ P3%%fDM/Jm5fhCO8 T-t.@F5ky>tAtx-cLuwN k֔9&][}ʸ4'k!:jg*% o4#Dxe3}&0]ޢ\U,} :dxxAn Ej"0 UUUN$D'oCoH02E,ȕa.T͑ peN( c(`$'֊h>`JW3Kk%gY&7N1d#| smQy3|u'G*- hBaD jZxJ0yY*Bōd&poZtѷ7 >87fPsaR%$ ɣ52.(%cA+S,5!%ڢg)J0)kbbGZ~yp;5LSo }i#-G}p'XOk--> A?+|{6ƅn_xKn XиFQM;c6Ƌ>,s]բz#ϙ smq^2ObْLMbAm9XHQeFLkMȵ|ݗk:''9Sk?5<>K۶?ҹB H~YUxKj0>EBkZؐ$/|1 Y[F-aRdŭ;Flu:I L1CAB2xl1/7&:V|w9ABA7muvi}.{?8s}~[ =t} '3y~My,$H; ;%7^aqxj0z=&l+{lK琷 7 S33HB@#Y8+;)1vf#e>+z#V/"ų(&ݻ(-f)N/괽e8c洿dznK< F-|E=?͉?OHPc 揸b&D{p]RxMn @=eਪzj` ƪ{O&frr!h G9V[R'.4F! itaъ3Zkڤީ}Q!x*Oo 炵vgZ]r[Mx*8][N}#?̹Vq1mUg.' U[UxMj0@N1˄B<K.!dUr iry"o:vZΩV߭8}vĜ ~ ?8"ʚsZƳz;O$xKn0:,R'e0 g"$I;so!S !SծU}_RM_6hu%mz5 r@ؗR(QV:->k"wx"X8hŦqSJٷmH)DƷM.[)  `'W"A\ pt<;$Xǻ P g?^D8+1g.71?jC0`w`_\d.#wo1"^??$ xAN0E>,[UvR@6l`Ď4j4&"P()A 7Km-I#M%91@`#u_RRxe\֢7u#{b<.4 4PX Zl*z?CٴBd87L'#{Xgno ]I#d 64:-+δhg6t5<`_Sڭ=@g +({ }!xN0 y 7 ei~M8q@mɔx{ $KS$BQ.Lyc,jՕҤ>658`$ZQ+ ʖm )eYjsC9LH4%FTAxή4߷.w0wu ^,l0{ iFÑ,:Oq)>9yte ,Yg0|:S E08^$ !WR|E9xMN09,[!_T,؞68rDoO+*3g=nP(y1 a6&h!w3U8FW8xG6ZtX2ZZhmc /To4V婡IA}w#@J0VFu[8̹F=JOaJ` 6:Nnۉ4Njt:E@]m3Fnk|RMD䱣c[Vom8J}3kWb96#X3N0VAjFfHp+0B}X;Bvx*kd6l饓Cm<ȒmZ;O ?ŝ'*E?v/Lݸjϒ)KMDAExVMsy`0Ի~x}oOYOr}F_L'͐[NWa\[^YU{GKuB2z!k/k^)#&eέ7A?? %JxMj0>[&1dB]OS,b[BKs z2f"27qvN#NJ"׌.a$8VZ\'aȹ֣eu %[Q(an.l^ %5`]KP+\g3:gjvh,jIX/g!wuIcP|u~Hw /iz yRᲵCoiYxBzzZ N:tOy|DnG\@rU ai@/a-xKj1нN@wZث!ԊE<Fg#6)1pB΄fb]>lbFk1#:TL U力kHp?XECnM>Gk.N4 c6hEQM|0̴]:R4eܹWmQxm0T;E Ys6,mR@JL%AJ yfS23th+\h LmaFdKRDCV^Ct3$2Kã+3|AN}[9u|ԣ/66.oРѪU(;x(Duŗ/>L;r!\#~Op1s~~ fxKJ1DY*bo'y]Mrup ρZ!o#%g.c otPqÊbb:(Iy;$!Sʊ {[. +:gk{Lx 3Z)xs6[cKyEJjF <|-=6`_F!c xQKN@ )S!X{N; 9 S*=mDqu㦌4IYEeAYEВH&æLær4>E(r2,";G \g܎kv@iee-?ɩK١ɋo٠<V9wzԟں:3{558v@z=K#]U b~dzλu,G:77rh\yw?o_6< l -fg%* A'xPˎ0 +PLs`|8ImY ֬eLj;fpm@^T/QI M'V+XZkG?H5*%Azu֎: 7[\2\C6ش|vj:.p'G)wP+'9޾ fw瘚vX)c_=X + 87$O{`dcɁ!B.5P!IW | R $u"4y 8` < |.SO$WdmuEk5'IEPz#v{^i9&6[mS冹nT8A p*H y xJ@y9xЪ%EE=HcA(I݄ݭ}~f0AIģ %"!CJKv#˜4Аv YBy1y$aZaT)2.S!81Ne$kZKNwW3Z2v[Cݺ5r(,O40 O79']P}FCP~r7]^O0VN5tAp @Fp[,w]qc} (+.3h_zXoF0 ƟѽkQLc?xnXgTQD@Qͱj>zN56V0}Z c3$(M?~%xPnAWcG, PHD^+ٝ̓dƲ8vuUWU@mJԤHmVtSUX6qO檬]_rKP֥ҸUUݖF*}s\Hn0h#Oy8H!n ysoҐFM[IӹBʼ9ծEƂ5O%7'!Uʁ|fƅw/XVG7v}>i2ixb\L"K>|D"h~!YAD}<Ņ? RKE-g&g9ÄXՎ󥢳.8DKtaEO))^;qߗ_ĥk yxN E|,5(c\  Ҽ>h(.=9 R4~41 V8#F-Nsh'V]b0ӈbdQa6ZAgK;SQ&xox=ǐK} kK|4jV?͉~?A+e;Jt|46ة%|G9t?R?PeExSn0+#lFQԵ8@nz)HJ&BIѭ~@/̗tE8$jgvgv @fq:+c%K4a4g1-<Ь'txÕl1q(M2dy,+iNXZ(oFcPiمpB&Y2d)\y0[  JC ([)^@-*C ^) ^PnV7j=䙇J,q#e[`! 78UAgF+ @zD1;mQkJVr E+ʆe_s-P)4B)(Si|7[(qLK+ ׋ACJUz)IMB4#1B+.ۛq 3OxjXSgJ89H'q21z.f,C~pGntƳxWUWjTRT?Bs#Dgߴ,_F^NPMA;}GKMh|njGCx)4 ;R˓N[2MQY(PQD.zٿdqcXo{x> IGN~xHc^q8i\_3 zpҕ,xώ0<va Q5ݶKҶ=W=$VFل[bORC*֋?3" YxQZUlUIIlU, ┊hH9X"g\,_U! ̈!#u&XMx;h[K=Ќޡ?.%cc ; uueQl&IwI$s₆ЅR5k*Px_ dIPÖ;6Ǧէ \}en'O~zfQd%;'ӭՎQ'`PAk%rq^1}%ת{v_>=*bxN0Mek [p>fha82+zH@g@yg BOÍUY׆rqhoës].}-11FY?ƧE^o䗨"%?-;ϚxAn0 zE K"%(|E"&@m }cн`X X#7/5ШB&)|#wԡABC)St$e "1Ւ]=l}z >\>\(x 70Ys<TS"XU'aOIYšxKj0D:EYn)0WѧƖۋ~Rz 2&K .x2&2cْâRxm-Iyt2`CHN[aoG}&<5mz穴f Fx5辉T&aCގQ7XxKn!CQZ| (P|2#SedY֠dmf u)P]ڤEyC Z3!t&F b#iϮW/ 8f;;?v=|nXw~⭌ EoaԢCO*kWY Ȁ7g☒cXxAn E!ŋ|O3nad7ZLa:•pI~ZxKn0 D:A Jև W$ [B/zjtv0"B#\s%Y\vMH8ʅ9xȮ:&Zb -وXrO}[߇t۟ueOY8R 6Qzp3TY3u+Gc"hq9g bX2xMJ1D9EIf&DDtwN/|LI@S֊ ض5U(wsE:%I$ Xg6NQIÎ3Ķ8ؑZ(E9cʫN2rJɆv- &HA`z0g0)zp?ɂk$v-Rކ}<&jzj6  |ǰeͺbK4-[sE>3|&BWL1+jX2x<=j+ KA>"xMN09,AU4=87% -*{V=}~o'%V*^TN)QUe宩:]p֖]6'Azk[]Q$idp󀁦沟dQaލbuӵ-lXX^G#-SN[<@JHS1Iè4tJP,u5apx=xj{L+!#hG~ /R\#)UgS>6 r>1RntZU_{7g |Ľ҆@󖝽f ظ xMJ19E텡ӓDYE%8a:Dx(U#HYV-J$*A mUA:V= z>P)wFB6h4DWĶ oʠѹC}BF\*s~ľ]IL6Χ˦;Om 8 kS vcJ[\b TP5i"xKj0:EAj92wgFLj?f)((9%)&qDyFWMЕ³ȫBg֧,b)Jgc0l}; |E kܖ(8^9sڥ& X3,֒65Al?QwjAQxMN0 = Q B #7qI(Mf!8!'!'ώ/UGE/9#JUSgVLHE+KDdmu!n 880"\in´.7NaVҍu͚J.XXQHCzzf̘0{`ѩDMߗ#DYaV9rxJQcp\z>BZ!}SQvpr6[l\ޜNðFV4>yg'Jgzw! D,F}$s>T:8xKj1D:EFFhZpèu!)x`xγeq::G̈́f]D33itY㣶|l@Fe;(l.rk$e[ }yyxm9Ivݣ:]KV_ڞP\K*pMP[\~O}PORRx1n0 Ew{-J*W,*1`[B}=Eh3QlETEy-n6GdPVx9n0sbrcRC4 _ DK+(t QiugO%QJvYe60JӳC:Y\…yv*NIУbIL6a/)wG=^AǟuL[4q=>%sDx#fc]fxw/)]aߏG6u|㔜]Jd~"[xKJ1EYE$"#݃8H%USٿKN8\=|l}hY mv\9ɛLE rkb)bo QsXLzOx> ^}ǗIu_0#5sٵbSW~y kٺek0&{?%5mgyim',yd6eQ؍윟\<8"Ў&1Q1Ĺg4Wr*.;LH%Cr&lvvڣ4?~IMg`7}eG s Tl.yZ #q*._XdxA0 E9UQ$Q5Wq"AYr0oY !"%f)iLD}Nj0rATƌ*ڧI Yi`{K53~ηwK,=c/eL%_p3nw: Y1\xxMj0F:#KJHVJѨFm[?!%zûPia3D9(OZpx1n0 Ew{H."W(1`[B}<}dz ( u*0jїJcR;n@:e\3%DbdLe8 Gǧ=[]vx/aoXŞgm@1 0^nϛK?< ºn7>%McPݽ[xKJ1EYś MSIJDA$c>T^oWfiv:S!8%WOsYa)*8ǹj] y/4y8S޷ޛ~ 7ԶR>lafOsKSW~SQMkQw쏶/ RxIN0~EA;!>nw ǎ0T*ZG9Sk8iu:=-k%oOԓ;&Hhx扔VhORiI0(R`-kLC;olJ4ʩp'ⶹRǍ s3$=C^c*мqpqeMvl.Z 2XwZM+=Mq+5bNP┇N/\XxKn0 D:E 1~EQ*"C5jPEo-{ngC$RiLqc_E"mҐx_PˮW@*lxvSs6=ǐFkM!nu.8z,A6M rN0SǎC)G ,X|Oz3PJs1"=5DM+ՎA1cd!Crmk ;6HV# zTfktкZ6]f:L͙~^E]C:۬Gx X`bx!Ƣ`u8-m>݂* JOh(">8̞kk /ܥi>ߩNxd@ObM7žZ8~Cqަl5bZCWL 11<yv'yazu&ح{xIN!=h*EStlGp7;hMsBkn mZ59vbcU[0XĘSBfujCR1\:ױNQ17I<Ay52MnmiJؽ=pFHչʹ:f=KHXo9ZhN8i!"V,<⦅u{l\87?r^'UZ}i60xfVZZhm_> u/{}Qj# d?KR~ѰWxKn0 D:Eu "iRP"UMA}a#(m S``6=.b=4辥SSu<^֐N|5ƮRQok sr#{aO3Sad~뛡ˡ+Kedǔ2N`4e'yDH.k LbֳP8*u#sL.rcUhI V %IAcۤ Mq_8.Rw913'pb,O7xj0EY;z8BI)c(-!}n= ն׍n5Aƣt vֈj&GDdVYep4`pF,k⼓c0.NZtV oR8M[!f~ǩ^πD0VDFW*"@jY"pR70}7Ҷ;cٞ ΃2̮ Sgt b i"th<.*kfʊ|ńB|(/7 tt0 =GdR|Na ?|=z/xTԖxAn =e*c*rc"EuwO ,r5*#Җqq]s6& mL{+K =t#S{Np_K u3vNw!Ƨ?_NxMJ1@}NQKEtk*J04dEqǛJ%H2\(Ua2H;h8q1A,J 6*Wr0Z)L yfgm

Qoo|ѹ`='KG>= >1 >;>J_gpEZx=j0{ !Fd xm,!K~]icZ3 &HuB( !X0Nt JP*if2wZ 3l%fVTO˓?N?RAޟck9i?ja}\!ƭV_WоOm)TA.#tx^axKj1D:E%K3`BJ`Zèu 9kSG.8Qa0 Sbb# g.T?FɎxp!FBb`bC(uߝᚴ \?;:'9\U%٤UޡoT`iڀ c#R6xJ0},?"0 qLmZTK/.j!H quNK< kfBQ;mJ)b(:(ahpR7ZG,7O˾QڼZ[{Mu܇/3tJ<0Xs9J5z7M t)K;w?)/(^S6dx;n0{bA~E*0_eW\IDQH}`9@Wk#cђK?ɠy(7!Cp`32ꠟAQvt& %|X#\~p}ے1mS?|{.K/JΩ5[̌-s7rgX;},=ES.o %ן.X6xAJ0@}N1KEi'd)ixW>D]2~jvnA" zdc5"&ah+l9x#bP4^-NN{\~V(/w0bixNkk)wUL_ay>?,pc'# gU͗xJ1y KfI&u~t#X*T%)9*1+eZ&Nì:u3XC9%y |Hp!]p@a7hvx;n0{b R/iA4’ZZIQ(}!HLjamn:3ش Y[KMZTx:4ʶ(MOǁ;֎4)ebX1ʃ&\6r% rBiNB_-Q]Y7{!aXhmt@i?vyiQwxAn b QX``:UyB/siÕctOQY&{/dwVHbJAcjUPI)IZw&zo\ ARWwǶT|Y0P N,WR*>`[#227h_JfWHbt#oTʩ&Gٽ=N(LsW{L' hk)xAn bD(Jc_ڬAm~_5zHsZ>D?Z95ڇ&K:ASDCbB u'4D7(GhT)AE\wf,wmTz[1-G:mJY /RK) S?SJHVJc{ܘ{|!ZH!9ГAmOڣ! 6hIt*`{%,ZSUECMFkAyir5o0DOV/zJvi"X0B°*w@k>ҲM'RxKj0EZ6 o!m]ŋȲet\8JJ;RhM\6m{slJ Ig(0فҢCM  > umĔ~ NYxsqLѿjjK*挞5C$-H"EF_ͬE Qܾ?G6%=S |C2:`a8uع*U@2 LK-ܤ-Z577jARxAj @/[5F0 vYM4ۗ@7ok8imz@A8CHR UoVK`@$}oB\/ڌjDíJ\ia1#m0i| Uv䃲 ̗yNѿaYLc# .e;u-T{VF90^s i*pNStf?ScxKj0:ER˶BHV;Yԭ1u9Bަxz@AF9CvCĀf,YgU!ɕ8lr"\流+kVx'?oU=m;1pΜvUޠL*Z4m@+CiٸJ;z5RxN0D=ЦN8IUU$$lMkؑQ+ze3zDO%YZ"WJu @*.eٔl@O6ڢ2uVUB*FM2]yp g0nߣ-eW5"{^rΔ{#/Z3͌m= s]Ԛ#Do4+@띍d5#ȟ(&CV8ݥ} ,҄<x0 {=][^;.mEEGIiX|3bX33Pc["r玝8y.) E:bTq1tn>:쨳1vn g[4^';&粭G{жtYVm3wƌO-!H¼C… HJWΣ a9rR|hȥJ*um.X;qnR'C-id%3U;ຖΥ HWNoFIh)@ Gϑh ?!Hz3xo,E4s<|ܟ WmQ^/ߑx?O0ݟmi&aG/Z~Vۣ"rI$}pfdS۾~ԡapB,8ٮ뵝L8kӶ4zT^$g,NgL|\~G`?WFŽ~ha\:սHK7Z9uK| 'łhDJ>G.\@Ed9J8RF:yL@>R‰ HX$+ziH倠P:h:zG ǫBTGEDw0g3RI~{'maԄB>i-D:k9rYm-p)ڼ -ΩiQqHV -dUUK8ӕʄqN0-вGa$Mi]c? mX jJKܚ|[^r+Dgcfc_t?~?}>߸+:Wb+xAN0E>,AqRUU%lj8lG#`/A5NJM)ްdn+&^ UM:juJƵLj9Vi$[b̼Nv\y[9u b@cR5la4MJuba⍟}م2 &e9o @ Jxx7?T/xAn0E>,[U 18AAYc{ VL4q$}GKIoE5]KE =FJZݩMA hsv+١uJ5φX-J (t ri{Q"^ j ʓV./r% r@')Z-,sSe9 fS-\ BZs>+=ʍ[}qpqm_x;n0D{b$H$Pa8./$iPT9} RaS2h(m3JjmKℙbEƙ'R޴M[uZ7J\': 6||'Èj-4JwZu,¦qR|y3>!Ә |N#|&{9 x,0 . ЅW*P< q* i.Ѝbxz-OpSo EK@2rzGzC͑C-Q#oO4xJ@)Ν4d󷱔R[DKAA굜잴k=awcK 7s1|3=hyAyUy!ˇNMf$)TU+*(3Y&F"EP*/ʘ\dJ5JW!=`aY}yXTuQ\SB0iڟ[m0`Gaj6SO0NMo5aԚBb< 6m xoӑHGN;<9:}o.г;Gd$Blxxl} Hv)~ݹX!xQn0 +xLk z DȢ !\!̀R;p݀GsOG1}*X) Lg;;}wx&h$Ip+`2bBu<'ixz5G}4E[x9TvœC;x^ ؔz7!J~P0\]8w0{@ׄ){g.`)P[[UJK#Y"*2V_=<?-eQg?xSˎ7+JcᵄE։aH-f_CHk[.]nsSmlv77zzPa#\{f2m\F-5z3,| GstS=_4td>9E ok#]+E{(!tIyY'Iv m7WO6\Q0mC%v,f K]I#6qGPfR#j/E):*pg*xVV,pjE%ezZ,uq3ˎ>!r[@vojFp<~Og~nNG:u߷"mpWccZfM;'h؝wM 궮+wۇxض+˨+T0P4砨.@0K4 n$$!T-<Ha,Hd+m}ES]+VtfaXf!(V/w鏶QMx}ٮFyr:ǴGhXl666^rACyLUKU%}- .yĢE``Y,+ȣY<bʇ|Y$`HK+ID&0 =/@1,@$pc0#E1)dj; ]9q&˲'y:[d=O|/?ONH3EnkOfsǚ­FխQ$4̪רٴL8ť#ygAY:Sc<:QuwnNʄarZKrAڽw+Ա8jq w,:Li6;yINrK^Zo$Ǝ\a {Qm &-.dVnK5=g{?Y烖>MgBҨsڌ4QjGe1I̩lyEњ{@]2~I9 LpO:jr;cNvZ y M{qS/6`_ 4voUޗxK ,(2Gi7·|RUadёd޲~^[ 8:<:Qx{'-0N~2:uLhDOsEpGxR>W亶c{q࡝[(?J^; vHvF05~:`5lxUَH}+mҲlvVf6`m(R (60 _?t5tFsK@@ O=g8Ĺc>)J8;FDKa c(Ҽ0.ō]NB庒x\Q^( |椱$,;RWFY^"iGayyYZh0EhcJX]]eaVqKi l JN4SdYQeV휐sQih uDe߰lY]֮ >_[̨%h-ٹJ~y%lxg,fsMkIǓE#l6?r 5 Oݴ&m>%y.rfzqi8^WlKF@:h\ ̗XNۮkOBVEp4%^#j=-oذM=z]Kq\5n2]M(15 s{J2%"C"Lsw_TiW(d/F <άps ߔY3g鵋57 Z'@g1c[W(xƇ{g+W>`yN[)xETU| P3ج=MVz\XQ/3V!.UggV ױt..3rұU.습@;=>q u[,yBm~&j>jPH.݂B[ ެ9g=OmE=U l%=w#%F-Y`5N>ukO +l)@i)e"~fƎntNe&t@$ӫ^`$O&K0HUW\k8 Fw ^31JQŨ hk{?x!sE~hR_wT(a gR|(Al0믒FUE^'߶s9xIN0D9E/B<$n/[6p&IyɎ ^F!5 vzI唲L[MZ?zlwPJ+Q " ,Ht>F?&cBG.)kc|NLΥSc=Xz;HQnV.ğ¾Xwj. Js[-T4Yb~TexMN0>[$oK,'FkDng?T,#2N($(nԃV+z<;8OT-O 9]GIc]Q_?kxAn0E>,QB TAYWabUǎWeź/=m-ZwR[ܕ6uwwUU/&d Z*#-ROJlJNȀypHD\/t?jUJ4[XmY Lu=̉N}"=3 O`#wfs#W0A1$Ӕ88 ..wF63x#NQR8)(PȼLх w=OIgB Gfq6iN ުo1dzw84!'I/oxMN0>,[FNSUkĆ =jcG8G$H؍ͤ ԴTV-R+6J"UF ֈLVҥE[,f2R꼰LѢ8.Da7NEٟzt̄)EwR.%ԍ1mO h4Ôx Ed`$ānnb `C\_~c6?˶JJ׀Ez]| ; ^eBi8oxi2k`?]Hְ!pS)ϗxMJ1F9E!&qVzqQI0mЌ3ˁ;ؕ"ngP~ŀĞTU,Yo+}\]}-E{\Wj‚7 nCt9[WK\u-]_rѵ<&!V,#Ƒ&aڻ4?Pq8VG[ŁZ>N(V2kuҐc&L U{re1 LνwRU%FIN~QI>tZcNVeC`LS`[[ \U/OxMj0 нO}?JRJYV88#tnFK1 yLH,"@cDt'=iQ4l=98Z'\vxyZo~_qN[1Ѻ}< 13]3Vh4 AsO!PxA {&jRJWvumC_zD@3 .IStD6H;v6,1$$JMffr$[ؤ9MQW4V)u7UOLq %?2/=\Z޻UJ lK@/ ,H}A PߟxKj0 нO@/5 Wl ؋޾#t Dxˋ-B(ޣt4gsq1ݢ+JpѺT'u coko=/]8?r0E5E֚j=m *<)pOSa4EX/\NxKj1 нO};K(,k:8<>xsBɎjN`$aW<K%R꼏䡯 ޷ cHU8/RVɂ6ZHw5_ k:޾!E)‡EksuV *pz]Oa+P)xA0 _BʒR+l u/ {@bfo>"PND)CDL~ $-ȂYxRZ.N[=صp;a#?UKiB#|!#j}aۮ7ca ̵i0-ɤ?dNxA!Bh_@~!OkA!D9%^*;q!Ī1'roX! F xsD׊q r%'́Yz4)NM/۹mx^Jow1Qi \z]O١fgcP*xR]k@|_쓭X'J\;BKC<ʺFUí}I>-30;FO+,d#W%RUj#ee F EPZnꢨ(/"ШMY(\WlVkR[6;h*ʲRkYJ)4O- 밅4×t 3{9LH Gh: . Ц!_Ú0y=Rc_+M"O yrD05Ne:<Ji3N6D?[g`GS9D:=; Ğd-;L hv+ui;t'&(Kӷ:E"c7 \{f+4 I?/YjUP+xOo0 <&(ס{AIt-Ė4Jo?Ȗ.; zdd"yVګ^e5z!W}KFhUCCC7Į+}Țjvr0w!yr:vhmں&o\(7&F?؁q{LeN |a7S)o4#٨ D5h/A(g`8oӓAP9.OWId!@De0qd]q9C_;nb!r<˳J3MZو aLBi"ؼ'bC甃G>N9.a9I<u)> guL~ZƑ7jЀ]xQj @=|v)QRޤ: Ġۗ-@KbLQ5A43'M'<،.%Km@7oykrL6x? /:D_`aU}e+;GہUhR+xMn0:,m)Y (:@Eh0"GC'n_*, {pRaՖMԪ-kq;EG&$쎃d%dj{ъa/jZ*E_˦;BfГ-hn}Rz*$ϟlں9ǣ"<:l mp43W~x` ]`=|PfY?VD 9'tXeİS,^ TD;ViO_,8Mvh5>IIo=lV<5rxg* >38X沠)pofӁH_8MꢅM%lְ#;-whj6N蔓xJ0@}b`$_e2؀mB½o/w{ KvkTΰIl=)R 9Vt|LpEKj);%8GZ^skxv^Oܱ~RA`ju"ھ9E'7zɐRÑ!d0`]i1X xMN0O1V(9U e[ c{D$8^pDNU@%6l{#t3[aDQ,UD^R)3ʄd 4̦TL\VVq."QjTb8|v<9ٝzlv-̫2<^qδ6F.꺸hf l00h蠙ꝙ:b,{%t ޏfRŕ@-YO\Z=8BAt?>> \z=ƆK1$ ; O#+  [=ľWx]J0bAfiDd&7M&^/_Wi]Iy9ǐ0`, $YUF,'h|t;'(fB&iѷ7 8DQܞSo@~1 Oj-? )gP.k\v*+K.&DT™xMJ1@}NQKEh?$WJU448ą[7*,1o1^Ȃ5ԣwlI]Q8T LHB^0-qHqVdݒkܩ? x_Q|N7}@Id&ˮs;̵|VYJ "%3cgEGit)Z`1d!HE˔cZт)=tАPw"\HE0ټY.8LMci(ˢ+ hK% P o ג=^#i f_{+apNTNRhW[5q3(ihwM a+@|S&d3h,A)uO<7@@px_^q'V3U 8YbVv Z-'1paZVVdzjShY8 t}#j}w7_vw뇏_߸t׿񦂙nO:߮{^.հF{rA `t#l&UwWJK%ذ uJxPj0+PȖl!io-=V:6ؖ%})4eH\"R$M]r.j۪-IK0ҜZUiLc*%Cmq.eS#Bx@qJjTY?MCJwݶuiOs!,>C%ɻ<c\"a"wߴE R𬀏V|S0vy\t;eC^@4l7~Np}0N8>05 >xKJ1EYE;IH *ISٿKN8\=EOKtΡ"WmX.Ӓc)!9MgSMώBRh|1e*ޛ~oY۾3mǼ/`2`'BxkkS&_(+oJ#{?}_zQ~'xM0 >3h\؎m)`P%&"K%O&zĞp=~d"0h]7mwhC=RVv^wlcbAUڴtΒUgR6Z;Zۮ \02\0 Tk`Q\ćk"!A >>.aDq998U?WƼ%C²Յr*19VETm`xKj1D:E F̨5{!dђZèu!G%3؁13ZkRrPnv:xpa866a"My[Gpypr~iR.E5VڞHZK*hMP[X\᫾|_wQv"x?o0Gw}4 (UA ۽ rPAxIJ1}(IgDDJRI  }fg%4") *֤vU)'va:ѣ<mB* ty8:cEx+B<>sF“8بm(?% "34ښך+Љ>[`]'?9W^^xKJ1E罊 GDt{USٿKN8\9kVh"%Hg־̾YvSdxMQd6آ1[C%1QC2b:rOx1 X3m# \)rٵ _ QP*V eQxj {b-FR8`\B^Eg=#kk:hIctz a:K(LIrv$b4Qeٻ1ցN96/_+NmFoqN!|(Tje ߞryqyޅ$:ب'*d*tY N7.'z$Pjt˗axMN!@}cp)Mh3s{Gp (7MqEŇqx]+Lm., qD4sV!(aRt\8 z.]2[FPQ`5n|8@o'[E٧wR>^Km H/X[e <#wnUfNU!{iQę Lǻ->;e@8Yz{?= ++kMjoM7=ڸaԣoԂLIM{ݖվzГ릯i8{2L1!ܮ|#yks|RKil1G+7!yƋX#8\!#;x 2cV'Zfi ~B(/?s*SrN,{ Zar;Cv xLV!oİ@HB#7A19e2j7tܫv!3Q!H@|?Q̇s&WoP?_ʚxi0лcB H?%Yy ,gYwH >xAk N^J$YkQ$QFuNu0&cd4&lԂs;; +g'?{yd›pB,Kc%f'*<;|7.4v|B0y΃/s@B8r\_c`Y#xN#1EMv jVD@]v\Q#c[&s:k=wޮșܪSZuA;fF$klk28havovtXL V  ԙr0S~^i "=qrcGpH<Fo3 0.%L(MB'bv"#YTM.F0"UBNh _xY@DdO (aD_|!B:4Kx"\TO#D<*o[viLeΩ=ؼy xKJ@}NQKE_Dܸ *ӘC'<OHէ%X&˅ǔٗM56; m >:)^\l bJ#[1 O xչ Ar|\w?yZ-/`SɖZx0ɘum=pݵ@PiUox]37 }[%UDx]J1bA2H)@Ї^`:; vȦ כ* R fLi$8%h8.XDLIBR2<umnWn߼0W^Y88`.'?xdڻo~=?t87V~~X2xX3R`xKj1:EF-Y &ī&Ԋ=Fg6œbM'F.9X]7F;/}@ Rd\bvR4{$fioH!ƨcsbW~VKZ 浌'wG {QqxAJ0}O1{?Iڊw^a2II+xtfP Cdq6!DFY& vM^;>e\7_̂(Ern6$x߱"<^w,#4I~AMJ <׌Z8a([;|Bxor(UQJ!3n2z?xcxAJ0}N1{A&ibR /2ۦ$o/p ^&-3,u1R'IMAa)?G5d (Nm(ff6t6B[NmӺ=s.Fxˆh:c)JH+5keQ]k8{Y—xMJ1F} Cb*V""J .Rj'Cry١ cL*FIS aD)CW qQstQ*"q'v9S*^Tݶޛ} kR6R<%$xdh~o;5kQQ9xRMo@ W+4dU{ph3$#2xߣI"N,ga"hon=ܷkմ&j(*29=4ձmNS7RTbUwjL# yA1@f>^y =6U}xW6eY(o.B>?cof#5h&K y&%oH|4[#k<Έgb0v Q==n0cb:NqQBL!xie1k3,!M /"+0EXQ2m[0 5y*)~^ ޜrl"6ʻgrypl[,ň#8]^%&psu$LX!,%P7 U4gJ 'j2BJS>W#fD^o8͔iژQizu)'Qh\O[ MOF`9xn0DGN%ٖ(8AQFYcD ˥}A9i ^IΛUj.f[o֔ʴeq׬ZmzX6eUz[w͆MSacmhV-rݬ8b:g_#ڄUvVjKWe[ ѩ֒ $8Gw`.x:Mn< y{a8}Iب3 OR7 BP{ꓳX,~@a< Rq}|byJbItE?{x!ΐŜhd?>LQ4U\əJsIBͼFF#.]f [^4}D0{u AO灎`1[݅qrlfĘO.ƄHl$H^.Vx:9"{{dYK1uci@FDA8xKj0 9$GUdIiql{n_^f1&&UY_&Ŵ͎)mD(DSWMV[%U :k@+hG3{i@֝ړ.=_8߹O}0G|{i uUmpSΠ:t ֳ;W~+Vx/[&ai4%Cq^srG^QxMj0 F>ArSJ;.Hi~76<>;T C xqBqiR2] JsC5TRZ0>zlu[]eޖWBĈ Ϲ.L|g軰),֢*z^6?=srQkx;n0{b)4 #W%H$(2to] RKd)>na伔(F](fFQդQcvaֆؒQtwսK7yH?^wz}C:|MKpLCHF̑uYlT\ՒxAn EbU,3 (UKA/zz[|EP >,LstQID51GCHff.Q.dDx[ݻzu>ǴKNu8=A;On^kP13o*]]reGܤ߸0*d$lET [xKJ1EYEI"#݃8J*SٿKN8\=E`i;Ң#1rS6kCQ*VOѡw)ejdWRICSo o]'kѾoD|z|_Rd:wU_)׫<<*J[o2tmuG|~@QۗxMJ19E텡ҝLqVzqQIU0m R_JUd[ 4qEottvx Sj(-D%Ǖy.n5,M%&3xʡ-_ڀ*!V%#ؘ5|O1eG ou<{y(&ѣuwMMUg5Y'h ZȗxKj0D:EAeY !$,1u9BjSTQS[(82O=F2O<[$;rhsJ8v5]X˾;>Vܔd<.۵ʿ`Uޠ3[Yjf}nR>\>QhxKJ1}gRA*T=0|yOInE@1=:ZPr͋qpHF{r-Qsڈ>RDv)ȼ $WЗxKj0:EA$[BHV;Y[1u9Bަxz ''&ca˜4,sfO HȂP18mBS Sp,I]U/n+'?oU^y[>`/9RU_Uޠ9Zifh-_iuWrR}xKj!н@P6 aRZemav9DNB.73IGУMF*G6c5nJ'eBi]y:IqbX͆%K\wlO}Vnxx/7Pn3N.pNJKmf% =6ܠϐ ͓ ,HF)~\xKJ1EYEɧARgToWNf0u)%#lSĩU.md=zQNJ-qj]'`0d9ʔ~{F _&>ҾiŨA_S]+VṭaXP c>ǽ@KSxMJ0}O1{i"U&ɃГ~&ޙ-Mi\F ! [$TtrqɲIĘ#:"'yx6KΕۃk~b-WZ/Wjwߦ=ŵ6yq&Wl|JkR?]Z^>"k~ (W՗xjC!F>AV $J3:6G|p i968$"&sX鴱qNAG=rR[]^KxHӪ*cM 29Zgi'lP@?9! ]CEcLgi\-+OG/Z#};INO0< #Sۃ#)Rhc~vyy=) wUNx;n0{bApX@$UVd7!(KrWLړd3^$X'1b0٥yLźlmۍڄ?~.GlyZÇQ?6sV)CD*>tV^86SQ(8krF--XpExo?yx>Qɏ9mHNJA%kk-h)r.6/> e&+̵d3 /3XxMN0@O1{D&!@dW ]5Ǥ‰ n{M+]4UZY)TlK-""Ӝ]kuk[Rl5kG)V6N \0Q8#ܤ% ~et e'׭R]]E0a9natK aĐ=x/`‘@s8%bO)C5w!9Hח~t?lwCð t R/3$#SȦy(xn0 E 5~An蚖PZ_iEW ^Sv,u9b?u7i+McG)"&jɎ8lǖ:uI9J+X`8cZ#<)ӂ'x J#|BeqէZX\ 2K : 6$0zD9p-.x21h[ ]' Szsol0Ȩi\o}.| x,c?n6 g'2`Ib6Vc2pveWΓsiyG*=S"i΀|5_+[jJ>5~+3At?AT2hPn/xKj1D:E FgdWB-u+|!GHmQ(ٙiqADt`(&D*&.9*6y=DӘXb^19 Z7]U>{G.pſTyt|&C >u"/Y/7Baq44૽~_FbRJxMJ1F9EdJ .*U'Cr|١ %D$\cC>BHg >DӡA_1P5)^k)zNRhm;(ֶo_Fymyr cFxNif:;>c2V[Z(&G;|{ہۗa RxN0D{t's]A ~moE[w!ռND@%KۍTKQ]]Y%7ҨZ&[RPjM/BY딩6VWgBL.)}*WOX/lZ5]$FJa{=I)1:Ȕ^!pR"Ðg택G<0"T1adcg'oۛ;XJ虁L+RvL:c%ˋ\ߖxj0{=w:q!M@^a%O2 roRN7|0\YNAYIį+pGxiK 7&c SA{yocqxKN0D>EKl@L|BH ~h;Cb #f`WzRR mRTSJeѱFRۦؖtE.ö6]+{Th%u*UWEC% #`0`\!\9pܓ݄vܐhڪnR5p*)i9ڢy +.(ڐ~[oFtw:HLsyݬ(9xn\aOsʐa8v/^O6¥c`'R`e7W90dp\ >K['8Rp`gP zu}}aIi҈nI4o(38/>P։#2`EK)˜3vTnIHf&Rr$Gq`&<ǽ+ 8w_U\ 6.>\9x1јz=) 6Q|~s/8>Y/dc  (7 /]XdxKJ0yWqG|q+7M|HS3 ]8AR$$H .in$$A1.ioCm`]/xxAN F=ſ5R1&spPh(<'$FZp+k0v&X'ubV+#X a}eBGuG=Bc;ssbzޏ ׼GzVCqy]Z D="tWi,1I.SGKv[w.+R]rj ?\Zbw\.![ kxAJ0}Ow*bIڦ?aPpBO2hӐ&<'$€p= a`iR&,+02Lŧ Bf5*m5rGd4iXmVvT.{˾\R\z#H< m]c Q.wvٽپxwd/tS!&^`[\CL:i)JK)S/fx]J0E<*KۤM""Nd`ېًw @=ixħ5dhldw:2u,QÏ삗yM3KbΊ{ۮB\7.?|2מQ~u:O^F;J[JS\ߨWPp;UD@!ߪ>0ԫA2MaΙxAN0}N1KĎ!V\IN); 9 G`W3@6mw^DbvZub֙f㌵g탳)qЀ@ [,\/cl{)l'L/eߐ4$-gN+zhm$-T+qݭ\c-?Sƒk"D>P+hMT"zFPih/|R9WkxMJ0}O'i~+0$/3)I 3; =~Jw&a˨$LBĵWb޸qذځP2$.ڄ]$'%MBG9ޯ6ڮX"ھQKyy %Nq2#XiYtlaXl1)I%b%)-Ȋ$–+= 5­o-sW60Hi.gY |2iL~0{.zvIs,:tRL4~,LcFSSz'w$o+A|`G 3iAp4u*š+QxDh]O m.厯D+IcTY}!u񹽬M5 UoswzIgdl՞ןyY[dͨ49$KZ(bF1Jwlg1Jt>"6ݾIgQ v{vǡMo`p!_TX:l.YZLPɴ eg60+$a+F~LtY Y?>lvOv˷!6&^OC2zZVla:ZU?| 85WX%wMxKN0 @yW! 6!gZ6>EBV` L*|d_́fLς.Lj-L(S#cu6fAXK_1Lt*P~A&W_wZ{`}.';:~Y>"7u!/WQX; **ԣ/]xM0{㮐cǟ =XNd;r*$J+a"1ƩQR^ rt~8RX8FV-f Onq}+`cᵝ?-uJ O 1=;o*T/+װRxo8}Nagh .e6A*ж!e\:aXxKn0E\ŝFXcx6 OSD" jYf%ܮӋs knjPV׼i!] kY ɍeݦhPu٨Vu7HU mW ׅ9>6́e{ؕmW7ek|Bi29`N"m^/a<ѓzǯHHX8;g$&ȖNdFVsb<0"%sd뿸`7.C{NSF0Lb篶x7Y51 â ]S^1`%'xQKn0LP[ %ˢI ~L,Ia_{ t`f@K&QvESrѲ+Y)YXU:< Ja]uVE%;Atj Bl Ի.h)L b,8|b5ctàSB7 )' F0Q(hX,!90>h)2l[wV#nGus%C^u?9, 0h;E^6(ghp'uF[>9?9{^yc ̀ 范7gb\x uk׉ʔQmA7dfSOl ͏;Dt6y-\ypxJ1E CW^-"JA\T*'Sp8z2s03-E@1bgvKAe栓79,-YFb0T1^'e/Ƿ.y__b\i3]*K6yTQHVڪph={?=~_R$Rcxj1E+.\l !R#F`\I }9;uJL!ePY+EPguJ4l)2 G*>k #zG=9F6 0;oW\Q~iNۛg g[[DžOD8ȏBsew>4pqz GeExSK8 lHvA$E%h1XLr!s@ۓ2;`z?&!ݦS wM]S57m]CU[lY@!`Mn UgV^5JnZl *1,BrF*dysкRmզ?M~o:2#0PH@h3b7Hb$* 0E;g_}>$} >r@!XХ^YݕnZH N(bsxQ(r` )nBo?K;m2d+_.XB֓L0J>α:^ p'xd9ǏYp_dU'Hr VkG(t} U z <0MBbyO#M\xnAD+Z_J E1|@{v=dnh&^G]5*GT[]m^IJV Mi׶Za=0jZ A6 |8!9Nަemwv۫z7m׶VGq4HIETp}AߓncwNH95͂ a:LaIsPHD߼`3v)1,CV󇢍P<"-=ʣIٚ Ô=JG+Grlf 1A8 U2dK&E ~qKjdrlz6[S]Wb`d5~)ǝS`J}L*:j@" *JP'ΕwTcY6 ߸>~;u;s) {g}`kt"p3O'JZ(R̹%'mL:dY6\ƗxKJ1EYEɧ;t:gToWOf P ٣SY]ЧbA'o Zs ".(9EK5P`hm?Xh7x?~7 8LSt!T_)+?8*)J[ځ },^wv@i_>QxKn JU`BT*1MY?snGUwc.EvŊfJɺ4-Qc@ȹK"K*6œCH-Z;Щmv^MiJţus2i2R}Cg?Z2 ʀ.N{}[=;1W˜xAj0 @}N}K؎R*4:620/vJ% ѷL&D!'IY4=#ςL_BVPxIXg'];ҔgV &udE|se m[@:a;ߴK˚/2Ӵ YwB3S'B !Ws6[q+%B6]uӃ|o+<2ݽy|킈 :2ah{MT/޽ɝup!-[6#pQr  l#+Y9, #*v 1 q/!H$ 0[^ˊ=̛ϯKmN3zJgPL-+F;8eeȤbY*ks`@Ty o3%>륄\Cnr񨖺%nhe+-)a5kT=Upn/)(居 H^Mi/j!`Y/祜&c+(Gtbŀf |@up ]{?yV2v/͊i:+zjx`桿TjyXm_;cS+5*5c-pH4e26qg*5Y9Jv|ԧі}+.6Ka5t2סCMxEUme>~_;k7/APTp<0Go$`))^|txKj0:ECLf!WiOc,'g|EQZȩOʐ2wI1-,{/dk%"r*H.>2~"=۴U۟qGn6ClLX#yen S3 G^_ӧeq2eHY̐xKn0нO1VW0LRn_GI 3ޠl .| e.DHx q4Kmt֛kk% +.(: ۝䤕s?6-4͗ܖ+hFgGT-;U~>@ҡ6Mܞs;,L:~enUxKj0нO1B)e9X"$$'/^o4f@ƓH mˆrFJbF",1Zb&g'fDXK\Wj/~S. %FxC8i ߶{*[yY#ns 7tG\c3WExKj0:EA%BHV;YtK1u9Bަxz n%GsXdv:dUp1'ġX {KKstYRPvwKgZ[{׼-&Ş3]+6|7{!Xh4m@kyJ?QwjENQ< xK0EZEH\EQP|vl%%38E8c¬iOƶ+[˅ltr‡\clq2C;swzZy6*V3A0zEp'@|ܓ8RWJބ ;f;sS(B3m{?-S לVsF1|%A_rMQb׾%9"iܒ:ɛiabgh -x Ά%Y޻|L"}9mc0!ǔA_S]+Vz'G°72 oƤu|{?/ PQsxAj0нN1BGdr+6"#ˁܾ#tШ#IFeyM2`٥)#Yd:хuȒ(E/iy ]sGȺ}Zn4:f=woԆj( :l z~|V,q$XxMj0 F>AI;D`bR"# j,1bP5FƄcv;\3Α$L^x(%*ݷޫ} 7B|v C00{xsK5ŎWy2֪ҬZV4l/ gS_xKj!нeB`30\2ݡm"\ ovf 2"{zr)s:#Z4|MPƠ!ffB: q0pɧ͓Ckvt2_nXxKj1:EAiB*C[걅3FgR˔n 5G3y2Ax*ɥMXM59RəY{m7mo|7 "m[ykrZL.uE.MuV0,tBlurh;vUPoxAj0 @}N}a#Rzޡ(Nx.zn?f' Q)e]dLfsM;nwNDLr$OѓH2O$>|ڱr{vkcٸ.RwpqL ^pBn[wR^UQwǗ.+V eb=Tx[j W1-2>r2IBgvf1L{(+̉n$ϘKghHۼIEܬFbn*l5ځ/c5^_ V"C^WErN\d>!?ۢ=0xRn0+Ñ]I 4hРSȦ 䨉%ùD޼$)"G"ڵ]՘f+Ui6MٖZ6lDH#I;ʺAݴܔuUJYJ^f}LsB+VͺڶJYBaa|b/>/ yS Փ:j lWhO'IZHC;}L3:7A{zWe"Czz`Oy!%)YHrT ^gG7`Z3/ pr5\YHBN=D8-O7МϽoOI:S,l.f_OJ :2swT^ vLiHygu_KB}q ia?BNYi^3<>RpGV-o<ɖxtree f66962466784e12476a8cd3a1ec5207281754dba parent b31fe9d1883ffe28138ef342d0dd6fee5dd99e85 author asepharyana 1783609758 +0700 committer asepharyana 1783609758 +0700 chore: add app submodules (elysia, react, rust-auth, scraper) b,W x5tree 2bbcc48aa06f0fd787f4d8fd9861d38b7e4c6889 author asepharyana 1783609706 +0700 committer asepharyana 1783609706 +0700 chore: initial hub repo structure ,AtBx340031QK*-K-*cfW*G;V2_ [:sKSR&Lg9f*Z [24Z_ʰ[xc}E]b,hy 05%$(9?/-3!}{CG4c83?%I =r<֘dFyՄ0Jn2(e>cfŇwq O)I-fx&rJX)]'PQj]vfN>Cmܿy[, O޵CVpE 7Ou$lrB.fɰPA!!Az) 7Ox5o}v?0!A U5ӎ:ڟžlTBU9{8ԕs"Ov_SY1bn-n܋KhiS0E~!AN!~`\Zc:^q:矞.P>ή~  RӺb7}fF;Դ̜T*}hw!',5۠j\]|h2YPqObAA1+䅞%֧lb95#)3?7U/7&.Z]WRyY<`Be`n}&SSMk$nXL Ҟ?_l 2ܽPz~#P#r>Xoj|QTeV0*^o?n[_]r2ҊJ\TRb2/wo[j$K'ި6N 19;1 O R7iA,+)M+fXFm&u5dQQ\YPR >?nY6{]P7x1.3.11 (-x340031Q(N-)K/*cv>K͓ZSDP11̜be,۴>g0rxU͊0)co =x]HzZBPI",Kb$'%ЇI:, K){|37? 'ĿFTDj&$mGi\u6/󻪸B F)О'$* 5m}>SX9 A JaDA2GB%1CS%19}];dTkC*&L:UtMe ̖6OYA%c9K[U*pAMLyk#^;B '?C9YA߷c>Q=|ojixϊ\-[m~,l<)g6?1V`W+޻0?WMdom,l=y$\Zx+IqEyL}Tti~@a:^_E^נR,Z/mOH/¹; Jʹ^?ZDl&#{(U,Yn,Nz|?"3m1{PjvatKkx342% 'R<(;-'g.5]^(z[tgPթ CuS24HÂe<s.Ew{C2JtJsRAvJռ:$VU_/m?g_dx6.WB6FދġޛUꑭ?' (2PC:6ԕʰדx !3xQ"? jieO5TnTWȤzJ|7TxUnF}߯@! va@Vցq>A8b/Y/dٱx<kAu8g&k!F5A.?2lkW0,Ѵ~B¢-?=pF'Dĵ Nl gpөree`vdD5A!+& Э |A6b݂+҂Х 弁 VZ8%e|Ɇ"nPiGuNPB#p̕Cn=|+_vh ;6)l5X8 Bui҄#ʑe=.ͳq>tn٬o#H}Fv -BF 9_>.BDMJ>*1}2޻_ؘX%)G=J)1efo2DrCQE iI:W#ru=ho>;U)B0􏨏nBUOȵ`x5O}3@) $9T/a l7>>JC7ruqu E %w a-b3 gLqMGדc2\T܆I&nX2k J+n{Hv~uuq׋˫m3{!ת40Gμp W!32G낶C`A-ī $MeI5閌j$VXKqH<{R$gmڏ~4K$M8߼6T݄ &e<̇ p?~aIAnӊ>322-]AEF5{v)q+Z]UPFp3ܞC n5_[A*AkGAF0 e˲cM8 ~_!)ťc%YनR V̊&{q EBFUׁ7P1npvVC!8.eeggAU;;KW{pdW1u %Pb+P X,'P Etbh'y%AJOUHr+<,KIٛqZVw|Lp ]Wk($zr8~T艵ĂU-kĮ !|+V_juqR]$9U+f:&mcVp/qKa:+Nc)k!r'E%K"orkEn=Oُ9Sh=p< "iŢ#i Ol/Edlt:'׳ǻ l淣t^pwy~n><>F<'J\fˌ$ŊFjI0] f뵌qx0}{Ī" BVikT8uP^GER^ǽJVEFmoh'iVL_A%'Qglp]g~S[o И&ya;$sbT<MG1%SW`pI;xp p7 &YR)&"cU?'*hH–}߻֐eh-`QnZmRcRk*І ҊT QC9</r,I@g],x&qYb_f~qeqIjn6d1xVnFϧ8tMI-8.\MۤŦt9'"gعXIsh-!Hԙ3߹&D`OЊə+ #(>.E{+01FbqP/9g/.iQ,([up`RP:b頿ֆ;Rf *۬]nƝ'H÷Rh|Zh)w HԬHi.Ũxtf=|U_l| !9srk9WGC@}?z8}x\ϿCz]1K˝⨂wPOpe6vJzm|:,IYK0W-i3B[p]Q@$ vY6IG&vxh\*Ih rVUngӬ0rbf[!MUiJ۠nǏSe/H*Uݨ#5L+{$1U58 }O3Y6JG1CUlk6q9"_m^"3}%Z['Ι)u)V2[nyX%'8 9geO<дw3lG~2! ·v8S?r *WWFKZkrv׸_?ul_n9udhwӋK^x/Uwk 6{ _@J ="eklQ&?=\uY[](= 7|PSg{@l Qtbkw)Ko,J.Qڰgo%|샛EBd5^nD0RvpMv$N!pDYwrqBؿG`lƠr,0oz[[R劢7zk^[;(a7JO'uMdO!J\zk,Lh=ȨlĔq]ǒ>x,R7eI/WZM@$^t*]hh}K\!_^fyw#3)niӢ(>+2V _iA'9g) OuxV_o6ק8 =SJ@tMl"Z-B(S yܧ'ّ?-6۰ݑU+ț э&bdZVjWѴkeU]pJK0ͦT UPYb+3\^Tpl"c2|yx1Dgg^Fni?^h]^gQ1HCG) j S٩U4%,.TO,jird#L+ôбu3Ub<6=Br^d:9 Arfڊ9SYGM#8fw>^]DNO YMVcy>ĎVV5eMpds!ŵV fƪӗ}0b>9%7PKQ!j8g}׬{E Z`!hM2*i ,׵04=͆hmIZ4bJdT;~%lz$gmj%*O4dJnJwEʄ?s늄^}eC{g%1dK.I }zW+mߣ?nh*pxyf<ޭ2#d VƐ?0WƢwK3L$f5[;ޖ2b6]=C\QwycKgh䔼ï`TPL[iU !4gY=R3Q?eq>Ȉ9 9r/V8>Lk'e22ga+6%v3O+j'BL{F8DRKqёUG7e^!W#(PY<znm'),}~q 0Mrl'-$NJ5lHMm~ +p1j[nXM A5Gxqom3-/t'S%CI7e O??ps 'WƵE0ie¡Oa?hV~Lid./m4 o naIzK&y/Xxc**/.git **/.gitmodules **/node_modules **/dist **/.output **/target **/.svelte-kit **/.next **/.DS_Store **/build !apps/*/scripts/build/ !apps/*/src/**/build/ **/*.log **/*.pem .env .env.* !.env.example # IDE and temporary files **/.vscode **/.idea **/tmp **/temp **/.cache **/coverage **/.npm **/.bun **/.pnpm-store **/.yarn **/.cargo-ok **/*.swp **/*~ i2x # Editor configuration, see http://editorconfig.org root = true [*] charset = utf-8 indent_style = space indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true [*.md] max_line_length = off trim_trailing_whitespace = false RW7x340031Qpwqs f蛾`%[X [`(xƇ82%WeڣH'B,B vu Ma8h]%Tq_gb=3RR RRK*sslQڟj6ϏMUYP_ZXZ\_[X 2}m_42ήsxqmy~QvZN~y1ìeVMNZe>vecL_!xt# Default owners * @MythEclipse # Infrastructure /infra/ @MythEclipse # GitHub config /.github/ @MythEclipse # Docs /docs/ @MythEclipse . xW100644 bug_report.mdL\õxUV100644 feature_request.md_yz!Yj/'7$ս3x=--- name: Bug Report about: Create a report to help us improve title: '[Bug] ' labels: bug assignees: asepharyana --- ## Description A clear and concise description of what the bug is. ## Steps to Reproduce 1. Go to '...' 2. Click on '...' 3. Scroll down to '...' 4. See error ## Expected Behavior A clear and concise description of what you expected to happen. ## Actual Behavior A clear and concise description of what actually happened, including any error messages, logs, or screenshots. ## Environment - OS: [e.g. Ubuntu 22.04, macOS 14.0] - Browser (if applicable): [e.g. Chrome 120, Firefox 121] - Version / Commit: [e.g. v1.0.0, commit 3a2b1c4] - Runtime: [e.g. Node 20, Docker 24] ## Additional Context Add any other context about the problem here, such as relevant log output, stack traces, or screenshots. _ ,x;--- name: Feature Request about: Suggest an idea for this project title: '[Feature] ' labels: enhancement assignees: asepharyana --- ## Problem Description A clear and concise description of the problem or need this feature would address. Ex. I'm always frustrated when [...] ## Proposed Solution A clear and concise description of what you would like to happen, including any specific functionality, API changes, or user interface considerations. ## Alternatives Considered A clear and concise description of any alternative solutions or features you have considered and why they were not sufficient. ## Additional Context Add any other context, mockups, or examples about the feature request here. yHx}# Security Policy ## Supported Versions Only the latest stable release of this project receives security updates. Older versions are not supported. | Version | Supported | | -------- | ------------------ | | latest | :white_check_mark: | | < latest | :x: | ## Reporting a Vulnerability If you discover a security vulnerability, please report it via [GitHub Security Advisories](https://github.com/asepharyana/asepharyana-hub/security/advisories). Do **not** report security vulnerabilities via public GitHub issues. Please include the following information in your report: - A description of the vulnerability and the potential impact - Steps to reproduce the issue - The version(s) affected - Any possible mitigations you have identified ## Disclosure Policy - We will acknowledge receipt of your report within **48 hours**. - We will investigate the issue and provide an estimated timeline for a fix. - Once a fix is released, we will publish a security advisory and credit the reporter (if desired). - We ask that you allow us **90 days** from the date of the report to release a fix before any public disclosure. ds'x|# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for more information: # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates # https://containers.dev/guide/dependabot version: 2 updates: - package-ecosystem: 'devcontainers' directory: '/' schedule: interval: weekly - package-ecosystem: 'github-actions' directory: '/' schedule: interval: weekly groups: github-actions: patterns: - '*' VTxO--- name: Pull Request about: Submit a pull request to improve the project title: '' labels: '' assignees: '' --- ## Description A clear and concise description of the changes being introduced and why they are needed. Include any relevant motivation or context. ## Type of Change Please delete options that are not relevant. - [ ] **feat** -- A new feature - [ ] **fix** -- A bug fix - [ ] **chore** -- Maintenance, dependency updates, build configuration - [ ] **docs** -- Documentation only changes - [ ] **refactor** -- A code change that neither fixes a bug nor adds a feature ## How Has This Been Tested? Please describe the tests that you ran to verify your changes. - [ ] Unit tests pass - [ ] Integration / E2E tests pass - [ ] Manual testing performed (describe below) ## Checklist - [ ] My code follows the project's coding style and conventions - [ ] I have performed a self-review of my own changes - [ ] I have added or updated tests to cover my changes (if applicable) - [ ] All new and existing tests pass locally - [ ] I have updated the documentation (if applicable) - [ ] My changes generate no new warnings, linter errors, or type errors - [ ] Any dependent changes have been merged and published ## Related Issues Fixes # (issue) Closes # (issue) ## Screenshots (if applicable) Add screenshots to help explain your changes. Mǂx340031QHI-ɯMON-ҫahmXòBy.'xhXBU&fg5l.ux/Jl:)P i9٩I@I9E99yz@&/ n} G߂j**޽N*r N5 yUYq Xk>ubb!DeIҢ̒J:G Nnrr飳"J RKRuKrSJsR9sevLHM&(sn~xtqb\`=ӴXpԢO" xPN0 ~2݀##B(I}4uعroOҢ߯nF '1 vX8D #ىbyktJy}I) O0Vo=d7+ŴV-Xf̲sh4'l4dVdm qBUeJvC+\xx@J\,wdnr/Y⭦4LBvp-o݈!xPN0 )|\zMi*^v'r?N:O\GŲ H≷`6id15P<~ĒJ-OݩLא* 2Jf1Ѳ^(䋰I '˷ BgcɴnV~}Tg"6i%nT+φŽ]%ob,q؝J7+&ѵ646B%6!"#8k"&Y<1Xnn<ʅYHkV14rZB-蛋|0A{"6nu >2W]:%zo>8BYbR(W;a{E)Kux:XpgMT 9a0 G':l&z cxGe sF?2m lq"qz!H K)d,O~ՐgXoR`))’g2bx@ ƳaԊ=L'>i32 X+ Q"*?[x_YG n#V^};,`H{քFsxxM}6@a'- ;FCmۋ"fγ޶\MZ5uY qڄ:^ u.Oε;ݥߦ&Is}7CWgYD;j 9qkS݃E TbS>{MT5Vs޸'Qhɍ}1VDN9k컃a,Cu=d";v-nz>*5ٔ)`uQ ܣvIHTS`' nD;N'"8KT~ră+Æm{u/ShZ;nb]o/48,|J;|Bg+:8eɎgm$ bZ]ܰhռ^Z#USVatSaDZ]a)|n۵w fMi24)nfmLFV'ݵݝ IZi>)xuRMO@ή (y͒*H zRmgNgta 7O%Cd</^p/ݟRy?y?_x:[U!؄G6,7$+I7G$%](#aqt"'i CI ely"<\f/mpGʈx^b}1 IB $„ȵ,ה [X z^wJnNڜq5BT`\M}͟6[7J=S+$5Գ+0<ظhmacs0:,K0y\:jڱ(q70z}X>;WٮvP,(:O0N~ @C`\DDW>p$(+ih:卢i7$vSbN)KpSۈ@A|X%dXX#~0o@Q2<XSBMqIڈ$.jLƾ"0]aC3&=q8il@t uE j`]^LS M{o;7B]=)NNgYETA$,ٙ9f''js=! eƙBъQvCʼ$xmQMK0W xXBzśԣl7iM2]wDzj TU6'c>c3@U[ R^F;28dXX<&xv,smh:<FԒM$LlZ<Qe1 :FlQS## @1+I2jwmgN<l0.R; |@#V'Sjsd1j^Zi{}&ncѴwݓ6 vl\ f:.\qJAх4\cU\\ڿQ4ߗױ~ Tx;2uqFk 9(=_!43'EAW771/3-D $C!X8( HP$?799Ⱥ&3*s'%TV:p>2x[{SO^+X"۲r< +e5BK|||zhgg{zzЛ.!ygFGԻRvbDc'"^WZ'^,rPoƳ,&id2u8(\%GS6Ի'\O' %^5G8J~<Y\ ;tv>pg3tXk(gI"ByvDKRw"sD0>.&nq]$"7I; 4BwD}"Ғ/A.]D|?mK^*ⱗ\{f}w॥DS?6FފL}R\Hi] ^x!r7B;90}gYn4;̝@ `*YNp.mq3| , pN*Hv܎zTŰeL$fqۚ>^Y2m%\h׳jHB47!>LH$',JRuJ{š^: }Ё tahϣG*$A|UZ5Х|eb#4jmK4x{דޟNVp6jA&O!`kTW>Z+{$Ԣ!U姮E+$J.ƒ cJpeaPVK6Eפf=f␎X Vޢ[-+ꕵE"f56`iH=֛e RѦl)5䧵^z`HlB-ow#C~ BC$ Fy0-[&2 :>?#tKA:7)w=6it,Z iTz6JgDD.E׼â޲-*pxuCR'8gɼBdjz~yܕ<}֧[-LdגA)rtCK,lBxqmhD0vv$SrcU7%/j57&[3rsZi 3knQ(6Y mǪy{ypk9n-oV_zP+SRi^#U]fU 2!BP!c妧c 7Pg$p* Y:IZ庵vj,JwZ[^gYvִt"5kg$t@){Dkτ0Յ]2*(H8$4 *2'EXLzI5=LF뎚6rO(Lgq%8;x/OX4˸N8)7vZ, 6ÝŦ31E>= =V?&!Y~ξP\/DLL-U2f/c !lt:/{Lʏl[K/~|1CʡĹTb(f%]2%7,V^QrYUN|yucu.}JL]5yzѝD7\'ZqZT8#˰jCDooΠ _!uzg/nn)ʃpkDՂy%6jȞK躉@ : P E"DuX09 .GA?J,/yl&7d/G80PsqUsѯq@/^+9f[+v N3T")R'"K;q.iV 94MlG).m `+kwx BSyrP|vHECF:H,7;8nXwV QI-4gXzֺ]A74(K$ a=, %%m0/&* +a!x䛋]jU k_TlXp$*bA`]DQD|&:|>T1֚Ƥtu`Ȏ_N㏉T斯ryrQQHܸV7Jvɔ uI)ґq")^><{w [:(ƹl ̲}sΦ4J0M@*}ו=Sli=ssW5:n/9%,Bhw*[ ?$9*rz٥#G;^rJ.1J=.EӪLSvE4"?HH^O}wNyLsh|T$? 4ɜVrz<.-Rqo8O7b==G:mz CGMR&N &܂S`Rc)泅<־QFwikjmûJ>6PgkX}FNUIϲH/b+q$(PYtAU+cl&t'Gr,,,-T7%ǦxUI~̍uw/o϶6?v"C_GQ]U jjkhr)Jo: Bϲbz ^)\cV2qk}[fQӜt!y7!HAS}ًs?PM {(0ꍹڷWfJNΗVP :QJNcrkQ/5><3w Da@ɫT  -W?fMj8:𸦻?H>;{xRАYĆ x͠XcNvCXmCjJ@BXǮt*>Za4.Hv?bf :ۏ  j`AA,M/ޘP p`7B\Pv~%p)4[e[#P*OnoO/)5۶vA 01X΀GőCؙln׃kn l/!Q ٬_ MqФj ".ebi-0`cjbB,zk+>03P(O-ݝURuG5k4}yR)U#O'. y B}4WLjՈMSh2C5`#Y5KURG:;;0]9#eAľe3,+JDRv9UT`%l{~? 4=|j$S>MD1!޶%2~}32~*lc\yBKF x.WdTfSM:xXapps/gmw/ # See https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files for more about ignoring files. # compiled output dist tmp out-tsc error.log # dependencies node_modules .bun/** .turbo/ # IDEs and editors /.idea .project .classpath .c9/ *.launch .settings/ *.sublime-workspace **/target/** # IDE - VSCode .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json # misc /.sass-cache /connect.lock /coverage /libpeerconnection.log npm-debug.log yarn-error.log testem.log /typings # System Files .DS_Store Thumbs.db .claude # Next.js .next out **/.codegraph/** **/.claude/** test-output **/**.env **/**.env.** vite.config.*.timestamp* vitest.config.*.timestamp* storybook-static ~/.bun/** docs/dependency-map.md docs/handoff-log.jsonl docs/observability.md docs/quality-gates.json docs/workflow-state.json docs/todo.md **/vendor/ # moonrepo .moon/cache .~moon**@Y4x[~}"KԢԼD r+ˋ23Jts '1hkq)%$gg# deMbR1>JaĂ }Ҝ.4("x s} zIi+*h F{Y)C7E)/>l)>"IZ# 'oc6JfRBzHm2y%B ;gQ:v6_pJ)TRN ;zf$Wl7ՐZ}W9m6Eܖ}xZY x31000PH,M+K+c}$B7V9sח1MI-ɯ-/N/gilڝZs<̚O|+LRYǠ9/{ݙ]*z QQ[TZpһ{*ߣ2"vw?x340031QMa [\˔nU% Ax".8A9?77D!781=U!9?,5$3?OQʂTTM+dZ~CVx340031QMauz3p>sTwx&1_|zBAfAjNf^K~rvjBRifNBAbIIjQ^Bnb^ibBJjAN~BqIjP01/E(4)'8#?$3/]!-hc|;$x340031QMac닄Zqo ]x[%GrsbQrFfIjrIiQBAbIIjQ^ByfIKbAcHBZ~cqjAFbQeb^GiBqjQYfrj$tsx340031QMap5A6Yok ˁ gx51N@E Db*wttS{b8pH 5OD`;u/ 2`ɬ9~fݫȡn -dz4H ^BՂy֬c,>4Pb9Lt4Q?h)DɔfleiD8d%+v!PUU wb_HN֊1ļ2l\_Zx_b-;jPjq]["8x22.11.0 ]x#engine-strict=true save-exact=true <xZnȒh)cRfٕ-_t$!0)%"yؔmx}<~^t A,u5X' "Ax>-'lDdbϸ%Py~Ν#!!`s+:rcOϻ,)DNOrWM*$g%U楈h&uyӅ6-`X˪-YTrJmoy0(QDplRh<.x.x1 ]?'HWbb%gqUoyTN|i˗kuG"RHOW}H=#TVi$FV-ULef߳Zsh~hR;rݓ#l!b]@2O^kep}v>geL~gSe|-Ldm2#L",A11#ܮDGjQg>4:%c3Y(d?կ IVϴA RYM;:OV3?P1z3ͳ/bf~LL}6y{SF<`4H~JFf @fQ%5ϖ|ݹaS9H*:a߈Ytg%%_riFU5i?Ӝ~2? ̟+!a61|e-!y'JQZ5if 3Zy΀u7Jt/TugM{F(> 3҅?)MPKF-YdK8J U.8H!TiS5Hg^A[#x-sd{=pP:^ciQ)R=q++Buʼi;A^z^2$oDol+a)Ϡ1K}XD7=;4VRevÞǖD+W; ABZص]52DVQ kA>ڂ䙝. @&Pz!4Ec?j)4sV\l%`bvH5fd~e&(vL`gS^@ps.w˓$kaΙ!)>/ԔV%sx?b΁v)!mB)DgJWz m"CO=xc;B^Ii̓_AH`+:6+TB@Ț"K߶l]BVܧQ,r<8G%sB>Q%8I9ȷHF'O l{H%kcjk?46q{#}>Rt6=ZD^@[0V貏06q ޾{}|BB5* $%>e^ Jl8EؘaOAG~AXe}}Ã֋-uo4~!YL= ;<:toZ/7Ep"p(daE>t_V;O>`RRS=q߹o-!BcMb#=.*,㣿]ʕn4Vl'RQ#V qvkpC?:vč#Kk)pv"_a۴Ko+ӽtZ*ll ɺ͛*b\=K.@Hʻ2uϩaHc* -+*9܆H !f!@jD8г#-I4dem,,#A5+أC ՞@%:Ҩ'7obIGWp2{0H}X@Y`9l&4QѝN:*CHT*;È "RTkm$lwK1u4h!vOߧ>Qh٪LxiJ&9ÙSo"CT7b1{X\R\GY3(I2jewnwWD O~E,놧•񊱊;c(L[K_Z(s*Cx_U<"Wso(hYL>$v˗8/(6@O6s@ScjHx׍2 @~ƪ3]|΃&+?PZ3F.ƟuR̈vOW4>APH+4-*/cm{G s¯Oh +v{>K̶+mK=qp㙤}&5M|& ":&j.z8; 2}=09w'o<:eojۅ$őT#h}ʘ-6sDE݌":I*}* :ŦjFAm*ʚU\~YX^ R'A_))-)U]pNܓ#E/Y3Gsy5]Fbf)]ͺhX}<*5qHi7ۦ5W ٚ^T'ֆVۦ+Ǥo~թ׷@]-8ܿJX7ښ8\%IfE4L m2>CfVϪ]H(H#{H/SgFTˋԐ'y=vVBN:SU\] #KidLaqhns:6(I){(89e-c6ᖊ i,$WE+@ '^H (dSH?b%K_*&u5S\AH@R7mJwx3?ΩRTV@BnPq&!C0Ϥ+?/^ XRLy u93,䲰@m "uYeسu)m*5J-*JjͰ|٣O*ݜk,Lq@lAԦNtŶ'tK xH&HW^SVRmpe64Ü 4hu yGQ= ɉuۮPWcsқ9 "tM3:olEz^q@ܟX܎}X&iչ{}pF%OLsSɒ*&4m-gs;-cp]^<~$<c=S.ko斘n?[ CMykl ~cHkȇ sLPy^5UW~XwM,喋a2=B#e!Xo AUtvz[\XB_J&))Î/Oӓ5ng0\v{W=@eA zҫWS8)HgK#HT4S7Pdnc9ɬA/iCKQppn]G;ĩInQ@E5R7*>P" jR`?''S/l^̠)?ynԡsq@]y/@:~\gaUY4+::Ћ0#s&LR{dI_'҇ sb ϬCK'{AT qb%K;Z~֗PNܜ%R:6}гʹ'LhH"ҜUF; KVW1PyG 7éJw2n5T,A@t8Jz ͵yoRD_a䮽)Sy} k7 荁6xF# Authors - Asep Haryana Saputra (@asepharyana) - Project maintainer 0̶xmVr6}W_$Iq\oL\FN;L DD %=Kt<#r9 M%Lj[k26VT۞PiOUh+eҵJNN+E+>V%qiR4]QIaTt̓Y:NO1Y)7`T0Ar^[ͣ^5ԷH7d*4HOObgl7NILgg HR>;[[ kmI ^ӿC7B=-<9S.͒Ow)ӻ}P$F'=;5t" E6RTGfXT]΋g貵S|\F 'Z|S,UENkZU*$n GLl\Ԡ|7Q=}+g鷵28g nޚ[[ƞ x >}ת5YovώuUm>ӌNu7] `sppck\A]HRJQ)mUEm;PS+8jI[5aJﰙA61;1,Qf}* ϟ7yN|V: ?nW}#J"2fpEǓ3q_ڠ>*FOH;+W=7`8RO{*=6κ2dG梾Ä.PxW:j_:6o 9BZ) )/j? N='ɝ1T4|olzLy+ZwWB">!JUL-r&S p֠A}I7{@Oڱޘ786Go}z=5 60B+#o*~ #~dxDkOK,<\B ,)('w=dvHdJi]l#4o38L-W(.d>|w #El-lCr"7ǐF&غקҪaL_pu+[:[Xx˝5p*"`>_'ds;B ۙ[i^*Pۯof7[sQ6t9Bޱ`lU荬ײQ't:tv>^?a &쾑֊ьn t1\T'4L2MY B@$X#2N13W؂q#(ڗޥ{i8-*D(l!J::ځꅟElyv,)[;UШU Jd E0ɵͯ=tZ:ngY> vK{'JO|Xx7P!HIȕlM iPlpcqnuUFc::@d8AWB6l"3.|Bl5-Hws"ӊᅶO e9UHǻ'qm8o+iÀh`6mH幰&t 4<=,U( 0&V4ri]ӋonlVVԮ<1g{cLΠ@GC31@϶chl]\NL yzaQCFcl$..WF7U,wq~F@ {{n|h6rYaj䯍D)=s=3-|uH[;Lj 8GHQ9 }ҵSó9V IZ-ءDЩb3bD˗_;07ژõ0<|=F"#ZiH0jM] /?O}pX VlHXB| $_\9|tUç{vS<I-*%nkqR&x DѤl_}Vnτȝwu%QtO|ަ}twSʞヤXwq9KZ7ٚ1CQ% {Џbe!:b%(@[t;~y;ǑI{~k>@|9oyeK2sRK J,k: uѭ:am;J<F.o-.nbUL86R`"(C2r: b ICXCR+8VV(G=]}e<sKEBK01mc<nHGEBdݎc'x]E%AV? s@23pTȀ?Q'WG?i^ϯjz9:{w$]>yX>5LPȘBlTSɖX]D|ĝZlt1h|]]3H=>'t C 4HЋ9C@_6U8MkLؽyJm)ዶ׋\/r%:⦮]7X|~ͦ) @ ႏqmn% ]9¤Lk1_ 5*ZaCd ; 7FR :ovH\xE~AN'm`FVK3; o& bV 脳!lWOgoyCB2^K䶡]g[ڟ! $.nY.q*h ZZy1Rv zkж+ˑ±BجE-' ~Ճ5[Y-$]7[g ;}wلڸv{ *h1|88𙼣@#n @dp{S;wT-vBvGٽ%S}Q5Cn2yax~ Ob#K}}nq^Ǵ"þtN`_"뮿Uu]kq᫔(ݯ<+G?n1ƌb~c_3_#7(KMR/Z%?m-dy'r# F7œ|$kN~5Z eW[\K'ρ<|?4"&^r Օ2|<~957Mӓx%q9E;$?jH>xoGD`pi*&Ym-NU5E4" ;}wfMV{衧R%z?ȉ&@Uew}]<ٰ:JB'u 2YA4؅"R8FK)%XHP!Z !o1FiuzϽVgEB$qT?CޱIZqُXޏByDr LB,W3gy\tXvZ+ӹON;vy%{9HWK_^"X%"O(9FpI,>]臹_`3&gMđBP`SN>:4yCg66 0KB+ w%zku"k෬ 0jVmt+JiMbV٨eeER@YOE~MV+lf{i2)hV-Dyɐd ~Y'0<ЦXsGBO(៕o(6ӑ HhN3^2ͽ~)f6) _JS0]ɏX|?V,W&m^I2Mv!N Oq'+9[E.ơMO˷ga(>1LMP/m#Bq<BoD. ĥw.9_):SbEsXdk27'? uFxXms_3I)V-M3zDvYQJ?d<8g8w̎>G=9[ano_gV1֛jIұJ5U)hQG7j^h ֕wQOF78{?ګ,qe3ULboLua ҿls(=p| ti6meO]?&6̼r\&C:4jRk۔ʋ0e2thqji z,jKx{ uf;@¤ חu#؃bDdEhxG W2fEiΕ[EK8!;L0jIfˉ9"<놝'tYoTaiKFެ#R}u "ħTdÌԹ=};:W^Sl?Zx`Nkٝ#zY;ّbTlst*)- 3"X48Gi@*ӳpL?>_QnRlCwd< {CgU|XO(%;fSY֘OOf#} !i= $$.04?.5Xѵ΍'N4\}YF"֤EMY (wJeYZVQtjw_ia0-L9u>P*)/a֪1L i#U\D_} ~y<;9>9|{}bu~?X n)JϖKlpx\MV =15`??E! ۪& ܺ $*[q'}E=JPV<`UqP%a%n `B Z[:AVGx>pq'Ɩ-jBT)EφAf!nS?].c!:ݗ ?v&{{]&ԏ;T"[ui{$[HFQ6p>xl.,0׈MuVX,Ǒs??fk\% W0+%E_h+P@^Nނeegot>T8E'𭔖.ju]|vސ8m{$n8')rZ!-=.JJL`_8iyϴGi dv5ᠲ{Sv¹~E}옠Û)!`(_:pWΦcbW`$Lc0-V nf2Z uѢ MɜMb6mP(H^#WpW4(gϒC>`eaOoLu&9;ڠ3GAQ5\J82=X.QwJQ[nHZ9 `#i BfF32 ~@ho@meﴮ  |ہ P?u+Qk `w!ly*q$F #C|,ll nF,Cx5MIT License Copyright (c) 2026 Asep Haryana Saputra Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. }MWS/xuRN0SjaLhtZmr7đT L; /?dO“"Ẓo{ʸm7 O;p+R4kxbإc\ve֟Ç>!la\V/CVLecc+On%2pXtݦHgLdxSJЄm~oxsF"wh i8H)J*.[5բ5>?F4JT]a!K8Vgpe}vj -H3lڬs{iW͇G+5͝-oKq]^mY; :>uxuUnDVHaҟ*M&RPY{v=Ğ13MEr%W(Z ^x.3pMj9|W_r>]IE;sgpq~^,c*TQe N8IXЫ^<' Ebo%Cv G/7Vڶ ØI%n;Q"LGm8uNa[pM2YBNa[$PX};)-'踳}Q.mh~MHĵ;=x{u2Ga0ǩ?Vz{s54ȉ%r}}QP0>CIz6@w>\!T0e$qa}~v zulP{Rnk9o52-ܐ@͍T'LG PNqN?2>d@cB}AB>IS՝w׫;fxTl9̫(ʡU{+ڛ 2IJw-IC&i^<#&xCnʈ!+ǝ{B}v0CTpa(O>DSÎ?Ӿpocx=xL*eT| T֦/{9'PF,b(WL1uS l 뀕n#k$uI0A2-9Ε|,cG㣤F˸6Y8[q t(ِTH ܇jeQHF]Y=yU㬭]Q}'D{RFT.߅b"^ZU +tyN%jS}"q1{Jb8 QJccڥWo.]g9rT8&1# ǃѳW ObmRPH60{!Mz!Mc11? *rBKFaf4@l,74[לfvvFh鳽ӿo[zN[=NW^WMb[6Q]TǏK`9;6N%|ǻY(J>X yϜ^CxTMoUUN| K-uv Q&xB+aϞ̼7c4Ybz,lXQe ,3[@0w9s'?pmçar=9t1ahoVn-I7jڎn^G5,f9$&L&1$>q?ӷaTU舡DK3 #׳kVk7ʛzNYL*]5}ZXD#JqE7vOFL)18M;_r8|<lz>[घR6]}-OY@3â qׁI?gbc$%Py2Ӵi)ǤK21Ata3Q&xtE,0W`_2fa=vl5d׽~:wCLn(K;0%x3a|Ԣ U~z)d<WhZ["R\XrF'mQG9Agd8v +)Kx1£F0p'SI`G4=W4W$ӫS@? H.6J$&*D*0pya:1'Sʨ$ r[ cQC:g WJ.-r>E/ 1Yd)@ |,CN^8% d >S lw4=Z"۟-m>™s'Q¬iI 9]ʝn0\eblTt$9HXNۗ퓶sYj2MS4k{ ^^}2ӀwvqJ2YDUWkԼPrѹ1x343$PCk._,z!D:''W7 !nm(3V)F1~ޕP%EE IZg^yOZ[stJJs/D|gϵsRP0exTMo0 WdN`v-2 nmaPdV&%cE(9i10l|||%oVM/oMM 0si;uu!}Kg0ysyq~o ~&.0bQAS\ [1rk!bh ŧCjWW]upjd#&HZ*H 2I6c1n,,?xtQQz+oЊ/b&qc/]R3uцC#ZEtD P'Yec%,&zXe7Q8GM(0J%UnWWQ[ځsASv-n| ZOp 3 |BYp#J\m;{2qʽ:`x"rMol"}q=+,Dϫ!Ӓ=U%*vȩVr(V*kjv$QvVnDtW8V6s}0vy*{/V핵0 3'a^`XXwԇeΊ=`v g & ( JB]o7r/uԁg|f"oo̯?6sD 8׋ҏON 7 f)/:rb䂢({6uT&i#:=%!.U S7G 10oͧy6L?]O4/f]=]*rTA9d:`?pw8&B[rfl˪rk$TMx~3"W{# cɫc\1*á䫥=!KX43X.9lŤ([.TB0FŒ4D?053=EzV\h- b}7dYK*Tg ƣhԭ'#`FMxj6ɄѠkcluL;(7~^o69&BMK4iSI䌵`$3!5ŮEyGH=2`aIdI0{ [r;'I*|9Tx;lW׈+wPu;RF2S{B9xYDpȣ^gLXF|UfzKVg檢r<0Fn*=ڴХ6&*M;'DҤhўh MQ{K|R͆%yϡΥzd8!OLw#F`u0J'F~pjwT09A֦%^R Cۯ7Ŝ_FY`+g;"?aDW`k%~mUr,ƝQkWK2ٌ+")"Wbw\گIeܨ`f@:Cl7hxHY$[A"-:mqxqieJե!z2O_0'W̓"x340031Qp r qu rMav{YGY+5 !J]\|#}]B@ ߉ `]s(9go<+ sM+TZW!#GP)))EũEeɩ {=p_{nFƭ';/#)K-M,(Zz§έiYj31"M*uYW$%&g&痥U:w:nYc^ř?NMN-,H;qŠ^rV(|ljͺ[KuK3S 'D'+6\/t$19M֙~p94< 585(a}ezz@m̜ĜT`蔔eg楃h?hxm̃i)/MI-/VMg萼!'3l@׬xYn)k`MzRlye/Ws MsE9陑L6X,rcC9i$RIJLWWWWW5ġufEiU6f.Mq8O4J'ZVzhR$iD hd"[[RGy #%+e"9*S377>?|Sos(d\47"xk$tlg(/VZ2<~g{~ggoO,-T۽lwz:5w?t-Q}t*ɠ~>_U Ӽ5T4ΊF@{{l u^qI& ׇ#HTŨ0Jw Zy$3# Ty2LUkm|)#' !E9]yBFA1:M.d.iRH@ZzM|j/Lu.E9@W 3K/\ouYZ-bm{!㱜dBr"a@Ĝ-~Q1J\+(_ȉ40R"F`q7VSxy;#3RaP4!'V6$4gx#հ޶쉦,;?6J6X')MD')ŠFeDIQ_J!(LqUP"N Ňg3r`Tav$ E:?KejQ9!pәh /#ljq3/W R^&i g#bYS\bkٵ;:};y}}D@R*2FQ&< |:N [nܺƵ ddx*lZȹU㒰+>M2tJf!<̺| ":D(#r~ת8I. S2JF6oBߪh4F*u ʼ+E,]I g?>$v"X Vp,zxPC7 sC#n7SF*D<|| )>nʳcFh4>G䤘XB Ih/"s79fM-?|h \z5=c`ǹs ǂ=xYijB\ @:Hla',= ӚцDtEHD؄mUe5pñІZPc299֑. BE^FmDlqqh9"4خ-V H;P"–;2cɤL$^Prs%k cBM .XtPda%u,tI?d<^ Q RKeD%Rg#̄@PPP.Y8jtއ{2utpS^pH,Mgu-(DI3`B?9OZ529İI`2X*LI=>#IG<>t[G?Y)ȩV37K4O yrVK 8#V 2]ơ SZ3-m]dt+5&L[[b$tWw'^#^aD#!7SVkVO[v.BWZ'c|7Z~DtG9Ն0Z(W1\kh޸QeBޢRqG.M3-ҝxF̐Y(SQўKN7YHX&R2iXve[GN!T]F@O&T*ҹi` jlM=װyqWQdOP?S1F " ZUv6ZۂVdi_2qUHkܣ <[ + mw`T\dN0h_%I6KޏMͻ0k^&dBXqOnX:.Z+`sx| 񕅨x~=qYqHiEX0187b WJӕJ4YQ`}OouLM{L O M3*n^ K9sGHE3:C]R)iooǜo=nV> ZBhgg*| 1Evr4}"ǶQv馜:jh57=ΠseT޳l[6WnQV-t7dw >%iFj6EZ:pym[f|Dι{főV~ ^)Ҡ4yon@dx'T\I5 c~Bf,L/ &V@jfVW,$\U9i`Th!g[PCwQM-߭jH˼u75㩫6#;n%}|~wz[~-u"[d;v.o?~|k'J"VoxҙW!=L_ x[rHvHcJ@KµT%Z"=8.E4I E' QLLI;Ƀ8e9YE^33vXoBbfAעurz4m9=~䇡刯 ވ8=p_ab؟a XOURq\˳^4 "%=] jO-𳻀Ph\d*)Xkbm/Ozx};qŚ$HI)#T8 KBi8L]%V,v/$Ԗ RѕF갊]Ű78|XZs(x.+8޻}oD_rrx2osVgk"cMsǴ>i4#Ox ^i8Rn7Nz82IƂ>nQtğ R "K Q;$'VυIRn06ӰVf@łuL0;Xʙ2f$i|썰Kd/O[HFI8V[d=p}ɷ}Y`ݸa ueoT,TnK*g0.|!IDmUyP}_Jt\&1ȠR 1:bȉZhk&V# 'vFG<0% &Wrq>Cyzh,g]Ћl "6r(!5 ؇2e „E)x) 1W>؉FOl$roE;")k8]LG41X~; Tp,e Y[+뻴w 2tHvQz⨃0Fp:j~t.,O&0d*ӂZx6E r7%dbVie.%1 %"VTdJx8  V:h".W9<9֠?g$ޛgP?P;⛟SC"Tۜ6Tyu@әH)"r\cd,w^9D)+V\{ ? l \5P2l#FCQOf&T[cyl.v)F4^vD~k;|nf^vnEc7Yƾ:XwڃsldDLNpw_2 [8I&;¦_iNf'Ik!B_ ejc|;|3qIjs\때s5(B}u|u{9,j@c)MY_NK;h k%k Ep;] nzMFs}z{,EcUx{F9㳧=ysH)N ^TE$5:Pbr#uM<߬nCm$i&k3&sO@: &H.ST=;X YcrE.\`q 9JŢzG6}ΗIC2<rLLr*6PBQ0 ʐTSfϖW_0' ]xX;Fd~XVXyi*d6j;QSae6TwVɡ_ɀKIeL&<;|F[]NK5i ">TD*''((K$H]m_]#B77̫W`*^.hdsC*j)@ ǩZƴ8 Py#kMqaӦEAOx)C Cd0* vqottzq7olB\ʒX<°A̯/`>V!\)7N P7 uhkk(ґdBEPhooUV3Aa Zn{^= ߱i%2*/* S 2Y7TxN_> 'hW=|a U Het5@Ijve%` `P4h.-Aۭq +'4P(cH#h u3A&3%@0{Y%;ZeɈk<57 o~7*Bib/3g7CZL@(&jxqPՓǃgJQguvEwKR:?8G?{E^v/r 7R^E& އ{8Pb'ѻ )z7^dyi"*3"K<=Q7@h*p= 6kaOp9zv,^m̍/a?nl2*@nv5.N5Gڿ{ 2À8٤wD,3_\$P}PI)Š_S+ @X]_dF W:q@ [Y,?8`vx P6qR1Оi|zl/K>tb- ĩf(B'x 1yꝤ:3"^@9 %[ycB@OLxp C?tbTsTՠǽ 8uUZl| %NkZb2rbsk e$ wXIfu)LnE1Yoq8Bޭ(Rv;FpΕ-c(/UX;@H)8CT[J^Z`0U1Y3o^'1`h6 пebf% c_J=z_ddwd?BKJפo^u!ZOc /PrL* ~a:'\?}@ jQ q[H"S4Bw6FɃ9SkzL=J(ܩyi˿ga}\.#O 1pxz>]7-9` ٲ T>lYꐏ=ĉJ}~}=nX:=HH `smǡ,^#5ꋽ'e[V)RWݐ.0KkJUp0)ZЗkG SdӸeL©Kz`q)z>NL/l}us-G2hS05.cF }*j[\YlO Z'pjU$ke~Nm^4@^8$yj3zM_f %(g #شD^W w 5Aft|^V,CHJMUoGN,i (@Uq3=] L7 %H0%de_d׀H7 165G 27y/(\ơgف͔3Omu~ZZ'lFA-}rjy`~MH_\_[JV?h:^ {iNgԪҏCI8٘؈_`!m|V!T__lO[us!ZD4^4YfK5%*g#KHt 8[ c}OlY ;NmLG[Aیix9zآIXzL6KB] ڧT#%u cC }6+54`Js e(2s[~^ɰPc^8Njgh@I@! Zl@3 N WjfbY,|ZvRp= 25,<6j 9ʝ1rȶn vy9ۿGضִ JE:C4{i2>/9H;88AI/4E f^8&JqPm h,J1 Az*Po!`RL ^:ZП\ 'PcN$ѸcIL H2̕-|aEؿXI/(B0a!sP`O`:o-ڏ&H/ʰ*3pΨh (P`t q؟|aB䑦r|Kp)TyQ1y.TpT]|k^]{Ov"OOGG'Ȩ" !@dt.c.?OO@e\)-S.Pq`5]3۞kp5ށ,I(5sK}^_: n>N'џ :a6,<3|#İOօVGbjCL;[qL\׽lNWV3mb 9`7"Pq{^ Hm毈\$3uhjb lyZ2EIj{H5(97CDF7*5s(fMg,v_Ag ݡCAͥN5ڊK"G2b c0&Im&\l QQwػ8(yZYgkzشifYdSٰ\E_9q |5)<k۲GU!4<@ :}[/ki1aADfJ?qC^Ez_>|?G@[k#5͈X9/9ީ9U闏 ]ŕt^8sy UFVJ}-laP0)d 1 ];Ak|^d2\m#)!5E29_׵l H"3\mIuEF[{v6Q:9pkͥcOUVX.B{ ;Ok|-3wCELږr4 bb |KK,c;5eѱ bfԑv ;;qz#iOamkAO3ZT6細BJHG= }@Bm N;w"r@7H`/s>- >x;W1r&KYMPk!^?єGS R*ss`@Y!"hԢĤ̜̒Je""⌤Ģ. ,OnE1s.)L!gCxWnb )뎲l k);U"ǂP6m" ЇI=gGnZw=;c )c;!!nP75x тzz2kTukXb0ɶ趨hc(8>~wpk;xOKx#쐿g0;qW_w|r`4Qhq 3]R_OJ&.z)8hڡ%H/N Ki:g/:]_%GɓKQmz/Y.eovTB, }+Q 3e4#kJgd%C6d)6\ >[.J2֋RP 1<.{'Io3YECëF|D kb-\U imȒnHג7Fzҡ.CtpuZOn#kd%Q#} 4-nǀQnP&WSWS'ķ)hhWZnxr^(+5A#aL5>L^:ѮzË.l&>Vp~g<>vj%I)zrqqvF`ܐ5T7 kJ{xP.Q4h'Q$vgvӼg7W0b}\:®ƩxU?C2+=]*F?s _WPhm!h倐p75->2țjBYNrB9t";zyz=æCYxZ\ɁЅ/u_I=07RCTg0. /xp2˓G`ücITh]vlAYLZ m~KЙґ[::/7tYK|-gĽV9,[ǵ-m,OԈ3cY85~;Z]^a!eZEp4M~b^A ˽*yJq)+Þ'%s%t!i΀>EAzɏ l{bo9L%e5U=0mxnؾE4a.p-[`:hp#?տ|ޭ9b Tb &`@$ +>`ԫKAN2* 'F:9{3zc={oߣ z ?xs-Ĝ:'z{n 8c5\32+Y;%Ɓw vt,KR2h -KzdǀӤ)h9NIF˓/דo ֎D2ȥp=}<\ICf|n Z=[_[/У\޴A6E< [KG|m,=OYCϳۭ),aqȏ51秣%8~2JL-%?}*Z9ۚbw%9EA?y M4dӳd՘bft049̎z)`ӀLQcn:8JSsTuHKsFINYNH؃YY!(P-+Ym(`ѡ ? ֙&֜^[NV<̮&KQk23Ȭ np_\%)4R:ہLΠfJN:*MG570`:  uD5U Lh$CE~nkb?|us7~-fOXڱxWmo6_qs,)IlP ]ҭhb@W،tXK@RN$}w$;mڵاŁE^xo|/PRKT4hV2GE6B-Qr0gZd`e0@l'ZH M)Z(<0EQ /\{4p杨\+#\׍*lIxJXry.ȧNO?H$_eQtNfum9kTdˢ2|uu,MAjFŌ ~_bA27VxuU¡u^BGk~UagZSxM)ػ9+QT\{EfW讵Ydjl)XDڨ$6L<jvEcHU .MAG V?T5ݸMdvnv$cz|hߣ(k@?z0MD?`(Ţ(*;2;'ojF8\kVjM0oId[(.Ňp~;4JT8"fM B,ne^K..dzcu+SXG`aa%C EQl;.-#8K'[SAL8TA6A" n*!`HYFݛף F+Q8%7{ Wd>K`.+ѕH MM+tf`6~9Lf kvr;I߷}CnOwj^mq~"B'NS+ yeo-p 7Bc)\'Gt U73C9z wKc B.ߡJ¹LZgtv啤tg͉_L)ؽ8*t %^G?&9 svq-qdΰoT\%e3.,7Fȅ82I $l!67?{X4&L$o.g+=5{>Q+['2xaX\],M%̽GA憙PR/3=-k%!p8|SZ%xk ^0gFtb]iQ9 637+G8`;sR3$խyx pTh$}: 6Bxi . P+:yS&ͥKQDh`M 0 PqVbEKC)y5{ avM^'B:UaPqf91ڤjJ?$CϹIPIT7d { cepb/%vmkh.,K/Y}y<[v>=[`eBG#`\HԼɰFO*lA}W /):u#n mVBS1:! ]VF #zzVѲ,[d4Շ/ |V[QcnVPf ;CsX4d }+v.s@XYbs I1`f r*90eSMi? i[m: +2Bgz@e3ԜPr1 Ǫx:,9Uxt+>%:x{eoW(T^(5pW6N;E$2-N Zz$4ئu?΂Pu/Q-4a>^˶rצNDN0*'EO}麑Bf` ?A'ō:_ʛtH= eLq| /oE[ GiVDw̒ɹz wf;dz0|>O>~|w*c8y 8GuO9kU? ǏKԁ M\aGaTuQh1`C˰ Jzz%iC_ .4ʗ@_T29<#4n"[8¡r< ;g(6 }@jZwѨ=ʲ_bNG4vj5#]0a'b K P3A ϣYsv\Z 8&-&蘄5n17)l]8לG8L̴h={3gn g Wy8wT.5qyNq:WfZ矓\5*41ZC x340031Q0000--N(M-J--,-.MO)I-Ma`R`y~Q> ee&*NM.J-)!.cأ G 5΀rutu)lk}ֱ9kel35 F"k7? p3_*mm.D bHYzM{o{E8ME\=$kFN!eqLcآ2?F|K_?@z;\Uf# 怳˯tHr;!!\u?--t~15rȓ p?nqʂ{RJG/zjx{|mbPCXVIF8sh& $V($JAKA7?]|_>oo~5{܁ \:&9n}T:׋M#@Le4h}wltNG`dz';rj!E65-JBbf 7C𙔨)MhF^I'r:q|Q O-[Z9{& }txրA8ѓjh uѰy-ph{O0 lvv;uB~.;A!a_y<'\ Q+8< -m4Q1A 7t0]ގ>Nd28l4>>= zw~o8qPQpS}ڰ;! p] 6AQ*ݪn¥5]eY3mU 2Ow5{}`Y#s&ڲS+%qK͘tjWVPUܴx"Xz59qB2nZ` ➍y* w*4h8cӗ>䫊`}~營\]fviPa4DńJHraÂe5m  ^!\B1AЍn5(bؚƟlE_"^8aCQ&@P& 2 S[/ϽZl )42$ Yf/ O P~a??KiFoz;K`PUIlOԓEz=Zw&n UkdRG,m 8Mdv#_<\uGI _M( jgZSNaxq'95W<*x W[.xe : ݰ1S3ϨnPm/~bE*~)`f{KȼC]a)xx:1N|TУ16'`j *{2!,8plT *мY_,8NGgW<{uSe S')KC ~t15Li6:SQ ܱh}KR:" coder-workflow adr list coder-workflow adr status --status accepted coder-workflow adr graph ``` ## Status Definitions | Status | Meaning | | ---------- | --------------------------- | | Proposed | Under discussion | | Accepted | Agreed upon and implemented | | Deprecated | No longer recommended | | Superseded | Replaced by a newer ADR | @exXmo_1wcRR8ԑ㋯ĵF܈ewrtЏ/f(َ1ewv^gEUp! Kn(VKҫ ߇sCV(S&WjF.5-*w*!X:[5\keliװ($3` OptxkxZe)rʇW %KQ,Y҅a閰Jbz ˮ7&ىՄ9AʕWT@)d,jJrnЊ{'\ dA’0˩P.^t}7S 5Mf!bVEIݲsJQTR1=QՔ Z$o^Ę`e3zBBQ9ƹ@)%N@mylVcE5saQ`ջBia;6U8/0 M-u75 `X=23&T%ƹ~ 1sNfeY5 %h qP$&pn9T2(y*͑(>Ӧөw 4m9L9d,"C$Z|Uo AӵL?)Hmַp8> N“`0츩F[ FX+ Iîd~'B0!?F<ǢǃG~B&J,xۑ[a*ғ d15H _[0L'&W`iI_0ұa .ƒ 4C\9Ԩhͤ[AYON.Kr8!PS4*/zouNۇ .XLB?ƹ1W٤+ a G}pkT楐q nId܇bmVa%oԐɢ Hy,(±q]6аVM#˩VDQҚ:c2_?{ NFó3؋֥eJ 9xDޜh=뀥~eazP֮wv L0[lźՂX,e,ʜ 2^m-ј[{0% tÖԭ&~綳6pdvgpH"-D]ԹA+C8u XE"z-;.^R_ܬFE?YI,D7&VX?n1L\ޓ8j]%t%4zX/VclRٗ{c{ yC{-t I0IFdodAE!0Uʣ ,J\`BE`H/EL/huwVKÅ;eeeQ߸tihi4>l`N#%3iTXmfmiF~*lV͢X],*"ulUn>*K><ڢ* řS~"p m5C ƾdo^4UBݭbYCI>`pQ+ӈP@+2+ R@`s ]hs&X{WHTX2oU%K԰ś/W=dm;m^ݘ~#ׂYemVT_/\(gɤG#x寛 K;5q;S*2W{v:j6p&a^??E ,NQ`J 4"sn"WG\X1'5߮+Av.51$H y-\*PȠSXؖo97Ϻo9繺5[};{ w5dJ絖{lRa^SK=pûsGbyW>ǛY3i)-jZ,֑P_3b)F@tƦ)NNh%m2J Y;GRb5\~|Ny[}:T;Ҿ$\M\޿ܭumל!O->nٟKqKwJmv+d@LgwzUu[Mr%!!W(6kf(V #b4- GDȴ _b2BFf*ÌgQvFBa+ԾkRw>6g#޲]ܙ3+. Bhsi`g za*!PsYVc2SQVԆq*iM_vxYnSA-iCVplomV-;EM#򈜈3C'(b/zՋ# }ۇ?9'BswtU:<yFȿ_w-S˯n3 ~Y&WHM|tkn")R49y~Rş~i?p@BrCx̪o\n+3"BC C)}&{u~JMO%i>]>6#[G[cZ;%mP_ 몽1_,ʔVz֫$ȅ4Qae sTkϿ|dZQ"IQ9@6+ 6}7H4|z~̝3FA &t.7M­a{3-~B,/D$cØLYRz>R`OUI?T;T)!tmoc#RК{.#?= e3IC7XecZ , g*tؐ%JAkR8# `'ed=f{7CYbjeX*E2hʆ}`P tC!~Xj;zkOPƤ=|A:"C3-@3m [Kt.)H%D9ty>wtIҰA, Db:ߗ W( *`B\QJpjH0>ڳq_TycJ|NTD=fš|MY]wR40U24Jrq{/vDvt c!:w;UL3TUhΰc^}.e73{o lR0E *L)u6 2lbS.R b|Ǽ֐43y,$xrT^՝5썷[o,8a02I"jk|G i*YNretZÄ(ڨ?AMta#kca1dbg5W.2fnHp#*rMAT^}"vUk"Wu<ؾmxu 2Қ$W4%6P:3Q@(^lICw "v"bM\NS80unBmsh220wДFI\_a:Oah83%tXe1eaL9KLzlE{uE1yԈ"7BƜ H^I5 |4WNWa$t Pɀ'Wm\3ljj[*gpVmӖVC#.oPHRUnT KDhsDV~||-$ SfΗ\Özu}5SKbRF{2!T{Tw.ik;\X*a0QB7ML7χo1z鐃*1I>^VUe6T~DI`))LԆ7DPHTjDA#]bx-wu{^~&iY{oϫƽl_!&[:A}p9n $ХA~Z{kja l~Ï[֫|zfܼ*l+]51K= :^ՆwuK&tmwkq~ f;zkEY; GAu#yr|vtlt~qEb^r@Z&#tOv@7/ZjwʭFeo:^@۷0 ^lN| ¦Q%mKx+^`QtQA?y6:ZX-%W^>\Ԍc]}T{2xFYXsÙsF侊5m>vǘe&܏3fF͛; )Mx1T-h>Ӫw0#XKy.I ,,\ ,XMmJj?%eHZ>&lѐbp~ M,]ۀ"AMኌ(S kUJ_DX:Y"ꍜiYj+c/9xXnΧw!v!KnDNHI 9ފ]fH>G>O}>' 󱄠[Ο??÷.!l/*ʲSC+j%joЊHյW*T$ UGV3q-uk4T}et GLe sK(r(X*tv HJ`ĪA{.gp#cuTŠo-.^UYr]%w߿qhjPcݿZwkӆ=|aby,'RAVJ'5 g^?%wbgсP"s ha?*a?e 닙)蒂ʫ T`ZkhvPu*R"rxq5C6z=|8k]Ϟ LH};By5Uk!] F'8GL&kRO~}ttG2h#jP^y#_hzm'iVv.zvՓOYVjXgO:ʘJ`V頎C۰蒬e!CPkF;b/H;I9Ԟv}ھ%H1'5~< O?&2Izum%:q Imsro]$K݉Ҳ)ʲ[Nwb`uV ,9 qpzFjN6FtV]vC.a;X2Ha|V{SүLyB(y`{2 u(VE%:[E#A4 h9EYQPy "p@j8XG %DŤ:I7$d0Fy [b0]hSrw1 !dUijIUDzl {j,0κzDtig%czx' _X9dp#lENY&inW~:XlTiPͲ)CI DKQ#6*Zn?B؍mnPM6#-ZM˯x-=oc?=`X;cW9> F*M#biƤu_=YO$b B 8˗7,_? w{EчI eJ/mp'`/"_6H6\=('A^R{Of#"QՖ9a0ʳo*eƍgEqJ&5WNlPdBjC]H)m|obbB~sP} @%j$<<т Wڔ* 16#H}TɎ~XϡZ>lk:kHQO\&?Jߪ{̴#=]H} =~$Sf%HVvXt&!&eɀ#}@I)3?G3+UbVx-X.aOGK-s஼sy"g,`JԀR͎fcWZ/ u⾻WvgN/fpJ10^PۊJ4tU=OdJ[Jqgɑu+Z\?x31bKM3~/2;l¹m>Ɩ x340031QrutuMa8#o{B=,֨O> yEE%%E >{XI[\_ZzY5TifnANjnj^IbIf~H~=Z&a-CbaҊKJ&opS9hӳ}V N8Add恕59s`y7/LxmVnV + GNLA7IMFg&]KKC.* %Lʲ.!yHjnIlE֒]&w TłrֹI`݌m5-@(`2"fk-ܣF !?[ &X jYB)zD; A;T a=En(vv+.Ƹtހ"ۢd4%kNks@q=O rB)^C:2q~]B0 i c%AUǥTarWf"5" _S` |"hmC:B!6z СȖp{W }a L"jg%(nг8:t`<BV/$5ZƻAPäGMv-^3sf 6U症L a B(}B-Og A-!$(6drK,s8A<9"A#L?=?>' Wyn.GGƭQӷ%`0N.6F6&w9c!}5vSdc1h !zCF|$e&}222vL b5x~|/d30#bl7/# |=lI)RMs_Y;NGCg\t#pHAV i廓5,7<,yF,uN$vԣ:b&L1|ˈhЯYj9A(pAnXsE%/kBCLD5|\:n!ҐCW;Jgۏ]eLƣF B("LiVF>NBt^>R{^ x<]sGrSd@ფ%J.EL[xJ!0~yv,{ʃ*r<[I{fwg u9ٮ&R OgJZ`7?m~llx"bI#&#|@,\ÃKYS9Ho*Tqq)}vb?bl=`/A:K}h Xipssǣ>{E| O'H~|۾はS>;>*vࡌƝ7+࿚aг v6QE³PR{eoؙ QiNT)D2`URb!H(泃Sfh~;:KP!HW.ų!R\9SLK5ѷnb25.>{T_}s-cGGLÅT~'QGGO:]v%!CT ` nMĂɖ^9V"֖*AWQO===8kd5: syw#nʧ_#vUV0e$lgW+XX҄Eˢ yj|n3|mb9^T|͚tEѝ#//uȻ _ =4Rڎ)w ac~;UoqM+4kwd>@@s 6]j"W\sw!Rg0r 4o @J'{-&\Mte'R|PhGOݙn!]e(i[(pm')YZFv|Ʀt",β(FM(K[g~Q 8JPLd<|O㩌&8Zzk?%w߇Db̤Tra2)eV O C&#eg2vehH&oihg1 F sTF  55~gg\%͛9P҃4 LCXc4A.7P%r% "J=}kxh ~gDDL^X[54|\3搫L nGXQ-!Za'o}AJFm2%eĮ ?ak9 iZwb d9bk췧B7v}:?Q&#i/Xk Ot`JT~Wi&f ZD`UP;Wsih)'.#r3-J fI6 7ptH4ia{*ib],M7Wev %6P ueئ:E;R>8]a˻{˪mlԊ//̿t~F,&5kUhnQLWF?RixtS+]L\p/0_/ ":=$|c&KJڣ .88F&:m{Ząƌ+즳c*h 4F1^-M7u~/CT7c{' [פ"NPٍ ұŋ_ljUG6"l aH* :@xa\I*&i\ I\@%5 Xe"$رO3OkI̹3";E BՌx1Ba#f>ˤCX:w CD~4}mP]*#<8±Aഽ3TkxvSu5dPTN]VR ,E`/ը#pn0epsE&"U`]A(Aip\ Dͨ֗jK&n&nVwhB/Ž4P9e59\"T>1-Ӫi=nܬQmU|KaN!HgbփK ͘d4Qu4u9Z}3e(BL]Xc޾Cv}Ӓ8 N [$lhyK&*oӧՉu"1(7׭ 'N&P) @1`;o*0|7ۇkr+Ng،*sR@0sv ҬLleV;-p'o Jy>J^-QR`y,>*}eEMe߻.9J̹5fըEL,3B3kҀ%uR2: xBƢ 33(E)sRD.nIό# ?MIΌSo!KMų:Ii&MM ph1D4I_V]x֏dp 8| ݯR2 h#_]rr @O{:F'.^$ʋ!WٯՀX~$tUpr"qpdEmL/dMNy#5TNh`O1& v|dZ7ʽE޳!ر"ͳ %jZzq+1L[ :#J:*7K'T`LFB˞S(ax%'Ύvə_r %Mxz 7%:pVBF\r"DS:^A^Ü88 cogߨ)2&.M4j& 5U ATWu2Rk/+J<@ж}4´"OwB5݅z7\VX^J i5 n Z0=%Z˞̤1ey+A++cN*ZAL#Wſ)jhʛQ@%GsuX#Fb(rg V@a% m *jZrwT'x~x0趞(k6s/LhYHR`yB#91G5WFeOzTgaW9tNv_$ZuA'嘌$)U}e~Y0t|H-OB)9LH~`3*凖l8<Wc& wP.ۙ)FhNr]f>n&J6~I74Yo36*=JgwX+ WzaCZoZfa7~-ViNGFW`H}ӓ"ga1(;ҕ%<[Rl?7&D//ѴB* PE׎ ~š}QCr kbu cf CX6  m3PuON~WBCy`\ 8O m- U'"MiBlh; PZLEf vU]:5sל61|GV<Aw4!u%l~ U]]ƴ꜖ ސȬ:rP+H*B`(?s<W"-sn?|/ >>j{CvS rj!;f2٫rSkM~faҏ|8/:®Уk4CPc[Ρk 8V2du*鰱c,e`/ȠiV3,ohEG'g3bL(ʧ9hJv6?blf5it`ys:a8ff 1E!]̂8,gS>(ACopOdNΰDz²ӤQ&dĥ0Գ,U+>TxLXez" Lt%)fAG?GqRx@dODS[vn<`b37l. xrH0xpG,,+W|,[Ԓ\n PKc&bn#˹gG`aΖLR%=Ϟ':X,CGqNB/ROx*uWj;i|xzpokmw7F6|ZW+hJ- 4Va2x0K<JNux,j$@=Վ7ީu1mwi/jGshy'5*yPͽ@%OZ ,NřRe8#oޥZEA`(?{*+W<_N~M>N^6|_׋/NS?$򅢟ACVfUlM&2*]{%Dze@h4/^OK}Bh;˞E~j'ISya?#DGP١=]`:C^x~셯_վ7%QڞdK}:?W4Hj cofa|F7Ov)bSf&, P+/Fлއ1zŋE՜GX~҅,^xU)oLa 0my-ꪙŋ0/jv3c\浇1ګ~2ayV&Iŏ#sryE]eU?+/&`Sߛ.FAIГa7.m o˟eO* S(X G 5|tG;4$qXzQ0yq&^I5we9x7bn )jFT"[]mY[t L* /1h`y4nIۿ̎+$TDL C̐_ǕuC] ^ÃALJ1l p`C6@'/\& \n]t,>eh*QXqbva?Q>Ɋ=5uOkM z8̔S!:ƫ9 B&{Hl33g+U`"AU )M`S@ΡG`~#,lC'aChsg/Y$!A BB,@ n#p'id5)j V4cW&Ej`C=I@л깬?#ywܹ tHzi$FSJmXX)%y>ݷ|6r3K-Ddf0XBf5 Z{Q`JI>y,r5zZHr{kK 9"Z-e; !ei o腯-ѭnI\7lfT,j^cZoK v2% DbЀ DD7 P>`URTP j/`!6 pM]8VH:-C#ZE_VO2Na:foX$jF[dU*dzKm}potvϽѶUcж x{t~~8:9{fOu<NNGG?9Ktv>:<޷ ikd IV35gNn'H@f^*ic6 wS "  ZYзq`Xw]}㣢qEET;T" <,Dju(ST_Xl6$Ebqa0!\lR_Bi>FP4Y`T;>l2GC &Iuڨ]*Q;B$$ZEJ NrAbJ ^|Ƽe [_QZύiSPT}{jo(6/A@;WïrvjbDƗpwfXQZx#CۄUn;4s.7.M:Z%aX<ǂ88hk[R Hخr_7.V#:` 6 f Qs{}* p̒xA@)@:\ *p%E )0TZZh@hzQ*4 #pX|<@l?,]X-hȕMKPa5wmȥ|cX.Wqa- a* ]`t}WzKyAPlC٥(ͮ6/LOu53CzlԡE,#',53M<6t8UФNVZf ┌GiW7Ny:)^`+VhR,B#4*f5ku<2 Q20l:@#$NyE |/xNl~;\G#Kvt񸀰{!zz%Cph ?dVVUnNifVlHOnZ CT+SSV'+PP_Mw0ymk%uq+,μPw.-0 (Gn kii,h{E-љ *\ ?ҩ0Xٓ!= bGH (s\Y̟#,UD<@Nj9u;$Gٻ@wn\-݈,kcxRJAGI&god%[x%` Jōyu#ϖ>K9.r!};3voiGBm 4-0bJ/W9|+b-iҕ`ۡ }]q8+nө4M@=P,X)K&WhSj(u3W'YJ`O.(WJ#c=;5>eȈsF WnvEa =@IY쥳dELc(${:Po%`HC4%#hCaO9q ^HINy}U`h'R%=Ǡ^H. bjrap#*0sYj5V\br&P !( G/͗~&M( )xo'%t֘6a9v `5>/CT  Pwk.yX:J~GrY’G؁?%cPjLJgǧ;tzqum<~YMG~.Z @/#kh=e%b"9yG8IVNb}"gF<ݱ=*r!ME#r*'b vbXW',S؄\n\@Gw4w 9sm ir  KqD.H3Zʼn?!Rwxɴt ,[mh\W]m#r2"-`rO99I$X۲1qp('irE{ip蒆T` `WZF{f]b'^^ `~ Ikc ]o(tPh "2nƸ1d8Z3SueVvH|} AGt-\WA-^6CwN['rgۮ8۞$lѐeW= >t^I.n :}\@}*dw8(AľFh5<{>g³{y`BF֔z3ēPyiULze ޹OWi^ C絛`}lMV쌬tB+;KHr=ɯqÍDͮX۩@sͩvZ[=aPdoN>/ 'ua`G`3P#8*lYd:ݣ-7OnlYaWǔ$TdyHU9Rj:\DbT-*8VQ8lQxAG6ZAr22Ԩ zAžK5{]"7JN` gY(|R!AZG>a=Ү0W5HP=PC>M5gL?V?@i䉨4,C坅CUt4) n kv١N-AZ~7F`˧AA֠ D C/_.ـRU Uxn]D_nF_@(@;\-V6-YT!m5P UZUJ (;Js͵5]c[DS?ۼ}nP `ϯ#S#D/9"ljVABbDHv~"[<ٻYUZ#`,%꧅qQOv[[kU)zzFX6ֶ칲,7q4$`e׊( 3؟" @Έ4=%/ FxjeU.0CNs%nQZ1sHoA*8]h'xTn)WbUm2՘eŨ2&`'v,hdB[0yoYՖhJ֊SrEq JJ$3XޮVh:+HgCj֮Q kU'kEí{C!)/SpԦ^A]| ?3t}K0P`PoP0K .BwKMF=iG|HHp/ 8oD& ՙ2: ((fآ7 `лqsZKo-I80wګ9ZS([6?>Z}R)MW4@2apie(Ҁi6<, ~>uK/nHFS)Vùr\8|i6z%Dbgj?`D['8THkU]ᇴu YsN :\0zc fx]YGĽ؀qSfWղܷݤQqMq6d&. + C_{o.1~Ť v:h!Fj E﷍Mi P& üF4 t- FL s-sBhS?EɅt IbԵ?_MDM}?}yFG' iEa.0TWxCs2Q@!HZO x;Xk( -,yԏ"Yh%m,L%,xPSd"=imSequs/I),d,x (6m^-9g$CyqC@ǀ |V gҫ2 X[ap?lTnp%^y8H$q e#Z碏}U W6޹ Esp` !s3Y4IuYd`T~SS`fͶ:c'9sD & oqwk`8'u9>kf!˒?2J?rrUO}< 0f|fib11geg>6CVU1KRTI{J P:Ov 1yDz)/P k>_=}1Kެ#aPc;Pd0/I_ٰNBm]%E1S ˆA # mTO f{|Jќ/:|Wu`^fA䘑^K\{]}g|ui^cV|RgF L5鶖"uਪh=R)qMTFa,}J ^4q.D[=H f؂Am3E݁ڄ578չ,|dlŹȤTGk۬{ Ob؆5}b-O[k^|o#<պ0s ≸sWP/Q~aO-qX^䬻jx Y3DfD-i+muJ ܃?/-ʱ& lTfBcYa)lr( nAM_jxlYy%`B]gb\f[Z_{Dk:,"o{=8h]pǗp4َR37= u[[D0rBtX!j՘N"*">| wԠg7+PuЃrM]EC%"='Y'f؉ҷKө?x6Ib e!ͅoK M9k._6IVvŬSK&B΁漀!h3ŸN("#'*>e*x{sKM98PC^nիS?h!<ΜHf2 ZI8}bynDiٙW*6q2ѰP<)<<8ɥ"9I hyǡId֝]J/4YAM^Jr'&2g3v[>nhD(O[^e"+5~Ҫuӽ8*kb3ˑ m+\~N!.:iK0(קi>hO'[RdsΩ {r smA:l!ɥf>5ak]&.9@n @Zmjt(XGı:\ CHAq;GLKKb.y?f_TPϯejR$E/ t߇M9:G*ħ5aS$dLLјptZx\BaVx2\@C `y g[J\Bwʿȏ02Q>݂;RGF96ϗ#E"ѻMtJ̿$! I=L^frPl{k4 IRK u\_eM U׿m noM]IPY\ f:&gN J0B0:`zTxiX1^_<6>15-1?rP$_gԽI XpUwN/UJQOZ L?@fс.G%zܱ.b糯-1j|I`[,%1Fgz<]>1 dF! KT;ǧaꁘp\@-6KىG2P>q~_"\WgL.CyS޵B$* ;l>h@_Qާ`86+>:`I>ŕFec.Ɠǣ(!(tCssNNqCW{vJBK0iܦ=x|?`YUzVO+:#IgOow.ϻ)cVܦh|VOmn4w(?Es04ADu5:9{jR- Xր4+gGjOa =UC@sdg/[Kp=c;:ˍ;*A|^dfj8ÏD ϳc!^"h b-򄝾cN)SCL)7&e\{!,ZF2>$^Ds:2Ά_כUz' :X@wv1ԑmH;jl%LAD뭠1ґƁa,%jBYN 8+p$N*CΨ:Aw 6wxjt'MZHl鞉P*!떌P7pGCFj}sC2S4 X.}|$g*vvI8smE]5d!eUV^<W֢AovbJ0=Uc*4&yht*uF&@ dFFƻ:RI,"N@YЈR<>ڣr~E-i&&紛7%|mS#wQN 6Z#0v0RN.8)wz[$4/4̡I\e>4㎾>ztZ=G8"!K݈G ܥR 7VUYRL8 à^&8|+fkϷ45Pz/yu937B.sVWPrp GĐ/IvZ'/4١D*bx<ܷHNJ7`#:BuWiQbd+xݸzRza`w18`*ry=;}rLc8]4\0AD,~[QZJttr11`1^ ~;cUÙ)ޤp^r^/w< (PH=`ΆZb,N C8sm)QS<^rdW⾲ ֡1W3{ rWɗy헕֤z'qo]W:8d`hӂ‘[By~~_Tؑbr3[siXIZA#IMNYB"s@ufjVh܇{>c ܍bhaR{SE?0P'4^LZ<;C6ee,M0kN'Bޮ;l?yގd %AB'\dE(U6.F}4328UH# ɴ.03;:rPgFAf ͑0\Y&hU.-ف砑9 3SPRNI[ց]LzЛ`H%}^2⌙g#;}Ci1di- Lv[jYk] B֗W8 װ,x]La@eS-]Md,m@Aѹ_r8+r>:pKh㳩@nZ|1)ItOvT3B F*lһhB!zMd(sZzѠ$@mAS]+5 frV:_n\u+sFv)XVݨFTЫ p]!r '*tD<oh q&(qzG;A(KL*]dC_M`mYe(UKXWtM.Wѕv̙| 0m.UaK1Ѷ!Sdh%<2+m%P|"NVQ*o4@7H+\YM%f4YHݓ+vg]:~߽>`滂k<'_< b9i M pUFQŊ& Vz\JY8p.;@² T$iWC[g(<Pi>t"6f.H5p{ohA ͼi;㳶ÿû&㠤 u0 ]0G<A Lx {p]gؠ1> ެc.@G7Ղ_[tpݾ@7m}ioQE[>Bp>#t&["WÛ x\AFT Qi:[Z> +PCۓHbUoaʼQt&J+  5@{75a? M%#*|o~,z1T'k.+r#t~̉㣄qމ0W Ub)@S!:y4ۉsXNuifw7zsBamƅ"aHt$^L3,:s]>zQgɌQ̳(% d31{յ$_X*$&Z"M&4`m&*<y-RvCJy;,kMHYY/awbكmZwL_>Ա˹k{r~bPy l穆$ܖSu\,̙+6nЏbaQ n4Lo/$(qg"nXG\un`۩ &4E3)N7TGǻ14¿ +#LMĠɦ%ڥv|YJ`5IPjbO6iw)Sa}/V#Jvv$pBtQ|GwyX>/@]hQCw/12Li~eqőC/iI?Z@.K `&qN}fVi@ oҞa'} "[OOyЪV`Z/z8AҴϕ R> 队V.>&ɹEwsl`ۙui)RZZZ. :UG>/; Bx}/Q CFQ8 y 0sէJqOnExNA,꺋bf&Uvr?bhUlU0CV0Pa_#_1!? v~o`N{ӽ넼fL8/ nIx ]LQ˽Ș܇mZ5gܧ06"PDK0qIDG~~ol%v;X!}IJ~l` R>&aSGوϹ\kDvZ-i2kϵ[)bvyӼup8 pGeG$C']4|AK)M-f7U,YΕHjnV#䈹9>^?Tޚ:g{aA+6k9>wL{e'Fϯ= ufZnTm=MlE)CϠa利mL`=xX+[X TW$3Jp S ^DD0 hMp cә],6p͠B)y"p`AqUÇ c XHGGXvW'J#ߜtkLl_'$@łtjB`UJ[R:9uqBr$klP|oSJwX2vqy@( DSjj;!01g{uƂk,AΠwb7cC.x_w= 0/ t*_ hAl\:ӈZs(L9߃T ~6X>XmJ񨹝0`w0E Kx#Gcc?H feDhv [\"˒D ol"}Uz`li"ύ>]?o7b""48~^m^(*&4;ߠ$/Xjέ;%1YL ϯ,E5yP<}(E/SB\`v}hx+ucdn vbv4B1ñI?qu/3` _!ǛlM$cAY) IVM,נb*{A2!JKR59(#$FLYBإM&`B eM1:/?^EMe8@}Z&fen^2}}toQ1(<:9eY1n*l1pD/uށ|^NpѺ;̣Y)8@Q`tVX)#H'侜4agiO)~bo1" PRr>v 9 w-Sa 2;+p &327zLf Lv旓 dъln\ƒ5c5$o<'Cs>kkP~i#k$z:3 {~t=@ f 8\-|ҁ?w83uN)(QZO,P&N#cSZ4>$;~ {t*22FV+hI [t#+Dq&Pey\Qƀ-OINtg#IvԌhMCEWOP(nb7 f=Z!,|Ӭ{kM۽En1qZKN(@_%'wYF?k86_۩J/~C4y]]AoHY)k)?s  N75c+[vZ;t^* Ri&9 Zh R[4x]#as@2N0澍*DrYl*uG Zaj0tB, wW]ӻj S '.;V15ӛY!O*ym;gT{r)0n0;7)ɊBr>;>0ЫHsP0+fdݟ0]SjrAa Kӿ%J uɹwluyw%>utsqǝ ٙU>.X([\2Aͻ^GFgm>4% pr%Mn;q-fKA1/}hE{d7;Tɂ2L5ržgOX<P甮&mNҊxAQ6k,|`%Z;оx֧ qeH&DпJښ2L-y=tirYA@y(!g 0%C>AUOI8ioZBY!,qჿ)ZU3O܄ٳ@3{zv֖+BɗdWiyU27 Wr˚EO411I2RcwkS:)*X7@S{CI ( ,5j=N[D̬`Ԕѓ =+u 3}:E;m,zO>C.T8Ez l8!,D%fjCOq;o^4=PӼ(4\m墔t~:;mC&ҸYN;\]RLhU;8;V#ߜ||j-e,@}dm9V3=)n4$Ŏ]3TQyfX>5m,\A eA܌F6,nUh>Gj/~,&:ҫ*'L vۋڟgO@{A%QûwoBė[,?h7V81w}MSّ[SLׯu_Zׯ>wÿ;إP єZ475(t,θh*oi;}=7fܝ@Qff ̧4ǪШs_Ln]X 7ts=@а낣lfrm^=Sgzaۥ 37#}##}z?ANf<3?XcXl/^O~:/5 `mnP *#P/U1*k"4c' `G]!RMt } Q]9S|O"k5rd@k ti|}lQ}Ό >:hlV!w1wz96mF"NF=ff]3>z2X+Ro|zc>mJ/=ʹ%NDߪ'Ԭ0I5:8Ҟu̺gf+ΚdG70ޘOr 40-5L[ :f[Y,޽>"!}gx,pm6fӛG+G ek,1Q&_,~GCn`':xZr۸ϧ(XrLR2:$[I\6 I( mĞ:?><~ 3Jlh4}xqg`O؁HdqnYQ] kwv{dɼK#0YEJ&91le8?;ʸseIPeȤSAdOIxʥ"`&Yc+b>Kc>!Dd"Y($ cYOf,̅:exV!ܔŤVȬ/l vSç LjkۙT)gL?IZ%mC2}­-]Cվ>Ω6P!1\\y/ W)NF[eH.E쎋 K..پ&přM"P9_*R$%&e- iI#w;ڏyzEl<슘=ɡ’ ܞiubOT#H6錄<N1NE% #@|旅'^=*8lKQ8+snZ_yGK`)<6'rט[3/߼ؤ+mu_^XP{%i1B-ugĈgZ yw:-5'I<4K D&%Zz3#]ʼ(, E2 dlAR)bwf̅rs7OH3a/^~|P*F;zgßBf!k>SL;==zuG;@uGxgn]#5I|0~SӃ;:})Qd_ @Va)\CKkJM`p!r"e(!gajK?KȖiƹ#gZkC:L)>o3O _M&}j]L>i;sfXRRd-nU`wV'Ł4 J< W0$^SZLYUlOYcG>mPb:YOFgޟ8fHE`;iP!'juEv n',[L\,!Rv^t",EJ:/7%[ vb?FX78~츮|IwabSA^uk..e\I ^lPc:^0ˡ(fSQpFv`˪}ur}F: *aJ|LDbZ`#ŭD"%?F#ovL wtx|8΀|Ǯf VΜQ>ȅuNf& :o+.3.ȁ]8SD,+,]݇irF~Swf!Yßx*d)@<iaz4( ˌ4[ $͐Lƿɏk<=vr<QFLxzk:f5R ѮZjUqk`_woaplCNEIa1NRijO((xNA")ٟc:Ey.OX6m>l#&k^+6Iɍ:.D?q.--ƪW5I() ze :E<'} kx?}?7xܰgԧG޵,JAƚV4 >gۣ~;/563K0J4x v'`c{rRUd5&-pVui7Ú%,iO76ùZ+wQe5Jxȼ]SX C Wb`6,J%PeQa0-OT3ɾi*@jz$ +bR-ۼ"9l%TeUG)a|ǾN"Chܘy ׮Cmcݹ'qH xq\: Ɏ/K#E|43)םw:4T!Ql#pQ⑧b_9)קo}wިY8YČ4,-@Orym.j'/Þn5TV%ZDeT uٲC+PN]SagoA2c[ ZY,(2'"8ԻƴL (j؛Dt5P+Sy4U/DH#깘iR1X;WCdDͬB0u 1ZQ閨H !. k{w0frvۃMQFN ~ Axhyv=Tw JJC՛k|Kd k}m4  $9RjcJ|T!U)d>r'o 90WUЇx>.&뭷bOSt*s#' zw{O esHş.b)cu,֍DIbzdaIAݢZIUDŲφ,Hqʖ1$&east 5l?li`UCgμb`&X 9i"pv*GaENݪB \mV"iW?p1C9Hw`;s$ىZ4[}|#^E.'M˧ai;/ڦ BKPB*m`A#bZ=QZin;mn="95TD5oHI)a,`>b1Y{LuGRɧ(cI1PkPJgJR:>(c3Vy1GVZA3E͑Κ}%{9^U N 󲉷ك y1Y/_,߶w4ޭUˑ>6>w3Fuع:\Z]a=i!ɓ jsG*|(@tVE Y~Tz!^ Bwbw4kIBjж{Ow}L3{Xs[nKzIT]׀ _/ s=Մ"|aoS+Z3-9:`)spx9\m8alƦ;#%({4&?,Ta=I *BOKiӮ)*7e>x(۷Tq5D6(OK0zejnAXH͡;$E(ԫnJiRXuL~*L@1 {xVe[lo{,9Bw4᪂(`TtDaRRqq=`Ms%Cv;֢E2ُ\.%:j ܧb~@sY4B1 @ϗ|K+R5JlGwo~}كd\ŪrFENW]hPuolj\ᡯDT,M@1|rBuf8!RZ8Mb!P6XҤHW/L+bΑI6eڣ5D5dÔãʂ*GeH4ڝQ )0o%>X[: 5D6kgcMC)vXS-ݽxkO tա3G_5lRhP~lթr͗G#:,j7߹VYMSϙ}GK%͝O*Zv -'}"5]ʝTuKǯS~`7B.p >+{JєFDK @pՒ\v' hVδ. S]-q893)bEGɴIcOӣTuFG lУI+hoRDWncz% *(9b‹(o^h1 pslO.cY1/#ՁEH96@iT% K|$2D}sq 3q6ao'I4Ticq*CDlnzmw{v܄I8 ?gy"2DL .7Uy"ȟOS_j* H[k.L

_=xfAW4YO(}M ay2{|DiH'>24:hqbҀD{{i\Gwqcw$+6ʱ rayR@ɮ~ѺU yTs%6y-owM~;;}5 M[D1+m?  9 P9>p^N,B״vkf߅>2!Ew W2Sq s(1g~v>Cg tp!-6`k? ӜcN\6"lv2+IM(`߉0jE(̶j yd>qrXu޸ n39JLe?3Ąx*D, &@$CO4ʡ]i0?S.Nԓ1:@$ U FQR[@܂O ZbI\JY鐙s.Atm`)3X1 [Y*3rLCrl('r!M@ ,$u] MXɅ:BeJ1 qFĻdb/@Kp ]&U9jiY/uĀh r8$tgD: DkL05c9#3S菱E?"̤IT:" jcrx،^Ù@}=Npv*0& "$z0!RS똋 d1U!0̽56>RuNGBn"r;Y8PfWB%SmA> "$@3"dYRpX.r!b`T¤r-Q^^|Y,}Dث?2lTTA4;i&XL<׫2^9ٶ+Qndb)}fl^٦~;@x7vg z %Ah 1ٟ`#Kb؃EB!l(0 ?p6xֶ(AD;ԦwaLU0WgB;jOz+κKgGmF$ 0ƻ6a3FjWUvo)zZQ‡(HlSzC]^@,u+ W2>gpZ\yZ&0Co7FO翠$uX ׅy!㘌as"HjK#K1*0rUNg'b&Ca/޼E)0哣*Fi}_̏kAO޷jxCc qq}آSf\؏U-OP;Ct15dSmOc9`w=h;z FG-~ Li1q3bB)Ƒf@;΢r.AUࡢgf,A`}xy=8Q֤O  6QE7UɒN &(xT Z=>r m3<eNYhBYT-FnBv:|X+5k;::] 88x-fz'a< hp m.Jt~ZؿA`7dvMX%b(]np[ҽ|_k\0MQb7(DtNj5QdE-+(F))M$"~1譁F,lnD"?ŨP8nu+St)@ۖd(mWn%RM.;KxLQE#QJP.eZҟ՝W~6b}CVU1n%rsU֌Qh^RQ,i({9pd:,7`!元>y0_U>,1`* dI8OƤl`6TJ%^3vG3tĤӅ?8 Jt:s̑v zʙl༝ta.YEjk L}{H> d Y( {j"cq{ M~M^%["XEv_4_4(H1vTo[`E.7aX/Py1v?{|sAcʘy5B c9Ι Z ]#h,Ϝb"8z%YWS5kFخa0A M # M-[I5QH9++K; ՕSB;: o.ɼLFrT"J(QYܾ^"Dfڮ6-s纑5R"5N (P2r)khp0)XT4 4\El*XZQ_h~]9xT]Ak2d:y:'+cbh b>M0I"`F0.1 rZ@|V[|({6\+COҖ/Srs؂DI&P<H1`mCcfHP!Z_EW)l>; W ui,w{ԊucwP`bN2o"_INˎU<szFg#4G]FHcp9VAN/{TN\劦e FN[ nWSZ^ q%;.BVf ѶZILZ 8d/ηv,(Cl!sTқDz~N +bINlQA^MgHO29)Qkj,pɣ516X(0"-{`:F }l)Vת2URW)t͊6oqm®*BSc9;A)ܰǺW\ \/$ƫGυsh |q!(x=a'3hNܧT$dX A<(hb84|SE[=EF5%8j.'*JՒH̗h {i/Nß ^'nŴ U%NF)U,T7X& w S/5mG/ A3x*s{DL8o4oNJK}-fC1*fM_XN}輄H;.̴F){pь?laShӸ0CgDr` o^2bV(s~vOLo tcVoHL]V@i^P,@Y)v2eΨ]Jlomz_#>-~ÜZ?=ΆYՂ3מ~9]MƲ62#sYѵdR\;nx=X=x ki;`s.G)X0~@XcfgUIjj$ C/|x-?=ot5َnc|&:MhB`v?p6TG))kaRɕ xEvՋPN>hAڏUr |X. @SQ/Ɠ@訒9W)Aؗp VTdu>$ 6KMUT%RL}}/ADZ^=WxGQ>XqjAZT*<[z~N_q) U,&Q]ߧ6v:`أn;N1c\?c|,iaptEzhѕV.S.I hzعƦk@WƊ"5y-+(i H 9PhlZ 0`E(!+B:|[(^ ѫY@Š;W*>ɲ/xf]rh7yDI8*NŞelQV&[%j+3C,`HO^9 * 1Xdzd3NqrZ8'x(gj\cՆucmE *AauC4MA芔Ip}Ft6jgiT*;|q,BxpC0<By6C@񛩃|7? jQ_E %FL5 cqAsGǑKn1'd7O$byڊAޛ%yW +ǠcG<ĕH@0wm(q|`_s3rLʝT?VطVxK3᫒8m[ , 6FAkUw:C-lW /{tX_$*71OT⧅t h^DnaQQl-NL,ιh 0oQ썰$K׺ -QMĐ3&ˏzS,zcr>L.%f@~kwXVAv)I.d|QLGn J1¤eo<l֥R)ڶtXFȢoRy)C`YT́iBRSGdzlGⳚXGc]?z*cCr;DH[GkYV|,C }g~ [@<^XzCPleuvؒ\%Mpl=8t#¤cM(Hcw;ls +dR ^vs@Kg*?CgL㭸^4 8gð'QP!Bݥ)ֿ_&nAA^4χ _HICMHp="MFfux FBM㽶i%N-PSFCy2 M8s;/Ӎn_v#$з)b43+86#EQ+|XF7-8%d+w۴q~uPqL@HڜH6Z6cCIlL,l@YKtZno13{]YW[ZHҊ<QD.n-#C03GOo^ثZYJ{b4j}hNt1T(.z tĸ-j(ۻQW~q]q GJ71F~&VAFGc頨gS&.I+keY1Gy8#=ڪ-nd)h{k d=CRY͋}muV/1Z>P$;5;|@lhDKWMt܇ɵ~}pD"MFtJoZ:VVDcT\C?~ջpAa uvEDҫL_ٹ(VSnXt*I ei:rvϜ:`&p]JJ4] uj2w;vzxP\wpwSᇍ |[oQ F3/\n^引*dXAqk{,7ޜOM~ 6K2-W[2Y\qU-۰ֻ/UkY8;!+ QfiAu S"'hv*V@jioI }Qw,<N֤!8^ lXgw%˴>pij' p uA0: K=ݱNК6fȭ(aXkUF0s* P}=Y:E ո?1gxrެ7=?~yt^iE(]`5ҥ EQI^шxz=V6( \I_. Êy{77Z;Nî_˝iGa-šr]y.(>YZ05ڴ45HNiq]UxTw ,E?/j6ʎg9(v*򵾁.^h5`Z<3[o~=!S˿aoR m-_YCk/l07ƩݯaQErW]kZ=Y88.w77vV>=nj$^Bdrz~CoG2z>dz|gp׈6\ +5#2Non^[U2ŝE| BEq!ZcWY4A (+QuÔ1t;Ө\Ұ?)&o]3o=>W=XF(\?P/QK=2޿5+LL[\3E\[1/VOY:\@>4Ld@NG0mR"TTRrh4"|˸t(%iRN8n/߅لOcI/?WZYT'=P1_W;JL@ ?d|s UR xXmo_1h[$R84d/M>â-4yH/%Ő_Y MÙgfTx#\ ?zQR VNTP֨PWW ܠuWRDӢt(I`"ԢB*Ipna S[XmC dc Ol!g-XPM~@0mIa&b!X1nBZA &W^hP(2:ze ZFkޒ- 6dRl!JTܓ6 i zEFb iRDCek8/  ђPQ?{VheWi%6,Pmkհ a[a %oh, jT峣 A%:J]aSC=lw&<|Yd&JRK*!RXQ7R S" qmg!NǓ糫wW9r%A>o!eoƝD bNjr3򋒳ɏW˛ ) N^4᭗aB>4QK8QCSrpzg+_dY]& ÅC&ڷK]W?}s代oN:Y?p4HSCϕu"moyE?Vt͖"q%._ҊnBBy%K1J^LN୐ٗ c?h8fxqy gxwZ"İZ&.种zl@0}NwWIlv&Woo=^\Mfwo.Ww3HG  C7_m]}6sZf7d Nd^l+M-,u0", 5:IN[CXZPB%svXeKWMHnA\CO0T /#FF{\%!G(ဦ-QӀ %-INcʰi-d0xǯGe) dp }e "H1;cW>JPja 5KcɄ GJ9K4BMj!*4-7d5"w{ gh$I BPXJCFzx2"D8U\5&|¦QF0zdOa<nP?\\9bhr lX bw x51<╣=/Qdς7 YZFB% rjk]=iSV:{RF( |K'RXovM BҗZZVӵ#-hӣB!z[2:墇IrLT Z56ugEhbKb]J/54G/wOkO w 7ONh" }$g1<=;; Gg2';{l _7>q>.'>8( ^TrdXsS4j߿=;=a8 k?NӾ !j%\8oT{ܩUՉfw ܈rA H;iVJmC £J3i\=1 ;K {vLO>wv׿JًYوX6`%;6>U\_LƯє[beGXj1;$-q3 8\K wd}9nIq2t2yElrj HK͌ Ʌܹ+PW;'=: 5tk|iCzF+!f|(riJ̹~܏Z׺2`QPE ﰤo b҆bP2F`^ =d%Uw)0^wuWڔW2/މY;j( ՔZIYsAǺ+'gOLXxGHF]γǻC9n3ӃW[̵Ol|ΝXFL)9:o ۅg⭃BKN`^*ن ׳J"c\N4ܭ7dA+0o6_>F%<-(bѴ3~F;+֦w8/-m$ +ƶ}Hv^gӽK)çk~xXrF}"b)eq]J7geH9. <L~%[3 %g 9ӗsz؇ R'X\"c\"aPsdl ) 0JYI:pA!/ABaP!LBѢSy=z) h 1c>Ld-KqƦ)[:]`o8?_I+tLGvV>\&)H0) ;XבQQ 2'&UZB [جEJZC:֤,2Ks=E{8$p )vw@Ʋuf8z Uian?()` '(6+ p0k(a@&44-7;vN:Q6\48H_k Jb'sCx aoc؛&bwlX GcݐC^|xI]|dlP!J AYni s%+RZqYNaAJe7p}Bj׉x8BJ ?Q4QR*7|{,ͥPzOTI)*%[,*7I]mIZ)9Ɲh5o,,eIw;s7Rz?s@WRPskzGc0q;r/M)JESڄOG_~ewp (is(Ƞ] fG.6o?߈<=3ꁝw6D)-%b5wߡPv~F ņ`H@ xʪ4LR;_8x]P֜J"Atף DcT;tu>>~Eefx;zFEfP,2w:g&MS(L͒%\/IL<3 %gr"d:+҅YjS W"_x0Iyvwƿm^Ao`w]YdJ%/5_zjH.P,\`q.EAO D㑕|"ύ³Bg67)_bقk9|%+L"d tVH1SӑkqKTC`Ds$*s(4boߚ[f|/N[ n2/N?ίٷ/㓏Qx{r|˗zહ@4ߏ> F֪-mGI6<~z>?N?^4%l[hjdƅaDjg)떉ܢɡI!LIxz 61b]BHrK!L V#:-V c @iٰp% 3X#}~KNF.ʃu:޼<.sP/P9*(E\h^O.(Zߴ@‚7P[h)CH ig Qgʂbe@fJ'p OL(-GqPA.MKqcv*2/@7^J 4O*_J[XW"1S2L~!9 $Vߨ1 "c<ԏNX@uV;U:BtOLHH.mO@jc vw?k$)f MJ{< -fYeMfH"b:c|B܏% 61^N* )94Dɜ;m?⋕ L&Mr01bGo~۫[fXj+O(𶨡)`Qef|.UZyͦ:3zkw,pYVn4*||Tp.i^T`kʞRXK@$Xڔ kq<Ȕ>xKVϻ}wV{!xcWmO9T[*`5]c1`xņe|䄁J"6s a@!+ &"+P,bcf o]b-KHk*"A.=׃*:ݧaǫ([r g% 7y 3޼mg]BNcɻTYޗcVV_\Eȷ7O%]n&&P~zI4")˰$®|äTczyг 1 `nIW2ɉ#= Ԕ鱼DlRԯ.A p26~6աP&({,Ւ"54kޘ'Sup4x!]Ƣ_cb99W{*8rֱ^T>@խq_'siw5Ym`!)nwZsl)5h@$V_<[u6֐pBJᅭ-8j=ʉ)Q ݝ_8]7 v~ .JSR#S[ $AUsg#s%8Qiw.vQ*z~%[1*=Ӏds܇ bSOaX72U9AUJ iBD4G^}9N 6N7YweuqzWZ{z}""7* 0OZzaCfR*FIɐmzWd78L+(m>%iåbT͉S}7I'C.V*f_?y`1 f6gt8X'@CzJ{t^uSYtr-!M,\ƻ,)f[@jJmcS&D>/? .i\FQ,`~Q) jGAEcglj {D3EMlRL,vX m3qz2m>)BP=JS'.q!6%;h6H{LQcvl5eD#rWŹn >{}}w勽ӪV`aPCVKU}i2,syꫭ'_Vmߞ$>PZ@>'>qع k[=!{4i-u2VBYbG)f<جwr[e ${_YNDy}gXVivn&.7%?}ݪZ</8~g):y8P2)Rv: Vi}{]l\uҐ_W&md }F~>3)=ޫS9zp!9\^Jvy8wkqAǩg ⩂]cg]+'~d/ԃ*|3*|cWRɩ<\R3;.bZJ%.{`i"c?|8|z7}<\@ڲC+3LVFUp(P:;F 2NBu@E)@Ff? %3v\JMf,X7yPaD,$yO90ri;5q((zpgYЄn%ۋTaQuO^ϸUlka}Y~ڼrDzomsfDa!BaF)M?ǭ4 '+n*8xm"]Dw?Rp0tuN<2a>JEʘj]}'] FFj,_EIEUaչ›2$~sDRߝ55~\~{S?zRRK/ `؄T*n̔w ?`eШȊ:HWY$<𵽸6.qޣ]@O؈+a`nǪd]:iLzmvDF{ )$tN 5(A~H;^(nԉ L70<4H9/j\) "K趪J?q" yˮT-2RR`9!׬*riTj{uu eȶč<&HPu4Ƙs5-fJK25N1F]xSr0 ۆeYtA3CM d, TmlW&^CC0CiV}sjz#ťT3&<l$eMf|>ǫC\3%OB^,6{.W"n!PF/^8y!F'>:zÐ% 3 E8tchr*-`qp|B>03M|!eij㋑i8} japϡVaI *n+WdfKR|6)&4@P5ntcrI"S=!$$L/"3//HVHľݽ/S tI٦~^O (C&4 !yO- ?8{%dOt$C*}? 1nTG:)|ɝdܡXªh|P`DʒxK]A .Ä@Ƅ4P@$QӐ1_Pʭ(~(l /q88]e%M #~ds%2"~APue'E9:럿_NDl?JƈT:Hok)ڢ|_ǃã7!Z)2ëӳAAșE9gxcOMxհ?>Kw`' [#"P0R| ^eTz]Ƒ\>;;%{Y:N.~*W?]+?|w1>Z`d2GKJnbrya(z2RܹjC%jNOf0 gAG<-MPFvWK?j0e\0^RF:X,#j4BD֝Bɲt-]d*=F|GL63hI ZZ^RCI,G)1;,0M^4O2%<| ~ng(KW-tqĢ4!Ɉ<+xX=fE+䗫fOħ4Dܩ:Uh4ZVUylU ^4~JN,D}H",d9V]A]ڰqǡ5Ҷk5Һ"u]ζiN4mt\]ՃN킲Zl挛nb٬6uܮ95hN]o7M>اvqd?ֱDžm4 Ik1|JM55fͬHHiкӺ jUKr/dJ<}*u$ aB pK;SHm ~RGsV2JO,8^mÙbP% _m/6 2CЫZ/Nm#占U SH蔉'BZ#H(cfGl#=G,,8g%c~{Ik˰y9n&) J hJ}E)C@ g4a; 9[M)v5J0ȟ YOYgT cwM$<)B*% #> &NJlL(2aV<$ه "1G۹aT8@A͏2'g¿6ِP Edf15 bqB=}>o ( ίu֥1Bs/.r~+p/"\EycX' po}Q` JAJ'l*Ik&RCS=/=?(ny0!sjYyM\neFly,ʷEƳNoz/.SE8s5p3SX" 5\I4Ipnxl 3 ]$Z]>/ e5w kMlox340031QrutuMa`v|NmBrbJJ%Ïx}mЩ CP܂TZV<ߥ3)o,/r.QXPİ1uIϯ߽/ZON-b#mƯ WJ՘)Be'0t=R\VѼ?e/R(K,)fxFgEDM>.~Q"_ðpá*37k0'A sSK2RKOTQ*M 3ΘQT\Y\ 3orWYLkiwDEIQbjZf6wM~lxVn6S|bi˚n$^İb)H@Rva@g.Oq`Q9ǒ(-Pzމ宅cBQ <$4fw BXHXEȒp2H`{^j1~|?f\sZ/CR 9v4 5 ) 㞲iן_fSL e!H'ɥ/wbvOP>ډDg1W2Ha`~z%%N4'4\*U( Bwa4@9v`*ѐ>vQoBdwzwpG `I\BBSlpiRa/$2vqhS/" iEj5bI0TE=;}$Mzv{ېTLjeb !*9hkqoo  bG)cQ Y\!R?AUOƧtrg85OmMZ2n=)sڨS`%R3~@h qeE\.+ b)2}zO<+H(;B2&iA. ۲iXy SQZi Qy sdId bcQfn%( 3H>)fYڇG'L-£~m65j,1p3YE 𹶞Bժol՜>k w5 -NZk7Y~ah!ކdTՙ*5[d$@C#],'f"Ja=/MDrz'h>^~]ygOțf%N-~|'({ "8w"7 Ցa:aj-`WFk~́HҘ)gh M*EA-"Ǎ2ݡ_uz H5f\kSpNxAo QZ9(~6[aK=-BmRii+JEp7C`-+IYdYy*&Xwh1=mznF/[V:A 1$Ԗ) -%W)R׵9}_~o.gߊDŽ"C&nͬԾ"1]D8۰\2{q0v?t0lII99x6 qɚAј3_wkx˙;:zȍ޼&%|MS?Ox-#kPjJfwL6.͘lga x340031QpNLILI+(Oah(@xUwwrlLv;AxUn@>O1j"vR@ *~ZNNHQ%'I]4P# 7;|3;gBg/__r ?}Zٛ xcYvxV YNlv`>!bj fWCpA:;yXgF8G0Q+fL'GFj8ZY .ǑEDc<#mS-TTc&:Z<'cNX2aDGqTV`!Km|S^aM)TL M/P!dDR Ʌ&JfʶA9gHV2Fh<>5$6цם\}LI%T;=^8°fv˓w|&9S(ְG KɪBFYAtx}Sh2AA$ёP)Kc…oc7 0ļS ?dӯ~: JUE~:lL}FrAz%QM: 唇T|sO[|BvBDTrԾ3㿰G2wڋDӴ5գf=44joC+v~7DQ0*%բӥ{ȏ @/1FN sHcP>$뵛cR vxۈ> RXnt"7kt˂jA%(wK{Vb=e0OA*R[oi7\H:}@?*Q\5V+" ޢhDm$ ;C>֊+[O?0T=x340031QHI,(ҫa`WഈVu-cއߪIBd&%%f3LrbRk ghOW|;\ĂLҚ]g.h<=i׹@%mTYy͌w>2 T]O*N-*KL,+>sqփ. Gp4̄*.N.J,H-ݴ挫^Ѭ2)H,JM8+WձL^f͏ݠJsƹ[sl4dUʮeu0Ei`2a.-Ԭzה='9dc)xmRJ0+\tc^$Ž xw"ehͣ$s_ǛG"i9'@~: eT|kѐHLP_)p%1%;>uqa@OP+ P!C8:?P_. :rkclΙ)3m9sheࠫXP[X Qb7EIGAIW 25000U\ fO>˘:ٓ.^1jx;4*FO9xuS]k0}ϯ}٘!5Xۡ1̭sʒ'I |xĹsQyu0 (% !DK(1Jmz+$>kiW3`6n4 vA9!PUӸmZ\pkR_B^6 <}2R‰%Js$͏4$:;N}?H0דH8/n݆t %#,Yt?$ \xq3JE^l$Z/KMxrZtDS^fqCQ^UaSG F7}Ʃ6m`XH-yQw,Գ\C ooOoB ?&t{*!3!T)ti'IpCޟ0Ʈ:LG71DX.*vY 5WۮwЛ|oA?Wҭ&]6 $gx_ZTZlťQ4QPD$0uB-,?4 tJSS􊁔V|҂Ĕꓽ=+d8xmSkk0_q)|$[LPFfXB3Vc ط^taY8瞫~'K & PZ4 5.ڈ<Ͽ״ b|@x ȀGM`|~̒GΑ")u+(e9DNC+®`@ SzKoFs%/%նBR9[-'d+$w#_+ocr/J!_p Aj<~ygX퉑MΪZ@zkcǛqX{`6Xn;]1-lyM+藵W@Z᎚ZIi$J0c*[r%l™Cz 'p%MLZPcc2ɃIvK[1h _5wr:dWs\v}g-iAgyCAN}>Ɏ퐟tb ( o~<3˩g?4PRNԨ=Jin*ŀ ?[]r) aL50dYJ" >Qۂ7acN Ʃ)x!`D+k&ym&+hG9#oXhLe,@׿uqh&CڰE4MjDcDI8jd~'\(!‚-5yd: ~/ua?&xvJ>f+y+|%tILəX;PQ_ݖq0f_jBlje.~xROMz#n{BW{\T옒b S50L3K,~)YԘ?Gafdpۭq: gw%IzrrrLr̶]jѧ&v"x~o.&oA>Bq .ᆘՠJ+p4lbTpU" q҆+lT9g sN=5>k ;1Wo4D2$ 7&[m6FdvW h:[Oc˓,%8ӆ;=NI֒>[,4+8VvRO 4+9V[ K t)La704UsUyZr2A@[Aj;*E ?;#shRUGdG:9B-wMR +ߧ*|g}uzlr#*R[C by W3)w?70 ^(=S'ųvlHb[AʨcuJJ[x[)VpC䍜1NNRW!x[+xJpr6҂Ĕ+.WAAWAB}26v& [xTN0W)z@VJmE/,UUMplc;KlRJQͼ̼n#sV8V%7:•Q .\n*M^j} 燉 ЅPO{BW4+@cHURi `] e"UJ:frv$M"w eT#hOJR}X,GMy#إ1NxʬPZ]L 1 ` du 7WbVътd#L`use8aOOYV$Y;~ˉ$5 m^$HSs+jyiU~\Sy-߮jy8x/;HNܵҟċgepb*}:)&8P+"c(]7R'sxݗUX2.g+aZBۺzwLW«}؈YOZk5]XVlj *#;r~8N`FՓSpVݯN|(ϧ]$Ҵ _7@静w#%mf:;xXn6?O!`5%N 4qRuYbTZ:\(R%);:`'ܓĶ[";hP3( cvo'P&@&WKd5Ϻ8W Uw(ӅBGqڎC"hT#㣣цKg= (SL@{J>,af.qP5wrrtJU9j:z>mYh\5m nd> p*6Nb݃"LPrtHUFP-jiHLt$q?QO3!ctŠty 2|ugT*n9 Tj_/aL3nEJ_3&Ȇ H\0[/0YTr>7EaDhcJ`3Ƥ7äd%A P8oG _s9Ae1(&&}9+a<\]\oMJ Rڏf"nEX2C4._zg3pX̟ Soj.X#lIpmZ"5wxnί#Xֆ;O&nw#Ep848:YLu`+~lt`} Z<~~*1aW?{9+mX#NQNEW0XvRPc:R,_5r؊%m\l҆>o$28\! &L22R94}}z}JtEU*K /maE7Ǵ0E`O)d * ߗ,u*CixZ?'RٱoHvގ$9e{I0ų5<8+zfﭳyӚO!$>9)‰Z(Qr*8C*t=]!9;GՈCtˁȥe SR(X볷f~߾\_,/pp_YpyL,5J;\.mxv}u1 oNmwF2jH.mLy.6GQ.~ Mf] IXH #ư[IUoECU(YmY.p_+ѧY dk+Js~S. #s-0%ՠ>ӧjh˯^8_: ?hS /Uuk6y;/vOX3 hJxeoU3{YE,?w?ݒS_'jEv`tTuqrQbAj귷_x{TdFv^w儻odKsՖKt/6?uk߆9ھHxĸqHȉ6K9.?q#喛f:% 0'xQ]K0}ϯt'ێ6؃nUDhlK6(>#%޴N ܜ{sι=&Ua-D.pBfl4 W`pCjL0^E'JIx,JkR_%tRo45IP\w%s~NF4}?iY$6Znl6unˎqs-a`1vUpV"{2))қu^C˧ 2@t+_i@8~oaF7c{y8 VFOʥ \so\' R֐Vxe"O~Yj~RiD}_f sb>ڨ"E-TKJbCx:nqeqIjbPBbAAiqjnf^zQ~ifE0FߏMGxw# Use cargo-chef for dependency caching FROM lukemathwalker/cargo-chef:latest-rust-1.89.0 AS chef WORKDIR /app FROM chef AS planner COPY apps/rust-auth . RUN cargo chef prepare --recipe-path recipe.json FROM chef AS builder COPY --from=planner /app/recipe.json recipe.json # Utilize buildkit cache mounts for cargo RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/app/target \ cargo chef cook --release --recipe-path recipe.json # Build application COPY apps/rust-auth . RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/app/target \ cargo build --release && \ cp target/release/rust-auth /app/rust-auth # Final runtime image FROM debian:bookworm-slim AS runtime RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ libssl3 \ && rm -rf /var/lib/apt/lists/* # Add non-root user RUN groupadd -g 1001 appgroup && \ useradd -u 1001 -g appgroup -s /bin/sh appuser WORKDIR /app COPY --from=builder /app/rust-auth /app/rust-auth # Run as non-root USER appuser EXPOSE 3000 CMD ["./rust-auth"] /zxhJ)8f($Z)$'&gA'[O(Z:9Yab.{NNnbAՓm ;D*$C%&0N.cօa\\pdB/0Z[`89Y}ZGF,-N-rvU00ruQV҃TZ&ZOxqkBg^qIbN_~J^VBfB^jjJjBZ~BRifNBqrQfAILly@uYœS'ȳe R6Hb䄲&0N.c'C9w2mI(,URbݜ̤ԢĒ<|"L;lʢ)nb`iP/FSCx;ǵCTYєGSJ3sRKS&*C'{Nb\7!? '0 *+MUMLOj+.oP^Y2Ef%Zܜ2cXaz0 J.*KB2<_$\KDT%dWEdl0MSiAzIR)rљ. 17oӋP/Р`:'20";OΗ J3E5T0~QX-ϽFo<,\FZ*`q+N.!BJY ۷[nO~\lLif,z[MlCg[O\HGD3j+ ?/?}d.w+%U?TX__0; n"oiF-#7 %!8RX:&7LċJa{f`(Qp R5p.5ttø߱Fc;=iew!:Ћ=3;xҁ&;QON]st-*\ \BHS2T,8Q%1/]s0\[A)gt>"S]ê## M[Wq' KxjƩ SckxtA$n5y#fZ7SnH}e]|eH~:aw۠Z}8#څҘx^}v HM!+ة*Z< :)Jvoⷙ ؼD:ڒp.W=ۘ|5.0۫T8UR;8yY(ҰJW^†X[W2j>wwgV!ǎȻn~;Hl8|htF`6Oŗp{1+ǿwכ|4 fLlyp=Y0?Nn錒p|9JNy\něC2OGmEO+NKUx/%<=dr/ ]Ux340031QH,JIKKKcؕj嵒_X_8C7$37*$3?%qޏ d=TusSS̢Ĝ ^ox/@׸ٵ%!R8׽Mx0m+#Ҳb'˵'eǶIr!xBqRm=GC' N}6 ̆wigͻg4W7)xIR* FxdU -Tu_MH*JD+bowQx/6P)-Nͽ~z_rʱa*Yb.rYņ)ۥ4DgqOVaf55@;5EO)SJIELa{xх_aX!(W拥XVwO<j*Gm_ˁ@q"ھd^SRGJnd-T6!,yXUŝC_zܢUm޺x|!4a7EBP /L&spa]G>T/(xMj@ D A.!f MK[n6E+7 o> '\-95D\1ga `>5ѦMC`.E4-~Μ\5ؑ6Ԭ*ZWb7y0'I[ .{U_:̦gr(eR;w]My;)t14?:_0NxVnF)NTcCJ, IP0>=vglH؇'؆`pߜf?ԼT}%~c_WsP5gy8e|DB W"0q|ZlBe4[_ayhl2@LzUڌe>BCۆa͖0,P$ PPDD!<9U҈+&̂>>Z1hX*eW-AG1s| I-,* 2k1 Ba8o&DZڝNoheX8eڢ=]bpC!bIvAܘX1Bod ^^wn/Jogݨլ^2B{{}'fFm+1#nD{YQkENwnw$k ct;;7{;CD\j0'p7HZНĿTq>8 ZWngH5!wrYz{<OQT,IfЫA&үь 8kh#pۉf:fH u|;wN:p}k!VQ U(fK&4cJ )32(/oPN3ꗋ]Γξu5kUnaJ`͓ k§Sz (YA*SWf5׮e魛Qo Qg{S_i98xL~е =I+7jyw +tj4-x&HLo섦O,QT>esA$=9'o)_6mIf!Iky5p:&j[DRA$o{I}sM-5Oi졣ȦWQNE>GϺ*`$pYt2Qf,x340031QK,)KKc;JsR#܎vUx-j0 ~ hZFmev$`-p,#+(!}4ϧOֿr^BA_ԏ8̂1 xCT 5Mɂʈ&) 6sD 5zP*Vg`Ȣ?``NCNVYz($lGXFg97zO8.6eYfeGi2;6ѝfggG$os}eN:_ثwbώӿ۷]/0B([WqR6Lz!A̴ ) {MAw,d89 $ptACslJ9P((׍4,.*̺`Q ='g4]j(2h6ZyoLʀqD_+pQXN oDEŘkQjO֫]=uU 6$*Hʬyb7#+ V^HXAc$]X4aM%O `2aqݺ=sTj.{l.Ȯۄ;a]u>[vB-] ZاT-av^qi@xk|6B0 $؊KA!/jɋ'?f lT0yLr0W2rkӾQxT͊0)ZvPz[)B'dFr(>DOґ8=t f~fvmf^lQhlfN#׬OPnG/~ީoHv-:4Вch ʌ6P .^=C6=V0_ZDGcUARI-s3F[B<0zՆ5IfCTܠ`7ʅh- euP$}׃I i!g`B7WYȒ5R-6c+_>Χ,p&w*~x==$heh1S,Yhrgy!էrh냴 g0d?wTѕQqMNAYI_ILWp7~~ffΧz}7?7 yъy8} CLkƥfQ +Uwk:mx5{? RȵYfh=ccN]5 >yX KLeR-g ΜY|[Ao_owo_om3eK f<7Տev;rJR7SX0x/l f(9qkӢAX6ZJꍂK(K[LJk; ƴڙI؉tHF%4ySz SuآX6~nz`A D3 O"2*QJ P4՚+-NW$tԛDpv7 1 olϰ ~LM;rFƓmm9q)s+h,w2|az+5ĥFs%mp¿ UntWJmX vl|gpp/R1鿿\njVi8&@PE]=ȈbCC,%7kKZ| F!KQL+?&x340031QH,((֫LajT*E+}3lxݩE))9EPfVH=k"ߣk@@Ԝ'&\fy(-VxWQo0~Wĺti S':lk̜8rU!#Β4#Z=>w~D %KExr(avʔ&_ ֧8ߣ x7q :;iY=pH(2-nʱrKh<?կx;qe˂#%T/1'+ԏVrksX8eQ5ek'"LhնϢ Ar8XsVu%) ,ƨ(jѪfRfs) |f08gn􆵋P+Xa p8sqp[Q&ˌdiK^,y>!j|\oG#tY40ʊ7 Y[z$,/FQͤʳOcZlU|$|Q$K]r-$7u@ +Y+*xu Fң74+z;If7|XE@+F$^j<ݓ{pa "vfl+a\j 뼍,䀶p/;z98sx|x腵7a@_1As yg\ˊ)L.rtI9/_ XCȇb

g|z ڞ\/lƶXKnjO s=-m>:=*ZTcjxE'n@GI"{SsK@'"5IߚN@'BYSsTc;F:\x^gC8:NnWwpҒ⌤D_fBznnAQ~EB~£) @ĥ@9E3s 2R&d92椆')h++ҋs2SSuv$L760@5l䏬`ݙN&&:Odƫj+2^p, pGaRAv|ˁtk gJVҨk [3  0Bqaw2dr2*83okE"3_cp2ڄcL>҅Qˏ0-*wK]y{,f0`ykKf^) !OL Bj3dSCuGf;m)&( dDZU7KZcձ8jTDgQ΁K20ʙ`Ӯ/]a%iGXeUxd9N1XTT_a|$X[]A 4l2|[|c}ӻ% [/j8Y ^rh(HIVgOFAHޛ ~&pJ?k'QFZ9vTnվ1a9p5xV.?~ySdn]5 fQAWXL Wzx_Yqqz$aȑy!J{qID661/\<~|%H dCZHs@3kJ +oiM;8|?dkHhOM `Hׇhf~.xc zpAww~TDo6A.mMpx['AxCdSɗ&oFwxA0 }?ε0aZ%FU~_@ok{hH݃!xqY{tdjdxlYM76s62vԄ۶!^a#~kЂ!_sjxrNx10 =,FPֵShLa3!^ph.Ӛ01TW|gzEbmFŠ^x{t+(E #ضOt?A rxm0D{&cCeA1JawX@a{w9Z(*ҡ%E?6bei.'i4dL:ÃПx1y\}GX$E i.@ōp@,*Z@A/O-"BwOo|,)%% Z3x343$̔TgW<8&)k_ x340031Q0*-HI,IM++`X[]5OB&&姤槔2tLzrl͓uKk5n_/ǭh ůEg۝[Q2*d E ѷi<=&)j}3Kt3͛_û{Qq!c;P2+tSR r+A1XtKw55%bv*W%&!2ὤB!ߺ5~|bXHLΐV$奄)n󂫳3xUn0 z ɀtl\AKE;jѐż=HY:$'iUZߴ: 5$Kv alFݽ#li1,x00`xFc pT. X+}Vu#FVJ >P o۽@Pbu]itKUolXr[05``ͺ4% =,HA[g ~o[]eonټ>":dV$Ys^53ws:3r\ yNj2~|>)k @. [4)C x <# .SYNOPSIS Clean all node_modules directories in the repository with optional cache and lockfile cleanup. .DESCRIPTION This script recursively finds and removes all 'node_modules' directories starting at the repo root. Optionally, it can also remove build caches and lockfiles, and run 'pnpm store prune'. .PARAMETER IncludeCache Also remove common cache/build output directories (e.g., .next, .turbo, .vite, node_modules/.cache, dist, build, coverage, out, storybook-static). .PARAMETER IncludeLock Also remove lock files (pnpm-lock.yaml, package-lock.json, yarn.lock) in the repo. .PARAMETER PruneStore After deletion, try to run 'pnpm store prune' if pnpm is installed. .PARAMETER Yes Proceed without interactive confirmation (non-interactive mode). .PARAMETER DryRun Show what would be removed without deleting anything. .EXAMPLE # Preview what will be removed ./scripts/clean-node-modules.ps1 -DryRun .EXAMPLE # Clean node_modules only, no prompt ./scripts/clean-node-modules.ps1 -Yes .EXAMPLE # Deep clean including caches and lockfiles, and prune pnpm store ./scripts/clean-node-modules.ps1 -IncludeCache -IncludeLock -PruneStore -Yes #> [CmdletBinding(SupportsShouldProcess=$true)] param( [switch] $IncludeCache, [switch] $IncludeLock, [switch] $PruneStore, [switch] $Yes, [switch] $DryRun ) $ErrorActionPreference = 'Stop' function Write-Section($text) { Write-Host "`n==== $text ====\n" -ForegroundColor Cyan } function Safe-RemoveDirectory { param( [Parameter(Mandatory=$true)][string] $Path, [switch] $Preview ) if (-not (Test-Path -LiteralPath $Path)) { return } if ($Preview) { Write-Host "[dir] $Path"; return } try { # Use cmd rmdir for better handling of read-only/long paths on Windows PowerShell 5.1 & cmd.exe /c "rmdir /s /q \"$Path\"" | Out-Null } catch { try { Remove-Item -LiteralPath $Path -Recurse -Force -ErrorAction Stop } catch { Write-Warning "Failed to remove directory: $Path -> $($_.Exception.Message)" } } } function Safe-RemoveFile { param( [Parameter(Mandatory=$true)][string] $Path, [switch] $Preview ) if (-not (Test-Path -LiteralPath $Path)) { return } if ($Preview) { Write-Host "[file] $Path"; return } try { Remove-Item -LiteralPath $Path -Force -ErrorAction Stop } catch { Write-Warning "Failed to remove file: $Path -> $($_.Exception.Message)" } } # Resolve repo root (this script lives in ./scripts) $RepoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..')).Path Set-Location -LiteralPath $RepoRoot Write-Host "Repo root: $RepoRoot" -ForegroundColor DarkGray # Accumulators $DirsToDelete = New-Object System.Collections.Generic.List[string] $FilesToDelete = New-Object System.Collections.Generic.List[string] # 1) node_modules everywhere (including root) Write-Section 'Scanning node_modules directories' $nodeModulesDirs = Get-ChildItem -LiteralPath $RepoRoot -Directory -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq 'node_modules' } # Ensure root node_modules is included if present $rootNM = Join-Path $RepoRoot 'node_modules' if (Test-Path -LiteralPath $rootNM) { $DirsToDelete.Add($rootNM) } foreach ($d in $nodeModulesDirs) { if (-not $DirsToDelete.Contains($d.FullName)) { $DirsToDelete.Add($d.FullName) } } Write-Host ("Found {0} node_modules directory(ies)" -f $DirsToDelete.Count) # 2) Optional caches/output folders if ($IncludeCache) { Write-Section 'Scanning cache/output directories' $cacheNames = @( '.next', '.turbo', '.vite', '.parcel-cache', '.cache', 'dist', 'build', 'coverage', 'out', 'storybook-static', '.wrangler' ) # node_modules/.cache is common; include it via name match too $allDirs = Get-ChildItem -LiteralPath $RepoRoot -Directory -Recurse -Force -ErrorAction SilentlyContinue foreach ($dir in $allDirs) { if ($cacheNames -contains $dir.Name) { if (-not $DirsToDelete.Contains($dir.FullName)) { $DirsToDelete.Add($dir.FullName) } } } Write-Host ("Found {0} cache/output directory(ies)" -f ($DirsToDelete | Where-Object { Test-Path $_ }).Count) } # 3) Optional lockfiles if ($IncludeLock) { Write-Section 'Scanning lock files' $lockGlobs = @('pnpm-lock.yaml', 'package-lock.json', 'yarn.lock') foreach ($glob in $lockGlobs) { $files = Get-ChildItem -LiteralPath $RepoRoot -Recurse -Force -File -Filter $glob -ErrorAction SilentlyContinue foreach ($f in $files) { if (-not $FilesToDelete.Contains($f.FullName)) { $FilesToDelete.Add($f.FullName) } } } Write-Host ("Found {0} lock file(s)" -f $FilesToDelete.Count) } # 4) Summary Write-Section 'Summary' Write-Host ("Directories to delete: {0}" -f $DirsToDelete.Count) Write-Host ("Files to delete: {0}" -f $FilesToDelete.Count) $preview = $DryRun -or (-not $Yes) if ($preview) { Write-Host "Preview mode (no deletions). Use -Yes to confirm, or pass -DryRun:$false to hide this list." -ForegroundColor Yellow foreach ($dir in $DirsToDelete) { Safe-RemoveDirectory -Path $dir -Preview } foreach ($fil in $FilesToDelete) { Safe-RemoveFile -Path $fil -Preview } if (-not $Yes) { Write-Host "\nRun again with -Yes to confirm deletion." -ForegroundColor Yellow } exit 0 } # 5) Deletion Write-Section 'Deleting directories' foreach ($dir in $DirsToDelete) { Safe-RemoveDirectory -Path $dir } if ($FilesToDelete.Count -gt 0) { Write-Section 'Deleting files' foreach ($fil in $FilesToDelete) { Safe-RemoveFile -Path $fil } } # 6) Optional pnpm store prune if ($PruneStore) { Write-Section 'Pruning pnpm store' $pnpm = Get-Command pnpm -ErrorAction SilentlyContinue if ($null -ne $pnpm) { try { & pnpm store prune } catch { Write-Warning "pnpm store prune failed: $($_.Exception.Message)" } } else { Write-Warning "pnpm not found on PATH; skipping 'pnpm store prune'." } } Write-Host "\nDone." -ForegroundColor Green Qx e#!/usr/bin/env bash set -euo pipefail # Clean all node_modules directories with optional cache & lockfile cleanup. # Usage: # ./scripts/clean-node-modules.sh [--include-cache] [--include-lock] [--prune-store] [--yes] [--dry-run] INCLUDE_CACHE=false INCLUDE_LOCK=false PRUNE_STORE=false YES=false DRY_RUN=false for arg in "$@"; do case "$arg" in --include-cache) INCLUDE_CACHE=true ;; --include-lock) INCLUDE_LOCK=true ;; --prune-store) PRUNE_STORE=true ;; --yes) YES=true ;; --dry-run) DRY_RUN=true ;; *) echo "Unknown option: $arg"; exit 2 ;; esac done SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" preview() { if [[ "$DRY_RUN" == true || "$YES" == false ]]; then echo 1; else echo 0; fi } section() { echo -e "\n==== $* ====\n"; } DIRS_TO_DELETE=() FILES_TO_DELETE=() section "Scanning node_modules directories" while IFS= read -r -d '' d; do DIRS_TO_DELETE+=("$d"); done < <(find "$REPO_ROOT" -type d -name node_modules -print0) if [[ -d "$REPO_ROOT/node_modules" ]]; then DIRS_TO_DELETE+=("$REPO_ROOT/node_modules"); fi section "Summary so far" echo "Found ${#DIRS_TO_DELETE[@]} node_modules directories" if [[ "$INCLUDE_CACHE" == true ]]; then section "Scanning cache/output directories" while IFS= read -r -d '' d; do DIRS_TO_DELETE+=("$d"); done < <(find "$REPO_ROOT" -type d \( \ -name .next -o -name .turbo -o -name .vite -o -name .parcel-cache -o -name .cache -o \ -name dist -o -name build -o -name coverage -o -name out -o -name storybook-static -o -name .wrangler \ \) -print0) fi if [[ "$INCLUDE_LOCK" == true ]]; then section "Scanning lock files" while IFS= read -r -d '' f; do FILES_TO_DELETE+=("$f"); done < <(\ find "$REPO_ROOT" -type f \( -name pnpm-lock.yaml -o -name package-lock.json -o -name yarn.lock \) -print0) fi section "Summary" echo "Directories to delete: ${#DIRS_TO_DELETE[@]}" echo "Files to delete: ${#FILES_TO_DELETE[@]}" if [[ $(preview) -eq 1 ]]; then echo "Preview mode (no deletions). Re-run with --yes to confirm." for d in "${DIRS_TO_DELETE[@]}"; do echo "[dir] $d"; done for f in "${FILES_TO_DELETE[@]}"; do echo "[file] $f"; done exit 0 fi section "Deleting directories" for d in "${DIRS_TO_DELETE[@]}"; do rm -rf -- "$d" || true; done if [[ ${#FILES_TO_DELETE[@]} -gt 0 ]]; then section "Deleting files" for f in "${FILES_TO_DELETE[@]}"; do rm -f -- "$f" || true; done fi if [[ "$PRUNE_STORE" == true ]]; then section "Pruning pnpm store" if command -v pnpm >/dev/null 2>&1; then pnpm store prune || true; else echo "pnpm not found; skipping"; fi fi echo "Done." %7|xUۊF}WTdlXIyx`ksԶ:#wkխ8}r@,y |O~ jIgF:uQ209NF9g*@'( lU *Oa"U KXЦ<@or5ZAَk gBޕLefS0 RsmԂ%x:@%Y}6Ԇ9OITV0O_4A(T܀muJnŮ*tb9L"cI: G'ы:Z z/ڄ +xB}I}724B耤ab \ǡ&nܼ֟vB?r|߿/e<%\ -m֦־3l 2f9Ƴs/=3IfTe}P7P 4r`EQ*dSl)u`#VJF"RF M > EaTG$D-E.a*e7'$;-Vrִ @_QzRl{w,>mXyp6Q$y%ABuox`(eC~-W|5v7TN{ P.~vB"/X=_0(2@+5 jDO-[XS"AZ#*?\ S!vR(<!┮u2s(9K/a:x80#E QKpku#ђuoX݊8FץzȞA@-C P2GuKёlHZzp땦p:c=~S(i<@;! [VI ~~KZl !f;K\[7T泚GhC|l:Y4[|,:M Y_/GK=Įu{ cKJJm Rű_Ə)Oq,'س@JͪLU.9eU^ JEL#7lZ_Px*100755 setup-hooks.shcQuD""?jݣ}ܨOש.Rx[#!/usr/bin/env bash set -euo pipefail echo "=== Setting up Git hooks ===" REPO_ROOT=$(git rev-parse --show-toplevel) cat <Cl(m7Mmx&pd{b.nRe5aN tLoyІh\/#9zbZ)} 8d{f}hvR"XH<#Hp.6-4>.{?2K؂?4IA K2Cx#!/usr/bin/env bash set -euo pipefail echo "=== Syncing all submodules ===" git submodule update --init --recursive echo "" echo "=== Latest submodule status ===" git submodule status echo "" echo "✅ All submodules synced" '`LxmPAN0)XZGpBxӘ*{p=vgfgg//Lɽ-j;i@E%APBT.A[kq/ SI=q(ZU]eIϩr/άiS?q%+O -Pг'*ٸ5]?+ 3'٢Sx.1Q Z!og"-8M;3 EcObd̀x>s'n߷|2Ҫͦ q<Lxq3+cs41h wxtqb\Ȣo Oa鍮n)Cm'M*gQx*a+ x! 犾;b)}w%TΓex343$G~L>ġ wTBsrru 2ֆ2sh^2+nS] UR\XZĐ*/u?d?u>G$??9?Biqf\8 ~ ;V+J[ٝ]\)n8|+{~i' "%!x340031Q(N-)K/*cx_i7fI+omb ٙ99 7Xi}Ϭ95Sg x[ʷ}B䏌.9y ): >.: ) cQrFfIjrIiQBAQf^rfANjBi^Ii6P 25[!3/sr'j bx[ľ}B"~D 7<Ǣ̒ҢT`OG SR2uRKt K2SuS3RS2'0m|p E"jhx;ƾ}ˍ0Ox343000P(MM/LIeX}'nm2%u]~Hx*:q0Upӛ3ѱqSp_xqvMok:_y3N  xtqb\݊Gortb5Km/$K odx"ad[Y,~gxξO(쬮p᱾q ~xq/E<:\w}.`Y>NU )xtqb\ͣLf<,fu'&Hx.a 6/cgD#x! ^-@Xefx343$~x[u$x>x{dlqN53 #dԴTDsc#4SCcӤ4Dd# CDo9Kamx[ϱc6&.Y k]m=ulkSL;x343$ -7U8ES !99 ukC9 HW7*)N.J,H-bHZ:{2Ղ:URS~!8xL;21x x1ψŨ| IJ<ޓn%xi$SCYz|W\~WU2u]x340031Q(I,JO-)֫ap-\{ה|ΛRcKZ Kx¼yCiIfJbBjEA~q~njIQfr£) ) )E %E%z\Yx j\ۚY6ɗuʷq=跶(~v[yx{dl. dCDԴ4s3S #$4SD3D3DS96qC:ux!kaOdf;Ϻecx343$ -7U8ES !99 5oev,;kUpĂ"U|AY'S-xѭ9:P%%9 N h3Z}c)#06h3x[ϱcCȕGno m`U`:yx{dl.$3c3K 27H5NLL2NK657K4H650K53K40Sl3wqx[ϱc6&.=UϙϿsSͧR?x343$ -7U8ES !99 l"ʮPَELJAE(4!BL )%@C 2sR'՞c)Y_X *(#٨"ũEe` ĊKS+KRsKr @RR08!d V-nH0(q‚t7x[ϱc*etrOycyc_⍍  )xD p7hOxZ[s~ׯ8v җq;Ì4-.Á% P, CڧffI_>;Ow$eӧrOpYщ띲I_'3NIedf̂(>ݿ>*GԴӡ7oVвVkW,] L$%'`1)XXY샹d\/cu}O㱼b,`_c #,7Ԧ`z"tLDtVp{|h8z2OׯI /V^E|h{^biuZ~Z=Z?x<<m4X =m!3{#faV{  G{OSm2Ro+8ћyLIk›TmS֪u@=V˩k"/m9_P}E/9 7,[|HTpZ^~ |)8-(h)?<~CJŒ*沣J ?_r-+*Ȭe#N %'_RNK"+\cM Q* o`ܹ'8b.&'#{,f$)cN<Mc2zwZ10vRN>R2gPJ˵t8ĴSpG˧^6KzizR& d6`ɱ0K/O\%Z06 y?2.lxYh-H]( 'b)> ېjظ]$. h? mI/ l_a䭲 6~i7LxAqm'&:0䁘@۵|;I(SUFkzH'WIf*T4N\#[Gޖa&l<|mDhIB EHd )8_p7 2A$e&S,v>rZ*=BY,ͅr 'c;yS78NR(14kYm=;*r8hYi &tK]7FYy7 D.p`}#MN{A6eHtt>y2kgQ^^g.CNm7襟 AF}1Lsh>m 6G|\r}hxpɾrT R2gݿz#G29Ռ_Rts+a3vAV?NAMK?BzC*÷_.Y*C$`foE&k'4&D!T>4 u>{3j#zz1m2|VUp;zJM": e#~1q@a(g:,zV 3a&3hr27 !8\XN}C6cQ&sw.iPba t/"܌0!Q0@綜 ] 5 [J}\1ak,vU&m1[ﴮtl< qGeB@X;[_J1 DLcnoovfeԂ/0{1HTwSu]+4.y̔E:a}k8*t-WN8T}sOZuԾw u:yrR7$34h+lj+:սe]VѮRw`+GܔѫkʷCvO{l MTVZ7+$|[iLQ` .ϻ++.$gz N!d릗o?2sT1xjk{\wE*1g5po[_ג(n6:1`ASVٔ1CѲvt@Mn["'DE; bK Yqd0ܐxM!J-+ )"#B bD҇&VǍ쭟x;wCoknJBr~^ZfnqjQYfrj~Jj~^iNBBIzLR<qx;W8`#I%jwPp Gg[% rx[ϱc6& +O٦UfHͧR x343$ -7U8ES !99 mWL6>zĂ"U|AY'S-xѭ9:P%%9 N h3Z}c)w52x jɻ?ZTܱ)i ~a-,x{d6l ɲқBx8@]Kx Ȋ[[O潑zxvR̚H%_aʧRx``P"mZVo/.z tx[.v]xcQ\"qO P %x[ϱcCLrտmRQux{d6lqN4cԔ$s#3sT4ä44$SDCTD#9w2O Kxx[ϱc6&kam)NHb|S*#z Sx343$q>"}:da!D:''W7 !M7 'SSUR\XZĐ*/u?d?u>G$??9?Biqf\8:Jx{d6lqN$3CӔds cKdKc cSD#T4# $9w2O u#KxntqN4cԔ$95WrYx[ϱcCM9uv^M,:uHSud-x[ϱc6&XٯL>vI͔vͧRx343$ 箉9zĂ"U|AY'S-xѭ9:P%%9 N h3Z}c)551x[ϱcCH" g]t$=ly mIx4a vCe*1^vx[ϱcCYϾLNa< x"$$Ԩ.dO",x340031Q/IMIM./2*ss }ۧ~]._5 oCԒbJ- KN-?{ꩻˋnL%Ax!5'TFg[=?eܦx343$ 箉9{,&Y`Ԣ̼Ē<̔Ģ_92J*ss&*n~[Ƽ#~&k+?0SxUKEVa@BRd;cK{X$cBtLX&ڽo{ 3dž"`tUW˻8}䗍ϯ@?܇mhB'm ^ !|Dm4!WNo lëpT(tQf8$mNMY4d5x\xQTau@OR\5Mg(ǐNp2Ɯ"&.HqH)qe  4(M/hJHvEg~xng g*EFI\ i/"&{7AV(i8Х>څhEZ)J %d.EU녇)f Du4HLa"X,jY #QҟBjՠhuR2ֈU,iC\`/GzV'yU}qZ>3GƂFKҍB*/U@W@3bN}ʞyd<8pF+T!b%Aނ_c?pv:NJ LFѵW' Rqc:- _&q{rrLb-M09I*$A' i%XȇolJ]FE-]ޯ~1Ap6ʼn!4 Y{lW Q@ȝ!r9TwZ+WAս|cEzsv0V0. VY ZtZBν{Sp$Պ &LKק0 j1퟽ 4'g(1f BmvC_˾k^a_U躟*To@'nX?{+d➩\7,έ[['_mx31000P()fxv%tjnAu3? e x340031QrutuMa8#o{B=,֨O> yEE%%E 3w-{X%r|J3s rRsSJK2@Mx2ZkD3Z%M>"slvO>iTqAfAjNfX4}+eV]tꊿN;OixF>eǢ̒Ңԍ'C"! >oxreq㻭58"jMx?r[ t slxI :H*+x{BdcFԴX kr K~rvjs~^Ibf^jPA XPW7& ux!{Sr$kxaQۨ2eۦx343$ 箉9pi?xkgz8AgnCx[ϱc6&XٯL>vI͔vͧR-x[ϱct&S-~rǮtٸͫZOLxXRZ5#11qEHB^\LKh!U$Nh8Ʃ\EBsקwNFZs<줜xE̔ &ڈ2<9yN*+D2T&raI8EiQw\KBj>gZLKIe"<3@inhm4"lpk XIsg23Dx;(ywoF;v͜?wHLy.x.pxȍC"Ԇ}K3I;9JS:2eW~~y1)^lc23O~ģT%#cyRK,VVP'FO97? TaH/_pإ>K#~?HV[};VߘcrPd>i-5%-PfSŵQedJ%<פּ<-r-D(SPҺ~=g!x@L"XI8DUV+-ҒCRQ&? ]O6\C #噜 d|Em/u\%yG,̳Rn嚪Lnsl=,x rK +;ce'jY;јB}ПȬOmITy~V& ca`թ.Q4 qq ^ѥ6j +Jx«o~Y^5,c΃H[r&tgT" Ƅg:6W2b0XYeQ(6׈|:]v y"$u6X `W gMT%Qz;:}7w2kjNώ_=cQztr?[1rgӐ!롨!W]FZV׬M#"̓Җ6'fW`1i\4NDhf6<"f')a>_2hQуes\rZrV,ƛ;+}>2 \NFb=Ze6͆ƎAjۣ ㇽqsx1 L%׫Hur2=I~~%+OR!ƶAZԶh\teC[Ŵ:xXyubkVzu!Z 27pыQCvꤶ#?ӵKϖq|Sӳ̷˱,A MOsMx!,cIGQke 7xkclcP$b_Wpx45 Xx[ϱcCȇK?*jҀIꪼuKOxnmA%5-4$$5w ds T4 #S K4# K4DSS#4cScC$96gqYx66 ¥afhdjjdajjhjldhjflنqExjb1HYcWqxq;F<3Mv힜pvigƭ/ )xqC繛K+ONz _E uVx!e24{|}یڢ5 XN1xkfjf0]D5O1 PŮ UBx340031QK*-K-*cfW*G;V2_ [:sKSR.w-]|ќkPRS2Rv o,tHSE~-/ud%e3/`yoCf gO3=$4!k'uG&?ο_p:(뢷3L9_l湼k O)I-fx&rJX)]'PQj]vfN>Cmܿy[, O޵CVpE 7Ou$lrB.fɰPA!!Az) o~xzdnU˖7ς)  vD,eޯt]nwqeo (Nd꽙1.1l嵍F8~hT22z$84/$)4l޳KkL_Xk#n\/ؕ}[jZW,OlhU⛘w^-:|ԾbTM/YZ&KP]7y)7閳qI,((fX]dˏ?XggOx5#)3?7U/uM&i]l5铯ߥ20Uyz9 4Lޙޝ>0=HΙL}=FF}1$Z,owjzݻfˬ`pGvS-=X>)^])3/(aӋݶƞKwGv!$ v|$ 'F7Sf,**HLNLz=%ӹB'F;A|Z rJ3Va=v?2.>g?DEqrQfAI1芟`)fL+x .V)rt9N}Qx:,omposeс8g˞}[4fƼ:ʾymIx{qe-߯'p./.T]?i x340031QHI,(ҫa`WഈVu-cއߪIBd&%%f3LrbRk ghOW|;\ĂLҚ]g.h<=i׹@%mTYy͌w>2 T]O*N-*KL,+>sqփ. Gp4̄*.N.J,H̦Eu6g\oof}vl/LiFbQj YREfj6[m~TUUv"8wu&J5N8^(15-3l]CzkˋSeoW2x{iC#_݊!_¾Dn {) ػxWmo6_5%v м:`C1 --.wQ/~mE)!x|x;*sr,KK Sh>-+,'4XLgk;\.Ai*kQKRԲVBQ"O&Nn y\ڗ4q{q3bOĔqF\Lњ;vFTR`֩:WHоxmq2zǏ5c$aPvJ1ME6M &-̠|% L7\mORYRw #$a*@/KؓkJ[f]+y) %LiuHXo۝kTQݎL@IKecu+CָHL C ~m..:%&EEb')2ɦS,)ܶ9poxq352G~̝Mo{ wf-B2 oBjΦp 0|$|0)S}%iիf8E5wxn!{prêTZ(')f͙6KI,Œ ^otMhƶPJaޜw S7`i`KcJut* M9`1(vU Z@LA`I GN7^lB?h+ynYWa3*,4v 8kvN VGǪoWbtzo3,fKּ2 ֮S6o]={먊Cկ$8 [H[ .7G.LU!3)r|q=n/!jj<>G{~2bSWޱ䂹Y ־+bʿ=#D6Ubk mY2yC񟻯8hpwKv0B]RK̆$mشGzGX6TUke\}/k;JFK^.J'jhnJ̡'n>T>~ 5թ܅5P=;kZv͔X+1֓ Gӊopldf&lH6TqmQp+^lu??x340031Q rtuw wstMaa^O`cW¾v5]db )y ,{/UfyQ_Ӯ!x340031QH,((֫LajT*E+}3lxݩE))9EP39ZW:фSf_Z U[\QsRnx_Ӌs9yj-~f.x[ϱcC|rVםg~ ,_/3d<m fx{qe/,ڛtK:Zk ģx340031Q rtuw wstMaa^O`cW¾v5]db )y gv55^ɭ6F ڥx340031QH,((֫LaTu˅Vwھ,5(LII-O,Jm15(,'ۋ^y8<1п_r0[lW/vgPx['bv 8x  3BRoirE7xCԅ{Af\Ƃّ"įx340031Q/IMIM./2*ssߴJ tpζJˆME%`R )(iRk5)9j$bx-Fœ&vr߫39~ c%x-R鴅aIé%ŸuO=uwy  QN̍so?yD6NymgLY}'Z5-8:v3tl:`t)hٍ Qkr\pJڕE H2׺>$Rct&zL]GcEu#X%b8-zF}R.̌&՟* O~%)1fIfۘ'\= 4>[e0z0s"Ĥgʪ9M[H^u {(m-/{#>o_9@IpԾֶԺ>M{ Lz)7)x;>c*ԊԼb+.Ĝl_A!5/ ?3J@ S2SAPF6"v&&>Fu"Fx[ϱcCH6KrqZM}3yD; |-x[ϱcCY&2^Ưħzm={w< 8x33Tw1g!iq GQ Gga }E_@,IABx{qe/,ڛtK:Zk ĶxWn6}W血@Eىl.ެudPhilHxu_,rAY?r(Lؓ82*42jɟ|]6Tߡ|A:_K[X`H$-fDprJ.aieDyJeBEN3fjt!'CqkM ziwz.UqsA\uڭڣV{X,zZӧijDEa 1LOb="LPr&m!=IBE\q]2S=K<0*5 1LA0\7ũsҥMDJt0{=ϛSLxpa9Lh~2A3,fNdLAdZ+݋,a!߹Q;"M0&41uL}73&%'?L biSXۋ$X@ֹrZDdf_mWfa<~5Эh"UBM𷖢!{?_h[s 1{` é埠iM0 7p6e 9>5׊F5V׼݇[M+QfniD~L;< U;{0 PO;尭sSNRM.KI"-`,L<-3>kRYnp8Nrg#)fãժM9XbkW "Mpdۥu՟?Di.Cix̺|j 8F|ݓY挙aߏJ\ٺ^~qZ):\.Qse ήg>9G#GqNCQNZQ6B:'嶜6%Z"9SR|_M><?FAt;5 O!;5epn sɳ6o]T߇Mx90>4Ր"[RA]GU!V\??/*!ɒC+WM6MS/2ϵR}ڎmZYyXkwXteWR[[D!ZTЃXi??VKk9U\;7gR㻵Zam^)I[^{Sp#Z#J4Np?[&=)n\BSӭ(nx6%ys\XwpGçJx340031Q rtuw wstMaa^O`cW¾v5]db )y A3̝~q&r,x340031QH,((֫LaX˳!˾xdy}obC̔ĢTڶC^ÏriϾ/ş_js jNkzU`.3O1ldx@yC,p^gVRx %ø\HP"xr ,ζ'?铞} bx{qe%{lm<--Ku,փ x340031Q rtuw wstMaa^O`cW¾v5]db )y όzL7ܡ^N!x340031QH,((֫Lax:~wV9Nw{%As!DQnfJJNjybQ*Tm[\Ga9gߗ^/P95'扉5*0vg0tl!x\jCpޗ"ux[ϱcC:1V+7YWZyڣ x{qe廻63xi*9M ݣx340031Q rtuw wstMaa^O`cW¾v5]db )y f<~iL +-x340031QH,((֫La5jB]O ~sfQZX Uc(kQXN< TmqqDIybM/ `橝>0\x\jCpfF'Y չlQWx[ϱcC Vu{-6q098xvN{y Թ +15}r#L~> Qx!Z(:Ҫ[ex343$ 箉9zĂ"=ZO~vjL U,$??2l'4'h 34x|ܦ{oqXo݆qbx7B]B Mn&1X&J9]n} R xquƏ>)2xh; 3 m(xqb>M>]ν+AI… xkfjf0]dѱwK*+O65HЗ~z#s+xkfjf0]dNQUp7E#|x;/\r'K좛1mgd)*ͳ\4yC' pLcWQvvnpǙdkkZ_RZTVRPi4shP_mFQjbJNf^nBRJ@k~Jj~^iNBM%9&pIhP(I̙˥) 6 j0E\jpE1M6Q 5K RKRSJbT|C\C&_fL[ԥ;G @dr{BinI.Ȕɪ<  @J~^PPPL6Ԙ|#=u`$x[ϱcC[q'?wI@LuO x6[i%OLu&g0uUUP/-PR@ΎA 'K&na[ }6ԼɧL%=YW8{r7\b#aS&W//dCQE trI9`,1UN^oE@ZPL^,q2 ML`QBAx[ijK&N̤ļ/x:988x(*(Td@BɚK 9Ei(.II+KN!$S|XQlPPH(/*QuUR p RRpv rGKN,JUKMUB3'8'5($vr? uu͗XVh[[$%ZX$'[%&%%m68R|oe&'N8SP|"H6!5&VԊ}pO%?YHTe23-;YGv,Jɞ|ɹ٩ `CӓLשG ?ψxPO`4z%PC .Bg7GxgP)fd')`Z̼ҔTdmm}l]ZTW6o2PGSxm腠U s4C:u򏻠!\C40000 infra&>q` ]6?Hz}K/z;]\=yB9PBqiRn~JiNjL&1KNfnd2430'*eV($'&gNebE[ bPRW8Z *2=&㖘&{F*N>͝8a=;8L9RKsJ&dם()89U/ 5ViD8yᶃdo΀Dd ũ% *!A! jj(KS+KRsKr֗$( A ?x{qer3wV oXyEglo x340031Q rtuw wstMaa^O`cW¾v5]db )y /nkڨGo[yN&3^< x340031QH,((֫LaX|Kg2&kq!DQnfJJNjybQ*Tm[\Ga9gߗ^/P95'扉5*0vg1Kfxɿ;6b+cɬ99 3" Lx340031Q0*-HI,IM++`X[]5OB&&姤槔2tLzrl͓uKk5n_/ǭh ůEg۝[Q2*d E D)Tb$r' PH,.f6o~ RE!jDž375U(K-.M9hb{I`Cwuk%pMI-(=!@I*S}5S;==tnxj::dBy&'100644 .gitignoreժ=ɛ%*٘(#mO 40000 infra^sb;k;_.Jx0y yx{~c1sBZNbv^N~r6CbYՖ:w;FQYa I}j+urގl PK+JdozgG{ә xjA *cx}th%C#΢Ҝ} O}ea{/nH/2ZI.x#[ٝ]\)n8|)/"5_@0x>sfP~++xq/ Y_;[z+(I jxtqH`f]G.&Zvg{et퉯/xxqRbΨĦ(Sҹ>1Ȫ lx[ih&uQ"[Sx{qe[b ֭+\-zĂ"=ZO~vjL U,$??2l'4'h -3px{}6&F`-zhC.ZASLRUmx343$-svL 2`aMg>4o&UCtNNnbA&CzoAf+O~8( aO֓B? n*))f cx+8m)2G]`pq-&WVKVixtiB\ӎ9KO,P5.=i{ļW 9x9d0 n:[[gau4s)4;挚/SI5x{qeKpn~ʢ*1 xS100644 TRAEFIK_ENV_CONFIG.mdIAS3Ve40000 dynamicϟՌh<"!$©px340031QH,((֫La\rjEfrr L֦Bf䤖'Bf-!R]1/WWV&3B@Ԝ'&\fyq#+izxŕJ07/:+ʘ߅eif#i22C>IvvA/ڜs%9M ZRdHe_cd[tg%HGtޥ (yw7&T9l)bEk9ڙ0iLJi3#IjEXNS|"bGZafDetW%Fj.ΌnNhR~7PtK^CaXP )0xAi$ƻ{E\A(Sй8KFuCS(EK e`s7esȋTi`2~C^p}mpyL 11~ -퍶;fa˖r;սgQU=\]}}O?NP Nz~YPx[¿'d ̲,-2»mxTn0 )m]!C/MWIt@Q@iG3InbO')ǎm=.!"?ɏZ`)lOG<$A,e f%F9}KHN''Ѩ+e r%FX'8B #Ҟ#sBmώppmYxp,A΁B&|17NRIQ hUM)|VĄA">a/.3ۏ0S&Ua6v+\cspJzO (61AN*cbE!5$7]wܤm@ݱIJx Hwv5񨓜 9 ߵDGM pUX $HÉJZ x+a-Jq&WecT'ڀO YfG>NNOkQ^ `MwQ"dWdXh0ݧIZ cA4f~!+ 6/J\0Fβ2>ZFDMfq1#(Q[MKݚ]j5W{^܊nrE0!sOmzu?;լ#7AWaԮm.f'2ycf2Ha"Ϊ ; Sxx!yDţ?,2Eæצx343$~Ha,g|nK7H&d2*>3媺CnkyWC'%1zCS_WcW`܍P%%9 a;ylU{'>A3lJg0+x9yDţ?,2Eæupd%nqTC=}gS,mx33k`Ҵ0lGWPoC/d$7xFdxtiBțRg(x)2>bz8ļW {xk`o`nafb3JTx!)|n8tOWEP qۦx343$~Ha,g|nK7H&d2OZ2I=6>4͇*)N.J,H-bSjyPJJs,v< OO|f(/x9)|n8tOWEPuQ:NߙP7_%$OSGtx33Fe=R"2GWPoC/d$7h.IkxtiB '(yL01ZļW 1xk`o`ndihfj0Tx{}6&ĂsD~']ɸGͧ< x343$~Ha,g|nK7H&d2J/دz~{4*)N.J,H-bSjyPJJs,v< OO|fBs0x9jap"Vbљ~Au{%Nú̆@o-0%S zyx33!lq a6+ $@GWPoC/d$7"aQpxZ^Ԙ۷L hюΑn٪j xk`o`njjf3NVx{}6&Vq[vWd#. 7x343$~Ha,g|nK7H&d2D/XݖX簬SC\cP%EE {*P՘ 9X w#TII~~N1eN^iO70x9[^v`Q#|YuVV1L5{Swx33b$c/#Ijn2GWPoC/d$7SwxtiBlvUZ~>+yļWqxk`o`Þbnjbdb1oTx!M.] js# (³ +x343$~Ha,g|nK7H&d2xFϻ,oYJf2TIqrQbAjÞ '?T;u5&{URS`_Wpx4G2%x9M.] js# (“uÂBɪZ{WS9 "rxbbndjha1]2xk`o`njdh3S;[xTMo0 WP)NڥC E؆da bcJr%^mAlӣ<#_9n1ne\TF.5R~@e״+7&m#׼G5gSqh](Ӟ@ZC2J2Hw-EJ:fAv$M[˨^tJRX{My+yʬPW5Vw@b-|ŖȪ)`@.pVъh AA-\4gpt 8I@qUɤ`KWt08Il.+҈C.u%},>./7sPz*{N? \..oaQAzpxJJٖbubH8z/_F# EKt2)*o! ţ \ `*rRw3>uZZ wrd 15,bl &5Z%d6VNdHrMϸt6~xXfbr\S/y?F ʴnHfy5njmsoOEhԗ|(v'pw3aqXkq lsxŽ{B{qqzkV=  AxSmk0_qLq4+3ReqqJèu$O`Xsϝ)VFZmJ5ee#2XrDH5/=󩚒rN/)ND晾(g㨟|ж%&NbE0pY#9 x` ǡ}qIRYrq[ul1_. lp--ө?-cb7:+`X-vqWܤY&z[ܦ٧$+f˲d/H:]Ō?g=ԢסӷB3=3gE^B#+vf7L._xChVbNٖR-Zv`쁜FP]ǡTU#mt]X>ϩM3F%X~"dBPvB5揘XjEa֭F᱂> 77NYFBD07I#8LVn}hQ2QI Y?Fڸͪe3'xñ}BqJJ%L1 Y*m~d 4x[>}B{Ja\ &B]2ҜɧR+2K 'b ִBx>}B{qq\5f6x>x9I*Rd3"aupc4OS :$x33Ψ*,hj eȑGWPoC/d$7ZxZz[&7ivΉmn4xk`o`Þjijl3E>x340031QK*-K-*cfW*G;V2_ [:sKSR.w-]|ќkPRS2Rv o,tHSE~-/ud%e3/`yoCf gO3=$4WS_u~ܵBxaF@-j{vvު5 ۹HrSJsR޼e"sJn .TZP[k"oFùA2Ka姤êw{0A&fe2]WC˿s9q7f1U vVc㩖R?9cM^wMl$~ yBZ~pw=_f$eeӱ$F>}򻔵@^F4O/Pf;ԻT&Ɂ!q19"9?2o﹧hD:3/(`O4O 7=:rNcP+@⎇H~NJoTX UTuoKsOʍvr)› 䔦g3{C3Ogd\P7'S}~̂bT[O틍ks* bx!I*Rd3"ax340031QrutuMa`v|NmBr~nA~q*8s=㻥֎0)cĂ"LB}~X|*t~rvjï>&ٝo 76~URtO /߿OM6F}t~Ij֖3^U_vĒsDtIQbjZf6CCxڥ?8]x\?efqsx^ax31}:sjvf4Gx340031QHI,(ҫa`WഈVu-cއߪIBd&2^?֮MxJjj@;Jrrru 2n4};&+]}N<6WC%\qJˊfF;?gA'%&edT8AԆ#lCC8DfB'%B|P{_CR{«WU]V ,#(5lج^)V"[3{56?*v*ρ8o`{?}6Ԯ=k(15-3l]CzkˋSe͐(xti;qUu׉M/f] 6xmSmk0_qBLV(mhGc1eվƢz$ $N({{#n+jl "܊t\ht 1&6m a(h[v\gvtĔ<w|Ocx6)عGLlH em\5QHKM_ dhzKr\UTj]8#_O,61$njUVȿ5SΘ0'6̙\"[ϮkvZ> Tw2Z$ޖ: .)!XF4589I6}a:DEp㼿08ǃӡ._ie 08%DZ( -v>׎ۨipNkL>A+nċB2ě%,{Q1X .L&oGq'.P&sjcx{mBwqFnqqƼOLa(Px343$~Ha,g|nK7H&d20ngiw3yl| J RTh=ک1A+Ts@Fb-s}IwdML e6.+100644 llm-api.ymlL0dG]j[C&znd<Cck-SOwx7>T|Ц_B2Ɋꚑ1'&%5\xbbnlhh1]4oJIx}Gs (;_9˙_h2 }_{b(J]V&5#t ٥9?uu܅RFA)TS1m~Sm=Txq^-p ur~ ? x340031QHI-ɯMON-ҫa߫1iR!rJ743'E89K.O?TM!'3{T,}kS85(bbe TҵJP%EE erʊ~͢IO=$??NM+.s=p` 45x{qe2n5lGi zx340031Q rtuw wstMaa^O`cW¾v5]db )y ^UfO/VSodtrƌ f tx340031QH,((֫La0yw;WyO?`mkQZX UhKwż^][U[\QsRnx_Ӌs9yj-~.]x9"X.Y#&q3ʢ5Ϳ6 Fғ"~x343$_"OW3gs"Xd{g7C6U޸8( YNY^ݘY4C3ةw1ie.'s,2Y9x343000P(MM/LIexspHNAEM3 |x Pn h㟩A3s Tkx[2e[ NBx{}wY &y+Y>*gfnƛL)-x{}6&{u^nv~s=ͧ* Sx343$_"OW3gs"Xɐw?]lyWͷM|T*)N.J,H-b(sxSVCt7oMzP%%9 /v] oZqK̷7^x8 -c;1T7.v"]УvYNW[RS~x33%9y :/m֤2' ͑GF2OJK6Q5Z/@)xti[#%wN {Yy # ,xbbjhfb1]4L1xR nhB$]Ζ 6W-Z~ '_DGjuKlq rzGXPSg?&Jg+x[ry!F x343$m1uNYjNoM/LIeȋoig1ƹՑGA'%19<)+~!k7&=`b;.7̥DqSE[3hx`L6 rxK3[YMf ˎG,+ܧ<˻"5:cLFoa!II|l|"hi-xiUiTx8pb|0M=xS100644 TRAEFIK_ENV_CONFIG.mdIAS3Ve40000 dynamico 0ߢn ߩ x340031QH,((֫La{|[>mT{ɭ!DQnfJJNjybQ*Tm֢y/eRhpxuUoe2#TmqqDIybM/ `橝>/2Nx[¿g"K'{64xx=omp"*uF[ Z*mCn&t۽=p ܓ>x[²yC:y̔TX.΂Ē [Ăb$䏌sCxz%\yx{~}w"fWVa)4䒗~ܸq62!{gx[ri # dDx;~}=Hǜև}s"SLDmx3VջayT 2ݑGmxO3ke REQY 0+k'gndJ4L<5MH=ХX%7C! oӖ̈́1'."Kxbbnhliff1]1V;xŽ{BIzkV:jmx>}BI\5f3px Yw ZΈo%ړlxxkcL6SS{ X]umrl jx uȋ܌!O@)>M<|YxKN/"9R>!wATWzW =x9uȋ܌!O@)>MuCxX 0vOQ}SoFx{qȗ>Kko(S`~͓Ɖ ڀDxO3rJiqqIKRuyndHVDiiDGV7'֯>Ztb{R1'1o(,"xbbnlaan1]1#xŽ{BqJzkV:Dx>}Bq\5f3@+x;~}6&nLjh7SL?JUxKN/ҽh2ͭsnߗ.1ᬮS U~x "rm{[ Q\Vk*xKN/riqO߲Sz눤7C Sx9"rm{[ Q\Vku{uoʙ,So^x3quėK+7pHmGUxȴi7;69E,-L_pd.Fu I+x>}BqJ\5f3Nx9"rm{[ Q\Vku 1GȞRf# ]nSoXx630~OP5~=ZG,ω$ "^Y%N`z,xȴi7z6}*e[xkalaP ©o.F{Jʞ~ |sx9"rm{[ Q\Vku;3^`ַk@pSocax3)>x|bUIGIx632I]_7b!Gdkb"$Cs@V[riZ~xbbnlnhi1]2!nxŽ{BiezkV;ix9"rm{[ Q\Vkue\D̆!E`l6MSo`Wx3XCm™͵3G+vxȴi7]ǚ2 kC/migQ\. ux[˾}Bie\f8(x9"rm{[ Q\VkuMaaPޕ2mR,rSo?x{qBt墘K|揋;]?mb{ ^+xkalaP KlUƿQi x/Bl‡0Ynffbex9q6' τKJY:uR$U(=?$@3SoЙ*xKN/b~ƪMf&ޓY͎T "x{qBqX 5.*qb{] NxkalaP 2)oso e~) qx/1Yl‡02n6cƼ Mx9q6' τKJY:uGB |sfH;~nSo Bx3UߑKʭwL3Ȥ߱Gu dx63YLa}bs$R rW$GdS1*߷dV6)xӑrXxbbhljh1]3HHxŽ{B{iezkV<Cx9q6' τKJY:ub~bFBSoi8x{qǽw[t?(]kDEtx)owZ;+\ 'bOx[˾}BEQ\f8x9N'i> v?hTTϓu1t9bL9Qp*SoGxKN/)E`$WؙY6 ex{qBڇb%lEpNlO" +xkalaP 2{xS/%H lx,!afS{LhxZx9N'i> v?hTTϓu Et2Q)9"u>ጓSoE2x{qt"ke%x TzMt_.  xȴi74O3WeK;a$>\m <dx[˾}B{ie\f9x9' U IƓu$_`V #룕So@\xKN/¡ZRxRcק:}Ez #cx{qe/g1{{Hs v _xS100644 TRAEFIK_ENV_CONFIG.mdIAS3Ve40000 dynamicm^cW3mH{Us Zx340031QH,((֫Laϥ/"UxJꁢi: })o{nxKN/E`Oo<l_ x Vg٤k ^BRCxKN/~FyG9X \x;~}6&DqmUyHm`)xKN/~WR\kDv/x9ha0d^o^@zHu=UP*SoHQZx{qB\H~/S} 9 &xkalaP Uvvsy{[Tp &x{(2GhB̮E%Vz9IE i\A~ ɉE y%99' 0L>d5}1fEF9zLKsq\dFD:O .^HkׄW~3_锦S+pa֊;/W?3^߬]*蛺_Vg={Ή"TK8S} Ƹ>-3x[]ؗ1!Ť8( H_KKK t 3JlL |YLgѓ@*ARPšĖh>9AQr2lvCt?i rPlN͋8Jk B6|'D ov̈́03L%"]g 0 ֦ 4¸(|@$b-14 Y`m <PhTHMȇ2J3sJҊsrR uKrSJsR3KRSSRSR+<ɶ|Jn ͼ,')K1]WS~Xx#)``;7Tl u0P74a,ZvE]ixj\H?뛁g~I/ڑ9Hc\,(A Mtٳ  tZ^,;٦usx<3UC@5Y7So3% x[rY74)7?4'UA)X?583Q) $CVItY…(51]+X kЬTTZ\XZ&瀵=jx;|qf$X.΂Ē [Ăb}Fs YY<Ңx343000P(MbHïX$m6яlĂ"2g9eZ?d{MwcfѤlVQSp2َ3l[2ྲྀa2$x340031QrutuMaZdxQ'NqjkL SRJMmoϙi |IZQVWRRn$4c\[oc--i][p6 JgYVZ\$JXR'idy!c촮 .SENG4LGkyd3r^ 8hG{ShaCG#J<|fTHS80vh}-ýa]3x8ˇ;'4fAF R+R [kpKWkY.k+G<+@cΣ` %4qZo @j!Ab={j rzdjiAZ ƐK%uqFa[-\سEؑ]v=2V- eqۼA O`2~y]Fq8ۋnكj33C-c͗dB=HjvH,9ض^$e\#/@a#z_* lN1A5u¦+9(.>6`+\>lwFYdKPv3ta:zsi2}5|\޹<9?ټR }GGǻVBf|7>yV;ؗ}}PȰ< vj'am:=@;qߑsn&.cYr3A[8>::2rQ;PM1CŊ\e=(5:%pAۙjzO++ PnpJxBg1 i/gPRMNĠ?Id29ZMYUI~nњALWcm?*(i!<̉ c̄g;9MTĒJuEiſ.V|JEE%%9yϯRl`ͻ/z3>NwXX0B;w+_6bs6n{wo~;s >?˯^o>l>vኯns~f{>+]||oϾ[X?n;m7woחys^>?ww|?5f{6ׯW_ Z:>bMXu bܕ;u'C7Z7~>~nOkOwww< />B9X1"^ՍTtu $n,cxU~;a]x|s}-BH+feT1KXZ/,|`~Wkm AVG"ڛcNKܸ]/6_w>w~o7n5`hשu",:rj]jQ Ri+p+/okۙsXE,E+k0r{q{Qy8?uR5Zs*MiahWQf &ArD=mߚkm7_}mo|wyY#Xk$@hNfp&3>Fr#߾l8؉#sekѭ`gJ61{3x ElɎQ}SgnoeQx ñ:U Njw  ƶh8:3Ww;ܽu^dsݷ)h7,eNP9f_eYUǘcP,%&h߿t"ލ=@G4Y(3_-vn @?,o?[s_ tź,vSe Nj1bQ FKJWXսlγus>jmF.~{}/̏B VLUG#j֑ ǩt>M QbjLma]gQz]ݸ #?MnX.Xycn]5i>IYZ41 8A4֡yTZD=m[4EGKSKW~cҵ'nwlw&/>>>go.osP7n~W>͇m|gOVw;'+v߾aw?[boso(6,}Ix<WZG/;BZ10/c0t.u9 5kVuB|Xх9tUq!:^Uj@|( P6WYsa-h,Y۩V _><ԡ݌ͩ8PF> ZcAU>U1;Fx@M{?q9?^rgf{ᷛL}{<=8?Np)vx|Wo,7ׯҳLfRfѡ9k̼1T/xX sZu|ԟ^}Xr|| ŭ6|\ܩ scLE"d*uqQaX8;U UNя9eWn[@AkRȋ9VyX6D^ kLF\晦zXǝүukqY}{7+ӁuKC«ǚ` hUc~J~ko>J:ɜn5N6:Yp c.+-9..>>D>m/uq^?}Rߣ';SVŪwzo<ؗ!e_ORd`tǻƦ;h77\\ [%Emqj6FNәpmYn3/yZXkJ =LaY!{d\KR|XfzJkȄ6F4=ڀۻeʴ*:Qx%bXsPJQl+M$֠O^k08~{\o?٧~۝)[z!kV9*ɨ֢F3Q'*JȵX'd1,qd7l{0 ~cע.A1qe9t` g Je-K7uLFi*k؜%8= oDs(tj_->ܳP½Ƣ-jrC՝ yfO;0qe@fyA2l1VztW؊Z@ÀWgzW:T Md:1QFllwqCs+ (3X gap=Zʙ` +o8_:r_ڰGsnjY h,|:pE`NY?Vy,8Tp;!X7V$Zp#D},,FeB5\Q:wD)^ྞ9XkYіtέՆRx*R*V\zq>V_ GƓcd;= ;P`mk2-mVF(UF%*KbA'۫#U?yR+Qk%h:";0K gҖVC*D/!N~$)+ BXX/dSUW`(.ZGgg|ËnBȿ~Qj? SoLv5TvDf&1zӪ:-,!`\๚j wnv}K_nIu-?O>ܵglS2&0۔[_u"nS3 @lC U@%J6/ݜq|%-Z /u峯1yIa{wgѪ@a5p4U|0? >F?}nC=l\}$fM]d!NFlRAc,C$AG]l70:{AkGRgkfVT]"T`5] PԬy0`}1g| S>bBsM@H9d#& ؿ:Ͻjl/@QWs)>2kQT,k.!f6 6 ӯ+Y\Ea(`"vJ J@J]ǫ?5Ws_&((-eq:j(*vKL"zXB3>VNL563 T>eKi[6,shSrY 9ڄqkQ?al5y|zy6z5' !&!,rDh-@ J 'Ρn';jJ3.*/X]5FoE yLG ;˷Wgιo>J;i}OHk6k" ς35ǺpYEXmN; z˿2}([UGˉfT=;Ǵp^l2t (0l$Jw+"Ѕt>D?:CLX>%[xfedSRurLPEk/w[|@Mla ~K8OUks}U&PE*H57Q/.bKnIޣcqY6_]½*K=*nhUo)w<^G?M{PZT'sfZ]\E;*A6­S(ט5se[md3m+Ŵ-h# cVV)V+#H0xMZ~ӑ^Plֺ4aI|,,!#+$XDJLĠF؏G'm=LTX6 Dze֞ujEwΆm4f'Db:xﶉ}ĈFxΥ@pd}.ZLg9NSFO_xw+r# bLG6E @Qkga^u&OǑIoo.mKa)`M[0oe2C8v)VPXy=[nL41Ŀytynw./ hˎ K(3ΥI逌77*k-/ցgQ;yBAq%g'9 ZRM'eiecʱݺ|wPj<<;,$Kut":+f$`Yb$ݻ+o{X}Gâ~>?w}swX.p'%F5}¨νps8rR4IpON@:8Mb6q D@^:}yU֘|4(u__=+} i- = BTG)fL xkHH_#ߤ/pǯ=jһ:k"W'Rج|AOΗWn{;IݧT H9+4E8jS;q{Uo`LR2F ̓Ւ;aF0 01Mc +h'ҫ˯O%oǑ)؜_ W%fm[` a<|`;q]!sX\oi^\>o/o~t7~^Sk?bs'{K㩣2L2hVt2 xSUj=|ȕR(I8ZАl40T:*U \؀Oaar|,lutΊZJmbD:dDHJ1.te=< y8MFe4hf %,ɴo;jó `+a-sv \U;ТV@J2zᪧȥV_Xg6^{94IzV9$×L`&r{xjtO#]f`!XX\՘{$@T(} s*0.=.n{=e#SȫwPЀX:µU  FM:g9R9@epI~yt;߾|6}XH%z WcݱpPa1Z&a={r5cu6Yxbme9L;l 3~xj!cb_T)c-"Eӡ,) >1NgIצ_\]i2t$^ 2)bL '1Fц%4*g<_B'ݥGӑ]ڰ.GmLG, [Ј@_ KAN:J/])3H}}hFؓT,ZH:BIp=~3+ݍ4yhϞCqզB3! 7]L+Po8 JPw)⪥W#VkI{p3H%%ܡR6k8&ֵQϳݴt|V>h}}TzcdSfqc&{mVxH .*N':O ZH/OY(e4jæ1KZ\]-hDzW9O՟ ]xl>wׇ4̭_!5 "OZª Me8u=S]}id Fl JUCfTAT/kRMxxg]"vھ彗w^44jV;c6BFCFHV,A^EbiO!̗ yvppdvgUktjVZ9e&2Vv9h|WnWTH/j{ƘmXzc}_%ݤ Y?e{R ΞQg$g lvΝ }EW>,qdjXl9~*d꽩X<`CaZ UYhh+ Lx?iszL{nFS41J`ɂA^./d>lZ?%_aس+c#5!T(#2x8!>|5ߩ4Ĉ87lQ.{/Qɣ&} :$V<ķE{DM㍦ɗ_|WQ#/G{kUG*8,00q fmoCjKA':hZ'^^޾;j0tRC!/3S^F0M_%`E[?wί6|!&iBmտ^}&kpVCEBRI*bMYXTB$* 2чD_<|᰺\{?v;O_j{ь3Z-ddV%jW͊Ϫ>qv?f^)ۇ??8^ 6齇Ѹ9=Y"S!,i4!i[*sd>i mBܛir:lރCbҽJȨeqi ,i1<«c5m~:=˫xcJ۪a UQZTԱs2a$h]ARDl3 ɚग़khUMQz_92-/'&&J7IhlT+=ee}S[Ǯ;o?gíbcԒ=m}!+ھzo&Y?}<W 춐%{kMK˂:’hAɅmܳKj&} !߉hOy>#b#Dgq`?Hi^}S{{O[_@x$}h*!A/4ȡwJ4;Z-x@i}?'<• K,"hqGd C{EԌG6ؠZqXݾo*@U窥`KXOľRq_3@XC=! s.t3@ʣXP=V0y4^eP簺t sαp=]^խ&7pq^Ä$y *S`'>IMk陈?M.n../Ҷ.:5,3\yñKQX|)TP 5VZ&usBKu $C&#[ǜ* eLmV2Rl8$_.4^MO5Oqj) <d$)<1֬Eݡé#ВsXDN<4kMD^@S5a*#Ղ)N!O~"NwWZKa,lk-kvjDo})Q:OJܴ'~ {;eCUo9b{6imfmr8«M=ZItԱ ԟ^) 2{g&dWVK)lP!*ġ1"+K :aLVDh91U8SϧO^oCKp:yvF*pYm-ZѓNJ$62gTO9ÎWHe0^})=lXPFtj+w"z zGqn$SKk<Œpnc(~כo, 9GsÒU'_TGHk>\n$ľ=V E m8phLd zb%@`ds-3"d(5U:g}@xxH MMTp$20+'<o]nH̹ d6gXH^>`9"- , TQNV~?w@[ko*f'f[ɲH^Iʯp.!B9QYzwkC7woHfUkйO4Av! R YCX2$x009z{k`_SA)Mv6m*٘X#yjk(XycZn0!\ɉKP{NLX]IM*K:WE&rQNĺGa}UV )ȾTTz, g۫Alix~LJ O~rZQkId3ft{`E\%4gR{5eFP4Ure׽~mpGoYy zvόʇU+k,EQ#'SdX*F%MژG[ S Lftf+aͬ AV9H k=anW~a E;6g|*u-n6^;:h>?~h/jU3d: $}VQ+H ?~`л TnƗGU`7W¿8tokTcglrӑ1V4EM&.SK:]C79Nܗ_Hو5i_I<07Meh}tT]k6RqN!CK֧(@k'O-;wLf21a٠C9;s G齮Yz1U<~d'{~>ww6ZM3?SNZUk4YR`UG}{ 8>2S>a݉Os&y$c+xٷ] =.%Gba~g:94jʾgdz> REٔ. 55=smjOM;K[}T{CԼ\@2! M@a&8 Z']4nkU ܖ>|w^DZ MBSje <*x'5kPOzo9WS "͹:gt JSF/ͳqi+lU/pH(D7^V_D2s(]H[cװ5ҩ z 81G{(X+REc.I:ep8mէXi3QW_APS%3ƥH{ЙVR7Jsu N\!*JύP\i2 L0.EB{լlT{֘+:SG?Z~*;t~Qg>Cpv^ce9@3^Ry5'{TsbopjNA 2{f)OG#c/7. /xS=?<[kO%Gx.>{O6ww;'u\ƬH_gv%A g|8h'CwցyY =CtM!/~y4' ;~!5ɇPcV>)%i ŒE%#ّg ~;0NiC(5޽p9-XU[ˌYPx=#c qL 1Ub=uH:X(Cad,!P6?QV|{Ͽk݋D)ZTj+R=+83{5'_er3t>Rf.:moo%w?j|73@ghzmaR_ܱJ 'EWkeGrLxۼ A3esu>$"H6̮ K ;[JX>?uSٯ@ٯL'u_wKo0|> ꇽ{y%u7 9/*QOL̂Ika܂ڢIJDfZ-ۨoIT9f# vfR`KPth;f<D J/1)_y(汾%ӣowO?|?7x|ERkĸN#ҖIAY$7wYՑax֫F6W_(c0gВHJn* :))t")gkdfs ѕHY!Ri4\“*Փi;9|$gnv-Kz9&ړ~en4Qd{q(._*/1]N/Rݵ˲b2)ڪj>xҪOmꔵ.%q Pup[߽ҸVYhD>h-Qh2z0hL5~H8:֯RzI"m}^a;U\Hb~dyZl%/|{|ixNwWR}L&{2 酬 hp !rD-!D(|<%al|Ow썺H2S$&s6%y3H~{՗7Ϟ u[թPV{q$Bp ZdߗI yCx٪|*H>wo]wo?æޠ{5Z4"lGމREk,Ҭ`óX<(FWSŒԵ.hN{ r#iiV*C\qm@x H|mؖBw HYҥyaZWb}"yЫ)&s7!3'fX{`*m\,)"S+Ks7mٹzZJvqѓt s$ ?)3coyBQp9?xM%R8,26mLs 5 z4۟j-6x>!=/j~8*-8/`iJךִ̦&C̗^?}9yniR,^J)(B1͂í` \eU'j:0y#F^ˋ"LsU dkHսߐbpC1^| k#,fؠ,Cs#vh̜<3i;`OXiИ@tdHV;w37Y$g-/7w)n~XgHgg.,o"bB*e : n \-6zCl[}v.mqw2" BX:UF ;{$+.J}R{yo9==݇Ur{=gYvE_ o::k[&a>/>p윍L0 Bh,^]m,#~ޟm9i;c*ܒ0$'{>Cl:[szpAuA$"!-eZA/zw2~PgRӒ[jnhtMM˸}n燛ϧmkAGd㜭9 t[B9D;sfp3 gmEp<w~{'1&2FW11g06b˽0"*e@ֳc:sQL9`uuwZsLE )BٵRW;Sshz$ մ֛#1#OA)yLv@8Z(cWߦp: C>w96i)zP>N̮s/S:yy:8aFur~I+>dd`U+d|1)5ZմHbF.[  [{߳Qv)Hm]JWmHV:>1:q^LQ11ΐJjپкzd VM)ATpG,$t6,#_rKwvLBg)}HDGZƲE[\?d_Gyt!ȭkaS4һ0sO al>

Bu☍#t67iʶdw|y'/IΗwLeqY&BEXVhjc\[𕲽WN&s]{.3ǯFLؒ% % Sxt\;Z(\BmkkWغd&VXG. RPᅅ5,i򀎻t}6Uz|^t'Mm'AYI[n1˜ۢxe4 84* <)_ųE, ̈ MDxѱaBPTihu=Šwnnn[*'ihߟBVZIR;Jo,\BmkhfsRIuf?l|=/\D#@45s\}嶪`mBk?АN}+B8{- 6;E͜0j0 ^`-Tj _qvg4MuH'N9T\9]C4 ԋ70W>y皻Eiݼy:[ .MsvxQ– EF4OO;Yoֽ"F:y F5Y 1Al-)>avc]%rN: (--朣a$mstUkޓۇu7}wk빼VzЩ9VllQ/)Qc?5%ҭd2ig8 k^kGڤgOSt8/(#npNIg6Q|78Ҷ\GuO[)0%}c$o_>w݆VjCSF8B nDPerQ~{$̹W-C MfgE .H9ud3|C"U6EjEa3aZ3 cCbi.×;׵e|5U닊kU&j@[hL n}FzWgvR_bA\k&U5Il 6+n-i!r.`-_8 ?Ǝyo 홆~n}w?WN#lvvKzՖ(0đ-:r]u7HG)sv;HOw.;ױ="ڪsWIkPl(-:/p!ivzABo 60!mTiufB( R3;V}y /^NWnB2 {[Rb{KSҊV^c}^\,.9&QUЀ:}韌am  30"S5f+G]d61Cңc4k/BXF%.f&7Drw$ {Dhoć;C? A/-_dDn|lTqU7k]wz f8"sk;PcfKSClzYYשٱenI<P=;d|~XOl_6ĎOo>A׫'|u>cQ0ja^8a=ktlSsT]Q+M=5a 7իЧy~;~'N2 ,o=E\}dR-#4- 㡀RRzê\EȊ1'wQ$dH0xfUk$ÁX ˱{ u{{/u-FZz4b͉2BT8wAҵ/wa~.}Hyu'AG<^օk"x6-s׵4&ERu/`k@KkmgF[kFmZXmרY~vo Nys];]`.fP6P'*"smJ+Tj)@HݛO}ÿFI)K :LI )bX)6aLm"!p-vKdm߳X `?grdNZʂ ُ\$n>f$jdQ))>ؗO{\ANyg\q\EdwjW w&>WCb]EN6Al^Vݧd-= )7a$i!8?[ }K\%;PZYUy# H7ۃ9- a`$a y郾&]9G 6s:eW0gD0LF LI9)m1 @%kŦ+ioc3֤׍vI]3V'dvHefyL+!l-]4RPRkp10 >l[y)Wk ao]U ]iYu9YEtfp'̹PX1gg&4չܜ_/+1T%( X"Yhi#ZLךjT5xɂx3q}i)^̔IMJS1Ue\VIPpwj{#:hĔ޳*]J)@ tJpK~n5-Q^z9χϙ|thnXp+˷Rw*҆UGm2ױ>2iGK%&V9RBE%iϊ_3p-/?cׇ4'syꚯшrƽ/UP7I3;2 քLm[`VbՍE&e"މ(߁jk/sJ3]Gg>e8dO0Z.^v_;=fBH5BI!iVP%4^JCK>?_n>",-֤OLi-uH[5%Vo5M7j-cQ-u&tq;BS2{!y!ey֟_^'R޼I&t6HvըiUIcS5w iUzYjރm@3F[3 ;>-DF.ߑnǥD i|Y+.iMܽaf{w>iB鄊b@V !4 lrX :S~{}pl+8DȼK}鈆>GЪqKN {jk,Jc>* (QfҢF~?7S 'ǽ_ZDm`QTq<լ6;V{ZGU3zČVxj`U&D񵡦gf/B}e ǚRzKxe9~/S Qcwmg" M&{Ж+XƘCqmf݃c!濄Q\{zOq5P] ͆|4A#trFIcyOꡄŧ(8|W<|p?EW'|t[ošΖ{6NN:kOPRMO5ƒFL!AحL<>X3-1y-Esink'Rb@ڋSy2PmRb0.zutYp췜`po]5ZI3oim, QœM9W>"w!?]/Ø-e pܓM2V6B_,:ޡHނvyaTǭ:Gi8[IˁeZJt~PCgWRKfDpEG=b׊:*v"Q0vrrY^$%[NPpUXuUԴ !ΥM>s*>kNQzǏ߾Qq~`K8ɟپq7GOӷW礮_%*Z{NY j}m 鍕d^ft S֛`8dȴol 7b׿*"10T[4%5դ/& ^RL7 5gKqX2")aPp5zbZJ^-W/%NTg5 %!2e,s,tTk߹J]mZV1GǢGr\rajE.9@_pImpn z-MFRמ5q B3_V{h#F/{qTfd$+TVY}sR2Q&@*wQ&K냟Er% RO}U'HCbS]աVb p3֖vt^fg-{ .Ž8cdԕ&J8Ԛ!O_~ufBDRl3C1Ajv^t𔬝>r[s}zz[˳q|&^*d˒K"1ե2WuɂuV:p &;2¼^/9v f-6SXʓ]405Ϥj,t#_z3unѥ'SK*IYF֤ښZMbk>AZyCSJCZ/J:* )6lѦ\6:3>a^{aM'7{piԆήLI)EMǮ"0'JD }C񋟻:nyj:3V/##‘ - :,R\D7쌛h:KUliEEx.O~m~5xzi[r~nn~DI&?`,d x340031QH-*/+*fz4HsO٢tBd&TrJRZѡ@/7AU%}qWG%/f8 &ba77^04M8xTN@+FpI$JZ qp+HEKHd+{ǝ (^I0I|3̥͛Ff t?;~Ż3"2ĖA"S$],ؽ}'S@e3Y$8+*vB22߯zEeиʽN`:1D h. j1֐' (>.kӓ#'W U]”݃6qH$[ Ġe$jHTb4׬E?52DiPMz3:>h W@W50D" cj=Ѥ2*V˙",[eTuep؃82E'08u@f›j;&|O}vRV(\F9aIX!MT#ܥ,MTmp.bzƌ"mBeB@21:}9Qĭ:\ ` q|$ҬMgd15kDfHԷ +6!>U=hౡ]4Ugs࠻x+(MROQH-*/*rKʂbkN0xVn8}WL\`!ܦ>0n) /A Ha"]2|ɂn0,Qg 3p:L+r%! %Ld|t[~_`p3ir'3X;DCVL{+ `#|S3)3%(ly@BHyOjŏo0Hg )O:DJXadV߇LJnz͵Ztj&GS٧ ?J/h씛-hg_ƣIIQ- i<֠2?̃pE8A-Ï謖c,֠2 .L4 X 5hbFJ&֞h} N/75 Xb<ԭCmXjaHEiBuqJ.M!쯀u1eO/ۿT"1o!!8sL$ !`kr³%p:;*q$!,-b1ꞻJNeVXsU^)v myn-otA۠Ka6ǘ Q,FB {}.musp#! K;Đ3EH`l-_!<MwU.P JW+Sqo^Egk,VF!ߡ(SfP]h^QBMp<f/;egofT;1;I+ILՎm2k .r/P|{MeJˆ\a(s݊EQVSsL=h7Wpm)A!{6SP*%&ß;ND:]hө{nAŷ:w+ؽS>-WVe f 0d(7v7j3e*De{WkpaRoETkԲxXmo8I\-S/pJ Da"o<ɺ8v?΋uV˗686 P$q5\Rg7O'FR 1P )foEod %Iri(y:<|-4F!#*)2P]O$]),M1E'Lp)c)f/}Tf:ŏ Be]>?hq ZhIySIQHP*A[oQV t3;07HQyKL]?tr~Ɣ%`H@Ϫ/|~M s_`˵LL_rX9@䋊QĪ 1'y;O7'n}cCxMKBҿ2po LhYpsFr лRfyF~CHr,9oS@=Uii{J^>$->C[0r:{;=[[ t/~kakʋӢ8&s/ǜ|\Q==m?Svu'Sd-$uD h#.7c8N .Az|2Oi {@gN_#` xÉIJ<-$kտE I VNIFW8q}PgMQIwn0–=cH2L׃a H'I7)1`֜5yv`zY :A 켾A"X;њbsb9w%awMm•X͎#͎c(s8U Iw\Dd.)7 |7])\]piCJoA PΩa/Ųؕ~}{?l/V5A+ephg4&XcDyƌU yW}51N9.5k?Ȋ}S*ݧ5kF֨^d 4d;WG}M nPKՅDWWfc[璚m]Qӆ;W-,HxD100644 Cargo.toml<05ۘ+Vf&qD40000 srcڀUj{ `wAx340031QHKL+*fc`Oj\g!DQnbfHI)j׹UW~5=ycLIjIQfr1HՕym nƟ 7L?J@!73%%'<(I=3c /V~q< (/Q>I_.khmw~!E) Iގq_S.:ن0 /Y /-I-fu|uIjUW,d^/xUkoF_%ҕ}E*Z$nJEBՂd߫ P)̜3;sfl 0̉~ G_Mzyn Tp^ +K۟9DWՐ{&+w:" "m\S_ -* 'ϋtkP:x2 jhc&J<[9:g\m5?ت]/;}Ɨ(Rc UF>9.ocћrdiw{FlQ9=GS<4K0u޸rz94 =?RHIɯQ~S;z[nM2QD6g\lexW[o6~8uZ] (Z:PJRq}E;vMHL<\ S*R:W-<'1Qz_duI@rYPPAݎΕ-`$YF(͔6>Δ6l%^ͥ[䏩fRz>fEj4_\}:ArȔ\Ŀh5L<f\2w4yuHMtNEiUEn9JK#ޭNJWȄ]yeO߭Ғqc!R'T/ q ShtU#ɠὐ܂PEe`>eiIw3^srrҥw i]"hM^c] U$=V.mGUrT/pnvV)amp+yGi[8Ұ04,6O[kѳ +,~b\`VAL9d{&T<ҺI,Wb ~sWf_4r8f>5pΚc8Yf3A<JxM/=s &0ԩ+7K;ƭ/\_% fb=5v|4`\l~NgI!0w5K8,VƷPIG+¶gǚXtk*Ƣtip*>+X> 4*6cb2#2nbs;!7jRݳ+rRivpA5ӱ_|/>__},ifH&PWP  ׿葋2!j bh{/g˂Ԓ'?Z,py@eNi+0jNlz,)P>>d}D(0/zIa qmX{}>!y<xX[o6~8u@4`PC- ,݀)Y:H' xMKC)y9,RR4:;ON:HG>66E=]Vswǃ>\ռDhHlB)R Z0iO @pxOxͰR/21#,)@%Ӆ\@jq-:.P6Xrzl%I2(qX۲g*pVPFMR(䤁yCR&$kGbMG6e+񒾢6ert"]5HH3l1)1pfct@5 ø,ųvtf'$-12,a2rB@b d 5x)\b):]+HPkCTmL>n0}ymhQ8 wNFzT=8+~٠IV@dGSxPT#Jt10aQiHw2$#أi^Jdګ8*0A%I=J*X󄠐-8sW)l!i⢦ذ`3o*G$˼Eaa;k/3._x,ɭkN1.m0%M<l4C7oݗ\ƂortN.]6o*X8/%T{B_0%"E v5 X ET"7'cFo%Л(JSd^a߶;(׌lYlMYhXQNWSYXtޔ= mUu}_sg•:ripKk#jϟIS% \ޘjޣ1jMņ""|9g0+tAstM-D[8E&h*]CVg{ڀ̛i̡*cZw0V<5tOgvޥV^]WÇ0PZbz^p43VmLr[%N.2ևW HXe J6ˎSDyMVOe4krxZauSC= r{H^fώm;`{Ik긇R U]LVS ?,u!W6[_3mo&~\WʋXb(tԍHJmu yr߾v;k[;|-^r%poG;}i<᥼t25\__Z]x340031QH-*/HKI-+*f`>$Z Z,#ǿd ˪+ހh&Q0i| &I-RCM-hkܟuQOYW NH #>dl+T3oB='<淵p#rw: ?*gK}+x+(MROQH-*/HKI-* gXQExUߋ0 ~_!60+ŋkM)߇q{,/%'ERlFHcH{'v4\rev&5!^E7!6E{í0O횐=F-v&]dN5HҨ-jBuK^Fk9#l$WWW3&pK5(cP[oRܠށLEi$jɾ'Ѷ6>0k$|݊rY?;Q ٵ8g^.y} ]Mt( ,3UD2" YaU4u MgK\,I!Hxy$w`CW~ jsH1n^.ߪc!e8qe 6䘻9s#?`uooRd{=l1p5\;HigNkɩ:|'D n(|r,`q$[.k՗l'f”ЌBqgXUh_Xil>Y[;''a˕OW@*^0PYcS! hRLq8myyfQθNɥm6]?ep@F>'#T LeڤY 5Q1,Z;Lʭme[DL[Fu=ͥ+ZRڜMrY=lXX`Rn^M$3:QƕZI71[91}[x340031QO+*fP|RS{7((M,H-3{'߼yF'LO5x+(MROQ((M,H-@Ѻxݕn0 ~ 6y𜻲t]z芵d3<[4$]C $ke=N'(ϟ"{L g9?jZ*Tפ9Gcp~!?A9I^6kjbie X$]@oiԴ3mt9[FjjrFZcQwEs& ~3k yZSq[gbxw _ж{(i_dRq'jdh {ǧ̜%+ SGuF .6sA4(o%nOϽYIa>t'a$w5a=*t\ yҾx9NÒdX#yI2UDiFW$ X6H-$}XvL{X_g2*ů;#r7( )/›Nd0a,̆KT LyfcLSoxۦ4v!)yX:4^TXl"h"D\Rw7h~ ֑8@L- f6Ӈ,w,a~®Zisd jJSG `*(yG 3`c؎ a2cl^=O7x340031QO+*fx}Rݵa>Y+{\iC VsluMŇ*W@U%df/X>I^5,-"?Unn-佧xVKo@W =Dq4A *%ٲ։c48v(@)KylJQF;SZGQkE57ܗ}6B|?oZ?!Wd%?9L&]ux/3Xapo:Xڮ;\,YF_R%F#AWN)YX鮔S@dZck O 'OSg- PE!yy+c#[ECvDJƅF)]4`ع39hG˰앀Q͙Ψ37lRi)ߖAmmh5i%);H.r<^,oM3N:_8 _>Y>;d (MNbƨ=/? O x5A ὧx@[dz\d 2*Am yW|܋;X'f3"GjR5&ȤAc*KmJ|Zmf }D1lWy.=(Bt8:`xSMk@W$pd7-94^'=4kw:N/+9 {`f޼yw gW5_.Gl/Jr:!^j|51ִ KwIj;;A5l: YcΥn,gɳMU]+v,cdPͽgƓ -^7n>v!Rx669k4{5B i~=^"! x&Zp68$7rfmޭ Laz_,2Ac=1~jg0GLͯL,;RODK>GByuuaZ)٘F=nL'}'nܨ+ekqOO {;\؏{\T)ʉ?~)wquMv:@.^Xv/YrtѶb^ O,+Qx2/U{k몱,4mz,~1uQեsT @LsrxUYo0~ϯiIy@06ԆD@K@UGm5vMEu|t@]=.Xiy|8{ɡ\5!I0*X)*SI|Aup'Uf<^ʥV?|Ȥ0 ΗINQ G޽%v\ c߶^hN.x)h֪ k^v/[Uͅ?HK.KVXj B {FvS˷[9!ώ*,豼1#A{jrvZf˜nS.͂ϳRc7mFF"I:/Onݟ6?p;ڇMNN]x٠i|uOKRz6*E+^>nne:9z4NI?QVip&SCaF2ALq z+Vb3~? ;3硴,'= 'a2%՚7Mjւ э,"X,"7wtr$ے2d;:gM,YFuo[ k/2HjMᗷqsW ^X;Eg{ٞ_C>3^gfs<(w K>Qc tqD x|ؼdx+(MROQH/OL*d&d YINibkcxYo+>p\rٍb8'٢X,Zt$QGRӍbH=c%(.(p`Y$g8BQ:Te!2|5 [)k-Y)|Z$LLfd,)őBwJd.:ZpAikQGd(Р(]K<7;WLDP():O&ҷJϯOE +rSA^CTH;,ZoڷCWXBGr@D#XV)\d FmajW # 5b͔&b>'c24U=u˥><34({50;;dbmObIH,EhӰ-pEA4<\d<=tLD-y m(-k:KֿX%- x{ҳ"IJmV at~^\qZf|b\VRd,Ž_\/dy 8ó9YL C3btȸgtgsEvU mh]i{<){?6 >R(N~\^xkm /%1 DD "E(g4mġ(=J~$`Aĸ[YsdBBzKm.TaT`akND"+ D}im\xL^ Uiﶢи3Q9<_-5+!cxϫB,d ׹؈G3AV_ o|#e2B;(M#d25!ۖ=Vkp50FSX~IJEHf cNZ*Vc(o?LDnkC7"?P@Ɣ6?\$B;shhx{֤z?ŵaLSrCJ3jk BEVpM%D 2н=4YeK\AEA !Dj}FF?4>vhK1M!k!煮+Fdm1=}w~PV/ 'P"A9.Y^]ZfL+Js$gL浜 bIF7:P? óyN]niL)q @V:7EW ZƒyJH!Ө ,qMf$#f;,[ef5vZ=LUg&Yd3RA!Rv>ovV>IVK1f (S3Z-[ޘMTs ?7cevy`gTY#b Q[hVov)°x?,3"23X,xYj^5|j<yԙ{hf|r|aF$O둷<>e7 Qjϳd}1;Vq(n? m?6v7X}zX$̚3Ƕ!/!Yʿu侬$Lj^Ï/#r}ǟZ)=;Rw'ojS䶿z@~ ~"19ӓc*5y}23qT3ӖaD}}YE#+tqtY%Ӗb{(m}RX/{8fkJ'm9UˢlǤxXr6):dJ 5qiq29r r-"-y]}>IgG-)iFw?.v]2f{2vӳ2|]= pm5OmHke{x9ήUD7]rX5ЋiT cIއ`s,lλrrm U#/^mj)TCQoWX,8jn1*K ]0vYL&IUQ(ɘ/ٯVsƌᕚBe6gd2_rl݄ „brfm&+j +,\4V=.gcdsNkS/Gn,وst<SEC7ueb%`xT;YD~g Ό1cF`иJo9l]c0 #G-DEePkLQܡYk\ht6p \W3j1;7 WUqHhfZ nOKy\aV]ۢ nӅ;3n? vIFp1%^jneiQq 9g V$E<g2kEV'WbڏB3'ePg+C7.P+%%V( ]^MvlUbr=! UhװѮOh+-۽N@Ha]Wn*=fWq7vJ,URb$&E[Q,qMݴmAoeoöح1JcJ36G=Mh iASIa.Q'Z`!+vC~8ڌ5VnzcVXaF;}}";*J!q ]6TQhùitX bf^sYJҩKK ZaNfZ:Ծo#0|aͽc7spE vwLu&Vgx340031QpN,J+al<-5^]mW`fb```P\Pт-PCuScA֛SQ}xe1@ECALJDm9q Vv3hQ :lr6\9V& XȄ~(6j˦O "rlr 2^LTB  .MQL%h\DT_%V.^7]Iys8P]BE堕-]Zx31000PH,Mg8e3˄>heh``fbWTpDsmX >n6$371=a]m/V^0q_&5$713dDGzg35(^'1"/Tjzy"]_"D %ެ6FںÈ"[Z`Kw7aZԔҜ"vMϳG8ƿ֥ j2SRvu./bc<<;{x340031QO+*f(U2۶zޣeyq; xWp,MW((ON-.KWO)IWwRH,NU0QU-IM+QH+K-*Q()*` tx{*c,[x~QvjDP>9?/-3]zXҢԼJ+Rcɼ%єN>h3ԼԴҜ p oנxg?Р W?H%%YM&c4䙬W8x340031QO+*f(ZXq}gfӴO C!xOO0 fS+U7v`.cnIU *wGčӋNS5”o.c :!̵-[#g HΎ5i4C:h VCaLiY`A8rU(7!糙  Io(9"9q ջ|}S؂Šp)\뵒Tf-Ɩc3wY6c$p~WBp+0M[SCփҾSxs~c /iQj6L)o_(76C?7W)E>]0ؽUPxʲe/{BfnbzϬ`dwF%#=#]܂ԼɍŬ`wF9OIBxSn0W0(Uv #:tH t k)EHrbhj={Gr49cu1P vPҩsܚ\xC>'lwEʥ[K=B`j?6^mu;ۇ,m-I9(~qE /@ar 7S!-fBiD.環(T{"6ɍ}Ip/Yч|CΆs))3I,`]ɨjqd\_ÆC |a7%&!Jf:sgcP '#aqlmKY&Ax9,Vp}1=8Si"ȇB<˟bm39F փ!rvw: `M-_q5=+X&+V!Md&B>'# }SLx340031QH+.M-+*fp:tՋ#ˢf^wc6C o)a}:`KBx 7;[EQff c+'u"2}c*I&e`s-Xb*IdR"t3T63boE%h؟JoQ_b4z-v&KPAKl ,ؼ$K4 JJ ,XX"4$t`bp&\g3߉ccҌ}?P y֫g:;TT]|OE-k!1:+,ܡb A=YGEё VanMMp㫝k4%Lk6WH1f0b 8d,͉HI ijXSX~v _v߇rq^f[) WX-t.Υ':/(Ÿw[Zh$wȤ4#37+jLrEB}^Bnj J- 0Y@fqIk\}T y`;uv*2<˽^M&%%`H~2Z܎*Ґ|jT}j񠫮utV QX)y $oxCA7()LfR{?u6G4wj*Ǹ(Q:ߝzg]Ca#r%r|葁+Ov:U4:UƎl:\[̟[{~3,vS,P<ۜ芠i'P]b8Rd#OOSR;.57(@{M7xB/O 7GU:kzskҸy[u-“؜~"U9zMEZYTky0&"k0hK7aWNX ],B3-t䦧'Ӥ??}gԝe0J5F0#F\T:j?}8Fy`;XRH=j]6lRVϓW٠&[K O}_ KŇ'ʘ2]&4נq?ZciJjn579P[jt rh] [|46h}|gucOџ^vCx+(MROQH+.M-*[ xUMo0 WX\% Mw6xNlɐ%F>HmX$*%8>ɊE<ˍSJLcJiqAqI?y*PRz}^+1-/"JK(,P6Dym-L"¸!mЅF:uJt5G)GMQweW )E!g#bn+z ?M6֞ C' "Θ  ^LE}K>J9#TNOX#@Gm-fpCs с4J J,ّ Ӝ<)}RݗTlpG}-B]e!eԯU]<,5Tdg>/ TKBNX3=2_bY,Mޙқ햦W>F~.x/x340031QO+*fXqόG|n{p,[x340031QHK,ʬJ+*fP7uw!w^m !ʒRAM*H}鰫RRSAdfh:WreYfPE)`ۮY4!)Ûΰ/JEfr”e$%U9w]-1~*go ps{o/rKs ̴섒"9=>;3`+N+aŒn {KFYrB82؆34t>t`6 /dZcKf+,~j$^%K#l C'оY+{:Mi> $hߦnrr,ߖ>FFrFU AF1 Wf4앐[j[}ߗƿ*ʵv "աV''u8OwNh皖s}Yc_sa mp"~zM.iN# Ôr=(ỡ"ʁ=qܕ{WԪpXs, !L4âwO>8 7i-ykAsF;Xlf՗qQj n7nFW̽qV ciY¢ 7l{*tm!X$ꋇ<*aR6gQbxzҍ)So ݨg`U_ ,*1th_ (~w mKG yVb(`z=k)΋B5&Wvi۽s Wye֏cGUm|,a V򌒺44Uܛ4,J9J$nBYĦ"X)A `Ԉm7S9x}3jzNE`yVYc"u%YT36!{ y/x/8T2{4]=0?$ۄt˜v,݄XZ2/kI:E=~˜1PZ7n*cW*]S^wcr~3UȅlVu(m(Ѽ{#J`HllY05%YȺWni좌2qVӜqVZ%Q"j/ 08FKU崄;ضqmrtE| 3{CQ 4Y5>JLܪ˧,sd3YKd˳%Y f@Ua)4L %ΜazeQ+"*FFŖHH尤4byKE^tLcW8M d#,N IjC-\Oݐ5|矡QL1<ðS~~XEObz?VG J?t>LjyYؕv;RPvwYɬ[{ *H5&d};E|\%yf5]g[?W%(bd#/v4N4D?͑@uu*^% ,XssJ([ M0f/NP(l]2/ h% f.fX9y^=i?t"WGS ds&TAu"F4߻YRDPeFNWr73"4O1<T5Oc|[ɧ/Sr.[]?ׁCNyc^eƁ`sYF#v9|qKnSXP#'nFwon[s~c"Fi6Ícl 8) Z@ϻmY2T[durX䬟7WJ7 9twS),tk؁;ɀf ~'t \C,6u_C7tc>o Lإ*6NFƪq 8A20v4 x8>npGQPZ%YD3틀>[~Pyg mv*O.UZ֛[2Lv*<E|U~#UMS{ ^rla?ߟ QApʊ,;gQK &-,Ed08*xio8 6ZEe,vgb:Hb-S6[TIgv]` $QXEJ,/&M81ע U (Uc*jZ2N?drrr7TQXQMsMW ɩZ0I,Aok s 3@Żw瑧uP\HJ@gCAXYʛ >z ګ 5$_[!T,ɣ#+ 瞷Q؃țr tVu˙yLd _ UM/=\"r)!c_6r| nn2Zz"O|$ՍAJ4dqg7OqbNNZT$lTB.\1N4Uc3 ÿh~i;; Vtu\+]4(CyHyw^?{ ʐN~EI.ʒE=jE!5,@$5QrW[MFRӕ"ɝ eQ7+1_rH ˇ'9S%)ZvZyk"5#eW5:OB$3!+\QR:`BdUx+7(_DEf@Z{CVDSIJM`Vm΀ y(PCLcKXo6\X'ot(TzAқ3> $:]Bj245 vеun~{`Owس`gaZ#zqXE8_n45(A7ݗ%ɩ )I2) h՞-Ż^0yfp&iP_*ȳ֤3&IxW2x%&3g1:~]n!_!1S&dP'p*iZA[?Qysmu0^ë|- NaghQwdx*d"LQu).6 vI ,4\,ŶlXfvl ˵E"8g#!mUa#±a9r2q8,H]E E:.|E!(RQ)! Cׅ3\QkHjI'A8bxcn[8C`a=Bޘv-ZZHֻ/n6l:Doy0j..z; ́ Z=/rbߌ2i|{r6O"|]RrU TlkoWv mZ:ImaDQπi/y4RM|p/vhl;7(h$UlL1MaC/~` ,CV4<=F4@k3]ǡo@3ƃhzWRc%ac9[kkb~k) )ƭ1:+K cI:놏e3pC#+5ۚbO:^xIl.} =6` [BC<2ja #L:?]\ R4ZTD'*m'Bdsy^6bR:O55sp]9ٞyag1v ߌBom ՞鈞:9>f} `xXnSŠ،Ihw)!e#Z }MFE_Uj<6wE)\aRv,dr}} ?0bT$Ki.xw22.RsdقQTTLr l|3fOо5 "\dPw a0XQ:IuT_ࣘ)oHI<ν8k^Ei,TaXmbg9|acz><{i=̳$!J{R)P>%t=>:+/`ǔ1ce,6^/+oJ |,W¡6fs5X=ۤqwlqI!};/PL3a4Pi?,y?u荿h8rԾ-3~Lx^dGil .4R^:pX4b$J*0m3s@:3u #ȥ TRNl[%s(?L!qY)v|Soz)l}X"=Ojc[7[eFJTp {-\"՘_|3u "MP +`! (nzEEGVS5_ˌ:JE[[?Al#ziz]uH7 *BńI02`a Vͧnm"4  Z.{8ZwEb|Oh.<'J"|Zj*qZh;SKdL 6s#ji^&to/]o\$I<rz9;֭AO7gxg+ Pn ,DrݩI(saG)Xx:Qٺy`v+(J=~?~l^4q9?KeXI4x 1 ߒ2C20N:T&ZW3yT0Z/{3ۤue)g h:g1h<s:}ZnRlVp)3f6S q^xuXaa{Rĸr;E C,ز`\;L[ Q@72ez6Qπ oLEadcq=qSRPe8"L'+ZDRy$y9 .P5<N n`gF3pWЍ,VԀeT0ފ.8k(/TʌIݵDrҳW.'(U9CN2!^l_ ͥ`$ܞ)ux Z%W7+Db d9XH}Gݱ9Em"lGhyK*z`?")JcCNf1muֶco+IDWy>jWS@NM6di:!X/5/m#A*bZ7_=RYñ,VDzZB'mS訁fVYF\A K,u]gxjfd]1q<5. SF^4R,^5՛Bze˽=π['}E:b0 3X&Ȟ. rtW P~"<M5O[ `5;*՚)5wHf?>ǿ hd+^}M|!wa/#9xU_6SLl9Z9}NVUV+f)߽MX N#HO>6N[%3J1/QS1!g *JKi͙HN&9̹6Ldń.j(&UsHVҬ 1R:dHA)*%k.r?`fNsQ.j`M,g/R+YqvOP]ԥ )),Bp js3`%cԋV(!FPwR P0"īpr'1|J``u9S==J}W*lbz2gg  j3 v(,@n5k:_\j]ٳ|AJN3 c{*HE% Ci_,<7 ᪇Wʐ0M{{0Frj../PoH^Θ8\"qVؓ\y)|Ɍ39d^ M+E&'D$d^O/(d~j(IM#`gG> ~|9<@7Bϝ `S?sI/MnYGM 9``XlokJCj x>~3Q+ȎϿ+7Uӝݪ.:ez#JFxUW, TURI"#uE9; <&BBYIVd%Jm!@yFxL#bI{ȩl l@qD<,@xw$(!Vwq#U9'cßF5$yZ/ %dָ5*V#T\P':~v+қY#Iw?̃>߳Df7CU]&]R74^ޝ1JBdNӽ5q|?klފ/k3wTF;==Z֨pac5tau5Y/qN rjnmAg~\s m99_ۂ9G11ٴdJrET<-(9e2 XD/!*7xJgsmK, ~E +ZU^2AA ]{ #|' ·M(ILB2#-c TdeA,d|?v9,Ǣ{91֯Bb3?K0ń KSZS.!8Z-k1,0JwaX rkD-/UK3:a)n6d8->XWʆWJdmL vGH&O]F%_8pi ehz֛IZ_0zTQYqalpjay  ڸBxd+\) ,|yDo4D'UNb {&n ζno~NGE[Z~㝡AIuT/#dGMv`:((A1.]8F}7h\ojgqf \~ӧ7n^kP7M2r_& T\{PE ;]u#f!u4 U*V tFѸ oqq><ΕTH)U48K U4mJÇ$x4Q:O/8#|G]wRXZօ<@d Ù$ zK*YVX5L΃V Z!h-#k8{ W階5摶KkJ؇Gb+aVeMQcvQhyg6=fYʷF K>Q3a`j֎< z^#DI.,0.(1j)A*G-/nzvtwZfe {4K<۴Ȳ;kpxUMo8WL!Z%=B)Р@Ed= 9Hf2%Pt.Ԑ7TەАRinqFhyB}Ɨ >p- r8Z`ok5$M"2&HUd6ܠ*2}zĖC3lvD-5 ik*3xq %O(C H%:; 컺A=n_fq23N{ 6k K#Z؄p(?mWOIIjN2Ɛa=<~xptŘ{z,q2W2xDt5ÍmG b1P.Hk. E~L+y;ÓØƗg"5i| |S{\OMz[ntٓ}51 :^!8wTXgthLhrtÌ˕U\6!*ޔyDg3f)Wl^Cs2LUs4܉ÔͷˠRMJZspAԊ{jz;m+Xr^G,m3sQȗ!9u\rw(HKܰ$:abPUpO|uܨQ©f N $Il毯$;"X(/j EzG?ӫw`ӛ=wI7xgWNՋ3렯ڟ_8]N߁}l+O'[xVmk6_qnEC}(l4 QcGT$n߇lqw!<'"c)Rab0-Zڈ,ӊR4FJPxxD 3Xfz6,Xgrj_Jr)#QZ #|m"*1*h ހ*Xr1%pe8X"< A y?L(|U?V&9wGЬj׻3.D杹9t1=(o }TPFY qZ9b.fB)fnsϤ0cR8įA$cec$Arp0:H%\LTJ:5TlR .i#8 uF]+.Ւ%3dr7~yV* [DD(-M8flAy05 lI#KWx 7TaA:CrҁG+c!^GnHM'2gBb磺 o0jxX󜫒$Z][d]oaFOkiO`GBnÎ*6+ҡ`!ǹ1rŖLHTMYu3{Z~v Ƞ2wB+29; o4dJtƜǞ(1IGU2V>y.]cE^?w,ű}l9=R84=0ȦtUV^zHPF+] Zگj*¢}'[E8?6OCm'L\Kܑn[JDF-ܚ`gx ^:2QMn0M&Ahdr~M%'A-̏wVQ? ]UvoԻ@҂ ywu 6j07JH;7m>g=x*ZJKDC_~Mv_Vw LHˮ?ZpU `YxYr۶ب3.В ]bۧ93K 0hKu=ӇIʢd'G&oŇ:W,%1;I'q+WSӏHu.DQ'rqee HS}X xd^vvvd$FY\10`\+pip]`\o+˧@WN/g>D{;_?:y ѫҀwQ@@!tF 12=ώ~7L145$d*ʂFU $}v8TFJbVP3/S*?rm- ̮58Ct9‹p*O 1N;+4 cv9:QL(j- F6( lk9TX-Hy ӻ\dث"):=kF#*.4*n:,T- o$ 鳫ȹnO3fmźǸBjT⣻J{࿧4>bin,E3Jޅˏv^TdR1ٶd3O{GoX)VR\·X aly@v,+V}؜kp=&nHƌY^4% tU5deV:hsT"#fQ1'e9F(S, HSTT(rvl/%YR:ot? OwМ2QS[J}8yTHB5JeD(@4J(o+ՀD(-m+ᢐXnH_(8I@IF( Gy b榦>UH9N3-_xYf478[w]N&밓*U\Xb-Cl﷚JT bI_ez̢%<(R csansN>/4:Ί.)႓Q;?S22x4"t0!7k3TYa|T@eoZKՖK . nOMƔK_6t}(2k1 }" }7w"ݧw`ޖ2M%icE|&-;jr-&~MsE˵`ӿQhTڽJEj9Hs|˼͕.r*ND:&ϜU`oI"zn' :)Z`RKjSUL 4R#KD׺ 6,-h0:ngl3 `:WQ]@VLݷYU{S,),Ma*̍|a eJ‡6TGV:oIL/a®{݇ӓaxWn8}WLԠI0u۠y0hD $ؒbՃmj᜹6 hV7vQYh܌X2J?n}f0MsQK%ߥZ3nMid֔ކ_X#a*m .PYafV镬\*`& l*[bU-0_NLf=z*h =dK.lik`^a!7*V`U?)ݰv37ʀ\Y19 E M[:jh]"92ٚ532 ,YV ,y2mUfCkcow=\MϬAS eV8ZiV;]v/_ fϳ00ys`号VB ;& w3he`")rC⛽](`)lCr:[Q|3rNNbhX!\H -yp@T6VUz/ C\sIRS;|UEƝ8 rgg˝ R[bcݧ;uv*XsyQWQ DE b6ˠz*M(9T9tjHF})E#,Ѽ"Q%~>E 8>vFSQ2d6}\(C'컵`Xáf(4s`Dp|3p1(|pj6wQqmasBOpmd|NkU|:x9l8vVjn6|K{Ąnrʆߧ`pR欭 R#3"]HvX+Ysx][t,[[[woDv{G9jf@CKGӊ i+6 L*2]ؑ`=CPρ U S`d.F{,GOS)Q 4W QmT##1^A7S%vgдTً +kr3? NZRJH6xUn6}WL \MR#IA H""*IeI5@_ |IAn˒3V#g75Drn U~yV|=F3BۛמC)K'd*%cWRnמ\ RQa! %Z9Ls &ƾHAC&jnBB-־Z|{7^2hWq} )YA&JJ!}H1fWkmiE >{0h&!+Ĩ_GsD6G6J9z.רŧ 2p LPFFJuōM ^'^Y1 *W]pՠ6M^(AD38ԙ>e(,=oDj B`706NEloIAkNlDwCk=;S&؄7ariWǷᅅ߅Kw"Ƹ!..:qo3ƆjQG,F"돨  76)kkdxg*ēq-褼Ae LKBe 4põf>V1븮aa_{O[?5*?m0w?&8Z_^a]aHئ;lRsju(M)9KXA2Mxͧ2$e!9$cߌJm .kdN.^CG&v,NR9{3C&mi(q1%PY. •3|yj Փtx9o]VK Bf?ַy& kO%F[p"kl\/H^9O`~AyeW\#ʫT[)egQƴ9}nSA:F^N;7+%$h`K2E;o<.1rު˹ ;s7Ҡ\]OiMXBZ&[ap)1CbKVnGL6nY0sDlKL8W4۲ X!K,BSFm mF'Zb 7@*ظjjmv׽Ώ:f.L,dI`tRJɧۃC%d&jBH¥vJԇ>%"S"20[ka.Tո^_r=fv\X7_Iq@ B +v "'3Bm֓B4കΠ9Hڛ|N/#15/H| ;_Ogçrg } Z.`TS$ZŁ:ͬJVņZf$8l\HdYs"J ,#2n3b%mGK%n*v6ʏ^?(Y䦰I\/+ơ+ثQ-~_Nv|Ɖ#z୰zP~':y|kBSdk L[yCWb\xm9P0̝hGnW™@>&/c( 50WXe>PځR JcL)ۭJJ[ ^ 0!0i0B  -r1P55'ޜ#ޞ#ibTc5}~oC|" +Qk:Ϛo5ߞ1A k0v'IEߪ}Žb2cP y]2{إ0׸${}&3iXAn%=Åإn%ܩT[@a;wڑ$$ўlpGk PI8U$4v*-.IYX "6ht{ZL! ZUdkZ/>4MNŃtz2OH.|s2mU>@ʒ? 7@űQayCNr\k" &G}&!uzAuFQ lS8T`$>hi)]cyf}!T*exW HM&}2,F yGQlP{+yQj(Kze )D:iOizhIOptƑ)s=9# #d!QDGy8fs%r/fNgG"7wwc=fF|+f,)rx1-F'},dM3 = x:=:VXl)1;%Yk5Okk8?h\@k\s򓍫\xJN|9hߍU$[geP^V (Xx18mv5(ݯufy>Jhجy)d18yϸ]'nϡ&fI~h6HrO PQ?=KZ.%o KxnP'6]:OG[_Җ|w?ex5;0>xHVHTP!!.x_#;TiyFzA+\o 5\R<_k<6׈tƈ128NĬ^!)x340031QO+*fX1ʓ_:_: j9رx10 НS01"2QU,:S^X*#d_֎Sxקq}rR&<|(A x340031QHM*cٲi%n^zFD*9? ?/5t`~-9hxzҼԊtbtayI,\pDPiPىP R-~4ibZ#LnXS_\\\ 347!EٽȄE!NkBAiRNf2lvrpiA%3=YP#EYjWTPJր]z_,g-}xRPPR)NHMTRP())(OM*KI-ӇY@yzYyJ: ݩ%y)JV Jzzzz\Fx]O1n0 BZ];wd9fKK( -i7xvI4Uk+2cbwͳ:\8C /1qx3@5lG30>ʼnNQ([\W{䐥Wmɷ)^ dfBAcfa"mcLpO\|Q1G &d٫#ʖyo)X7wJSjaOt_ű| xMA 0"]8PudBSĻ$jobxp^1aT,\鈂,ٰ?pg|J˜`Z%>%vTJo3\Z:"G/94xmn E uhUH&  &N^?Bծ,cW=(&S Лgdq AmM/m)U{``wy31Z!Uoۘh8(44LlpN!:U8FKX-f zmp|Hge_FT:9 ALuR❊Vy\]X\V[V%za.QHXKh.v&eYl{W9Nְ?"hr[ٳ%?;x5M õ^ ǀ4JAx h6Ϸ*;z:rq ^dMQ,MŻs f?x)100644 manifest.json4ٸ"䟖՘k>WxuJ0})н-,7Ao"eLC7NBe }Iw2fXib윍6j{ 12gޅIA '8S9I%5ï(v 6O..)wb":gFnUκ3WkZz (QlR"5\odSzE ͇q! *Mf8eu\kq*~u%x31000PH,(`xi,35`SsӜf&;:(es RJqUZBe" 2TSypZ뵌)z 9I ~NOx:ojpeY5*2x31000PH,d:6#gL ) {e\t;'e 8?E󻡁BzN~RbN^rq1o=oZgoҫ:CHM)`ou ْWw@hf1= 2sS_yAɼ* ''2DHջ=zK9]`;TUAbz*X WDZg/gý R/=2Soju/|''1zIx340031Q(/-I+)fx1x^Oż\! 'xAO@O>Dm*n"TQ!T%Ap6$X;$VGkRj7ϯ; hkcNX {,3mT ,+K<|"q\T*k{{XCZOl*1jX:닄KJ0hP9f1tArG3B>: Q',*#C `lrm#j|yhpTYB-2r49DZ-R׸;vź/| m.b,QR 0wn#?;@6:^H+R-ۛdv? Olߧ2ۿ)0x$100644 route.tsC&㩿w`NxTMo0 W.`Y]\P`.B`ةl&fD7 A#nH3xZ4Ӑ24 85Q$'e˻Ż7`IP=&a~9# siE6d8{5pfrX*||/0`͊tVȭ,|i2$^VSUF '0è[p.W]Gpaa죑[F'? Z@|,)MAl52j]ܚ ^O焧9^i R0%V!}t 3P5#iD"U5{@ni.h^ȳZk2g+?G.B7ËCh.MMExO*2֦bP;,ݰwp1iQN) خqn=d]'h>W+_A.9@pdg >e v{WOF?V =?|sc;~16x31000PH+K-*a}'-L$Ȳ?κy[x340031Q(HLO+)`j.2񎂳zUDBu xUmo6_q9+s"cu : X tP7^dMm`rP|4bU- 58s<=`dB;^HM/6g/>JѽG湬j)P=7ROWşRKkj V{=I0:ѿ'MdFfk%KZDK VdT iԖO/9P^AݜkZk6)xV2G(6X%*%>x n6VIW-q%q'ShFMF/[H ONfW7v6AXΗz[_@`JdpL/ aqߖrf xs'=TW9[i2B6f:(ǧx㙠R z!yq:c{ E }7;$+hCKAZE}MKYԲ+KM\Pynz=318=#QҦ[BhɴѴi'6jodʺ4?eٽ1q7)(pPNBZ~lQlaޝ*rN~O+L|JZQ`A8dR)Pesv8uY98 >0R!Vd) `*#M#$Qт=j閊$&b^g)Xq?CtnF*,=c=oܡZȚgq/ [Ɍ;ZAQb^]t8hz>:>S zx)zAt;ofF+)՘&Xՙy yeE%dJrK* 39?϶73*PXj[ml5TB®fhRy;J↪NfI"4I#h1aԸDT8A E+MEſ0xdTҴEx8tҘKE&TJ}(=ebZ!-1qq}ez85[&[a ޻N= DŽ?x340031Q(/-I+)fxsi-R#xun@E{ŕH;B4F&JCQ*6vdZc2DNj;94/Tx竬F;F59|W 3[yh'XmכrY|?1CabFϣh]~qfFQ'8^aicFcT ֜@ OBȢ`Ru0e]pISc~0Ve$iΦ`E`G"_=vF]βV\;TL EN|Y Ibl9;G'/IB72[~uϭW x31000PH-(J-.f˽&#/usY&P%yeE% ->0vOSvtWv'DEQjn~YnR:Cazo)U:{88l;8YLMqfU*Þݔ~sw+x7x340031Q(HLO+)`yxnQ] {^> x)Mt;gnbzK~yFیlEœuBealީə9y ٥Ey ^~I ($)d&d$U&*q)Afr~m5ܺsٚ`voa 2x340031Q(HLO+)`8e-sǽ݂3/Mӧ+S/9 äx340031Q(HLO+)`(^s[o34eehxUn6}W `ȅUn:Q6-m ((i$38*/x{!R)o˙33dd5B.8JfnHhj0ntɄX~{()dyokVy+"Ț*!!?bş$%cPg[>՘x#;: ~䖲DlROLDaIThf㧗(LN A QXY;W!qWs4x Baj[x1:r'_O#{u74ã1<ƤWC'>N6,,j`Ϟ98"$AvoɴupѴG6jgdIWeCn|)N^ N)mr?J2[Tr՘FM-("y*P@m dd5|0IҠ:.HpJ&ආ:K^Ml̓GPC2bICr32vP4KQfj'II +ب`K԰]IK.)cU|}@ ~_;IlQT {x#zSt;[pFQf^FߛAeNug&t71K3AT(8%&g(q)AJjqrQfAIf~GbAiBNbIbBRjNbvb^:Lafr~m5sت0Qg 5x340031Q(HLO+)`88E%{R'4xO1  x&zUt[PjqfUƀPdClE`ffif_gnbz'ed*&%f(dg*'&%e&VBM3݉} 3#A.:x}Rn@ +{(Ы--Z>nRֶv a/؉|Ʌ3$K2t&!V刹 wR*/Tn+FzU8*ᴈxŕnFz<I5#U1jH|az^rF }"[ PR"@ыĕvffGmwxy=-_;rS Z%g3궑JFٺwdEϞn68<@ #c~N XjGeK41_$mp,PlcQ>[.g m]vV}~ޱȽQ}rܗkVXɪ.fikT3U'T~ۖIo^D5R>2)(_#9 'VVm~}3AMV]/4A[6MMVM7ؠ!άϲdLJC4 ~FaYF,aY F{]/O݊jB_5y%@ī/md|?ίy2@]]zR=~ _JS8hy^(2Ą9K{Dg*}EViw[[F4'%r=U~_ػ;1չ1,G>:CJݔ$|9ZdW~陾Bnb~F=v3}PۆS Nom_$Qқ@cGfx"{Hj(nyVKԲi#"1Y"x\C* %Yb#]:h5ѵ\cM+yk߆PxE$!'xB}4$zzv υ x31000PH-(J-.f(ٔ?j,LO{N.`6+MLO---HIc1kGۉe;5C2T\s뱫2 Zs(͗ ǐzqK68YE~ D]qANf ;n!'s\]'}H=x340031Q(HLO+)``X u舖nŘ4vEԀ BOx&zCt;[fNgnbzƀ+)i52mfefpq˦ĥyp}PႌTjɧU r2K2 R`ZA$??V d%^fF.){x340031Q(HLO+)`Xd -G+Uͣ Ux340031Q(HLO+)`xarV㖠KNNi=Y7Yx!zJt;ojFE驓~X .nJ\ `Z\YPg䞘TZX839?϶7hd[['x340031Q(HLO+)`}2b훼.98ZZ  vx!^t;gnbzgr~ƀ!`d=_<)i% 2.n % `%J\ `Z\YPg䜟WZTPXXӒg[ yT6T۔ط1P6Gx340031Q(HLO+)`X6zUH6!=ui5M.x!zJt;kpANfƀd} ffifOB'ed*f%f+d$$&)敔g&VC 5X}+3ʰ+xE100644 page.tsx ]4~n^240000 result0-ڥ 6(-Q6v&O<#Z>xTMoGV0iVJ|( rlKuDk{ٙl %Ʊު.zfs{G;̼ۅua9O2Q% ýا-;2L=V E LtV[QvDVX2O=0NvKn~옗gfPZ1)A =[8g+|7.nss uMc)`D7B䶰Ii%`q|Nf[1{ ǀ1dp`S& A۩V1:7]],@?J5m$>T<jRǨ\4Q x{ zGt;oiqfƀ+<)%E% ~&tS!"M `J\ `Z\YPg䘛֪XP Wg[ sb4+ٷ2k4x340031Q(HLO+)`rK|,M = ^wqx340031Q(HLO+)`k9aՅ >q<,b]x{ zBt;[fNƀ+i٩E ~sgxM]=J\ `Z\YPg䜟WZTPSg[ db$sٷ2U+ x340031Q(HLO+)`j"``[kJ _/[ x{ z\t;Gprfqq~Qƀ,!E ~en6af )e+q)AJjqrQfAIf~R@~I~^BqjznjB[p@q.8b~D"j~|T[ewhlT !EiAI:"P/*kITg'W+tCFh/jmj2lVkg}<ڀG~]NZN,c;~\ƟNj]yV5TNJi>}^, y" fho`{V؍5%_õ&v"`_V],Esrb# ;PƋ-#g݈xg|aWEg%z9Г(@y}p-΁CW iK.o^sdr(~6Q, [zm(mi.BG\d V&նh[y" Q!}#mlDHfblE=‚oދV#ӎ|5eoH _!Xc83z7coⲰ*'gVW=1;duCu{TK"TUy+k~i}c+_} $%5*t}q/o<{iA8{Jְo9S 2370~[}8SH FZ0)7#WQi1|vHbo7^Tiʩ\~GZ2~ :yX0[ﲻNطxVn683B B[NK lA`#D $e;u,{Ϟde'K%\a”!ÓeP(Tĸ|i:g@,EC4z\ip!qpc!X"Wiz-cPZ2 r)BT z-~žlQl\5|d`ٷ 8CPP_naI )(/1B[xb\yHӎSo%MƓFŋi?4BsʣPIof҇YyX w]dA.$7Pc=I 5La(AZ ok@Jco?,s%V0JLK:$ּwU(|+uHi)C)hYm:2qX21\e:Z&e݄%(rڱAզٽF4t?rÓf܁SenxVyfީtnlӈ- LR C=y1gY}WŔH\iI5㘳O;uN;A 5iSǘ52{T-6ce'dx@Y25p 5X%|ݣ r2.-PxFIq\=0I%I#*ضU)$ &E(*l %aa'޹_Ed h6x?yf.f]3qgh(P*4">VpW5C!ʤD2\.p:nXr˷4PykOYI/ 7{8]% +Z\ .))[L?:y3zC_VN2bIK{ Jڤ"]Y?%śei#K`7iao wR:,(y C1,ƄwCz _\יVɀձÇKBgw.Pð*CXo- d\\EE(xVn8}WL8AX-Y(}+F7)eп/(Kp.0  nF#fJ[8BnX97UHh45䶘v *;ExcĥES&GQ{ \noF1)9Э/c׆Ze啗vy׊1 'Q Hq.J#`.ttTT2%Le)7[1'79ͭ3h?z [۽)ƛEsb%bFk oz > O/v4Uw|bR'7g7Yo**#\C Yf]Շ [tǷ*=cgEu4+4Ǎ)| .#Ūb`4rY=|NW~-csUnu]Ţ/Q˒ʞ- u j_400eH 2r Z2ˆlP֙ w-0t4#l-l$<0XŽ={>֧J5:n) py~W<sɨ߶AyvIUIbDbq[ pN؏zqU)yiNz}޽kT0FA-ߡOڡ*H£ɐYj~ R' yǓ^Fp )6*l4=1}2-H I6Tro:Iق4Ƞ\.%KG}/9=[wZ<>{F$pOcf4 L4`gNޒK%nl߁,vE>w5*eVSi Ytwv6hof=G{P7aK7|`*ӂMOh#r=<JA`] W8,A=dOA_5&NCp=N_ i?:vMEД4:Rݠxl`e0` 0 ٧Fۄ-1bz3KqP{H:Ը@I`*Zl 7lr3*o+ttx}T8+f# fLk{Yi4i$plvhPĿH)UUq|"Qm= GiuX/PxmPi/SZ^e{'ChEAٹ%Xɖ<'|aqh" /)V* rE7ַTc̎;JjCKRosѱ^*z M\fc+v:zY2鸽i_o$! Ȳ (,*L"X8tv[_xe4ІŸR$3R<&8/Q\{E=tQ orAd Oih̓>%>wP"kt>?=&Kw^QZ]l0Vת%6dJ=& l%x^l 2cE voLn%h񄼶N[ftlQE\J~}ƶM^Y3)RbǠ)hn,HV/_ .as\J:Bxs[-7K|KxbzrCOGP{n *3swQGD*A dmjݰ6>I)IQE^n v~(0#8[,r8pTpyiJ*RT Efv oJW,I6iM4YKt'~vu'$Ѳ0dmrQ`+J8geVTd9[],g)^CU p*eY9;S0$ YzXo^&pĸeHQh2d5V'9H-|, :֐$5ڇh?RdܝPjv/#b7.xu@ fc]ys71b=k+zLEO}AUYg0k#H8 \3۔2V9 zh.C[C !fvGuz/ER)6U~ EImXP;>dգ $cT >1|\QІ R+MXAΠ# Y!z gӧ???ͮVt! k<___{? ;\HxSۊ0}WiѦٔ%VJ R,!Y/v.4]J_ 3)#AhE6,SƻpS-oY(3ub8lPrA~{WC$4-SPZf(I9;l+or]oylm ]Cl?:$-6˨靗iϚ8kN6GҼЄz2ˀ@wAh37΅+KaNalf7=]jju;@=l~<{@p$PTexOIz+0ٲGDݵv:d e9KjW o͚:d TS`jw*NpO {~K~F~8::-#z.,$:&`H䛯([s0PV!䶂xۊ[Hn_EI*PHWDR'Cc^ vd 3Xp3`n 2pf}B|+AS'|oaq;pktp4]_ 'kxm/k^-L|jn̈́O)+)-#6 WtUOfdz`jF^[ SIPͬ4L+?C#(%AXj:JGNj;_,vm4fsoYsCz~<Su/_bL\vR]JԆ'Uw-~ @˲r rOnJ آr>@IsT\3Wnf2LrX M0vQ̈́̉6b,Lov Y l~b9O FUA6EEhTpS~_?2_\4:ExP Dojd4R r>mqRJ\ljx[z wїȈ+)~I(yifPD/ OgEtt :JMAc)$TBFѶ=$BҜ ,Y;B9 '`.} %M{6։pnKm6`;o*<{uo7;}{NiML.ArcԼ:Xr5U*MM) ޘoR,/5Q&$.m& $}${;6ucJ|~BjZ&{ޡ4R h )vzÞAh cQә쿋4՘"a%)_A_}qT½c 3}cZ7nŰq/Joo˱8VZK,moztۼݬ8-/~nX&sʷ =~~㻿GSJY0L\G?B1M@s'ѯWug ՛觩T Ft ~Pu1 x'EJCE[k0[o[sҲLL59V DEySxbAp0Zfnx_Yx340031Q(-NO-.I,)-+)fP1_dY\g̴ٿ '?1E{5|jS伳3_l$WxVMs6Wl9>PJ*eZOLLCK6hZU;X4`m}ۇN!FlV[!5Sx #}*d Vhm`J=D FD"|[ҩofCWR5ђ}۠vUQ7X#QV#?IT 3 ^B RHn ^lo2ewfje!ks0Ȁw-JCzJؒF3 P7(o;jU-/ʶF߱5f&o5>`{0? o{#]t篭sAloyft3E]gtb;P3T"OSr'i ,u9qf+ cPto ;^WMҽ2R8M[9 ma v;eؐ4!.f(#EI pjU`u'n{@D-z2 /6e rMLpY&|l+ĿP̍Nr2HSte-ZSvƾ83 u_I'jND+L4C_RI#Xa*-y>snU^!3BFCf\'2Yd RP iuIq0iئgG ̐ꇋʘ?ȁc6a`NJ|*\!?׳[ZvbP'Sw|(:鵀~}pp%^%tؙқ>,Z}zol}MltF'~)~çrqJZoEDkzgqX͆(Mյ|x}Un0 }WpP8b`؀-C=AtV IFdA/R-<4 `!5U]ƶx*)j$s" Rޣj EliҒbWdDj:Dth*ZA82{,,?;S-bϯ,(YZU n89h쟼s\iXSl6Buz@>W)/@RHrk|fe*6~XolXq_ٵZ Pw 3 3 UA~e4W(]emVE ͥaDjo&=KJyGF{͌Kةhl|%a#ua P bjcvDMlnuO>XMp_a0Lo=DJn1,qQJ_6#)J +Mx۷ŅrR#y.N'5uWtY,dMx340031Q(-)+)f0l~%u$脸ݏ?: s xM 1<Œ*F,Bܓl]xX|K + kB`9AZA;=_>qQ)=q zL9OCtn?a;VCVlo:ѳ(xmQj0 +M]= F+Xpbzu`+YFɿ;IGӓ/ &Z. pGbnnnq5Z=J[ “)&' M&oc >i?˽+>H:0j?GɴO4OWY]%exRw5J! x340031QH+),++`x[ƭZKYݖGb!x_k0|c+ν-cn؂ij1)IjۏV{7{Fpm|dZKQX9sPH7b] WQEE}’9kmd,F(Kke;f̒Ä:V\=] <  {YITazj.7:?Voઐ9mk [֮Ѝb ^Ӳvn ΰR7O/aAPR@'!M2k,^k.ڀ+ɠ2:'kt5~FVݷZdnɺ3:x{qBH]eݟ+yuIAcxkalaP r8>NZWhe- 9>x#ZpdAƃ@,#@BZQ~^Ij^~Abrvbz^Vq~Xf7V-r,8L.>d&N)mxjm[/_–*v9Hc\,(A Mtٳ mG+=5Gv\uխH~T&}uSo&3Z xq"d<(VJ;cE5[ 9x6j-ACD,il^-3wuL8u E|^|0RI x}SMLAN[EiI@ ݦ@–CM0"T PRC<4)twg3[XEo&ƌGϋgyۘ7 aGhsL6FwX7+س$L^9IqR+X 5s6ȸ@;Ӏ(6yxLA|>d}V%Y6sɝcM7Vs dSxKrw>xK3Oxp ?-UJ1j!G,BGS_+ LXs|;P. r"RfsFַ `j^x4d!FyeLxkaƣxS100644 TRAEFIK_ENV_CONFIG.mdIAS3Ve40000 dynamicyq䬸 tx340031QH,((֫LaS2g:7iq9[(73%%'<(6k< y)4828<1п_r0[l.:x[ʿa#,G'{ǘp)£) @VWLMJL~,* K,N-H,LK˭RŋґQ\lSbr6LO s r cY70O6f)A^*f*:@ \|$]{g#xk?Ĺ }x;~}xkgYƲQ@ '1!u++N5 6M>eMJ>L7x31000P()f ޵RF#lmn v"P7֞ 6ୱ3/NaN0nۃfJVFȌEXü@Ka+z*t}{ɝ+iPWB O?0{wN` MX! \8>5 =TDn3O9 I#lRg(wfiD(E|RZ(Ȭ`o %Zq A\'3eEE'c2/zX{wz }o6n_d’~\k^ & M+:'u|!1 `MΥq;P- RwA\ϛ^On=[l+oEA>Hj2J)lG$d8^2OΝ;˖ü`!RFt{fwoX:ArԘyaKfMz=Q.m3f޽A3;0 s8 `ޙz=|9m{s \KNKJdsr}OG?0ޔjs>C.Ȭ8Q:ˆhu53ei0'{*]㘾YmZGk~6S/|̈́~6c Oͫo_3NUF;\,X5ve9~Fw.6?_ .̃\=~_=>hj8,k(ʆ'LdA#tx?pkLE7l9o,JzŢYS{\]~W>>…P2Nv $XV]1#o';3ewf}=<Vi(?jSN!u$~1 ķDq6'n>ɿaRaKhBOC|~z8 ]:hqKVզ[ WIҳHm.AT[A+pkAl985 *c**UfUfK]ȥ8А`*t.Vi4{utzX]f/\c]٬)*76 E|=^]#&iA] (QU}c#V =ɑeVPQV[?;R'Nj]U|ψ7Oh`}5Ʉ;oE%UKYմswG%01ZQ Ȉx;3d>JӖs=O'c=mNo&.eؔ)],"F]c1Jii;KP r:Iq}*({UtQ%xp!_.4A_ )p NТv mO 1c05Ejj)dFOGQpt2'lv~nǐiK Mz%l΃ ]($* ɤe:7XoU>g05)tV:ȥ9H^0DUXڣwO"7 V^bT.2cnOu_jaSQ_%m ԢEmB \̻i(%'SSVh71,ɳ_#!K2O̝OO)Ǚ [!̌V8,@٘p˱&+E@@EʒW-9_c[UxFG̙p)ri  )âȑZxDi=M_L<%hpJ a7}V>)[T`\{EK=1|Y8{ (dn'^hj:gfҲf蒑0kiƾQRmj_՞F] Vh"S%293, v:v)=XJhB:Io3rjGgLVF1FXl-8lyb$l$E[)TT ūJZ-xTWvٰOȥ*YJ+or撡a?#[UHpd#lI*H.˪Fjg 5[!о5VQ:ގu҈gxL(QB;& _X߄qݛպ2r n;6[C>v!v!(}DP%FG4iPG(>Cie٠rq5ZvFde7vob,#;*Г=\Q?\ls7Y^U)*Vb\d47`JbdaUȧGb=!WvvgN,ʒ.^GBe]oԛs?%)BWEF8SBU"0n>KgP B6 8 4) "y)岤*E7Q0 iAd"J%bKp|Fs8u{wB ~$ds߷ʡ@؅0kٶk^88qa\{xީ' פɍKzJRS;J:]yN@=TU`p~G rxE)0|0f083N۔ԩ1LBt]ڣ?֏ԅ?P5:~7kGK2{M_'֔%^j뛵Z[VIko0 _hYVz^o.`"\M2&hCA6M&nzn8%jN7Oœ>}M_Ncta8S3SI4)h<6C Ew5^RPbǾr _iM vȘlm^>oB 5rRD Vd8p׷EMiq% ASCG(eX[Mm W\gg@V't!Ye =x+egΝxQ);f7W+B>ax9L5M>H\%?!x;~}=ȳol[/^|˓Ux3e[fy⭮R8Gx5x:3=QmpU78뽀GdirΟ,d?0ȑ.jxbbnib`j1]2xŽ{BqqzkV;2bx8t񝟽[FccHy\ +qĂcGx mG+=5Gv\xCt3ȴVM+xq#άdDZ"ӥ ˪ x340031QHI-ɯMON-ҫa`sPcW̯|t BU&fg5,<(<ϛf%ҳP 9y%`5$sW=y}-c&LݱP5ũɥE%`uL#bUm]: rI T]iAJbInqiRn~JiN*X}z\ʅ9e-_rsZHGxKlM C&/ag/ǒّ-Nט.\:ێwN^hv(SN%mp$ Zx8]+0x̀ژ>d20tf++xeOkAI 5$͒f``SzO˰&YYf&ic+|~z-xU0fN3>{x~xa[rA$Z.dl-|OŻlj{jq`70QBQA[Hp1D%DFQ ݟ%zu!$y ZrGBR젞b3BzQζjlJou}4XcF9-g#<<̿` ;xl39}<=^K5x[:uC&pIfnj~innf^iIjF1FF.m .xE9/17J'3+?ϊKA<(;-'<>% $9c"_WRf~n^Vq~yR:WV~R1HXpO03XL@@W4 J!9SAOAW7/_7(X7?O4/d[j 3 x{yBę|2 ZzYy\ .\`bcBJ&K3/K-/N-)-M*s(3++*ͳRH*S+.IQM+ʯJONITZTl/_7x[]/~B {qrQbAj̛&2$g$'تh$g$楧(id%%'sq¹gsm^]̈́$dwp2+ Bd;mdY5Il֓g )RStМHd_>Y7K#Tk** HvSљCg% lJIũEeI9%z9Jt'ʠCwHSBO0`-;ox?=nCU^*7+hck;"x}OAc@0DHs9QwBD!^@06컻Žuw$@E}ZXhePh]<2/:kha:*ՄyEr&cPs<4&2`!p%jڜ(% JT:4ԧ$1`+̬I ^F:Mj왌 ̻ ;j\wзwȪ?qR]}_];gWms^=>}󠌒U!PA 2@QC&C(dAATWꖹa8a[Q١$\98q.U=}ݵeO[+nߜ1]S`voBJ*.#W՚>R4ρH-5QRY6a*vX\(hl/}>iZykxD%Q'q 5ڔ|Q&1 [J2 u^8͏5({c0eڐ_F_af =D54i8m-of9i*,jx$Qx*obBqjQYfrB^bnBIBqiRn~JiNBAbIfP'_P[ĂbĂ"%kk.$S:5(ٵVifڬ<(&۲TjUB&9EA S䇬Ѕ7/d\Fx(UxC'3KMFiN 6Cpxm[/_–*vƢx343000P(Mb|eỦ2wM6H'%19<)+~!k7&=`=gxRӶv^A[ɩTMx;òy'#dY&̼2ɵ*YeE%%BQiq P.1DC%kDx[ü!qr1w xE 0`tPuu!&m&Ot>vp={²5Nw+;3FU},y:i1+Ҋe.7iLЄU#:H+6зSc(Iӗpt5̵!TQ+@zAH7R$6x8RӶv^A[ɩ:%$ݯ_ESoFPx{qeB >\zwim0 txS100644 TRAEFIK_ENV_CONFIG.mdIAS3Ve40000 dynamic?7ӕ}Ldx]x340031QH,((֫La8/=Ъ/ZΨH3Bf䤖'Bf-!R]1/WWV&3B@Ԝ'&\fy,N xkɷad_FX0n^Ƭ8yU {x8RӶv^A[ɩGdÉ,H@iuؓSo?Zwx{qeV^kXL&{ УxS100644 TRAEFIK_ENV_CONFIG.mdIAS3Ve40000 dynamics(Ixv"nud Wx340031QH,((֫LaO{۞-c5(LII-O,JZ4OCb_ Lf-.΁9)7OL0.Dxbbnfj1]5 |KxŽ{B{bbbiJzkVAzx_j/9A#Ơ]b9xq5;̞c6{ }xxqT wp͡rlW x;~}6&Sxd[Ejy_|ա S-x ]n/vǓGx343000P(MbP:{+R'8uͩΆĂ"2g9eZ?d{MwcfѤ x343000P(MbxmQOr12p"]\XZP,Yln,ԃ$rTpx gy/r[Ц#38ƬպBx343000P(MbݵT1 +?<\6!D8( YNY^ݘY4ix;~}6&e,f^]9SL?ֹ$x343000P(Mb.7rxJJIko|1H'%19<)+~!k7&=`*,_x;~}6&i{Lcg/ۭʩp)e ʢx343000P(Mbxг"MyX)V{F"]\XZP,Yln,ԃ@Ux 5՜Me8a\PHŢx343000P(Mb骲ײ޾C^B R?k5ݍEz0#uMx #y{I\Cfēx343000P(Mb>- Ot58sy6-_ !EE erʊ~͢IO=FxQ95(lgEL#y{I\CfēUk/=:ݛNۊ|H3o8"xdMw!FQbInNfnfBFjbJjQBRiZZjO-N+,,K-H,(}Gf/. ~Yxkgig .rN5Lqr"c7jaû cax;~}6&YV/psjJ^HSL?x343000P(Mb ?g:w] !EE erʊ~͢IO=փ1Xx %H~1ލ$XfRx343000P(Mbw% Koe.N.J,H-b(sxSVCt7oMz2{Px9%H~1ލ$Xu멾0\t So9x,Gx63q%VTȎבGjqw/7]ՀUB"+xaa""霋gL܏jZ2qF r Dx9eKA7p5I!ub`YLNW/{pytSoSx343000P(Mb(R:l٭ܚP鏮!D8( YNY^ݘY4?UIx63aNlO0k4KpgGjQJ܍<̓"at4 "i-x3iN$!*Y-}5qH`BtSoȟqM`kQx[)C`D.; =x&wDv6ג̼tԼԜԒJےTu.0UPŪL/1%(vNz*3SKR59 6-1ԢT\iٛs`MK|x;"@v~Ԝɧ9'#0m7'p3 +x[ {Wfr29z%%`6RWb Y痤&&YZl4d$x-5΄לsl, j2x4wer>xeQKAAW!+?)>/17JA=/?%UKAAA8( 5>3$,1JtMQԊ"+KCX.8j?x9eKA7p5I!uV E+6 K-SoGmx3TYWVQ/?GUx3ؒkNҹqQG0xb~4!2910ubɎR>ux9eKA7p5I!u՘ wdIyUSoO1x{qڍ?Oɫ ue 6 xaa`,g傏wcV4k1GCxb~4!=1114%ubɎVCx9eKA7p5I!u8FdF{}H~SoѪ@x{qBHp?%?.!É >x340031QHI,HO,JsON-JIeJ{0{Ж/8Bg&!<|NzwMFgqrUY\XZ޹]9Y~7Ufxx`hkCxre+*LIpUx9eKA7p5I!uDH7!B yqȹȲـSoix{q/}$XT:#7j-{?} ix63?NBSQ j /WRnGdv^yU(ܑMC/xb~4!%bɎ>w\xŽ{B{bzkV<xŽ{BYzkV:kxQt E 32ZI)䱾}Tꕱ^xD3Oxu޵+t{80XSo)&]hxqcVGdD*&_;MO5 e)xqkEm0|-h` 'xq-E=30,(=w%;gG rxxqȌӻ5T;'H$M2=<1 '+xKlM C&/ag/ǒّ- \rsIHbNx=^hv(SN%mp"=lx7~$f)')kx?/qC BJbqFR~bQ2OLYʶ˲@p07x8cB%GbAA~FiIsYd{f 0zs,9dFiFrFb^zjzL]v`jx6q@ZDoyʄfhtFiRJ~rvj.3q 3He؈B< U `0YT^,q[Ο $k 6ʅ7I:#7J`zf$fWAx[1?cNĂbҤO9o#x4Cx343000P(Mbؙ3tӖg_,1H'%19<)+~!k7&=`MYTx340031QrutuMa`v|NmBr~nA~q*K#tբ徊j 0"%ac2Pc_V?{1_"&]X0&9!kj@ &?9;A:2F3t d}8 /߿OM6F}t~IjC Wǝ^J%+jx63}!#j?8ۑ;sG/jk}޷[6NExK3m߀nV~_<'nGPf`$Gj\^IL .عڮSwSZ"Yxfz8!W*?9;!Nm?5]{8N\#{ZktzϏ"o]xaz8A{ k ]w-N긺$t% .x{4A[&4I27a}ٳU|j :4{Q]jxx{ŴiɊCJx[)Rt)vSKKd9n0LX@xUJ@p?IuSZ"^ gl14 ! **%DzЎD#^laNC)޼q齓+h cxiB0GbAA~FiĈ?16xS100644 TRAEFIK_ENV_CONFIG.mdIAS3Ve40000 dynamicSkK>w ĝ!x340031QH,((֫LaXtoIUL}akC̔ĢTڬE4_ʾ+dFrC^|S;o}0! yx[sF/F9⌤ĢGSKR`2r"x؊KKJAL$`ɲ,H⎌⛏0NVbKCc@ٰg_24Z fx{ywGiF@~QIZ~NfBp£) 4p)(((d&Y E9V % d'V1g&MxPWF" : $Rt vr F%`! cu{uw2n x;g[60ne2U.x8%;K6u#X*/Wﱾ*]Xj@c)?3A9VSoZAlx+` ⤣äãb ZHxKlM C&/ag/ǒّ-6 [LP.,E^hv(SN%mp"Zxfz8!w40m#XZ{~\q~ez lVx`` #~nkK-bEp餉LbxQ%;K6u#X*/Wﱾ-NNsBD1Hu5 $x˛%ӻգQ*J~ez/ "xO)IUH,(MKO,N-H,LKDf3ҊS3R L-gGxtd  x\rFM>E\ ˩Jbg-cəUdl@Uͯ}y}}y=v7dwjU6 ݷos K&AdjkӓzA2 ,Y0瓨4 r͂0g\kc~Z3-ga g<& 2"yM2('Yw:IOU`AZ:;y2n*:*Y7o lOt5g [$Y)7Bq#h uRX#}n.to t1)RO-:/z7uy8Dlkoj-j9l*$t8Tz^4:UQב'0^HQ~k>KlLuaЯ^;q&k4|b1dO4xqz0@sߝUufWwzn1`븨'eN&Ur״RK 4yPZũG5*^;֗i0Ue2H6ߝJ|:#`iJB 3Rr$߄'D4(3IS3#>KFpka*˙?wd ǧđ DQޝڊ:SOz{MX; ZTwP&gID\%' 0)q2K\7h("ro~hb?NMJLf CtjIYZ>RNSӰTSðT&ɔ9334+t 6y DK%$Owy[FƫwjP4+mQJ/pgtz(:Th<e- %ibXɞgP oװM^tY10@Ccb`\i`=OX0q1ۗvg_s?4a ըY:G)(M&XPhPVثOyۀcԜjO#pm IQwV?霝bXzQHa$@E6#X>.A<@7ۈOa5}ޘ7XT0$s. Zeܬ\qqu9ȩN'JA4NHumEGp w{NNZɹeTGypVK g&ܰgMvvW:Ӫ%XhYA\xq2Z= ~\4pEbVekey_M-΄Ga cۓ ~bwKAfMr #͡V!GiK%WF*$7l葚r]vZm}n5~Xcx{M4YI !@-#Wt=s꺝T1vKfR!%T (К'ԡޑFV'} h!3sM( f4Ka_7l Gjh %8f0heGLxt1(Bt)0 @d! 2RوK`?EP)5 5`n qpYL>r% |^iUADhEgkkA  Mek 1SN0%^'Rk+^Ƞp~;2x[mnH 2z =p< gH8hVKce,e`HB܋Aaw %M`>{e80O;48Nohxbsp}NDK‘ְcY ' oEr҄5OЀRww^ 7m,H=G@J~E$̏Lֈ(u[m`Un"2D+3^L`Pp#ኘ1ڳ4JC ٰc .H; G1>>vdozpJje|YDy(Zpn4B!t/ʾN2W!5ak[dpaa=aAK]kSa ۴,񨱊7*sw?$xG4#Ύ?jlH-H6vB=AuD+BWH5(b \ %dt͠Җ.>mPpˆDiz=@w,e})n%6jݪS/ Z1فWr;d…B̅w csa>o\ ]L7V*Uȗ8zWC&ǕnúnVfp G/o7tvI* \ܞw'M0PSSL3Φo2DOtyq'ͱmpq!AzYo ASSigL#0(t&ڋ3H bWGFqp)NnTY/uv|lA[Y2?_^t`oÖ2MpVۊ `4"-, 5ʀ(fŀk3f|SNÜ/ϊGaai9d1/_018đVb{k΋ k[V Y*iQa|{͔ x)LV\ ,󿟅ZsTf u{p21ty'G.jbSד(ΎV~X}?I/;hދOL2/,a70ZjjVd4uw@ EOϞ<ӷ;PUSE&e̡`S| İ[76!UwmFسkimqjн жE"(u彍a67>=pNvI=+遛lۖ4'E S4 8 R?*GAAS!ɑº굟Ckzs܍(Oބ~#m>1 ^E׈#42⾵-Wvv,j`pH3 C= B2ɥ%:򶱐9[s,~z!2;'L-V Gm_La 8_JL#C tLC>2o9? u U)ba l=&Q`W(Yږ=qԪ9l4(M  }f;9M'J y(tA}ר"E\OUNo <ΎTd TQcf Ћ { +-˛C$_.&1,i{ݽ=huSPkѬ໖4M9P>N;&3|m\CĕFC Oq-kb4P[, vyS8W+ݐPS"sjPWkBEq5}hB0yRFjj)3sVVof_ v`TR2gr.zA-A9m' ojZT%`Р>b4ZvHI֒j/8g6|^pv{ @Q{S0ԍ)]PS\$ơK)^ ca h%9KR4}1H)q j5kijf$p gR+&s~bOIw3x3vr)ai2N /E&{0޷hδ=18U GOq^ywo]_ q ;}J? jВ*~jUm$J m&L{-+V%[6@aV() #;D2ȁEWkQYٶ)"f˛"xDND<$.#"k1!L^-p[(w_[ *-̆ Ƿ,}epIqgo-H`\͡@ Іl0BSFbUOtD*vz؆qC$| `m^6%QyѺ%Oc-\71qvd,i%Ȁ9YX`X<'i+]U4m >s;֔I8 V:Ggi3FG)^5BaCԀ (ǴS$9frNṚMْϮͱ$dȲP9ЂB7d<sv̹9nb[&e9F[vH*UH$fl+#!IFd71Dp ]12w` Тt쒸 4nX\84=&+ذY1!ߝ'!LoЬ8lxOrA?|z z _HV0IkݿГil}J31"El3'3 )\ Xt2ScnaTAoIo45 2S]-IHXlN(W rAسFQ \bۇP|jEX Mst`E)QZsb|pdm]OCdLy*-V7 m)|`RNWkoO YŔ.ČA L۵լ ^~-Qv--3mbQ!oL?l{/})$dr  cwE\3lfBk#uAeg 1]4fsx[AZym):*l!?A3zGDPg?YdO**Yj5wJҴf~\q8rw`,mo+b2͝6XBoleclU)WC.2ݙ0^r_^''l8x,@΢ݣ(+Ξ?5 ===>yR [D)Cim{7=ƗN}+}>9p@f!( Q6dv詂/ܙ~HaT$KnJJё~p5.M1Dk"Y5i۲|go:;]V=qɠryaZYJx 3-+F5 wSAc۵fiQyXR=MDq["J:VɥN:K\p'qWIS4wx]VRxgY ]wyt63nn]k31eA/"U@2~h 9t l4T9dmH+Fai@6Dg%r;_i\ZOq!WK$ Zmt0HDH݁SY>j? FܹZp㸁8)-++eT"|`#Ow]ԄwloφÛ;ow .o_t [;pmqG_%Y^j\g'˯Hc\e-o@5@7Ggt`Fr5/8x=Hsi(nFVAH.,>ws|qf4vU>XBڵ{ɍ!>C<~_Х@b9W%>>)+SeЅL.?̲Ћx%9Rjy&@=q^]cc>cѫ_mh42!/LL3aڈD8~w_n/nb 욌 ΁;1nEJE8Oy1A^1`񚴎 /ϬΐZ nм*]:KPJEĸ^-E:L8٪H~ }yӲ<Vb̓p (5#I ~|L ?SGLLri0FgU9VUF4v\aY̻JBR4~ō܀y/ع's`6~6!uy .dI&l#lOеwPz Fx;6 tKJsCRssrRKrSK27s9pԊxZn`,؊e'Nng^8hȒ+ҹ0ЇI7$%&pof(}w͗~M49l|Y1h )y뗷]"gy,3%2 Ob59]~h$KTӶx*àC˨D|. s^gqLGt0bʋq;$0h7zE,6Z=G|6RіRi4n?F?Ÿލ}}׺·[g-ECݎ|NAy"XO'"OT? ;{{5|$.q"g)R0e.U2zl[CqC6n*A,vgZ$ V9~0M2c~L,H ^Z}V\_aV:'=^b1nѨ;Nhshu[EjƉ3`%aXKF-'г:$4H33Htwc,߉bI0]54Mf2 vg}gJq2<=<0ͷnPCi6h`,Hz1j"K?&KZt #*m:ㅃb<^+<9jtZ 썆GqmZ7£^wϋݮ10(N?mtri,p諏Ϋr1MqNk&gE1p:OBN`JO2[~Kf|! yƖoiGD$bfy0~"S J_L 1\5i(Ih 6{$Y+ I7NcM"[̡ fZ|tCbUL|gd߿:kH՟0<2,H,n0T3}ŇrA<- =MbQITr-g^kmRp&^k%{${B"ne]X1/ myl f "}JVʬzDEN{:JMiV9S+gˈgM;STe[;Ǝ+3L`|nsL-Vu;UH>]*a}j6I5BZ[[N(3- J+9e5%K" k,ϼԕrj: \H.S4 #YIJ&-=3WM*]Tm]"=τK%ĠT>]BW듿,݈~!`4IR++q-blCqα^yq'NV% D(%f wq U5+JVh$[F12TrXҼ]#aVD_(bڸ"xo˥JZ}B%F7/5[9Ϙ\nn^Wj zwo5bAN~[v H5|&/_# ^;4?E^rYXU5XS3ϚoK}̌} :[a欉i(xJmj=6WPh! -xvDu G+}qu(o]MM{^XV/:OrYzH4sBLYK7IO'zgX95`zSkL~B`pVV먲trxTRѺy~-Q[ ؊ MAzpU% v)BdpBAXH>s]Q(^qЌF8Fx;ƅ+nbyރ;@*D+Q$&:i WU"jLG%R6^mhEM(";^0%9*OX~||7쌐ѥ2^E&A1?{D1cb D4T~$Sqf\; ?xڤ^w\!ua;b¥AoLs`oYBj74R5Ї,[u뮥,vYoH7ݡWH py81  32 M,lb-Foܾs;7QN`'U>YxIm\dxk *VnEgaQFObʱyO3j 6Ff iS); &m)8 Ymx>9R .aFT_EǪW]5Y'9vҐ|t$B˅pRKGͦz ZTXit0ǃ( (g蔢HQNUxwl!~D+͘~ܦs3m* ;xB^4A9EqqɱNyJh2\z^:>4gcj>J6 7b_ϟ=S,5EP$#O+&=2_R403~\ht~0>,j8Lf?@HD4@ |&{s;U2E8(ai8L>lݥ!pב_&W7pLځkkBl ń SsV~}vvCE<]c =ԠKu1IR1~ \Yb?@<;|bPSa9l{t)#;b=Wˍ.;!!֎l4Q=N{)D.(g!6=RmG(UŽԬ@.Ѻب[%k@-mZgH-Kk8p_I,L5LoݲR}>uQp ^zK]a0rjsxRў\ͣ00s?=oD= B*9ijC:^_mM0"Bgw xS100644 TRAEFIK_ENV_CONFIG.mdIAS3Ve40000 dynamic4;Si wd]5fԡ!~Ax340031QH,((֫Lax;36DIVK4(LII-O,JZ4OCb_ Lf-.΁9)7OL+&MIaM100644 add-new-app.mdk;6\A?_i0#*qxI>HFuhh!Q100644 add-new-app.md+R%LfA|α0`Wxkgig .̆uG  :Q# Cx{edC=V &)'%&drM#Q;#xS100644 TRAEFIK_ENV_CONFIG.mdIAS3Ve40000 dynamicc8j9]SgV.x;{gB/7~9 Bdgx{erxC!FZiIiQBqjQYfrj>߉ ғo̒4yf̛xbx340031QHI,HO,JsON-JIeH?7uN^ۢrt!D}qrQbAj귷_x{TdFv^w儻od'xS100644 TRAEFIK_ENV_CONFIG.mdIAS3Ve40000 dynamic`%nT' l0Xa%Ĕ]x340031QH,((֫La| KKSދs]m(73%%'<(6k< y)4828<1п_r0[l3- x^5lleAX?_+9Q;I $j\~Yבb n =Ȇ}EL?-=tYFIX4͓U4X7`C VhNĚ%40000 infra5ci@~FEғSoKF1x;~}=H⅔M:rg\ fx;\4v V4xNgFĽV& Sߣx343Ă"2g9eZ?d{MwcfѤ q=x;~}= ?xns*xƼefrrLxff`,bŐvyvLQ}Qd qxaz8A{Hŗn9)&vNp=(w@%-x[)Rt)vdD9n0Oyfx;~}=%̯t;x,4Qk^Փ6 )xffP&b{d>5:wĮF->x;~}=HYF~S6X)!]|r0s> Xxff`,!3DnƏU}_v~$ qxaz8A{:sPu|vQT3J/x{qBȳtpj-^[u%=zBx[)Rt)vcs$9n0Megx ?;A,#1So=!xff`,!3DnƏU}_v~$ 6xVKlE4m4iQmv$ NⶔҦ/V^53Z:N5 fkno,x{uZ(_5ɌY[hP' 6~=k{:HVJ#tC)ivP nuX-,型GϡF (ȂK Q)$ d&%$NGIMbw^zn* _8Ae֍%I6`/߷b)(4FJR3RL҄JHT4Mt)ibkQJ( hY3$Ϣ%cvNd8ϱx46x&T5;Ō-W+1'<;NXذP|IUj1T(T4 RTA\L4t$[B Ŗ|xqѹe`PxRE֖LLQ}H5YŜ2lq 42ULYmrU3mF֍kؽ @yn OYY^ `bb@(3i +ƺ CCR{x}RoE:4Nbǭ8ulk/Id 7B[ov8$Z8pЧJ@P%#$.8T["UV$8"1vB+D/}}{X  sS(w>W/Q,ԫ!R bPxU7LCԖBJ tܐDnzP''6c,TXHCCdspkYjG }fx>Wy5weֹP, stjG 9(mhMXbܪ-NrzUuh<(R-T]_&%NxۖJ{nS?H鏤9M7|Qw*2|8Z s4 3ށߣ\{ &|\|6Jp"5R05]+H :Yp!~NO Ą ,V"#Jdi0-M91&v-אEyŎIVeSTLD*Jl- Z߾ hKaFA8E+oaM=r({zUCJ3fED[u) Ll涨NmD&^C5)~9"0~LT]q94'v4MyMLA}sӷ/D> OO#@cA-_wD~&='zC#f--=# 8x6@'x/`gf{$Tʿ@x'郩 .RҀ4m txowz}9Ԋń0(ͤEiFr]tρMh ٌKgK /f`*l9:A}Kq t 0r`lȵZѹ:wпlWBU\ ̹掱Z^)xuTKoUĵO^ISǏĵ(- jҖHT]fGd Y=Y **BBb X  LsOrW g``(Qy7'F&2ӕ˖1U2 Lw}7iLwg\i.s8[+0Ac I֟M)󄋦, L dӑsMuW'%@d2>\K939%JL;_?fz vu?yVHg(xכ2^7J~d[2(DTD5L FwKsGKAX/R f].h LS'|9-Kĉ%uӅt8Xgz/p8+Ls&XYMM>E6ґ-w]im{yW6ursVm \*# iiV3QUn" ~q ֬eFchHutX3T4aED%AsgX|ݶ 5 񽱖V6|-W;m١!"4,k[W MEUAK!Eqz|D(< _OlL|;O<;90f>o??q#S].Ujr-S`Ju_2dUSߧ|~2߄A*Ν-Qa*1ApX r+֣b812&2y]PJuۡ;Zx;~}=VTѾ1bW#Z Qx340031QHOa`t< RMJLL:."713O/=@ƲR; 4*UR[XQÐ}@kmN$|yz(+%x;~}=JFI~ɪ ſ$Nf| Kxff`,ro<Ǯ >ݰy׉GK hx{qBȶWݞԝP+oab׎?kP5 +|x[)Rt)vd#S9n0K$Jx ?cs@wqYF}SorxN3;ly^-gّG/0*Hk#7>KS+ym'"L&Ax{qBH׍;pJh_*0]=U lYx[)FpCfk<&!'Vx340031QHOa`t< RMJLL:."713O/=6c!ӊ UBKM̯>UR[XQM5vlټ-`Ew},^xETMlECw44maulb[S'qRW&V?ݬgc쎓פPx$8 ! BB8\@ͬ7ooxJ_幘/n(i/j!-B6a5JԉMYնF&oDdI)hF08avrvY$<}nZ6hv0йtcU,L5ˬG]-uvx+t}eMj?"XS:B<;&9jV`H :v8Z9O[}7f5O^VxA.+PRn½~E/*e* 4ѣ"hW7O{ܾdN*XBڵ&\G !eFM\;;.#%)ƟIR_G?%1'f 14" q(9 C\~р!HN1?'aPI{$Tv e6LV@3tZyYtSI1ӿGRVtӱh E2L2GbpTtW{(* 6$7 H]$ Q֫Rܚы6@J"HU.>;"`4fI.8(v&|Y`cvl_\J#%?oo4|r U v.k;N7BW풚V[*zPOô0U #qĂޛA 's%bjt('pG *V|O< UC?E&bSi6ڧIyyjsLL}" )IdE&'QrK:~Hߡu"FW 9;Epo9i9 w5zvQ^W@yjhUd_) W=vҐ_51_wFl1Zql |2ȏ4ɋ 5U ],4% \_ sx;~}*.'\҉>eK},r [xqVm/S]I9œ+YdJRs rKRi8;zmp%kJ7pLJxax~}|QKE克4K4rRBS7?mJk3N޼Jޘ_$Ax8OcPj,_mFmjӎeL3dSo9AxffP&[/pݒ2.S*Y'v5 ax340031QHOa8b]V=cקNynQRMÙLd7{}˅*)I-I,I(aМqEYoÚiVx"7-/+[%x8OcPj,_mFm(&gw˜JSobH%xffPfꢸAEKٻkDۼ>rRS"vp2]+K :Fnx340031QKI(a`teʾO k !3*\Ӎ? x!u4@PٙJUfF@<Ż%<98?t:ڤ&6Poͩ"͈T6?~=t)%Wj"*lKѮ~Kb$ʈ$t4b*ǯ1 r6DG=Ӹq$#2RD͙RzQ˘&R)U4=~/^̤m< l̂AC@;~< M݈x_m}/h{gg";5+z5ݧdol>OvJf2K& >sks2#펩4=ie0 kͮFݔ! kX9C4^YEV6?2U]kZZ;bqQ^:%-QS5K|]&lWW0. Km؃Z]4 ,$at{a+"ƥ sP_t4.Fh\˘BnHͳ(765nV1:-a)$*J Rԕ0'/A)YX +ihu6eu/6vg Q$rf`іfaTvỔs3nګ ^•%1d--m24(AR9b><˨SBpj&f3md׍"nֹ !\ ۃg0Mb#@[seiwp=e;aIҁ9K5g׆-8%҅-yJE`׍,I@?ƽ i7궒H4fQ\)֕3 \BlM0WfSaBM[Wq:M|[xSt yLyʵ 3'6AЌ1*4-e3MI&jʅ!(oANQVVYyb`w+m&±^{_UC-~.!]$oPq<^tzBW:#7Z& PBݿG9po}tbsehغ>cvXD&?Ȕ)`Ԯ +T #j/Wïyk&4\5qL>WpwoJil#5mzG\w(b (LAR!&7˫7,pJ@r5FBRٰFO#MíY#142m֫i%x-7zgE0a|qUұQ.!JM~V}^LKn:5OG14qCRҝlPt{ LIV,|XTHy.~ ,. wNM2IaZt*D& !!/EG3nz ؅JhZQBZ<;CShM$1Y !V%Om9K2}rN Zc T ɚY'3]!Mw^˟y:aST*ݳ}y0G2)󿭍ytxbD&e1߼~F0soN}~w`;C{J {0.Im gZݕt!}l?Ľk.}1ym؏&sgq䩎!([,FctL?Gp05 Q> TL(>ubqcZ8ЩAU.RHAMc! N"C[ݧi~IAvX-ǺވN4pY"_>&]gfWx}R'S@VV_ރRAٝ$L7 UDԽw ϥ#pQP,֍eT.f5`vƔ4'YKO.J7Yj㥧`:q)"ib折ÀEeQ4qxk=$sr-^>>ouW=zTJɻ47,.r]^5#8Xu6:OLP+ʕĿ^sCoNdcUĊHן25a=nWaWI8NT ^xV=&"M\eNEKs[]Ni?25kݘd" ,4f2)Q #S;&."ލzA' ]1S(c*5U4k`ʹ;NZ[ CyAcKUj &ȣGDmn-oG|'$@oT`I#羺:^MKW˗=&_c\#dܗx_[(%׃Sq97ȼ'?ibw?}hD ,JĨg-. J ~UM9xqChW;mO42؟)K%:=}]a*@ЈKme|pK뻧Gz|DxHT4 5Lop0OCAe,zhW›a'2^OT h6p.|:XuJQk"l6D,JJgR28_Ղ ؒ]L^,?ɾr6U<05P/I𧻋PzXgj%-vPD s0=U!/\%-ip$]!eHyk%}cl3s93n)E # 3u:+/3]Xϓ=km+h;1wl,պ P=K0oKxXA\v*K0^BL7*i|S!EfΊ; 볃3scmvR~Ľ*GWHpn|~!zm?h Lg~.[GxV͎6)=$hepmPd=4M @7)c7HI:#ɲE.ə| gfgp)2;JAxp=\[x~A%AR8rHeARd/h^f9MnK2(K~L\-,SF2E֠c8W9¾@쥸 oJ [0D>89yvj~[c>FmףIJW0 VH-JA B-&7WEVT{ qr]I Bý /*鶯S\4Fk>k_-,mЙ]>Ue1SzL8laRʤ0(K2):4M=xȇyQ'z"BVXozݫrkt]tk)C)J&*t? oenɼ[BX+-E-&|; { ?pyJ}nnan&č^$&}2t6IWK;2?bUqf1ѡl\4}*'gW㳼?՚ʢub9 KtJo1g3GG|>x£JC֓b >&t 'nH%QuT3Jx)J0T \Sd=i%[.<ߖ}تjOо^Wfg4nx 9I_*x8OcPj,_mFmWRM+@$So>+xff`,rO6t<̜^O(+CD# (x{qB 2{*Զhg Pcbi d jx[):EhCtAQ~njIFjiq|JbI>B` Ē9&0J[q)(k*x8OcPj,_mFmqjKT4ӮSomxN3|b'{ٖ0QlM@RG/U Og8 KKE!;&eI " ABxa۹#Üv futHFl5x{.g;:L&!Rx340031QKI(a\vSS5<İtzC̼ 4_7 ʹAV UAxW]l[WW$mܬwӤIO[#u]ڴI$횴]{bw׻mY$D6= xO01<6ννN2>wZuQSdtiq7EFsDbG/1Yɉle˩z!E=xؑ6B"9fBgO| i #F)EmNtT}['t1!E(bE֩I6INHXeA[ZS& N6Jw/DLRdj/xx?w1}n_WkBmαq x }ps𲯯iO| oYPuWmdZz2{%̑bM{~_'q \G(A"3YT)8M] |27tg|;@WKA^쩎C]S4Ǒ n}L^KD,ENsm4{`Ofa'D8 ǔ|wh܆猻nd8i54Ä# &>p<O ‡כ^ZW oAmp_{<>h.1NѼGD-Iw<9"6%a:dzlE70LȆ8BJl?x46Fv )iC͠XͶL N@ҟʩwHVy n3^3xZ\iXY57U:QsQň,'\KW7,b rߟ%k`7F[9JP$*d2d͠p}S*D"dՎV ?^W(/e& -#T<<^>aw4u1Wgaë́ WC@<\DI$>wqeVv^Ĝ%l3Q"TW- 4B]kWfϝF}jۃwؚZbm(k'He xɭcU-%UGeʋJ^3 3 TF͓@lgµjiS͙Rpɕ-բ#Z=UC'y,Q>W1`p<>p3qCC6^t])l%$C U } "y!g!6 oLϽ<g??6DQ2! ^:s8sq~T|c>{S!#i&9MPT]7_81 T0xa['C̅%tT@ƠSRoCHN-EnPM-)̜(Gz xtxt)ٲidt,"٬N;iDX/ݟ}X[x DeyчF\)&0ݜ.ŤpĜ: xm$a@s0oncu??/i^9 o={A ^4J1%rJ&+Ls+'#nvPI`(Tucv'^W׮lćݟi_%4 o=/^@U $n 'X)ɔz8[Թ[M:NExHALNwQ^OAɹ&ry5O-tZr<#$bD9)&ej8NѲgFPs9EhYu݈UqKX+Wr(+0/xcZ,,Wk憈 E?y('%\4s ^KQÂc.|6uH+cGU#ܼI-nV:l+J"D*gps3]a :1Fm}uYӤ)X)"3>њWZј^Ei+1o -s*q#tn-SQ4RIȲIEfZJE]g[}E-5ي7Q)R0E/5gdo{i囑أcC6|nq>pl(R5)R.HL2Bq[)lzU)˂\B!W/udBg.@E))} D]w+mJhOY?|'M:eA85~:8p {-*$9|ZpX_xRT3I̾y1;l({bovʐ۶iHbؑa[%@8mIT҈_ Y7np_ǯfWG?*>.׆k=ᵾ2L!7pb~vl`gO5]>H,*W&/Ân2(fn 7"a@ ^O㒅/UxWϏG%2!erwg!l $k[Y#6Ktyj:Uճ FH> 38pο) feWޫ?׫7>.h21jco_Y~otnE)vrvڕK>|tHNT$~BP#&TЇã3[(wP'@S>Rw- ~gM^]rBz}x-vqX &aeNe% \HTF$=8!~m)U8~݊mRa\oܨk.PDΠSK'9 ܷL*'@ TAjN@3DFd83PZ$ctfOBgexseJI~ @ I.|J@o$Va^̯e:δUEIn+gǭwk~Ҷb)/.\Vg$tf@L)(D;]_ST![K~y~Lu{ Rcy45 R= S &kl~Lo8̮={}YڷB#%1LϬ`,&=YӮcKwpϺMMbL"v朅iGFxc׼2{-`s*'gu%X܊q>E?1OI1Lr:!^n_(xq߮~ŷ.t%s:?o~p? d x7` tZ0x8OcPj,_mFm ;*5X]}SoaxffP&maSn;}BBͧs?ܬx340031QKI(a\vSS5<İtzC̼ 4^+9;$_ABqWx,dy   )=% rhn0x8OcPj,_mFm֤Tl@~Stx>OSo)xff`,YTkyKs{bD&z lx:.'Υ1Eg橌ZLx8OcPj,_mFm@]lӒfc?bx!Soͮxff`,8M֊1yf~U;& .x\-vI=A\M2xŽ{B{JrzkV>>x;~}=HC Ss24wo`|х x340031QrutuMa`v|NmBr~nA~q*CX{lHTAT$1lL]fjw/KdVq3RNέ>nY٥{TON-b:90rL"v9x /"vbǂ_/y$4)d /Ia5_ErퟗFh=jptIQbjZf6ÆD6̓Kzx*ru}Zk x63$`s)DU[PlGo .ol7NrM 2AqU>x3a<Te "CtSyuu`dsYl@>~տQsBx{qBHS[W[^51\{Ꟊ%kx{C6du6Ox340031QKI(a1iB/qkH8~*/=3B/9?/<۟ Nsogj:,~+4xjAC3miSR͘T2c)ݒlw쎌qw ;@_/dm.w>҇J)9$_s5<"suGMv=/ Ii?NhkCAA,I ( 4X$VT ['"{w#F='3;hc{cv/ Aw!?&b>߉KIkA86Q F`]_`G ĩ[2~r6Xh>fA[ïy s9+9iјLe5OB}VY/0^.a4fT(JA`wk*|WlNgoȒ/~̯c67g|#ڗ Rz^Q C*qt3?.L::@A(a4=+340000 infra67u&A ^ATSoWv)$Jxqf/6>(Ux,yp nxxqwCz["Զ,XV1C91ĸ ;xO~lvF܂Լb݂Ē ɋ8aVHw98R<[Φ?8SQx{.{7dL'ױMa?7y'; x340031QK,)KKcUt\cvOW^6wCjx-Aj0E:ŀץ %htSJ"kh\r0')r{?]/LOmC B8SqLEFn2?м%&+ 3"`ʉT\hXF.DcbQ%֐$BF9bςSK~+KVM]ٱ(o~]rn9oeK dAx;~}=ȧe啹8$s^r#\)eK`|ɟ voxff`,6Si݂@_=;0H Ux{qBȿsgF?gR:s|+CxŽ{B%qizkV6bx;>}*_VT~XɁ'ݬwg$i+UR#n&mb yiE ;iYpsKқ\dhVUZ\S°|A~G$s¦.2af%7x$CD&ѾqH}"7Q8xqm9;հbeqfGC ,x62ޚ|f + )߈-~) hx3AʭRpVA9e]¹})cm-i6qojx=/nix/store/a1vm413z2gayp4dfj6fvcnsp880bx08g-apps-leptos-0.1.0Vx%ޜWrjlvx;W?sTO,/bhax[̘:}bL`xm/&yE^͔9b2s" x{kBEg,AJxmC!HY|D06Q^:7ur+Wx343Ă"i47|kSY5#x9q|<ԇSGP0uHULB KMzVJl=5x343Ă"7F5uMu5؎x[ɸq^ʙk敽yD$ lxøqB׌'Rg{vkCՉ ;Bx{kBEQg,BAxm/&3:eN9$x5"Æ|9"$7x[ɸqK[w98yH:,D$  xøqBT6׌&>ַOU.Z|_ Ocx{kBYg,@!x q|<ԇSGP0>PxmC!Ȏe;+;pɭL_x343Ă"NSoϵ:W,2C\ӧ Yxm/&skʆqWn_Y]v}|9p_x[ɸqHqkM^)ۦl]4cD$ 5x["W14.MoM? x{kB%[yjg,>zxm/&4Eڢ\7Ӱ;|9t x3IHŮƢ3ºDGb4YxøqB>}_'W E:Yokb/8c/x{kB%[g,@jIIf^z^Vq~ &mL3KOIM/J,(x q4!٘DVܾDaⓅjͣx343000P(N.J,H-b"pޟ  T]xm/&m-g2?xxѿ|9x[ɸq_uь oL:2=  EmxøqBޞYLKO~(Pשּȡ Cx{kBag,@x x qNx3zZ ҥSx343000P(N.J,H-b8gNaIWo~]x 0V)];<ݓl ux[ɸqȵKZ$D3zwIӉ lxøqBE ]2vߝ{e|_* Bx{kB%eg,<!x q<=Ð}b~£x343000P(N.J,H-b`cXZS?sxљ \xm/&jGڥَ}QGd>} x[ɸqH~H !ת*z٣ݓ*gxøqBM MκYra؃O}=x{kB{Ig,CX x qX-~Ep*=%اyx343Ă" g l*]KNDz *{x9qy%4Nȓu^e^bqz՟`lV>x343Ă" Rfi."f| {Tx3⬅1aXGb8,xøqBe.U)*#|_ x{kB{ig,CExm/&uʔ>Idw:d>wx[ɸqHǾ4wZ;v*kUJD$+ HMxøqBHGˬ+ $Rb*>?1 <#x{kB{rqg,D!xmC!Cr_V6n7yUrG׉ɭL_NxmC!Ü5-FƸZlV&x343Ă"0[oz9#|׆ Yx 3kz~ڕljү띓l4x[ɸqiey 2=:k۵D$ uxøqB,>N0g Kx{kBIERg,C"xmC!Ȋ{jU[t[:QK7w5R|9cxm(%$2$?nyNtgI'V6)5~sj+܍f&& z%yE uL&xMҋ{{kYYU89{x:0w|鑹V-[>kr#R(P{3ic\"B.1}_buqOOɿ-߫߹ZԘWl:,l_c㩖R?9cM^wMl4M͹sfx}>~9[ ̼Dk7~kWl><?+'1kNN`yIUԾۿ6ڻ]xq d;-y~L^pF Ixxq4ܡEgr%(8qEsUV 6xm*st|D7nhm'q& xq&sֹh>R0,VT wxxq4k;W W>#uUװ ~x:mֲ21vBӼ.-`yg-58,#e,l?dxVAlEUJmT4c`]qEIMuAx=]{캩+D\*GEH'N \nfwLʫ??ޟox;Xk*񃄑f5 \ͺq} .F}0C[$z2ȹ4$gMX̣l"aiV~lz&!׬2F_?1dt3>T.C"ӆj b> ,3B{?{F^9xN'Yާ͵! 18YGf2n0]? mCoᒩU^β l+5\&nAt֬Meb#[ ,+Dm"#r?LZ`v5` U<,nfjkaPIw1v2BP;6lfn8xG N=pq~]­EjxK'wX{je6=%rkE3%}ȴi :kgf4$i_ML*XmNm¢Z„!URY ,2: UÌ\ȱhL{zV4fB, >h4.DgD?l9˯ > 5L686N|2,ݢNKkr~#V "Y~MΦ xP!\)^UT P\m{tf1{x~ n^/sm.CAL+% O2Wwձ$x,ur6s66UMKgff:?zӡ{ϖMR&/ʙ<;7:|Rndqۉ^*Jk V֢"02E0uEb8u::;/mze"s\E5؇OS$u{0qiZX!Ma؁=\F OL-̨!UؑSe ۤ}D,8iò;D+_G^ҹ }K>ւ}x:މYۺnfFذrK{L;XFvE*HGf8X]J  V)NH믂<2-YnLu%O*j8g}ν?+UUP(  ,"v[i{7xeUoEV6F%%4*SIiR ױ i,;Cų=;kfK7驈 #.pCO\Tq,}}˽/4M}w*̥Ҳzjxb$ z&m" ϜRLZ0G:-]ATMn<<'?XI$ 7;rq]p@Pޔ)u V;vh H~}\Q:u3P_S+ㇾKLnʀ<±SG/I%j`vLԈd :{hDvkV9;dS]+NU)yv zؖ--\.gS]VW5{u9P9wQT?]V[ϯO29?_=O^64^p1Z&m 0ۄKZj Jx_^g.8ʶ7@|؉/??[ȶ,xÿ sKƎRԿ"]d NZ  t^>s:tiZ@YFlAYNq -:bLP7;]a ģe>CPMFHY=4C ?DJ GLi^ϩ %x$?[I!|$q8Ldpzݶڝ*ir2u;O3UG\q}%Ϗ z\+.K;;r@tuii56ƛ.:DN6KguZX^**aae0ٕ^bP.U@Kx Gָ=|#:vFQ))?s;Ag3W'Z-Oq6*(@C(vdmRI8ohr[lFքkHÅ^Ĝ<ӘaZP0F6d8lr#ln6!Ld?mz 8*К^ϘnDLyQ|'|`WK sF2 'f@*?,gH w|Q4MS̄!|ցw9 >;g/άY"{~ =Roz$\^Nvt@0=8 'rw-Z\׷F&qqȋC 1Ξ=v$+X &nۑQSȒnI8) 48[ `!HcD'Ypq҃'㆙ٟ3RϿE؄=}S hst꫽Pz6#osbУa6+KذF;Aktp;u5!H. %E,?#iX:x7g{a+]W=M6{76lShY~Z~D%E}j`AnoYv2iITJ%/!We=ly$ EhpXqv}%Qӣd3QpCAɺGFh設5!=O#Q;?޸ M!MVic]j.xmFAj[^qBm;kF/fq ͪxJ100644 settings.json^\2Tg jp40000 skills *m2 eX egnxk`8Q DxvmD6 ;v{['Ә x[ɾ L+ySRӋ 2z Ux hG۶ӬVlxL40000 componentsIv  I*g100644 config.yamlh$s&*r8x340031Q((M*.MҫLaP XdSmM_$$$(tZ8<891Fh#xU0 D|E~Z1e- nADX')/td s>J@6I-,V< JΒC,fA )V(驈X#p5Xl'ڳ.I+ju[}⺵K (UoGN}i!xĸqB _igxvm&KəQ 3켈dL PK+Jd&.[]-srZ7hx[qȚ)/)kX+ x340031QrutuMaaw#gYԓcL @!9? 8!u=?2-`JX)E GT!5ɀNpͲC _:ڎǸh.=j[SlU$'r’Dt4}yq޼@Bóo"40000 infraidv,I$8 #=WluM?xqkPd~a[O xxqHh#"Z +cs2Qw- vxMo_CВ +%%iB,wT.%VCSH. ZziN@,d >3y3Ysւ}} }xnm^k ׿HNWd >qsYB7L?U2`2F0B樕<{ݟ[kmA +eܛA=]jLy8MGIk:rnV`4cKFn/؂y!#7('ħqMDs@=zܛcy̏ܲ}ώ`$65\{f `-0\ɶ&\J{JH,[ E,L~`L? 2&M4:D #ӵB&؄|l{QHT;}-r;;:(bPYLM,ne6=TN':<&9, \ά8Vx>Oڛ|JrGyCNj93eH᯿>N).1X0\wIh§`N.$S/pݕҒaa.&'<ِrV{j&wFBZ {>\ [JL`s?}g%)c.<|,pzBVc`ba|$uDzǢ:GMBR9 ;,w_)Ķa>JWXEp4{ŽY^`BrIr\2-UEK&oU(ɋOёb e_dtaT+$߇u{͸S;KVZE!606:Y^ V7){T yxrAC+Fηp{,΀wn€#0٢kd[ ,): jOv",m0) zrjډURz9n)~ĜC)3x,EZT+( fl|aFRfsLN% 㟓k}J tLty<EMApĨXl0:0Fԥ #<@Igeo@r W%䩫GT]V[7 cɞY-<؇ad>:PJ:î öK#PXl/ɇNlѪ [XA٥t; Gٞ:s"<\oU&,<&FQ#_DvLPQ̄=N^xړ O_⼒Ve]4FQh"tluҬtP)5G彽znR/M UZRK4@Jዋ7'`<_b_@0? ¤e+FNtIW[|u]iO@oerHj8|\x<[9YAD=5:ˮ`ZE&nnTC"Uy1WW@ǧ{v]MRFۉj Q%5N{7'z`.JkC*[wk>Š oc*-o\<]8z /^jTg_Pzh%c(58&;1 F}V-PR+:FNo}3,sY%w)aT(8뒏ytvҜӥA)6K"`ݦ'(/`Eb;e!5?b&yrgՠg;TDk<,w iV&Gcͧ>r'ֲ? oŠ&?:8#c1f/p0dܔ2_$#FZ܁ yD2v c~|ЁVD+FZԃUZA%eUߡZMJ p2i%ި~w{=9;n3ɡQ-N;㗀6 X(YlD(<fR,d-fc;צL_]"y@ycxRaX#tM0j[ѽk*KzaNʊC/}.n3iF<fRK_= 23n.%ֳpV*qX5o/v:(e#i&Tm$┻ꊐY<:vq\ʲ2@=tEeos}/ե Wk-Q,Ȏ 7ar[H$ȶ[if@HbefIJ;] eKUؽ˜F4&&?Կ >NKpj ;s%2,d;s]? iHz!)"^|e== Sxkq}la<dxڈJI>RTJV"tȹETE=u+\̨=;U] x X\lsr &)u" $Ux[{;'sbrFL;9Sjs2WpBBBnjQnbf WzQbAOx'RWgNK x340031Qpq u Ma`-Ub&uUf?Zx,7(LLIK-M,($yA/eDqA PHL)bp~e) ~J7WiMKLgX,޿9ol KOv.3(:QP\ZZT_ZT?h/+M5ѳVgjiAe7xX8,k xH|C&6Ox340031QrutuMa|!čw:նk_dTf($2iՋSΛ@T'g1Pqsik="~nh(()JLMfxk'*ÄhC+c O_6'LxmJ#AQAA֋ A'1aݕL{q"\ByaOy/?E_~|}÷` .*F)U N*zǝpZސ2-$ή`ZXZ}s|:Q&n.$C%WC1+=ǜwxZ =4#i3,͹!Vaa1<(0zAPځ,uS@^]/ɿ j~5ns}_h~NfGBH50]YWͭ& u׼ ~O{݃n'a?AȌ1SG@rhUK2&Y'Q~KZEtE N-%ύ!Z伂B <-o,<x; Zh.#:?13O^*03k2- iE ũEyzz) y)I ͫ8Ęr_x340031Q(N.J,H-ҫaPYeno\qoOcUXV5+WձL^f͏ݠJS2Z9޻LLͅ/60´6CĢYREfj6[m~TUUR Vefj.Lw/剚N<*lx:ad=uҢ"3JJ ss2KL , 3RsJ2&eT6-RԒb+LLݘMctA:xkK-T8n|ybq_ehC4{(#Ə;*_WXTʶޫ|هSJDDJ`@lPY_]f lNZ2UBx[g;'sbrFL;9Sjs26C =C=C#MX. G?whļT C=K3=# = ֆ&zzff|Br J tR 3 2 -̀L,'O~%ld!+)ʜTf̜+essx7_^ø^U>A!, XA#$1389!U7s '$$&fp% V0Y̩y)hL>u RTxUn5V6F UEo HUUfv S[ *J B\@;1ەVk<k^x&I@>wo˟3oTYoЦ݆ac32}0{4bDs@ϽO@94uG1ܵ15 haL\Y4`k #;w@k+ÃϏWgp"!Bp)`9PvkIeHDjqws;[Z(}ɓ^x$p #>T̔ߑNJݣX`n\PnIHH*!ޫ t(C32,͆M5Ǖ () !b WKKK2,2& ⹮L1y#Rq։dkhKMx]=/{c]񄾌l/{\XI S1叭[x]ݯ<'غ'ǔʓ+DFM˩1L*K,,1_msX]=1UF:B'TCִUQgG2cT2xZH*u+z#B9 fGU0Ԫ,qf.(7 !܊NJ~SUVW Nd5A[ \ C,H E%&@̨)ftCf!"8<ũ?2HXiZyN'*.c yDQ+u,o.l|X%U3~8F(' 9.K:x!({[3n^.~gu/5s0:,6dz፛~o}8n|53@!k>Bmfﯼ\'h.֊R .9珸qK>#M\Ċv*A5ָ$K}N9BRӤDfp]މ,槠da\C0.MOsO{a8Z)&)Tփf NM^u#+#r:TX ""y AK\q``=m>vs>v]>ZLg_Vn{8DFRF565ȉ7$*8pc(@hf)tF]8,tu6ptf2F2BZ`(UD (#f+ȮkaWgg'h܍}Bvn-[ pj(h(.'bT؁$vA|`ʝ^Pp8@j=lCx~B} _)gbx@}alox }f;GBԱiuȓlEx340031QrutuMa|!čw:նk_dTf($2|ڵrglorak"*Q7wnZ;_zG -%Ei /}RemsH}eL9 x340031Q(N.J,H-ҫa_ /ziK"\y,#(5jV|Acp㽚VAU%efrwjy KyS,}xk`2-'$dc=#<OLx ڜw8l(x340031QrutuMa|!čw:նk_dTf($2\>iHخ;=/fAX9x>+X?=\k,d=&Lj\ZZz9)2 2 YkxxºAiyczxmJ@A0{ lxŃh'Of'feNl/!/$'a`aߣb~s8mo`c=12T:Y$ۡ5:WaRUcn)ƑPK$$UZŌؙ_5psBf$ҰW rI&YVf;ǜ*} ɻZ6_c"ĸȿ **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Migrate the monorepo to moonrepo for centralized task orchestration, caching, and consistent dependency management across all 7 apps. **Architecture:** moonrepo sits as a task orchestration layer above the existing Nix build system. `.moon/tasks/` holds shared task definitions (TypeScript and Rust). Each app gets a `moon.yml` with tags and inter-project dependencies. Nix, Docker Compose, git submodules, and infra remain untouched. **Tech Stack:** moonrepo CLI, Node 22, Bun, TypeScript 5+, Cargo (Rust) --- ### Task 1: Install moonrepo CLI and scaffold .moon/ directory **Files:** - Create: `.moon/workspace.yml` - Create: `.moon/toolchain.yml` - Create: `.moon/tasks/` (directory) - [ ] **Step 1: Install moonrepo CLI via curl** ```bash curl -fsSL https://moonrepo.dev/install/moon.sh | bash ``` - [ ] **Step 2: Verify installation** Run: `moon --version` Expected: prints version number (e.g., `moon 1.x.x`) - [ ] **Step 3: Create .moon/ scaffold directories** ```bash mkdir -p .moon/tasks ``` - [ ] **Step 4: Commit** ```bash git add .moon/ git commit -m "chore: scaffold .moon/ directory for moonrepo" ``` --- ### Task 2: Configure workspace.yml **Files:** - Create: `.moon/workspace.yml` - [ ] **Step 1: Write .moon/workspace.yml** ```yaml # https://moonrepo.dev/docs/config/workspace $schema: "https://moonrepo.dev/schemas/workspace.json" projects: - "apps/*" vcs: manager: "git" defaultBranch: "main" runner: implicitDeps: # TypeScript apps: lint depends on build (for typecheck path) - "typescript-build.build" cacheTtl: 604800 ``` - [ ] **Step 2: Validate config structure** Run: `moon check` Expected: no errors (will warn about missing project configs — expected) - [ ] **Step 3: Commit** ```bash git add .moon/workspace.yml git commit -m "chore: configure moonrepo workspace with project glob" ``` --- ### Task 3: Configure toolchain.yml **Files:** - Create: `.moon/toolchain.yml` - [ ] **Step 1: Write .moon/toolchain.yml** ```yaml # https://moonrepo.dev/docs/config/toolchain $schema: "https://moonrepo.dev/schemas/toolchain.json" node: version: "22.11.0" packageManager: "bun" bun: version: "1.3.11" typescript: syncProjectReferences: true createMissingConfig: false routeOutDirToCache: false ``` - [ ] **Step 2: Commit** ```bash git add .moon/toolchain.yml git commit -m "chore: configure moonrepo toolchain (Node 22, Bun 1.3)" ``` --- ### Task 4: Create shared TypeScript task definitions **Files:** - Create: `.moon/tasks/typescript-build.yml` - Create: `.moon/tasks/typescript-lint.yml` - Create: `.moon/tasks/typescript-test.yml` - [ ] **Step 1: Write .moon/tasks/typescript-build.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: build: command: "bun run build" inputs: - "src/**/*" - "tsconfig.json" - "package.json" outputs: - ".next" - "dist" - ".output" options: cache: true dev: command: "bun run dev" local: true options: persistent: true ``` - [ ] **Step 2: Write .moon/tasks/typescript-lint.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: lint: command: "bun run lint" inputs: - "src/**/*" - "eslint.config.mjs" - "tsconfig.json" options: cache: false typecheck: command: "bun run check-types" inputs: - "src/**/*" - "tsconfig.json" options: cache: false ``` - [ ] **Step 3: Write .moon/tasks/typescript-test.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: test: command: "bun test" inputs: - "src/**/*" - "test/**/*" - "tests/**/*" - "vitest.config.ts" options: cache: false e2e: command: "noop" local: true options: cache: false ``` - [ ] **Step 4: Commit** ```bash git add .moon/tasks/typescript-build.yml .moon/tasks/typescript-lint.yml .moon/tasks/typescript-test.yml git commit -m "chore: add shared TypeScript task definitions" ``` --- ### Task 5: Create shared Rust task definitions **Files:** - Create: `.moon/tasks/rust-build.yml` - Create: `.moon/tasks/rust-test.yml` - Create: `.moon/tasks/rust-lint.yml` - [ ] **Step 1: Write .moon/tasks/rust-build.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: build: command: "cargo build --release" platform: system inputs: - "src/**/*" - "Cargo.toml" - "Cargo.lock" - "build.rs" outputs: - "target/release/*" options: cache: true envFile: false dev: command: "cargo run" platform: system local: true options: persistent: true envFile: false ``` - [ ] **Step 2: Write .moon/tasks/rust-test.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: test: command: "cargo test" platform: system inputs: - "src/**/*" - "Cargo.toml" - "Cargo.lock" - "tests/**/*" options: cache: false envFile: false ``` - [ ] **Step 3: Write .moon/tasks/rust-lint.yml** ```yaml # https://moonrepo.dev/docs/config/tasks $schema: "https://moonrepo.dev/schemas/tasks.json" tasks: lint: command: "cargo clippy -- -D warnings" platform: system inputs: - "src/**/*" - "Cargo.toml" options: cache: false envFile: false fmt-check: command: "cargo fmt --check" platform: system inputs: - "src/**/*" options: cache: false envFile: false ``` - [ ] **Step 4: Commit** ```bash git add .moon/tasks/rust-build.yml .moon/tasks/rust-test.yml .moon/tasks/rust-lint.yml git commit -m "chore: add shared Rust task definitions" ``` --- ### Task 6: Create per-app moon.yml for TypeScript apps **Files:** - Create: `apps/nextjs/moon.yml` - Create: `apps/elysia/moon.yml` - Create: `apps/solidjs/moon.yml` - [ ] **Step 1: Write apps/nextjs/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "typescript" platform: "node" tags: - "lang:typescript" - "type:frontend" dependsOn: - id: "rust-auth" - id: "elysia" ``` - [ ] **Step 2: Write apps/elysia/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "typescript" platform: "bun" tags: - "lang:typescript" - "type:backend" ``` - [ ] **Step 3: Write apps/solidjs/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "typescript" platform: "bun" tags: - "lang:typescript" - "type:frontend" dependsOn: - id: "elysia" - id: "rust-auth" ``` - [ ] **Step 4: Commit** ```bash git add apps/nextjs/moon.yml apps/elysia/moon.yml apps/solidjs/moon.yml git commit -m "chore: add moon.yml for TypeScript apps (nextjs, elysia, solidjs)" ``` --- ### Task 7: Create per-app moon.yml for Rust apps **Files:** - Create: `apps/rust/moon.yml` - Create: `apps/rust-auth/moon.yml` - Create: `apps/leptos/moon.yml` - [ ] **Step 1: Write apps/rust/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "rust" platform: "system" tags: - "lang:rust" - "type:backend" fileGroups: sources: - "src/**/*.rs" - "Cargo.toml" - "Cargo.lock" - "build.rs" - "rustfmt.toml" ``` - [ ] **Step 2: Write apps/rust-auth/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "rust" platform: "system" tags: - "lang:rust" - "type:backend" fileGroups: sources: - "src/**/*.rs" - "Cargo.toml" - "Cargo.lock" ``` - [ ] **Step 3: Write apps/leptos/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "rust" platform: "system" tags: - "lang:rust" - "type:frontend" dependsOn: - id: "rust" fileGroups: sources: - "src/**/*.rs" - "Cargo.toml" - "Cargo.lock" - "Trunk.toml" - "rust-toolchain.toml" ``` - [ ] **Step 4: Commit** ```bash git add apps/rust/moon.yml apps/rust-auth/moon.yml apps/leptos/moon.yml git commit -m "chore: add moon.yml for Rust apps (rust, rust-auth, leptos)" ``` --- ### Task 8: Create moon.yml for 9router **Files:** - Create: `apps/9router/moon.yml` - [ ] **Step 1: Write apps/9router/moon.yml** ```yaml # https://moonrepo.dev/docs/config/project $schema: "https://moonrepo.dev/schemas/project.json" type: "application" language: "unknown" platform: "system" tags: - "type:router" fileGroups: sources: - "src/**/*" - "next.config.mjs" - "package.json" ``` - [ ] **Step 2: Commit** ```bash git add apps/9router/moon.yml git commit -m "chore: add moon.yml for 9router" ``` --- ### Task 9: Update flake.nix — add moon CLI to devShell **Files:** - Modify: `flake.nix` - [ ] **Step 1: Add moon to nativeBuildInputs in flake.nix** Find the `devShells.default` block in `flake.nix`. Add `moon` to `nativeBuildInputs`: ``` devShells.default = pkgs.mkShell { name = "ultimate-asepharyana-dev"; nativeBuildInputs = with pkgs; [ rustToolchain bun nodejs_22 pkg-config openssl trunk wasm-bindgen-cli binaryen process-compose mysql84 redis minio-client gh git moon # <-- add this line ]; # ... shellHook unchanged }; ``` - [ ] **Step 2: Verify Nix can still evaluate the flake** Run: `nix flake check --no-build 2>&1 | head -20` Expected: no evaluation errors - [ ] **Step 3: Commit** ```bash git add flake.nix git commit -m "chore: add moon CLI to Nix devShell" ``` --- ### Task 10: Update .gitignore **Files:** - Modify: `.gitignore` - [ ] **Step 1: Add moonrepo cache entries to .gitignore** Append to `.gitignore`: ```gitignore # moonrepo .moon/cache .~moon ``` - [ ] **Step 2: Commit** ```bash git add .gitignore git commit -m "chore: add moonrepo cache entries to .gitignore" ``` --- ### Task 11: Validate installation with moon check **Files:** (none — validation only) - [ ] **Step 1: Run moon check** ```bash moon check ``` Expected: `OK` or zero errors. If warnings about unresolved project IDs appear, verify that `apps/*` glob in `workspace.yml` matches all project directories. - [ ] **Step 2: Run moon query projects** ```bash moon query projects ``` Expected: lists all 7 projects with their tags: nextjs, elysia, solidjs, rust, rust-auth, leptos, 9router - [ ] **Step 3: Verify tag queries work** ```bash moon query projects --tag lang:typescript ``` Expected: nextjs, elysia, solidjs ```bash moon query projects --tag lang:rust ``` Expected: rust, rust-auth, leptos - [ ] **Step 4: Commit (if any fixes were needed)** No commit needed if check passes clean. --- ### Task 12: Test — moon run build on TypeScript apps **Files:** (none — test only) - [ ] **Step 1: Build nextjs** ```bash moon run nextjs:build ``` Expected: `next build` runs successfully, outputs to `.next/` - [ ] **Step 2: Build elysia** ```bash moon run elysia:build ``` Expected: `bun build` runs successfully, outputs to `dist/` - [ ] **Step 3: Build solidjs** ```bash moon run solidjs:build ``` Expected: `vinxi build` runs successfully, outputs to `.output/` - [ ] **Step 4: Verify caching on second build (nextjs)** ```bash moon run nextjs:build ``` Expected: `Cached` — no rebuild, uses moonrepo cache --- ### Task 13: Test — moon run lint and test **Files:** (none — test only) - [ ] **Step 1: Run lint across TypeScript apps** ```bash moon run :lint ``` Expected: all apps with a `lint` task run it. Note failures as they exist pre-migration (not caused by moonrepo). - [ ] **Step 2: Run tests across TypeScript apps** ```bash moon run :test ``` Expected: all apps with a `test` task run it. - [ ] **Step 3: Run tag-scoped commands** ```bash moon run --tag lang:typescript :build ``` Expected: builds nextjs, elysia, solidjs only (not Rust apps). --- ### Task 14: Final commit and documentation **Files:** - Modify: `.gitignore` (if any final updates) - [ ] **Step 1: Final moon check** ```bash moon check ``` Expected: clean, no errors. - [ ] **Step 2: Commit any remaining changes** ```bash git status ``` If nothing outstanding, move on. - [ ] **Step 3: Verify the full workspace is clean** ```bash git status ``` Expected: working tree clean. (xFe# PostgreSQL Migration Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Migrate elysia (Drizzle ORM + MySQL) and rust (SeaORM + MySQL) apps to PostgreSQL via direct cutover. **Architecture:** Export MySQL data, convert schema to PostgreSQL format, import into target PostgreSQL instance, update app drivers and connection strings, deploy and validate. **Tech Stack:** MySQL (source), PostgreSQL (target), Drizzle ORM (elysia), SeaORM (rust), pgloader or manual conversion for schema migration. --- ## File Structure ### Elysia App Changes - `apps/elysia/src/db/lib/database.ts` — Replace mysql2 driver with postgres driver - `apps/elysia/src/db/lib/schema.ts` — Replace mysqlTable with pgTable, update column types - `apps/elysia/package.json` — Replace mysql2 with pg dependency - `.env` or config file — Update DATABASE_URL to PostgreSQL connection string ### Rust App Changes - `apps/rust/Cargo.toml` — Replace sqlx-mysql feature with sqlx-postgres - `apps/rust/src/infra/db_setup.rs` — Update DbBackend::MySql to DbBackend::Postgres, adjust SQL syntax - Config/environment — Update DATABASE_URL to PostgreSQL connection string ### Migration Artifacts - `mysql_backup.sql` — MySQL dump (created during migration, not committed) - `converted.sql` — PostgreSQL-compatible dump (created during migration, not committed) --- ## Task Breakdown ### Task 1: Backup MySQL and Export Schema **Files:** - Create: `mysql_backup.sql` (temporary, not committed) - [ ] **Step 1: Export MySQL database** ```bash cd /mnt/code/bp3/ultimate-asepharyana.tech mysqldump -u -p -h > mysql_backup.sql ``` Expected: File created with full schema + data. Verify file size > 1MB (contains data). -[]**Step 2: Verify backup integrity** ```bash # Check row counts in backup grep "INSERT INTO" mysql_backup.sql | wc -l ``` Expected: Multiple INSERT statements present. Note row counts for later validation. - [ ] **Step 3: Document backup location** Store `mysql_backup.sql` in safe location (not in git). This is rollback insurance. --- ### Task 2: Convert MySQL Schema to PostgreSQL **Files:** - Create: `converted.sql` (temporary, not committed) - [ ] **Step 1: Install pgloader (if not present)** ```bash # macOS brew install pgloader # Linux (Ubuntu/Debian) sudo apt-get install pgloader # Or use Docker docker run --rm -v $(pwd):/data pgloader/pgloader pgloader /data/mysql_backup.sql postgresql://asephs:hunterz@100.108.1.124:5432/hub ``` - [ ] **Step 2: Convert MySQL dump to PostgreSQL** ```bash pgloader mysql_backup.sql postgresql://asephs:hunterz@100.108.1.124:5432/hub ``` Or manually convert if pgloader unavailable: - Replace `AUTO_INCREMENT` with `SERIAL` or `BIGSERIAL` - Replace `DATETIME` with `TIMESTAMP` - Replace backticks with double quotes - Update index syntax for PostgreSQL Expected: Conversion completes without errors. Check for warnings about type conversions. - [ ] **Step 3: Verify conversion output** ```bash # If using pgloader, it creates converted.sql automatically # If manual, save converted schema to file cat converted.sql | head -50 ``` Expected: PostgreSQL-compatible SQL syntax (no backticks, SERIAL types, TIMESTAMP). --- ### Task 3: Test PostgreSQL Import **Files:** - Target: PostgreSQL instance at `postgresql://asephs:hunterz@100.108.1.124:5432/hub` - [ ] **Step 1: Connect to target PostgreSQL** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub ``` Expected: Connected to PostgreSQL. Prompt shows `hub=#`. - [ ] **Step 2: Import converted schema** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub < converted.sql ``` Expected: Import completes. Check for errors (should be none). - [ ] **Step 3: Validate table creation** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "\dt" ``` Expected: All tables listed (User, Account, Session, Role, Permission, UserRole, ImageCache, etc.). - []**Step 4: Validate row counts** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) FROM \"User\";" psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) FROM \"Account\";" ``` Expected: Row counts match MySQL backup (from Task 1, Step 2). - [ ] **Step 5: Validate indexes** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "\di" ``` Expected: All indexes present (email_idx, username_idx, userId_idx, sessionToken_idx, etc.). - [ ] **Step 6: Validate foreign keys** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT constraint_name, table_name FROM information_schema.table_constraints WHERE constraint_type = 'FOREIGN KEY';" ``` Expected: Foreign key constraints listed (User→Account, User→Session, etc.). --- ### Task 4: Update Elysia Database Driver **Files:** - Modify: `apps/elysia/src/db/lib/database.ts` - Modify: `apps/elysia/src/db/lib/schema.ts` - Modify: `apps/elysia/package.json` - [ ] **Step 1: Update package.json dependencies** Replace mysql2 with pg: ```json { "dependencies": { "drizzle-orm": "^0.45.2", "pg": "^8.11.0", "elysia": "^1.4.28" }, "devDependencies": { "drizzle-kit": "^0.31.10" } } ``` Run: `cd apps/elysia && bun install` Expected: pg installed, mysql2 removed from node_modules. - [ ] **Step 2: Update database.ts driver** Replace entire file: ```typescript import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js' import { drizzle } from 'drizzle-orm/postgres-js' import postgres from 'postgres' import * as schema from './schema' export type Database = PostgresJsDatabase let dbInstance: Database | null = null let sqlInstance: ReturnType | null = null export function initializeDb(databaseUrl: string): Database { if (dbInstance) { return dbInstance } sqlInstance = postgres(databaseUrl) dbInstance = drizzle(sqlInstance, { schema, mode: 'default' }) return dbInstance } export function getDb(): Database { if (!dbInstance) { throw new Error('Database not initialized. Call initializeDb first.') } return dbInstance } export async function closeDb() { if (sqlInstance) { await sqlInstance.end() sqlInstance = null dbInstance = null } } ``` Expected: File updated. No syntax errors. - [ ] **Step 3: Update schema.ts imports** Replace: ```typescript import { index, int, mysqlTable, primaryKey, text, timestamp, varchar, } from 'drizzle-orm/mysql-core' ``` With: ```typescript import { index, integer, pgTable, primaryKey, text, timestamp, varchar, } from 'drizzle-orm/postgres-core' ``` - [ ] **Step 4: Update schema.ts table definitions** Replace all `mysqlTable` with `pgTable` and `int` with `integer`: ```typescript // Before export const users = mysqlTable( 'User', { id: varchar('id', { length: 255 }).primaryKey(), name: varchar('name', { length: 255 }), // ... }, // ... ) // After export const users = pgTable( 'User', { id: varchar('id', { length: 255 }).primaryKey(), name: varchar('name', { length: 255 }), // ... }, // ... ) ``` Do this for all tables: users, accounts, sessions, roles, permissions, userRoles, and any others. Expected: All `mysqlTable` → `pgTable`, all `int` → `integer`. - [ ] **Step 5: Update environment variable** Set DATABASE_URL in `.env` or deployment config: ```bash DATABASE_URL=postgresql://asephs:hunterz@100.108.1.124:5432/hub ``` Expected: Environment variable set and accessible to elysia app. - [ ] **Step 6: Test elysia connection** ```bash cd apps/elysia bun run src/index.ts ``` Expected: App starts without connection errors. Check logs for "Database initialized" or similar. - [ ] **Step 7: Commit elysia changes** ```bash cd /mnt/code/bp3/ultimate-asepharyana.tech git add apps/elysia/src/db/lib/database.ts apps/elysia/src/db/lib/schema.ts apps/elysia/package.json git commit -m "feat(elysia): migrate database driver from MySQL to PostgreSQL" ``` Expected: Commit created with message. --- ### Task 5: Update Rust Database Driver **Files:** - Modify: `apps/rust/Cargo.toml` - Modify: `apps/rust/src/infra/db_setup.rs` - [ ] **Step 1: Update Cargo.toml features** Replace: ```toml sea-orm = { version = "1.1.19", features = ["sqlx-mysql", "runtime-tokio-rustls", "macros", "with-chrono", "with-uuid"] } ``` With: ```toml sea-orm = { version = "1.1.19", features = ["sqlx-postgres", "runtime-tokio-rustls", "macros", "with-chrono", "with-uuid"] } ``` Expected: Cargo.toml updated. Feature changed from sqlx-mysql to sqlx-postgres. - [ ] **Step 2: Update db_setup.rs backend check** Replace: ```rust match backend { DbBackend::MySql => { // MySQL-specific logic } _ => { info!("ℹ️ Skipping schema init for non-MySQL backend"); } } ``` With: ```rust match backend { DbBackend::Postgres => { // PostgreSQL-specific logic let tables = vec![( "ImageCache", schema .create_table_from_entity(image_cache::Entity) .if_not_exists() .to_owned(), )]; for (name, stmt) in tables { match db.execute(backend.build(&stmt)).await { Ok(_) => info!(" ✓ Table '{}' checked/created", name), Err(e) => { error!(" [!] Failed to create table '{}': {}", name, e); return Err(e); } } } // PostgreSQL index creation (different syntax) let index_sql = "CREATE INDEX IF NOT EXISTS idx_image_cache_cdn_url ON \"ImageCache\" (cdn_url)"; match db.execute(Statement::from_string(backend, index_sql)).await { Ok(_) => info!(" ✓ Index 'idx_image_cache_cdn_url' ensured"), Err(e) => { let err_str = e.to_string(); // PostgreSQL duplicate index error if err_str.contains("already exists") { info!(" ✓ Index 'idx_image_cache_cdn_url' already exists"); } else { error!(" [!] Failed to create index on ImageCache: {}", e); } } } info!("✅ Database schema initialization complete."); } _ => { info!("ℹ️ Skipping schema init for non-PostgreSQL backend"); } } ``` Expected: db_setup.rs updated with PostgreSQL backend handling. - [ ] **Step 3: Update environment variable** Set DATABASE_URL in `.env` or deployment config: ```bash DATABASE_URL=postgresql://asephs:hunterz@100.108.1.124:5432/hub ``` Expected: Environment variable set and accessible to rust app. - [ ] **Step 4: Rebuild rust app** ```bash cd apps/rust cargo build --release ``` Expected: Build completes without errors. Compilation uses sqlx-postgres feature. - [ ] **Step 5: Test rust connection** ```bash cd apps/rust cargo run ``` Expected: App starts without connection errors. Check logs for "Database schema initialization complete" or similar. - [ ] **Step 6: Commit rust changes** ```bash cd /mnt/code/bp3/ultimate-asepharyana.tech git add apps/rust/Cargo.toml apps/rust/src/infra/db_setup.rs git commit -m "feat(rust): migrate database driver from MySQL to PostgreSQL" ``` Expected: Commit created with message. --- ### Task 6: Smoke Tests - Elysia App **Files:** - Test: Manual testing via HTTP requests or app UI - [ ] **Step 1: Start elysia app** ```bash cd apps/elysia bun run src/index.ts ``` Expected: App running on configured port (check logs for port). - [ ] **Step 2: Test user login** ```bash curl -X POST http://localhost:3000/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"test@example.com","password":"password"}' ``` Expected: Response 200 or 401 (auth error is OK, connection error is not). -[]**Step 3: Test user creation (if endpoint exists)** ```bash curl -X POST http://localhost:3000/users \ -H "Content-Type: application/json" \ -d '{"name":"Test User","email":"newuser@example.com"}' ``` Expected: Response 200/201 or 400 (validation error is OK). - [ ] **Step 4: Test session retrieval** ```bash curl -X GET http://localhost:3000/sessions \ -H "Authorization: Bearer " ``` Expected: Response 200 with session data or 401 (auth error is OK). - [ ] **Step 5: Check database logs** ```bash # In elysia app logs, verify queries are executing against PostgreSQL # Look for connection strings or query logs showing PostgreSQL ``` Expected: Logs show PostgreSQL queries (not MySQL). --- ### Task 7: Smoke Tests - Rust App **Files:** - Test: Manual testing via HTTP requests or app UI - [ ] **Step 1: Start rust app** ```bash cd apps/rust cargo run --release ``` Expected: App running on configured port (check logs for port). - [ ] **Step 2: Test image cache endpoint (if exists)** ```bash curl -X GET http://localhost:8000/api/cache/status ``` Expected: Response 200 with cache status or 404 (endpoint may not exist). - [ ] **Step 3: Test scraping/CDN endpoint** ```bash curl -X GET http://localhost:8000/api/health ``` Expected: Response 200 with health status. - [ ] **Step 4: Check database logs** ```bash # In rust app logs, verify queries are executing against PostgreSQL # Look for connection strings or query logs showing PostgreSQL ``` Expected: Logs show PostgreSQL queries (not MySQL). --- ### Task 8: Data Integrity Validation **Files:** - Test: PostgreSQL queries - [] **Step 1: Verify user count** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) as user_count FROM \"User\";" ``` Expected: Count matches MySQL backup count (from Task 1, Step 2). - [ ] **Step 2: Verify account count** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) as account_count FROM \"Account\";" ``` Expected: Count matches MySQL backup. - [ ] **Step 3: Verify session count** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) as session_count FROM \"Session\";" ``` Expected: Count matches MySQL backup. - [] **Step 4: Verify no orphaned foreign keys** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c " SELECT a.id FROM \"Account\" a LEFT JOIN \"User\" u ON a.user_id = u.id WHERE u.id IS NULL; " ``` Expected: No rows returned (no orphaned accounts). - [ ] **Step 5: Verify role/permission relationships** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) as role_count FROM \"Role\";" psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "SELECT COUNT(*) as permission_count FROM \"Permission\";" ``` Expected: Counts match MySQL backup. --- ### Task 9: Performance Baseline **Files:** - Test: Query performance comparison - [ ] **Step 1: Benchmark user query on PostgreSQL** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "EXPLAIN ANALYZE SELECT * FROM \"User\" WHERE email = 'test@example.com';" ``` Expected: Query plan shows index usage (Seq Scan or Index Scan). Note execution time. - [ ] **Step 2: Benchmark account query on PostgreSQL** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub -c "EXPLAIN ANALYZE SELECT * FROM \"Account\" WHERE user_id = 'user-123';" ``` Expected: Query plan shows index usage. Note execution time. - [ ] **Step 3: Compare with MySQL baseline (if available)** If MySQL is still running, run same queries and compare execution times. Expected: PostgreSQL performance similar or better than MySQL. --- ### Task 10: Cleanup and Documentation **Files:** - Create: `MIGRATION_LOG.md` (optional, for documentation) - [ ] **Step 1: Remove temporary files** ```bash rm mysql_backup.sql converted.sql ``` Expected: Temporary migration files deleted. - [ ] **Step 2: Document migration completion** Create `MIGRATION_LOG.md`: ```markdown # PostgreSQL Migration Log **Date:** 2026-05-25 **Status:** ✅ Complete ## Summary - Migrated elysia app from MySQL to PostgreSQL - Migrated rust app from MySQL to PostgreSQL - All data validated and integrity confirmed - Apps tested and operational ## Changes - elysia: Updated database driver (mysql2 → postgres), schema (mysqlTable → pgTable) - rust: Updated Cargo.toml feature (sqlx-mysql → sqlx-postgres), db_setup.rs backend handling ## Validation - Row counts match pre-migration - Foreign keys intact - Indexes present and performant - Auth flow functional - Session management working ## Rollback MySQL backup available at: [location if kept] To rollback: Restore MySQL from backup, revert connection strings, redeploy apps. ``` - [ ] **Step 3: Final commit** ```bash git add MIGRATION_LOG.md git commit -m "docs: add PostgreSQL migration completion log" ``` Expected: Commit created. - [ ] **Step 4: Verify all apps running** ```bash # Check elysia curl http://localhost:3000/health # Check rust curl http://localhost:8000/health ``` Expected: Both apps respond with 200 status. --- ## Self-Review **Spec Coverage:** - ✅ Pre-migration (backup, convert, test) — Tasks 1-3 - ✅ Elysia code updates (driver, schema, env) — Task 4 - ✅ Rust code updates (Cargo.toml, db_setup.rs, env) — Task 5 - ✅ Smoke tests (auth, endpoints, logs) — Tasks 6-7 - ✅ Data validation (row counts, foreign keys) — Task 8 - ✅ Performance baseline — Task 9 - ✅ Cleanup and documentation — Task 10 **Placeholder Scan:** - ✅ No TBD/TODO - ✅ All code blocks complete - ✅ All commands exact with expected output - ✅ All file paths exact **Type Consistency:** - ✅ Database type: `PostgresJsDatabase` (elysia), `DbBackend::Postgres` (rust) - ✅ Connection string format consistent: `postgresql://asephs:hunterz@100.108.1.124:5432/hub` - ✅ Table names consistent: "User", "Account", "Session", etc. 9xI3# Production GitHub Actions Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Rework GitHub Actions build/deploy workflows into a production baseline with reliable React submodule updates, least-privilege permissions, clear deploy behavior, and current official action versions. **Architecture:** Keep two workflows: `docker-build-push.yml` for detect/build/manifest updates, and `deploy-docker.yml` for VPS deployment. Add dispatch submodule SHA readiness checks before parent pointer updates, and remove recursive submodule checkout from deploy runner. **Tech Stack:** GitHub Actions YAML, GitHub-hosted Ubuntu runners, Docker Buildx, GHCR, git submodules, Docker Compose over SSH. --- ## File Structure - Modify `.github/workflows/docker-build-push.yml`: add default permissions, validate repository dispatch payloads, wait for submodule SHAs, keep selective matrix builds, harden manifest update. - Modify `.github/workflows/deploy-docker.yml`: add default permissions, remove recursive checkout, keep auto deploy from successful build, make deploy logs clearer. - Modify `.github/dependabot.yml`: add GitHub Actions update config so official actions stay current. --- ### Task 1: Harden build workflow permissions and dispatch validation **Files:** - Modify: `.github/workflows/docker-build-push.yml` - [ ] **Step 1: Add workflow-level read permissions** At top level, after `concurrency`, add: ```yaml permissions: contents: read ``` Expected shape: ```yaml concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: false permissions: contents: read env: REGISTRY: ghcr.io ``` - [ ] **Step 2: Replace dispatch parser with payload validation** In `.github/workflows/docker-build-push.yml`, replace `Parse repository_dispatch payload` step body with: ```yaml - name: Parse repository_dispatch payload id: dispatch if: github.event_name == 'repository_dispatch' env: SERVICE: ${{ github.event.client_payload.service }} SHA: ${{ github.event.client_payload.sha }} run: | set -euo pipefail if [ -z "${SERVICE:-}" ]; then echo "::error::repository_dispatch payload missing service" exit 1 fi if [ -z "${SHA:-}" ]; then echo "::error::repository_dispatch payload missing sha" exit 1 fi case "$SERVICE" in rust-api|elysia-api|react-web|9router) ;; *) echo "::error::Unsupported service '$SERVICE'. Expected one of: rust-api, elysia-api, react-web, 9router" exit 1 ;; esac case "$SHA" in *[!0-9a-fA-F]*|???????????????????????????????????????|?????????????????????????????????????????*) echo "::error::Invalid sha '$SHA'. Expected 40 hex characters" exit 1 ;; esac declare -a SERVICES=("rust-api" "elysia-api" "react-web" "9router") for svc in "${SERVICES[@]}"; do if [ "$SERVICE" = "$svc" ]; then echo "${svc}=true" >> "$GITHUB_OUTPUT" else echo "${svc}=false" >> "$GITHUB_OUTPUT" fi done ``` - [ ] **Step 3: Run YAML syntax check** Run: ```bash python - <<'PY' from pathlib import Path import yaml for path in Path('.github/workflows').glob('*.yml'): yaml.safe_load(path.read_text()) print(f'OK {path}') PY ``` Expected: ```text OK .github/workflows/deploy-docker.yml OK .github/workflows/docker-build-push.yml ``` - [ ] **Step 4: Commit** ```bash git add .github/workflows/docker-build-push.yml git commit -m "ci: validate dispatch payloads" ``` --- ### Task 2: Add submodule SHA readiness wait before build/update **Files:** - Modify: `.github/workflows/docker-build-push.yml` - [ ] **Step 1: Add readiness job after changes job** Insert this job between `changes` and `build`: ```yaml wait-submodule-ref: needs: [changes] if: github.event_name == 'repository_dispatch' runs-on: ubuntu-latest steps: - name: Wait for submodule ref env: SERVICE: ${{ github.event.client_payload.service }} SHA: ${{ github.event.client_payload.sha }} run: | set -euo pipefail case "$SERVICE" in "rust-api") REPO="https://github.com/MythEclipse/ultimate-asepharyana-tech-rust.git" ;; "elysia-api") REPO="https://github.com/MythEclipse/ultimate-asepharyana-tech-elysia.git" ;; "react-web") REPO="https://github.com/MythEclipse/ultimate-asepharyana-tech-react.git" ;; "9router") REPO="https://github.com/MythEclipse/9router.git" ;; *) echo "::error::Unsupported service '$SERVICE'" exit 1 ;; esac echo "Waiting for $SERVICE ref $SHA in $REPO" for attempt in {1..30}; do if git ls-remote --exit-code "$REPO" "$SHA" >/dev/null 2>&1; then echo "Submodule ref $SHA is fetchable for $SERVICE" exit 0 fi echo "Attempt $attempt/30: $SHA not visible yet; waiting 10s" sleep 10 done echo "::error::Submodule ref $SHA for $SERVICE was not fetchable after 300s" exit 1 ``` - [ ] **Step 2: Make build wait for readiness job without blocking push/manual events** Change build job header from: ```yaml build: needs: [changes] ``` to: ```yaml build: needs: [changes, wait-submodule-ref] if: | always() && needs.changes.result == 'success' && (needs.wait-submodule-ref.result == 'success' || needs.wait-submodule-ref.result == 'skipped') && needs.changes.outputs.matrix != '[]' ``` Remove existing build-level line: ```yaml if: needs.changes.outputs.matrix != '[]' ``` - [ ] **Step 3: Make update-manifest wait for readiness job** Change update-manifest header from: ```yaml update-manifest: needs: [changes, build] if: | always() && (needs.build.result == 'success' || needs.build.result == 'skipped') ``` to: ```yaml update-manifest: needs: [changes, wait-submodule-ref, build] if: | always() && needs.changes.result == 'success' && (needs.wait-submodule-ref.result == 'success' || needs.wait-submodule-ref.result == 'skipped') && (needs.build.result == 'success' || needs.build.result == 'skipped') ``` - [ ] **Step 4: Run YAML syntax check** Run same command from Task 1 Step 3. Expected both workflow files print `OK`. - [ ] **Step 5: Commit** ```bash git add .github/workflows/docker-build-push.yml git commit -m "ci: wait for submodule refs before builds" ``` --- ### Task 3: Harden manifest update and submodule checkout **Files:** - Modify: `.github/workflows/docker-build-push.yml` - [ ] **Step 1: Add job permissions to build and manifest jobs** Ensure build job contains: ```yaml permissions: contents: read packages: write ``` Ensure update-manifest job contains: ```yaml permissions: contents: write ``` - [ ] **Step 2: Replace dispatch submodule checkout block** Inside `Update tags and submodules`, replace the repository_dispatch submodule update block with: ```bash if [ "${{ github.event_name }}" == "repository_dispatch" ] && [ "${{ github.event.client_payload.service }}" == "$id" ]; then SHA_DISPATCH="${{ github.event.client_payload.sha }}" SUB_PATH="${PATHS[$id]}" if [ -n "$SHA_DISPATCH" ]; then echo "Updating submodule $SUB_PATH to $SHA_DISPATCH" git submodule update --init "$SUB_PATH" git -C "$SUB_PATH" fetch origin "$SHA_DISPATCH" git -C "$SUB_PATH" checkout "$SHA_DISPATCH" git add "$SUB_PATH" CHANGED=true fi fi ``` - [ ] **Step 3: Add pull/rebase retry before push** Replace: ```bash git commit -m "chore: update manifests and submodules [skip ci]" git pull --rebase origin main git push origin main ``` with: ```bash git commit -m "chore: update manifests and submodules [skip ci]" for attempt in {1..3}; do if git pull --rebase origin main && git push origin main; then exit 0 fi echo "Manifest push attempt $attempt/3 failed; retrying" git rebase --abort || true git pull --rebase origin main || true sleep 5 done echo "::error::Failed to push manifest update after 3 attempts" exit 1 ``` - [ ] **Step 4: Run YAML syntax check** Run same command from Task 1 Step 3. Expected both workflow files print `OK`. - [ ] **Step 5: Commit** ```bash git add .github/workflows/docker-build-push.yml git commit -m "ci: harden manifest updates" ``` --- ### Task 4: Make deploy checkout submodule-free and least privilege **Files:** - Modify: `.github/workflows/deploy-docker.yml` - [ ] **Step 1: Add workflow-level read permissions** After `concurrency`, add: ```yaml permissions: contents: read ``` Expected shape: ```yaml concurrency: group: deploy-vps cancel-in-progress: false permissions: contents: read ``` If current `cancel-in-progress` is `true`, change it to `false`. - [ ] **Step 2: Make checkout non-recursive** Replace checkout step: ```yaml - name: Checkout repository uses: actions/checkout@v4 with: submodules: recursive ``` with: ```yaml - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 1 submodules: false ``` - [ ] **Step 3: Add deploy context log** At start of `Deploy with Docker Compose on VPS` run script, after `set -euo pipefail`, add: ```bash echo "Deploy event: ${{ github.event_name }}" echo "Deploy ref: ${{ github.ref }}" echo "Deploy sha: ${{ github.sha }}" ``` - [ ] **Step 4: Run YAML syntax check** Run same command from Task 1 Step 3. Expected both workflow files print `OK`. - [ ] **Step 5: Commit** ```bash git add .github/workflows/deploy-docker.yml git commit -m "ci: avoid submodule checkout during deploy" ``` --- ### Task 5: Add GitHub Actions Dependabot updates **Files:** - Modify: `.github/dependabot.yml` - [ ] **Step 1: Add github-actions ecosystem** Append this update entry under `updates:`: ```yaml - package-ecosystem: 'github-actions' directory: '/' schedule: interval: weekly groups: github-actions: patterns: - '*' ``` Expected file shape: ```yaml version: 2 updates: - package-ecosystem: 'devcontainers' directory: '/' schedule: interval: weekly - package-ecosystem: 'github-actions' directory: '/' schedule: interval: weekly groups: github-actions: patterns: - '*' ``` - [ ] **Step 2: Run YAML syntax check** Run: ```bash python - <<'PY' from pathlib import Path import yaml paths = [Path('.github/dependabot.yml'), *Path('.github/workflows').glob('*.yml')] for path in paths: yaml.safe_load(path.read_text()) print(f'OK {path}') PY ``` Expected: ```text OK .github/dependabot.yml OK .github/workflows/deploy-docker.yml OK .github/workflows/docker-build-push.yml ``` - [ ] **Step 3: Commit** ```bash git add .github/dependabot.yml git commit -m "ci: enable github actions dependency updates" ``` --- ### Task 6: Final validation **Files:** - Validate: `.github/workflows/docker-build-push.yml` - Validate: `.github/workflows/deploy-docker.yml` - Validate: `.github/dependabot.yml` - [ ] **Step 1: Run YAML syntax check** Run: ```bash python - <<'PY' from pathlib import Path import yaml paths = [Path('.github/dependabot.yml'), *Path('.github/workflows').glob('*.yml')] for path in paths: yaml.safe_load(path.read_text()) print(f'OK {path}') PY ``` Expected all files print `OK`. - [ ] **Step 2: Check workflows recognized by GitHub CLI** Run: ```bash gh workflow list ``` Expected output includes: ```text Build and Push Docker Images Deploy Docker to VPS ``` - [ ] **Step 3: Inspect final diff** Run: ```bash git diff -- .github/workflows .github/dependabot.yml ``` Expected: - `docker-build-push.yml` has dispatch validation, `wait-submodule-ref`, job permissions, and manifest push retry. - `deploy-docker.yml` has non-recursive checkout and read-only permissions. - `dependabot.yml` has `github-actions` updates. - [ ] **Step 4: Commit any final validation fixes** If Step 1 or Step 2 required fixes, commit them: ```bash git add .github/workflows .github/dependabot.yml git commit -m "ci: finalize production workflow hardening" ``` If no fixes were needed, do not create an empty commit. x# React Direct Runtime and Images Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Serve the React SPA without nginx and remove frontend image-cache proxy calls so browser uses direct image/API URLs. **Architecture:** The React Docker image still builds with Bun/Vite, but runtime uses `vite preview` from Bun instead of nginx. `CachedImage` normalizes image URLs and renders them directly, keeping fallback/retry UI but removing `/proxy/image-cache` auditing. Traefik keeps routing `react-web:80`, so compose and dynamic routing stay stable. **Tech Stack:** Bun, Vite, React, TypeScript, Docker, Docker Compose, Traefik. --- ## Tasks ### Task 1: Switch React Runtime From nginx to Bun/Vite Preview Modify `infra/docker/react.Dockerfile` so runtime stage uses `oven/bun:1-alpine`, installs production deps, copies `/app/dist`, exposes 80, and runs `bunx vite preview --host 0.0.0.0 --port 80`. Verify nginx runtime/copy lines are gone and Vite preview command exists. ### Task 2: Remove Image Cache Proxy From CachedImage Modify `apps/react/src/components/ui/cached-image.tsx` to remove `API_BASE_URL` import, `/proxy/image-cache` POST, audit state/function, and auditing overlay. Keep direct normalized image URLs, retry behavior, and fallback image. ### Task 3: Verify Build and Config Run static checks for both tasks, `bun --cwd apps/react run build`, `docker build -f infra/docker/react.Dockerfile -t react-web:test .`, start test container on `18080:80`, curl root, clean container, and run `git diff --check`. ### Task 4: Commit and Push Commit changed files: `infra/docker/react.Dockerfile`, `apps/react/src/components/ui/cached-image.tsx`, `docs/superpowers/plans/2026-05-27-react-direct-runtime-and-images.md`. Push branch only after verification if user asks; do not push from worktree unless explicitly instructed. Dax340031Q02025052+J-L/J,MI-LMapmW_;\ߠdfnA~qIzQjqaVC>7S;.ۧSKdb[_YZS%O+rCVOJtcu SJH,(MMLW_}F,Íb%0`YIҢT$CvDOG;=k ?xti 1o^Nla3 wxp# Moonrepo Migration Design **Date:** 2026-05-24 **Status:** approved ## Context Ultimate Asepharyana Tech is a polyglot monorepo with 7 applications managed as git submodules: nextjs (React/Next.js), elysia (Bun/Elysia), solidjs (SolidStart), rust (Axum), rust-auth (Axum auth service), leptos (Leptos WASM), and 9router. Nix flakes handle system dependencies and Docker image builds. Docker Compose manages deployment. ## Problem - No centralized task orchestration — running build/lint/test across all apps is manual and error-prone - No dependency caching — builds are not incremental across apps - Inconsistent developer experience — each app has its own conventions, onboarding is slow ## Goal Adopt moonrepo for task orchestration, caching, and dependency graph management across all 7 apps while preserving the existing Nix build system, Docker Compose deployment, and git submodule structure. ## Architecture ### Directory Structure ``` ultimate-asepharyana.tech/ ├── .moon/ │ ├── workspace.yml │ ├── toolchain.yml │ └── tasks/ │ ├── typescript-build.yml │ ├── typescript-lint.yml │ ├── typescript-test.yml │ ├── rust-build.yml │ ├── rust-test.yml │ └── rust-lint.yml ├── apps/ │ ├── nextjs/moon.yml │ ├── elysia/moon.yml │ ├── solidjs/moon.yml │ ├── rust/moon.yml │ ├── rust-auth/moon.yml │ ├── leptos/moon.yml │ └── 9router/moon.yml ├── .moon/workspace.yml # unchanged — Nix build + deployment ├── flake.nix # unchanged ├── infra/ # unchanged — Docker Compose, Traefik, nginx └── scripts/ # unchanged ``` ### Tag Taxonomy | Tag | Projects | |-----|----------| | `lang:typescript` | nextjs, elysia, solidjs | | `lang:rust` | rust, rust-auth, leptos | | `type:frontend` | nextjs, solidjs, leptos | | `type:backend` | rust, elysia, rust-auth | | `type:router` | 9router | ### Toolchain - moonrepo manages Node 22, Bun, and TypeScript versions via `.moon/toolchain.yml` for consistent access across all TypeScript apps - Rust toolchain remains managed by Nix/devShell — moonrepo does not touch Rust installation - Nix devShell gains the moon CLI binary ### Project Dependencies - **nextjs** depends on `rust-auth` and `elysia` (frontend consumes both APIs) - **solidjs** depends on `elysia` and `rust-auth` - **leptos** depends on `rust` (CSR frontend consumes rust backend API) - **elysia**, **rust**, **rust-auth**, **9router** — no project dependencies ## Task Definitions ### Shared Tasks: TypeScript All TypeScript apps inherit from `.moon/tasks/typescript-*.yml`: | Task | Command | Inputs | Outputs | |------|---------|--------|---------| | `build` | `bun run build` | `src/**/*`, `tsconfig.json`, `package.json` | `.next`, `dist`, `.output` | | `lint` | `bun run lint` | `src/**/*`, `eslint.config.mjs`, `tsconfig.json` | — | | `typecheck` | `bun run check-types` | `src/**/*`, `tsconfig.json` | — | | `test` | `bun test` | `src/**/*`, `test/**/*` | — | | `e2e` | overridden per app | — | — | ### Shared Tasks: Rust All Rust apps inherit from `.moon/tasks/rust-*.yml`, using system tasks: | Task | Command | Inputs | Outputs | |------|---------|--------|---------| | `build` | `cargo build --release` | `src/**/*`, `Cargo.toml`, `Cargo.lock`, `build.rs` | `target/release/*` | | `test` | `cargo test` | `src/**/*`, `Cargo.toml`, `Cargo.lock`, `tests/**/*` | — | | `lint` | `cargo clippy -- -D warnings` | `src/**/*`, `Cargo.toml` | — | | `fmt-check` | `cargo fmt --check` | `src/**/*` | — | ### Implicit Dependencies Configured in `workspace.yml`: `lint` implicitly depends on `build` for TypeScript apps (typecheck path), and `build` propagates to dependents when source inputs change. ## Key Commands ```bash moon run :build # build all changed apps + dependents moon run :lint # lint all moon run :test # test all moon run --tag lang:rust :test # test Rust apps only moon run --affected :build # build only what changed moon query projects --tag lang:typescript # list TypeScript projects ``` ## What Does NOT Change - **Nix flakes** — system dependencies, Docker image builds, devShell remain as-is - **Docker Compose** — deployment continues through existing compose files in `infra/compose/` - **Git submodules** — all 7 app repos stay as submodules under `apps/` - **infra/** — Traefik and Docker Compose deployment remain under `infra/`; legacy Grafana/Prometheus/Alertmanager configs have been removed - **scripts/** — existing utility scripts unchanged ## Migration Steps (High-Level) 1. Install moonrepo CLI, create `.moon/` scaffolding 2. Create shared task definitions in `.moon/tasks/` 3. Configure `workspace.yml` with project list, tags, and dependency constraints 4. Configure `toolchain.yml` for Node 22 + Bun 5. Add `moon.yml` to each of the 7 app directories 6. Validate: `moon check`, `moon run :build`, `moon run :lint`, `moon run :test` 7. Add moon CLI to Nix devShell 8. Commit and document Dx5# PostgreSQL Migration Design **Date:** 2026-05-25 **Scope:** Migrate elysia (Drizzle ORM + MySQL) and rust (SeaORM + MySQL) apps to PostgreSQL **Approach:** Direct cutover (Approach B) **Connection String:** `postgresql://asephs:hunterz@100.108.1.124:5432/hub` --- ## Current State ### Elysia App - **ORM:** Drizzle ORM v0.45.2 - **Driver:** mysql2 v3.20.0 - **Schema Location:** `apps/elysia/src/db/lib/schema.ts` - **Tables:** users, accounts, sessions, roles, permissions, userRoles, and related junction tables - **Database File:** `apps/elysia/src/db/lib/database.ts` ### Rust App - **ORM:** SeaORM v1.1.19 - **Feature:** sqlx-mysql - **DB Setup:** `apps/rust/src/infra/db_setup.rs` - **Tables:** ImageCache (primary table managed by app) - **Config:** Environment-based connection string ### Apps NOT Migrating - 9router (uses SQLite runtime, excluded per requirements) - nextjs (frontend, minimal DB usage) - leptos, solidjs, rust-auth (frontends, no DB) --- ## Migration Steps ### Phase 1: Pre-Migration (Preparation) 1. **Backup MySQL** ```bash mysqldump -u -p > mysql_backup.sql ``` 2. **Convert MySQL dump to PostgreSQL** - Use `pgloader` or manual conversion for schema compatibility - Handle type conversions: - `INT` → `INTEGER` - `VARCHAR(n)` → `VARCHAR(n)` (PostgreSQL compatible) - `DATETIME` → `TIMESTAMP` - `AUTO_INCREMENT` → `SERIAL` or `BIGSERIAL` - Verify indexes and foreign keys convert correctly 3. **Test import into target PostgreSQL** ```bash psql postgresql://asephs:hunterz@100.108.1.124:5432/hub < converted.sql ``` 4. **Validate data integrity** - Row counts match MySQL - Indexes exist - Foreign key constraints enforced ### Phase 2: Code Updates #### Elysia App 1. **Update `apps/elysia/src/db/lib/database.ts`** - Replace `mysql2` import with `postgres` driver - Change Drizzle dialect from `drizzle-orm/mysql2` to `drizzle-orm/postgres` - Update connection string format 2. **Update `apps/elysia/src/db/lib/schema.ts`** - Replace `drizzle-orm/mysql-core` imports with `drizzle-orm/postgres-core` - Change `mysqlTable` to `pgTable` - Adjust column types if needed (e.g., `int` → `integer`) 3. **Update `apps/elysia/package.json`** - Replace `mysql2` with `pg` (PostgreSQL driver) - Keep `drizzle-orm` and `drizzle-kit` versions 4. **Update environment/config** - Change `DATABASE_URL` to PostgreSQL connection string #### Rust App 1. **Update `apps/rust/Cargo.toml`** - Replace `sqlx-mysql` feature with `sqlx-postgres` in sea-orm dependency - Add `postgres` feature if needed 2. **Update `apps/rust/src/infra/db_setup.rs`** - Change `DbBackend::MySql` check to `DbBackend::Postgres` - Adjust SQL syntax for PostgreSQL (e.g., index creation) - Update error code handling (PostgreSQL uses different error codes) 3. **Update config/environment** - Change `DATABASE_URL` to PostgreSQL connection string ### Phase 3: Cutover (Execution) 1. **Stop all apps** ```bash # Stop elysia # Stop rust app ``` 2. **Export MySQL data** ```bash mysqldump -u -p > final_backup.sql ``` 3. **Convert and import to PostgreSQL** ```bash # Convert dump # Import to PostgreSQL psql postgresql://asephs:hunterz@100.108.1.124:5432/hub < converted.sql ``` 4. **Deploy updated apps** - Deploy elysia with PostgreSQL driver - Deploy rust with PostgreSQL feature 5. **Verify connectivity** - Test database queries from both apps - Check auth flow (users table) - Verify session management ### Phase 4: Validation 1. **Smoke tests** - User login/logout - Session creation and retrieval - Role/permission queries - ImageCache operations (rust app) 2. **Data integrity checks** - Row counts match pre-migration - No orphaned foreign keys - Indexes performing as expected 3. **Performance baseline** - Compare query times MySQL vs PostgreSQL - Monitor connection pool usage ### Phase 5: Rollback Plan (if needed) 1. **Stop apps** 2. **Restore MySQL from backup** ```bash mysql -u -p < mysql_backup.sql ``` 3. **Revert connection strings in apps** 4. **Redeploy with MySQL drivers** 5. **Restart apps** --- ## Technical Details ### Elysia Driver Change **Before:** ```typescript import { drizzle } from 'drizzle-orm/mysql2' import { createPool } from 'mysql2/promise' ``` **After:** ```typescript import { drizzle } from 'drizzle-orm/postgres-js' import postgres from 'postgres' ``` ### Rust Feature Change **Before:** ```toml sea-orm = { version = "1.1.19", features = ["sqlx-mysql", ...] } ``` **After:** ```toml sea-orm = { version = "1.1.19", features = ["sqlx-postgres", ...] } ``` --- ## Risk Assessment | Risk | Mitigation | |------|-----------| | Data loss during migration | Full MySQL backup before cutover; test import first | | App downtime | Cutover during low-traffic window; rollback plan ready | | Connection string misconfiguration | Test connection before deploying apps | | Schema incompatibilities | Pre-test conversion; validate indexes/constraints | | Performance regression | Baseline MySQL performance; monitor PostgreSQL after cutover | --- ## Success Criteria - ✅ All data migrated to PostgreSQL (row counts match) - ✅ Elysia app connects and queries work - ✅ Rust app connects and queries work - ✅ Auth flow functional (login/logout) - ✅ No orphaned foreign keys - ✅ Indexes present and performant - ✅ Rollback plan tested and documented --- ## Timeline - **Pre-migration:** 30 min (backup, convert, test) - **Code updates:** 1-2 hours (driver changes, testing) - **Cutover:** 15-30 min (stop apps, migrate data, restart) - **Validation:** 30 min (smoke tests, data checks) - **Total:** ~3-4 hours (including buffer) ~|Š+iO{j@Dԉ88(.-1 W/zuO'7\jW(D g3g(R˪4Vױ<:*Vj%ZbdeO?U×>=< ;+lmxyRU(,-_zjURu.2%U(2r!:/ւR"=_DbEy{6(Q *$L¨#Xт" GiºQPmULUe͈^ - Agʞ *]MLUFF Q29e^ZUiȪDPFPDj$t^JNaTG>\AJc5ȅ :OV/#:Um%eJR6YɺJaf3*Ua!FdE^&u& $h2@YFDb¸F).x:|~| Qt[&+oeq5 {A4#zDiiaBY̡`5Jd&`\U/8y;@O+ YImJ0wѥ+c r , Cl hr9HTK{ ?Ġe.PJat4/VQ+NJq\)Y9v6& Ks"P`峊}Wvt.h5'cx+ܔ"R1yS`*Q-S[j,h,< jIF_A_8urªgL@c;4-aq#3~¾Sv޴Uw[p6}%ۻժ}vLgMn`c)/Ϛ*TM`J=}ti z'yʒWדf79S+0K6R 92&a#䝞y=͠St+ ;~:ޫ*/Xo2a3VqOd[ ޲qmy:S^?ޠaRKUl2:C_s0O;a1JZ֛gbz0 6A(II#΅9ylsb?N T/ǯ=U _҂ojϴ2L/=.d9Wů4ն5m+v]aa1!VOb= ܆\lh?׼ UbW: Fq썶ц>l:,m4e[cC6.5cK.m#姕~y4|%֩{u@x=pQs~ jD7=}CUUx\ukɕ,ΓYL~,ͨ?YEQX4Sss 57oe29br0G΢ԤOdx 40000 mysql϶}t}Poteman-teman adakah info magang sebagai admin disekitaran mendalo

', 0, 1, 66, '2026-01-31 05:46:15', '2026-02-28 01:12:31'), (2, 1, 'Isi kuesioner ', '

Silahkan isi kuesioner tahunan kalian

', 0, 0, 42, '2026-01-31 06:11:51', '2026-02-28 01:12:58'), (3, 1, 'Info Pengambilan Ijazah', '

Yang posisi lagi di jambi, kalo mau ambil ijazah tunggu masuk kuliah tanggal 22

note: bawa kelengkapan berkas

', 1, 0, 10, '2026-02-01 03:22:35', '2026-02-28 01:12:13'); -- -------------------------------------------------------- -- -- Table structure for table `imports` -- CREATE TABLE `imports` ( `id` bigint UNSIGNED NOT NULL, `completed_at` timestamp NULL DEFAULT NULL, `file_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `file_path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `importer` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `processed_rows` int UNSIGNED NOT NULL DEFAULT '0', `total_rows` int UNSIGNED NOT NULL, `successful_rows` int UNSIGNED NOT NULL DEFAULT '0', `user_id` bigint UNSIGNED NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `imports` -- INSERT INTO `imports` (`id`, `completed_at`, `file_name`, `file_path`, `importer`, `processed_rows`, `total_rows`, `successful_rows`, `user_id`, `created_at`, `updated_at`) VALUES (1, '2025-12-28 14:25:08', 'alumni_import.csv', 'D:\\laragon\\www\\sisfor_alumni2\\filament-starter\\storage\\app/private\\livewire-tmp/cWfV2xhlYy2Rxr9PHGGeXoHjYZ0VLH-metaYWx1bW5pX2ltcG9ydC5jc3Y=-.csv', 'App\\Filament\\Imports\\AlumniImporter', 10, 10, 10, 1, '2025-12-28 14:25:02', '2025-12-28 14:25:08'), (2, '2026-01-02 22:24:17', 'alumni_import.csv', 'D:\\laragon\\www\\sisfor_alumni2\\filament-starter\\storage\\app/private\\livewire-tmp/Qw3Se9MhdU3K7qQjEknAkuRtbZPM75-metaYWx1bW5pX2ltcG9ydC5jc3Y=-.csv', 'App\\Filament\\Imports\\AlumniImporter', 10, 10, 10, 1, '2026-01-02 22:24:08', '2026-01-02 22:24:17'), (5, '2026-01-13 03:06:34', 'template_import_alumni.csv', 'D:\\laragon\\www\\sisfor_alumni2\\filament-starter\\storage\\app/private\\livewire-tmp/q03r9qdRsjBSWJSeLmTidKfSoxeXSc-metadGVtcGxhdGVfaW1wb3J0X2FsdW1uaS5jc3Y=-.csv', 'App\\Filament\\Imports\\AlumniImporter', 5, 5, 5, 1, '2026-01-13 03:06:29', '2026-01-13 03:06:34'), (7, '2026-02-27 21:36:09', 'test1.csv', 'D:\\laragon\\www\\sisfor_alumni2\\filament-starter\\storage\\app/private\\livewire-tmp/a6mIDStEO7yGVnbdW4Nq5PGkARAMZL-metadGVzdDEuY3N2-.csv', 'App\\Filament\\Imports\\AlumniImporter', 5, 5, 5, 1, '2026-02-27 21:36:02', '2026-02-27 21:36:09'); -- -------------------------------------------------------- -- -- Table structure for table `internships` -- CREATE TABLE `internships` ( `id` bigint UNSIGNED NOT NULL, `user_id` bigint UNSIGNED NOT NULL, `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `company` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `location` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `description` text COLLATE utf8mb4_unicode_ci NOT NULL, `requirements` text COLLATE utf8mb4_unicode_ci, `duration` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `deadline` date DEFAULT NULL, `contact_info` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `internships` -- INSERT INTO `internships` (`id`, `user_id`, `title`, `company`, `location`, `description`, `requirements`, `duration`, `deadline`, `contact_info`, `created_at`, `updated_at`) VALUES (1, 18, 'Magang Web Developer', 'PT Teknologi Maju Bersama', 'Yogyakarta, DI Yogyakarta', '

 PT Teknologi Maju Bersama membuka program magang Web Developer bagi fresh graduate yang ingin mengembangkan kemampuan dalam pengembangan aplikasi berbasis web. Peserta magang akan terlibat langsung dalam proyek pengembangan internal perusahaan. 

', '
  • Mahasiswa aktif atau fresh graduate jurusan Sistem Informasi / Teknik Informatika
  • Menguasai dasar HTML, CSS, dan JavaScript
  • Memahami framework Laravel menjadi nilai tambah
  • Bersedia bekerja secara tim dan mengikuti jadwal magang
', '6 bulan', '2026-02-05', 'internship@teknologimaju.co.id', '2026-01-02 23:13:14', '2026-01-02 23:13:14'); -- -------------------------------------------------------- -- -- Table structure for table `jobs` -- CREATE TABLE `jobs` ( `id` bigint UNSIGNED NOT NULL, `queue` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, `attempts` tinyint UNSIGNED NOT NULL, `reserved_at` int UNSIGNED DEFAULT NULL, `available_at` int UNSIGNED NOT NULL, `created_at` int UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -------------------------------------------------------- -- -- Table structure for table `job_batches` -- CREATE TABLE `job_batches` ( `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `total_jobs` int NOT NULL, `pending_jobs` int NOT NULL, `failed_jobs` int NOT NULL, `failed_job_ids` longtext COLLATE utf8mb4_unicode_ci NOT NULL, `options` mediumtext COLLATE utf8mb4_unicode_ci, `cancelled_at` int DEFAULT NULL, `created_at` int NOT NULL, `finished_at` int DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `job_batches` -- INSERT INTO `job_batches` (`id`, `name`, `total_jobs`, `pending_jobs`, `failed_jobs`, `failed_job_ids`, `options`, `cancelled_at`, `created_at`, `finished_at`) VALUES ('a0b40b37-4a90-4670-a51d-f6fd8076b373', '', 1, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:3952:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:4:{s:9:\"columnMap\";a:17:{s:3:\"nim\";s:3:\"nim\";s:8:\"username\";s:8:\"username\";s:11:\"birth_place\";s:11:\"birth_place\";s:10:\"birth_date\";s:10:\"birth_date\";s:6:\"gender\";s:6:\"gender\";s:7:\"address\";s:7:\"address\";s:12:\"phone_number\";s:12:\"phone_number\";s:5:\"email\";s:5:\"email\";s:3:\"gpa\";s:3:\"gpa\";s:7:\"faculty\";s:7:\"faculty\";s:5:\"major\";s:5:\"major\";s:10:\"entry_year\";s:10:\"entry_year\";s:15:\"graduation_year\";s:15:\"graduation_year\";s:6:\"status\";s:6:\"status\";s:12:\"job_position\";s:12:\"job_position\";s:12:\"company_name\";s:12:\"company_name\";s:4:\"foto\";s:4:\"foto\";}s:6:\"import\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Imports\\Models\\Import\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:13:\"jobConnection\";N;s:7:\"options\";a:0:{}}s:8:\"function\";s:2925:\"function () use ($columnMap, $import, $jobConnection, $options) {\n $import->touch(\'completed_at\');\n\n event(new \\Filament\\Actions\\Imports\\Events\\ImportCompleted($import, $columnMap, $options));\n\n if (! $import->user instanceof \\Illuminate\\Contracts\\Auth\\Authenticatable) {\n return;\n }\n\n $failedRowsCount = $import->getFailedRowsCount();\n\n \\Filament\\Notifications\\Notification::make()\n ->title($import->importer::getCompletedNotificationTitle($import))\n ->body($import->importer::getCompletedNotificationBody($import))\n ->when(\n ! $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->success(),\n )\n ->when(\n $failedRowsCount && ($failedRowsCount < $import->total_rows),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->warning(),\n )\n ->when(\n $failedRowsCount === $import->total_rows,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->danger(),\n )\n ->when(\n $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->actions([\n \\Filament\\Notifications\\Actions\\Action::make(\'downloadFailedRowsCsv\')\n ->label(trans_choice(\'filament-actions::import.notifications.completed.actions.download_failed_rows_csv.label\', $failedRowsCount, [\n \'count\' => \\Illuminate\\Support\\Number::format($failedRowsCount),\n ]))\n ->color(\'danger\')\n ->url(route(\'filament.imports.failed-rows.download\', [\'import\' => $import], absolute: false), shouldOpenInNewTab: true)\n ->markAsRead(),\n ]),\n )\n ->when(\n ($jobConnection === \'sync\') ||\n (blank($jobConnection) && (config(\'queue.default\') === \'sync\')),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification\n ->persistent()\n ->send(),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->sendToDatabase($import->user, isEventDispatched: true),\n );\n }\";s:5:\"scope\";s:36:\"Filament\\Tables\\Actions\\ImportAction\";s:4:\"this\";N;s:4:\"self\";s:32:\"0000000000000e0e0000000000000000\";}\";s:4:\"hash\";s:44:\"Il55kOM50sNFDkx0J1btTaCHBmZXRBPm1BERwLmAvMg=\";}}}}', NULL, 1766951427, 1766951432), ('a0b40b6c-e64b-4a5c-bed9-73d2ff339213', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:7132:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:35:\"App\\Filament\\Exports\\AlumniExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-28 19:51:01\";s:10:\"created_at\";s:19:\"2025-12-28 19:51:01\";s:2:\"id\";i:1;s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-28 19:51:01\";s:10:\"created_at\";s:19:\"2025-12-28 19:51:01\";s:2:\"id\";i:1;s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:10:\"\0*\0changes\";a:1:{s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:11:\"\0*\0previous\";a:0:{}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:18:{s:7:\"user_id\";s:7:\"User id\";s:3:\"nim\";s:3:\"Nim\";s:8:\"username\";s:8:\"Username\";s:11:\"birth_place\";s:11:\"Birth place\";s:10:\"birth_date\";s:10:\"Birth date\";s:6:\"gender\";s:6:\"Gender\";s:7:\"address\";s:7:\"Address\";s:12:\"phone_number\";s:12:\"Phone number\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"Gpa\";s:7:\"faculty\";s:7:\"Faculty\";s:5:\"major\";s:5:\"Major\";s:10:\"entry_year\";s:10:\"Entry year\";s:15:\"graduation_year\";s:15:\"Graduation year\";s:6:\"status\";s:6:\"Status\";s:12:\"job_position\";s:12:\"Job position\";s:12:\"company_name\";s:12:\"Company name\";s:4:\"foto\";s:4:\"Foto\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:18:{s:7:\"user_id\";s:7:\"User id\";s:3:\"nim\";s:3:\"Nim\";s:8:\"username\";s:8:\"Username\";s:11:\"birth_place\";s:11:\"Birth place\";s:10:\"birth_date\";s:10:\"Birth date\";s:6:\"gender\";s:6:\"Gender\";s:7:\"address\";s:7:\"Address\";s:12:\"phone_number\";s:12:\"Phone number\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"Gpa\";s:7:\"faculty\";s:7:\"Faculty\";s:5:\"major\";s:5:\"Major\";s:10:\"entry_year\";s:10:\"Entry year\";s:15:\"graduation_year\";s:15:\"Graduation year\";s:6:\"status\";s:6:\"Status\";s:12:\"job_position\";s:12:\"Job position\";s:12:\"company_name\";s:12:\"Company name\";s:4:\"foto\";s:4:\"Foto\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:3217:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:35:\"App\\Filament\\Exports\\AlumniExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-28 19:51:01\";s:10:\"created_at\";s:19:\"2025-12-28 19:51:01\";s:2:\"id\";i:1;s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-28 19:51:01\";s:10:\"created_at\";s:19:\"2025-12-28 19:51:01\";s:2:\"id\";i:1;s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:10:\"\0*\0changes\";a:1:{s:9:\"file_name\";s:16:\"export-1-alumnis\";}s:11:\"\0*\0previous\";a:0:{}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:18:{s:7:\"user_id\";s:7:\"User id\";s:3:\"nim\";s:3:\"Nim\";s:8:\"username\";s:8:\"Username\";s:11:\"birth_place\";s:11:\"Birth place\";s:10:\"birth_date\";s:10:\"Birth date\";s:6:\"gender\";s:6:\"Gender\";s:7:\"address\";s:7:\"Address\";s:12:\"phone_number\";s:12:\"Phone number\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"Gpa\";s:7:\"faculty\";s:7:\"Faculty\";s:5:\"major\";s:5:\"Major\";s:10:\"entry_year\";s:10:\"Entry year\";s:15:\"graduation_year\";s:15:\"Graduation year\";s:6:\"status\";s:6:\"Status\";s:12:\"job_position\";s:12:\"Job position\";s:12:\"company_name\";s:12:\"Company name\";s:4:\"foto\";s:4:\"Foto\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:18:{s:7:\"user_id\";s:7:\"User id\";s:3:\"nim\";s:3:\"Nim\";s:8:\"username\";s:8:\"Username\";s:11:\"birth_place\";s:11:\"Birth place\";s:10:\"birth_date\";s:10:\"Birth date\";s:6:\"gender\";s:6:\"Gender\";s:7:\"address\";s:7:\"Address\";s:12:\"phone_number\";s:12:\"Phone number\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"Gpa\";s:7:\"faculty\";s:7:\"Faculty\";s:5:\"major\";s:5:\"Major\";s:10:\"entry_year\";s:10:\"Entry year\";s:15:\"graduation_year\";s:15:\"Graduation year\";s:6:\"status\";s:6:\"Status\";s:12:\"job_position\";s:12:\"Job position\";s:12:\"company_name\";s:12:\"Company name\";s:4:\"foto\";s:4:\"Foto\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000009740000000000000000\";}\";s:4:\"hash\";s:44:\"pqKSC78MefRaewEgLAWwiqS7IqmCa0ZSeZu8cYc6PjU=\";}}}}', NULL, 1766951462, 1766951462), ('a0b42d0a-679b-4f32-a8b2-105969130d4c', '', 1, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:3952:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:4:{s:9:\"columnMap\";a:17:{s:3:\"nim\";s:3:\"nim\";s:8:\"username\";s:8:\"username\";s:11:\"birth_place\";s:11:\"birth_place\";s:10:\"birth_date\";s:10:\"birth_date\";s:6:\"gender\";s:6:\"gender\";s:7:\"address\";s:7:\"address\";s:12:\"phone_number\";s:12:\"phone_number\";s:5:\"email\";s:5:\"email\";s:3:\"gpa\";s:3:\"gpa\";s:7:\"faculty\";s:7:\"faculty\";s:5:\"major\";s:5:\"major\";s:10:\"entry_year\";s:10:\"entry_year\";s:15:\"graduation_year\";s:15:\"graduation_year\";s:6:\"status\";s:6:\"status\";s:12:\"job_position\";s:12:\"job_position\";s:12:\"company_name\";s:12:\"company_name\";s:4:\"foto\";s:4:\"foto\";}s:6:\"import\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Imports\\Models\\Import\";s:2:\"id\";i:1;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:13:\"jobConnection\";N;s:7:\"options\";a:0:{}}s:8:\"function\";s:2925:\"function () use ($columnMap, $import, $jobConnection, $options) {\n $import->touch(\'completed_at\');\n\n event(new \\Filament\\Actions\\Imports\\Events\\ImportCompleted($import, $columnMap, $options));\n\n if (! $import->user instanceof \\Illuminate\\Contracts\\Auth\\Authenticatable) {\n return;\n }\n\n $failedRowsCount = $import->getFailedRowsCount();\n\n \\Filament\\Notifications\\Notification::make()\n ->title($import->importer::getCompletedNotificationTitle($import))\n ->body($import->importer::getCompletedNotificationBody($import))\n ->when(\n ! $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->success(),\n )\n ->when(\n $failedRowsCount && ($failedRowsCount < $import->total_rows),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->warning(),\n )\n ->when(\n $failedRowsCount === $import->total_rows,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->danger(),\n )\n ->when(\n $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->actions([\n \\Filament\\Notifications\\Actions\\Action::make(\'downloadFailedRowsCsv\')\n ->label(trans_choice(\'filament-actions::import.notifications.completed.actions.download_failed_rows_csv.label\', $failedRowsCount, [\n \'count\' => \\Illuminate\\Support\\Number::format($failedRowsCount),\n ]))\n ->color(\'danger\')\n ->url(route(\'filament.imports.failed-rows.download\', [\'import\' => $import], absolute: false), shouldOpenInNewTab: true)\n ->markAsRead(),\n ]),\n )\n ->when(\n ($jobConnection === \'sync\') ||\n (blank($jobConnection) && (config(\'queue.default\') === \'sync\')),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification\n ->persistent()\n ->send(),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->sendToDatabase($import->user, isEventDispatched: true),\n );\n }\";s:5:\"scope\";s:36:\"Filament\\Tables\\Actions\\ImportAction\";s:4:\"this\";N;s:4:\"self\";s:32:\"0000000000000e0e0000000000000000\";}\";s:4:\"hash\";s:44:\"Il55kOM50sNFDkx0J1btTaCHBmZXRBPm1BERwLmAvMg=\";}}}}', NULL, 1766957102, 1766957107), ('a0b6c30f-c73e-47c8-98e4-1902f8eafaa8', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:6182:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:2;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:10:\"created_at\";s:19:\"2025-12-30 04:16:05\";s:2:\"id\";i:2;s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:2;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:10:\"created_at\";s:19:\"2025-12-30 04:16:05\";s:2:\"id\";i:2;s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2025-12-30 04:16:05\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:2;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:2742:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:2;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:10:\"created_at\";s:19:\"2025-12-30 04:16:05\";s:2:\"id\";i:2;s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:2;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:10:\"created_at\";s:19:\"2025-12-30 04:16:05\";s:2:\"id\";i:2;s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2025-12-30 04:16:06\";s:9:\"file_name\";s:32:\"export-2-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2025-12-30 04:16:05\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:2;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000008fd0000000000000000\";}\";s:4:\"hash\";s:44:\"LYnbg9f8eVk3HQiI2EPE64SkSGp8Ss/aI1Ho8geoFDI=\";}}}}', NULL, 1767068170, 1767068171), ('a0bee752-6f7c-4ad8-a672-301fa493da46', '', 1, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:3952:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:4:{s:9:\"columnMap\";a:17:{s:3:\"nim\";s:3:\"nim\";s:8:\"username\";s:8:\"username\";s:11:\"birth_place\";s:11:\"birth_place\";s:10:\"birth_date\";s:10:\"birth_date\";s:6:\"gender\";s:6:\"gender\";s:7:\"address\";s:7:\"address\";s:12:\"phone_number\";s:12:\"phone_number\";s:5:\"email\";s:5:\"email\";s:3:\"gpa\";s:3:\"gpa\";s:7:\"faculty\";s:7:\"faculty\";s:5:\"major\";s:5:\"major\";s:10:\"entry_year\";s:10:\"entry_year\";s:15:\"graduation_year\";s:15:\"graduation_year\";s:6:\"status\";s:6:\"status\";s:12:\"job_position\";s:12:\"job_position\";s:12:\"company_name\";s:12:\"company_name\";s:4:\"foto\";s:4:\"foto\";}s:6:\"import\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Imports\\Models\\Import\";s:2:\"id\";i:2;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:13:\"jobConnection\";N;s:7:\"options\";a:0:{}}s:8:\"function\";s:2925:\"function () use ($columnMap, $import, $jobConnection, $options) {\n $import->touch(\'completed_at\');\n\n event(new \\Filament\\Actions\\Imports\\Events\\ImportCompleted($import, $columnMap, $options));\n\n if (! $import->user instanceof \\Illuminate\\Contracts\\Auth\\Authenticatable) {\n return;\n }\n\n $failedRowsCount = $import->getFailedRowsCount();\n\n \\Filament\\Notifications\\Notification::make()\n ->title($import->importer::getCompletedNotificationTitle($import))\n ->body($import->importer::getCompletedNotificationBody($import))\n ->when(\n ! $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->success(),\n )\n ->when(\n $failedRowsCount && ($failedRowsCount < $import->total_rows),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->warning(),\n )\n ->when(\n $failedRowsCount === $import->total_rows,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->danger(),\n )\n ->when(\n $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->actions([\n \\Filament\\Notifications\\Actions\\Action::make(\'downloadFailedRowsCsv\')\n ->label(trans_choice(\'filament-actions::import.notifications.completed.actions.download_failed_rows_csv.label\', $failedRowsCount, [\n \'count\' => \\Illuminate\\Support\\Number::format($failedRowsCount),\n ]))\n ->color(\'danger\')\n ->url(route(\'filament.imports.failed-rows.download\', [\'import\' => $import], absolute: false), shouldOpenInNewTab: true)\n ->markAsRead(),\n ]),\n )\n ->when(\n ($jobConnection === \'sync\') ||\n (blank($jobConnection) && (config(\'queue.default\') === \'sync\')),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification\n ->persistent()\n ->send(),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->sendToDatabase($import->user, isEventDispatched: true),\n );\n }\";s:5:\"scope\";s:36:\"Filament\\Tables\\Actions\\ImportAction\";s:4:\"this\";N;s:4:\"self\";s:32:\"0000000000000e0e0000000000000000\";}\";s:4:\"hash\";s:44:\"GCZAyQdkaHJYMqjhOd28P1Xgsw5xrUOo6jYQ3ta+7s8=\";}}}}', NULL, 1767417852, 1767417857), ('a0d35e04-f74d-41a6-aef0-e8e37eafc79e', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:7984:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:35:\"App\\Filament\\Exports\\AlumniExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:13;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:10:\"created_at\";s:19:\"2026-01-13 09:32:33\";s:2:\"id\";i:3;s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:13;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:10:\"created_at\";s:19:\"2026-01-13 09:32:33\";s:2:\"id\";i:3;s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-01-13 09:32:33\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:21:{s:2:\"id\";s:2:\"ID\";s:3:\"nim\";s:3:\"NIM\";s:8:\"username\";s:11:\"Nama Alumni\";s:11:\"birth_place\";s:12:\"Tempat Lahir\";s:10:\"birth_date\";s:13:\"Tanggal Lahir\";s:6:\"gender\";s:13:\"Jenis Kelamin\";s:7:\"address\";s:6:\"Alamat\";s:12:\"phone_number\";s:5:\"No HP\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"IPK\";s:7:\"faculty\";s:8:\"Fakultas\";s:5:\"major\";s:13:\"Program Studi\";s:10:\"entry_year\";s:11:\"Tahun Masuk\";s:15:\"graduation_year\";s:11:\"Tahun Lulus\";s:6:\"status\";s:6:\"Status\";s:14:\"category_field\";s:15:\"Kategori Bidang\";s:14:\"waiting_period\";s:11:\"Masa Tunggu\";s:12:\"job_position\";s:16:\"Posisi Pekerjaan\";s:12:\"company_name\";s:24:\"Nama Instansi/Perusahaan\";s:10:\"created_at\";s:14:\"Tanggal dibuat\";s:10:\"updated_at\";s:18:\"Tanggal diperbarui\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:3;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:21:{s:2:\"id\";s:2:\"ID\";s:3:\"nim\";s:3:\"NIM\";s:8:\"username\";s:11:\"Nama Alumni\";s:11:\"birth_place\";s:12:\"Tempat Lahir\";s:10:\"birth_date\";s:13:\"Tanggal Lahir\";s:6:\"gender\";s:13:\"Jenis Kelamin\";s:7:\"address\";s:6:\"Alamat\";s:12:\"phone_number\";s:5:\"No HP\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"IPK\";s:7:\"faculty\";s:8:\"Fakultas\";s:5:\"major\";s:13:\"Program Studi\";s:10:\"entry_year\";s:11:\"Tahun Masuk\";s:15:\"graduation_year\";s:11:\"Tahun Lulus\";s:6:\"status\";s:6:\"Status\";s:14:\"category_field\";s:15:\"Kategori Bidang\";s:14:\"waiting_period\";s:11:\"Masa Tunggu\";s:12:\"job_position\";s:16:\"Posisi Pekerjaan\";s:12:\"company_name\";s:24:\"Nama Instansi/Perusahaan\";s:10:\"created_at\";s:14:\"Tanggal dibuat\";s:10:\"updated_at\";s:18:\"Tanggal diperbarui\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:3643:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:35:\"App\\Filament\\Exports\\AlumniExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:13;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:10:\"created_at\";s:19:\"2026-01-13 09:32:33\";s:2:\"id\";i:3;s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:35:\"App\\Filament\\Exports\\AlumniExporter\";s:10:\"total_rows\";i:13;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:10:\"created_at\";s:19:\"2026-01-13 09:32:33\";s:2:\"id\";i:3;s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-01-13 09:32:35\";s:9:\"file_name\";s:16:\"export-3-alumnis\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-01-13 09:32:33\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:21:{s:2:\"id\";s:2:\"ID\";s:3:\"nim\";s:3:\"NIM\";s:8:\"username\";s:11:\"Nama Alumni\";s:11:\"birth_place\";s:12:\"Tempat Lahir\";s:10:\"birth_date\";s:13:\"Tanggal Lahir\";s:6:\"gender\";s:13:\"Jenis Kelamin\";s:7:\"address\";s:6:\"Alamat\";s:12:\"phone_number\";s:5:\"No HP\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"IPK\";s:7:\"faculty\";s:8:\"Fakultas\";s:5:\"major\";s:13:\"Program Studi\";s:10:\"entry_year\";s:11:\"Tahun Masuk\";s:15:\"graduation_year\";s:11:\"Tahun Lulus\";s:6:\"status\";s:6:\"Status\";s:14:\"category_field\";s:15:\"Kategori Bidang\";s:14:\"waiting_period\";s:11:\"Masa Tunggu\";s:12:\"job_position\";s:16:\"Posisi Pekerjaan\";s:12:\"company_name\";s:24:\"Nama Instansi/Perusahaan\";s:10:\"created_at\";s:14:\"Tanggal dibuat\";s:10:\"updated_at\";s:18:\"Tanggal diperbarui\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:3;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:21:{s:2:\"id\";s:2:\"ID\";s:3:\"nim\";s:3:\"NIM\";s:8:\"username\";s:11:\"Nama Alumni\";s:11:\"birth_place\";s:12:\"Tempat Lahir\";s:10:\"birth_date\";s:13:\"Tanggal Lahir\";s:6:\"gender\";s:13:\"Jenis Kelamin\";s:7:\"address\";s:6:\"Alamat\";s:12:\"phone_number\";s:5:\"No HP\";s:5:\"email\";s:5:\"Email\";s:3:\"gpa\";s:3:\"IPK\";s:7:\"faculty\";s:8:\"Fakultas\";s:5:\"major\";s:13:\"Program Studi\";s:10:\"entry_year\";s:11:\"Tahun Masuk\";s:15:\"graduation_year\";s:11:\"Tahun Lulus\";s:6:\"status\";s:6:\"Status\";s:14:\"category_field\";s:15:\"Kategori Bidang\";s:14:\"waiting_period\";s:11:\"Masa Tunggu\";s:12:\"job_position\";s:16:\"Posisi Pekerjaan\";s:12:\"company_name\";s:24:\"Nama Instansi/Perusahaan\";s:10:\"created_at\";s:14:\"Tanggal dibuat\";s:10:\"updated_at\";s:18:\"Tanggal diperbarui\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000008fd0000000000000000\";}\";s:4:\"hash\";s:44:\"eMaUhkuyXG6iehMNkJX6EIaLtEgZoE5Cwa2qF4TWSfM=\";}}}}', NULL, 1768296759, 1768296760), ('a0d36a1f-1bef-439d-b045-3647f3b37b25', '', 1, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:4040:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:4:{s:9:\"columnMap\";a:19:{s:3:\"nim\";s:3:\"nim\";s:8:\"username\";s:8:\"username\";s:11:\"birth_place\";s:11:\"birth_place\";s:10:\"birth_date\";s:10:\"birth_date\";s:6:\"gender\";s:6:\"gender\";s:7:\"address\";s:7:\"address\";s:12:\"phone_number\";s:12:\"phone_number\";s:5:\"email\";s:5:\"email\";s:3:\"gpa\";s:3:\"gpa\";s:7:\"faculty\";s:7:\"faculty\";s:5:\"major\";s:5:\"major\";s:10:\"entry_year\";s:10:\"entry_year\";s:15:\"graduation_year\";s:15:\"graduation_year\";s:6:\"status\";s:6:\"status\";s:14:\"category_field\";s:14:\"category_field\";s:14:\"waiting_period\";s:14:\"waiting_period\";s:12:\"job_position\";s:12:\"job_position\";s:12:\"company_name\";s:12:\"company_name\";s:4:\"foto\";s:4:\"foto\";}s:6:\"import\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Imports\\Models\\Import\";s:2:\"id\";i:5;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:13:\"jobConnection\";N;s:7:\"options\";a:0:{}}s:8:\"function\";s:2925:\"function () use ($columnMap, $import, $jobConnection, $options) {\n $import->touch(\'completed_at\');\n\n event(new \\Filament\\Actions\\Imports\\Events\\ImportCompleted($import, $columnMap, $options));\n\n if (! $import->user instanceof \\Illuminate\\Contracts\\Auth\\Authenticatable) {\n return;\n }\n\n $failedRowsCount = $import->getFailedRowsCount();\n\n \\Filament\\Notifications\\Notification::make()\n ->title($import->importer::getCompletedNotificationTitle($import))\n ->body($import->importer::getCompletedNotificationBody($import))\n ->when(\n ! $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->success(),\n )\n ->when(\n $failedRowsCount && ($failedRowsCount < $import->total_rows),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->warning(),\n )\n ->when(\n $failedRowsCount === $import->total_rows,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->danger(),\n )\n ->when(\n $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->actions([\n \\Filament\\Notifications\\Actions\\Action::make(\'downloadFailedRowsCsv\')\n ->label(trans_choice(\'filament-actions::import.notifications.completed.actions.download_failed_rows_csv.label\', $failedRowsCount, [\n \'count\' => \\Illuminate\\Support\\Number::format($failedRowsCount),\n ]))\n ->color(\'danger\')\n ->url(route(\'filament.imports.failed-rows.download\', [\'import\' => $import], absolute: false), shouldOpenInNewTab: true)\n ->markAsRead(),\n ]),\n )\n ->when(\n ($jobConnection === \'sync\') ||\n (blank($jobConnection) && (config(\'queue.default\') === \'sync\')),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification\n ->persistent()\n ->send(),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->sendToDatabase($import->user, isEventDispatched: true),\n );\n }\";s:5:\"scope\";s:36:\"Filament\\Tables\\Actions\\ImportAction\";s:4:\"this\";N;s:4:\"self\";s:32:\"0000000000000ea30000000000000000\";}\";s:4:\"hash\";s:44:\"GW5zTMvFxTdGGeVixyQBmL8UQ2Z5B8pP4RkvrmLwlwg=\";}}}}', NULL, 1768298789, 1768298794); INSERT INTO `job_batches` (`id`, `name`, `total_jobs`, `pending_jobs`, `failed_jobs`, `failed_job_ids`, `options`, `cancelled_at`, `created_at`, `finished_at`) VALUES ('a0ef7ec8-8c61-4a5d-b019-79294f90db93', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:6006:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-27 09:07:22\";s:10:\"created_at\";s:19:\"2026-01-27 09:07:22\";s:2:\"id\";i:4;s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-27 09:07:22\";s:10:\"created_at\";s:19:\"2026-01-27 09:07:22\";s:2:\"id\";i:4;s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:10:\"\0*\0changes\";a:1:{s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:11:\"\0*\0previous\";a:0:{}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:4;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:2654:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-27 09:07:22\";s:10:\"created_at\";s:19:\"2026-01-27 09:07:22\";s:2:\"id\";i:4;s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:10;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-27 09:07:22\";s:10:\"created_at\";s:19:\"2026-01-27 09:07:22\";s:2:\"id\";i:4;s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:10:\"\0*\0changes\";a:1:{s:9:\"file_name\";s:32:\"export-4-questionnaire-responses\";}s:11:\"\0*\0previous\";a:0:{}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:4;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000009260000000000000000\";}\";s:4:\"hash\";s:44:\"71kZRCoXQupQTIZKNNfO0c89dX8YTVq8Sxk7a46ap2A=\";}}}}', NULL, 1769504847, 1769504847), ('a0f39b8e-ec88-46f2-84f1-7fee5144d044', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:6182:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:7;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:10:\"created_at\";s:19:\"2026-01-29 10:11:05\";s:2:\"id\";i:5;s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:7;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:10:\"created_at\";s:19:\"2026-01-29 10:11:05\";s:2:\"id\";i:5;s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-01-29 10:11:05\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:5;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:2742:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:7;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:10:\"created_at\";s:19:\"2026-01-29 10:11:05\";s:2:\"id\";i:5;s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:7;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:10:\"created_at\";s:19:\"2026-01-29 10:11:05\";s:2:\"id\";i:5;s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-01-29 10:11:06\";s:9:\"file_name\";s:32:\"export-5-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-01-29 10:11:05\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:5;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:6:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000009260000000000000000\";}\";s:4:\"hash\";s:44:\"I6qGVrctjDxayuzSurnIBrRG8ApwB6fGyFaEQnmp9Fg=\";}}}}', NULL, 1769681473, 1769681474), ('a0f9d38d-45c0-47a3-b613-419b978c68fe', '', 2, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:6646:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:1:{s:4:\"next\";O:46:\"Filament\\Actions\\Exports\\Jobs\\ExportCompletion\":7:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:1;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:10:\"created_at\";s:19:\"2026-02-01 12:22:39\";s:2:\"id\";i:6;s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:1;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:10:\"created_at\";s:19:\"2026-02-01 12:22:39\";s:2:\"id\";i:6;s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-02-01 12:22:39\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:9:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:11:\"total_point\";s:10:\"Total Poin\";s:16:\"point_percentage\";s:10:\"Persentase\";s:14:\"point_category\";s:8:\"Kategori\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:6;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:9:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:11:\"total_point\";s:10:\"Total Poin\";s:16:\"point_percentage\";s:10:\"Persentase\";s:14:\"point_category\";s:8:\"Kategori\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0formats\";a:2:{i:0;E:47:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Csv\";i:1;E:48:\"Filament\\Actions\\Exports\\Enums\\ExportFormat:Xlsx\";}s:10:\"\0*\0options\";a:0:{}s:7:\"chained\";a:1:{i:0;s:2974:\"O:44:\"Filament\\Actions\\Exports\\Jobs\\CreateXlsxFile\":4:{s:11:\"\0*\0exporter\";O:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\":3:{s:9:\"\0*\0export\";O:38:\"Filament\\Actions\\Exports\\Models\\Export\":33:{s:13:\"\0*\0connection\";s:5:\"mysql\";s:8:\"\0*\0table\";N;s:13:\"\0*\0primaryKey\";s:2:\"id\";s:10:\"\0*\0keyType\";s:3:\"int\";s:12:\"incrementing\";b:1;s:7:\"\0*\0with\";a:0:{}s:12:\"\0*\0withCount\";a:0:{}s:19:\"preventsLazyLoading\";b:0;s:10:\"\0*\0perPage\";i:15;s:6:\"exists\";b:1;s:18:\"wasRecentlyCreated\";b:1;s:28:\"\0*\0escapeWhenCastingToString\";b:0;s:13:\"\0*\0attributes\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:1;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:10:\"created_at\";s:19:\"2026-02-01 12:22:39\";s:2:\"id\";i:6;s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:11:\"\0*\0original\";a:8:{s:7:\"user_id\";i:1;s:8:\"exporter\";s:50:\"App\\Filament\\Exports\\QuestionnaireResponseExporter\";s:10:\"total_rows\";i:1;s:9:\"file_disk\";s:5:\"local\";s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:10:\"created_at\";s:19:\"2026-02-01 12:22:39\";s:2:\"id\";i:6;s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:10:\"\0*\0changes\";a:2:{s:10:\"updated_at\";s:19:\"2026-02-01 12:22:40\";s:9:\"file_name\";s:32:\"ekspor-6-questionnaire-responses\";}s:11:\"\0*\0previous\";a:1:{s:10:\"updated_at\";s:19:\"2026-02-01 12:22:39\";}s:8:\"\0*\0casts\";a:4:{s:12:\"completed_at\";s:9:\"timestamp\";s:14:\"processed_rows\";s:7:\"integer\";s:10:\"total_rows\";s:7:\"integer\";s:15:\"successful_rows\";s:7:\"integer\";}s:17:\"\0*\0classCastCache\";a:0:{}s:21:\"\0*\0attributeCastCache\";a:0:{}s:13:\"\0*\0dateFormat\";N;s:10:\"\0*\0appends\";a:0:{}s:19:\"\0*\0dispatchesEvents\";a:0:{}s:14:\"\0*\0observables\";a:0:{}s:12:\"\0*\0relations\";a:0:{}s:10:\"\0*\0touches\";a:0:{}s:27:\"\0*\0relationAutoloadCallback\";N;s:26:\"\0*\0relationAutoloadContext\";N;s:10:\"timestamps\";b:1;s:13:\"usesUniqueIds\";b:0;s:9:\"\0*\0hidden\";a:0:{}s:10:\"\0*\0visible\";a:0:{}s:11:\"\0*\0fillable\";a:0:{}s:10:\"\0*\0guarded\";a:0:{}}s:12:\"\0*\0columnMap\";a:9:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:11:\"total_point\";s:10:\"Total Poin\";s:16:\"point_percentage\";s:10:\"Persentase\";s:14:\"point_category\";s:8:\"Kategori\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}s:9:\"\0*\0export\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Exports\\Models\\Export\";s:2:\"id\";i:6;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:\"\0*\0columnMap\";a:9:{s:19:\"questionnaire.title\";s:9:\"Kuesioner\";s:9:\"user.name\";s:6:\"Alumni\";s:15:\"user.alumni.nim\";s:3:\"NIM\";s:17:\"user.alumni.major\";s:7:\"Jurusan\";s:7:\"answers\";s:17:\"Ringkasan Jawaban\";s:11:\"total_point\";s:10:\"Total Poin\";s:16:\"point_percentage\";s:10:\"Persentase\";s:14:\"point_category\";s:8:\"Kategori\";s:12:\"submitted_at\";s:14:\"Tanggal Submit\";}s:10:\"\0*\0options\";a:0:{}}\";}s:19:\"chainCatchCallbacks\";a:0:{}}}s:8:\"function\";s:266:\"function (\\Illuminate\\Bus\\Batch $batch) use ($next) {\n if (! $batch->cancelled()) {\n \\Illuminate\\Container\\Container::getInstance()->make(\\Illuminate\\Contracts\\Bus\\Dispatcher::class)->dispatch($next);\n }\n }\";s:5:\"scope\";s:27:\"Illuminate\\Bus\\ChainedBatch\";s:4:\"this\";N;s:4:\"self\";s:32:\"00000000000009360000000000000000\";}\";s:4:\"hash\";s:44:\"JkwpW1GemcJFNo8+DB1runfLgpqhc0OmIaN+AA/i1cI=\";}}}}', NULL, 1769948565, 1769948566), ('a12f7d37-1b1d-48be-afba-eeb5c33f232f', '', 1, 0, 0, '[]', 'a:2:{s:13:\"allowFailures\";b:1;s:7:\"finally\";a:1:{i:0;O:47:\"Laravel\\SerializableClosure\\SerializableClosure\":1:{s:12:\"serializable\";O:46:\"Laravel\\SerializableClosure\\Serializers\\Signed\":2:{s:12:\"serializable\";s:4040:\"O:46:\"Laravel\\SerializableClosure\\Serializers\\Native\":5:{s:3:\"use\";a:4:{s:9:\"columnMap\";a:19:{s:3:\"nim\";s:3:\"nim\";s:8:\"username\";s:8:\"username\";s:11:\"birth_place\";s:11:\"birth_place\";s:10:\"birth_date\";s:10:\"birth_date\";s:6:\"gender\";s:6:\"gender\";s:7:\"address\";s:7:\"address\";s:12:\"phone_number\";s:12:\"phone_number\";s:5:\"email\";s:5:\"email\";s:3:\"gpa\";s:3:\"gpa\";s:7:\"faculty\";s:7:\"faculty\";s:5:\"major\";s:5:\"major\";s:10:\"entry_year\";s:10:\"entry_year\";s:15:\"graduation_year\";s:15:\"graduation_year\";s:6:\"status\";s:6:\"status\";s:14:\"category_field\";s:14:\"category_field\";s:14:\"waiting_period\";s:14:\"waiting_period\";s:12:\"job_position\";s:12:\"job_position\";s:12:\"company_name\";s:12:\"company_name\";s:4:\"foto\";s:4:\"foto\";}s:6:\"import\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":5:{s:5:\"class\";s:38:\"Filament\\Actions\\Imports\\Models\\Import\";s:2:\"id\";i:7;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:13:\"jobConnection\";N;s:7:\"options\";a:0:{}}s:8:\"function\";s:2925:\"function () use ($columnMap, $import, $jobConnection, $options) {\n $import->touch(\'completed_at\');\n\n event(new \\Filament\\Actions\\Imports\\Events\\ImportCompleted($import, $columnMap, $options));\n\n if (! $import->user instanceof \\Illuminate\\Contracts\\Auth\\Authenticatable) {\n return;\n }\n\n $failedRowsCount = $import->getFailedRowsCount();\n\n \\Filament\\Notifications\\Notification::make()\n ->title($import->importer::getCompletedNotificationTitle($import))\n ->body($import->importer::getCompletedNotificationBody($import))\n ->when(\n ! $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->success(),\n )\n ->when(\n $failedRowsCount && ($failedRowsCount < $import->total_rows),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->warning(),\n )\n ->when(\n $failedRowsCount === $import->total_rows,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->danger(),\n )\n ->when(\n $failedRowsCount,\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->actions([\n \\Filament\\Notifications\\Actions\\Action::make(\'downloadFailedRowsCsv\')\n ->label(trans_choice(\'filament-actions::import.notifications.completed.actions.download_failed_rows_csv.label\', $failedRowsCount, [\n \'count\' => \\Illuminate\\Support\\Number::format($failedRowsCount),\n ]))\n ->color(\'danger\')\n ->url(route(\'filament.imports.failed-rows.download\', [\'import\' => $import], absolute: false), shouldOpenInNewTab: true)\n ->markAsRead(),\n ]),\n )\n ->when(\n ($jobConnection === \'sync\') ||\n (blank($jobConnection) && (config(\'queue.default\') === \'sync\')),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification\n ->persistent()\n ->send(),\n fn (\\Filament\\Notifications\\Notification $notification) => $notification->sendToDatabase($import->user, isEventDispatched: true),\n );\n }\";s:5:\"scope\";s:36:\"Filament\\Tables\\Actions\\ImportAction\";s:4:\"this\";N;s:4:\"self\";s:32:\"0000000000000ee00000000000000000\";}\";s:4:\"hash\";s:44:\"kimKbbWMUdhF8ZpjeuAEs3Uv23Hmwap8FBf6DnJnGtU=\";}}}}', NULL, 1772253363, 1772253369); -- -------------------------------------------------------- -- -- Table structure for table `job_opportunities` -- CREATE TABLE `job_opportunities` ( `id` bigint UNSIGNED NOT NULL, `user_id` bigint UNSIGNED NOT NULL, `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `company` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `location` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `description` text COLLATE utf8mb4_unicode_ci NOT NULL, `requirements` text COLLATE utf8mb4_unicode_ci, `salary_range` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `deadline` date DEFAULT NULL, `contact_info` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `job_opportunities` -- INSERT INTO `job_opportunities` (`id`, `user_id`, `title`, `company`, `location`, `description`, `requirements`, `salary_range`, `deadline`, `contact_info`, `created_at`, `updated_at`) VALUES (1, 1, 'Junior Web Developer', 'PT Digital Solusi Nusantara', 'Bandung, Jawa Barat', '

 PT Digital Solusi Nusantara membuka kesempatan bagi lulusan baru untuk bergabung sebagai Junior Web Developer. Posisi ini bertanggung jawab dalam pengembangan dan pemeliharaan aplikasi berbasis web menggunakan teknologi modern. 

', '
  • Lulusan D3/S1 Teknik Informatika atau Sistem Informasi
  • Menguasai dasar HTML, CSS, dan JavaScript
  • Familiar dengan framework Laravel atau React
  • Mampu bekerja dalam tim dan memiliki kemauan belajar tinggi
', 'Rp 5.000.000 – Rp 7.000.000 per bulan', '2026-01-10', 'hrd@digitalsolusi.co.id', '2025-12-28 13:12:36', '2025-12-28 13:12:36'), (3, 1, 'System Analyst Junior', 'PT Solusi Informatika Global', 'Jakarta Barat', '
 Perusahaan membuka posisi System Analyst Junior untuk membantu analisis kebutuhan sistem, pembuatan dokumentasi, dan koordinasi dengan tim developer dalam pengembangan aplikasi perusahaan. 
', '
  • Lulusan S1 Sistem Informasi
  • Memahami SDLC dan UML
  • Mampu membuat dokumen kebutuhan sistem
  • Memiliki kemampuan komunikasi yang baik
', 'Rp 5.000.000 – Rp 7.000.000 per bulan', '2026-03-19', 'recruitment@siginfo.co.id', '2026-01-18 03:39:09', '2026-01-18 03:39:09'), (4, 1, 'Junior Web Developer', 'PT Digital Solusi Nusantara', 'Bandung, Jawa Barat', '
 PT Digital Solusi Nusantara membuka kesempatan bagi lulusan baru untuk bergabung sebagai Junior Web Developer. Posisi ini bertanggung jawab dalam pengembangan dan pemeliharaan aplikasi berbasis web menggunakan teknologi modern. 
', '
  • Lulusan S1 Sistem Informasi
  • Menguasai dasar HTML, CSS, dan JavaScript
  • Familiar dengan framework Laravel atau React
  • Mampu bekerja dalam tim dan memiliki kemauan belajar tinggi
', 'Rp 8.000.000 – Rp 10.000.000 per bulan', '2026-04-03', '0812-3456-7890', '2026-01-18 03:42:37', '2026-01-18 03:42:37'); -- -------------------------------------------------------- -- -- Table structure for table `migrations` -- CREATE TABLE `migrations` ( `id` int UNSIGNED NOT NULL, `migration` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `batch` int NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `migrations` -- INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (33, '0001_01_01_000000_create_users_table', 1), (34, '0001_01_01_000001_create_cache_table', 1), (35, '0001_01_01_000002_create_jobs_table', 1), (36, '2025_12_12_042503_create_alumnis_table', 1), (37, '2025_12_23_034532_create_permission_tables', 1), (38, '2025_12_23_051722_create_questionnaires_table', 1), (39, '2025_12_23_074959_create_questionnaire_questions_table', 1), (40, '2025_12_23_075229_create_questionnaire_responses_table', 1), (41, '2025_12_23_075712_create_response_answers_table', 1), (42, '2025_12_23_151007_create_notifications_table', 1), (43, '2025_12_23_151222_create_imports_table', 1), (44, '2025_12_23_151223_create_exports_table', 1), (45, '2025_12_23_151224_create_failed_import_rows_table', 1), (46, '2025_12_24_081956_create_job_opportunities_table', 1), (47, '2025_12_24_082547_create_scholarships_table', 1), (48, '2025_12_24_083203_create_internships_table', 1), (50, '2026_01_11_084609_add_category_field_and_waiting_period_to_alumnis_table', 2), (51, '2026_01_31_111857_create_forum_topics_table', 3), (52, '2026_01_31_112014_create_forum_replies_table', 3), (53, '2026_02_01_111402_add_max_point_to_questionnaire_questions_table', 4), (54, '2026_02_01_111552_add_point_to_response_answers_table', 4); -- -------------------------------------------------------- -- -- Table structure for table `model_has_permissions` -- CREATE TABLE `model_has_permissions` ( `permission_id` bigint UNSIGNED NOT NULL, `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `model_id` bigint UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -------------------------------------------------------- -- -- Table structure for table `model_has_roles` -- CREATE TABLE `model_has_roles` ( `role_id` bigint UNSIGNED NOT NULL, `model_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `model_id` bigint UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `model_has_roles` -- INSERT INTO `model_has_roles` (`role_id`, `model_type`, `model_id`) VALUES (1, 'App\\Models\\User', 1), (2, 'App\\Models\\User', 12), (2, 'App\\Models\\User', 13), (2, 'App\\Models\\User', 14), (2, 'App\\Models\\User', 15), (2, 'App\\Models\\User', 16), (2, 'App\\Models\\User', 17), (2, 'App\\Models\\User', 18), (2, 'App\\Models\\User', 19), (2, 'App\\Models\\User', 20), (2, 'App\\Models\\User', 21), (2, 'App\\Models\\User', 22), (2, 'App\\Models\\User', 23), (2, 'App\\Models\\User', 24), (2, 'App\\Models\\User', 50), (2, 'App\\Models\\User', 68), (2, 'App\\Models\\User', 69), (2, 'App\\Models\\User', 70), (2, 'App\\Models\\User', 71), (2, 'App\\Models\\User', 72), (2, 'App\\Models\\User', 77), (2, 'App\\Models\\User', 78), (2, 'App\\Models\\User', 79), (2, 'App\\Models\\User', 80), (2, 'App\\Models\\User', 81), (2, 'App\\Models\\User', 82), (2, 'App\\Models\\User', 83), (2, 'App\\Models\\User', 84), (2, 'App\\Models\\User', 85); -- -------------------------------------------------------- -- -- Table structure for table `notifications` -- CREATE TABLE `notifications` ( `id` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `notifiable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `notifiable_id` bigint UNSIGNED NOT NULL, `data` text COLLATE utf8mb4_unicode_ci NOT NULL, `read_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `notifications` -- INSERT INTO `notifications` (`id`, `type`, `notifiable_type`, `notifiable_id`, `data`, `read_at`, `created_at`, `updated_at`) VALUES ('00fa1033-a30d-43ab-ae0a-3e1ddac62529', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Unduh .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/6\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Unduh .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/6\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your questionnaire response export has completed and 1 row exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Ekspor selesai\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', '2026-02-01 05:23:14', '2026-02-01 05:22:47', '2026-02-01 05:23:14'), ('0b9c790f-376c-4b81-b5f7-1165999518b2', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[],\"body\":\"Import alumni selesai dan 5 baris berhasil diimpor.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Import completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2026-01-13 03:06:34', '2026-01-13 03:06:34'), ('15278e54-0040-48c1-aec9-0edce500b5cb', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[],\"body\":\"Import alumni selesai dan 10 baris berhasil diimpor.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Import completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2025-12-28 12:50:32', '2025-12-28 12:50:32'), ('16637fea-3ab9-4642-bd33-41aff0a227b6', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[],\"body\":\"Import alumni selesai dan 5 baris berhasil diimpor.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Impor selesai\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2026-02-27 21:36:10', '2026-02-27 21:36:10'), ('1cb7a1d9-e051-43e6-9090-d96f485543f3', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/1\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/1\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your alumni export has completed and 10 rows exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Export completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', '2025-12-28 12:51:13', '2025-12-28 12:51:02', '2025-12-28 12:51:13'), ('2dd902d2-9c84-48a6-88d7-c02f43655e38', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/5\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/5\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your questionnaire response export has completed and 7 rows exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Export completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', '2026-01-29 03:11:32', '2026-01-29 03:11:15', '2026-01-29 03:11:32'), ('4d6bef7e-bfef-445f-b0b6-b6977daf00bd', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/2\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/2\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your questionnaire response export has completed and 2 rows exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Export completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', '2025-12-29 21:16:42', '2025-12-29 21:16:12', '2025-12-29 21:16:42'), ('a5fe8313-831f-4962-be14-3104c1bb7a1e', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/4\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/4\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your questionnaire response export has completed and 10 rows exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Export completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2026-01-27 02:07:28', '2026-01-27 02:07:28'), ('a9827db2-a578-4d6f-98d9-59d12da1eb41', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[],\"body\":\"Import alumni selesai dan 10 baris berhasil diimpor.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Import completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2026-01-02 22:24:18', '2026-01-02 22:24:18'), ('d212c38d-6d78-4336-aa89-b374455a302e', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[{\"name\":\"download_csv\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .csv\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/3\\/download?format=csv\",\"view\":\"filament-actions::link-action\"},{\"name\":\"download_xlsx\",\"color\":null,\"event\":null,\"eventData\":[],\"dispatchDirection\":false,\"dispatchToComponent\":null,\"extraAttributes\":[],\"icon\":null,\"iconPosition\":\"before\",\"iconSize\":null,\"isOutlined\":false,\"isDisabled\":false,\"label\":\"Download .xlsx\",\"shouldClose\":false,\"shouldMarkAsRead\":true,\"shouldMarkAsUnread\":false,\"shouldOpenUrlInNewTab\":true,\"size\":\"sm\",\"tooltip\":null,\"url\":\"\\/filament\\/exports\\/3\\/download?format=xlsx\",\"view\":\"filament-actions::link-action\"}],\"body\":\"Your alumni export has completed and 13 rows exported.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Export completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', '2026-01-13 02:33:00', '2026-01-13 02:32:41', '2026-01-13 02:33:00'), ('f8296e68-1d49-4391-b406-bf0a840b2eb6', 'Filament\\Notifications\\DatabaseNotification', 'App\\Models\\User', 1, '{\"actions\":[],\"body\":\"Import alumni selesai dan 10 baris berhasil diimpor.\",\"color\":null,\"duration\":\"persistent\",\"icon\":\"heroicon-o-check-circle\",\"iconColor\":\"success\",\"status\":\"success\",\"title\":\"Import completed\",\"view\":\"filament-notifications::notification\",\"viewData\":[],\"format\":\"filament\"}', NULL, '2025-12-28 14:25:08', '2025-12-28 14:25:08'); -- -------------------------------------------------------- -- -- Table structure for table `password_reset_tokens` -- CREATE TABLE `password_reset_tokens` ( `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -------------------------------------------------------- -- -- Table structure for table `permissions` -- CREATE TABLE `permissions` ( `id` bigint UNSIGNED NOT NULL, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `permissions` -- INSERT INTO `permissions` (`id`, `name`, `guard_name`, `created_at`, `updated_at`) VALUES (1, 'view_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (2, 'create_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (3, 'edit_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (4, 'delete_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (5, 'import_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (6, 'export_alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (7, 'view_questionnaire', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (8, 'create_questionnaire', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (9, 'edit_questionnaire', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (10, 'delete_questionnaire', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (11, 'view_responses', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (12, 'export_responses', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (13, 'fill_questionnaire', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (14, 'view_job', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (15, 'create_job', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (16, 'edit_own_job', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (17, 'delete_own_job', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (18, 'view_scholarship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (19, 'create_scholarship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (20, 'edit_own_scholarship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (21, 'delete_own_scholarship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (22, 'view_internship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (23, 'create_internship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (24, 'edit_own_internship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (25, 'delete_own_internship', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (26, 'view_admin_dashboard', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (27, 'view_alumni_dashboard', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (28, 'view_forum', 'web', '2026-01-31 05:39:48', '2026-01-31 05:39:48'), (29, 'create_forum_topic', 'web', '2026-01-31 05:39:49', '2026-01-31 05:39:49'), (30, 'edit_own_forum_topic', 'web', '2026-01-31 05:39:49', '2026-01-31 05:39:49'), (31, 'delete_own_forum_topic', 'web', '2026-01-31 05:39:49', '2026-01-31 05:39:49'), (32, 'reply_forum_topic', 'web', '2026-01-31 05:39:49', '2026-01-31 05:39:49'), (33, 'moderate_forum', 'web', '2026-01-31 05:39:49', '2026-01-31 05:39:49'); -- -------------------------------------------------------- -- -- Table structure for table `questionnaires` -- CREATE TABLE `questionnaires` ( `id` bigint UNSIGNED NOT NULL, `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `description` text COLLATE utf8mb4_unicode_ci, `tahun_periode` year NOT NULL, `is_active` tinyint(1) NOT NULL DEFAULT '1', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `questionnaires` -- INSERT INTO `questionnaires` (`id`, `title`, `description`, `tahun_periode`, `is_active`, `created_at`, `updated_at`) VALUES (8, 'KUESIONER TRACER STUDY ALUMNI', 'Kuesioner ini digunakan untuk memperoleh umpan balik alumni sebagai bahan evaluasi dan pengembangan kurikulum serta peningkatan mutu program studi.\nSetiap pernyataan dijawab dengan satu pilihan berikut:\n1 = Sangat Tidak Setuju\n2 = Tidak Setuju\n3 = Netral\n4 = Setuju\n5 = Sangat Setuju', 2026, 1, '2026-02-01 04:46:19', '2026-02-01 04:46:19'), (9, 'Pendidikan dan Karir', 'Bagian ini bertujuan untuk mengetahui perkembangan pendidikan dan karier alumni setelah lulus.', 2025, 1, '2026-02-27 20:25:23', '2026-02-27 21:59:00'), (10, 'Penilaian Program Studi', 'Bagian ini bertujuan untuk mengevaluasi kualitas pendidikan dan fasilitas program studi.', 2026, 1, '2026-02-27 20:47:39', '2026-02-27 20:57:47'); -- -------------------------------------------------------- -- -- Table structure for table `questionnaire_questions` -- CREATE TABLE `questionnaire_questions` ( `id` bigint UNSIGNED NOT NULL, `questionnaire_id` bigint UNSIGNED NOT NULL, `question_text` text COLLATE utf8mb4_unicode_ci NOT NULL, `question_type` enum('text','textarea','radio','checkbox','select') COLLATE utf8mb4_unicode_ci NOT NULL, `options` json DEFAULT NULL, `is_required` tinyint(1) NOT NULL DEFAULT '0', `max_point` int NOT NULL DEFAULT '5' COMMENT 'Maksimal poin yang bisa didapat dari pertanyaan ini', `order` int NOT NULL DEFAULT '0', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `questionnaire_questions` -- INSERT INTO `questionnaire_questions` (`id`, `questionnaire_id`, `question_text`, `question_type`, `options`, `is_required`, `max_point`, `order`, `created_at`, `updated_at`) VALUES (20, 8, 'Kompetensi yang saya peroleh selama kuliah sesuai dengan kebutuhan pekerjaan saya saat ini.', 'radio', '[\"Sangat Tidak Setuju\", \"Tidak Setuju\", \"Netral\", \"Setuju\", \"Sangat Setuju\"]', 1, 5, 1, '2026-02-01 04:50:26', '2026-02-01 04:50:26'), (21, 8, 'Kurikulum program studi relevan dengan perkembangan dunia kerja.', 'radio', '[\"Sangat Tidak Setuju\", \"Tidak Setuju\", \"Netral\", \"Setuju\", \"Sangat Setuju\"]', 1, 5, 2, '2026-02-01 04:52:18', '2026-02-01 04:52:18'), (22, 8, 'Mata kuliah yang saya peroleh mendukung pelaksanaan tugas di tempat kerja.', 'radio', '[\"Sangat Tidak Setuju\", \"Tidak Setuju\", \"Netral\", \"Setuju\", \"Sangat Setuju\"]', 1, 5, 3, '2026-02-01 04:54:57', '2026-02-01 04:54:57'), (23, 8, 'Program studi membekali saya dengan kemampuan berpikir kritis.', 'radio', '[\"Sangat Tidak Setuju\", \"Tidak Setuju\", \"Netral\", \"Setuju\", \"Sangat Setuju\"]', 1, 5, 4, '2026-02-01 04:56:52', '2026-02-01 04:56:52'), (24, 8, 'Program studi membekali saya dengan kemampuan pemecahan masalah.', 'radio', '[\"Sangat Tidak Setuju\", \"Tidak Setuju\", \"Netral\", \"Setuju\", \"Sangat Setuju\"]', 1, 5, 5, '2026-02-01 05:00:25', '2026-02-01 05:00:25'), (25, 9, 'Apakah Anda melanjutkan studi setelah lulus?', 'radio', '[\"Ya\", \"Tidak\"]', 1, 5, 1, '2026-02-27 20:27:19', '2026-02-27 20:27:19'), (26, 9, 'Jika ya, program studi yang diambil', 'text', NULL, 1, 5, 2, '2026-02-27 20:27:49', '2026-02-27 20:27:49'), (27, 9, 'Apakah Anda saat ini bekerja?', 'radio', '[\"Ya, sesuai bidang studi\", \"Ya, tidak sesuai bidang studi\", \"Tidak bekerja\"]', 1, 5, 3, '2026-02-27 20:29:14', '2026-02-27 20:29:14'), (28, 9, 'Posisi/jabatan terakhir Anda', 'text', NULL, 1, 5, 4, '2026-02-27 20:29:34', '2026-02-27 20:29:34'), (29, 9, 'Nama perusahaan/instansi tempat bekerja', 'text', NULL, 1, 5, 5, '2026-02-27 20:29:55', '2026-02-27 20:31:23'), (30, 9, 'Seberapa sesuai pekerjaan Anda dengan bidang studi?', 'radio', '[\"Sangat sesuai\", \"Sesuai\", \"Kurang sesuai\", \"Tidak sesuai\"]', 1, 5, 6, '2026-02-27 20:31:06', '2026-02-27 20:31:06'), (31, 10, 'Seberapa puas Anda terhadap kualitas pendidikan di program studi?', 'radio', '[\"Sangat puas\", \"Puas\", \"Cukup\", \"Kurang\"]', 1, 5, 1, '2026-02-27 20:51:42', '2026-02-27 20:51:42'), (32, 10, 'Bagaimana kualitas fasilitas pendukung pembelajaran (laboratorium, perpustakaan, dll)?', 'radio', '[\"Sangat baik\", \"Baik\", \"Cukup\", \"Kurang\"]', 1, 5, 2, '2026-02-27 20:52:38', '2026-02-27 20:52:38'), (33, 10, 'Apakah kurikulum program studi relevan dengan kebutuhan industri saat ini?', 'radio', '[\"Sangat relevan\", \"Relevan\", \"Kurang Relevan\", \"Tidak Relevan\"]', 1, 5, 3, '2026-02-27 20:53:58', '2026-02-27 20:53:58'), (34, 10, 'Seberapa besar program studi membantu Anda dalam mengembangkan soft skills (komunikasi, kepemimpinan, kerja tim, dll)?', 'radio', '[\"Sangat Besar\", \"Besar\", \"Cukup\", \"Kurang\"]', 1, 5, 4, '2026-02-27 20:54:50', '2026-02-27 20:54:50'); -- -------------------------------------------------------- -- -- Table structure for table `questionnaire_responses` -- CREATE TABLE `questionnaire_responses` ( `id` bigint UNSIGNED NOT NULL, `questionnaire_id` bigint UNSIGNED NOT NULL, `user_id` bigint UNSIGNED NOT NULL, `submitted_at` timestamp NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `questionnaire_responses` -- INSERT INTO `questionnaire_responses` (`id`, `questionnaire_id`, `user_id`, `submitted_at`, `created_at`, `updated_at`) VALUES (12, 8, 78, '2026-02-01 05:15:38', '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (14, 8, 12, '2026-02-27 20:39:42', '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (16, 10, 12, '2026-02-27 20:58:54', '2026-02-27 20:58:54', '2026-02-27 20:58:54'), (17, 8, 14, '2026-02-27 21:00:14', '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (19, 10, 14, '2026-02-27 21:01:53', '2026-02-27 21:01:53', '2026-02-27 21:01:53'); -- -------------------------------------------------------- -- -- Table structure for table `response_answers` -- CREATE TABLE `response_answers` ( `id` bigint UNSIGNED NOT NULL, `response_id` bigint UNSIGNED NOT NULL, `question_id` bigint UNSIGNED NOT NULL, `answer_text` text COLLATE utf8mb4_unicode_ci, `point` int NOT NULL DEFAULT '0' COMMENT 'Poin yang didapat dari jawaban ini', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `response_answers` -- INSERT INTO `response_answers` (`id`, `response_id`, `question_id`, `answer_text`, `point`, `created_at`, `updated_at`) VALUES (44, 12, 20, 'Setuju', 4, '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (45, 12, 21, 'Netral', 3, '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (46, 12, 22, 'Netral', 3, '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (47, 12, 23, 'Setuju', 4, '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (48, 12, 24, 'Setuju', 4, '2026-02-01 05:15:38', '2026-02-01 05:15:38'), (54, 14, 20, 'Setuju', 4, '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (55, 14, 21, 'Setuju', 4, '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (56, 14, 22, 'Setuju', 4, '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (57, 14, 23, 'Setuju', 4, '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (58, 14, 24, 'Setuju', 4, '2026-02-27 20:39:42', '2026-02-27 20:39:42'), (65, 16, 31, 'Puas', 4, '2026-02-27 20:58:54', '2026-02-27 20:58:54'), (66, 16, 32, 'Cukup', 3, '2026-02-27 20:58:54', '2026-02-27 20:58:54'), (67, 16, 33, 'Relevan', 1, '2026-02-27 20:58:54', '2026-02-27 20:58:54'), (68, 16, 34, 'Cukup', 3, '2026-02-27 20:58:54', '2026-02-27 20:58:54'), (69, 17, 20, 'Setuju', 4, '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (70, 17, 21, 'Setuju', 4, '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (71, 17, 22, 'Setuju', 4, '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (72, 17, 23, 'Setuju', 4, '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (73, 17, 24, 'Setuju', 4, '2026-02-27 21:00:14', '2026-02-27 21:00:14'), (80, 19, 31, 'Puas', 4, '2026-02-27 21:01:53', '2026-02-27 21:01:53'), (81, 19, 32, 'Baik', 4, '2026-02-27 21:01:53', '2026-02-27 21:01:53'), (82, 19, 33, 'Relevan', 1, '2026-02-27 21:01:53', '2026-02-27 21:01:53'), (83, 19, 34, 'Besar', 1, '2026-02-27 21:01:53', '2026-02-27 21:01:53'); -- -------------------------------------------------------- -- -- Table structure for table `roles` -- CREATE TABLE `roles` ( `id` bigint UNSIGNED NOT NULL, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `guard_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `roles` -- INSERT INTO `roles` (`id`, `name`, `guard_name`, `created_at`, `updated_at`) VALUES (1, 'admin', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'), (2, 'alumni', 'web', '2025-12-28 12:49:06', '2025-12-28 12:49:06'); -- -------------------------------------------------------- -- -- Table structure for table `role_has_permissions` -- CREATE TABLE `role_has_permissions` ( `permission_id` bigint UNSIGNED NOT NULL, `role_id` bigint UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `role_has_permissions` -- INSERT INTO `role_has_permissions` (`permission_id`, `role_id`) VALUES (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1), (11, 1), (12, 1), (14, 1), (15, 1), (16, 1), (17, 1), (18, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1), (25, 1), (26, 1), (28, 1), (29, 1), (30, 1), (31, 1), (32, 1), (33, 1), (13, 2), (14, 2), (15, 2), (16, 2), (17, 2), (18, 2), (19, 2), (20, 2), (21, 2), (22, 2), (23, 2), (24, 2), (25, 2), (27, 2), (28, 2), (29, 2), (30, 2), (31, 2), (32, 2); -- -------------------------------------------------------- -- -- Table structure for table `scholarships` -- CREATE TABLE `scholarships` ( `id` bigint UNSIGNED NOT NULL, `user_id` bigint UNSIGNED NOT NULL, `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `provider` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `description` text COLLATE utf8mb4_unicode_ci NOT NULL, `requirements` text COLLATE utf8mb4_unicode_ci, `amount` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `deadline` daMPte DEFAULT NULL, `link` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `scholarships` -- INSERT INTO `scholarships` (`id`, `user_id`, `title`, `provider`, `description`, `requirements`, `amount`, `deadline`, `link`, `created_at`, `updated_at`) VALUES (1, 1, 'Beasiswa Prestasi Mahasiswa TI', 'Kementerian Pendidikan, Kebudayaan, Riset, dan Teknologi', '

Beasiswa ini ditujukan bagi mahasiswa lulusan S1 Program Studi Sistem Informasi dan Teknik Informatika yang memiliki prestasi akademik maupun non-akademik. 

Beasiswa diberikan untuk membantu biaya pendidikan dan mendukung pengembangan potensi mahasiswa selama masa studi. 

', '
  • Mahasiswa aktif Program Studi Sistem Informasi
  • Freshgraduate
  • IPK minimal 3.50
  • Memiliki surat rekomendasi dari desa
  • Tidak sedang menerima beasiswa lain
', 'Rp 6.000.000 / semester', '2026-01-09', 'https://beasiswa.kemdikbud.go.id/prestasi-mahasiswa', '2025-12-28 13:16:32', '2025-12-28 13:16:32'), (3, 1, 'Beasiswa Alumni Berprestasi', 'Yayasan Pendidikan Nusantara', '
 Beasiswa ini ditujukan bagi alumni berprestasi yang ingin melanjutkan studi atau mengembangkan kompetensi profesional. Beasiswa diberikan sebagai bentuk dukungan pengembangan sumber daya manusia. 
', '
  • Alumni perguruan tinggi maksimal lulus 3 tahun terakhir
  • IPK minimal 3.25
  • Surat rekomendasi fakultas
  • Proposal rencana pengembangan diri
', 'Rp 10.000.000 / semester', '2026-03-05', 'https://beasiswa.ypnusantara.or.id', '2026-01-18 03:47:05', '2026-01-18 03:49:26'), (4, 1, 'Beasiswa Digital Talent', 'Kementerian Komunikasi dan Informatika', '
Beasiswa pelatihan dan pengembangan kompetensi digital. 
', '
  • Mahasiswa aktif atau alumni SI/TI
  • IPK minimal 3.00
  • Memiliki minat di bidang teknologi digital
  • Bersedia mengikuti seluruh rangkaian program
', 'Rp 8.000.000', '2026-03-19', 'https://lpdp.kemenkeu.go.id', '2026-01-18 03:53:17', '2026-01-18 03:53:17'); -- -------------------------------------------------------- -- -- Table structure for table `sessions` -- CREATE TABLE `sessions` ( `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `user_id` bigint UNSIGNED DEFAULT NULL, `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `user_agent` text COLLATE utf8mb4_unicode_ci, `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, `last_activity` int NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `sessions` -- INSERT INTO `sessions` (`id`, `user_id`, `ip_address`, `user_agent`, `payload`, `last_activity`) VALUES ('l6xEI7AnFnhA9cPYzXc6ur5hOWAkGSRYmJrczzfq', NULL, '127.0.0.1', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.0.0', 'YTo0OntzOjY6Il90b2tlbiI7czo0MDoiMnVsYkFLOGNMMjl4U2pxb0VVUFBZRTFJNWxuaG9pTmpPSjVjcXJCbCI7czo2OiJfZmxhc2giO2E6Mjp7czozOiJvbGQiO2E6MDp7fXM6MzoibmV3IjthOjA6e319czo5OiJfcHJldmlvdXMiO2E6MTp7czozOiJ1cmwiO3M6NDA6Imh0dHA6Ly8xMjcuMC4wLjE6ODAwMC90cmFjZXItc3R1ZHkvbG9naW4iO31zOjM6InVybCI7YToxOntzOjg6ImludGVuZGVkIjtzOjM0OiJodHRwOi8vMTI3LjAuMC4xOjgwMDAvdHJhY2VyLXN0dWR5Ijt9fQ==', 1772537243), ('sRftpMnDPbOd7QC2WzITLjYHns5jH9h9C8G3iZiH', NULL, '127.0.0.1', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.0.0', 'YToyOntzOjY6Il90b2tlbiI7czo0MDoiR0txMmN5bFprc0haMm1qRTJ1Y0J1WXd5SXNyWFEzOWw4Z3NERjJWeiI7czo2OiJfZmxhc2giO2E6Mjp7czozOiJvbGQiO2E6MDp7fXM6MzoibmV3IjthOjA6e319fQ==', 1772533583); -- -------------------------------------------------------- -- -- Table structure for table `users` -- CREATE TABLE `users` ( `id` bigint UNSIGNED NOT NULL, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `email_verified_at` timestamp NULL DEFAULT NULL, `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Dumping data for table `users` -- INSERT INTO `users` (`id`, `name`, `email`, `email_verified_at`, `password`, `remember_token`, `created_at`, `updated_at`) VALUES (1, 'Administrator', 'admin@gmail.com', NULL, '$2y$12$xSO6sqCK2WczsTWxAsvofedbRlJSw0/cRpX/tSQy69WT7d5.Fazby', 'iPMNtNqnOXUQNSDL6g4kLyuFTfddMt2P1aUl0QcDobEyObgYELQbAx8bl57g', '2025-12-28 12:49:06', '2025-12-28 13:50:02'), (12, 'Jaka', 'jaka@gmail.com', NULL, '$2y$12$e6rMhr19xrvrwPwHOvawFOSvsHdvqT2RBDfKjb9O1p5kGl9SJej9W', NULL, '2025-12-28 13:22:37', '2025-12-28 13:47:27'), (13, 'Nadia Oktarina', 'nadiaokta847@gmail.com', NULL, '$2y$12$YsgIY.7MePyZsDKHej9UnuTJAmFJDU6oNAFr/h0lYTqW5epU1t4wK', '2raRpkCwAJsGJxqIQTYGcexmsWMpMWugLmpbh0IOnRn3mnHuZAYDiz5QfFUx', '2025-12-28 13:53:07', '2026-03-03 04:03:52'), (14, 'Ahmad Fauzi', 'ahmad.fauzi@gmail.com', NULL, '$2y$12$FBofMveiP3.a90xnhy1skeo5aeerTRS6jWHRl2V2/hSKYeyy.jDMi', NULL, '2025-12-28 14:25:04', '2025-12-28 14:25:04'), (15, 'Siti Aisyah', 'siti.aisyah@gmail.com', NULL, '$2y$12$dVIxRwsOxBLIXswlezm1mu7BOzea.AmHza00AuRadHm2piZ.Su.Yq', NULL, '2025-12-28 14:25:04', '2025-12-28 14:25:04'), (16, 'Budi Santoso', 'budi.santoso@gmail.com', NULL, '$2y$12$ANofpD0fi63QiYcytgbbRuHd6ndlUR3e9vgrSNIZQ83lte.FCHYl2', NULL, '2025-12-28 14:25:05', '2025-12-28 14:25:05'), (17, 'Rina Marlina', 'rina.marlina@gmail.com', NULL, '$2y$12$odUNr3GrWPqWg8OYA8R/0ut1ykWD0fo04SO4s0d/sd/A25ZnTTnnO', NULL, '2025-12-28 14:25:05', '2025-12-28 14:25:05'), (18, 'Dedi Pratama', 'dedi.pratama@gmail.com', NULL, '$2y$12$iM3r22WisCptI1iywMiucuaDg7uHcOgG5DRtrv1kxULxRJofGorjy', NULL, '2025-12-28 14:25:05', '2025-12-28 14:25:05'), (19, 'Lina Putri', 'lina.putri@gmail.com', NULL, '$2y$12$Q5ib5xtBQuT27dO3diHR2OMbvuEudjqOfQS.TykbIuoiVPMvg/AD6', NULL, '2025-12-28 14:25:06', '2025-12-28 14:25:06'), (20, 'Rizky Maulana', 'rizky.maulana@gmail.com', NULL, '$2y$12$727wKDdO61RcfK5i5AdKv.HqYqmpnd/byVOOIa6L./eGMgFkBcCha', NULL, '2025-12-28 14:25:06', '2025-12-28 14:25:06'), (21, 'Putri Ananda', 'putri.ananda@gmail.com', NULL, '$2y$12$8P2oUga1mv3Pau2FdjROmexrir9PpZio/9e13rwx1bKCmZXbaCSNy', NULL, '2025-12-28 14:25:07', '2025-12-28 14:25:07'), (22, 'Andi Wijaya', 'andi.wijaya@gmail.com', NULL, '$2y$12$xiiauIYOnswDUkugw655tOCVXfcaRppT8lOHJTOCiE7MQ14vTaDUa', NULL, '2025-12-28 14:25:07', '2025-12-28 14:25:07'), (23, 'Nurul Hidayah', 'nurul.hidayah@gmail.com', NULL, '$2y$12$sdEC9rUCkiQmUkq28kOcf.u7wmevQOTYq75FXWXJ.ERYjYxN.qR.C', NULL, '2025-12-28 14:25:07', '2025-12-28 14:25:07'), (50, 'Dedi Pratama', 'dedi.pratama20@gmail.com', NULL, '$2y$12$HuaXSxIQcoAxOJR8tqgbveMVNl9EkxKed6G6QatIr36CwhYo4ML8e', NULL, '2026-01-13 02:44:37', '2026-01-13 04:23:40'), (68, 'Ahmad Fauzi', 'ahmad.fauzi02@gmail.com', NULL, '$2y$12$L6h8w6jY/0lq7Rg9pVNCieoAdWeDnTXArpJyWVmF0U5SePkEmTshm', NULL, '2026-01-13 03:06:32', '2026-01-13 03:06:32'), (69, 'Siti Aminah', 'siti.aminah@gmail.com', NULL, '$2y$12$opetj9YrhvwZrKYlkNgpkuVKvvkwuapvISFtaS3dAO1gcInlst53.', NULL, '2026-01-13 03:06:32', '2026-01-13 03:06:32'), (70, 'Budi Santoso', 'budi.santoso22@gmail.com', NULL, '$2y$12$btj7XzZQL/KunfJfTPAk1uvRBN3uUbz5bBgMQrCllBm1wvk/.gWcu', NULL, '2026-01-13 03:06:33', '2026-01-13 03:06:33'), (71, 'Rina Putri', 'rina.putri@gmail.com', NULL, '$2y$12$wzenw3s2S9B9MzI.nNGsk.j3I.TypVBnnJYAJdKmLC3LO2lDYm5oa', NULL, '2026-01-13 03:06:34', '2026-01-13 03:06:34'), (72, 'M syarifuddin', 'udin@gmail.com', NULL, '$2y$12$ctoSJBmL7qa8yOJ.o4ECJu7kdCgZa39d/uTfcHNbvK7WX4N5/wZbW', NULL, '2026-01-14 08:09:07', '2026-01-14 08:09:07'), (78, 'Ahmad Fairuz', 'ahmadfairuz1@gmail.com', NULL, '$2y$12$xOxJB2QNwYwIaqIuJyyeyOh42YslIFFuAm7lQFgzZf6vA07JiXQYy', NULL, '2026-01-26 01:00:24', '2026-01-27 02:29:18'), (80, 'Mustofa', 'mustop4@gmail.com', NULL, '$2y$12$yDNh98AGPvSRBBjkAf8Hg.SXVYzSL7z8xB7Zh1GMwAMuFiDCYyYkG', NULL, '2026-02-27 20:13:10', '2026-02-27 20:13:10'), (81, 'Ikbal', 'ikbal2@gmail.com', NULL, '$2y$12$es8n5pV/7HQdhl8OUnaI.OAXN7aOo1/Hg/UARfwnQQa8MbeXwzIty', NULL, '2026-02-27 21:22:01', '2026-02-27 21:22:01'), (82, 'Siti Rohaya', 'sitiryh@gmail.com', NULL, '$2y$12$.rH1CXHxJcwBi55V1VFCfe8f2EMHZOx2OYbUGeanKd9dxhq5LIkwS', NULL, '2026-02-27 21:22:01', '2026-02-27 21:22:01'), (83, 'Budiman', 'budiman02@gmail.com', NULL, '$2y$12$XkVNmCJrWcLb16GJ0NwAIeq1tLb/ru3tP9wfN24T4VBH0J/Vt2SlG', NULL, '2026-02-27 21:22:02', '2026-02-27 21:22:02'), (84, 'Rina badria', 'rinabadr@gmail.com', NULL, '$2y$12$rDCeV1V1gLfteNXbEePleu6QaU1Sl3viI52l.Xc1ZaZ0OH5QT17l.', NULL, '2026-02-27 21:22:02', '2026-02-27 21:22:02'), (85, 'Rendi Pratama', 'rendipratama10@gmail.com', NULL, '$2y$12$LDJEnhHBMELnMw6PuZH59unl5nUxL36SLkI1nMmTmlUpNrV2AyrJO', NULL, '2026-02-27 21:36:09', '2026-02-27 21:36:09'); -- -- Indexes for dumped tables -- -- -- Indexes for table `alumnis` -- ALTER TABLE `alumnis` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `alumnis_nim_unique` (`nim`), ADD UNIQUE KEY `alumnis_email_unique` (`email`), ADD KEY `alumnis_user_id_foreign` (`user_id`); -- -- Indexes for table `cache` -- ALTER TABLE `cache` ADD PRIMARY KEY (`key`); -- -- Indexes for table `cache_locks` -- ALTER TABLE `cache_locks` ADD PRIMARY KEY (`key`); -- -- Indexes for table `exports` -- ALTER TABLE `exports` ADD PRIMARY KEY (`id`), ADD KEY `exports_user_id_foreign` (`user_id`); -- -- Indexes for table `failed_import_rows` -- ALTER TABLE `failed_import_rows` ADD PRIMARY KEY (`id`), ADD KEY `failed_import_rows_import_id_foreign` (`import_id`); -- -- Indexes for table `failed_jobs` -- ALTER TABLE `failed_jobs` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`); -- -- Indexes for table `forum_replies` -- ALTER TABLE `forum_replies` ADD PRIMARY KEY (`id`), ADD KEY `forum_replies_user_id_foreign` (`user_id`), ADD KEY `forum_replies_topic_id_index` (`topic_id`); -- -- Indexes for table `forum_topics` -- ALTER TABLE `forum_topics` ADD PRIMARY KEY (`id`), ADD KEY `forum_topics_user_id_foreign` (`user_id`), ADD KEY `forum_topics_created_at_is_pinned_index` (`created_at`,`is_pinned`); -- -- Indexes for table `imports` -- ALTER TABLE `imports` ADD PRIMARY KEY (`id`), ADD KEY `imports_user_id_foreign` (`user_id`); -- -- Indexes for table `internships` -- ALTER TABLE `internships` ADD PRIMARY KEY (`id`), ADD KEY `internships_user_id_foreign` (`user_id`); -- -- Indexes for table `jobs` -- ALTER TABLE `jobs` ADD PRIMARY KEY (`id`), ADD KEY `jobs_queue_index` (`queue`); -- -- Indexes for table `job_batches` -- ALTER TABLE `job_batches` ADD PRIMARY KEY (`id`); -- -- Indexes for table `job_opportunities` -- ALTER TABLE `job_opportunities` ADD PRIMARY KEY (`id`), ADD KEY `job_opportunities_user_id_foreign` (`user_id`); -- -- Indexes for table `migrations` -- ALTER TABLE `migrations` ADD PRIMARY KEY (`id`); -- -- Indexes for table `model_has_permissions` -- ALTER TABLE `model_has_permissions` ADD PRIMARY KEY (`permission_id`,`model_id`,`model_type`), ADD KEY `model_has_permissions_model_id_model_type_index` (`model_id`,`model_type`); -- -- Indexes for table `model_has_roles` -- ALTER TABLE `model_has_roles` ADD PRIMARY KEY (`role_id`,`model_id`,`model_type`), ADD KEY `model_has_roles_model_id_model_type_index` (`model_id`,`model_type`); -- -- Indexes for table `notifications` -- ALTER TABLE `notifications` ADD PRIMARY KEY (`id`), ADD KEY `notifications_notifiable_type_notifiable_id_index` (`notifiable_type`,`notifiable_id`); -- -- Indexes for table `password_reset_tokens` -- ALTER TABLE `password_reset_tokens` ADD PRIMARY KEY (`email`); -- -- Indexes for table `permissions` -- ALTER TABLE `permissions` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `permissions_name_guard_name_unique` (`name`,`guard_name`); -- -- Indexes for table `questionnaires` -- ALTER TABLE `questionnaires` ADD PRIMARY KEY (`id`); -- -- Indexes for table `questionnaire_questions` -- ALTER TABLE `questionnaire_questions` ADD PRIMARY KEY (`id`), ADD KEY `questionnaire_questions_questionnaire_id_foreign` (`questionnaire_id`); -- -- Indexes for table `questionnaire_responses` -- ALTER TABLE `questionnaire_responses` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `questionnaire_responses_questionnaire_id_user_id_unique` (`questionnaire_id`,`user_id`), ADD KEY `questionnaire_responses_user_id_foreign` (`user_id`); -- -- Indexes for table `response_answers` -- ALTER TABLE `response_answers` ADD PRIMARY KEY (`id`), ADD KEY `response_answers_response_id_foreign` (`response_id`), ADD KEY `response_answers_question_id_foreign` (`question_id`); -- -- Indexes for table `roles` -- ALTER TABLE `roles` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `roles_name_guard_name_unique` (`name`,`guard_name`); -- -- Indexes for table `role_has_permissions` -- ALTER TABLE `role_has_permissions` ADD PRIMARY KEY (`permission_id`,`role_id`), ADD KEY `role_has_permissions_role_id_foreign` (`role_id`); -- -- Indexes for table `scholarships` -- ALTER TABLE `scholarships` ADD PRIMARY KEY (`id`), ADD KEY `scholarships_user_id_foreign` (`user_id`); -- -- Indexes for table `sessions` -- ALTER TABLE `sessions` ADD PRIMARY KEY (`id`), ADD KEY `sessions_user_id_index` (`user_id`), ADD KEY `sessions_last_activity_index` (`last_activity`); -- -- Indexes for table `users` -- ALTER TABLE `users` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `users_email_unique` (`email`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `alumnis` -- ALTER TABLE `alumnis` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=124; -- -- AUTO_INCREMENT for table `exports` -- ALTER TABLE `exports` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; -- -- AUTO_INCREMENT for table `failed_import_rows` -- ALTER TABLE `failed_import_rows` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT; -- -- AUTO_INCREMENT for table `failed_jobs` -- ALTER TABLE `failed_jobs` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT; -- -- AUTO_INCREMENT for table `forum_replies` -- ALTER TABLE `forum_replies` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=15; -- -- AUTO_INCREMENT for table `forum_topics` -- ALTER TABLE `forum_topics` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; -- -- AUTO_INCREMENT for table `imports` -- ALTER TABLE `imports` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; -- -- AUTO_INCREMENT for table `internships` -- ALTER TABLE `internships` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; -- -- AUTO_INCREMENT for table `jobs` -- ALTER TABLE `jobs` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; -- -- AUTO_INCREMENT for table `job_opportunities` -- ALTER TABLE `job_opportunities` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; -- -- AUTO_INCREMENT for table `migrations` -- ALTER TABLE `migrations` MODIFY `id` int UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=55; -- -- AUTO_INCREMENT for table `permissions` -- ALTER TABLE `permissions` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=34; -- -- AUTO_INCREMENT for table `questionnaires` -- ALTER TABLE `questionnaires` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=14; -- -- AUTO_INCREMENT for table `questionnaire_questions` -- ALTER TABLE `questionnaire_questions` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=36; -- -- AUTO_INCREMENT for table `questionnaire_responses` -- ALTER TABLE `questionnaire_responses` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=20; -- -- AUTO_INCREMENT for table `response_answers` -- ALTER TABLE `response_answers` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=84; -- -- AUTO_INCREMENT for table `roles` -- ALTER TABLE `roles` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; -- -- AUTO_INCREMENT for table `scholarships` -- ALTER TABLE `scholarships` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; -- -- AUTO_INCREMENT for table `users` -- ALTER TABLE `users` MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=86; -- -- Constraints for dumped tables -- -- -- Constraints for table `alumnis` -- ALTER TABLE `alumnis` ADD CONSTRAINT `alumnis_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `exports` -- ALTER TABLE `exports` ADD CONSTRAINT `exports_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `failed_import_rows` -- ALTER TABLE `failed_import_rows` ADD CONSTRAINT `failed_import_rows_import_id_foreign` FOREIGN KEY (`import_id`) REFERENCES `imports` (`id`) ON DELETE CASCADE; -- -- Constraints for table `forum_replies` -- ALTER TABLE `forum_replies` ADD CONSTRAINT `forum_replies_topic_id_foreign` FOREIGN KEY (`topic_id`) REFERENCES `forum_topics` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `forum_replies_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `forum_topics` -- ALTER TABLE `forum_topics` ADD CONSTRAINT `forum_topics_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `imports` -- ALTER TABLE `imports` ADD CONSTRAINT `imports_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `internships` -- ALTER TABLE `internships` ADD CONSTRAINT `internships_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `job_opportunities` -- ALTER TABLE `job_opportunities` ADD CONSTRAINT `job_opportunities_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `model_has_permissions` -- ALTER TABLE `model_has_permissions` ADD CONSTRAINT `model_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE; -- -- Constraints for table `model_has_roles` -- ALTER TABLE `model_has_roles` ADD CONSTRAINT `model_has_roles_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE; -- -- Constraints for table `questionnaire_questions` -- ALTER TABLE `questionnaire_questions` ADD CONSTRAINT `questionnaire_questions_questionnaire_id_foreign` FOREIGN KEY (`questionnaire_id`) REFERENCES `questionnaires` (`id`) ON DELETE CASCADE; -- -- Constraints for table `questionnaire_responses` -- ALTER TABLE `questionnaire_responses` ADD CONSTRAINT `questionnaire_responses_questionnaire_id_foreign` FOREIGN KEY (`questionnaire_id`) REFERENCES `questionnaires` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `questionnaire_responses_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; -- -- Constraints for table `response_answers` -- ALTER TABLE `response_answers` ADD CONSTRAINT `response_answers_question_id_foreign` FOREIGN KEY (`question_id`) REFERENCES `questionnaire_questions` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `response_answers_response_id_foreign` FOREIGN KEY (`response_id`) REFERENCES `questionnaire_responses` (`id`) ON DELETE CASCADE; -- -- Constraints for table `role_has_permissions` -- ALTER TABLE `role_has_permissions` ADD CONSTRAINT `role_has_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `role_has_permissions_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE; -- -- Constraints for table `scholarships` -- ALTER TABLE `scholarships` ADD CONSTRAINT `scholarships_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; COMMIT; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; i`x340031Q(N.J,H-sON-JIe^w~%-~n[s%x340031Q rtuw wstMa+=U!W-B9rL R*s3j&`/" !F%efU&0nRc9@øefM0.o_x._r<1La|k{&# - l̊ K+'`s v p tstpMR2y 6ioȄb iXđ:dQ>YV VSĢdBwjBZf<6I l*KYEumNać&糲MFeŸe|8#aJx340031QH,((֫La"o\R9]/1(LII-O,J]mE7U}3/U[\Q#Υ}FAWf:vcX0?x;oC%BQjbnfDruS3K2Ru K2'h&x|edOjzbrBAQ~JirIf~BNbe~iBbqjAFqIjr^AjBfBAbfQjByfIT69'4E/;RKt'2*Lܭ `:9Q`157 rz2< xf{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": ["config:recommended"], "git-submodules": { "enabled": true } } V1xNmϸ Br[C`A$t$/!,^h*?sR sv]-'vH 'x̶myFSY#&2 exit 1 } # Heuristic check: Ensure the manifest actually declares dependencies before thrashing the disk with ncu. if ! grep -Eq '"(dependencies|devDependencies|peerDependencies)"[[:space:]]*:' package.json; then echo "Notice: No valid dependency blocks detected in $dir/package.json. Bypassing node traversal." exit 0 fi # Delegate command resolution to bunx. This obliterates the 'command not found' failure mode # by dynamically sourcing the npm-check-updates binary, completely ignoring global namespace pollution. echo "Executing constraint-free updates via bunx..." bunx --bun npm-check-updates -u echo "Commencing rigorous package installation phase..." bun install ) || { echo "WARNING: Subshell failure encountered in $dir. Subsystem continues." >&2 } done echo "--------------------------------------------------------------------------------" echo "SYSTEM STATE: All traversable dependencies aggressively updated." xr #!/bin/bash set -euo pipefail PROMETHEUS_VERSION="2.53.0" TAILSCALE_IP="100.108.1.124" PROMETHEUS_DIR="/etc/prometheus" PROMETHEUS_DATA_DIR="/var/lib/prometheus" echo "Creating prometheus user and group..." if ! getent group prometheus >/dev/null; then groupadd --system prometheus fi if ! getent passwd prometheus >/dev/null; then useradd --system -g prometheus --no-create-home --shell /usr/sbin/nologin prometheus fi echo "Creating directories..." mkdir -p "$PROMETHEUS_DIR" "$PROMETHEUS_DATA_DIR" chown prometheus:prometheus "$PROMETHEUS_DIR" "$PROMETHEUS_DATA_DIR" echo "Downloading Prometheus v${PROMETHEUS_VERSION}..." cd /tmp wget -qO prometheus.tar.gz "https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}/prometheus-${PROMETHEUS_VERSION}.linux-amd64.tar.gz" echo "Extracting Prometheus..." tar -xf prometheus.tar.gz cd "prometheus-${PROMETHEUS_VERSION}.linux-amd64" echo "Installing binaries..." install -m 0755 -o prometheus -g prometheus prometheus promtool /usr/local/bin/ echo "Installing consoles and libraries..." cp -a consoles console_libraries "$PROMETHEUS_DIR/" chown -R prometheus:prometheus "$PROMETHEUS_DIR/consoles" "$PROMETHEUS_DIR/console_libraries" echo "Creating configuration file..." cat < "${PROMETHEUS_DIR}/prometheus.yml" global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: "prometheus" static_configs: - targets: ["${TAILSCALE_IP}:9090"] EOF chown prometheus:prometheus "${PROMETHEUS_DIR}/prometheus.yml" chmod 0644 "${PROMETHEUS_DIR}/prometheus.yml" echo "Creating systemd unit file..." cat < /etc/systemd/system/prometheus.service [Unit] Description=Prometheus Time Series Collection and Processing Server Wants=network-online.target After=network-online.target [Service] User=prometheus Group=prometheus Type=simple ExecStart=/usr/local/bin/prometheus \\ --config.file=${PROMETHEUS_DIR}/prometheus.yml \\ --storage.tsdb.path=${PROMETHEUS_DATA_DIR} \\ --web.console.templates=${PROMETHEUS_DIR}/consoles \\ --web.console.libraries=${PROMETHEUS_DIR}/console_libraries \\ --web.listen-address=${TAILSCALE_IP}:9090 \\ --web.external-url=http://${TAILSCALE_IP}:9090/ ExecReload=/bin/kill -HUP \$MAINPID Restart=on-failure RestartSec=5s LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF chmod 0644 /etc/systemd/system/prometheus.service echo "Reloading systemd, enabling and starting prometheus..." systemctl daemon-reload systemctl enable prometheus systemctl restart prometheus echo "Checking Prometheus status..." systemctl status prometheus --no-pager || true echo "Prometheus setup completed successfully!" 鍊 x FU&^B2Y`x340031QHͩ,LԫaxrtF椯u5|v~e!DUQjbr XQ%?4\п0E%%`i7,p۟,pĂ"l̼%]'Է,#(5jg-Q_o{bMPU%Ei`e7,d/ )J?9g@!^fOx{X2 Z&x}eB{eEzy}&d)OkDPkPO@K_mFII~~INnnjIQfrnRbrvj^9!Aaή~EE Y=")x~}C!/{<-+bu` o\ɗ[ 0x343000P(N.J,H-bh8iig+P߱گ \xkm Mu99|8SaY{3`cie+|7qG~EN XY--shftF55)3"5N@- zx;-x¼5XS2SjɾlJR5 .%Iũ 5 ީ >IEEœgsJM>>9gJN+9y,uuuujj Rj5KrSJsR5j5LQ0o,۸28*ss6[J=7!x3]x?Py+>y8AVq3Cw\tWՃoFy_=xe100644 0001-use-hub-repo-with-submodules.mdͪA8eK100644 README.mdI;ƀ_lFh57@'+x?]pDfnĒ ә]&dY_583Q1SA&!X?,l΢`*p(&&(畤5@M% @-k 낄'(y `=EE0Cfo6gId?qHwx@40000 plans?[@^l5~Uk40000 specsŧa m픛V}PF)xcV.krjaLww)ΦLF5Od&3/(}\wTK3eىPex:Ph'"9Ok_9ˀx~YY--sh40000 appst߁P>^fO"D,e100644 biome.json-4*92MNjCOExl#: z ᬓij6 x;qcN.SSf͗7+nsh Ix-100644 devcontainer.json!a5$EOnQJ>hͳ xL{ "image": "mcr.microsoft.com/devcontainers/universal:2", "features": { "ghcr.io/devcontainers/features/rust:1": {}, "ghcr.io/devcontainers/features/node:2": {} } } E;2xq\E3+Vtغ x340031QHI-ɯMON-ҫaX~̺N>=p2lji%p7Y0NԵ@Wq4sRԧɩl*5]*EvfSNGB!匒Qe*MJOdb8tqhmVNňu3U94D6ٔ40sdO%&)j*NL_<l2Mxus&ΒʂlF6O>4x}SOAl(F6ϵP0@ 1F/8}ngY x7cwx`bk!UY#.vpx<r[kna+¿)");BdCN>"cƧ"9jo-9o9"+ xEA! U Xʼn1] /?cb-(Jb2{8f@V*Ě~v I綈k9vߐEQ;|<x8qoRf~njVc x1 @~O1L-9@:R,Q6$;$!wMWtxi ivFVo y3VoQ:nJ5/:i({Z+QATS$h}ޓEI~,+q%)eQ95 ?s)l}8Kx343000PHͩ,LdekC^HKPBOu|q1E% B{dO}߿0%% y/>wװ޷8nAĂ"y&Mq1 U J6, x340031QrutuMairMo%N8FjBr~nA~q*_SzrǏO_i"/-3_Ɔ6؇W(HON-b }ނc5*+fDAIQbjZf6C^ڍщn߸~Rwȝ5UD x;Ũ8,39؊KA!583Q7 SPH+IK-KMO41CRYkd`a:> !=wPoW?[jdn-x][KSrMb@S4xeB){ZEb&?cxej0EYFEY(}A(Li,bbf_W$;0B| L t>*H\Gqe- yĈo\+ oZ(:vQrIS2Sh+c}( `z֛~٭$Z񌉸|P+ G)[uۿVEQ/7ib)8ZG#/T$|`xiBqJFF?$x;r٤8,39؊KAD7$QPH+IK-KMBHO41Dp89Bl &OeLKqMb' x340031QHͩ,LsON-JIeX~O񟵩/>H.xkQ\\[ZTZU̐]"5|,/־Y)'dۛhQa*d Ťj[]fv)TiqrQbr$f/Hv{r?-OV5xD2~SQ3X%xV# build stage FROM oven/bun:1-alpine AS builder WORKDIR /app # install dependencies with cache mounts COPY apps/elysia/package.json apps/elysia/bun.lock ./ RUN --mount=type=cache,target=/root/.bun/install/cache \ bun install --frozen-lockfile # build the application COPY apps/elysia ./ RUN bun run build # runtime stage FROM oven/bun:1-distroless WORKDIR /app # copy build artifacts COPY --from=builder /app/dist ./dist COPY --from=builder /app/package.json ./ # distroless uses nonroot user (UID 65532) by default, or we can use it USER nonroot EXPOSE 4092 CMD ["run", "dist/index.js"] ]԰}xUakH_1]J-M{S6Bm~8Hx]%Yi9յ`Fofvf1ɽr}̊3UI~$)tbTrAN6ǰ&;1F;OS(=BB{-HzDRϷtp1`C˽_5:鷭/ܹq qŀi*g^ʮ3[iSPw} K}o9خ{U#QNX/U99ȋf0C O#|l}Pa:fesOIJ|Tu0(oo/÷V7wN"`hst@ODZklHMnIqzYDtZqnI{--rGY_}G vZIb5~J o;,Y0bE b"YK[S/sy<4 _gǽ,dH]p󂋮 K*:PA,% IՃj{JŶs֍S-g+oJ 0ͣ dskg%/!/Xg|8d1'KC ܡ/1ЁƜռm,ڜp.XT)hgy;+kOW6PͭW= Uz2 b s&yF}* lAJ;.G7q)*X:}*`lq4c*.s(SƫbhLk:Y\ K=#<</6qAEÁ=@$KeVM_?è(4TYcE'Q^l'rK %7Sm`II )<nu~86Nb/ߪ,-iS[[iPϰK PZ^}>]uhwC6o)xc# ─── Stage 1: Build ───────────────────────────────────────────────────────── FROM oven/bun:1 AS builder WORKDIR /app COPY apps/react/package.json apps/react/bun.lock ./ RUN bun install --frozen-lockfile COPY apps/react . RUN bun run build # ─── Stage 2: Runtime (Bun static server) ────────────────────────────────── FROM oven/bun:1-alpine WORKDIR /app COPY infra/docker/react-server.js ./server.js COPY --from=builder /app/dist ./dist EXPOSE 80 CMD ["bun", "server.js"]j8Px{100644 TRAEFIK_ENV_CONFIG.md hM&\ng#ll>40000 dynamicD{۲_͑100644 traefik.yamlO E%6ma^v64| 0|xu100644 apps.yaml' ~ոċxp100644 middlewares.yaml}+7qp%Mhá100644 ssl.yamlafuCu082RԘز1xp100644 add-new-app.md_ pGD@ONU40000 adrx?Py+>y8AV40000 confignk ɉv0hr40000 superpowersCw\tWՃoFG8n^bxTn@VFZ!2%v4 IOPBCRݍI:Y(}$pRy\y vcrJ|~NӿD@#(bրu+}c` e|0kYGλ'm)zQqSHB=BCBepC7ao% ]Ӯ+`6qKQI5 O ؒ^[u8B !鳄P-f6IRJN ̒/|!<,]EĩD `P)l0xJ* s]ׇܧ͈] “[&#縳bYNvV/P- /:r1Gk##Te%>Le>h.s\5]˒e뢖Kd'j$vh|nN8ݞ9޳/#x(m6ȿuQ|4xqnw-PsgQ߭++mx;qcC"9Z.uf5GWx[͸q*7wdž}1=U ~x{q5їO4U6+a6{. 4*x$!KGFD1up~fi E(x343000PHͩ,LdekC^HKPBOu|q1E% zD'n];#>>JƷN&d0eƳY^zZ '- RNr4qvY ,Tw(6/9x( ޓ[uF |61(5IGWlx{qc"fofyFyx[͸qd !Gj֛L?_,_z{ ܨx340031QHͩ,Lԫa.LƒymĮ !RK)u}-/$ޤ&dg"~cWD m¡  Rʞ.[3DwQ{{pRĢɮg-{ǷDv5AU%efݰh (t*aM[F)xiBiybJFFC*Nx{qc}&{]UTOX?sg&@x343000PHͩ,Ld0v}lrer.BT&&0~vVI_yc<}LAiqnbiIC^f<ϝ5z"Nr8( d*IiG>pBU~n39Gwװ޷8nAĂ"y&Mq1 UH8 x9#cYg"0rA!`Ӛ0-2T"M͚]WM\I/xqMzs.=}$ck xkfjf_dcCʞ'p\HhfgeI x343000PHͩ,LdٛxpsSnBT&&0x)}QBrƊ[v&d0eƳY^zZ '- RNr4qvY ,Tw}5S x2lꊙ q))px6nTf${:l͍0=@dw`X?ߑ0[xk# Add files here to ignore them from prettier formatting /dist /coverage *.env **/target/ **/node_modules/ ;$xz{ "singleQuote": true, "printWidth": 100, "tabWidth": 2, "trailingComma": "all", "semi": true, "arrowParens": "always" } R'kxT100644 extensions.jsonG92&Uݦ100644 settings.json gBKg>W/Sn2!3x{} xxt160000 elysiam ö%+160000 react`ɰtO?,160000 rust-authni_w|;VXɮ160000 scrapernB+X; 8%G=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="], "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], "@types/conventional-commits-parser": ["@types/conventional-commits-parser@5.0.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g=="], "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], "@types/node": ["@types/node@25.9.2", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw=="], "JSONStream": ["JSONStream@1.3.5", "", { "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": { "JSONStream": "./bin.js" } }, "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="], "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], "ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="], "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "array-ify": ["array-ify@1.0.0", "", {}, "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "brace-expansion": ["brace-expansion@1.1.15", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], "cli-truncate": ["cli-truncate@4.0.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="], "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], "commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], "compare-func": ["compare-func@2.0.0", "", { "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" } }, "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA=="], "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], "conventional-changelog-angular": ["conventional-changelog-angular@7.0.0", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ=="], "conventional-changelog-conventionalcommits": ["conventional-changelog-conventionalcommits@7.0.2", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w=="], "conventional-commits-parser": ["conventional-commits-parser@5.0.0", "", { "dependencies": { "JSONStream": "^1.3.5", "is-text-path": "^2.0.0", "meow": "^12.0.1", "split2": "^4.0.0" }, "bin": { "conventional-commits-parser": "cli.mjs" } }, "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA=="], "cosmiconfig": ["cosmiconfig@9.0.1", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ=="], "cosmiconfig-typescript-loader": ["cosmiconfig-typescript-loader@6.3.0", "", { "dependencies": { "jiti": "2.6.1" }, "peerDependencies": { "@types/node": "*", "cosmiconfig": ">=9", "typescript": ">=5" } }, "sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "dargs": ["dargs@8.1.0", "", {}, "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], "dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="], "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="], "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], "git-raw-commits": ["git-raw-commits@4.0.0", "", { "dependencies": { "dargs": "^8.0.0", "meow": "^12.0.1", "split2": "^4.0.0" }, "bin": { "git-raw-commits": "cli.mjs" } }, "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], "global-directory": ["global-directory@4.0.1", "", { "dependencies": { "ini": "4.1.1" } }, "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q=="], "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "ini": ["ini@4.1.1", "", {}, "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g=="], "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], "is-text-path": ["is-text-path@2.0.0", "", { "dependencies": { "text-extensions": "^2.0.0" } }, "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw=="], "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="], "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], "lint-staged": ["lint-staged@15.5.2", "", { "dependencies": { "chalk": "^5.4.1", "commander": "^13.1.0", "debug": "^4.4.0", "execa": "^8.0.1", "lilconfig": "^3.1.3", "listr2": "^8.2.5", "micromatch": "^4.0.8", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.7.0" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w=="], "listr2": ["listr2@8.3.3", "", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ=="], "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], "lodash.kebabcase": ["lodash.kebabcase@4.1.1", "", {}, "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g=="], "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], "lodash.mergewith": ["lodash.mergewith@4.6.2", "", {}, "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="], "lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="], "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="], "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="], "lodash.upperfirst": ["lodash.upperfirst@4.3.1", "", {}, "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg=="], "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], "meow": ["meow@12.1.1", "", {}, "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw=="], "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], "semver": ["semver@7.8.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "text-extensions": ["text-extensions@2.4.0", "", {}, "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g=="], "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], "tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], "unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], "@commitlint/config-validator/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], "@commitlint/format/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "@commitlint/load/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "@commitlint/top-level/find-up": ["find-up@7.0.0", "", { "dependencies": { "locate-path": "^7.2.0", "path-exists": "^5.0.0", "unicorn-magic": "^0.1.0" } }, "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g=="], "@commitlint/types/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "cli-truncate/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], "lint-staged/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "log-update/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], "log-update/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="], "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "wrap-ansi/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "@commitlint/config-validator/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "@commitlint/top-level/find-up/locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="], "@commitlint/top-level/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], "cli-truncate/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], "log-update/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "@commitlint/top-level/find-up/locate-path/p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="], "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "@commitlint/top-level/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], "@commitlint/top-level/find-up/locate-path/p-locate/p-limit/yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], } } n ˺ x5import antfu from '@antfu/eslint-config'; export default antfu({ formatters: true, typescript: true, rules: { 'no-console': 'off', 'eslint-comments/no-unlimited-disable': 'off', }, }); Bx[͸qBV-/j_.܃6ʼnJBFx4O+8'3DAOIKrK RKJ2Stuˋ2KR'K0L` - - \\qx a)L)Ͽi9x[͸q |j9wۥV1= *x100644 elysia.ymlE]U[f?[l9$100644 react.yml™b+欞1R100644 rust-auth.ymlR+2&McF100644 scraper.ymlwÔ(g 100644 shared.ymlE#.>!100644 traefik.yml8Q"g PVRp`,_xeB)ejJ&= 2]xiBejJJFFB4Xx;r٤8,39؊KAD7$QPH+IK-KMBHO41E-H5LMIXƉP3?(`T.$&OL+Bx;reBejJS>y5x8 uU ޽b6a)L)Ͽ0+x̐J=?.hҘ6'x100644 deploy-docker.yml~Ak'2িӫ100644 docker-build-push.yml[xZcF) 30jui100644 lint.yml=F@ z^{100644 security.yml\=ĞUoKb81100644 typecheck.yml'lۢ ׬`&d<100644 update-submodule.ymlR ]ìM$jRPx{?`:Kfda3TZ{Xx[]`B!{AbrvbzƤL ;8œ6q5qOſh f"d7: ^x[x! 1I,hJJ ƠwUET xx40000 elysiaC#*"ml (|40000 reactf:](cdցgEe40000 rust-auth5Y?Yn=e r U40000 scraperڌ3=8qĄєs2MAX6[x&100644 .gitignoreL;fl#yD(_xMEnode_modules dist .env .env.local *.log .DS_Store /generated/prisma  Φx&100644 .gitignoreQbi1ZTo xhnode_modules dist *.tsbuildinfo .env* .claude/ .codegraph/ .code-review-graph/ .superpowers/ .remember/ C$Lx&100644 .gitignoref@"ʆ\`/|"xAtarget/ .env *.swp *.swo .DS_Store **/.codegraph/** **/.claude/**x&100644 .gitignoreC5Nt_B$wy/*n6|