From 7ef6041b1cf09244a817b25ac7d28a7f4099b7c0 Mon Sep 17 00:00:00 2001 From: "zhangruiskyline@gmail.com" Date: Sun, 24 Mar 2019 16:46:32 -0700 Subject: [PATCH] FM in recall --- doc/Search.md | 30 ++++++++++++++++++++++-------- img/FM_withcontext.jpg | Bin 0 -> 26391 bytes 2 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 img/FM_withcontext.jpg diff --git a/doc/Search.md b/doc/Search.md index 5b6ab77..b9966ef 100644 --- a/doc/Search.md +++ b/doc/Search.md @@ -28,10 +28,10 @@ - [Classical Recall Algorithms](#classical-recall-algorithms) - [Performance Analysis](#performance-analysis) - [Multiple Recall vs Unified Recall](#multiple-recall-vs-unified-recall) - - [FM as unified recall](#fm-as-unified-recall) - - [Simple version](#simple-version) - - [More complete version with context](#more-complete-version-with-context) - - [with context](#with-context) + - [FM as unified recall](#fm-as-unified-recall) + - [Simple version](#simple-version) + - [More complete version with context](#more-complete-version-with-context) + - [FM advanced](#fm-advanced) - [Re-Ranking](#re-ranking) - [balance between recall/precision](#balance-between-recallprecision) - [High frequency vs Long tail](#high-frequency-vs-long-tail) @@ -314,9 +314,9 @@ And to understand more Mutiple recall needs to adjusts the super parameter how many recall do we use. but use FM, adding one recall sub system is like adding a feature -### FM as unified recall +## FM as unified recall -#### Simple version +### Simple version we can use the simple FM recall version as @@ -348,14 +348,28 @@ First, we add up all user vectors and item vectors and then do the product, is i * From math point of view, it is same as FM similipication, calculate all sum of embeddeing vector then apply dot product of ____ , the difference is only that right now we have both user and item vectors. -#### More complete version with context +### More complete version with context The challenge for context information is it needs to be processed in real time or near real time. +The process can be summarized as +![FM_withcontext](https://github.com/zhangruiskyline/DeepLearning_Intro/blob/master/img/FM_withcontext.jpg) -#### with context +### FM advanced + +There will be two follow up on FM advanced + +1. How to incorporate multiple recall system + +So for each category, we can put them into either the features of user or item + +2. FM recall combine with ranking + +From the analysis above, in theory, we can use it for re ranking. Also we need to consider the process speed. + +More detailed can be found in https://zhuanlan.zhihu.com/p/58160982 ## Re-Ranking diff --git a/img/FM_withcontext.jpg b/img/FM_withcontext.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e045bbc3db2040b334be7ddcf265b7d3ed18c3df GIT binary patch literal 26391 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 z%0A&m#^;139AF(g%_A`_N%OLK=9TD_K=HRNzOXdSWeMDo%a9U2~+Uky~VAEGZbPQn8dU?BZ2c{S9%H z*ax_uXC`J9i6$ggQ(1d8Ysy_~8>)9XAb14^!IZc5#i)_~#4!fXV(Vpe%A%{qig{^^ z-^u67so$Jq6A{lngm|V<*lJemGbKgE35#MJuF{ww2f75Ws3_182R=wj!BDAI2gEtT zAv8E{LN&vZ%Ma5F_IdSV9>h6k?DiEy@^EGYx4eif@;7-N*ijC4 zAM9I(RI_1D-*a8=L4=9ydCs@H1lj7D2wjZ(dT}umjC<{#JJGvB!^}rW(kZuNT*(aTg zk`-~l?F+sO^@K_a`-!{E#;gOk83w_m{ zZ~XHcWBg$y2^5!WRj;P40DvYN|z+}PM5Sg7l_yt-LLJ~+z` znam?fZtf}ny$!=3Q}Hzo^fVwZe^=;TUzWRHLW9D%!get!Q&hPA>Ojf4#mS-gl}JEr zZb5Jf^j=S9Lm%q@>An)Y!dZJYdHr(4!`>5~TWM18D_(3gM#m+A^g`lO?QQljg0n}A zJ7;%e3begn!+L3qf6G7k0nBxX+O zwZ-YP_MQWnOZQ2mR8_ej%yaSCN`TzqOQ1E z)y&iM3lsbjzvh-i8mM@`nQ#&rY@=^8+p?i@Ji0T(%{jYtg^$g>U70p|em-xprzq5J zndY!cu9s(+X*Kvb*p2Hw@&vKR%j3kx#ecn~GBiSHPapo}hPhrN#0EeGnKNGnmo-mSD)w zXhb!`)Qwg>K3emcWHqYu9J2QK)RSAR_tAbwc>W%Jl~45vxMXB(bC%MO;JkQ8e}Vmq zv&92>RyHQfpyA*a^g&VVLmPQR0mBle{1hy@bmYo7e=#q{_iUnEIofws#3uRIsq{go zWP;YhaD!0!4yw=)8VnBE-lDd!XVBaY)9hQV0bZHM13ydWc%*qZi%Rw~!E2HFI}XW* zvhP5uXe)A~=X)N~pkirjB9v_LnOmd!RX0+x9GZcg*|Z}Ax<<8Pk~2l@&RZVCYp zRlN&2rz^j1+^FOgR#v(t%-QKO?|e~KzomQumc#Y*q|PXoyBYN;zRjGGTIBf6ER@#a zJFmTAOA-5`9{E;TQ;jW~z}!P5S}e>vs(Znhe1jx=x)enJ)`Zi?>PBXxNe|pzkcU4H zEXKfRa1cLFuUxticGn{53AGlE~@f2V9S8F7?cLh97&D zB;qGlv=za}c}9bLph<5f?O@I!u&;dGkADGzQz~P|*d;Q`lWQ{AAtgmLFYlHN$Bfz@PBgN(#*jF4HO)Bgkhs3Q z=~7nHnh|LZQtQ)-N6`9$xmAIEom0wmPqHvx&vLLT= zV-7)P(6uCFT6)ddE^JX-r5^UijT{7q`qxR0EQBcRSzJ2W8zmd0^>=A#zgu3S_$htw z>X&radRltmSr#Mv(oT5Syfj1L+S=G zM^Q<{Gt|Cc`^x(`a~n|-D*WSGD@qx3G1$93A|5S-&gfKFYTxa?hR?E}8)2(BmYJ9} zYs#}Hh$6%Z6!$qfI576;B?tsS)0Sa{Z_YhUD-3b{N)nQbQn}Z#&uFQC6NToSr%k)N z)kq^61P~kO=y1Mo&ETlE%m|pz)fJ%Wf&DjeiIghK!U9Py<=fgdw=@?8! z;O*`vFkg+`@}cZ&Vx%r>O`jLCG~&6$L{+CEZdB1=e`1;Y`LBc@@|s6}Fe&EQ&KaTI z?FQh{ZtvzIj@ zZlno0JDID(mb^CnoW6)lG$!H#j68gQWLE5samMa2p|vXPM1@}Gik`ylJ8=QeO2Eae zCZ95girS=}Qx`kgV6fV2OBc`uXJyN3>$4yXAIHFpvpFqBy;8pK(Wav%5WJ?4`)~(f zjzLOg)&!2=mJ!B>c8TGXp<4XMMSmEL%E-7jk|! zxujL>cPTDZWN@DcmA{lRSa`F`kcdohQ55en;=H^AnD5gd8SVgiI?0F86?3IGNruG` zeUU;i;zdwV*o(DvrBSsqfGAAqYTI(0c&`8+eB+o~twMnFY6p~{^I%Sx^ysC;uTyof zL}Xy%K=vJgBkkHa_c!HzR7y?x4j{vHqgzxDer4iz9tR(DqkzWEE`<*B_ksJ)8$^1Z z2EnZBEJkKt+yQbb2k;`s3kvY4D3$5?^e?0^JLbBR@N+I`x7ZTSn**=Yre7Y_A!#n9 z?J2O8jZcvmq()~(Dp#y^k6V)Ym%~UChs^MW9Z#Ht=3~6!d&;ttr~&hD2$mXo$7(Gt z6+M1;{4hCz0aF_@(0py2kC(f&>nzg^()QqYN%r}pp=s$MD^c~>5x2$DnF0a0)rb*) z@=EZmbCYOw9z@|Av2H|4M`LABBWaw$3Jx21MCY^HZCr&uE2G7j`lzhxB^eGlQXh?8 zVlK{d>?&XqZi)ySQs{k$LRb{0@+UUyrq^{z{RWu1EQWNgm-^>v$0VRwpad~keK zdd@NXIA}4tXT-*I?hJ}z#!F@yUy3{dFsv_5l^Ane-0*ZnK%Y`Jf~{ybzhN9HSzfIJ ztnB^mg8c)4A0Q(A!=5svj90|cMRK0}tM;^SqX0VgsMK%H`nn%rsN{B`!xi5^36G{h ziLtJ(nALK#AlB-zgr|EK1J!dKRN%FM$87=EF0smWB+U+W?!88#sgteW($z9xd;Uos z#iY!@W&S#O6U3PF_;@QgZE4hX3I;uwzYm?KpA8>ilSHie;7|uHv+3=AQr59)9^w$B zOgbFWR+v2SV}Mu=xt8&wtv9sTO@=RWW?fat3JRtICRcCUiewepSzy! zg?c}S<*^Tu&X}n2C(7FM(Ns3rO**PZhzgQCgh%Hd^e`j_t>~moU09t#REIdUNKt)F z#GTwH?9Xb1ss%0gX#rjKTXN0|HBxi-Qrpq8w`XZbw8~lR$6#BIxAcCV6r$E|+q=8% z%u1LTK8V1)P?b$Do$q57&9lU6d&%_ytDrl;8(Xf6qQ%c(o^x+Km6@9iO-)@DiSn35 z4)Lt&62&|&Z(+RobfItJt$1VF`ZNJmmt_O3S@~Y}R--aGpDr~*<{J_f51D|Iq7#I? z1Rt@j4qH3#1H%FXUl*G@3J{;2++J$3pwvDbQY|VyQc5hUB2KQFc<7d-iF_%`I1mFdr!Xa21`^=DrhqDq>QdhQcJ z5OD(} zz9y7ET@A@3Mz`mTNkPNMnnI12RAQ_w9 zC+*WFlEdVn>Xd88K9Oc}yiI4@6M`2*9X^igZNDZI*-!);8ebawG#xnK8^6yCnQbNC z{N+9)pR|u|Gt?k?im4QN8qjP5u~Fgj?|t5D(qlM}iurzCn=kcnJvJ?gk&`2k{U$Rl zm>gUJVp%Q?jsZO`pUo=$lH?+sp0FiT9p}dr`yMYsk$#*)(E9CX`iRZfM>J2&TFSXU zC|u&O#ry`Ic0%ht0@p|jIi98LsAwUR`=LDT;E*|k3@aQO9;2gZFa^a=ieYZR)&u0h ze8#)|ix4lHqU!m%`PkxWWHVHca_I(6a0fs>!g1Hvm6>t$@VMRFyLE;7jT|oF`vOO5 zdwvhkJ#J_ZS|BMr{00@Zr!<9mhRG10#~=9C3uM+N=*o=wD9xJYLlM~8<8v=;ERw6n z@$42nyr#LTh^i*xK&&XoC+4&ocyUpBZ#`s|&bO3#w>yS$wK zLQh4M)+kQ%x`uqvkCb#*BJ6BN9z;={!C5siAuq4U{Hp>d2;WuB>sRAVp?#z@2t3|! z?}_Q^_L!$htt1KQ`9-ga&rnP*30-ERPt_=E*T;-F1_w{85OV5*K_PJG@CvSBaBS&Fj`KTrs2V1g|PJw^*!DQG5nDj3keQu%67U~t_8gWstp zZQ*b?oggt~u%7BdR^Q=5Zk|t9+T-yubk<)cGkN#-B;?rZTo}l%diNGZ60y-<|30~lA{QmIBY<|7%6Czn{Si-FMic6j>=!#Yby+7 zF$#T&=x;k9*+eD%u<=|{3nT7IKvl>NKo{0u8<2@!O5`;1JrHjhD0Y8AC77wk^#NjsG5%smg=al&`!;H#)tU#MLV8a~^JQTEDCDHOI&&vkYPC{RBC6o9cZ zck?!75C8Wgju-F>9b5eYDHW$MPqoh6FG#icyzN@DN9obc{T?9( ztVLoP$80L!)A<}L{zbsUj=HN{t{JLdME$2yTT-i@3*Tg@V!%B%qa>47#&&MI$HvoF+e#GE|K+8B5_Y}eLvu=V)No+TK2lBYKq!Y}&eSI78Y`Xa z0OsK%oJ`}fN&O6Kg#G$AP7I3Nqf_K%q&aR2kh{eN_UsIDo9p}A>G(1!T6JJbjvC!r z{sAM+FJ5(W+n{B_+D`&?gN9hx9iAqbK#jg}KfXa7!@tS-3wv?({m3C*BmMy@%?z*V z&S~5C%e7clQ=L>%G*OGWb}SvhCROrHX5hb#gnj;RG`-I+D$R?G6yT70`~-ixN4%RR zZBHix^Ws;z+WD7jGwl~IM##=oR^C_euxy3biH85j=8eSkx0Gm(@af%Nh35u^DO$$Q z>URbuC>~0GC4t*dPAFX`*GKT&O9kYB&R_QNaF;r|at}CtSdw{2($fB34Fs1{^rAjo zv?!~Z+r^l2rUrY|#-#a2GW{jG@Ah2f)$H=2p4GzH5YMK4VLTh(&x|@9C6)d4az+|d zD_X9U|=N zNUia0#8Ts}wue*sCXbC*t~3mpydL~(3pYEL{JH%wFa8qtY(-g2#=!;9)H}nAkZq#) zvR}oYb1vkKL8*^?KBD9#z>4H)yu@du(sSUN-1G z+PwS#B(LR~|9Z`HZ!!0kgzvXL{P78->+g;B7eA~93r%Cy`eMY|t+id4`wFYyoIVe( zkbcm2!hRks`l~qierQ3P_&WMu1OA=>&5{2`6W8Bc^&OqFJeOvecP~eM?wQuUUy+?7 zc&>G#!KqJ?%1QiL?t_8f)PXxh0n?fj#yp^K`xjQPjxk70oN3hzi*uTYGNeMl-$hoxLjJ39ccAo@X=xayn6In!Z^={w&G2wvL6qGSOJJa=hf(St-^NiIA z<30odDt12~!+evpBHD>1`m!yE-pRZ2g4ijXr2{2XNM(6quq}A*!z1WT~%3G zb@4(ADMJ+X^TWjlh2<(EIx8kBhfVMB)ZS%~KWwBPHw>P9ra7oGDED5aX~1lV7TZYNG;U4XcE*@5H^AgIq+cPVS=q}G=F{Zd?Y za9ef%TVox*-+28W3BE!8x9o{Gc>z8=L9_yO+p&%8J9x5UFP?XK`AXw)csrWJT|b!W^t9Ndq~ld&p`cN>@)edI6rQhY zE0uj;m>sMXN3PWaZFvI1dgCB*2Y7a$F81BP?!^~ELZyzr0K!t|;b)aO@rrsLS#ZQ5 zcfGoTWdDcy1o-%jM~L?J%q+)rj60*|OJ}p0jVIDzsBbte;W2HBk-Riteq*_?B0N=5 z-Osj+7uSS-@7upT#MrJ}g_^WV10cz(|p@U>XN}4mqN!S^WWW!j3!r-037Y zbMFqa*%Ou<_>J^VGz$&z8Qv$Y;?BptY8~J*i&blG?~`b%w%&Aq0=N0Nw*M=&%Q%oV z-r^RU>GUKJ=~AX!aH7P2`%Zgedq=>X15dyn5$5AV`u+5~BD&!ea3l=!fO`%<)tITV zhom5{0@u=a75ZfytLb})8aaL!-rx`ub*;|UH`{1UZ~us?ncCvy3n5XPl_d>18d`i0 zA#?gTly*_+a{EPC-Fh(-*eApEyi_5$P}ykFziiYnw?=1{Mwnq#r@~@nx!p&mLAd+; zNrjpu#Q3Bt~TMi1N53`WL3A(SRGZ<1xYW++(15Pp!)Gsz~RY zIU+SO5g~rcpN#iGO&KE#8@ru`%oDHen}ZMG$}{Y_!dXOCwcrR}aY-&;{Tib~XE#+4 z$wFP1c%hrLMnQ@8c|F;Ss+kuJZ?3{u{CE_m`p8y4DWzgG)kJ%Q#9&%F1f1k@P{il}ayVvqa zT%kknJ3!IEwWZoWWr2|JRr^2E-T$isle#&rciRa6xIa$jLl4H2z&Zul@51SAFZjrk z0~2%t5)x5gF1VT%^{$lE5Y}_>tP&B_b8$jsFZN%JOn(6^Tj{Py=@zOtncj@n+bog= z87_YVu+Lo*uYvc&e)OJhKK^mebS|MuHaRukANV@gG-~9d!uxw?=_=LMH z#pJ2~jr4Co?e!`w3m*q%iT)SoiGKk}r>Y_-+W$1n96GNdCaB^Rf3)^=fl|)Nb$M6E z<{$h6-S2I8=)d@ze|nz5)ne|i#oCFF<+>z>X4^oWicIEMUU*92w8ZAYfsh8-OFn8&GEz_IKbV{y)@uHzF|HB zB&qROoZB2Ph`7q_vV?VHiu|Di{;>RGVRa4i>VWv&j=(B8D9iKT1DR%bj0)2_1dx6()7Z{ zu)@=j=G=QB!_(cy_E(l%fB*T2DL?GD=o#z5bHokpL4oyLa9BPtGNk1;G{fcl>tBgT z>BF7>W6}LTl=#1gal!stl_Emn&HVd=>@RYedB+NGtYn^Zx%P#lGo-^ZSQEnYtogoZ z$-=(30u)RTmxJ0lKJ0E>bvzS8h%g z>F78)v;Mj(^dGl|{znjAphl&%Tlqw+>_EYi$O4BKJ@#hn)HB@mrW$1nWQntRI&W7@ zvC{^@Xy*1#4}vqZHVAJN?K8d9CiZ4cJMoNpOnfYXJn+!ibrse0TDD{AugggPs-3m2 zs!My=wVyX`d}+jiiq`F~0j^w6SS~0~zV7rWHby%QZdayj?9W<)`K(-?%=?o#^Tg~T z$D*F@o43vjV{`S}x-`x6BNta9wgyt=O(*9jv!LGziz;fj5rP$4WN!&cMbZZ?N9hTJ z2ub+=?+Eyx)M@MXF$zpa@j680Njj^Mw@vwn>Ss-TDcT?xh?HYQ;N~uLZ5e~U8YzhC zXbO#@U+&!=mU5&-;HC+wkIS+g*a$maN^d+n>1Q>7eW{wGX-`O%m(pNoGOsue9gBcm zW)q$M4jjwC+c_RI-?=oR8~@$olXc79tVoZoutRo#dKihgUWewTB~8q*mWeH=mSyBh z0@eC#P9+(-{H@0;vW822s*hwO$lSjUlh%e%rqgt6_vE-@1p3V9=ef%=@F@~4`_2H( z19h$+naClF^qqeo^NJloMPB~oBZMyQf5s1qb#hA!t7q2oGjjwq@eSmUa@;h_^;k@d}AO)A?Q z_IDIh1>(C;tVB&zOdd~LLxt&iRp{xX-0u(HX+$Sk-IZAx`OhgpoB~urHAyO$Mi*RV z+Z1{Xb~XCY!ldks^#zaE_(C%{JPi7rO8iX(&q$FCfPL_*Z_VjWPi<4f`5E|>BES}! zr)x{zVWjNcg)2uFxkj})qth)y$6U2>^2G>59Q86hLhH|Kb^oIc^7rMu|BU5$YihG< z5UiXw9N*8S@GlWhNr7+KcmVvy;H&?Lqx`=D6*@YXTa9$l%cP>hg2xuPb${>~+`Q%b zW`gHT#2dqA_5QiUGlD;>#0MPD6q-MFhzzCFr5#^iGi3#BfCCY-r%YdpZwp9=Q{f`V z7kmLGfflFgfA$SM>7Td*Xhm+l(M-Se{qlqBM|lfLW3La$i0MIJyE*mN1$L!H<Y7x1=HDYc#>j(;?( zNlQBxe&|_akNQ*>3jcx$$A)+3TtXL7@&1pjsy?^(U-}|AKvC`PYp{qP|0G52PiCxG z2K}05|6qfi@a2iXk8!#yqJJaShnd={<|@bJmG?hzK8$e9;BpmOzc^QuMgPy}cvM~2 z_pN?6-}Y=36xyFAm232?F@!^AfCCk^s z`|GdT)9a`KM|R?59{#q*<=kCgV>F3rj!u7sK;4DG%~g-Ku6a?V<}5iw0<@;xh@mvr z6pRkst$eUz=saxdD*VWI2vi*|kQ)KT%_**_XZ^uu9p5*wM|f{(;$g3Uz=!6(&F%Am zV=a4F^5O1+KYw}v6p}+e%^Kwk#G9EiXheX2k2X%4Oat2ndjy? zpQC~E&q4IApSK{9JgI;m>!pA#Fx2+W6^rIPi&+1YXVk($2n09`(?+*r(c+_29(;`EEi(7 z-dq>CSB^j{Hij6mokCzjn?F{5U+%Zgkg(?aWkGDb5@g%Wte^6I5~3%^t_{Vtlr_jJ zmg{<-U0vT?y#)GF(OYP-qQWG;K6t=JoY!rCQP}izZeQTl(ys*;1mirO;KW|LN>>(v z=6z5;B5T{i-T!>Vg;Xq*yXK2xZm>}q^1xxSw}u+Bko~jJjriPT!B*;z?;sVJPTS*z zA089@wR<4vpNHsQE+2$i-fU!F^)FUy2W@Gi{6@b@L3k(l@y-i1X02|{vT?l7po3{V{?u1(*w!e%oO=FvNqVl!gPq_=2_5wMxFSP^bY#Glnd-L)Fng8oOJX2;^jZP_iRQGyrbT}PC9)v zmUMYd_CuSKzBrs|+3%g4TmFFm^u?c6XT#I6I+ZcR_2% z!pz}&c?J7^8&E#_bQilgfoU znX|Y4s2idc-4yuJFOSVhC}h?|QAKq_MXO6;o8~!(`G>xAwTps)e{!rQ%V*oaVScci zU!285GztB`vINiS|ASqj|L#=4v#iqLLsK1>H%-HT&8qiG$OLwMz`6tx|GH$r|7z#E zqMC5Fy@Md2QshsEPz03T34|^xy$J|N2kC^+LJy*XA|M0_y#=YE1w;vik!Q&a4*;nS>S%Gah(Utx5U)4tx6BbqE$h zj8`5O+x5O0%<+AWXX?P_5#seLs5nNQqMFH*YML)54`ilX6jH)OlNEWPOwE{|u6QXXTpqT)PVT=Lajvh$u&tKERMDbYxiyx4j!(uIoU_J$)mU02pD?11{s0EFla9p| zKry{@)4zdkhJIK~tHzAtkz@~dM@X)MW8*BgFa!7GWPF}Lpxm11o2;Mn&>AW&XVe=j zQEeKgS8dk9F06ojC@V^c&xF}puiM8KX!TXUZ`PgEQ_Nji!VibuW-Rn`JCLRt{Cq-f z`1M2#pwJag2%7mpupXbT7v0?%PiuZV!}{_CcjvYwc(n!csSrD}n423_Y4rVDhj`;R zevJ;-u6-wwkum@1jPYNscQdNr6CnbfYnYO^S}CUd;iQdAc1xfBwo2?f7~oId+n;g2_z@zK-1%~KLDR;8v2RK=h3Z$7|hF; z+HPBVP|54RbV%wy`Br>d5X^>R$Ba9vS;M{`&dmf7CCM6XlU1g_*l292FP@)RJ?3H8 zMqvx<{8RVe>$0?C1ZDAr}@N8ct&|Fq?zOXyZiIG zE(D|;>cN-FwT65i+%T*`IsHpUtnOoheB5ZKkeA|c?4GbhZR5kW-fYoCfzsz`W5Gd9 zx?=7=HMOf0M6H2?mWaHPc-vycoT`EPvqgMS$^ACx6%F9wdNSf7jLvln@6C{f?mUn4 z+j2FL1jY0PzJl%4ymXpo|Iy*c3cNvvqA>U2Zzq* zQ)I>^lruowW?Y>g0@<=4ECo_RgV3&l;=ZyO#0J4Gz@?^{$c7Y7zZ^Y1 zchg*ucXKL(TYRUS2HNhfQ{7UO?>70`HIr2*ZLvyKSmZ&`r;t8y0oPYqIuiDu(K?44 zBcIzy#WUyK$S!gvy66b@+5LetKUs+?BgC~z73Qz+wBR5EjC3%Gf0V)JwY=U^YPK?)l9#sg&@jQ)aCS4fzL_06CM4aIZ6=0y)Mz(7dzWCAm4$4tz2c& zW$DqacfU|C<5YzxLFNPFpt(JwJ|R#FCTpxn`S;)@H84tL4)M z?~Stk0Z8;(7_t2(Yzts~PwT4}M%c4q#Yh7Ao3Uk?QAGk|{a*gA$DKxC_#nEcaKc0h zV*8S!axXsL8y_ISsU-Pz0TFnhEQhX>uz&OeWy2ith5U^W6I>^zg{(P#gV1FJx-S(o znnaWSz81rp=^v4D{y4saR2los`hf9DauONHFR26TwDyEqy0N-J9i_@({L^A%;CR!vUzWv?e`uU5o2{nWH~C_$W8YTJJALqbffu!+s(6 z9Yi?^d)?sG3cVxg%)x;Aa*n z1w;cZpOGXr-n3xjnOE?$xIz7W!_hvx#?twy7*j{F=@vrNCc$=#4Jg$2@#r>3KdUchHiD^J0c3w! zt9Vm#qIOsM%3<&j9Vhr7z<9f0OMB$*9{{Th=WBH_1Dcn-1OL@~`S;I-aI$}*KYmzJ zH#+Lw+d2p2XjY8vic1caj**Tq=fXoO*FFOzyu;M?s2*nj z0SGu4-_Tr(6kqI&Nf_E_d176?YdJE$=k)!o${EaTO)(sq#SagJc8d(&Lo`q2bixp( z-zPdHL-G_D8&e@?v`0Q{rxr400li$ws2_SrX>HatZu4JYTWl-myNHNrR9I5g&vN8hCW)sS(v!Kj5zK`5G(RIMeV%J;V5uJ8Usp5h?Sb}B9zd!9E-%ci~K zK{$h3_>P7Hrasvj_54N2>?~fxcv|-p8gx)V879`Wq1VM-@Xt=2e&zQRvbr1N1!4# z_+Pj`QctOoX*j(q_>~@=o)VB?)XuPMNr)llIZ3iHfTIzcnmRqvMs#KIgRkxe%lof1 zHw$#2%5NuYY?;}os`=MPEP8oohGG+|GY14?GlI9CI885Hp#+70CRMyUeyT3G>;(rd z_2>JVIisTko;Z4}(4NL@3{P<@mz5+0r6En4%%AqS>8rLzQXsr372fOE%?sF*e5m6qrd{>SI#s|Ys1Fi*} zSEe|&En(rYe$(fZPyPUSqn5#|4j%r8WCcU^fWx!sX{;bPS=G~}PslFn%Qv?(pI1}dxq_lYXt7GaAD&rGdd8`7DlrcvEaVlosh^S78yl9Ztsuq7GT_y>z9*;$zjs4Hf?ZBimvVMk3;IGmO)q8)fv9IyOG~U*#T3U z9b|f1FIsPEJ0bl+NU1i$+s3!VUF_-&Fk>lnjD+y3TTbMWm>YaYCZj5x*NCQl5Nmbg zA~5jC_}6cO(9l@7fsr;-v@4S`pDY#)IJVp{i3g`yy5fi1@7Ac^Zd#%TQ73}>Lw_ZZ z15Xin4dS)$;fnhbNMc4(EwoOTgVQq0q^<1i!R%~yjw80%`V8vp>G8uVH59y0eLI6~eM1mhxKh0g`-s_ED2uU)z%tbl5QS_ZOnEaI36* zAP^W>QG)yrb?x6ZEUYn7HCRi0hH-bwcPh7=9TDGSh=G$SQ_PmsWl&ZZnmMFr!`5V9 z6)x4U-}IR%!;9bDE^sMZcfPeRr$h&Ri*p(>C%V%2c~hKzvibY9EziDHmmfEXX+?h{b6vM<%q*21hyngK8y3%d{p29{hEHZi+|+aA+4 z1}6Ng_8hfM328OH`&~9>(AS31&Noh<6NbaQ?Dr|TQ#*YU^hvzLs>L4i@*p*N+Yfrro>ryUKh8IPBlJ8#mg#kE@2XiLt( z>{qk)D}OeK3;Hjnk$QK*>67#9+{LPgois;5@ zS?N7==BG9ZA56hbRfrC$>KAUeJ*E^AmGze8EnaW>s{g&4H!u+;esgJ9O`VfWw~0s- zIo*cUesng!-oWslp^70603aq(mGY#o(h0am*-M+S55`kbn{fv>O5~=u*?jV2o0kt5 zR4BrMwi=?pa9|e>UM&1eS2zDIa_otD=YZwuylhOzz>~mI+*jD00NGlmt}QxkE5N5{ zleGM-!!E}Vq&-jeN1`D>eF*c1w$4cr8x?+&tr)1r z6=3^1$Qd8%ctabW;e{Ph7dDoB_)%JIhZ;b!!Y#|Z5#H@iZ_;6`H|>U%Ue1sL% z_^9o-lw&{qL5L4d-nv5#C^<>yX7dQ@ni+U>rF;{#TuGBnWizc8d`N zoh(ZNUFN25shbNi&aMIs=7K?Jh^0^kj&*SLDxK&vZJ-5q%d2>r)&sbafR~sin4YW7As2Qm62k;YNIbk7~ zy~YS$5JE}|yq@rs<@B2J{)xr8)KJ(;~+Yz5lx3Opq+>R`9W40hKMFyVq`D=aWAi>Du7Z@__>x;Gw z>k4xP(z4_?9F^(Fw>akjAC5l ztmI}hJfnsHYtR_Do&Byj#<{%tU5J&E&`No8q8Vo~(+}z`bSJnQkvIar{|W+E7|`h+-1UaBCcguLYxAeak`F zRo4__mekxtcZWv5@xv~#a#O8V^^DnLjUV7qolT$(PlZ4G2|Jpb=`7hzj*kz&K8o#! zM0wv_jY&WTp$?5*H}Ma?D%;fgfds`};?Q`pvQe+d+~NmjmLVlhuTK&(6;4kM4Soph z()(5=#or3hq%e4a~WnLf{_W(3HEdCa-H{?z~oBG^Lb+V`maZrrnL5- z2eNaPL;6EGXStC$*S9Owo}B^enf1*L#lzy29TQ@97ywn!D(gx<%oX|UyC&VFaCe~^S|MIeEh)r0uY`OvMb1S&7As&6I=f6=9r_JCdODE zMJjzdDCOaZFLYhsbKPejm##9Dbhct+(}j1SGMyZ;YpS)DoH#?J!s3}19ug0GE{44c zM$aZpqn0sHA-idJaWQw|ZyRY={!94KbVnxi%kMJda^lD-D;{X5{27ed+Kk}W2yFqU zuAg7#{iK?lF3dDu9uz*f*qMQ*Bd5I+RrQ~O(Ru85G|wc;iF(#y)Zlh`-b3eSojQX2 zC7Tg*{oDOeUzzJ-$A_}^wyWD#1|#2#j!kPS0Q0H@d{A}uQW>{kepFD(dUCjne_@}g zpji6VR1f@PN>itt!885Mq>E?O=UERd6^KR;Pp-ZBg2IWJ#NooOaXv9??LDwopvOw3 zI4A#u)<|@ZMUo$#@6W!9iv%2CV{9x1#tFkOcm~`*{&HY<&c?`%^M7aRx`WqlALu&| z=3DlaB2C&Wk#N76vv)raqDf4p=z}d$wDGE(@?9%QU$fEl@}n&g$SW;)R{`t2RNe7X0F+L!)%%%Y9lC9(5% zBWJT6!Oc+@TW`Yz(**fNEc9>A%pg2=&n8o>GyTgf)?O}*Uczn1wIR#^;37MjwT3!7-EXyn^x3`(!Ai>FOtmin(Ne` zF~rX{A;*VvE|oJv)q=uoJdapP6X_4UwmNeI6vAs_aQ@`H_kFc62GEhZ8*yrz!SAg~ zXY^MG(jTNqF*NzZTa62icBU^mRu;VfD z79)DmTS)aQAL-ZR2RF@swP>2EPw!>yBvs_lYV@c@o^=c6d)Yr{n?vp-Oac(cR#WBS zrC*e^`{yzRYVD^f$Vyp)Q{eg{+71(@RtmoxZ_@9N-74BLQ?P4D2ik|S?*tHKXTEF9 z(EruG$5DR~^vbOI{grX)H2T-&*Om9;6Z!=Ol@k+27VcOED}^bH@8P(T?Rgpt0A^PC z4G3OQ;yk^!%dpUO+*Y0O-Gr7syY*vh)z=g9$)Pnx1_nW~T)yd4O7^OwV=2`cHISau zhQM8Zq@RcvG9;_=K(Bid9xyO=>U8#Nl8J!Sw)?n0q&Rx&aAt%-g&w5iLXLdCyTlDg5tQEC*s)+|fGAvdxobvTc0Uv}jK(U}Hq zE-x8A;fo4m2xHNQVDJXd^cXvVs-9{$OFbuwb~* z*wI9_+Q_-jU)C%SIjh+922R*_L`ScUFjGL4^E+~eEK?Z&(uT4iWT6{6UJyNXz>2ay z*;NEEZ_g!-r27noJW`Q3kNohr7VZB(3+(S|%l{LDlRm5@{dSQRy^eT4Z7qXh&bNzp z8uGNLK2Y~><&m!%*1zwwubh?Pm0n|n%|nM>HlR4eQH}wG81?8l%@e~)*~nl~JP2dW zYVD+)X8z8|0*wKUmzS32M3|>AWm+#GbsTE5Rd{j*gQm<1%65=B%LxhrY3!riy#b75 zNESU(OCm6_;x^3)gJQzxVaKn3={W}BwZprel^>=6c5uKBgS(FY$zSV|#@3T&dE>MX zE4t;wPiQlDXNl$}Q;gT@4EykrXu4O4F;cMjRe8vVH(mq4$5EX1y!UBH-k=H4sLE(H bcX#hLQvG&&ToruwvT