From 9175fdeb54d302eb4a82641236db8d658aaa9338 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Sun, 4 Mar 2018 03:57:09 -0300 Subject: [PATCH] Link uwebsocket --- Program/uWS.dll | Bin 0 -> 206848 bytes StepmaniaCore.cmake | 12 + extern/uWebSocket/include/Asio.h | 192 +++++++ extern/uWebSocket/include/Backend.h | 17 + extern/uWebSocket/include/Epoll.h | 265 +++++++++ extern/uWebSocket/include/Extensions.h | 29 + extern/uWebSocket/include/Group.h | 144 +++++ extern/uWebSocket/include/HTTPSocket.h | 285 ++++++++++ extern/uWebSocket/include/Hub.h | 99 ++++ extern/uWebSocket/include/Libuv.h | 183 +++++++ extern/uWebSocket/include/Networking.h | 259 +++++++++ extern/uWebSocket/include/Node.h | 202 +++++++ extern/uWebSocket/include/Socket.h | 507 ++++++++++++++++++ extern/uWebSocket/include/WebSocket.h | 89 +++ extern/uWebSocket/include/WebSocketProtocol.h | 377 +++++++++++++ extern/uWebSocket/include/uWS.h | 6 + extern/uWebSocket/libeay32.lib | Bin 0 -> 827012 bytes extern/uWebSocket/libuv.lib | Bin 0 -> 53014 bytes extern/uWebSocket/ssleay32.lib | Bin 0 -> 77144 bytes extern/uWebSocket/uWS.lib | Bin 0 -> 97584 bytes src/CMakeLists.txt | 9 + stepmania.nsi | 3 + 22 files changed, 2678 insertions(+) create mode 100644 Program/uWS.dll create mode 100644 extern/uWebSocket/include/Asio.h create mode 100644 extern/uWebSocket/include/Backend.h create mode 100644 extern/uWebSocket/include/Epoll.h create mode 100644 extern/uWebSocket/include/Extensions.h create mode 100644 extern/uWebSocket/include/Group.h create mode 100644 extern/uWebSocket/include/HTTPSocket.h create mode 100644 extern/uWebSocket/include/Hub.h create mode 100644 extern/uWebSocket/include/Libuv.h create mode 100644 extern/uWebSocket/include/Networking.h create mode 100644 extern/uWebSocket/include/Node.h create mode 100644 extern/uWebSocket/include/Socket.h create mode 100644 extern/uWebSocket/include/WebSocket.h create mode 100644 extern/uWebSocket/include/WebSocketProtocol.h create mode 100644 extern/uWebSocket/include/uWS.h create mode 100644 extern/uWebSocket/libeay32.lib create mode 100644 extern/uWebSocket/libuv.lib create mode 100644 extern/uWebSocket/ssleay32.lib create mode 100644 extern/uWebSocket/uWS.lib diff --git a/Program/uWS.dll b/Program/uWS.dll new file mode 100644 index 0000000000000000000000000000000000000000..c7fb5da7421388a8aaa4f3c867c2c7411a51575e GIT binary patch literal 206848 zcmeEv3w%_?_5Z#|7Fe>2E*Kz6l&D}(gFy{0*gV)xd?aiLY)~M^B?%mDqX0t4qSbzN| zpHF7z&g0CPGiT1c&YUT{dbLKc(P#|#mt~En5x?}8&E43JQLE7;jeR*u^TOaaPH)s+ z`Nrw9DsHGsUA*Mh>z7<}bLzF%+;YpU?$n=Nm%7ArOX>}`q)wkvl6v#43$HtG*svjK zD(F8;uYM#8yPpmGcO1-n_TTv4`tF|f-}2wL)_=!;|GNHP{P*qkhwxj0_`~=;W9gV@ zzrn98?0I$t5C7}>4*t7){Zahh{OammA1 z2jW^ay3>bhlQfzPoksJG5_;`${95pzjWF_&AKnD|!e8K5vl>(-qT)}d$p)p6kkST! zmCxOxPP4j5qgiOxYm$*lvp}zzs^+8A!N0|N&AgK}nx+z+CMy`&?Rk5)PLqt!PQ+(- z2cr_I;Wh4S;CTdTsP2#9cQSrM{<0Bs zo{~%>osNiB#HZl*%^vBR&bvWL_&+Bh9yn^O`2C_sy6p4ZH&r1dYZqOQDpES9n$8#{-IA&$*CGjT3$zJu*dfu< zU3b&1NchWGE!8aVzPaPD~;&Z&Qd zlU%OV?9Zgw`}5(;c^%Ft)%aXT&Lx!Yw-XW8bSHdww!&HZCpeSdM3`w4oYJHCe0MK= zHHYDAmITU;49dNt^Y9%?h zH^E6xf%Dcgh)DV!oC$=B;pgy;?Sk`iF`R$?9$~AgGMl%<_lw`a_rPNKOrzlB{|ukM zSp(m&U%{7r7o3x+pi7^JbHg-5y!{<~kDmtLCC|b6YZ^XVKZElvRpz2%IBVa6GnHz7 zwi~_+v~W&+4xdsBd_SkklnHRI`oD0VJR4#1yYQWJ6P(}L;QZw^g#GyvI7=UgbK7); zttDIze+cI{=yCi1wGmF^AjFnX8IMtYNBslNp(pXV>mYpFAA&PG6VAMM5jK}FSW1ZJ z?1XRaS~z|p&gS)S{`f2+8lQsiYx;a(H$Debj_JRKZ!Gb_H=E#$AQG>pdX!U=dx_Ww z*TeV7!|r^0F845x_bJXnOo@f&MJSmoLHe3B~IL=k^( zhw~1RV$TzPHK7R?EC5!R-=+|&6NZ^$a4?RXj-au?-odTcvQ8+_Jmlk3+gIb$ybHcH z?eMV|;OqD)eA+YM+(He1${aYGiG6B_ZTC_qerqF~OZ9MWBsnyhxT(Az&h`i4%qBK# zU5UgGQ(L--#0ROv{*4&qcSMb!5)E!9T*edj4=0o4OVMxP+;AA5(7^>OgMLy-5K4QJ~AL0BnCkj;0%ckcD@o%S+(Ra4>Yq}U_>LfAs8`7RRSzkVG~ zB_*kQ9=2rHAKCfE<-?fCs zof+^k0($xja2lwa9$pV8_XR{udkW5MV&y8zyYnnK@0|f>A<5mYmk{weQDZt0vHdUb z-S{P(gmO507Q^Wp4=4X-IQQHHr-m9zBE-EeIImJ0UG-0dS&9F?EQND9VeoJ2d7lwo z+K3N2{(;YD&xLc}%W$ffBJ4RL$%}+R7FG4@b~tBJjRsQ}dV$(}3kmbj2~-+^`jXl= zojQ95G2tFUXr2V;cU0edsBUkN5L{2x*h9|!zlXDb5*))AM67Fs^EpYMe^W23BYAZr z;nG3aPojpJmx0fXB!V_m8=ZO!d=2lwd7k?D{nS@qB6v?ugJY(=S1&}^LnGlV-GI+4 zD9KYqztbOqv-Ulil&bQQL z4jM_c^tppXUoDLbn~BYms0y7c;JihBMwt&$I`>*Q|Co)iA^!s(?{7z6#b?`3@%bq+ z$Zf<(_niqRaSkG$^T6Tr@x9v-_Esf6zc?Sx;8XFr@O?PvP;>u`B8g@pK z0Jw&L-d6?Z6e7e0)JA{21WwjXi1p5c?^3GA5faUl3Gs63JwLO+_t!tcS^pM3@4On$ zQ_te_0m6RMSNQb*63$l?TSIj#xB<>q>OHqmBkwPRa}6ORUk6_?L4J{%aW}Qmo#eZB z9ULFkcOG@HcL~#(zlC%2El9kM#u+_z=NGAI2NUhzCJ{N7IO1|A!mfKBzV!spM)GeY zvGO&QaQ?O#PW7X3K6(I74Sgn)#JrQx*hvLVpmN_PCj1$7wb3i^X)lH^m3qqStKe)P z-qjL9CMx4%a1LLH4LAc77@)ua1qLWEK!E`Y3{YTz0s|BnpuhkH1}N}DQ9#;)Ex?Mp z^K};K4oQ};+7eN4Ma#E3ONCB{)AAA4lk}E~)s(a-TGEJ|1D^vF7@)ua1qLYa-$a4g z>;SVH1ugT<-)xAoi5EwFaS40RRmy6N*wWN!v^6GSewSYluV#@y&!EvX=Ot+Tc}5EG z=b7k-%{MJOdS0SNdHVAKHbB_$s6FwU;jQqB(`u6;`*8r-% z!&9e}&*pcTA8cYC6MNm&kY^C>MyE7)pDfomxfd_uIUvrSd$#C@*7M=CXgz-)xN141LCOE_RSPtlmz`lB7y)wo|@H%K1!| zy<1Iwht-Vwcx$Z|zr#YUv?P%wl;KooOLKyzEOH(ZKnVO%DOWf(I?Ff5u+l zvwzR$w(Uz#ZagZ>vN&~Ay3e+E>7dv6SH9M7?;=Q`l_B$kw#Cy(-D^p@STN4kQk@`= zXtL-n#nRk=Qf-Kj5cCNqIO3df-j7>_ysoxOozgVKvb_}lf#-ZBo)9WLAlQxBK+)N3 z@6t&h{!NwzyVQ8iWQ}DD1I{%@HeX_P6WC%55on2lCAI0;PJ9n_7MDoBeO{{p2_pzA zaa5ua*1!^wy&1FxP~kM8)=E$Xhh>S5ecfzG(6GWo3x#1++pEgURHh(A!dq@duLbDX zMU|RL4H{1R?m2CL@>75h0>9t~Z;Q+dO_^^V_E>B!OB3WXsTs`c3N6cy@Fu$eB!7CW zTa91^UAC4b>PNcI+i9p$KfImemJU{OvqEFBwCjD|wDWsoMUH|ZuZTxTo+&(XeguzP z{4uzog}7i_kV|sLd0ShBf-cJCltv(h!bLABToR~Wk6)Bm!sZ*PTNRp0S)Rq_s~TD{ z>oT219&VRL*C1#e;Y{*h_DcR|>JOHgn^^ZHCn_l%F zxJy}))q8}x6YmeUy-V!M=SXyqcQ}T&ElVd+*hm>dI)Uv>-&^96J^?YPdPWU}HmjjK zgP|Zg+l=-&ygP!_r7Ep)FdLQDqdBejfzgl~w7!m$G(h98qSDwHLSy)e#ulJntlwPX zl-Rl$XjH>X*a6kc3Mul$S)sYyG$;eKF zp?h-WNfnF1*kIUUXpN3UgFC4*rJ_Lz`sM=)(($0RO3-HrLIZ}1I~oF`%|zm3HKo4$ zfB5>I$}1OE-yuEgdze_OFYC*+;o>mzoAOI=%@G@b@0DV5;P;NwJvo>_(UDNoEJd!gi4zX@!qZy!nRPXXH14r= zH60p{;c0_=khjGkB-GXXTLW*Bu5F0-tnb^h4`c^9)<|kRPk_nr+5!glUf)itL`D(H84$^F0%>qON?1vvM0?6J{Ikr zvd1cWEEvX|(sLX;qjzg6o8837AIOvmH>RBhWbVz$L6>AWB7S+Vi*al2WL0mNaGS2I5Xyr1dW zWroX<05OKg(AI+CB>+JFynJE4Mc{BeFO~6meu{9rp5~^`t`mqb+(=6{BJN>KE*sXTf-*VGTnoO45ZKX`V6*rJ^!LHzvsZ$ z-QQ7=75&|0JL;ab8oX+S=L)QKqVTkl8CH`N5GSu^e&YDg^ol@0u&GhBHnIdkCnV9d z#$(MF2&U(c<^*o=WlxF{Ed4zsfCRO)0|DqG-mMvsk8Dr+ zZgw!e-R8rw@${2`aHjU6Ei4l&vgmzJ>pfO6#{f>4;xJYZuGC`TF=Hpd zJB%fzqM;s5DW8tCwHAFXau_+&TsE$SISgWoNCTjEs$SzsskBIEP^*S-3LuqW(!-@e z#-JBXjpcJO_9l{~)CgMHfjQ6dE>(cP_rPSf>_MEsl?e7O@mF`jhrPfq+6(;fO(5av zs_!r_Uk&6+7p-PH*-_~qs8Xd?w6`OTX#WIzlpI-UG*L1Gb2IGsFsG4iN4>ot=?gIX z;dNw&28@&F1Jl^jRMEb-Qj6?6sG!jbfcJI-Ko} zlq~n=p#vnUo4Crp)QPXug8eTBJ$6zB6?)M22+;$y-&v_)N97Euyd{Dx(}{d7lAdaH zLS)e^05GuR6E<*fg`paX~PzpVucpmI8=q-zl@?rz} z%)60&#-h}0*Nzh<%`PglMY^8=#6_AL`nt~q#s>P0-G6GS{bJH*b|mYxQamZ{kNYefjH;1 zNQDF-E&^5bBLl_epG&C`Bj|H=fId_F3Vp5)rw`|x7U`C4CrTgAIW5w;1mH(QpI=6u zznn&GsLuE z3;KbN0{j!5K1T_+Ug$GwYi#;lPwn3#odqsCG5VaP0QhI~f0#aWUL3mLH!H?|pCsCM zJEfT*4V!OevnR4@3(Gd9@5QnMhsn0h=H+{_kHvQG*>8K#yaHEXHR|r5ZL|9-Y;CA> zi4jrD`}o|A*ZBWV0+IV96oAQ~1Y+uv1u#9qGTN z<3M(o3p47iPHFuXfN7DgeHG`{_T9AC_!x!Q|JK|7*(caP+ud8_UZ-^ZUpP0gU2JQK z6U&1}rJMq#oNr&@#T~*AE#{Dj@L21V#w+n31R`chBM~Cn*X+ktJ)#Y|tp>EYIv(0M ziBm#pW0$aLYAdi*o#f5tD}ijT&Vi66UvT2Aeh{luLTHxMh|DT(vgZJ>TjP{gf|8)p zv;cNgH;(pgN<Cz2iSK5T$KT%P@B_K*L>d(iRkA7e8cj0d68qkCmw3%-LkZDvnI+{t`nei(NX z>4c@LEm4&owCOxQm7nBlkutcAL0kB&#tIFk3AXn=2KH{->FS>POjijuYf8b+hn&(N zA1GdE;yd}BAiXf#8ha-nTV%)Fxe2sL_%GTA@^qdq(9sSPzZ+=57H0*{3|vo9{4^9`b_-5fMO>Hee;68vz6Rh^ z3W3i?Tx~`_*y@6i-r5+*lH8*Te*0Fcu=u#di#k9btSAjsx1h>HnO2^$QpvAh5rtp(ejXL}tdXxf>w(;zr*VppUgY&08gd%e3?x9Nq; z)BJfnujpDF0%#S9Rk3_AVCj)>5@3x}Vcknn#|HNc5&@wQNj!^>Qz(EAiUdlraR6;X zvQVI(;9Gp0LIE@}5-7#S0h9znC{P+S6fpsybZ{M3eTt0(D3?mzEwhToAMtSt1yIth z4FgKCaR4Qu5Q-@cW#Z!$3ZTOxfl_Q7KuI)(0;N$=e4Ii7)Eo(vV&ecxvLX~H4Y1Lh23ct80tXd0!g#3geR$;a-}mL|Z+5-&34^7V7_t!7Jm@ zV}s%ykN)^4G;djOJeqG*#}qc>CU7PVMnm#7i($|49v$G#Z-KTyj)G%Z*Eq-Iypxl^#Q0 z`2SOSDE;$5La={&55%>89`uKS^)nx!r2WtK-TFDXNLfG28030g5%cx)RHO{7pO-%u zBXwZ?ydWgQ%j;rgAYq6V@$!%izeOE;#mBw|sh_6Qq3h@OgGhbv_46tYs<-8^x_;il z(N)&Z`ri|}y=73>&+Q=@wm%gs1IcQvZml!ASLm5f$I3uL6dAHYGU#GvAlZxz^FlHR zG3%hNpX)+0oXHzisq}HJpP!+O1M6pHlBLMQ`;9?)c#QS)ztOG(>u1cWR}HM6v4SE| zfr-b!`Z;`0VqpFJqgg*sd!n})@LCK51MBA>*;-o}kIows?|5|c;{)sG;0D2C1MBA# z-*t<+eqQ~%UZltNC;$JH9_XLAzd$!jkBBp}gqkiKmnM?pe7*t7=*sb{kZ**-zK{r5r?6@039e2Xo zBfAgkBRaCFO3v^)g;#|*=}e_2a~ksJpbA$t%L+8Xnz$p zc2F#QnvmO2k@0*_B_v*<$3aqN=!!#`VcwdE%@{V@7)76f=~$AGAPiv%&~DKQ8BE82 zEi4xYoCcO_6dXpDYZ7pECYS7zux5X*fiU;yDk>DYiV8(8NB8)8T=)b7^@IM()7|4c zZtwN99z&`t?UhD7C0{`$U)hbCi}62PnwKo#X`1M^rgs+8h}o>6Ts=_<4kV#HN@mECl0sSEeF@5VS# znI&$#eUJv%xn0tkH))|g^a8#>1AlMILX}w+2VjSy@}LWYyCu za#C4tnvj#ma>olf|5p4~hXPCs;~)2|-aBHtu;tpi-(trw)*+!C%yt ziAwVBJ`#XMzr6oJW*2sa@rWPHjv?f@IK>yOzlN3-C=bTl4sxRo7-OW-n32FDfso)t zhm=ROka3S1t9PpfQbARq6KY}9ii=ypVf8zbdA%Je%1^5DlSV(dScsdomQrbhQ;Tj{ zX{kKDRN4f;cWW})6e0wVQ)>yh9uZg3p|`aE=jijsO0CRQ{-isAxVVu{-2MD`oDd*` zSuk!CV(qL1sYoRBw04F&l(3g2ZlwKmD6`>^ZUj_(c6O`y_#M1bY!#jMi5uw*Fh(M- z`>>IA!eb<&eIaop?S98dM8}!pM%wX?k%()WY^3#Gj6`(EDsH4bx)_Nj^F)@|iRkE8 z+(-w)F(7?{XmMjx>_l`REpDV^>KKqnPfDy_+iHD!PNHxIEv3Tddm7fo<{;~2i%fC{r&I*;fe}6DGmntTOE|y+ml+IY* ztGUS?)L(kSuZa`>RdK?fBUVoj#sAbe;U8HUAO5q%>g-VXuRu1%>cs*2{OZ{78PactVW9EtoDK83)oUTKnqYKR}-W{^7Sc2KYgd5CigIKt2S<3i|yo z;0I|n>;|cWXxe?sz#Kk^hE$m9n}mf2PArV+zDk3yQ|By}{)KslvRlhXb!BTzxqTKf zg7EqO3fi`EO4eMhM&3xfPSP79wkKA!z$42k{yyTSAU(tjn-io~Wds+@1aaCMtdh z-+kigl?^Bd-++psKsXZ0OlOj`ZW*6R_1Gj)_K$Ar-am?Zz2^u_GM7kOSD^ZN1=#N? zkVLepn70`I#Zs;pelIOKo#HC`k?w4ukR~OBek2dd7rnH=MH>2%RuMEWt&0&tKT-`3 zq2)9}=ttTGb`ia_3P%Y2NYCFxA+&f$2>nO`hfHgJgwT)lG|xp_1qh)ZX$23V9R`HZ zkF*XgCwggb0wMGxy>~Yn)ywZ0FxvG{E>S8wAk0hWp6YE%FWoj!E>tov-8K;T%>(9L z!2RUf4!Uzx+mPrpJ#I?=p#~J{O>wgf_eK>MT-P69z$&!z z?Ez*J_4nSu@GAj9NVNR|NT7XGNYBTF)WkEZIMHqoAko7Q(Qw*<4%j73eFkf>({A<^0&kRV2*LTZgg?#HM{2O-hc86eR(5Dll#W8y@TAP9+e>Hvw3 zvZ6uy$(^xkr|7+^6sL_rKr;3M$+|oiB$7NqoM;~sknprcRGhwxNhgw6K}f`tfP@Dy zqC(mn6B0?fASBvl1*D<9K-wOYpA@BNl}>c;0+3A6At44k-m=sgY(lQE9d=7OfK-nw zUdMa6OS#c*YjF>uD;Z8Hn}#L6UF}q^a!IrALaVLf7r2^*`}yxGE++3Mm#yMr@_uro z-39&-!X}<=|2~t4|80O2`F^D-cs>3$W#nRgm9yY&NP)#9CU_gxC z^drqeHxHj*T+P#v_(B@`kqUSSi6Mm0kEFYUa)r(>N`6Kmq4SFgJPmbk2TimhebUgEme=Law>3HTB zFT|XwkmL#0?illnM?JA{B8e4*bd34M!&R{$9nbvYG>DeoIr9YO7qn!upHU4t zqwq7jA!jsx#x&%N>Fw=4LX+Ux0Z#*XQ0dIJK&2Bfv$=LrlsEr+mcKIB+5ml|C~2d@ zXFgs+Z+b$2?>&%)NfkY+cF=a%y!_|r-Yg#v<#{a9ND@x;VwJ*Uu<>p4nO8i4VSr4@ z?VKeQKn`-Na=5-r9OAO)AEVFjR;Ah6@o)iFZdDF(+-upiM8*#3Fsb zXvWSDMI^L$Ar(yjIkC5qK;o|(*J2<5yMGiZjX}XMq4YJxnu_;o>UHxE(O0-Zb-aQ# zgy~TX9tZ&@_AV6@SkU_`&3Opi7q?KYQpl>_X)4HL0O`hZ5`a*tanOKglBjBbKr@hj z&W~W{1^g1^6?a*zqf0h}bargEU7mB9*2PWrq$y!%Lyu=yh#pUV8W;+8Fz_${I-^jO z=2t?f%DwSzZ(V)>zXAHGdSL_n7p0R7^pAo5G0;DvbPP3UpnnYXkAeO%&_4#|r?$iH znNd_JepA`2Dg{f#d!G6H##%nzSc`T&?0Dz&kjGdq(Tn!De-1O{UA_vw*KW|TDgzc+L(|_)Kj`~LhwEIpNMU;i0IDaX`<7z+O*JAoUb!(n48Y-eg{W ziHt>Q0>QMUw-YdaZ;TH84VQA%g3tm_)A#);JdJ|M zSH9>maoI>3KD~5sx!00M*r;FGS60@0w!o^q6^~RC&bT_-lHG6WRZ$ zfUMB+w-BrqvfSNnff0_PDsjsY$_>(<>w2c>=0AFRylNz_%zK-(?i8o1yL+}J;bIl^ zZ-hie$1L<(eH2Zdp?DF#3`#oG3CeNB={S0WvVS<7dMJw13L_br!`I=B(7?rE^j63n z2fxIKJN~%Dh&%o{7CcNydn{2cuE#8&*Z&~DF3WZ9!U5r-dt>9JlIeJ2xYk&+@bo@}JYiYJR|vEs?Zd8~M{2_Gw- zEV{>vCyRBl;>kLFtavhz9xI+~+{KC~i|n!D$y!^ic(NB4E1qor#fm5M>#^d=+Ip;b zGCvn9o~#qbiYI&VvEs>qUaWXB@gFOmOc+Lqud6X?{Mt@jWOffDwbf$jmTUN!ADNb9 z5cpY1KlO_4^q0nwJ`2bN;3vhA{?O&!=|6-3#^QSn{F9=Cr8%O$uA@~%< zk$y)A{L|t{pB$3@3k>Uhr=d$1K)j14~$oId^y`lN5)59#aXdNsOe-gjP={h_Jep2xH;Wt+q`6u_o%Vz zCFSd_Qvg!x^fVUklU94h@`7M24u4D4>B?_-_sGo4^J ziq=v3z3JcRkCe_V>0Sj}#|pC#P4RS9U&-coGOX1*+5E2bPSNxz&25p``2;P}XUe;Q z#TH+y4sW_0()%l+*ZJGC@k$&{xL+3y{F!NIrKVI`jli~iTEM5gNDz4L5};B{AYi~{ zHgL320S^TVzNG-k%si0nKa#Ks`@VyrAb>dhpe>nZw|16|k=9|K7vfZ5p{f+VJ17c1C<=Cx6j15=fV6zXj z4Ptu`rz&qKsv#HIc2f3IQvZN0L4MQy&=zC2;f6;gM0DVDUZGL~zS7RO+-!T8R_ZNLL2Ivd^&6(a` z^j$DOU(k17Zhz5t^#FZA-(@-dMc<|Y`hvcvXZII<+Xv_i`uZ;IFZ!lh2Idc#|4!>K z`Z@>b3;xwk?JxS)4bT_#eF6&MeSLn>`1VISONfRJ&Aq?8N1R@jOSl;G6;p?Q_W+i^Lq?4n4u9$1B0DX z&G~frXnSNVaWv@zOimKkmYpQd`r}i z^cL?CLzVjBJu)tkleH8}DM|rBHDIn39Mk?|&l9ll5S)kMy)o1|RpYs^(k4ZMhBjShlYl41@N!sc#otC~EKYf`K_1b{wYp98>O=@bhJ)wtZ-l}h+8^*M z-Rz+B>_vTxxl$4JJosKR5C)2zPVYZC(-{92@Q%zcD8iqcM(n}Ws7bZHv~qzzFO`C% zF~EvJv&10O5Yt%M{bWh9RGuV{*vsi>1a)D$tU`jJKlMj=bpg@{7gwwStH>MZLmu%q zPn|40#tY2j1(wf^srwz#6#Vo1*5`@~zejzt`=vf?8Ch~e?=euVf}*Dh*EE8n=X|kXoUNrAB8GyCrRq!++d_hCn@5#9 zV$L{kYpYPuMNpj5Y^0$0CeQB`F&2%rqK2IaKA&B1EPVcg6eo<2a`^>19;Q;32ZJb3 zHj9VF~bh8{H&XGK!5Xu7nxZW`hp4V?iHo z;A1}YLD@Uq5lx{HUim0q9?Rxs(aU2~YOPgi@=^=iSt`Af&YK=0;zsYC0Iy?Xcrod0 zWZMJ`D4)}pP-|I|gxe>$d_vYlcwuBQgd5{$ieu@gw|Dy1twcn66cp(m9*M#(;b*ul!$ zMY}~n_%5gP)VZ?kl4fRbJ|VrE2tCq6e}{aMBly?-;tDxR0!!}Aw#}c z9w8|x$E!OPplRqY>QhX&KTDx78mt2Ex?xw%s-{u}Tyj;GbQv0xMobgS%fjW*LAI)? z?lHEb?$K=S)btNYIZSu2aHtZ=g^P0JWhNL@&%6N@&#|fj?nyx1bVT>>#)3^s{q_ zIS3E4iigUW-MEa2f=hsVkNH|3hKn$)fDeetiY@y1M8b)s_h*yQUJWZwf#%r|f!+X2 zA(4Y8|5RTXQXwBGFR1Tlu^kB$^=!6@`AHqRdYn+CNPRAS4Mq~bbo-NR9yQ~W{3zMZ zMYd|mJN=syF$F4w={~pFDH=|8c56bbLU}F;^MF)Vzy*YIw5z2dSoiMb?LQv9gt+)% zgmEk|H1!RB&sDXLg|`u5fUBLXRNX|v4Y|T?VKIAhWFEYph&-QAo-E`M?R&{O*mq}x zvu1a)_gR54{XMoBgxk(`njL%5^V$3Zq%z6AP5;LBmf6vXEKccD$SGbP%QmKOK~MIR zHacGXm(+aiyfR9lq+kH~_ni9o*0o8UOSW-$P zeeo>Nu|=vl9Y45g&HH~!c&F;U`TINu{6r(HIFTsF=ak_^P=CEF8I0wfx=bUQmU#w~ z?9>wfQoh-Nd{L&V91!J)e8{${YskoNrVU?PQhcGYkr<`JXU0`--+qJM*S!FZOwV$x zVE|Z;(bt;d>r7EY2_D`BEyR_D2L5XA5anq|k{-T&hGOX*-fmH9uF!!kBa_nIMfCX2 z3Ei#PvBP^uvc~*i_XYHh9AkUvg>>NK#r;FbB#$k)D1QeG4C>=z1-LxEMR{)%uBh;r z_9=YmFE{nJ{|9@1hZg={YCV_2 zTUJO9W^gmLMq5j_VY(2N;xa{}*i14CSr0=%l`Zc*YESOeNn&jNp|!> z{T9SuzuST@G4$SeX(@eCxtV94K;@M7THm+zSwF5X>T^%p3D-w+QvCea#5FUwfa|uWnRd z)X&^U^~*jv{{9zgmb~}&JJKihJD*0$K4`zyeO|wrr}Rbp&7e`T59-%?9Q6w|;of`u z9qyCMM5hnxx4X~l z_vXocQNLYd`lf!VBjV@J(8m~hZ@)Ri`=Wkdj_#ZKE$;LB-EQfN`kDKveoej zgg$7$^?hEycddO-%kyb4(HOfKTUz4inze(fgj(d#tcf z<&$(%9LDOwm0FzNj2#NJ9mW#qVc;=JSw0p zO=3y5UDfI7M_{|e<}iAcI;7HQPy~G-_c<_V48xyVufqTf&2*~Jo$8xmfm8;Vjt)r@ zenb@ZrIz2}FzG!bxG~lM^%5(!(#L~2?LsMM@+3gt5@w}9z8TDa83@Sfhr`uy0zOMP z_d-Cn%e#+AI9D_^giuhZHGzn6SY_$10`T`9Najj@?1=ZZ`*8T9apzTP>2Mv-B;ol- zdOcAZ!dp|?Mp7B3wP00vu!}7=vUhO)#4a-w_&(Q-+s*P)y`Sot=>fs;Y#F-(#-~zk zEuIVHjimAC=TA2SI&}ZK^$K`YP?w}!wMc~m1_?Q-Z3*go&sU@(B!T6n2{~zjG~HD= zE?=DW9nFa^y+^$NUs2!psEc_2+_QZdZ{Kr>^;@L&~B*tu!Cj1!j$ID+`PEwF<J~BPgmzfK!};Uh?(w?V zRjR(1-hKASjz9rfIbW52O(K;mlzQ5sm1cIy)uvG0;|^5!S2LY6ox(=aIub6e&|0B& z%s&*ZV{z3&M8G1xXg77gwEPZrb$hC})3U@|sm*pm6;E=2ok;7c@X$hG81eU2FzSz{ z`X1^FN_~x^g7d9o)%O|W@z(d~n0V^@DRq^I`no{dKCZ8#KWIfuoy#1gSC$;6jkOd? zfT|)PrW%`2zCT~lEz3_WFGKQ3t*#iX#Mz4FMAHT9&PDv|Di!TAJLr^tk_Z~qTA{;o zuA=l7jvSQUg2?TX#u9Qt#kZ))QAY@6?kIjD)JXC9QjgVng4kAthE>B?zbiEoFj<1%*5!gGBobgU#oD z#@i`-M#v*NVe52S=GmA(ngjXMTeOJ+OsP7IPwPBM-WDC(>4MRH>7#FtqN6K1j*b){ zYZY$CAZHS4QwTq;f*%h^rZ67FH58+e;JAW7FQA{fO{zKtFCO&dVufFU(a_2TPU$k> ziF${mLp;r-z%5s>{3~5zbry{nNqoe(NE(424FMYEkp&&Q2u~|iK#5%=Uo0K`=BQjb zr&QXHU+-2+S$Rka;nh*_!SaZd$_(@6*6?Wceniap82Da?UL6mq_b^FZj>1-t1oVH+Us(a${H*X(QcSN^j9NX^Q*Xs49X5x22=5`^8)U`*g)TEhx zM^0;)K51CnDPqxHDFK40e7zRph9!7g7ffB?-p>+C%p2w#%^NHT`l#;AyRjr4x*IP~ zI1bo;>4b1wYNnh!zB?+T1V;F1!Tj;KY2E7i?@QhIk zR#A><FT|G48is>#L+(V zOwyf7!9PU%U@?xHJT+FP5A>f?j@f_Acr+@c|4bQ<{xf5*RH5{rx#&NMf&Qa+nKyXQ ze{e&>yHD*uEnv?41Ge>Q|3S|4kh2W^hqBJLh>irCuDY7(U1EXG+muiYicEkkU_(m- zU5O>4GX?oOYq-*-Tu$jy&e`Mfpj166N;19DtrEk#l^I27^^M<9n>90!MVsI~8@;Nm z90;KM3Fh<*yv+$hwN?%lSNdaQdv82; zdtZv2q3vx9wzt9CWTf_<0^%I2z47FjRK$AiEGM8*HG+-(>V}OCOAnpP~*u#z$NPr2V{TBV_%y zC8Mg1q2uI}fDn+wo@BPg+cZS5TbSMI-Gc=~^$klBnQ=;?rFsD$I$hmkC$^O>-DBqv z$mTg;5kYC}T-xi{Iom4c4S{U#P-U|&V(d(YWq9wFAzVDWX#5<) zEb!q$UUI(+XQll>TnpMSxew%X3;L8QWJBaLcJ`x*XSSNeGbY9LO-n{p8*E=;rUOa6 z954bs7f8M1-JB%Mwh$e6YwDZKE9%e*(Tch$c8e;(hj^Qks7GIaD6~g|A3^0v2|ffp z`mV2uym3hIB=qR7)E;e(D#4Q?dbEY*3<>n;Bj&mYcCy=z(ndbi z;+O{8=e5agNq$EPpyHLaWcuL+xwB&z;(m-)b5lZBbCX^tK-K zwrH`G!^O->txH~PlDw#6+n@>gn0jG>glcNtyVUh#ph8AkKGNdx5SEJdO|?&9^fkDo zS^p;JCJsHEn&1B`dVBnpvq`_V$Ju;7(GTr0Lcu>~dwl)niMEI9iyx>xj#A%vgqOzK zg0?V7x|)}N0)Fk-qVrg3dt%cwe4E+ZsW;cZPK;cZELR!iOp0sZaVA@y!LyL%DSe}g z`bJe~-uzERerZ&1me-*q^Q*a0E1mj#N{xvv7lE9_pWZL`%k-Cf7` zOvdmOe9z=!?3t*OTbHq8v(9rC+s-z7x9OA{$eBKGt2uLXG4+<6=r6pt%tozI(~d1# z^YY(Pole~ZiGcTN@^PQpNcKpoP13I4^Q{{vx=JRGKxa7{P0u>934>0BKIFNvBj4EW zxsHVR~RS-&$PCc2W0!61n=NhaO)a z59`mIe+Glk(Xf2|9i4yfdb)T1Dd2H&@XuTfmhtn?;6RbR^3MmqBcx84e?}aLgMU`> zGE8CobI0es^3T;gc{u+}?nX1fKfgR7{#n@eW8t4-GOJS9#dLy}rJ=*4=;wUB^#btw|3Z9CeL>%x@!r;b!}fu8^dhB@Gv1#wl?aIok^Y=H z3Xx|il%1|=$eG7{i~KqBAxc5yxOdYP`t}#TSwVbfDfp_KkPUq2aD1;iPJEd!oPi?0 zQ6HSAW^|t~x_X|b9<+Ik?r9i_LbtB3=Dj-F*0p;79}_oNhanSCpFn~%ha8IXGtoHN zn&kKQeXm*b84&1U5G2$@M&G^H41C#Tc;<%;39Ti2I$CkIX{I>aI8%1woV^F1{Q&9t zk!t>x5l0WdhJ1}@D}U)nln(QAqZVfzID@!O35fF}3zhhrS`TtY`j-!06 zt-MDgOb^{=tvXr0&Ek@#e|%J~?I^w@%1(=1jA82ZT8>{5Hs6SdgArqd^$_u7M{LRt%8JGcv5VPC>EZ`uaL_IyfCGHqsr%Rnw7X zl4=+!ieVmwzbwjrh8}$I^l9!>_efaLq_^ukonoE=3Ia}-P-Bu_dx1A$hhFO$TSB`G zwECBF{=xYj+yBe;IQ*n;g6=CPnD5yO@~-Yk$aW7ekv_(lg4s2t`Ut@*lRA7E=K6QZ z>q|3F)h#tnHJb17<9q55^NQE#SGROz-H|%;JEb|uUko1D^<|0HZIZD)Dqq$QJs$z+(W zT&k1C^BNgvI;G4HDV-HNp6T87@=m}G7}z?w6vV;q+0)NsW5@6l$mUGFxAnA1de}gj zzokTa?{B=y{3~XYeXq#lXg?X01eOu)_vGIRO;cq1>B8I3_yMm>|F+-9yb!hh3^Cg8 zZQeq>{f6{xzY1O>YQI}~JBPKO&K%i(5}qH7)_x^?+{C&Qt@*v0C}w7~AMB0IHz^$u zhX#5!!wRDyE7pP2Nh;+hW3KHKtz3DSC5eXN*g+ltK4wVyRX)9y_L6-d z$b3(iXyWh7q9f{CR!%=9Im0kK*Y?(3AEO**WM%6^ZshQ_%juiMcEcdJDGQ)$>8KeWPd`2I*XB+HSf{BGrPK*qFAVuKaMsoj8|k z$AB6=373E|S_=(%%Y;M_E=kKbT+(;*CIQ%eqi}ZHkE2_57{Mr1<0u4!KOM;TlJRFwE z;yBLFhAPYHHE@P`{)IEQ^cKNkD6Slas;q6eb_mYZTJqD2aFD7KicBDp4anSc2Zo9AvdkukkIXl1c9Z#`&Au8fF<$9}fmEsNx{B5utL18mx@e<&8L=B7jOxL&c`hoW}A- z0H^4LN<+og@a%Lav%HaN8O%PYVn;-FI?w0X2UWZsn%y(MyfKl-RVGyYjc4j+HcxhW zBPIg0kv109j5fv;;;JL0o@?bWpKFXkPv{s@v?Cr4b%& zL?8@!FG%+(2?U2zsDF~D%n<6=a*vfYtVM%{t&AU{G&9AA2q=CC41Op*t(M8eD=X}R zA^ACwAv7R_0DT&XutxH8=s-jh4LpY=21-%EQ%(+^*F|6EOfPaOX!{*}yM;LlO3@V; z>syu`Ayeh%6+Zzhd3^?>?!+lu?4RELK#Y6faI4+MGB{c!h|vD6pQWTqxFW zLV)n-3vivKB~m>EH`_~_`5%~<{~Wx^9%>=zJeha%VWFNXnz@adrv6Q_{w91?CYon# zub5M;vj`$jEK(Y$wC=CKCJSnyT{P9k22bO1>U8Gig#@>DGNz@l4aoN?+b*q4mI`T} zz^!?|Lg*m+Ea75*KJ_$>s-Nl4=W0$bzaPov7gys;9&tPAmWrI= zcBj9t@FP|S!YgYKjVGvc_oQzY9wLl6XHqMwRIPsmepFoGT*n%y`t{q)%dh$l!CLVl zN*Z9vAcImK1QKv!Bt37Mwi^_X{(35h2%@kHXHrT^L4IByk9>ugv%5eE+GkWCWe&g= zA5u#S#R3JAhAo}`(D4FhRl9&QPNLe)^?#vO`G9O*+ce*6Y9_So&_r)D*j>_Q`3wcvfg9MtY{4MCI zCRg0WBZ%<=5e|wNS@B4Z#yuAi-dBE!q{+&tAaeS_pr-s{1488&>$rP6cNcS)8eMt@ zlY3z8l9m9W$_3JM)UnX!^+aoM+DR_?MIt6{`4pfAtdp3~d$&pRQWcB}H{N5>Sj=`G z+lANB@qoH|KFv?CD)HPm4zNB(zsB6TRBGGJJqlTzrCwiwlAC+zE{fg)%eN|*V@Txp(~ zs9#2l0icl-z<9Xqz{0Tc4}+h&pHX8HxZG0*z`vrqkd(D;S#o{)7U5B9Z7yIq-#IY! zk(4FrqIUL(0dTm&>rSzra^ifHiow`k)a zrRbJoR2aUvq#^ND>r5|mDi!M<0nvl57ft%W2>1X=7Ds_to5jaL0*G;N;*=Ry_t_W+ zac|_y*ZD9w%6qpJ!yqLP@@Z$$jIG37GzgZc{c)F+i%vtyAdY^*$_g;V8ODm@CS+;W z3@dh)DpLmO5p-J&a{{LhiTtCeq|ys36BXJjBLpAVL@rvL(%*I>7lyRuA0l<-Jn7dY zU`Q?yN~l$m3s&n}q<`!HLAgx8J)(C>Ksd&~wDx3;g+v4}ZyY*`3y4VZkjOW}Dz!pZ zz(6=;1m?P>(q{x@hBZ`7>;o>8EGVo!XYkYa6vpQsV*Yq1YXj|rP%DhDrZX}E%p*~+Ofp3W~5XJ9uI{(wz-2Ol0oZ?Di8OLuV4 zAY21!GEFh~JsG@nGp&Jkz6=#jv?ogUb2O*Gqe3&1ZixE|_5B>ETCoBXu2Lo8rj%A* zY{9n39&mL)1#7a>g1{}B3Kmy0+2pOAsBvG4DdBYLgcIp%hXd2;w|QO7%V8ObrVdI? z5noBlT?Xlu7UB&f=300@0XOa^gZYOdPI^*_;Iw-g3__X^{l)=kFKDk3orBGWcS?9; zj0$fI=%?T`@%S3zg?l3!!bvSc>SMeS9MF$B2K`@9M&)DE|B_zl?_Lsx_Bs9#+V2RV z{dgsU)Be&oz_-Vs1f-JE+%#!uxDqq6DBRtT&8OZMTA7Xg^3e5S__yU{D}-%*lUQ)T zJbgRqGcql!Bkj{AL#qc(u^X2fa6@a$1x-CMaMB|5a&%xtj2bCf(O@W|wum<5XVL`T{G!A55v!sF}lCMh8eBS?nj~(Bk z$)E$up4rv*i5(xZUsrd>JgvvroHI|?OM?(TVd>}a^mAgR$1?%ALaOX?T76&Y^35BD z;0)}7BypyJAAc2TFSz_We%y8W(F=-n4Fx#fx?H}XNZ(K(lezg_y^A2ir@!GB;$X{a z-k`<#k9k85eum>m*I>u#T8_TKellKFapIs8g!)*ql1NKb7BT@NJVnS>mxqDjLC z7H$j2z_gf?`by;&sk~;S{`HolvXWg|hX%o(2_mp`C4f>FCbsZXsnQIZHP+X`OR6v@ zWmjskOr^xq6`V0lN*+H?qTqcOVimk8okn^c1w5^F>zfm_X3HR_Q)hXi0S+z;uelGu z=Hd4B4fX?wT7WNBPqaZ;69N`1(YtYLco2lE1-FLnt=Jf$EC|cCi1tT7>h%=fR5{ft zW!$aNyhN(p;wz5;%&TjVNv!`4-mia)gpW9%l+N9U#(0Hji*w1wVM8>USCL7xNT?r$ z4GD~jH!hP~5KwjPq9-!2cn2EE_`!-DSu9AFiDV*g5_2B^DRp9#W(*I#5H2A*9yy%A zsy-b7Qp+zi8eWpP@nJy5sJ}>9K8?~sBf+)oTV7ld3d%w@EE%^i1VJ@dQBUz|66boi`6HNN}A@C&UUPue@ zDi~8?8GiBiMb1pgd>&?E;w-=r>u-eXERDhPlH}t{tdr_qp|l!o%_)0rZG%gt1KUWD z7(%qH_%=g3c27rR&VePt=HwGL`rl*J`ri`(c?bElrdvMYSrmw*o=R>$^g!?J*ezR} zg;ncmkPsiT>;l}|_co!qcca(xjZbDjfF&Wdcc87owL_gH#ZvpvIWv<+iaL$O`t~AL zD2ev3ou!aw()cFcey7*fe64YhQ5!F!#dtfFN~dz(h-}V2Xhd~9-Cp9#>|pO>&SYHn zF*Z_R3(UN>#WJ+rx8E`pkJp&jerP!p!J5o%zBbFyz2*%(i2Et&heq?0oAK6|i5*_{ zDW&tZQsy?}&^?HL@+)LU=(5ky!DZj4h=K|U1(W|UJjQb0r^cbpL*I%z35&sAz#ro< z?&Ir6$8jJ3r9V@zh`5iB$x6)o?{UOKeJdkkMcFhv%8Jq@o%R>rFMFNfDEzs%n?Ix5 zcM)pZ)g5)!-U)tae4%X=H3D3l2(I;G@>+=pHC;5YO+x9FGPu>-oUD$7mC!HdW1&kO zLZQAU4MsZTjI>)5r;cW5bD=)aKQ`gaC;%T?(QJt&y?IKGWoa^=qe+KeT{A2o0LPiI z9b$%1YctVTG21R({R$8v#ZjlK@1}Mo>OOD1gt+F|&#lsYxEP14E&>Q0o`4k~T@1K) z#)7NVCs>)fOEexsW>ed6wpm=P#rf|_WA^fGo+G$}Txi0pgV)C>=j2%B1Zb%6!>G~S z_I{#CE5E%RjgPZwqe>su&`gMuU_b_`x_#gVnr_)mDn$SR+XtGupJ><|3#zoOEs5!iLcbgOhkiYY$17>&lvDNxg7kyA2GEaX!%AWV5&yEG zS0V<;b`pn3`Vc{QoODKzR^@CE^4ypEk&r4wf}XH{6P(U>aSm!F=A-=_ScDmQcrWIX zN1W0}XjaJD=4|=gg0^8w*iI!(EIiVqJHrsn(DasK;;J#=D!xmZ`9_&^)2sNv24WQdA-h;(U8QpWAo%gI?C!Dyuv^0 zy7|X@z!I$oLU)JE9YWbCV5UuZlv9#NBx9=(R(^0V(!6{EIvIbRQ88hNF@k^5ei+kN zXk1#0KW{uy)1PN>!|s@nj7>toR1_?ev452}(QiLMDX@Kaic|Wk3LSZGi7@|w^fh_s z8$t8R@zV3usoH6y+w+Oq#i3$z8=Gt8He}eHCTTU2$ewl~!HJEx7Q&$B0L@MvMgk98 zkgCWK%B<=Q(BOU0R7&A@q|px+1t|biDosN9sI;Z>^it_!_@StWs&JP=|xt?xv_F*qnZT510;`>6fvYe2A&yRqiw zE@B8YFzqel)Uu1ZFq)0bRH402Vprh0-)-Rr>LMP;t{N|#R*`xt3_{V1sOq!WJxLeX ze~#dv=WYw~&-3IB@K2SBNDTgQB1vEJ&%wpr{Bs!oSp0J;7bFqJatBAs6F1opd{ggW&G?j=CC)#yyVNH_3}rq_kU+w%sM2fnVA40>s0`E~)Jn z&I`=mh==d++--*J*(BM4N9CNrbnY*_Dh9#c2&rgBvSJ+RUHby{rJxA<3g`~672{f-7U}2fsE*c%If?RO-rrFYEuJku(Bhf%hsh_6brKsb z<KpY{S)aCG|Ne)`SNa{RgaYH#)eN|5Hn>;-(Ymh&)&9xm;_ z{}vkfwh78j_pX&$O@i+ne(UKcYDsm6krYs z)HA%bhErf8aj8jOYOFj(-lHb#6g<1x(iB`kdyjc`AoV$vIs>V79WcRRPbVJef6@_gD2 z1{^)_DNJRw`LiHVo~SfD5T0LLT5T_p9M#H*^D6lQ1WFl=**NYKCPti&MvOS6bq!+B zDefIs2cCCyJMgSeRYuCGqj*-N#w$SCofrY82`BKS268Z)d&VevAUasl>br=sGQN(- z_*%68$PZYT@j4DFU00p;J=PM1B+{pTt#6n+!z{O<%x<>6=Qqw$dWaVgLOn#xkJLka zw>HbKz2f!|zW5!l>(o}!M|0Zk6ktzd#f{V<>x0_UNaSH5*h9EZ8SjK>Pvg`w5oMS5 z5DsvRGq#5ifmHWsPh&lg!`~jl?|%)#;Py18DMI_%(}?X5Gg;WvDE+ObaShp?#vD-n zAU)W(D^H!v&qQUY+fDfymDhFoXMB%P8OhGk;O zqMgruXLg?ZVy;AM1~AZ`AA`k`EY~%@DX(h{Zmyt)x7$@}lvg^!l7WR%W(Z=?&&wIJy?5j8-*0O?OM)l(^JU+3q`{JB%}2Ex*XybYqZ@ z1lV#}*N1QQ*O(!`Tc9f{(tg3hyonotuFZwU7KX4WC%q}@N=pVX$7CtpPzIJ~*~ZAC%rP0LL#p7|LXG{dkKFn99!h4J10(S%+Pf|3k0hJkF~C)* zcMWkB>6I!zS)XKf7+vulUamqz$BTx2r$;ruF_@;Jgr*vT#y61S%Q9#qv_TORONTGw z?|A7Hk?=r#vkG$LLl||SSfa?FWDbO;QAmm(Lm|ORc|tY)cEJGj7}1e||69#T-xT-H zpEDH)@docD((CjNhQ7ldJpXE_60{VQaz2&aFP#M0@K(J9tU@%rIkJ9$(dP4281N zVRU-*MMK4YOI=bVtZnSqJL~lDF8)wnQsYSi7gswDne+L$Nw*6CQUeJ{5}3R#DU%cDjPy&nAxpHg?;TEmC~? z+vG9u$+swYC5o@nCJ%tG^W|7~ZlZL+CjWwl?A9%sEn9>sZ%4C_5-gS3@m6o$qGU@s z&z3U6U>XXFQC_A}%qI#?$BD`c2^)WPTrw>k$u3`^(xq@ZqE_f~d~}4Tr6WbiC!k#} z;V8V-ml3r>XCZ7JAK_`~qVX>8Q|a2F`T8=VR_I3f=m<|sM|mV~5_Hx>^<_k=5Vhe+ ziHwjqkyswCmglGxd+V)-IJ&iw<65h=h`Z#Gsz~&qr{20(!L3qoccEsqW3cYqQbz?( zZu^yz`gO6=)k!B!8{<(Ax4KhN)ZC3E?Oz^5)*r+^Fn1Zfg9W}i@-l0ajfl?eCVAlv z4l>{Mnz5Ef13XKUIu(zf3EyJW%(W_lX_FTn_{Y1;TxMPI( zKIWuC44n{S;qUfVsTKMvdlRWI(D4LI2jtf%S!LM2$oHXLrEFcKN-u9!TJn~Q)aHfS z4sG*7?@|~)Gi%+cN$ys8u0o0r2c4TW4I#f6;5<=S-Q95AJ z#~SO-h^1lkS@6NIS!p8WXMQ0@&W>2Qj#qnZKJojGm_eK11|x`u9i#pyR%v|Q(f_#z zrGGuq(Z9|LvKQ}^G!%=nNjgW$__=1swcaAV=wRh>)QR20W9QDT}hLTXf=P@#rPHa!nKJ83cvTlc%HMrk(p zvj5XH*NBVRTIp`1dFY--Us%&=>7MAd4=r+v3i^L9?~@A^QF_ zx3Wh_w;Rw7OyMnsT`!%&E*@;Yy3LUEwyEqc)RWTnNOrN_5svMt(p=cE9G|0i@I%=B z$Di-eyRM>l(;ULwEdQ)Q;0?VTzD8 zJyJ7857G24GvtIt09cQjtlvD%xOs}Pe6kSf6cR<&a&TS|4 zn#wj1I;OA2Fh^gWCS#a=g?PaAonf=;EXFV}VA#4gor)%meWV)8la1gOMps>Cv}X~D zd!o#VN$Gl18QF`H*0t898N=Mg z9WzAJowV7&H%lzQJkE~Q5}I-eZp2_rcX42fVeJfIwfs45GQZiXu z!emLG?n>6vmd*?#$}bv(P9_+?r<(fT!G`8jbJ1SBkMzQ5i!tds^O`NyX;u zq}PjAjr=0%-8IX(eU*{>!&{xVV@CigD0Yw5hBvrCcmlUo;nay~AG6I;%+t{3XCvk| z3H)onAzS_ktq`C8*#{u1k#9^5|H3^ptfhuC(@E!!{Dz-jr3ScTZusqWg!IrC39=!H zPY1K5G)!BKNsYznbnKR!F1#9IpA4_VEfmT-KXB|Gdsb3w@x{xwf+*UwFA@fY$d0_v z(2ipe_UEN0wHAHYA)I<7dE`lc@H(^!EXjv8IOo0wn1wNCyZ7w@4A_xdhm#3+m%tx7 zeSuZ#ad$Dg59~qSw3a+KRpPe*rw2A|#DnYMa{S6mXYh4jOv#=52#ev$!CL8!k((&g z=6!}}5vqC_v-Ok?9d6tw{zAnYLGRWLIw@9?GVBFj!Puhl0x3!uPnz8^H+Hn{~ zo*b<_K?kgkn2t4|{?bWzTH?tM&OLE)D>mYDVa-CsH}6MXg4w(`G9jqE7>y`w2gQh) z*MgXiX&0R;j-ff%n8Pi)r}#H$JFxu{g8D~2+PAr07U|(OZU<2G8=x7q3=3*$`|NYG zVDX^p9Q-IdrNW$dz?7P`h89uP8x8nIs*W90Sf8r58c~(dBH^RDa$j*2a>jRGG1^?( zRY2cx)PJa7pQC<-uog#61mvafMLF_YO6O0D=CtqF4hx43a)t}qiU=cMG2;!n563i>&7<&{=AbF)y{SamD$(=QJ>l?H$AZlvc`pWnyjk57UT98QV|EO!pJGPxm^wVE z3um6a^iG{whxij5^9#aKA@Y?ZI!*TeT<#a^-=GEOx}#XeZ6|j2)PjCU0+w#Vu!1D- zhA82VqnH3$cO!ZrVXW?T87NITcc1n`64S;ac=2e5;J{8))tb#==2}9y8VF;mTSiLt z(BqYk3vqBKH4GxSt$S_qa>R=jD)}{319!$=xgU@#F<$py={Sa!j*+ChGb?OC%HQ|x zh4RclfAQ{#J{k=^j`o30>X16I77pXU-obYGQT8>#^1P#eej^t7yn}b4`&Q7Mi5J8^4K)CvDRYmMcpAZqU~65kb!ztc!&ikN!w;g!|S+vSkIK-5CcF z1Fmh!mg7(!u=`0Q0HfW5_10L_GVDJ0T_YdsYnGu$-Yni7NO^D>M^L7}_@@qS%=rK_j=CY<3#32UQ!-?)VwqQgqV%^>Ah(XuqbwuNIJyasM zL4nxv-d7vr0O|%2C(>;)C)m z#7G(JUmejk|Hn6lDdnqGTfT5wrt=VnI*(JXb;kXV#(1MZ|i#s?xiw~pGo%N(= zSV*Jl3}gFSP+@4WApb0fbzRZAtbzUkNI&)mU>7-x*%$TJHp)P`6cR;Xq z8s=ErT#-B>ucM|bNg2#VH{)fEVTLauA#6MmVo-a4+FwsP!^um0c_UyTfC*p*ea?-* z?nuibtRbSjblS_p?XLm}R)FU)slp6{FQ zIFCgItDoqf>a9nq*r-J}_8OYsAD@JRgyPJPh`~znI+Y zLR@0ZCy*v?g8&Wk&oQ9lgQUcIYmD-_h2Q^IXEiDx?-ayXd8I(iz~`4l1(EN%twRHe zMHkbZU!Zswge9Zrn{XhBVW8|MLAH}1D<7O{oE|L!|>I!1A z<-_oFu8T2a#)5CF__{p-d(G3oG2d@h(VQ}hy=zK zgdvHsNaE{Bltg2&lp)!UzDQn#>l$y`B6o%?hk-9<(ei`n;PClPzK_F+vP4~MkjT0& z`2QmzsE_C>U|+zAEDthcLpa(?w3ht~7U4_K?UX+O=W}>_iiJCTj$Pnw4oJ5`kEXxt zaI^Z)7aX@-0qDjt@8c4EL=kfOE>Pu$5%4TPLfZz0QEFqIyo0A=gE zC0=>smAKxLsJx*-6Q+d#jm6O9xO4Scu5kG+%I*GWSVlUGBXP5C7_QI`3&*hutgMG) zQxgt(L4eYAQB3NOo6hX;IEDjOEf_PsOy?ZKTz%w05K8L*JXIu@75Ai>!K05W+322$ zL8L2vM8Ydo$p}07k!fqq$@lx?qr!X$pka*}BIASp9VPvZv*j{2eahS}s_mhj>$tA*@!T zhg>D4T1M8?wCN^cs(P*Zp{J%*PQm&r$TU2t-d~0DQ&41@{neXQeqwZ zeaG6enquXpp2w;be8r-5K}wdq9a7Q29g93vVv}0!{V@I9gGZpFf}w6zplIVI$XF_% zYJV@U_}oGf&QnKdXfM9={#JGy^8Ux$--_?mY7@w})K)19M4{7esm(B;VUund15x+gkRPX(Q}9(JdtNjC{65>whJB7gFdVjDrQ4%3^Cl*E zM}FX}4X(iladoGF-}iKoR|sXq>|e|=*jHMADGR5wU6W&JAy}Yy zo_(n2qtU;@U_j6P>#1U1JvIGs2>qv8_`2$UzjJ-6M5FQ})~5}}wm?_DMc;NZ+T`Y& z4{dZ8mssAZ=UWy_f$8Q?HW<-I8HIg1+TQ3LJe-!)a8>tD>iYl(_MWhD#+a#t^&kU* zT$FVz9)3nm1)qm5bG}IQIG}jw-!wU)HZ-dsS<;ugD`^EF%Ms(Ymf8w*^84vnWqSG! z9t&NG1&(HLY&qX;-DoQqDnHjbJR0GM5SM2qyoQ}AxB#erVXl0OFLM7f_FdjkUX<}% zErtM^a-{M^IPEyb-RlNvhH)k~!=NV`l2DDg)3$0XVPR_UL#9-6wJ6G~fbU`h*OxaNe zFs+5agGV5%yOK#sFLqhah>`~t@p6psiui1?4f*T8%%xmesdhvnMN0ic%N=O{%2pB7 z{?%uQgZG|Y2&9$gaiw0Jfjr%gr>VYRQgfY@HYdxy#zHeOb!G8>J^%_f&DX9hUM=6U z3RylsTV4)`DdfW3E>gqWH?%*Y>*scRkNWA5KL_%sXyt#04_|tg|Bovn|DtU9H-J6L z|848TEw?K5VLE5tbA9Mso+B>*F69{?yJ#qJ%2|DpbA2>+ZQYFKX%fRs!*tgRDAl`6 z^owhNYineEcoV+V(TI8Mb}ak!t=Dg-uokmaThokv?lOuXiYvCd&xm&6oCVgdjabz% z$lER>5zSa7bX!gI4NAVgkbk?KT)NK09G7A{3NFSRkMe|%@?@+&4MNZ=Cfbi|ZzD+g zW(mxYtYCug{ZYBDR5R_CfESm@IdMC47+hnwdwvFqvOF8{>n@bJwaHmjGn(AjMZ1di zuKx8?_;f}i-HA&{x+tt{E7E1kdr?yHWjUEkHzHF$h?0V+kv0+zchPqxT&`;hNw?57 z#mt4vl<(z*42u{vZzx8Z(8~CyNfq6Xov7Z&U7uft2bZFL!IYD|cf;5Oowp@UUex|t-+wW^C)vv(&v!nR;Hb0s!mtlg@|G@E4-y@~v1a!?4&^^#HYv(Tr z{zHo)HxizDzc%{l2*rbTPx^g{3Et`e~wE5;e+8c~9 z{=4w!+Y<)To;XaE$Y3CXIyU%yhx?@|zp$`cdJS_7#NqQSc^uj$I=8SYy1M`UeXy+rpef1>w1w6 zy~*z`q5j0+D$BH357+UzF{aOiqTthR!Thb5 zy=2mzC=F&Fl0pSsS8GYk3l`E%LQA3lHbF!K18`D6LjndQ%Od@Z}D z{8{uE&z~o5(B#i#67omLAF8j;RBR8T$^S-_T$=pnF6Pa9r@6nV-#+{~0{_ac@zH)# zG5$%GD91F@cfb^e1NQa9+{rqdeE-$F47*cxh>y-mcU{&Hf6x4^-;!T6&9BzsasBGyQ_mrlSAD-*IxQ%wCTHBqc!%gl- zF)wgp70Fb#6IoKa4wK}Kzr>Ss{T%phCBOCab&hd$Y4fqs*yydKt9xkLE0xc|lWakk zfMjByC>F+NEu_rE_mIjkZljg@3S?=9(Rn(|an>xG{Kx{H+n9a61>Y?2L1=sSh8pUI z7=cbSZ2jsJ<^l<4X14WTOk)9y4G;@wCqYXz^969+h zw5WK1(jaG$jLNB&{@8(k0Q-9|d{oi}gDy&{3cweiB9SVr@C}!5mngjDNV5Jd^anPT~w`D#L6LIP2q+mtlY^jQ89-2KvNDtiS!JgsFf z;Rz{Qu!wHo5_ga*NqpRwK@ak5S%3_>7f;U92FF#<3RL2@Hrr$~&jsuw$7L7{7CGtC z53F>ynx3^D!{+{6Vk|PqdAhG-H0lSg;j<3!homaY64)lQA45IxB;hyI$cQCd{t$dU zNSD`nx*v`Z!;i9}oL}^eDki@~;S&+A&7oV6j?LIKlD2>nu{mvlsqE(@JuhfDl*KzooA zCQrIPg!bTi@YS>jkD*Ybo%zX$tqX2O@_SBOSawn5VP{^Ll6xY(2IIPv)rY z!Mv{9gG(VxfQmb{2lL!BEmF3P+Jis-l-h%N|L5BSbkHAAtF;D(`bLlq~_GQlM@Rr%cv#s=0t0UW85}tIr*rws< zn6f!tr!aFQs%#xslz!dX!7`@w>*J0-rQh7MX2^uM)(paSAf&ad6@`Y^jRm#5?u9h$ zJmdD9k5_y1gJ4ZXQR1Gjlvl;R10;-FSf{hhN*iWK0u7VgSpKr7OZu6tSips}Fo%H?gf1keJ$3AO6eK%qO?Az=65IQ-q=~>^E zSwEbU=h*n{N_LFF=ElS4ClJ9s`?7`VOdhc>V8!fz`|3}MODWXzoLFsR9h%? zVAgE8-%K$!!(j=l0ixtC1Rrd702Qq}R!%h!KFdXv%i z@UiF*pI)3`m-Zuvzi^j?Z58)n!D3V2k@YlQ$LcE9f@aHEygqmOqCx#(Nc6jBQ27i- zkK@5+`Kh^RF)?&)bI<5EOTI80Ew3ZW)rVHm;9zL3DuWafL;C=&(XKQjZGhq@nR?v6 z!}(|W@vlK;3E+Ql`kC^_i4QFKRsHU_zrBps*@j6|^&=06z1$}~t_8SaFrH_J>b=S1hYORIr~ z=alGD=YA{}tlSb!YxH>75pClSH#G6!=4GZEUd7X#=r%mPkEiL;4a-cY|Bk2m(YRZb z@Cbv#PPZhzS@aO#$EFc4FEbT4f%EBR@vNukWu`mw+7rA9hm+ndo-5Uj+z*S)MOR35 zZsTmpaU8EQc14E2DO=o8lezuV@U^4O?y2$N^GCPAT(+ZCavTGx2`9$f`q{9P6F#Q~ zwt(>9)?X0b=$hM(yni+md5@E7ZCr;q#3o&*AKCw;hxGPpjpu@JTxRCN%7I&-Y?C9A zk*+=ouedUfb9CS)oEVAC?FQ)D(MB};as5X4e$&QRp|j1_C|V7ql|ZwxG{IYrz3b~* z!;|O$uas-X6_3}Vk&@!W9c|8U?kJ`cq*$6_&V~0{k2~w5vFHfNMWP{H zM;gXkkDKnCiTuS?PinEpemh^u=L=mOjo1IclhS`H>(N{VqM}F_NHbAwTnpNieD|v_ z$N$Ib%i)AqQ0Q~i`f|0XFKwFolHlbvhM}VH`m)wnUyi%hwb9}KjJBkAB}aR4U#d7m z!|nUcZhimoR+odS%tjlk%uMWa8foHM^p*Wi_2u1Js4tOJUz8>aRH!Q>O$mn;MJtuX zJ~!b6ufI~C@H#RLfw%i(u zo<@16GKu*KmsqtKS?}v>KSl0RUm3*IRgm~*BS*eld}eUy zIzFYcO7DBI>3#~|dsj#&So?~x7cT#dkqi0o4CPTWxvl+O15wIst{HmiK$iSvI^XlO zxO82A=15UEI7odzKNUQ&l2iDLLM zB=e;pgAaV5&3wr>^w@tY4$IxLk6E$M&5yD4V-aZ+n|H1pEy>WDi z(Hpmd|I!Ve-Z(m2;f<7mCe8%O8K zym55?(Hlnx%Di!OEXEr*7L#0WTq6IS$bT*TH=X}Z=f5fZcR2rTrQc>Wv1e`ERY2>v^Y|Bj6!4)OeV1pgg{U*uiO1=IscLm8Wg@1lcX zT+Zw0BkQN(kadLoz+{^B7~~=)*nY@=In1*N{z(JoH0#V?I&@#we(5=kqEGb(jEQdH zwWztA1|ADM4CVabK~Fk->%&Ij<83XxeTVtU!``m|Un!3h**sc((;S@#D&Ns0H6&mF z@wW@!ZVBeSs8PDT-6_|^UKC3N8|K~Ph8Gw>7&t@ zSJcW9v;ijJW2$QvudIEQIG_X5wJrLjMmug`lwNH${c#|0TE|o`tgQ?SIEE!psbXJcdK^Fp@_p zEk0GscXL|1F@Fz|EW<7h@=MMJ9c^kKidUb=5cq2g%8lm*NB{sw)R5I!H{*xmwf+go7acl^lEu z&-0L9xXhyQVypJR7MEGeh_Z(_K*S|-foC&F!Bxrjn}|<9DF!hKIvAQzVrWY5XuB}> za>~q}KzD`3(9c=)6OmADX^EHL0}0yU0|3}bL2Wf=4wx_?W9GG(`3K|ss}W+8SD_i1 z*VWd=0&{*m6@;%)1yI<30(SGL`r`7|X0VcTQPazL(%X^CJ(RT5uKtl=SNLJ;pJZvhPjxr~wBA;QS=o)4} zKTG~4#6eQ*XVbt|2i-_lVL&wv3G}|}jc9_@P^A148iv}<3;yAC{9V49YI+C-vg@L% zh7=g{ZKTzQ!2MB*s;qiFE;VVHnf@5P$$b%1x%Fs=LUpiq)JNVv9@@DG+HuBlEvtz< z7m1|PLk5_5p^}{N%EoHb{isheBk|=2!OrVADzB#8>nQ<{t&n631F5tQc6=SC@smiZ z^_1y{5EU288)ol^wRxBoUtn$-jh{@ino;L zaBrtK%yAJK#q+uGU0FulnY0!w4+f#~M2na7X~GGsdFcvy8`>7Z)jm$~;^xI$@jVOI zYT`Q0`22P6;!_BfeIv1>;)C75)XulqozJ=DI(U4dq^6jS^7fmhjL#ZNx^<2BjO;{5DyreDnzKlLTI6b`~cO*$ntK< zw{dd9(U4=AKUH5JIT60j80K80XSAmu-_mjE#sI3)e&TSgB37W(hjAK_LY_R$3WYma zuOQgu14gjnF={-Y3Fi5z&yy0Sk<2DF~MNopD^=2aNo!sFbkZX_KGm-(l(uX%RR{Xl(P3t2j;#4$PaQ>5QmK7nuVZG!}zL z(JX-sUB}}gzptL*TJ8~eq@Be8+R+RsHXMt^7qWt(@&E{ro;IRDH}ADeA8S61@y387 z^gFnTe$P8ZzvCL|chW)pF55D=je`NlI5@9?gNT9&plkzBiis@)6Ap+HjMh|J--rqlD|e%OJDlBs_LQnld28!l&i34Mx3}F zhbwygGbYreN325p*m^t)J$^gwK}c6QDNs?)UlY$OCC+@lWYs_xbO zXrScKJM(ZhX`ON4YM2l;rqfj)R-@%HDq*5DsrsR=u?0x&7BW6!ZBMcqiw6VZixSx% zH*R(r%i2KJazxSOeOI5kCOZ{DsMZ;`BP`s^oX19FCLEs9_q;_Y)CK+I9DKQ^X%C%t zcILIh{E>421?duA$;x(}M>OtrO_`=&Nnicc)rYJs%rv;NkxJMaIf~iEhA)<{%$q7% zo5!uR=dI|EiSm(xuyJX5D;@nCatheIPLyPxyeY2rTCZtRbz~T`Up#41q>kB#PbwrZ zc#DSI_rF$!IcS-kNk$NpLSVWp>}&;=NmeOUGBo)U`oR5H!CUE*GEvQsX>50GuY=6 zFxzJ&ykZJ#q$$)~d{H=#FC)%oe9>^WMLH6&iRQ{jNo~#sgF=pCjGm)4<}vcM4{|od zDE>50;(iI$KjLRIj8}2uV|+v*gb`D3UfZbU&dfsFJu6aE-*5vqZ&C9PLJ3(m*SKBK zhnx@5=^J6$77V;x?sEFQeRU{S=tM1uClE>bXS&5{tye1Ab>2mNFB3vOTBeB zHS8|y9vCP=2bJZ{@t!=4>*Y{Bm6V)w7{%jstxptW2D=B$mc+G}HKF9t<%(2s>9fzGI_JOP4aaPID2W%DaMHc_oApZfF zSyL1tIv$LwB(@=ON%76ijyPwDIoxr9WQm#-6LH@#`?-@YBoH;}A_4;@G0QI?G+pwb zXYy&39)IR|bHYe-?$~4CL9sM`YrzmIMakPJJ$^pl$?3ZSIVtHX7rr_SBdi#K~I(y%fjgQedpk*12 zw7i22lrPq{1X^NgS8Nv{3Esg*_~XHi^Aorbo{%zHVFx}T<5&Vr<1{3_;pp?+Oz>_o zm%WaSCN%@jN@J|1+1$Uu#m5~d-*oZu#<$wEMoHl7V9rT2#lSiTAHL}kJ!-yoR*_$c z%)#aK2qDe!SD9)LA1YT>Beb@vk$&ZI7@J7xdZ$6}O4rNxj}~vZib=03z3K>IW@hc1 zvqEQnVb0AubJADE(b>{9n2q&?t@WW}F+X_^X5^B-D*6;TrqUs15Y1l+qWP-=i9Sl` zlBiZ1Kt(E{dc &w&wsQNF!#)ku#wj&A0_x;g(Pb75F9=f9Qwm+UTk-n#N{~GzPng2%d z-$edPCX>8zG5nVfm_jPfp_2dZ=D)l6?@s<(#ecW(->v+28~@$Te=GR!4*pB`DS6|j z^X~yR{yT^NmT-S=5j~DsNyxRY02RpSfy&k<9=+!{426{EntASn(^lG421HBsP)j+QXdNt6ifnE*tYM@sG zy&CA%K(7XRHPEYp{}URJ=ENG@la11}qX`Z2)?uf;RTYIgv**Qs(B`lpf0DJ;*^JA_ zup@`Q>Yv6g4bS<}*v95#)Cxvv#7KV&7}>jGBzOno_xjL4ekTz_)mY*e+Y>)EJu<|o zCbBjs$o~0BSLsplcToBXKcDbl>=Hj?yXWR8e6h;d?yO1o)F7e!vCy+=5Pwumta&~k zDBh}}D9H$ucnSzd)x|dGVk0s^nuZUH@@;skvKK=u zPkh{k7K0R&5WVmb({mnAiNW&$MVZk`dR>m3prVyBKzJ2;F5xLOc*bzpD)f98M=*Hy z@Qi>j*LNaPMdaI5U#|E50{0Hpm+SvuMg_N#=MgyYe0WcA*s931p@!#2fso;DMXU`q zJYUub4kp!?=g(xGcLq<1%9rQUdck+0Dg)22V*UnPo;Q$z=i70v1ibNltD;h;=Flw>}43MD{Bkw32r89r0Q68ZC9 zKP87(slGgae#P^};A!HVz=7w_heEP_s$@KW-sW$>I6Qx%sT6DTXEKnh z3fCZiR(tI@p8YuFX+MypW6*KEHS^MiH{Kq- z06J=qrfEw%wMWOPI`Q`CQ#@5Q+z!1C{oD7hS1RvrQMMdPZc}-`R1~ahlp;j>RZ0`8 zfLbPad0)kKV({FmmP@YhCq)Zq=Md$G>wUYxU8wqU{og5km3{%ZJRc0gm#MfsKmH6@O#e}ZF}@jk?MDN3(NZpmq^^hTutyo`4<|~s~Y3^^M=sP z`>HR`pMj#SKBT6X=TDo!-KYBU{P{@uzN2b`=TE-yU8Lgj{F%Uui@~#yhpPFL7OCXV zhaAF}=Z~UYgJ+$}m$ye|!PlbV^885^ZPzYdEY;0hLcok%rqRN?zqZWgqZUJW2X8xNhy)ennceko{vaE6AexdsLI@f9fF=`DNM`u zZ=kDczY}Z+2C`L)%R%sW){OGp7)bj#(JrMCKct60c34!I!?%2&&SPR3o)g`NZq= z;N#PPG*uI0uBT^+&vY8Y{{1hS)EzwNhriW_zlreMsl-0j4gMk@eiq@!5`Skm`0+mc zO99;|LXm&(_7)ge}M3J6Mk(s_=P_F zWrTl-@bBve-{Ql+itslQ{*rF+`9OrrA4&LQ2|uA5{AOzKIR3kMs;Z>g8Qu+kr4Rqt zgwIHyZ#Q+VpHd(GYQi5u_>XmiZ}Z`&5`GiOQ``-Hj1PYZ;g=Ksly2}_sY~PO{RB@{ zN2vKayBqv!AO16hzlZSu{$AJV-Ri^NMEF|>|EX^97y0nB2)}~#`kM|u#P4|`*QVFv z<98MD+wB0qB|Y=|ZJ5IERT}eX`L&XVQvUH&#qI#VvwP;(U+C{MKtFyJK7J1nKbhpK zg(;rEL~7nCy=(vdZ=T+_bpiZrK7OghZz9Q8+%vzc+ZBF^;Oi$J^YJ@@Dpa+I>c_=B z^ZUm)3O^Zq{rFXai=w|@6Tdwq-`lVmq)A`kBc=DiX@%dDf%R>Xk6#w?+d=XD?&!Z42aA z=;ODH_?3`+_w~&0eiVL^uOP5~#Q69PA%0P`RxqV!e(69aextq)$lpc`sFd{9;i)R0 zw|{T;nBFPiL;RWo%U`LF-)iEwm$!dC^Sep#+Z?FBcptw@h@Y9-m&~5|Wu8*xs|)1U zOchXR|L{~bmg;YK&-`M9e4mgw+VZm1$8QtyE9dQBV~_fKs!fsal0f+^K7Lmbze3*r z^~|qSq&GECzE-L*O8bYWs+UQ=vwP-uOtc3lPX?5i3Ln1*h+iq?Z|xgBrq?0#HyY4S ze>NY#RN{At`nTeq_!&JPXxkNOQ#k^NG(K;&Xo>A76a*J;g$J8wu~` zKs>dbrTOm%XkUGFJpDws^DfYh3#1G7z2srgcTDDJX}BKZSJ{cd@z=UYs1P6+zZsqQ zts#CX#BXO0{0c_k+@wuzKJjld*wrCbGo%_#T=eDOvam}og1#ac{TGm{>JUkBewXyr zjt!+^sMc#*JFFrF^PGE;_UnqGWBf$9iLk-74ei;!>B%C&hnPIS1GxG)daL8ze~89O^u{j;GTr$BC^smR=3?YM@sGy&CA%K(7Y=*ELXVFIv9x#u)pmRWU18t-O&Z zXZgz2i&rdP8Y99AR~0X}FJHBihZW`(-JDlky!ghv%a`UYTd~-lr)VH4X32`>c`NO? zD_7+%S%n*lO6L@9uIIjrr-Qh4?-oh&N47cPk1KdD3@}kQ~Mqe@J ziqWGPE1a)0kCnrMI-v2t=n!zKf7&yj{19-=A>dS9-*a4xLclSEfKxfI=eTl0z+oZa z?8@mmE?WpVZP`8ZsR#ilJp`QAte)dqowvlks%YYzYy7JQTbg%^Bd@bJYe0GX8aJh^ zJ(ro+pU2Es!u@^_GoQe9IBJ=UU4R?(5bhby%tMC)54WxE#}%v>M0Mbl0w)}F&1W(5 zYv5O5X6A8tzeB_42yps<|A+A320qgfcIDa3JQuiXT!{;H=1&oq8@!)DST*7@f@TPy zin9$kzXZCA)SzYu&*gT4%LHUK9@6W1c( zJdF3p!Q*y>rvd*bh-aB5U3-DkhOqhYI{>-*BK&>CGZTE(xS|*9%&&p>iwJuNVG(%# z0Pq?OA3Jc?K#uc3X9YYCHyZdif~U%-5jZ8d=jk@+r~xvSBYi)IOg95p#Tj*j&b%LV z@4`I>+E2l6Eb!|ze9D2d0`FIWZaCoYz~@r97RaUYISQN+i0dElKOg?rfX9pA^|>Zp zmL)p#FoX?4`u_y?2GY|9>1u~l`RoAB3-JFCdZY`Lq9NBx$i5HHDoz`4b|4*}LY@yH z&vZPu0e>}ksyK6&>db$E-%0R37qYwxo)-c)8N5^+m@VP$H*Q+w5VsAo8}sa}&;hrq z*iLx)d5f14EL?0~k`HJvTD*k1m8E$r@~D4VRY=`WF`+Q@Eh|wq`7`|_Po9!uO-)Om zI_c;%#1vjm@dF86YTZ)S9j@4^QZoMsj^q7RP z9IP8WY;#wA*lQyyrE0LpX6u>6n zxg=rQwDgP{Ql^i#-ZuTF{PAg%^K(+xOqwKEvOu+F1Fy@wwSygxhknwmb7H7aQskAWU+Oq#0qWhuqV5^;aPt`I*bvma3P9DL z=%?CNj}`DLf>+>=;8M_-(QeQ){q4p3cGTCeP=D!t?#i21u3ED)Ca;8w6*NGe_={Sm zGoL~mpyJ)IcxlYy6)RRPS=@nC2%L3jJN$5piWc7*vodc@j5dcEqg!I>_E?3x^84t7 z2d}3mYAdF~9VyVUBMa$`F*S_rYevD1xJk!G3W;de+t!c%Fqd;@7!oJ1LI z8|E15J3-PztneEpAmOPvTE2m_D$Z8m=Lg}tR`_icknmI*E#E*|6{iXK)j{|k5`ISn zBs`Ty%Qui##fkUm%+Z*$sqX|y52J+NSOE!7#nJK&q*Za&0>3Z_-;Kg=i-3fu(rEbx z(yBNOz;6h`_lWR2Dj?yhG+Mrav?`AIQ?whHC#&xSNe^R%-$VfkPsP#l4Ww0Z5`kY5 zgzpyNw@pC8Q)#q(18G&9t-x;#!uP1~J0>9EsWe)?fwU@46Yxi1Z9;t~NP3tk{89uY zJQYXFH;`7viEq)FOM~#;Cj52?NO&rZmTw@finA8@O+ok`6Mn}9Bs`Ty%Qui##c2S3 zJm%->J3-Pzitw8*AmOPvTE2m_DvtS>&RiaZ?+)R&Q$WH~X|#L;X;mBx@S6kp(rDWBHi+NKdMrG@^qyaVYK48~;OPXxXCPLO!pgx`EXwOu3JV7vqARbHk4#F#P&@7=<$ z3Q%p^2saq-Kzfz;h|hH9<3V^Eus%UJQGjauM!3Ov2hyv&tATG5d{jTu$x`802&lGk zgd2=^Aic^b=X0HTcM#sy!tWrU+8z;ZFy4XmD(^<%8?dgTz7r(5hYLT9lg;WFfN+EH z4y0Fkm9*;2OM~z(5q=v1)%KZigYgceS9zPiK>rtn_aWietl>?#!FUJKtGssse>m2E z)OUiUlX&4b5l|gx5NN zwSOVpV7vqARo*3Eq5Z=;mHJMQbdn)k=8c^*U2saq-Kzfz;q7yoEdl24ctk)6Fa6q-r6K*ixf%GbG!%3YvNAOYo zNGB_VUkRYvR}yY8-huQgp9w92ICz_ukxOM3gh1Z-b8;y_#G9H@KhRYA0J4o z;*j)B7Onqfr|;#F&o@`osOLj*Rh8qbnIB9j@@n0 zu`BxN*e*CPTvC4>TLISwH{GaXO>i*-Knqt2R|(e)XCA0y7PvyV3b;l%X40{ExJ7VV z;i}2Gp?R>yYG6j>e8e zSE#{J{T6BbfWrSM&Qhi`QyfIs9t4LFRapqXQG-9~7Jped(*XSV{vG`1_kd4ws62wf z2;upC<59XQ`gO>uFX}#B-*^1~Kk_>ZdAS|;y9CQ;DsPl0rC~~VIUxDn2T0}oVL&R^ zy8)?gJP$}^qXCfieZC9W2kQEQd-f;%(E!8|w%yy<3MWc-sM0nHPmhJ4nz1sVpYp-lu-X`4c%H4j#3 zqXAXgsMU&JV1WqC-$oH{lO|qUh_r=KN*pDCYP?%Qq^&e7v{isAZ9}NEBE40b^y=4y zm|jtiNe`ADXh^Q%z}wah9@UXTz0iYzrGQk&BmwUOq`LpGfWHQ$y1z%jy?|8rUls5z zK&t!A0?L3?_fH6T8j$L~F+zb+fK>S}67Vv>L3mFT&;m&NiDn3x1vmunO9fm37>)Pa z1iTaQ9K3G@1nBZl)z6-i;CQ5C(odsko02Bs>F2b7k>QGdq68ccNcy=< zz%hWNAB%wLfTW)+0T%+2epU!*2c(4DDd1*6($97QD*#D9PYU=9AnE620S^L_e*Plh zM}VZCRzQF*|42X7Rv)@GIG(DXtr&NZp0*2EA>b|nD+R0)uv)+d0UHHu60li7S-@7n zKp`o4zW-2TpZ`no(wO4d?Op4d^2Z#hghvCC{x1fk zdUFLJjVUGqQoWf5NIK5}q;_Q)AdM;PfK+ep1f(&=RzRvZ4+GMeVmBbwo96+koHhVb zy?Gaq#uP^Z0XqGWY!#w^-lgfE%hv|S*OnckEfr&ma?P0H2*#eh`zuMqGmK&tyG0!{~{x_`ZZHvm%I zFBGr@km~*>0q+K+y1zrfoq$x}|0Lk^fYfI;2-pZnedY%Oega5+=5Ybr0jbaIhq)@j zL4ed}#sC6z`KRi~upu}e>6rAhsE-n!FJK`c>F0Imxrvj?&WJNc!syv9cQIw4)KuX8o0Vz+v03=?NpGQLAWdWZ0w<6Pj9m_Vm^EwvA zP53HQ<4Sib@oxcC`4J@9)IWMAmnd*aUUeO7L;xMpSm;OmO}M7BENYm__hs-<^>_%+ z1GHZwG-z9(irLzKx!vO1JW33 zA|SOBX@E3_nhi+haseRK%X~m;CyD`S40Sso$>9XVYo|X7tJb9ZP&erzV#03)FG@e9 zN53gJUv0isBCRU^*e>w>$_4N#u6#j9`dZorof;3}Tj)pp-Lg51>zl%fo?r!dko=`c zuR!wwl8^G^W#ABQWk7t|c!-Gj#AwoGysI-$!c*x8-*!%i9wvr>&ouZeLcnj-)TbRG z;5Tdd9}EG%LWAGl13u}K^3+z|wO+Um&sV}n0Ftia0V%%{0VzK$A{>u?`Fra)pZZ7glp;R0tTqSWs(305E+6CVHf}-Yklrotgqbtp z2v-en)P$42=RN;$+^XuMr|?}(U5D>@Kg|3B9O2R57;$EGr%TZzrF9RU4~cg|q`fwT zi)eT}G_JTroJAvlb)Szm{8>$Sj(Qeuv%-h+WjLO-@em){b3;(e=P=H@l3(v%uLgQG z@ZYC_3UMCv^aDEHX8r>rl52D8*tUDISLuEon}G@AlbAgG4K;c5P|Ue7aX5xi-cK>X z@WL+=&le#)=4`aNz&(J0(J)LV9v{ru(+C>}zm<5t1NeW!^SubW70(;62sH!zn$HDq z_{|32y$Bx$+{XZ40j(GQQE;z<_h7vL3t`tH>=DHG2HS6R-)e0`Rxs zy9I6z;!x`}Y7-;I? zJaE(Cw+P{5!7moFT>!TR^nV2J6oh{TcR$|y!Wn^cJ9OX#{>O;x0r39?-ghD_6L>bf zZw7o8aqNfRL*P+^=XB83LJu#4t{(nVurX;K=ocdHRM1=koKFA;0QN~CA-Rl)rl zH1~j~0r5PK=gSfH7I5zeeLMKy4c-?bY$)765MBhHlL0?R`1Qc82TTH=2*ke^{L_%W zJK;YN{x^W;BfN*he-qy4gI6x_4g$X#&o{vTLEu(_rxk7`;@t~b#sKGh`2PWLCg>)> zZ!~CTgQgLAb{fy?5N3pYwZK~p|2}vg0l!}Y{|NXrg62y24S)<=fqy5$-h!J2*&Wc2 z9dbR5=Mvy9h5u^c<>L8n&=dm>f^16x?}uDJ0sT+F_X^P51H1)rlR$eIeqrz%2i$qU zSpomwf>#0j8X#8~a884MDW1y^_8Z`5fPW?Y?}DENG#9~HfRhcGa=@oAaLN%L`Ewnc z2$u_23imABVYq+8#ckKIOt`ghzk~Y=T-YykY&6_FxOH&9f~$o)1{e8D9Xk(h9NZkZ zTj0v!9*6q??iAeM2N4dJ1?PafAMOuu`{CY!I|diFL&q+Kn+aC}_XwN^ZuCQl6RsYv z4elooLk>6>TqWEgxD#+^Jp$R`#=~ubdk5~q3LRSocMsfQxJw_!9!a=*xTs(0*b=xh zxLt5{aN&>X*krhMaL>bi0eAjR9kanX;da6`z=eq6`W;R@k?0q6ZS^!WtR1edT& z$DV+zhP&)HkQeSjxDVhi_^poJ0QW51z~5m{C)}%W|Arg6TgQG1w*~H5xcA|7zek$j z^5AyE{R__gB=Qe#37iDC8}4hkX@9_;SGc?3-hzv+#6DQKO>l3+Mf_3665$+hPs2t1 zNyqGPPrwa)3c7*&6WnKTBldtlTrFJO)5trxa=0ou4_w?cI<^$91}^4V^``E!{t8*Ke&m{qb-Dsd;$A*;r77w+Y3Fw-2?YA+@u$E>>)TW+?D%u>^8W1xMOgG zUV=Pu)8KZ)nW}YcY>kdxzaO&0oq)Tl7Bav+19t-M+Lv`~Gu&%%gZ>Qp;da3N5$<1b zadkRY0QVr=2XGhF>)4HOPr|(h=Ybp80KRa!a2wzrf(w5Iba3~=JqLFLj=c)`;AX*< zz*WG#4cF&@j$H${2JVk=VFyvS;C=@e@tTg!hI^eh54w)()v zR$tbS^=C#{*c!-87#N?$2C=hYYhf@O!iKVFHVmdF&Sk@~WAuD>0gGW5vWwWoESAM# zFX>O%2zDvEjE!WY*yZdBb|s5vquCgiz{aw1>?(FOOJw6=KO>1vWRuu6>{@1F$!s#4 z!cv%(rLr`Z4vP=d*mZ0=%V0CuOlD)V*ld=`=CHXei)FJMHjiD;ehPaJ3)n)I%NDW4 z>;|@kEoFIZ8M~3?v*oOS-NaU~o7qaXiWRb3SP?5`cIIHK*&0^DZe_Qz+u2&Sj@`l5 zvr@K!-N~G6BP(N@*j=ogx!7hVu`SHa?q>I}t?XX*Gj<=_#_neiu%EN-*ctvy_8{BA z9%2u(M_2`Wl>Lf5#&)vD*{|6XY!~|t`z`w&+s%H@o@9SumF$n~PwXkShds@nVb8KE z_8fbjy}^EU)W)Gg#DF$z&>Qn>~HKN_IGxaeat>#w83}jiWThIYvZqtO)FaED73`J z$6MfSu}n?2TGFT5lINy7Zm^8D;9wOMe|A6K;+uK)$$D94$iy3FeH*AfRQ=^h{p%h&*|6 z7VI#IG8PO03MnpLk-NlRl3Q$7%WE)1B@Qa(yxbG>^xPR!l>$y>-WO+jIs!WUeRZL8 z(*3H6B5p^4?-Zy=peaS283qI*aXv1*Zcbmdst~o5>MNz%m*UZ#>NWA^5o&@usT^T` z1v9=wH!7`PcrXUOj17|S;I9qtOx|TijrPkZMHs(K>hSW*AH_RBjofo=Fcl^97R;}* zc7vyBQ8ZYZRCUj;6QVyqpQcnZTcpsr{u&e+lpW&GIK`e+ze~3ZD!`2Tw8KV%G4QYmNO_~ zW6~$HYrh4v9?FJ4yV;QM`x323UZF@fJ$ZJTHFxsd)Ku&2+{~%hqpwjrp3$U;=`&}f zredg>r-|iC zEnd1bx%k$VOOTNPV{Fu3UYCMkXj%$?l)$R3hHCobPVrzYmxGZ(r%qiNKOy#@#Ht9v zsS)ZU_cf%QljtMvz@aHdx1^mS*3x#wOJ)Q!6l2mBO~;NHkybTemLt!RXTeBus%>%# z^@EEkE2h8(;SGzI++^|7W@a*JNy#fkz#EEIEnd20F@{r}bV_*#mQ%CG&Mcflqr|Q$ z)bw;gvSjhfC3!36EWbGqHYo#A!gF^?J{hUBty-}nFcjj7LGThB*(|cWLK9cZR*T&wkxOn*z3~=n!gt`41)U?}6)1b(krPDolNDSG7cVcuz-`Lp?=GW~YD)fC3o;7K)%M3% ziI%{oD{Q2q1o$!})KMm{Eh#kP&=9LbBejNi&%cM(v)dQ~lRyKSWR|&-O3W$ zYt-Dll`vh7w$#6=r53YOTTAH6maoJu0Jr6-f&Z_)?*WghI`h7PK%-x@Xal09ZFDI_ z4SMeX|Mvz6G?Yjq35Ygzm_K(&)=4s*OfV?5sT=vIjcuxdMVIwKi%9#iZR#RRSE|&9 zve-=(T|{ize$i4zm-^8yQfgWE`<**~awnO|OoIF8c{cNKnA|((zUMvf`JMND&wKAZ zuLmSU3&MoPt&2HPf6NJ`swP$1=oC^)V{{U2v7oasspHZJA8LQ8tMNUo4aaXd7lBms zIVq%v4kTLqahHiY|GEea%6Q;ePf=O@xs)0$m}njdW+j^%2aj9|R|=HPVRmszB5IQ0 zd353hv73W@%t?c-P>kY|`WBdqo1B)m*t!L9D2BNN35!|nPPK5Xt!1RCtcT8^Mi~El zT6JeYX8jama$kUr&F6-enm$aL=V{czU&@HRN<= zIs^6dYg~&AQp=z<*QS+7N^f|=Z6NIprX@K@J5QP1qH_9|G%rafX&jJRO8q(4bpxlP zlF0*}3_@AFshVWB@*)E4xPSmZE0B`JjWZ3|R+9F5;BO>JW~r8f1BN$Cz2Opd3Bjcc zMV!Sk{~EfhxmSyLH5!ctS1(zDP$dS!Bk$p=ZB%M0?x=|xom^VaHTl~YwM66V5+1jw z18~R_p@rsFH{;8YOXs@k)u0cX>teCFeQ|TEw_}Csog|-h+KomdFGAejCaBamb;RLO ztf|Jn=ELS=vODc7X`Y)E@vt%;mg`;7E=u-0AE`W?dx=Gw+p(4YNKHj`*)2k?`|B4H zIT4bJmJwH^hClBm>F5P&`j*wCeU6mw$aFhXUSYDm%!{Gb3%$Orb)mavia74dbvaF{ zl533y*C*W38l>CJ!>yh#xfY+Ucb7ZuQFy-y@6+2|RktO*WgsXod9QfJN8e3$1Vu}e zQBcm(qDc4?p4pSIonUFGayDH6!jRDq=;V_X(NNWnf0nvo({qznSf%s*l=G zQfqo559wQvOQ}iqhyX{t00Wy?LAJGKyEN5if!AjB1q*7`du73mHn#_}$(5u{#TbS! zx#ac^T6GTkDgNj*E&v~?>RDP?)Jnb9?1M#@0G`pJ+Ow@S%LOU&BOva*!YkgScnYqc zuYp($;eY}s4-C9l!i$Don`$bTWLITgP6ap437k#l1rpE4B)o$R>Z$r8$>(%&vcrl} z%~Y?h50RH{ih*2GO)3{B0?r|;kuBxz z#mE6Jtf^!&qCzJj6w5GqB?n|!Ya_>JWJ7uTG_0jm{ZX45TFj;*Yxx0|MZ?j7$%rF+ zRnN#aQmo~iCfUvLsIAn|aB6|N(H)i?-N+n@VN@@G@nLk4Yw|yU+f1q-8MpOr+RFKE z#;s92y@VNTKt`(euv4(1$~7370?R^moZa)%Mbxf65nj8X$QHsIZg>nUTZE$BSW3dx zE0liT#nC7&w71{c77L|s2*FBcL{gW|r`}Kv{)0(p>}Vo_SL>!70|L{tpzwuiDwKk|khf2j1eR7V^CK&HL6E9N?=yMhN^a~S8gu5mH{AT4^@!?bhLYTy z?x;bdxI^kH3o~x)D@(X{m}JBd)nqhKlQcPEmB$bb8wXy@HV)Z@ly5M+d|X)9 zGCFZ#q&{LP#hh?QyOUImBNfIFlxXbAw=`3a4-eMmCzcZVXw*P`OkJG`^I za2>vi-sPYw2}vnOCzMx%50PqL%Z`tmbkH)En?zndyhJ$u!Wqd)V+@>hw2m}H?Rdt) z%iYjCN?JOvC!JwNe9QQ%+whOE^V0C>z#R2cIJ=-mhY`urYRXoQ(qlZ&G4lRt(p{k) zP5nBIL`K`A(}*u@Yk}=;Z+CJ?J`sH%?Pf!}lbcA2liXBLBcZoIW?5Uc6Y;Mb7LiZf z49Cye?(4WWYw%mHh(1+Si7+cFWw}-3S<|KEnyp@{BQ7Qq{-T$lCr0M2f!hqBk+&FJ zr>i~gkHzPA#M_3gqdW{zD}EuK0i6vwTJd)0BWb2Bnz;Fpb*V`Qf!-}cmfoz@Qrx8K zVcYr^JYs;?3Wk)wM=q39wkjzybOeUi8D{EIuLF!;Z#05l+cOGp-fAPr;jyq-dUZ0Q ztBKeseReG7zNSF6RXoQfDbiW58CrFEx$!Vv=Y4)Cbt4ClU8NSQ-pf)gC14J{kcy7r zhr~oqU+9?>NsqyE?>MQx)6c8X-gUILz-%v}3Mts^KD(A~c?|X&=9>`r)>~op@)|7! z!E;bt*cM%P0iMQq>5hZr)@THo)4g_LtP=GM(5S=;WX>g*$RrM~a!pUHTgegvk1V0X zlc~ptUyy;x>{q03!cpAP=S6|})Y~+P7CcZ+O@TXO&Co%aFs8oL$fu&_Cm6&#loOu` z2~0>}LIM*Kn2^AP1STXfA%O`AOh{lt0uvILkidil{!=ATH)&eE6P%ZhA&~1w|K0mzjx$0$aRXsyb(mg{{`>LiY4L?qu|DXC@ zS)bTn^#;7JW<>lgfso(lSB0>k1Z9a2_(ezZbCRqC#ZV|H2Y5vZ@>W$Xh=p;1pv3t_#SuwR7F5Ac{9#db{L%gQ0i39}(y^s|!05>XH(E+BJ6l$1hf zutJCxR7v7Q0&-H2RfCcQfhw$Dc7m!<2o2RA;4u_xSS2d<-ofYuSSct5HS!CWnPhaSuO};A(apEk|c*EKam5DN*sX$I#^N0iC{=7 zq%Q%5_ytbk0aZzr{TQKekW)e;k;GuwQ3~QCAWO2Juucf`CLjbzz~Mt&z%O&Ec)u%FW5op4y!n`0k5r zA${RRHW&z#Fj3eb58dH}{h|b-gma`|kcfrQkb;iP3miJ4Dl9KbY``ytLLn01WFg1~ zgN4utORB(1yu^kB&;mgvz;VP0`28ZLBKlO2OvR8tL|8r?^2h+$-0*9VX7}muR6cZgCJKgMr#!iQd%KHF9 zHtFY)f7X5{UM9&#ZG1eAtH0T99c3kyo2TRha!EYquIJt-P5X@)|J04Af&efMx?}7| zPW}o4z&QBJ34n3XqCAeLzZv778jx&+M&oH!mJ71gZ*GZ3s?y$U0h%-88O9{esGiI^ zpE6)1CU-U&rX@!n=I65jD={WMvj}S>TUqsaru+)9fMen-1Lhy0{0gx4W8yRCw8@ZS z{&6k9lNl3VIj7(l`6|Fm%gR@#9?obK2l?eufQOm2-TZ!w=)R(wT|bST&jP&ZTzqDK zRHC2>nO}YdtQ7uB_$pu(l#8#C{%BrV<(E?dE4#w^p_8s4VCCnlfK_WQzB27m%8ZW7 zAm!&Xkbi|fHa_!?DV?MF`6?j#FgCu%WsvgoSwN&^Y2EqIm{lV6h|QwGQa!^h|>O- z@KrzrIu~F6A@-<%sCwc26a*~q*!h+_VPCMVqcxrg0}YP{c5Njxr4x(!*ZEqVJAIMF>!ZVkkWv~G z-~VY67(|B5r^+WYTTt#rX+mj0S%7i_%H=2@er7WBF3JE(Kgx?ZH=fV?MMxhqhEMF1 zlbPySlNo|iit;Xw2T-0xc?#u0lvOC>`7A?Pv!y62QI?}1e_|JMvUVXwQ`fIhkeaFM zCKTjt?TVuO9ZD<8zo6WLLQoi1SBL z_M?0cWgE&Vl<|C!Keh|0t-9J!kjX(8BhE4nzzuWBPe6}oJ0NMPfunpMH$Oy0qXbS+Vl8+59Lji z<2XKs@8?l=qjaH!P-dW1pln4M&u0(l?nn6<%2+<9$5{W(t0ps_MtKV5a+D(|*P)z2 zc^st|r3)pBvKplhr3&SFl<|H9%rgsRHp+}K&bjr|huS?$Gx8z}>`BkLV(=BgIpSvP zO>p=j&h7rhWF|gi=-Lvrdk*!sd+II2xr(yM%uG+cMqqX;>P4;?y0#DJPG5%kQxVhP&Q|{B8I=RA`R-+Obuz6Gu+B)LHi}T4Z<| zI&OpGR78*6lmqT%$eouyrtfAWCmW947d8{W4-OqC2qIrwx(0nU7MbdB+}!T6h!<&* zV-Lq6JfF}JiTff*1BFa=I79!UYYpVDOC5!rh!b}hWS7I4SO?s>NOPcLtt*83`dW_+ zs+i zaV5sM?M~mqVU+0$;5{jhQoCgOf>_w4iQ`@12WXAv*0pp~SD!z&2K(Y;m)%V6x)UwB z5NK}owKvB*n6D+yg|G!_tZf~}F>#u?sea|cI#wVFlx=3PT`*E@Aa6mq4cP(1*n2vC zh+Kfptxnw6N=NvXdd`No8DF#mZ_1*p$hzo5-h_}Z{aQ4#C!(G^a@Fn?O)+G=P1Z`UYO!pml&%?Z zKG|VpYV;*4`x09U#{^sgrdyHYG1+2jg$LTYOev7wZ!SYE4m;$Ct7oe1UecaCXp1dIas`Yyw$OmKjx%fUTeTDD zShL27rOrJ|>DJRN6gr|y0MlETHT29)ZJ~~clbDiNFwZN-w%D@tVn-bM7xRfC?Dk5*lQ3ts&4HLdwvO%)(9SHKOjUFO ziuH7_g&L@s3|l&JFd=~n2~0>}LIM*Kn2-R2Oy$%+W3ZA*d_Ipa#Kz%6CO-6Um~Zz( z|Nc_)?*@FYK&eH!4dsg{0t({j$cLUN_?r0qHfE;jtwey}AFSyv7Mt?lMq1Ol}7V3UL0z~;3y z2V-sRZQ=Ml1RgYhd&>=L*}3H{{?_I&;tk0+IuosdRC&1(k9D-i>1r)W?V3E)_-owj zaAi9djfc4uz+jcGc@jk#MfZp`4xxG~*1TyET$k{b@PjK{>O2?_j< zmOwd;p)$-2oz)F}zD|{VBaVN{o@FoNHt<{ci-k`KrqC#C7k@1NOngmzQ@lZ1C z(pKq5(sR-g=@-&$g>yoY_%U%6bw2Cx+$p~Hu!q>G@^twN$~Tq0$~($cYK{7W`hj}A)~G$8J*&+y z<`~TCMBN?S9&WL;Li(2cqI^!iR=G{ts9dCK>K*D<_2=q`>PkJVGf{@A0NuCHms#pT z^{DzO?WFdeHbdW`Kdo08d(5Ajt8G;1O8Bj3>EFEx9;cAC+DFezWaH*=z>ci;SAJuEMTeYuiKhoaOuGE+4>-6vHuj>~Xs?lsbY`kFn(LjUy zX|$JN8pv14kI4x#o4t-5U{A57TqRe_MYtYr7dOD2;!62SzLt;hJ^U_yfIr2T3Y9{w z5D^{~ZWKjvgSbh2OL|{gtgKLWs86d?_33)p=r9hNubOjgk@owrJ3Pz=vWdLKzRxb^ zSMWQ8r-iA~bSW%%$On~Il{uQIZO}LAZyE0!i>(#bWA+d2pV%+kZ`i-HnL&ox1~NtD zGIBLx$$WA%@slr;uaR$)$H))KPsq#U4e~qE$bOl^A62)jFR3Th zN!lfvUu)Bz(EeWgN9}su)EDR>{cgQWKc)X(|Cmu~%rqvMCFboWb2_o6*~9K}* zVr~UDhZp&&!gS%N@Ec)=__Vk|+T`|?N{J$Qsy1DFOM72CsK2W3FrGFxn48S7)nP5R zS3qJ#?iy(h5y@0`I!k4Ckb9Ne!9UG!5H<;6u|r%8e9n6sm9l2@^P}6JV9O~zbF4rHnESe-(jC;UtrI%|ITup z%vEtdF3f$G>*qvaqws*RS=cHp7H<{r5OHyN5u@O13wMCKmRI@Be1*^;{785~m?M5q zdRIAXOg49zyUjuKJ#&gxYpu6-S^sSR+Ga?iFJE9+usnAqKZmarPKo!c9h#`?kmxGC zLtn4|rM_E#Mn9^b*8iZF8lNz3FlvoDqrq5ZG#VG1Va%oD*4NM*Fi=&*(DmU?Qpql2 zZ)bnao@6f;)(Afro)-U2yhyr6x&e}TL4H$yTYgV2R!Wtb$~;9<3}vO-rpDC=)J^JR z>K^qub)9yP_M|4+H8xXMM5i;;M&e{Wxu5(Md6FC_pJcCL8-S*r?Cb2W*x$0}F)xnt zC+Qo0#+5;I&jPmv56_mVb#Jo|Pw~haae#(QQ6re#cyFHCPAjBUDb&#F#VWQu0}H zJNpLrHaAt6Df~eAy>KlyIPi%N0G0jn8}cj4rD|A@>n~d~>_4+_u-okQ_Sfw`N~0_B zP+b}N{}}%y|0Di6{wRN({~iAazD0OO*dX?aGo;T#5`U5yd5V0kY{<*yWAZu z<$CC*&B_zXQRU-mpBmF*I-TKvr9Y-Wr~g!6YiuNdx3q6{g<>){Y4B_yrLyN#n`3x)%JBZq1Wy&a^oOZlf`5ySx%Zr z6nOnMd4y~uUtwFgfb^bzsd>`;li6h5ZT(;CJiX>{5fjJSX%Z;`63WO`q@2tlm4qV- zu}C%fJgFlqNh1k>S}X8>7wIA!NDq0CY$1=5?c{r;pX?#~$n)e7d667}g&HJpkyGSf z$vLus?PR~s?qYw+9%FZNPx8O!tAu)NFA@{(6&@0P1*Cl-FyiInEOD#YFTNqZBTka8 zlQ`+~(%aGud5&z#%VeJ%lD{I~D}PHqE}P2dpdHsJ>y_7)e^H)Luh4q6A80?<{t4q) zs$Z^G=#BbU^au4P_2=~ubk1ls9yESnJZt=e@rv;}^v^}+$Ia>HC(WzP3iC!&GEKAE zTxu>iZ!-htpPOsVubSQF{brx}sQG>KS@T8nHFK$TvvrI0B`at(TT$yy>mKVqtH*i> zhv`*t^@?@e`hP&j7oeNJX#4Foc8eXi@3!y7Jn6-#J_=3yeR~h=)j@l} zJ_>tP#FWwXD)g-kDQ_a*ANZX|EN_(YerIXTW z*xt{|*Fh%)UJq$*l)owW$&bj}iqmc8P@=55%Gx7&A zqfCYVxEwn2(+c&oh^r|VC^gD5r2&4=Y9$QsBBpdI_bA=U{Yo$9^H$|?WvB9eWw-M8 z%6{b_{Ek3=w-(3#u>vfBj#4)6*uo z`nr@DBto`AS68y@;knF$&$18RN+bM~^L#BNc}g(E9`U$XDXoY9Gz*^7KKM+H@Rr_% z2e?4JUwuk_7e3(K+E271y;^@rKcw$8N=yxS*>3*AoMic}zqXk2Np9@%LE3iJB!(bh zQOuUGXVi0;_l#Dom1w2fOl_7{uFcjev`UR=hE}CjYc*P}R;M*+tF@5Uq(!u-7S}qp zZf&F118nzcTePk4Vs~l%&{li3ecFC)Ks&4*(T-`yp}kIMr?oTMIqkg0=*4=8UZ&5~ zXX)koY|Mm8U4c(s1)gj4TD=Z4V>P^!COx7@q077UZhfQPqxb54`WAh=zEj_&_ru2S z)%T%?1Nve8h<;2zt`EYOIjx`3&*|rN#wa$X8D+3!vy5_MwozdShGG~-l~HZfz#eae z?(8-Cj4j4iW1F$d=r?v7dyRd@e&c{~*f?SwGmaaB#tGQHGsZdNyup~o@QzB&ndU6B z+?tYs^}+&TKGOn<29aqa8KlW+!InMzhE4#SGno@!x6gGW+3C>^1k9 z`+c>lkMHAP{#NGya@)9vZmV zo@STXGwoS+xjoyiumxMO4ZF&&hVM{oud*BM)pp2kvLkjB811sV?TvO1G=pnH>n2e% z#vJDcxf9$;c++RNbKH53;fwhS_|*z;@KyY3KEyZi-TX%Q*!|E0f}jXh!V&QpusbN8 zhjlHJXUVf+UmN6AKye(iybm+GAG3NuK7y4%u~MSU!W^zts)6s-N*r3W8*_CxRyzaA z5#_jYMk!UNsk1R31+`WUsZHv7wHvl;JM89u^@w_0JpnYA0mqe^0Q@$%c^zyd`=BM?Bxe!DyBdokK4%~KfP5~~#BTj`ExqdSsOjNmqm-Ck?IbpT^_ z!X2YBcXTQ+Ds()eb|*%n+umyLw)a9OAF+?wgZ4Q(e^*bU?l3bAwy=T_B0z^UK#N34 zH>_SStX@AX-2klINm#ivq?Db_R!PRlAxJE9-t>^ln*>`cfxxL(e?ihC(<6go~G50 z#42%>7!~8H8~|!gil@aAsa%?kEvc%cYOEte(1Kl3AJ*2}r0rNy9-!;v z=p^crFcEkXJJI(e=r_ZbvIKoz%|_S~u8dpHZ{@dx$KCus{(#HnasC82Jp(OUER+gm z;FsdHR)`Dhv2y4a_6i4}d(Xi7SBOM3#E=*fJH>6{PH{I7eFB`#1ZR~}gVZQBNxjk* z@H2qb{-9JMPXp4c;oWu0TVTI-0^@t-{qiB$u4D2bEZ1qQ$r+%18mv~iQURN#AU;r| z)G4cg`z9r-Yysx?D~FWBuuFr=Nm!+G3Im%oO`QpgRDm6~6txQL|2lP*x*GE!s&=Yf z>PD>n_NvF!L9G2wL$fo`>eDbA%AwJTra+Icf)+mveR&SLvIM$vCiG;5L7*k8pdstv z{jWBfj41SEA2j44XvO13v8w^Afbs@&Jv3Y|^cmG=XP~`G;D0JWcEr_8JE4j80nMkN zb;?~W(+I5+wYS*Yf#6g28T&lNZ`UNcd|--6DG)r1%!V&VFLPnL{OtpaPC z34=gI88B;z)ncvKAU3+lh>PpRZrJHQ_=(%aUBJjbXucCbZyBTMC2++EUs>5y~+ zQ4ordD#Sse(1P2b1rNigVc^FI@L3v_5ImMRA|n0DKKSS-F#5AG<~11SZj5msVmLe1 zT^Q*BjP)sZoJ%pzWf*6H#$pC1xiJxjbU^|o=y5N1gqsPUVjD1Dfv876aIJvj{bI3H zgUHNbsSG-~AE;E|A01N&^y(pX8W7V9J5I2=J)} + +typedef boost::asio::ip::tcp::socket::native_handle_type uv_os_sock_t; +static const int UV_READABLE = 1; +static const int UV_WRITABLE = 2; + +namespace uS { + +struct Loop : boost::asio::io_service { + + static Loop *createLoop(bool defaultLoop = true) { + return new Loop; + } + + void destroy() { + delete this; + } + + void run() { + boost::asio::io_service::run(); + } + + void poll() { + boost::asio::io_service::poll(); + } +}; + +struct Timer { + boost::asio::deadline_timer asio_timer; + void *data; + + Timer(Loop *loop) : asio_timer(*loop) { + + } + + void start(void (*cb)(Timer *), int first, int repeat) { + asio_timer.expires_from_now(boost::posix_time::milliseconds(first)); + asio_timer.async_wait([this, cb, repeat](const boost::system::error_code &ec) { + if (ec != boost::asio::error::operation_aborted) { + if (repeat) { + start(cb, repeat, repeat); + } + cb(this); + } + }); + } + + void setData(void *data) { + this->data = data; + } + + void *getData() { + return data; + } + + // bug: cancel does not cancel expired timers! + // it has to guarantee that the timer is not called after + // stop is called! ffs boost! + void stop() { + asio_timer.cancel(); + } + + void close() { + asio_timer.get_io_service().post([this]() { + delete this; + }); + } +}; + +struct Async { + Loop *loop; + void (*cb)(Async *); + void *data; + + boost::asio::io_service::work asio_work; + + Async(Loop *loop) : loop(loop), asio_work(*loop) { + } + + void start(void (*cb)(Async *)) { + this->cb = cb; + } + + void send() { + loop->post([this]() { + cb(this); + }); + } + + void close() { + loop->post([this]() { + delete this; + }); + } + + void setData(void *data) { + this->data = data; + } + + void *getData() { + return data; + } +}; + +struct Poll { + boost::asio::posix::stream_descriptor *socket; + void (*cb)(Poll *p, int status, int events); + + Poll(Loop *loop, uv_os_sock_t fd) { + socket = new boost::asio::posix::stream_descriptor(*loop, fd); + socket->non_blocking(true); + } + + bool isClosed() { + return !socket; + } + + boost::asio::ip::tcp::socket::native_handle_type getFd() { + return socket ? socket->native_handle() : -1; + } + + void setCb(void (*cb)(Poll *p, int status, int events)) { + this->cb = cb; + } + + void (*getCb())(Poll *, int, int) { + return cb; + } + + void reInit(Loop *loop, uv_os_sock_t fd) { + delete socket; + socket = new boost::asio::posix::stream_descriptor(*loop, fd); + socket->non_blocking(true); + } + + void start(Loop *, Poll *self, int events) { + if (events & UV_READABLE) { + socket->async_read_some(boost::asio::null_buffers(), [self](boost::system::error_code ec, std::size_t) { + if (ec != boost::asio::error::operation_aborted) { + self->start(nullptr, self, UV_READABLE); + self->cb(self, ec ? -1 : 0, UV_READABLE); + } + }); + } + + if (events & UV_WRITABLE) { + socket->async_write_some(boost::asio::null_buffers(), [self](boost::system::error_code ec, std::size_t) { + if (ec != boost::asio::error::operation_aborted) { + self->start(nullptr, self, UV_WRITABLE); + self->cb(self, ec ? -1 : 0, UV_WRITABLE); + } + }); + } + } + + void change(Loop *, Poll *self, int events) { + socket->cancel(); + start(nullptr, self, events); + } + + bool fastTransfer(Loop *loop, Loop *newLoop, int events) { + return false; + } + + // todo: asio is thread safe, use it! + bool threadSafeChange(Loop *loop, Poll *self, int events) { + return false; + } + + void stop(Loop *) { + socket->cancel(); + } + + // this is not correct, but it works for now + // think about transfer - should allow one to not delete + // but in this case it doesn't matter at all + void close(Loop *loop, void (*cb)(Poll *)) { + socket->release(); + socket->get_io_service().post([cb, this]() { + cb(this); + }); + delete socket; + socket = nullptr; + } +}; + +} + +#endif // ASIO_H diff --git a/extern/uWebSocket/include/Backend.h b/extern/uWebSocket/include/Backend.h new file mode 100644 index 0000000000..fbcdffbea4 --- /dev/null +++ b/extern/uWebSocket/include/Backend.h @@ -0,0 +1,17 @@ +#ifndef BACKEND_H +#define BACKEND_H + +// Default to Epoll if nothing specified and on Linux +// Default to Libuv if nothing specified and not on Linux +#ifdef USE_ASIO +#include "Asio.h" +#elif !defined(__linux__) || defined(USE_LIBUV) +#include "Libuv.h" +#else +#ifndef USE_EPOLL +#define USE_EPOLL +#endif +#include "Epoll.h" +#endif + +#endif // BACKEND_H diff --git a/extern/uWebSocket/include/Epoll.h b/extern/uWebSocket/include/Epoll.h new file mode 100644 index 0000000000..2d69a121ef --- /dev/null +++ b/extern/uWebSocket/include/Epoll.h @@ -0,0 +1,265 @@ +#ifndef EPOLL_H +#define EPOLL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +typedef int uv_os_sock_t; +static const int UV_READABLE = EPOLLIN; +static const int UV_WRITABLE = EPOLLOUT; + +namespace uS { + +struct Poll; +struct Timer; + +extern std::recursive_mutex cbMutex; +extern void (*callbacks[16])(Poll *, int, int); +extern int cbHead; + +struct Timepoint { + void (*cb)(Timer *); + Timer *timer; + std::chrono::system_clock::time_point timepoint; + int nextDelay; +}; + +struct Loop { + int epfd; + int numPolls = 0; + bool cancelledLastTimer; + int delay = -1; // delay to next timer expiry, or -1 if no timers pending + epoll_event readyEvents[1024]; + std::chrono::system_clock::time_point timepoint; + std::vector timers; + std::vector> closing; + + void (*preCb)(void *) = nullptr; + void (*postCb)(void *) = nullptr; + void *preCbData, *postCbData; + + Loop(bool defaultLoop) { + epfd = epoll_create1(EPOLL_CLOEXEC); + timepoint = std::chrono::system_clock::now(); + } + + static Loop *createLoop(bool defaultLoop = true) { + return new Loop(defaultLoop); + } + + void destroy() { + ::close(epfd); + delete this; + } + + void doEpoll(int epollTimeout); + + void run(); + + void poll(); + + int getEpollFd() { + return epfd; + } +}; + +struct Timer { + Loop *loop; + void *data; + + Timer(Loop *loop) { + this->loop = loop; + } + + void start(void (*cb)(Timer *), int timeout, int repeat) { + loop->timepoint = std::chrono::system_clock::now(); + std::chrono::system_clock::time_point timepoint = loop->timepoint + std::chrono::milliseconds(timeout); + + Timepoint t = {cb, this, timepoint, repeat}; + loop->timers.insert( + std::upper_bound(loop->timers.begin(), loop->timers.end(), t, [](const Timepoint &a, const Timepoint &b) { + return a.timepoint < b.timepoint; + }), + t + ); + + loop->delay = -1; + if (loop->timers.size()) { + loop->delay = std::max(std::chrono::duration_cast(loop->timers[0].timepoint - loop->timepoint).count(), 0); + } + } + + void setData(void *data) { + this->data = data; + } + + void *getData() { + return data; + } + + // always called before destructor + void stop() { + auto pos = loop->timers.begin(); + for (Timepoint &t : loop->timers) { + if (t.timer == this) { + loop->timers.erase(pos); + break; + } + pos++; + } + loop->cancelledLastTimer = true; + + loop->delay = -1; + if (loop->timers.size()) { + loop->delay = std::max(std::chrono::duration_cast(loop->timers[0].timepoint - loop->timepoint).count(), 0); + } + } + + void close() { + delete this; + } +}; + +// 4 bytes +struct Poll { +protected: + struct { + int fd : 28; + unsigned int cbIndex : 4; + } state = {-1, 0}; + + Poll(Loop *loop, uv_os_sock_t fd) { + fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK); + state.fd = fd; + loop->numPolls++; + } + + // todo: pre-set all of callbacks up front and remove mutex + void setCb(void (*cb)(Poll *p, int status, int events)) { + cbMutex.lock(); + state.cbIndex = cbHead; + for (int i = 0; i < cbHead; i++) { + if (callbacks[i] == cb) { + state.cbIndex = i; + break; + } + } + if (state.cbIndex == cbHead) { + callbacks[cbHead++] = cb; + } + cbMutex.unlock(); + } + + void (*getCb())(Poll *, int, int) { + return callbacks[state.cbIndex]; + } + + void reInit(Loop *loop, uv_os_sock_t fd) { + state.fd = fd; + loop->numPolls++; + } + + void start(Loop *loop, Poll *self, int events) { + epoll_event event; + event.events = events; + event.data.ptr = self; + epoll_ctl(loop->epfd, EPOLL_CTL_ADD, state.fd, &event); + } + + void change(Loop *loop, Poll *self, int events) { + epoll_event event; + event.events = events; + event.data.ptr = self; + epoll_ctl(loop->epfd, EPOLL_CTL_MOD, state.fd, &event); + } + + void stop(Loop *loop) { + epoll_event event; + epoll_ctl(loop->epfd, EPOLL_CTL_DEL, state.fd, &event); + } + + bool fastTransfer(Loop *loop, Loop *newLoop, int events) { + stop(loop); + start(newLoop, this, events); + loop->numPolls--; + // needs to lock the newLoop's numPolls! + newLoop->numPolls++; + return true; + } + + bool threadSafeChange(Loop *loop, Poll *self, int events) { + change(loop, self, events); + return true; + } + + void close(Loop *loop, void (*cb)(Poll *)) { + state.fd = -1; + loop->closing.push_back({this, cb}); + } + +public: + bool isClosed() { + return state.fd == -1; + } + + uv_os_sock_t getFd() { + return state.fd; + } + + friend struct Loop; +}; + +// this should be put in the Loop as a general "post" function always available +struct Async : Poll { + void (*cb)(Async *); + Loop *loop; + void *data; + + Async(Loop *loop) : Poll(loop, ::eventfd(0, EFD_CLOEXEC)) { + this->loop = loop; + } + + void start(void (*cb)(Async *)) { + this->cb = cb; + Poll::setCb([](Poll *p, int, int) { + uint64_t val; + if (::read(((Async *) p)->state.fd, &val, 8) == 8) { + ((Async *) p)->cb((Async *) p); + } + }); + Poll::start(loop, this, UV_READABLE); + } + + void send() { + uint64_t one = 1; + if (::write(state.fd, &one, 8) != 8) { + return; + } + } + + void close() { + Poll::stop(loop); + ::close(state.fd); + Poll::close(loop, [](Poll *p) { + delete (Async *) p; + }); + } + + void setData(void *data) { + this->data = data; + } + + void *getData() { + return data; + } +}; + +} + +#endif // EPOLL_H diff --git a/extern/uWebSocket/include/Extensions.h b/extern/uWebSocket/include/Extensions.h new file mode 100644 index 0000000000..3f95325194 --- /dev/null +++ b/extern/uWebSocket/include/Extensions.h @@ -0,0 +1,29 @@ +#ifndef EXTENSIONS_UWS_H +#define EXTENSIONS_UWS_H + +#include + +namespace uWS { + +enum Options : unsigned int { + NO_OPTIONS = 0, + PERMESSAGE_DEFLATE = 1, + SERVER_NO_CONTEXT_TAKEOVER = 2, + CLIENT_NO_CONTEXT_TAKEOVER = 4, + NO_DELAY = 8 +}; + +template +class ExtensionsNegotiator { +protected: + int options; +public: + ExtensionsNegotiator(int wantedOptions); + std::string generateOffer(); + void readOffer(std::string offer); + int getNegotiatedOptions(); +}; + +} + +#endif // EXTENSIONS_UWS_H diff --git a/extern/uWebSocket/include/Group.h b/extern/uWebSocket/include/Group.h new file mode 100644 index 0000000000..8159182ecd --- /dev/null +++ b/extern/uWebSocket/include/Group.h @@ -0,0 +1,144 @@ +#ifndef GROUP_UWS_H +#define GROUP_UWS_H + +#include "WebSocket.h" +#include "HTTPSocket.h" +#include "Extensions.h" +#include +#include + +namespace uWS { + +enum ListenOptions { + TRANSFERS +}; + +struct Hub; + +template +struct WIN32_EXPORT Group : protected uS::NodeData { +protected: + friend struct Hub; + friend struct WebSocket; + friend struct HttpSocket; + friend struct HttpSocket; + + std::function *, HttpRequest)> connectionHandler; + std::function *)> transferHandler; + std::function *, char *message, size_t length, OpCode opCode)> messageHandler; + std::function *, int code, char *message, size_t length)> disconnectionHandler; + std::function *, char *, size_t)> pingHandler; + std::function *, char *, size_t)> pongHandler; + std::function *)> httpConnectionHandler; + std::function httpRequestHandler; + std::function httpDataHandler; + std::function httpCancelledRequestHandler; + std::function *)> httpDisconnectionHandler; + std::function *, HttpRequest)> httpUpgradeHandler; + + using errorType = typename std::conditional::type; + std::function errorHandler; + + unsigned int maxPayload; + Hub *hub; + int extensionOptions; + uS::Timer *timer = nullptr, *httpTimer = nullptr; + std::string userPingMessage; + std::stack iterators; + + // todo: cannot be named user, collides with parent! + void *userData = nullptr; + static void timerCallback(uS::Timer *timer); + + WebSocket *webSocketHead = nullptr; + HttpSocket *httpSocketHead = nullptr; + + void addWebSocket(WebSocket *webSocket); + void removeWebSocket(WebSocket *webSocket); + + // todo: remove these, template + void addHttpSocket(HttpSocket *httpSocket); + void removeHttpSocket(HttpSocket *httpSocket); + + Group(int extensionOptions, unsigned int maxPayload, Hub *hub, uS::NodeData *nodeData); + void stopListening(); + +public: + void onConnection(std::function *, HttpRequest)> handler); + void onTransfer(std::function *)> handler); + void onMessage(std::function *, char *, size_t, OpCode)> handler); + void onDisconnection(std::function *, int code, char *message, size_t length)> handler); + void onPing(std::function *, char *, size_t)> handler); + void onPong(std::function *, char *, size_t)> handler); + void onError(std::function handler); + void onHttpConnection(std::function *)> handler); + void onHttpRequest(std::function handler); + void onHttpData(std::function handler); + void onHttpDisconnection(std::function *)> handler); + void onCancelledHttpRequest(std::function handler); + void onHttpUpgrade(std::function *, HttpRequest)> handler); + + // Thread safe + void broadcast(const char *message, size_t length, OpCode opCode); + void setUserData(void *user); + void *getUserData(); + + // Not thread safe + void terminate(); + void close(int code = 1000, char *message = nullptr, size_t length = 0); + void startAutoPing(int intervalMs, std::string userMessage = ""); + + // same as listen(TRANSFERS), backwards compatible API for now + void addAsync() { + if (!async) { + NodeData::addAsync(); + } + } + + void listen(ListenOptions listenOptions) { + if (listenOptions == TRANSFERS && !async) { + addAsync(); + } + } + + template + void forEach(const F &cb) { + uS::Poll *iterator = webSocketHead; + iterators.push(iterator); + while (iterator) { + uS::Poll *lastIterator = iterator; + cb((WebSocket *) iterator); + iterator = iterators.top(); + if (lastIterator == iterator) { + iterator = ((uS::Socket *) iterator)->next; + iterators.top() = iterator; + } + } + iterators.pop(); + } + + // duplicated code for now! + template + void forEachHttpSocket(const F &cb) { + uS::Poll *iterator = httpSocketHead; + iterators.push(iterator); + while (iterator) { + uS::Poll *lastIterator = iterator; + cb((HttpSocket *) iterator); + iterator = iterators.top(); + if (lastIterator == iterator) { + iterator = ((uS::Socket *) iterator)->next; + iterators.top() = iterator; + } + } + iterators.pop(); + } + + static Group *from(uS::Socket *s) { + return static_cast *>(s->getNodeData()); + } +}; + +} + +#endif // GROUP_UWS_H diff --git a/extern/uWebSocket/include/HTTPSocket.h b/extern/uWebSocket/include/HTTPSocket.h new file mode 100644 index 0000000000..ac1de60a3a --- /dev/null +++ b/extern/uWebSocket/include/HTTPSocket.h @@ -0,0 +1,285 @@ +#ifndef HTTPSOCKET_UWS_H +#define HTTPSOCKET_UWS_H + +#include "Socket.h" +#include +// #include + +namespace uWS { + +struct Header { + char *key, *value; + unsigned int keyLength, valueLength; + + operator bool() { + return key; + } + + // slow without string_view! + std::string toString() { + return std::string(value, valueLength); + } +}; + +enum HttpMethod { + METHOD_GET, + METHOD_POST, + METHOD_PUT, + METHOD_DELETE, + METHOD_PATCH, + METHOD_OPTIONS, + METHOD_HEAD, + METHOD_TRACE, + METHOD_CONNECT, + METHOD_INVALID +}; + +struct HttpRequest { + Header *headers; + Header getHeader(const char *key) { + return getHeader(key, strlen(key)); + } + + HttpRequest(Header *headers = nullptr) : headers(headers) {} + + Header getHeader(const char *key, size_t length) { + if (headers) { + for (Header *h = headers; *++h; ) { + if (h->keyLength == length && !strncmp(h->key, key, length)) { + return *h; + } + } + } + return {nullptr, nullptr, 0, 0}; + } + + Header getUrl() { + if (headers->key) { + return *headers; + } + return {nullptr, nullptr, 0, 0}; + } + + HttpMethod getMethod() { + if (!headers->key) { + return METHOD_INVALID; + } + switch (headers->keyLength) { + case 3: + if (!strncmp(headers->key, "get", 3)) { + return METHOD_GET; + } else if (!strncmp(headers->key, "put", 3)) { + return METHOD_PUT; + } + break; + case 4: + if (!strncmp(headers->key, "post", 4)) { + return METHOD_POST; + } else if (!strncmp(headers->key, "head", 4)) { + return METHOD_HEAD; + } + break; + case 5: + if (!strncmp(headers->key, "patch", 5)) { + return METHOD_PATCH; + } else if (!strncmp(headers->key, "trace", 5)) { + return METHOD_TRACE; + } + break; + case 6: + if (!strncmp(headers->key, "delete", 6)) { + return METHOD_DELETE; + } + break; + case 7: + if (!strncmp(headers->key, "options", 7)) { + return METHOD_OPTIONS; + } else if (!strncmp(headers->key, "connect", 7)) { + return METHOD_CONNECT; + } + break; + } + return METHOD_INVALID; + } +}; + +struct HttpResponse; + +template +struct WIN32_EXPORT HttpSocket : uS::Socket { + void *httpUser; // remove this later, setTimeout occupies user for now + HttpResponse *outstandingResponsesHead = nullptr; + HttpResponse *outstandingResponsesTail = nullptr; + HttpResponse *preAllocatedResponse = nullptr; + + std::string httpBuffer; + size_t contentLength = 0; + bool missedDeadline = false; + + HttpSocket(uS::Socket *socket) : uS::Socket(std::move(*socket)) {} + + void terminate() { + onEnd(this); + } + + void upgrade(const char *secKey, const char *extensions, + size_t extensionsLength, const char *subprotocol, + size_t subprotocolLength, bool *perMessageDeflate); + +protected: + friend struct uS::Socket; + friend struct HttpResponse; + friend struct Hub; + static uS::Socket *onData(uS::Socket *s, char *data, size_t length); + static void onEnd(uS::Socket *s); +}; + +struct HttpResponse { + HttpSocket *httpSocket; + HttpResponse *next = nullptr; + void *userData = nullptr; + void *extraUserData = nullptr; + HttpSocket::Queue::Message *messageQueue = nullptr; + bool hasEnded = false; + bool hasHead = false; + + HttpResponse(HttpSocket *httpSocket) : httpSocket(httpSocket) { + + } + + template + static HttpResponse *allocateResponse(HttpSocket *httpSocket) { + if (httpSocket->preAllocatedResponse) { + HttpResponse *ret = httpSocket->preAllocatedResponse; + httpSocket->preAllocatedResponse = nullptr; + return ret; + } else { + return new HttpResponse((HttpSocket *) httpSocket); + } + } + + //template + void freeResponse(HttpSocket *httpData) { + if (httpData->preAllocatedResponse) { + delete this; + } else { + httpData->preAllocatedResponse = this; + } + } + + void write(const char *message, size_t length = 0, + void(*callback)(void *httpSocket, void *data, bool cancelled, void *reserved) = nullptr, + void *callbackData = nullptr) { + + struct NoopTransformer { + static size_t estimate(const char *data, size_t length) { + return length; + } + + static size_t transform(const char *src, char *dst, size_t length, int transformData) { + memcpy(dst, src, length); + return length; + } + }; + + httpSocket->sendTransformed(message, length, callback, callbackData, 0); + hasHead = true; + } + + // todo: maybe this function should have a fast path for 0 length? + void end(const char *message = nullptr, size_t length = 0, + void(*callback)(void *httpResponse, void *data, bool cancelled, void *reserved) = nullptr, + void *callbackData = nullptr) { + + struct TransformData { + bool hasHead; + } transformData = {hasHead}; + + struct HttpTransformer { + + // todo: this should get TransformData! + static size_t estimate(const char *data, size_t length) { + return length + 128; + } + + static size_t transform(const char *src, char *dst, size_t length, TransformData transformData) { + // todo: sprintf is extremely slow + int offset = transformData.hasHead ? 0 : std::sprintf(dst, "HTTP/1.1 200 OK\r\nContent-Length: %u\r\n\r\n", (unsigned int) length); + memcpy(dst + offset, src, length); + return length + offset; + } + }; + + if (httpSocket->outstandingResponsesHead != this) { + HttpSocket::Queue::Message *messagePtr = httpSocket->allocMessage(HttpTransformer::estimate(message, length)); + messagePtr->length = HttpTransformer::transform(message, (char *) messagePtr->data, length, transformData); + messagePtr->callback = callback; + messagePtr->callbackData = callbackData; + messagePtr->nextMessage = messageQueue; + messageQueue = messagePtr; + hasEnded = true; + } else { + httpSocket->sendTransformed(message, length, callback, callbackData, transformData); + // move head as far as possible + HttpResponse *head = next; + while (head) { + // empty message queue + HttpSocket::Queue::Message *messagePtr = head->messageQueue; + while (messagePtr) { + HttpSocket::Queue::Message *nextMessage = messagePtr->nextMessage; + + bool wasTransferred; + if (httpSocket->write(messagePtr, wasTransferred)) { + if (!wasTransferred) { + httpSocket->freeMessage(messagePtr); + if (callback) { + callback(this, callbackData, false, nullptr); + } + } else { + messagePtr->callback = callback; + messagePtr->callbackData = callbackData; + } + } else { + httpSocket->freeMessage(messagePtr); + if (callback) { + callback(this, callbackData, true, nullptr); + } + goto updateHead; + } + messagePtr = nextMessage; + } + // cannot go beyond unfinished responses + if (!head->hasEnded) { + break; + } else { + HttpResponse *next = head->next; + head->freeResponse(httpSocket); + head = next; + } + } + updateHead: + httpSocket->outstandingResponsesHead = head; + if (!head) { + httpSocket->outstandingResponsesTail = nullptr; + } + + freeResponse(httpSocket); + } + } + + void setUserData(void *userData) { + this->userData = userData; + } + + void *getUserData() { + return userData; + } + + HttpSocket *getHttpSocket() { + return httpSocket; + } +}; + +} + +#endif // HTTPSOCKET_UWS_H diff --git a/extern/uWebSocket/include/Hub.h b/extern/uWebSocket/include/Hub.h new file mode 100644 index 0000000000..4b56313706 --- /dev/null +++ b/extern/uWebSocket/include/Hub.h @@ -0,0 +1,99 @@ +#ifndef HUB_UWS_H +#define HUB_UWS_H + +#include "Group.h" +#include "Node.h" +#include +#include +#include +#include + +namespace uWS { + +struct WIN32_EXPORT Hub : protected uS::Node, public Group, public Group { +protected: + struct ConnectionData { + std::string path; + void *user; + Group *group; + }; + + z_stream inflationStream = {}; + char *inflationBuffer; + char *inflate(char *data, size_t &length, size_t maxPayload); + std::string dynamicInflationBuffer; + static const int LARGE_BUFFER_SIZE = 300 * 1024; + + static void onServerAccept(uS::Socket *s); + static void onClientConnection(uS::Socket *s, bool error); + +public: + template + Group *createGroup(int extensionOptions = 0, unsigned int maxPayload = 16777216) { + return new Group(extensionOptions, maxPayload, this, nodeData); + } + + template + Group &getDefaultGroup() { + return static_cast &>(*this); + } + + bool listen(int port, uS::TLS::Context sslContext = nullptr, int options = 0, Group *eh = nullptr); + bool listen(const char *host, int port, uS::TLS::Context sslContext = nullptr, int options = 0, Group *eh = nullptr); + void connect(std::string uri, void *user = nullptr, std::map extraHeaders = {}, int timeoutMs = 5000, Group *eh = nullptr); + void upgrade(uv_os_sock_t fd, const char *secKey, SSL *ssl, const char *extensions, size_t extensionsLength, const char *subprotocol, size_t subprotocolLength, Group *serverGroup = nullptr); + + Hub(int extensionOptions = 0, bool useDefaultLoop = false, unsigned int maxPayload = 16777216) : uS::Node(LARGE_BUFFER_SIZE, WebSocketProtocol>::CONSUME_PRE_PADDING, WebSocketProtocol>::CONSUME_POST_PADDING, useDefaultLoop), + Group(extensionOptions, maxPayload, this, nodeData), Group(0, maxPayload, this, nodeData) { + inflateInit2(&inflationStream, -15); + inflationBuffer = new char[LARGE_BUFFER_SIZE]; + +#ifdef UWS_THREADSAFE + getLoop()->preCbData = nodeData; + getLoop()->preCb = [](void *nodeData) { + static_cast(nodeData)->asyncMutex->lock(); + }; + + getLoop()->postCbData = nodeData; + getLoop()->postCb = [](void *nodeData) { + static_cast(nodeData)->asyncMutex->unlock(); + }; +#endif + } + + ~Hub() { + inflateEnd(&inflationStream); + delete [] inflationBuffer; + } + + using uS::Node::run; + using uS::Node::poll; + using uS::Node::getLoop; + using Group::onConnection; + using Group::onConnection; + using Group::onTransfer; + using Group::onTransfer; + using Group::onMessage; + using Group::onMessage; + using Group::onDisconnection; + using Group::onDisconnection; + using Group::onPing; + using Group::onPing; + using Group::onPong; + using Group::onPong; + using Group::onError; + using Group::onError; + using Group::onHttpRequest; + using Group::onHttpData; + using Group::onHttpConnection; + using Group::onHttpDisconnection; + using Group::onHttpUpgrade; + using Group::onCancelledHttpRequest; + + friend struct WebSocket; + friend struct WebSocket; +}; + +} + +#endif // HUB_UWS_H diff --git a/extern/uWebSocket/include/Libuv.h b/extern/uWebSocket/include/Libuv.h new file mode 100644 index 0000000000..017e25b9c9 --- /dev/null +++ b/extern/uWebSocket/include/Libuv.h @@ -0,0 +1,183 @@ +#ifndef LIBUV_H +#define LIBUV_H + +#include +static_assert (UV_VERSION_MINOR >= 3, "µWebSockets requires libuv >=1.3.0"); + +namespace uS { + +struct Loop : uv_loop_t { + static Loop *createLoop(bool defaultLoop = true) { + if (defaultLoop) { + return (Loop *) uv_default_loop(); + } else { + return (Loop *) uv_loop_new(); + } + } + + void destroy() { + if (this != uv_default_loop()) { + uv_loop_delete(this); + } + } + + void run() { + uv_run(this, UV_RUN_DEFAULT); + } + + void poll() { + uv_run(this, UV_RUN_NOWAIT); + } +}; + +struct Async { + uv_async_t uv_async; + + Async(Loop *loop) { + uv_async.loop = loop; + } + + void start(void (*cb)(Async *)) { + uv_async_init(uv_async.loop, &uv_async, (uv_async_cb) cb); + } + + void send() { + uv_async_send(&uv_async); + } + + void close() { + uv_close((uv_handle_t *) &uv_async, [](uv_handle_t *a) { + delete (Async *) a; + }); + } + + void setData(void *data) { + uv_async.data = data; + } + + void *getData() { + return uv_async.data; + } +}; + +struct Timer { + uv_timer_t uv_timer; + + Timer(Loop *loop) { + uv_timer_init(loop, &uv_timer); + } + + void start(void (*cb)(Timer *), int first, int repeat) { + uv_timer_start(&uv_timer, (uv_timer_cb) cb, first, repeat); + } + + void setData(void *data) { + uv_timer.data = data; + } + + void *getData() { + return uv_timer.data; + } + + void stop() { + uv_timer_stop(&uv_timer); + } + + void close() { + uv_close((uv_handle_t *) &uv_timer, [](uv_handle_t *t) { + delete (Timer *) t; + }); + } + +private: + ~Timer() { + + } +}; + +struct Poll { + uv_poll_t *uv_poll; + void (*cb)(Poll *p, int status, int events); + + Poll(Loop *loop, uv_os_sock_t fd) { + uv_poll = new uv_poll_t; + uv_poll_init_socket(loop, uv_poll, fd); + } + + Poll(Poll &&other) { + uv_poll = other.uv_poll; + cb = other.cb; + other.uv_poll = nullptr; + } + + Poll(const Poll &other) = delete; + + ~Poll() { + delete uv_poll; + } + + bool isClosed() { + return uv_is_closing((uv_handle_t *) uv_poll); + } + + uv_os_sock_t getFd() { +#ifdef _WIN32 + uv_os_sock_t fd; + uv_fileno((uv_handle_t *) uv_poll, (uv_os_fd_t *) &fd); + return fd; +#else + return uv_poll->io_watcher.fd; +#endif + } + + void setCb(void (*cb)(Poll *p, int status, int events)) { + this->cb = cb; + } + + void (*getCb())(Poll *, int, int) { + return cb; + } + + void reInit(Loop *loop, uv_os_sock_t fd) { + delete uv_poll; + uv_poll = new uv_poll_t; + uv_poll_init_socket(loop, uv_poll, fd); + } + + void start(Loop *, Poll *self, int events) { + uv_poll->data = self; + uv_poll_start(uv_poll, events, [](uv_poll_t *p, int status, int events) { + Poll *self = (Poll *) p->data; + self->cb(self, status, events); + }); + } + + void change(Loop *, Poll *self, int events) { + start(nullptr, self, events); + } + + void stop(Loop *loop) { + uv_poll_stop(uv_poll); + } + + bool fastTransfer(Loop *loop, Loop *newLoop, int events) { + return false; + } + + bool threadSafeChange(Loop *, Poll *self, int events) { + return false; + } + + void close(Loop *loop, void (*cb)(Poll *)) { + this->cb = (void(*)(Poll *, int, int)) cb; + uv_close((uv_handle_t *) uv_poll, [](uv_handle_t *p) { + Poll *poll = (Poll *) p->data; + void (*cb)(Poll *) = (void(*)(Poll *)) poll->cb; + cb(poll); + }); + } +}; + +} + +#endif // LIBUV_H diff --git a/extern/uWebSocket/include/Networking.h b/extern/uWebSocket/include/Networking.h new file mode 100644 index 0000000000..e26888cc77 --- /dev/null +++ b/extern/uWebSocket/include/Networking.h @@ -0,0 +1,259 @@ +// the purpose of this header should be to provide SSL and networking wrapped in a common interface +// it should allow cross-platform networking and SSL and also easy usage of mTCP and similar tech + +#ifndef NETWORKING_UWS_H +#define NETWORKING_UWS_H + +#include +#if OPENSSL_VERSION_NUMBER < 0x10100000L +#define SSL_CTX_up_ref(x) x->references++ +#define SSL_up_ref(x) x->references++ +#endif + +#ifndef __linux +#define MSG_NOSIGNAL 0 +#else +#include +#endif + +#ifdef __APPLE__ +#include +#define htobe64(x) OSSwapHostToBigInt64(x) +#define be64toh(x) OSSwapBigToHostInt64(x) +#endif + +#ifdef _WIN32 +#define NOMINMAX +#include +#include +#pragma comment(lib, "ws2_32.lib") +#define SHUT_WR SD_SEND +#ifdef __MINGW32__ +// Windows has always been tied to LE +#define htobe64(x) __builtin_bswap64(x) +#define be64toh(x) __builtin_bswap64(x) +#else +#define __thread __declspec(thread) +#define htobe64(x) htonll(x) +#define be64toh(x) ntohll(x) +#define pthread_t DWORD +#define pthread_self GetCurrentThreadId +#endif +#define WIN32_EXPORT __declspec(dllexport) + +inline void close(SOCKET fd) {closesocket(fd);} +inline int setsockopt(SOCKET fd, int level, int optname, const void *optval, socklen_t optlen) { + return setsockopt(fd, level, optname, (const char *) optval, optlen); +} + +inline SOCKET dup(SOCKET socket) { + WSAPROTOCOL_INFOW pi; + if (WSADuplicateSocketW(socket, GetCurrentProcessId(), &pi) == SOCKET_ERROR) { + return INVALID_SOCKET; + } + return WSASocketW(pi.iAddressFamily, pi.iSocketType, pi.iProtocol, &pi, 0, WSA_FLAG_OVERLAPPED); +} +#else +#include +#include +#include +#include +#include +#include +#include +#define SOCKET_ERROR -1 +#define INVALID_SOCKET -1 +#define WIN32_EXPORT +#endif + +#include "Backend.h" +#include +#include +#include +#include +#include +#include +#include + +namespace uS { + +// todo: mark sockets nonblocking in these functions +// todo: probably merge this Context with the TLS::Context for same interface for SSL and non-SSL! +struct Context { + +#ifdef USE_MTCP + mtcp_context *mctx; +#endif + + Context() { + // mtcp_create_context +#ifdef USE_MTCP + mctx = mtcp_create_context(0); // cpu index? +#endif + } + + ~Context() { +#ifdef USE_MTCP + mtcp_destroy_context(mctx); +#endif + } + + // returns INVALID_SOCKET on error + uv_os_sock_t acceptSocket(uv_os_sock_t fd) { + uv_os_sock_t acceptedFd; +#if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) + // Linux, FreeBSD + acceptedFd = accept4(fd, nullptr, nullptr, SOCK_CLOEXEC | SOCK_NONBLOCK); +#else + // Windows, OS X + acceptedFd = accept(fd, nullptr, nullptr); +#endif + +#ifdef __APPLE__ + if (acceptedFd != INVALID_SOCKET) { + int noSigpipe = 1; + setsockopt(acceptedFd, SOL_SOCKET, SO_NOSIGPIPE, &noSigpipe, sizeof(int)); + } +#endif + return acceptedFd; + } + + // returns INVALID_SOCKET on error + uv_os_sock_t createSocket(int domain, int type, int protocol) { + int flags = 0; +#if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) + flags = SOCK_CLOEXEC | SOCK_NONBLOCK; +#endif + + uv_os_sock_t createdFd = socket(domain, type | flags, protocol); + +#ifdef __APPLE__ + if (createdFd != INVALID_SOCKET) { + int noSigpipe = 1; + setsockopt(createdFd, SOL_SOCKET, SO_NOSIGPIPE, &noSigpipe, sizeof(int)); + } +#endif + + return createdFd; + } + + void closeSocket(uv_os_sock_t fd) { +#ifdef _WIN32 + closesocket(fd); +#else + close(fd); +#endif + } + + bool wouldBlock() { +#ifdef _WIN32 + return WSAGetLastError() == WSAEWOULDBLOCK; +#else + return errno == EWOULDBLOCK;// || errno == EAGAIN; +#endif + } +}; + +namespace TLS { + +class WIN32_EXPORT Context { +protected: + SSL_CTX *context = nullptr; + std::shared_ptr password; + + static int passwordCallback(char *buf, int size, int rwflag, void *u) + { + std::string *password = (std::string *) u; + int length = std::min(size, (int) password->length()); + memcpy(buf, password->data(), length); + buf[length] = '\0'; + return length; + } + +public: + friend Context WIN32_EXPORT createContext(std::string certChainFileName, std::string keyFileName, std::string keyFilePassword); + Context(SSL_CTX *context) : context(context) { + + } + + Context() = default; + Context(const Context &other); + Context &operator=(const Context &other); + ~Context(); + operator bool() { + return context; + } + + SSL_CTX *getNativeContext() { + return context; + } +}; + +Context WIN32_EXPORT createContext(std::string certChainFileName, std::string keyFileName, std::string keyFilePassword = std::string()); + +} + +struct Socket; + +// NodeData is like a Context, maybe merge them? +struct WIN32_EXPORT NodeData { + char *recvBufferMemoryBlock; + char *recvBuffer; + int recvLength; + Loop *loop; + uS::Context *netContext; + void *user = nullptr; + static const int preAllocMaxSize = 1024; + char **preAlloc; + SSL_CTX *clientContext; + + Async *async = nullptr; + pthread_t tid; + + std::recursive_mutex *asyncMutex; + std::vector transferQueue; + std::vector changePollQueue; + static void asyncCallback(Async *async); + + static int getMemoryBlockIndex(size_t length) { + return (int) ((length >> 4) + bool(length & 15)); + } + + char *getSmallMemoryBlock(int index) { + if (preAlloc[index]) { + char *memory = preAlloc[index]; + preAlloc[index] = nullptr; + return memory; + } else { + return new char[index << 4]; + } + } + + void freeSmallMemoryBlock(char *memory, int index) { + if (!preAlloc[index]) { + preAlloc[index] = memory; + } else { + delete [] memory; + } + } + +public: + void addAsync() { + async = new Async(loop); + async->setData(this); + async->start(NodeData::asyncCallback); + } + + void clearPendingPollChanges(Poll *p) { + asyncMutex->lock(); + changePollQueue.erase( + std::remove(changePollQueue.begin(), changePollQueue.end(), p), + changePollQueue.end() + ); + asyncMutex->unlock(); + } +}; + +} + +#endif // NETWORKING_UWS_H diff --git a/extern/uWebSocket/include/Node.h b/extern/uWebSocket/include/Node.h new file mode 100644 index 0000000000..5c31cafa2e --- /dev/null +++ b/extern/uWebSocket/include/Node.h @@ -0,0 +1,202 @@ +#ifndef NODE_UWS_H +#define NODE_UWS_H + +#include "Socket.h" +#include +#include + +namespace uS { + +enum ListenOptions : int { + REUSE_PORT = 1, + ONLY_IPV4 = 2 +}; + +class WIN32_EXPORT Node { +protected: + template + static void connect_cb(Poll *p, int status, int events) { + C((Socket *) p, status < 0); + } + + template + static void accept_poll_cb(Poll *p, int status, int events) { + ListenSocket *listenData = (ListenSocket *) p; + accept_cb(listenData); + } + + template + static void accept_timer_cb(Timer *p) { + ListenSocket *listenData = (ListenSocket *) p->getData(); + accept_cb(listenData); + } + + template + static void accept_cb(ListenSocket *listenSocket) { + uv_os_sock_t serverFd = listenSocket->getFd(); + Context *netContext = listenSocket->nodeData->netContext; + uv_os_sock_t clientFd = netContext->acceptSocket(serverFd); + if (clientFd == INVALID_SOCKET) { + /* + * If accept is failing, the pending connection won't be removed and the + * polling will cause the server to spin, using 100% cpu. Switch to a timer + * event instead to avoid this. + */ + if (!TIMER && !netContext->wouldBlock()) { + listenSocket->stop(listenSocket->nodeData->loop); + + listenSocket->timer = new Timer(listenSocket->nodeData->loop); + listenSocket->timer->setData(listenSocket); + listenSocket->timer->start(accept_timer_cb, 1000, 1000); + } + return; + } else if (TIMER) { + listenSocket->timer->stop(); + listenSocket->timer->close(); + listenSocket->timer = nullptr; + + listenSocket->setCb(accept_poll_cb); + listenSocket->start(listenSocket->nodeData->loop, listenSocket, UV_READABLE); + } + do { + SSL *ssl = nullptr; + if (listenSocket->sslContext) { + ssl = SSL_new(listenSocket->sslContext.getNativeContext()); + SSL_set_accept_state(ssl); + } + + Socket *socket = new Socket(listenSocket->nodeData, listenSocket->nodeData->loop, clientFd, ssl); + socket->setPoll(UV_READABLE); + A(socket); + } while ((clientFd = netContext->acceptSocket(serverFd)) != INVALID_SOCKET); + } + + Loop *loop; + NodeData *nodeData; + std::recursive_mutex asyncMutex; + +public: + Node(int recvLength = 1024, int prePadding = 0, int postPadding = 0, bool useDefaultLoop = false); + ~Node(); + + /* Blocking */ + void run(); + + /* Non-blocking */ + void poll(); + + Loop *getLoop() { + return loop; + } + + template + Socket *connect(const char *hostname, int port, bool secure, NodeData *nodeData) { + Context *netContext = nodeData->netContext; + + addrinfo hints, *result; + memset(&hints, 0, sizeof(addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + if (getaddrinfo(hostname, std::to_string(port).c_str(), &hints, &result) != 0) { + return nullptr; + } + + uv_os_sock_t fd = netContext->createSocket(result->ai_family, result->ai_socktype, result->ai_protocol); + if (fd == INVALID_SOCKET) { + freeaddrinfo(result); + return nullptr; + } + + ::connect(fd, result->ai_addr, result->ai_addrlen); + freeaddrinfo(result); + + SSL *ssl = nullptr; + if (secure) { + ssl = SSL_new(nodeData->clientContext); + SSL_set_connect_state(ssl); + SSL_set_tlsext_host_name(ssl, hostname); + } + + Socket initialSocket(nodeData, getLoop(), fd, ssl); + uS::Socket *socket = I(&initialSocket); + + socket->setCb(connect_cb); + socket->start(loop, socket, socket->setPoll(UV_WRITABLE)); + return socket; + } + + // todo: hostname, backlog + template + bool listen(const char *host, int port, uS::TLS::Context sslContext, int options, uS::NodeData *nodeData, void *user) { + addrinfo hints, *result; + memset(&hints, 0, sizeof(addrinfo)); + + hints.ai_flags = AI_PASSIVE; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + Context *netContext = nodeData->netContext; + + if (getaddrinfo(host, std::to_string(port).c_str(), &hints, &result)) { + return true; + } + + uv_os_sock_t listenFd = SOCKET_ERROR; + addrinfo *listenAddr; + if ((options & uS::ONLY_IPV4) == 0) { + for (addrinfo *a = result; a && listenFd == SOCKET_ERROR; a = a->ai_next) { + if (a->ai_family == AF_INET6) { + listenFd = netContext->createSocket(a->ai_family, a->ai_socktype, a->ai_protocol); + listenAddr = a; + } + } + } + + for (addrinfo *a = result; a && listenFd == SOCKET_ERROR; a = a->ai_next) { + if (a->ai_family == AF_INET) { + listenFd = netContext->createSocket(a->ai_family, a->ai_socktype, a->ai_protocol); + listenAddr = a; + } + } + + if (listenFd == SOCKET_ERROR) { + freeaddrinfo(result); + return true; + } + +#ifdef __linux +#ifdef SO_REUSEPORT + if (options & REUSE_PORT) { + int optval = 1; + setsockopt(listenFd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)); + } +#endif +#endif + + int enabled = true; + setsockopt(listenFd, SOL_SOCKET, SO_REUSEADDR, &enabled, sizeof(enabled)); + + if (::bind(listenFd, listenAddr->ai_addr, listenAddr->ai_addrlen) || ::listen(listenFd, 512)) { + netContext->closeSocket(listenFd); + freeaddrinfo(result); + return true; + } + + ListenSocket *listenSocket = new ListenSocket(nodeData, loop, listenFd, nullptr); + listenSocket->sslContext = sslContext; + listenSocket->nodeData = nodeData; + + listenSocket->setCb(accept_poll_cb); + listenSocket->start(loop, listenSocket, UV_READABLE); + + // should be vector of listen data! one group can have many listeners! + nodeData->user = listenSocket; + + freeaddrinfo(result); + return false; + } +}; + +} + +#endif // NODE_UWS_H diff --git a/extern/uWebSocket/include/Socket.h b/extern/uWebSocket/include/Socket.h new file mode 100644 index 0000000000..673ee25d76 --- /dev/null +++ b/extern/uWebSocket/include/Socket.h @@ -0,0 +1,507 @@ +#ifndef SOCKET_UWS_H +#define SOCKET_UWS_H + +#include "Networking.h" + +namespace uS { + +struct TransferData { + // Connection state + uv_os_sock_t fd; + SSL *ssl; + + // Poll state + void (*pollCb)(Poll *, int, int); + int pollEvents; + + // User state + void *userData; + + // Destination + NodeData *destination; + void (*transferCb)(Poll *); +}; + +// perfectly 64 bytes (4 + 60) +struct WIN32_EXPORT Socket : Poll { +protected: + struct { + int poll : 4; + int shuttingDown : 4; + } state = {0, false}; + + SSL *ssl; + void *user = nullptr; + NodeData *nodeData; + + // this is not needed by HttpSocket! + struct Queue { + struct Message { + const char *data; + size_t length; + Message *nextMessage = nullptr; + void (*callback)(void *socket, void *data, bool cancelled, void *reserved) = nullptr; + void *callbackData = nullptr, *reserved = nullptr; + }; + + Message *head = nullptr, *tail = nullptr; + void pop() + { + Message *nextMessage; + if ((nextMessage = head->nextMessage)) { + delete [] (char *) head; + head = nextMessage; + } else { + delete [] (char *) head; + head = tail = nullptr; + } + } + + bool empty() {return head == nullptr;} + Message *front() {return head;} + + void push(Message *message) + { + message->nextMessage = nullptr; + if (tail) { + tail->nextMessage = message; + tail = message; + } else { + head = message; + tail = message; + } + } + } messageQueue; + + int getPoll() { + return state.poll; + } + + int setPoll(int poll) { + state.poll = poll; + return poll; + } + + void setShuttingDown(bool shuttingDown) { + state.shuttingDown = shuttingDown; + } + + void transfer(NodeData *nodeData, void (*cb)(Poll *)) { + // userData is invalid from now on till onTransfer + setUserData(new TransferData({getFd(), ssl, getCb(), getPoll(), getUserData(), nodeData, cb})); + stop(this->nodeData->loop); + close(this->nodeData->loop, [](Poll *p) { + Socket *s = (Socket *) p; + TransferData *transferData = (TransferData *) s->getUserData(); + + transferData->destination->asyncMutex->lock(); + bool wasEmpty = transferData->destination->transferQueue.empty(); + transferData->destination->transferQueue.push_back(s); + transferData->destination->asyncMutex->unlock(); + + if (wasEmpty) { + transferData->destination->async->send(); + } + }); + } + + void changePoll(Socket *socket) { + if (!threadSafeChange(nodeData->loop, this, socket->getPoll())) { + if (socket->nodeData->tid != pthread_self()) { + socket->nodeData->asyncMutex->lock(); + socket->nodeData->changePollQueue.push_back(socket); + socket->nodeData->asyncMutex->unlock(); + socket->nodeData->async->send(); + } else { + change(socket->nodeData->loop, socket, socket->getPoll()); + } + } + } + + // clears user data! + template + void startTimeout(int timeoutMs = 15000) { + Timer *timer = new Timer(nodeData->loop); + timer->setData(this); + timer->start([](Timer *timer) { + Socket *s = (Socket *) timer->getData(); + s->cancelTimeout(); + onTimeout(s); + }, timeoutMs, 0); + + user = timer; + } + + void cancelTimeout() { + Timer *timer = (Timer *) getUserData(); + if (timer) { + timer->stop(); + timer->close(); + user = nullptr; + } + } + + template + static void sslIoHandler(Poll *p, int status, int events) { + Socket *socket = (Socket *) p; + + if (status < 0) { + STATE::onEnd((Socket *) p); + return; + } + + if (!socket->messageQueue.empty() && ((events & UV_WRITABLE) || SSL_want(socket->ssl) == SSL_READING)) { + socket->cork(true); + while (true) { + Queue::Message *messagePtr = socket->messageQueue.front(); + int sent = SSL_write(socket->ssl, messagePtr->data, (int) messagePtr->length); + if (sent == (ssize_t) messagePtr->length) { + if (messagePtr->callback) { + messagePtr->callback(p, messagePtr->callbackData, false, messagePtr->reserved); + } + socket->messageQueue.pop(); + if (socket->messageQueue.empty()) { + if ((socket->state.poll & UV_WRITABLE) && SSL_want(socket->ssl) != SSL_WRITING) { + socket->change(socket->nodeData->loop, socket, socket->setPoll(UV_READABLE)); + } + break; + } + } else if (sent <= 0) { + switch (SSL_get_error(socket->ssl, sent)) { + case SSL_ERROR_WANT_READ: + break; + case SSL_ERROR_WANT_WRITE: + if ((socket->getPoll() & UV_WRITABLE) == 0) { + socket->change(socket->nodeData->loop, socket, socket->setPoll(socket->getPoll() | UV_WRITABLE)); + } + break; + default: + STATE::onEnd((Socket *) p); + return; + } + break; + } + } + socket->cork(false); + } + + if (events & UV_READABLE) { + do { + int length = SSL_read(socket->ssl, socket->nodeData->recvBuffer, socket->nodeData->recvLength); + if (length <= 0) { + switch (SSL_get_error(socket->ssl, length)) { + case SSL_ERROR_WANT_READ: + break; + case SSL_ERROR_WANT_WRITE: + if ((socket->getPoll() & UV_WRITABLE) == 0) { + socket->change(socket->nodeData->loop, socket, socket->setPoll(socket->getPoll() | UV_WRITABLE)); + } + break; + default: + STATE::onEnd((Socket *) p); + return; + } + break; + } else { + // Warning: onData can delete the socket! Happens when HttpSocket upgrades + socket = STATE::onData((Socket *) p, socket->nodeData->recvBuffer, length); + if (socket->isClosed() || socket->isShuttingDown()) { + return; + } + } + } while (SSL_pending(socket->ssl)); + } + } + + template + static void ioHandler(Poll *p, int status, int events) { + Socket *socket = (Socket *) p; + NodeData *nodeData = socket->nodeData; + Context *netContext = nodeData->netContext; + + if (status < 0) { + STATE::onEnd((Socket *) p); + return; + } + + if (events & UV_WRITABLE) { + if (!socket->messageQueue.empty() && (events & UV_WRITABLE)) { + socket->cork(true); + while (true) { + Queue::Message *messagePtr = socket->messageQueue.front(); + ssize_t sent = ::send(socket->getFd(), messagePtr->data, messagePtr->length, MSG_NOSIGNAL); + if (sent == (ssize_t) messagePtr->length) { + if (messagePtr->callback) { + messagePtr->callback(p, messagePtr->callbackData, false, messagePtr->reserved); + } + socket->messageQueue.pop(); + if (socket->messageQueue.empty()) { + // todo, remove bit, don't set directly + socket->change(socket->nodeData->loop, socket, socket->setPoll(UV_READABLE)); + break; + } + } else if (sent == SOCKET_ERROR) { + if (!netContext->wouldBlock()) { + STATE::onEnd((Socket *) p); + return; + } + break; + } else { + messagePtr->length -= sent; + messagePtr->data += sent; + break; + } + } + socket->cork(false); + } + } + + if (events & UV_READABLE) { + int length = (int) recv(socket->getFd(), nodeData->recvBuffer, nodeData->recvLength, 0); + if (length > 0) { + STATE::onData((Socket *) p, nodeData->recvBuffer, length); + } else if (length <= 0 || (length == SOCKET_ERROR && !netContext->wouldBlock())) { + STATE::onEnd((Socket *) p); + } + } + + } + + template + void setState() { + if (ssl) { + setCb(sslIoHandler); + } else { + setCb(ioHandler); + } + } + + bool hasEmptyQueue() { + return messageQueue.empty(); + } + + void enqueue(Queue::Message *message) { + messageQueue.push(message); + } + + Queue::Message *allocMessage(size_t length, const char *data = 0) { + Queue::Message *messagePtr = (Queue::Message *) new char[sizeof(Queue::Message) + length]; + messagePtr->length = length; + messagePtr->data = ((char *) messagePtr) + sizeof(Queue::Message); + messagePtr->nextMessage = nullptr; + + if (data) { + memcpy((char *) messagePtr->data, data, messagePtr->length); + } + + return messagePtr; + } + + void freeMessage(Queue::Message *message) { + delete [] (char *) message; + } + + bool write(Queue::Message *message, bool &wasTransferred) { + ssize_t sent = 0; + if (messageQueue.empty()) { + + if (ssl) { + sent = SSL_write(ssl, message->data, (int) message->length); + if (sent == (ssize_t) message->length) { + wasTransferred = false; + return true; + } else if (sent < 0) { + switch (SSL_get_error(ssl, (int) sent)) { + case SSL_ERROR_WANT_READ: + break; + case SSL_ERROR_WANT_WRITE: + if ((getPoll() & UV_WRITABLE) == 0) { + setPoll(getPoll() | UV_WRITABLE); + changePoll(this); + } + break; + default: + return false; + } + } + } else { + sent = ::send(getFd(), message->data, message->length, MSG_NOSIGNAL); + if (sent == (ssize_t) message->length) { + wasTransferred = false; + return true; + } else if (sent == SOCKET_ERROR) { + if (!nodeData->netContext->wouldBlock()) { + return false; + } + } else { + message->length -= sent; + message->data += sent; + } + + if ((getPoll() & UV_WRITABLE) == 0) { + setPoll(getPoll() | UV_WRITABLE); + changePoll(this); + } + } + } + messageQueue.push(message); + wasTransferred = true; + return true; + } + + template + void sendTransformed(const char *message, size_t length, void(*callback)(void *socket, void *data, bool cancelled, void *reserved), void *callbackData, D transformData) { + size_t estimatedLength = T::estimate(message, length) + sizeof(Queue::Message); + + if (hasEmptyQueue()) { + if (estimatedLength <= uS::NodeData::preAllocMaxSize) { + int memoryLength = (int) estimatedLength; + int memoryIndex = nodeData->getMemoryBlockIndex(memoryLength); + + Queue::Message *messagePtr = (Queue::Message *) nodeData->getSmallMemoryBlock(memoryIndex); + messagePtr->data = ((char *) messagePtr) + sizeof(Queue::Message); + messagePtr->length = T::transform(message, (char *) messagePtr->data, length, transformData); + + bool wasTransferred; + if (write(messagePtr, wasTransferred)) { + if (!wasTransferred) { + nodeData->freeSmallMemoryBlock((char *) messagePtr, memoryIndex); + if (callback) { + callback(this, callbackData, false, nullptr); + } + } else { + messagePtr->callback = callback; + messagePtr->callbackData = callbackData; + } + } else { + nodeData->freeSmallMemoryBlock((char *) messagePtr, memoryIndex); + if (callback) { + callback(this, callbackData, true, nullptr); + } + } + } else { + Queue::Message *messagePtr = allocMessage(estimatedLength - sizeof(Queue::Message)); + messagePtr->length = T::transform(message, (char *) messagePtr->data, length, transformData); + + bool wasTransferred; + if (write(messagePtr, wasTransferred)) { + if (!wasTransferred) { + freeMessage(messagePtr); + if (callback) { + callback(this, callbackData, false, nullptr); + } + } else { + messagePtr->callback = callback; + messagePtr->callbackData = callbackData; + } + } else { + freeMessage(messagePtr); + if (callback) { + callback(this, callbackData, true, nullptr); + } + } + } + } else { + Queue::Message *messagePtr = allocMessage(estimatedLength - sizeof(Queue::Message)); + messagePtr->length = T::transform(message, (char *) messagePtr->data, length, transformData); + messagePtr->callback = callback; + messagePtr->callbackData = callbackData; + enqueue(messagePtr); + } + } + +public: + Socket(NodeData *nodeData, Loop *loop, uv_os_sock_t fd, SSL *ssl) : Poll(loop, fd), ssl(ssl), nodeData(nodeData) { + if (ssl) { + // OpenSSL treats SOCKETs as int + SSL_set_fd(ssl, (int) fd); + SSL_set_mode(ssl, SSL_MODE_RELEASE_BUFFERS); + } + } + + NodeData *getNodeData() { + return nodeData; + } + + Poll *next = nullptr, *prev = nullptr; + + void *getUserData() { + return user; + } + + void setUserData(void *user) { + this->user = user; + } + + struct Address { + unsigned int port; + const char *address; + const char *family; + }; + + Address getAddress(); + + void setNoDelay(int enable) { + setsockopt(getFd(), IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(int)); + } + + void cork(int enable) { +#if defined(TCP_CORK) + // Linux & SmartOS have proper TCP_CORK + setsockopt(getFd(), IPPROTO_TCP, TCP_CORK, &enable, sizeof(int)); +#elif defined(TCP_NOPUSH) + // Mac OS X & FreeBSD have TCP_NOPUSH + setsockopt(getFd(), IPPROTO_TCP, TCP_NOPUSH, &enable, sizeof(int)); + if (!enable) { + // Tested on OS X, FreeBSD situation is unclear + ::send(getFd(), "", 0, MSG_NOSIGNAL); + } +#endif + } + + void shutdown() { + if (ssl) { + //todo: poll in/out - have the io_cb recall shutdown if failed + SSL_shutdown(ssl); + } else { + ::shutdown(getFd(), SHUT_WR); + } + } + + template + void closeSocket() { + uv_os_sock_t fd = getFd(); + Context *netContext = nodeData->netContext; + stop(nodeData->loop); + netContext->closeSocket(fd); + + if (ssl) { + SSL_free(ssl); + } + + Poll::close(nodeData->loop, [](Poll *p) { + delete (T *) p; + }); + } + + bool isShuttingDown() { + return state.shuttingDown; + } + + friend class Node; + friend struct NodeData; +}; + +struct ListenSocket : Socket { + + ListenSocket(NodeData *nodeData, Loop *loop, uv_os_sock_t fd, SSL *ssl) : Socket(nodeData, loop, fd, ssl) { + + } + + Timer *timer = nullptr; + uS::TLS::Context sslContext; +}; + +} + +#endif // SOCKET_UWS_H diff --git a/extern/uWebSocket/include/WebSocket.h b/extern/uWebSocket/include/WebSocket.h new file mode 100644 index 0000000000..9e7f547366 --- /dev/null +++ b/extern/uWebSocket/include/WebSocket.h @@ -0,0 +1,89 @@ +#ifndef WEBSOCKET_UWS_H +#define WEBSOCKET_UWS_H + +#include "WebSocketProtocol.h" +#include "Socket.h" + +namespace uWS { + +template +struct Group; + +template +struct HttpSocket; + +template +struct WIN32_EXPORT WebSocket : uS::Socket, WebSocketState { +protected: + std::string fragmentBuffer; + enum CompressionStatus : char { + DISABLED, + ENABLED, + COMPRESSED_FRAME + } compressionStatus; + unsigned char controlTipLength = 0, hasOutstandingPong = false; + + WebSocket(bool perMessageDeflate, uS::Socket *socket) : uS::Socket(std::move(*socket)) { + compressionStatus = perMessageDeflate ? CompressionStatus::ENABLED : CompressionStatus::DISABLED; + } + + static uS::Socket *onData(uS::Socket *s, char *data, size_t length); + static void onEnd(uS::Socket *s); + using uS::Socket::closeSocket; + + static bool refusePayloadLength(uint64_t length, WebSocketState *webSocketState) { + WebSocket *webSocket = static_cast *>(webSocketState); + return length > Group::from(webSocket)->maxPayload; + } + + static bool setCompressed(WebSocketState *webSocketState) { + WebSocket *webSocket = static_cast *>(webSocketState); + + if (webSocket->compressionStatus == WebSocket::CompressionStatus::ENABLED) { + webSocket->compressionStatus = WebSocket::CompressionStatus::COMPRESSED_FRAME; + return true; + } else { + return false; + } + } + + static void forceClose(WebSocketState *webSocketState) { + WebSocket *webSocket = static_cast *>(webSocketState); + webSocket->terminate(); + } + + static bool handleFragment(char *data, size_t length, unsigned int remainingBytes, int opCode, bool fin, WebSocketState *webSocketState); + +public: + struct PreparedMessage { + char *buffer; + size_t length; + int references; + void(*callback)(void *webSocket, void *data, bool cancelled, void *reserved); + }; + + // Not thread safe + void sendPrepared(PreparedMessage *preparedMessage, void *callbackData = nullptr); + static void finalizeMessage(PreparedMessage *preparedMessage); + void close(int code = 1000, const char *message = nullptr, size_t length = 0); + void transfer(Group *group); + + // Thread safe + void terminate(); + void ping(const char *message) {send(message, OpCode::PING);} + void send(const char *message, OpCode opCode = OpCode::TEXT) {send(message, strlen(message), opCode);} + void send(const char *message, size_t length, OpCode opCode, void(*callback)(WebSocket *webSocket, void *data, bool cancelled, void *reserved) = nullptr, void *callbackData = nullptr); + static PreparedMessage *prepareMessage(char *data, size_t length, OpCode opCode, bool compressed, void(*callback)(WebSocket *webSocket, void *data, bool cancelled, void *reserved) = nullptr); + static PreparedMessage *prepareMessageBatch(std::vector &messages, std::vector &excludedMessages, + OpCode opCode, bool compressed, void(*callback)(WebSocket *webSocket, void *data, bool cancelled, void *reserved) = nullptr); + + friend struct Hub; + friend struct Group; + friend struct HttpSocket; + friend struct uS::Socket; + friend class WebSocketProtocol>; +}; + +} + +#endif // WEBSOCKET_UWS_H diff --git a/extern/uWebSocket/include/WebSocketProtocol.h b/extern/uWebSocket/include/WebSocketProtocol.h new file mode 100644 index 0000000000..56db71ffa9 --- /dev/null +++ b/extern/uWebSocket/include/WebSocketProtocol.h @@ -0,0 +1,377 @@ +#ifndef WEBSOCKETPROTOCOL_UWS_H +#define WEBSOCKETPROTOCOL_UWS_H + +// we do need to include this for htobe64, should be moved from networking! +#include "Networking.h" + +#include +#include + +namespace uWS { + +enum OpCode : unsigned char { + TEXT = 1, + BINARY = 2, + CLOSE = 8, + PING = 9, + PONG = 10 +}; + +enum { + CLIENT, + SERVER +}; + +// 24 bytes perfectly +template +struct WebSocketState { +public: + static const unsigned int SHORT_MESSAGE_HEADER = isServer ? 6 : 2; + static const unsigned int MEDIUM_MESSAGE_HEADER = isServer ? 8 : 4; + static const unsigned int LONG_MESSAGE_HEADER = isServer ? 14 : 10; + + // 16 bytes + struct State { + unsigned int wantsHead : 1; + unsigned int spillLength : 4; + int opStack : 2; // -1, 0, 1 + unsigned int lastFin : 1; + + // 15 bytes + unsigned char spill[LONG_MESSAGE_HEADER - 1]; + OpCode opCode[2]; + + State() { + wantsHead = true; + spillLength = 0; + opStack = -1; + lastFin = true; + } + + } state; + + // 8 bytes + unsigned int remainingBytes = 0; + char mask[isServer ? 4 : 1]; +}; + +template +class WIN32_EXPORT WebSocketProtocol { +public: + static const unsigned int SHORT_MESSAGE_HEADER = isServer ? 6 : 2; + static const unsigned int MEDIUM_MESSAGE_HEADER = isServer ? 8 : 4; + static const unsigned int LONG_MESSAGE_HEADER = isServer ? 14 : 10; + +protected: + static inline bool isFin(char *frame) {return *((unsigned char *) frame) & 128;} + static inline unsigned char getOpCode(char *frame) {return *((unsigned char *) frame) & 15;} + static inline unsigned char payloadLength(char *frame) {return ((unsigned char *) frame)[1] & 127;} + static inline bool rsv23(char *frame) {return *((unsigned char *) frame) & 48;} + static inline bool rsv1(char *frame) {return *((unsigned char *) frame) & 64;} + + static inline void unmaskImprecise(char *dst, char *src, char *mask, unsigned int length) { + for (unsigned int n = (length >> 2) + 1; n; n--) { + *(dst++) = *(src++) ^ mask[0]; + *(dst++) = *(src++) ^ mask[1]; + *(dst++) = *(src++) ^ mask[2]; + *(dst++) = *(src++) ^ mask[3]; + } + } + + static inline void unmaskImpreciseCopyMask(char *dst, char *src, char *maskPtr, unsigned int length) { + char mask[4] = {maskPtr[0], maskPtr[1], maskPtr[2], maskPtr[3]}; + unmaskImprecise(dst, src, mask, length); + } + + static inline void rotateMask(unsigned int offset, char *mask) { + char originalMask[4] = {mask[0], mask[1], mask[2], mask[3]}; + mask[(0 + offset) % 4] = originalMask[0]; + mask[(1 + offset) % 4] = originalMask[1]; + mask[(2 + offset) % 4] = originalMask[2]; + mask[(3 + offset) % 4] = originalMask[3]; + } + + static inline void unmaskInplace(char *data, char *stop, char *mask) { + while (data < stop) { + *(data++) ^= mask[0]; + *(data++) ^= mask[1]; + *(data++) ^= mask[2]; + *(data++) ^= mask[3]; + } + } + + enum { + SND_CONTINUATION = 1, + SND_NO_FIN = 2, + SND_COMPRESSED = 64 + }; + + template + static inline bool consumeMessage(T payLength, char *&src, unsigned int &length, WebSocketState *wState) { + if (getOpCode(src)) { + if (wState->state.opStack == 1 || (!wState->state.lastFin && getOpCode(src) < 2)) { + Impl::forceClose(wState); + return true; + } + wState->state.opCode[++wState->state.opStack] = (OpCode) getOpCode(src); + } else if (wState->state.opStack == -1) { + Impl::forceClose(wState); + return true; + } + wState->state.lastFin = isFin(src); + + if (Impl::refusePayloadLength(payLength, wState)) { + Impl::forceClose(wState); + return true; + } + + if (payLength + MESSAGE_HEADER <= length) { + if (isServer) { + unmaskImpreciseCopyMask(src + MESSAGE_HEADER - 4, src + MESSAGE_HEADER, src + MESSAGE_HEADER - 4, (unsigned int) payLength); + if (Impl::handleFragment(src + MESSAGE_HEADER - 4, payLength, 0, wState->state.opCode[wState->state.opStack], isFin(src), wState)) { + return true; + } + } else { + if (Impl::handleFragment(src + MESSAGE_HEADER, payLength, 0, wState->state.opCode[wState->state.opStack], isFin(src), wState)) { + return true; + } + } + + if (isFin(src)) { + wState->state.opStack--; + } + + src += payLength + MESSAGE_HEADER; + length -= payLength + MESSAGE_HEADER; + wState->state.spillLength = 0; + return false; + } else { + wState->state.spillLength = 0; + wState->state.wantsHead = false; + wState->remainingBytes = (unsigned int) (payLength - length + MESSAGE_HEADER); + bool fin = isFin(src); + if (isServer) { + memcpy(wState->mask, src + MESSAGE_HEADER - 4, 4); + unmaskImprecise(src, src + MESSAGE_HEADER, wState->mask, length - MESSAGE_HEADER); + rotateMask(4 - (length - MESSAGE_HEADER) % 4, wState->mask); + } else { + src += MESSAGE_HEADER; + } + Impl::handleFragment(src, length - MESSAGE_HEADER, wState->remainingBytes, wState->state.opCode[wState->state.opStack], fin, wState); + return true; + } + } + + static inline bool consumeContinuation(char *&src, unsigned int &length, WebSocketState *wState) { + if (wState->remainingBytes <= length) { + if (isServer) { + int n = wState->remainingBytes >> 2; + unmaskInplace(src, src + n * 4, wState->mask); + for (int i = 0, s = wState->remainingBytes % 4; i < s; i++) { + src[n * 4 + i] ^= wState->mask[i]; + } + } + + if (Impl::handleFragment(src, wState->remainingBytes, 0, wState->state.opCode[wState->state.opStack], wState->state.lastFin, wState)) { + return false; + } + + if (wState->state.lastFin) { + wState->state.opStack--; + } + + src += wState->remainingBytes; + length -= wState->remainingBytes; + wState->state.wantsHead = true; + return true; + } else { + if (isServer) { + unmaskInplace(src, src + ((length >> 2) + 1) * 4, wState->mask); + } + + wState->remainingBytes -= length; + if (Impl::handleFragment(src, length, wState->remainingBytes, wState->state.opCode[wState->state.opStack], wState->state.lastFin, wState)) { + return false; + } + + if (isServer && length % 4) { + rotateMask(4 - (length % 4), wState->mask); + } + return false; + } + } + +public: + WebSocketProtocol() { + + } + + // Based on utf8_check.c by Markus Kuhn, 2005 + // https://www.cl.cam.ac.uk/~mgk25/ucs/utf8_check.c + // Optimized for predominantly 7-bit content by Alex Hultman, 2016 + // Licensed as Zlib, like the rest of this project + static bool isValidUtf8(unsigned char *s, size_t length) + { + for (unsigned char *e = s + length; s != e; ) { + if (s + 4 <= e && ((*(uint32_t *) s) & 0x80808080) == 0) { + s += 4; + } else { + while (!(*s & 0x80)) { + if (++s == e) { + return true; + } + } + + if ((s[0] & 0x60) == 0x40) { + if (s + 1 >= e || (s[1] & 0xc0) != 0x80 || (s[0] & 0xfe) == 0xc0) { + return false; + } + s += 2; + } else if ((s[0] & 0xf0) == 0xe0) { + if (s + 2 >= e || (s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 || + (s[0] == 0xe0 && (s[1] & 0xe0) == 0x80) || (s[0] == 0xed && (s[1] & 0xe0) == 0xa0)) { + return false; + } + s += 3; + } else if ((s[0] & 0xf8) == 0xf0) { + if (s + 3 >= e || (s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 || (s[3] & 0xc0) != 0x80 || + (s[0] == 0xf0 && (s[1] & 0xf0) == 0x80) || (s[0] == 0xf4 && s[1] > 0x8f) || s[0] > 0xf4) { + return false; + } + s += 4; + } else { + return false; + } + } + } + return true; + } + + struct CloseFrame { + uint16_t code; + char *message; + size_t length; + }; + + static inline CloseFrame parseClosePayload(char *src, size_t length) { + CloseFrame cf = {}; + if (length >= 2) { + memcpy(&cf.code, src, 2); + cf = {ntohs(cf.code), src + 2, length - 2}; + if (cf.code < 1000 || cf.code > 4999 || (cf.code > 1011 && cf.code < 4000) || + (cf.code >= 1004 && cf.code <= 1006) || !isValidUtf8((unsigned char *) cf.message, cf.length)) { + return {}; + } + } + return cf; + } + + static inline size_t formatClosePayload(char *dst, uint16_t code, const char *message, size_t length) { + if (code) { + code = htons(code); + memcpy(dst, &code, 2); + memcpy(dst + 2, message, length); + return length + 2; + } + return 0; + } + + static inline size_t formatMessage(char *dst, const char *src, size_t length, OpCode opCode, size_t reportedLength, bool compressed) { + size_t messageLength; + size_t headerLength; + if (reportedLength < 126) { + headerLength = 2; + dst[1] = reportedLength; + } else if (reportedLength <= UINT16_MAX) { + headerLength = 4; + dst[1] = 126; + *((uint16_t *) &dst[2]) = htons(reportedLength); + } else { + headerLength = 10; + dst[1] = 127; + *((uint64_t *) &dst[2]) = htobe64(reportedLength); + } + + int flags = 0; + dst[0] = (flags & SND_NO_FIN ? 0 : 128) | (compressed ? SND_COMPRESSED : 0); + if (!(flags & SND_CONTINUATION)) { + dst[0] |= opCode; + } + + char mask[4]; + if (!isServer) { + dst[1] |= 0x80; + uint32_t random = rand(); + memcpy(mask, &random, 4); + memcpy(dst + headerLength, &random, 4); + headerLength += 4; + } + + messageLength = headerLength + length; + memcpy(dst + headerLength, src, length); + + if (!isServer) { + + // overwrites up to 3 bytes outside of the given buffer! + //WebSocketProtocol::unmaskInplace(dst + headerLength, dst + headerLength + length, mask); + + // this is not optimal + char *start = dst + headerLength; + char *stop = start + length; + int i = 0; + while (start != stop) { + (*start++) ^= mask[i++ % 4]; + } + } + return messageLength; + } + + static inline void consume(char *src, unsigned int length, WebSocketState *wState) { + if (wState->state.spillLength) { + src -= wState->state.spillLength; + length += wState->state.spillLength; + memcpy(src, wState->state.spill, wState->state.spillLength); + } + if (wState->state.wantsHead) { + parseNext: + while (length >= SHORT_MESSAGE_HEADER) { + + // invalid reserved bits / invalid opcodes / invalid control frames / set compressed frame + if ((rsv1(src) && !Impl::setCompressed(wState)) || rsv23(src) || (getOpCode(src) > 2 && getOpCode(src) < 8) || + getOpCode(src) > 10 || (getOpCode(src) > 2 && (!isFin(src) || payloadLength(src) > 125))) { + Impl::forceClose(wState); + return; + } + + if (payloadLength(src) < 126) { + if (consumeMessage(payloadLength(src), src, length, wState)) { + return; + } + } else if (payloadLength(src) == 126) { + if (length < MEDIUM_MESSAGE_HEADER) { + break; + } else if(consumeMessage(ntohs(*(uint16_t *) &src[2]), src, length, wState)) { + return; + } + } else if (length < LONG_MESSAGE_HEADER) { + break; + } else if (consumeMessage(be64toh(*(uint64_t *) &src[2]), src, length, wState)) { + return; + } + } + if (length) { + memcpy(wState->state.spill, src, length); + wState->state.spillLength = length; + } + } else if (consumeContinuation(src, length, wState)) { + goto parseNext; + } + } + + static const int CONSUME_POST_PADDING = 4; + static const int CONSUME_PRE_PADDING = LONG_MESSAGE_HEADER - 1; +}; + +} + +#endif // WEBSOCKETPROTOCOL_UWS_H diff --git a/extern/uWebSocket/include/uWS.h b/extern/uWebSocket/include/uWS.h new file mode 100644 index 0000000000..40a0e403df --- /dev/null +++ b/extern/uWebSocket/include/uWS.h @@ -0,0 +1,6 @@ +#ifndef UWS_UWS_H +#define UWS_UWS_H + +#include "Hub.h" + +#endif // UWS_UWS_H diff --git a/extern/uWebSocket/libeay32.lib b/extern/uWebSocket/libeay32.lib new file mode 100644 index 0000000000000000000000000000000000000000..deb2bc1a017de45a3036b1ac4a1a0763814c735c GIT binary patch literal 827012 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�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

HR=z>LQEn%< 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

^LFO!N`p6SR}3Qv#VO)Y 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 literal 0 HcmV?d00001 diff --git a/extern/uWebSocket/libuv.lib b/extern/uWebSocket/libuv.lib new file mode 100644 index 0000000000000000000000000000000000000000..30aa827f88926daa1bea377299d4c9768eaceb2b GIT binary patch literal 53014 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 literal 0 HcmV?d00001 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 488064c884..7add162148 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -157,6 +157,7 @@ list(APPEND SM_WINDOWS_PROGRAM_DLLS "${SM_PROGRAM_DIR}/avutil-52.dll" "${SM_PROGRAM_DIR}/parallel_lights_io.dll" "${SM_PROGRAM_DIR}/swscale-2.dll" + "${SM_PROGRAM_DIR}/uWS.dll" ) if(WIN32) @@ -355,6 +356,10 @@ if (WIN32) "${LIB_AVUTIL}" "${LIB_CURL}" "${LIB_WLDAP32}" + "${LIB_UWS}" + "${LIB_EAY}" + "${LIB_SSL}" + "${LIB_UV}" ) if (WITH_OGG) @@ -524,6 +529,9 @@ list(APPEND SM_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} "${SM_SRC_DIR}/generated" ) +list(APPEND SM_INCLUDE_DIRS +"${SM_EXTERN_DIR}/uWebSocket/include" +) if(NOT APPLE) list(APPEND SM_INCLUDE_DIRS "${SM_EXTERN_DIR}/glew-1.5.8/include" @@ -635,6 +643,7 @@ if(NOT APPLE) install(FILES "${SM_PROGRAM_DIR}/parallel_lights_io.dll" DESTINATION "${SM_FULL_INSTALLATION_PATH}") install(FILES "${SM_PROGRAM_DIR}/Etterna.vdi" DESTINATION "${SM_FULL_INSTALLATION_PATH}") install(FILES "${SM_PROGRAM_DIR}/swscale-2.dll" DESTINATION "${SM_FULL_INSTALLATION_PATH}") + install(FILES "${SM_PROGRAM_DIR}/uWS.dll" DESTINATION "${SM_FULL_INSTALLATION_PATH}") # foreach(SM_WINDOW_DLL "${SM_WINDOWS_PROGRAM_DLLS}") # install(FILES "${SM_WINDOW_DLL}" DESTINATION "${SM_INSTALL_DESTINATION}") diff --git a/stepmania.nsi b/stepmania.nsi index 148aee0ed4..38af848a2a 100644 --- a/stepmania.nsi +++ b/stepmania.nsi @@ -487,6 +487,8 @@ Section "Main Section" SecMain File "Program\avformat-55.dll" File "Program\avutil-52.dll" File "Program\swscale-2.dll" + ;uwebsocket + File "Program\uWS.dll" ; parallel lights File "Program\parallel_lights_io.dll" ; others @@ -919,6 +921,7 @@ Section "Uninstall" Delete "$INSTDIR\Program\avutil-50.dll" Delete "$INSTDIR\Program\swscale-2.dll" Delete "$INSTDIR\Program\swscale-0.dll" + Delete "$INSTDIR\Program\uWS.dll" ; others Delete "$INSTDIR\Program\dbghelp.dll" Delete "$INSTDIR\Program\jpeg.dll"